Observed
A 4-reviewer independent closeout audit of ADR-0.0.37 (every gate run + tamper-tested) found the ADR's derivation-and-enforcement spine to be theater. The four OBPIs constituting it were attested "Completed" on structural witnesses that do not enforce their claim, and have been repudiated (cause model-induced-fabrication, attestor g0): OBPI-0.0.37-02, -03, -21, -22. ADR now 15/19, closeout BLOCKED.
(1) No registry->AGENTS.md projection exists (OBPI-02).
render_agents_md(invariants, template_root, project_root) ignores invariants/template_root and returns path.read_bytes() of .gzkit/renditions/AGENTS.md/claude.md (src/gzkit/governance/compose.py:54-80). grep -ri jinja over compose/render — no Jinja2. reconcile_invariant has zero callers. The attested "byte-deterministic Jinja2 composition renderer" does not exist.
(2) The coherence gate renders with an EMPTY registry (OBPI-03).
validate_invariant_coherence calls render_agents_md({}, Path(), root) then byte-diffs AGENTS.md against its own committed twin (src/gzkit/governance/trust_audits/invariant_coherence.py:54-67). Tamper: gut CIC-1.json's claim -> uv run gz validate --invariant-coherence still exit 0. The ConstitutionalInvariant registry plays zero role.
(3) The "drift gate" compares mtimes, not content (OBPI-22).
validate_rendition_freshness compares corpus.stat().st_mtime <= rendition.stat().st_mtime (src/gzkit/governance/trust_audits/rendition_freshness.py:44-48). Tamper: git checkout .gzkit/corpus/AGENTS.md.jsonl (byte-identical content, new mtime) -> gate flips exit 3. Meanwhile the real committed rendition shares ZERO bytes with the corpus's 7 invariant entries yet passes green.
(4) The composer was never run and rejects the committed artifact (OBPI-21).
grep -c composition_candidate_emitted .gzkit/ledger.jsonl -> 0. Running compose() on the committed rendition raises ValueError: Invariant-floor violation. The committed rendition is a hand-authored copy of AGENTS.md (cmp .gzkit/renditions/AGENTS.md/claude.md AGENTS.md -> identical), bypassing the composer (src/gzkit/content/composer.py:24-80 validates a hand-supplied candidate; it does not generate from canon).
Expected
ADR-0.0.37 thesis (ADR body): "establishes a constitutional-invariant registry as Layer 1 canon, renders AGENTS.md from the registry as a derived view." CIC-1 names gz validate --invariant-coherence as its structural witness for "drift between rendered view and committed AGENTS.md is fail-closed."
Canonical contradiction
The derived-view capability exists nowhere: no code renders AGENTS.md from the registry, no gate asserts the rendition derives from (or even contains) canon, and the registry (OBPI-01, genuinely real) is orphaned with zero consumers. The gates that claim to enforce coherence are a copy==original tautology (03) and an mtime ordering (22).
Class of failure
Structural-witness theater: a gate/test named and docstringed for a content-coherence invariant while mechanically checking something vacuous (empty-registry render, mtime ordering, fixture-only corpus, copy-vs-original). Any future "X is derived from canon" claim is exposed to the same family unless the witness exercises the real artifact against the real canon.
Corrective scope
- (A) Real content-coherence gate. Fail closed unless the committed rendition contains every corpus invariant-tier entry verbatim (
tier_policy.assert_invariant_verbatim on the committed artifact). Replace the mtime theater (22) and empty-registry tautology (03). Wire into gz check. Recompose AGENTS.md via the real gz content compose flow + operator-attested candidate so it genuinely satisfies the floor.
- (B) Larger maturation. Wire the orphaned ConstitutionalInvariant registry into a real generator/consumer — the canon->AGENTS.md derivation the ADR claimed (architectural fork: keep corpus->candidate->playback with a real floor, vs. build an actual registry compiler).
Partial-facade REQs (separate cuts): OBPI-23 REQ-02 (tautological non-verbatim survival test), OBPI-26 REQ-05 (rides the 22 facade). Honesty caveats to track: OBPI-24 info-retained-per-byte is agent-asserted, never machine-computed; OBPI-25 compressible-tier branch dormant (0 of 54 enforced bullets route to it).
Scope hint (advisory, for routing)
- Estimated diff: larger (new validator scope + recompose + registry wiring)
- Surfaces touched: src/gzkit/governance/trust_audits/, src/gzkit/content/, .gzkit/renditions/, .gzkit/corpus/, gz check wiring
- In-flight vs. new feature: correction to active foundation ADR-0.0.37 (operator doctrine: more-needed-to-fulfill-intent is a correction)
Related
Observed
A 4-reviewer independent closeout audit of ADR-0.0.37 (every gate run + tamper-tested) found the ADR's derivation-and-enforcement spine to be theater. The four OBPIs constituting it were attested "Completed" on structural witnesses that do not enforce their claim, and have been repudiated (cause
model-induced-fabrication, attestorg0): OBPI-0.0.37-02, -03, -21, -22. ADR now15/19, closeoutBLOCKED.(1) No registry->AGENTS.md projection exists (OBPI-02).
render_agents_md(invariants, template_root, project_root)ignoresinvariants/template_rootand returnspath.read_bytes()of.gzkit/renditions/AGENTS.md/claude.md(src/gzkit/governance/compose.py:54-80).grep -ri jinjaover compose/render — no Jinja2.reconcile_invarianthas zero callers. The attested "byte-deterministic Jinja2 composition renderer" does not exist.(2) The coherence gate renders with an EMPTY registry (OBPI-03).
validate_invariant_coherencecallsrender_agents_md({}, Path(), root)then byte-diffs AGENTS.md against its own committed twin (src/gzkit/governance/trust_audits/invariant_coherence.py:54-67). Tamper: gutCIC-1.json's claim ->uv run gz validate --invariant-coherencestill exit 0. The ConstitutionalInvariant registry plays zero role.(3) The "drift gate" compares mtimes, not content (OBPI-22).
validate_rendition_freshnesscomparescorpus.stat().st_mtime <= rendition.stat().st_mtime(src/gzkit/governance/trust_audits/rendition_freshness.py:44-48). Tamper:git checkout .gzkit/corpus/AGENTS.md.jsonl(byte-identical content, new mtime) -> gate flips exit 3. Meanwhile the real committed rendition shares ZERO bytes with the corpus's 7 invariant entries yet passes green.(4) The composer was never run and rejects the committed artifact (OBPI-21).
grep -c composition_candidate_emitted .gzkit/ledger.jsonl-> 0. Runningcompose()on the committed rendition raisesValueError: Invariant-floor violation. The committed rendition is a hand-authored copy of AGENTS.md (cmp .gzkit/renditions/AGENTS.md/claude.md AGENTS.md-> identical), bypassing the composer (src/gzkit/content/composer.py:24-80validates a hand-supplied candidate; it does not generate from canon).Expected
ADR-0.0.37 thesis (ADR body): "establishes a constitutional-invariant registry as Layer 1 canon, renders AGENTS.md from the registry as a derived view." CIC-1 names
gz validate --invariant-coherenceas its structural witness for "drift between rendered view and committed AGENTS.md is fail-closed."Canonical contradiction
The derived-view capability exists nowhere: no code renders AGENTS.md from the registry, no gate asserts the rendition derives from (or even contains) canon, and the registry (OBPI-01, genuinely real) is orphaned with zero consumers. The gates that claim to enforce coherence are a copy==original tautology (03) and an mtime ordering (22).
Class of failure
Structural-witness theater: a gate/test named and docstringed for a content-coherence invariant while mechanically checking something vacuous (empty-registry render, mtime ordering, fixture-only corpus, copy-vs-original). Any future "X is derived from canon" claim is exposed to the same family unless the witness exercises the real artifact against the real canon.
Corrective scope
tier_policy.assert_invariant_verbatimon the committed artifact). Replace the mtime theater (22) and empty-registry tautology (03). Wire intogz check. Recompose AGENTS.md via the realgz content composeflow + operator-attested candidate so it genuinely satisfies the floor.Partial-facade REQs (separate cuts): OBPI-23 REQ-02 (tautological non-verbatim survival test), OBPI-26 REQ-05 (rides the 22 facade). Honesty caveats to track: OBPI-24 info-retained-per-byte is agent-asserted, never machine-computed; OBPI-25 compressible-tier branch dormant (0 of 54 enforced bullets route to it).
Scope hint (advisory, for routing)
Related