Version. 0.14
Date. 2026-08-03
Charter. standing-notes/dunin7-standing-authorization-charter-v0_1.
Author. Claude Code (inspection session). Operator: Marvin Percival.
Supersedes. v0.13 at record bd75637. All earlier versions stand as siblings; v0.3 remains deliberately absent.
Changes from v0.13. B-6's Step 0 is done — read-only, no code. Shaping differs from the built rooms in authority, not size, and the async gap is not the one the brief expected.
No code, either repository. Record only: 87fdad6 (the brief), 10841b6 (the findings), and this filing. OL 50252e1 and engine ffc29af, both clean.
Confirming a Shape automatically enqueues renders. engagement/shape_confirmed_dispatch.py is a post-append hook on shape_confirmed that walks the engagement's declared render-types and enqueues one render job per match. An act in the Shaping room produces artifacts in the Rendering room, without a second decision.
This is not a defect and the change request should not treat it as one. The render side's state transitions remain operator-driven, as CR-2026-162 established. What fires here is production, against a render-type the Operator previously declared — the declaration is the authority.
But the room must say so. A confirm control that reads as a local act, when it may enqueue several renders, understates what the Operator is about to do. No built room has that shape, and this was not in the sizing that split B-6 out.
A second automatic transition: held → pending_confirmation is written by the agent, not the Operator.
ReadState needs no sixth state. The brief anticipated that a running job fits none of the five values. It does not need to: **the running condition is a property of the item, not of the read. ShapeEventResponse carries state, so a completed read returns real items one of which is held. populated is honest.** The contract answers did the read land; the item answers is the work done. Conflating them is what would have required a new state.
The real gap: a failed production is indistinguishable from a running one.
ShapeEvent has no failure state — five members, none failed.mark_failed updates only shaping_jobs.status; the ShapeEvent is untouched and stays in held.GET /shaping-jobs/{shaping_job_id}, and that id is returned once, in the 202, to the caller who asked. After a reload it is gone.shaping_jobs does carry shape_event_object_id — the link exists in the database and is not exposed.
So a room listing shape-events sees held and, under the governing rule, may say only "not produced yet" — true of both a running production and one that failed hours ago. Stated as a gap; not designed across.
The shape-type → render-type mapping is written down version-pinned on DeclaredRenderType.source_shape_type_ref, used as a selector at three sites, and enforced as a constraint nowhere. The surface should not re-implement it — GET /renders/candidates already answers it, and a second copy is the divergence to avoid. (This closes the second of change request C's two unread items.)
The wall's collision set for Shaping is exactly two — shaping in room-labels.ts and shapingRunning in activity.ts. reshaping has no current instance in src/: the rule is right, the instance is imagined. A Shaping adapter will need a boundary exemption — unlike CR-2026-162's, because ShapeEventResponse carries shaping_agent_* fields. It must be lib/api/shape.ts, and does not yet exist.
Two of three rooms are on the contract, not three of three. RenderingRoom still derives its own ladder; CR-2026-162 touched it twice without migrating it. The majority pattern is real but the count is two-to-one.
DiscoveryToSeedNotConfiguredError returns 500 where its siblings return 503.
| # | Question | Default | Blocks | Proceeds regardless |
|---|---|---|---|---|
| Q-14 | What should the Shaping room say a held Shape is? A failed production and a running one are indistinguishable from anything the room can read. Options: expose a job lookup by shape-event id; add a failure state to ShapeEvent; or have the surface say only "not produced yet" and decline the distinction. | Say only what is known — "not produced yet" — and open the engine question separately. It is the honest reading and needs no engine change. | B-6's room design only. | Everything. |
Q-1, Q-3, Q-10 and Q-13 carry forward unchanged. F-1: five merges await one restart.
R-5 throughout — read-only across two repositories, wrote nothing, authenticated nothing, connected to no database.
Nothing inherited. Both grounding documents predate the last two merges; every carried claim is marked re-verified or unverified, and two were corrected — the async gap's location, and reshaping having no instance.
One unread named rather than closed with a plausible reading.
DUNIN7 — Done In Seven LLC — Miami, Florida DUNIN7 — status brief — v0.14 — 2026-08-03 Confirming one thing produces another; "not finished" and "failed" look the same.