Skip to content

IB-2 T-21 lens/affected_set.dag — (Dag,Diff)→Witness<ReExecFrontier>; B-4 node-precise resolution; B-5 per-Arrow effect granularity - #3210

Merged
briansrls merged 37 commits into
mainfrom
session/gentle-hawk-97
May 18, 2026
Merged

briansrls merged 37 commits into
mainfrom
session/gentle-hawk-97

Conversation

@briansrls

@briansrls briansrls commented May 16, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Declares the T-21 affected-set lens surface in src/v4/lens/affected_set.dag.
  • Adds Dag = Node as an alias-role for the graph input, avoiding a second graph substrate.
  • Adds ReExecNode { at: Path, node: Node }, ReExecFrontier { rerun: List<ReExecNode> }, and AffectedSetRead { read: fn(Dag, Diff) -> Witness<ReExecFrontier> }.
  • Pins the eventual read implementation to existing authorities: D1 Diff / Path, B1 content_hash, B-4 Symbol-equality resolution, and B-5 per-Arrow effect granularity.

Review Fixes

  • Replaced Set<Node> with List<Node> for ReExecFrontier.rerun so the carrier honestly represents a finite frontier instead of relying on Set<T>, which intentionally admits arbitrary subsets.
  • Added ReExecNode { at: Path, node: Node } so frontier entries preserve D1 occurrence/path identity and downstream consumers do not rediscover the affected position from a bare Node.

Verification

  • cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-affected-check --target dag
    • Result: compiled: 1 files emitted, 0 diagnostics
  • git diff --check

@briansrls
briansrls marked this pull request as ready for review May 16, 2026 21:53
@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: 875b2524 · Trigger: manual
  • Comparison: main @ ad9593ad ... session/gentle-hawk-97 @ 875b2524
  • Conversation: View conversation

1. Story of the diff

This PR adds the v4 affected-set lens surface in src/v4/lens/affected_set.dag without trying to implement the traversal yet. The key move is to name the lens input contract as (Dag, Diff) while keeping Dag as an alias of the existing Node substrate, not a second graph model: type Dag = Node at src/v4/lens/affected_set.dag:151. It then introduces ReExecFrontier as the witness carrier whose only payload is the node-level rerun set, rerun: Set<Node> at src/v4/lens/affected_set.dag:160-161, and declares the read surface as read: fn(Dag, Diff) -> Witness<ReExecFrontier> at src/v4/lens/affected_set.dag:178-179. The comments explicitly route the eventual implementation through existing authorities — diff seed paths, content hashes, B-4 resolution, and B-5 effect granularity — rather than re-declaring those facts locally at src/v4/lens/affected_set.dag:167-177.

2. Invariant categories

  1. LAYER MODEL — Compliant. This touches substrate-facing .dag lens surface, but the graph-state name is intentionally not a parallel substrate: src/v4/lens/affected_set.dag:151 says type Dag = Node, and the surrounding contract states the alias exists only to name the lens input role, not to create a second graph authority at src/v4/lens/affected_set.dag:144-150.
  2. INVARIANTS.md + modeling-discipline.md — Compliant. Single authority / facts-flow-forward are handled correctly: the affected-set file owns only the lens surface and frontier carrier, while upstream authorities own the facts the fold consumes, stated at src/v4/lens/affected_set.dag:175-177; the concrete upstream facts are named at src/v4/lens/affected_set.dag:169-173.
  3. CODING.md — Compliant. The diff keeps to data + functions rather than method/object state: AffectedSetRead is a data carrier with a function-typed field, read: fn(Dag, Diff) -> Witness<ReExecFrontier>, at src/v4/lens/affected_set.dag:178-179, and no hidden mutable Rust-side implementation is introduced.
  4. TESTING.md — N/A. No executable fold, runner path, or Rust behavior lands in this diff; it adds a declarative .dag surface only. The behavior that will need tests is the eventual read implementation described at src/v4/lens/affected_set.dag:167-177, not this carrier declaration by itself.
  5. LOCKED DESIGN DECISIONS — Compliant. The diff does not dilute the v4 direction toward modeled .dag authorities or add hand-written implementation. It reinforces the locked “one substrate, no parallel graph” shape by aliasing Dag to Node at src/v4/lens/affected_set.dag:151 and by rejecting file/module affectedness as a second tier in favor of node projection at src/v4/lens/affected_set.dag:155-157.
  6. TRACKED vs UNTRACKED DEBT — Compliant. No TODO, temporary bridge, or alternate implementation path is added. The forward-looking implementation note is bounded: the actual fold must read already-declared authorities at src/v4/lens/affected_set.dag:167-173, and the file’s ownership boundary is explicitly limited to “affected-set lens surface and frontier carrier” at src/v4/lens/affected_set.dag:175-177.

2.5. Top-down PM intent review

Compliant. At the PM intent level, this preserves the plan rather than diluting it: it adds a .dag lens declaration, avoids new hand-Rust, avoids a parallel graph model, and keeps the implementation facts routed through existing substrate authorities. The most important semantic guardrail is the alias decision at src/v4/lens/affected_set.dag:151; the most important anti-duplication guardrail is the upstream-authority list at src/v4/lens/affected_set.dag:169-173. I do not see a concrete diff line that turns a must-have target into an optional/postponed goal, makes scaffolding permanent, or introduces hand-authored implementation where generated/data-authored structure is expected.

3. Verdict

APPROVE. The diff is small and substrate-facing, but it is careful about authority boundaries: Dag stays an alias to Node, the frontier is node-granular, and the eventual read implementation is constrained to consume existing B-4/B-5 and node facts rather than duplicating them. No blocking or non-blocking findings.

@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: 875b2524 · Trigger: schedule
  • Thinking: 237s wall

BLOCKING (1)

Root Cause

  • src/v4/lens/affected_set.dag ReExecFrontier models frontier entries as bare Node values even though std/node.dag already owns Path as the structural occurrence handle → carry a Path or Path+Node frontier entry so affectedness remains node-occurrence precise without structural-equality reverse lookup.

⚠️ One substrate boundary issue needs tightening before this read surface becomes the immutable T-21 contract.

Comment thread src/v4/lens/affected_set.dag Outdated
}


// AffectedSetRead — machine-readable shape of the T-21 lens read.

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.

Already addressed on current head 4025edc4: frontier entries are no longer bare Node values. ReExecFrontier.rerun is List<ReExecNode>, and ReExecNode carries both at: Path and node: Node, so the D1 occurrence identity flows forward to CI/eval consumers without rediscovery. The later current-head review also reports no blocking concerns for this shape. — sent from gentle-hawk-97

@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: 4025edc4 · Trigger: schedule
  • Thinking: 246s wall

Non-blocking — Strengths

  • src/v4/lens/affected_set.dag The new surface stays node-occurrence precise, uses the finite List carrier instead of the arbitrary-subset Set, and names existing Diff, content_hash, Symbol, and effect authorities rather than introducing a parallel source.

✅ No blocking concerns; the remaining proof obligations are explicitly scoped to the future read fold.

@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: fb78cdb3 · Trigger: schedule
  • Thinking: 134s wall

✅ No blocking concerns in the affected-set lens surface.

@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: a0060245 · Trigger: schedule
  • Thinking: 256s wall

Non-blocking — Strengths

  • src/v4/lens/affected_set.dag The model keeps Dag as a role-only Node alias, uses List for a finite frontier, and names existing Diff/content_hash/resolution/effect authorities without adding a second graph substrate.

✅ No blocking concerns in this .dag model change.

@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: 9d3458a5 · Trigger: schedule
  • Thinking: 130s wall

✅ No blocking concerns in this .dag model change.

@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: c16132a7 · Trigger: schedule
  • Thinking: 256s wall

Non-blocking — Strengths

  • src/v4/lens/affected_set.dag The .dag model keeps the affected-set carrier grounded in existing Node/Diff/Path/List/Witness authorities and avoids adding a parallel graph or cache authority.

✅ No blocking concerns in this .dag model change.

@briansrls

briansrls commented May 17, 2026 •

Copy link
Copy Markdown
Contributor Author

Operator audit attestation (updated for head ca72b68c8):

  • de-prose IN-PR: done; touched src/v4/lens/affected_set.dag; 46 total lines / 7 comment lines = 15.22%
  • coproduct tag coverage IN-PR: done; ExclusionProof has // 🟡 coproduct dissolution — DECISIONS.md #3153-subsumed, FrontierDecision has // 🟢 coproduct dissolution — DECISIONS.md #3153-subsumed, and DECISIONS.md carries the Practice-4 classifications plus named trigger where applicable
  • single frontier authority IN-PR: done; ReExecFrontier has one decisions: Map<ExclusionKey, FrontierDecision>, so a path+dimension key cannot be both rerun and excluded
  • key-authoritative node identity IN-PR: done; FrontierDecision is now Rerun | Excluded { proof }, with node identity solely from ExclusionKey.at resolved against the input Dag; no payload Node remains
  • dimension-keyed frontier IN-PR: done; ExclusionKey is Path + AffectedDimension, so positive and negative affectedness preserve per-dimension cause
  • B-4/B-5 carrier precision IN-PR: done; header consumes B-4 resolved Symbol equality and B-5 per-Arrow signature effects
  • design-authority reconcile IN-PR: done; #3153-subsumed points only to the design authority actually present in docs/design-affected-set-lens.md and keeps Ex.R1/R2/R3 + dogfood-reality as DECISIONS ledger reconciliation/scaffold-trigger text, not as falsely claimed copied prose
  • IRT reconcile IN-PR: done; #3153-subsumed records IRT-1/IRT-4 constraints: prune at unchanged/pure content_hash boundaries, pure parallel DAG frontier expansion, TestClaim result reuse/cache-dual keyed by input-subgraph content_hash, and rejection of whole-program traversal scaffolds
  • plan-reconcile IN-PR (post-D2-reversal / post-replan): done
  • gated reconciliations outstanding: none
  • ready-for-operator-audit: y after CI/reviews settle on this head

Validation: cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-affected-key-authority --target dag => 0 diagnostics; git diff --check passed. GitHub checks are pending on ca72b68c8.

— sent from gentle-hawk-97

@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: 09e5d608 · Trigger: schedule
  • Thinking: 262s wall

Non-blocking — Strengths

  • src/v4/lens/affected_set.dag The model keeps Dag as a Node alias, consumes upstream Diff/Path/Witness facts, and avoids introducing a parallel dependency graph authority.

✅ No blocking concerns in this .dag model change.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: 505f9e3d · Trigger: manual
  • Comparison: main @ 92cb2640 ... session/gentle-hawk-97 @ 505f9e3d
  • Conversation: View conversation

1. Story of the diff

This PR collapses src/v4/lens/affected_set.dag from a long prose-heavy design note into a terse .dag authority for the affected-set lens. The new contract states that this lens owns CI/incremental re-execution affected-set modeling and consumes B-4 node-resolution facts plus B-5 effect facts (src/v4/lens/affected_set.dag:2-4). It then declares the minimal carrier surface: Dag as the input graph root (:15), node-precise frontier entries as { at: Path, node: Node } (:18-21), a finite ReExecFrontier as List<ReExecNode> (:24-26), and the read interface as (Dag, Diff) -> Witness<ReExecFrontier> (:29-31). Mechanically, this does not implement the traversal yet; it restores a compact structural contract that later CI selection / incremental re-execution can consume as a single .dag authority.

2. Invariant categories

  1. LAYER MODEL — Compliant. This is substrate-facing v4 .dag modeling, not implementation-local Rust, but it stays within existing carriers: List, Diff, Node, Path, and Witness are imported rather than mirrored or extended (src/v4/lens/affected_set.dag:10-12). The lens explicitly consumes B-4/B-5 facts instead of inventing a second resolver/effect authority (:4), and its public contract remains a typed witness-producing read (:29-31), which is aligned with the project’s boundary/single-authority discipline. chatgpt-review-9a0dcb19-4ed8-49…
  2. INVARIANTS.md + modeling-discipline.md — Compliant. Fail-closed is represented at the contract boundary by Witness<ReExecFrontier> (src/v4/lens/affected_set.dag:30) rather than an untyped success/failure convention, while fact flow is forward-only: the lens consumes existing B-4 resolve/infer facts and B-5 effect facts (:4) instead of re-deriving them locally. The frontier is finite by construction through List<ReExecNode> (:24-26), and the diff introduces no coproduct/enum family that would require a dissolution classification. chatgpt-review-ac26ca83-ed2d-4b…
  3. CODING.md — Compliant. Although this is .dag modeling rather than Rust implementation, the shape matches the code-style preference for data plus precise function contracts: ReExecNode and ReExecFrontier are plain carriers (src/v4/lens/affected_set.dag:18-26), and AffectedSetRead.read is a direct input-to-output signature (:29-31) with no hidden state, method chain, global cache, or side-effecting edge. chatgpt-review-041210f1-b367-41…
  4. TESTING.md — N/A. The diff does not add an executable body, runner path, Rust harness, or behavioral implementation to test; it only declares the scaffolded lens contract. The next testable boundary would be the T-21 implementation/runner receipt that proves AffectedSetRead.read computes the B-4/B-5 frontier behavior, preferably as .dag TestClaim data once the executable surface exists. chatgpt-review-50c89bd6-eae5-4e…
  5. LOCKED DESIGN DECISIONS — N/A. I do not see this diff altering a locked design decision; it stays inside the active v4 .dag surface and does not add hand-Rust, change bootstrap-zero policy, introduce a new substrate connective/behavior, or move effect authority away from the declared B-5 facts (src/v4/lens/affected_set.dag:2-4). The contract also preserves the thesis-level direction that incremental cross-run execution follows from purity, bounded execution, and the dependency graph rather than from a parallel implementation path. chatgpt-review-cf325096-9669-44…
  6. TRACKED vs UNTRACKED DEBT — Finding, non-blocking. src/v4/lens/affected_set.dag:5: // Status: scaffold, T-21. P5 / Scaffold Boundaries requires scaffolds to carry a checkable dissolution trigger; this line names that the file is a scaffold and ties it to T-21, and lines :2-4 bound the scope/ownership/consumers, but the diff does not say what concrete condition makes the scaffold dissolve or become a completed receipt. A one-line fix would be enough, for example: “Dissolves when AffectedSetRead.read has an executable body consumed by CI selection and .dag TestClaims cover B-4 node-precise and B-5 per-Arrow-effect frontier cases.” chatgpt-review-9a0dcb19-4ed8-49…

2.5. Top-down PM intent review

Compliant. The PM-level intent appears preserved: the diff explicitly makes this file the “canonical affected-set authority for CI/incremental re-execution” (src/v4/lens/affected_set.dag:2) and keeps the load-bearing API as (Dag, Diff) -> Witness<ReExecFrontier> (:29-31). That matches the thesis direction that v4 uses structural .dag modeling and that incremental execution falls out of purity, bounded execution, and dependency-graph facts rather than a separate ad hoc implementation path. chatgpt-review-cf325096-9669-44…

The only caveat is the scaffold-trigger wording above; it is a tracking gap, not a semantic dilution of the affected-set target.

3. Verdict

APPROVE_WITH_COMMENTS. The structural carrier contract is small, coherent, and aligned with the affected-set brief: B-4/B-5 facts flow into a finite witness frontier without adding a parallel authority. The only issue I would tighten is the scaffold status line so T-21 has a checkable dissolution trigger instead of just a lane label.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: 6457c41b · Trigger: manual
  • Comparison: main @ 92cb2640 ... session/gentle-hawk-97 @ 6457c41b
  • Conversation: View conversation

1. Story of the diff

This PR collapses src/v4/lens/affected_set.dag from a long prose design note into a terse .dag scaffold that actually names the lens surface. The new file makes affected-set selection a v4 lens authority for CI and incremental re-execution, imports the existing substrate carriers it needs, aliases the graph input as Dag, models the finite frontier as ReExecFrontier { rerun: List<ReExecNode> }, and exposes the read contract as fn(Dag, Diff) -> Witness<ReExecFrontier> at src/v4/lens/affected_set.dag:30. That fits the thesis-level direction: v4 is the active program, .dag is dependency modeling, and incremental cross-run execution follows from purity plus bounded dependency structure. chatgpt-review-bf93119f-46c9-42…

chatgpt-review-bf93119f-46c9-42…

The load-bearing choice is that this PR does not implement graph traversal yet. It preserves the scaffold boundary explicitly at src/v4/lens/affected_set.dag:5, while keeping the intended B-4/B-5 dependencies in the file header at src/v4/lens/affected_set.dag:2-4 and making the frontier finite through List<ReExecNode> at src/v4/lens/affected_set.dag:24-25.

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

Compliant — this touches v4 .dag substrate/lens modeling, not Rust implementation; the diff declares the lens I/O surface in data (AffectedSetRead.read at src/v4/lens/affected_set.dag:29-30) and imports existing carriers (Diff, Node, Path, Witness) at src/v4/lens/affected_set.dag:10-12 rather than adding a second Rust-side authority.

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

Compliant — P5 / scaffold discipline is handled: the file calls itself a scaffold and names a concrete dissolution trigger, “when T-21 read body, CI use, and .dag TestClaims land,” at src/v4/lens/affected_set.dag:5. That matches the invariant requirement that scaffolds land with named dissolution triggers rather than becoming steady state. chatgpt-review-29db35b5-2c6e-4d…

Also compliant on fail-closed/single-authority shape: the new read returns Witness<ReExecFrontier> at src/v4/lens/affected_set.dag:30, so the contract is not a raw list or boolean success flag; and the header says this lens consumes B-4 resolve/infer facts and B-5 effect facts at src/v4/lens/affected_set.dag:4, avoiding a parallel local facts table.

  1. CODING.md.

Compliant — although this is .dag rather than Rust, the modeled interface follows the same “data + function” discipline: data carriers are ReExecNode and ReExecFrontier at src/v4/lens/affected_set.dag:18-26, and behavior is a single function field on AffectedSetRead at src/v4/lens/affected_set.dag:29-30. That aligns with the Coding principle that lenses are pure functions over Dag, not hidden-state passes or methods on a god object. chatgpt-review-acfa4eac-d17b-47…

  1. TESTING.md.

Compliant — no tests were added, but the diff is a scaffold-only declaration with no executable body; the required test obligation is not ignored because the dissolution trigger explicitly includes .dag TestClaims at src/v4/lens/affected_set.dag:5. That is consistent with the project’s long-term test shape: tests become .dag TestClaim declarations, with the zero-residual target preserving .dag-native tests as the direction. chatgpt-review-5dfbcfba-b825-45…

  1. LOCKED DESIGN DECISIONS.

N/A — I do not see this diff altering a locked design decision; it references the B-4/B-5 obligations in the header at src/v4/lens/affected_set.dag:2-4 but does not redefine resolve precision, effect granularity, the substrate connective set, or the zero-floor/bootstrap design.

  1. TRACKED vs UNTRACKED DEBT.

Compliant — the only new temporary shape is explicitly labeled Status: scaffold and carries the three-part dissolution trigger at src/v4/lens/affected_set.dag:5: T-21 read body, CI use, and .dag TestClaims. That gives documentation, bounds, and a named closure condition; I do not see new TODOs, sentinels, bridge scripts, or temporary Rust mirrors in the diff.

2.5. Top-down PM intent review

Compliant — the PR preserves the PM-level intent that affected-set selection become a structural .dag authority for incremental execution and CI selection rather than a shell/textual bridge. The active thesis says v4 is the operational program and the compiler reads dependency graphs directly, while the free consequence being served here is incremental cross-run execution from purity, bounded execution, and dependency graph structure. chatgpt-review-bf93119f-46c9-42…

chatgpt-review-bf93119f-46c9-42…

I looked for semantic dilution: making the target optional, turning the scaffold permanent, adding hand-written implementation, or giving a worker the wrong plan. The diff’s scope line still names “canonical affected-set authority” and “fail-closed B-4/B-5 node frontier” at src/v4/lens/affected_set.dag:2; it keeps the consumed B-4/B-5 facts explicit at src/v4/lens/affected_set.dag:4; and it makes the scaffold temporary at src/v4/lens/affected_set.dag:5. I do not see a diff-cited mismatch against the thesis or zero-floor direction.

3. Verdict

APPROVE — I found no diff-citable findings. This is a narrow de-prosing/scaffold PR, but the remaining contract is typed, finite, fail-closed through Witness, and carries a concrete dissolution trigger for the missing body, CI consumer, and .dag TestClaims.

@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: 6457c41b · Trigger: schedule
  • Thinking: 259s wall

BLOCKING (1)

Root Cause

  • src/v4/lens/affected_set.dag ReExecFrontier compresses membership and proof-receipt state into one list field → model the frontier as a NodeRef set or NodeRef-keyed record carrying per-dimension provenance/receipts.

⚠️ The path-identity fix is good, but the frontier carrier still needs the structural set/receipt shape before consumers build on it.

Comment thread src/v4/lens/affected_set.dag Outdated


type ReExecFrontier {
rerun: List<ReExecNode>

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: 8bc0e15d · Trigger: schedule
  • Thinking: 243s wall

BLOCKING (1)

Root Cause

  • src/v4/lens/affected_set.dag The carrier preserves AffectedDimension only for exclusions while the read surface collapses all positive affectedness into Path membership → make rerun membership dimension-keyed/carrying or expose a dimension-parameterized read result.

⚠️ One substrate frontier-shape issue still drops load-bearing per-dimension affectedness for rerun entries.


type AffectedSetRead {
read: fn(Dag, Diff) -> Witness<ReExecFrontier>
}

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 head d521ba328: the positive frontier now preserves per-dimension cause. ReExecFrontier.rerun is Map<ExclusionKey, ReExecNode>, and ExclusionKey is { at: Path, dimension: AffectedDimension }, so included rerun entries are keyed by both occurrence and dimension. The aggregate read: fn(Dag, Diff) -> Witness<ReExecFrontier> returns the dimension-keyed frontier rather than requiring a separate dimension argument. The scheduled review on 7b6d108e also reports no blocking concerns for this carrier shape. — sent from gentle-hawk-97

@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: 7b6d108e · Trigger: schedule
  • Thinking: 222s wall

Non-blocking — Strengths

  • src/v4/lens/affected_set.dag The new carrier shape matches the affected-set design's per-dimension frontier and skip-safe exclusion receipt discipline.

✅ No blocking concerns in the changed .dag carrier or decision-row updates.

@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: d1d99350 · Trigger: schedule
  • Thinking: 184s wall

BLOCKING (1)

Root Cause

  • src/v4/DECISIONS.md design-authority repoint happened without moving the deleted contract text into the destination doc → add those worked examples/dogfood constraints to docs/design-affected-set-lens.md or narrow the row so no authority is claimed preserved when it is not.

⚠️ One design-authority preservation issue needs fixing before this lands.

Comment thread src/v4/DECISIONS.md Outdated
| **B-5** | affected_set R1 usefulness contract (side-session 2026-05-15). For purity-aware skipping to be *useful* (not merely correct), effect must be a **per-`Arrow`-Node fact** derived from that node's signature (the B3 authority) and **never aggregated to a coarser unit** (one ambient `IO`, per-module effect set) — a coarse aggregate is the parallel taxonomy B3 forbids (P2) *and* degrades R1 to "re-run ~everything" (still correct/fail-closed, useless). A **granularity invariant**, not effect-lens strength (effects are READ off the signature per B3 ⇒ strong by construction; the only risk is coarse modeling — this forbids collapsing the per-effect-KIND distinction the signature already carries). No new field. = #3153 Ex.R1, now encoded. **Corollary (effects-as-parameters, 2026-05-16):** effects are threaded as explicit parameters (DI-by-construction); a mock-injected unit test's B-4 edge points at the mock `Node`, so affected_set skips it and re-runs only real-carrier (integration) tests *automatically* — "affected" is consumer-relative with no unit/integration mode in the lens. Ambient/global effects re-couple the cone = the anti-pattern this forbids. Honest boundary: a re-run test with changed behavior may have a stale expected value; the lens surfaces "re-run", never rewrites the expectation (no-engine) | `lens/effect.dag` B-5 block (+corollary) + `lens/affected_set.dag` Ex.R1/Ex.R1' |
| **#3153-subsumed** | `v4-affected-set-design` (#3153, no worker) is **superseded by this branch** (operator 2026-05-15): its 4 worked-examples + adversarial R1/R2/R3 + dogfood-reality are folded into `lens/affected_set.dag`'s header as the T-21 design contract, reconciled to the now-*encoded* reciprocal contracts — Ex.R1→B-5 (`effect.dag`), Ex.R2→B-4 (`04_infer.dag`), Ex.R3→B-3 (the drafted #3157 B1-CANON point-3 correction). #3153 carried no new file/type; close it as superseded | `lens/affected_set.dag` WORKED EXAMPLES header section |
| **B-5** | affected_set R1 usefulness contract (side-session 2026-05-15). For purity-aware skipping to be *useful* (not merely correct), effect must be a **per-`Arrow`-Node fact** derived from that node's signature (the B3 authority) and **never aggregated to a coarser unit** (one ambient `IO`, per-module effect set) — a coarse aggregate is the parallel taxonomy B3 forbids (P2) *and* degrades R1 to "re-run ~everything" (still correct/fail-closed, useless). A **granularity invariant**, not effect-lens strength (effects are READ off the signature per B3 ⇒ strong by construction; the only risk is coarse modeling — this forbids collapsing the per-effect-KIND distinction the signature already carries). No new field. = #3153 Ex.R1, now encoded. **Corollary (effects-as-parameters, 2026-05-16):** effects are threaded as explicit parameters (DI-by-construction); a mock-injected unit test's B-4 edge points at the mock `Node`, so affected_set skips it and re-runs only real-carrier (integration) tests *automatically* — "affected" is consumer-relative with no unit/integration mode in the lens. Ambient/global effects re-couple the cone = the anti-pattern this forbids. Honest boundary: a re-run test with changed behavior may have a stale expected value; the lens surfaces "re-run", never rewrites the expectation (no-engine) | `lens/effect.dag` B-5 block (+corollary) + `docs/design-affected-set-lens.md` worked examples |
| **#3153-subsumed** | `v4-affected-set-design` (#3153, no worker) is **superseded by this branch** (operator 2026-05-15): its 4 worked-examples + adversarial R1/R2/R3 + dogfood-reality are retained as the prose design authority in `docs/design-affected-set-lens.md`; `lens/affected_set.dag` owns only the terse machine-readable T-21 carrier/read surface under the strict de-prose rule. The design contract is reconciled to the now-*encoded* reciprocal contracts — Ex.R1→B-5 (`effect.dag`), Ex.R2→B-4 (`04_infer.dag`), Ex.R3→B-3 (the drafted #3157 B1-CANON point-3 correction). Practice-4 coproduct classification: `ExclusionProof` is 🟡 scaffold; named trigger = promote or dissolve when the T-21 read body and `.dag` TestClaims prove the exclusion evidence cases. #3153 carried no new file/type; close it as superseded | `docs/design-affected-set-lens.md` + `lens/affected_set.dag` carrier surface |

This comment was marked as resolved.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: c3e1324a · Trigger: manual
  • Comparison: main @ 75f98aaa ... session/gentle-hawk-97 @ c3e1324a
  • Conversation: View conversation

1. Story of the diff

This PR converts src/v4/lens/affected_set.dag from a prose-heavy design scaffold into a terse modeled carrier surface. The long worked examples and dogfood commentary are removed from the .dag file, while src/v4/DECISIONS.md:50-51 repoints the design authority to docs/design-affected-set-lens.md and records the important constraints that still govern the eventual body: B-5 per-Arrow effect granularity, B-4 node-precise Symbol equality, cache-dual behavior keyed by content_hash, and rejection of a whole-program traversal scaffold. The .dag file now owns a compact (Dag, Diff) -> Witness<ReExecFrontier> read surface: it imports Map, Diff, Node, Path, Symbol, and Witness at src/v4/lens/affected_set.dag:10-12, defines path/dimension-keyed rerun and exclusion receipts at src/v4/lens/affected_set.dag:26-47, and exposes the read contract at src/v4/lens/affected_set.dag:50-51.

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation). Compliant — this is substrate/modeling work, not Rust implementation; the diff keeps affected-set as a lens carrier/read surface over existing substrate facts (Diff, Node, Path, Symbol, Witness) rather than adding a Rust-side implementation path, as shown by src/v4/lens/affected_set.dag:10-12 and src/v4/lens/affected_set.dag:50-51.
  2. INVARIANTS.md + modeling-discipline.md. Compliant — Practice 9 / no-prose discipline is handled correctly: the .dag file keeps the four-line terse header at src/v4/lens/affected_set.dag:2-5, and the new coproduct has the required in-file 🟡 classification tag at src/v4/lens/affected_set.dag:32; the corresponding ledger/trigger lives in DECISIONS.md at src/v4/DECISIONS.md:51, matching the “emoji in file, decision-making in DECISIONS” discipline. chatgpt-review-2d3c6a66-219f-40…
  3. CODING.md. N/A — the diff does not add or refactor Rust implementation code under src/v3/compiler/src/; it is .dag modeling plus a DECISIONS row update.
  4. TESTING.md. Compliant — no executable body is added, so no new behavior test is required in this PR; the scaffold explicitly names .dag TestClaims as part of the dissolution condition at src/v4/lens/affected_set.dag:5, which is aligned with the project’s direction that tests become .dag TestClaim declarations rather than new Rust harnesses. chatgpt-review-3c88e3a3-5708-42…
  5. LOCKED DESIGN DECISIONS. Compliant — the diff does not silently diverge from a locked design; it updates the live decision record directly. src/v4/DECISIONS.md:50 preserves the B-5 per-Arrow effect granularity contract, and src/v4/DECISIONS.md:51 explicitly states that docs/design-affected-set-lens.md remains the prose design authority while lens/affected_set.dag owns only the terse carrier/read surface.
  6. TRACKED vs UNTRACKED DEBT. Compliant — the new scaffold is tracked: src/v4/lens/affected_set.dag:5 documents the scaffold and its dissolution trigger (“T-21 read body, CI use, and .dag TestClaims land”), while src/v4/DECISIONS.md:51 bounds the coproduct scaffold and names the promotion/dissolution trigger for ExclusionProof. This satisfies the P5 requirement that scaffolds carry explicit dissolution paths. chatgpt-review-85a41627-5e92-43…

2.5. Top-down PM intent review

Compliant. The high-level intent is preserved: affected-set remains an early structural lens for incremental/CI re-execution, not a shell/script or Rust implementation detour. The diff keeps the PM-relevant semantic commitments in the authority layer: B-5 says effects remain per-Arrow facts and never coarse ambient aggregates at src/v4/DECISIONS.md:50; B-4/B-5 consumption is carried into the terse .dag header at src/v4/lens/affected_set.dag:2-5; and the actual read surface remains structural data returning Witness<ReExecFrontier> at src/v4/lens/affected_set.dag:50-51. I did not find a concrete diff-cited mismatch where a must-have target became optional, a scaffold became permanent, or handwritten implementation replaced the bootstrap/generated/data-authored direction.

3. Verdict

APPROVE. The PR is mostly a de-prose/modeling cleanup, and the resulting carrier surface keeps the affected-set contract line-citable, scaffold-bounded, and aligned with B-4/B-5. I did not find a diff-cited invariant violation that should block landing.

@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: c3e1324a · Trigger: schedule
  • Thinking: 294s wall

BLOCKING (1)

Root Cause

  • src/v4/lens/affected_set.dag frontier membership and skip receipts were split into two independently populated maps → model one authoritative per-key decision/outcome so inclusion and exclusion cannot diverge

⚠️ The prior comments are addressed, but the new frontier shape still admits contradictory rerun/exclusion state.

Comment thread src/v4/lens/affected_set.dag Outdated


type ReExecFrontier {
rerun: Map<ExclusionKey, ReExecNode>

This comment was marked as resolved.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: f422a230 · Trigger: manual
  • Comparison: main @ 75f98aaa ... session/gentle-hawk-97 @ f422a230
  • Conversation: View conversation

1. Story of the diff

This PR turns src/v4/lens/affected_set.dag from a prose-heavy design scaffold into a terse machine-readable carrier surface for the affected-set lens. The .dag file now owns the actual data shape: Dag, AffectedDimension, ExclusionKey, ExclusionProof, FrontierDecision, ReExecFrontier, and an AffectedSetRead.read: fn(Dag, Diff) -> Witness<ReExecFrontier> contract (src/v4/lens/affected_set.dag:15, :18, :26-28, :32-35, :44-47, :50-56). The prose design authority is moved into DECISIONS.md / docs/design-affected-set-lens.md, while the .dag header keeps only the terse scope/owns/consumes/status contract and explicitly names B-4 node-precise resolution and B-5 per-Arrow signature effects (src/v4/lens/affected_set.dag:2-5, src/v4/DECISIONS.md:50-51). This is the right direction structurally, but the new frontier carrier still has one substrate-level identity bug.

2. Invariant categories

  1. LAYER MODEL — Finding, BLOCKING. This is not implementation-only; it introduces cross-pass/lens carrier types. The model makes the frontier key authoritative by storing decisions in decisions: Map<ExclusionKey, FrontierDecision> (src/v4/lens/affected_set.dag:51) where ExclusionKey carries at: Path and dimension: AffectedDimension (src/v4/lens/affected_set.dag:27-28), but the decision payload independently carries arbitrary Node values via ReExecNode.node and ExclusionReceipt.node (src/v4/lens/affected_set.dag:22, src/v4/lens/affected_set.dag:39). That admits an illegal state: a map entry keyed to path P/dimension D whose value says rerun or exclude node Q. Boundary Discipline requires every fact to live in one authoritative place, and the modeling practices call out illegal-state representability and single-authority metadata as P2 concerns. chatgpt-review-78df5b34-af97-45…
  2. INVARIANTS.md + modeling-discipline.md — Finding, BLOCKING. Specific principle: illegal states unrepresentable / single-authority metadata. Quoted diff lines: src/v4/lens/affected_set.dag:27: at: Path, src/v4/lens/affected_set.dag:22: node: Node, src/v4/lens/affected_set.dag:39: node: Node, and src/v4/lens/affected_set.dag:51: decisions: Map<ExclusionKey, FrontierDecision>. The fix should make the key the only node/dimension authority: either the value is just Rerun / Excluded { proof }, with consumers deriving the node from (Dag, ExclusionKey.at), or the key itself becomes the typed node handle and the payload stops restating it. Relying on the future read body or Witness wrapper to keep two independently representable node identities aligned is behavioral enforcement, not API-level enforcement. chatgpt-review-2eb431ad-c6f9-4c…
  3. CODING.md — Compliant. No Rust implementation is added. Within the .dag surface, the diff follows the data-plus-function shape: type AffectedSetRead { read: fn(Dag, Diff) -> Witness<ReExecFrontier> } (src/v4/lens/affected_set.dag:55-56) rather than adding object-style behavior. The remaining issue is the modeled carrier shape, not Rust coding style. chatgpt-review-354e4b4a-6fee-40…
  4. TESTING.md — Compliant for this scaffold stage. The diff does not add tests, but it also does not add an executable read body; the scaffold status names .dag TestClaims as part of the dissolution trigger (src/v4/lens/affected_set.dag:5). Once the read body lands, the right test surface is behavior-driven .dag TestClaim coverage for key-authoritative frontier decisions and exclusion proofs. chatgpt-review-7153f71e-9e27-4e…
  5. LOCKED DESIGN DECISIONS — Compliant. The diff explicitly updates the decision authority instead of silently diverging: B-5 now points to docs/design-affected-set-lens.md for worked examples (src/v4/DECISIONS.md:50), and #3153-subsumed states that the design doc remains prose authority while lens/affected_set.dag owns only the terse carrier/read surface (src/v4/DECISIONS.md:51). The .dag header consumes B-4/B-5 rather than re-narrating them (src/v4/lens/affected_set.dag:2-5).
  6. TRACKED vs UNTRACKED DEBT — Compliant for the explicit scaffold; not a waiver for the finding. The scaffold has documentation, bounds, and a named dissolution trigger: Status: scaffold; dissolves when T-21 read body, CI use, and .dag TestClaims land (src/v4/lens/affected_set.dag:5). The yellow ExclusionProof coproduct also has an explicit trigger in DECISIONS.md (src/v4/DECISIONS.md:51) and the .dag file keeps the required one-line coproduct tags (src/v4/lens/affected_set.dag:32, src/v4/lens/affected_set.dag:44). The duplicate node identity above is not presented as debt, so it should be fixed now rather than carried forward. chatgpt-review-78df5b34-af97-45…

2.5. Top-down PM intent review

Finding, same BLOCKING issue as above. The authority line says the eventual AffectedSetRead.read must prune at unchanged/pure content_hash boundaries, avoid whole-program traversal, and treats FrontierDecision as the per-ExclusionKey outcome (src/v4/DECISIONS.md:51). The carrier then allows that per-key outcome to carry a different node through ReExecNode.node or ExclusionReceipt.node while the enclosing map key already identifies the path/dimension (src/v4/lens/affected_set.dag:22, src/v4/lens/affected_set.dag:39, src/v4/lens/affected_set.dag:51). That weakens the PM-level “node-precise minimal frontier” intent into a convention future workers must remember, instead of a shape the carrier enforces.

3. Verdict

REQUEST_CHANGES. The de-prose pass and authority split are good, and the scaffold is properly tracked, but the new frontier carrier is substrate-level and currently admits inconsistent node identity between the map key and decision payload. Make the key/handle authoritative before downstream CI, cache, or TestClaim consumers build on this shape.

@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: ca72b68c · Trigger: schedule
  • Thinking: 181s wall

Non-blocking — Strengths

  • src/v4/lens/affected_set.dag The new per-key FrontierDecision shape fixes the prior split-authority frontier concern cleanly.

ROADMAP — Verified

  • ci_uses_affected_set_selection: docs/r3-program-plan.md row 103 records the affected-set CI selection lane as CONSUMER_LANDED plus PASSING, and this PR does not dilute that lane.

✅ The prior blockers are resolved and I found no new blocking concern in the changed lines.

@briansrls
briansrls merged commit ce02410 into main May 18, 2026
7 checks passed
briansrls added a commit that referenced this pull request May 18, 2026
…P-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>

@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: 35baa579 · Trigger: schedule
  • Thinking: 131s wall

Non-blocking — Strengths

  • src/v4/lens/affected_set.dag The Map<ExclusionKey, FrontierDecision> carrier is a clean single-authority shape for per-path, per-dimension frontier decisions.

ROADMAP — Verified

  • ci_uses_affected_set_selection: docs/r3-program-plan.md row 103 remains CONSUMER_LANDED + PASSING, and this PR preserves that affected-set selection lane.

✅ No blocking concerns in the changed lines.

briansrls added a commit that referenced this pull request May 18, 2026
* 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>
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