dashboard: artifact side panel — pinnable PR previews, file edits, Penpot frames, design-review screenshots #970

Closed
opened 2026-05-08 12:16:33 +00:00 by claude-desktop · 2 comments
Collaborator

User story

As an operator I want to pin run artifacts (PR preview cards, individual file edits, Penpot frames produced by the designer, design-review screenshots) into a side panel separate from the chat scroll, so verifying agent output doesn't require rewinding through 200 events to find the latest version.

Context

Cursor 3 cloud agents "generate demos and screenshots of their work" specifically so operators don't scroll to verify (Cursor 3). Vercel chat templates and Claude.ai Artifacts both have this pattern.

Acceptance criteria

  • <ArtifactPanel> mounted as a tab in the run drawer (alongside Pipeline / Graph / Timeline). Empty state explains how to pin an artifact.
  • Each tool card in the timeline gets a "pin" affordance (<lucide.Pin />). Pinning a card adds a snapshot of its rendered output to the artifact panel.
  • Auto-pinned artifact kinds (configurable):
    • PRs (when PR URL extracted from result.git.branches[*].prUrl or terminal result)
    • Penpot frame URLs from designer agent runs
    • Screenshots from design-review agents
    • Final file edits when result.ok === true (collapsed by default; toggle to auto-pin)
  • Each artifact: title, source-event link, "open external" button (PR URL, Penpot file, image full-screen).
  • Persist artifact pins on task_history.artifacts (JSON array). Survives refresh.
  • Drag-to-reorder; right-click to remove.

Out of scope

  • Cross-run artifact gallery.
  • Artifact diffing across runs.

Dependencies

  • Depends on <ToolCard> ticket (the pin affordance).

References

## User story As an operator I want to pin run artifacts (PR preview cards, individual file edits, Penpot frames produced by the designer, design-review screenshots) into a side panel separate from the chat scroll, so verifying agent output doesn't require rewinding through 200 events to find the latest version. ## Context Cursor 3 cloud agents "generate demos and screenshots of their work" specifically so operators don't scroll to verify ([Cursor 3](https://cursor.com/blog/cursor-3)). Vercel chat templates and Claude.ai Artifacts both have this pattern. ## Acceptance criteria - [ ] `<ArtifactPanel>` mounted as a tab in the run drawer (alongside Pipeline / Graph / Timeline). Empty state explains how to pin an artifact. - [ ] Each tool card in the timeline gets a "pin" affordance (`<lucide.Pin />`). Pinning a card adds a snapshot of its rendered output to the artifact panel. - [ ] Auto-pinned artifact kinds (configurable): - PRs (when PR URL extracted from `result.git.branches[*].prUrl` or terminal `result`) - Penpot frame URLs from designer agent runs - Screenshots from design-review agents - Final file edits when `result.ok === true` (collapsed by default; toggle to auto-pin) - [ ] Each artifact: title, source-event link, "open external" button (PR URL, Penpot file, image full-screen). - [ ] Persist artifact pins on `task_history.artifacts` (JSON array). Survives refresh. - [ ] Drag-to-reorder; right-click to remove. ## Out of scope - Cross-run artifact gallery. - Artifact diffing across runs. ## Dependencies - Depends on `<ToolCard>` ticket (the pin affordance). ## References - Cursor 3: https://cursor.com/blog/cursor-3 - AI Elements `<Artifact>`: https://elements.ai-sdk.dev/components/artifact (concept reference; not a strict copy)
Collaborator

🤖 Auto-assigned to dev (heuristic: area:dashboard + body 1784 bytes (≤ 2 KB) — code role). Reply /unassign to reroute.

🤖 Auto-assigned to **dev** (heuristic: area:dashboard + body 1784 bytes (≤ 2 KB) — code role). Reply `/unassign` to reroute.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-08T19:59:19.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-08T19:59:19.000Z. Re-dispatching.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
charles/claude-hooks#970
No description provided.