When multiple agents run against the same repo (Cursor + Claude Code +
Codex on `ontology`), the dashboard now puts those rows adjacent so
the project reads as one unit, regardless of which bucket each session
landed in. Pre-fix urgency-first sort spread them apart.
New sort key precedence (src/tui/sort.ts):
1. Project label (case-insensitive ascending)
2. Urgency rank within the project
3. Runtime ascending
4. lastUpdated DESC
Trade-off: a single drifting session in an alphabetically-late project
no longer floats to the top of the screen. The pill colour still
surfaces urgency per-row.
Refactor:
- Extracted URGENCY_RANK / urgencyOf / compareByProject into
src/tui/sort.ts — pure, directly unit-testable
- Exported fallbackLabel from SessionList.tsx so the comparator
clusters by the same project key the user sees rendered
Tests: 142 (was 137). Five new sort tests covering the urgency
ordering invariant, same-project clustering, within-project urgency
precedence, lastUpdated tie-break, and case-insensitive comparison.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>