feat(trace): assert_no_side_effect turns side-effect observation into a verdict (#465 Phase A, 4/5) - #471
Open
AminChirazi wants to merge 1 commit into
Open
Conversation
11 tasks
AminChirazi
force-pushed
the
feat/465a-3-http-capture
branch
from
August 11, 2026 19:10
725d957 to
be4041e
Compare
AminChirazi
force-pushed
the
feat/465a-4-side-effect-assertion
branch
from
August 11, 2026 19:10
08ec605 to
2ddc5e8
Compare
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.
Part 4/5 of #465 Phase A. Stacked on 3/5. The falsifiability proof and the deep-dive docs section follow immediately in 5/5 (this PR + 5/5 were one commit in the design; split to respect the 400-line ratchet — this PR carries the full unit-test proof of all three verdict directions, 5/5 carries the CLI-level red path).
What
- assert_no_side_effect: fs_write | http_request(reserved kinds refused with their own "reserved for a later phase" parse error). The verdict copiesassert_no_egress's honesty ladder: cannot certify where observation cannot run (macOS/Windows/url:— never a vacuous pass, no bypass), cannot certify on relevant supervisor faults (an empty effects list under a blind supervisor is silence, not evidence), then the set predicate. Violation classification is structural, not lexical: messages start with theSIDE_EFFECT_VIOLATIONsentinel andis_capability_erroryields to that prefix first, so an agent that unlinks a file literally named./cannot certify.txtcannot relabel a real violation as a capability error (unit-pinned both directions). A flow carrying only this assertion runs supervised on Linux via acfg-gated drive arm underAllowSet::allow_all(); prediction and achieved tier agree (observation_only), so the report never prints two contradicting tier lines. A violating record mints no trace; replay judges the live re-run's log (the lane is audit, never authority).authoring.mdstep row included; docs sentences that this assertion falsified ("no spec surface", "only where containment is already engaged") are corrected in the same range.Evidence
fmt 0 · clippy 0 ·
cargo test --workspace0 · Linux cross-check 0 · ratchets.sh exit 0, diff 395/400.🤖 Generated with Claude Code