[codex] add comprehensive UI Storybook coverage (#4132)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - The board UI is the main operator surface, so its component and
workflow coverage needs to stay reviewable as the product grows.
> - This branch adds Storybook as a dedicated UI reference surface for
core Paperclip screens and interaction patterns.
> - That work spans Storybook infrastructure, app-level provider wiring,
and a large fixture set that can render real control-plane states
without a live backend.
> - The branch also expands coverage across agents, budgets, issues,
chat, dialogs, navigation, projects, and data visualization so future UI
changes have a concrete visual baseline.
> - This pull request packages that Storybook work on top of the latest
`master`, excludes the lockfile from the final diff per repo policy, and
fixes one fixture contract drift caught during verification.
> - The benefit is a single reviewable PR that adds broad UI
documentation and regression-surfacing coverage without losing the
existing branch work.
## What Changed
- Added Storybook 10 wiring for the UI package, including root scripts,
UI package scripts, Storybook config, preview wrappers, Tailwind
entrypoints, and setup docs.
- Added a large fixture-backed data source for Storybook so complex
board states can render without a live server.
- Added story suites covering foundations, status language,
control-plane surfaces, overview, UX labs, agent management, budget and
finance, forms and editors, issue management, navigation and layout,
chat and comments, data visualization, dialogs and modals, and
projects/goals/workspaces.
- Adjusted several UI components for Storybook parity so dialogs, menus,
keyboard shortcuts, budget markers, markdown editing, and related
surfaces render correctly in isolation.
- Rebasing work for PR assembly: replayed the branch onto current
`master`, removed `pnpm-lock.yaml` from the final PR diff, and aligned
the dashboard fixture with the current `DashboardSummary.runActivity`
API contract.
## Verification
- `pnpm --filter @paperclipai/ui typecheck`
- `pnpm --filter @paperclipai/ui build-storybook`
- Manual diff audit after rebase: verified the PR no longer includes
`pnpm-lock.yaml` and now cleanly targets current `master`.
- Before/after UI note: before this branch there was no dedicated
Storybook surface for these Paperclip views; after this branch the local
Storybook build includes the new overview and domain story suites in
`ui/storybook-static`.
## Risks
- Large static fixture files can drift from shared types as dashboard
and UI contracts evolve; this PR already needed one fixture correction
for `runActivity`.
- Storybook bundle output includes some large chunks, so future growth
may need chunking work if build performance becomes an issue.
- Several component tweaks were made for isolated rendering parity, so
reviewers should spot-check key board surfaces against the live app
behavior.
## Model Used
- OpenAI Codex, GPT-5-based coding agent in the Paperclip harness; exact
serving model ID is not exposed in-runtime to the agent.
- Tool-assisted workflow with terminal execution, git operations, local
typecheck/build verification, and GitHub CLI PR creation.
- Context window/reasoning mode not surfaced by the harness.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-20 12:13:23 -05:00
import type { Meta , StoryObj } from "@storybook/react-vite" ;
import type { Agent , FeedbackVote , IssueComment } from "@paperclipai/shared" ;
import type { TranscriptEntry } from "@/adapters" ;
import type { LiveRunForIssue } from "@/api/heartbeats" ;
import { CommentThread } from "@/components/CommentThread" ;
import { IssueChatThread } from "@/components/IssueChatThread" ;
import { RunChatSurface } from "@/components/RunChatSurface" ;
import type { InlineEntityOption } from "@/components/InlineEntitySelector" ;
import type { MentionOption } from "@/components/MarkdownEditor" ;
import { Badge } from "@/components/ui/badge" ;
import { Card , CardContent , CardDescription , CardHeader , CardTitle } from "@/components/ui/card" ;
import type {
IssueChatComment ,
IssueChatLinkedRun ,
IssueChatTranscriptEntry ,
} from "@/lib/issue-chat-messages" ;
import type { IssueTimelineEvent } from "@/lib/issue-timeline-events" ;
import { storybookAgentMap , storybookAgents } from "../fixtures/paperclipData" ;
const companyId = "company-storybook" ;
const projectId = "project-board-ui" ;
const issueId = "issue-chat-comments" ;
const currentUserId = "user-board" ;
type StoryComment = IssueComment & {
runId? : string | null ;
runAgentId? : string | null ;
clientId? : string ;
clientStatus ? : "pending" | "queued" ;
queueState ? : "queued" ;
queueTargetRunId? : string | null ;
} ;
const codexAgent = storybookAgents . find ( ( agent ) = > agent . id === "agent-codex" ) ? ? storybookAgents [ 0 ] ! ;
const qaAgent = storybookAgents . find ( ( agent ) = > agent . id === "agent-qa" ) ? ? storybookAgents [ 1 ] ! ;
const ctoAgent = storybookAgents . find ( ( agent ) = > agent . id === "agent-cto" ) ? ? storybookAgents [ 2 ] ! ;
const boardUserLabels = new Map < string , string > ( [
[ "user-board" , "Riley Board" ] ,
[ "user-product" , "Mara Product" ] ,
] ) ;
function Section ( {
eyebrow ,
title ,
children ,
} : {
eyebrow : string ;
title : string ;
children : React.ReactNode ;
} ) {
return (
< section className = "paperclip-story__frame overflow-hidden" >
< div className = "flex flex-wrap items-start justify-between gap-3 border-b border-border px-5 py-4" >
< div >
< div className = "paperclip-story__label" > { eyebrow } < / div >
< h2 className = "mt-1 text-xl font-semibold" > { title } < / h2 >
< / div >
< / div >
< div className = "p-5" > { children } < / div >
< / section >
) ;
}
function ScenarioCard ( {
title ,
description ,
children ,
} : {
title : string ;
description : string ;
children : React.ReactNode ;
} ) {
return (
< Card className = "shadow-none" >
< CardHeader >
< CardTitle > { title } < / CardTitle >
< CardDescription > { description } < / CardDescription >
< / CardHeader >
< CardContent > { children } < / CardContent >
< / Card >
) ;
}
function createComment ( overrides : Partial < StoryComment > ) : StoryComment {
const createdAt = overrides . createdAt ? ? new Date ( "2026-04-20T14:00:00.000Z" ) ;
Add recovery handoff system notices (#5289)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - Agent runs can end productively while the source issue still lacks a
durable final disposition.
> - That leaves the control plane unsure whether to resume, escalate, or
close the work.
> - Issue comments also need a presentation contract so system-authored
recovery notices can render as first-class thread messages without
overloading normal comments.
> - This pull request adds successful-run handoff recovery, comment
presentation metadata, and system notice rendering.
> - The benefit is stricter task liveness with clearer operator-facing
recovery state.
## What Changed
- Added successful-run handoff decisions, wake payloads, escalation
behavior, and recovery tests.
- Added issue comment presentation metadata with migration
`0078_white_darwin.sql` and shared/server/company portability support.
- Rendered recovery/system notices in issue chat with dedicated UI
components, fixtures, tests, and storybook/lab coverage.
- Included the current recovery model-profile hint patch so automatic
recovery follow-ups use the cheap profile.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/services/recovery/successful-run-handoff.test.ts
ui/src/components/SystemNotice.test.tsx
ui/src/lib/system-notice-comment.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx`
## Risks
- Migration-bearing PR: merge this before any other branch that might
later add a migration.
- The branch touches both recovery services and issue-thread rendering,
so review should pay attention to recovery wake idempotency and comment
metadata compatibility.
## Model Used
- OpenAI GPT-5 Codex via Paperclip `codex_local` adapter, with
shell/git/GitHub CLI tool use.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 06:05:58 -05:00
const authorAgentId = overrides . authorAgentId ? ? null ;
[codex] add comprehensive UI Storybook coverage (#4132)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - The board UI is the main operator surface, so its component and
workflow coverage needs to stay reviewable as the product grows.
> - This branch adds Storybook as a dedicated UI reference surface for
core Paperclip screens and interaction patterns.
> - That work spans Storybook infrastructure, app-level provider wiring,
and a large fixture set that can render real control-plane states
without a live backend.
> - The branch also expands coverage across agents, budgets, issues,
chat, dialogs, navigation, projects, and data visualization so future UI
changes have a concrete visual baseline.
> - This pull request packages that Storybook work on top of the latest
`master`, excludes the lockfile from the final diff per repo policy, and
fixes one fixture contract drift caught during verification.
> - The benefit is a single reviewable PR that adds broad UI
documentation and regression-surfacing coverage without losing the
existing branch work.
## What Changed
- Added Storybook 10 wiring for the UI package, including root scripts,
UI package scripts, Storybook config, preview wrappers, Tailwind
entrypoints, and setup docs.
- Added a large fixture-backed data source for Storybook so complex
board states can render without a live server.
- Added story suites covering foundations, status language,
control-plane surfaces, overview, UX labs, agent management, budget and
finance, forms and editors, issue management, navigation and layout,
chat and comments, data visualization, dialogs and modals, and
projects/goals/workspaces.
- Adjusted several UI components for Storybook parity so dialogs, menus,
keyboard shortcuts, budget markers, markdown editing, and related
surfaces render correctly in isolation.
- Rebasing work for PR assembly: replayed the branch onto current
`master`, removed `pnpm-lock.yaml` from the final PR diff, and aligned
the dashboard fixture with the current `DashboardSummary.runActivity`
API contract.
## Verification
- `pnpm --filter @paperclipai/ui typecheck`
- `pnpm --filter @paperclipai/ui build-storybook`
- Manual diff audit after rebase: verified the PR no longer includes
`pnpm-lock.yaml` and now cleanly targets current `master`.
- Before/after UI note: before this branch there was no dedicated
Storybook surface for these Paperclip views; after this branch the local
Storybook build includes the new overview and domain story suites in
`ui/storybook-static`.
## Risks
- Large static fixture files can drift from shared types as dashboard
and UI contracts evolve; this PR already needed one fixture correction
for `runActivity`.
- Storybook bundle output includes some large chunks, so future growth
may need chunking work if build performance becomes an issue.
- Several component tweaks were made for isolated rendering parity, so
reviewers should spot-check key board surfaces against the live app
behavior.
## Model Used
- OpenAI Codex, GPT-5-based coding agent in the Paperclip harness; exact
serving model ID is not exposed in-runtime to the agent.
- Tool-assisted workflow with terminal execution, git operations, local
typecheck/build verification, and GitHub CLI PR creation.
- Context window/reasoning mode not surfaced by the harness.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-20 12:13:23 -05:00
return {
id : "comment-default" ,
companyId ,
issueId ,
authorAgentId : null ,
authorUserId : currentUserId ,
body : "" ,
Add recovery handoff system notices (#5289)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - Agent runs can end productively while the source issue still lacks a
durable final disposition.
> - That leaves the control plane unsure whether to resume, escalate, or
close the work.
> - Issue comments also need a presentation contract so system-authored
recovery notices can render as first-class thread messages without
overloading normal comments.
> - This pull request adds successful-run handoff recovery, comment
presentation metadata, and system notice rendering.
> - The benefit is stricter task liveness with clearer operator-facing
recovery state.
## What Changed
- Added successful-run handoff decisions, wake payloads, escalation
behavior, and recovery tests.
- Added issue comment presentation metadata with migration
`0078_white_darwin.sql` and shared/server/company portability support.
- Rendered recovery/system notices in issue chat with dedicated UI
components, fixtures, tests, and storybook/lab coverage.
- Included the current recovery model-profile hint patch so automatic
recovery follow-ups use the cheap profile.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/services/recovery/successful-run-handoff.test.ts
ui/src/components/SystemNotice.test.tsx
ui/src/lib/system-notice-comment.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx`
## Risks
- Migration-bearing PR: merge this before any other branch that might
later add a migration.
- The branch touches both recovery services and issue-thread rendering,
so review should pay attention to recovery wake idempotency and comment
metadata compatibility.
## Model Used
- OpenAI GPT-5 Codex via Paperclip `codex_local` adapter, with
shell/git/GitHub CLI tool use.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 06:05:58 -05:00
authorType : authorAgentId ? "agent" : "user" ,
presentation : null ,
metadata : null ,
[codex] add comprehensive UI Storybook coverage (#4132)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - The board UI is the main operator surface, so its component and
workflow coverage needs to stay reviewable as the product grows.
> - This branch adds Storybook as a dedicated UI reference surface for
core Paperclip screens and interaction patterns.
> - That work spans Storybook infrastructure, app-level provider wiring,
and a large fixture set that can render real control-plane states
without a live backend.
> - The branch also expands coverage across agents, budgets, issues,
chat, dialogs, navigation, projects, and data visualization so future UI
changes have a concrete visual baseline.
> - This pull request packages that Storybook work on top of the latest
`master`, excludes the lockfile from the final diff per repo policy, and
fixes one fixture contract drift caught during verification.
> - The benefit is a single reviewable PR that adds broad UI
documentation and regression-surfacing coverage without losing the
existing branch work.
## What Changed
- Added Storybook 10 wiring for the UI package, including root scripts,
UI package scripts, Storybook config, preview wrappers, Tailwind
entrypoints, and setup docs.
- Added a large fixture-backed data source for Storybook so complex
board states can render without a live server.
- Added story suites covering foundations, status language,
control-plane surfaces, overview, UX labs, agent management, budget and
finance, forms and editors, issue management, navigation and layout,
chat and comments, data visualization, dialogs and modals, and
projects/goals/workspaces.
- Adjusted several UI components for Storybook parity so dialogs, menus,
keyboard shortcuts, budget markers, markdown editing, and related
surfaces render correctly in isolation.
- Rebasing work for PR assembly: replayed the branch onto current
`master`, removed `pnpm-lock.yaml` from the final PR diff, and aligned
the dashboard fixture with the current `DashboardSummary.runActivity`
API contract.
## Verification
- `pnpm --filter @paperclipai/ui typecheck`
- `pnpm --filter @paperclipai/ui build-storybook`
- Manual diff audit after rebase: verified the PR no longer includes
`pnpm-lock.yaml` and now cleanly targets current `master`.
- Before/after UI note: before this branch there was no dedicated
Storybook surface for these Paperclip views; after this branch the local
Storybook build includes the new overview and domain story suites in
`ui/storybook-static`.
## Risks
- Large static fixture files can drift from shared types as dashboard
and UI contracts evolve; this PR already needed one fixture correction
for `runActivity`.
- Storybook bundle output includes some large chunks, so future growth
may need chunking work if build performance becomes an issue.
- Several component tweaks were made for isolated rendering parity, so
reviewers should spot-check key board surfaces against the live app
behavior.
## Model Used
- OpenAI Codex, GPT-5-based coding agent in the Paperclip harness; exact
serving model ID is not exposed in-runtime to the agent.
- Tool-assisted workflow with terminal execution, git operations, local
typecheck/build verification, and GitHub CLI PR creation.
- Context window/reasoning mode not surfaced by the harness.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-20 12:13:23 -05:00
createdAt ,
updatedAt : overrides.updatedAt ? ? createdAt ,
. . . overrides ,
} ;
}
function createSystemEvent ( overrides : Partial < IssueTimelineEvent > ) : IssueTimelineEvent {
return {
id : "event-default" ,
createdAt : new Date ( "2026-04-20T14:00:00.000Z" ) ,
actorType : "system" ,
actorId : "paperclip" ,
statusChange : {
from : "todo" ,
to : "in_progress" ,
} ,
. . . overrides ,
} ;
}
const mentionOptions : MentionOption [ ] = [
{
id : ` agent: ${ codexAgent . id } ` ,
name : codexAgent.name ,
kind : "agent" ,
agentId : codexAgent.id ,
agentIcon : codexAgent.icon ,
} ,
{
id : ` agent: ${ qaAgent . id } ` ,
name : qaAgent.name ,
kind : "agent" ,
agentId : qaAgent.id ,
agentIcon : qaAgent.icon ,
} ,
{
id : ` project: ${ projectId } ` ,
name : "Board UI" ,
kind : "project" ,
projectId ,
projectColor : "#0f766e" ,
} ,
] ;
const reassignOptions : InlineEntityOption [ ] = [
{
id : ` agent: ${ codexAgent . id } ` ,
label : codexAgent.name ,
searchText : ` ${ codexAgent . name } engineer codex ` ,
} ,
{
id : ` agent: ${ qaAgent . id } ` ,
label : qaAgent.name ,
searchText : ` ${ qaAgent . name } qa browser review ` ,
} ,
{
id : ` agent: ${ ctoAgent . id } ` ,
label : ctoAgent.name ,
searchText : ` ${ ctoAgent . name } architecture review ` ,
} ,
{
id : ` user: ${ currentUserId } ` ,
label : "Riley Board" ,
searchText : "board operator" ,
} ,
] ;
const singleComment = [
createComment ( {
id : "comment-single-board" ,
body : "Please make the issue chat states reviewable in Storybook before the next UI pass." ,
createdAt : new Date ( "2026-04-20T13:12:00.000Z" ) ,
} ) ,
] ;
const longThreadComments = [
createComment ( {
id : "comment-long-board" ,
body : "The chat surface should show the operator request first, then agent progress, then review follow-up. Keep the density close to the issue page." ,
createdAt : new Date ( "2026-04-20T13:02:00.000Z" ) ,
} ) ,
createComment ( {
id : "comment-long-agent" ,
authorAgentId : codexAgent.id ,
authorUserId : null ,
body : "I found the existing `IssueChatThread` and `RunChatSurface` components and am building the stories around those props." ,
createdAt : new Date ( "2026-04-20T13:08:00.000Z" ) ,
runId : "run-comment-thread-01" ,
runAgentId : codexAgent.id ,
} ) ,
createComment ( {
id : "comment-long-product" ,
authorUserId : "user-product" ,
body : "Also include the old comment timeline so we can compare it with the assistant-style issue chat." ,
createdAt : new Date ( "2026-04-20T13:16:00.000Z" ) ,
} ) ,
createComment ( {
id : "comment-long-qa" ,
authorAgentId : qaAgent.id ,
authorUserId : null ,
body : "QA note: the thread should stay readable with long markdown and when a queued operator reply is visible." ,
createdAt : new Date ( "2026-04-20T13:24:00.000Z" ) ,
runId : "run-comment-thread-02" ,
runAgentId : qaAgent.id ,
} ) ,
] ;
const markdownComments = [
createComment ( {
id : "comment-markdown-board" ,
body : [
"Acceptance criteria:" ,
"" ,
"- Cover empty, single, and long comment states" ,
"- Show a code block in a comment" ,
"- Include a link to [the issue guide](/issues/PAP-1676)" ,
"" ,
"```ts" ,
"const success = stories.some((story) => story.includes(\"IssueChatThread\"));" ,
"```" ,
] . join ( "\n" ) ,
createdAt : new Date ( "2026-04-20T13:28:00.000Z" ) ,
} ) ,
createComment ( {
id : "comment-mentions-agent" ,
authorAgentId : codexAgent.id ,
authorUserId : null ,
body : "@QAChecker I added the fixture coverage. Please focus browser review on links, code blocks, and the queued comment treatment." ,
createdAt : new Date ( "2026-04-20T13:35:00.000Z" ) ,
runId : "run-markdown-01" ,
runAgentId : codexAgent.id ,
} ) ,
] ;
const queuedComment = createComment ( {
id : "comment-queued-board" ,
body : "@CodexCoder after this run finishes, add a compact embedded variant too." ,
createdAt : new Date ( "2026-04-20T13:39:00.000Z" ) ,
clientId : "client-queued-storybook" ,
clientStatus : "queued" ,
queueState : "queued" ,
queueTargetRunId : "run-live-chat-01" ,
} ) ;
const commentTimelineEvents : IssueTimelineEvent [ ] = [
createSystemEvent ( {
id : "event-system-checkout" ,
createdAt : new Date ( "2026-04-20T13:04:00.000Z" ) ,
actorType : "system" ,
actorId : "paperclip" ,
statusChange : {
from : "todo" ,
to : "in_progress" ,
} ,
} ) ,
createSystemEvent ( {
id : "event-board-reassign" ,
createdAt : new Date ( "2026-04-20T13:18:00.000Z" ) ,
actorType : "user" ,
actorId : currentUserId ,
assigneeChange : {
from : { agentId : codexAgent.id , userId : null } ,
to : { agentId : qaAgent.id , userId : null } ,
} ,
statusChange : undefined ,
} ) ,
] ;
const commentLinkedRuns = [
{
runId : "run-comment-thread-01" ,
status : "succeeded" ,
agentId : codexAgent.id ,
createdAt : new Date ( "2026-04-20T13:07:00.000Z" ) ,
startedAt : new Date ( "2026-04-20T13:07:00.000Z" ) ,
finishedAt : new Date ( "2026-04-20T13:11:00.000Z" ) ,
} ,
{
runId : "run-comment-thread-02" ,
status : "running" ,
agentId : qaAgent.id ,
createdAt : new Date ( "2026-04-20T13:22:00.000Z" ) ,
startedAt : new Date ( "2026-04-20T13:22:00.000Z" ) ,
finishedAt : null ,
} ,
] ;
const feedbackVotes : FeedbackVote [ ] = [
{
id : "feedback-chat-comment-01" ,
companyId ,
issueId ,
targetType : "issue_comment" ,
targetId : "comment-issue-agent" ,
authorUserId : currentUserId ,
vote : "up" ,
reason : null ,
sharedWithLabs : false ,
sharedAt : null ,
consentVersion : null ,
redactionSummary : null ,
createdAt : new Date ( "2026-04-20T13:52:00.000Z" ) ,
updatedAt : new Date ( "2026-04-20T13:52:00.000Z" ) ,
} ,
] ;
const liveRun : LiveRunForIssue = {
id : "run-live-chat-01" ,
status : "running" ,
invocationSource : "manual" ,
triggerDetail : "comment" ,
createdAt : "2026-04-20T13:40:00.000Z" ,
startedAt : "2026-04-20T13:40:02.000Z" ,
finishedAt : null ,
agentId : codexAgent.id ,
agentName : codexAgent.name ,
adapterType : "codex_local" ,
issueId ,
} ;
const liveRunTranscript : TranscriptEntry [ ] = [
{
kind : "assistant" ,
ts : "2026-04-20T13:40:08.000Z" ,
text : "I am wiring the chat and comments Storybook coverage now." ,
} ,
{
kind : "thinking" ,
ts : "2026-04-20T13:40:12.000Z" ,
text : "Need fixtures that exercise MarkdownBody, assistant-ui messages, and the embedded run transcript path without reaching the API." ,
} ,
{
kind : "tool_call" ,
ts : "2026-04-20T13:40:18.000Z" ,
name : "rg" ,
toolUseId : "tool-live-rg" ,
input : {
query : "IssueChatThread" ,
cwd : "ui/src" ,
} ,
} ,
{
kind : "tool_result" ,
ts : "2026-04-20T13:40:20.000Z" ,
toolUseId : "tool-live-rg" ,
content : "ui/src/components/IssueChatThread.tsx\nui/src/components/RunChatSurface.tsx" ,
isError : false ,
} ,
{
kind : "assistant" ,
ts : "2026-04-20T13:40:31.000Z" ,
text : [
"The live run should render code blocks as part of the assistant response:" ,
"" ,
"```tsx" ,
"<RunChatSurface run={run} transcript={entries} hasOutput />" ,
"```" ,
] . join ( "\n" ) ,
} ,
{
kind : "tool_call" ,
ts : "2026-04-20T13:40:44.000Z" ,
name : "apply_patch" ,
toolUseId : "tool-live-patch" ,
input : {
file : "ui/storybook/stories/chat-comments.stories.tsx" ,
action : "add fixtures" ,
} ,
} ,
{
kind : "tool_result" ,
ts : "2026-04-20T13:40:49.000Z" ,
toolUseId : "tool-live-patch" ,
content : "Added Storybook scenarios for comment thread, run chat, and issue chat." ,
isError : false ,
} ,
] ;
const issueChatComments : IssueChatComment [ ] = [
createComment ( {
id : "comment-issue-board" ,
body : "Please turn the comment thread into a reviewable chat surface. I need to see operator messages, agent output, system events, and live run progress together." ,
createdAt : new Date ( "2026-04-20T13:44:00.000Z" ) ,
} ) ,
createComment ( {
id : "comment-issue-agent" ,
authorAgentId : codexAgent.id ,
authorUserId : null ,
body : "I kept the existing component contracts and added fixtures with realistic Paperclip work: checkout, comments, linked runs, and review feedback." ,
createdAt : new Date ( "2026-04-20T13:50:00.000Z" ) ,
runId : "run-issue-chat-01" ,
runAgentId : codexAgent.id ,
} ) ,
Add recovery handoff system notices (#5289)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - Agent runs can end productively while the source issue still lacks a
durable final disposition.
> - That leaves the control plane unsure whether to resume, escalate, or
close the work.
> - Issue comments also need a presentation contract so system-authored
recovery notices can render as first-class thread messages without
overloading normal comments.
> - This pull request adds successful-run handoff recovery, comment
presentation metadata, and system notice rendering.
> - The benefit is stricter task liveness with clearer operator-facing
recovery state.
## What Changed
- Added successful-run handoff decisions, wake payloads, escalation
behavior, and recovery tests.
- Added issue comment presentation metadata with migration
`0078_white_darwin.sql` and shared/server/company portability support.
- Rendered recovery/system notices in issue chat with dedicated UI
components, fixtures, tests, and storybook/lab coverage.
- Included the current recovery model-profile hint patch so automatic
recovery follow-ups use the cheap profile.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/services/recovery/successful-run-handoff.test.ts
ui/src/components/SystemNotice.test.tsx
ui/src/lib/system-notice-comment.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx`
## Risks
- Migration-bearing PR: merge this before any other branch that might
later add a migration.
- The branch touches both recovery services and issue-thread rendering,
so review should pay attention to recovery wake idempotency and comment
metadata compatibility.
## Model Used
- OpenAI GPT-5 Codex via Paperclip `codex_local` adapter, with
shell/git/GitHub CLI tool use.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 06:05:58 -05:00
createComment ( {
id : "comment-issue-system-warning" ,
authorType : "system" ,
authorAgentId : null ,
authorUserId : null ,
runId : "run-issue-chat-01" ,
runAgentId : codexAgent.id ,
body : "Paperclip needs a disposition before this issue can continue." ,
presentation : {
kind : "system_notice" ,
tone : "warning" ,
title : "Missing issue disposition" ,
detailsDefaultOpen : false ,
} ,
metadata : {
version : 1 ,
Show workspace changes and stale notices in issue threads (#5356)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies
> - The issue thread is the operator's durable audit trail for what
changed and why
> - Workspace changes and stale disposition notices need to be visible
in that same timeline without noisy or misleading rendering
> - The local branch already contained backend activity details,
timeline conversion, and UI rendering work for those events
> - This pull request isolates the issue-thread activity work into a
standalone branch against `origin/master`
> - The benefit is a focused audit-trail PR that can merge independently
of the sidebar/operator UI polish branch
## What Changed
- Adds readable workspace-change activity details to issue update
activity events.
- Surfaces workspace-change events in issue chat/timeline rendering.
- Makes the existing issue comment migration idempotent.
- Folds and renders stale disposition notices inline so they match
activity-log styling and spacing.
- Adds focused route, timeline, and issue-thread system notice coverage.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx` — 3 files
passed, 22 tests passed.
- Confirmed the PR changes 9 files and does not include `pnpm-lock.yaml`
or `.github/workflows/*`.
- `pnpm exec vitest run
server/src/__tests__/issue-closed-workspace-routes.test.ts` — 1 file
passed, 4 tests passed.
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx
server/src/services/recovery/successful-run-handoff.test.ts
packages/shared/src/validators/issue.test.ts` — 5 files passed, 54 tests
passed.
- `pnpm --filter @paperclipai/shared typecheck && pnpm --filter
@paperclipai/server typecheck && pnpm --filter @paperclipai/ui
typecheck`.
- `pnpm --filter @paperclipai/ui typecheck` after adding the Storybook
screenshot fixture.
- Captured Storybook screenshots for the new UI rendering paths:
- Collapsed stale notice + workspace-change row:
`docs/pr-screenshots/pr-5356/issue-thread-notices-collapsed.png`
- Expanded stale notice details:
`docs/pr-screenshots/pr-5356/issue-thread-notices-expanded.png`
### Screenshots
Collapsed stale notice with workspace-change row:

Expanded stale notice details:

## Risks
- Moderate risk: this touches issue activity serialization and
issue-thread rendering, both of which are central operator surfaces.
- Migration risk is low: the only migration change makes an existing
migration idempotent.
- No new migrations are introduced, so there is no cross-PR migration
ordering requirement.
> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.
## Model Used
- OpenAI Codex, GPT-5 coding agent, shell/tool-use enabled, used to
split the existing branch, verify the isolated PR branch, and create
this PR.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 09:00:54 -05:00
sourceRunId : "run-issue-chat-01" ,
Add recovery handoff system notices (#5289)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - Agent runs can end productively while the source issue still lacks a
durable final disposition.
> - That leaves the control plane unsure whether to resume, escalate, or
close the work.
> - Issue comments also need a presentation contract so system-authored
recovery notices can render as first-class thread messages without
overloading normal comments.
> - This pull request adds successful-run handoff recovery, comment
presentation metadata, and system notice rendering.
> - The benefit is stricter task liveness with clearer operator-facing
recovery state.
## What Changed
- Added successful-run handoff decisions, wake payloads, escalation
behavior, and recovery tests.
- Added issue comment presentation metadata with migration
`0078_white_darwin.sql` and shared/server/company portability support.
- Rendered recovery/system notices in issue chat with dedicated UI
components, fixtures, tests, and storybook/lab coverage.
- Included the current recovery model-profile hint patch so automatic
recovery follow-ups use the cheap profile.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/services/recovery/successful-run-handoff.test.ts
ui/src/components/SystemNotice.test.tsx
ui/src/lib/system-notice-comment.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx`
## Risks
- Migration-bearing PR: merge this before any other branch that might
later add a migration.
- The branch touches both recovery services and issue-thread rendering,
so review should pay attention to recovery wake idempotency and comment
metadata compatibility.
## Model Used
- OpenAI GPT-5 Codex via Paperclip `codex_local` adapter, with
shell/git/GitHub CLI tool use.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 06:05:58 -05:00
sections : [
{
title : "Required action" ,
rows : [
{ type : "issue_link" , label : "Source issue" , issueId : issueId , identifier : "PAP-3440" , title : "Successful run handoff" } ,
{ type : "agent_link" , label : "Assignee" , agentId : codexAgent.id , name : codexAgent.name } ,
{ type : "key_value" , label : "Status before" , value : "in_progress" } ,
] ,
} ,
{
title : "Run evidence" ,
rows : [
{ type : "run_link" , label : "Successful run" , runId : "run-issue-chat-01" , title : "succeeded" } ,
{ type : "key_value" , label : "Normalized cause" , value : "Run completed without disposition" } ,
] ,
} ,
] ,
} ,
createdAt : new Date ( "2026-04-20T13:54:00.000Z" ) ,
} ) ,
[codex] add comprehensive UI Storybook coverage (#4132)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - The board UI is the main operator surface, so its component and
workflow coverage needs to stay reviewable as the product grows.
> - This branch adds Storybook as a dedicated UI reference surface for
core Paperclip screens and interaction patterns.
> - That work spans Storybook infrastructure, app-level provider wiring,
and a large fixture set that can render real control-plane states
without a live backend.
> - The branch also expands coverage across agents, budgets, issues,
chat, dialogs, navigation, projects, and data visualization so future UI
changes have a concrete visual baseline.
> - This pull request packages that Storybook work on top of the latest
`master`, excludes the lockfile from the final diff per repo policy, and
fixes one fixture contract drift caught during verification.
> - The benefit is a single reviewable PR that adds broad UI
documentation and regression-surfacing coverage without losing the
existing branch work.
## What Changed
- Added Storybook 10 wiring for the UI package, including root scripts,
UI package scripts, Storybook config, preview wrappers, Tailwind
entrypoints, and setup docs.
- Added a large fixture-backed data source for Storybook so complex
board states can render without a live server.
- Added story suites covering foundations, status language,
control-plane surfaces, overview, UX labs, agent management, budget and
finance, forms and editors, issue management, navigation and layout,
chat and comments, data visualization, dialogs and modals, and
projects/goals/workspaces.
- Adjusted several UI components for Storybook parity so dialogs, menus,
keyboard shortcuts, budget markers, markdown editing, and related
surfaces render correctly in isolation.
- Rebasing work for PR assembly: replayed the branch onto current
`master`, removed `pnpm-lock.yaml` from the final PR diff, and aligned
the dashboard fixture with the current `DashboardSummary.runActivity`
API contract.
## Verification
- `pnpm --filter @paperclipai/ui typecheck`
- `pnpm --filter @paperclipai/ui build-storybook`
- Manual diff audit after rebase: verified the PR no longer includes
`pnpm-lock.yaml` and now cleanly targets current `master`.
- Before/after UI note: before this branch there was no dedicated
Storybook surface for these Paperclip views; after this branch the local
Storybook build includes the new overview and domain story suites in
`ui/storybook-static`.
## Risks
- Large static fixture files can drift from shared types as dashboard
and UI contracts evolve; this PR already needed one fixture correction
for `runActivity`.
- Storybook bundle output includes some large chunks, so future growth
may need chunking work if build performance becomes an issue.
- Several component tweaks were made for isolated rendering parity, so
reviewers should spot-check key board surfaces against the live app
behavior.
## Model Used
- OpenAI Codex, GPT-5-based coding agent in the Paperclip harness; exact
serving model ID is not exposed in-runtime to the agent.
- Tool-assisted workflow with terminal execution, git operations, local
typecheck/build verification, and GitHub CLI PR creation.
- Context window/reasoning mode not surfaced by the harness.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-20 12:13:23 -05:00
createComment ( {
id : "comment-issue-queued" ,
body : "@QAChecker please do a quick visual pass after the Storybook build is green." ,
createdAt : new Date ( "2026-04-20T13:56:00.000Z" ) ,
clientId : "client-issue-queued" ,
clientStatus : "queued" ,
queueState : "queued" ,
queueTargetRunId : liveRun.id ,
} ) ,
] ;
const issueTimelineEvents : IssueTimelineEvent [ ] = [
createSystemEvent ( {
id : "event-issue-checkout" ,
createdAt : new Date ( "2026-04-20T13:42:00.000Z" ) ,
actorType : "system" ,
actorId : "paperclip" ,
statusChange : {
from : "todo" ,
to : "in_progress" ,
} ,
} ) ,
createSystemEvent ( {
id : "event-issue-assignee" ,
createdAt : new Date ( "2026-04-20T13:43:00.000Z" ) ,
actorType : "user" ,
actorId : currentUserId ,
statusChange : undefined ,
assigneeChange : {
from : { agentId : null , userId : null } ,
to : { agentId : codexAgent.id , userId : null } ,
} ,
} ) ,
] ;
Show workspace changes and stale notices in issue threads (#5356)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies
> - The issue thread is the operator's durable audit trail for what
changed and why
> - Workspace changes and stale disposition notices need to be visible
in that same timeline without noisy or misleading rendering
> - The local branch already contained backend activity details,
timeline conversion, and UI rendering work for those events
> - This pull request isolates the issue-thread activity work into a
standalone branch against `origin/master`
> - The benefit is a focused audit-trail PR that can merge independently
of the sidebar/operator UI polish branch
## What Changed
- Adds readable workspace-change activity details to issue update
activity events.
- Surfaces workspace-change events in issue chat/timeline rendering.
- Makes the existing issue comment migration idempotent.
- Folds and renders stale disposition notices inline so they match
activity-log styling and spacing.
- Adds focused route, timeline, and issue-thread system notice coverage.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx` — 3 files
passed, 22 tests passed.
- Confirmed the PR changes 9 files and does not include `pnpm-lock.yaml`
or `.github/workflows/*`.
- `pnpm exec vitest run
server/src/__tests__/issue-closed-workspace-routes.test.ts` — 1 file
passed, 4 tests passed.
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx
server/src/services/recovery/successful-run-handoff.test.ts
packages/shared/src/validators/issue.test.ts` — 5 files passed, 54 tests
passed.
- `pnpm --filter @paperclipai/shared typecheck && pnpm --filter
@paperclipai/server typecheck && pnpm --filter @paperclipai/ui
typecheck`.
- `pnpm --filter @paperclipai/ui typecheck` after adding the Storybook
screenshot fixture.
- Captured Storybook screenshots for the new UI rendering paths:
- Collapsed stale notice + workspace-change row:
`docs/pr-screenshots/pr-5356/issue-thread-notices-collapsed.png`
- Expanded stale notice details:
`docs/pr-screenshots/pr-5356/issue-thread-notices-expanded.png`
### Screenshots
Collapsed stale notice with workspace-change row:

Expanded stale notice details:

## Risks
- Moderate risk: this touches issue activity serialization and
issue-thread rendering, both of which are central operator surfaces.
- Migration risk is low: the only migration change makes an existing
migration idempotent.
- No new migrations are introduced, so there is no cross-PR migration
ordering requirement.
> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.
## Model Used
- OpenAI Codex, GPT-5 coding agent, shell/tool-use enabled, used to
split the existing branch, verify the isolated PR branch, and create
this PR.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 09:00:54 -05:00
const issueThreadNoticeReviewComments : IssueChatComment [ ] = [
createComment ( {
id : "comment-notice-board" ,
body : "The issue thread needs to show workspace routing changes and make old missing-disposition warnings feel resolved." ,
createdAt : new Date ( "2026-04-20T13:44:00.000Z" ) ,
} ) ,
createComment ( {
id : "comment-notice-system-warning" ,
authorType : "system" ,
authorAgentId : null ,
authorUserId : null ,
runId : "run-notice-source" ,
runAgentId : codexAgent.id ,
body : "Paperclip needs a disposition before this issue can continue." ,
presentation : {
kind : "system_notice" ,
tone : "warning" ,
title : "Missing issue disposition" ,
detailsDefaultOpen : false ,
} ,
metadata : {
version : 1 ,
sourceRunId : "run-notice-source" ,
sections : [
{
title : "Required action" ,
rows : [
{ type : "issue_link" , label : "Source issue" , issueId , identifier : "PAP-3660" , title : "Show issue-thread notices" } ,
{ type : "agent_link" , label : "Assignee" , agentId : codexAgent.id , name : codexAgent.name } ,
{ type : "key_value" , label : "Missing disposition" , value : "clear_next_step" } ,
] ,
} ,
{
title : "Run evidence" ,
rows : [
{ type : "run_link" , label : "Completed run" , runId : "run-notice-source" , title : "succeeded" } ,
{ type : "key_value" , label : "Normalized cause" , value : "successful_run_missing_state" } ,
] ,
} ,
] ,
} ,
createdAt : new Date ( "2026-04-20T13:48:00.000Z" ) ,
} ) ,
] ;
const issueThreadNoticeReviewTimelineEvents : IssueTimelineEvent [ ] = [
createSystemEvent ( {
id : "event-notice-workspace-change" ,
createdAt : new Date ( "2026-04-20T13:46:00.000Z" ) ,
statusChange : undefined ,
workspaceChange : {
from : {
label : "Project primary workspace" ,
projectWorkspaceId : "workspace-primary" ,
executionWorkspaceId : null ,
mode : "shared_workspace" ,
} ,
to : {
label : "PAP-3660 issue-thread-notices" ,
projectWorkspaceId : null ,
executionWorkspaceId : "execution-workspace-notices" ,
mode : "isolated_workspace" ,
} ,
} ,
} ) ,
] ;
[codex] add comprehensive UI Storybook coverage (#4132)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - The board UI is the main operator surface, so its component and
workflow coverage needs to stay reviewable as the product grows.
> - This branch adds Storybook as a dedicated UI reference surface for
core Paperclip screens and interaction patterns.
> - That work spans Storybook infrastructure, app-level provider wiring,
and a large fixture set that can render real control-plane states
without a live backend.
> - The branch also expands coverage across agents, budgets, issues,
chat, dialogs, navigation, projects, and data visualization so future UI
changes have a concrete visual baseline.
> - This pull request packages that Storybook work on top of the latest
`master`, excludes the lockfile from the final diff per repo policy, and
fixes one fixture contract drift caught during verification.
> - The benefit is a single reviewable PR that adds broad UI
documentation and regression-surfacing coverage without losing the
existing branch work.
## What Changed
- Added Storybook 10 wiring for the UI package, including root scripts,
UI package scripts, Storybook config, preview wrappers, Tailwind
entrypoints, and setup docs.
- Added a large fixture-backed data source for Storybook so complex
board states can render without a live server.
- Added story suites covering foundations, status language,
control-plane surfaces, overview, UX labs, agent management, budget and
finance, forms and editors, issue management, navigation and layout,
chat and comments, data visualization, dialogs and modals, and
projects/goals/workspaces.
- Adjusted several UI components for Storybook parity so dialogs, menus,
keyboard shortcuts, budget markers, markdown editing, and related
surfaces render correctly in isolation.
- Rebasing work for PR assembly: replayed the branch onto current
`master`, removed `pnpm-lock.yaml` from the final PR diff, and aligned
the dashboard fixture with the current `DashboardSummary.runActivity`
API contract.
## Verification
- `pnpm --filter @paperclipai/ui typecheck`
- `pnpm --filter @paperclipai/ui build-storybook`
- Manual diff audit after rebase: verified the PR no longer includes
`pnpm-lock.yaml` and now cleanly targets current `master`.
- Before/after UI note: before this branch there was no dedicated
Storybook surface for these Paperclip views; after this branch the local
Storybook build includes the new overview and domain story suites in
`ui/storybook-static`.
## Risks
- Large static fixture files can drift from shared types as dashboard
and UI contracts evolve; this PR already needed one fixture correction
for `runActivity`.
- Storybook bundle output includes some large chunks, so future growth
may need chunking work if build performance becomes an issue.
- Several component tweaks were made for isolated rendering parity, so
reviewers should spot-check key board surfaces against the live app
behavior.
## Model Used
- OpenAI Codex, GPT-5-based coding agent in the Paperclip harness; exact
serving model ID is not exposed in-runtime to the agent.
- Tool-assisted workflow with terminal execution, git operations, local
typecheck/build verification, and GitHub CLI PR creation.
- Context window/reasoning mode not surfaced by the harness.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-20 12:13:23 -05:00
const issueLinkedRuns : IssueChatLinkedRun [ ] = [
{
runId : "run-issue-chat-01" ,
status : "succeeded" ,
agentId : codexAgent.id ,
agentName : codexAgent.name ,
adapterType : "codex_local" ,
createdAt : new Date ( "2026-04-20T13:46:00.000Z" ) ,
startedAt : new Date ( "2026-04-20T13:46:00.000Z" ) ,
finishedAt : new Date ( "2026-04-20T13:51:00.000Z" ) ,
hasStoredOutput : true ,
} ,
] ;
const issueTranscriptsByRunId = new Map < string , readonly IssueChatTranscriptEntry [ ] > ( [
[
"run-issue-chat-01" ,
[
{
kind : "thinking" ,
ts : "2026-04-20T13:46:10.000Z" ,
text : "Checking the existing Storybook organization before adding a new product group." ,
} ,
{
kind : "tool_call" ,
ts : "2026-04-20T13:46:16.000Z" ,
name : "read_file" ,
toolUseId : "tool-issue-read" ,
input : {
path : "ui/storybook/stories/overview.stories.tsx" ,
} ,
} ,
{
kind : "tool_result" ,
ts : "2026-04-20T13:46:19.000Z" ,
toolUseId : "tool-issue-read" ,
content : "The coverage map already lists Chat & comments as a planned section." ,
isError : false ,
} ,
{
kind : "assistant" ,
ts : "2026-04-20T13:49:00.000Z" ,
text : "Added the story file and kept every fixture local to the story so product data fixtures stay stable." ,
} ,
{
kind : "diff" ,
ts : "2026-04-20T13:49:04.000Z" ,
changeType : "file_header" ,
text : "diff --git a/ui/storybook/stories/chat-comments.stories.tsx b/ui/storybook/stories/chat-comments.stories.tsx" ,
} ,
{
kind : "diff" ,
ts : "2026-04-20T13:49:05.000Z" ,
changeType : "add" ,
text : "+export const FullSurfaceMatrix: Story = {};" ,
} ,
] ,
] ,
[ liveRun . id , liveRunTranscript ] ,
] ) ;
function ThreadProps ( {
comments ,
queuedComments = [ ] ,
timelineEvents = [ ] ,
} : {
comments : StoryComment [ ] ;
queuedComments? : StoryComment [ ] ;
timelineEvents? : IssueTimelineEvent [ ] ;
} ) {
return (
< CommentThread
comments = { comments }
queuedComments = { queuedComments }
linkedRuns = { commentLinkedRuns }
timelineEvents = { timelineEvents }
companyId = { companyId }
projectId = { projectId }
issueStatus = "in_progress"
agentMap = { storybookAgentMap }
currentUserId = { currentUserId }
onAdd = { async ( ) = > { } }
enableReassign
reassignOptions = { reassignOptions }
currentAssigneeValue = { ` agent: ${ codexAgent . id } ` }
suggestedAssigneeValue = { ` agent: ${ codexAgent . id } ` }
mentions = { mentionOptions }
onInterruptQueued = { async ( ) = > { } }
/ >
) ;
}
function CommentThreadMatrix() {
return (
< Section eyebrow = "CommentThread" title = "Timeline comments across empty, single, long, markdown, and queued states" >
< div className = "grid gap-5 xl:grid-cols-2" >
< ScenarioCard title = "Empty thread" description = "No timeline entries yet, with the composer ready for the first comment." >
< ThreadProps comments = { [ ] } / >
< / ScenarioCard >
< ScenarioCard title = "Single board comment" description = "A minimal operator request with timestamp and composer controls." >
< ThreadProps comments = { singleComment } / >
< / ScenarioCard >
< ScenarioCard title = "Long mixed-author thread" description = "Board, product, agent, linked run, and system timeline entries in one stack." >
< ThreadProps comments = { longThreadComments } timelineEvents = { commentTimelineEvents } / >
< / ScenarioCard >
< ScenarioCard title = "Markdown, code, mentions, and links" description = "Markdown rendering with code fences, @mentions, links, and a queued reply." >
< ThreadProps comments = { markdownComments } queuedComments = { [ queuedComment ] } / >
< / ScenarioCard >
< / div >
< / Section >
) ;
}
function RunChatMatrix() {
return (
< Section eyebrow = "RunChatSurface" title = "Live run chat with streaming output, tools, and code blocks" >
< div className = "grid gap-5 lg:grid-cols-[minmax(0,1fr)_360px]" >
< div className = "rounded-lg border border-border bg-background/70 p-4" >
< RunChatSurface
run = { liveRun }
transcript = { liveRunTranscript }
hasOutput
companyId = { companyId }
/ >
< / div >
< Card className = "shadow-none" >
< CardHeader >
< CardTitle > Run fixture shape < / CardTitle >
< CardDescription > Streaming transcript entries mixed into the same chat renderer used by issue chat . < / CardDescription >
< / CardHeader >
< CardContent className = "space-y-3 text-sm" >
< div className = "flex items-center justify-between gap-3" >
< span className = "text-muted-foreground" > Status < / span >
< Badge variant = "secondary" > running < / Badge >
< / div >
< div className = "flex items-center justify-between gap-3" >
< span className = "text-muted-foreground" > Tool calls < / span >
< span className = "font-mono text-xs" > rg , apply_patch < / span >
< / div >
< div className = "flex items-center justify-between gap-3" >
< span className = "text-muted-foreground" > Transcript entries < / span >
< span className = "font-mono text-xs" > { liveRunTranscript . length } < / span >
< / div >
< / CardContent >
< / Card >
< / div >
< / Section >
) ;
}
function IssueChatMatrix() {
return (
< Section eyebrow = "IssueChatThread" title = "Issue-specific chat with timeline events, linked runs, and live output" >
< div className = "grid gap-5 xl:grid-cols-[minmax(0,1fr)_420px]" >
< div className = "rounded-lg border border-border bg-background/70 p-4" >
< IssueChatThread
comments = { issueChatComments }
linkedRuns = { issueLinkedRuns }
timelineEvents = { issueTimelineEvents }
liveRuns = { [ liveRun ] }
feedbackVotes = { feedbackVotes }
feedbackDataSharingPreference = "allowed"
companyId = { companyId }
projectId = { projectId }
issueStatus = "in_progress"
agentMap = { storybookAgentMap }
currentUserId = { currentUserId }
userLabelMap = { boardUserLabels }
onAdd = { async ( ) = > { } }
onVote = { async ( ) = > { } }
onStopRun = { async ( ) = > { } }
enableReassign
reassignOptions = { reassignOptions }
currentAssigneeValue = { ` agent: ${ codexAgent . id } ` }
suggestedAssigneeValue = { ` agent: ${ codexAgent . id } ` }
mentions = { mentionOptions }
enableLiveTranscriptPolling = { false }
transcriptsByRunId = { issueTranscriptsByRunId }
hasOutputForRun = { ( runId ) = > issueTranscriptsByRunId . has ( runId ) }
includeSucceededRunsWithoutOutput
onInterruptQueued = { async ( ) = > { } }
onCancelQueued = { ( ) = > undefined }
/ >
< / div >
< div className = "space-y-5" >
< ScenarioCard title = "Empty issue chat" description = "The standalone empty state before an operator or agent posts." >
< IssueChatThread
comments = { [ ] }
timelineEvents = { [ ] }
linkedRuns = { [ ] }
liveRuns = { [ ] }
companyId = { companyId }
projectId = { projectId }
agentMap = { storybookAgentMap }
currentUserId = { currentUserId }
onAdd = { async ( ) = > { } }
enableLiveTranscriptPolling = { false }
emptyMessage = "No chat yet. The first operator note will start the issue conversation."
/ >
< / ScenarioCard >
< ScenarioCard title = "Disabled composer" description = "Review state where the conversation remains readable but input is paused." >
< IssueChatThread
comments = { singleComment }
timelineEvents = { [ ] }
linkedRuns = { [ ] }
liveRuns = { [ ] }
companyId = { companyId }
projectId = { projectId }
agentMap = { storybookAgentMap }
currentUserId = { currentUserId }
onAdd = { async ( ) = > { } }
showJumpToLatest = { false }
enableLiveTranscriptPolling = { false }
composerDisabledReason = "This issue is in review. Request changes or approve it from the review controls."
/ >
< / ScenarioCard >
Add planning mode for issue work (#5353)
## Thinking Path
> - Paperclip is a control plane for autonomous AI companies.
> - Issues are the core unit of work, and issue comments are how board
users and agents coordinate execution.
> - Some issue conversations need to produce plans and approvals instead
of immediate implementation work.
> - The existing issue contract did not distinguish standard execution
comments from planning-oriented issue work.
> - This pull request adds an issue work-mode contract and board UI
affordances for standard vs planning mode.
> - The benefit is that planning-mode issues can be created, displayed,
discussed, and carried through agent heartbeat context without losing
the normal issue workflow.
## What Changed
- Added `standard` / `planning` issue work-mode contracts across DB,
shared validators/types, server issue flows, plugin protocol, and
adapter heartbeat payloads.
- Added an idempotent `0081_optimal_dormammu` migration for
`issues.work_mode`, ordered after current `public-gh/master` migrations.
- Updated heartbeat/context summaries and issue-thread interaction
behavior so planning work mode is preserved when creating suggested
follow-up issues.
- Added UI support for planning-mode issue creation, issue rows, detail
composer styling, and composer work-mode toggles.
- Added focused server/shared/UI tests plus a Playwright visual
verification spec for planning-mode surfaces.
- Rebased the branch onto current `public-gh/master` and added durable
planning-mode screenshots under `doc/assets/pap-3368/`.
## Verification
- `pnpm --filter @paperclipai/db run check:migrations`
- `pnpm exec vitest run --project @paperclipai/shared
packages/shared/src/validators/issue.test.ts`
- `pnpm exec vitest run --project @paperclipai/server
server/src/__tests__/heartbeat-context-summary.test.ts
server/src/__tests__/issue-thread-interactions-service.test.ts
server/src/__tests__/issues-goal-context-routes.test.ts --pool=forks
--poolOptions.forks.isolate=true`
- `pnpm exec vitest run --project @paperclipai/ui
ui/src/components/IssueChatThread.test.tsx
ui/src/components/NewIssueDialog.test.tsx
ui/src/components/IssueRow.test.tsx ui/src/pages/IssueDetail.test.tsx`
- `pnpm exec vitest run --project @paperclipai/adapter-utils
packages/adapter-utils/src/server-utils.test.ts`
- `PAPERCLIP_E2E_SKIP_LLM=true npx playwright test --config
tests/e2e/playwright.config.ts
tests/e2e/planning-mode-visual-verification.spec.ts`
## Screenshots
Desktop planning detail:

Desktop planning row:

Desktop staged standard toggle:

Mobile planning detail:

Mobile planning row:

## Risks
- Medium migration risk: this adds a non-null issue column. The
migration uses `ADD COLUMN IF NOT EXISTS` so installations that applied
an older branch-local migration number can still apply the final
numbered migration safely.
- Medium contract risk: issue payloads, plugin payloads, and adapter
heartbeat payloads now include work mode; compatibility is handled by
defaulting missing values to `standard`.
- UI risk is moderate because composer controls changed; focused
component tests and visual e2e coverage exercise standard vs planning
display and toggle behavior.
> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.
## Model Used
- OpenAI Codex, GPT-5 coding agent in a local Paperclip worktree, with
shell/tool use. Exact context-window size is not exposed in this
runtime.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 07:01:28 -05:00
< ScenarioCard
title = "Planning mode composer"
description = "Issue is in planning mode. The composer turns amber and surfaces a Planning chip next to the paperclip — clicking it stages a Standard submission without immediately changing the issue mode."
>
< IssueChatThread
comments = { [ ] }
timelineEvents = { [ ] }
linkedRuns = { [ ] }
liveRuns = { [ ] }
companyId = { companyId }
projectId = { projectId }
agentMap = { storybookAgentMap }
currentUserId = { currentUserId }
issueWorkMode = "planning"
onWorkModeChange = { ( ) = > undefined }
onAdd = { async ( ) = > { } }
enableLiveTranscriptPolling = { false }
emptyMessage = "Planning mode reply box example."
/ >
< / ScenarioCard >
[codex] add comprehensive UI Storybook coverage (#4132)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - The board UI is the main operator surface, so its component and
workflow coverage needs to stay reviewable as the product grows.
> - This branch adds Storybook as a dedicated UI reference surface for
core Paperclip screens and interaction patterns.
> - That work spans Storybook infrastructure, app-level provider wiring,
and a large fixture set that can render real control-plane states
without a live backend.
> - The branch also expands coverage across agents, budgets, issues,
chat, dialogs, navigation, projects, and data visualization so future UI
changes have a concrete visual baseline.
> - This pull request packages that Storybook work on top of the latest
`master`, excludes the lockfile from the final diff per repo policy, and
fixes one fixture contract drift caught during verification.
> - The benefit is a single reviewable PR that adds broad UI
documentation and regression-surfacing coverage without losing the
existing branch work.
## What Changed
- Added Storybook 10 wiring for the UI package, including root scripts,
UI package scripts, Storybook config, preview wrappers, Tailwind
entrypoints, and setup docs.
- Added a large fixture-backed data source for Storybook so complex
board states can render without a live server.
- Added story suites covering foundations, status language,
control-plane surfaces, overview, UX labs, agent management, budget and
finance, forms and editors, issue management, navigation and layout,
chat and comments, data visualization, dialogs and modals, and
projects/goals/workspaces.
- Adjusted several UI components for Storybook parity so dialogs, menus,
keyboard shortcuts, budget markers, markdown editing, and related
surfaces render correctly in isolation.
- Rebasing work for PR assembly: replayed the branch onto current
`master`, removed `pnpm-lock.yaml` from the final PR diff, and aligned
the dashboard fixture with the current `DashboardSummary.runActivity`
API contract.
## Verification
- `pnpm --filter @paperclipai/ui typecheck`
- `pnpm --filter @paperclipai/ui build-storybook`
- Manual diff audit after rebase: verified the PR no longer includes
`pnpm-lock.yaml` and now cleanly targets current `master`.
- Before/after UI note: before this branch there was no dedicated
Storybook surface for these Paperclip views; after this branch the local
Storybook build includes the new overview and domain story suites in
`ui/storybook-static`.
## Risks
- Large static fixture files can drift from shared types as dashboard
and UI contracts evolve; this PR already needed one fixture correction
for `runActivity`.
- Storybook bundle output includes some large chunks, so future growth
may need chunking work if build performance becomes an issue.
- Several component tweaks were made for isolated rendering parity, so
reviewers should spot-check key board surfaces against the live app
behavior.
## Model Used
- OpenAI Codex, GPT-5-based coding agent in the Paperclip harness; exact
serving model ID is not exposed in-runtime to the agent.
- Tool-assisted workflow with terminal execution, git operations, local
typecheck/build verification, and GitHub CLI PR creation.
- Context window/reasoning mode not surfaced by the harness.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-20 12:13:23 -05:00
< / div >
< / div >
< / Section >
) ;
}
Show workspace changes and stale notices in issue threads (#5356)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies
> - The issue thread is the operator's durable audit trail for what
changed and why
> - Workspace changes and stale disposition notices need to be visible
in that same timeline without noisy or misleading rendering
> - The local branch already contained backend activity details,
timeline conversion, and UI rendering work for those events
> - This pull request isolates the issue-thread activity work into a
standalone branch against `origin/master`
> - The benefit is a focused audit-trail PR that can merge independently
of the sidebar/operator UI polish branch
## What Changed
- Adds readable workspace-change activity details to issue update
activity events.
- Surfaces workspace-change events in issue chat/timeline rendering.
- Makes the existing issue comment migration idempotent.
- Folds and renders stale disposition notices inline so they match
activity-log styling and spacing.
- Adds focused route, timeline, and issue-thread system notice coverage.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx` — 3 files
passed, 22 tests passed.
- Confirmed the PR changes 9 files and does not include `pnpm-lock.yaml`
or `.github/workflows/*`.
- `pnpm exec vitest run
server/src/__tests__/issue-closed-workspace-routes.test.ts` — 1 file
passed, 4 tests passed.
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx
server/src/services/recovery/successful-run-handoff.test.ts
packages/shared/src/validators/issue.test.ts` — 5 files passed, 54 tests
passed.
- `pnpm --filter @paperclipai/shared typecheck && pnpm --filter
@paperclipai/server typecheck && pnpm --filter @paperclipai/ui
typecheck`.
- `pnpm --filter @paperclipai/ui typecheck` after adding the Storybook
screenshot fixture.
- Captured Storybook screenshots for the new UI rendering paths:
- Collapsed stale notice + workspace-change row:
`docs/pr-screenshots/pr-5356/issue-thread-notices-collapsed.png`
- Expanded stale notice details:
`docs/pr-screenshots/pr-5356/issue-thread-notices-expanded.png`
### Screenshots
Collapsed stale notice with workspace-change row:

Expanded stale notice details:

## Risks
- Moderate risk: this touches issue activity serialization and
issue-thread rendering, both of which are central operator surfaces.
- Migration risk is low: the only migration change makes an existing
migration idempotent.
- No new migrations are introduced, so there is no cross-PR migration
ordering requirement.
> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.
## Model Used
- OpenAI Codex, GPT-5 coding agent, shell/tool-use enabled, used to
split the existing branch, verify the isolated PR branch, and create
this PR.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 09:00:54 -05:00
function IssueThreadNoticeReview() {
return (
< div className = "paperclip-story" >
< main className = "paperclip-story__inner max-w-4xl" >
< Section eyebrow = "IssueChatThread" title = "Workspace changes and stale disposition notices" >
< div className = "rounded-lg border border-border bg-background/70 p-4" >
< IssueChatThread
comments = { issueThreadNoticeReviewComments }
timelineEvents = { issueThreadNoticeReviewTimelineEvents }
linkedRuns = { [ ] }
liveRuns = { [ ] }
companyId = { companyId }
projectId = { projectId }
issueStatus = "done"
successfulRunHandoff = { {
state : "resolved" ,
required : false ,
sourceRunId : "run-notice-source" ,
correctiveRunId : "run-notice-corrective" ,
assigneeAgentId : codexAgent.id ,
detectedProgressSummary : "Captured screenshots for the issue thread notice states." ,
createdAt : new Date ( "2026-04-20T13:49:00.000Z" ) ,
} }
agentMap = { storybookAgentMap }
currentUserId = { currentUserId }
userLabelMap = { boardUserLabels }
onAdd = { async ( ) = > { } }
enableLiveTranscriptPolling = { false }
showJumpToLatest = { false }
/ >
< / div >
< / Section >
< / main >
< / div >
) ;
}
[codex] add comprehensive UI Storybook coverage (#4132)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies.
> - The board UI is the main operator surface, so its component and
workflow coverage needs to stay reviewable as the product grows.
> - This branch adds Storybook as a dedicated UI reference surface for
core Paperclip screens and interaction patterns.
> - That work spans Storybook infrastructure, app-level provider wiring,
and a large fixture set that can render real control-plane states
without a live backend.
> - The branch also expands coverage across agents, budgets, issues,
chat, dialogs, navigation, projects, and data visualization so future UI
changes have a concrete visual baseline.
> - This pull request packages that Storybook work on top of the latest
`master`, excludes the lockfile from the final diff per repo policy, and
fixes one fixture contract drift caught during verification.
> - The benefit is a single reviewable PR that adds broad UI
documentation and regression-surfacing coverage without losing the
existing branch work.
## What Changed
- Added Storybook 10 wiring for the UI package, including root scripts,
UI package scripts, Storybook config, preview wrappers, Tailwind
entrypoints, and setup docs.
- Added a large fixture-backed data source for Storybook so complex
board states can render without a live server.
- Added story suites covering foundations, status language,
control-plane surfaces, overview, UX labs, agent management, budget and
finance, forms and editors, issue management, navigation and layout,
chat and comments, data visualization, dialogs and modals, and
projects/goals/workspaces.
- Adjusted several UI components for Storybook parity so dialogs, menus,
keyboard shortcuts, budget markers, markdown editing, and related
surfaces render correctly in isolation.
- Rebasing work for PR assembly: replayed the branch onto current
`master`, removed `pnpm-lock.yaml` from the final PR diff, and aligned
the dashboard fixture with the current `DashboardSummary.runActivity`
API contract.
## Verification
- `pnpm --filter @paperclipai/ui typecheck`
- `pnpm --filter @paperclipai/ui build-storybook`
- Manual diff audit after rebase: verified the PR no longer includes
`pnpm-lock.yaml` and now cleanly targets current `master`.
- Before/after UI note: before this branch there was no dedicated
Storybook surface for these Paperclip views; after this branch the local
Storybook build includes the new overview and domain story suites in
`ui/storybook-static`.
## Risks
- Large static fixture files can drift from shared types as dashboard
and UI contracts evolve; this PR already needed one fixture correction
for `runActivity`.
- Storybook bundle output includes some large chunks, so future growth
may need chunking work if build performance becomes an issue.
- Several component tweaks were made for isolated rendering parity, so
reviewers should spot-check key board surfaces against the live app
behavior.
## Model Used
- OpenAI Codex, GPT-5-based coding agent in the Paperclip harness; exact
serving model ID is not exposed in-runtime to the agent.
- Tool-assisted workflow with terminal execution, git operations, local
typecheck/build verification, and GitHub CLI PR creation.
- Context window/reasoning mode not surfaced by the harness.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-20 12:13:23 -05:00
function ChatCommentsStories() {
return (
< div className = "paperclip-story" >
< main className = "paperclip-story__inner space-y-6" >
< section className = "paperclip-story__frame p-6" >
< div className = "paperclip-story__label" > Chat & Comments < / div >
< h1 className = "mt-2 text-3xl font-semibold tracking-tight" > Threaded work conversations < / h1 >
< p className = "mt-3 max-w-3xl text-sm leading-6 text-muted-foreground" >
Fixture - backed coverage for classic issue comments , embedded run chat , and the assistant - style issue chat
surface . The scenarios use Paperclip operational content with mixed authors , system timeline events ,
markdown , code blocks , @mentions , links , queued comments , tool calls , and streaming run output .
< / p >
< / section >
< CommentThreadMatrix / >
< RunChatMatrix / >
< IssueChatMatrix / >
< / main >
< / div >
) ;
}
const meta = {
title : "Product/Chat & Comments" ,
component : ChatCommentsStories ,
parameters : {
docs : {
description : {
component :
"Chat and comments stories exercise CommentThread, RunChatSurface, and IssueChatThread across empty, single, long, markdown, mention, timeline, queued, linked-run, and streaming transcript states." ,
} ,
} ,
} ,
} satisfies Meta < typeof ChatCommentsStories > ;
export default meta ;
type Story = StoryObj < typeof meta > ;
export const FullSurfaceMatrix : Story = { } ;
export const CommentThreads : Story = {
render : ( ) = > (
< div className = "paperclip-story" >
< main className = "paperclip-story__inner" >
< CommentThreadMatrix / >
< / main >
< / div >
) ,
} ;
export const LiveRunChat : Story = {
render : ( ) = > (
< div className = "paperclip-story" >
< main className = "paperclip-story__inner" >
< RunChatMatrix / >
< / main >
< / div >
) ,
} ;
export const IssueChatWithTimeline : Story = {
render : ( ) = > (
< div className = "paperclip-story" >
< main className = "paperclip-story__inner" >
< IssueChatMatrix / >
< / main >
< / div >
) ,
} ;
Show workspace changes and stale notices in issue threads (#5356)
## Thinking Path
> - Paperclip orchestrates AI agents for zero-human companies
> - The issue thread is the operator's durable audit trail for what
changed and why
> - Workspace changes and stale disposition notices need to be visible
in that same timeline without noisy or misleading rendering
> - The local branch already contained backend activity details,
timeline conversion, and UI rendering work for those events
> - This pull request isolates the issue-thread activity work into a
standalone branch against `origin/master`
> - The benefit is a focused audit-trail PR that can merge independently
of the sidebar/operator UI polish branch
## What Changed
- Adds readable workspace-change activity details to issue update
activity events.
- Surfaces workspace-change events in issue chat/timeline rendering.
- Makes the existing issue comment migration idempotent.
- Folds and renders stale disposition notices inline so they match
activity-log styling and spacing.
- Adds focused route, timeline, and issue-thread system notice coverage.
## Verification
- `pnpm install --frozen-lockfile`
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx` — 3 files
passed, 22 tests passed.
- Confirmed the PR changes 9 files and does not include `pnpm-lock.yaml`
or `.github/workflows/*`.
- `pnpm exec vitest run
server/src/__tests__/issue-closed-workspace-routes.test.ts` — 1 file
passed, 4 tests passed.
- `pnpm exec vitest run
server/src/__tests__/issue-activity-events-routes.test.ts
ui/src/lib/issue-timeline-events.test.ts
ui/src/components/IssueChatThreadSystemNotice.test.tsx
server/src/services/recovery/successful-run-handoff.test.ts
packages/shared/src/validators/issue.test.ts` — 5 files passed, 54 tests
passed.
- `pnpm --filter @paperclipai/shared typecheck && pnpm --filter
@paperclipai/server typecheck && pnpm --filter @paperclipai/ui
typecheck`.
- `pnpm --filter @paperclipai/ui typecheck` after adding the Storybook
screenshot fixture.
- Captured Storybook screenshots for the new UI rendering paths:
- Collapsed stale notice + workspace-change row:
`docs/pr-screenshots/pr-5356/issue-thread-notices-collapsed.png`
- Expanded stale notice details:
`docs/pr-screenshots/pr-5356/issue-thread-notices-expanded.png`
### Screenshots
Collapsed stale notice with workspace-change row:

Expanded stale notice details:

## Risks
- Moderate risk: this touches issue activity serialization and
issue-thread rendering, both of which are central operator surfaces.
- Migration risk is low: the only migration change makes an existing
migration idempotent.
- No new migrations are introduced, so there is no cross-PR migration
ordering requirement.
> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.
## Model Used
- OpenAI Codex, GPT-5 coding agent, shell/tool-use enabled, used to
split the existing branch, verify the isolated PR branch, and create
this PR.
## Checklist
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 09:00:54 -05:00
export const IssueThreadNotices : Story = {
render : ( ) = > < IssueThreadNoticeReview / > ,
} ;