DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-212-loomworks-findings-visible-and-answerable-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-212 — The finding becomes visible and answerable: B-98 faces 1+3, built as one honest posture (v0.1)

Version. 0.1 · Date. 2026-08-14 · Author. Claude Code (drafting, from [B-98] + scoping-notes/loomworks-b98-split-scoping-note-v0_1) / Marvin Percival (approving). Target. BOTH repos: /Users/dunin7/loomworks-engine (face 1 — findings into candidate-tier context) and /Users/dunin7/loomworks (face 3 — the candidate page's findings panel with the answer affordance). Baselines. Engine f011c80, surface a1deb86. CC confirms at Step 0. Companion to. [B-98] (build list v0.80, paired with [B-93]), the split scoping note, inspection-briefs/loomworks-e0128-walk-companion-findings-blindness-v0_1. Charter. Autonomous regime. Status. DRAFT — awaiting the gate. Do not execute.


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

  1. Faces 1+3 only. Face 2 waits, and its four design decisions stay enumerated in the split scoping note — a scoping note that has already done its work. Nothing here decides what a conversational answer DOES, who closes a finding, or whose hands sign a conversation-driven amend.
  2. One honest posture, not two features (the Operator's framing, settled): findings in context without an amend affordance gives the Companion a problem it can see and can't help with — and the standing note then requires it not to offer. The composed posture "here's the finding; the panel above answers it" is only true once face 3 exists. The two faces make each other honest; they ship together or the posture is a lie in one direction or the other.
  3. Amend→induct is a FLOW FACT, not an implementation detail — named so nobody later reads amend alone as the fix and wonders why the finding stayed open. Each amendment writes a new seed version; the close comes from the induction cycle (POST /engagements/{id}/seed/induct) re-reviewing what the amendment satisfied. Door 3 never needed the pair because its induction ran at extract; the candidate page does.
  4. Wrinkle B takes CR-2026-202's precedent — ask the seed's own log — rather than not caching. Same shape one log over, already proven, and it keeps the cache doing its job. If the build shows that is harder than skip-caching candidate contexts, HALT and say so rather than switching quietly.
  5. The named acceptance criterion: the finding's suggestion text renders to the Operator on E0128's page. Not the count — the sentence. It has been behind a route nobody calls since Aug 12.

1. The changes

A. Face 1 — the Companion sees its own gate (engine). For candidate-state engagements, load_engagement_context gains an open-findings block: the same seed-lineage read the GET route performs (requirement_identifier, location_in_seed, suggestion per open finding), formatted into the context the tier loaders assemble. The block's prompt posture is capability-honest per the standing note (offers gate on capability): the Companion states the finding and points at the panel — the finding can be answered from the project's page — and does not offer to close it (face 2 is unbuilt; the sentence face 3 ships makes this pointer true on arrival). Active engagements are untouched (no findings block — their gate has passed).

B. Face 1's cache freshness — the CR-2026-202 shape, one log over. The context cache invalidates on current_engagement_version, which finding changes do not bump (findings live on the ADMINISTRATIVE log, keyed by seed_id). On a cache hit for a candidate-state entry, additionally check finding freshness against the seed's own finding lineage (e.g., max object_version + count for the seed_id on the ADMIN log — one indexed query, the same discipline B-77 applied to the unpinned seed ref). Stamp the marker at build, compare at hit. Halt clause per §0.4 if this proves harder than it reads.

C. Face 3 — the candidate page renders and answers (surface). On the candidate engagement page (the banner's home), a findings panel: each open finding rendered with its location_in_seed, suggestion, and cycle number — the sentence, not the count. Per finding, an answer affordance: a text field scoped to the finding's location_in_seed, submitting amend → induct (partial POST /engagements/{id}/seed with only that field, then POST …/seed/induct), then refetching findings and the engagement state. The existing amendCandidateSeed adapter is shared out of door3.ts (an import, not a port — established in the scoping); a thin inductSeed adapter is added beside it. Creator-gated exactly as the ceremony is (viewer_is_creator is already on the wire). While induct runs, the panel says so; when the cycle returns, the panel shows what actually happened — closed, or re-raised with the new cycle's findings (induction may honestly decline the answer; the panel renders the outcome, never assumes the close).

D. Nothing else. No intent changes; no assertion↔finding linkage; no conversational write path (face 2's room); [B-93]/[B-94]/[B-97] untouched; the banner and commit ceremony untouched (CR-210's truthful sentence continues to name the count — the panel above it now shows the substance).

2. Consequences named, so they are chosen

3. Tests — each observed failing first

Engine: candidate-state context contains the findings block (suggestion text present verbatim); active-state context contains none; the capability-honest posture line present; cache: a finding close/raise on the ADMIN log invalidates a cached candidate context (the B-77-shaped check), and an unchanged log preserves the hit. Surface: the panel renders suggestion (the sentence, asserted verbatim — the named criterion's unit twin); the answer flow calls amend with ONLY the answered field then induct, in that order (the flow fact pinned as a test); the re-raised outcome renders rather than a assumed close; no panel on active engagements. Existing context/prompt and candidate-page suites re-run.

4. seed-mutability impact

Kind A expected, named: face 1 READS findings (computed off the seed's induction lineage) into a context that stops at the prompt; face 3 WRITES the seed only through the existing amendment ceremony (a new version via the existing route, existing attribution — the creator). No new write path, no linkage, no schema change. B-69's standing question is adjacent but untouched (established in the split scoping). Checked at Step 1.

5. Build steps

| Step | What | Mode | |---|---|---| | 0 | Pre-flight — both baselines, clean trees. | Auto | | 1 | Verify render site, context assembly points, cache mechanics AGAINST CODE (and per this arc's standing lesson: probe what can be probed — the induct route driven live on a disposable candidate before the panel is built against it); tests written, observed failing. | Auto | | 2 | Face 1 + cache freshness (engine). | Auto | | 3 | Face 3 (surface): panel + adapters + answer flow. | Auto | | 4 | Full suites both repos; ruff/mypy (engine, verdicts in full); tsc (surface). | Auto | | 5 | Eye-test: E0128 live — the suggestion sentence renders on the page (the named criterion, render-only; E0128's answer is the Operator's act, not the eye-test's); the full answer flow exercised on a DISPOSABLE draft-route candidate (no turns → discardable, [B-93] not triggered), cleaned up after; Companion asked about the finding on the disposable candidate → describes it and points at the panel. | Auto | | A | Checkpoint. | Checkpoint | | 6 | Tag; push both; watch both runs; redeploy engine + surface; post-deploy: the Operator's walk on E0128 — the sentence, on their screen. | Auto |

6. Acceptance gate

  1. The named criterion: E0128's page renders the finding's suggestion text — the sentence, not the count — observed by the Operator post-deploy.
  2. The answer flow (amend→induct, the flow fact) closes a satisfiable finding on a disposable candidate, observed live pre-checkpoint; outcomes render honestly either way.
  3. The Companion, asked about a candidate's finding, describes it and points at the panel — and does not offer to close it (the posture, capability-honest, both faces holding hands).
  4. Cache freshness: finding changes invalidate; unchanged logs keep the hit (tested). Halt clause honored if the precedent's shape didn't fit.
  5. Suites green both repos; gates clean; runs watched; redeployed; seed-mutability recorded.

7. Kickoff prompt


Execute CR-2026-212 v0.1 at change-requests/cr-2026-212-loomworks-
findings-visible-and-answerable-v0_1.md in loomworks-record. BOTH
repos (engine f011c80, surface a1deb86). Confirm baselines first.

§0: one honest posture, not two features; amend→induct is a flow
fact — name it in code comments too; wrinkle B takes CR-202's
precedent, halt rather than switch quietly; the named criterion is
the SENTENCE on E0128's page. Probe the induct route live before
building against it. Face 2 stays unbuilt and unoffered.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-212 — findings visible and answerable — v0.1 — 2026-08-14 The finding gets a face and a door. The Companion points; the panel answers; the cycle closes. Behind a route nobody calls — until now.