548d958f18
Build: Production / build (push) Failing after 12m39s
The fork's listRuntimeSkillEntries rematerialized every skill's files from the DB on every heartbeat run dispatch — fs.rm + fs.mkdir + per-file readFile/writeFile, sequentially per skill. With 24 configured skills and 5 concurrent agents, this saturated the Node event loop badly enough that executeRun continuations couldn't reach activeRunExecutions.add() within the orphan-reaper's 5-min threshold, causing reaper to false-positive runs as "process_lost". Upstream's listRuntimeSkillEntries calls resolveRuntimeSkillSource, which checks if the materialized directory already exists on disk and short- circuits when it does. Fixes the symptom at the root. Replaces these files with upstream/master content: - server/src/services/company-skills.ts - server/src/services/heartbeat.ts - server/src/services/workspace-runtime.ts - server/src/services/company-portability.ts - server/src/routes/company-skills.ts - server/src/routes/agents.ts - packages/adapter-utils/src/server-utils.ts Pulls in supporting upstream files: - server/src/services/catalog-provenance.ts - server/src/services/skills-catalog.ts - server/src/services/github-fetch.ts - server/src/services/portable-path.ts - packages/skills-catalog/ (new package) - packages/db document_annotation_* schema + migration 0091 - packages/shared document-annotation types/validators Drops fork features (to be re-evaluated later): - Gitea/Forgejo git skill sources (server/src/services/git-source.ts deleted) - PAT support for private skill repos - Fork-specific secret-export portability extensions Adds agentId: null to acquireRunLease test-probe call in routes/agents.ts to satisfy the fork's environment-runtime agentId requirement (kept). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.9 KiB
3.9 KiB
name, description, key, recommendedForRoles, tags
| name | description | key | recommendedForRoles | tags | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| issue-triage | Triage Paperclip inbox issues that are stale, blocked, in-review, or assigned-but-not-progressing, and decide a single next action per issue (resume, reassign, unblock, escalate, or close). | paperclipai/bundled/paperclip-operations/issue-triage |
|
|
Issue Triage
Convert a noisy inbox into a small set of clear next actions. Each pass through this skill should leave every touched issue with a defined owner, status, and the single concrete action that will move it forward.
When to use
- Daily or shift-start review of
in_progress,in_review, andblockedassignments. - An inbox has many open assignments and no clear priority.
- A manager wants a status read on their reports without asking each agent.
- You are woken by a comment that suggests an old issue stalled.
When not to use
- You are checked out on one specific issue and the wake context names it. Work that issue, do not triage the whole inbox.
- An issue thread already has an open
request_confirmationorask_user_questions. Wait for the response — re-triage is noise.
Inputs
GET /api/agents/me/inbox-litefor the compact assignment list.- For each candidate issue,
GET /api/issues/{issueId}/heartbeat-contextfor compact state includingblockerAttention,executionState, ancestors, andcommentCursor. - Only fall back to the full thread when the heartbeat context is not enough.
Per-issue triage decision
For each issue, classify into exactly one of:
- Resume — execution path is alive. Confirm the assignee is set and let the heartbeat continue. Do not comment.
- Wake-needed — assignee is stalled with no live continuation. Post one comment that names the blocker resolution or the exact next action, then leave
in_progressor move totodoso the assignee picks it up. - Reassign — the assignee is not the right specialty. Reassign and set
in_reviewonly if the new assignee is human, otherwise leavein_progress. - Unblock — a first-class
blockedByIssueIdsentry is nowdoneorcancelled. Ifcancelled, replace or remove it fromblockedByIssueIds. The blockers-resolved wake will fire automatically when all aredone. - Escalate — the issue needs board, CTO, or user input. Create a
request_confirmation,ask_user_questions, orrequest_board_approvaland set the issue toin_review. - Close — work is complete, duplicate, or no longer relevant. Set
doneorcancelledwith a one-line reason.
If you cannot classify in under a minute of reading, escalate rather than guess.
Stuck-state heuristics
in_progresswith no comments or document updates in the last 24h and no monitor or queued continuation → wake-needed.in_reviewwith no reviewer participant, no pending interaction, no approval — invalid review path → reassign to a real reviewer or move totodo.blockedwith noblockedByIssueIds, only free-text "blocked by X" → convert to first-class blockers or move totodowith a named action.blockedwith all blockersdone→ unblock the issue by setting status back; the assignee will wake.- Child issues all complete but parent still
in_progress→ confirm parent acceptance, then close.
Don't-do list
- Do not @-mention agents during triage; mentions cost budget. Use direct reassignment instead.
- Do not re-comment on a
blockedissue if your most recent comment was also a blocked update with no reply since. - Do not cancel cross-team issues. Reassign to the responsible manager with a comment.
- Do not change status without a comment that explains the change.
Output of a triage pass
A short comment chain or summary message that lists, per issue touched:
- Issue id and title.
- Verdict (resume / wake-needed / reassign / unblock / escalate / close).
- The one action you took or asked for.
This is the bar for "the triage is done."