PRs #824–#830 — UX 1.0 Field Trial Readiness: From Shipped to Trusted

The Broader Goal at the End of the Previous PR

PR #731 (post 99) shipped Synlynk UX 1.0 — TUI, Vizor, and a shared uxcore library — as working code. But "shipped" and "trustworthy" are different bars. The UX 1.0 spec's own Phase 1 required exercising every surface against real projects with real dispatch jobs before calling it done; synthetic runs don't count. Nothing had verified TUI, Vizor, or the (not-yet-built) Slack notifier against actual daily use.

Strategic Shifts in This PR

None — this window executed the field-trial-readiness plan (docs/superpowers/plans/2026-08-06-ux-1.0-field-trial-readiness.md) exactly as designed, across its four phases. The one surprise was operational rather than strategic: the Phase 1 checklist surfaced a real bug (#822 — Vizor's / route crashed with EOFError on an unconfigured .synlynk/config.json, because _ftue_prompts() called input() unconditionally with no TTY guard) instead of a clean pass. That's the checklist doing its job.

What This PR Shipped

Six PRs closed out the plan's four phases:

  • #824 — the Vizor FTUE fix for #822, closing the Phase 1 checklist's only Fail row.
  • #825 — Phase 2's journey map simulator (docs/brainstorm/ux-journey-map/), an interactive HTML walkthrough of all 7 UX 1.0 user journeys across TUI/Vizor/Slack.
  • #826 — Phase 3b: a first-visit banner in Vizor pointing new users at the other two surfaces.
  • #827 — Phase 3c: Slack notifier cross-links back to Vizor (View live in Vizor links in job messages).
  • #829 — Phase 3a: synlynk/ux_nudges.py, a terminal tip producer. pending_ux_tip() checks daemon_jobs for concurrent running jobs and, above a threshold, surfaces a one-time nudge (synlynk tui) via the existing nudge-fence rendering path in dispatch.py, respecting a dismissed_ids list in config so it doesn't nag.
  • #830 — Phase 4 documentation: the completed Phase 1 surface checklist (docs/superpowers/ux-1.0-surface-checklist.md) with the #822 row re-verified Pass against real re-runs on rxcc and cc-videoreframing, plus the devlog entry recording the trial window's start.

Two implementation-adjacent notes worth keeping: job-729771ed (Task 3) needed a clean re-dispatch after an earlier attempt corrupted its prompt via shell backtick expansion inside a double-quoted --task argument — the fix was dispatching without embedding literal code spans in that argument, and the second attempt landed cleanly with schema-correct tests (the plan's placeholder assumption for daemon_jobs's columns was wrong; the implementer checked the real schema and wrote against it). And PR #825 needed a merge-conflict resolution against origin/main before it was mergeable — a trivial whitespace-only conflict in tests/test_agent_quota_tracking.py, resolved and re-verified against the full suite (1778 passed).

Every PR here went through this repo's non-authoring review discipline: since dispatched agents share one GitHub identity, self-approval via gh pr review --approve fails outright, so each PR got a formal COMMENT review with an explicit checklist instead, per the sanctioned fallback for GitHub-identity caveat #423.

Brainstorm Visuals Used

PR #825's journey map (docs/brainstorm/ux-journey-map/index.html and journey-map.html) is itself the artifact — an interactive companion for navigating all 7 UX 1.0 journeys, built as part of this PR rather than informing a decision upstream of it.

What This Achieved on the Path to Autonomy

This is the difference between an agent fleet that has observability surfaces and one that's actually using them. A dispatched agent's work is only as trustworthy as the human's ability to watch it happen — TUI for live terminal oversight, Vizor for browser-based dashboards, Slack for async notification — and until this work, none of those three had been exercised against real jobs on real projects. The #822 bug is the concrete proof of why that distinction matters: a surface that "should work" crashed on first real contact with an unconfigured project, exactly the kind of gap synthetic testing misses and field trials catch.

Strategic Note: The Goal at the End of This PR

The field trial window is now open (started 2026-08-08) across four subject projects — rxcc, cc-videoreframing, synlynk itself, and playblazer-ng (pending onboarding — it has no .synlynk/ directory yet, the first blocker to resolve). The trial has no fixed end date; it closes when the three surfaces have a clean bug bar under real daily use and the user signs off, at which point Named Release Policy kicks in: CHANGELOG, VERSION bump, gh release create, and a closing post. Until then, the next goalpost is unglamorous but necessary: watch for Sev1/Sev2 issues against TUI/Vizor/Slack under the existing Live Issues SOP, and don't declare victory early.