From 45ce6fb398042fcf3decf5c64f5ef82350dd478e Mon Sep 17 00:00:00 2001 From: scotttong Date: Tue, 14 Jul 2026 11:10:21 -0700 Subject: [PATCH] design(decisions): de-emphasize project chip, add issue title to eyebrow (board round) Board feedback on the shipped card anatomy: the project folder icon renders bare in label gray on the card background (colored tile dropped; icon+name now link to the project), and the eyebrow shows the related issue's title next to its mono ID, truncated at --sz-16rem. Co-Authored-By: Claude Fable 5 --- doc/design/DECISION-SHEET.md | 4 ++++ ui/src/components/AttentionQueueRow.tsx | 29 +++++++++++++++++-------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/doc/design/DECISION-SHEET.md b/doc/design/DECISION-SHEET.md index ed5e8f88561..41b6751249f 100644 --- a/doc/design/DECISION-SHEET.md +++ b/doc/design/DECISION-SHEET.md @@ -39,6 +39,10 @@ Every open question from TOKEN-AUDIT.md §8 + batch logs and COMPONENT-INVENTORY | C10 | FeatureGate wrapper pattern (3 near-identical gates) | Nice-to-have shared primitive; backlog, not a run | APPROVED — backlog nice-to-have, not a run | | C11 | Sidebar agents section: hand-rolled rows (own spacing/icon colors, palette-blue liveness dot) instead of `SidebarNavItem`; only section that is collapsible | Run 3 item: unify rows onto `SidebarNavItem`, settle collapsibility policy across sections, liveness dot → canonical status blue. Wholesale shadcn Sidebar adoption REJECTED for now (app already has equivalent machinery incl. icon-rail height trick; highest-regression chrome) — re-evaluate as a dedicated item after Run 3 only if its behaviors (kbd shortcut, persisted state, mobile sheet) are wanted | DONE (Run 3, Jul 7) — agent rows render via `SidebarNavItem` (new additive props: `iconNode`, `active`, `dense`, `trailing`, `liveAccessory`); all live dots (agents + nav rows, rail + expanded) now use `--status-agent-running` (#2563eb, was palette blue-500 #3b82f6 — small hue-darkening delta, per-C11 mandate; "N live" text keeps its palette classes for Run 4). **Collapsibility policy** (superseded Jul 8 by user review): EVERY labeled section (Work, Company, Projects, Agents) is collapsible, default-open, session-scoped state — one affordance everywhere. "See all agents" stays a plain muted Link on purpose (must not adopt active-route highlighting). 48 sidebar vitest assertions pass unchanged. | +## Decisions-page card anatomy → project chip de-emphasized, eyebrow gains issue title (PAP-313 board round, Jul 14 2026) + +Board feedback on the shipped Quiet Ledger cards, two changes in one commit. (1) **The project chip loses its colored tile**: the icon renders bare on the card background in the same `text-muted-foreground` gray as the project name, and icon + name become a single `Link` to the project (`projectUrl`). Judgment call: project color now appears nowhere on the Decisions page — it stays on project-native surfaces (Projects list, project header); this extends the 1a "color is freed up for severity and CTAs" rule to the last colored element on the card. `ProjectTile` itself is untouched — the demotion is scoped to this feed. (2) **The eyebrow shows the related issue's title next to its ID** — mono ID + sans title in one link, title truncated at `--sz-16rem` so a long title can't crowd the recency stamp. Both changes are anatomy-only: no token edits, no new components. + ## Decisions page → palette classes retired, series closed (PAP-319 / PAP-313 sweep, Jul 14 2026) The Quiet Ledger series (anatomy 1a·2a·3a·4a·5b) closes with a page-level sweep: **no `sky/violet/rose/amber/orange/green` class remains anywhere on the Decisions page** — its color budget is the 12 shadcn core tokens plus `destructive`, which is reserved for the Critical badge alone (see the PAP-314 entry: red means Critical, never decoration; and the PAP-316 entry: the six-verb CTA vocabulary Approve / Reject / Answer / Review / Open / Restore). Spot-checks confirmed the keyboard-selection ring (`ring-ring`), curtain rows (`bg-muted/30`), and the expanded resolver band (`bg-muted/20` + `border-border/60`) were already token-only. Judgment call: the zero-state's green celebration mark (`bg-green-500/10` circle + `text-green-500` check) moves to `bg-muted` + `text-muted-foreground` — the CheckCircle2 glyph carries the "all clear" meaning by shape, and a page whose only red is an alarm shouldn't keep a green that means nothing is happening. Stories updated as the coverage map in the same commit (dead thumbnail fixtures dropped, `TypeColorsAndDetail` → "Card anatomy & detail", new `KeyboardSelected` ring story); snapshot suite untouched (dormant per this sheet). Flagged, not changed: the expanded resolver embeds the shared `IssueThreadInteractionCard` (violet plan chip et al.), which renders on issue threads too — resolver internals are out of scope per the approved plan, so its palette is that component's decision, not this page's. diff --git a/ui/src/components/AttentionQueueRow.tsx b/ui/src/components/AttentionQueueRow.tsx index 0d0b76021a6..3aacd809a79 100644 --- a/ui/src/components/AttentionQueueRow.tsx +++ b/ui/src/components/AttentionQueueRow.tsx @@ -23,7 +23,8 @@ import { severityBadge, sourceMeta, } from "../lib/attention"; -import { cn, relativeTime } from "../lib/utils"; +import { getProjectIcon } from "../lib/project-icons"; +import { cn, projectUrl, relativeTime } from "../lib/utils"; import { Button } from "./ui/button"; import { Textarea } from "./ui/textarea"; import { @@ -37,7 +38,6 @@ import { DropdownMenuTrigger, } from "./ui/dropdown-menu"; import { AttentionInteractionResolver } from "./AttentionInteractionResolver"; -import { ProjectTile } from "./ProjectTile"; const HOUR_MS = 60 * 60 * 1000; const DAY_MS = 24 * HOUR_MS; @@ -195,10 +195,13 @@ export const AttentionQueueRow = memo(function AttentionQueueRow({ {item.relatedIssue?.identifier && ( e.stopPropagation()} > - {item.relatedIssue.identifier} + {item.relatedIssue.identifier} + {item.relatedIssue.title && ( + {item.relatedIssue.title} + )} )} @@ -497,17 +500,25 @@ function compactDecisionSuccessLabel(sourceKind: AttentionItem["sourceKind"], ac return action === "reject" ? "Confirmation declined" : "Confirmation accepted"; } -/** Inline project identity keeps useful context without a competing badge. */ +/** + * Inline project identity keeps useful context without a competing badge. + * The icon renders bare on the card background in the same gray as the name + * (no colored tile — the project color stays on project-native surfaces), + * and the whole pair links to the project. + */ function ProjectMeta({ project }: { project: NonNullable }) { + const Icon = getProjectIcon(project.icon); return ( - e.stopPropagation()} > - + {project.name} - + ); }