Deployments and Incidents org pages

Task 12268 · Running · Coder · created · updated

## Requirement (verbatim) D7: "Org-wide pages: an org Deployments list and an org Incidents list, across the org's projects." AC-28 Quality of the surfaces: "the Deployments and Incidents pages follow `docs/standards/ui-style-guide.md`: the list → detail archetype, readable at phone width, no titles truncated to a few characters, statuses as word plus colour, and copy per `docs/standards/ui-copy-standards.md`. They are filterable by project, environment and status (Deployments) and by project, severity, state and type (Incidents)." Design: architecture artifact of Task 12249, §11 (rows, filters, tabs), §3 (fields). Read routes `GET /api/deployments[/{id}]` and `GET /api/incidents[/{id}]` exist (schema child). ## Scope (architecture C12) - `/deployments` → `/deployments/:id`: row = project · environment · status chip (word + colour) · range (`a1b2c3d..e4f5a6b`, "First recorded deploy", "Rollback", "Partial" + note) · PRs · finished (hover: received). Filters project, environment, status. Tabs: Overview (range, PRs → task links, commits without a known PR, failing job/step, run link, run event, received/started/finished), **Metrics** (`deployment_metrics`: baseline, post, delta abs and %, window, or "Not measured: <reason>"), **Probes** (probe results from the deployment's `health_breach` incidents/facts, or empty state). - `/incidents` → `/incidents/:id`: row = type · title (ellipsis, full on hover) · project · severity · state · count · last seen · top suspect + confidence word. Filters project, severity, state, type. Tabs: Overview (all §3 fields; NULL → "Not sent"; stack frames), Suspects (read-only list here; correction controls belong to the linkage child), History (`incident_events`), Tasks, Ledger (edges, "Pending" until `applied_at`). - Sidebar: two `CORE_DESTINATIONS` entries; 15 s polling while visible. Build against seeded rows (fixtures) — live data arrives from sibling children. Credentials & reach: - UI checks on dev — `org/console/dev-login` (org Admin), `https://dev.jaah.ai` — credential **verified**; environment **deferred** for this node (private 10.60.x, HTTPS timed out from the architect's node; operator R4: run from a tailnet node) - AC-29 gates — worktree only — **verified** Out of scope: Do NOT add a per-task deploy panel or per-project Deployments/Incidents tabs (D7) — an "Incident" chip on the task is the linkage child's. Do NOT add write routes or suspect-correction controls. Do NOT add a migration. Epic out of scope (verbatim): "building an APM or log store; replacing the customer's monitor; auto-merging a revert without the project's policy; any scoring or ranking logic (the outcome ledger epic reads the states this epic writes)." Done means: - AC-28 — open both pages at 390 px and desktop width (screenshots in the PR): list → tabbed detail archetype; no horizontal page scroll at 390 px; titles not truncated to a few characters (full on hover); statuses are word + colour; every filter named above works (vitest/e2e). - AC-9 (UI half): "Fields a vendor does not send show as 'not sent' (never blank and never a fake value)" — component test with NULL fields renders "Not sent". - AC-12 (UI half): "The Incidents row shows the suspect PRs and the confidence as a word, never as colour alone." — component test. - AC-21/AC-24 (UI half): Metrics tab shows baseline/post/delta (abs and %)/window or "Not measured: <reason>"; Probes tab shows each probe's result — component tests on seeded rows. - AC-1 (UI half): status moves `in_progress` → `success` without reload via 15 s polling — test. - AC-29: `./dc check quick` green; changed-area tests green; merge lane full gate green.

Activity

  • Draft
  • Ready
  • Runner started