Version. 0.7
Date. 2026-08-01
Charter. standing-notes/dunin7-standing-authorization-charter-v0_1, ratified 2026-07-30.
Author. Claude Code (execution session). Operator: Marvin Percival.
Supersedes. v0.6 at record 38a7014. v0.5 at 32182bf, v0.4 at 1ec5c2a, v0.2 at 40571cf, v0.1 at 602bd9c stand as siblings. v0.3 remains deliberately absent.
Changes from v0.6. B-5 is done. CR-2026-160 merged, tagged and pushed — the Operator Layer's first merge under the charter. The Manifestation room exists, and the four strings that described a record nobody had read are gone. One new decision-queue entry (Q-4) and one new build-list candidate.
Generated from git log at filing time, per v0.4's rule.
loomworks) — the first surface merge under the charter
main at 7e81e30, tag manifestation-room-v0_1 at the same commit, both pushed and origin-verified. Previous main was 99f7f64, unmoved since 2026-07-30.
Seven commits on cr-2026-160-manifestation-room, merged --no-ff:
| Commit | Step |
|---|---|
| 6eb1b7f | 1 — the room state contract in usePagedList (§5.1) |
| a4c8b55 | 2 — the wire-boundary adapter and its wall entry (§5.2) |
| fc298e0 | 3 — ManifestationRoom and the RoomView wiring (§5.3, §5.4, and §5.7) |
| 344e7df | 4 — the four strings assert the surface (§5.5) |
| 5381883 | 5 — canMove stops deriving a claim from a failed read (§5.6) |
| bcd350d | 5b — twenty machine checks for the contract, the room and the gaps |
| a5d3dd0 | 6 — implementation notes |
docs/phase-crs/ now exists in loomworks, as v0.6 §7 predicted it would need to.
loomworks-engine)
main at e106917, untouched. Read only, for the OpenAPI schema check described in §2. No branch, no commit, no edit.
loomworks-record)| Commit | Subject | |---|---| | this filing | CR-2026-160 Checkpoint A report v0.1 and status brief v0.7 |
A room states only what it has read back. Three faces, and all three now hold in the Manifestation room.
The contract is the mechanism, not a label. ReadState<T> in usePagedList gives five values, and the two that make a claim about the record — empty and populated — both carry readAt, the timestamp of the completed read that produced them. Neither can be constructed without evidence of a read; unloaded and loading carry none, because they claim nothing. A room can still choose a poor sentence, but it can no longer render "there is nothing here" out of a value no read produced, because that value cannot exist. Every pre-existing field survives, so the contract is an addition and no consumer broke.
The four false strings are gone. composeEmpty — "Nothing organized into a picture yet" — was a claim about the record made where the engine had never been asked; the walk audit caught it on an engagement that had derived a picture that morning. The Manifestation room replaces it with a read-backed one. Shaping's pair is corrected in place and now describes the screen, because B-6 is unbuilt: "This room isn't built yet." The correction breaks the grammatical form rather than softening it — renderingEmpty makes the same kind of claim in the same form and is honest, so the form itself was what had taught the Operator that this sentence means the engine was asked and said none.
Acceptance gate: ten of eleven met at the merge, the eleventh being this filing. Suite 630 passed / 0 failed, up from 610, with no new failure and no new unhandled rejection. Build exits 0.
Two adjacent gaps closed. canMove was the same defect as the strings, wearing a control instead of a sentence: a rejected fetch and a genuinely-empty one both produced [], so Move was hidden either way, which reads as you have nowhere to move this. It now appears only on a read that landed, and a failure states itself. RenderingRoom gained the refresh path it never had — its nonce was neither a prop nor threaded, so no conversation-side event could reach it.
Verified against the real engine without touching playground_dev. The component tests mock the adapter and so cannot catch a field-name mismatch against the wire. That was checked separately by reading the live engine's OpenAPI document: every field the adapter reads exists on the engine, across all eight schemas, and every optional field is nullable or defaulted in the projection. The browser pass ran against a throwaway fake engine on spare ports.
All five room states were observed in a browser, including the one that matters most — a deliberately failed fetch renders the load error with no empty claim on screen — and the staleness block was confirmed in the disagreeing case the CR singles out: the flag reads "Memory has not changed" while the arithmetic underneath shows version 41 against version 66. Both measures appear, so a disagreement is visible rather than hidden.
Deployment is not done and is not autonomous (F-1). Merged is not deployed.
§5.2 names the new adapter src/lib/api/manifestations.ts. That path cannot work, and the CR could not have known it from its evidence base.
The vocabulary wall matches a plain substring over every line of every source file — import specifiers included. So from "@/lib/api/manifestations" fails the wall in every consumer. This was established by probe rather than by argument: a file containing only that import was placed in the room's directory and the wall test failed it at line 1. The probe was removed.
Honouring the literal path would have required a whole-file exemption for the room and every future consumer — exactly the blanket weakening D-5 and acceptance gate 1 exist to prevent. The adapter is therefore named for the content discriminator, lib/api/compose.ts, which is the CR's own rule for machine-facing names (D-5) and the repo's existing convention. §5.2's substance is untouched: one adapter, one WIRE_BOUNDARY_FILES entry, no other exemption anywhere.
This was an internal inconsistency in the CR — §5.2's path against D-5's law — not a divergence between its evidence base and the tree, so C-3 was not triggered and nothing was absorbed. The Step 0 findings are correct as written; they establish that the capitalised noun is free and the lowercase token walled, and simply did not enumerate the lowercase-module-path case. Recorded prominently because it changes a path the CR names verbatim.
Fewer than the last arc, and none reached the merge:
WorkspacePane's "a room with no surface path shows an honest empty state" failed once the room became real. The tempting move was to delete it. It was moved to Shaping — the room still unbuilt — with the assertion unchanged, so the coverage survives rather than the failure disappearing.loading scenario deliberately never responds, which held the socket open and made two later scenarios look stuck in loading. A restart distinguished the artefact from a real defect. Worth carrying: a never-responding stub poisons subsequent reads through connection reuse, and a stuck-looking room may be the harness, not the room.
One honest limit. Lint gained one error — the same setState-within-an-effect rule that usePagedList's own first-page effect already trips at baseline, where the repo carries 29 such errors. The room's read effect follows the pattern of the hook it is modelled on. Not smoothed, not fixed, recorded.
MemoryRoom and RenderingRoom adopted it only where this CR already touched them; a full migration is a separate pass and is not urgent.
Nothing. All repositories pushed and origin-verified. No session in flight. The throwaway dev stack used for the browser pass is torn down — both spare ports free, and the live engine on :8000 is the same process it was before the session.
fetchPlatformLevel unhandled rejections in the Operator Layer suite. They make the suite exit 1 at baseline, so "suite green" cannot be an acceptance criterion for any surface CR — the exact mirror of Q-3 on the engine side. Wants its own build-list item. New.test_stele_router_mount 401 — Q-3, unchanged.
| # | Question | Default | Blocks | Proceeds regardless |
|---|---|---|---|---|
| Q-1 | B-16 — seed v0.13. Drafting authorized 2026-07-30. Committing a seed version is an Operator act (charter F-3). The draft awaits your reading. | Commit as drafted once read. | Seed v0.13 only. | Everything. |
| Q-3 | The engine baseline is not zero. test_stele_router_mount fails at a317051 and at e106917 with a 401, not caused by CR-2026-159. Own build-list item, or a rider on the next engine CR? | Stays red and stays recorded. | Only the ability to assert a zero-failure gate. | Everything. |
| Q-4 | Should the Manifestation room carry an explicit re-derive control? D-3 says the room "shows that Memory has moved and offers the action", but §5.3 enumerates what populated renders and does not include one, §8 says the CR does not auto-derive, and gate 5 lists no action. Re-deriving is spend-incurring and engine-mutating, so it was not added on an unenumerated reading. Today the room surfaces the movement and the Operator acts through the conversation. | Leave as is; file as its own item if wanted. | Nothing. | Everything. |
Batched Operator acts pending: one, now covering two merges. F-1 deployment — CR-2026-159 (engine) and CR-2026-160 (Operator Layer) are both merged and tagged but not deployed. The launchd restart is yours and batches to cadence. No passkey ceremony outstanding (F-2). No external communication queued (F-5).
None outstanding, and none fired during this CR. The suite never went red outside its baseline set, HEAD was where the CR said and the tree was clean, and no wall violation needed an exemption the CR does not name. The §5.2 path question in §3 was weighed against C-3 and found not to be an evidence-base divergence; it is reported rather than absorbed either way.
R-2 completed end-to-end for the second time, and for the first time on the surface. Steps 0–5 ran unattended with per-step commits, Checkpoint A reported and proceeded on a clean report with no Operator confirmation, and Checkpoint B merged, tagged and pushed.
C-1 observed at the merge: fetched and re-verified main at 99f7f64 against origin/main immediately before, clean index confirmed, --no-ff, one session on the repo.
R-4 held, and the fence was taken seriously rather than argued around. The kickoff fences playground_dev as the live production database. The CR asks for a live pass on a dev server, which would ordinarily mean the :8000 perimeter and therefore that database. Instead the pass ran against a throwaway fake engine on a spare port — no database, no persistence, torn down after — which produced a stronger result than a read against live data would have, because every one of the five states, including the failure, could be driven deliberately. The only contact with the live perimeter was a read of its OpenAPI document: a schema read that writes nothing, authenticates nothing, and touches no engagement data (R-5).
F-1 respected: merged is not deployed.
The gate-review mirror rule held — the Checkpoint A report was copied to ~/Downloads at the stop-and-report.
A note on the executable-document rule, which earned its keep again. The CR's kickoff says "Confirm it is the highest version present before starting", and v0.6 §10 had already recorded that a plain directory listing sorts v0_10 between v0_1 and v0_2. Here the numeric check was cheap — only v0.1 and v0.2 exist — but the instruction to sort numerically is what made it a check rather than a glance. The amendment v0.6 called for is still owed.
DUNIN7 — Done In Seven LLC — Miami, Florida DUNIN7 — status brief — v0.7 — 2026-08-01 B-5 closed. The rooms already read before they speak; now they cannot do otherwise.