Build-to-1.0 Campaign — 2026-07-18 (Magna Carta)¶
SUPERSEDED 2026-08-16. This file no longer steers. The active plan is
build-to-1.0-campaign-2026-08-16.md, which is a full carry-forward of this edition — every box, movement, amendment, and register entry is retained there inline and in place, so no § Rulings Register disposition pass was owed and no ruling from this edition is undefined. Read the successor; this file is retained for audit only.The successor exists because this plan was re-evaluated against the live tree on 2026-08-16 rather than re-read, and that pass found real drift — oversized modules 33 → 51, the airlock's transit counters frozen at 23 in / 5 out through two days of Movement B holding TOPMOST, and the scorecard's Promotable rows returning 0 → 8 under GHI #810.
Status: SUPERSEDED (was: ACTIVE — the one canonical plan, operator-ratified 2026-07-18).
Superseded build-to-1.0-campaign-2026-08-16.md;
this edition superseded build-to-1.0-campaign-2026-06-30.md.
Topmost (sequenced): AMENDED 2026-08-14 — Movement B is TOPMOST; Movement A is HELD. Movement B — put the membrane on the real doors. The airlock is BUILT and installed on ONE door — run
uv run gz adr status ADR-0.33.0-airlock-membranefor its lifecycle and landed count rather than trusting a figure transcribed here. Measured live 2026-08-14: 524fixcommits in 90 days across zero transits; 23airlock_invs 5airlock_out(18 unaccounted exits — worse than the 23/10 this file recorded); and 20 of 23 transits computed an EMPTY seam-map and auto-proceeded, only 3 biting (3/4/7 seams →hold). RE-MEASURED 2026-08-16:airlock_in23,airlock_out5 — both UNCHANGED, so zero transits occurred in the two days since Movement B became TOPMOST, whilefixcommits over 90 days moved 524 → 528. The ungoverned door widened by four while the governed one stayed shut. That is the item-150 gap (GHI : MX :: OBPI : Build) reproducing in miniature, and it is the strongest available argument that item 0's calibration is the right first move rather than the widening beneath it. Sequence within B is calibrate before widening — a new item 0, ahead of the five checkboxes below, because widening an uncalibrated gate installs three more inert gates (ADR-0.33.0§ Negative #1, the load-bearing pre-mortem: "seam-maps rubber-stamped, GO always reached"). Movement B needs a feature ADR extendingADR-0.33.0; none is authored yet. See § Amendments 2026-08-14 and § Movement B.HELD — Movement A — close the Foundation Sunset. ~~
ADR-0.0.37audit~~ done 2026-07-18 (b40a8026) → ~~ADR-0.34.0capstone~~Validated2026-07-31, released v0.34.0 → NEXT: re-home the composition engine as a feature (ADR-0.35.0-canon-entry-corpus-landing,Draft, IN FLIGHT; runuv run gz adr status ADR-0.35.0-canon-entry-corpus-landingfor the landed count — ten authored briefs,gz obpi validate --authored10/10; the lifecycle step is RULED 2026-08-12 —DraftHOLDS through implementation and OBPI work is UNBLOCKED; not GHI #623, closed 2026-07-19; see § Movement A item 3) → THEN: install the cross-family critic at the convergence moment (ADR-0.36.0-convergence-moment-cross-family-critic,Proposed, NEXT-DRAWN afterADR-0.35.0lands; runuv run gz adr status ADR-0.36.0-convergence-moment-cross-family-criticfor the landed count — promoted 2026-08-09 (dc5fe4d39) from the pool ADR; the promotion debt is discharged and the remaining work is the build — work the governed path, do NOT hand-wire a hook; delivery is STAGED and OBPI-09 lands dark; see § Movement A item 2). The one-linefoundation-adr-registers-invariantdisposition (item 4) is RULED and checked off 2026-08-02 — it is no longer pending work. Then Movement B (airlock on the real doors), C (reduce), D (rulings). Pool backlog is post-1.0 (§7).Ordering note (corrected 2026-08-12). This banner had continued to assert the 2026-08-09 pull-ahead of
ADR-0.36.0for a day after the 2026-08-11 amendment (§ Amendments, "the pull-ahead is WITHDRAWN") withdrew it, contradicting items 2 and 3 below and the amendment itself — three surfaces in one file, the stale one read first.scripts/session_orientation.pytranscribes this line into every session's orientation, so the topmost-item line a fresh session was handed named the wrong feature. Architectural Boundary 6 in the same terms: a transcribed view is Layer 3 and never source-of-truth. When the sequence changes, this banner is part of the amendment, not a follow-up.Why this edition exists. The road to 1.0 was dragging. Measured 2026-07-18 over the prior 90 days: 1,508 commits, 43 of them
feat(2.9%); 703 weregz git-syncregenerating control surfaces (47% of all commits). The system had become its own primary consumer. This edition makes 1.0 finite, lifts the reduction deferral that deadlocked it, moves the airlock onto the doors work actually uses, and books the pool backlog as the post-1.0 release line.Slim by design — and this time it is enforced. Checkbox entries carry a one-line outcome plus a commit/receipt citation. Completion narrative belongs in the ADR, the ledger, and the release notes — not here. The 06-30 edition forbade inline amendments and then accreted 800-word completion prose into its checkboxes instead; that hole is closed. Amendments append to § Amendments, never inline.
1. What gzkit is (identity — unchanged)¶
Research instrument + published exemplar → personal toolkit → public product. gzkit's purpose is to make stochastic LLM vibing structurally inert — not by exhorting agents to behave (they vibe regardless), but by making every claim falsifiable by a live test.
Amended 2026-07-18: adoption is still not a 1.0 gate, but the absence of any external consumer is now named as the root cause of non-convergence (§2). One external forcing function is a Movement, not a nicety.
2. The reckoning (measured, 2026-07-18)¶
The 06-30 edition named enforcement-claim drift as root cause. That diagnosis was correct and its cure largely landed (§5's meta-validator, 42 claims verified, 0 facades). A second root cause was not named, and it is why 1.0 receded:
gzkit has no external forcing function, and its only consumer is its own construction. Self-inspection of a self-governing system is unbounded — every governance surface is a new surface needing governance, and every audit pass finds real defects, which is what makes the loop seductive rather than obviously wasteful.
| Measure (90d to 2026-07-18) | Value |
|---|---|
| Total commits | 1,508 |
feat |
43 (2.9%) |
fix |
470 (31%) |
chore — of which 703 are gz git-sync |
810 (54%) |
| GHIs minted | Apr 304 → May 197 → Jun 86 → Jul 38 |
| GHIs closed Jul | 51 (net-draining) |
| Surface | 107k src LOC · 146k test LOC · 359 ADRs · 659 OBPI briefs · 13,488 ledger events · 92 validate flags · 59 CLI verbs |
The GHI backlog is draining, not exploding. The "GHI after GHI" experience was not a worsening defect rate — it was defect repair becoming ~100% of the work because nothing in the system was permitted to say enough. §8 fixes that.
The airlock was built on the wrong door. Every airlock_in in the ledger is an OBPI
or a permitted-entry; zero are GHI direct-fix or session entry, which together carry
~97% of commits. Last transit: 2026-07-15. The 2026-07-18 session — corpus survey, two
GHIs, three source files, a Magna Carta amendment — crossed no airlock. Movement B is
the correction. (Accounting gap also open: 23 airlock_in vs 10 airlock_out.)
3. Doctrine (carried — see § Rulings Register for provenance)¶
- Four modes, one airlock each: Design · Build (OBPI, minor) · MX (GHI squawks, patch) · Chores (patch).
GHI : MX :: OBPI : Build. - Intent hierarchy: Constitution → PRD (one per major) → ADR → OBPI → REQ → TASK.
- Versioning: feature = minor · MX/GHI = patch · MX-produced contract change = patch + AD artifact. Every bump is a release.
- Taxonomy:
foundationis a closed, frozen-historic kind;poolandfeatureare the two live kinds. Completed foundations stay; unstarted ones drop to pool. Realized byADR-0.34.0. - Code architecture: Hexagonal (Ports & Adapters) is primary, seated in the DDD → HA → BDD → TDD spine; the domain is modeled as the ontology (
ADR-0.32.0), never a folder tree. - STDLIB-FIRST governs the interior; Pydantic is the one ratified exception.
4. The floor — never relaxes, either engine, in or out of the hangar¶
gate5_invariants (code constant, not config): human attestation, ledger integrity,
operator-PII, secrets. No marker, lane, sensitivity, or AOG can downgrade a member.
The enforcement-claim rule:
Any place gzkit asserts something is enforced / validated / fail-closed / gated / blocked — in code, an ADR, a doc, or an agent's claim — there MUST exist a paired live negative-control test that (a) constructs a known violation of that exact claim, (b) runs the real path in its production configuration, and (c) asserts it fails. No live negative control ⇒ the claim is facade ⇒ rejected.
Mechanized by @enforces(claim=…, neg_control=…) + the meta-validator.
Forbidden: forced-mode counterfactuals; tests that certify enforcement does nothing.
Registration is centralized in the qc NC table (
_qc_negative_controls.py), NOT colocated with the module it guards. Absence of@enforcesin a module is not evidence of a missing NC — checkregistered_claims(). A false facade finding was filed and withdrawn on this exact mistake (GHI #697, 2026-07-18).
5. The 1.0 definition — FINITE (amended 2026-07-18)¶
gzkit is 1.0 when ALL hold. Each gate is bounded; none is a standing obligation.
- The floor holds —
gate5_invariantsintact and the §4 meta-validator is green over the claim set registered as of 2026-07-18. Claims registered later are post-1.0 maintenance, not 1.0 blockers. - The facade is drained — as of the 2026-07-18 census. No gate returning
[]on its own violation, no test certifying inertness, among surfaces enumerated in that census. Facades found afterward route to MX/patch. (This replaces the 06-30 wording, which was an unbounded audit obligation with no terminal state — the gate that made 1.0 unreachable by construction.) - Both engines operate — a feature can go pool→release through the airlock; the MX hangar can drain debt and re-certify at a hard exit.
- The membrane is on the real doors — Movement B complete.
- The accretion is reduced — Movement C complete.
- One external forcing function exists — at least one flight-test sortie flown against
a non-gzkit substrate, black-box evidence collected (
gz-flighttest). - Release line healthy from 0.34.0; GHI backlog at steady-state triage scale.
- v1.0.0 released through the ceremony.
Explicitly NOT 1.0 gates: the pool backlog (§7 — post-1.0 release line), RECALL (severable enrichment), adoption.
6. The Queue¶
Work top-down. Check items off only with observed command evidence. No movement opens while
uv run gz checkis red.
Movement A — Close the Foundation Sunset (TOPMOST; forward engine; closes a kind — reductive)
- [x] ADR-0.0.37 → Validated via /gz-adr-audit. Attribution drift found by independent review and remediated pre-receipt. b40a8026 · receipt arb-step-unittest-753d3dda · detail in § Amendments 2026-07-18 (later session).
- [ ] Install the cross-family critic at the convergence moment. NEXT-DRAWN, after ADR-0.35.0 lands — the 2026-08-09 pull-ahead was WITHDRAWN by the 2026-08-11 amendment (operator: "not sure i wan't to author 0.36.0 while we haven't finished 0.35.0", spelling preserved). The withdrawal rests on the staged-delivery ruling, not on a change of mind: because OBPI-09 lands dark, completing all nine still does not deliver the always-on critic the pull-ahead was for. Three briefs (01, 02, 03) were authored 2026-08-11 at 1b808b18d and remain valid; six are draft (scaffold). The design is complete and unbuilt: ADR-0.36.0-convergence-moment-cross-family-critic (Proposed) now holds it (run uv run gz adr status ADR-0.36.0-convergence-moment-cross-family-critic for the landed count), promoted 2026-08-09 from ADR-pool.convergence-moment-cross-family-critic (now Superseded), which had recovered it verbatim from the three 2026-08-06/07 design transcripts after the operator judged the handoff chain had degraded it — "multiple audio tape recordings of audio tape recordings where the quality is dissipating rapidly." Nothing runs today: .claude/hooks/ ships no critic script and .claude/settings.json PreToolUse has matchers for ExitPlanMode, Write|Edit and Bash only — no AskUserQuestion matcher (verified 2026-08-09). Promotion is done; the remaining work is the nine OBPIs. Work the governed path; do not hand-wire a hook — that was the declined option. Carried design rulings that bind the build: the critic performs BOTH scope and conclusion challenge with full context ("why is this a choice? we want the adversary to get full context. measure twice, cut once"); it is a skill with three invocation doors — operator, agent, or gate ("this is a skill but can be invoked by me, by agent, or at gate"); post-verdict resolution is operator + main agent modeled on Step 4b ("obpi pipeline 4b already handles this well — observe it"); and it uses the built-in Codex integration rather than a hand-rolled port ("why not use that and keep it simple?"). The critique passes through unedited — updatedInput enforces it, so the critic's verdict reaches the operator before it enters the agent's context. This does not relax one-feature-at-a-time: ADR-0.35.0 is Draft and unstarted (run uv run gz adr status ADR-0.35.0-canon-entry-corpus-landing for the landed count), so this exchanges which feature is in flight rather than running two. THE PROMOTION DEBT IS DISCHARGED — all four owed items, then the promotion itself (2026-08-09, 8763ec633 + dc5fe4d39). Decomposed against the three doors with the PreToolUse adapter as OBPI-09 landing dark; Step 4b generalized without editing it (OBPI-07); A3 and A4 carried as OBPI-05 and OBPI-06; the adversary re-run already discharged by the amendment above. What remains is the build — no OBPI has landed. DELIVERY IS STAGED, not big-bang — the adversary re-run was performed 2026-08-09 and returned PERFORATED-BUT-NARROWABLE. R4 dissolved Pass 1 axis 2 (forbidden same-family critic) and R3 dissolved Pass 2's missing-policy attack at the policy level; axes 1, 3 and 4 remain partially addressed. What still perforates: the automatic door binds to a UI event that carries mandatory clarification as well as recommendations, so it "can prevent the very question those rules require"; prose bypasses it entirely; strong subject binding (prompt hash, scope manifest, primary-output hash) is explicitly unbuilt; and the scope-time-vs-conclusion-time timing question the ADR calls "live" is unresolved by R1. Therefore: ship the skill, the three doors, the scope-first challenge, the A3 envelope, the R3 transition and provenance binding FIRST; the automatic AskUserQuestion door lands DARK and is lit only after a calibrated pilot measures "false blocks, latency, operator reading time, and decisions changed." This is sequencing, not abandonment — and the cost is stated rather than softened: until that door lights, this does not deliver a second opinion at every structured choice. A3 → ADOPT-NARROWED (one decision-scoped envelope, not persistent state across every tool transition). A4 → ADOPT-NARROWED (mandatory for the enumerated consequential categories and explicit operator requests, sample the routine; the primary agent's own unvalidated confidence must NOT set the tier — the ADR itself asks whether that confidence is "placebo"). R4's transport premise is measurably wrong and is corrected in the ADR (§ R4 transport correction) — see also GHI #786: the built-in adversarial-review reviews branch diffs, not decisions, and the codex:codex-rescue forwarder is contracted to "return nothing" on failure. R4's ruling (use the current Codex, keep it simple) stands; the belief that the shipped plugin already supplies this transport does not.
- [ ] Re-home the registry→AGENTS.md composition engine as a feature ADR. IN FLIGHT — restored to the in-flight feature position by the 2026-08-11 amendment, reversing the one-position deferral of 2026-08-09. Implementation-ready and reviewed 2026-08-11: ten briefs pass
gz obpi validate --authored10/10,--req-kind-discipline/--brief-reconcile/--cli-alignmenteach exit 0. Three ADR-body defects were repaired at584778396—BI-07had lost its REQ's proof channel (it citedADR-0.44.0whileREQ-0.35.0-09-07 [structural-fence]citedADR-pool.vendor-alignment-codex),(see Forced Decisions)pointed at a non-existent section, and the[kind]tag case was split. Status isDraft, and the lifecycle step is RULED 2026-08-12:DraftHOLDS through implementation. OBPI work is UNBLOCKED and this question is CLOSED — do not re-raise it. The question had been carried unworked across seven successive handoffs because the answer was never written down; it is written here. Three findings settle it. (i) Corpus precedent is unanimous:ADR-0.33.0andADR-0.34.0each heldstatus: Draftthrough their entire implementation phase and moved straight toCompletedat release —ADR-0.34.0authoredDraft2026-07-12 (946afb5ae), held it through OBPI-05 (67cf7c998) and the orphan-census fix (7de63c779), and becameCompletedonly at the v0.34.0 release commit (551366064), thenValidated(73e2f5569). No feature ADR has ever enteredProposedorAccepted. (ii)Acceptedwould be a false Layer-1 claim:STATUS_VOCAB_MAPPING(src/gzkit/governance/status_vocab.py:42) maps"Accepted": "validated", and bothgovernance/frontmatter_coherence.pyandcommands/gates.pyconsume it — advancing while OBPIs remain unlanded (uv run gz adr status ADR-0.35.0-canon-entry-corpus-landingfor the live count) would assert the ledger termvalidatedagainst a Layer-2 that reportspending, manufacturing exactly the drift the frontmatter-ledger-coherence chore exists to catch.DraftandProposedboth map topending, soProposedwould be vocab-neutral but precedent-breaking for no gain. (iii) TheDraft → Proposed → Acceptedchain inADR_TRANSITIONS(src/gzkit/core/lifecycle.py:48-53) is dormant on this axis — it is re-exported bysrc/gzkit/lifecycle.pybut no ADR frontmatter writer consumes it, which is why the corpus performs aDraft → Completedjump the machine forbids. It is not the governing authority here. The Lifecycle column reportingPendingis not drift: it is Layer-3 derived from the absence of Layer-2 completion events and can report nothing else while the OBPI set is unlanded, whereas frontmatter is Layer-1 authorship. Different axes, perdocs/governance/state-doctrine.md. DONE as authoring: the successor isADR-0.35.0-canon-entry-corpus-landing(authored 2026-07-21,Draft;uv run gz adr status ADR-0.35.0-canon-entry-corpus-landingfor the OBPI set and landed count) — this item is started-not-done, and the tracker is the ADR, not a GHI. GHI #623 closed 2026-07-19 and GHI #654 closed 2026-07-22supersededintoADR-0.35.0, whose § Intent names it: "Discharges GHI #654 (orchestration gap) and GHI #635 (duplicate invariant entries) -- the same wound." Do not reopen #623 or #654 to find this scope; read the ADR. Its OBPI-05 carries the corpus→candidate generator and OBPI-07 thegz content landorchestrator. GHI #654's capture-silence gap was direct-fixed ahead of the chain (48a5f799,dcf29b95) because it was a live footgun; see the pre-landed note inOBPI-0.35.0-08. The absorption directionADR-0.0.37§ Terminal Disposition recorded ("tracked at GHI #623 (absorbing GHI #654)") is backwards relative to what survived: #623 was an audit finding and its findings are discharged, while #654 states the same unbuilt capability as operator pain with a reproduction — "there is no generator that renders the corpus delta into a candidate." Closed after a full re-verification: claims (3)/(4) had been fixed by later work and never credited back, corrective scope (A) had landed as--rendition-floor-coherence, the discarded registry parameters were removed (4f9c7d2b), and a standing witness-resolution gate was added (e409bb08). Residual scope, unbuilt and feature-shaped: the attributable corpus→candidate generator and therendition ⊆ corpuslineage gate — todaycompose()validates an agent-supplied candidate rather than materializing one from the corpus, so prose absent from canon can still pass. The registry spine is NOT the successor:ADR-0.0.37§ Terminal Disposition permanently withdrew OBPI-02/03 as "obsoleted by the 2026-06-03 corpus Re-Alignment." The successor is corpus-shaped. - [x] Disposition
foundation-adr-registers-invariant— RULED 2026-08-02: retire the claim as superseded by the Foundation Sunset. The entry declared structural witnessgz validate --foundation-registers-invariant, which never existed, and the claim was unenforceable as written —constitutional_invariant.jsoncarries no field naming which ADR registered an entry (fields areid,claim,structural_witness,composition_targets,classification). The ruling turns on what OBPI-0.34.0-05 sealed: the foundation kind is closed at bothadr_createdingresses, so the claim's subject set is permanently frozen at the 51-entry grandfathered roster and can never be exercised again. The entry now states that sealed reality, witnessed bygz validate --taxonomy(exists; already the last step ofgz check; exits 0 on the terminal tree). The file is retained, not deleted —REQ-0.0.37-01-03(attested, OBPI-0.0.37-01) asserts only that the three seed files exist, load viaload_invariants, and validate against the schema, never that the claim text is true; rewritingclaim+structural_witnesspreserves attested canon exactly, deleting the file would falsify it.tests/governance/test_invariant_witness.pyfence drops tofrozenset()and stays shrink-only: a new vapor witness fails immediately. Two corrections to this item's own prior text: the "74 foundation ADRs" figure was the--taxonomyfindings count from OBPI-04 (line above), not an ADR count — the roster is 51; and--invariant-witnesswas described as staying "out ofgz checkuntil this is ruled", but that flag has never existed either —validate_invariant_witnessesis a function ingovernance/trust_audits/invariant_witness.pywhose only caller is the fence test, with no CLI wiring. Enrolling it was separate work, tracked at GHI #746 and landed 2026-08-03:--invariant-witnessis now a registered default-tier scope, so it runs under baregz validateand therefore insidegz check— no separate step entry was needed, because GHI #744's collapse made one baregz validategate the whole default tier. The scope is now nameable as astructural_witnessin its own right, which it could not be while unregistered. - [x]
ADR-0.34.0-foundation-sunsetcapstone —Validated2026-07-31, released v0.34.0, tag on the bump commit551366064. Closeout ceremony (11 steps,g0verbatim "attest completed") then audit ceremony (g0verbatim "accept audit"); receiptsarb-step-unittest-f02e079a9c5c4fce83433f15d1ace4b1(7685 OK),arb-ruff-9b11bcbc647c4b9a9ddb6282f7fc34b4,arb-step-typecheck-4c8436dc00e842b8847ebcacb7dc866c,arb-step-mkdocs-3f31717e44a04a46821f35433f53b0c2; bound fidelity gate 2/2. Audit record and three recorded-open shortfalls:docs/design/adr/pre-release/ADR-0.34.0-foundation-sunset/audit/AUDIT.md. All 5 OBPIsattested_completed. OBPI-01 2026-07-19: grandfather manifest + closed-kind assertion · OBPI-02: authoring-time kind rejection at all three CLI doors · OBPI-03 2026-07-29 (f6088fabc): terminal-partition gate reading grandfathered-foundation terminality from the Layer-2foundation_grandfatheredevent and never frontmatter, plusADR-0.0.18frozen-historic · OBPI-04 2026-07-30 (d521ace53): the migration executed —--taxonomymoved exit 3 / 74 findings → exit 0, 23 genuinely-unstarted foundations demoted to pool (136 briefs removed, lineage preserved byobpi_parkedper child), 51 manifest entries bijective with 51foundation_grandfatheredledger events, re-sensed with zero orphans (seams 119→119) · OBPI-05 2026-07-31: the permanent--taxonomygate wired as the last step ofgz check, and the registration membrane sealed at the two manifest-membraneadr_createdingresses (GHI #706 discharged). Audit qualification: exactly threeadr_createdemission sites exist; the third is the shared helperregister_adr_in_ledger, whose two callers are both separately guarded — a latent surface (GHI #734), not an open hole. Movement A's capstone is closed; items 2 and 3 remain.
Movement B — Put the membrane on the real doors (new feature ADR extending ADR-0.33.0; heavy) — TOPMOST as of 2026-08-14 (operator-ratified; § Amendments)
The doors mostly exist. They do not fire.
gz permitted-entryshipped withADR-0.33.0(OBPI-05) and has 2 recorded transits.gz airlock inis wired intogz obpi pipelineStage 1 and fires reliably there — because the pipeline triggers it. Everywhere else the airlock is invocable but opt-in, and an opt-in gate is not a gate. This is the §4 failure class one level up: a mechanism that exists, is documented as governing entry, and does not bite. Operator ruling 2026-07-18: GHI and ad-hoc (permitted) entry MUST trigger the airlock mechanism.
- [ ] 0. CALIBRATE THE SEAM-MAP BEFORE WIDENING ANY DOOR. (added 2026-08-14; sequenced ahead of the five below.) The gate is not theater — it bit 3 times — but 20 of 23 transits computed an EMPTY seam-map and auto-proceeded (measured live 2026-08-14:
decision20proceed/ 3hold;unaccounted20×0, then 3, 4, 7).ADR-0.33.0's own calibration-frontier note states the cause:gz ontology reach(<obpi-id>)returns transitive dependents, of which a leaf OBPI has none, sopush_edgesis empty; and the gate never passesparent_invariants, sopull_edgesis empty too. This is WWHTBT-(a), the ADR's self-declared load-bearing condition, deferred past the FC-2 tracer and never landed. Widening to three more doors first would install three more inert gates and put transit ceremony on 524 commits/quarter with no membrane behind it —ADR-0.33.0§ Negative #1 ("Theater… seam-maps rubber-stamped, GO always reached… the membrane exists but does not bite") arriving through the front door. Done means: a real entry on a real OBPI computes a non-empty seam-map, and the existing NC still cannot be forced. Destination: the new feature ADR this Movement declares in its own header — NOT corrective work underADR-0.33.0. The re-homing precedent isADR-0.35.0, which exists becauseADR-0.0.37's composition engine was withdrawn and re-homed as a feature rather than appended to a sealed ADR. Appending an OBPI toADR-0.33.0would drag aValidatedADR back toPendingand retroactively falsify an operator attestation that was honest when it was given — the frontier was disclosed in the attested REQ text, so the artifact told the truth and the residual is unscheduled work, not a defective attestation. The feature slot is unallocated until that ADR is authored; read the next free one off disk (ls docs/design/adr/pre-release/) rather than transcribing an id from here. - [ ] GHI direct-fix triggers the airlock.
GHI : MX :: OBPI : Build— the MX door must carry the same membrane the Build door does. Afix(...)landing without a transit is an unaccounted entry. This is the single highest-volume ungoverned door: 470fixcommits in 90 days, zero transits (90d to 2026-07-18; 481 on the same measure to 2026-08-08). The door is wider than either figure reports. Measured 2026-08-08 subject-anchored: 546 commits touchedsrc/**/*.py, 193 of them (35%) under achoresubject, and 187 of those 193 (97%) weregz git-sync-authored — invisible togit log --grep='^fix(', which is both the source of this figure and the precedent query AGENTS.md § Defect-fix routing prescribes for its own routing decision. Fenced at the sweep 2026-08-08 (GHI #708 reopened), so the count is honest going forward and undercounts by an unrecovered amount before it. Measure subjects viagit log --format='%s', never--grep='^chore'—--grepmatches the whole message and admitsfix(chores):commits whose body has a line starting with "chore". - [ ] Ad-hoc / permitted entry triggers the airlock. Make
permitted-entryfire on ad-hoc reconnaissance and light repair rather than waiting to be invoked — the reason selects the door, never whether the gate fires (ADR-0.33.0door principle). - [ ] Session entry triggers the airlock. A model entering the project is a transit. The SessionStart hook already runs orientation; it should seat a seam-map and a go/no-go. Evidence this is the live hole: the 2026-07-18 session ran a full corpus survey, filed 2 GHIs, changed 3 source files, and rewrote Magna Carta across zero transits.
- [ ] Close the transit-accounting gap: 23
airlock_invs 5airlock_out— 18 transits never accounted for on exit. Failure-atomic pairing precedent: GHI #679 /89c5ee9a. Count corrected 2026-08-14 from the 23/10 this box carried; re-measure rather than transcribe. Sequence it second, after item 0 — do not widen what you cannot yet account for. This is the third instance of one paired-event family found on 2026-08-14: the resume gate recorded 160 lifts and 0 blocks (fixed,2a326f042),session_exitrecords 37 skips and 0 writes (GHI #766, open), and the airlock pairs 23 entries to 5 exits. Consider dispositioning the family once rather than three times. - [ ] Bind with a §4 live NC on each widened door: un-triggered entry → the claim fails. Not "un-accounted seam → GO unreachable" (that is
ADR-0.33.0's existing NC, and it only fires once you are already inside the airlock). The new NC must catch never entering at all — the failure mode that let ~97% of commits through.
Movement C — Reduce the accretion (deferral LIFTED 2026-07-18 — this is pre-1.0)
- [ ] Surface mirroring — 703 of 810 chore commits (47% of all commits) are gz git-sync regenerating five copies of every skill/rule across .gzkit/, src/gzkit/, .claude/, .agents/, .github/. One canonical location; generate at install, not at commit. Largest single line item on the board. RE-MEASURED 2026-08-16 — the ratio holds, and this box's window is unrecorded so the original figures are NOT overwritten. Over a stated 90-day window: 1561 commits, 761 chore subjects, 633 mentioning gz git-sync (git log --since='90 days ago' --format='%s'). The proportion is materially unchanged (~49% vs the 47% recorded), so the box's claim stands on fresh evidence rather than on a transcribed number. The original 703/810 is left in place because the window it was taken over is not stated anywhere — replacing figures whose method is unknown with figures from a different method would manufacture a false comparison, which is the transcription failure gz validate --transcribed-adr-counts exists to refuse. Whoever works this box states the window first.
- [x] Collapse the validate() surface to the registry — DONE 2026-08-08 against the amended criterion. Done means the enumeration family is closed, not that the count fell (amended 2026-08-07): the registry is the single source, and registering a scope enrolls it in the gate (GHI #744). Siblings that must stop recurring: #704 (six solo-only scopes silently dropped when combined, under a green check), #745 (fenced blocks escape all three verb detectors), #748 (a weaker verb extractor reimplemented alongside one that already shipped). A count target alone leaves every one of those live. All three sub-claims now hold, each fenced: (a) enrollment landed 2026-08-02 (0f671b31c, GHI #744) — data/check_scope_membership.json declares membership and tests/governance/test_check_scope_parity.py recomputes it from source via AST, so drift in either direction fails and a default-tier scope outside the gate fails closed; (b) the registry is now genuinely the single source — --qc-binding, --fidelity-presence and --waiver-ratchet had dispatched through the early-return chain alone since the #618 collapse, contradicting the VALIDATOR_REGISTRY header's own "Single source of validate dispatch" claim, and that gap had already cost GHI #630 (every SUPPORT REQ citing one read unproven-support regardless of truth) which was patched with a third hand-maintained map rather than closed; registering the three retired that map (net −18 source lines) and the fence now asserts reached − registry == ∅ instead of accommodating the exception; (c) #704, #745 and #748 all closed 2026-08-02 with standing fences, #704 with a genuine class-level fix replacing the per-scope guards that had been copied forward onto every new scope. Count correction: the "94 scopes" this box carried matched no enforced surface — VALIDATOR_REGISTRY holds 85, the roster classifies 85 (44 in_check / 41 out_of_check), and gz validate --help prints 99 flag lines including non-scope flags. The retargeting off counting is exactly why that stale figure changed nothing about completion.
- [ ] Oversized modules — census-driven, with working proof. RE-MEASURED 2026-08-16: 51 modules over 600 lines, up from the 33 this box carried — a 55% increase, and the largest measured regression on the board. Method, so the next reader re-runs rather than transcribes: find src/gzkit -name '*.py' -exec wc -l {} + | awk '$1>600 && $2!="total"'. The box is not merely unstarted; its subject grew faster than anything shrank it. Note the threshold itself is contested — .gzkit/rules/pythonic.md § Size Limits records that 600 is authoring-time guidance with no enforcing gate, and that it disagrees with the canonical complexity-thresholds.md table (which warns at 733.2 and blocks at 1031.9), so a census against 600 counts modules that no gate rejects. Settle which number governs as part of the census, or the proof will be measured against an authority the codebase does not enforce.
- [ ] The Firewall (recovered orphan, § 9a) — classify every delivered surface by destiny: wheel-borne / authored-into-battlefield / lab-only-jig, enforced at scaffold-time and validate-time. Operator, 2026-06-14: "the rigging and jigs do not remain attached to the fuselage once we open the factory hangar doors for final delivery — we haven't been careful about this." Booked 06-14, never built. Load-bearing for §1's public-product trajectory: today an adopter inherits gzkit's lab jigs. Genuinely reductive — it defines what does not ship.
- [ ] Render the stability-gradient spine (recovered orphan, § 9a) — the 06-14 ruling ordered the tree Constitution → PRD → ADR → OBPI by rate of change and declared the legacy PRD → Constitution spine backwards. AGENTS.md § Workflow still carries the old order across ~12 surfaces. Booked and never rendered.
- [ ] Close the doctrine-declared-without-mechanism family (added 2026-08-07) — the family's own name, from GHI #537: "Layer X declares a discipline that Layer X does not mechanically enforce." Measured by the failure-class-index chore over the 333 GHIs closed since 2026-05-09: the two deepest recurrence chains in the corpus (depth 12 and depth 7) are both this family, ~19 members, and it holds the two most-cited ancestors on record (#537 cited 3×, #538 cited 4×). Both arms are in scope — validator-side (a check whose subject is narrower than its name: #692 checks section presence, not population; #693 verifies a flag is mentioned, never that its description is true; #770 an audit named for dispatch attestation whose entire subject is a frontmatter string) and agent-side (a skill mandate with no receipt: #459, #574, #620). Completion criterion: a declared discipline either carries a mechanical witness or is demoted to advisory in its own text — no third state. This is the reductive move that stops the validate() surface producing scope #95: it closes the family rather than the instance. Re-scoped 2026-08-08 (operator-ratified) — the six named issues all closed and the box did NOT discharge; see the amendment for why, and the measurable criterion below.
All six exemplars are CLOSED — validator-side #692, #693, #770; agent-side #459, #574, #620 (verified 2026-08-08 via gh issue view). They are evidence the class exists, not a checklist: the box's own text says "it closes the family rather than the instance." Six closed instances do not discharge a class-level criterion, and checking the box on their strength is the enumerate-the-exemplars habit the criterion was written to resist.
The criterion is measurable, and the instrument already exists. docs/governance/advisory-rules-audit.md scores every clause of CLAUDE.md + .gzkit/rules/** on four values, self-tested by gz validate --advisory-scorecard. Those four values ARE the criterion: Mechanical = carries a witness; Judgment = advisory by its own text; Promotable and Ambiguous = the third state this box forbids. The live count is the scorecard's own fenced Summary table — deliberately not restated here. Run uv run gz validate --advisory-scorecard; it fails closed when that table disagrees with the rows beneath it.
Count correction, 2026-08-08 (measurement only — the ratified criterion is unchanged). This paragraph first read "63 Mechanical, 27 Judgment, 12 Promotable + 2 Ambiguous = 14 rows in the third state." None of those four figures reproduce against the file, which had not been modified since 2026-08-06. The measurement was taken by counting mentions rather than rows:
grep -c 'Ambiguous'returns exactly 2 — the scorecard's legend row and its own Summary row, neither of which is a rule. The true third state is 9Promotableand 0Ambiguous, andAmbiguoushas no members at all, so one of the two arms the criterion named was empty from the start. Per the GHI #768 ruling on this same class — stop writing the number down; add a narrow check so it cannot decay back into a convention — the figure is now fenced at the scorecard and cited here rather than transcribed.
Done means all three arms hold:
1. Rules arm — every Promotable/Ambiguous row reaches zero: each is either mechanized (→ Mechanical) or its rule text amended to state it is advisory (→ Judgment). Re-scoring alone, without the text edit, is laundering. Read the freeze before choosing an arm: the scorecard's § Recommended promotion order is FROZEN (2026-06-08, governance-subtraction) — "Promotion is opt-in-with-justification ... The remaining Promotable rows stay advisory by default." Under that freeze the default disposition is the amend-the-text-and-re-score arm; mechanization is reserved for a row carrying named, observed drift evidence. That reading makes this box a subtraction move, which is what Movement C is for.
2. Skill arm — the scorecard covers no .gzkit/skills/**/SKILL.md mandate, which is where all three agent-side exemplars lived (#459, #574, #620 were each a skill mandate with no receipt). Extend coverage to skill mandates, or record in the audit why skills are structurally out of scope. Today the arm is not failing — it is unmeasured, which is the same blindness one surface over.
3. Debt arm — already mechanized and needs no new work: the 23 pre-ledger rules are pinned in data/advisory_scorecard_grandfather.json and registered shrink-only in data/waiver_ratchet_registry.json (ADR-0.0.73 BI #8), so debt cannot grow or follow a rule forward silently.
Status change 2026-08-16 — the rules arm REGRESSED from 0 to 8, and that is this box working (GHI #810).
.gzkit/rules/cli.mdwas scored for real, which required dropping its0.3.1grandfather pin. Scoring it honestly produced 8 Promotable rows (scorecard rows 76-82, 85) — the third state this box forbids, returning. Do not read this as new drift. The CLI layer had been invisible to the instrument on both arms:cli.mdsat in the grandfather registry unscored, and the 1,037-line specification elaborating it (docs/design/cli-standards-v3.md, canonical per ADR-0.0.4) was reachable from that ADR and from no rule or governance surface, so nothing carried it into the per-turn contract. Decay under those conditions produces no signal; the 8 rows are that decay becoming measurable for the first time. Re-scoring them to Judgment without amending the rule text is the laundering arm 1 already forbids, so the arm is genuinely open. Measured alongside: every CLI rule with a mechanical arm holds at or near 100%, every prose-only rule at or near 0%. The debt arm moved the right way in the same pass — the grandfather registry shrank 15 → 14 againstbaseline_count23, which is the shrink-ratchet behaving as designed. Restoring arm 1 means building the arms (rows 76-82 and 85 consolidate to one validator,gz validate --cli-shape, plus an output-chokepoint ratchet — see the scorecard's § CLI Contract Doctrine), not re-scoring. Tracked at GHI #810.
- [ ] Name the adoptable mechanisms — the positive half of The Firewall (added 2026-08-16, operator-directed). Item 160 defines what does not ship. Nothing defines what an adopter gets, and four mechanisms that already work have no home describing them as a deliverable surface rather than gzkit's private tooling. Two ship today with no adoption story: the shrink-only waiver ratchet (
data/waiver_ratchet_registry.json, ADR-0.0.73 BI #8 — debt may only decrease; it gated the grandfather removal on 2026-08-16, 15 → 14 against baseline 23) and the verifier-pipe-gate hook (.claude/hooks/verifier-pipe-gate.py, GHI #589 — refuses a verifier in any non-final pipeline stage; it fired against an agent's owngz validate | grepon 2026-08-16, which is the class of false green that then gets relayed as attestation evidence). Two are already homed and named here only so the set is legible: the Mechanical validators are delivered byADR-0.0.31-distribution-invariants(Validated; runuv run gz adr status ADR-0.0.31-distribution-invariantsfor its landed count rather than trusting a figure transcribed here —pip install py-gzkit && gz init, byte-equivalent, fail-closed viagz validate --distribution), and the scorecard method is item 162 above, whose live counts are fenced at the scorecard's own Summary table. Done means: each of the four is classified under item 160's destiny taxonomy (wheel-borne / authored-into-battlefield / lab-only-jig) and, for anything wheel-borne, the adopter-facing contract is stated — what it checks, what it costs per turn, and what a project must do to satisfy it. Explicitly NOT a new pool ADR (Architectural Boundary 2 — do not add more pool ADRs to the runtime track); the pool already holds 190 unscoped items and four hooks-related entries (claude-hooks-absorption,pre-commit-hook-absorption,hooks-meta-layer-contract,prime-context-hooks) that this box does not unfreeze. Sequenced with item 160, not ahead of it — the negative half is the load-bearing one, because until it lands an adopter inherits the lab jigs regardless of how well the positive half is described. Origin: the 2026-08-16 competitive review, which measured the flourishing tools in this category as authoring-side (Spec Kit 93k stars, BMAD 46.7k) with the enforcement side unoccupied as OSS — gzkit's differentiator is real and undescribed.
Movement D — Stop the re-adjudication (ruling lifecycle)
- [x] Handoff-local repair — every authored next step now survives the resume (ResumeResult.next_steps); the continues_from chain link is correct-by-construction. GHI #696, commit 5ec44ad1, receipt arb-step-unittest-430503d2.
- [x] Recover the orphaned 06-10 rulings. Done 2026-07-18, in-session. Counted 17 amendments + 4 scope decisions + a goal-state — not the "77" the 06-30 edition asserted. All dispositioned in § 9a. Highest-value catch: Scope decision #1 ("Full pool build-out … no item left undecided at 1.0") was live and unwithdrawn, in direct contradiction to today's post-1.0 pool ruling — the precise orphan that resurfaces months later as "but we booked that for 1.0."
- [ ] Rulings become first-class —
ruling_issued/ruling_supersededtyped ledger events; agz rulingverb; the handoff Settled section and per-decision operator-ruled/agent-chose attribution as rendered projections; the campaign body as a rendered Layer-3 view; supersession fail-closed on orphaned rulings. Sibling: GHI #611. Diagnosis: nothing in gzkit represents the state "settled" — 60+ typed ledger event kinds, no ruling event — so settled decisions are re-derived, and re-deriving is re-adjudicating. § Rulings Register is the manual stand-in until this lands.
Housekeeping (not a Movement, but tracked so it stops being invisible)
- [x] ADR-0.44.0-vendor-alignment-codex was Pending, partly landed, and tracked by no campaign edition. RETURNED TO POOL 2026-08-08 as ADR-pool.vendor-alignment-codex (GHI #773). Operator ruling, verbatim: "this was originally an agent overeach. this either becomes 0.36.0, revert to pool, or we just ignore/deleted the implemented code - I won't be paralyzed in purgatory." (spelling preserved).
- Pool, not 0.36.0, and not deletion. The overreach was the numbering, not the work: the implemented Codex surface is real, in use, and stays — only the unsanctioned REQ/OBPI structure retires. Renumbering to 0.36.0 would have re-asserted it as a sanctioned in-sequence feature, the opposite of what "overreach" means, and no governed renumber path exists (gz migrate-semver is a bare-id→slugged-id backfill recorder; gz adr promote --semver requires a pool source). Deleting the code would have destroyed working capability. Demoted with --on-collision take-demoted, so the pool file carries the evolved content rather than the 2026-03 intake. The 6 OBPIs are parked and released on re-promotion.
- Three defects blocked this and were fixed first (a98c482f7 and successor). GHI #774 — park is a two-sided protocol with one side never exercised (371 obpi_parked, 0 obpi_unparked), so these OBPIs read parked under a live ADR; parkable_children would have skipped them, emitting zero park events while rmtree deleted every brief, with the orphan census (which excludes parked OBPIs) reporting nothing. GHI #775 — neither collision policy could return an ADR that had been worked, and this one had diverged from its intake by 139 insertions / 140 deletions. Third, found by executing it: 36 @covers decorators named REQs in the briefs being deleted, and @covers validates at import, so the suite stopped loading. gz adr demote now refuses that shape unless --force, and strips promoted_from and retitles the H1 so a demoted file reads as the pool ADR it has become.
- The residual is honest: the Codex tests keep running and keep asserting the behaviour; what was discarded is REQ-to-test traceability for an OBPI whose coverage was already attested at Gate 5. That was the price of retiring an overreached structure, taken deliberately rather than by omission.
7. Post-1.0 — the pool→feature release line¶
Operator ruling 2026-07-18: the pool backlog does NOT gate 1.0. The ~23 unstarted
foundation ADRs that ADR-0.34.0 demotes to pool are feature-shaped and become the
0.35+ release line after 1.0, promoted pool → feature one at a time with executable
proof, each through the airlock.
Rationale, on the record: ~23 pool ADRs × ~5 OBPIs ≈ 115 OBPIs. At the observed feature rate that is quarters, not weeks. Booking them pre-1.0 is what made 1.0 recede.
Known pool set (post-Sunset): pool-management · pool-dag-promotion · pool-triage ·
systematic-debug · validation-pipeline · milestone-maintenance · artifact-staleness ·
validator-remediation · package-import · closeout-defect · prior-art-sensitivity ·
harness-fitness · harness-factoring · afk-diagnosis · deterministic-state · and the
remainder enumerated by the capstone. Plus ADR-pool.rag-anything-governance-retrieval
(RECALL) and ADR-pool.hexagonal-folder-structure-realization.
8. Authority & amendment¶
Living: items check off with command evidence. Amendments are operator-ratified, recorded
with the operator's verbatim words, and appended to § Amendments — never interleaved.
The campaign rules sequencing; handoffs and triage advise. ADR, OBPI, and GHI repair
remain the primary propellants; this plan sequences them, never substitutes for them.
No work stream runs outside it except emergency-labeled interrupts.
New (2026-07-18): a successor edition MUST carry § Rulings Register forward with every ruling explicitly carried or withdrawn. Hand-picking "live threads" is what orphaned ~74 of the 06-10 edition's 77 amendment blocks.
9. Rulings Register (carried forward — the anti-orphaning mechanism)¶
Every ruling from the superseded editions, explicitly dispositioned. CARRIED = binding today. WITHDRAWN = no longer steers, with reason.
| Ruling | Origin | Disposition |
|---|---|---|
| Never-relax floor + enforcement-claim rule | 06-30 §5 | CARRIED → §4 |
| Ledger + fail-closed human attestation is the irreducible moat | 06-20 §2a | CARRIED → §1, §4 |
| Reduction mandate — shed toward superpowers-lightness | 06-20 §2a | CARRIED → Movement C |
| Reductive moves wait for post-1.0 | 06-10 sequencing | WITHDRAWN 2026-07-18 — deadlocked against the line above; accretion was blocking 1.0 |
| "The facade is drained" as an unbounded gate | 06-30 §8 | WITHDRAWN 2026-07-18 — replaced by the dated census bound in §5; had no terminal state |
| Adoption is not a 1.0 gate | 06-30 §1 | CARRIED, amended — still not a gate, but one flight-test sortie is now a §5 gate |
| Four airlocks + MX granularity + intent hierarchy | 06-20 §3 | CARRIED → §3 |
| Versioning: feature=minor, MX=patch, contract-change=patch+AD | 06-20 §4 | CARRIED → §3 |
Severity ladder = Python logging + NOTICE (not kernel 0–7) |
06-21 amendment | CARRIED |
| OKF/CMS documentation-knowledge orientation layer | 06-23 amendment | CARRIED — delivered ADR-0.30.0 |
| Harness loop-engineering + OKF notes are advisory sidecars, not steering surfaces | 06-23 amendment | CARRIED |
| Airlock seated as a distinct Movement | 06-23 amendment | CARRIED — delivered ADR-0.33.0; extended by Movement B |
| Re-sense needs a computed graph; AIRLOCK-IN/OUT realize keel-up together | 06-30 Movement III pivot | CARRIED — delivered ADR-0.31.0/0.32.0/0.33.0 |
HULL substrate = tree-sitter + networkx (GO-attested); graspologic stripped |
07-05 withdrawal-of-departure | CARRIED |
| One unified HULL ADR (not a 3-ADR constellation) | 07-05 operator ruling | CARRIED — delivered ADR-0.32.0 |
Taxonomy = partition, not flatten; foundation frozen-historic and closed |
07-05 amendment | CARRIED → §3, Movement A |
| The taxonomy migration is pre-1.0 | 07-05 amendment | CARRIED → Movement A |
| Hexagonal is the primary code-architecture directive | 07-06 amendment | CARRIED → §3 |
Hexagonal seated in DDD→HA→BDD→TDD; domain = ontology, core/ stays, no folder cosplay |
07-06 amendment | CARRIED → §3 |
Foundation Sunset realized as ADR-0.34.0; three-class partition from L2 ledger truth |
07-12 amendment | CARRIED → Movement A |
ADR-0.0.65 reached Validated (corrects the stale 1/5 reading) |
07-15 amendment | CARRIED — superseded by live state; 0.0.72 is also Validated 3/3, correcting the stale "0.0.72 (1/4)" in the 06-30 edition |
| Movement V seated as TOPMOST | 07-18 amendment (06-30 ed.) | WITHDRAWN same-day — mis-sequenced ahead of a capstone one step from executable; re-seated as Movement D |
| GHIs are authorized for direct repair, always | operator canon | CARRIED — AGENTS.md corpus |
| Never create feature branches; work on main | operator canon | CARRIED — AGENTS.md corpus |
| Human attestation is sacrosanct; no TTY/PTY excuse | operator canon | CARRIED — §4, AGENTS.md corpus |
| Correction vs enhancement — unmet intent is a correction | operator canon | CARRIED — AGENTS.md corpus |
9a. Recovered from the 06-10 edition (dispositioned 2026-07-18)¶
The 06-30 edition claimed 06-10 carried "77 amendment blocks." Counted: 17 (plus 4 scope decisions and a goal-state). The "77" was itself an unverified number this campaign had been repeating. All are dispositioned below — none left undefined.
| Ruling (06-10) | Disposition |
|---|---|
| "we don't direct edit AGENTS.md; the CMS must be near-top priority" (06-10) | CARRIED — AGENTS.md is corpus-rendered; the 2026-07 corpus-derivation work is this |
Buetow practices adopted → ADR-0.0.70 (06-12) |
CARRIED — delivered, Validated |
| Firewall foundation ADR — classify every delivered surface by destiny (wheel-borne / authored-into-battlefield / lab-only-jig); "the rigging and jigs do not remain attached to the fuselage" (06-14) | CARRIED — UNDELIVERED. No Firewall ADR exists. Load-bearing for §1's "public product" trajectory: today an adopter inherits the lab jigs. Booked as a Movement C box. |
Constitution as enduring root; tree ordered by stability gradient — Constitution → PRD → ADR → OBPI; the legacy PRD → Constitution spine is backwards (06-14) |
CARRIED — UNAPPLIED. AGENTS.md § Workflow still reads PRD → Constitution → ADR → OBPI. The ruling was booked and never rendered. Booked as a Movement C box. |
| CMS ↔ hierarchy coupling; disclosure tier ∝ inverse volatility (06-14) | CARRIED — realized as progressive disclosure + the always-injected router |
Dispatch drift-guards #617 (CLI handler resolution) / #618 (validate() scopes) (06-14) |
CARRIED — #618 → Movement C; #617 status unverified, folded into that box |
| Governance-friction drainage empowered to the campaign; file the GHI in the moment of discovery (06-14) | CARRIED — now AGENTS.md § Defect-fix routing |
| Turn-end claim-grounding gate #620 → E.6 (06-14) | CARRIED — delivered, ADR-0.0.70 Stop hook, commit d83db8a2 |
| Pure-A reconciliation of the off-campaign 0.0.65/0.0.72 session (06-14) | SUPERSEDED by live state — both are Validated (5/5 and 3/3) |
| Pydantic schema-enforcement of fillable artifacts; frontmatter is rendered + hands-off (06-15) | CARRIED — the hands-off half is AGENTS.md § Never #8; the enforcement half (GHI #615, 597/600 briefs on LegacyBriefShape) is still OPEN |
| Compliance-strength family; direct-fix moratorium stands as default (06-15) | WITHDRAWN — superseded by operator canon "GHIs are AUTHORIZED for direct repair, always" and the 2026-06-01 anti-reflexive-GHI moratorium |
Airlock North Star; gz-obpi-pipeline is the proven reference implementation → E.7 (06-16) |
CARRIED — delivered ADR-0.33.0; extended by Movement B |
| Work-phase theories are a 1.0 completion gate (06-17) | CARRIED — discharged by OBPI-0.33.0-06 |
| The heap reckoning — "don't forget what a garbage heap gzkit has evolved into" (06-19) | CARRIED → §2, and corroborated again by the 2026-07-18 measurements |
| Sanity Reduction track — completion-before-reduction overridden for named, parity-proven cuts BEFORE 1.0 (06-19) | CARRIED → Movement C. Note: this already overrode the reduction deferral in June; the "reductive moves wait for post-1.0" line that deadlocked 06-30 was therefore contradicting a ruling that predated it |
ADR-0.0.74 MX seated as topmost P0 (06-20) |
CARRIED — delivered, released 0.29.0 |
| Scope decision #1 — "Full pool build-out. All 139 live pool items … to a terminal disposition. No item left undecided at 1.0." | WITHDRAWN 2026-07-18 — directly contradicted by today's ruling that the pool backlog is the post-1.0 release line (§7). This is exactly the orphan that would have resurfaced later as "but we booked full pool build-out for 1.0." |
| Scope decision #2 — Canon Foundation workstream booked into 1.0 | WITHDRAWN — foundation is a closed kind (§3); the workstream's live content routes to pool/feature |
Scope decision #3 — per-ADR done-bar is Validated or operator-parked |
CARRIED |
| Scope decision #4 — in-flight first, then MOTD | WITHDRAWN — MOTD never shipped and is not in §5; superseded by the current Movement order |
| 06-10 goal state (census 100% terminal · MOTD shipped · Canon Foundation Validated · #519 closed) | WITHDRAWN — superseded wholesale by §5. MOTD and the census-terminal bar were unbounded gates of the same class §5 exists to retire |
Archive¶
build-to-1.0-campaign-2026-06-30.md— predecessor (554 lines). Superseded 2026-07-18. All 10 of its amendment blocks are dispositioned in § Rulings Register (verified by count, not asserted).build-to-1.0-campaign-2026-06-20.md·build-to-1.0-campaign-2026-06-10.md— retained for audit.
Orphan recovery: complete, not deferred. The 06-10 edition's rulings — orphaned when 06-20/06-30 superseded it naming only three live threads — were recovered in-session on 2026-07-18 and are dispositioned in § 9a. Counted 17 amendments + 4 scope decisions + a goal-state; the "77 amendment blocks" this campaign had been repeating was an unverified number. No ruling from any edition is now undefined.
Amendments¶
2026-08-16 — Movement C: rules arm regresses 0 → 8; adoptable-mechanisms box added (operator-directed)¶
Operator instruction, verbatim: "ensure that any deficiencies from your four proposals have a home in the campaign work, remedy that now."
No box removed, nothing resequenced. Movement B remains TOPMOST; Movement A remains HELD; the post-1.0 pool ruling is unchanged and the 190 pool items stay frozen. Two changes, both inside Movement C.
1. Item 162's rules arm regressed from 0 to 8, recorded rather than absorbed.
.gzkit/rules/cli.md was scored for real under GHI #810, which dropped its
0.3.1 grandfather pin by construction. The honest score produced 8 Promotable
rows — the third state the box forbids. The box's own criterion is what makes
this reportable rather than hideable: re-scoring to Judgment without amending
the rule text is laundering, so the arm is genuinely open until the arms are
built. Recorded at the box; tracked at GHI #810. The debt arm moved the right
way in the same pass (grandfather registry 15 → 14 against baseline_count 23).
This is the second time in nine days the family-closure box has been reopened by
measuring a surface nobody had measured. That is the box working — but it also
means its completion criterion cannot be treated as converging while unscored
surfaces remain. The scorecard covers CLAUDE.md + .gzkit/rules/**; arm 2
already records that .gzkit/skills/** is unmeasured. docs/design/** standards
cited as canonical by a Validated ADR were likewise unmeasured until this week.
2. New box — name the adoptable mechanisms. Item 160 (The Firewall) defines what does not ship; nothing defined what an adopter gets. Two working mechanisms — the shrink-only waiver ratchet and the verifier-pipe-gate hook — had no home describing them as a deliverable surface. Both fired against this session's own agent work, which is the evidence they are worth naming. Sequenced with item 160, not ahead of it, and explicitly not a new pool ADR (Architectural Boundary 2).
3. Full re-evaluation pass (operator: "update that campaign document with today's date - re-evaluate it thoroughly"). Every live claim in the document was re-measured rather than re-read. The edition is NOT re-dated — re-evaluation is stamped inline, as 2026-08-14 was, preserving ~60 inbound references and the supersession chain; a new dated edition awaits an operator supersession ruling.
What changed:
| Claim | Was | Now | Where |
|---|---|---|---|
| Oversized modules (>600 lines) | 33 | 51 | § Movement C item |
fix commits, 90d |
524 | 528 | § Topmost |
airlock_in / airlock_out |
23 / 5 | 23 / 5 — unchanged | § Topmost |
| Scorecard Promotable rows | 0 | 8 | item 162, above |
| Pool ADRs | — | ~199 .md under docs/design/adr/pool/ |
§ 7 |
What held: ADR-0.35.0 Draft, ADR-0.36.0 Proposed, ADR-0.33.0
Validated, GHI #766 and #611 open, and the surface-mirroring ratio (~49% over a
stated 90-day window vs the 47% recorded).
The sharpest finding is the one that did not move. The airlock counters are
identical two days into Movement B holding TOPMOST — zero transits — while fix
commits rose by four. The ungoverned door widened while the governed one stayed
shut, which is item 150's gap (GHI : MX :: OBPI : Build) reproducing in the
window where the Movement was supposedly being worked. It is also evidence for
item 0's sequencing: calibrating a gate nobody passes through is cheaper than
widening it to three more doors.
Method note. The surface-mirroring figures were NOT overwritten, because the
window they were taken over is unrecorded; substituting a differently-scoped
measurement would manufacture a false comparison. Today's numbers are recorded
alongside with the window stated. This is the same discipline
gz validate --transcribed-adr-counts enforces mechanically — it refused a draft
of this very amendment for transcribing a Layer-2 OBPI count into live prose.
Origin, stated plainly so it is not mistaken for an independent finding. Both changes come from an agent-proposed framing during a 2026-08-16 competitive review, which the operator directed be homed. The review measured the category as flourishing on the authoring side (GitHub Spec Kit 93k stars; BMAD-METHOD 46.7k; OpenCode 160k) with the enforcement side unoccupied in OSS — present only as academic work and enterprise compliance platforms. The proposal was positioning, not wind-down: gzkit's differentiator is the enforcement layer, and it is currently undescribed to anyone outside this repository.
2026-08-14 — Movement B is TOPMOST; Movement A is HELD; calibration precedes widening (operator-ratified)¶
Operator ruling: "the airlock's incompletemess is a problem that needs priority address.", ratified "yes, ratify" (spelling preserved).
What changed. Movement B (put the membrane on the real doors) moves ahead of
Movement A (close the Foundation Sunset). ADR-0.35.0-canon-entry-corpus-landing
is HELD in the in-flight position at 0/10 — not withdrawn, not superseded, and
still the next feature when B releases the queue. One-feature-at-a-time is
unchanged. A new item 0 — calibrate the seam-map is added ahead of Movement
B's five existing checkboxes, and the accounting-gap box's count is corrected.
Why this is new evidence, not a change of mind. The session that produced this
ruling started as a false-refusal complaint against the handoff resume gate and
ended by reading ADR-0.33.0 properly. Three findings, each measured live rather
than transcribed:
- The airlock is BUILT, not unfinished.
ADR-0.33.0isValidated, 6/6attested_completed. "Incomplete" means installed on one door, which is what Movement B has always said: "The doors mostly exist. They do not fire… an opt-in gate is not a gate." Nothing about the mechanism needs re-designing. - It does not bite where it does fire. 20 of 23 transits computed an EMPTY
seam-map and auto-proceeded; 3 bit correctly (3/4/7 unaccounted →
hold). The cause isADR-0.33.0's own calibration-frontier note —reach()returns dependents, a leaf OBPI has none, andparent_invariantsis never passed. This is WWHTBT-(a), the ADR's self-declared load-bearing condition, deferred past the FC-2 tracer and never landed. It is not in Movement B's checklist at all; item 0 adds it. Widening before calibrating installs three more inert gates and is § Negative #1 arriving through the front door. - The accounting gap is worse than recorded — 23 in / 5 out, not 23/10.
What this ruling does NOT do. It does not reopen ADR-0.33.0, whose
attestations stand. It does not make the airlock a gz validate scope (BI #6: the
L3 projection informs the gate, never gates). It does not disturb Movements C or
D, which remain after B and A.
Sequencing within Movement B (agent-proposed under this ratification; operator may reorder). 0 calibrate → accounting gap → the "never entered at all" NC → GHI/MX door (highest volume) → session entry → ad-hoc/permitted. The two NC-first alternatives were considered and rejected: the new NC cannot be written until "should have entered" is defined per door, and it would fail on 524 commits/quarter before any door exists to close.
Collateral — retired ahead of the door by operator ruling (AMENDED 2026-08-15).
The handoff-resume-gate hook's Bash arm was removed on 2026-08-14
(bc9b72f67) as a forked fourth door — an un-extracted variant with its own copy
of the airlock's proceed|pause|hold|revert grammar, triggering on
artifact-presence rather than on entry. This paragraph then said its surviving
Write|Edit|NotebookEdit arm "retires into" Movement B item 3 "rather than
as a loose direct fix, so no gap opens in front of the governed door."
That is not what happened, and the plan is corrected rather than left standing.
The operator retired the whole hook on 2026-08-15 — verbatim: "the handoff should
be an advisor, not a gate-keeping nanny" — with ADR-0.37.0 at Pending 0/6 and
no implementation, so item 3's door did not exist to retire into. A gap IS open in
front of it, deliberately and on the record: the arm's entire measured lifetime was
9 lifts to 1 block across the single day refusal-recording existed, against 13
admission-breadth corrections in 29 days. REQ-0.37.0-05-02 is amended in the same
commit. Movement B item 3 is unchanged in substance — the door is still owed — but
it no longer inherits a retirement, and it must not re-create the forked entry gate
the arm was.
2026-08-11 — the pull-ahead is WITHDRAWN; ADR-0.35.0 returns to the in-flight position (operator-ratified)¶
Operator ruling: "not sure i wan't to author 0.36.0 while we haven't finished 0.35.0", ratified "yes, amend campaign" (spelling preserved).
What changed. The 2026-08-09 amendment pulled
ADR-0.36.0-convergence-moment-cross-family-critic ahead of
ADR-0.35.0-canon-entry-corpus-landing. That pull-ahead is withdrawn.
ADR-0.35.0 is the in-flight feature; ADR-0.36.0 is next-drawn, after it lands.
One-feature-at-a-time is unchanged — this restores which feature is in flight
rather than running two.
Why this is new evidence, not a change of mind. The 2026-08-09 (2) amendment
made the critic's delivery STAGED: OBPI-09's automatic AskUserQuestion door
ships dark, lit only after OBPI-08's pilot measures false blocks, latency,
operator reading time, and decisions changed. The ADR states the cost in its own
words — "Until that door lights, this ADR does not deliver a second opinion at
every structured choice." The pull-ahead's justification was that every session
without the critic is a session unguarded; staging means the guard is still off
when all nine OBPIs land. So the trade being made was: pause the feature with ten
authored briefs, to author nine more for a feature that still would not supply
the always-on critic. The staging ruling and the pull-ahead were ratified in the
same session and their interaction was not adjudicated then; it is adjudicated
here.
Measured at the amendment (Layer-2, not transcribed). Neither feature has
landed an OBPI — ADR-0.35.0 0/10, ADR-0.36.0 0/9. The asymmetry is in
readiness, not progress: ADR-0.35.0 carries ten authored briefs passing
gz obpi validate --authored 10/10, a 299-line DESIGN_FORCING_FUNCTIONS.md,
seven Boundary Invariants, and Fidelity Assertions whose coverage figure is part
of the thesis. ADR-0.36.0 carries three briefs authored 2026-08-11, six
draft (scaffold), empty Forcing Functions, and a Fidelity Assertions table
still holding the scaffold's example row.
What is NOT withdrawn. The promotion (2026-08-09 (3)) stands — ADR-0.36.0
remains a promoted feature ADR with nine briefs, and its pool file remains
Superseded. The staged-delivery ruling (2026-08-09 (2)) stands and is the
reason for this amendment. The three briefs authored 2026-08-11 (1b808b18d)
keep their value and are not reverted; authoring is durable and re-usable
whenever ADR-0.36.0 is drawn.
Re-adjudication check. This edition's own § Amendments names re-adjudication as the disease, so the test is stated rather than assumed: this amendment is admitted because it rests on a fact the 2026-08-09 rulings did not weigh — the interaction between staging and sequencing — and not on re-arguing either ruling on its original terms. A future amendment restoring the pull-ahead needs new evidence in the same way; the pilot lighting the dark door would be it.
Evidence. uv run gz adr status ADR-0.35.0-canon-entry-corpus-landing (0/10,
ten draft); uv run gz adr status ADR-0.36.0-convergence-moment-cross-family-critic
(0/9); uv run gz obpi validate --adr ADR-0.35.0-canon-entry-corpus-landing --authored
(10/10 PASS, exit 0); ADR-0.35.0 body repairs at 584778396.
2026-08-09 (3) — the critic is PROMOTED; the box's promotion debt is discharged (operator-ratified)¶
Operator ruling: "well, clearly the campaign needs updating. do so please."
What changed in the world. ADR-pool.convergence-moment-cross-family-critic
was promoted to ADR-0.36.0-convergence-moment-cross-family-critic
(kind: feature, lane: heavy, status: Proposed) with nine OBPI briefs,
1:1 with the Feature Checklist; the pool file is Superseded. Authored at
8763ec633, promoted at dc5fe4d39. gz register-adrs exit 0 (86 ADRs);
gz validate --sensitivity exit 0 across 24 briefs, up from 15.
Why this amendment is a correction, not a completion. The Movement A item 2
box carried four claims that were true when written and false by the end of
2026-08-09: that the pool ADR "owes four things first", that
uv run gz adr promote "is fail-closed until the pool ADR gains a
## Target Scope… it has neither today", that the design sits at
status: Pool, and the instruction to "promote to a feature ADR". All four
described discharged obligations. The box remains UNCHECKED — the critic is
not installed, 0 of 9 OBPIs are built, and nothing runs at the convergence
moment today. Correcting a stale precondition is not progress on the item, and
this amendment must not be read as such.
How the four owed items were discharged, each traceable in the promoted ADR
§ Target Scope rather than restated here: decomposed against the three doors
with the PreToolUse adapter isolated as OBPI-09 landing dark; Step 4b's
resolution shape generalized as OBPI-07 without editing 4b; A3 and A4
carried forward ADOPT-NARROWED as OBPI-05 and OBPI-06; and the adversary re-run
already discharged by amendment 2026-08-09 (2) above, whose
PERFORATED-BUT-NARROWABLE verdict is what forced the staged shape.
The staging survives promotion intact, including its cost. Until OBPI-08's calibrated pilot measures "false blocks, latency, operator reading time, and decisions changed", OBPI-09 stays dark and this does not deliver a second opinion at every structured choice. That sentence is carried verbatim into the promoted ADR's § Target Scope and § Persona precisely so it cannot be dropped from a status report.
Sequencing is unchanged. ADR-0.35.0-canon-entry-corpus-landing remains next
after, still Draft; one feature at a time still binds, and the pull-ahead
exchanged which feature is in flight rather than starting a second.
2026-08-09 (2) — the pull-ahead is STAGED, on the adversary's re-run verdict (operator-ratified)¶
Operator ruling: "Amend to staged delivery, keep the pull-ahead." Selected from a four-option picker; the alternatives were land as written and stage inside the ADR, revert the pull-ahead, and take the no-build-yet path.
This amendment exists because the obligation in the prior one was actually
discharged. ADR-pool.convergence-moment-cross-family-critic § Promotion plan
demanded a re-run of the adversary against the post-R1–R4 design, on the ground
that "per this ADR's own thesis, that re-test is the point." It was run
2026-08-09 against the current document and returned
PERFORATED-BUT-NARROWABLE — neither the rubber stamp that would have
justified promoting as written, nor a repeat of the two prior PERFORATED
verdicts that would have justified reverting.
What R1–R4 genuinely repaired: Pass 1 axis 2 (the forbidden same-family critic) is dissolved by R4, and Pass 2's missing-policy attack is dissolved at the policy level by R3. The old verdicts cannot transfer wholesale, which is why the pull-ahead survives.
What still perforates, and therefore what the box now requires be staged: the automatic door binds to a UI affordance carrying mandatory clarification as well as recommendations, so it "can prevent the very question those rules require"; prose bypasses it; strong subject binding is explicitly unbuilt; and R1 left the scope-time-vs-conclusion-time question the ADR calls "live" unresolved. Axes 1, 3 and 4 are partially addressed, not dissolved.
The staging, and its stated cost. Skill, three doors, scope-first challenge,
A3 envelope, R3 transition and provenance binding land first; the automatic
AskUserQuestion door ships dark and lights only after a calibrated pilot
measures "false blocks, latency, operator reading time, and decisions changed."
The cost is recorded rather than softened: until that door lights, the operator
does not get the second opinion at every structured choice that prompted the
whole amendment. A3 and A4 are both ruled ADOPT-NARROWED.
A premise correction this session forced. R4 reasoned that the shipped
Anthropic plugin already supplies the transport. Measured 2026-08-09: the
plugin's adversarial-review command reviews branch diffs — invoked against
this repository it returned "No branch diff against main was provided or
present" — and the codex:codex-rescue forwarder is contracted to "return
nothing" when Codex cannot be invoked, which is what two empty returns looked
like. R4's ruling (run the current Codex, keep it simple) stands; its
factual premise about the built-in already covering decision critique does
not. Corrected in the ADR at § R4 transport correction and filed as GHI #786 so
the question survives the ADR's own lifecycle. This also weakens the adversary's own
strongest no-build argument, which rested on that same premise.
2026-08-09 — the cross-family critic is pulled ahead of ADR-0.35.0 (operator-ratified)¶
Operator ruling: "Amend the campaign — pull the critic now." Selected from a three-option picker; the alternatives were scope a minimal always-on hook now, full ADR later and hold sequencing, record today as evidence on the ADR.
What prompted it, operator verbatim, 2026-08-09:
what happened to our 2nd opinion work? it is supposed to kick in anytime you invoke AskUserQuestion.
It has never kicked in, because it was never built. Verified this session:
.claude/hooks/ contains no critic script, and .claude/settings.json
PreToolUse carries matchers for ExitPlanMode, Write|Edit and Bash only —
there is no AskUserQuestion matcher. ADR-pool.convergence-moment-cross-family-critic
is status: Pool, unpromoted, holding the full design recovered verbatim from
the three 2026-08-06/07 design transcripts.
The prior placement, now superseded. The 2026-08-07 session recorded placement as "after 0.35.0 I guess, not ready to decide" — provisional on its face — while the same session's register names the real blocker in the operator's words: "we need to allow the critic to operate, so that needs resolution." Those two have sat in tension since; this amendment resolves it in favour of the second.
The observed instance that forced it. In the session that produced this
amendment the agent presented a four-option AskUserQuestion picker on GHI #782
in which it had invented a fourth option, argued in the issue body that the
option dominated the three the issue's author had listed, and recommended it.
The operator accepted it. No cross-family challenge to that premise existed at
any point, and the only scrutiny the recommendation received was the recommending
agent's own. That is precisely the convergence moment § Intent of the pool ADR
names, and it passed unchallenged — the design's own worked example, produced
while the design sat parked.
Consequence for the one-feature-at-a-time ruling (§ Rulings Register). The
standing ruling is "only one feature at a time, feature, finish, draw from
pool." It is NOT relaxed. ADR-0.35.0-canon-entry-corpus-landing is Draft at
0/10 OBPIs — authored, never started — so pulling the critic ahead exchanges
which feature is in flight rather than running two. ADR-0.35.0 returns to the
queue at the position the critic vacates and is the next feature drawn.
Scope of this amendment. Movement A's remaining items are re-ordered; no box is removed, no Movement B/C/D box is touched, and the post-1.0 pool ruling (§7) is unchanged. The critic is promoted from pool to a feature ADR and worked through the governed path — ADR → OBPI → gates — not hand-wired as a hook, which was the declined second option.
2026-08-08 (2) — the family-closure box is re-scoped, not checked off (operator-ratified)¶
Operator ruling: "Keep open, re-scope to the criterion." Selected from a three-option picker; the alternatives were check it off and split the box. No box removed, nothing resequenced, no change to Movements A, B, or D, and no change to the post-1.0 pool ruling.
What prompted the question. All six issues the box names by number are
CLOSED — validator-side #692, #693, #770; agent-side #459, #574,
#620 (verified via gh issue view, 2026-08-08). The corrected failure-class
index puts live work in three other chains. On the enumerated reading the box
was dischargeable.
Why it is not. The box's own completion criterion is class-level and says so in its last sentence: "it closes the family rather than the instance." The six numbers are exemplars proving the class exists. Checking the box on their strength would be the enumerate-the-exemplars habit the criterion was written to resist — and it is the failure shape §9a records for the 06-14 rulings that were "booked and never rendered": work marked done because its visible instances closed, while the discipline it declared went unwitnessed.
The re-scope, and the instrument that makes it measurable. No new machinery
is proposed. docs/governance/advisory-rules-audit.md already scores every
clause of CLAUDE.md + .gzkit/rules/** on four values and is self-tested by
gz validate --advisory-scorecard. Those four values are this box's criterion,
which nobody had noticed:
| Scorecard score | Criterion state |
|---|---|
| Mechanical | carries a mechanical witness ✓ |
| Judgment | demoted to advisory in its own text ✓ |
| Promotable | the third state — declared, no witness, not marked advisory |
| Ambiguous | the third state — scope unclear enough that nothing can witness it |
The box completes against that criterion and two named arms — the rules arm
(drive the third state to zero, by mechanizing or by amending the rule text;
re-scoring alone is laundering) and the skill arm (.gzkit/skills/**/SKILL.md
mandates have zero scorecard coverage, which is exactly where all three
agent-side exemplars lived). The debt arm is already mechanized and carries no
new work.
Count corrected 2026-08-08 — the ratified criterion above stands unchanged; only the measurement under it was wrong. As first written this paragraph read "Measured 2026-08-08 over the audit: 63 Mechanical, 27 Judgment, 12 Promotable + 2 Ambiguous = 14 rows in the forbidden third state" and the rules arm read "drive 14 → 0." No figure reproduces: the audit had not been touched since 2026-08-06, and the third state is 9
Promotable, 0Ambiguous. The2 Ambiguouswas the legend row plus the Summary row counted as rules — agrep -cover a rendered table, which is the exact failure the same session recorded in its own handoff as "an existence check wearing a truth check's clothes." The live count now lives only in the scorecard's Summary table and is fenced there bygz validate --advisory-scorecard, per the GHI #768 ruling on this class.
One limit recorded, not hidden. The skill arm is not failing today — it is unmeasured. Stating it as an open arm rather than a clean one is deliberate: an uncovered surface reported as green is the same defect this whole family names, and the box would otherwise inherit it.
2026-08-08 — C2 checked off; the "single source" claim made true (operator-ratified)¶
Operator rulings, verbatim, in order: "Determine C2 status first", then "Close the residual now (Recommended)", then "Check C2 + sync".
Why this amendment exists at all. The resumed handoff advised "Land the C2
enrollment fail-close (GHI #744)" as its second next step. That step was
stale on the day it was authored — #744 closed COMPLETED 2026-08-02 at
0f671b31c, six days earlier. The handoff had read the (GHI #744) parenthetical
in this box — a citation for the criterion the 2026-08-07 amendment adopted — as
unlanded scope. The agent's own recommendation was to set that step aside and pull
GHI #770 instead; the operator overrode it to verify this box's criterion against
source first. That verification is what found the residual below. Recorded as an
improvement insight under scope campaign-item-verification.
What the determination found. Two of the three sub-claims already held. The
third did not, and had not since the #618 collapse: VALIDATOR_REGISTRY's header
called itself "Single source of validate dispatch" while --qc-binding,
--fidelity-presence and --waiver-ratchet reached gz check without ever
appearing in it. The roster accommodated them (reached_outside_registry)
rather than closing the gap, and tests/governance/test_check_scope_parity.py
documented the contradiction in its own docstring while asserting only that the
exceptions were classified.
This residual was a member of the family the 2026-08-07 amendment ratified a box to close — a declared discipline with no mechanism behind it, the same shape as
770, #692 and #693. It had already produced one real defect: GHI #630 found every¶
SUPPORT REQ citing one of the three resolving unproven-support regardless of
truth, because _dispatch_validator_scope resolves scopes through the
registry-derived runner maps. That was patched by hand-wiring a third copy of
the scope→audit knowledge (_early_return_scope_audit) — fixing the instance, not
the class.
The fix is reductive, which is the point of Movement C. Registering the three
(tier explicit, in_other_scopes=False, matching the sensitivity /
unscoped_rules / evaluation_justify_binding precedent) retired that map:
+27 source lines, −45, net −18. The fence now asserts reached − registry == ∅
rather than accommodating the exception, and the exclusion-set golden gained a
_POST_SNAPSHOT_OTHER_SCOPES_EXCLUDED hatch mirroring the GHI #741 pattern, so the
pre-collapse snapshot stays measured evidence rather than being edited.
Observed behavior is unchanged in every case — _dispatch_early_return_scopes
still fires first and short-circuits, so each flag keeps its solo 0/2/3 lifecycle
and custom prose: the three solo invocations exit 0, --qc-binding --documents
still exits 1 with the GHI #704 refusal verbatim, and bare gz validate still runs
13 default scopes.
| Verification | Result |
|---|---|
uv run gz arb ruff |
exit 0 · arb-ruff-317c63275e4b4da09715b23f44238a27 |
uv run gz arb typecheck |
exit 0 · arb-step-typecheck-23d951968d684fdeb626cabf3296cb6f |
uv run gz arb step --name unittest -- uv run -m unittest -q |
8089 tests OK, exit 0 · arb-step-unittest-32be07bf2f2545f8b92fc95b674b8ae7 |
uv run gz check |
exit 0 |
One limit recorded, not hidden. The stale "94 scopes" figure this box carried matched no enforced surface, and nothing coupled it to one. That is GHI #768's exact shape (transcribed counts couple to nothing) sitting inside the campaign that governs sequencing — the same class of defect as the stale advised step that opened this session. #768 remains open with no remedy selected.
2026-08-07 (2) — Movement C gains a family-closure box; C2 retargeted off flag count (operator-ratified)¶
Operator ruling, verbatim: "ratify both, write handoff, git-sync".
Two changes to Movement C. No box removed, nothing resequenced, no change to Movements A, B, or D, and no change to the post-1.0 pool ruling.
1. New box — close the doctrine-declared-without-mechanism family. 2. C2 amended — completion criterion is family closure, not flag count. The surface read 81 scopes at GHI #618, 92 when the box was authored, and 94 on 2026-08-07: it grew while its reduction box waited. Collapsing the count without landing the enrollment fail-close (#744) leaves #704, #745, and #748 live.
Why this is a reframing, not an expansion. "Reduce the accretion" invites shrinking 94 scopes, but most are load-bearing one-off checks over a genuinely large surface. The evidence says the target is stopping two families from producing scope #95 — a different verb.
Evidence, and the instrument that produced it. The operator declined to
ratify against throwaway analysis ("Build the class-of-failure index first"),
so the detector was built as a real surface first: chore failure-class-index,
module src/gzkit/insights/failure_classes.py, commit ae4e6dc8c. It reports,
over the 333 GHIs closed since 2026-05-09:
| Measure | Value |
|---|---|
Carrying an authored ## Class of failure section |
288 of 333 (87%) |
| Declaring themselves a recurrence of a named prior class | 71 of 288 (25%) |
| Recurrence chains of depth ≥ 3 | 15 |
| Deepest chain | 12 |
The precedent this box is modeled on. Layer drift — the one family measurably
closing (10 → 7 → 6 → 1 across May–Aug) — closed because it got three things:
a doctrine (state-doctrine.md), a regenerator (gz register-adrs), and a
fail-close (gz validate --adr-status-fresh). The doctrine family has the first
two at best. That triple is the template.
Two limits recorded on the ratification, not hidden. The ~19-member figure spans two chains that no author has linked to each other — treating them as one family is an operator judgment, not a measurement. And the index detects declared recurrence only, so it is a floor: a family nobody names stays invisible to it too.
2026-08-07 — Movement A count correction: ADR-0.35.0 is 0/10, not 0/9 (operator-ratified)¶
Operator ruling, verbatim: "Fix it and file the class-level defect".
uv run gz adr status ADR-0.35.0-canon-entry-corpus-landing reports 0/10 —
ten briefs, 01–10, all pending/draft. The Topmost banner and Movement A
item 2 both read 0/9.
Not an authoring error — coupled-surface drift. 0/9 was accurate until
c5a2614db (2026-08-02) folded the classification reader in as item 10 under
GHI #737. That commit updated no surface that counts OBPIs, so the stale figure
survived and then propagated by transcription into
ADR-pool.primary-source-corroboration (authored 2026-08-07), which quoted the
campaign rather than Layer-2. Both live sites are corrected here; the ADR line
was corrected in the same pass.
The 2026-07-29 record at § Amendments is deliberately NOT changed. Its
"verified Draft 0/9" was true on the date it was written — OBPI-10 did not
exist for another four days. Amendment records are dated history; correcting one
to match today's count would falsify the record rather than repair it.
Class-level defect filed as GHI #768, per the same ruling: nothing couples
adding or removing an OBPI to the surfaces that quote its count. 135 files under
docs/ carry a transcribed count; the remedy family is undecided, including the
option of not writing the number down at all.
Derived-count correction, not a scope change. No checklist item moved, none was added or struck; sequencing is unchanged.
2026-07-31 — Movement A capstone reaches 5/5; remaining work is the ceremony, not OBPIs (operator-ratified)¶
Operator ruling, verbatim: "update handoff and campaign, then git sync".
OBPI-0.34.0-04 (d521ace53) and OBPI-0.34.0-05 both reached attested_completed,
so ADR-0.34.0 is 5/5. Verified against the governed read, not frontmatter:
uv run gz adr status ADR-0.34.0 --json renders lifecycle_status: "Pending",
gates 1–4 pass / 5 pending, Closeout READY, validated: false.
The item does not check off. § 9a scope decision #3 (CARRIED) sets the per-ADR
done-bar at Validated or operator-parked — not at 5/5 OBPIs. What changed is the
shape of the remainder: the line previously read "remaining is OBPI-04 and OBPI-05
alone" and now reads the closeout ceremony alone. Movement A's capstone is one
Gate-5 attestation from done, and the Topmost banner is repointed accordingly.
Fourth occurrence of the identical drift on the identical line (1/5 → 2/5 → 3/5 →
5/5). The 07-29 mitigation — labelling the number a snapshot and shipping
uv run gz adr status beside it — did not stop it, and could not have: the value
is still hand-carried in Layer-1 prose that the SessionStart banner quotes verbatim.
Labelling a transcribed derived value does not stop it going stale; only rendering it
does. This is the standing evidence for the Movement D box "the campaign body as
a rendered Layer-3 view" — that box is the actual fix, and every future recurrence of
this amendment is interest paid on not having built it.
Derived-count correction plus a remainder-shape correction. No checklist item moved, none was added or struck; no ruling is carried or withdrawn.
2026-07-29 — Movement A count correction: ADR-0.34.0 is 3/5, not 2/5 (operator-ratified)¶
Operator ruling, verbatim: "fix discrepancy".
OBPI-0.34.0-03-terminal-partition-gate-and-doctrine-retirement reached
attested_completed on 2026-07-29 (f6088fabc), so the true count is 3/5.
Verified against the governed read, not the frontmatter: uv run gz adr status
ADR-0.34.0 renders OBPI 3/5, with closeout BLOCKED on OBPI-04 and OBPI-05
alone.
This is the second occurrence of the identical drift on the identical line,
four days after the correction below — so the line no longer carries the number
alone. The capstone line hand-copies a value gz adr status computes, and the
session-boot banner quotes that line verbatim; every OBPI that lands therefore
re-stales the top of every session, and clearing it costs an operator ruling each
time. The count now ships with its refresh command beside it, labelled a
snapshot rather than a fact. Per docs/governance/state-doctrine.md, a Layer-1
doc hand-carrying a Layer-3 derived value is Architectural Boundary 6 read from
the other end: the drift is the same whether the derived view is mistaken for
truth or truth is transcribed from the derived view.
Also corrected, same class — this half is agent judgment; reverse it freely.
The Topmost line routed the NEXT item at GHI #623, CLOSED 2026-07-19.
Item 2 of Movement A already states "Do not reopen #623 or #654 to find
this scope; read the ADR" and names ADR-0.35.0-canon-entry-corpus-landing as
the tracker — so the banner contradicted the checklist it summarizes and aimed
scope discovery at a closed issue. Repointed at the ADR (verified Draft 0/9).
The item, its sequence position, and its checkbox are unchanged.
Derived-count correction, not a scope change. No checklist item moved, none was added or struck.
2026-07-25 — Movement A count correction: ADR-0.34.0 is 2/5, not 1/5 (operator-ratified)¶
Operator ruling, verbatim: "#715 + campaign line 131".
The Movement A capstone line recorded ADR-0.34.0 at 1/5. Layer-2 carries a
second attested completion — OBPI-0.34.0-02-authoring-time-kind-rejection,
attested_completed with full receipt evidence — so the true count was 2/5.
Verified against the governed read, not the frontmatter:
uv run gz adr status ADR-0.34.0 renders OBPI 2/5 with OBPI-01 and OBPI-02
both attested_completed.
This is a derived-count correction, not a scope change. No checklist item moved, none was added or struck. It is recorded here because the session-boot orientation banner quotes that line verbatim, so the stale count was re-injected into the top of every session — and it had been carried unedited across six handoffs, because campaign amendments are operator-ratified and no session had held the ruling to make it.
2026-07-18 — Disposition change: TSP routing, not a rush to 1.0 (operator-ratified)¶
Operator, verbatim: "we need to change the disposition of the campaign, it is not 'rush to 1.0 now.' it is, what is the best 'traveling salesman' path through the backlog to 1.0. I think there is a tone and temperament misalignment here."
CARRIED — binding on this and every successor edition. The plan optimizes the route, not the finish date. Consequences:
- The set is taken as given; the win is in the ordering. Set-shrinking moves (bounding gates by dated census, declaring items "explicitly NOT 1.0 gates", deferral rulings) are no longer the instrument of progress. Items are sequenced, not excluded. This is why they kept resurfacing as re-adjudication.
- Re-entry cost is the metric being minimized. Measured this session: ~40 orphaned governance docs, agents re-deriving structure from source each session and getting it wrong. That is a re-entry-cost failure, and it is gzkit's actual disease — not accretion volume.
- Adjacency is the primary object. Items that share setup cost are visited together.
- The pool is visited as we inch forward (operator, 2026-07-18) — not a post-1.0 wall. This AMENDS §7: the pool is a far cluster routed to late, not a category ruled out. Nothing gets orphaned; nothing resurfaces as "but we booked that for 1.0."
- Tone is not cosmetic — it selected the plan. The frustration register of this edition ("the road to 1.0 was dragging", "largest single line item on the board") produced Movement C item 1, which proposed deleting shipped product to reduce a commit count. Temperament defects become correctness defects.
2026-07-18 — The rhythm: four mechanisms, four jobs (operator-ratified)¶
Operator, verbatim: "AGENTS.md -> how we work; magna carta -> what we are working on. handoff -> what we were doing last. airlock -> a sortie into the environment. handoff -> a market [marker] for when we leave the session. That should be our rhythm."
Also: "much of agents is there to remind you how I'd like for our working partnership to exist. the magna carta should help tell the 'story of gzkit' so we stay focused on emerging priorities AND the executive summary of what gzkit is. It is there to help you." And: "the airlock and magna carta gives us a sense of connectedness/cohesion among the items."
| Mechanism | Job |
|---|---|
AGENTS.md |
how we work — the working partnership, behavioral contract |
| Magna Carta | what we are working on — the story of gzkit, the executive summary of what gzkit is, and emerging priorities |
| handoff (entry) | what we were doing last — informs the airlock entry |
| airlock | a sortie into the environment |
| handoff (exit) | a marker for when we leave the session |
Binding consequence: the Magna Carta MUST carry the story and the executive summary. This edition does not — §1 is three lines and the remaining ~24KB is movements, rulings, and census tables. The story half atrophied, which is why each session re-derives what gzkit is from source. Restoring it is not decoration; it is the orientation organ, and it lives here rather than in a hook. Airlock + Magna Carta together supply connectedness/cohesion among the items — the route is not a flat list.
2026-07-18 — Movement C item 1 retires: install-time assembly already ships¶
Evidence, this session: gz init (src/gzkit/commands/init_cmd.py:894) copies only
canonical inputs from the wheel via importlib.resources, then calls sync_all(),
which generates every vendor surface in the adopter tree. No pre-rendered AGENTS.md
or CLAUDE.md ships in the wheel; adopters have never received one. The surviving
file-copy (sync_pkg_surfaces, sync_surfaces.py:701) is wheel-payload staging, hard
no-op'd for adopters by _pkg_surface_exists (:626).
- "Generate at install, not at commit" is already true for the product. Item retires as delivered, not as wrong.
- Operator ruling: gzkit keeps committing its own mirrors while dogfooding — verbatim:
"we are dogfooding, so we have to keep on generating/mirroring until the product settles
a bit more." The 703
gz git-synccommits are the dogfooding artifact, an accepted cost, and not a reduction target. - The control surfaces are integral product (operator, verbatim: "five copies are
wheel-borne. the control surfaces are an integral part of the product"). Already
mechanized at
.gzkit/manifest.json:45-59+gz validate --distribution(ADR-0.0.31); the prose surfaces contradict it by calling them "mirrors / generated / do not edit", which misled an agent twice this session.
2026-07-18 — Findings booked this session (route inputs, not yet sequenced)¶
- ~40 orphaned governance docs (~450KB) under
docs/governance/: 2 DELIVERED, ~24 POINTER-ONLY, ~40 ORPHANED. Includesagent-control-surface-rendering-substrate.md(26KB, foundation-tier) whose own## Agent Orientation Indexopens "Do not re-derive the rendering architecture from source each session" — and which has zero referrers anywhere in the per-turn surface. - The repo diagnosed this on 2026-05-30 (
.gzkit/insights/agent-insights.jsonl:146): "nothing loads relevant prior learning at decision time … Capture without re-injection does not bind." Prescribed fix: a hook. Shipped (OBPI-0.0.37-27, attested 2026-06-15): a markdown section inside the unread document. Correction, not enhancement — routes under ADR-0.0.37. instructions-files-dietchore acceptance criterion #9 treats the existence of a hyperlink as proof pedagogy is reachable (CHORE.md:152); all six evidence commands measure weight reduction, none measures retrieval.- Two CMS facades (§4 class):
validate_renderfires only whenproject_rootis passed, andsync_agents_md(sync_surfaces.py:407) does not pass it — the one render that ships a surface skips fidelity validation. Temperature is inert —pipeline.py:96-101documents output is byte-identical across all valid temperatures. render_content_surface()(sync_surfaces.py:637) — the doctrine-conformant render bridge — has zero production callers; one test keeps it alive.- Still no
Corpus → strmaterializer;compose()validates a hand-authored candidate. Prior session's finding stands unrefuted.
2026-07-18 — Re-adjudication is the named disease, and it fired again¶
Operator, verbatim: "I swear we've covered this before." Movement D already diagnoses exactly this — "nothing in gzkit represents the state 'settled'" — and its fix
(ruling_issued / ruling_superseded typed events, a gz ruling verb) is unbuilt, with
this register as the manual stand-in. The pattern across all three of this session's
findings: the diagnosis was correct, written down, and terminated in prose instead of a
mechanism. Orphaned maps (authored, not retrieved) · orientation index (prescribed as a
hook, shipped as a paragraph) · rulings (diagnosed as needing typed events, shipped as a
table someone must remember to fill).
2026-07-18 (later session) — Movement A item 1 closed; audit route inputs booked¶
Recording under § 8 "living: items check off with command evidence" — not a sequencing amendment. Movement A item 1 is checked off with the evidence inline; the queue order is untouched and no ruling is carried or withdrawn here. Anything below that would change sequencing is marked as needing operator ratification.
ADR-0.0.37 is Validated (b40a8026). The /gz-adr-audit ceremony ran with the
independent persona dispatches the skill mandates, and they disagreed — which is the point:
spec-reviewerPASS — every BEHAVIOR REQ on all 15 linked OBPIs is@covers-covered. The 57-REQ advisory is honest: of the 27 belonging to linked briefs, 26 are[SUPPORT]and 1 is[structural-fence], exempt by proof channel underADR-0.0.59.quality-reviewerCONCERNS — Layer-1 attribution drift, remediated before the receipt was emitted. The driver independently verified each claim and refuted one (F3:tier_policydoes have live consumers atcomposer.py:20,rendition_floor_coherence.py:24).
Route inputs (not yet sequenced):
- GHI #700 — FIXED,
77ad9d70._AC_LINE_PATTERNtolerated markdown emphasis around the REQ id but not around the kind tag, so**[BEHAVIOR]**lines fell to a warn-only skip branch.ADR-0.34.0-foundation-sunset— the Movement A item 3 capstone — was silently losing 6 REQs, 5 of them BEHAVIOR, whileaudit-checkreported exit 0. Repo-wide scan after the fix: 0 remaining unparseable REQ lines. Item 3's coverage arithmetic could not have been trusted before this landed. - GHI #701 — the uncovered-REQ advisory is REQ-kind-agnostic, reporting SUPPORT and
STRUCTURAL-FENCE REQs as owing
@covers. Steers agents directly into the.claude/rules/adr-audit.mdRules (c) anti-pattern. Same limitation already documented for the sibling behave gate atdata/behave_coverage_waivers.json:79,80,82. - GHI #702 — a fidelity assertion row can name the fidelity gate as its own command.
ADR-0.0.37row 4 asserted "the block is parseable by the fidelity gate", verified by running that gate; it cannot fail while being evaluated. This is §4's failure class inside the mechanism ADR-0.0.73 built to enforce §4 — cross-linked to GHI #699 as a sibling cut (#699 audits the 47 enforcement claims; #702 is the same shape on the fidelity-assertion surface, which #699's audit did not cover). A sweep of existing## Fidelity Assertionsblocks for the same row is unscoped. - GHI #703 —
REQ-0.0.37-15-05/-06are[SUPPORT]yet@covers-decorated: the inverted proof channel, inflating apparent coverage. Non-blocking (withdrawn brief).
Observation for Movement A item 2 (GHI #623), needs no ratification but changes what the
successor inherits. The audit's Attribution repair is now the honest inventory: the
composition engine's shipped half — rendition_store.py, rendition_freshness.py,
composer.py, tier_policy.py — originates in the withdrawn briefs 21/22 and is
load-bearing. What is genuinely absent is the attributable corpus→candidate generator and
the rendition ⊆ corpus lineage gate. The feature ADR re-homing this should scope to the
absent half, not re-declare the shipped half as new work.