From 06e6902231504226ca5c4048a389b04c084b51b7 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 7 May 2026 01:22:01 -0400 Subject: [PATCH] =?UTF-8?q?WIP:=20R3=20Debt-Paydown=20wave=201=20=E2=80=94?= =?UTF-8?q?=20ROADMAP=20receipt-closure=20sweep=20(already-retired?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ROADMAP.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 419fd33c234..373f194ac54 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -422,7 +422,7 @@ Tracked debt not dispatched with the 2026-04-21 lane wave (Lane 1e P3.0, SG-2c-4 - **`container_template_algebra_rows` string table is duplicate authority**: `dsl/std/types.dag:133-146` declares the renamed map (PR #651 collapsed both consumers onto a single `container_template_algebra` query); rows still duplicate the authoritative type aliases at `:211-213` (`type List = FreeMonoid`, etc.) across Pascal/snake spellings plus algebra self-identities. Dissolution trigger: when `.dag` gains alias reflection, the rows derive from the aliases directly and the hand-maintained table goes away. P2 Boundary Discipline / P1 receipt. Owner: unassigned; small scope. - **Emitter render-helper consolidation (Phase 3.1 candidate after 1e P3.0)**: `named_variant_id` / `render_named_template` / `primitive_type_id_for_port` / `walk_to_disj` / `algebra_field_for_operator` exist 3-5× across `src/v3/compiler/src/emit.rs` + `emit/python_target.rs` + `emit/rust_target.rs` (plus `walk_to_disj_decl` also in `lower.rs` and `infer.rs`). Collapse into one emitter-shared module. Different scope from 1e P3.0 which targets `behavior_result_port` / `port_is_consumed_from`; this is the render-side tranche. P2 Boundary Discipline receipt. Owner: queued behind 1e P3.0 as the natural follow-up. -- **Stale §-style and line-number cross-references to pre-rewrite `INVARIANTS.md` — Retired (T-Receipts W1 + Slice A #1795 + Slice B #1801 + Slice C #1820).** The ledger-named refs in `docs/design-db16-refined-generic-substitution.md`, `docs/perf/clone-elimination.md`, `docs/lane2-compile-time-proofs.md`, `src/v3/M1_DESIGN.md`, `src/v3/SELF_HOSTING.md`, `docs/history/sg-4b-1-fix-declaration-lookup-cleanup.md`, and `docs/briefs/p0-bug-no-profile-sentinel.md` were retired by W1. **Slice A (#1795)** replaced `§P{1..5}` header-quote refs repo-wide with stable principle anchors. **Slice B (#1801)** retired 43 anchor-mapped refs across 16 files (numeric line-cites + named-section §-refs). **Slice C (#1820)** retired the remaining `§P1`-style process-reference cites and named-section `§"…"` refs to subdoc-homed invariants (`§"Layer opacity"` → `docs/invariants/layer-opacity.md`; `§"Decidability"` → `INVARIANTS.md#p4-decidability`; `§"Facts Flow Forward"` → `docs/invariants/performance-invariant.md`; `§"No short-term solutions"` → `docs/invariants/no-short-term-solutions.md`; `§"Minimal information per interface"` → `docs/invariants/minimal-information-per-interface.md`) across `docs/substrate-reflection-design.md`, `docs/thesis/compositional-layering.md`, `docs/thesis/two-groundings-static-validation-vs-efficient-realization.md`, `docs/inference-as-data-experiments.md`, `docs/parallelism-design.md`, `docs/v3-validation-experiments.md`, `docs/lens-library-design.md`, `docs/dependency-and-rendering-design.md`, and the four §P1-residual brief files (`r2-pb-canonical-lens-bridge-disposition.md`, `r3-pb-binshim-retirement-worker.md`, `r3-pb-t-fixedpoint-worker.md`, `r3-pb-runtime-equivalence-corpus-seed-audit.md`) plus `r3-pb-binshim-row-1-decision-packet.md`, `r3-v-l5-corpus-readiness-audit.md`. **Intentionally retained (out of dispatch scope):** §"No bridges" in `substrate-reflection-design.md:1663` (live design ref, not stale); forward-looking proposed-entry §-refs in `substrate-reflection-design.md` (§"Bounded substrate seed", §"Lenses are substrate declarations", §"Every dependency is a substrate fact") that describe entries to land. 3-slice retirement program closed; Q-Slice-C-Retirement-Receipt resolves. +- **RETIRED via #1795 + #1801 + #1820 (2026-05-06)** — **Stale §-style and line-number cross-references to pre-rewrite `INVARIANTS.md` — Retired (T-Receipts W1 + Slice A #1795 + Slice B #1801 + Slice C #1820).** The ledger-named refs in `docs/design-db16-refined-generic-substitution.md`, `docs/perf/clone-elimination.md`, `docs/lane2-compile-time-proofs.md`, `src/v3/M1_DESIGN.md`, `src/v3/SELF_HOSTING.md`, `docs/history/sg-4b-1-fix-declaration-lookup-cleanup.md`, and `docs/briefs/p0-bug-no-profile-sentinel.md` were retired by W1. **Slice A (#1795)** replaced `§P{1..5}` header-quote refs repo-wide with stable principle anchors. **Slice B (#1801)** retired 43 anchor-mapped refs across 16 files (numeric line-cites + named-section §-refs). **Slice C (#1820)** retired the remaining `§P1`-style process-reference cites and named-section `§"…"` refs to subdoc-homed invariants (`§"Layer opacity"` → `docs/invariants/layer-opacity.md`; `§"Decidability"` → `INVARIANTS.md#p4-decidability`; `§"Facts Flow Forward"` → `docs/invariants/performance-invariant.md`; `§"No short-term solutions"` → `docs/invariants/no-short-term-solutions.md`; `§"Minimal information per interface"` → `docs/invariants/minimal-information-per-interface.md`) across `docs/substrate-reflection-design.md`, `docs/thesis/compositional-layering.md`, `docs/thesis/two-groundings-static-validation-vs-efficient-realization.md`, `docs/inference-as-data-experiments.md`, `docs/parallelism-design.md`, `docs/v3-validation-experiments.md`, `docs/lens-library-design.md`, `docs/dependency-and-rendering-design.md`, and the four §P1-residual brief files (`r2-pb-canonical-lens-bridge-disposition.md`, `r3-pb-binshim-retirement-worker.md`, `r3-pb-t-fixedpoint-worker.md`, `r3-pb-runtime-equivalence-corpus-seed-audit.md`) plus `r3-pb-binshim-row-1-decision-packet.md`, `r3-v-l5-corpus-readiness-audit.md`. **Intentionally retained (out of dispatch scope):** §"No bridges" in `substrate-reflection-design.md:1663` (live design ref, not stale); forward-looking proposed-entry §-refs in `substrate-reflection-design.md` (§"Bounded substrate seed", §"Lenses are substrate declarations", §"Every dependency is a substrate fact") that describe entries to land. 3-slice retirement program closed; Q-Slice-C-Retirement-Receipt resolves. - **`Strict Forward Progress` subdoc ↔ heading drift**: pre-existing inconsistency between `docs/invariants/strict-forward-progress.md` (bounded-execution content) and the reviewer-usage meaning of the SFP rule name (dissolution-progress). Flagged explicitly in both P4 and P5 of INVARIANTS.md post-#620 as future cleanup. Dissolution: either rename the subdoc to reflect its bounded-execution content (and author a new dissolution-progress subdoc), or split the subdoc into two. Small scope once the design call is made on naming. Owner: unassigned. - **v3 lens capability honesty pass (supersedes the complexity-receipt lane as originally scoped)**: the 2026-04-21 audit (see [docs/v3-lens-capability-register.md](docs/v3-lens-capability-register.md)) found that `src/v3/lenses/complexity.dag` does not subsume v2's `complexity.dag` — v2 produces symbolic `CostExpr` / `SizeExpr` with work/span/certainty/asymptotic-class, v3 produces a single integer depth per port. The same pattern holds for `cost.dag` (PROXY — no named size variables, Dimension wiring deferred), `idempotency.dag` (STUB — Rust oracle), and `parallelism.dag` (STUB — fail-closed placeholder). The originally-claimed "~13× LOC reduction with structurally stronger fail-closed guarantees" was comparing different functions of the program; retracted. **Follow-up work:** (1) the cementing-test discipline generalizes from one lens to every `regen.dag` entry (semantic-equality goldens per lens); (2) `docs/briefs/complexity-v2-v3-comparison-receipt.md` to be rewritten against the register — scope widens from "complexity receipt + registry rename" to "Band C honesty pass" once the register is merged. Substrate dissolution path: port `DescentEvidence` / `CallPattern` / `SubValueRelation` into the v3 substrate, wire per-call producers, and keep the E-M receipt that `MethodSemantics` is structurally subsumed rather than ported. Emit dissolution path: `match` lowering over user-defined sums (currently blocks `.dag` authority for idempotency + parallelism). Both are programs of work, not single lanes. Owner: unassigned; brief rewrite queues for after the 2026-04-21 wave's 5 lanes land and this register is in tree. - **Substrate carrier port program (scopes the "substrate dissolution path" half of the honesty pass above)**: design doc at [docs/design-substrate-carrier-port-program.md](docs/design-substrate-carrier-port-program.md) (2026-04-22). Decomposes the `DescentEvidence` / `CallPattern` / `SubValueRelation` / per-call producer work, with the `MethodSemantics` lane now **closed via M-b structural subsumption**. T/C/I port the carrier *types*; **E-P** has landed the first side-table producer slice (`v3_compiler::dag::per_call_descent_evidence`) for recursive self-call / arithmetic-descent evidence while leaving `TransformNode` unwidened. Full carrier parity still requires cost/complexity consumer wiring and same-source v2/v3 cementing. **E-M receipt:** v3 has no `ExprMethodCall` side slot; v2 `PlainMethodSemantics`, `AlgebraMethodSemantics`, and `ServiceMethodSemantics` map to `TransformTarget::{Callable, FieldProject, Operator}` plus typed declaration/effect metadata, so no ported `MethodSemantics` carrier or Rust mirror is added. Related: per-method metadata surface from `*_templates()` in `dsl/std/algebra.dag` (surfaced by Lane G / PR #654) — **§6a design call is closed** at [`docs/design-substrate-carrier-port-program.md` §6a](docs/design-substrate-carrier-port-program.md) (**Option 3** unified `MethodContract`; live receipt: `src/v3/std/algebra.dag`, `src/v3/lenses/cost.dag`). R2 program ledger: [`docs/r2-structure.md`](docs/r2-structure.md) Goal 5 (pick closed; follow-through per `docs/briefs/r2-release-6a-follow-through-worker.md`). Not part of the core four-carrier port. Closes **method carrier-parity** framing for `cost.dag` + `complexity.dag` at the structural **pick**; full `BEHAVIORALLY COMPLETE` for `cost.dag` additionally requires E-P consumer wiring and the register's separate non-carrier blockers (`Dimension` grammar/data-body wiring, named `SizeVariable` value semantics) that are outside this program, and opens P4 Decidability progress. Does NOT touch the emit-gap half (idempotency / parallelism); that stays in the receipt-closure wave. Owner: unassigned; remaining carrier-program work is E-P consumer/cementing plus the separately tracked non-carrier blockers. @@ -485,13 +485,13 @@ Three distinct reflective/exploratory analyses ran against `main@7f74f09` and `m - **`src/v3/std/` vs `dsl/std/` duplicate-modules checklist undercounts live duplications** (**CHECKLIST EXTENDED** — same `:368` rank-bridge tracking): the file-preference rank bridge at `dag.rs::declaration_name_preference_rank` + `lower.rs::collect_symbols` documents the convergence checklist (see doc comments at those sites for current line anchors). **2026-04-26:** extended the in-source checklist with `std.computation`, `std.induction`, and `std.termination` (`dsl/std/*` ↔ `src/v3/std/*`), closing the undercount left open by exploratory Finding 5 in the PR #809 debt wave (checklist previously listed only `std.effects`, `std.verification`, and the embedded `http_path` mirror). **Remaining dissolution trigger** is unchanged: when every listed duplicate pair converges to a single canonical home, delete the rank scaffold per the comments' shared trigger. Adjacent to `:394` compiler-std consolidation. Surfaced by Exploratory Analysis 2026-04-25 (gpt-5-5-pro Finding 5). P2 Boundary Discipline. Owner: R2 Release Manager B6 dispatch. -- ~~**Go branch emission fabricates `UnknownVariant` instead of failing closed** (NOVEL): historical row described `src/v3/compiler/src/emit.rs` Go branch rendering fabricating `"UnknownVariant"` when `variant_parent_info` could not find a parent `Disj` for `BranchPattern::ResolvedVariant(id)`.~~ **RESOLVED — PR #820**: Go branch emission now returns typed `EmitError::VariantParentNotFound { variant_id }` on missing variant-parent info instead of falling back to declaration name or `"UnknownVariant"`, and regression coverage asserts the missing-parent case. P3 Fail-Closed / C-6 / C-9 receipt. +- **RETIRED via #820 (2026-04-26)** — ~~**Go branch emission fabricates `UnknownVariant` instead of failing closed** (NOVEL): historical row described `src/v3/compiler/src/emit.rs` Go branch rendering fabricating `"UnknownVariant"` when `variant_parent_info` could not find a parent `Disj` for `BranchPattern::ResolvedVariant(id)`.~~ **RESOLVED — PR #820**: Go branch emission now returns typed `EmitError::VariantParentNotFound { variant_id }` on missing variant-parent info instead of falling back to declaration name or `"UnknownVariant"`, and regression coverage asserts the missing-parent case. P3 Fail-Closed / C-6 / C-9 receipt. - **Lens fold execution: undeclared fallback structure + file-path semantics** (NOVEL): `src/v3/compiler/src/lens_apply.rs` has two ad-hoc decisions in the fold path. (i) `find_fold_step_bind_via_instantiation` at `:105-148` says it doesn't use span-overlap recovery, but DOES collect a callable-bind fallback if not in template formals and returns it if exactly one exists — uniqueness heuristic that lets a structurally missing edge produce a step closure. (ii) The interpreter special-cases folds by source file suffix at `:22-39` + `:372-383` — skips the monomorphized `std.list.fold` fast path when `SourceSpan.file` ends with `"std/algebra.dag"`. Comments are honest about the scaffold; live semantics still depend on file-path string + ambiguous unique-candidate fallback. **Dissolution trigger**: remove the ambiguous fallback (require the template-formal edge to identify the callable); dissolve the file-suffix helper by carrying a structural "R1-certified fold shape" or explicit step operand through lowering. Surfaced by Exploratory Analysis 2026-04-25 (gpt-5-5-pro Finding 2). P1 Modeling Faithfulness + P2 Boundary Discipline. Owner: unassigned; M scope. - ~~**`lower_fn_body_into_existing_decl` defensive Arrow re-derive after seed failure** (NOVEL): historical row described a defensive-fallback path that re-derived an Arrow signature when seed_function_signatures_phase didn't produce one. Original line citations referenced an analysis snapshot's aggregate-numbering scheme, not live `lower.rs` line numbers — the cited `3572-3611` does not correspond to the live file.~~ **RESOLVED — flagged stale 2026-04-30 by Exploratory Analysis (gpt-5-5-thinking) + verified on PR #1319 review (cursor `9d2dffbc`)**: the symbol `lower_fn_body_into_existing_decl` no longer exists in current `src/v3/compiler/src/lower.rs` (7919 lines total); the equivalent live path is `lower_fn_item_expr_body` declared at `:4410+`, with the non-Arrow arm at `:4433-4451` reporting `Diagnostic::ResolveError` (named "violated lowering invariant: seed_function_signatures_phase did not produce an Arrow connective for this Fn") and returning `outer_scope` — exactly the fail-closed shape this row originally asked for. No current source finding; row preserved for receipt audit. -- **`patch_lower_helpers_generated_type_alias_refinement` exact-string patching retired** (**RESOLVED 2026-04-27**, PB Tier 2 / B7): PR #1014 deleted the fragile `patch_lower_helpers_generated_type_alias_refinement` helper, its unit test, the `regen_lens` lower-helpers special case, and the SG-6 emitted-module patch special case. Generated `lower_helpers` now emits the type-alias `refinement` field natively; `rg patch_lower_helpers_generated_type_alias_refinement src/v3/compiler` is empty, and #1014 passed `fmt`, `ci`, `v3`, and `self_host_ratchet`. No SG-0 file-list delta; bridge LOC decreased. Surfaced originally by Reflective Analysis 2026-04-25 (Risk 5) as P5 Progress Is Dissolution. +- **RETIRED via #1014 (2026-04-27)** — **`patch_lower_helpers_generated_type_alias_refinement` exact-string patching retired** (**RESOLVED 2026-04-27**, PB Tier 2 / B7): PR #1014 deleted the fragile `patch_lower_helpers_generated_type_alias_refinement` helper, its unit test, the `regen_lens` lower-helpers special case, and the SG-6 emitted-module patch special case. Generated `lower_helpers` now emits the type-alias `refinement` field natively; `rg patch_lower_helpers_generated_type_alias_refinement src/v3/compiler` is empty, and #1014 passed `fmt`, `ci`, `v3`, and `self_host_ratchet`. No SG-0 file-list delta; bridge LOC decreased. Surfaced originally by Reflective Analysis 2026-04-25 (Risk 5) as P5 Progress Is Dissolution. - **Filename / sentinel bridges in `test_runner.rs`** (NOVEL — class-of-pattern row): `src/v3/compiler/src/test_runner.rs` carries multiple file-path / fixture-name / sentinel bridges as identity references: fixture filename → bind name mapping; `PROGRAM_INPUT_SENTINEL = "r1_lens_output_input_from_program"`; `include_str!("../lenses/named_function_count.dag")` as canonical lens side-channel; `EXTDEPS_BOOTSTRAP_FIXTURES` manually listing currently-loadable extdeps surface; `fold_site_skips_d1_monomorph_list_fold_path` using a path suffix. Each instance is locally explainable; together they show **the same missing substrate fact: identity and role references not yet carried structurally enough for consumers**. **Dissolution trigger**: replace fixture-filename routing + `PROGRAM_INPUT_SENTINEL` with structural references (`DeclarationRef`; explicit input value carriers; bind/output identity in the claim itself; resource/materialization records). Surfaced by Reflective Analysis 2026-04-25 (Pattern 3 + Risk 4) + Exploratory 2026-04-25. P2 Boundary Discipline (string/name/path as temporary identity). Owner: unassigned; M scope. @@ -553,11 +553,11 @@ Surfaced by paired Exploratory Analysis (gpt-5-5-pro main@8cd5359; 9 findings ag - **SubValueRelation claims `BoundedLattice` but `meet(top, a) = a` law violated** (sharpened from already-tracked hand-rolled-lattice row at ROADMAP:362-365): `src/v3/std/induction.dag:372-376` claims `top = PreservedValue` (meet identity), `bottom = SubValueUnknown`, but `src/v3/std/induction.dag:281-288` implements `meet(PreservedValue, b) = PreservedValue` for any non-unknown `b` — the law `meet(top, a) = a` requires returning `b`, not `top`. Concrete counterexample: `meet_sub_value(PreservedValue, StrictSubValue { ... })` returns `PreservedValue` instead of `StrictSubValue`. Downstream consumers reading "this is a `BoundedLattice`" get false algebraic guarantees. **Dissolution**: either add a real top element, weaken the claim to a semilattice/partial-merge structure, or change ordering so implemented meet/join satisfy declared laws. **Stop claiming `BoundedLattice` until law holds.** Surfaced 2026-05-01 (Exploratory Finding 2). Owner: R3 Substrate (fix substrate or weaken claim) + R3 Verification (`bounded_lattice_meet_top_identity_witness` for any T claiming `BoundedLattice`). -- **Emitter `as_bind().expect()` panic paths violate fail-closed boundary** (NOVEL — **RETIRED 2026-05-03 by PR #1548**): 6 sites in `src/v3/compiler/src/emit.rs:2157-2166` + `:2205-2214`, `src/v3/compiler/src/emit/rust_target.rs:4475-4485` + `:4569-4579`, `src/v3/compiler/src/emit/python_target.rs:1307-1316` + `:1383-1392` used `as_bind().expect("UserDefined arrow body must point at a Bind")`. **Dissolution chosen**: the stronger state-space-vs-behavioral-invariants path — `ArrowBody::UserDefined` now carries a typed `BindNodeId` witness (`src/v3/compiler/src/dag.rs:113`) that cannot point at non-Bind behavior variants. All six sites consume `(*bind_id).bind(self.dag)` (and the guarded `rust_target.rs:2503` site uses `.bind_opt(dag)` returning a typed `EmitError::MalformedUserDefinedCallable`). Local typed-error shape was **rejected** at design split (#1337-comment-4364992875 / #1134-comment-4364994796) as parallel-representation debt against the substrate fix. Surfaced 2026-05-01 (Exploratory Finding 8). Receipt: PR #1548 (`0427f96f7`). Owner closure: R3 Substrate. +- **RETIRED via #1548 (2026-05-03)** — **Emitter `as_bind().expect()` panic paths violate fail-closed boundary** (NOVEL — **RETIRED 2026-05-03 by PR #1548**): 6 sites in `src/v3/compiler/src/emit.rs:2157-2166` + `:2205-2214`, `src/v3/compiler/src/emit/rust_target.rs:4475-4485` + `:4569-4579`, `src/v3/compiler/src/emit/python_target.rs:1307-1316` + `:1383-1392` used `as_bind().expect("UserDefined arrow body must point at a Bind")`. **Dissolution chosen**: the stronger state-space-vs-behavioral-invariants path — `ArrowBody::UserDefined` now carries a typed `BindNodeId` witness (`src/v3/compiler/src/dag.rs:113`) that cannot point at non-Bind behavior variants. All six sites consume `(*bind_id).bind(self.dag)` (and the guarded `rust_target.rs:2503` site uses `.bind_opt(dag)` returning a typed `EmitError::MalformedUserDefinedCallable`). Local typed-error shape was **rejected** at design split (#1337-comment-4364992875 / #1134-comment-4364994796) as parallel-representation debt against the substrate fix. Surfaced 2026-05-01 (Exploratory Finding 8). Receipt: PR #1548 (`0427f96f7`). Owner closure: R3 Substrate. #### B. Exploratory findings — sharpened tracked items -- **`??` and `%` declared in dag-syntax authority but absent from v3 token/parser/operator surface — RESOLVED 2026-05-03 (Grounding parser-grammar slice)** (sharpened from operator-ontology-three-coexisting-authorities at ROADMAP:424-425): unsupported `dag_operators` rows for `??` (`NullCoalesce` binop) and `%` (`Mod` binop) were removed from `dsl/extdeps/languages/dag/syntax.dag`; the v3-supported `.dag` binary operator set is now exactly `||`, `&&`, comparisons, `+`, `-`, `*`, and `/`, with `|>` / `.` remaining tokenized parser forms whose `binop` is `none`. Regression coverage now requires every `dag_operators` row with a binary `binop` to have matching `TokenKind` coverage, a `BinaryOpRow` in `src/v3/compiler/parse_tables.dag`, and an `operators.dag::from_symbol` mapping; tokenizer authority also rejects parser-only shared operators. **Future scope:** reviving `%` or `??` is additive, not debt cleanup, and must land the full chain together (token + parse + `OperatorKind` + algebra-field/lowering/inference semantics) after the R3 Substrate operator-ontology decision. Surfaced 2026-05-01 (Exploratory Finding 4); resolved by deletion + executable cross-validation gate. +- **RETIRED via #1552 (2026-05-03)** — **`??` and `%` declared in dag-syntax authority but absent from v3 token/parser/operator surface — RESOLVED 2026-05-03 (Grounding parser-grammar slice)** (sharpened from operator-ontology-three-coexisting-authorities at ROADMAP:424-425): unsupported `dag_operators` rows for `??` (`NullCoalesce` binop) and `%` (`Mod` binop) were removed from `dsl/extdeps/languages/dag/syntax.dag`; the v3-supported `.dag` binary operator set is now exactly `||`, `&&`, comparisons, `+`, `-`, `*`, and `/`, with `|>` / `.` remaining tokenized parser forms whose `binop` is `none`. Regression coverage now requires every `dag_operators` row with a binary `binop` to have matching `TokenKind` coverage, a `BinaryOpRow` in `src/v3/compiler/parse_tables.dag`, and an `operators.dag::from_symbol` mapping; tokenizer authority also rejects parser-only shared operators. **Future scope:** reviving `%` or `??` is additive, not debt cleanup, and must land the full chain together (token + parse + `OperatorKind` + algebra-field/lowering/inference semantics) after the R3 Substrate operator-ontology decision. Surfaced 2026-05-01 (Exploratory Finding 4); resolved by deletion + executable cross-validation gate. - **`CollectionOps` / `StringOps` / `MapOps` duplicate algebra operation surfaces as target-string templates** (sharpened from language-fact-duplication / LanguageSpec-dual-authority at ROADMAP:365 + :424): `dsl/std/algebra.dag:301-326` declares `FreeMonoid` carrying `concat`, `empty`, `length`, `map`, `filter`, `fold`, `flat_map`, etc. as algebraic operations; `:328-349` declares `PartialFunction` carrying `lookup`, `empty`, `insert`, `merge`, `keys`, `values`. `dsl/std/languages.dag:281-318` then declares per-target `CollectionOps`, `StringOps`, `MapOps` records with `count: String` / `first: String` / `fold: String` / `empty_list: String` etc. — second operation ontology parallel to FreeMonoid + PartialFunction. **Dissolution**: realize operations should reference `DeclarationRef` / method contracts for algebra fields. Target templates can remain render-data, but identity is "realization of `FreeMonoid.fold` for Rust", not a second `fold: String` field. **Phase-1 partial (2026-05-03, v3 emit-model path):** `src/v3/std/emit_model.dag` `CollectionOps.fold` → `fold_contract: DeclarationRef` with named per-target `MethodTemplateContract` rows for `fold_method` (`docs/briefs/collectionops-algebra-reframe.md` carries the migration order for remaining `CollectionOps` fields, then `StringOps` / `MapOps` / `PartialFunction`, and defers touching `dsl/std/languages.dag` until v3 consumers are authoritative). **Phase-3 `map` (2026-05-05, v3 path):** `CollectionOps.map: String` → `map_contract: DeclarationRef` with per-target `MethodTemplateContract` carriers for `map_method` (`rust_language_spec_map_contract` / `python_language_spec_map_contract` / `go_language_spec_map_contract`). Like **fold**, Python/Go **omit** `map_method` from `{python,go}_method_template_contracts`: those lists feed the legacy `{arg}`/`NamedArg` projection; `map_contract` uses CollectionOps `{body}`/`{item}` (Python) or a stub (Go) — listing the same carrier would project the wrong shape into the legacy adapter. **Go stub dissolution trigger** (P5): `go_language_spec_map_contract` drops comment-placeholder templates (`/* map(...) */`) when Go emit resolves `map_contract` to real templates (e.g. `v2rt.Map`-family strings wired from this row in `emit/go_target.rs`); closure check: grep/`rg` finds no `/* map(` in `src/v3/std/go_method_template_contracts.dag` for that declaration. `filter` / `flat_map` / `any` / `all` + monoid ops remain contract-backed as before. **Remaining:** legacy literal fields (`contains`, `empty_list`, `list_literal`, `cons` on v3 `CollectionOps`, plus `StringOps` / `MapOps`); delete per emit_model dissolution comment once all render paths consume templates only through contract refs. Surfaced 2026-05-01 (Exploratory Finding 7). Owner: R3 Grounding (T-Ground-LanguageSpec + algebra method contracts). @@ -617,11 +617,11 @@ Three meta-themes surface across both analyses: Five novel-finding rows surfaced by the 2026-05-04 Exploratory + Reflective ingestion (Director routing per [#828 reply 4373106180](https://github.com/gunb-ai/gunbc/issues/828#issuecomment-4373106180)). Eight already-tracked findings from the same pass (F1, F3, F4, F6, F7, F8, F9, F10) confirm against existing rows in this section and are not duplicated. -- **F2 — `Result` / `DivError` partly `span.file`-keyed** *(retired 2026-05-04)*: remaining file-identity dispatch in `Result` / `DivError` paths violated P3/M8. Dissolution: replace with structural carrier reads. **Closed by [PR #1662](https://github.com/gunb-ai/gunbc/pull/1662)** (`9dce0689a`, `fix(v3): make Result and DivError recognition structural`). -- **F5 — `service` syntax authority vs parser hard-error** *(retired 2026-05-04)*: `dsl/extdeps/languages/dag/syntax.dag` and the parser hard-error path held parallel authority. Dissolution: one declares the other. **Closed by [PR #1664](https://github.com/gunb-ai/gunbc/pull/1664)** (`b8c9821a0`, `F5: deactivate v3 service parser authority`) — v3 service parser authority deactivated; `dsl/extdeps/languages/dag/syntax.dag` is the single declarer. -- **F11 — Diagnostic taxonomy mirror drift** *(retired 2026-05-04)*: 7-variant Rust mirror vs 10-variant `.dag` source. Dissolution: generated isomorphism / shape-report gate over the mirror. **Closed by [PR #1661](https://github.com/gunb-ai/gunbc/pull/1661)** (`4b156d839`). +- **RETIRED via #1662 (2026-05-04)** — **F2 — `Result` / `DivError` partly `span.file`-keyed** *(retired 2026-05-04)*: remaining file-identity dispatch in `Result` / `DivError` paths violated P3/M8. Dissolution: replace with structural carrier reads. **Closed by [PR #1662](https://github.com/gunb-ai/gunbc/pull/1662)** (`9dce0689a`, `fix(v3): make Result and DivError recognition structural`). +- **RETIRED via #1664 (2026-05-04)** — **F5 — `service` syntax authority vs parser hard-error** *(retired 2026-05-04)*: `dsl/extdeps/languages/dag/syntax.dag` and the parser hard-error path held parallel authority. Dissolution: one declares the other. **Closed by [PR #1664](https://github.com/gunb-ai/gunbc/pull/1664)** (`b8c9821a0`, `F5: deactivate v3 service parser authority`) — v3 service parser authority deactivated; `dsl/extdeps/languages/dag/syntax.dag` is the single declarer. +- **RETIRED via #1661 (2026-05-04)** — **F11 — Diagnostic taxonomy mirror drift** *(retired 2026-05-04)*: 7-variant Rust mirror vs 10-variant `.dag` source. Dissolution: generated isomorphism / shape-report gate over the mirror. **Closed by [PR #1661](https://github.com/gunb-ai/gunbc/pull/1661)** (`4b156d839`). - **F12 — `ExecuteCommand` / `ForAllTargets` duplicate command record**: two consumers carry parallel command-record fields. Dissolution: single typed command-record carrier consumed by both. Queued (R3 Verification, post-Row-4 + heuristic-cost audit). -- **R1 — `??` / `%` syntax authority deletion regression** *(retired 2026-05-04, fix-forward)*: P1/M3 regression on the prior PR #1552 deletion. Split path ratified — `dsl/extdeps/languages/dag/syntax.dag` retained as broader authority + new `v3_supported_dag_operators` subset. Dissolution trigger met (split landed AND v3-supported subset consumed by parse tables). **Closed by [PR #1663](https://github.com/gunb-ai/gunbc/pull/1663)** (`362755a7a`). +- **RETIRED via #1663 (2026-05-04)** — **R1 — `??` / `%` syntax authority deletion regression** *(retired 2026-05-04, fix-forward)*: P1/M3 regression on the prior PR #1552 deletion. Split path ratified — `dsl/extdeps/languages/dag/syntax.dag` retained as broader authority + new `v3_supported_dag_operators` subset. Dissolution trigger met (split landed AND v3-supported subset consumed by parse tables). **Closed by [PR #1663](https://github.com/gunb-ai/gunbc/pull/1663)** (`362755a7a`). R3 Debt-Paydown ledger receipts and routing detail at [docs/debt/r3-debt-paydown-ledger-2026-05-02.md](docs/debt/r3-debt-paydown-ledger-2026-05-02.md).