Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .constitutional/classification.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Patch classification rules for the constitutional merge gate.
#
# Maps file paths to patch classes. The gate classifies each PR by
# the highest-danger file it touches.

# Constitutional: these files define the rules themselves.
# Requires human crypto signatures to modify.
constitutional_paths = [
"PolicyManifest.toml",
".constitutional/",
"crates/ck-kernel/src/kani.rs",
"crates/portcullis/src/kani.rs",
"LICENSE",
]

# Controller: core enforcement and admission logic.
# Requires Kani verification in sandbox.
controller_paths = [
"crates/ck-kernel/src/lib.rs",
"crates/ck-kernel/src/lineage.rs",
"crates/portcullis/src/",
"crates/nucleus/src/",
"crates/nucleus-node/src/",
"crates/nucleus-identity/src/",
]

# Evaluator: policy checking, type definitions, scoring.
# Requires build + tests.
evaluator_paths = [
"crates/ck-policy/src/",
"crates/ck-types/src/",
"crates/nucleus-spec/src/",
]

# Everything else is Config (docs, tests, examples, CI, scripts).
54 changes: 47 additions & 7 deletions .github/workflows/kani-nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,13 @@ jobs:
echo "- **Minimum required:** $MINIMUM" >> "$GITHUB_STEP_SUMMARY"
echo "- **Full suite:** nightly + workflow_dispatch" >> "$GITHUB_STEP_SUMMARY"

# Constitutional Kernel: all 6 harnesses — lightweight, runs on every PR
# Constitutional Kernel (fast): 4 concrete-policy proofs — no symbolic BTreeSet
# These use only concrete BTreeSets + symbolic u64, finishing in <10 min.
# The 7 symbolic BTreeSet proofs (capability, governance, I/O axes) run nightly.
kani-constitutional:
name: Kani (constitutional kernel)
runs-on: ubuntu-24.04
timeout-minutes: 20
timeout-minutes: 15
if: github.event_name != 'schedule'
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
Expand All @@ -89,18 +91,56 @@ jobs:
with:
path: ~/.kani
key: kani-toolchain-${{ runner.os }}-${{ hashFiles('.github/workflows/kani-nightly.yml') }}
- name: Run Kani (constitutional kernel)
- name: Run Kani (constitutional kernel — fast tier)
uses: model-checking/kani-github-action@f838096619a707b0f6b2118cf435eaccfa33e51f # v1.1
with:
args: >-
-p ck-kernel
--solver cadical
--harness proof_budget_escalation_detected
--harness proof_capability_escalation_detected_bitmask
--harness proof_io_confinement_detected_bitmask
--harness proof_combined_monotonicity_complete
--harness proof_capability_subset_transitive
- name: Summary
if: always()
run: |
TOTAL=$(grep -c '#\[kani::proof\]' crates/ck-kernel/src/kani.rs)
echo "## Kani BMC — Constitutional Kernel (fast tier)" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "- **Harnesses verified:** 5 / $TOTAL (fast tier — pure bitmask)" >> "$GITHUB_STEP_SUMMARY"
echo "- **Proved:** budget escalation, capability non-escalation, I/O confinement, combined monotonicity, lattice transitivity" >> "$GITHUB_STEP_SUMMARY"
echo "- **Nightly:** 11 symbolic BTreeSet proofs via admit() pipeline" >> "$GITHUB_STEP_SUMMARY"

# Constitutional Kernel (full): all 11 harnesses including symbolic BTreeSet proofs
# symbolic_set() proofs take 5-15 min each due to BTreeSet node machinery.
kani-constitutional-full:
name: Kani (constitutional kernel full)
runs-on: ubuntu-24.04
timeout-minutes: 60
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2
with:
cache-on-failure: true
- name: Cache Kani toolchain
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ~/.kani
key: kani-toolchain-${{ runner.os }}-${{ hashFiles('.github/workflows/kani-nightly.yml') }}
- name: Run Kani (constitutional kernel — all harnesses)
uses: model-checking/kani-github-action@f838096619a707b0f6b2118cf435eaccfa33e51f # v1.1
with:
args: "-p ck-kernel --solver cadical"
- name: Summary
if: always()
run: |
PROOF_COUNT=$(grep -c '#\[kani::proof\]' crates/ck-kernel/src/kani.rs)
echo "## Kani BMC — Constitutional Kernel" >> "$GITHUB_STEP_SUMMARY"
TOTAL=$(grep -c '#\[kani::proof\]' crates/ck-kernel/src/kani.rs)
echo "## Kani BMC — Constitutional Kernel (full)" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "- **Harnesses verified:** $PROOF_COUNT" >> "$GITHUB_STEP_SUMMARY"
echo "- **Proved invariants:** capability non-escalation, governance monotonicity, lineage integrity, budget boundedness, constitutional self-merge rejection" >> "$GITHUB_STEP_SUMMARY"
echo "- **Harnesses verified:** $TOTAL / $TOTAL (all)" >> "$GITHUB_STEP_SUMMARY"
echo "- **Proved:** ALL constitutional invariants including symbolic BTreeSet proofs" >> "$GITHUB_STEP_SUMMARY"

# Full tier: all harnesses including normalize_* — nightly and on-demand only
# normalize_* harnesses each take 15+ minutes due to large symbolic state space
Expand Down
74 changes: 74 additions & 0 deletions PolicyManifest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Constitutional Policy Manifest for Nucleus
#
# This file defines the invariant rules that every AI-generated change
# to this repository must preserve. The constitutional kernel verifies
# these rules before any patch is admitted to the lineage.
#
# Patch classification:
# Config — docs, tests, examples, non-core changes (auto-admittable)
# Controller — core enforcement logic: ck-kernel, portcullis, nucleus crate
# Evaluator — scoring, policy, type definitions: ck-policy, ck-types
# Constitutional — this file, amendment_rules, proof_requirements (requires human sigs)

version = 1

[capabilities]
filesystem_read = ["/workspace"]
filesystem_write = ["/workspace"]
network_allow = ["crates.io", "github.com"]
tools_allow = ["Read", "Edit", "Write", "Bash", "Grep", "Glob"]
secret_classes = []
max_parallel_tasks = 2

[io_surface]
outbound_domains = ["crates.io", "github.com"]
local_file_roots = ["/workspace"]
env_vars_readable = ["CARGO_HOME", "RUSTUP_HOME", "PATH"]
tool_namespaces = ["file", "shell"]
repo_write_targets = ["coproduct-opensource/nucleus"]

[budget_bounds]
max_tokens = 200000
max_wall_ms = 1800000 # 30 min
max_cpu_ms = 900000 # 15 min
max_memory_bytes = 4000000000 # 4 GB
max_network_calls = 50
max_files_touched = 30
max_dollar_spend_millicents = 500000 # $5
max_patch_attempts = 3

[proof_requirements]
# Config patches: build must pass
config_patch = ["build_pass"]
# Controller patches: build + tests + kani verification
controller_patch = ["build_pass", "test_pass", "kani_pass"]
# Evaluator patches: build + tests
evaluator_patch = ["build_pass", "test_pass"]

[amendment_rules]
# Paths agents may modify under ordinary self-amendment
may_modify = [
"crates/ck-kernel/src/",
"crates/ck-policy/src/",
"crates/ck-types/src/",
"crates/portcullis/src/",
"crates/nucleus/src/",
"examples/",
"docs/",
"benchmarks/",
"fuzz/",
"README.md",
]
# Paths that NEVER change without constitutional amendment (human crypto sigs)
may_not_modify = [
"PolicyManifest.toml",
"crates/ck-kernel/src/kani.rs",
"crates/portcullis/src/kani.rs",
"LICENSE",
"LICENSE-APACHE",
"SECURITY.md",
]
require_monotone_capabilities = true
require_monotone_io = true
require_monotone_proofreq = true
constitutional_human_signatures = 1
Loading
Loading