Document: cr-create-stage-polish-v0_1
Version: v0.1
Date: 2026-06-29
Type: Phase change request — Operator Layer frontend only. No engine change.
Consumer: Claude Code (executor).
Branch base: OL main @ fa3268d.
Origin: Door 3 is verified live (E0089 committed via real passkey). Three create-stage surface defects remain, all in the same create-stage files, folded into one pass: (1) the create flow leaks "project" where the surface + methodology say "engagement"; (2) the commit card mashes the full seed commitment into the passkey label; (3) the commit lands on a dead-end "Project set up" screen instead of the new engagement.
Grounding: the read-only inventory (8 "project" strings across DocumentCreateFlow / create-engagement page / ChatView; FoundationQuestionsForm already clean; no single vocab source — strings.ts is itself inconsistent; text-mash at CommitCeremony.tsx:73-74 + DocumentCreateFlow.tsx:201) and the redirect grounding (DocumentCreateFlow onCommitted → committed render; Foundation panel local state, no deep-link). OL fa3268d.
Three small fixes to the engagement create flow, all in the same files. One: the create flow says "project" in eight places, but DUNIN7's word is "engagement" (the rest of the surface and the methodology use it) — swap them. Two: the "make it official" card jams the entire foundation text into the passkey button label ("Commit [whole paragraph] with your passkey…") — drop the jammed-in text. Three: after committing, you land on a dead-end "Project set up" screen — instead, go straight into the new engagement with its Foundation document open, which you close yourself. None of this touches the engine.
DUNIN7's object noun is engagement (methodology noun; right for the professional-services Operator; differentiates where "project" is generic). The create flow leaked "project" in 8 places. Swap them in place ("project" → "engagement").
Why in-place, not a single vocab source: grounding found there is no single vocab source today — strings.ts is itself inconsistent (it mixes projectFilterLabel: "Project", "All projects", "Leave this project" with "engagement" copy), and "engagement" is hardcoded inline in the nav. Building a single source (an ENGAGEMENT/display(term, locale, profile) constant) is net-new with blast radius into the library/nav filters and the focus-chip (the project* entries are consumed there). That consolidation is Phase A work (the instance-config vocabulary effort, per the white-label analysis + the vocabulary-resolver standing note) — not a side effect of a copy fix. Correction to the vocabulary standing note §5: that note assumed shaping the create-flow source as display(term, locale, profile) was a one-line cost "from the start"; grounding found no source exists and building one has real blast radius, so the corrected position is swap-in-place now, resolver-at-consolidation (Phase A). (A one-line note amendment records this; the trajectory is preserved.)
The 8 strings:
DocumentCreateFlow.tsx — :176 "Project set up", :178 "Your project is committed and active.", :192 "…saved on the new project.", :235 "Set up the project"create-engagement/page.tsx — :109 "Start a new project", :126 "…shape the project as you go."ChatView.tsx — :645 "Setting up a new project", :793 "Your project is set up."FoundationQuestionsForm.tsx — already clean ("the work" / "the foundation"); untouched.
(Note: :176/:178 — "Project set up" / "committed and active" — are in the committed render that Decision C removes. If C lands, those two strings disappear with it; swap the remaining 6 + verify the removed two aren't referenced elsewhere.)
CommitCeremony.tsx:73-74 interpolates label into Commit ${label} with your passkey to make it official.; DocumentCreateFlow.tsx:201 passes label={original?.what_the_work_is} — the full first commitment, producing the mash ("Commit A minimalist web-based… with your passkey to make it official."). Fix: drop the label → generic "Commit with your passkey to make it official." Door 3 has no short title client-side (the title is derived server-side at commit), so there's no good short name to substitute; the generic copy is correct. Doors 1/2 already pass no label (unaffected) — this brings door 3 to the same generic branch.
Replace the dead-end committed "Project set up" render with an immediate redirect to /operator/engagement/{engagementId}?foundation=open — the Operator lands on the new engagement with its Foundation document panel open, and closes it themselves (Operator-authority dismiss). Strip-on-close: closing the panel strips the ?foundation=open flag (router.replace to the bare path) so a refresh does NOT re-open a dismissed panel (the dismiss holds across refresh). The Foundation panel is local state today with no deep-link; the one net-new piece is the foundation=open read in InEngagementSurface. engagementId is already held in DocumentCreateFlow state and returned by the commit; no timed success screen.
strings.ts consolidation, NOT the library/chip/nav project* entries, NOT a single vocab source / resolver — those are Phase A.foundation=open deep-link the redirect needs; not generalizing deep-linkable panels.Per-step commits, suite green at each, halt-before-push. OL only.
Confirm against OL fa3268d: the 8 string locations; the text-mash at CommitCeremony.tsx:73-74 + DocumentCreateFlow.tsx:201; the redirect mechanism (DocumentCreateFlow onCommitted/committed render, engagementId in state + on the commit return, InEngagementSurface seedOpen local state + onClose). Note any overlap between the strings Decision A swaps and the render Decision C removes (the :176/:178 "Project set up" strings live in the removed committed render). Report, then build.
Swap the create-stage "project" → "engagement" strings in place (the 6 that survive Decision C, plus any in the committed render if C is sequenced after). FoundationQuestionsForm untouched. Do NOT touch strings.ts project* entries or the nav.
Suite expectation: create-stage surfaces render "engagement", not "project"; no library/chip/nav regression (those strings unchanged).
Drop the label from CommitCeremony's commit copy (generic "Commit with your passkey to make it official."); stop passing what_the_work_is as the label from DocumentCreateFlow:201. Doors 1/2 unaffected.
Suite expectation: the commit card shows the generic copy, no seed body in the label; door 3 + doors 1/2 both render the generic branch.
InEngagementSurface: import useSearchParams; init seedOpen from ?foundation=open; on onClose, router.replace to the bare path (strip the flag). DocumentCreateFlow: import useRouter; onCommitted → router.push('/operator/engagement/${engagementId}?foundation=open'); remove the dead committed render.
Suite expectation: a door-3 commit redirects to the engagement with ?foundation=open (panel open); closing strips the flag (no re-open on refresh); the committed render is gone.
project* strings are Phase-A, deliberately untouched).Completes the create-stage surface polish — door 3 (and the create flow) reads consistently, commits cleanly, and lands the Operator in the working engagement. Combined with the verified commit (E0089), the create stage is done end-to-end.
Deferred, named (NOT this CR):
display(term, locale, profile) resolver + strings.ts consolidation + library/chip/nav project* flip — Phase A, per the vocabulary-resolver standing note.DUNIN7 — Done In Seven LLC — Miami, Florida Change Request — Create-stage polish: vocabulary, commit-card label, post-commit redirect — v0.1 — 2026-06-29 Three create-stage surface fixes, one OL pass, same files: (A) swap 8 "project"→"engagement" strings IN PLACE — single-source consolidation deferred to Phase A because no source exists today and building one has blast radius into library/chip/nav (correcting the vocabulary standing note §5: swap-in-place-now, resolver-at-consolidation); (B) drop the mashed full-commitment label from the commit card → generic passkey copy; (C) redirect after commit to the new engagement with the Foundation panel open via ?foundation=open, strip-on-close so the dismiss holds. No engine change. Verified by a real browser commit. Base OL fa3268d.