open-design/specs/current/status.md
nettee 3fb849d047
Fix chat runs surviving web disconnects (#146)
* fix chat runs surviving web disconnects

* fix chat run create abort propagation

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon keepalive reconnect budget

Generated-By: looper 0.0.0-dev (runner=fixer, agent=gpt-5.5)

* fix daemon stream disconnect cancellation

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon stream abort cancellation race

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon run cancellation semantics

* fix load

* doc

* 2

* add run refresh recovery

* fix active run refresh status

* fix reattach abort handling

* fix

* fix chat initial scroll

* fix daemon start failures

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix background run recovery

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix stop run status

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix background run recovery

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* extract daemon run service

* move prompt composition to daemon

* fix prompt module resolution

* fix project id generation

* add project run status

* add designs kanban view with awaiting_input status

- add grid/kanban view toggle on Designs tab; persist choice in localStorage
- introduce awaiting_input project display status (daemon-derived from
  unanswered <question-form>) so projects asking the user aren't shown
  as Completed; ordered between Running and Completed with amber accent
- hide transient queued state from users: coerce queued/starting to
  running in daemon /api/projects projection and drop the queued kanban
  column
- a11y polish on Designs cards: Space activation, aria-labels on delete,
  focus-visible outlines, reveal delete on focus-within and touch,
  prefers-reduced-motion handling
- kanban layout uses flex sizing instead of viewport math; scoped icon-
  only pill button rule fixes view-toggle icon alignment

---------

Co-authored-by: mrcfps <mrc@powerformer.com>
2026-04-30 20:16:46 +08:00

2.9 KiB

Project Status

Goal

Show a compact status on each project card that reflects the current state of the project's most relevant run.

Status source

Project status should be a derived display value, based on runs associated with the project.

The recommended logic is:

  1. If the project has an active run, show that active run's status.
  2. If the project has no active run, show the latest run's terminal status.
  3. If the project has no runs, show not_started.

An active run takes priority over the latest terminal run because it tells the user that work is currently happening in the project.

Display statuses

type ProjectDisplayStatus =
  | 'not_started'
  | 'queued'
  | 'running'
  | 'succeeded'
  | 'failed'
  | 'canceled';
Display status Label Source status Meaning
not_started Not started No run The project exists and has no run history.
queued Queued queued A run exists and is waiting to start.
running Running running, starting A run is currently executing.
succeeded Completed succeeded The latest relevant run completed successfully.
failed Failed failed The latest relevant run failed.
canceled Canceled canceled, cancelled The latest relevant run was canceled.

Derivation logic

function deriveProjectDisplayStatus(projectRuns: Run[]): ProjectDisplayStatus {
  const activeRun = projectRuns
    .filter((run) => run.status === 'queued' || run.status === 'running' || run.status === 'starting')
    .sort(byMostRecent)[0];

  if (activeRun) {
    return normalizeRunStatus(activeRun.status);
  }

  const latestRun = projectRuns.sort(byMostRecent)[0];

  if (latestRun) {
    return normalizeRunStatus(latestRun.status);
  }

  return 'not_started';
}

function normalizeRunStatus(status: RunStatus): ProjectDisplayStatus {
  if (status === 'starting') return 'running';
  if (status === 'cancelled') return 'canceled';
  return status;
}

UI guidance

The project card should show the status near the existing metadata line, together with the relative timestamp when useful.

Examples:

  • Running · just now
  • Queued · 1 minute ago
  • Completed · 6 minutes ago
  • Failed · 36 minutes ago
  • Canceled · 3 hours ago
  • Not started

Use stronger visual treatment for active and error states:

  • running: primary or accent indicator.
  • queued: neutral pending indicator.
  • failed: error indicator.
  • canceled: muted neutral indicator.
  • succeeded: subtle success indicator.
  • not_started: muted placeholder indicator.

Rationale

Project status represents the user's project-level mental model. Users need to know whether a project is waiting, actively running, completed, failed, canceled, or untouched.

Using running as the primary active label keeps the UI aligned with the underlying run model and covers generation, editing, repair, analysis, export, and future run types.