WIN · LAUNCH WORKBOOK pre-UAT → production · mined from Codex session 019f25cc · snapshot 2026-07-06 · origin/main 734eff41

Lane 1 · Web channel

Workflows / Runs UI & UX

Finish the new Workflows/Runs experience: keep the simplification and progressive disclosure that landed in Program 3, fix the one deterministic UX bug that UAT will trip over in the first five minutes, and decide the mobile/PWA scope explicitly instead of implicitly.

5/7
session claims verified in code
~400ms
empty-card flash on every warm prompt
0
PWA assets (manifest / SW)
React #185 recurrences fixed point-wise

What actually landed (verified against origin/main@734eff41)

ClaimStatusEvidence
IntentSuggestion explicit UI phases pending / unavailable / quiet / suggested / run_summary + trace hooks (data-workflow-suggestion-state, window.__winWorkflowSuggestionTrace)LANDEDIntentSuggestion.tsx:114,139–154,587–604; 8 state tests
Suggester conversational contract: decision: suggest | quiet | clarify_only + quietReason, confidence floors 0.6 / 0.65LANDEDtmux-suggester.ts:38–40, 1120–1179; types.ts:327
Layout grammar: 720px centered thread column, --gutter tokenLANDEDWorkflowCanvasPage.tsx:721,736,832; globals.css:127,244
Frozen “Applied receipt” setup during a run (no Edit-setup escape hatch), richer run-detail hero (phase, status, quick actions)LANDEDWorkflowRunSummaryCard.tsx:84,126,207; JobDetailUnified.tsx:271–442
Responsive layer: files drawer below md, jobs grid reflow, dvh-relative artifact iframe, reduced-motion providerLANDEDfiles/index.tsx:147; JobsTable.tsx:37,76; LiveArtifactShell.tsx:178; MotionProvider.tsx
“Monitor run” label + command rail (claimed by PR #655’s completion message)NOT FOUNDNo “Monitor” string or rail component in packages/ui/src; only “Open live run” link + hero quick-action links
PWA / installabilityNOT FOUNDViewport meta only (ui/index.html:5). No manifest.json, no service worker, no theme-color
Nothing above is hosted-validated Everything marked LANDED is merged but running nowhere the user can see: staging/beta still serve runtime 0d5cbb6a while main is at 734eff41. Every UI claim on this page needs its hosted proof row after the next deploy (see the Deploy tab).

The suggestion-card flash — root cause confirmed

Your report (“empty suggestion card instead of loading indicators”) is a deterministic design artifact, not a flaky race. On the common path the worker is already warm before you finish typing, so on commit:

Worse: IntentSuggestion.test.tsx:73–79 asserts this quiet-card render as intended for ready + null bundle, so the test suite actively defends the bug. No test exercises the ready→busy transition timing.

Plan of attack

Implementation worksheet0/8
Update the intent test that currently locks in quiet-card behavior; add a fake-timer transition test (warm → commit → advance < debounceMs → assert pending chrome). Files: IntentSuggestion.tsx, useComposerSuggestion.ts + both test files.
The session’s completion message and the code disagree — decide the label once, grep-verify, and update PR-655 work record.
Greenfield either way. If deferred, strike “PWA” from UAT checklists so it isn’t rediscovered as a regression. A manifest + icons is a <1-day slice; offline caching of an SSE/job app is a real project — don’t conflate.
Pattern: poll returns fresh array/object → useEffect dep → setState loop. Point fixes exist (useWorkflowCanvasPage.ts:1961, useWorkflowSessionState.ts:725) but nothing prevents the sixth recurrence.
tmux-suggester.ts is 3,502 lines with only ~4 direct decision-value assertions. This is the brain of “field any query” — it needs contract-grade tests.
Use the suggestion trace hooks (__winWorkflowSuggestionTrace) that #645 added — they exist precisely for this. Capture ledger rows per hosted-validation-runbook.md.
Today the responsive layer is CSS-class-driven with zero automated coverage; the “pass at 375” definition already exists in the GOAL doc — encode it.
Use the frontend review exercises already embedded in docs/plans/pre-uat-and-prod-deploy/plan.html (#worksheet) — simplicity, disclosure, hierarchy, polish, safety, mobile.

Query-coverage matrix (can users field anything?)

Entry-point truth, corrected from the session’s own description: /api/workflows/:slug/test-run is for draft workflow testing only. Ad-hoc runs and applied suggestions both go through /api/me/jobs (employee) or /api/run (admin console), distinguished by whether workflowSlug is set — see useWorkflowLaunch.ts:199–259. Don’t build UAT scripts around the wrong split.

Query shapePath todayState
Simple ad-hoc task, no configComposer → run-as-is → /api/me/jobs (ad-hoc fallback preset)LANDED — hosted spawn proven on beta pre-drift
Task matching a published workflowComposer → daemon suggester (decision=suggest) → apply → runLANDED — suggester retrieval moved server-side (#555); hosted quality spot-checks never run
Ambiguous askdecision=clarify_only → clarification UI stateLANDED — needs hosted proof + copy review
Specific ask, no workflow fitsdecision=quiet → run-as-is encouragementOPEN — currently doubles as the flash bug’s wrong state (RUX-1)
Daemon unavailable/warm soft-degrade 200 + unavailable:true → retry chromeLANDED (#554) — hosted /warm proof still an open gate

Agent handoff prompts

prompt · RUX-1 flash fix
Fix the deterministic empty-suggestion-card flash in the WIN workflow canvas.

Context: on prompt commit with a warm suggester worker, useComposerSuggestion has
status="ready", bundle=null, decision=null for the ~400ms request-key debounce window
(useComposerSuggestion.ts:962-968; debounceMs default 400, call site
useWorkflowCanvasPage.ts:1118-1132). IntentSuggestion.isPendingSuggestionStatus
(IntentSuggestion.tsx:135-137) treats only warming/busy/retrying as pending, so
suggestionUiPhase() renders the "quiet" no-suggestion card during the window, then flips
pending → suggested. IntentSuggestion.test.tsx:73-79 currently asserts the wrong behavior.

Do: (1) make the debounce window render pending chrome — gate on unsettled request key or
add the ready+null-bundle+null-decision case; (2) update the locked-in test; (3) add a
fake-timer transition test (warm → commit → advance < debounceMs → assert pending, advance
past resolve → assert suggested); (4) run bun run --filter @win/ui test + typecheck; keep
the change surgical — no refactor of the debounce itself. PR per repo rails (specific git
add, PR record docs/github/prs/PR-<n>.md, work-record untested list includes hosted proof).
prompt · RUX-3 minimal PWA shell
Add a minimal installable-app shell to packages/ui (WIN dashboard). Scope strictly:
manifest.json (name WIN, short_name WIN, display standalone, theme/background colors
matching globals.css tokens, maskable icons 192/512 generated from the existing logo),
<link rel="manifest">, theme-color meta, apple-touch-icon. NO service worker / offline
caching in this slice (SSE-heavy app; defer intentionally and say so in the PR body).
Verify with a Lighthouse installability pass locally and document the deferred offline
story in the PR record. Wire nothing else.