Skip to content

docs: v3 lens capability register + Band C honesty-pass - #634

Merged
briansrls merged 2 commits into
mainfrom
session/deep-bee-162
Apr 22, 2026
Merged

briansrls merged 2 commits into
mainfrom
session/deep-bee-162

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Summary

  • New: docs/v3-lens-capability-register.md — canonical table of what every registered .dag lens actually computes, keyed against v2 counterparts where they exist. Two-axis status system (STRUCTURALLY × BEHAVIORALLY) with discipline rules for how to keep it current.
  • Honesty-pass on all 10 lens headers. Band C (complexity, cost, idempotency, parallelism) gets sharp correction distinguishing "file is pure/fail-closed" from "lens does the job its name implies." Band A/B get consistent Status: lines pointing at the register.
  • ROADMAP.md reconcile. Register linked at top of file; the 2026-04-21 complexity-receipt debt row rewritten to retract the "~13× LOC reduction" framing and widen the brief scope from "complexity receipt + registry rename" to "Band C honesty pass."

Context — why this PR exists

During dispatch of docs/briefs/complexity-v2-v3-comparison-receipt.md on this worker, I started reading v2's complexity authority (src/v2/complexity.dag, 5488 lines) to prepare a fixture/golden comparison. v2 produces ComplexitySummary { work: CostExpr, span: CostExpr, output_size: Map<String, CostExpr>, certainty } with symbolic size variables, work/span split, and asymptotic classification (classify_complexity -> "O(n log m)"). v3's src/v3/lenses/complexity.dag produces CostLookup = FoundCost(Int) | MissingCost per port — a structural-depth proxy.

The two lenses compute different functions of the program. The brief's three possible outcomes ("identical / v3 richer / v3 misses X") didn't apply; none of them captures "v3 is a weaker function, rebranded."

Extending the audit to the other 9 lenses under src/v3/lenses/ surfaced the same pattern in three more:

  • cost.dag — PROXY. Richer symbolic shape than complexity.dag, but SizeVariable carries only source_port: PortId (no name, no value semantics). Dimension wiring deferred. No cementing test.
  • idempotency.dag (28 lines) — STUB. Header says "Rust entry v3_compiler::analyze_workflow re-exports the Rust oracle." The .dag is a dispatch shim; the analysis lives in src/v3/compiler/src/workflow_idempotency.rs.
  • parallelism.dag (18 lines) — STUB. Body unconditionally returns report_parallelism_unsupported(LensSurfacePending, …). Real analysis in src/v3/compiler/src/workflow_parallelism.rs.

Common root cause: v3 substrate does not yet carry DescentEvidence / CallPattern / SubValueRelation / MethodSemantics (which v2's complexity analysis depends on), and the v3 emitter cannot yet lower match on user-defined sums (which forces idempotency/parallelism to live in Rust).

Why the gap was invisible

"🟢 TERMINAL" on a lens file reads as both structural (pure catamorphism, fail-closed, bounded) and behavioral (subsumes the named analysis). Only the first was ever load-bearing for the marker. This PR splits the axes and makes the distinction explicit in every lens header. A lens is only "done" when both axes are at their strongest grade.

Not in this PR (follow-ups)

  • Rewrite docs/briefs/complexity-v2-v3-comparison-receipt.md against the register (scope widens per the ROADMAP entry).
  • Port DescentEvidence / CallPattern / SubValueRelation / MethodSemantics into the v3 substrate (program of work).
  • Generalize behavioral-cementing-test discipline to every regen.dag entry.

Test plan

  • cargo fmt --all --check (runs in pre-push hook) — passed
  • No code changes; all edits are docs + .dag file headers (comments only, no structural changes to lens bodies)
  • Reviewer sanity-check: read docs/v3-lens-capability-register.md end-to-end — does the two-axis status system make the 4 Band C gaps legible without additional context?
  • Reviewer sanity-check: the rewritten ROADMAP line 184 retracts the "~13× LOC reduction" framing — is the scope widening ("supersedes the complexity-receipt lane as originally scoped") the right call, or should the register land first and the brief-rewrite be a strictly separate PR?

🤖 Generated with Claude Code

briansrls and others added 2 commits April 21, 2026 23:42
…pass

2026-04-21 audit (prompted by the complexity-v2-v3-comparison-receipt
brief dispatch) found that v3's complexity lens does not subsume v2's
complexity analysis. v2 produces symbolic CostExpr/SizeExpr with
work/span/certainty/asymptotic-class; v3 produces a single integer
depth per port. The "~13× LOC reduction" framing in the brief and
ROADMAP was comparing different functions of the program, not
equivalent ones.

Extending the audit to all ten lenses under src/v3/lenses/ surfaced
the same pattern in three more files (cost.dag PROXY, idempotency.dag
and parallelism.dag STUBs dispatching to Rust oracles). Common root
causes: v3 substrate missing DescentEvidence/CallPattern/
SubValueRelation/MethodSemantics carriers; v3 emitter unable to lower
match on user-defined sums.

The pattern was invisible at the file level because "TERMINAL" reads
as both structural (pure catamorphism, fail-closed) and behavioral
(subsumes the named analysis) — but only the first was ever
load-bearing for the marker. This reconcile PR separates the two axes
so the gap is legible without another audit.

Changes:

1. NEW docs/v3-lens-capability-register.md — canonical table of what
   every registered .dag lens actually computes, keyed against v2
   counterparts where they exist. Two-axis status system:
   STRUCTURALLY (TERMINAL|PARTIAL|UNSOUND) + BEHAVIORALLY
   (COMPLETE|PROXY|STUB|N/A). Discipline section: every new registry
   entry requires a register row; every "v3 replaces v2 X" claim
   requires a behavioral cementing test; review at every ROADMAP
   dispatch.

2. Honesty-pass on all ten lens headers. Band C (complexity, cost,
   idempotency, parallelism) gets sharp correction distinguishing
   structural from behavioral status. Band A (provenance,
   unused_parameters, variant_payload, structural_resolution) and
   Band B (infer_helpers, lower_helpers) get consistent Status: lines
   pointing at the register.

3. ROADMAP.md: register linked at top of file alongside spec/
   validation/lineage. The 2026-04-21 complexity-receipt debt row
   rewritten — retracts the "~13× LOC reduction" framing, widens the
   brief scope from "complexity receipt + registry rename" to "Band C
   honesty pass", names the substrate + emit dissolution paths.

Follow-ups (separate lanes, not in this PR):
- Rewrite docs/briefs/complexity-v2-v3-comparison-receipt.md against
  the register (scope widens per the ROADMAP entry).
- Port DescentEvidence/CallPattern/SubValueRelation/MethodSemantics
  into the v3 substrate (program of work, not a lane).
- Generalize the behavioral-cementing-test discipline to every
  regen.dag entry.

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

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: claude / claude-opus-4-7
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 38s wall

This is a docs-only PR: a new capability register document, ROADMAP row rewrite, and comment-header status markers added to nine .dag lens files. Every changed line in the .dag files is a // comment — no code semantics change.

The diff directly improves faithfulness (INVARIANTS P1) by retracting the earlier "v3 complexity subsumes v2 with 13× LOC reduction" claim that was comparing different functions of the program, and by separating "structurally terminal" from "behaviorally complete" as two orthogonal axes. The register's root-cause analysis (missing substrate carriers blocks complexity/cost; missing match-on-user-sum emit blocks idempotency/parallelism) is grounded and cross-referenced to the ROADMAP debt rows that embody those gaps.

Spot checks:

  • src/v3/lenses/complexity.dag:1-28 status downgrade from "🟢 TERMINAL" framing to "STRUCTURALLY TERMINAL; BEHAVIORALLY PROXY" with an explicit retraction of the equivalence claim — correctly reframes without touching the algebra.
  • src/v3/lenses/parallelism.dag:1-12 now names the file as a hard stub and points at the authoritative Rust oracle in workflow_parallelism.rs — matches the pre-existing LensSurfacePending body.
  • docs/v3-lens-capability-register.md:56-65 "Common root causes" ties the four PROXY/STUB rows to two named dissolution paths, satisfying the tracked-debt triple (documented, bounded, named dissolution trigger).
  • ROADMAP.md:184 supersedes the earlier complexity-receipt entry rather than adding a parallel one — single-authority preserved.

One small observation, not a finding: the register says (§Discipline #1) "every registry entry in src/v3/compiler/regen.dag requires a row here." The table has 10 rows; worth a future lane to actually diff the table against regen.dag contents and either add missing rows or add a CI check that fails on drift. Not needed in this PR — the register itself is the prerequisite.

Verdict

APPROVE — docs-only honesty pass. Retracting an overclaim and installing a two-axis status vocabulary is exactly the kind of authored-faithfulness move INVARIANTS P1 calls for, and the debt it surfaces is routed to existing ROADMAP entries rather than forked into parallel tracking.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: claude / claude-opus-4-7
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 82s wall

Review

This is a documentation honesty-pass. The diff:

  1. Adds docs/v3-lens-capability-register.md — a two-axis (structural × behavioral) capability table for every .dag lens, with discipline rules.
  2. Adds status-marker headers to 10 .dag files under src/v3/lenses/.
  3. Retracts the "~13× LOC reduction with structurally stronger fail-closed guarantees" claim in ROADMAP.md:183 and rescopes the complexity-receipt lane to a Band C honesty pass, adding docs/v3-lens-capability-register.md as a reference both at the top of ROADMAP and in the tracked-debt row.

No Rust or .dag logic changes. All header additions are in comments.

Verification of factual claims in the register

  • src/v2/complexity.dag is 5488 lines — matches claim.
  • src/v3/compiler/src/workflow_idempotency.rs and workflow_parallelism.rs exist at the paths cited.
  • src/v3/compiler/regen.dag contains 8 registry entries (cost, cost_symbolic, provenance, structural_resolution, unused_parameters, infer_helpers, variant_payload, lower_helpers); idempotency.dag and parallelism.dag are not in regen, consistent with the register describing them as dispatch shims (not regen-generated). The discipline rule "every registry entry requires a row here" is a one-way implication and is satisfied.
  • lens_cost.rs no longer exists at HEAD, but the register cites it "on commit 1247f4b" — a historical reference, not a live path claim.

Alignment with the rubric

The change is squarely in service of P1 Modeling Faithfulness: a lens labeled 🟢 TERMINAL while computing a weaker function than its name implies is exactly the "name overclaims what the construct grounds in" failure mode P1 names. The two-axis marker separates structural well-formedness from behavioral subsumption, which is the right cut — a catamorphism is not automatically a complete replacement for what it claims to replace.

The change is also aligned with P5 Progress Is Dissolution. Each of the three non-trivial scaffolds (complexity PROXY, cost PROXY, idempotency/parallelism STUB) now has (1) documented state, (2) bounded scope via the header, and (3) named dissolution triggers (substrate carriers for DescentEvidence/CallPattern/SubValueRelation/MethodSemantics; emit-level match lowering on user-defined sums). That's the tracked-debt shape.

No findings.

Verdict

APPROVE — this is a retraction + register that makes the repo more honest, not less. The claims in the register check out against the tree, the discipline rules are consistent with the regen registry, and the ROADMAP row rewrite accurately describes the scope widening. Net epistemic gain with zero code risk.

Exploratory observations (optional)

  • The register's discipline rule Add SVG viz, test helpers, and makegen scaffold #1 ("every regen.dag registry entry requires a row here") would benefit from a mechanical check. Today it's prose; a small regen_lens-adjacent test that reads both files and fails closed on missing rows would make the register un-bypassable. Not blocking — worth a future lane.
  • src/v3/lenses/cost.dag:1-15 and src/v3/lenses/complexity.dag:1-31 both now carry behavioral-PROXY status with overlapping scope language. Worth considering whether the two files are still meaningfully distinct once the register is the source of truth, or whether one becomes redundant once the substrate gap closes. Not a request — just something the register makes visible that wasn't before.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 136s wall

Verdict: APPROVE. This looks like an honest documentation/status correction, not a shape regression: the new register and per-lens headers downgrade the proxy/stub lenses instead of overclaiming equivalence, which is aligned with P1's live-state/documentation discipline. I did not find a concrete diff-grounded violation of the pinned invariants, coding discipline, or testing discipline.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: claude / claude-opus-4-7
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 58s wall

Verdict: APPROVE — docs-only honesty pass. Claims match the actual lens code (verified parallelism.dag unconditionally returns report_parallelism_unsupported(LensSurfacePending, …), idempotency.dag is a dispatch shim over lane2_workflow_idempotency_report, v2 complexity.dag is 5488L). The two-axis (structural / behavioral) status markers are added to all 10 .dag lenses under src/v3/lenses/, matching the register's stated discipline rule #1 ("every registry entry requires a row here"). The ROADMAP retraction of the "~13× LOC reduction with structurally stronger fail-closed guarantees" claim is exactly the kind of downgrade the register says should be first-class.

This directly supports INVARIANTS P1 (Modeling Faithfulness) — it makes a latent overclaim visible and names the substrate (DescentEvidence / CallPattern / SubValueRelation / MethodSemantics) and emit (match on user-defined sums) gaps that block genuine equivalence. No modeling discipline concerns in the diff.

Exploratory observations (non-blocking):

  • docs/v3-lens-capability-register.md:7 — "complexity.dag (162 lines, marked 🟢 TERMINAL)" is a historical statement about the audit, but this same PR's comment edits push the file to 177 lines. Reads fine as "state at time of audit," but a future reader comparing the number against wc -l will find it stale on arrival. Consider dropping the LOC or phrasing as "~160 lines at time of audit."
  • The register commits to "every registry entry in src/v3/compiler/regen.dag requires a row here" (rule Add SVG viz, test helpers, and makegen scaffold #1) but the PR doesn't add any CI / test mechanism that would catch a future lens being added without a register row. That's exactly the silent-drift mode rule Consolidate binaries into gunbc-dag package #4 ("Downgrades are first-class") is trying to prevent. A follow-up ratchet — "count of .dag files under src/v3/lenses/ must equal count of register rows" — would convert rule Add SVG viz, test helpers, and makegen scaffold #1 from discipline-by-convention into substrate. Not asked of this PR.
  • The STRUCTURALLY {TERMINAL,PARTIAL,UNSOUND} / BEHAVIORALLY {COMPLETE,PROXY,STUB,N/A} vocabulary is defined only in this one doc. If it's going to be load-bearing at ROADMAP-dispatch time, it probably wants a stable anchor (e.g., in INVARIANTS.md or a short docs/invariants/ subdoc) — otherwise the next audit has to re-derive the vocabulary from prose.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0f2209e7f6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

|---|---|---|---|---|---|
| `complexity.dag` | TERMINAL | **PROXY** | `src/v2/complexity.dag` (5488L) | `CostLookup = FoundCost(Int) \| MissingCost` per port | `CostExpr` (Sum/Mul/Log/Const), `SizeExpr`, work/span split, `Certainty`, asymptotic classification, recurrence bounds |
| `cost.dag` | TERMINAL | **PROXY** | v2 `CostExpr` (embedded in `complexity.dag`) | `SymbolicCostLookup = FoundCost(SymbolicCost) \| MissingCost` per port | Named `SizeVar` with value semantics (v3's `SizeVariable` carries only `source_port: PortId`). `Dimension<SymbolicCost>` wiring deferred on grammar gaps. No cementing test. |
| `idempotency.dag` | PARTIAL | **STUB** | None (v3-native) | `WorkflowIdempotencyReport` via dispatch | — (analysis lives in `src/v3/compiler/src/workflow_idempotency.rs`; the `.dag` is a registration shim) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Classify idempotency lens as DAG-backed, not Rust-only stub

The register marks idempotency.dag as a Rust-oracle stub, but the lens actually delegates to std.effects::lane2_workflow_idempotency_report, whose analysis is implemented in src/v3/std/effects.dag (lane2_workflow_idempotency_report), while workflow_idempotency.rs is documented as a mirror/projection path. Because this register is explicitly used to gate roadmap/brief dispatch, this misclassification can cause planning decisions to treat an existing DAG analysis as unavailable and incorrectly defer work.

Useful? React with 👍 / 👎.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review: APPROVE — high-leverage single artifact, scope-correct, discipline-section makes it operational.

This is exactly the durable output the audit needed. The register converts dispersed signal (scattered ROADMAP debt rows + per-file headers + memory entries) into one structured view that's checkable per-lens before any future brief claims "v3 replaces v2 X."

What's load-bearing

Two-axis status system. STRUCTURALLY × BEHAVIORALLY is the exact split that was missing. The previous 🟢 TERMINAL marker silently double-dutied as both "file is well-formed" and "lens does its job" — the register names the conflation explicitly and prevents future re-conflation. Discipline rule #5 ("two axes do not trade off") is the load-bearing line: STRUCTURALLY TERMINAL + BEHAVIORALLY PROXY is now an honest declarable state, not a contradiction someone has to talk around.

"What v2 has that v3 drops" column. Per-row, per-file gap visibility. This is the column that makes overclaiming in a brief mechanically harder — a future me/SG-manager/worker has to look at the row, see the column populated, and then either fill it with "N/A" (claiming completeness) or work the gap. That's the failure mode that produced my brief, structurally prevented.

Common root causes section. Naming the substrate gap (DescentEvidence / CallPattern / SubValueRelation / MethodSemantics) and the emit gap (match on user-defined sums) as the shared blockers across four lenses is the right framing. Fixing them unblocks multiple lenses, so they're program-scoped, not lane-scoped — accurate and informative for whoever scopes the substrate work.

Discipline section makes the register operational. Five rules including:

ROADMAP integration is exactly right

  • Top-of-file callout with bold + read-before-dispatch instruction. Right placement — it's the kind of cue a future session should hit before drafting briefs.
  • Complexity-receipt row rewritten with explicit retraction of the "~13× LOC reduction" claim. Named the four PROXY/STUB lenses, named both dissolution paths (substrate + emit), explicitly held the brief rewrite as a follow-up after the register is in tree. Sequencing is right: register first, brief rewrite second, with the brief informed by the register's findings rather than my LOC-guess.

Reviewer-sanity questions answered

Does the two-axis status system make the 4 Band C gaps legible without additional context?

Yes, definitively. The capability table reads top-down without prose: a reader sees PROXY / STUB columns and the "v3 drops" column and knows immediately what's missing. No need to grep file headers or chase ROADMAP rows.

The rewritten ROADMAP line 184 retracts the framing — is the scope widening the right call, or should the register land first and brief-rewrite be strictly separate PR?

Strictly separate. The row already encodes that: "brief rewrite queues for after the 2026-04-21 wave's 5 lanes land and this register is in tree." Right call. The brief's new scope (Band C honesty pass) needs the register as input, so the dependency is naturally sequenced. Don't bundle.

One non-blocking observation

The register's discipline rule #3 ("review at every ROADMAP dispatch") is procedural — relies on humans/AI consulting the doc. The top-of-ROADMAP callout reinforces this. A possible follow-up (separate PR, not this one): add a one-line pointer to the register from CLAUDE.md so any session loaded with project instructions encounters it before drafting briefs that touch lens equivalence. Not required for this PR — the ROADMAP callout is sufficient — but worth considering as the register matures.

No changes requested

Ready to merge. This is the kind of artifact that'd be cited in retrospectives as the moment when v3-lens claims became reviewable rather than narrative.

🤖 Director review

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: claude / claude-opus-4-7
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 57s wall

Docs-only PR. The diff: (1) a new docs/v3-lens-capability-register.md introducing a two-axis (structural × behavioral) status system, (2) header comments on all ten .dag files under src/v3/lenses/ declaring their status, (3) a rewritten ROADMAP bullet that retracts the earlier "~13× LOC reduction with structurally stronger fail-closed guarantees" claim. No code or analysis behavior changes.

Checks performed

  • All 10 files in src/v3/lenses/ have rows in the register's capability table and all have new header markers in the diff. Consistent.
  • All 8 entries in src/v3/compiler/regen.dag map to a register row (register rule Add SVG viz, test helpers, and makegen scaffold #1 satisfied).
  • Status markers in each .dag header match the table (complexity/cost = TERMINAL+PROXY; idempotency/parallelism = PARTIAL+STUB; provenance/unused_parameters/variant_payload/structural_resolution = TERMINAL+COMPLETE; infer_helpers/lower_helpers = PARTIAL+N/A).
  • v2 complexity.dag is indeed 5488 lines (matches the register).
  • The retraction is internally consistent: the new ROADMAP bullet, the register body, and the header comment in complexity.dag all tell the same story about the substrate gaps (DescentEvidence / CallPattern / SubValueRelation / MethodSemantics) and emit gaps (match over user-defined sums).

Exploratory observations (non-blocking)

  • The register states the complexity lens is "162 lines" in its "Why this document exists" section. After this PR's header additions the file is 177 lines. Trivial but, per the register's own discipline clause Consolidate binaries into gunbc-dag package #4, staleness is the failure mode this doc exists to catch — worth either dropping the line count or phrasing it as "~160 lines" so future header churn doesn't force a doc edit.
  • The register's rule Add SVG viz, test helpers, and makegen scaffold #1 ("every registry entry in regen.dag requires a row here") is enforced only by human discipline. The stated failure mode (silent drift) is exactly the kind of thing worth a cementing test: a tiny Rust test that parses regen.dag and greps the register for each lens_file path would make rule Add SVG viz, test helpers, and makegen scaffold #1 machine-checked. Not asking in this PR — flagging as a natural follow-up since the rule is new and untested.
  • The register cites INVARIANTS P1 as the governing lens for why PROXY-named-COMPLETE is a faithfulness failure. This is a strong framing and consistent with docs/modeling-discipline.md's "illegal states unrepresentable" family — the two-axis marker literally makes "structurally-clean-but-behaviorally-hollow" a representable, named state rather than an invisible one. That's the right shape.

Verdict: APPROVE. Honest retraction of a prior overclaim, adds a named diagnostic frame (two-axis status) that maps cleanly onto existing modeling-faithfulness principles, and propagates the frame to every relevant file in a single pass. No violations of INVARIANTS/CODING/TESTING in the diff.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 169s wall

Findings

  • docs/v3-lens-capability-register.md, src/v3/lenses/variant_payload.dag: these new notes say variant_payload.dag still has a tracked DeclarationLookup cleanup pending, but the live lens already uses the single-authority declaration_by_id path and distinguishes DeclarationMissing from NotPayloadProduct. That makes the new honesty docs stale on arrival, which conflicts with INVARIANTS.md P1's “Documentation Describes Live State” rule.

Verdict: APPROVE_WITH_COMMENTS. The two-axis status pass is otherwise clean and materially improves honesty around the lens surface, but I would drop or rewrite the stale variant_payload debt reference so the new register stays fully aligned with the live file.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: claude / claude-opus-4-7
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 57s wall

Findings

None that block. Two minor observations:

  • docs/v3-lens-capability-register.md:7 states complexity.dag is "162 lines" but after this same PR's header expansion the file is 177 lines (wc -l confirms). Since the register frames this as a snapshot of the 2026-04-21 audit state, it reads as historical — but a reader who wcs the file today will see a mismatch. Trivial; could either note "pre-register header" or just round.
  • src/v3/lenses/complexity.dag:11–12 retains the historical reference to src/v3/compiler/src/lens_cost.rs on commit 1247f4b1d. The file no longer exists at HEAD. The commit pin makes the reference valid, but a one-word "(removed from HEAD; pinned for receipt)" would save a future reader a grep. Pre-existing, not introduced here.

Neither rises to a violation — both are comment hygiene.

Verdict: APPROVE

This is a documentation-only honesty pass. No substrate changes, no code changes — the .dag edits are pure comment additions above the module lines. The work aligns squarely with INVARIANTS P1 Modeling Faithfulness: it explicitly separates structural well-formedness from behavioral subsumption, retracts a previously overclaimed "13× LOC reduction with structurally stronger fail-closed guarantees," and installs a register so the same pattern can't recur silently. The ROADMAP edit replaces a too-narrow "complexity receipt" lane entry with a correctly-scoped honesty-pass entry and names the two root-cause programs (substrate carriers, emit match-over-sums). Spot-checks of the load-bearing claims (v2 LOC 5488, v3 LOC 162/177, referenced Rust files exist, P1 is the right invariant) all hold. Ship.

Exploratory observation (optional)

The register's discipline item #1 ("Every registry entry in src/v3/compiler/regen.dag requires a row here") is currently self-enforced prose. If this register is load-bearing enough to gate dispatch briefs (and the ROADMAP edit says it is), a small CI check that diffs regen.dag entries against rows in this table would make drift loud rather than silent — the same failure mode item #4 names. Not a PR ask, but worth queueing alongside the "cementing-test-per-lens" generalization already called out.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 169s wall

Findings

  • NON-BLOCKING — docs/v3-lens-capability-register.md:46 reintroduces a brittle line-number cross-reference into the new canonical register, and it is already wrong: the DeclarationLookup debt it means to point at is ROADMAP.md:171, while :170 is the unrelated file-preference-rank scaffold. For a doc introduced as the authoritative lens-status register, that misses INVARIANTS.md P1 / “Documentation Describes Live State.”

Verdict: APPROVE_WITH_COMMENTS. The honesty-pass itself looks clean and directionally correct, and I did not find a substantive modeling/coding/testing violation in the changed lens headers. I would fix the broken ROADMAP reference before treating the new register as canonical.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 172s wall

Findings

  • docs/v3-lens-capability-register.md:41 and src/v3/lenses/cost.dag:14 violate INVARIANTS.md P1's "documentation describes live state" rule. Both new notes say the symbolic-cost lens has "No cementing test," but the tree already has a dedicated behavioral suite for this lens in src/v3/compiler/tests/integration/lane2_stage_2d_symbolic_cost_test.rs that exercises symbolic_cost_of(...), pins the loop-body regression, and snapshot-checks the generated module. If you mean "no v2-equivalence cementing test," the doc needs to say that precisely; as written, the new register understates existing coverage.

Verdict
REQUEST_CHANGES. The diff is otherwise clean, but this register is meant to be the load-bearing authority for dispatch decisions, so shipping a false statement about current test coverage would undercut the honesty-pass it is introducing.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 174s wall

Verdict: APPROVE

This looks clean. The diff is an honesty/documentation pass plus header annotations; it removes overclaim rather than introducing new modeled authority, and the remaining gaps are documented, bounded, and given concrete blockers/triggers. I didn’t find a concrete violation of the pinned invariants, coding discipline, or testing discipline in the changed lines.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: claude / claude-opus-4-7
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 50s wall

This is a pure documentation PR: one new register file, status-marker headers added to nine .dag lens files, and one ROADMAP entry rewritten.

Spot checks against the diff's claims:

  • src/v2/complexity.dag = 5488 lines ✓
  • pre-PR src/v3/lenses/complexity.dag = 162 lines ✓ (now 177 post-PR, with the added header — the 162 figure is quoted as a 2026-04-21 audit datum, reads as historical)
  • CostLookup = MissingCost | FoundCost(Int) ✓ (complexity.dag:50–52)
  • SymbolicCostLookup / SymbolicCost / SizeVariable { source_port: PortId } ✓ (cost.dag:21,28)
  • src/v3/compiler/src/workflow_{idempotency,parallelism}.rs exist ✓

Verdict: APPROVE. This is a textbook honesty-pass — it retracts a prior overclaim ("~13× LOC reduction with structurally stronger fail-closed guarantees"), separates structural-vs-behavioral status into two orthogonal axes so that 🟢 TERMINAL can no longer conflate "well-formed file" with "subsumes its v2 counterpart," and names the concrete substrate + emit gaps that currently prevent COMPLETE. The pattern sits cleanly inside P1 Modeling Faithfulness from INVARIANTS.md: a PROXY computing a weaker function of the program than its name implies is an authored-faithfulness failure, and the register exists specifically to catch it. No findings.

Exploratory observation (not an ask): the register puts the two unblockers — (a) carrying DescentEvidence / CallPattern / SubValueRelation / MethodSemantics into src/v3/std/, and (b) match lowering over user-defined sums in emit_rust_module — in one place for the first time. If the follow-on brief rewrite lands before the 2026-04-21 wave closes, those two items are strong candidates to be promoted to named, dated lane entries rather than staying as prose inside the register, so that the register stays descriptive rather than becoming the de facto backlog.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: claude / claude-opus-4-7
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 41s wall

Verdict: APPROVE — honest, well-scoped docs-only correction.

This is a docs-only PR that retracts a previously overclaimed thesis ("~13× LOC reduction with structurally stronger fail-closed guarantees") and introduces a two-axis capability register (structural × behavioral) so the same class of overclaim is harder to re-introduce. No code under review.

Spot-checks against the diff:

  • The register's 10-row table corresponds 1:1 with the .dag files actually present under src/v3/lenses/.
  • The parallelism.dag characterization ("unconditional report_parallelism_unsupported(LensSurfacePending, …)") is faithful to the file body.
  • The complexity.dag header rewrite (diff L11-L28) cleanly downgrades the earlier "Equivalent to the original Rust lens" framing to "Equivalent to the prior Rust lens' structural-depth algebra" — it no longer asserts equivalence to v2.
  • The ROADMAP row replacement (ROADMAP.md:184) supersedes the complexity-receipt entry with a scope-widened honesty-pass entry, preserving the dispatch brief reference.

This is exactly the work INVARIANTS P1 (Modeling Faithfulness) asks for when names overclaim relative to what code produces. The discipline section of the new doc also gives it dissolution leverage: future PRs claiming "v3 subsumes v2 X" must update a row, and the register is cross-linked from ROADMAP so it's in the dispatch path.

No findings.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 165s wall

Verdict: APPROVE. This reads as an honesty-pass rather than a semantic change, and the diff stays consistent with the pinned rubric: the new register matches the current lens set, the per-file status headers are aligned across src/v3/lenses/*.dag, and I did not find a concrete modeling/coding/testing violation in the changed lines. I did not run tests; this review was based on the diff plus spot-checks against the existing in-tree lens tests and registry.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 185s wall

Findings

  • NON-BLOCKING: docs/v3-lens-capability-register.md:41 and src/v3/lenses/cost.dag:14 now say the symbolic-cost lens has no behavioral cementing test, but the tree already has a dedicated acceptance suite for that authority in src/v3/compiler/tests/integration/lane2_stage_2d_symbolic_cost_test.rs ("symbolic-cost lens acceptance tests", "Authority: src/v3/lenses/cost.dag"). For a register introduced as the canonical live-state view, that overstates the gap and conflicts with P1 / “Documentation describes live state.” If the intended claim is narrower, it should be phrased as “no v2-equivalence golden” rather than “no cementing test.”

Verdict
APPROVE_WITH_COMMENTS. The overall honesty-pass looks directionally right and the status downgrades seem justified; the only concrete issue I found is that the new register/header overcorrect on cost.dag test coverage.

@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 / gpt-5.4
  • Commit: 0f2209e7 · Trigger: schedule
  • Thinking: 378s wall

Non-blocking — Strengths

  • docs/v3-lens-capability-register.md The new two-axis register is honest against the live code: the Band C rows match the actual v2 surface, the current v3 lens bodies, and the Rust-backed authority split.

ROADMAP — Verified

  • Band C honesty pass: The register covers all ten src/v3/lenses/*.dag files and every current LensRegistryEntry in src/v3/compiler/regen.dag, so the new pre-dispatch check is mechanically grounded.

✅ I checked the changed claims against the lens sources, src/v2/complexity.dag, the Rust oracle modules, and the existing lens migration/integration tests, and I do not have concerns.

@briansrls
briansrls merged commit fa62118 into main Apr 22, 2026
4 checks passed
@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-4-pro
  • Commit: 0f2209e7 · Trigger: manual
  • Conversation: View conversation

1. Story of the diff

This PR is a documentation honesty-pass, not a semantic compiler change. It adds a central docs/v3-lens-capability-register.md:1-86 that splits lens status into two axes—structural cleanliness vs behavioral completeness—and then uses that matrix to reclassify the shipped v3 lenses, especially complexity/cost as proxies and idempotency/parallelism as stubs (docs/v3-lens-capability-register.md:13-49). The edited lens headers mirror that taxonomy locally, with the biggest correction in src/v3/lenses/complexity.dag:1-21, which now says plainly that the file is only a structural-depth lens and not a v2-equivalent complexity analysis; src/v3/lenses/idempotency.dag:1-13 and src/v3/lenses/parallelism.dag:1-12 get the same kind of “dispatch shim / hard stub” honesty treatment. ROADMAP.md:8 and ROADMAP.md:184 then wire the register into planning by telling future briefs to consult it first and by replacing the old narrow “complexity receipt” debt item with a broader Band C honesty-pass that names the real substrate and emit blockers.

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

N/A — diff is docs/comment-only; it does not change substrate types, Dag fields, or cross-pass authorities.

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

Finding (NON-BLOCKING) — P2 Boundary Discipline / single-authority metadata; Practice 5 + Practice 6. docs/v3-lens-capability-register.md:3 makes the new register the “Canonical view,” and docs/v3-lens-capability-register.md:15 says every lens also declares both axes in its file header; the diff then hand-copies those same grades into lens files such as src/v3/lenses/complexity.dag:3 and src/v3/lenses/parallelism.dag:3. That creates two manual authorities for the same status facts with no generation or ratchet between them, so drift is prevented by convention rather than structure.

  1. CODING.md.

N/A — no Rust implementation, helper placement, naming surface, or error-carrier code changed.

  1. TESTING.md.

Compliant — no executable behavior changed, so new tests were not required here; instead the diff tightens the contract around testing by defining BEHAVIORALLY COMPLETE as requiring a behavioral cementing test (docs/v3-lens-capability-register.md:29) and by turning the follow-up into repo-wide “semantic-equality goldens per lens” work (docs/v3-lens-capability-register.md:77, ROADMAP.md:184).

  1. LOCKED DESIGN DECISIONS.

N/A — this PR does not alter a locked design decision; it retracts equivalence overclaims and documents current blockers instead.

  1. TRACKED vs UNTRACKED DEBT.

Compliant — the incomplete lenses are explicitly classified as PROXY/STUB/PARTIAL in docs/v3-lens-capability-register.md:40-49, and the missing work is bounded with named dissolution paths in docs/v3-lens-capability-register.md:53-70 and ROADMAP.md:184; that is tracked debt, not hidden scaffolding.

3. Verdict

APPROVE_WITH_COMMENTS

This is a useful and materially more honest PR: it separates “structurally clean” from “behaviorally equivalent,” retracts the old complexity overclaim, and names the actual substrate/emit work that remains. I would not block the docs correction, but I do think the new status scheme should eventually collapse to one authority instead of being hand-authored in both the central register and each lens header.

Exploratory observations

docs/v3-lens-capability-register.md:46 bakes in a ROADMAP ... line 170 reference. Since this new register is supposed to be durable planning infrastructure, a name/anchor-based pointer would age better than a raw line-number pointer.

@briansrls
briansrls deleted the session/deep-bee-162 branch June 1, 2026 18:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant