step.26.diff.txt -- narrative retro for step.26 (U5.4a: the
                    foreign-workspace arc + guard). Companion:
                    step.26.gdiff.txt via ../scripts/step_gdiff.

Executed: 2026-07-22, same session as steps 22-25. WORK commit b86005a.

## Plan vs actual

+---+--------------------------------------+--------------------------------------+
| # | Planned (brief)                      | Actual                               |
+---+--------------------------------------+--------------------------------------+
| 1 | "b3ubot drives one complete UoW in   | Probing sharpened it: tmp-workspace  |
|   | a repo that is not itself" (the      | arcs were ALREADY M1-proven; the     |
|   | amendment's original phrasing)       | real gaps were the state store's     |
|   |                                      | workspace-blindness and a foreign    |
|   |                                      | arc WITH a plane verdict + real      |
|   |                                      | closure. Both delivered.             |
| 2 | Ledger amendment                     | Done through the ENGINE'S OWN        |
|   |                                      | add-row (rehearsed on a copy; the    |
|   |                                      | machinery placed the row past        |
|   |                                      | U5.4's note block correctly) and     |
|   |                                      | closed through `ledger close` --     |
|   |                                      | the amendment path, dogfooded both   |
|   |                                      | directions.                          |
+---+--------------------------------------+--------------------------------------+

## Surprises / genuine findings

1. **The state store was workspace-blind** -- records keyed by UoW id
   alone in one shared data home meant project B's `verify U1.1`
   would silently read project A's record. The (p2) hazard exactly.
   The guard stamps at start_state, refuses on POSITIVE mismatch
   only (unstamped legacy records pass -- the engine never invents
   provenance it did not record, C-26-C), and names the per-project
   $B3UBOT_HOME remedy in the refusal.
2. **The measure-don't-sum rule fired the same day it was written**:
   this step's first-draft totals said 658; the run said 657 (my
   reconciliation sum was off by one). The step file now records its
   own correction -- rule enforcement as a lived habit, two steps
   running.
3. **U2.3-era machinery earned its keep on its own repo**: add-row
   placed a row after a note-block-bearing row correctly on the
   first real invocation -- the exact operation whose hand-edited
   equivalent broke step.24.
4. The hermetic foreign arc asserts b3ubot's own porcelain
   byte-identical before/after (C-26-D) -- the "not one dropping"
   claim is now a regression test, not a hope.

## Scope discipline

In: the amendment row (via the engine), the guard, the foreign proof
(hermetic + live). Out and named: per-workspace data-home
NAMESPACING (the richer future; the guard makes the hazard loud
today), retroactive stamping (never -- invented provenance), U5.5.
Zero b3u-repo changes; zero CLI-surface changes.

## Numbers

- persistence.py: +1 field, +1 param, +1 guard; 5 stage entries
  threaded (drafting also stamps).
- New tests: 7 hermetic + 1 live; suite 647 -> 657 collected (8 new
  + 2 own-corpus step.26.txt), 632 passed + 25 skipped, 0 failed --
  measured after the last edit, corrected once against a hand-sum.
- p5_gates: live 13 -> 14 legs; hermetic twin 56+13 -> 63+14; ALL
  PASS first post-extension run.
- Ledger: U5.4a added AND closed by the engine's own CLI.

End of retro.
