DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-214-loomworks-findings-panel-closing-state-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-214 — The findings panel reports the close: the all-closed outcome gets its rendering (B-99) (v0.1)

Version. 0.1 · Date. 2026-08-14 · Author. Claude Code (drafting, from [B-99] + scoping-notes/loomworks-b101-b99-scoping-note-v0_1) / Marvin Percival (approving). Target. /Users/dunin7/loomworks (surface only — one component, one site). Baseline. Surface 322a216 (or CR-2026-213's landing, whichever stands when this executes — Step 0 confirms). Ordering. Behind CR-2026-213, per the Operator. Charter. Autonomous regime. Status. DRAFT — awaiting the gate. Do not execute.


0. Settled — the Operator's rulings. Do not re-raise.

  1. The framing is the criterion the sweep produced: empties-as-idle-state versus empties-as-action-outcome. That is what separates the defect from the idiom — and what stops this fix from reading as "guards that return null are wrong." The house renders idle-empties honestly everywhere (MemoryRoom's "Nothing held right now," Home's lists, the dashboard's labeled empties); the defect was specifically an ACTION-outcome empty — the Operator's answer emptied the list — hitting a guard written for idle-empties. The sweep established the panel is the ONLY live instance; this CR fixes one site and changes no idiom.
  2. The ledger line this CR answers, kept in view: the right outcome unreported is a weaker version of the wrong outcome reported, and the arc has produced both. The CR's own §0 ruled "closed or re-raised, never an assumed close" — the build implemented re-raised but not all-closed. This is the missing half.
  3. The CandidateCommitBanner adjacency gets its one sentence (§2) — reload-as-report is cruder than a confirmation but not silent, and it becomes B-99's shape exactly if that reload ever softens. Noted, not fixed here.

1. The changes

One site. CandidateFindingsPanel: the render guard distinguishes the two empties. Idle-empty (mount fetch returned none — no findings existed to answer): render nothing, exactly as today. Action-outcome empty (an answer's induction cycle returned zero open findings): the panel STAYS and renders the closing state — "Re-reviewed (cycle N) — nothing left open. This draft is ready to commit." — the report rendered where the action happened, handing off to the banner one block above. Mechanically: the converged outcome sets a closedAtCycle state rather than relying on the findings array alone; the guard checks it before nulling. The closing state retires naturally on navigation/refetch (a fresh mount with no findings is an idle-empty again).

Nothing else. No shared mechanism, no idiom change, no banner change (§0.3's sentence rides in §2).

2. Consequences named, so they are chosen

3. Tests — each observed failing first

The converged outcome renders the closing state BEFORE any unmount (the missing test the walk exposed — drive {converged: true, findings: [], cycle_number: N} through the answer flow; assert the report renders); the idle-empty still renders nothing (the criterion's other direction, pinned); the still-open outcome unchanged (existing test re-run); the closing state names the cycle. Existing panel suite re-run.

4. seed-mutability impact

Kind C expected: one component's render states. Checked at Step 1; a null finding is an entry.

5. Build steps

| Step | What | Mode | |---|---|---| | 0 | Pre-flight — baseline (post-213), clean tree. | Auto | | 1 | Verify the guard + answer flow against code; tests written, observed failing. | Auto | | 2 | The closing state. | Auto | | 3 | vitest; tsc; lint (the standing local gate list). | Auto | | 4 | Eye-test: disposable draft-route candidate (turn-less — [B-93] routed around, again, by the recorded plan), answer its findings down to zero through the panel, observe the closing state render live; discard clean. | Auto | | A | Checkpoint. | Checkpoint | | 5 | Tag; push; watch (verdict read directly); redeploy; post-deploy smoke. | Auto |

6. Acceptance gate

  1. The all-closed outcome renders its report before any unmount — observed live at Step 4.
  2. Idle-empties render nothing, byte-identical (the criterion, both directions, tested).
  3. Suite green; tsc; lint; run watched; redeployed; seed-mutability recorded.

7. Kickoff prompt


Execute CR-2026-214 v0.1 at change-requests/cr-2026-214-loomworks-
findings-panel-closing-state-v0_1.md in loomworks-record. Surface
repo only. Confirm baseline first (post-213).

§0: empties-as-idle vs empties-as-action-outcome — one site, no
idiom change. The report renders BEFORE any unmount; the idle
direction stays byte-identical. The banner adjacency is one
sentence, not a change.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-214 — the findings panel reports the close — v0.1 — 2026-08-14 The right outcome, reported where the action happened. One site, not a habit.