DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-206-loomworks-creation-terminal-control-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-206 — The creation terminal becomes a control: intent_hint at the exit, fall-through as the net, the promise armed (v0.1)

Version. 0.1 · Date. 2026-08-12 · Author. Claude Code (drafting, from the dead-doors scoping) / Marvin Percival (approving). Target. /Users/dunin7/loomworks-engine AND /Users/dunin7/loomworks (the live surface), both branch main. Baseline. Engine a367db7, surface 6175e45. CC confirms at Step 0. Companion to. inspection-briefs/loomworks-dead-doors-scoping-v0_1 (record 7223cbe) and the truthfulness standing note v0.2 (record 4f84230) — where this CR and the brief disagree, the brief governs, verified against code. Charter. Autonomous regime. Status. DRAFT — awaiting the gate. Do not execute.


0. Settled — the Operator's rulings, 2026-08-12. Do not re-raise.

  1. (c) is the fix: intent_hint at the exit turn, as the doors already do at entry — CR-2026-203's shape one level up. The deterministic instrument was sitting unused. The terminal act stops being a classification of an unconstrained sentence; the conversational doors converge on door 3's structure.
  2. (a) is the safety net: project-less commit_project_draft falls through to the creation-commit handler, so a typed sentence that misses the hint lands somewhere that works rather than dead-ending. Cheap, deterministic, composes with (c).
  3. (b) is rejected as a fix — measured insufficient alone (the menu present, "Set it up." still misroutes 3/3). The menu stays as a courtesy once the path underneath works — the 0.98 success set is worth surfacing. Not load-bearing.
  4. The promise: arm it or stop making it. Door 2's server-composed closer must not say "say the word" unless a word is wired; with (c) it names what actually works. Door 1's invitation — model prose deciding when the strongest-consequence turn becomes possible — is worse, and it gets server-composed in the same CR.
  5. The standing-note revision is filed (v0.2): server-composed is necessary, not sufficient — the words must be armed, and nothing in the composition layer checks that. This CR is that revision's first application: every composed invitation below is composed against the wiring that fulfills it.

1. The changes

A. The terminal control (surface — the fix). In creation mode (ChatView mode="create-engagement"), once the flow has begun (the reveal condition verified at Step 1 — the working assumption is: at least one create_engagement_active companion turn exists), the surface shows a commit affordance of two buttons carrying the menu's own words — "Type it up first" and "Commit it as we have it" (the measured 0.98 success set, now labels instead of a classifier hazard). Each sends its canonical sentence as the message with intent_hint="create_engagement_commit" — the entry turn's mechanism, applied at the exit. Belt and braces by construction: the hint makes classification moot, and the words are the ones that classify right anyway. The typed path stays open (an Operator can still type anything); the buttons are the armed word. Strings in strings.ts; frontend disciplines apply.

B. The fall-through (engine — the net). _route_commit_project_draft with engagement_id is None: instead of the dead-end reply, delegate to _route_create_engagement_commit — the wrong sibling lands in the right handler when no candidate exists. Grounded at drafting: both intents are already in _CREATION_TERMINAL_INTENTS, so the resolved LLM client is threaded for either; the creation handler needs no candidate; _recognize_output_path_choice returns None on a generic go-ahead, and the handler's ambiguous branch asks the two-path question — so "Set it up." typed with no hint now yields the menu instead of a dead end. Step 1 verifies the no-creation-history edge (project-less commit_project_draft from an ordinary chat with no creation block behind it) and pins its behavior by test: the ask, never a create-from-nothing.

C. The promise, armed (both invitations server-composed against the wiring). Door 2's _DOOR2_CLOSING_TURN recomposes to name what works — the two commit choices the control now offers (exact words Step 2's; the frame is settled: name the wired acts, promise nothing else). Door 1: the create_engagement_active template stops instructing the model to promise or offer commit phrasing — the sufficiency-judgment prose may still note the conversation feels complete (conversational, claim-free), but the invitation to commit IS the surface control: composed by the surface, deterministic, always present once revealed, never dependent on the model judging the moment. The strongest-consequence turn stops waiting on the wording layer.

D. The menu as courtesy (§0.3). The control's two labels ARE the menu — surfaced permanently, load-bearing nothing. The template may keep its natural two-path phrasing at sufficiency as conversation; no behavior depends on it.

2. Consequences named, so they are chosen

3. Tests — each observed failing first, per the standing discipline

Engine: project-less commit_project_draft delegates to the creation handler (fail first against the dead-end reply); generic go-ahead with no hint → the two-path ask; canonical sentence → the commit path (through the existing seams, monkeypatched per the converse-integration pattern); the no-creation-history edge pinned; in-candidate commit_project_draft untouched (fence). Surface (vitest): the control renders in creation mode post-reveal, absent in standard mode and pre-reveal; each button sends its canonical sentence + hint; strings from strings.ts. The door-2 closer: new text asserted, "say the word" absent. Template: the promise instruction absent (source assertion, the CR-205 fence-test shape). Probe re-run at Step 4: the scoping's failing cells replayed — with the hint the classification is bypassed (structural, no LLM); without the hint the fall-through absorbs the misroute (the cells stop mattering — assert the OUTCOME, not the routing).

4. seed-mutability impact

Kind C expected: routing, a surface control, and composed strings; the creation seams this CR reaches (create-from-conversation) already carry their own seed-handling unchanged. Checked at Step 1. A null finding is an entry; recorded either way.

5. Build steps

| Step | What | Mode | |---|---|---| | 0 | Pre-flight — baselines confirmed, both trees clean. | Auto | | 1 | Verify §1 against code (the brief governs): reveal condition; the no-creation-history edge; the in-candidate fence. Tests written and observed failing. | Auto | | 2 | Engine: the fall-through. Surface: the control + strings. The closer + template recompositions. | Auto | | 3 | Both suites; ruff; mypy (verdict lines read in full); surface vitest + tsc. | Auto | | 4 | Eye-test, live: both doors replayed end-to-end through the commit_step_up signal — the WebAuthn ceremony itself is the Operator's, so the eye-test verifies the step-up arrives where the dead end was; teardown per the standing discipline. | Auto | | A | Checkpoint. | Checkpoint | | 5 | Tag cr-2026-206-creation-terminal-control (engine) + surface commit. Push both, watch both runs, redeploy the surface, post-deploy eye-test of the control. | Auto |

6. Acceptance gate

  1. Both doors reach the step-up signal live where they dead-ended (the scoping transcripts' exact terminal sentences, typed AND via the control).
  2. The fall-through pinned: no project-less path reaches the dead-end reply; the no-creation-history edge asks, never creates from nothing.
  3. The promise armed: no composed or templated text invites a commit word that is not wired; the door-2 closer names the control's acts; the template's promise instruction gone (source-asserted).
  4. Control tests green; hint carried on button sends; typed path still open.
  5. Suites green (zero failures); gates clean; push runs watched; surface redeployed; post-deploy control eye-test.
  6. seed-mutability recorded.

7. Kickoff prompt


Execute CR-2026-206 v0.1 at change-requests/cr-2026-206-loomworks-
creation-terminal-control-v0_1.md in loomworks-record. Confirm the CR
number and both baselines first. Two repos: engine + /Users/dunin7/
loomworks (NOT loomworks-ui).

§0 carries five settled rulings — the control is the fix, the
fall-through is the net, the menu is courtesy only, the promise is
armed or silent, and the standing note v0.2 is the frame: a composed
invitation is composed against the wiring that fulfills it.

The scoping brief governs where this CR disagrees with it, verified
against code. Each test observed failing first. Read every gate's
verdict line in full.

The eye-test ends at the commit_step_up signal — the passkey ceremony
is the Operator's; reaching it is what this CR fixes.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-206 — the creation terminal control — v0.1 — 2026-08-12 The terminal act stops being a classification; the promise names only wired words.