fix(f49): council_required default fail-closed on degraded gravity (one-char flip)#379
Conversation
…avity Aletheia Round 6 F49: the getattr default for is_council_required was False. When gravity_result lacked the attribute entirely (degraded state — classifier import failed, malformed result, older schema), the gate would silently ALLOW without a council walk. Fails-open on the exact axis Andrew has named as the third master disease-cure: default toward scrutiny. The one-character fix: change False to True in the getattr default. Now a degraded gravity_result forces the council-walk requirement rather than skipping the discipline silently. Fail-closed. Added regression test (test_f49_degraded_gravity_result_fails_closed) using a _DegradedGravityResult that lacks the attribute entirely — proves the getattr default is what controls degraded-state behavior, and pins it to fail-closed. 26/26 pass. External-Review: round-f36d33f69526
📋 Audit-stamp reminder — guardrail-touching PRThis PR modifies guardrail files. The squash-merge commit on Files in this PR that touch the guardrail list: Before clicking "Squash and merge":
Why this matters: the multi-party-review CI check looks for the trailer text in the merge commit message. Without it, the check fires red post-merge. The red is unrecoverable without force-pushing See |
Summary
Aletheia Round 6 F49: the
getattrdefault foris_council_requiredwasFalse. Whengravity_resultlacked the attribute entirely (degraded state — classifier import failed, malformed result, older schema), the gate would silently ALLOW without a council walk. Fails-open on the exact axis Andrew has named as the third master disease-cure: default toward scrutiny.Fix
One-character flip (
False→True) in the getattr default atcouncil_required/gate.py:212. Now a degradedgravity_resultforces the council-walk requirement rather than skipping the discipline silently. Fail-closed.Also updated doc counts (README/CLAUDE/ARCHITECTURE) from 412 → 416 to reflect Aria's #369 landing 4 new commands.
Test plan
test_f49_degraded_gravity_result_fails_closed) uses a_DegradedGravityResultthat lacks the attribute entirely — proves the getattr default is what controls degraded-state behavior, and pins it to fail-closed.External-Review: round-f36d33f69526
🤖 Filed via Aether working session 2026-07-19