DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-185-loomworks-b52-persist-answer-sources-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-185 — B-52: answer sources were never persisted (v0.1)

Version. 0.1 · Date. 2026-08-07 · Author. Claude.ai (drafting) / Marvin Percival (approving). Target. /Users/dunin7/loomworks-engine and /Users/dunin7/loomworks. Baseline. Engine post CR-2026-184; surface post CR-2026-184. CC confirms at Step 0. Companion to. inspection-briefs/loomworks-small-work-sweep-step-0-findings-v0_1.md §6. Charter. Autonomous regime. Status. Ready for CC execution. Sequencing: after CR-2026-183 resolves, since what counts as a source may change.


1. Summary

Sources shown with an answer disappear when the conversation is reloaded. The Step 0 sweep established the cause precisely: they were never persisted into conversation history at all — not dropped on refresh. There is nothing to restore, only somewhere new to store them going forward.

Design decision, settled in advance: a new structured_data variant on the conversation-history write, engine-side. This was the sweep's own finding as the only technically sound path.


2. Why this waits on CR-2026-183

B-61 may change what an answer's sources are — if Tier-2 comes to contribute to AnswerSource, persisting today's set would persist an incomplete one and make it durable. Building the persistence before the definition is settled means writing the wrong thing permanently.

If CR-2026-183 has not resolved at Step 0, halt. This is a real dependency, not ordering preference.


3. Scope

Engine.

  1. New structured_data variant carrying an answer's sources, written at the same point the answer itself is written to conversation history.
  2. Sources persisted are the same rows the answer was built from — never reconstructed, never re-derived at read time, never taken from what the model claims. The existing non-fabrication guarantee (test_sources_cannot_contain_an_identifier_not_retrieved) must hold across persistence, and CC extends it to cover the reload path.
  3. Historical answers have no persisted sources and cannot gain them. They must not silently render as "no sources" — an answer with sources that were never stored is different from an answer with none, and the surface must be able to tell them apart. CC reports how it distinguished them.

Surface.

  1. Read persisted sources on reload; render as they render live.
  2. Handle the historical case per §3.3 — not as an empty source list.

4. Out of scope


5. Build steps

| Step | What | Mode | |---|---|---| | 0 | Pre-flight. Confirm CR-2026-183 resolved. Halt otherwise. | Auto, hard gate | | 1 | structured_data variant + write path + tests. | Auto | | 2 | Non-fabrication guarantee extended across persistence and reload. | Auto | | 3 | Historical-answer distinction; report the mechanism. | Auto | | 4 | Surface read + render + tests. | Auto | | 5 | Both suites; ruff 0; mypy at/below baseline. | Auto | | A | Checkpoint. | Checkpoint | | 6 | Tag cr-2026-185-b52-persist-answer-sources. Push. | Auto |


6. Acceptance gate

  1. Sources survive a reload, identical to what was shown live.
  2. Non-fabrication holds across persistence — a source that was not retrieved cannot appear after reload either.
  3. Historical answers are distinguishable from answers with genuinely no sources.
  4. Both suites green, both gates clean.

7. Kickoff prompt


Execute CR-2026-185 v0.1 at ~/Downloads/cr-2026-185-loomworks-b52-
persist-answer-sources-v0_1.md. Confirm the CR number first.

HARD GATE at Step 0: CR-2026-183 (B-61, citability) must have resolved.
B-61 may change what an answer's sources ARE, and persisting today's
set before that settles would make an incomplete set durable. Halt if
it hasn't.

B-52's cause is settled: sources were never persisted at all, not
dropped on refresh. Nothing to restore — somewhere new to store them.
The remedy (a structured_data variant on the conversation-history
write) is pre-decided; don't reopen it.

Two things that matter more than the mechanism:
- The non-fabrication guarantee must hold across persistence AND
  reload. Extend the existing test, don't assume it carries.
- Historical answers have no stored sources and must NOT render as
  "no sources" — that's a different claim. Report how you distinguished
  them.

Do not backfill historical answers. The retrieved rows weren't recorded
and reconstructing them would be inventing provenance.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-185 — B-52 persist answer sources — v0.1 — 2026-08-07