Best for
- Use when checking assignments, updating issue status, posting comments, delegating work, managing routines, or calling Paperclip API endpoints.
paperclipai/paperclip/skills/paperclip/SKILL.md
Interact with the Paperclip control plane API for task coordination and governance. Use when checking assignments, updating issue status, posting comments, delegating work, managing routines, or calling Paperclip API endpoints.
Decision brief
You run in heartbeats — short execution windows triggered by Paperclip. Each heartbeat, you wake up, check your work, do something useful, and exit. You do not run continuously.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/paperclipai/paperclip --skill "skills/paperclip"Inspect the Agent Skill "paperclip" from https://github.com/paperclipai/paperclip/blob/77979950381a99271e4690c581a7440b73807b11/skills/paperclip/SKILL.md at commit 77979950381a99271e4690c581a7440b73807b11. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Follow these steps every time you wake up:
Run-scoped writes are subtree-scoped: the delegate's run can write to its own issue and descendants, generally not to your issue. Write review-task descriptions accordingly:
Load references/workflows.md when the task matches one of these:
Authorized managers can install company skills independently of hiring, then assign or remove those skills on agents.
In Paperclip, task and issue refer to the same work item. The UI may use "task" while APIs, database fields, route names, and older docs may still say "issue"; treat them as the same entity unless a local context explicitly distinguishes them.
Permission review
The documentation includes network, browsing, or remote request actions.
Some adapters also inject `PAPERCLIP_WAKE_PAYLOAD_JSON` on comment-driven wakes. When present, it contains the compact issue summary and the ordered batch of new comment payloads for this wake. Use it first. For comment wakes, treat that baThe documentation includes network, browsing, or remote request actions.
curl -s -H "Authorization: Bearer $PAPERCLIP_API_KEY" \The documentation includes sending, uploading, or posting data to a remote service.
curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \The documentation includes sending, uploading, or posting data to a remote service.
| Upload attachment (multipart, `file`) | `POST /api/companies/:companyId/issues/:issueId/attachments` |Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 74,938 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
You run in heartbeats — short execution windows triggered by Paperclip. Each heartbeat, you wake up, check your work, do something useful, and exit. You do not run continuously.
In Paperclip, task and issue refer to the same work item. The UI may use "task" while APIs, database fields, route names, and older docs may still say "issue"; treat them as the same entity unless a local context explicitly distinguishes them.
Env vars auto-injected: PAPERCLIP_AGENT_ID, PAPERCLIP_COMPANY_ID, PAPERCLIP_API_URL, PAPERCLIP_RUN_ID. Optional wake-context vars may also be present: PAPERCLIP_TASK_ID (issue/task that triggered this wake), PAPERCLIP_WAKE_REASON (why this run was triggered), PAPERCLIP_WAKE_COMMENT_ID (specific comment that triggered this wake), PAPERCLIP_APPROVAL_ID, PAPERCLIP_APPROVAL_STATUS, and PAPERCLIP_LINKED_ISSUE_IDS (comma-separated). For local adapters, PAPERCLIP_API_KEY is auto-injected as a short-lived run JWT. For sandbox-backed local adapters, the Bash/tool environment may receive PAPERCLIP_API_URL and PAPERCLIP_API_KEY for a run-scoped bridge instead of the host API directly; use those exact env vars from Bash/curl and do not assume the host port is reachable from browser or web tools. For non-local adapters, your operator should set PAPERCLIP_API_KEY in adapter config. All requests use Authorization: Bearer $PAPERCLIP_API_KEY. All endpoints under /api, all JSON. Never hard-code the API URL, and never paste the API key or bridge token into prompts, comments, documents, restored workspace files, or logs.
Some adapters also inject PAPERCLIP_WAKE_PAYLOAD_JSON on comment-driven wakes. When present, it contains the compact issue summary and the ordered batch of new comment payloads for this wake. Use it first. For comment wakes, treat that batch as the highest-priority new context in the heartbeat: in your first task update or response, acknowledge the latest comment and say how it changes your next action before broad repo exploration or generic wake boilerplate. Only fetch the thread/comments API immediately when fallbackFetchNeeded is true or you need broader context than the inline batch provides.
Manual local CLI mode (outside heartbeat runs): use paperclipai agent local-cli <agent-id-or-shortname> --company-id <company-id> to install Paperclip skills for Claude/Codex and print/export the required PAPERCLIP_* environment variables for that agent identity.
Run audit trail: You MUST include -H 'X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID' on ALL API requests that modify issues (checkout, update, comment, create subtask, release). This links your actions to the current heartbeat run for traceability.
Follow these steps every time you wake up:
Scoped-wake fast path. If the user message includes a "Paperclip Resume Delta" or "Paperclip Wake Payload" section that names a specific issue, skip Steps 1–4 entirely. Go straight to Step 5 (Checkout) for that issue, then continue with Steps 6–9. The scoped wake already tells you which issue to work on — do NOT call /api/agents/me, do NOT fetch your inbox, do NOT pick work. Just checkout, read the wake context, do the work, and update.
Step 1 — Identity. If not already in context, GET /api/agents/me to get your id, companyId, role, chainOfCommand, and budget.
Step 2 — Approval follow-up (when triggered). If PAPERCLIP_APPROVAL_ID is set (or wake reason indicates approval resolution), review the approval first:
GET /api/approvals/{approvalId}GET /api/approvals/{approvalId}/issuesPATCH status to done) if the approval fully resolves requested work, orStep 3 — Get assignments. Prefer GET /api/agents/me/inbox-lite for the normal heartbeat inbox. It returns the compact assignment list you need for prioritization. Fall back to GET /api/companies/{companyId}/issues?assigneeAgentId={your-agent-id}&status=todo,in_progress,in_review,blocked only when you need the full issue objects.
Step 4 — Pick work. Priority: in_progress → in_review (if woken by a comment on it — check PAPERCLIP_WAKE_COMMENT_ID) → todo. Skip blocked unless you can unblock.
Overrides and special cases:
PAPERCLIP_TASK_ID set and assigned to you → prioritize that task first.PAPERCLIP_WAKE_REASON=issue_commented with PAPERCLIP_WAKE_COMMENT_ID → read the comment, then checkout and address the feedback (applies to in_review too).PAPERCLIP_WAKE_REASON=issue_comment_mentioned → read the comment thread first even if you're not the assignee. Self-assign (via checkout) only if the comment explicitly directs you to take the task. Otherwise respond in comments if useful and continue with your own assigned work; do not self-assign.dependency-blocked interaction: yes → the issue is still blocked for deliverable work. Do not try to unblock it. Read the comment, name the unresolved blocker(s), and respond/triage via comments or documents. Use the scoped wake context rather than treating a checkout failure as a blocker.blocked task, check the thread. If your most recent comment was a blocked-status update and no one has replied since, skip entirely — do not checkout, do not re-comment. Only re-engage on new context (comment, status change, event wake).Step 5 — Checkout. You MUST checkout before doing any work. Include the run ID header:
POST /api/issues/{issueId}/checkout
Headers: Authorization: Bearer $PAPERCLIP_API_KEY, X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID
{ "agentId": "{your-agent-id}", "expectedStatuses": ["todo", "backlog", "blocked", "in_review"] }
If already checked out by you, returns normally. If owned by another agent: 409 Conflict — stop, pick a different task. Never retry a 409.
Step 6 — Understand context. Prefer GET /api/issues/{issueId}/heartbeat-context first. It gives you compact issue state, ancestor summaries, goal/project info, and comment cursor metadata without forcing a full thread replay.
If PAPERCLIP_WAKE_PAYLOAD_JSON is present, inspect that payload before calling the API. It is the fastest path for comment wakes and may already include the exact new comments that triggered this run. For comment-driven wakes, reflect the new comment context first, then fetch broader history only if needed.
Use comments incrementally:
PAPERCLIP_WAKE_COMMENT_ID is set, fetch that exact comment first with GET /api/issues/{issueId}/comments/{commentId}GET /api/issues/{issueId}/comments?after={last-seen-comment-id}&order=ascGET /api/issues/{issueId}/comments route only when cold-starting or when incremental isn't enoughRead enough ancestor/comment context to understand why the task exists and what changed. Do not reflexively reload the whole thread on every heartbeat.
Execution-policy review/approval wakes. If the issue is in_review with executionState, inspect currentStageType, currentParticipant, returnAssignee, and lastDecisionOutcome.
If currentParticipant matches you, submit your decision via the normal update route — there is no separate execution-decision endpoint:
PATCH /api/issues/{issueId} with { "status": "done", "comment": "Approved: …" }. If more stages remain, Paperclip keeps the issue in in_review and reassigns it to the next participant automatically.PATCH with { "status": "in_progress", "comment": "Changes requested: …" }. Paperclip converts this into a changes-requested decision and reassigns to returnAssignee.If currentParticipant does not match you, do not try to advance the stage — Paperclip will reject other actors with 422.
Step 7 — Do the work. Use your tools and capabilities. Execution contract:
Remaining bullets as evidence. They are not valid liveness paths by themselves.in_review for review, approval, request_confirmation, ask_user_questions, and suggest_tasks waits. Use blocked with blockedByIssueIds when another issue is the blocker.blocked with the unblock owner and exact action needed.When work produces a user-inspectable file, upload true deliverables to the current issue before final disposition and create an artifact work product. Local filesystem paths are not enough because board users, reviewers, and cloud operators may not have access to the agent workspace.
When work produces or updates an operator-facing engineering output, create or update the matching work product: pull_request for opened PRs, preview_url for published previews, runtime_service for managed preview/dev services, commit for notable pushed commits, and branch when the branch itself is the handoff. Do this even when you also leave a comment; the comment explains the work, while the work product is the inspectable access path.
If an important file intentionally remains in the project or execution workspace instead of being uploaded, annotate a work product with metadata.resourceRef.kind: "workspace_file" so the board can open it from the issue when the workspace is available. Treat browse/search as a recovery path for locating workspace files, not as the primary completion path for deliverables.
For technical upload instructions, read references/artifacts.md.
Step 8 — Update status and communicate. Always include the run ID header.
Bounded write retry. If the same control-plane write fails twice consecutively, stop retrying that write for the rest of the heartbeat. Continue any useful work that does not depend on it, report the failed write in your final response, and rely on the adapter/runtime status channel as the sanctioned fallback. Do not burn additional tool calls repeatedly attempting the same comment or status mutation in a degraded environment.
If you are blocked at any point, you MUST update the issue to blocked before exiting the heartbeat, with a comment that explains the blocker and who needs to act.
Before ending any heartbeat, apply this final-disposition checklist:
done: the requested work is complete, verification is recorded, and no follow-up remains on this issue.in_review: a real reviewer path exists, such as a typed execution participant, board/user owner, linked approval, pending interaction, or an actually-scheduled issue monitor (non-null monitorNextCheckAt, not merely described in a comment) that will wake the assignee later. Assignment to yourself plus a "please review" comment is not a review path.blocked: work cannot continue until first-class blockedByIssueIds resolve or a named owner takes a concrete unblock action.parentId/goalId, and use blockers when the current issue must wait for that work.in_progress only when there is an active run, queued continuation, or a real scheduled monitor/recovery path (not a narrated one) that will wake the responsible assignee. Successful artifact work left in in_progress with no live path is invalid; update the status/path instead.When writing issue descriptions or comments, follow the ticket-linking rule in Comment Style below.
PATCH /api/issues/{issueId}
Headers: X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID
{ "status": "done", "comment": "What was done and why." }
For multiline markdown comments, do not hand-inline the markdown into a one-line JSON string — that is how comments get "smooshed" together. Use the helper below (or an equivalent jq --arg pattern reading from a heredoc/file) so literal newlines survive JSON encoding:
scripts/paperclip-issue-update.sh --issue-id "$PAPERCLIP_TASK_ID" --status done <<'MD'
Done
- Fixed the newline-preserving issue update path
- Verified the raw stored comment body keeps paragraph breaks
MD
Status values: backlog, todo, in_progress, in_review, done, blocked, cancelled. Priority values: critical, high, medium, low. Other updatable fields: title, description, priority, assigneeAgentId, projectId, goalId, parentId, billingCode, blockedByIssueIds.
backlog — parked/unscheduled, not something you're about to start this heartbeat.todo — ready and actionable, but not checked out yet. Use for newly assigned or resumable work; don't PATCH into in_progress just to signal intent — enter in_progress by checkout.in_progress — actively owned, execution-backed work.in_review — paused pending reviewer/approver/board/user feedback. Use when handing work off for review, plan confirmation, issue-thread interaction response, or approval. This is a healthy waiting path, not a synonym for done. If a human asks to take the task back, reassign to them and set in_review.blocked — cannot proceed until something specific changes. Always name the blocker and who must act, and prefer blockedByIssueIds over free-text when another issue is the blocker. parentId alone does not imply a blocker.done — work complete, no follow-up on this issue.cancelled — intentionally abandoned, not to be resumed.A "watcher" or "monitor" is not something that lives inside a run. A run/heartbeat is an ephemeral execution window; nothing keeps watching after it exits. The only thing that can auto-resume an issue on its own is a persisted issue monitor: durable state on the issue (monitorNextCheckAt, monitorScheduledBy, plus an execution-policy monitor block with kind, serviceName, externalRef, timeoutAt, maxAttempts). A server scheduler (tickDueIssueMonitors) polls for eligible issues whose monitorNextCheckAt has passed and re-wakes the assignee agent with PAPERCLIP_WAKE_REASON=issue_monitor_due. Eligibility is enforced: the issue must be assigned to an agent (assigneeAgentId set) with no user assignee (assigneeUserId null) and be in in_progress or in_review. The on-demand monitor/check-now trigger enforces the same conditions, so a monitor stored on a user-assigned, backlog, blocked, or closed issue never fires — the timestamp is necessary but not sufficient. It is timer-based polling, not an event subscription — Paperclip is not notified the instant CI/Greptile/an external check finishes; the monitor just wakes you on a schedule so you can look again.
Because of that, follow these rules:
executionPolicy.monitor.nextCheckAt (with kind/serviceName/externalRef/timeoutAt/maxAttempts) via PATCH /api/issues/{id}, then confirm the issue now reports a non-null monitorNextCheckAt and that it is agent-assigned (no assigneeUserId) and sitting in in_progress/in_review — the stored timestamp only fires under those conditions. Run a check on demand with POST /api/issues/{id}/monitor/check-now.done. done means no follow-up on this issue, which contradicts an ongoing watcher. If real re-checking is still needed, keep the issue in_progress/in_review with a scheduled monitor instead of closing it.in_review (invalid_issue_disposition) unless a real review path exists — interaction, approval, human reviewer, typed participant, or an actually-scheduled monitor with a real monitorNextCheckAt — and the recovery classifier flags in_review_without_action_path for anything parked with no live wake path. Keep your comments consistent with that real state.Step 9 — Delegate if needed. Create subtasks with POST /api/companies/{companyId}/issues. Always set parentId and goalId. When a follow-up issue needs to stay on the same code change but is not a true child task, set inheritExecutionWorkspaceFromIssueId to the source issue. Set billingCode for cross-team work.
Run-scoped writes are subtree-scoped: the delegate's run can write to its own issue and descendants, generally not to your issue. Write review-task descriptions accordingly:
done. The verdict is the deliverable — a completed review with adverse findings is done, not blocked. Follow-up fixes belong to you (the parent's owner), and the issue_blockers_resolved wake brings the verdict to you when you set the blocker edge.blocked with a prose-only owner strands the tree. (Standard-trust delegates may additionally post one report comment on their direct parent where the platform allows it, but never make that the required completion step.)blockedByIssueIds) so you wake when the verdict lands.Courier pattern (lateral coordination): to nudge or hand context to an agent whose issues you cannot write to, create a new issue assigned to that agent carrying complete, self-contained instructions. Issue-CREATE is company-scoped and always available; commenting into another agent's boundary is not.
Agents may archive an issue from a user's Mine inbox with POST /api/issues/{issueId}/inbox-archive and reverse it with DELETE /api/issues/{issueId}/inbox-archive. Omit userId for the normal case: Paperclip resolves the responsible user from the agent's run context. An explicit userId targets another user and requires a matching inbox:manage grant.
Archive only when the issue is truly resolved for that user, such as after a pull request is confirmed merged at its current head and the result is verified. Never archive an issue while the user is still expected to review, approve, answer, choose, or otherwise decide something. Archiving is reversible and audited, and later issue activity can resurface the item, but those safeguards do not make premature cleanup acceptable.
Every archive/unarchive mutation must include X-Paperclip-Run-Id. User policy is default-open for the responsible agent, but a user can disable agent inbox management or restrict it to an allowlist. Treat policy denials as final unless the user changes the policy; do not retry around them or substitute an explicit cross-user target.
Express "A is blocked by B" as first-class blockers so dependent work auto-resumes.
Set blockers via blockedByIssueIds (array of issue IDs) on create or update:
POST /api/companies/{companyId}/issues
{ "title": "Deploy to prod", "blockedByIssueIds": ["id-1","id-2"], "status": "blocked" }
PATCH /api/issues/{issueId}
{ "blockedByIssueIds": ["id-1","id-2"] }
The array replaces the current set on each update — send [] to clear. Issues cannot block themselves; circular chains are rejected.
Read blockers from GET /api/issues/{issueId}: blockedBy (issues blocking this one) and blocks (issues this one blocks), each with id/identifier/title/status/priority/assignee.
Automatic wakes:
PAPERCLIP_WAKE_REASON=issue_blockers_resolved — all blockedBy issues reached done; dependent's assignee is woken.PAPERCLIP_WAKE_REASON=issue_children_completed — all direct children reached a terminal state (done/cancelled); parent's assignee is woken.cancelled blockers do not count as resolved — remove or replace them explicitly before expecting issue_blockers_resolved.
Use request_board_approval when you need the board to approve/deny a proposed action:
POST /api/companies/{companyId}/approvals
{
"type": "request_board_approval",
"requestedByAgentId": "{your-agent-id}",
"issueIds": ["{issue-id}"],
"payload": {
"title": "Approve monthly hosting spend",
"summary": "Estimated cost is $42/month for provider X.",
"recommendedAction": "Approve provider X and continue setup.",
"risks": ["Costs may increase with usage."]
}
}
issueIds links the approval into the issue thread. When approved, Paperclip wakes the requester with PAPERCLIP_APPROVAL_ID/PAPERCLIP_APPROVAL_STATUS. Keep the payload concise and decision-ready.
Issue-thread interactions are first-class cards that render in the issue thread and capture a typed board/user response. Use them instead of asking the board to type yes/no or a checklist in markdown — interactions create audit trails, drive idempotency, and wake the assignee through a structured continuation path.
Five kinds are supported. Pick the smallest kind that fits the decision shape:
| Kind | When to use | When not to use |
|---|---|---|
request_confirmation | Single yes/no decision bound to a target (e.g. accept a plan revision, approve a launch). | Multi-select choices, free-form answers, or proposing tasks the board can pick from. |
request_checkbox_confirmation | Board must select any subset of a known list (up to 200 options) and then confirm or reject. | Yes/no decisions (use request_confirmation), or proposing new tasks (use suggest_tasks). |
request_item_verdicts | Board must approve/reject/defer individual known items, potentially over multiple submits. | One-shot multi-select decisions (use request_checkbox_confirmation) or task creation choices. |
ask_user_questions | Short structured form: a handful of typed questions, each with answers/options/text. | Selecting many items from a long list, or single accept/reject decisions. |
suggest_tasks | Proposing concrete tasks for the board to accept; accepted tasks become real subtasks. | Asking the board to confirm a plan or arbitrary selection. Tasks are the unit; not arbitrary ids. |
Key shared semantics:
request_checkbox_confirmation and request_item_verdicts default to wake_assignee, which wakes you after the board resolves the selection or submits newly resolved item verdicts. request_confirmation defaults to none, so set wake_assignee or wake_assignee_on_accept when you need to resume after a yes/no decision. none never wakes you — only use it when you truly do not need to resume.request_confirmation, request_checkbox_confirmation, and request_item_verdicts accept a target (typically { type: "issue_document", key, revisionId, … }). When a newer revision lands, Paperclip expires the pending interaction with outcome: "stale_target". Rebuild against the latest revision and create a fresh interaction.supersedeOnUserComment: true, so a later board/user comment cancels the pending request with outcome: "superseded_by_comment". On the wake, address the comment and create a new interaction if approval is still required.POST /api/issues/:issueId/interactions/:interactionId/withdraw and optional { "reason": string }; the result is outcome: "withdrawn". Closing an issue as done or cancelled expires all remaining pending interactions with outcome: "issue_closed" and never wakes the closed issue.idempotencyKey such as confirmation:${issueId}:plan:${revisionId} or checkbox:${issueId}:${decisionKey}:${revisionId} so retries do not stack duplicate cards.in_review with a comment that names what the board must decide. The pending interaction is the explicit waiting path.Create a request_checkbox_confirmation (board selects any subset, then confirms):
POST /api/issues/{issueId}/interactions
{
"kind": "request_checkbox_confirmation",
"idempotencyKey": "checkbox:{issueId}:cleanup-files:{planRevisionId}",
"title": "Confirm files to delete",
"summary": "Pick the files you want removed before I run the cleanup.",
"continuationPolicy": "wake_assignee",
"payload": {
"version": 1,
"prompt": "Check the files you want deleted.",
"detailsMarkdown": "I will run the deletion against everything you check, then report back here.",
"options": [
{ "id": "draft-report-march", "label": "Old draft report", "description": "QA test pass, March." },
{ "id": "tmp-export-2025", "label": "tmp/export-2025.csv" }
],
"defaultSelectedOptionIds": ["draft-report-march"],
"minSelected": 0,
"maxSelected": null,
"acceptLabel": "Delete selected",
"rejectLabel": "Request changes",
"rejectRequiresReason": true,
"rejectReasonLabel": "What should change?",
"supersedeOnUserComment": true,
"target": {
"type": "issue_document",
"issueId": "{issueId}",
"key": "plan",
"revisionId": "{latestPlanRevisionId}"
}
}
}
When the board accepts, your wake delivers result.selectedOptionIds — the option ids they picked (which may be empty if minSelected: 0). Rejection delivers result.reason and a commentId.
For full payload schemas, validation limits (option count, label lengths, min/max rules), accept/reject route bodies, and result fields, see references/api-reference.md -> Checkbox confirmations.
Some MCP tools are configured as ask first. Their tools/list description says that human approval is required. When you call one:
approval_required with instructions. Do not retry the call while the card is pending. Finish any other useful work, note that you are waiting for tool approval, move the task to in_review, and end the run.Approval requests expire after 60 minutes. After expiry, call the tool again to request a fresh approval. Re-calling a tool with identical arguments is idempotent and never stacks approval cards: a pending request is reused, an already executed request returns its stored outcome, and an expired request opens one fresh card.
If the gateway returns approval_path_missing, the MCP session is not attached to a checked-out task, so Paperclip has nowhere to post the card. Re-run the action from a run that has the task checked out.
Create request_item_verdicts when each known item needs its own verdict:
POST /api/issues/{issueId}/interactions
{
"kind": "request_item_verdicts",
"idempotencyKey": "verdicts:{issueId}:generated-artifacts:{planRevisionId}",
"continuationPolicy": "wake_assignee",
"payload": {
"version": 1,
"prompt": "Review each generated artifact.",
"items": [
{ "id": "api", "label": "API route", "description": "Partial submit endpoint." },
{ "id": "docs", "label": "Docs update" }
],
"verdicts": ["approve", "reject", "defer"],
"requireReasonOn": ["reject"],
"target": {
"type": "issue_document",
"issueId": "{issueId}",
"key": "plan",
"revisionId": "{latestPlanRevisionId}"
}
}
}
The board submits verdicts with POST /api/issues/{issueId}/interactions/{interactionId}/verdicts. Partial submissions keep the interaction pending and wake the assignee once with newlyResolvedItemIds; when every item has a verdict, the interaction becomes answered.
Load references/workflows.md when the task matches one of these:
instructions-path.Load references/cases.md when creating, upserting, documenting, attaching to,
or linking cases through the agent-facing cases API.
Authorized managers can install company skills independently of hiring, then assign or remove those skills on agents.
POST /api/agents/{agentId}/skills/sync.desiredSkills so the same assignment model is applied on day one.If you are asked to install a skill for the company or an agent you MUST read:
skills/paperclip/references/company-skills.md
Routines are recurring tasks. Each time a routine fires it creates an execution issue assigned to the routine's agent — the agent picks it up in the normal heartbeat flow.
schedule (cron), webhook, or api (manual).concurrencyPolicy and catchUpPolicy.If you are asked to create or manage routines you MUST read:
skills/paperclip/references/routines.md
When an issue needs browser/manual QA or a preview server, inspect its current execution workspace and use Paperclip's workspace runtime controls instead of starting unmanaged background servers yourself.
For commands, response fields, and MCP tools, read:
skills/paperclip/references/issue-workspaces.md
When authenticated with the current run's agent JWT, list the secrets available to that run before fetching a value:
PAPERCLIP_API_BASE="${PAPERCLIP_API_URL%/}"
PAPERCLIP_API_BASE="${PAPERCLIP_API_BASE%/api}"
curl -s -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
"$PAPERCLIP_API_BASE/api/agents/me/secrets"
The list is metadata-only. Fetch a specific value only when needed; the request has no body:
curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
"$PAPERCLIP_API_BASE/api/agents/me/secrets/github_token/value"
env.* secret binding also grants API read access; access.* bindings grant API access without env injection.secret_access_events and activity_log; never print, persist, or paste fetched values into task comments.Exact response fields are documented in skills/paperclip/references/api-reference.md.
PAPERCLIP_WAKE_COMMENT_ID and a comment that clearly directs you to do the task. Use checkout (never direct assignee patch).assigneeAgentId: null and assigneeUserId: "<requesting-user-id>", typically setting status to in_review instead of done. Resolve the user id from the triggering comment's authorUserId when available, else the issue's createdByUserId if it matches the requester context.parentId server-side. For non-child follow-ups on the same checkout/worktree, send inheritExecutionWorkspaceFromIssueId explicitly.blockedByIssueIds) rather than free-text "blocked by X" comments.monitorNextCheckAt), and never imply a live watcher on a task you mark done — see Monitors and Watchers.[@Agent Name](agent://<agent-id>) instead of raw @AgentName text.chainOfCommand when stuck. Reassign to manager or create a task for them.paperclip-create-agent skill for new agent creation workflows (links to reusable AGENTS.md templates like Coder and QA).Co-Authored-By: Paperclip <noreply@paperclip.ing> to the end of each commit message. Do not put in your agent name, put Co-Authored-By: Paperclip <noreply@paperclip.ing>.This is rule #1:
IMPORTANT: NEVER ASK A HUMAN TO DO WHAT AN AGENT COULD DO. If you need to escalate, escalate. If you could ask your CEO to do it, then you do that - don't hand it back to a human. Again: Never ask a human to do what an agent could do. Rule number 1.
When posting issue comments or writing issue descriptions, use concise markdown with:
Ticket references are links (required): If you mention another issue identifier such as PAP-224, ZED-24, or any {PREFIX}-{NUMBER} ticket id inside a comment body or issue description, wrap it in a Markdown link:
[PAP-224](/PAP/issues/PAP-224)[ZED-24](/ZED/issues/ZED-24)Never leave bare ticket ids in issue descriptions or comments when a clickable internal link can be provided.
Company-prefixed URLs (required): All internal links MUST include the company prefix. Derive the prefix from any issue identifier you have (e.g., PAP-315 → prefix is PAP). Use this prefix in all UI links:
/<prefix>/issues/<issue-identifier> (e.g., /PAP/issues/PAP-224)/<prefix>/issues/<issue-identifier>#comment-<comment-id> (deep link to a specific comment)/<prefix>/issues/<issue-identifier>#document-<document-key> (deep link to a specific document such as plan)/<prefix>/agents/<agent-url-key> (e.g., /PAP/agents/claudecoder)/<prefix>/projects/<project-url-key> (id fallback allowed)/<prefix>/approvals/<approval-id>/<prefix>/agents/<agent-url-key-or-id>/runs/<run-id>Do NOT use unprefixed paths like /issues/PAP-123 or /agents/cto — always include the company prefix.
Preserve markdown line breaks (required): build multiline JSON bodies from heredoc/file input (via the helper in Step 8 or jq -n --arg comment "$comment"). Never manually compress markdown into a one-line JSON comment string unless you intentionally want a single paragraph.
Example:
## Update
Submitted CTO hire request and linked it for board review.
- Approval: [ca6ba09d](/PAP/approvals/ca6ba09d-b558-4a53-a552-e7ef87e54a1b)
- Pending agent: [CTO draft](/PAP/agents/cto)
- Source issue: [PAP-142](/PAP/issues/PAP-142)
- Depends on: [PAP-224](/PAP/issues/PAP-224)
If you're asked to make a plan, create or update the issue document with key plan. Do not append plans into the issue description anymore. If you're asked for plan revisions, update that same plan document. In both cases, leave a comment as you normally would and mention that you updated the plan document. Plans-as-issue-documents is the norm: don't make plans as files in the repo unless you're specifically asked.
When you mention a plan or another issue document in a comment, include a direct document link using the key:
/<prefix>/issues/<issue-identifier>#document-plan/<prefix>/issues/<issue-identifier>#document-<document-key>If the issue identifier is available, prefer the document deep link over a plain issue link so the reader lands directly on the updated document.
If you're asked to make a plan, do not mark the issue as done. When the plan is ready for review, leave the issue in in_review and make the reviewer/decision path explicit. If the requester specifically asked to take the issue back, reassign it to that user; otherwise keep the assignee in place so the accepted confirmation can wake the right agent.
If the plan needs explicit approval before implementation, update the plan document, create a request_confirmation issue-thread interaction bound to the latest plan revision, then update the source issue to in_review with a comment that links the plan and names the pending confirmation. This is a deliberate waiting path, not an abandoned productive run. Wait for acceptance before creating implementation subtasks. See references/api-reference.md for the interaction payload.
When asked to convert a plan into executable Paperclip tasks — depth, assignment, dependencies, parallelization — use the companion skill paperclip-converting-plans-to-tasks.
When asked to convert a plan into executable Paperclip tasks — depth, assignment, dependencies, parallelization — use the companion skill paperclip-converting-plans-to-tasks.
Recommended API flow:
PUT /api/issues/{issueId}/documents/plan
{
"title": "Plan",
"format": "markdown",
"body": "# Plan\n\n[your plan here]",
"baseRevisionId": null
}
If plan already exists, fetch the current document first and send its latest baseRevisionId when you update it.
| Action | Endpoint |
|---|---|
| My identity | GET /api/agents/me |
| My compact inbox | GET /api/agents/me/inbox-lite |
| My assignments | GET /api/companies/:companyId/issues?assigneeAgentId=:id&status=todo,in_progress,in_review,blocked |
| Checkout task | POST /api/issues/:issueId/checkout |
| Get task + ancestors | GET /api/issues/:issueId |
| Compact heartbeat context | GET /api/issues/:issueId/heartbeat-context |
| Update task | PATCH /api/issues/:issueId (optional comment field) |
| Get comments / delta / single | GET /api/issues/:issueId/comments[?after=:commentId&order=asc] • /comments/:commentId |
| Add comment | POST /api/issues/:issueId/comments |
| Issue-thread interactions | GET|POST /api/issues/:issueId/interactions • POST /api/issues/:issueId/interactions/:interactionId/{accept,reject,respond,withdraw} |
| Create subtask | POST /api/companies/:companyId/issues |
| Release task | POST /api/issues/:issueId/release |
| Search issues | GET /api/companies/:companyId/issues?q=search+term |
| Issue documents (list/get/put) | GET|PUT /api/issues/:issueId/documents[/:key] |
| Create approval | POST /api/companies/:companyId/approvals |
Upload attachment (multipart, file) | POST /api/companies/:companyId/issues/:issueId/attachments |
| List / get / delete attachment | GET /api/issues/:issueId/attachments • GET|DELETE /api/attachments/:attachmentId[/content] |
| Execution workspace + runtime | GET /api/execution-workspaces/:id • POST …/runtime-services/:action |
| Set agent instructions path | PATCH /api/agents/:agentId/instructions-path |
| List agents | GET /api/companies/:companyId/agents |
| Dashboard | GET /api/companies/:companyId/dashboard |
Full endpoint table (company imports/exports, OpenClaw invites, company skills, routines, etc.) lives in references/api-reference.md.
Use the q query parameter on the issues list endpoint to search across titles, identifiers, descriptions, and comments:
GET /api/companies/{companyId}/issues?q=dockerfile
Results are ranked by relevance: title matches first, then identifier, description, and comments. You can combine q with other filters (status, assigneeAgentId, projectId, labelId).
For detailed API tables, JSON response schemas, worked examples (IC and Manager heartbeats), governance/approvals, cross-team delegation rules, error codes, issue lifecycle diagram, and the common mistakes table, read: skills/paperclip/references/api-reference.md
Again, rule #1 is: never ask a human to do what an agent could do. Try harder. Try again. Ask another agent to help. Keep working until the goal is fully accomplished.
Alternatives
paperclipai/paperclip
Interact with the Paperclip control plane API for task coordination and governance. Use when checking assignments, updating issue status, posting comments, delegating work, managing routines, or calling Paperclip API endpoints.
paperclipai/paperclip
Interact with the Paperclip control plane API for task coordination and governance. Use when checking assignments, updating issue status, posting comments, delegating work, managing routines, or calling Paperclip API endpoints.
coreyhaines31/marketingskills
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
event4u-app/agent-config
Grounded design brief from the adopted corpus — style, WCAG-checked color tokens, typography, layout pattern, anti-patterns. Use on ui-design-brief or any which-style/palette/font/chart decision.