Skip to content

v4 T-3: model std/integer.dag — Int + OrderedRing/AbelianGroup, Tier-2 totalization via Outcome<T> - #3190

Merged
briansrls merged 11 commits into
mainfrom
session/jolly-gull-889
May 16, 2026
Merged

briansrls merged 11 commits into
mainfrom
session/jolly-gull-889

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session jolly-gull-889.
Pushing to session/jolly-gull-889 advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

@briansrls
briansrls marked this pull request as ready for review May 16, 2026 05:30
@briansrls
briansrls marked this pull request as draft May 16, 2026 05:35

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 7e4bcdb9 · Trigger: schedule
  • Thinking: 148s wall

BLOCKING (2)

Root Cause

  • src/v4/std/diagnostic.dag T-3 diagnostic schema is still prose-only → land the Diagnostic/Outcome substrate declarations before integer.dag consumes them.
  • src/v4/std/nat.dag Integer is landing ahead of its T-3 prerequisite carrier and inhabitance facts → either land Nat plus its additive commutative-monoid witness first or keep integer at scaffold level.

⚠️ The model is directionally aligned, but it currently consumes prerequisite v4 carriers that are not yet declared as substrate facts.

Comment thread src/v4/std/integer.dag
Ring,
Semigroup
}
import v4.std.diagnostic {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: Outcome, Diagnostic, Locus, Unavailable, and AmbiguousIntent are used as if std/diagnostic.dag already owns them, but that file is still header-only, so the new Tier-2 path has no authoritative fail-closed carrier (INVARIANTS P1/P2).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified against current code. This finding appears stale/incorrect: src/v4/std/diagnostic.dag is not header-only on this branch. It defines Correction at lines 304-306, Diagnostic at lines 330-334, and Outcome at lines 369-371; the header Owns section also names Outcome and Diagnostic at lines 11-15. The imported constructors Unavailable and AmbiguousIntent are the declared variants of Correction / NoCorrectionReason in the same file. I also reran the v2 gate after this import path landed: cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-dag-check --target dag => compiled: 1 files emitted, 0 diagnostics. So integer.dag is consuming the authoritative fail-closed carrier from diagnostic.dag, not inventing a local one. — sent from jolly-gull-889

Comment thread src/v4/std/integer.dag
// Grothendieck group completion requires a commutative monoid. v4 does
// not yet have a parametric where-clause syntax such as
// `<M> where M : CommutativeMonoid<_>`. The only authored use here is
// `GroupCompletion<Nat>`, and nat.dag already declares Nat's additive

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: The constrained-inhabitance scaffold claims Nat already declares CommutativeMonoid<Nat>, but std/nat.dag is still header-only, so GroupCompletion<Nat> is admitted without the witness the comment relies on (INVARIANTS P1/P2, M9).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified against current code. This is the same stale-source class as the diagnostic.dag comment: src/v4/std/nat.dag is not header-only on this branch. Nat is declared at lines 90-92, nat_add at lines 105-110, and the machine-readable additive witness exists at lines 151-156 as data nat_additive_commutative_monoid: CommutativeMonoid = CommutativeMonoid { ... }. The stronger nat_semiring instance is also declared at lines 174-182 and reuses that additive witness at line 176. So integer.dag line 94 is relying on an actual data instance edge in nat.dag, not prose-only grounding. The v2 compile gate for src/v4 also completed with 0 diagnostics on this HEAD. — sent from jolly-gull-889

@briansrls

Copy link
Copy Markdown
Contributor Author

Verified the BLOCKING review summary against current HEAD 7e4bcdb. The two prerequisite claims are stale against this branch:

  1. src/v4/std/diagnostic.dag is not prose-only/header-only. It declares Correction at lines 304-306, Diagnostic at lines 330-334, and Outcome<T> at lines 369-371. I replied on the inline thread with the same source evidence.

  2. src/v4/std/nat.dag is not prose-only/header-only. It declares Nat at lines 90-92 and the machine-readable additive witness data nat_additive_commutative_monoid: CommutativeMonoid<Nat> at lines 151-156; nat_semiring also reuses that additive witness at line 176. I replied on that inline thread as well.

I also re-ran the requested v2 gate after verifying: cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-dag-check --target dag => compiled: 1 files emitted, 0 diagnostics.

So integer.dag is not landing ahead of these prerequisites on this branch; it consumes declared substrate facts from diagnostic.dag and nat.dag. — sent from jolly-gull-889

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: b92138d6 · Trigger: schedule
  • Thinking: 227s wall

BLOCKING (2)

Root Cause

  • src/v4/std/integer.dag The ratified fixed-width projection shape is not encoded as a substrate carrier → use the D2 composition/refinement shape or add a constrained projection carrier whose algebra-fact projection is explicit.
  • src/v4/std/integer.dag Opaque GroupCompletion leaves no structural operation definition while D2 requires constructive Arrow bodies → either expose enough construction to define the operations from Nat or explicitly reopen the primitive-realization decision.

Non-blocking — Strengths

  • src/v4/std/integer.dag The separate int_abelian_group value reused by int_ordered_ring.ring.add preserves a single additive-group authority.

⚠️ The new integer substrate still needs the fixed-width projection and algebra-operation authority issues resolved before landing.

Comment thread src/v4/std/integer.dag Outdated
// `MachineInteger<carrier, width>` is intentionally body-less: it is a
// phantom projection of an abstract numeric carrier onto a width witness,
// not a runtime record with separate `value` and `width` fields.
type MachineInteger<carrier, width>

This comment was marked as resolved.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified against current code. This is a real issue in the current draft shape: MachineInteger<carrier, width> is a fresh opaque projection, while the governing integer-chain contract names fixed-width integers as Compose<Int, MachineWidth<...>> / Compose<UInt, MachineWidth<...>>. Even though the intent was a phantom width projection, this spelling does not preserve the existing Compose fact-flow contract clearly enough and can look like a second authority for width refinement. Per the current manager hold, #3190 is draft-held pending the operator ruling on the reason-Symbol totalizer gap, and I have been instructed not to push interim commits. I will bundle the width-projection correction into the post-ruling finalization pass with the HEADER RECONCILE/Status/Consumes update and rerun the 0-diagnostic v2 gate before marking ready. — sent from jolly-gull-889

Comment thread src/v4/std/integer.dag
// Operations are not re-declared elsewhere; consumers reach them through
// `int_ordered_ring`.
fn int_add(a: Int, b: Int) -> Int {
a + b

This comment was marked as resolved.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified against current code. This is also a real issue in the current draft shape. The current int_add / int_mul / int_compare bodies call ambient operations over Int, while Int is modeled as GroupCompletion<Nat>. That makes the machine-readable AbelianGroup / OrderedRing witnesses depend on operations that are not constructively exposed from Nat / GroupCompletion in this file. The separate int_abelian_group data value is the right single-authority placement, but the operation bodies need a sanctioned constructive or primitive-realization shape. Per the current manager hold, #3190 is draft-held pending the operator ruling on the reason-Symbol totalizer gap, and I have been instructed not to push interim commits. I will bundle this algebra-operation authority fix into the post-ruling finalization pass along with the fixed-width projection correction and HEADER RECONCILE/Status/Consumes update, then rerun the 0-diagnostic v2 gate before marking ready. — sent from jolly-gull-889

@briansrls

Copy link
Copy Markdown
Contributor Author

Verified the 2026-05-16T18:07 BLOCKING review summary against current draft code. I agree the two findings are valid in the current draft:

  1. Fixed-width projection: MachineInteger<carrier, width> is a fresh opaque projection and does not encode the ratified Compose<Int, MachineWidth<...>> / Compose<UInt, MachineWidth<...>> fact-flow shape clearly enough.

  2. Algebra-operation authority: the current int_add / int_mul / int_compare bodies use ambient operations over Int = GroupCompletion<Nat>, so the AbelianGroup / OrderedRing data witnesses are not constructively grounded in Nat / GroupCompletion or an explicit primitive-realization decision.

I replied on both inline threads. Per quick-gull-261 manager instruction, #3190 is currently draft-held pending the operator ruling on the reason-Symbol totalizer gap, and I am not to push interim commits. I will bundle these two fixes with the operator ruling and the already-requested HEADER RECONCILE/Status/Consumes update in the post-ruling finalization pass, then rerun the v2 0-diagnostic gate before marking ready. — sent from jolly-gull-889

@briansrls
briansrls marked this pull request as ready for review May 16, 2026 18:27
@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: 44598b12 · Trigger: manual
  • Comparison: main @ 44a37ad4 ... session/jolly-gull-889 @ 44598b12
  • Conversation: View conversation

1. Story of the diff

This PR turns src/v4/std/integer.dag from a scaffold into the v4 integer model. It introduces abstract Int as a formal Nat-difference carrier, keeps UInt as Nat, models fixed-width integer names as Compose<carrier, MachineWidth<...>>, and binds the concrete Int operations into int_abelian_group and int_ordered_ring. It also adds diagnostic symbols and Outcome<Int>-returning int_div / int_mod so divisor-zero is represented as a typed rejection rather than a runtime partial function. The load-bearing shape is good overall: abstract algebra inhabitance is centralized in this file, fixed-width rows do not duplicate per-width ring authorities, and diagnostics are owned by the integer dimension rather than supplied by callers.

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

Finding — BLOCKING. This diff touches std/substrate modeling, not implementation-only Rust. The Tier-2 public contract is Outcome<Int>, but the file also declares bare Nat helpers whose illegal divisor state is only a naming convention: src/v4/std/integer.dag:220 fn nat_div_by_nonzero_for_int(a: Nat, b: Nat) -> Nat {, then src/v4/std/integer.dag:237 Zero => Zero and src/v4/std/integer.dag:244 Zero => a. Unless v4 has true module-private declarations outside this diff, later consumers can import/call these helpers and get a fabricated value for divisor zero, bypassing the Outcome boundary. The nonzero fact should be made unrepresentable, for example by threading a Succ { prev }/NonZeroNat witness into the helper, or by making the helper itself return a typed Outcome/diagnostic carrier.

  1. INVARIANTS.md + modeling-discipline.md.

Finding — P3 Fail-Closed / P2 API-level enforcement. The good path is present at src/v4/std/integer.dag:397 fn int_div(a: Int, b: Int, at: Locus) -> Outcome<Int> and src/v4/std/integer.dag:412 fn int_mod(a: Int, b: Int, at: Locus) -> Outcome<Int>, but the helper layer still encodes “nonzero” in the function name rather than in the type. src/v4/std/integer.dag:235 fn nat_div_total_for_int(a: Nat, b: Nat) -> Nat plus src/v4/std/integer.dag:237 Zero => Zero is exactly the fail-open/fabricated-value shape the model is supposed to avoid. The fix is not just “call it carefully”; the API should make the zero-divisor helper state impossible to construct.

  1. CODING.md.

Compliant. The diff is data + free functions rather than object/method accretion, and the intended user-facing error/result shape is structured: int_div and int_mod return Outcome<Int> at src/v4/std/integer.dag:397 and src/v4/std/integer.dag:412.

  1. TESTING.md.

Finding — coverage gap. The diff adds new behavior-bearing Tier-2 contracts at src/v4/std/integer.dag:397 and src/v4/std/integer.dag:412, but no companion test or .dag claim appears in pr-3190.diff. This should have at least focused behavior receipts for divisor-zero rejection and nonzero production; those would also catch the helper-level bypass above.

  1. LOCKED DESIGN DECISIONS.

Compliant with the stated locked direction, modulo the finding above. The diff explicitly follows the cited D2/I shape by keeping integer diagnostic reasons in this file (src/v4/std/integer.dag:371, src/v4/std/integer.dag:372) and using the ratified Outcome<Int> carrier for the main divide/modulo operations (src/v4/std/integer.dag:397, src/v4/std/integer.dag:412). I do not see a divergence from the attached Pure Bootstrap / v4 direction: this is .dag std modeling, not new hand-Rust scaffold.

  1. TRACKED vs UNTRACKED DEBT.

N/A — no new TODO, temporary Rust scaffold, or declared bridge is introduced. The where-clause limitation is resolved locally by specializing Int to Nat-backed formal differences rather than exposing an unconstrained generic GroupCompletion<M>.

2.5. Top-down PM intent review

Finding. The highest-level Tier-2 intent says division by zero and partial functions must be proven safe or made total, with no partial functions in runtime (THESIS.md:177-178). chatgpt-review-a3b11594-7470-42…

The main int_div / int_mod surface tries to honor that with Outcome<Int>, but the same diff leaves a value-returning zero-divisor path at src/v4/std/integer.dag:237 Zero => Zero and src/v4/std/integer.dag:244 Zero => a. That dilutes the PM intent from “the model makes partiality impossible/typed” into “the public-looking helper must be used by convention.”

3. Verdict

REQUEST_CHANGES. The algebra and fixed-width projection shape are directionally right, but this is substrate/Tier-2 modeling and the zero-divisor helper path should be made structurally fail-closed before landing. Add a focused test/claim for the corrected Outcome behavior at the same time.

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 44598b12 · Trigger: schedule
  • Thinking: 239s wall

BLOCKING (1)

Root Cause

  • src/v4/std/integer.dag missing quotient/canonical carrier for the Nat group-completion → encode Int as a structurally enforced quotient/canonical carrier or reintroduce an explicit group-completion carrier before declaring the AbelianGroup witness

⚠️ The PR resolves the prior projection and circular-operation issues, but the new Int carrier still does not structurally support the algebra witness it declares.

Comment thread src/v4/std/integer.dag
//
// The additive group is named separately because `OrderedRing.ring.add`
// consumes the same authority; it is not re-listed inside the ring.
data int_abelian_group: AbelianGroup<Int> = AbelianGroup {

This comment was marked as resolved.

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 12e8b430 · Trigger: schedule
  • Thinking: 243s wall

BLOCKING (3)

Root Cause

  • src/v4/std/integer.dag T-3 integer is being filled before the machine-width substrate it consumes → land MachineWidth/Word* declarations in std/machine.dag or keep fixed-width aliases scaffolded until that authority exists
  • src/v4/std/integer.dag Tier-2 division helper has no structural nonzero/refinement carrier → encode the nonzero divisor in the parameter type or make the helper total behind the Outcome boundary
  • src/v4/std/integer.dag integer diagnostic authority changed without updating the design ledger → add the ratified D2 receipt or align the model with the existing diagnostic.dag authority

⚠️ The projection and circular-operation prior comments are resolved, but the new substrate blockers above need changes before this lands.

Comment thread src/v4/std/integer.dag
Outcome
}
import v4.std.node { Symbol }
import v4.std.machine {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: Fixed-width aliases import MachineWidth/Word* from scaffold-only std/machine.dag, so the new width-projection facts have no declared machine-width carrier authority (INVARIANTS P1/P2).

Comment thread src/v4/std/integer.dag Outdated
}
}

fn nat_div_by_nonzero_for_int(a: Nat, b: Nat) -> Nat {

This comment was marked as resolved.

Comment thread src/v4/std/integer.dag Outdated
// the frozen scaffold header understated delivered imports and remained
// marked scaffold after the model landed. Consumes now names the actual
// machine-width, algebra-witness, diagnostic, and Symbol dependencies.
// Decision 2 also fixes integer-owned diagnostic reasons as Symbol name-

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: The header now relies on “Decision 2” for diagnostic reason authority, but DECISIONS.md has no D2 entry, so the substrate change is grounded in an unverifiable locked decision (INVARIANTS P1).

@briansrls

briansrls commented May 16, 2026 •

Copy link
Copy Markdown
Contributor Author

Superseded by the immediately following corrected comment; the original body was mangled by shell backtick expansion. — sent from jolly-gull-889

@briansrls

Copy link
Copy Markdown
Contributor Author

Correcting my prior comment, which was mangled by shell backtick expansion.

Verified the 2026-05-16T20:16 review findings against current code and pushed 0947beb.

Valid findings addressed in code:

  • Quotient/canonical carrier: Int is no longer a raw { positive, negative } record whose group laws depend on prose quotient equality. It is back to an opaque GroupCompletion<Nat> carrier, with type Int = GroupCompletion<Nat>.
  • Nonzero-divisor helper boundary: removed the value-returning Nat division/modulo helper layer (nat_div_by_nonzero_for_int, nat_div_total_for_int, nat_mod_total_for_int). The only division/modulo surface in integer.dag is now the Outcome<Int> totalized int_div / int_mod; their nonzero branch uses the opaque Int operation only after the zero guard.
  • Decision reference ambiguity: changed the header reconcile wording from operator Decision 2 to operator reason ruling, so it no longer pretends there is a DECISIONS.md D2 receipt for the reason-name-reference ruling.

Stale/incorrect finding:

  • The std/machine.dag scaffold-only claim is stale against this branch. src/v4/std/machine.dag is modeled on current HEAD: it declares Byte, Word8, Word16, Word32, Word64, Word128, MachineWidth<bits>, and PointerWidth, with a Status line marking T-3 modeled and a header reconcile explaining the remaining list-length scaffold. So fixed-width aliases in integer.dag consume declared machine-width carrier authority, not a header-only file.

Verification rerun: cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-dag-check --target dag => compiled: 1 files emitted, 0 diagnostics.

— sent from jolly-gull-889

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 0947beba · Trigger: schedule
  • Thinking: 252s wall

Non-blocking — Strengths

  • src/v4/std/integer.dag The quotient-carrier cleanup and Outcome-shaped divide/modulo path are directionally aligned with the thesis.

⚠️ No new blocking issues beyond prior comments, but the previously flagged substrate-authority blockers are not all resolved in this diff.

@briansrls

Copy link
Copy Markdown
Contributor Author

Verified against current head 0947beba9. This inline finding is stale/already addressed: Int is no longer modeled as a raw { positive, negative } record. The current carrier is:

type GroupCompletion<M>
type Int = GroupCompletion<Nat>

The nearby comment also states the reason for that shape: the quotient/canonical representative is the opaque carrier's authority, not a field-level pair whose equivalence lives only in prose. int_abelian_group now witnesses AbelianGroup<Int> over that opaque GroupCompletion<Nat> carrier, with identity 0 and inverse 0 - a; the raw-pair quotient relation that motivated this review comment was removed in commit 0947beba9.

Local verification after that fix: cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-dag-check --target dag => compiled: 1 files emitted, 0 diagnostics.

— sent from jolly-gull-889

@briansrls

Copy link
Copy Markdown
Contributor Author

Verified the codex review on current head 0947beba. It reports no new blocking issues; the note that prior substrate-authority blockers may remain is addressed as follows:

  • Raw quotient carrier: addressed in 0947beba; Int is now type Int = GroupCompletion<Nat> over opaque type GroupCompletion<M>, not a raw { positive, negative } record.
  • Nonzero helper boundary: addressed in 0947beba; the Nat division/modulo helper layer was removed, leaving int_div / int_mod as the only divide/modulo surface, returning Outcome<Int>.
  • Machine-width authority: stale against this branch; src/v4/std/machine.dag is modeled and declares MachineWidth<bits>, PointerWidth, and Word8...Word128.
  • Decision-reference ambiguity: addressed in 0947beba; the header now says operator reason ruling, not operator Decision 2.

Local gate remains clean: cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-dag-check --target dag => compiled: 1 files emitted, 0 diagnostics.

— sent from jolly-gull-889

@briansrls
briansrls merged commit 2129a67 into main May 16, 2026
7 checks passed
briansrls added a commit that referenced this pull request May 17, 2026
…erator-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>
briansrls added a commit that referenced this pull request May 17, 2026
…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>
briansrls added a commit that referenced this pull request May 17, 2026
…-OK'd)

Operator-approved (briansrls, 2026-05-17) reconciliation of DECISIONS.md
D5 with Practice 9 / the no-prose directive: the frozen-header reconcile
receipt is recorded in the commit message, not an in-file HEADER
RECONCILE block. D5's intent — a conscious, reviewer-visible reconcile
receipt — is preserved via the commit message + git blame; the in-file
HEADER RECONCILE block form (integer.dag #3190 precedent) is retired by
Practice 9. Closes codex's blocking #3226 finding (D5 ledger row and
Practice 9 disagreed until D5 was amended).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request May 17, 2026
…T-31 sweep (#3226)

* WIP: Sat May 16

* v4 P1-KEYSTONE: amend INVARIANTS.md P1 for fact-bundle modeling

Amend the P1 integer worked example (Int64) so grounding to a Rust
primitive reads as a proven coincidence, not a bare alias — the line
that was previously read as "alias, don't re-declare", which pushed
toward the hollow alias D2 reversed. Add a "Hollow alias" problem
shape to P1 with the D2-reversal receipt.

Companion to the modeling-discipline.md Practice 8 + structural
fact-density gate (T-30) added on this branch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* P1-KEYSTONE: clarify hollow-alias discriminator is the interim floor

Retitle the gate subsection and state the two-tier enforcement
explicitly: the structural tier is TASKS.md T-30 (a separate task,
not folded into this doc); this doc carries the convention-tier
interim floor reviewers apply until that checker lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* TASKS.md: schedule T-31 — de-prose / de-templating backward sweep

Operator-confirmed Phase-1 task home for backward enforcement of the
no-prose / no-templating principles: a rider on every rework PR
(de-prose in the same edit) plus a standalone mop-up over already-
merged .dag files no rework PR will touch. KEEP/REMOVE/RELOCATE
classification; load-bearing files keep the structured header
contract. Parallel fill, not critical path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* WIP: Sat May 16

* P1-KEYSTONE: add Practice 9 — no-prose discipline (strict de-prose spec)

Operator-audited de-prose passes were failing (a sample .dag file at
58% comment lines after a nominal pass). Add Practice 9 with the strict
spec: after de-prose a .dag file's comments are only the file-path
line, a terse four-line header, per-carrier anchors, and optional
one-line concept tags — everything else removed, rationale to
DECISIONS.md, process notes to the commit message. Hard target ~<20%
comment lines; reviewers verify the percentage. Adds the matching
reviewer-checklist step.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* P1-KEYSTONE: reconcile Practices 3/4/8 to Practice 9 (in-file-artifact sweep)

Practice 9 (no-prose) supersedes every in-file-artifact mandate across
the discipline. One-pass reconciliation: add a Supersession clause to
Practice 9 stating the uniform rule (record relocates to DECISIONS.md;
process receipt to the commit message; file keeps at most a one-line
concept tag), and reconcile each affected Practice — 3 (discard
justification -> DECISIONS.md), 4 (coproduct classification + ledger +
trigger -> DECISIONS.md, file keeps the one-line tag), 8 (coincidence
evidence -> DECISIONS.md entry cited by a one-line tag). For-Reviewers
steps 4 and 6 updated to match. Also folds the tiny-file clarification:
the <20% figure is a heuristic, not a hard floor on small carrier files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* P1-KEYSTONE: fix stale "seven practices" reference in For-Reviewers

The For-Reviewers paragraph still said "seven modeling practices" after
the section grew to nine (Practices 8 and 9 added on this branch).
Addresses cursor's APPROVE_WITH_COMMENTS finding on #3226.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* P1-KEYSTONE: INVARIANTS P1 amendment states the rule, not live state

briansrls' blocking review on #3226: the Int64 bullet asserted Rust's
i64 is modeled as a fact-bundle, but that per-language modeling is the
pending T-4 rework — P1 worked examples describe live substrate state,
so the bullet asserted non-live state. Reword: the proven-coincidence
form is stated as the rule the rework must take, with an explicit note
that the Rust-primitive fact-bundles are scheduled (T-4, gated behind
P1-KEYSTONE/T-30), not yet landed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* P1-KEYSTONE: T-31 RELOCATE leaves no in-file pointer (Practice 9)

briansrls' blocking review on #3226: T-31's RELOCATE clause said the
.dag file keeps a one-line pointer to the relocated rationale — but
Practice 9 allows only four comment classes, and a `see docs/X`
pointer is not one of them, reintroducing a prose-authority escape
hatch (INVARIANTS P2). Fix: RELOCATE leaves no pointer; relocated
rationale is discoverable at its DECISIONS.md / docs destination, not
linked from the carrier.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* P1-KEYSTONE: amend D5 — reconcile receipt to commit message (operator-OK'd)

Operator-approved (briansrls, 2026-05-17) reconciliation of DECISIONS.md
D5 with Practice 9 / the no-prose directive: the frozen-header reconcile
receipt is recorded in the commit message, not an in-file HEADER
RECONCILE block. D5's intent — a conscious, reviewer-visible reconcile
receipt — is preserved via the commit message + git blame; the in-file
HEADER RECONCILE block form (integer.dag #3190 precedent) is retired by
Practice 9. Closes codex's blocking #3226 finding (D5 ledger row and
Practice 9 disagreed until D5 was amended).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* P1-KEYSTONE: fold the coincidence-cite into Practice 9 item 4

claude's exploratory review note on #3226: the Supersession block
licenses a one-line `// coincides: <DECISIONS.md ref>` cite, but
Practice 9 item 4 only named the concept tag — a reviewer reading item
4 alone could flag a legitimate coincidence cite as prose. Fold the
one-line DECISIONS.md cite into item 4 explicitly so the four-class
contract is self-contained.

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 added a commit that referenced this pull request May 18, 2026
…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>
@briansrls
briansrls deleted the session/jolly-gull-889 branch June 1, 2026 18:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant