DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-172-loomworks-small-work-sweep-surface-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-172 — Small-work sweep: surface cluster (v0.1)

Version. 0.1 Date. 2026-08-06 Author. Claude.ai (drafting) / Marvin Percival (approving). Target. /Users/dunin7/loomworks, branch main. Baseline reference. main HEAD 1245f1c7584db19921f430b429f69a844221b4ed (2026-08-05T12:18:21-04:00), confirmed clean tree at Step 0 inspection. Priority. Standard. Confidential. Internal DUNIN7. Companion to. inspection-briefs/loomworks-small-work-sweep-step-0-inspection-brief-v0_1.md; inspection-briefs/loomworks-small-work-sweep-step-0-findings-v0_1.md (the evidence baseline for every item below — file/line citations are not repeated here); current-status/dunin7-status-brief-v0_36; standing-notes/dunin7-build-list-v0_29. Charter. standing-notes/dunin7-standing-authorization-charter-v0_1. Autonomous regime in effect — this CR does not require a pre-execution Operator halt beyond the checkpoint named in §4. Status. Ready for CC execution. CR number. 172 is a best-guess next slot, one past the engine cluster's 171. Claude.ai cannot read the record's CR ledger directly; CC should confirm no collision before filing and renumber if one exists. Supersedes. None — companion to CR-2026-171, drawn from the same sweep.


1. Executive summary

Three small, surface-only fixes. No new mechanism, no schema change on either side. B-36's engine route already exists and is already complete — this CR builds only the button and the confirmation it needs.


2. Scope — three items

2.1 B-57 — the Manifestation staleness screen appears to argue with itself

Fix. src/lib/strings.ts:1200-1205 — add a clarifying clause to composeMemoryCurrent or composeVersionPair naming that the version counter also moves for reasons unrelated to content, so the two sentences stop reading as contradictory. Possibly a one-line JSX adjustment in ManifestationRoom.tsx's StalenessBlock (lines 61-90) if the clause needs to reference both values together. No logic change — the underlying distinction (memory_has_changed vs. the version counter) is already correct and already documented in the component's own comment block.

Test. Component test / snapshot on StalenessBlock asserting the clarified composition.

2.2 B-38 — RenderingRoom hand-rolls its own state branch

Fix. RenderingRoom.tsx (lines 154-167, 178-190) — destructure .state from usePagedList instead of loading/error/items directly; replace the three if-blocks with a switch over state.status (four cases), mirroring ShapingRoom.tsx:214-260. Confirmed drop-in, not a behavior change — the hook's own precedence (failed outranks empty/populated; unloaded/loading render identically) matches RenderingRoom's existing check order.

Test. Existing RenderingRoom tests should pass unchanged. Add one test asserting the unloaded/loading render path if not already covered.

2.3 B-36 — no way to retire a render

Fix. One button plus one confirmation dialog with a required rationale field, wired to the existing, already-complete POST /engagements/{id}/renders/{id}/retire route. No schema change needed — the request body is already just rationale: str.

Test. Component test confirming: the dialog requires a rationale before it will submit; the confirm step is required before the route is called; the button only appears on a render in 'produced' state, matching the endpoint's own irreversibility precondition (no un-retire path exists anywhere in the engine).


3. Explicitly out of scope

Per the findings document's §5 and §6, six items are confirmed but do not belong in this CR:

None of these six is absorbed here.


4. Build steps

| Step | What | Mode | |---|---|---| | 0 | Pre-flight — confirm main matches baseline HEAD above; confirm tree clean. | Auto | | 1 | B-57 fix + test. | Auto | | 2 | B-38 fix + test. | Auto | | 3 | B-36 fix + test. | Auto | | 4 | Full surface sweep — lint, tsc, build, vitest. No regressions. | Auto | | A | Checkpoint — Operator confirms before tag. | Checkpoint | | 5 | Tag cr-2026-172-small-work-sweep-surface. Push. | Auto (post-checkpoint) |


5. Acceptance gate

  1. eslint / tsc / build / vitest all clean.
  2. StalenessBlock no longer reads as self-contradicting.
  3. RenderingRoom's loading / error / empty / populated branches are driven by state.status; behavior unchanged from before the fix.
  4. A produced render can be retired from the surface, with a required rationale and a confirmation step; a retired render offers no retire control.

6. Post-CR state

Three surface-only fixes. No engine change, no migration. Component test count +2 to +4.


7. Kickoff prompt for the Claude Code session


Read the Change Request at the path I supply below. This is CR-2026-172
v0.1, the small-work sweep's surface cluster. You are the executing agent.
Confirm the CR number against the record's ledger before filing; renumber
if 172 collides with something already filed (and confirm CR-2026-171
was filed first, or file this one as a true standalone if not).

CR path: ~/Downloads/cr-2026-172-loomworks-small-work-sweep-surface-v0_1.md

Three small surface fixes: B-57 (staleness screen's two sentences read
as contradictory — string clarification only), B-38 (RenderingRoom
hand-rolls the state branch usePagedList already provides via .state),
B-36 (retire-a-render control — the engine route is already complete;
build the button + confirmation dialog with a rationale field).

Baseline: surface main at 1245f1c7584db19921f430b429f69a844221b4ed,
confirmed clean.

None of the three has an open design decision — implement per the
CR's §2, each mirroring a pattern already proven elsewhere in the
same repo (ShapingRoom.tsx for B-38's switch shape; the existing
retire route's own precondition for B-36's button visibility).

Full lint/tsc/build/vitest sweep at Step 4. Checkpoint before tagging.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-172 — Small-work sweep: surface cluster — v0.1 — 2026-08-06