diff --git a/CLAUDE.md b/CLAUDE.md index 9ef29ba..39ce40c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -60,9 +60,9 @@ Run `./scripts/dispatch reconcile`; resume from state files, never ask the owner `ORCH_ALLOW_UNISOLATED=1` needs the owner's explicit instruction, and its use is recorded. Subagent workers run inside the orchestrator's own session and trust domain. - A test that did not run did not pass; a worker's prose is never a grade. -- Every high-risk dispatch needs an approval file from the owner, which the orchestrator never - writes. Editing the spec voids the approval. Unclassified or ambiguous work is high-risk; - nothing may classify it as lighter. +- Every high-risk dispatch needs an approval file whose authority is the owner's own words: the + orchestrator transcribes them verbatim in the note and never originates one. Editing the spec + voids it. Unclassified or ambiguous work is high-risk; nothing may classify it as lighter. - A safety-machinery change is never checked, approved, reviewed, or merged by the new version of itself: the installed version runs every gate, and the new one goes live only after separate approval and installation. @@ -76,5 +76,5 @@ Run `./scripts/dispatch reconcile`; resume from state files, never ask the owner wrong thing. Interrupted work restarts as a fresh attempt; never finish it by hand. - Under an autonomy grant the orchestrator finishes the job itself instead of pausing for owner input: it answers findings under rule 3 and, `ci` green, merges to `ready-for-main` through the - gated `./scripts/dispatch merge` or `dispatch integrate` — never `main`, never a bare `gh pr merge` — and stops wherever a gate stops it (HALT, a spent cap, any human-required approval). + gated `./scripts/dispatch merge` or `dispatch integrate` — and to `main` where granted, never a bare `gh pr merge`. A spent cap or stop-early is answered by a rule-3 re-scope that PROCEEDS, telling the owner; only HALT or a human-required act stops it, and a rule is never itself the blocker (owner 2026-08-14). No grant file — untracked `AUTONOMY.local.json`, or the tracked `AUTONOMY.json` that ships disabled — means no autonomy. diff --git a/tests/rulebook_cap.sh b/tests/rulebook_cap.sh index 88fe756..7cd2902 100755 --- a/tests/rulebook_cap.sh +++ b/tests/rulebook_cap.sh @@ -16,5 +16,37 @@ for marker in "Intake:" "One workstream:" "Review cap:" "Communication:" "ONE br fi done +if grep -Fq -- "Every high-risk dispatch needs an approval file from the owner, which the orchestrator never" CLAUDE.md; then + echo " FAIL: old high-risk approval wording remains in CLAUDE.md" + fails=1 +else + echo " ok: old high-risk approval wording absent" +fi + +for marker in "authority is the owner's own words" "transcribes them verbatim in the note" "never originates one" "Editing the spec" "Unclassified or ambiguous work is high-risk" "nothing may classify it as lighter"; do + if grep -Fq -- "$marker" CLAUDE.md; then + echo " ok: high-risk invariant clause present: $marker" + else + echo " FAIL: high-risk invariant clause missing from CLAUDE.md: $marker" + fails=1 + fi +done + +if grep -Fq -- "and stops wherever a gate stops it (HALT, a spent cap, any human-required approval)." CLAUDE.md; then + echo " FAIL: old autonomy-grant wording remains in CLAUDE.md" + fails=1 +else + echo " ok: old autonomy-grant wording absent" +fi + +for marker in "Under an autonomy grant the orchestrator finishes the job itself instead of pausing for owner" "answers findings under rule 3" '`ci` green' 'merges to `ready-for-main` through the' 'gated `./scripts/dispatch merge` or `dispatch integrate`' 'to `main` where granted' 'never a bare `gh pr merge`' "spent cap or stop-early" "rule-3 re-scope" "PROCEEDS" "telling the owner" "only HALT" "human-required act stops it" "a rule is never itself the blocker"; do + if grep -Fq -- "$marker" CLAUDE.md; then + echo " ok: autonomy-grant invariant clause present: $marker" + else + echo " FAIL: autonomy-grant invariant clause missing from CLAUDE.md: $marker" + fails=1 + fi +done + [ "$fails" -eq 0 ] && echo "PASS rulebook_cap.sh" || echo "FAIL rulebook_cap.sh" exit "$fails"