* feat: add PR claim flow for agent sessions
* feat: support PR claim during spawn
* fix: address PR review feedback
* feat: add lifecycle worker automation
* fix: prevent duplicate messages on unconfirmed delivery and deduplicate review prompt
sendWithConfirmation now treats unconfirmed delivery as a soft success
since the message was already sent, preventing the dispatch hash from
staying stale and causing duplicate sends on the next poll cycle.
review-check command now sources its prompt from the lifecycle reaction
config instead of hardcoding it, keeping both paths aligned.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: pass AO_CONFIG_PATH to spawned lifecycle worker and log duplicate-worker early exit
The spawned lifecycle worker now receives AO_CONFIG_PATH in its
environment so it finds the correct config regardless of CWD. Also
added a log message when exiting early due to an existing worker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: prevent lifecycle worker from clearing metadata on SCM fetch failures
SCM methods (getPendingComments, getAutomatedComments) silently returned []
on error, causing maybeDispatchReviewBacklog to treat fetch failures as
"no comments" and clear all tracking metadata every poll cycle. The worker
appeared to do nothing because it kept resetting its own state.
- SCM methods now propagate errors instead of returning []
- maybeDispatchReviewBacklog distinguishes null (fetch failed, skip) from
[] (confirmed empty, safe to clear)
- pollAll() logs errors instead of silently swallowing them
- Added heartbeat logging and stdout flush before process.exit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add debug breadcrumbs when review comment fetch fails
Logs a console.debug message when getPendingComments or
getAutomatedComments fails, making it clear the lifecycle loop is
preserving metadata due to a fetch failure rather than genuinely
having no comments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: scope lifecycle worker polling to its project and add missing test
pollAll() now passes the worker's projectId to sessionManager.list(),
so each per-project lifecycle worker only polls its own sessions. This
prevents duplicate SCM API calls and race conditions in multi-project
configs.
Also fixed misleading test name and added a test verifying that
--no-dashboard alone still starts the lifecycle worker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: remove dead confirmation check and respect project-level reaction overrides
Removed the unreachable "could not be confirmed" guard from the retry
logic since sendWithConfirmation now returns silently on unconfirmed
delivery.
review-check now resolves the prompt per-session by checking
project-level reaction overrides before falling back to the global
config, matching lifecycle worker behavior.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: close TOCTOU race in lifecycle worker spawn and unexport getRegistry
Write the child PID from the parent immediately after spawn, closing
the window where a concurrent ensureLifecycleWorker could pass the
"not running" check and spawn a duplicate worker.
Also removed the unnecessary export on getRegistry since it has no
external consumers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: always include ao base prompt on spawn
* fix: clear heartbeat on shutdown and add initial delay to confirmation loop
Clear the heartbeat interval in the shutdown handler to prevent it
firing during the stream-flush window after lifecycle.stop().
Move the sleep in sendWithConfirmation to before each check (including
the first), so the runtime has time to reflect the message before
the first confirmation attempt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: resolve lint errors in lifecycle and session manager
- Replace dynamic delete with object reconstruction in lifecycle-manager
- Add { cause } to re-thrown errors in session-manager for preserve-caught-error rule
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| screenshots | ||
| README.md | ||
| competitive-analysis-raw.md | ||
| design-brief-v1.md | ||
| design-brief.md | ||
| orchestrator-terminal-design-brief.md | ||
| session-detail-design-brief.md | ||
| session-replacement-handoff.md | ||
| token-reference.css | ||
README.md
ao Dashboard — Design Research Artifacts
Compiled February 2026 via competitive analysis, Playwright CSS extraction, and codebase audit.
Documents
| File | Description |
|---|---|
design-brief.md |
Main design brief — competitive analysis, full color palette, typography, all component specs, anti-patterns, implementation stack recommendation, and current codebase audit |
session-detail-design-brief.md |
Design spec for /sessions/[id] — the single-agent investigation view |
orchestrator-terminal-design-brief.md |
Design spec for the orchestrator terminal — full-viewport command center with status strip |
session-replacement-handoff.md |
Design plan for successor sessions, PR takeover, and context handoff after replacing a worker |
token-reference.css |
Ready-to-use CSS — drop-in replacement for globals.css @theme block |
competitive-analysis-raw.md |
Raw research notes from all 14 competitor sites (Linear, Vercel, Railway, Fly.io, Inngest, Temporal, Grafana, WandB, LangSmith, Retool, Render, PlanetScale, Supabase, GitHub Copilot) |
design-brief-v1.md |
Original v1 brief (text-only research, pre-Playwright CSS extraction) — kept for reference |
Screenshots
| File | Description |
|---|---|
screenshots/linear-homepage.png |
Linear.app captured via Playwright (311KB) — source for verified CSS token extraction |
screenshots/railway-homepage.png |
Railway.app captured via Playwright (444KB) — visual palette reference |
Research Methods
Phase 1 — Text analysis: Two parallel research agents analyzed 14 competitor product sites via WebFetch, extracting visual patterns, color systems, and design philosophy from HTML/CSS content.
Phase 2 — Playwright CSS extraction: Installed @playwright/mcp and extracted live CSS custom properties from linear.app using document.styleSheets enumeration. This yielded ground-truth values for Linear's token system — the most rigorous competitive design data available without access to their Figma files.
Phase 3 — Playwright screenshots: Captured screenshots of Linear and Railway via headless Chromium for visual reference.
Phase 4 — Codebase audit: Read the entire packages/web/ source (components, types, CSS tokens) to map research recommendations against the actual implementation. Produced implementation audit sections in each brief with prioritized delta tables.
Key Findings
- Linear's verified token system (via Playwright CSS extraction) is the closest design benchmark. See
design-brief.md §1. - Current dashboard uses GitHub-inspired colors (
#0d1117base). Recommended shift: blue-cast dark (#0C0C11). Seedesign-brief.md §7. - The 6-level attention zone system (
merge → respond → review → pending → working → done) is architecturally correct and well-implemented. Visual polish is the primary gap. - Highest-impact single change: load Inter Variable via
next/font/google. Immediately elevates the typography to Linear/Supabase tier. - Orchestrator terminal needs visual differentiation (violet accent, status strip, full-viewport height) — currently indistinguishable from agent session pages.
Design Token Quick Reference
The recommended palette is in token-reference.css. The current palette is in packages/web/src/app/globals.css.
Current base: #0d1117 (GitHub blue-green dark)
Recommended base: #0C0C11 (neutral blue-cast dark)
Current accent: #58a6ff (GitHub blue)
Recommended accent: #5B7EF8 (blue-indigo, between Linear blue and brand purple)
All Linear CSS values are ground-truth verified from live CSS. Railway values are visually estimated from screenshot. Other competitor values are from text/HTML analysis.