Conversation
The sixth slice of the Normative IR (V6 in docs/shaping/normative-ir-slices.md), stacked on V5. `acs-ir verify <trace.jsonl>` takes the Guardian's envelope log (or a bare JSON-RPC log), normalizes the wire into the vocabulary's relations, validates every envelope and hook payload with Ajv against the 44 pinned schemas, computes in ordinary code what Datalog cannot (RFC 8785 canonicalization, §8.2's entry_hash recomputation over the Guardian's exported entries, HMAC-SHA256 verification over §10's signed input), runs the evaluator, and then applies the scoping layer: profile activation, modality, evidence. Every provision gets one of eleven verdicts and none is a dropped row: pass, fail, not-activated, not-exercised, permission, non-testable, inexpressible, exclusion, definition, invariant, and unevaluated. The last is the one the plan did not name: a predicate that reads the Guardian's own records, deployment configuration, or a key the verifier was not handed is reported as not evaluated with the missing relation named, never as a pass on an empty relation. The compiler's per-provision external-fact list is what makes that mechanical. Each violation carries its subject and witness columns by name and the facts that mention the subject, so a failure reads without re-running the verifier. The report lists the non-testable and exclusion rosters, what was not activated, and what was not evaluated. On the generated traces the clean one passes all 21 compiled provisions and the violating one fails the nine it breaches. Two vocabulary corrections came from building the normalizer: ask_resolved is Guardian state, since Guardian-to-Approver traffic is not in the Observed Agent's log, and chain_mismatch_observed is derived from the request's metadata.session_state.chain_hash against the last published head. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm
Normative impact (ACS 0.1.2 at
|
The repository's .gitignore excludes every dist/ directory, so ir/dist/provision-index.md (and rules.dl from V5 on) never reached git even though `render --check` and `compile --check` require the committed copy. Re-include ir/dist/ and commit the files the checks compare against. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm
afogel
added this pull request to stack #48
September 14, 2026 14:18
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.
Sixth slice of the Normative IR (
docs/shaping/normative-ir-slices.md§V6), stacked on #43.Demo:
bun run ir verify <trace.jsonl> --guardian <dir> --deployment <dir> --hmac-key <hex>emits a W3C-style conformance report over an envelope log: per-provision verdicts with the facts that witness each violation, scoped to the profiles the session negotiated, with the non-testable and exclusion rosters printed rather than omitted, and an unexercisedMAYproducing no verdict. Captured output is inir/slices/v6/README.md;ir/test/fixtures/trace/generate.tsproduces the clean and violating logs the tests and CI run.What it delivers
normalizeTrace()(N41) restates the wire as facts;validateSchemas()(N43) runs Ajv over the 44 pinned schemas, envelope and hook payload alike, intoschema_violationfacts;computeExternalFacts()(N42) does what Datalog cannot: RFC 8785 canonicalization, §8.2'sentry_hashrecomputation over the Guardian's exported entries, HMAC-SHA256 over §10's signed input withsignatureremoved. Then the evaluator, thenscopeByProfile(),applyModality(),attachEvidence()(N45 to N47).unevaluated.unevaluatedis new. A predicate that reads the Guardian's records, deployment facts, or a key the verifier was not given is reported as not evaluated with the missing relation named, never as a pass on an empty relation. The compiler's per-provision external-fact list from V5 makes this mechanical.context-entries.jsonlplusfacts/); deployment facts as.facts. Nothing imports frompackages/(R8.2).ask_resolvedis guardian-state (Guardian-to-Approver traffic is not in the Observed Agent's log);chain_mismatch_observedis derived frommetadata.session_state.chain_hashagainst the last published head.Results
Verification
bun run typecheckpasses;bun test ir: 173 tests pass (Soufflé present locally).compile --check,render --check,lint,differential: green. CI gains a step that generates the clean trace and requiresverifyto exit 0.🤖 Generated with Claude Code
https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm