Files
ARCADIA-Studio/harness/release-scenario-lifecycle-independent-review-20260911.md

5.9 KiB
Raw Permalink Blame History

B4 lifecycle projection review — 2026-09-11

Reviewer: Codex-9e8r6t /root/behavior_audit. Read the updated PROJECT_GOAL.md, issue #1 through comment 104, open PRs (none), and the integration Wiki. Reviewed verified local codex/behavior-snapshot-eb5161b through git show, with isolated read-only copies in .local/scenario-lifecycle-review-20260911/. No checkout, shared Rust edit, Cargo, native input or new executed Rust result. Creation owns shared wiring/Cargo; root owns integration/native acceptance.

The 283-line pure module has no confirmed branch/reply/reuse propagation defect in this review. It reads exact local receiver IDs, never borrows a missing receiver from exchange endpoints, treats siblings independently, keeps conditional/repeated/parallel exits explicitly unresolved, and never traverses a ScenarioUse target. Replies remain correlation events, not births/deaths. Source/history purity follows from the borrowed inputs and absence of commands or serialization writes. The other host reports its ten tests passing in comment 102; those use hand-authored geometry and do not establish compatibility with the current Scene.

Three concrete integration issues must be resolved before accepting B4 rendering:

1. P2 — insertion bounds are not visible lifetime bounds

Scene::sequence starts occurrences at y=148; occurrences records sequence bounds as (initial y−42, final y−42) (behavior.rs:1234,1311,1526). Visible lane guides instead run from 85 to scene height−20, where height is max(final y+45,210) (:1261–1268). B4 sequence uses the supplied span unchanged and interval drops zero-length spans (scenario_lifecycle.rs:169–179,275).

Consequences of passing the current maps unchanged, as the handoff proposes:

  • An empty scenario has root bounds 106..106 but a visible guide 85..190. Every pre-existing lifeline receives no lifetime intervals and no uncertainty, despite the chosen pre-existing-lifeline convention.
  • A scenario with just Create at row 148 has root bounds 106..198, so its live interval ends at 198 even without Delete; the visible guide continues to 265. The proposed “continues to scenario bottom” behavior therefore leaves an unexplained 67 px tail. Nonempty root sequences also omit the 21 px region below the identity header.

Required integration change: distinguish visible lifetime extents from insertion/activation bounds. Supply an explicit root lifetime span or a dedicated rendering span map; preserve the existing slot/activation maps. Use actual Scene geometry in regressions for an empty scenario and one Create with no Delete. The existing synthetic root span 0..600 cannot catch this mismatch.

2. P2 — an open activation can continue beyond a branch-local death

activation_sequence handles a correlated Reply and fragment splits, but treats Delete as the default no-op (behavior.rs:1553–1640). On an entered operand it draws an unreplied activation through that operand's end. B4 correctly switches that same path to Absent at Delete (scenario_lifecycle.rs:239–241). Keeping the existing activation geometry unchanged therefore produces contradictory geometry after an X.

Concrete source-derived case: Call A→B; ALT { left: Delete B; right: empty }. The core lifetime ordering rule allows the earlier call and keeps the exclusive empty sibling independent (validation.rs:1505,1766); an ordinary admission assertion should remain part of the new regression. Current Scene arithmetic places the call at 148, ALT at 240, left operand at 343..435 and Delete at 385. The inherited call activation extends to 435, 50 px beyond B's death at 385. The right operand must retain its independent activation status.

Required integration change: clip or explicitly terminate the activation's visible path at the local death while preserving the unresolved-call diagnostic and original correlation. Do not invent a Reply or close every sibling path. The test must inspect real Scene activation geometry alongside B4 lifetime intervals, with exact model/source/history unchanged.

3. P2 — the interactive lane map omits valid incomplete lifelines

B4 returns every direct Lifeline, including represented=None (scenario_lifecycle.rs:80–84). Current Scene computes positions and draws headers/guides for all those lifelines, but copies only represented ones into Scene.lanes (behavior.rs:1215–1232). That filtered map serves endpoint placement; it is not the complete rendering-position map.

Required integration change: use the complete local lane_x map or a separate full rendering map for B4 intervals and markers. Indexing B4 output through Scene.lanes would panic or silently omit an unassigned lifeline. Preserve the existing placement eligibility filter separately. Add an ordinary warning-admitted unassigned-lifeline fixture, including an explicit local receiver with unresolved exchange, and verify marker/header selection retains real IDs.

Acceptance boundary

These are source-derived integration findings, not claims of a running B4 UI defect: the module is still standalone on this host. Its pure state rules can be integrated after the three boundaries above are addressed. Also pin receiver geometry when wiring self-Create/Delete: current self arrows arrive at row+24 while B4 markers use the recorded row, so endpoint adaptation must deliberately align the capsule/X and arrow. This alignment was already required by the author's design and is not a fourth newly discovered semantic defect.

The new text-only usability requirement does not justify adding source annotations for derived lifetime geometry. Create/Delete, operands, explicit lifelines and ScenarioUse bindings already carry the semantics. Keep interval/marker/uncertainty state derived, preserve accepted text exactly, and use real graphical/source/API fixtures plus minimum/wide native checks for integration acceptance.