Repository navigation
modeling-discipline: unified dissolution-disposition vocabulary - #3244
Conversation
Operator directive (briansrls, 2026-05-18): dissolutions are debt; the project inverts its own premise if 🟡 deferrals accrue faster than they resolve. Every non-dissolved item must answer one question — "can this dissolve now? if not, why not?" — and 🟡 was overloaded: a bare 🟡 told a reader only "deferred," not why. Adds a shared **Dissolution dispositions** vocabulary at the head of Practice 4, used by Practices 4 / 8 / 10: - the universal rule "can this dissolve now? if not, why not?"; - 🔴 dissolve-now — must dissolve; jumps the queue ahead of feature work; - 🟢 terminal — nothing to dissolve into; consumer-independent; - 🟡 gated — the only legitimate "why not": a named arrival. Every 🟡 is a merge requirement carrying (1) gate kind feature:/consumer:, (2) a concrete named primitive+task or named consumer, (3) the dissolve-on-arrival obligation. feature- and consumer-gating are one dimension — a consumer is a kind of feature. Practice 4's GREEN/YELLOW/RED, Practice 10's disposition legend, and Practice 8's hollow-vs-deferred discriminator are reconciled onto this single vocabulary; For-Reviewers items 4 and 9 make the concrete-gate a checked merge requirement (vague gate blocks; an already-opened gate is stale → 🔴). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…y.md (scope expansion: existing-tracker triage half) Per still-hawk-102 C1 brief update 2026-05-18: scope expands to both halves of the dissolution-debt directive — new sweep findings PLUS triage of the ~21 SL-3229-* + ~13 in-file 🟡 cite-sites against the PR #3244 unified Dissolution dispositions vocabulary (feature: / consumer: gate kind + concrete named arrival + dissolve-on-arrival obligation). Artifact moved from docs/modeling/per-file-findings-v4-dissolution.md to docs/audit/dissolution-inventory.md per the brief. Part A (sweep): 3 🔴 dissolve-now (collapses to 2 distinct fixes), 12 🟡 gated (each carrying its named feature: arrival), carrier and emit/template 🟢 lane-wide. Part B (existing-tracker triage): 7 VALID DECISIONS.md rows + 1 VALID in-file cite-site; 2 VAGUE DECISIONS.md rows (VERILOG-D3200, FLOAT-NOMINAL); ~16 VAGUE in-file prose blocks (json/yaml/toml pre-#3234 prose form, verilog cite-site inheritance); 4 STALE-SHAPED typescript.dag D2-shaped gates needing re-gate against post-D2-reversal fact-bundle model. **0 outright STALE — no gate has already opened.** Marks tagged DRAFT pending #3244 merge. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…acked Operator directive (briansrls, 2026-05-18, via #3240): "I don't want these comments to start piling up and never get dissolved." #3242 made a 🟡 "blocking unless tracked"; tracked is not enough — a 🟡 must bind a committed surface→dissolve loop. Every 🟡 now binds a dissolution plan: the named missing primitive, the substrate PR/task that lands it, and the dissolution follow-up that converts the 🟡 to 🟢 on landing. A 🟡 with no bound dissolution PR is not a valid 🟡 — that is the comment-graveyard failure mode and blocks merge. A 🟡 is transient, with a committed exit; dissolution debt is burned down, not banked (INVARIANTS P5). For-Reviewers item 4 updated to the same bar. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…to all src/v4/**
Per still-hawk-102 operator changes 2026-05-18 (two messages):
(1) SCOPE WIDENED to every src/v4/**/*.dag (67 files): adds lens/* × 11,
bin/main.dag, test/claim/** × 9 to the prior compiler+std+extdeps+
workflow scope. All 26 added files are 🟢 across the five finding
classes — pure scaffolds (each carries 'Status: scaffold — fill per
TASKS.md T-##') or pure TestClaim data with zero fn bodies. The
new-findings half does not grow.
(2) INVENTORY RESTRUCTURED as a dissolution PLAN, not a catalog, per
operator directive ("I don't want these comments to start piling up
and never get dissolved" — #3244 commit 9b896f3). Section 1 rolls
every 🟡 up by its missing primitive into 10 substrate PRs (P1-P10),
ranked by 🟡-count. P1 (std/cardinality.dag refinement) dominates at
~22 findings — 60% of v4's outstanding 🟡 debt. Plus 🟡→🟢 burn-down
table tracking the paydown trajectory.
The plan also names itself as the requirements inventory for the
rework-tracker #3240 S1 substrate track (loyal-wren), which consumes
directly. Renamed prior Part A → Section 2 (per-file catalog backing
the plan); Part B → Section 3 (existing-tracker triage backing the
plan). Section 1 is now the headline; Sections 2/3 are
audit-traceability.
Updated C1-role clause: marks + flags + plans, does not fix. Substrate
PRs (S1 track) and re-gate/dissolve-now PRs (per-file lanes) are
downstream work consuming this artifact.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ate) std/collection.dag (T-3) declares zero derived List ops -> zero RED (nothing to dissolve into in-PR); every hand-rolled generic List primitive marked YELLOW gated feature: (owner T-3 std/collection.dag, named missing op + dissolve-on-arrival obligation). Kahn composition classified GREEN terminal domain-logic (peer of the well-formed predicates). One terse in-file tag per file (LB-P4-3213 precedent); full LB-P10-3213 ledger in DECISIONS.md Part 7. #3244 disposition vocabulary. Structural v2-compile gate: indexed 67 modules, 0 diagnostics. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…face + P10 ⛔ flag + pre-plan backlog clause) Per still-hawk-102 final-ready checks 2026-05-18: (1) P10 marked ⛔ needs-concretization in § 1.1 — does NOT enter the burn-down DAG as a normal upstream node until an owning T-# is assigned for the constrained-generics syntax (#3244 comment-graveyard case). § 1.2 burn-down notes P10's row is structurally blocked. (2) Section 1 intro now explicitly partitions: § 1.0 (🔴 jumps queue) + § 1.1 (🟡 plan P1-P10) + § 1.2 (burn-down) — and states the ~19 VAGUE + 4 INVALID-GATE in Section 3 are a PRE-PLAN CONCRETIZATION BACKLOG, NOT in P1-P10. They cannot enter the burn-down dependency DAG until concretized; the burn-down lane drives the backlog first (each becomes either a roll-in under a P# or a dissolved/re-dispositioned entry). (3) 🔴 count surfaced explicitly: 3 findings, 2 distinct fixes (R1 is_empty_conj_root duplicate extraction; R2 terminator_is_catchswitch inlining). Both have substrate-already-on-main; both jump the queue ahead of P1. New § 1.0 promotes them from Section 2 into the plan headline. Dispositions box at top now states "Count: 3 findings, 2 distinct fixes — checked, not omitted" so the operator audit sees the check. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…sition vocabulary cursor review (#3244, exploratory): Practice 10's "What to check" sentence still read "🔴 fix-now / 🟡 substrate-sequencing / 🟢 clean" while the disposition legend and For-Reviewers checklist use the unified "dissolve-now / gated / clean" vocabulary. One-line consistency fix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…2-dissolution-vocabulary
…2-dissolution-vocabulary
PR #3244 (unified dissolution-disposition vocabulary + the 🟡-must-bind-a-dissolution-PLAN amendment) squash-merged to main at commit 1619165 (2026-05-18). C1's marking authority is now final on main. Flip both status blocks DRAFT → FINAL. Marks re-confirmed against the merged form: 🔴 dissolve-now (substrate-exists, jumps queue) / 🟢 terminal (nothing to dissolve into) / 🟡 gated (feature: / consumer: gate + concrete named arrival incl. owning task + dissolve-on-arrival obligation, AND rolled under a Section 1 P# whose substrate PR has an owning task per the #3244 amendment). No clause changes from DRAFT required this commit — vocabulary was previewed through still-hawk-102. Inventory final-ready: 8 VALID-🟡 / ~19 VAGUE / 4 INVALID-GATE / 0 STALE→🔴; 3 🔴 findings, 2 distinct fixes (R1 is_empty_conj_root extraction across 3 call-sites; R2 terminator_is_catchswitch inlining); 10 substrate PRs P1-P10 ranked by 🟡-count (P1 cardinality.dag refinement = ~22 findings, 60% of debt; P10 ⛔ needs-concretization). 67 v4 .dag files swept at main HEAD ce02410. Ready for burn-down lane handoff (jolly-ibex-599). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Practice-10 substrate sequencing: record CP-3248-LIST-REV in DECISIONS.md with named primitive target (collection reverse<T>), #3244 + T-3 landing path, dissolve-on-arrival, and v2-bootstrap receipt; cross-ref from std/node.dag. Co-authored-by: Cursor <cursoragent@cursor.com>
* v4 retroactive dissolution audit — Practice 10 symbol-marked inventory (PR #3240 task C1) Per docs/modeling-discipline.md Practice 10, classify findings per-file per-finding across src/v4/compiler, src/v4/std, src/v4/extdeps for the five dissolution-finding classes (walker / traverse / predicate / carrier / emit-template) using 🟢 / 🟡 / 🔴 dispositions. Result: 3 🔴 fix-now (collapses to 2 distinct fixes: shared is_empty_conj_root in std/node.dag; inline terminator_is_catchswitch), 12 🟡 substrate-sequencing (each named with its missing primitive — five named upstream obligations: fold_node, FreeMonoid/Nat cata, all / count_where / unique on FreeMonoid, nat_is_zero, property-projection model facts on Connective / FidelityFeature / LlvmInstruction / Terminator). Carrier and emit/template are 🟢 lane-wide. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: C1 — retroactive v4 dissolution sweep (operator-audit PREREQUISITE, crit * v4 dissolution audit — consolidate to docs/audit/dissolution-inventory.md (scope expansion: existing-tracker triage half) Per still-hawk-102 C1 brief update 2026-05-18: scope expands to both halves of the dissolution-debt directive — new sweep findings PLUS triage of the ~21 SL-3229-* + ~13 in-file 🟡 cite-sites against the PR #3244 unified Dissolution dispositions vocabulary (feature: / consumer: gate kind + concrete named arrival + dissolve-on-arrival obligation). Artifact moved from docs/modeling/per-file-findings-v4-dissolution.md to docs/audit/dissolution-inventory.md per the brief. Part A (sweep): 3 🔴 dissolve-now (collapses to 2 distinct fixes), 12 🟡 gated (each carrying its named feature: arrival), carrier and emit/template 🟢 lane-wide. Part B (existing-tracker triage): 7 VALID DECISIONS.md rows + 1 VALID in-file cite-site; 2 VAGUE DECISIONS.md rows (VERILOG-D3200, FLOAT-NOMINAL); ~16 VAGUE in-file prose blocks (json/yaml/toml pre-#3234 prose form, verilog cite-site inheritance); 4 STALE-SHAPED typescript.dag D2-shaped gates needing re-gate against post-D2-reversal fact-bundle model. **0 outright STALE — no gate has already opened.** Marks tagged DRAFT pending #3244 merge. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 dissolution audit — add workflow/ sub-sweep + INVALID-GATE category + C1-marks-only clarification Per still-hawk-102 brief corrections 2026-05-18: (1) Add src/v4/workflow/*.dag as 5th area sub-sweep. Both workflow/bootstrap.dag and workflow/ci.dag on main are pure scaffolds (zero type/data/fn) — 🟢 across all five finding classes. PR #3213's in-flight content covered by its own dissolution pass; sweep frame is main, no double-counting. (2) Add INVALID-GATE as the 4th Part B disposition (alongside VALID-🟡 / STALE → 🔴 / VAGUE). Distinct from VAGUE (gate too loose) and STALE (gate opened): the gate's named arrival was cancelled or reshaped by a design reversal. Apply to the 4 typescript.dag D2-shaped gates (previously labeled STALE-SHAPED) — the D2 alias-identity model was rejected by the operator's 2026-05-17 directive; the named arrival will not arrive as written. (3) Clarify C1's role: mark + flag, not fix. Re-gating VAGUE / INVALID-GATE entries and landing dissolve-now PRs is downstream lane work owned by the lane that owns the named file, triggered by the operator's audit of this inventory. C1 does NOT edit DECISIONS.md rows, rewrite in-file 🟡 blocks, or land dissolve-now fixes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 dissolution audit — restructure as dissolution PLAN + scope-widen to all src/v4/** Per still-hawk-102 operator changes 2026-05-18 (two messages): (1) SCOPE WIDENED to every src/v4/**/*.dag (67 files): adds lens/* × 11, bin/main.dag, test/claim/** × 9 to the prior compiler+std+extdeps+ workflow scope. All 26 added files are 🟢 across the five finding classes — pure scaffolds (each carries 'Status: scaffold — fill per TASKS.md T-##') or pure TestClaim data with zero fn bodies. The new-findings half does not grow. (2) INVENTORY RESTRUCTURED as a dissolution PLAN, not a catalog, per operator directive ("I don't want these comments to start piling up and never get dissolved" — #3244 commit 9b896f3). Section 1 rolls every 🟡 up by its missing primitive into 10 substrate PRs (P1-P10), ranked by 🟡-count. P1 (std/cardinality.dag refinement) dominates at ~22 findings — 60% of v4's outstanding 🟡 debt. Plus 🟡→🟢 burn-down table tracking the paydown trajectory. The plan also names itself as the requirements inventory for the rework-tracker #3240 S1 substrate track (loyal-wren), which consumes directly. Renamed prior Part A → Section 2 (per-file catalog backing the plan); Part B → Section 3 (existing-tracker triage backing the plan). Section 1 is now the headline; Sections 2/3 are audit-traceability. Updated C1-role clause: marks + flags + plans, does not fix. Substrate PRs (S1 track) and re-gate/dissolve-now PRs (per-file lanes) are downstream work consuming this artifact. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 dissolution audit — apply tightened-bar reclassification (INTEGER-GROUP-COMPLETION → VAGUE) Per still-hawk-102 follow-up 2026-05-18: a final VALID-🟡 requires concrete gate AND binding to a named primitive+owning-task substrate PR in Section 1. SL-3229-INTEGER-GROUP-COMPLETION reclassifies VALID-🟡 → VAGUE because P10 (constrained-generics syntax) has no owning task in the Section 1 plan — the substrate PR is not fully named. Counts under tightened bar: 7 VALID-🟡 / ~19 VAGUE (was ~18) / 4 INVALID-GATE / 0 STALE → 🔴. Section 3.1 entry, summary table, and roll-up text updated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 dissolution audit — three burn-down handoff tightenings (1.0 🔴 surface + P10 ⛔ flag + pre-plan backlog clause) Per still-hawk-102 final-ready checks 2026-05-18: (1) P10 marked ⛔ needs-concretization in § 1.1 — does NOT enter the burn-down DAG as a normal upstream node until an owning T-# is assigned for the constrained-generics syntax (#3244 comment-graveyard case). § 1.2 burn-down notes P10's row is structurally blocked. (2) Section 1 intro now explicitly partitions: § 1.0 (🔴 jumps queue) + § 1.1 (🟡 plan P1-P10) + § 1.2 (burn-down) — and states the ~19 VAGUE + 4 INVALID-GATE in Section 3 are a PRE-PLAN CONCRETIZATION BACKLOG, NOT in P1-P10. They cannot enter the burn-down dependency DAG until concretized; the burn-down lane drives the backlog first (each becomes either a roll-in under a P# or a dissolved/re-dispositioned entry). (3) 🔴 count surfaced explicitly: 3 findings, 2 distinct fixes (R1 is_empty_conj_root duplicate extraction; R2 terminator_is_catchswitch inlining). Both have substrate-already-on-main; both jump the queue ahead of P1. New § 1.0 promotes them from Section 2 into the plan headline. Dispositions box at top now states "Count: 3 findings, 2 distinct fixes — checked, not omitted" so the operator audit sees the check. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 dissolution audit — fix codex VALID-🟡 arithmetic + absorb #3225 (CP-1b) findings (1) Codex APPROVE_WITH_COMMENTS on PR #3243 sha 0cc5d95 2026-05-18 flagged Section 3.3 summary arithmetic: "7 VALID-🟡 (6 DECISIONS.md rows + 1 in-file cite)" but the row enumeration totals 7 DECISIONS rows, not 6 → corrected to 8 VALID-🟡 (7 DECISIONS rows + 1 in-file cite). Cross-references updated (§ 1.2 caveat, dispositions box count, burn-down baseline ~37 → ~38). (2) still-hawk-102 surfaced #3225 (Lane-A CP-1b, merged b83d8ed 2026-05-18) carrying an un-cleared codex REQUEST_CHANGES on two specific findings — added to inventory per the no-silent-debt rule: - extdeps/languages/dag.dag dag_language_model_wave1_void_canonical_symbols (62) — 🟡 predicate (property projection) — the "four C3 Atom identities" finding (thread 3255338394). Set<Symbol> whose member is a 4-way disjunction; canonical_symbols set IS a fact on DagLanguageModel/language-identity. Rolls under P4 (T-4 fact-bundle Phase-3 — same family as feature_disposition on FidelityFeature). - compiler/03_resolve.dag merge_binding_self (94) — 🟡 walker — the "sym↦sym module harvest" finding (thread 3255338395). The leaf is map_insert, but its three named-harvest callers (add_module_named_exports, add_arrow_domain_named_params, add_bind_atom_binder) are folds over Node.children with constructor- discriminated recursion. Rolls under P5 (fold_node). - Also added: dag.dag dag_node_is_empty_conj_root (74) is a third duplicate of the R1 is_empty_conj_root pattern — folds into R1's extraction PR rather than its own fix; R1 grows from 2 to 3 call-site duplicates. (3) Scope hash bumped 88ae56d → ce02410 (current main HEAD, absorbs #3225/#3210/#3232/#3242 merges between initial sweep and final-ready). 03_resolve.dag's other 22 fns (most likely P5 variations) are flagged for a near-future Lane-A re-pass; the two codex-flagged are confirmed inventory entries. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 dissolution audit — re-attribute 03_resolve.dag re-sweep to burn-down lane (not Lane A) Per still-hawk-102 follow-up 2026-05-18: the 21-fn re-sweep of 03_resolve.dag is a NEAR-FUTURE BURN-DOWN-LANE re-pass (jolly-ibex-599), not a Lane-A / fierce-cat-31 obligation. C1 is one-shot and does not expand to chase it; the inventory records it as a named follow-up work-item for the burn-down lane to dispatch alongside the per-primitive DAG. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 dissolution audit — DRAFT → FINAL flip (PR #3244 merged @ 1619165) PR #3244 (unified dissolution-disposition vocabulary + the 🟡-must-bind-a-dissolution-PLAN amendment) squash-merged to main at commit 1619165 (2026-05-18). C1's marking authority is now final on main. Flip both status blocks DRAFT → FINAL. Marks re-confirmed against the merged form: 🔴 dissolve-now (substrate-exists, jumps queue) / 🟢 terminal (nothing to dissolve into) / 🟡 gated (feature: / consumer: gate + concrete named arrival incl. owning task + dissolve-on-arrival obligation, AND rolled under a Section 1 P# whose substrate PR has an owning task per the #3244 amendment). No clause changes from DRAFT required this commit — vocabulary was previewed through still-hawk-102. Inventory final-ready: 8 VALID-🟡 / ~19 VAGUE / 4 INVALID-GATE / 0 STALE→🔴; 3 🔴 findings, 2 distinct fixes (R1 is_empty_conj_root extraction across 3 call-sites; R2 terminator_is_catchswitch inlining); 10 substrate PRs P1-P10 ranked by 🟡-count (P1 cardinality.dag refinement = ~22 findings, 60% of debt; P10 ⛔ needs-concretization). 67 v4 .dag files swept at main HEAD ce02410. Ready for burn-down lane handoff (jolly-ibex-599). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
15242efd· Trigger:schedule - Thinking:
155s wall
BLOCKING (1)
Root Cause
docs/modeling-discipline.mdThe old scaffold ledger-deferral exception was retained while the PR made 🟡 plan-binding universal → reconcile the exception by specifying where the primitive/consumer, owning task/PR, and dissolve-on-arrival follow-up live when the ledger is deferred, or disallow milestone-only gates.
| waived (a scaffold coproduct still carries it, typically `// 🟡 scaffold | ||
| — sunset <milestone>`). Scaffolds must be revisited before sunset. | ||
| waived (a scaffold coproduct still carries it, typically | ||
| `// 🟡 feature:<sunset-milestone> — DECISIONS.md …`, the milestone being |
There was a problem hiding this comment.
BLOCKING: The scaffold example treats feature:<sunset-milestone> itself as the gate, but the new 🟡 rule requires a named missing primitive/consumer plus a bound dissolution plan; milestone-only gates leave the P5 dissolution path non-checkable.
There was a problem hiding this comment.
Finding valid — fixed forward in PR #3260 (#3244 is already merged).
The scaffold exception did treat feature:<sunset-milestone> as the gate, which conflicts with the universal 🟡 rule (#3244): every 🟡 binds a named missing primitive/consumer + owning substrate PR + dissolve-on-arrival follow-up. A milestone-only gate names no concrete primitive — non-checkable, exactly as flagged.
#3260 reconciles it: the scaffold exception now defers only the verbose patterns-tried analysis, NOT the 🟡's bound dissolution plan (which is the minimum that makes a 🟡 valid and is recorded even for a scaffold). The gate names the concrete missing primitive; a bare sunset-milestone is explicitly not a valid gate — the milestone records when the scaffold is revisited, not what it waits on.
— sent from still-hawk-102
|
Re: codex BLOCKING review (sha The review's two remedies — "specify where the primitive/consumer, owning task/PR, and dissolve-on-arrival follow-up live when the ledger is deferred, OR disallow milestone-only gates" — #3260 does both: the scaffold exception now defers only the verbose patterns-tried analysis, not the 🟡's bound dissolution plan (which is recorded in DECISIONS.md even for a scaffold); and a milestone-only gate is explicitly disallowed — the gate names the concrete missing primitive. Per the operator's request, I also audited the keystone end-to-end for other un-reconciled interactions from the recent amendment pile — found only one further (minor) gap (the Calibration NON-BLOCKING tier didn't cross-reference that dissolution findings are always-BLOCKING), also fixed in #3260. No other conflicts; no stale vocabulary. — sent from still-hawk-102 |
…🟡 plan-binding (#3260) BLOCKING codex review (#3244, sha 15242ef + inline :257): #3244 made 🟡 plan-binding universal (every 🟡 binds a named primitive + owning substrate PR + dissolve-on-arrival follow-up), but Practice 4's scaffold exception still let the DECISIONS.md ledger defer wholesale and treated `feature:<sunset-milestone>` itself as the gate. A milestone-only gate leaves the dissolution path non-checkable, and a wholly-deferred ledger has nowhere to record the plan-binding. Fix: the scaffold exception now defers only the verbose patterns-tried analysis — NOT the 🟡's bound dissolution plan, which is the minimum that makes a 🟡 valid and is recorded even for a scaffold. The gate names the concrete missing primitive; a bare sunset-milestone is not a valid gate (the milestone records when revisited, not what is awaited). Audit also surfaced a minor gap: the Calibration section's general NON-BLOCKING tier did not cross-reference that dissolution findings are an always-BLOCKING class — added that line so a dissolution finding cannot be read as a NON-BLOCKING cleanup. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…, landed target) CORE ruling (still-hawk-102, Option-1 + #3244): reframe LB-P4-3213 as a valid plan-bound 🟡 with gate kind = consumer: (first meaning-consumer of typed-command shape, deferred-by-brief, gate CLOSED). process.dag::Command is the LANDED migration target (#3209), not the meaning-consumer — future consumer consumes typed Command directly; #3213 does NO migration / NO local CiCommand parse. Anti-#3250: NOT "no change needed". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Practice-10 substrate sequencing: record CP-3248-LIST-REV in DECISIONS.md with named primitive target (collection reverse<T>), #3244 + T-3 landing path, dissolve-on-arrival, and v2-bootstrap receipt; cross-ref from std/node.dag. Co-authored-by: Cursor <cursoragent@cursor.com>
…apPlan data + CiPipeline C4 seam) (#3213) * v4 T-20+T-24: model workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan data (v2-interp) + CiPipeline C4 ci.yml projection seam T-20 workflow/bootstrap.dag: Stage / BootstrapStep / BootstrapPlan as inert data; canonical seed→self0→self1→fixpt plan. Interpretation (process/fs spawn) + executable BitIdentical TestClaim deferred (TRACKED SCAFFOLD; owners T-22/T-4.5 and T-15). T-24 workflow/ci.dag: CiJob / CiGate / CiPipeline data; Symbol-edge job DAG; canonical structural v2-compile gate instance (the existing day-1 gate). ci.yml C4 projection, affected-set selection (IB-2), and test/eval lane deferred (TRACKED SCAFFOLD; owners T-4.6/T-10, T-21, T-22). Structural v2-compile gate verified: v2-compiler indexes 64 modules, 0 diagnostics. Status-line bump only; Owns/Consumes/Scope/Anchor headers unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20: add Practice-4 🟢/🟡/🔴 + five-pattern ledger to Stage + BootstrapStep coproducts Addresses BLOCKING review (bootstrap.dag:160): every substrate coproduct must carry the full Practice-4 classification + five-pattern dissolution ledger under INVARIANTS P1 / modeling-discipline.md §4. Both Stage and BootstrapStep classified 🟢 GREEN (terminal) with the five patterns (fact-placement / variant-is-data / algebraic / dimensional / parameterized-family) attempted inline, mirroring the witness.dag exemplar. The inadequate one-line note replaced with a forward pointer. Comment-only; structural v2-compile gate re-verified (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20: make the bootstrap chain structural — fixed record replaces List<BootstrapStep> Addresses BLOCKING review (bootstrap.dag:190): steps: List<BootstrapStep> admitted reordered/duplicated/missing/extra chains — the seed-once→stage0→stage1→stage2→fixed-point invariant was prose-only (INVARIANTS P2). The chain is fixed by STRUCTURE.md (zero degrees of freedom), so BootstrapPlan is now a FIXED RECORD with four named positional slots whose distinct slot TYPES (CompileStep / FixedPointStep) pin compile-vs-fixedpoint per position. Dissolves the exact node.dag Diff #3162 list-anti-pattern. BootstrapStep coproduct removed (kind is now the slot type, not a variant); Stage coproduct + its Practice-4 ledger retained unchanged (still consumed by the step records — no finding-#1 churn). Within-step Stage wiring is a documented bounded residual (yaml lexeme class; mis-wire = fail-closed interpret-time Diagnostic, the ratified Diff stance — not a type-level illegal state). Structural v2-compile gate re-verified (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: make the C4 ci.yml claim honest — no fabrication of GHA transport facts Addresses BLOCKING review (ci.dag:146): CiPipeline {jobs,gates} cannot faithfully back a .github/workflows/ci.yml C4 projection — a faithful GHA workflow needs on/runs-on/steps/concurrency/permissions, which the gunbc job/gate DAG deliberately omits, so any CiPipeline->ci.yml emit would fabricate them (INVARIANTS P1/P2). Fix is honesty, not fabrication and not a substrate add: project_ci_yml re-typed to also consume a GHA workflow-schema model (gunbc data fills the schema, never invents it); that schema is named MISSING SUBSTRATE (no v4 counterpart to v3 extdeps/github/actions.dag — a new file = operator-tier, surfaced not added). Committed ci.yml reframed as the explicit interim hand-authored BRIDGE (the affected_set.dag detect-affected-components.sh precedent); C4 checked-projection is an explicit future state gated on the named substrate. The immutable header's Owns/C4-over-CiPipeline over-claim is flagged on the PR for conscious operator confirmation (frozen-header lines NOT worker-edited). Structural v2-compile gate re-verified (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20: comment hygiene — drop stale BootstrapStep refs from current-tense prose Addresses cursor/composer-2 APPROVE_WITH_COMMENTS: two comments still named BootstrapStep in the present tense after it was dissolved into CompileStep/FixedPointStep slots. Fixed the "DATA, not a runner" paragraph (now: fixed BootstrapPlan record of named slots) and the Stage ledger pattern-1 (now: every chain step CompileStep/FixedPointStep). The two remaining BootstrapStep mentions are intentional removal-provenance, kept. Comment-only; structural v2-compile gate re-verified (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: defer C4 seam to the ratified single-authority Workflow path (not a worker-minted shape) Addresses BLOCKING (ci.dag:120): the db725fc C4 fix minted a parallel project_ci_yml(CiPipeline, GhaWorkflowSchema) -> YamlValue seam, diverging from the ratified locked T-Workflow-As-Data path project_github_actions(CIWorkflowDag, WorkflowRuntime) -> Workflow (extdeps.github.actions { Workflow } single authority pinned on gunbc.ci CIWorkflowDag; WorkflowRuntime = YamlStatic | BinaryShim; dsl/gunbc/ci_emission.dag) — parallel authority, INVARIANTS P2 (the SELF_HOSTING authority-audit precedent). Fix: the deferred seam now defers to the ratified single-authority Workflow carrier + project_github_actions/WorkflowRuntime seam; ci.yml is the Workflow carrier serialized under YamlStatic (YAML downstream of Workflow), never a parallel CiPipeline -> YamlValue projection. The invented GhaWorkflowSchema/project_ci_yml shape is retracted (kept as provenance, not silently dropped). Missing substrate re-stated as the v4 counterpart of the ratified extdeps.github.actions Workflow carrier + ci_emission.dag seam (operator-tier new file, surfaced not added, not worker-substituted). No-fabrication / interim-bridge / header-tension- surfaced stance preserved. Structural v2-compile gate re-verified (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * v4 T-20: make bootstrap chain edge identity structural now (singleton steps; zero inhabitants of invalid plans) Addresses openai-pro REQUEST_CHANGES (843a37f, the binding gate) + operator P2 finding: the free-field CompileStep/FixedPointStep records still admitted the exact mis-wiring (seed slot typed-valid with produces:Stage2) the comments claimed eliminated — the source/target edge is the fixed chain's structural identity, not user config, so it must be structural NOW, not an interpret-time check. Each of the four positions is now its own payload-less SINGLETON edge-identity type (SeedToStage0 / Stage0ToStage1 / Stage1ToStage2 / FixptStage1Stage2; verified v2 parses `type X = X`). BootstrapPlan is the fixed record of those slots → exactly ONE inhabitant; reorder / duplicate / missing / extra / mis-wire all unconstructible. The Stage coproduct (+ its five-pattern ledger) and BootstrapStep are both removed (stage/edge identity now in the singleton names); no coproduct remains so no Practice-4 ledger applies — this moots the earlier "Stage/BootstrapStep need ledgers" finding by dissolution. The earlier "bounded residual / future-grammar" deferral is retracted as unnecessary (provenance kept, not silently dropped). Structural v2-compile gate re-verified (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20: fix singleton step types — empty-record form (constructible); restores green gate bfc8886 used `type X = X` which v2 parses as a type but provides NO usable value constructor (`undefined variable` at the data construction) — that commit broke the structural v2-compile gate (4 errors). Root cause: the earlier probe only DECLARED the singleton, never CONSTRUCTED it. Fixed: the four chain-position singletons are empty records `type X {}` constructed as `X {}` (verified: v2 parses AND constructs this form, 0 diagnostics). Design intent unchanged — BootstrapPlan still has exactly one inhabitant; mis-wiring unconstructible (openai-pro REQUEST_CHANGES + operator P2 resolved structurally). Prose updated (empty-record singleton, not `type X = X`). Structural v2-compile gate re-verified GREEN (64 modules, 1 file emitted, 0 diagnostics, no errors). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: D5 in-PR frozen-header reconcile for ci.dag Owns/C4 (cite operator-tier review actions) Per DECISIONS.md D5 / PR #3216 standing rule (merry-ibex-337 -> Lane B, #3190 precedent): operator-tier action moving the body past the frozen header/I/O ⇒ reconcile the header in the SAME PR + HEADER RECONCILE block citing it; verbatim-while-divergent body = forbidden unsanctioned drift. Operator-tier actions = briansrls inline BLOCKING (ci.dag:198 C4-fabrication; ci.dag:120 single-authority-seam) + openai-pro. They moved the body to: ci.yml is the ratified Workflow carrier under WorkflowRuntime=YamlStatic via project_github_actions; C4 gated on the missing v4 Workflow substrate (interim hand-authored bridge until then). Reconciled the frozen Owns "emission target" + C4 lines from emit(CiPipeline)/`.dag walks CiPipeline emits YAML` to the single-authority Workflow-carrier projection; added HEADER RECONCILE block. C4 operator-ratified INTENT preserved; only projection mechanism/source corrected, no scope expansion. bootstrap.dag frozen header preserved verbatim (its "ordered step sequence" I/O contract is unchanged by the singleton redesign — correct D5 application). Structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: update HEADER TENSION para to reflect completed D5 reconcile (codex non-blocking nit) codex (e86a8c4, "no blocking concerns remain") flagged that the HEADER TENSION paragraph still described the frozen header as unedited — stale/contradictory after the D5 in-PR reconcile (5f306e2). Updated the para from "SURFACED, worker does NOT edit frozen lines" to "RECONCILED in-PR (D5)" pointing at the HEADER RECONCILE block. Comment hygiene only; no model change. Structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: make CiJob.command faithful + explicitly non-executable (codex BLOCKING) codex BLOCKING (sha 99753a3): CiJob.command was a lossy paraphrase ("v2-compiler compile --source-root src/v4") while documented as the command line the deferred interpreter executes — fabricating process facts (INVARIANTS P1) and not faithfully reproducing the live v4 CI gate command. Fix (both options the finding allowed): (a) store the EXACT primary gate invocation verbatim from .github/workflows/ci.yml ("target/release/v2-compiler compile --source-root src/v4 --output-dir /tmp/v4-stage1 --target dag"); (b) reframe the field as NON-EXECUTABLE documentation data — there is no interpreter (process carrier extdeps/process.dag is T-4.5 scaffold) and a single String cannot carry a GHA job (the live step is a multi-line shell wrapper + a `cargo build` prerequisite). The full faithful step + process spawn stay deferred to extdeps/process.dag (T-4.5) + T-22 (TRACKED SCAFFOLD (3)), explicitly NOT fabricated into the String. Field doc + CiJob doc + gate-instance comment updated. Structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20: unify fixed-point vocab in body — bit-identical (property) + RoundTrips (AssertKind) cursor APPROVE_WITH_COMMENTS (non-blocking): body prose said "`BitIdentical` TestClaim" (implying a kind) in places while the TRACKED SCAFFOLD correctly ties the deferred check to std/verification.dag `kind: RoundTrips` (no `BitIdentical` AssertKind exists). One editorial pass: all BODY occurrences now use "bit-identical" for the stage1==stage2 PROPERTY and `RoundTrips` for the substrate AssertKind (Status note, WHY-PINNED-HASH note, FixptStage1Stage2 type comment; TRACKED SCAFFOLD (2) was already correct). Frozen Owns/Consumes header lines (22/26/76) preserved VERBATIM — a non-blocking hygiene nit is not the operator-tier D5 sanction required to edit frozen header lines; "BitIdentical" there is the property/anchor name, reconcilable with verification.dag's RoundTrips ("self-host bit-identity") once the body is consistent. Comment-only; structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: name the fail-closed CiPipeline well-formedness boundary (node.dag Diff #3162 stance) Addresses briansrls BLOCKING (ci.dag:275): jobs/gates lists + raw Symbol edges leave missing targets / duplicate ids / needs-cycles constructible; P2/P4 need a structural OR fail-closed boundary before consumers land. Resolved by applying the canonical node.dag Diff #3162 ratification (not a coin-flip — that precedent settles the shape): ANY jobs/gates lists are valid CiPipeline DATA; missing-target/dup-id/cycle are NOT type-level illegal states and there is deliberately NO ci_pipeline_well_formed eager predicate (exactly the #3162 diff_well_formed anti-pattern). The fail-closed WELL-FORMEDNESS boundary is the deferred select_jobs consume fold (apply_diff-analogous all-or-nothing): unresolved/duplicate/cyclic => one fail-closed Diagnostic (Outcome<T>), decidable via visited-set traversal (P4). NAMED + OWNED now (select_jobs / lens/affected_set.dag T-21, TRACKED SCAFFOLD (2)); only its body deferred per scaffold discipline. Doc tightened in CiPipeline + TS(2). Comment-only; structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * v4 T-24: implement eager fail-closed ci_pipeline_well_formed boundary (still-hawk-102 adjudication) still-hawk-102 (relayed via Lane B) rejected reaffirming #3162 for CiPipeline: #3162's precondition (no intrinsic well-formedness) is FALSE here — a job/gate DAG has intrinsic, statically-decidable well-formedness (unique ids / acyclic / resolving refs), malformed independent of any consumer; deferring to select_jobs (a consumer) is ruled out by the operator's "before consumers land". Patterns don't auto-extend without the per-instance precondition. Implemented the eager boundary NOW: ci_pipeline_well_formed : CiPipeline -> Outcome<CiPipeline>, covering (1) unique job ids (node.dag all_names_distinct CHECK-enforced precedent), (2) reference resolution (every needs/gate.job resolves to a declared id), (3) acyclicity via Kahn sink-elimination bounded by count(jobs) passes expressed as a fold over the finite jobs list (A2 IMPLICIT termination, INVARIANTS P4) — never an unbounded walk. Any violation = one fail-closed Diagnostic (AmbiguousIntent, no repair-guess). Structural Map-for-ids was INFEASIBLE: v4 Map<K,V> is lookup-only (no key enumeration) so a Map jobs field can't be traversed for the required acyclicity/ref checks; jobs/gates stay List (fold-traversable) per the adjudication's "pick by feasibility" + ACCEPTABLE eager option. NOT a #3162 exception (#3162 never governed this carrier). WELL-FORMEDNESS header + TRACKED SCAFFOLD (2) rewritten (drop #3162-stance + the deferral). Structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * v4 T-20+T-24: de-prose bootstrap.dag + ci.dag in-PR (operator HOLD/audit directive) Per still-hawk-102 → Lane B directive (HOLD all PRs for operator audit; de-prose in-PR; load-bearing files keep structured header contract). Collapsed the review-cycle-accreted body modeling-notes essays to terse load-bearing comments (CODING.md "default no comments; only non-obvious WHY"): bootstrap.dag 257→173, ci.dag 508→374. Comment-only — code, types, fns, data unchanged; structural v2-compile gate GREEN (64 modules, 0 diagnostics). KEPT (mandated artifacts, not de-prosed): the immutable structured headers (Scope/Anchor/Owns/A3/Discipline/Consumes/Status/Brief); the ci.dag D5 HEADER RECONCILE block (#3216 standing rule); TRACKED SCAFFOLD owner/trigger items; the WELL-FORMEDNESS eager-boundary doc incl. the Map-infeasibility one-liner (Lane-B-mandated visible) + still-hawk-102 adjudication provenance; ledger-provenance + supersession one-liners; no-fabrication/single-authority + command-non-executable facts. REMOVED/COLLAPSED: multi-paragraph restated rationale, defensive review-cycle elaboration. RELOCATE: n/a (no in-scope target; design narrative already captured in PR comments + DECISIONS). No D2-alias prose present (verified — file is not D2-affected, no D2 reconcile). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20+T-24: STRICT de-prose bootstrap.dag + ci.dag (still-hawk-102 directive, interim until #3226) Per still-hawk-102 STRICT DE-PROSE RE-DO (supersedes prior nominal de-prose; prior attestation not accepted). A de-prosed .dag carries ONLY: file-path line; terse Scope/Owns/Consumes/Status header; optional per-carrier Anchor URL; optional one-line per-TYPE concept tag if non-obvious. Everything else removed. Comment-only — all code, types, fns, data verbatim-unchanged; structural v2-compile gate GREEN (64 modules, 0 diagnostics). Comment-% (was → now): bootstrap.dag ~83% → 19.2% (5/26); ci.dag ~58% → 3.2% (5/156). Both < 20% hard target. PROCESS RECEIPT / removed-narrative provenance (kept here in the commit message per directive, NOT in the file): - ci.dag D5 HEADER RECONCILE (2026-05-17, #3213, D5/#3216, #3190 precedent): operator-tier BLOCKING review actions (briansrls inline C4-fabrication + single-authority-seam; openai-pro confirming) moved the body past the frozen Owns/C4 header; it was reconciled IN-PR to the single-authority project_github_actions->Workflow seam with C4 gated on the missing v4 Workflow substrate (interim hand-authored ci.yml bridge). C4 operator-ratified intent preserved; only mechanism corrected. This narrative now lives only in git history + prior PR comments, not the file. - ci_pipeline_well_formed is the eager fail-closed well-formedness boundary (still-hawk-102 adjudication 2026-05-17): #3162 does not govern CiPipeline (intrinsic statically-decidable well-formedness); structural Map-for-ids INFEASIBLE (v4 Map<K,V> is lookup-only, no key enumeration) so jobs/gates stay List + eager predicate checks unique ids (node.dag all_names_distinct precedent) + ref-resolution + acyclicity (Kahn elimination bounded by count(jobs), A2-IMPLICIT, P4-decidable). Architectural rationale belongs in DECISIONS.md (owned by operator/#3226), not this file. - No D2-alias prose present (not D2-affected, not pipeline-stage); no gated reconciliations. Branch 0 commits behind origin/main. HELD for operator audit; not merging (operator squash-merge only). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: ci_pipeline_well_formed also proves gate-id uniqueness (briansrls BLOCKING) Valid finding (ci.dag:27): CiGate.id is an addressable identity but the eager well-formedness predicate checked job-id uniqueness only, so duplicate gate ids were accepted → ambiguous downstream selection authority (INVARIANTS P2). Same intrinsic, statically-decidable, consumer-independent well-formedness class the still-hawk-102 adjudication required for jobs. Fix (code-only; strict-de-prose preserved, ci.dag 2.9% comment): added ci_gate_id_occurrences + ci_all_gate_ids_unique (mirroring the job-id check / node.dag all_names_distinct CHECK-enforced precedent) + a ci_duplicate_gate_id reason symbol, and a gate-id-uniqueness branch in ci_pipeline_well_formed (duplicate gate id ⇒ fail-closed Rejected). Structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: fix ci.dag Consumes header drift (std/* → v4.std.*) cursor APPROVE exploratory nit: terse Consumes header said `std/node, std/diagnostic` but the actual imports are `v4.std.node` / `v4.std.diagnostic`. The terse header is now the sole in-file contract under operator audit, so header precision matters. One-line accuracy fix; strict de-prose preserved; structural v2-compile gate GREEN (64 modules, 0 diagnostics). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20: expand bootstrap.dag four stages as v4 orchestration DATA (operator directive; resolves codex finding-1) Operator (still-hawk-102 via loyal-wren-802) adjudicated codex #3213 finding-1: bootstrap.dag DOES own/define/source/orchestrate the four stages now (supersedes the prior minimal-singleton/deferred-interpret framing). Expanded per directive: - DEFINE: each stage is a distinct record with real fields (no more empty `{}` markers). SeedToStage0/Stage0ToStage1/Stage1ToStage2 carry consumes/produces/via; FixptStage1Stage2 carries left/right/via. - SOURCE: inputs are real Symbol identities — v4_dag_source (the src/v4 .dag compiler corpus), v4_stage0/1/2_binary, v2_pipeline (the frozen seed executor), bit_identical_check. `Consumes: none` → v4.std.node. - ORCHESTRATE: BootstrapPlan record + canonical bootstrap_plan wiring the four stages with concrete consumes/produces in order, as v4 DATA. - TRIVIAL v2-DELEGATING BODIES (sanctioned): all compile stages' executor `via = v2_pipeline` initially; per-stage shift delegate-to-v2 → use-v4's-own as v4's pipeline is built (file FILLED IN, never replaced). Orchestration is v4 data from day one. Per-position type distinctness retained (seed slot must be SeedToStage0, etc.) so cross-position mis-wiring stays type-prevented. No coproducts introduced (all records) — emoji-tag directive N/A. Strict de-prose preserved: bootstrap.dag 7.1% comment (5/70), terse 4-line header only. Structural v2-compile gate GREEN (64 modules, 0 diagnostics). HELD for operator audit; in-PR expansion. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * v4 T-24: port v3 CICommand → typed v4 CiCommand carrier (still-hawk-102 fork-2; Option-1 DECISIONS row) still-hawk-102 fork-2 directive: replace ci.dag CiJob.command:String with a proper v4 typed command carrier, PORT (not import) of v3 dsl/gunbc/ci.dag CICommand. Faithful re-express (no shape fork): type CiCommand = LintCommand | TestCommand | IgnoredTestCommand { test_name: String } | ShellCommand { command: String } CiJob.command: CiCommand (was String); v2_compile_gate_job → ShellCommand { command: "<verbatim v2-compile invocation>" }. Coproduct ⇒ per modeling-discipline.md Practice 4/9 + the coproduct-emoji directive: in-file one-line tag `// 🟡 coproduct dissolution — DECISIONS.md LB-P4-3213` on `type CiCommand`; full classification ledger authored as DECISIONS.md Part-6 row LB-P4-3213 (id assigned by still-hawk-102 Option-1: worker authors provisional, operator ratifies on audit). Classification 🟡 YELLOW (scaffold): richer source nameable (the T-4.5 extdeps/process.dag typed Command{program,args,env} carrier + v3 ROADMAP-F12); ShellCommand{command:String} is the bounded interim; named trigger = T-4.5 typed Command carrier lands. 5 dissolution patterns tried, recorded in the ledger row. ci.dag strict de-prose preserved (3.3% comment, <20%). Structural v2-compile gate GREEN (64 modules, 0 diagnostics). bootstrap.dag NOT touched — codex F1/F2 reconciliation pending still-hawk-102 (orthogonal). #3213 HELD for operator audit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-20: bootstrap.dag F1/F2 fixes (still-hawk-102 reconciliation; implement, not rebut) still-hawk-102 reconciled the codex CR — implement (not rebut): F1 (Practice-3 forward chain): `via: v2_pipeline` kept (sanctioned executor-is-v2-initially). `consumes` is now List<Symbol> carrying the prior stage's produced artifact so the orchestration DATA is a chain, not three independent compiles: seed consumes [v4_dag_source] produces stage0 self0 consumes [v4_dag_source, v4_stage0_binary] produces stage1 self1 consumes [v4_dag_source, v4_stage1_binary] produces stage2 fixpt left=stage1 right=stage2 via=bit_identical_check F2 (Practice-7 enumerated-copy): the three identical {consumes,produces,via} stage types (SeedToStage0/Stage0ToStage1/ Stage1ToStage2) collapsed into ONE `CompileStage { consumes, produces, via }`. FixptStage1Stage2 { left, right, via } stays its own type (not collapsed, per directive). Order/multiplicity expressed as fixed named BootstrapPlan slots (seed/self0/self1: CompileStage; fixpt: FixptStage1Stage2) — keeps the exactly-3-compiles+1-fixpt fixed shape (no over-general List reintroduced) while removing the enumerated copy. No coproducts (records only) — emoji directive vacuous. Strict de-prose preserved: bootstrap.dag 8.6% (5/58), <20%. Structural v2-compile gate GREEN (64 modules, 0 diagnostics). #3213 HELD for operator audit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 T-24: export ci_pipeline as fail-closed Outcome (briansrls BLOCKING — non-bypassable boundary) Valid finding (ci.dag:54): canonical `ci_pipeline` was exported as raw CiPipeline, so consumers could read it without passing through the operator-adjudicated eager `ci_pipeline_well_formed` boundary — bypassing the P2/P3 fail-closed check. Faithful completion of the still-hawk-102-directed eager-well-formedness boundary (no shape fork, no directive conflict): the boundary now cannot be bypassed. Fix: raw construction is internal `ci_pipeline_unchecked: CiPipeline`; the exported canonical `ci_pipeline: Outcome<CiPipeline> = ci_pipeline_well_formed(p: ci_pipeline_unchecked)`. Downstream consumers must handle Produced/Rejected — the eager fail-closed boundary is now the only way to obtain the pipeline. v2 supports the fn-application data initializer (verified). Strict de-prose preserved (ci.dag still <20%); structural v2-compile gate GREEN (64 modules, 0 diagnostics). Orthogonal to the bootstrap P2/F1/F2 trilemma (routed, pending still-hawk-102; bootstrap.dag NOT touched). #3213 HELD for audit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * v4 T-20: bootstrap (b) expose-only-checked — drop consumable bootstrap_plan_unchecked (still-hawk-102 GO) still-hawk-102 RULING on the openai-pro (heaviest-weight) REQUEST_CHANGES re-litigating the adjudicated bootstrap-P2: implement (b). (a) structural per-stage nominal identities FORBIDDEN — do not revert F2 (codex-F2 / Practice-7 stays closed). (b): removed the named consumable `data bootstrap_plan_unchecked: BootstrapPlan`; the BootstrapPlan{...} literal is now inlined as the sole argument to bootstrap_plan_well_formed(p: BootstrapPlan {...}). The ONLY named export consumers can bind is now `bootstrap_plan: Outcome<BootstrapPlan>` (the checked carrier) — the consumable-boundary leak (unchecked raw record had a name to grab) is closed. Mirrors the ci_pipeline expose-only-checked precedent (Lane-B-PASSED). F1 (forward consumes chain) + F2 (single CompileStage) intact; no codex-F2 re-trigger; no shape fork. v2-compiler parses the inlined nested record literal (verified, not shipped blind); structural v2-compile gate GREEN (64 modules, 0 diagnostics). Strict de-prose intact (bootstrap.dag 4.5%, <20%). #3213 HELD for operator re-audit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * v4 #3213 IB-3: Practice-10 List-op dissolution pass (operator merge gate) std/collection.dag (T-3) declares zero derived List ops -> zero RED (nothing to dissolve into in-PR); every hand-rolled generic List primitive marked YELLOW gated feature: (owner T-3 std/collection.dag, named missing op + dissolve-on-arrival obligation). Kahn composition classified GREEN terminal domain-logic (peer of the well-formed predicates). One terse in-file tag per file (LB-P4-3213 precedent); full LB-P10-3213 ledger in DECISIONS.md Part 7. #3244 disposition vocabulary. Structural v2-compile gate: indexed 67 modules, 0 diagnostics. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: ci.dag expose-only-checked — drop consumable ci_pipeline_unchecked/v2_compile_gate_job (operator REQUEST_CHANGES) Operator (briansrls) BLOCKING: top-level raw ci_pipeline_unchecked: CiPipeline was a second authority beside checked ci_pipeline, bypassable by downstream consumers (P2 single-authority / P3 fail-closed). Fix mirrors the operator-accepted bootstrap (b) expose-only-checked shape: inline the CiPipeline literal (CiJob/CiGate inlined) as the sole arg to ci_pipeline_well_formed; remove the named ci_pipeline_unchecked and v2_compile_gate_job composites so the only consumable pipeline authority is data ci_pipeline: Outcome<CiPipeline>. Header Owns updated. Structural v2-compile gate: indexed 68 modules, 0 diagnostics. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: ci.dag rename ci_kahn_fixpoint fold param counter->job (CODING.md names-describe-the-mapping) Recurring multi-reviewer readability observation (cursor 13938 exploratory): the fold's 2nd callback parameter is the folded `jobs` element, not a counter; `counter` misdescribed the mapping. Renamed to `job` per CODING.md "names describe the mapping". Semantically inert (param remains deliberately unused — the fold is the bounded-iteration driver per LB-P10-3213-KAHN); structural v2-compile gate: indexed 68 modules, 0 diagnostics. Resolves the observation permanently rather than restating "intentional". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: rewrite LB-P4-3213 ledger to #3244 precision (consumer-gate, landed target) CORE ruling (still-hawk-102, Option-1 + #3244): reframe LB-P4-3213 as a valid plan-bound 🟡 with gate kind = consumer: (first meaning-consumer of typed-command shape, deferred-by-brief, gate CLOSED). process.dag::Command is the LANDED migration target (#3209), not the meaning-consumer — future consumer consumes typed Command directly; #3213 does NO migration / NO local CiCommand parse. Anti-#3250: NOT "no change needed". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: bootstrap.dag — split stage compiler-of-record from executor (self-hosting identity) codex BLOCKING + 2 BLOCKING-inline (P1/P2): every CompileStage.via was v2_pipeline, conflating the orchestration executor with the stage compiler-of-record and making the fixpt (stage1==stage2) check vacuous. Fix grounded in load-bearing docs: - STRUCTURE.md:404-405 "Seed used once": v2 produces v4-stage0, then v4 compiles itself; v2 is never in the loop again. - SELF_HOSTING.md §meta-circular: stage0 compiles source->stage1, stage1 compiles source->stage2, assert byte-identical. via -> compiled_by (CODING.md names-describe-the-mapping): seed compiled_by v2_pipeline, self0 by v4_stage0_binary, self1 by v4_stage1_binary. No executor bridge field — STRUCTURE.md is explicit that v2 is seed-once, so no "v2 executes every stage" fact exists; the brief's "v2 is the initial executor" framing contradicted the doc and the doc wins. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: ci.dag consumes bootstrap seed authority — single-authority fix (P2/Practice 5) openai-pro 13971 (BLOCKING, at HEAD 52c207b): ci.dag:52 restated the bootstrap seed action as a raw ShellCommand argv string, a parallel authority for the seed→stage chain that bootstrap.dag BootstrapPlan.seed now canonically owns — drift-prone, violates INVARIANTS P2 single- authority / modeling-discipline Practice 5; the duplication was also untracked debt (review §6). Fix (in-PR, structural model only — not the brief-deferred ci.yml projection / T-22 lane): add typed CiCommand variant BootstrapStageCompile{produces: Symbol}; the v2_compile_src_v4 job now references v4_stage0_binary imported from v4.workflow.bootstrap. A real machine-readable cross-module edge to the bootstrap authority — the raw argv is removed entirely; BootstrapPlan.seed is the sole source of truth. No import cycle (bootstrap does not import ci). Distinct from / orthogonal to CORE-adjudicated LB-P4-3213: that 🟡 is the ShellCommand{String} raw-argv command-SHAPE decomposition, deferred to the consumer lane. This is single-AUTHORITY wiring (an invariant), resolved now. LB-P4-3213 ledger updated to record the resolution. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: IB-3 T-20+T-24 workflow/bootstrap.dag + workflow/ci.dag — BootstrapPlan * v4 #3213: Practice-9 de-prose — in-file rationale → ≤1-line ledger pointers cursor 13986 (NON-BLOCKING, APPROVE_WITH_COMMENTS): ci.dag mid-carrier comment recorded single-authority/P2 rationale as in-file prose (Practice 9 — rationale belongs in DECISIONS.md, already covered by LB-P4-3213). Replace with a one-line `// 🟢 single-authority — DECISIONS.md LB-P4-3213` pointer; strip the same-shape parenthetical from ci.dag Consumes line and tighten bootstrap.dag compiled_by tag for consistency. No semantic change. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: Practice-9 — drop bootstrap.dag compiled_by field-prose cursor 13998 (APPROVE_WITH_COMMENTS): the `// stage compiler-of-record` field comment is rationale-on-carrier, not an allowed comment class. The field name + header Scope line already convey the self-hosting identity; structure speaks for itself. No DECISIONS pointer needed (no dedicated ledger entry; header already documents seed-once semantics). No semantic change. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: structurally enforce BootstrapStageCompile single-authority at the CI boundary openai-pro 14006 (BLOCKING, manual re-review @ 5d4468d): BootstrapStageCompile{produces:Symbol} took an unconstrained Symbol and ci_pipeline_well_formed never validated it against the canonical BootstrapPlan outputs — the single-authority seam the ledger claims as resolved was prose/convention, not structural enforcement (INVARIANTS P2 / modeling-discipline Practice 5/6). Fix (structural model, in-scope — not the brief-deferred T-22 executable lane): - bootstrap.dag owns bootstrap_stage_output(s: Symbol) -> Bool — the single authority on the canonical stage-output set {v4_stage0_binary, v4_stage1_binary, v4_stage2_binary}. - ci.dag imports it; ci_pipeline_well_formed now consumes the bootstrap authority via ci_all_commands_authority_ok and fail-closed rejects any BootstrapStageCompile.produces outside that set (ci_bootstrap_authority_violation). A dangling payload cannot reach Produced — the invariant is enforced at the substrate boundary, not asserted in prose. - LB-P4-3213 ledger updated: single-authority is now boundary-ENFORCED, not prose. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: ADDRESSED-BY-CONSTRUCTION + plan-bound 🟡 to T-22 (CORE horn (i)) still-hawk-102 ruling (2026-05-18): the BootstrapStageCompile single- authority seam is addressed-by-construction (pure structural predicate; out-of-set produces cannot satisfy the gate — modeled Rejected Outcome, no imperative side-channel; verified in code @6353d695e). Horn (ii) in-PR executable harness REJECTED (T-22-in-#3213 = brief violation). Records the deferred executable demonstration as an explicit plan-bound 🟡 with bilateral binding: - DECISIONS.md LB-T22-3213: arrival (T-22 TestClaim runner) + follow-up (negative TestClaims for the bootstrap-stage rejection family) that dissolves the 🟡. - TASKS.md T-22 scope: same obligation, cross-referencing LB-T22-3213 (neither side vague). - ci.dag in-file one-line tag → LB-T22-3213. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: Practice-9 — single coproduct tag on CiCommand (drop variant-level 🟢) cursor 14020 (APPROVE_WITH_COMMENTS): CiCommand carried two emoji dissolution lines (coproduct-level 🟡 + variant-level 🟢), reading as conflicting dispositions on one type. Rubric wants one required 🟢/🟡/🔴 tag per coproduct; the LB-P4-3213 ledger already carries the single-authority/command-shape nuance. Drop the redundant variant-level 🟢 line; the coproduct-level 🟡 tag + DECISIONS.md ledger stand. No semantic change. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: CI bootstrap-authority consumes bootstrap_plan Outcome, fail-closed (P2/P3) Operator BLOCKING inline (#3213 ci.dag:168): bootstrap_stage_output checked static stage-symbol membership {v4_stage0_binary,1,2} instead of consuming bootstrap_plan: Outcome<BootstrapPlan> — so CiPipeline could be Produced even when the canonical bootstrap plan is Rejected, bypassing the fail-closed bootstrap authority (INVARIANTS P2 single-authority / P3 fail-closed). Fix: bootstrap_stage_output now takes Outcome<BootstrapPlan>, matches it — Rejected ⇒ false (fail-closed: CI cannot pass while bootstrap is Rejected), Produced{value: bp} ⇒ produces ∈ {bp.seed/self0/self1 .produces} (validated-plan actual outputs, not a static set). ci.dag imports bootstrap_plan and threads it through ci_command_authority_ok → ci_pipeline_well_formed. The validated bootstrap_plan is now the sole authority. LB-P4-3213 ledger updated (P2/P3, plan-Outcome consumed). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: add mandatory // Ledger: pointer line to load-bearing workflow headers CORE ruling (still-hawk-102 via Lane B): the de-prose-vs-rail fork was FALSE — strict de-prose stands AND one mandatory `// Ledger:` pointer line per load-bearing file (pointer class, not prose). Adds the CORE-specified line after Status: in bootstrap.dag + ci.dag. No body churn; consistent with strict-de-prose (concrete ref pointer, ≤1 line). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: CORE Option B — rescind // Ledger: line, keystone wins (registry doc→files) CORE ruling (still-hawk-102) on the openai-pro 14070 RC vs the modeling-discipline.md:503-531 keystone contradiction: the // Ledger: mandate is RESCINDED — strict de-prose keystone wins (header stays exactly four lines; no see-docs/X pointer in .dag). - bootstrap.dag / ci.dag: remove the // Ledger: line (-1 each). - Registry moves doc→files (Practice 5, top-down): design-pure-bootstrap-zero.md names the two load-bearing workflow files + A3/PROOF-1/STOP-rail + C4; INVARIANTS.md + src/v3/SELF_HOSTING.md add short Practice-5 registry cross-refs. Authority flows doc→files, not per-file upward pointers. Replays swift-ram-178 a94a312 verbatim onto the #3213 branch. Clears openai-pro 14070; consistent with the keystone. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * v4 #3213: reconcile to authoritative trimmed spec — drop INVARIANTS.md registry para still-hawk TRIM relay (post-a94a3123f) set the authoritative one-commit spec = NO INVARIANTS.md edit: registry lives only in docs/design-pure-bootstrap-zero.md + src/v3/SELF_HOSTING.md + the .dag // Ledger: strips. 9fda2f0 over-included the INVARIANTS.md para (replayed from the pre-trim a94a312). Drop it to conform; the two authoritative registry homes + .dag strips stand unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Practice-10 substrate sequencing: record CP-3248-LIST-REV in DECISIONS.md with named primitive target (collection reverse<T>), #3244 + T-3 landing path, dissolve-on-arrival, and v2-bootstrap receipt; cross-ref from std/node.dag. Co-authored-by: Cursor <cursoragent@cursor.com>
std/cardinality.dag bounded-natural refinement landed (#3259), so the P1-gated 🟡 sites dissolve / re-gate per their merge-base bridge notes: 🟢 RESOLVED in-PR (raw-Int illegal state now structurally unrepresentable): - llvm_ir.dag LlvmType widths → NonZeroNat/Nat (prior WIP d05554a) - ptx.dag PtxCost → Nat; verilog.dag VerilogCost → Nat 🟡 PARTIAL + re-gated: - ptx.dag Dim3 → NonZeroNat (negative/zero-dim dissolved); residual = type-level per-axis-max bound (substrate not landed) — SL-3229-PTX-DIM3 - SL-3229-LLVM-OPS: gate-attribution correction — operand-RELATION refinement needs a dependent/relational carrier, not bounded-natural; cardinality is necessary-but-insufficient Re-gated cite-sites off the now-resolved SL-3229-LLVM-WIDTH anchor: - json/yaml/toml numeric cites → new row SL-3229-FORMAT-NUMERIC (residual = std/float.dag / std/integer.dag typed numeric carriers; the numeric VALUE never dissolved with cardinality) DECISIONS.md dispositions added per #3244 vocab; inventory P1 row marked closed-out. v4 smoke tests + dissolution-discipline scripts pass. Closes #3306 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Operator-directed (briansrls, 2026-05-18). Dissolutions are debt — if 🟡 deferrals accrue faster than they resolve, the modeling project inverts its own premise ("the seed shrinks toward zero" only holds if debt is paid down). This edit makes the deferral discipline uniform, concrete, and a hard merge requirement.
What changes
A shared Dissolution dispositions vocabulary at the head of Practice 4, used by Practices 4 / 8 / 10 — single-authority, no parallel copies:
feature:/consumer:, (2) the concrete named primitive+owning-task or named consumer, (3) the dissolve-on-arrival obligation.feature- andconsumer-gating are one dimension — a consumer is a kind of feature; the awaited thing is its existence.Reconciliations:
GREEN/YELLOW/REDbullets, the "What to check", the scaffold exception, and the lookup-smell paragraph fold onto the shared vocabulary.feature:gate.Scope / boundaries
DECISIONS.mdYELLOW entries + 12 in-file 🟡 tags against this vocabulary — folds into the C1 sweep.Test plan
🤖 Generated with Claude Code