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.
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.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).
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.
engagement_id is set but the candidate lookup fails downstream — that branch is untouched.intent_hint contract) — the turn's classified_intent records the hint, same as entry turns today; operation_outcome (CR-2026-205) records what the commit actually did.commit_project_draft semantics globally, not only in creation mode — deliberate: outside a creation block the handler's ambiguous/ask branch is the correct reply anyway (Step 1's pinned edge), and no candidate-requiring behavior existed to preserve (it was the dead end).commit_step_up) — the human ceremony is untouched; this CR fixes reaching it.
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).
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.
| 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 |
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.