DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-create-stage-polish-v0_1.md

Change Request — Create-stage polish: vocabulary, commit-card label, post-commit redirect — v0.1

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 onCommittedcommitted render; Foundation panel local state, no deep-link). OL fa3268d.


Plain-language summary

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.

Decisions (settled)

A. Vocabulary in-place swap now; single-source consolidation deferred

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:

(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.)

B. Commit-card label fix drop the label

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.

C. Post-commit redirect land in the new engagement, Foundation open

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.

Scope boundary


The build — steps

Per-step commits, suite green at each, halt-before-push. OL only.

Step 0 — confirm (no code)

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.

Step 1 — Vocabulary swap (Decision A)

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).

Step 2 — Commit-card label (Decision B)

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.

Step 3 — Post-commit redirect (Decision C)

InEngagementSurface: import useSearchParams; init seedOpen from ?foundation=open; on onClose, router.replace to the bare path (strip the flag). DocumentCreateFlow: import useRouter; onCommittedrouter.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.


Acceptance

What this completes + what stays deferred (named)

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):


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.