Repository navigation
IB-2 T-21 lens/affected_set.dag — (Dag,Diff)→Witness<ReExecFrontier>; B-4 node-precise resolution; B-5 per-Arrow effect granularity - #3210
Conversation
|
Review metadata
1. Story of the diffThis PR adds the v4 affected-set lens surface in 2. Invariant categories
2.5. Top-down PM intent reviewCompliant. At the PM intent level, this preserves the plan rather than diluting it: it adds a 3. VerdictAPPROVE. The diff is small and substrate-facing, but it is careful about authority boundaries: |
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
875b2524· Trigger:schedule - Thinking:
237s wall
BLOCKING (1)
Root Cause
src/v4/lens/affected_set.dagReExecFrontier 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.
| } | ||
|
|
||
|
|
||
| // AffectedSetRead — machine-readable shape of the T-21 lens read. |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
4025edc4· Trigger:schedule - Thinking:
246s wall
Non-blocking — Strengths
src/v4/lens/affected_set.dagThe 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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
fb78cdb3· Trigger:schedule - Thinking:
134s wall
✅ No blocking concerns in the affected-set lens surface.
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
a0060245· Trigger:schedule - Thinking:
256s wall
Non-blocking — Strengths
src/v4/lens/affected_set.dagThe 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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
9d3458a5· Trigger:schedule - Thinking:
130s wall
✅ No blocking concerns in this .dag model change.
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
c16132a7· Trigger:schedule - Thinking:
256s wall
Non-blocking — Strengths
src/v4/lens/affected_set.dagThe .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.
|
Operator audit attestation (updated for head
Validation: — sent from gentle-hawk-97 |
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
09e5d608· Trigger:schedule - Thinking:
262s wall
Non-blocking — Strengths
src/v4/lens/affected_set.dagThe 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.
|
Review metadata
1. Story of the diffThis PR collapses 2. Invariant categories
2.5. Top-down PM intent reviewCompliant. The PM-level intent appears preserved: the diff explicitly makes this file the “canonical affected-set authority for CI/incremental re-execution” ( The only caveat is the scaffold-trigger wording above; it is a tracking gap, not a semantic dilution of the affected-set target. 3. VerdictAPPROVE_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. |
|
Review metadata
1. Story of the diffThis PR collapses 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 2. Invariant categories
Compliant — this touches v4
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 Also compliant on fail-closed/single-authority shape: the new read returns
Compliant — although this is
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
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
Compliant — the only new temporary shape is explicitly labeled 2.5. Top-down PM intent reviewCompliant — the PR preserves the PM-level intent that affected-set selection become a structural 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 3. VerdictAPPROVE — I found no diff-citable findings. This is a narrow de-prosing/scaffold PR, but the remaining contract is typed, finite, fail-closed through |
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
6457c41b· Trigger:schedule - Thinking:
259s wall
BLOCKING (1)
Root Cause
src/v4/lens/affected_set.dagReExecFrontier 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.
|
|
||
|
|
||
| type ReExecFrontier { | ||
| rerun: List<ReExecNode> |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
8bc0e15d· Trigger:schedule - Thinking:
243s wall
BLOCKING (1)
Root Cause
src/v4/lens/affected_set.dagThe carrier preservesAffectedDimensiononly for exclusions while the read surface collapses all positive affectedness intoPathmembership → make rerun membership dimension-keyed/carrying or expose a dimension-parameterized read result.
|
|
||
| type AffectedSetRead { | ||
| read: fn(Dag, Diff) -> Witness<ReExecFrontier> | ||
| } |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
7b6d108e· Trigger:schedule - Thinking:
222s wall
Non-blocking — Strengths
src/v4/lens/affected_set.dagThe 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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
d1d99350· Trigger:schedule - Thinking:
184s wall
BLOCKING (1)
Root Cause
src/v4/DECISIONS.mddesign-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.
| | **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.
This comment was marked as resolved.
Sorry, something went wrong.
|
Review metadata
1. Story of the diffThis PR converts 2. Invariant categories
2.5. Top-down PM intent reviewCompliant. 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- 3. VerdictAPPROVE. 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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
c3e1324a· Trigger:schedule - Thinking:
294s wall
BLOCKING (1)
Root Cause
src/v4/lens/affected_set.dagfrontier membership and skip receipts were split into two independently populated maps → model one authoritative per-key decision/outcome so inclusion and exclusion cannot diverge
|
|
||
|
|
||
| type ReExecFrontier { | ||
| rerun: Map<ExclusionKey, ReExecNode> |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
|
Review metadata
1. Story of the diffThis PR turns 2. Invariant categories
2.5. Top-down PM intent reviewFinding, same BLOCKING issue as above. The authority line says the eventual 3. VerdictREQUEST_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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
ca72b68c· Trigger:schedule - Thinking:
181s wall
Non-blocking — Strengths
src/v4/lens/affected_set.dagThe 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.
…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
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
35baa579· Trigger:schedule - Thinking:
131s wall
Non-blocking — Strengths
src/v4/lens/affected_set.dagThe 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.
* 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>
Summary
src/v4/lens/affected_set.dag.Dag = Nodeas an alias-role for the graph input, avoiding a second graph substrate.ReExecNode { at: Path, node: Node },ReExecFrontier { rerun: List<ReExecNode> }, andAffectedSetRead { read: fn(Dag, Diff) -> Witness<ReExecFrontier> }.Diff/Path, B1content_hash, B-4 Symbol-equality resolution, and B-5 per-Arrow effect granularity.Review Fixes
Set<Node>withList<Node>forReExecFrontier.rerunso the carrier honestly represents a finite frontier instead of relying onSet<T>, which intentionally admits arbitrary subsets.ReExecNode { at: Path, node: Node }so frontier entries preserve D1 occurrence/path identity and downstream consumers do not rediscover the affected position from a bareNode.Verification
cargo run -p v2-compiler -- compile --source-root src/v4 --output-dir /tmp/gunbc-v4-affected-check --target dagcompiled: 1 files emitted, 0 diagnosticsgit diff --check