feat(reviewer): C1 cross-family council for guardrail PRs (COUNCIL_VERDICT.md) - #469
Merged
Conversation
…RDICT.md) A PR touching any reviewer.council.guardrail_paths glob is adjudicated by a K=3 cross-family panel (claude/sonnet + claude/opus + codex, distinct lenses) with unanimous LGTM to merge; any CONCERN feeds the existing self-heal fix ladder and an unmet quorum parks fail-closed (reusing #446 auto-resume). guardrail_paths ships EMPTY (feature OFF, fail-open) so the rollout PR does not deadlock on its own gate; populating it is a deliberate follow-up. Pure logic (aggregate_council, lenses, codex-stdout fallback) in verdict.py; _run_council thin in main.py. _run_direct_review generalized to _run_member_review(*, backend, model), byte-identical for the single path. Per-member model-aware cooldown; shared _dispatch_verdict_outcome tail; verdict still code-computed per member (INJ boundary intact). F14: park-cap operator escalation, degraded quorum, and a NARROW self-fix exemption (only review/ fix branches — fleet goal/ guardrail PRs DO get the council). Doc truth-up in HARNESS_TRUST_HARDENING. 166 reviewer + 29 verdict tests; tests/unit 85.95%. Council spec COUNCIL_VERDICT.md Phase 2 (C1). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Council spec (
docs/design/COUNCIL_VERDICT.md) Phase 2 / C1 — keyless change control for guardrail surfaces, the adjudicated-review substitute for the operator's signing key.A PR whose diff touches any
reviewer.council.guardrail_pathsglob is adjudicated by a K=3 cross-family panel instead of the single self-review:state/council/<repo>-<pr>.json+ one attributed PR comment;reviewer-verdictstatus set only on quorum.guardrail_pathsships EMPTY ⇒ feature OFF (fail-open to today's single review) so this rollout PR can't deadlock on the gate it introduces. Populating the §G1 set is a deliberate follow-up PR (which then rides through the council itself).How
verdict.py(aggregate_council, lens fragments,_COUNCIL_PANEL,last_json_objectcodex-stdout fallback) — covered by thetests/unit85% gate._run_councilinmain.pystays thin._run_direct_reviewgeneralized to_run_member_review(*, backend, model), kept as a byte-identical alias for the single path (sameclaude --model haiku -p --effort lowargv; only the model varies per seat). Member argv mirrorsworker_backend_probe._probe_command._member_on_cooldown) — sonnet vs opus are bothclaude_code, so the backend-grained selector can't distinguish them._dispatch_verdict_outcometail.F14 mitigations (deadlock avoidance)
max_council_park_hoursescalates a distinctcouncil_unavailable_cappedreason to the operator instead of re-parking forever.min_council_memberslets the panel proceed with unanimity among available families.review/fix branches fall back to single review. Fleetgoal/PRs touching guardrails DO get the council — that is the control's primary threat (fleet quietly merges a guardrail change on a single LGTM). Widening this is an explicit operator trust-model decision, flagged in-code.Doc
HARNESS_TRUST_HARDENING.md§0.1 no longer overclaims the council as live — it now states the engine shipped under C1 butguardrail_pathsis empty so the gate isn't live yet.Tests
166 reviewer tests (
tests/test_pr_review_watcher.py, +16) incl. fork/unanimous-merge/concern-ladder/cooldown-park/per-family-dispatch/state+comment and all three F14 mitigations; 29verdict.pyunit tests.tests/unitfull suite 8468 pass at 85.95% (gate 85%). ruff clean.Follow-ups (not this PR)
guardrail_pathswith the §G1 set (the council's first live case).last_json_objectstdout fallback de-risks this; mirrors open D1-pt2).Council spec Phase 2 (C1). Depends conceptually on C2 (ContextLifecycle #43, keyless launch-time anchor).
🤖 Generated with Claude Code