Skip to content

feat(ui): dispatch ticker, persona type split & theme preset regroup (#607) - #652

Draft
IBondarenko-iwg wants to merge 16 commits into
andresharpe:releases/4.1.0from
IBondarenko-iwg:feature/607-ticker-persona
Draft

feat(ui): dispatch ticker, persona type split & theme preset regroup (#607)#652
IBondarenko-iwg wants to merge 16 commits into
andresharpe:releases/4.1.0from
IBondarenko-iwg:feature/607-ticker-persona

Conversation

@IBondarenko-iwg

@IBondarenko-iwg IBondarenko-iwg commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Warning

Stacked on #640 — this diff includes the #606 commits until #640 merges.
Review only the last 6 commits (feat(shell): dispatch ticker… onward).
After #640 merges this branch will be rebased onto releases/4.1.0 and the diff will collapse to #607 changes only.

Linked issue

Closes #607

Part 4 of 4 for #551 (R1). #551 itself stays open — R2 scope (Studio merge) continues under the v4.2.0 milestone.

Summary of changes

Four features, one commit each (plus Mothership + e2e commits):

  1. Dispatch ticker feed mode (feat(shell)) — the Navigation shell: top bar + icon rail rendered in both Studio and Mothership #605 static footer line becomes a two-mode control: click toggles between the summary line (default) and a scrolling dispatch feed fed from /api/activity/tail. Wire-report voice per the design doc ("task 9f8e7d6c moved to analysed · stop", "run a1b2c3d4 completed — M"). Cycle ≥ 20s, pause on hover/focus (position retained), choice persisted. Reduced motion (OS flag or toggle) renders the latest item static instead of scrolling.
  2. Mothership ticker (feat(server)) — same footer behaviour on the dashboard, feed-expanded by default (PRD decision 3). Interim implementation derives lines from polled instance data; replaced by the Event forwarding — outpost-to-Mothership event sink #599 event feed later. Rebuilds are deferred to the animation loop boundary so the 30s fetch never snaps the scroll.
  3. Persona type split (feat(outpost), PRD 5.7) — Tasks, Product and Decisions panes get data-persona="stakeholder": prose reads in Inter 14px, data values (ids, dates, counts, statuses) stay mono 12px via a curated re-mono list. Operator surfaces (Overview, Workflows, Settings, Mothership dashboard) keep the 13px mono base — zero new rules needed.
  4. Theme preset regroup (feat(outpost), PRD 5.8) — Default (Amber) and Calm (Cyan) featured; Matrix Green / Deep Blue / Violet Haze / Clean White move behind a collapsed Classics toggle (auto-expands when a classic is active). Labels are display-only; preset keys and theme-config.json unchanged.
  5. Reduce-motion toggle (feat(settings)) — explicit override in Settings → Theme (PRD decision 7). Sets body[data-motion="reduced"], killing all shell animation (ticker, LED pulse, CRT flicker) with the same scope as the OS flag. Outpost-only; Mothership honours the OS flag.

Documented deviations

  • Issue body wording drift (top-bar ticker / persona controls) — PRD-551 rev. 2 governs, per the issue thread.
  • "Stops on focus" implemented as paused-not-reset — position retained, UX-safer than a snap to start.
  • Reduce-motion toggle is Outpost-only (Mothership has no settings surface yet; OS flag covers it).
  • Mothership feed derives from polled instances client-side (interim until Event forwarding — outpost-to-Mothership event sink #599); falls back to the static line while empty.
  • Persona attribute per tab-pane, not per <main> — Outpost is a SPA with one <main> for six panes; same intent, better granularity.
  • Curated re-mono list instead of naive inheritance — elements with explicit fonts (badges, chips, doc-viewer) untouched.
  • Ticker keyboard operability (role/tabindex/aria) is baseline for a new interactive control, not Accessibility: reduced-motion, a11y pass & three architecture ADRs #554 scope creep.
  • Outpost feed lines use short event ids (events carry no task titles); Mothership quotes instance titles verbatim (plain voice).
  • Set-Theme's internal defaults hash deliberately not extended with reduceMotion — Get-Settings re-defaults on read.
  • Post-merge: comment on Command palette: ⌘K operator layer, theme presets & footer ticker #553 to trim its now-stale checklist (ticker + presets shipped there).

Screenshots / recordings

Before After
before-tasks after-tasks
before-product after-product
before-decisions after-decisions
before-theme-settings after-theme-settings-spaced
before-overview after-overview

Feed mode: after-ticker-feed · closeup: after-ticker-feed-closeup
Mothership: after-mothership-dashboard · closeup: after-mothership-ticker-closeup
Reduce motion: toggle row after-reduce-motion-row · single static entry after-ticker-reduced-closeup

Recording: scrolling feed with hover-pause after-ticker-feed-scroll.webm

Testing notes

  • pwsh -File tests/Test-UI-E2E.ps1 — 26/27 passing incl. 4 new specs (ticker.spec.ts × 3, reduce-motion persistence in settings.spec.ts); the 1 failure is the known pre-existing stop-button flake.
  • Layer 1: Test-Structure.ps1 361/361, Test-Aether.ps1 12/12.
  • Manual: click the footer ticker → feed scrolls, hover pauses, click again → static, reload persists; append a task.status_changed line to .bot/.control/activity.jsonl → dispatch line appears within ~2s; Settings → Theme → Reduce Motion → ticker/LED/CRT animation stops, survives reload (ui-settings.json gains reduceMotion); DevTools reduced-motion emulation → single static entry.
  • Security pass: all ticker sinks are textContent (no innerHTML with event/instance data); /api/settings POST covered by the global CSRF header check.

Checklist

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Inbox

Development

Successfully merging this pull request may close these issues.

1 participant