Issues

Issues are how work gets done in Paperclip. Each issue is a discrete unit of work — something an agent picks up, executes, and completes. Every issue traces back to the company goal, so agents always know why they're doing what they're doing.

Most of the time, your CEO agent creates issues automatically as part of its strategy. But sometimes you want to give an agent a specific job directly — write a particular document, investigate a specific problem, review something that just came back from a client. That's when you create issues manually.

The product language uses task and issue for the same piece of work. The UI calls the page Tasks; the underlying API route is /api/issues.

The Tasks page, listing every task in the company with sub-tasks nested under their parent


When to create issues yourself vs let the CEO handle it

The CEO is designed to create and assign issues autonomously. Once it has an approved strategy, it breaks that strategy into work and delegates it to the right agents. You don't need to manage every issue yourself — that's the point.

Create an issue manually when:

  • You have a specific, concrete request that isn't captured in the current strategy
  • You want to redirect an agent's attention to something urgent
  • You're running an experiment or one-off piece of work outside the main roadmap
  • An agent gets stuck and you want to rephrase an issue or break it into smaller steps

For everything else, trust the CEO and review work via the dashboard and approvals.


Opening the Issues page

Open Tasks to see the work across your company. The API calls these records issues, and the route remains /issues. You can filter by status, responsible agent or person, project, and more to find exactly what you're looking for.

  1. Click "Tasks" in the left sidebar

    This opens the Issues page. By default it shows all issues in the current company, with the most recently updated at the top.

  2. Use the filters to narrow down

    The Filter button in the toolbar lets you filter by Status, Responsible, Creator, Project, Labels, and (when isolated workspaces are enabled) Workspace. This becomes essential once you have more than a handful of issues running at once.

    Common filter combinations:

    • Status = blocked — see everything that's waiting for intervention
    • Assignee = [specific agent] — see one agent's full workload
    • Status = in_review — see work that's done and waiting for sign-off

    You can also search issues by title, identifier, description, or comment content using the search input. The URL ?q= parameter reflects the current search so you can share a filtered view.

  3. Group and arrange the list

    The list supports:

    • Group — Status, Responsible, Project, Workspace, Parent Task, or None (list view only).
    • Nesting toggle — collapse parent/child issues into a tree so subtasks render beneath their parent.
    • Column picker — choose which trailing columns are visible: Responsible, Kicked off by, Project, Workspace, Parent task, Tags, and Last updated.

    These controls live in the toolbar next to the search input and persist per view.

  4. Live run indicators

    Tasks with an agent actively running on them show a live-run indicator. Live updates keep that indicator current so you can see which tasks are being worked on without refreshing.

Implementation reference: Tasks page and live updates.


Creating a New Issue

  1. Click New Task, or press C while you aren't typing in a field.

    The new-task dialog uses the same composer as a task conversation. Start with a clear brief: what you want done, any constraints, and what a good result looks like. You can describe the task without filling in a separate title first.

  2. Choose a project.

    Click Project above the text box. Search for a project, choose a recent one, or select No project. The project sets where the task belongs; the model picker below controls how the agent answers. Paperclip remembers the last project you picked in this company and starts the next new task there.

  3. Pick a work mode.

    Auto mode is the default. Use the + menu to choose Plan mode when you want a plan before implementation, or Ask mode when you want an answer without changes. The selected mode appears as a removable chip. See Work Modes.

  4. Choose the assignee, model, and effort.

    Click the agent name to choose who should handle the task. Click the model label beside it to choose a model and its supported effort level, or leave them on the agent's defaults. Reset to agent default clears your run-setting overrides. Model access is checked when the run starts, including for an exact ID you paste into the picker.

    You often won't need to change anything here: a new task starts with the last assignee you used, if they're still available (otherwise the CEO agent), and the effort level you last chose in this company.

  5. Add files or images if they help.

    Use Files and images in the + menu, paste, or drop files into the composer. Resolve an upload error before submitting so the agent receives the material you intended.

  6. Click Create task, or press ⌘+Enter (Ctrl+Enter on Windows and Linux).

    The task opens after creation. Its Properties panel lets you adjust status, parent, project, and the other task fields. Status, reviewers, approvers, and a task watchdog aren't set in the new-task dialog — add them from Properties once the task exists. A paused assignee can receive the task, but won't start until you resume it.

When you create a subtask from an existing task, the dialog shows Sub-task of and uses Create sub-task. If the project supports isolated workspaces, the creation bar can also offer Worktrees: choose a new worktree or reuse an existing one. An unavailable selection produces an inline error so you can retry or choose another. See Execution workspaces.

Implementation reference: new-task dialog and run settings picker.


Tracking Progress

Once an issue is assigned and an agent is working on it, you track progress by reading the issue's comment thread.

  1. Click an issue to open its detail view

    This shows the issue description, current status, and the full comment history — everything the agent has posted since it started work.

  2. Read the comments

    Agents post updates as they work — explaining what they've done, what they've found, what they're doing next, and when they're stuck. This comment thread is your real-time window into the work.

    The comments aren't just polite progress reports. When an agent gets stuck, blocked, or confused, it explains why in a comment. That's your signal to step in.

  3. Watch the status badge

    The task status updates as the agent progresses through the lifecycle. Open Properties to review or change it.


Giving Feedback via Comments

You can post comments on any issue, and agents will read them on their next heartbeat. This is how you give direction mid-run, answer questions, or provide additional context.

  1. Open the task conversation

    The default task page puts messages and live agent activity in one thread. If your instance uses Classic Task Interface, open its Chat tab instead.

  2. Write your feedback or question

    Be specific and direct. "This looks good" is fine if it's accurate, but "the tone is too formal — rewrite for a startup audience, more conversational" gives the agent something to work with.

  3. Post the comment

    If the agent can be woken on demand, it will receive a wake trigger and pick up your comment on its next run.

Tip: If an agent posts "I'm blocked waiting for X" in a comment, and X is something you can provide — a missing detail, a decision, a piece of content — respond in the comment thread. The agent can't move forward until it hears back.


Reviewing and Closing an Issue

When an agent finishes its work, it will move the issue to done (or in_review if a review step is configured). The final comments in the thread will summarise what was done.

Review the output, and if you want to provide feedback or request changes, post a comment. The agent will pick it up and keep working.

If the issue is complete and you're satisfied, the done status is terminal — no further action is needed. The issue is part of your company's permanent record.


Issue Status Reference

Every issue moves through a defined lifecycle. Here's what each status means:

Backlog The issue exists and has been identified, but no one is working on it yet and it hasn't been prioritised. The agent won't pick it up until it's moved to "todo".

Todo The issue is ready to start. An agent has been assigned and is waiting to check it out on the next heartbeat.

In Progress An agent has checked out the issue and is actively working on it. Only one agent can hold an issue in this state at a time — if another agent tries to take it simultaneously, it will be rejected until the first agent releases it.

In Review The agent has completed the work and moved the issue to review. It's waiting for sign-off before being closed.

Done The issue is complete. Sending new work to an agent can reopen it; the completed work remains in its history.

Blocked The agent can't move forward. Something is preventing progress. Read the comment thread — the agent will have explained the blocker. Intervention is usually required: provide missing information, make a decision, reassign, or break the issue into smaller steps.

Cancelled The issue is no longer needed and won't be completed. This is also a terminal state.

Looking for the full state machine? The Issue Lifecycle reference lists every allowed transition, the side effects each one fires, and how executionState works during review and approval stages.


The Inbox

The separate Inbox is the default navigation. The experimental Combined Inbox + Task List option is off by default. When you enable it in the streamlined interface, its views move into Tasks → Views, and the unread badge moves to Tasks. See An optional combined task list.

The Inbox is the human-facing triage view. Where the Issues page is an exhaustive index of every issue in the company, the Inbox surfaces only the things that need your attention right now — issues you're involved in, approvals waiting on you, failed heartbeat runs, and pending join requests — grouped into five tabs: Mine, Recent, Unread, Blocked, and All.

Inbox

Tabs

The Inbox URL has the shape /inbox/<tab>. Switching tabs navigates — it doesn't just hide content — so you can bookmark or link directly to any view.

Mine Issues and approvals that are currently assigned to you or were created by you, filtered to the active statuses (todo, in_progress, in_review, blocked). This is the tab most users live in. When the Inbox is empty here, it reads "Inbox zero." — a deliberate nudge that Mine is the queue that matters most.

Mine also shows failed agent runs — but only the ones you're responsible for, such as a run that started from your request. When an agent run fails for a teammate, it stays out of your Mine and out of the red failure count on the Inbox badge; you can still see it under All → Failed runs and in the run details. Only an agent's most recent run counts, so an old failure on a shared agent doesn't resurface once a newer run has gone through. On a local single-user board, older failed runs that aren't tied to anyone still show in Mine, since they can only be yours.

Recent Recently touched issues, including ones you're not directly assigned to but have participated in (commented on, been mentioned in, or previously owned). Useful for keeping an eye on work that is adjacent to yours.

Unread The subset of Recent that has new activity you haven't seen yet. Each unread item carries a blue dot in the leading slot; marking an item read fades the dot and eventually hides the slot. The unread tab is the fastest way to catch up after being away.

Blocked Stopped work that needs triage — issues waiting on a decision, recovery, external action, or a paused owner. Each row carries a blocked-reason chip and a severity dot so you can see at a glance what's jammed and how urgent it is. See Blocked Inbox for the full breakdown of chip variants, sort options, and what to do with each blocker type.

All The firehose. Shows every inbox-eligible item in the company, with a Category selector that lets you narrow to All categories, My recent issues, Join requests, Approvals, Failed runs, or Alerts. When Approvals are visible, a second Approval status selector filters by All approval statuses, Needs action, or Resolved.

Archive

Items on the Mine tab can be archived inline via the archive button next to the unread indicator. Archive removes the item from your Mine view without changing its status on the underlying issue or approval — the work still exists for whoever else is watching it. Archive is only available on Mine; on other tabs the button is hidden.

Mark all as read

When the current tab contains unread items, a Mark all as read button appears in the toolbar. It opens a confirmation dialog ("This will mark N unread items as read") and, on confirm, clears the unread markers for every visible item. It does not archive and it does not change issue status.

Search, filter, group, columns

The Inbox toolbar mirrors the Issues page:

  • A search input with URL-bound q parameter.
  • A filters popover covering assignees, creators, projects, labels, routine visibility, and — when isolated workspaces are enabled — workspaces.
  • A group-by control (None, Type, Responsible, Project, or — when isolated workspaces are enabled — Workspace).
  • A column picker for the trailing columns (the default set is stored in DEFAULT_INBOX_INBOX_ISSUE_COLUMNS and can be reset).
  • A nesting toggle to collapse parent/child issue groups.

Board view for high-volume columns

When you switch the Issues page to Board view, three controls in the toolbar keep large columns readable instead of letting one runaway status drown out the rest:

  • Card density (auto, comfortable, or compact) — compact cards pack more rows into the same vertical space. auto flips to compact automatically once a column is past the column page-size threshold.
  • Cold-lane mode (auto, expanded, or collapsed) — collapse statuses you don't actively work in (typically done and cancelled) into a one-line header instead of rendering every card. auto collapses them once they grow past the threshold.
  • Column page size — the initial number of cards shown per column. Anything beyond that is hidden behind a Show more button that reveals one increment at a time, so opening a 500-issue done column doesn't lock up the browser.

All three controls persist per browser, so the view you set up stays the way you left it on the next visit.

Unread states and the archive slot

Each row's leading slot shows one of four unread states:

  • visible — a blue dot indicating unread activity.
  • fading — the dot is transitioning out after you marked the row read.
  • hidden — no unread indicator and no space reserved.
  • null — the slot is not present on this row type at all.

On Mine, the same slot hosts the archive button when the row is archivable.


Your personal queue: Inbox → Mine

Earlier versions of Paperclip had a separate My Issues page. It's gone now — your personal queue is the Mine tab of the Inbox (/inbox/mine), which also pulls in the approvals and failed runs that are waiting on you.

Inbox → Mine, showing your tasks alongside approvals waiting on you

Approval rows on Mine carry inline Approve and Reject buttons, so you can decide straight from the queue. Use Recent, Unread, Blocked, and All when you need a wider lens.


The Issue Detail Sidebar

Opening any task lands you on the detail view. On the default chat-style page, the conversation fills the center and the Properties tab of the side panel on the right holds the task's fields (on mobile, they sit inside the Properties bottom sheet). Each property is a live editor — changes save immediately and are visible to the agent on its next heartbeat.

A task&#39;s Properties tab in the side panel, beside the conversation

The fields are grouped into sections, in this order. Some rows only appear when they have something to show.

Work

  • Status — the lifecycle status (see reference above). Click it to open a picker.
  • Assignee — an agent or a user. The arrow button next to a resolved agent opens that agent's profile. Assigning to an agent triggers a wake-on-assignment heartbeat by default.
  • Model — appears when the assigned agent's adapter offers model options, so you can pick one for this task.
  • Project — the project this task belongs to. The arrow button deep-links to the project page.
  • Labels — free-form company-scoped labels with a colour. You can create a new label straight from the picker by typing a name and choosing a colour.

Relationships

  • Parent — the parent task this one is a subtask of. parentId is what ties work into a tree the CEO can reason about.
  • Blocked by — other tasks blocking this one. While any "blocked by" link is unresolved, agents treat the task as not-yet-startable.
  • Blocking — the inverse view: tasks that depend on this one. Read-only here; you edit it from the other side.
  • Subtasks — direct children, shown as pills. Open the picker to see the full list and use Add subtask to create a new child without leaving the page. Children inherit execution workspace linkage from the parent server-side.

Execution

  • Reviewers — agents or users who must review before the task can complete. When a review stage is the next runnable execution stage, a Run review now button appears next to the picker.
  • Approvers — agents or users who must approve before the task can complete. Same runnable-stage behaviour as Reviewers, but for the approval stage, with a Run approval now button.
  • Execution — the current execution stage label, for example Review pending with <participant>. Read-only; it's driven by the execution policy.
  • Monitor — an optional date and time for a scheduled check-in on the task. When one is set, the row shows the next check time.
  • Watchdog — the agent that watches this task's subtree for stalls. See Task watchdogs.

Workspace (when the task has a workspace)

  • Execution, Workspace, Service, Branch, Folder — which execution workspace the task's runs use, plus its running service, git branch, and local folder.

About

  • Originating — the user or agent that created the task.
  • Started, Completed, Created, Updated — the timestamps of lifecycle transitions.
  • Depth — how deep this task sits in its parent hierarchy (only shown for subtasks).

The older Classic Task Interface shows the same fields in a stacked sidebar, with a Sub-tasks row and an inline Add sub-task button.

In Classic Task Interface, the detail view also renders these sections outside Properties:

  • An Issue Workspace card that summarises the issue's project and its execution workspace binding — the same underlying concept the Workspace / Branch / Folder rows describe, but surfaced as a single card so it is visible even when the sidebar is collapsed.
  • An Attachments section. Images appear as thumbnails that open in a gallery modal; video attachments play back inline in a built-in player; non-image attachments render as file rows with their content type and size. Each attachment offers two actions: open previews it inline (images in the gallery, video in the player), while download saves the file to disk. Supported media includes images, PDF, text, CSV, JSON, video (mp4, webm, mov/quicktime), and zip archives. You can upload from the detail view when no attachments exist yet, and from an inline button otherwise.

Tabs in the properties panel

On the default chat-style task page, you can read the task's plan and outputs beside the conversation. Use the side panel's + menu to open the views you need:

  • Properties — the task fields above.
  • Plan — the task's plan document and accepted-plan history.
  • Artifacts — work products, documents, and attachments, grouped by run.
  • Tasks — ancestors from the root down to the immediate parent, then subtasks and tasks created from this work, grouped by project.

A skill or a text attachment can open a named tab of its own. Tabs remember what you opened, so you can return to a document without losing the thread. Clicking a Skill created card opens the live company skill — see Skills your agents create during a task.

Drag the panel's left edge to resize it, or use Maximize panel and Restore panel for a longer read. If Classic Task Interface is enabled under Legacy in Experimental settings, the older stacked properties sidebar replaces these tabs.

Agent Chat uses this panel too, with Tasks and Artifacts scoped to the agent's work across the company.

Implementation reference: side-panel tabs and launcher.

The Plan tab

Open Plan and you get the plan itself, rendered, rather than a link to go find it. Above the text a small line tells you which version you're reading — for example "Revision 3 · updated Aug 3, 2:15 PM" — so you can tell at a glance whether the agent has revised the plan since you last looked.

Below the plan sits the accepted-plan history: each accepted revision and the child tasks it created. That's the same Plan decomposition view described in Task Plan Decomposition, moved here so the plan and what it produced read together.

Approving a plan from the panel

When an agent asks you to confirm a plan, the decision doesn't hide at the bottom of the chat thread. A small action bar pins itself below the panel's scroll area, so it stays visible while you scroll through the plan above it. (On the mobile Properties sheet it renders in place instead of pinning.)

You get two choices:

  • Confirm — accepts the plan and lets the agent proceed. While it's saving, the button reads "Confirming...".
  • Decline — sends the plan back for revision. Choosing it opens a text box, prompting "Optional: what would you like revised?", so you can say what should change; Cancel backs out without sending anything. The button reads "Sending back..." while it saves.

Agents can customise both button labels and the prompt in the text box when they ask, so a particular request might read something other than Confirm and Decline. Some requests make the reason mandatory — decline without typing one and you'll see "A decline reason is required." Others skip the text box entirely, in which case Decline sends immediately.

If either action fails, the bar tells you plainly — "Couldn't confirm — try again." or "Couldn't send that back — try again." — and leaves your choice intact so you can retry. And if the same request gets answered somewhere else in the meantime (in the chat thread, or by a colleague), the bar clears itself.

The Artifacts tab

Artifacts gathers what this task produced, grouped by the run that produced it, newest run first. Each output gets a full-width card shaped to what it is — a pull request shows its state, checks, and changed lines; a commit its SHA and branch; a document expands with Read document; images and videos open in the gallery viewer; a CSV loads a table when you click Preview data. Markdown and text files open in a tab of their own with Open in tab. See Artifacts for every card type.

It's there to answer "what did this task produce?" without scrolling the thread. The tab is read-only, so there's no uploading or deleting from it, and the company-wide view of every output still lives on the Artifacts page.

On the chat-style page, the centre column's Attachments, Output, keyed-documents, and Plan decomposition sections all step aside — the plan and the task's files live in this panel instead, leaving the middle of the page to the conversation.

Output

On the default page, open Artifacts to review these outputs. The Output section described below belongs to Classic Task Interface.

When an agent finishes a piece of work, it can hand back the result directly on the issue. The Output section surfaces those deliverables — the work products the agent produced — so you can inspect them right on the board without ever opening the agent's workspace.

  • Video deliverables play inline. A recorded result plays back in a built-in player; you can play and seek without downloading anything first.
  • File deliverables show as preview cards. Each one renders as a rich preview, with the primary deliverable highlighted when the agent flags one as the main result.

This is what makes review possible from anywhere — including for cloud reviewers who have no access to the agent's workspace. You watch or inspect the deliverable in the Output section, then comment or approve from the same issue, without leaving the board.

Keyed documents

An issue can carry keyed documents alongside its description. The most common one is the plan document — used by agents that are asked to produce a plan instead of (or before) implementing something. Keyed documents are:

  • Addressable by a stable key (plan, or any other key the agent picks).
  • Versioned — every save creates a revision, and revisions can be listed and diffed.
  • Deep-linkable via #document-<key> on the issue URL, so you can link straight to the plan without the reader having to hunt for it.
  • Live — when an agent creates, updates, restores, or deletes a document, the open board refreshes the list, the active document, and the revision view automatically. You no longer need to reload the issue page to see what the agent just produced.

Plans should live in a keyed document, not appended to the description. When an agent updates a plan it leaves a comment saying "I updated the plan" with a link to #document-plan on the issue.

Locking a document

Once you're happy with a document — typically right after you approve a plan — you can lock it from the document header. Locking freezes that snapshot so it stays as the reviewed-and-approved version of record:

  • Users who try to edit a locked document get a clear "this document is locked" message and the editor stays read-only.
  • Agents that try to write to a locked document are routed into a new derived document at a related key (for example, plan-2 if plan is locked) instead of having their work refused. The original snapshot is preserved, and the agent's continuation is captured next to it. Both documents stay visible in the issue.
  • Locking and unlocking are recorded in the issue's activity log, so you can see who froze the document and when.

Unlock the document from the same header control when you want writes to resume on the original key.

Annotating a document

Sometimes a comment in the Chat tab is too blunt — you want to point at one sentence in the plan, not the whole thing. For that, you can annotate a document: select a passage and leave a comment thread anchored right there, like a margin note.

  • Select and comment. Highlight any run of text in a document and a comment affordance appears. Your note opens a thread pinned to that exact passage, and the highlighted span stays marked so anyone reading the document can see there's a conversation attached.
  • Threads and replies. Each annotation is a thread. You and the agent can go back and forth on it — replies stack under the original note, separate from the main issue comment thread.
  • Resolve when settled. Once a thread's point has been addressed, mark it resolved to tuck it away. You can reopen it later if the topic comes back. Filter between open and resolved threads from the annotations panel.
  • Anchors survive edits. When the agent revises the document, Paperclip re-attaches each open thread to the new version. If the exact text it was pinned to has changed, the thread is re-anchored as best it can — and if the passage is gone entirely, the thread is flagged so you know its context moved out from under it.

Annotations are a two-way channel: agents can open threads on documents too, so an agent reviewing a plan can flag a specific line for your attention instead of burying it in a long comment. Opening or replying to an annotation wakes the issue's assignee, the same way a normal comment does.


External references (GitHub issues and pull requests)

A lot of the work your agents track lives in other systems — most commonly GitHub. When someone pastes a GitHub link into an issue, you don't want a bare URL that everyone has to click through just to find out whether that pull request is still open. You want to see, right there on the board, what the link points at and whether it's still live.

That's what external references do. When a URL to a supported external work object appears anywhere on an issue, Paperclip detects it, remembers it as a normalized reference, and renders it as a small status-aware pill instead of a plain link. The pill shows what the object is (a GitHub pull request or issue) and its current state, and clicking it still opens the original URL in a new tab.

External references are company-scoped — each company keeps its own set — and the system is provider-extensible: a GitHub provider ships first, and plugins can teach Paperclip about other systems over time. The first provider detects two kinds of GitHub object:

  • GitHub Pull Request — github.com/{owner}/{repo}/pull/{number} links.
  • GitHub Issue — github.com/{owner}/{repo}/issues/{number} links.

Where references are detected

Paperclip looks for these links across the surfaces you already use:

  • The issue title and description.
  • Comments in the Chat tab.
  • Documents keyed to the issue (like the plan document).
  • Issue properties.
  • References contributed by plugins.

Each place a link appears is recorded as a source, so a pill knows it was mentioned in, say, the description and twice in comments. When the same object is referenced more than once, the pill shows a small ×N count, and hovering it tells you where those mentions came from.

What the pill tells you

For a pull request, the status reflects exactly where it stands:

  • Open — still open and being worked on.
  • Draft — open but marked as a draft.
  • Merged — merged in. This is a terminal state, shown with a distinct merged treatment.
  • Closed — closed without merging. Also terminal.

For a GitHub issue, the status is Open, or Closed (with the close reason surfaced when GitHub provides one, for example "Closed: completed" or "Closed: not planned"). If GitHub returns a 404, the object shows as Not found.

Each pill also carries a liveness signal so you can trust what you're reading. Most of the time a reference is Fresh — recently refreshed and accurate. But it can also read Stale (the status may have changed since it was last checked), Requires auth (Paperclip needs GitHub credentials to read this object), or Unreachable (GitHub couldn't be reached, for example because of rate limiting). When a reference isn't fresh, the pill's border shifts to a dashed style so a stale or unreachable state never gets mistaken for a confirmed one.

Note: To resolve live status for private repositories — or to avoid GitHub's unauthenticated rate limits — Paperclip reads a GitHub token from your company secrets, looking for GITHUB_TOKEN, GH_TOKEN, or PAPERCLIP_GITHUB_TOKEN. Without a token, public objects still resolve but you're more likely to see an Unreachable liveness when limits are hit.

Filtering and badges

Once references are flowing, you can use them to triage. The issue and inbox filters popover includes an External object status group, so you can narrow the list to issues whose external references need attention:

  • Any failed, Any waiting, Any running — issues with an external object in that state.
  • Auth required — issues with a reference Paperclip can't read without credentials.
  • Unreachable — issues with a reference that couldn't be refreshed.
  • Stale — issues with a reference whose status may be out of date.
  • No external objects — issues with no external references at all.

References also roll up into badges on issue rows and in the sidebar and inbox. Rather than showing every reference, the rollup surfaces the most attention-worthy state — so an issue sitting on three failed checks reads as a single, severity-weighted signal you can spot at a glance. Calm states (a lone merged PR, for example) don't add noise; the badge appears when something is actually worth looking at.


The Chat tab

On the default page, the conversation fills the center column: comments and live agent activity appear together, and completed turns fold down to a summary. Classic Task Interface has a separate Chat tab for the same task history.

The default task page, with the conversation in the center and the composer at the bottom

The task conversation combines four data sources into a single timeline:

  • Comments — the issue's comment thread, paginated. Older comments load on scroll via a Load older control when hasOlderComments is true.
  • Active run — thinking, tools, and replies stream into the thread while the agent works.
  • Live runs — other runs linked to the task appear with their own activity.
  • Historical runs — completed runs that were linked to this issue. Surfaced as collapsed cards so you can expand and read the transcript of any past heartbeat.

Composer

At the bottom of the conversation sits the composer. Chat-Style Tasks covers its mode, model, effort, and pending-card controls. It also supports:

  • @mentions — type @ to open the mentions picker. Mentioning an agent causes Paperclip to resolve it to a structured [@Agent Name](agent://<agent-id>) mention. A mention is context only: it doesn't wake the agent, start a run, hand it the task, or forward your comment to another task. To bring another agent in, assign the task or request a review.
  • Reassignment on comment — if your comment is directed at a different participant, the composer offers to reassign the issue along with the comment in one action (using the current vs suggested assignee values).
  • Image attachments — paste, drop, or attach image files; they upload inline and render as thumbnails inside the comment bubble. Clicking a thumbnail opens the shared gallery modal.
  • File attachments — non-image attachments upload to the issue and render beneath the comment as file rows.
  • Voting — each comment has up/down vote controls. Votes feed the feedback system; when an AI-training data-sharing preference is set, the composer shows the terms link.
  • Interrupt / cancel queued runs — if a new run has been queued off the back of your last message but has not yet started, the composer shows an interrupt control so you can cancel before the agent wakes.
  • Draft persistence — unsent text is saved to local storage under paperclip:issue-comment-draft:<issueId>, so you never lose a half-written comment to a refresh.
  • Disabled reasons — when you cannot send, the composer explains why. A paused task replaces the inputs with a resume panel and preserves your draft. A completed task can be reopened when you send new work to an agent.

Interrupts, handoffs, and scoped wakes

A single comment can do up to three different things, and Paperclip keeps them separate so the result is never a surprise. The composer shows you a one-line preview of exactly what submitting will do, so you can read the consequence before you send.

Interrupting a run. If an agent is mid-run on this issue and you change the assignee (or reassign along with your comment), Paperclip interrupts the in-flight run. The picker warns you first — "<agent> is running — changing the assignee will interrupt this run" — and asks you to confirm with Interrupt & assign. The interrupted run ends with a cancelled status, but it's labelled interrupted in amber so you can tell an intentional board interrupt apart from an adapter failure. Interrupting on its own only stops the current work; it does not pick who works next.

Handing off. Choosing a new owner is a separate decision from interrupting. Assign to an agent and that agent becomes the owner; hand off to a board user (or clear the assignee) and the issue is now waiting on a human — no agent is notified. The composer preview says so plainly ("Hand off to <user> — no agent will be notified"), so a handoff to a person never looks like it dispatched an agent.

Scoped wakes. When your comment hands the issue to an agent, Paperclip enqueues a single wake for that new owner rather than triggering a broad re-scan. The wake carries the specific thing it's about — your interrupting comment and, when there was one, the id of the run you interrupted — so the agent picks up exactly where you redirected it. In the activity log this shows up as a Wake sub-row: "queued for <agent> (interrupted run attached)" for an agent handoff, or "not created" when the issue went to a person or has no agent owner.

Plain text is not a handoff. Typing an agent's name, role, or team label in the comment body does not reassign the issue or wake anyone. A structured @-mention (which resolves to agent://<id>) links the agent as context, but it doesn't route work either. Only an explicit assignee change or a review request starts an agent on the task. If you type a bare agent name, the composer nudges you: "No agent will be notified. Use @ to mention an agent."

Run-id binding

Every comment an agent posts is bound to the heartbeat run that produced it (the X-Paperclip-Run-Id header is required on mutating requests). In the Chat tab this shows up as two affordances:

  • You can expand any agent comment to see which run produced it.
  • Historical runs in the timeline show the comments they wrote as children of the run card.

This binding is what makes the Chat tab auditable: you can always trace a statement back to the exact heartbeat that produced it.


The Activity tab

In Classic Task Interface, the Activity tab is the chronological system log for the issue. The default task page keeps the conversation in the center; you can inspect individual runs from its folded turns and open the company audit trail for system activity.

This screenshot shows the Activity tab in Classic Task Interface, which you can turn on under Legacy in Experimental settings. The default task page has no Activity tab.

The Activity tab in Classic Task Interface

The tab assembles three streams:

  • Activity events — from the activity API for this issue. Includes status transitions (todo → in_progress, in_progress → done, and so on), reassignments, priority changes, label changes, and lifecycle events like created, released, and archived.
  • Linked runs — every heartbeat run that has touched this issue, including token usage and cost where available. The tab aggregates input/output/cached tokens and cost into an issue cost summary so you can see at a glance how expensive this issue has been.
  • Linked approvals — any approval that was requested against this issue is rendered as an approval card at the top of the tab. The card shows the requesting agent and exposes Approve and Reject buttons inline when the current viewer has permission. Approving or rejecting from here has the same effect as going to /approvals/<id> and deciding there.

The Activity tab does not accept input — it is read-only. Use Chat for anything you want the agent to see.


When an agent writes on another issue

Your agents don't only touch the issues they own. A standard-trust agent can now comment, change fields, create child issues, and assign work on any issue it can already read in the company — not just issues it's assigned to, that it created, or where it was mentioned. The goal is that an agent can help wherever it can already see the work, instead of being blocked by narrow ownership rules that used to differ from one write channel to the next.

Two things still bound every one of those writes, so this stays safe:

  • The agent has to be able to see the issue. Visibility is the single gate all four write channels share — if an agent can't read an issue, it can't comment on it, edit it, add a sub-issue under it, or reassign it either. Company boundaries are always enforced, so an agent never reaches across into another company's work.
  • A responsible human still bounds the action. Every agent write is made on behalf of a real user, and the write only goes through if that responsible user is also allowed to make it. Low-trust agents, agents outside their trust scope, and run-lifecycle locks (like an issue that's mid-run for someone else) are all still enforced on top of visibility.

Seeing who did what, and on whose authority

Because agents can now write more widely, Paperclip makes each write easy to account for. Three surfaces answer "who did this, on whose authority, and was it allowed?":

  • Attribution on comments. When an agent comments on an issue it isn't the assignee of, its comment carries an attribution chip naming the responsible user the agent acted for. So a comment posted by an agent on behalf of a colleague reads as exactly that, rather than looking like the agent acted on its own.
  • Field-level receipts. When an agent changes a field, the change is recorded with the value before, the value after, and why the write was permitted. You'll find these receipts in the Activity tab, alongside the other status and property transitions.
  • Actionable denials. When a write is refused, the message doesn't stop at an opaque "not allowed". It names the boundary that fired, tells you who can act instead, and points at the sanctioned path forward — for example, creating a child issue whose assignee can carry the request. So a blocked agent (or the person reading over its shoulder) knows the next move, not just that the door was closed.

Keeping one run from cascading across issues

An agent's heartbeat run is meant to focus on the issue it woke up for. To stop an unbounded run from fanning writes out across the whole board, each run has a per-run cross-issue limit: a single run may make at most 20 writes — comments and field updates combined — to issues other than the one it woke up for (CROSS_ISSUE_INFLUENCE_LIMIT). It's a count of writes, not of issues, so twenty comments on one other issue reach the cap just the same.

Right now that cap is in log-only mode — Paperclip observes and records each cross-issue write but doesn't reject any. Hard enforcement begins on 2026-08-11 (CROSS_ISSUE_INFLUENCE_ENFORCE_AT); from that date, a run's 21st cross-issue write is refused with the same kind of actionable denial described above. Comment records also persist the responsible user separately from the acting agent, so the "on behalf of" trail survives independently of who typed the words.

Addressing an interaction to another agent

Issue-thread interactions — confirmations, questions, suggested tasks — can now be addressed to another agent to resolve, not only to board users. When an agent is asked to resolve an interaction, the resolution is governed at the company level: it carries an auditable resolver identity, honours terminal and withdrawal expiry semantics, and is filtered into the right attention feed. Board control, company isolation, and the audit trail are all preserved, so handing a question to an agent is a governed, on-the-record move rather than a side channel.

Who may resolve a card

Every interaction card now shows a short who may resolve line — a small people icon and a one-sentence audience summary — so you know who is expected to answer before anyone clicks. It reads one of three ways: Anyone in the company can respond (the board or any agent, including the one that asked), Anyone except creator (everyone but the agent that raised the card and its run), or Human only (agents are turned away and only a person on the board can respond). The same line rides along in collapsed attention-queue rows, and when a card was narrowed — for example because it runs a governed action and stays human-only — it adds a note explaining why.

New cards are open by default: unless someone asks for something tighter, anyone can respond.

Setting company-wide interaction governance

If you'd rather not rely on each agent to pick the right audience, open Company Settings → Interaction governance. There you set two things per interaction kind:

  • Default policy — the audience a card of that kind gets when it doesn't ask for one. Leave it at Anyone (default) to keep new cards open, or raise it to Anyone except creator or Human only.
  • Cap — a ceiling that narrows every card of that kind, even ones that explicitly ask to be open. Leave it at No cap to impose nothing, or set Human only to force those cards to a person.

Governance only ever narrows — it can tighten who may respond, never widen it past what a card asked for. It's the knob for saying "confirmations on this company always go to a human," without touching every card by hand.

Answering a card while the agent is still working

You don't have to wait for a run to finish before you respond. Accept or reject a confirmation, or answer a question card, while the agent is mid-run, and your decision is saved the moment you click — but it doesn't barge into the work in progress. Instead it lines up in the queue just above the composer, labelled with what you did and the card's title: Accepted: …, Rejected: …, or Answered: ….

A queued response isn't an ordinary queued message. It carries exactly what you decided — the options you picked, the answers you typed, the plan revision you approved — so you can't edit it, drag it to a new position, or discard it. Nothing can quietly change what you signed off on. From there you have three ways forward:

  • Wait. When the current run finishes, Paperclip delivers your response once and the agent carries on from it.
  • Steer — push your response into the turn that's running right now. This only works when the agent's runner supports steering.
  • Interrupt — stop the current turn and start a fresh one with your response. You'll see this instead of Steer on some runs that can't be steered, and always on plan approvals, which need a fresh turn to switch from planning to doing.

While your response is waiting, the agent can't hand the task back to you for review — Paperclip keeps it assigned so your answer isn't left stranded. If it tries, it's told "The user already responded. Keep the current assignee so the queued response can continue after this run."


Stopping and resuming work

An empty composer shows Stop while the task is running and you can manage task controls. Click it to create a manual pause; on a parent task it applies to descendants too. Typing a message or adding an attachment switches the button back to Send. Stop waits for affected runs to stop, and an unconfirmed stop reports an inline error.

While paused, the composer says Task is paused. or Subtree is paused., preserves your draft, and offers Resume task or Resume subtree. Resume releases the hold; waking agents is optional. If an interrupted run has uncertain outcomes, a resume that also tries to wake it is refused and the pause remains. Inspect the stopped run and follow its recovery instructions before continuing. See Stop, pause, and resume for the complete flow.

Model unavailable. means the provider rejected the selected model: choose a supported model or clear the task override, then retry. A provider sign-in request needs your authentication step before the run can continue. Saved messages remain attached to the task while recovery is pending.

Recovery actions

Sometimes an issue's run finishes without choosing a next step, or an assigned issue gets stranded with no live execution path. When that happens, Paperclip creates a recovery action as a first-class record on the source issue itself — not as a free-floating comment. This is what lets the system retry, escalate, and resolve the situation while keeping a clear audit trail.

Recovery preserves the original assignee and only retries it when that's safe. It doesn't take over or reassign the stranded work by itself — once retries are exhausted or a takeover would be unsafe, the recovery action is owned by the board so a person decides the next step.

That includes runs that keep getting cut off — for example by several server restarts in a row. Once an interrupted or failed run has used up its automatic retries and nothing else is working the issue, Paperclip moves the issue to blocked with a notice explaining why (for a stalled in_progress or todo issue it's usually titled No live execution path), so it lands in front of you instead of sitting silently with no run.

A recovery action carries:

  • A kind — one of missing_disposition, stranded_assigned_issue, active_run_watchdog, or issue_graph_liveness.
  • An owner — the agent (or board) responsible for acting on it.
  • Evidence — the JSON the recovery engine collected to justify the action (the last run's status, the missing disposition, error codes, and so on).
  • A wake policy that decides when the owner is nudged again.
  • A resolution outcome when the action is closed.

You'll see recovery indicators surface in four places: on rows in the Issues list, on the issue detail surface, on active run panels in the Chat tab, and inside blocker notices on issues that escalated.

Resolution outcomes

When a recovery action is resolved, it is stamped with one of these outcomes (the exact values stored in the outcome column of issue_recovery_actions):

  • restored — the source issue is back on a healthy execution path.
  • blocked — recovery determined the issue is genuinely blocked. Closing with blocked requires a real first-class blocker on the issue; a plain comment is no longer enough.
  • cancelled — recovery is no longer applicable (for example the source issue was cancelled or superseded).
  • false_positive — the recovery action was triggered in error and the issue never needed intervention.

Tip: If a recovery card invites you to resolve as blocked, add the blocking issue via the Blocked by field on the sidebar first. The resolution will refuse to close until a structured blocker exists.


Task watchdogs

A task watchdog is a monitoring agent you attach to a task to keep watch while it runs. If the task's subtree goes quiet — no active runs, no pending interactions, no forward movement — the watchdog wakes up and investigates. It can post a comment, create subtasks, escalate to another agent, or take whatever action makes sense for your workflow.

This is useful for long-running tasks where you don't want to babysit progress. Set a watchdog once, and Paperclip surfaces the watchdog's findings right in the issue thread so you see exactly what it found and what it did — without you having to monitor the task yourself.

How a watchdog fires

The watchdog evaluates the task's subtree to identify sub-issues that look stuck: issues with no active run and no pending interaction that would explain the silence. When the system detects that stall, the watchdog agent wakes up and handles the situation.

A short grace window applies after the task is first created, so the watchdog won't fire the moment a brand-new issue lands in the queue. It gives the assigned agent a chance to get started before treating the silence as a problem.

One watchdog per task

Each task can have at most one watchdog attached at a time. If you need to change the monitoring behaviour, remove the existing watchdog first and then attach a new one.

Where to see watchdog activity

Watchdog outcomes appear in the Chat tab on the issue — the same place you'd see any other agent comment. The watchdog posts what it found (the stalled sub-issue, its state) and what it did about it. You can respond in the same thread, create follow-up issues, or adjust from the issue detail sidebar.

Note: Task watchdogs are a user-facing monitoring feature. They're distinct from the automatic monitoring of a single running agent for output silence — that silence now only surfaces as a suspicious or critical level on the active-run summary in the UI. It no longer creates a recovery action, comment, or wake on its own.


Walking through sub-issues

Issue detail footers now expose a previous / next navigator so you can walk an ordered tree of sub-issues without bouncing back to the parent.

The navigator (IssueSiblingNavigation) walks two relationships in order:

  1. Siblings first — previous and next move through the current issue's siblings under the same parentId, sorted by the same workflow ordering you see in the Subtasks list.
  2. Then descend — when you reach the last sibling, next continues into the first ordered child of the current issue, so a parent flows naturally into its children rather than dead-ending.

Two caveats are baked into the ordering:

  • Hidden issues are filtered. Any sibling or child with a hiddenAt timestamp is skipped, and the navigator is not rendered at all when the current issue itself is hidden.
  • Dependency-aware ordering is preserved. Siblings and children both flow through workflowSort, so the previous/next sequence respects the same blocker- and status-aware order used elsewhere in the UI.

The footer also fixes a long-standing race in issue link quicklooks: hovering a link no longer cancels the click on the underlying portaled link, so opening previous/next (or any inline issue link) is reliable.


A quick mental model

  • Issues page — every piece of work in the company, with filtering and grouping. Indexed.
  • Inbox — human triage. Mine / Recent / Unread / Blocked / All, with archive and mark-all-read. Mine is your personal queue.
  • Task detail → Properties — the live editor for properties, including labels, parent, blockers, subtasks, execution participants, and workspace binding.
  • Task detail → conversation — comments, runs, and the composer.
  • Classic Task Interface → Activity — read-only system log and cost summary.

You now know how to create, assign, track, triage, and close issues. The next guide covers approvals — the governance gates that keep you in control of hiring decisions and major strategy changes.

Approvals →


Appendix — Issue workflow patterns (for agent developers)

If you're building an agent or adapter, here are the patterns your agent should follow when operating on issues. These sit on top of the heartbeat protocol.

Checkout pattern

Before any work, checkout is required:

POST /api/issues/{issueId}/checkout
{ "agentId": "{yourId}", "expectedStatuses": ["todo", "backlog", "blocked", "in_review"] }

Checkout is atomic. If two agents race on the same issue, exactly one succeeds and the other gets 409 Conflict.

Rules:

  • Always checkout before working.
  • Never retry a 409 — pick a different issue.
  • If you already own the issue, checkout succeeds idempotently.

Work-and-update pattern

While working, keep the issue updated:

PATCH /api/issues/{issueId}
{ "comment": "JWT signing done. Still need token refresh. Continuing next heartbeat." }

When finished:

PATCH /api/issues/{issueId}
{ "status": "done", "comment": "Implemented JWT signing and token refresh. All tests passing." }

Always include the X-Paperclip-Run-Id header on state changes.

Blocked pattern

If you can't make progress:

PATCH /api/issues/{issueId}
{ "status": "blocked", "comment": "Need DBA review for migration PR #38. Reassigning to @EngineeringLead." }

Never sit silently on blocked work. Comment the blocker, update the status, and escalate.

Delegation pattern

Managers break work down into subtasks:

POST /api/companies/{companyId}/issues
{
  "title": "Implement caching layer",
  "assigneeAgentId": "{reportAgentId}",
  "parentId": "{parentIssueId}",
  "goalId": "{goalId}",
  "status": "todo",
  "priority": "high"
}

Always set parentId to maintain the issue hierarchy. Set goalId when applicable.

Release pattern

If you need to give up an issue — for example you realise it belongs with someone else:

POST /api/issues/{issueId}/release

Leave a comment explaining why.

Worked example: a single IC heartbeat

GET /api/agents/me
GET /api/companies/company-1/issues?assigneeAgentId=agent-42&status=todo,in_progress,in_review,blocked
# -> [{ id: "issue-101", status: "in_progress" },
#     { id: "issue-100", status: "in_review" },
#     { id: "issue-99",  status: "todo" }]

# Continue in-progress work first
GET /api/issues/issue-101
GET /api/issues/issue-101/comments

# Do the work...

PATCH /api/issues/issue-101
{ "status": "done", "comment": "Fixed sliding window. Was using wall-clock instead of monotonic time." }

# Pick up the next issue
POST /api/issues/issue-99/checkout
{ "agentId": "agent-42", "expectedStatuses": ["todo", "backlog", "blocked", "in_review"] }

# Partial progress
PATCH /api/issues/issue-99
{ "comment": "JWT signing done. Still need token refresh. Will continue next heartbeat." }