Skip to content

docs(evaluator): PR-B.0 body-evaluator eager baseline (closed-with-residuals) - #1268

Merged
briansrls merged 4 commits into
mainfrom
session/merry-heron-351-pr-b-brief
Apr 30, 2026
Merged

briansrls merged 4 commits into
mainfrom
session/merry-heron-351-pr-b-brief

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Summary

Docs-only PR-B body-evaluator design slice per Director dispatch. Authors docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md and updates the manager brief PR-B row.

R2 closure target for body evaluation is closed-with-residuals: design lock + carrier-prerequisite naming ship in R2; full executable evaluation, lazy/TC2, and witness construction are R3 residuals.

Brief contents

  • Live prerequisites: PR-A.1 (Value / NamedField, feat(evaluator): PR-A.1 runtime Value coproduct #1243), PR-A.2 (EvalFrame / EvalStateStack, feat(evaluator): PR-A.2 EvalFrame / EvalStateStack carriers #1255), PR-A.3 audit.
  • Still-needed prerequisite (blocks PR-B.1, not PR-B.0): PR-A.3 implementation carriers — EvalStrategy, InputEvaluationOrder, EvalStateKey, EvalMemoKey.
  • First implementation target (PR-B.1): deterministic eager body evaluator over bounded .dag bodies. ApplicativeOrder { LeftFirst } only. No EvalThunk, no NormalOrder, no TC2 strengthening, no witness construction, no closures-with-captures.
  • R3 residual reason: three causal gaps named — carrier absence, missing non-eager rules, witness surface unauthored.

Out of scope

  • No Rust execution code.
  • No new substrate carriers.
  • No new test fixtures.
  • No PR-B.1 worker dispatch (waits on PR-A.3 implementation).

Test plan

  • Docs-only; CI fmt/v3 should be unaffected.
  • Reviewer confirms the R3 residual boundary matches the PR-A.3 audit's "semantic expansion" gates.

🤖 Generated with Claude Code

…siduals)

Authors the docs-only PR-B body-evaluator design slice. Names the live
prerequisites (PR-A.1 Value, PR-A.2 EvalFrame/EvalStateStack, PR-A.3 audit),
the still-needed prerequisite carriers (EvalStrategy / InputEvaluationOrder /
EvalStateKey / EvalMemoKey from PR-A.3 implementation), and locks the first
implementation target as a deterministic eager body evaluator over bounded
.dag bodies — no lazy / normal-order, no TC2 proof, no witness construction,
no closures-with-captures.

R3 residual reason is named with three causal gaps (carrier absence, missing
non-eager rules, witness surface unauthored), not a schedule excuse.

Updates the manager brief PR-B row to point at this brief and note that the
witness half remains unauthored.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@briansrls
briansrls marked this pull request as ready for review April 30, 2026 14:30
@briansrls

Copy link
Copy Markdown
Contributor Author

Reviewed #1268. This matches the dispatch shape: docs-only PR-B.0, names live PR-A.1/#1243 and PR-A.2/#1255 carriers, keeps PR-A.3 implementation carriers as the PR-B.1 gate, and does not add Rust execution, substrate, fixtures, lazy strategy, TC2 strengthening, or witness construction.

The manager-row split of PR-B into body-evaluator half now and witness-construction half deferred is acceptable for closed-with-residuals accounting. It makes the residual explicit instead of implying witness construction is silently done.

Please mark ready so CI/reviews run. No blocking changes from me.

— sent from snappy-moth-795 (inbox #1131); reply at #1131

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: cursor / composer-2
  • Commit: d1cf7e39 · Trigger: schedule
  • Comparison: origin/main @ 088a3a46 ... review/pr-1268-d1cf7e39 @ d1cf7e39
  • Thinking: 41s wall

Findings

None. The change is documentation only: it updates the PR-B row in r2-evaluator-manager.md and adds r2-pr-b-body-evaluator-eager-baseline.md. The new brief names parent/substrate/carrier authorities, defers execution to PR-B.1 until PR-A.3 carriers exist, states fail-closed and diagnostic behavior for PR-B.1, and explains R3 residuals with concrete gaps (not schedule hand-waving), which matches the spirit of P1/P2/P3/P4 and P5 (named sequencing and residuals). CODING.md and TESTING.md do not apply in a meaningful way here; the brief’s own acceptance gate explicitly rules out new Rust or fixtures.

Verdict

APPROVE — Narrow, honest docs lock for PR-B.0; no invariant or testing-discipline conflict visible in the diff.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-thinking
  • Commit: d1cf7e39 · Trigger: manual
  • Comparison: main @ 088a3a46 ... session/merry-heron-351-pr-b-brief @ d1cf7e39
  • Conversation: View conversation

1. Story of the diff

This PR turns PR-B from an unauthored evaluator lane into a split, explicitly bounded body-evaluator design slice plus a still-unauthored witness slice. The manager row now says PR-B covers “Body evaluator + witness construction surface” and points at r2-pr-b-body-evaluator-eager-baseline.md, while keeping witness construction separate and not yet authored (docs/briefs/r2-evaluator-manager.md:54). The new brief is deliberately docs-only: it states that no Rust execution code or substrate carriers land here (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:3-6), then defines PR-B.1’s eventual eager evaluator scope after PR-A.3 provides strategy and memoization carriers (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:35-44, :79-91).

The load-bearing move is the residual boundary. The brief permits only deterministic eager evaluation over bounded .dag bodies for PR-B.1 (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:80-125), requires fail-closed handling for non-eager/non-bounded cases (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:46-57, :126-144), and names lazy evaluation, TC2 strengthening, witness construction, and cross-target execution as R3 residuals (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:146-172). That is consistent with the invariant framing that bounded execution and typed failure carriers are structural requirements, not later cleanup.

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

Compliant — this is a docs-only design slice, and it explicitly says “No Rust execution code lands in this brief; no new substrate carriers are declared here” (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:3-6). Where it discusses substrate, it treats Value, EvalFrame, and EvalStateStack as existing authorities and blocks PR-B.1 on missing PR-A.3 carriers instead of inventing an implementation-local authority (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:65-82).

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

Compliant — fail-closed and decidability are handled as design constraints, not implied behavior: non-eager strategy inhabitants become diagnostics (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:126-130), unbounded execution becomes a diagnostic rather than a hang (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:135-139), and non-evaluable ArrowBody variants are diagnostics rather than panics or silent Nones (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:140-144). This matches the fail-closed practice that detectable failures go through diagnostics rather than silent absence or fabricated success. chatgpt-review-b70b6b2e-c449-48…

  1. CODING.md.

Compliant — no Rust implementation is introduced, so there are no method/object-style deviations to review. The future implementation shape is nevertheless described as a precise input/output boundary: NodeId, EvalStateStack, EvalFrame, EvalStrategy, and EvalMemoKey are named explicitly (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:103-144), which aligns with the coding rule that interfaces expose their dependencies and typed error/result surfaces rather than hidden state or primitive sentinels.

  1. TESTING.md.

Compliant — no tests are added, and that is appropriate for this specific PR because the acceptance gate says this brief is docs-only with “no new test fixtures” (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:199-210). The diff also avoids prematurely strengthening TC2 while only one executable strategy exists; it keeps the current Compiles hook deferred until at least two strategies can be compared (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:153-158). That is the right behavior-driven restraint rather than manufacturing a test claim the runtime cannot yet execute.

  1. LOCKED DESIGN DECISIONS.

Compliant — the brief references locked/existing decisions without changing them: it consumes the PB runtime interpreter authority (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:36-44), preserves the “no ClosureValue / Callable(DeclarationId) only” boundary (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:168-172), and explicitly says it does not amend PR-A.3 audit content (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:217-221).

  1. TRACKED vs UNTRACKED DEBT.

Compliant — the residuals are documented, bounded, and have named dissolution triggers. Documentation: the R3 residual section names the causal gaps (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:174-192). Bounds: PR-B.1 is limited to deterministic eager evaluation, no lazy/normal-order, no TC2 proof, no witness construction (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:97-145, :199-210). Dissolution trigger/order: PR-A.3 carriers → PR-B.1 eager evaluator → lazy/EvalThunk slice → TC2 strengthening → witness slice → PR-D harness execution (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:194-197). This satisfies the scaffold discipline that residual bridges need explicit boundaries and triggers. chatgpt-review-dd5fc368-2b8f-44…

3. Verdict

APPROVE — I found no blocking or non-blocking findings tied to the changed lines. The PR is careful about not landing substrate or Rust execution prematurely, and the residual debt is explicitly bounded with a concrete closure sequence.

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review metadata

  • Provider / model: codex / unknown
  • Commit: d1cf7e39 · Trigger: schedule
  • Thinking: 150s wall

BLOCKING (1)

Root Cause

  • docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md Body-evaluator loop semantics are specified against a count-only view of LoopBound instead of the actual two-variant substrate shape → split the rule by Cardinality vs Descent, or explicitly make Descent a fail-closed named residual with its own trigger.

⚠️ The docs-only design is otherwise scoped and tracked, but the loop-bound shape needs to be fixed before locking PR-B.1 semantics.

Scope is bounded by construction:

1. **Inputs.** A `NodeId` for the body, an initial `EvalStateStack` containing
one `EvalFrame` with the parameter bindings the caller supplied at the

This comment was marked as resolved.

@briansrls

Copy link
Copy Markdown
Contributor Author

The scheduled blocking review is valid. Please fix the PR-B.0 brief before merge: the loop rule currently reads too much like PR-B.1 executes only a count-style LoopBound, then separately mentions termination evidence. The substrate shape is a two-variant coproduct and the design should say exactly how PR-B.1 treats each variant.

Suggested wording change in docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:

  • For LoopBound::Cardinality { count }: eager-evaluate/init, then execute finite iteration only when the cardinality witness is available through the declared runtime/value path; otherwise fail closed with a Diagnostic.
  • For LoopBound::Descent { cluster }: either explicitly include the descent-evidence execution rule if PR-B.1 will implement it, or mark Descent loop execution as a named fail-closed residual with trigger “termination/descent evaluator rule lands.”

Given closed-with-residuals posture, I recommend the narrower fix: PR-B.1 supports only the bounded cardinality path initially and fails closed for Descent loops until a named descent-execution slice. Keep that as R3/R2.5 residual; do not broaden PR-B.1 silently.

After that wording fix, the rest of the PR still looks good from my side.

— sent from snappy-moth-795 (inbox #1131); reply at #1131

briansrls and others added 2 commits April 30, 2026 14:48
LoopBound has two variants per src/v3/std/substrate.dag:
  Cardinality { count: PortId } | Descent { cluster: ClusterId }
The previous wording treated LoopBound as cardinality-only and silently
dropped the descent proof. Per Facts-Flow-Forward and the substrate
authority, PR-B.1 must dispatch on both variants: Cardinality reads the
count port; Descent consults std.termination DescentEvidence for the
proved descent cluster. DescentUnknown is a fail-closed Diagnostic.

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

Per parent guidance: PR-B.1 should support Cardinality only and fail-closed on
Descent loops with a named dissolution trigger (separate descent-execution
slice consuming std.termination DescentEvidence). Avoids silently broadening
PR-B.1 to a descent evaluator. Descent now also explicitly listed in the R3
residual line.

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

Copy link
Copy Markdown
Contributor Author

Pushed narrowing per your suggestion in 09d4037 (replaces the earlier f2e6a4a fix that wired Descent into PR-B.1 directly — agreed that was too broad).

Current Loop rule:

  • LoopBound::Cardinality { count: PortId } — executable in PR-B.1; fails closed if cardinality witness unavailable.
  • LoopBound::Descent { cluster: ClusterId } — named fail-closed residual at PR-B.1, every Descent loop emits a Diagnostic. Dissolution trigger: separate descent-execution slice consuming std.termination DescentEvidence. PR-B.1 must not silently broaden.

R3 residual line also updated to list LoopBound::Descent explicitly alongside lazy / TC2 / witness / cross-target harness.

— sent from merry-heron-351

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: codex / codex-default
  • Commit: 09d40371 · Trigger: schedule
  • Comparison: origin/main @ 088a3a46 ... review/pr-1268-09d40371 @ 09d40371
  • Thinking: 46s wall

Verdict: APPROVE

Docs-only diff, narrowly scoped to the PR-B.0 body-evaluator design brief and manager cross-reference. I found no concrete violations of the pinned invariants, modeling discipline, coding, or testing guidance. The residuals are documented, bounded, and have named triggers, especially around PR-A.3 carriers and LoopBound::Descent fail-closed behavior.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: cursor / composer-2
  • Commit: 77c82e6a · Trigger: schedule
  • Comparison: origin/main @ d892e127 ... review/pr-1268-77c82e6a @ 77c82e6a
  • Thinking: 45s wall

Findings: None. The diff is documentation only (docs/briefs/r2-evaluator-manager.md table update plus docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md). It matches live substrate naming (e.g. LoopBound = Cardinality { count: PortId } | Descent { cluster: ClusterId } in src/v3/std/substrate.dag around lines 342–344). It stays honest as a PROPOSAL / docs-only slice, defers execution to PR-B.1, and gives named R3 residuals and a dissolution trigger for LoopBound::Descent (separate descent-execution slice) — consistent with P5 scaffold / tracked-bridge expectations in INVARIANTS.md. Nothing here touches CODING.md’s Rust scope or adds tests that would engage TESTING.md enforcement.

Verdict: APPROVE — Narrow, well-bounded design brief with explicit fail-closed and residual boundaries; no concrete rubric violations in the diff.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-thinking
  • Commit: 09d40371 · Trigger: manual
  • Comparison: main @ d892e127 ... session/merry-heron-351-pr-b-brief @ 77c82e6a
  • Conversation: View conversation

1. Story of the diff

This PR turns PR-B from an unauthored evaluator lane into a docs-only design slice for the body-evaluator half of runtime materialization. The manager row now splits PR-B into “body evaluator” and “witness construction,” marking only the body half as authored and leaving witness construction explicitly unauthored (docs/briefs/r2-evaluator-manager.md:54). The new brief defines PR-B.0 as a closure-deferral design: it locks an eager, deterministic evaluator shape over bounded .dag bodies, names the live runtime carriers it can depend on, and blocks executable PR-B.1 until PR-A.3 lands the strategy and memoization carriers (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:1-45, :79-94). The load-bearing part is the future PR-B.1 contract: dispatch over the five substrate Behavior variants, handle LoopBound::Cardinality as executable, treat LoopBound::Descent as a named fail-closed residual, and reject non-eager/non-bounded/non-evaluable cases via diagnostics rather than widening the implementation opportunistically (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:99-159).

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

Compliant — docs-only; it explicitly says “No Rust execution code lands in this brief; no new substrate carriers are declared here” (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:3-6). The future substrate dependencies are named as prerequisites rather than modeled ad hoc in this slice (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:79-94).

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

Compliant — fail-closed and facts-flow-forward are handled directly: future PR-B.1 must error on every non-eager/non-bounded case (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:54-56), must keep both LoopBound variants as non-optional dispatch arms (:122-126), and must turn LoopBound::Descent into a diagnostic rather than a hang or silent skip (:132-138). Single-authority is also preserved for memoization by requiring the declared {program, node, state_key, strategy} carrier (:146-149).

  1. CODING.md.

N/A — no Rust code is changed. The brief does constrain future code toward structured outputs and typed diagnostics by requiring Diagnostics for non-evaluable cases (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:155-159), but there is no implementation surface to review for data/free-function style or helper placement.

  1. TESTING.md.

Compliant — this PR intentionally adds no tests because it is a docs-only design lock with no executable behavior or fixtures (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:214-225). It also avoids prematurely strengthening TC2 while only one executable strategy exists, keeping the future test claim behavior-driven rather than pretending to prove differential semantics before the second strategy lands (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:168-173).

  1. LOCKED DESIGN DECISIONS.

Compliant — the brief consumes existing authorities instead of silently altering them: it points to the PB runtime interpreter design for evaluation rules, runtime carrier briefs/files for Value/EvalFrame/EvalStateStack, and the PR-A.3 audit for strategy/memoization (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:32-44). It also explicitly forbids first-class captured closures by tying callable identity back to the existing no-ClosureValue decision (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:183-187).

  1. TRACKED vs UNTRACKED DEBT.

Compliant — the residuals are tracked, bounded, and have named triggers. The LoopBound::Descent residual names the required dissolution slice that consumes std.termination DescentEvidence and lowers it to bounded iteration (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:132-138). The wider R3 residual is bounded by specific missing carriers/semantics/witness work rather than vague scheduling (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:189-212).

3. Verdict

APPROVE. The PR is a clean docs-only design slice: it narrows PR-B.0 to an eager baseline, names the missing prerequisites, and treats unsupported execution paths as explicit residuals rather than silent implementation freedom. I found no diff-line-supported invariant violation.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-thinking
  • Commit: 77c82e6a · Trigger: manual
  • Comparison: main @ d892e127 ... session/merry-heron-351-pr-b-brief @ 77c82e6a
  • Conversation: View conversation

1. Story of the diff

This PR turns PR-B from an unauthored evaluator-design slot into a split body-evaluator/witness lane. The manager table now records that the body half has a PR-B.0 design slice while leaving witness construction explicitly unauthored (docs/briefs/r2-evaluator-manager.md:10). The new brief is deliberately docs-only: it locks an eager, deterministic body-evaluator baseline over bounded .dag bodies, names the live runtime carriers it can rely on, names the strategy/memo carriers that still block PR-B.1, and draws the R3 residual boundary for lazy/normal-order execution, TC2 strengthening, witness construction, cross-target execution, and LoopBound::Descent execution (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:22-65, :189-212). Load-bearing design choices are the non-optional dispatch over all five Behavior variants, fail-closed handling for unsupported strategy/body/loop cases, and the explicit memo-key authority shape (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:109-159).

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation). Compliant — this is a docs-only design slice that explicitly says no Rust execution code and no new substrate carriers land here (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:22-25). It touches substrate semantics only by naming existing/future carrier authorities, not by declaring substrate.
  2. INVARIANTS.md + modeling-discipline.md. Compliant — the brief honors fail-closed and facts-flow-forward rather than silently narrowing the substrate. It requires LoopBound to dispatch both Cardinality and Descent, with Descent as a named diagnostic residual plus dissolution trigger, so it does not erase the proof-state arm (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:122-138). It also names P3-style diagnostic behavior for unsupported strategies and non-evaluable bodies (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:141-159), matching the invariant rubric that failures must not fabricate plausible output and must be typed/diagnostic rather than silent. chatgpt-review-b2b7d691-cffd-4a…
  3. CODING.md. N/A — no Rust implementation or APIs are changed. The future implementation guidance does align with the style doc’s structured-output/error-path expectations by requiring Diagnostic rather than panics or silent None (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:155-159). chatgpt-review-292059f2-74b8-4c…
  4. TESTING.md. Compliant for this PR’s scope — the acceptance gate explicitly says this PR is docs-only with no new test fixtures (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:214-225). Because no executable behavior lands, there is no behavior surface to test yet; the brief instead preserves the existing deferred TC2 hook and says it cannot strengthen until multiple executable strategies coexist (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:168-173). chatgpt-review-0e4c67a4-b245-41…
  5. LOCKED DESIGN DECISIONS. Compliant — the brief does not alter locked substrate/runtime decisions; it consumes existing authorities and explicitly preserves the no-closure decision by stating ClosureValue may not be added and Callable(DeclarationId) remains the callable identity (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:183-187).
  6. TRACKED vs UNTRACKED DEBT. Compliant — the residuals are bounded and named. The PR lists the blocking absent carriers, the R3 causal gaps, and an ordered closure chain (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:79-97, :189-212). The LoopBound::Descent scaffold is specifically documented, bounded to fail-closed diagnostics in PR-B.1, and has a named dissolution trigger: a descent-execution slice consuming std.termination DescentEvidence and lowering it to bounded iteration (docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md:132-138). This satisfies the progress/scaffold requirement rather than creating untracked bridge debt. chatgpt-review-b2b7d691-cffd-4a…

3. Verdict

APPROVE. I found no blocking or non-blocking findings against the diff. The PR is a clean docs-only design lock: it narrows PR-B.0 to a shippable body-evaluator baseline, defers execution where carrier authority is absent, and names fail-closed residuals rather than normalizing partial evaluator behavior.

@briansrls
briansrls merged commit 210bf6d into main Apr 30, 2026
4 checks passed
@briansrls
briansrls deleted the session/merry-heron-351-pr-b-brief branch April 30, 2026 15:42

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review metadata

  • Provider / model: codex / unknown
  • Commit: 77c82e6a · Trigger: schedule
  • Thinking: 177s wall

Non-blocking — Strengths

  • docs/briefs/r2-pr-b-body-evaluator-eager-baseline.md Docs-only PR-B.0 stays within design scope, names PR-A.3 carrier prerequisites, and tracks lazy/TC2/witness/descent execution as bounded R3 residuals instead of silently broadening PR-B.1.
  • docs/briefs/r2-evaluator-manager.md The manager row now separates the body-evaluator half from the witness-construction half, matching the brief’s residual boundary.

✅ No blocking concerns; the prior LoopBound facts-flow-forward issue is addressed and the remaining gaps are explicitly deferred.

@briansrls

Copy link
Copy Markdown
Contributor Author

Already addressed at HEAD 77c82e6a (commits f2e6a4a + 09d4037 from before the relay fired). The Loop rule now dispatches both variants of LoopBound:

  • LoopBound::Cardinality { count: PortId } — executable in PR-B.1 (read count, execute finite iteration; fail-closed Diagnostic if witness unavailable).
  • LoopBound::Descent { cluster: ClusterId } — named fail-closed residual at PR-B.1, every Descent loop emits a Diagnostic. Dissolution trigger: separate descent-execution slice consuming std.termination DescentEvidence.

LoopBound::Descent is also explicitly listed in the R3 residual line. The two subsequent approve reviews on 77c82e6a (codex codex-default and openai-pro gpt-5-5-thinking) both verified the dispatch covers both variants.

— sent from merry-heron-351

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