Lane 1 · Web channel
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.
| Claim | Status | Evidence |
|---|---|---|
IntentSuggestion explicit UI phases pending / unavailable / quiet / suggested / run_summary + trace hooks (data-workflow-suggestion-state, window.__winWorkflowSuggestionTrace) | LANDED | IntentSuggestion.tsx:114,139–154,587–604; 8 state tests |
Suggester conversational contract: decision: suggest | quiet | clarify_only + quietReason, confidence floors 0.6 / 0.65 | LANDED | tmux-suggester.ts:38–40, 1120–1179; types.ts:327 |
Layout grammar: 720px centered thread column, --gutter token | LANDED | WorkflowCanvasPage.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) | LANDED | WorkflowRunSummaryCard.tsx:84,126,207; JobDetailUnified.tsx:271–442 |
Responsive layer: files drawer below md, jobs grid reflow, dvh-relative artifact iframe, reduced-motion provider | LANDED | files/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 FOUND | No “Monitor” string or rail component in packages/ui/src; only “Open live run” link + hero quick-action links |
| PWA / installability | NOT FOUND | Viewport meta only (ui/index.html:5). No manifest.json, no service worker, no theme-color |
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).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:
status="ready", bundle=null, decision=null — and isPendingSuggestionStatus() (IntentSuggestion.tsx:135–137) only treats warming/busy/retrying as pending.useComposerSuggestion.ts:962–968, default 400ms, unoverridden at the only call site useWorkflowCanvasPage.ts:1118–1132) hasn’t queued yet.suggestionUiPhase() falls through to "quiet" and renders the “No suggestion — looks specific enough to run as-is” card for ~400ms, then flips pending → suggested.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.
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 shape | Path today | State |
|---|---|---|
| Simple ad-hoc task, no config | Composer → run-as-is → /api/me/jobs (ad-hoc fallback preset) | LANDED — hosted spawn proven on beta pre-drift |
| Task matching a published workflow | Composer → daemon suggester (decision=suggest) → apply → run | LANDED — suggester retrieval moved server-side (#555); hosted quality spot-checks never run |
| Ambiguous ask | decision=clarify_only → clarification UI state | LANDED — needs hosted proof + copy review |
| Specific ask, no workflow fits | decision=quiet → run-as-is encouragement | OPEN — currently doubles as the flash bug’s wrong state (RUX-1) |
| Daemon unavailable | /warm soft-degrade 200 + unavailable:true → retry chrome | LANDED (#554) — hosted /warm proof still an open gate |
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).
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.