From registered repo to finished recipe run. Phases 1–4 are per-repo (long-lived); 5–7 fire on every run. Row statuses in phases 5–6 reflect the post-PR #1518 world where Sync and State are independent (see callout below).
Rows are layers, columns are phases. The Platform UI status row splits today | proposed. Click any cell or chip for detail; toggle rows to expand CLI status and Engine & Storage.
syncStatus to decide whether to render / enable the State column must be relaxed.RepoSynced and RepoRunFinished arrive in either order for the same repo. Row-derivation logic that assumes sync-then-run must handle run-then-sync too — check repository-results.rows.ts and changeset-status.helpers.ts.isRepositoryNotYetRun(row.state) currently returns - for pre-run states. Confirm SYNCING is still treated as “not yet run” for legacy rows, and that a row in RUNNING with Sync=PENDING doesn't render a stale count.RepoRunFinished.errorMessage at PIPE_BUF. Nothing to change in the UI, but tooltip / popover copy-full-message is now working on a shorter payload.SYNCING on legacy rows, those rows are unfilterable — decide whether to add SYNCING back as a legacy-only option.RecipeRunService.cancel now writes one cancel file, not two. The Sync=CANCELED status still exists on repos.SYNCING is @deprecated. New runs jump straight to RUNNING. Consumers of OrganizationRecipeRunSyncing — state-status-cell (run header), results-progress-bar, changeset-status.helpers, use-chat-recipe-run-status, recent-activity-neo.rows — should keep the SYNCING branch for legacy / in-flight only.requestRepositoryLstDetails has no client caller; the UI is a viewer.Repository.changeset is the last-observed SCM HEAD, not a live one, so "N commits behind" would frequently lie. The proposed model drops "Stale" for this reason.Aligned with the Moderne design system Status foundation — eight intents, semantic tokens --status-{intent}-{light|default|dark}.
Chips in this prototype render at the DS Badge medium size (Figma "Badge" node 4091:17230). The Figma file defines only one size; small / large scale proportionally for cases layered on top.
| Size | Height | Padding | Font | Sample |
|---|---|---|---|---|
| small | 20 px | 1 px 8 px | 10 px / 500 | Success |
| medium · Figma spec | 24 px | 2 px 10 px | 12 px / 500 | Success |
| large | 28 px | 3 px 12 px | 14 px / 500 | Success |
radius-full (pill)--status-{intent}-transparent (60% alpha — softer than the solid default)--status-{intent}-dark--status-{intent}-light--status-{intent}-defaultLucide outline names — Queued (clock) and Active (loader-circle) are mandatory because they share the violet ramp; nothing else disambiguates them. Active is the one outline-only intent — the open-arc loader cannot fill — and spins at 4s linear infinite honouring prefers-reduced-motion. For standalone status icons outside a badge: minimum 16 px, filled silhouette only at 16–17 px, outline at 18 px+.