Status

Where the work stands, for picking up in a new session. Generated and refreshed by the session-handoff skill; read CLAUDE.md first for the rules. Last refreshed: 2026-10-13.

Read this first

Proposals (all under proposals/, Storybook group Proposals)

Sidebar order is set in .storybook/preview.tsx (storySort): Icon, Spinner, Buttons (Button, Icon Button, Menu Button, Send Button), Chat Input, Thinking State, Identity (Agent Avatar, Avatar Label, Identity Block), Agent Step, Chain of Thought.

Proposal What it is Base Marked net-new
Spinner color='agentic' (AI gradient) added to the existing color prop; stories also offer discovery (--pds-color-status-discovery-fill) v2 Spinner no (extension)
Icon Local Icon wrapper adding sparklesSolid (third-party agents) and microphoneLines; zappy already exists v2 Icon no
Button isAgentic boolean: AI gradient border on primary and secondary, gradient working spinner v2 Button no (extension)
IconButton isAgentic recolors the border; needs hasBorder; standard variant only v2 IconButton no (extension)
MenuButton isAgentic passed to the trigger (Button or icon-only IconButton) v2 MenuButton no (extension)
Panel (Proposals/Panel) agentic-default, agentic-raised, agentic-sunken variants (existing surface plus the AI gradient border) and isAnimated shimmer v2 Panel no (extension)
SendButton Square filled button, state: send / working / stop; spinnerColor prop structure of IconButton yes
ChatInput Textarea-style field with a toolbar inside it (actionsStart / actionsEnd slots); variant: default / compact; label hidden by default Textarea foundations yes
ModelSelector (Proposals/Buttons/Model Selector) Controlled picker (value, options, onValueChange) wrapping MenuButton; subtle trigger with no fill in any state (color change on hover/open); check on the selected option via a new isSelected item flag on MenuButton MenuButton foundations yes
ChatMessage (Proposals/Chat Message) One turn in a conversation; sender: agent (plain, full width) / user (filled bubble on the right, hugs content, max 80%); children slot; required hidden label for screen readers; plus a thin ChatMessageList that owns the gap between turns (20px) none (new) yes
SuggestionCard (Proposals/Suggestion Card) An agent's proposed changes in chat, built on Panel: title, description, actions slot, state: pending / accepted (+ statusLabel); SuggestionChange rows (field label, before/after with dl) PDS Panel yes
ThinkingState Icon + label + optional elapsed time; sizes xs / s / m; AI shimmer on the label and a pulsing icon while active StatusIndicator family yes
AgentStep One row of agent work: optional status icon, label, quiet secondary text, optional expandable detail new yes
ChainOfThought Collapsible list of agent steps; summary line is a Thinking State with a chevron; isOpen, expandWhenActive ThinkingState + AgentStep yes
AgentAvatar (Identity/Agent Avatar) Purpose-built agent avatar so people can tell an agent from a person: circle (default) or square shape, dark fill (--pds-color-foreground-default), icon in --pds-color-foreground-reverse, AI-gradient ring ("halo", hasHalo, default on) with a gap; iconName: zappy (Pantheon agents, default) or sparklesSolid (third-party); sizes xs-xl; required label (screen-reader text), linkContent + ariaLabel v2 Avatar, with image / per-user color / user fallback removed yes
AvatarLabel (Identity/Avatar Label) PDS Avatar Label with the Agent Avatar in place of every Avatar; avatarProps is required (it carries label, iconName, hasHalo); class stays pds-avatar-label v2 AvatarLabel yes
IdentityBlock (Identity/Identity Block) v2 Identity Block with the Agent Avatar in place of Avatar (avatarProps requires label); added a Collapsed story v2 IdentityBlock no
CodeDiff (Proposals/Code Diff) Composes the package PanelList, PanelRow (expandable), CodeBlock (language='diff') and optional FileDiff: a list of changed files, each expanding to its diff none (built from PDS parts) yes

Cross-proposal dependencies (the port needs these together): SendButton and Button use the local Spinner (for 'agentic'); IconButton, MenuButton and ThinkingState use the local Icon wrapper (for the new icons); MenuButton uses the local Button and IconButton; ChatInput composes IconButton, MenuButton, ModelSelector and SendButton; ChainOfThought composes ThinkingState and AgentStep; AgentAvatar uses the local Icon wrapper (sparklesSolid); AvatarLabel renders the local AgentAvatar.

Conventions that were settled (don't relitigate)

Usage pages (new)

Every proposal has a <Name>/<Name>.mdx docs page, shown as Usage in the sidebar (<Meta of={...} name='Usage' />, Purpose, Usage, Implementation with a Canvas and Controls for one story). .storybook/main.ts now includes ../proposals/**/*.mdx. The designer has edited them by hand: Usage sections were removed from Button, Icon Button, Menu Button, Spinner and Chain of Thought; Agent Avatar, Agent Step, Icon, Thinking State, Chat Input and Avatar Label keep short ones. The wording is Claude's drafting plus her edits, so ask before adding guidance back.

Hosting

npm run build writes the static Storybook to storybook-static/. The current hosted copy is an unmerged PR on pantheon-systems/claude-prototypes; the plan is to host it from a Next.js site (see README).

Tooling in .storybook/

Things that behave in a way you might not expect

Open questions (also in each decisions.md)

Suggested next steps

  1. Decide whether the hosted Storybook should be refreshed with any later edits.
  2. The designer walks through each story in light and dark (hover, focus, open menus, Annotate on) and reports problems; fix those first.
  3. Resolve the open questions above, then run the handoff-package skill per proposal (typecheck, lint, token grep, npm run build, a11y panel) to write each HANDOFF.md. Nothing has been checked against raw color values; grep before handoff (the Spinner mask data URIs contain stroke='black', alpha-only).
  4. Commit.