Skip to content

Triage the project rail: priority ranking, waiting-on-you colors, and notifications that repeat until you answer #14730

Description

@samithaj

Problem

With many coding agents running at once, the rail treats every task identically: an agent blocked on a permission prompt in a critical project looks exactly like a scratch project idling for a week. Two things are missing — a way to say which projects matter, and a way to be told, insistently, when an agent is waiting on you.

Two concrete bugs make this worse today:

  1. The project header cannot show Blocked for a plain CLI-agent pane. tab_conversation_status (app/src/workspace/view.rs) checks is_long_running() before consulting the agent's own status — but a claude sitting on a permission prompt is a long-running command, so Blocked is shadowed by InProgress and never reaches the header. Only orchestrated child conversations get through. The header's own doc comment says "a task that needs the user … wins over merely working", which the ordering silently defeats.
  2. CLIAgentSessionStatus::Blocked carries no timestamp, so nothing can distinguish "just asked" from "waiting 20 minutes".

Also: sessions detected by command-line matching (no plugin listener) render no status badge at all (agent_icon.rs), so a plugin-less agent is visually identical to a plain shell.

Proposal

  • Priority ranking. An ordered list of projects, managed from the project row's context menu, persisted keyed on a canonical ProjectKey string so all worktrees of a repo share one rank. Exposed as rank_of() — deliberately a readable attribute, not just a sort key, so per-project agent token budgets can consume it later.
  • Colour, not reordering. Rows tint yellow while an agent waits on you, deepening to red past 5 minutes, and green for a finished run whose result hasn't been looked at ("seen" = the pane was focused while Success). Projects never move in response to agent events — spatial memory is what makes a sidebar fast. Header inherits its most urgent child. Precedence is a derived Ord over an urgency enum, so adding a state is placing it in a list rather than editing a comparison chain.
  • Nag until unblocked. Ranked projects announce immediately and repeat every 3 minutes; unranked ones debounce 60s (most prompts are answered in seconds and should never make a sound) then repeat every 15. Looking at the pane silences the cycle; looking away while still blocked re-arms after a grace period. Only the agent leaving Blocked stops it for good. Announcements coalesce into one banner. When Warp is frontmost the banner is suppressed but the bell still rings for waiters in other tabs.

Cleanup is structural rather than a call site: poll() receives the complete set of currently-blocked tasks, and anything absent is dropped — so unblocked, killed, pane-closed and window-gone all collapse to "not observed", and a dead session can never nag forever.

Implementation (fork, flag-gated behind the existing FeatureFlag::Projects / ResumeProjectTasks): https://github.com/samithaj/warp/tree/samithaj/rail-triage — built on #14720.

Note on the sound API

Warp exposes only a play_sound: bool riding on a notification, plus AudibleBell::ring(). There is no way to distinguish an urgent "needs approval" sound from a soft "done" chime, which is the convention the Claude Code hook ecosystem has converged on. Worth considering separately.

Metadata

Metadata

Assignees

Labels

area:agentAgent workflows, conversations, prompts, cloud mode, and AI-specific UI.area:window-tabs-panesWindow, tab, pane, and workspace layout management.area:workspaceFile tree, workspace navigation, project switching, and working-directory management.enhancementNew feature or request.repro:mediumThe report suggests a plausible repro path, but some uncertainty remains.triagedIssue has received an initial automated triage pass.warp:auto-triage-review

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions