diff --git a/doc/native-workspace-finalization-recovery.md b/doc/native-workspace-finalization-recovery.md index 2be7f1b67db..01201315417 100644 --- a/doc/native-workspace-finalization-recovery.md +++ b/doc/native-workspace-finalization-recovery.md @@ -9,6 +9,15 @@ A completed workspace barrier is reread under ownership before export, and a committed coordinator cannot be overwritten by a late failure receipt. +An unverified workspace owner keeps one board recovery action for its exact run +and owner fingerprint. Repeated recovery checks do not consume attempts or +rewrite that action. Task completion or cancellation does not prove the old +physical writer stopped, so reads and recovery sweeps retain this action while +the matching run still carries that owner receipt. After the receipt is cleared +or replaced, ordinary stale-action cleanup applies. Cleanup is attributed to +the system; historical cleanup from page reads does not add tasks to a person's +inbox or refresh issue activity timestamps. + The lock transaction holds no row locks. Ordinary progress and finalization receipts remain visible through the normal database pool. A dedicated connection outside the application pool is reserved for the duration of copyback and closed when it settles; even a one-connection application pool remains available for progress writes. Its run profile carries diff --git a/maps/agent-access-map/activity.md b/maps/agent-access-map/activity.md index b5d2041289c..40d61378fdd 100644 --- a/maps/agent-access-map/activity.md +++ b/maps/agent-access-map/activity.md @@ -40,22 +40,32 @@ Review: `baseline`. API: `present` — representative operation IDs: - `GET /api/companies/{companyId}/activity`. +- `GET /api/issues/{id}/activity` (UUID or issue identifier). -Agent access: `available` — REST / native call_api / CLI activity. +Agent access: `partial` — REST / native call_api / CLI activity for company +activity. Sandbox agents can use GET issue activity through the default +[callback bridge](../../packages/adapter-utils/src/sandbox-callback-bridge.ts). +The bridge still rejects company activity and company audit routes. -Policy: Same company plus visibility/audit/cost/run permissions where the route requires -them. +Policy: Company activity requires same-company access and `company_scope:read`, +with issue visibility filtering. Issue activity requires same-company resource +access and `issue:read` for the resolved issue. The sandbox transport does not +replace those controller checks or permit activity writes. -Evidence: `source-only` — [implementation](../../server/src/routes/activity.ts#L224) at -the reviewed commit above. +Evidence: `source-only` — [activity routes](../../server/src/routes/activity.ts), +[agent authorization tests](../../server/src/__tests__/activity-routes.test.ts), +and [bridge tests](../../packages/adapter-utils/src/sandbox-callback-bridge.test.ts). +Issue activity transport reviewed at `89770ba707fb1ebd4cabd184eec2e7fee226e0c3`; +other operations retain the baseline source review above. -Verification: `not-run` — exercise a listed permitted operation with actual agent -credentials/run context; inspect its result and applicable persistence/attribution. -Assert the relevant denied actor, owner, company or mode from Policy. Review the -remaining operations before qualifying the whole capability. +Verification: `not-run` — no live agent-credential proof. Local route and bridge +regressions pass: permitted agent issue read, denied company/resource scope, +denied writes, extra path segments, and company audit routes. With a real +sandbox agent, read an authorized issue's activity, then verify denial for an +inaccessible issue, another company, and company-wide audit. -Gaps: Audit export and raw activity creation have extra restrictions; do not equate them -with activity reading. +Gaps: Audit export and raw activity creation have extra restrictions; do not +equate them with issue activity reading. Live sandbox access remains unverified. ## `runs` diff --git a/maps/agent-access-map/inbox-search.md b/maps/agent-access-map/inbox-search.md index 2c079231dd9..84ada459d12 100644 --- a/maps/agent-access-map/inbox-search.md +++ b/maps/agent-access-map/inbox-search.md @@ -22,15 +22,24 @@ API: `present` — representative operation IDs: Agent access: `partial` — REST / native call_api; MCP inbox/task search. Policy: Own agent context; responsible-user inbox policy and explicit opt-in/grants for -cross-user archive; decision policy separately. +cross-user archive; decision policy separately. Automatic read cleanup does not +count as user participation, including historical reader-attributed rows. +Explicit user recovery decisions still count. Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L3952) at -the reviewed commit above. +the reviewed commit above. The cleanup exclusion in +[issue queries](../../server/src/services/issues.ts) was reviewed at +`89770ba707fb1ebd4cabd184eec2e7fee226e0c3`. +[Issue service regressions](../../server/src/__tests__/issues-service.test.ts) +cover membership, unread counts, timestamps, and retained audit rows. Verification: `not-run` — exercise a listed permitted operation with actual agent credentials/run context; inspect its result and applicable persistence/attribution. Assert the relevant denied actor, owner, company or mode from Policy. Review the -remaining operations before qualifying the whole capability. +remaining operations before qualifying the whole capability. Seed a completed +issue with only automatic read cleanup under a user identity: Mine and Unread +must exclude it while activity history retains the row. An explicit recovery +decision must still establish participation. No live user-inbox proof is claimed. Gaps: Agent inbox and Mine support exist; board attention/unread/dismissal aggregation is a separate user-only surface. diff --git a/maps/agent-access-map/recovery.md b/maps/agent-access-map/recovery.md index a6a12a3f1c0..db98fb8ef76 100644 --- a/maps/agent-access-map/recovery.md +++ b/maps/agent-access-map/recovery.md @@ -64,20 +64,30 @@ Review: `baseline`. API: `present` — representative operation IDs: +- `GET /api/issues/{id}/recovery-actions`. - `POST /api/issues/{id}/recovery-actions/resolve`. Agent access: `partial` — Eligible agent REST / CLI; source-bound recovery state. Policy: Task/run visibility, run ownership and source/action policy; workspace export -retry and some operator controls require board. +retry and some operator controls require board. Completion or cancellation of a +task does not clear its exact unresolved native workspace owner hold. Physical +owner release still requires the [operator stop-verification procedure](../../doc/native-workspace-finalization-recovery.md). Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at -the reviewed commit above. +the reviewed commit above. Exact owner hold retention in the +[recovery state helper](../../server/src/services/native-runtime/native-workspace-finalization-recovery-state.ts) +was reviewed at `89770ba707fb1ebd4cabd184eec2e7fee226e0c3`. Verification: `not-run` — exercise a listed permitted operation with actual agent credentials/run context; inspect its result and applicable persistence/attribution. Assert the relevant denied actor, owner, company or mode from Policy. Review the -remaining operations before qualifying the whole capability. +remaining operations before qualifying the whole capability. Local +[recovery route regressions](../../server/src/__tests__/issue-recovery-actions.test.ts) +verify one unchanged hold across reads and sweeps on done/cancelled tasks, no +physical copyback, and cleanup after the receipt is cleared. Exercise this +sequence in a disposable instance; automatic cleanup must use the system actor +and must not create reader participation. No live recovery proof is claimed. Gaps: Need operation-level eligibility and a real native binding for permitted recovery actions; do not route around lifecycle authority. diff --git a/maps/feature-map/activity.md b/maps/feature-map/activity.md index 0a80901ddfa..49f9489906f 100644 --- a/maps/feature-map/activity.md +++ b/maps/feature-map/activity.md @@ -40,6 +40,12 @@ Automated: [activity service](../../server/src/__tests__/activity-service.test.t Manual: Find a known mutation by actor/resource and a known run by status. Change filters, load more, and follow the source links. Reload the chosen view and verify no company leakage or duplicate events. Inspect a routine run from its audit entry. +Issue activity is also available through `GET /api/issues/{id}/activity`. +[Agent authorization](../../server/src/__tests__/activity-routes.test.ts) and +[sandbox bridge](../../packages/adapter-utils/src/sandbox-callback-bridge.test.ts) +regressions cover this route separately from company-wide audit. Live sandbox +agent access remains unverified; use the companion recipe. + Audit-event Load more and run listings differ: Runs currently loads at most 200 entries without pagination. The tested RoutineAuditActivity component has no registered activity-route host; inspect execution links actually offered by diff --git a/maps/feature-map/inbox-search.md b/maps/feature-map/inbox-search.md index ac3570b5c38..14df9295962 100644 --- a/maps/feature-map/inbox-search.md +++ b/maps/feature-map/inbox-search.md @@ -35,8 +35,19 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Seed Automated: [archive routes](../../server/src/__tests__/inbox-archive-routes.test.ts) cover server mutations. [Task-list helpers](../../ui/src/pages/Issues.test.tsx) cover search URLs, pagination, and presentation constants; they do not render the combined Inbox/Tasks page. Reading, archiving, and navigating that page remain manual checks. +Automated: [Issue service regressions](../../server/src/__tests__/issues-service.test.ts) +cover exclusion of historical automatic read cleanup from user participation, +unread counts, and activity timestamps while retaining explicit user decisions +and audit history. + Manual: Read an unread task, return to Unread, archive a handled item, and reload. Verify personal triage state changes while task status stays correct. Switch users and companies to check isolation. +Seed a completed task whose only activity under the viewing user is automatic +read cleanup. Refresh Mine and Unread: the task must not appear through that +participation, while the cleanup remains in activity history. Record an explicit +user recovery decision on a separate task and verify it still counts. This +browser journey remains manual. + ### `decisions` Automated: [decision queues](../../server/src/__tests__/decision-queues-routes.test.ts) covers route behavior. End-to-end queue-to-source navigation is manual. diff --git a/maps/feature-map/recovery.md b/maps/feature-map/recovery.md index 0236b1e4dec..3cd71abaffc 100644 --- a/maps/feature-map/recovery.md +++ b/maps/feature-map/recovery.md @@ -90,6 +90,14 @@ the supported recovery until the source task produces a useful result or a specific escalation. Reload and verify that resolved notices retire and attempt history remains. A fixture pass does not qualify every live harness/provider. +For a native workspace owner hold, repeat issue reads and recovery checks after +the task becomes done or cancelled. Verify one unchanged action ID, attempt +count, and timestamps; task completion must not authorize copyback. Clear only +the exact receipt after operator stop verification, then confirm stale action +cleanup. The [route regressions](../../server/src/__tests__/issue-recovery-actions.test.ts) +and [heartbeat regression](../../server/src/__tests__/heartbeat-process-recovery.test.ts) +cover this sequence without a live operator recovery claim. + ### `run-detail` Automated: [run workspace recovery](../../ui/src/components/RunWorkspaceRecoverySurface.test.tsx) diff --git a/packages/adapter-utils/src/sandbox-callback-bridge.test.ts b/packages/adapter-utils/src/sandbox-callback-bridge.test.ts index c81f162ea32..e7e639bd0a8 100644 --- a/packages/adapter-utils/src/sandbox-callback-bridge.test.ts +++ b/packages/adapter-utils/src/sandbox-callback-bridge.test.ts @@ -1500,6 +1500,7 @@ describe("sandbox callback bridge", () => { { method: "GET", path: "/api/goals/goal-1" }, { method: "GET", path: "/api/issues/issue-1" }, { method: "GET", path: "/api/issues/issue-1/heartbeat-context" }, + { method: "GET", path: "/api/issues/issue-1/activity" }, { method: "GET", path: "/api/issues/issue-1/comments" }, { method: "GET", path: "/api/issues/issue-1/comments/c-1" }, { method: "POST", path: "/api/issues/issue-1/comments" }, @@ -1546,6 +1547,10 @@ describe("sandbox callback bridge", () => { } const denied: Array<{ method: string; path: string }> = [ + { method: "POST", path: "/api/issues/issue-1/activity" }, + { method: "GET", path: "/api/issues/issue-1/activity/extra" }, + { method: "GET", path: "/api/companies/co-1/activity" }, + { method: "GET", path: "/api/companies/co-1/audit/agent-actions" }, { method: "GET", path: "/api/companies/co-1/agent-commentary" }, { method: "POST", path: "/api/companies/co-1/agent-commentary/other" }, { method: "POST", path: "/api/companies/co-1/email/inboxes" }, diff --git a/packages/adapter-utils/src/sandbox-callback-bridge.ts b/packages/adapter-utils/src/sandbox-callback-bridge.ts index 64bf04a3940..6a392f51842 100644 --- a/packages/adapter-utils/src/sandbox-callback-bridge.ts +++ b/packages/adapter-utils/src/sandbox-callback-bridge.ts @@ -162,6 +162,8 @@ export const DEFAULT_SANDBOX_CALLBACK_BRIDGE_ROUTE_ALLOWLIST: readonly SandboxCa // Issue lifecycle: read context, checkout, update, comment, document, release { method: "GET", path: /^\/api\/issues\/[^/]+$/ }, { method: "GET", path: /^\/api\/issues\/[^/]+\/heartbeat-context$/ }, + // The controller still checks company membership and issue read authority. + { method: "GET", path: /^\/api\/issues\/[^/]+\/activity$/ }, { method: "GET", path: /^\/api\/issues\/[^/]+\/comments(?:\/[^/]+)?$/ }, { method: "POST", path: /^\/api\/issues\/[^/]+\/comments$/ }, { method: "GET", path: /^\/api\/issues\/[^/]+\/documents(?:\/[^/]+)?$/ }, diff --git a/packages/paperclip-runner/docs/capability-contract.md b/packages/paperclip-runner/docs/capability-contract.md index ba41e93259b..1f71df88072 100644 --- a/packages/paperclip-runner/docs/capability-contract.md +++ b/packages/paperclip-runner/docs/capability-contract.md @@ -47,104 +47,104 @@ The skill/reference inventory and eval cases are the only normative behavior sou | skill:skills/paperclip/SKILL.md:conversation-tasks:32 | optional_agent_tool | skills/paperclip/SKILL.md:32 | | skill:skills/paperclip/SKILL.md:server-verified-external-chat-turns:49 | control_plane_owned | skills/paperclip/SKILL.md:49 | | skill:skills/paperclip/SKILL.md:the-heartbeat-procedure:89 | optional_agent_tool | skills/paperclip/SKILL.md:89 | -| skill:skills/paperclip/SKILL.md:generated-artifacts-and-work-products:198 | always_agent_tool | skills/paperclip/SKILL.md:198 | -| skill:skills/paperclip/SKILL.md:status-quick-guide:246 | control_plane_owned | skills/paperclip/SKILL.md:246 | -| skill:skills/paperclip/SKILL.md:monitors-and-watchers-say-only-what-you-actually-scheduled:256 | optional_agent_tool | skills/paperclip/SKILL.md:256 | -| skill:skills/paperclip/SKILL.md:delegating-review-tasks:269 | always_agent_tool | skills/paperclip/SKILL.md:269 | -| skill:skills/paperclip/SKILL.md:managing-a-user-s-inbox:280 | control_plane_owned | skills/paperclip/SKILL.md:280 | -| skill:skills/paperclip/SKILL.md:issue-dependencies-blockers:288 | control_plane_owned | skills/paperclip/SKILL.md:288 | -| skill:skills/paperclip/SKILL.md:requesting-board-approval:313 | optional_agent_tool | skills/paperclip/SKILL.md:313 | -| skill:skills/paperclip/SKILL.md:issue-thread-interactions:334 | optional_agent_tool | skills/paperclip/SKILL.md:334 | -| skill:skills/paperclip/SKILL.md:standalone-decisions:364 | optional_agent_tool | skills/paperclip/SKILL.md:364 | -| skill:skills/paperclip/SKILL.md:mcp-tool-approval-gates:468 | optional_agent_tool | skills/paperclip/SKILL.md:468 | -| skill:skills/paperclip/SKILL.md:niche-workflow-pointers:510 | optional_agent_tool | skills/paperclip/SKILL.md:510 | -| skill:skills/paperclip/SKILL.md:cases:520 | optional_agent_tool | skills/paperclip/SKILL.md:520 | -| skill:skills/paperclip/SKILL.md:company-skills-workflow:525 | optional_agent_tool | skills/paperclip/SKILL.md:525 | -| skill:skills/paperclip/SKILL.md:routines:536 | optional_agent_tool | skills/paperclip/SKILL.md:536 | -| skill:skills/paperclip/SKILL.md:task-files-and-workspace-choices:547 | optional_agent_tool | skills/paperclip/SKILL.md:547 | -| skill:skills/paperclip/SKILL.md:issue-workspace-runtime-controls:553 | optional_agent_tool | skills/paperclip/SKILL.md:553 | -| skill:skills/paperclip/SKILL.md:proposing-credentials-safely:560 | optional_agent_tool | skills/paperclip/SKILL.md:560 | -| skill:skills/paperclip/SKILL.md:reading-granted-secrets:567 | optional_agent_tool | skills/paperclip/SKILL.md:567 | -| skill:skills/paperclip/SKILL.md:critical-rules:593 | optional_agent_tool | skills/paperclip/SKILL.md:593 | -| skill:skills/paperclip/SKILL.md:comment-style-required:614 | always_agent_tool | skills/paperclip/SKILL.md:614 | -| skill:skills/paperclip/SKILL.md:update:646 | optional_agent_tool | skills/paperclip/SKILL.md:646 | -| skill:skills/paperclip/SKILL.md:task-documents-and-deliverables:656 | always_agent_tool | skills/paperclip/SKILL.md:656 | -| skill:skills/paperclip/SKILL.md:planning-required-when-planning-requested:670 | optional_agent_tool | skills/paperclip/SKILL.md:670 | -| skill:skills/paperclip/SKILL.md:key-endpoints-hot-routes:701 | optional_agent_tool | skills/paperclip/SKILL.md:701 | -| skill:skills/paperclip/SKILL.md:searching-issues:730 | optional_agent_tool | skills/paperclip/SKILL.md:730 | -| skill:skills/paperclip/SKILL.md:full-reference:740 | optional_agent_tool | skills/paperclip/SKILL.md:740 | -| skill:skills/paperclip/SKILL.md:conversational-confirmation-answers:744 | always_agent_tool | skills/paperclip/SKILL.md:744 | -| skill:skills/paperclip/SKILL.md:incidental-feedback:761 | optional_agent_tool | skills/paperclip/SKILL.md:761 | +| skill:skills/paperclip/SKILL.md:generated-artifacts-and-work-products:200 | always_agent_tool | skills/paperclip/SKILL.md:200 | +| skill:skills/paperclip/SKILL.md:status-quick-guide:248 | control_plane_owned | skills/paperclip/SKILL.md:248 | +| skill:skills/paperclip/SKILL.md:monitors-and-watchers-say-only-what-you-actually-scheduled:258 | optional_agent_tool | skills/paperclip/SKILL.md:258 | +| skill:skills/paperclip/SKILL.md:delegating-review-tasks:271 | always_agent_tool | skills/paperclip/SKILL.md:271 | +| skill:skills/paperclip/SKILL.md:managing-a-user-s-inbox:282 | control_plane_owned | skills/paperclip/SKILL.md:282 | +| skill:skills/paperclip/SKILL.md:issue-dependencies-blockers:290 | control_plane_owned | skills/paperclip/SKILL.md:290 | +| skill:skills/paperclip/SKILL.md:requesting-board-approval:315 | optional_agent_tool | skills/paperclip/SKILL.md:315 | +| skill:skills/paperclip/SKILL.md:issue-thread-interactions:336 | optional_agent_tool | skills/paperclip/SKILL.md:336 | +| skill:skills/paperclip/SKILL.md:standalone-decisions:366 | optional_agent_tool | skills/paperclip/SKILL.md:366 | +| skill:skills/paperclip/SKILL.md:mcp-tool-approval-gates:470 | optional_agent_tool | skills/paperclip/SKILL.md:470 | +| skill:skills/paperclip/SKILL.md:niche-workflow-pointers:512 | optional_agent_tool | skills/paperclip/SKILL.md:512 | +| skill:skills/paperclip/SKILL.md:cases:522 | optional_agent_tool | skills/paperclip/SKILL.md:522 | +| skill:skills/paperclip/SKILL.md:company-skills-workflow:527 | optional_agent_tool | skills/paperclip/SKILL.md:527 | +| skill:skills/paperclip/SKILL.md:routines:538 | optional_agent_tool | skills/paperclip/SKILL.md:538 | +| skill:skills/paperclip/SKILL.md:task-files-and-workspace-choices:549 | optional_agent_tool | skills/paperclip/SKILL.md:549 | +| skill:skills/paperclip/SKILL.md:issue-workspace-runtime-controls:555 | optional_agent_tool | skills/paperclip/SKILL.md:555 | +| skill:skills/paperclip/SKILL.md:proposing-credentials-safely:562 | optional_agent_tool | skills/paperclip/SKILL.md:562 | +| skill:skills/paperclip/SKILL.md:reading-granted-secrets:569 | optional_agent_tool | skills/paperclip/SKILL.md:569 | +| skill:skills/paperclip/SKILL.md:critical-rules:595 | optional_agent_tool | skills/paperclip/SKILL.md:595 | +| skill:skills/paperclip/SKILL.md:comment-style-required:616 | always_agent_tool | skills/paperclip/SKILL.md:616 | +| skill:skills/paperclip/SKILL.md:update:648 | optional_agent_tool | skills/paperclip/SKILL.md:648 | +| skill:skills/paperclip/SKILL.md:task-documents-and-deliverables:658 | always_agent_tool | skills/paperclip/SKILL.md:658 | +| skill:skills/paperclip/SKILL.md:planning-required-when-planning-requested:672 | optional_agent_tool | skills/paperclip/SKILL.md:672 | +| skill:skills/paperclip/SKILL.md:key-endpoints-hot-routes:703 | optional_agent_tool | skills/paperclip/SKILL.md:703 | +| skill:skills/paperclip/SKILL.md:searching-issues:733 | optional_agent_tool | skills/paperclip/SKILL.md:733 | +| skill:skills/paperclip/SKILL.md:full-reference:743 | optional_agent_tool | skills/paperclip/SKILL.md:743 | +| skill:skills/paperclip/SKILL.md:conversational-confirmation-answers:747 | always_agent_tool | skills/paperclip/SKILL.md:747 | +| skill:skills/paperclip/SKILL.md:incidental-feedback:764 | optional_agent_tool | skills/paperclip/SKILL.md:764 | | skill:skills/paperclip/references/api-reference.md:paperclip-api-reference:1 | optional_agent_tool | skills/paperclip/references/api-reference.md:1 | | skill:skills/paperclip/references/api-reference.md:response-schemas:9 | optional_agent_tool | skills/paperclip/references/api-reference.md:9 | | skill:skills/paperclip/references/api-reference.md:agent-record-get-api-agents-me-or-get-api-agents-agentid:11 | optional_agent_tool | skills/paperclip/references/api-reference.md:11 | | skill:skills/paperclip/references/api-reference.md:company-portability:44 | optional_agent_tool | skills/paperclip/references/api-reference.md:44 | -| skill:skills/paperclip/references/api-reference.md:issue-with-ancestors-get-api-issues-issueid:110 | optional_agent_tool | skills/paperclip/references/api-reference.md:110 | -| skill:skills/paperclip/references/api-reference.md:issue-update-response-patch-api-issues-issueid:196 | optional_agent_tool | skills/paperclip/references/api-reference.md:196 | -| skill:skills/paperclip/references/api-reference.md:blocker-diagnostics-get-api-issues-issueid-diagnostics-blockers:238 | control_plane_owned | skills/paperclip/references/api-reference.md:238 | -| skill:skills/paperclip/references/api-reference.md:wake-diagnostics-get-api-issues-issueid-diagnostics-wakes:277 | control_plane_owned | skills/paperclip/references/api-reference.md:277 | -| skill:skills/paperclip/references/api-reference.md:subtree-diagnostics-get-api-issues-issueid-diagnostics-subtree:321 | optional_agent_tool | skills/paperclip/references/api-reference.md:321 | -| skill:skills/paperclip/references/api-reference.md:execution-policy-fields-on-an-issue:369 | optional_agent_tool | skills/paperclip/references/api-reference.md:369 | -| skill:skills/paperclip/references/api-reference.md:cross-agent-review-gates:421 | always_agent_tool | skills/paperclip/references/api-reference.md:421 | -| skill:skills/paperclip/references/api-reference.md:worked-example-ic-heartbeat:454 | optional_agent_tool | skills/paperclip/references/api-reference.md:454 | -| skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:459 | control_plane_owned | skills/paperclip/references/api-reference.md:459 | -| skill:skills/paperclip/references/api-reference.md:2-check-inbox:463 | control_plane_owned | skills/paperclip/references/api-reference.md:463 | -| skill:skills/paperclip/references/api-reference.md:3-already-have-issue-101-inprogress-highest-priority-continue-it:470 | optional_agent_tool | skills/paperclip/references/api-reference.md:470 | -| skill:skills/paperclip/references/api-reference.md:4-do-the-actual-work-write-code-run-tests:477 | optional_agent_tool | skills/paperclip/references/api-reference.md:477 | -| skill:skills/paperclip/references/api-reference.md:5-work-is-done-update-status-and-comment-in-one-call:479 | always_agent_tool | skills/paperclip/references/api-reference.md:479 | -| skill:skills/paperclip/references/api-reference.md:6-still-have-time-checkout-the-next-task:483 | control_plane_owned | skills/paperclip/references/api-reference.md:483 | -| skill:skills/paperclip/references/api-reference.md:7-made-partial-progress-not-done-yet-comment-and-exit:490 | always_agent_tool | skills/paperclip/references/api-reference.md:490 | -| skill:skills/paperclip/references/api-reference.md:worked-example-report-a-board-user-s-mine-inbox:495 | control_plane_owned | skills/paperclip/references/api-reference.md:495 | -| skill:skills/paperclip/references/api-reference.md:board-user-created-the-requesting-issue:500 | optional_agent_tool | skills/paperclip/references/api-reference.md:500 | -| skill:skills/paperclip/references/api-reference.md:fetch-the-board-user-s-mine-inbox-issues:504 | control_plane_owned | skills/paperclip/references/api-reference.md:504 | -| skill:skills/paperclip/references/api-reference.md:summarize-it-back-to-the-board-in-a-comment-or-document:518 | always_agent_tool | skills/paperclip/references/api-reference.md:518 | -| skill:skills/paperclip/references/api-reference.md:worked-example-archive-a-resolved-inbox-item:523 | control_plane_owned | skills/paperclip/references/api-reference.md:523 | -| skill:skills/paperclip/references/api-reference.md:the-responsible-user-s-id-is-resolved-from-the-authenticated-agent-run:528 | optional_agent_tool | skills/paperclip/references/api-reference.md:528 | -| skill:skills/paperclip/references/api-reference.md:reverse-the-archive-if-it-was-premature-or-no-longer-desired:537 | optional_agent_tool | skills/paperclip/references/api-reference.md:537 | -| skill:skills/paperclip/references/api-reference.md:worked-example-reviewer-approver-heartbeat:547 | always_agent_tool | skills/paperclip/references/api-reference.md:547 | -| skill:skills/paperclip/references/api-reference.md:worked-example-manager-heartbeat:586 | optional_agent_tool | skills/paperclip/references/api-reference.md:586 | -| skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:589 | control_plane_owned | skills/paperclip/references/api-reference.md:589 | -| skill:skills/paperclip/references/api-reference.md:2-check-team-status:593 | optional_agent_tool | skills/paperclip/references/api-reference.md:593 | -| skill:skills/paperclip/references/api-reference.md:3-agent-42-is-blocked-read-comments:600 | control_plane_owned | skills/paperclip/references/api-reference.md:600 | -| skill:skills/paperclip/references/api-reference.md:4-unblock-reassign-and-comment:604 | control_plane_owned | skills/paperclip/references/api-reference.md:604 | -| skill:skills/paperclip/references/api-reference.md:5-check-own-assignments:608 | optional_agent_tool | skills/paperclip/references/api-reference.md:608 | -| skill:skills/paperclip/references/api-reference.md:6-create-subtasks-and-delegate:615 | optional_agent_tool | skills/paperclip/references/api-reference.md:615 | -| skill:skills/paperclip/references/api-reference.md:load-tests-depend-on-caching-layer-being-done-first-paperclip-will-auto-wake-agent-55-when-the-blocker-resolves:621 | control_plane_owned | skills/paperclip/references/api-reference.md:621 | -| skill:skills/paperclip/references/api-reference.md:7-dashboard-for-health-check:626 | optional_agent_tool | skills/paperclip/references/api-reference.md:626 | -| skill:skills/paperclip/references/api-reference.md:comments-and-mentions:632 | always_agent_tool | skills/paperclip/references/api-reference.md:632 | -| skill:skills/paperclip/references/api-reference.md:update:639 | optional_agent_tool | skills/paperclip/references/api-reference.md:639 | -| skill:skills/paperclip/references/api-reference.md:cross-team-work-and-delegation:661 | optional_agent_tool | skills/paperclip/references/api-reference.md:661 | -| skill:skills/paperclip/references/api-reference.md:receiving-cross-team-work:665 | optional_agent_tool | skills/paperclip/references/api-reference.md:665 | -| skill:skills/paperclip/references/api-reference.md:questions-and-dependencies:675 | always_agent_tool | skills/paperclip/references/api-reference.md:675 | -| skill:skills/paperclip/references/api-reference.md:company-context:687 | optional_agent_tool | skills/paperclip/references/api-reference.md:687 | -| skill:skills/paperclip/references/api-reference.md:company-branding-ceo-board:699 | optional_agent_tool | skills/paperclip/references/api-reference.md:699 | -| skill:skills/paperclip/references/api-reference.md:openclaw-invite-prompt-ceo:719 | optional_agent_tool | skills/paperclip/references/api-reference.md:719 | -| skill:skills/paperclip/references/api-reference.md:setting-agent-instructions-path:738 | optional_agent_tool | skills/paperclip/references/api-reference.md:738 | -| skill:skills/paperclip/references/api-reference.md:project-setup-create-workspace:771 | optional_agent_tool | skills/paperclip/references/api-reference.md:771 | -| skill:skills/paperclip/references/api-reference.md:option-a-one-call-create-with-workspace:795 | optional_agent_tool | skills/paperclip/references/api-reference.md:795 | -| skill:skills/paperclip/references/api-reference.md:option-b-two-calls-project-first-then-workspace:814 | optional_agent_tool | skills/paperclip/references/api-reference.md:814 | -| skill:skills/paperclip/references/api-reference.md:governance-and-approvals:843 | optional_agent_tool | skills/paperclip/references/api-reference.md:843 | -| skill:skills/paperclip/references/api-reference.md:requesting-a-hire-management-only:847 | optional_agent_tool | skills/paperclip/references/api-reference.md:847 | -| skill:skills/paperclip/references/api-reference.md:ceo-strategy-approval:912 | optional_agent_tool | skills/paperclip/references/api-reference.md:912 | -| skill:skills/paperclip/references/api-reference.md:questions-and-waiting-for-human-input:921 | always_agent_tool | skills/paperclip/references/api-reference.md:921 | -| skill:skills/paperclip/references/api-reference.md:issue-thread-confirmations:1025 | always_agent_tool | skills/paperclip/references/api-reference.md:1025 | -| skill:skills/paperclip/references/api-reference.md:conversational-confirmation-answers:1083 | always_agent_tool | skills/paperclip/references/api-reference.md:1083 | -| skill:skills/paperclip/references/api-reference.md:checkbox-confirmations:1089 | always_agent_tool | skills/paperclip/references/api-reference.md:1089 | -| skill:skills/paperclip/references/api-reference.md:item-verdict-requests:1204 | optional_agent_tool | skills/paperclip/references/api-reference.md:1204 | -| skill:skills/paperclip/references/api-reference.md:checking-approval-status:1314 | optional_agent_tool | skills/paperclip/references/api-reference.md:1314 | -| skill:skills/paperclip/references/api-reference.md:approval-follow-up-requesting-agent:1320 | always_agent_tool | skills/paperclip/references/api-reference.md:1320 | -| skill:skills/paperclip/references/api-reference.md:issue-lifecycle:1338 | always_agent_tool | skills/paperclip/references/api-reference.md:1338 | -| skill:skills/paperclip/references/api-reference.md:error-handling:1368 | control_plane_owned | skills/paperclip/references/api-reference.md:1368 | -| skill:skills/paperclip/references/api-reference.md:full-api-reference:1382 | optional_agent_tool | skills/paperclip/references/api-reference.md:1382 | -| skill:skills/paperclip/references/api-reference.md:agents:1384 | optional_agent_tool | skills/paperclip/references/api-reference.md:1384 | -| skill:skills/paperclip/references/api-reference.md:issues-tasks:1405 | optional_agent_tool | skills/paperclip/references/api-reference.md:1405 | -| skill:skills/paperclip/references/api-reference.md:companies-projects-goals:1446 | optional_agent_tool | skills/paperclip/references/api-reference.md:1446 | -| skill:skills/paperclip/references/api-reference.md:routines:1470 | optional_agent_tool | skills/paperclip/references/api-reference.md:1470 | -| skill:skills/paperclip/references/api-reference.md:approvals-costs-activity-dashboard:1486 | optional_agent_tool | skills/paperclip/references/api-reference.md:1486 | -| skill:skills/paperclip/references/api-reference.md:secrets:1508 | optional_agent_tool | skills/paperclip/references/api-reference.md:1508 | -| skill:skills/paperclip/references/api-reference.md:agent-secret-proposals:1521 | optional_agent_tool | skills/paperclip/references/api-reference.md:1521 | -| skill:skills/paperclip/references/api-reference.md:agent-secret-access:1621 | optional_agent_tool | skills/paperclip/references/api-reference.md:1621 | -| skill:skills/paperclip/references/api-reference.md:common-mistakes:1661 | optional_agent_tool | skills/paperclip/references/api-reference.md:1661 | +| skill:skills/paperclip/references/api-reference.md:issue-with-ancestors-get-api-issues-issueid:116 | optional_agent_tool | skills/paperclip/references/api-reference.md:116 | +| skill:skills/paperclip/references/api-reference.md:issue-update-response-patch-api-issues-issueid:202 | optional_agent_tool | skills/paperclip/references/api-reference.md:202 | +| skill:skills/paperclip/references/api-reference.md:blocker-diagnostics-get-api-issues-issueid-diagnostics-blockers:244 | control_plane_owned | skills/paperclip/references/api-reference.md:244 | +| skill:skills/paperclip/references/api-reference.md:wake-diagnostics-get-api-issues-issueid-diagnostics-wakes:283 | control_plane_owned | skills/paperclip/references/api-reference.md:283 | +| skill:skills/paperclip/references/api-reference.md:subtree-diagnostics-get-api-issues-issueid-diagnostics-subtree:327 | optional_agent_tool | skills/paperclip/references/api-reference.md:327 | +| skill:skills/paperclip/references/api-reference.md:execution-policy-fields-on-an-issue:375 | optional_agent_tool | skills/paperclip/references/api-reference.md:375 | +| skill:skills/paperclip/references/api-reference.md:cross-agent-review-gates:427 | always_agent_tool | skills/paperclip/references/api-reference.md:427 | +| skill:skills/paperclip/references/api-reference.md:worked-example-ic-heartbeat:460 | optional_agent_tool | skills/paperclip/references/api-reference.md:460 | +| skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:465 | control_plane_owned | skills/paperclip/references/api-reference.md:465 | +| skill:skills/paperclip/references/api-reference.md:2-check-inbox:469 | control_plane_owned | skills/paperclip/references/api-reference.md:469 | +| skill:skills/paperclip/references/api-reference.md:3-already-have-issue-101-inprogress-highest-priority-continue-it:476 | optional_agent_tool | skills/paperclip/references/api-reference.md:476 | +| skill:skills/paperclip/references/api-reference.md:4-do-the-actual-work-write-code-run-tests:483 | optional_agent_tool | skills/paperclip/references/api-reference.md:483 | +| skill:skills/paperclip/references/api-reference.md:5-work-is-done-update-status-and-comment-in-one-call:485 | always_agent_tool | skills/paperclip/references/api-reference.md:485 | +| skill:skills/paperclip/references/api-reference.md:6-still-have-time-checkout-the-next-task:489 | control_plane_owned | skills/paperclip/references/api-reference.md:489 | +| skill:skills/paperclip/references/api-reference.md:7-made-partial-progress-not-done-yet-comment-and-exit:496 | always_agent_tool | skills/paperclip/references/api-reference.md:496 | +| skill:skills/paperclip/references/api-reference.md:worked-example-report-a-board-user-s-mine-inbox:501 | control_plane_owned | skills/paperclip/references/api-reference.md:501 | +| skill:skills/paperclip/references/api-reference.md:board-user-created-the-requesting-issue:506 | optional_agent_tool | skills/paperclip/references/api-reference.md:506 | +| skill:skills/paperclip/references/api-reference.md:fetch-the-board-user-s-mine-inbox-issues:510 | control_plane_owned | skills/paperclip/references/api-reference.md:510 | +| skill:skills/paperclip/references/api-reference.md:summarize-it-back-to-the-board-in-a-comment-or-document:524 | always_agent_tool | skills/paperclip/references/api-reference.md:524 | +| skill:skills/paperclip/references/api-reference.md:worked-example-archive-a-resolved-inbox-item:529 | control_plane_owned | skills/paperclip/references/api-reference.md:529 | +| skill:skills/paperclip/references/api-reference.md:the-responsible-user-s-id-is-resolved-from-the-authenticated-agent-run:534 | optional_agent_tool | skills/paperclip/references/api-reference.md:534 | +| skill:skills/paperclip/references/api-reference.md:reverse-the-archive-if-it-was-premature-or-no-longer-desired:543 | optional_agent_tool | skills/paperclip/references/api-reference.md:543 | +| skill:skills/paperclip/references/api-reference.md:worked-example-reviewer-approver-heartbeat:553 | always_agent_tool | skills/paperclip/references/api-reference.md:553 | +| skill:skills/paperclip/references/api-reference.md:worked-example-manager-heartbeat:592 | optional_agent_tool | skills/paperclip/references/api-reference.md:592 | +| skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:595 | control_plane_owned | skills/paperclip/references/api-reference.md:595 | +| skill:skills/paperclip/references/api-reference.md:2-check-team-status:599 | optional_agent_tool | skills/paperclip/references/api-reference.md:599 | +| skill:skills/paperclip/references/api-reference.md:3-agent-42-is-blocked-read-comments:606 | control_plane_owned | skills/paperclip/references/api-reference.md:606 | +| skill:skills/paperclip/references/api-reference.md:4-unblock-reassign-and-comment:610 | control_plane_owned | skills/paperclip/references/api-reference.md:610 | +| skill:skills/paperclip/references/api-reference.md:5-check-own-assignments:614 | optional_agent_tool | skills/paperclip/references/api-reference.md:614 | +| skill:skills/paperclip/references/api-reference.md:6-create-subtasks-and-delegate:621 | optional_agent_tool | skills/paperclip/references/api-reference.md:621 | +| skill:skills/paperclip/references/api-reference.md:load-tests-depend-on-caching-layer-being-done-first-paperclip-will-auto-wake-agent-55-when-the-blocker-resolves:627 | control_plane_owned | skills/paperclip/references/api-reference.md:627 | +| skill:skills/paperclip/references/api-reference.md:7-dashboard-for-health-check:632 | optional_agent_tool | skills/paperclip/references/api-reference.md:632 | +| skill:skills/paperclip/references/api-reference.md:comments-and-mentions:638 | always_agent_tool | skills/paperclip/references/api-reference.md:638 | +| skill:skills/paperclip/references/api-reference.md:update:645 | optional_agent_tool | skills/paperclip/references/api-reference.md:645 | +| skill:skills/paperclip/references/api-reference.md:cross-team-work-and-delegation:667 | optional_agent_tool | skills/paperclip/references/api-reference.md:667 | +| skill:skills/paperclip/references/api-reference.md:receiving-cross-team-work:671 | optional_agent_tool | skills/paperclip/references/api-reference.md:671 | +| skill:skills/paperclip/references/api-reference.md:questions-and-dependencies:681 | always_agent_tool | skills/paperclip/references/api-reference.md:681 | +| skill:skills/paperclip/references/api-reference.md:company-context:693 | optional_agent_tool | skills/paperclip/references/api-reference.md:693 | +| skill:skills/paperclip/references/api-reference.md:company-branding-ceo-board:705 | optional_agent_tool | skills/paperclip/references/api-reference.md:705 | +| skill:skills/paperclip/references/api-reference.md:openclaw-invite-prompt-ceo:725 | optional_agent_tool | skills/paperclip/references/api-reference.md:725 | +| skill:skills/paperclip/references/api-reference.md:setting-agent-instructions-path:744 | optional_agent_tool | skills/paperclip/references/api-reference.md:744 | +| skill:skills/paperclip/references/api-reference.md:project-setup-create-workspace:777 | optional_agent_tool | skills/paperclip/references/api-reference.md:777 | +| skill:skills/paperclip/references/api-reference.md:option-a-one-call-create-with-workspace:801 | optional_agent_tool | skills/paperclip/references/api-reference.md:801 | +| skill:skills/paperclip/references/api-reference.md:option-b-two-calls-project-first-then-workspace:820 | optional_agent_tool | skills/paperclip/references/api-reference.md:820 | +| skill:skills/paperclip/references/api-reference.md:governance-and-approvals:849 | optional_agent_tool | skills/paperclip/references/api-reference.md:849 | +| skill:skills/paperclip/references/api-reference.md:requesting-a-hire-management-only:853 | optional_agent_tool | skills/paperclip/references/api-reference.md:853 | +| skill:skills/paperclip/references/api-reference.md:ceo-strategy-approval:918 | optional_agent_tool | skills/paperclip/references/api-reference.md:918 | +| skill:skills/paperclip/references/api-reference.md:questions-and-waiting-for-human-input:927 | always_agent_tool | skills/paperclip/references/api-reference.md:927 | +| skill:skills/paperclip/references/api-reference.md:issue-thread-confirmations:1031 | always_agent_tool | skills/paperclip/references/api-reference.md:1031 | +| skill:skills/paperclip/references/api-reference.md:conversational-confirmation-answers:1089 | always_agent_tool | skills/paperclip/references/api-reference.md:1089 | +| skill:skills/paperclip/references/api-reference.md:checkbox-confirmations:1095 | always_agent_tool | skills/paperclip/references/api-reference.md:1095 | +| skill:skills/paperclip/references/api-reference.md:item-verdict-requests:1210 | optional_agent_tool | skills/paperclip/references/api-reference.md:1210 | +| skill:skills/paperclip/references/api-reference.md:checking-approval-status:1320 | optional_agent_tool | skills/paperclip/references/api-reference.md:1320 | +| skill:skills/paperclip/references/api-reference.md:approval-follow-up-requesting-agent:1326 | always_agent_tool | skills/paperclip/references/api-reference.md:1326 | +| skill:skills/paperclip/references/api-reference.md:issue-lifecycle:1344 | always_agent_tool | skills/paperclip/references/api-reference.md:1344 | +| skill:skills/paperclip/references/api-reference.md:error-handling:1374 | control_plane_owned | skills/paperclip/references/api-reference.md:1374 | +| skill:skills/paperclip/references/api-reference.md:full-api-reference:1388 | optional_agent_tool | skills/paperclip/references/api-reference.md:1388 | +| skill:skills/paperclip/references/api-reference.md:agents:1390 | optional_agent_tool | skills/paperclip/references/api-reference.md:1390 | +| skill:skills/paperclip/references/api-reference.md:issues-tasks:1411 | optional_agent_tool | skills/paperclip/references/api-reference.md:1411 | +| skill:skills/paperclip/references/api-reference.md:companies-projects-goals:1452 | optional_agent_tool | skills/paperclip/references/api-reference.md:1452 | +| skill:skills/paperclip/references/api-reference.md:routines:1476 | optional_agent_tool | skills/paperclip/references/api-reference.md:1476 | +| skill:skills/paperclip/references/api-reference.md:approvals-costs-activity-dashboard:1492 | optional_agent_tool | skills/paperclip/references/api-reference.md:1492 | +| skill:skills/paperclip/references/api-reference.md:secrets:1514 | optional_agent_tool | skills/paperclip/references/api-reference.md:1514 | +| skill:skills/paperclip/references/api-reference.md:agent-secret-proposals:1527 | optional_agent_tool | skills/paperclip/references/api-reference.md:1527 | +| skill:skills/paperclip/references/api-reference.md:agent-secret-access:1627 | optional_agent_tool | skills/paperclip/references/api-reference.md:1627 | +| skill:skills/paperclip/references/api-reference.md:common-mistakes:1667 | optional_agent_tool | skills/paperclip/references/api-reference.md:1667 | | skill:skills/paperclip/references/artifacts.md:generated-artifacts-and-work-products:1 | always_agent_tool | skills/paperclip/references/artifacts.md:1 | | skill:skills/paperclip/references/artifacts.md:workspace-only-file-references:15 | optional_agent_tool | skills/paperclip/references/artifacts.md:15 | | skill:skills/paperclip/references/cases.md:cases:1 | optional_agent_tool | skills/paperclip/references/cases.md:1 | diff --git a/packages/paperclip-runner/generated/capability/capabilities.yaml b/packages/paperclip-runner/generated/capability/capabilities.yaml index 4c0ccdb432f..8814ba1da39 100644 --- a/packages/paperclip-runner/generated/capability/capabilities.yaml +++ b/packages/paperclip-runner/generated/capability/capabilities.yaml @@ -56,252 +56,252 @@ "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:198", + "id": "skill:skills/paperclip/SKILL.md:200", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L198:generated-artifacts-and-work-products", + "sourceAnchor": "skills/paperclip/SKILL.md#L200:generated-artifacts-and-work-products", "heading": "Generated Artifacts and Work Products", "primaryDisposition": "always_agent_tool", "semanticOperation": "register_deliverable", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:246", + "id": "skill:skills/paperclip/SKILL.md:248", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L246:status-quick-guide", + "sourceAnchor": "skills/paperclip/SKILL.md#L248:status-quick-guide", "heading": "Status Quick Guide", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:256", + "id": "skill:skills/paperclip/SKILL.md:258", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L256:monitors-and-watchers-say-only-what-you-actually-scheduled", + "sourceAnchor": "skills/paperclip/SKILL.md#L258:monitors-and-watchers-say-only-what-you-actually-scheduled", "heading": "Monitors and Watchers (say only what you actually scheduled)", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:269", + "id": "skill:skills/paperclip/SKILL.md:271", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L269:delegating-review-tasks", + "sourceAnchor": "skills/paperclip/SKILL.md#L271:delegating-review-tasks", "heading": "Delegating review tasks", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:280", + "id": "skill:skills/paperclip/SKILL.md:282", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L280:managing-a-user-s-inbox", + "sourceAnchor": "skills/paperclip/SKILL.md#L282:managing-a-user-s-inbox", "heading": "Managing A User's Inbox", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:288", + "id": "skill:skills/paperclip/SKILL.md:290", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L288:issue-dependencies-blockers", + "sourceAnchor": "skills/paperclip/SKILL.md#L290:issue-dependencies-blockers", "heading": "Issue Dependencies (Blockers)", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:313", + "id": "skill:skills/paperclip/SKILL.md:315", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L313:requesting-board-approval", + "sourceAnchor": "skills/paperclip/SKILL.md#L315:requesting-board-approval", "heading": "Requesting Board Approval", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:334", + "id": "skill:skills/paperclip/SKILL.md:336", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L334:issue-thread-interactions", + "sourceAnchor": "skills/paperclip/SKILL.md#L336:issue-thread-interactions", "heading": "Issue-Thread Interactions", "primaryDisposition": "always_agent_tool", "semanticOperation": "request_human_input", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:364", + "id": "skill:skills/paperclip/SKILL.md:366", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L364:standalone-decisions", + "sourceAnchor": "skills/paperclip/SKILL.md#L366:standalone-decisions", "heading": "Standalone Decisions", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:468", + "id": "skill:skills/paperclip/SKILL.md:470", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L468:mcp-tool-approval-gates", + "sourceAnchor": "skills/paperclip/SKILL.md#L470:mcp-tool-approval-gates", "heading": "MCP Tool Approval Gates", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:510", + "id": "skill:skills/paperclip/SKILL.md:512", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L510:niche-workflow-pointers", + "sourceAnchor": "skills/paperclip/SKILL.md#L512:niche-workflow-pointers", "heading": "Niche Workflow Pointers", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:520", + "id": "skill:skills/paperclip/SKILL.md:522", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L520:cases", + "sourceAnchor": "skills/paperclip/SKILL.md#L522:cases", "heading": "Cases", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:525", + "id": "skill:skills/paperclip/SKILL.md:527", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L525:company-skills-workflow", + "sourceAnchor": "skills/paperclip/SKILL.md#L527:company-skills-workflow", "heading": "Company Skills Workflow", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:536", + "id": "skill:skills/paperclip/SKILL.md:538", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L536:routines", + "sourceAnchor": "skills/paperclip/SKILL.md#L538:routines", "heading": "Routines", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:547", + "id": "skill:skills/paperclip/SKILL.md:549", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L547:task-files-and-workspace-choices", + "sourceAnchor": "skills/paperclip/SKILL.md#L549:task-files-and-workspace-choices", "heading": "Task Files and Workspace Choices", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:553", + "id": "skill:skills/paperclip/SKILL.md:555", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L553:issue-workspace-runtime-controls", + "sourceAnchor": "skills/paperclip/SKILL.md#L555:issue-workspace-runtime-controls", "heading": "Issue Workspace Runtime Controls", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:560", + "id": "skill:skills/paperclip/SKILL.md:562", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L560:proposing-credentials-safely", + "sourceAnchor": "skills/paperclip/SKILL.md#L562:proposing-credentials-safely", "heading": "Proposing Credentials Safely", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:567", + "id": "skill:skills/paperclip/SKILL.md:569", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L567:reading-granted-secrets", + "sourceAnchor": "skills/paperclip/SKILL.md#L569:reading-granted-secrets", "heading": "Reading Granted Secrets", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:593", + "id": "skill:skills/paperclip/SKILL.md:595", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L593:critical-rules", + "sourceAnchor": "skills/paperclip/SKILL.md#L595:critical-rules", "heading": "Critical Rules", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:614", + "id": "skill:skills/paperclip/SKILL.md:616", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L614:comment-style-required", + "sourceAnchor": "skills/paperclip/SKILL.md#L616:comment-style-required", "heading": "Comment Style (Required)", "primaryDisposition": "always_agent_tool", "semanticOperation": "report_progress", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:646", + "id": "skill:skills/paperclip/SKILL.md:648", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L646:update", + "sourceAnchor": "skills/paperclip/SKILL.md#L648:update", "heading": "Update", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:656", + "id": "skill:skills/paperclip/SKILL.md:658", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L656:task-documents-and-deliverables", + "sourceAnchor": "skills/paperclip/SKILL.md#L658:task-documents-and-deliverables", "heading": "Task Documents and Deliverables", "primaryDisposition": "always_agent_tool", "semanticOperation": "write_document", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:670", + "id": "skill:skills/paperclip/SKILL.md:672", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L670:planning-required-when-planning-requested", + "sourceAnchor": "skills/paperclip/SKILL.md#L672:planning-required-when-planning-requested", "heading": "Planning (Required when planning requested)", "primaryDisposition": "always_agent_tool", "semanticOperation": "write_document", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:701", + "id": "skill:skills/paperclip/SKILL.md:703", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L701:key-endpoints-hot-routes", + "sourceAnchor": "skills/paperclip/SKILL.md#L703:key-endpoints-hot-routes", "heading": "Key Endpoints (Hot Routes)", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:730", + "id": "skill:skills/paperclip/SKILL.md:733", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L730:searching-issues", + "sourceAnchor": "skills/paperclip/SKILL.md#L733:searching-issues", "heading": "Searching Issues", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:740", + "id": "skill:skills/paperclip/SKILL.md:743", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L740:full-reference", + "sourceAnchor": "skills/paperclip/SKILL.md#L743:full-reference", "heading": "Full Reference", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/SKILL.md:744", + "id": "skill:skills/paperclip/SKILL.md:747", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L744:conversational-confirmation-answers", + "sourceAnchor": "skills/paperclip/SKILL.md#L747:conversational-confirmation-answers", "heading": "Conversational confirmation answers", "primaryDisposition": "always_agent_tool", "semanticOperation": "call_api", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/SKILL.md:761", + "id": "skill:skills/paperclip/SKILL.md:764", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md#L761:incidental-feedback", + "sourceAnchor": "skills/paperclip/SKILL.md#L764:incidental-feedback", "heading": "Incidental feedback", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", @@ -344,603 +344,603 @@ "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:110", + "id": "skill:skills/paperclip/references/api-reference.md:116", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L110:issue-with-ancestors-get-api-issues-issueid", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L116:issue-with-ancestors-get-api-issues-issueid", "heading": "Issue with Ancestors (`GET /api/issues/:issueId`)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:196", + "id": "skill:skills/paperclip/references/api-reference.md:202", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L196:issue-update-response-patch-api-issues-issueid", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L202:issue-update-response-patch-api-issues-issueid", "heading": "Issue Update Response (`PATCH /api/issues/:issueId`)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:238", + "id": "skill:skills/paperclip/references/api-reference.md:244", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L238:blocker-diagnostics-get-api-issues-issueid-diagnostics-blockers", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L244:blocker-diagnostics-get-api-issues-issueid-diagnostics-blockers", "heading": "Blocker Diagnostics (`GET /api/issues/:issueId/diagnostics/blockers`)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:277", + "id": "skill:skills/paperclip/references/api-reference.md:283", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L277:wake-diagnostics-get-api-issues-issueid-diagnostics-wakes", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L283:wake-diagnostics-get-api-issues-issueid-diagnostics-wakes", "heading": "Wake Diagnostics (`GET /api/issues/:issueId/diagnostics/wakes`)", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:321", + "id": "skill:skills/paperclip/references/api-reference.md:327", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L321:subtree-diagnostics-get-api-issues-issueid-diagnostics-subtree", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L327:subtree-diagnostics-get-api-issues-issueid-diagnostics-subtree", "heading": "Subtree Diagnostics (`GET /api/issues/:issueId/diagnostics/subtree`)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:369", + "id": "skill:skills/paperclip/references/api-reference.md:375", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L369:execution-policy-fields-on-an-issue", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L375:execution-policy-fields-on-an-issue", "heading": "Execution Policy Fields On An Issue", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:421", + "id": "skill:skills/paperclip/references/api-reference.md:427", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L421:cross-agent-review-gates", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L427:cross-agent-review-gates", "heading": "Cross-Agent Review Gates", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:454", + "id": "skill:skills/paperclip/references/api-reference.md:460", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L454:worked-example-ic-heartbeat", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L460:worked-example-ic-heartbeat", "heading": "Worked Example: IC Heartbeat", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:459", + "id": "skill:skills/paperclip/references/api-reference.md:465", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L459:1-identity-skip-if-already-in-context", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L465:1-identity-skip-if-already-in-context", "heading": "1. Identity (skip if already in context)", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:463", + "id": "skill:skills/paperclip/references/api-reference.md:469", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L463:2-check-inbox", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L469:2-check-inbox", "heading": "2. Check inbox", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:470", + "id": "skill:skills/paperclip/references/api-reference.md:476", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L470:3-already-have-issue-101-in-progress-highest-priority-continue-it", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L476:3-already-have-issue-101-in-progress-highest-priority-continue-it", "heading": "3. Already have issue-101 in_progress (highest priority). Continue it.", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:477", + "id": "skill:skills/paperclip/references/api-reference.md:483", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L477:4-do-the-actual-work-write-code-run-tests", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L483:4-do-the-actual-work-write-code-run-tests", "heading": "4. Do the actual work (write code, run tests)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:479", + "id": "skill:skills/paperclip/references/api-reference.md:485", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L479:5-work-is-done-update-status-and-comment-in-one-call", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L485:5-work-is-done-update-status-and-comment-in-one-call", "heading": "5. Work is done. Update status and comment in one call.", "primaryDisposition": "always_agent_tool", "semanticOperation": "report_progress", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:483", + "id": "skill:skills/paperclip/references/api-reference.md:489", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L483:6-still-have-time-checkout-the-next-task", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L489:6-still-have-time-checkout-the-next-task", "heading": "6. Still have time. Checkout the next task.", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:490", + "id": "skill:skills/paperclip/references/api-reference.md:496", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L490:7-made-partial-progress-not-done-yet-comment-and-exit", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L496:7-made-partial-progress-not-done-yet-comment-and-exit", "heading": "7. Made partial progress, not done yet. Comment and exit.", "primaryDisposition": "always_agent_tool", "semanticOperation": "report_progress", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:495", + "id": "skill:skills/paperclip/references/api-reference.md:501", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L495:worked-example-report-a-board-user-s-mine-inbox", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L501:worked-example-report-a-board-user-s-mine-inbox", "heading": "Worked Example: Report A Board User's Mine Inbox", "primaryDisposition": "always_agent_tool", "semanticOperation": "report_progress", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:500", + "id": "skill:skills/paperclip/references/api-reference.md:506", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L500:board-user-created-the-requesting-issue", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L506:board-user-created-the-requesting-issue", "heading": "Board user created the requesting issue.", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:504", + "id": "skill:skills/paperclip/references/api-reference.md:510", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L504:fetch-the-board-user-s-mine-inbox-issues", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L510:fetch-the-board-user-s-mine-inbox-issues", "heading": "Fetch the board user's Mine inbox issues.", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:518", + "id": "skill:skills/paperclip/references/api-reference.md:524", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L518:summarize-it-back-to-the-board-in-a-comment-or-document", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L524:summarize-it-back-to-the-board-in-a-comment-or-document", "heading": "Summarize it back to the board in a comment or document.", "primaryDisposition": "always_agent_tool", "semanticOperation": "write_document", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:523", + "id": "skill:skills/paperclip/references/api-reference.md:529", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L523:worked-example-archive-a-resolved-inbox-item", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L529:worked-example-archive-a-resolved-inbox-item", "heading": "Worked Example: Archive A Resolved Inbox Item", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:528", + "id": "skill:skills/paperclip/references/api-reference.md:534", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L528:the-responsible-user-s-id-is-resolved-from-the-authenticated-agent-run", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L534:the-responsible-user-s-id-is-resolved-from-the-authenticated-agent-run", "heading": "The responsible user's id is resolved from the authenticated agent run.", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:537", + "id": "skill:skills/paperclip/references/api-reference.md:543", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L537:reverse-the-archive-if-it-was-premature-or-no-longer-desired", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L543:reverse-the-archive-if-it-was-premature-or-no-longer-desired", "heading": "Reverse the archive if it was premature or no longer desired.", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:547", + "id": "skill:skills/paperclip/references/api-reference.md:553", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L547:worked-example-reviewer-approver-heartbeat", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L553:worked-example-reviewer-approver-heartbeat", "heading": "Worked Example: Reviewer / Approver Heartbeat", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:586", + "id": "skill:skills/paperclip/references/api-reference.md:592", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L586:worked-example-manager-heartbeat", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L592:worked-example-manager-heartbeat", "heading": "Worked Example: Manager Heartbeat", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:589", + "id": "skill:skills/paperclip/references/api-reference.md:595", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L589:1-identity-skip-if-already-in-context", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L595:1-identity-skip-if-already-in-context", "heading": "1. Identity (skip if already in context)", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:593", + "id": "skill:skills/paperclip/references/api-reference.md:599", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L593:2-check-team-status", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L599:2-check-team-status", "heading": "2. Check team status", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:600", + "id": "skill:skills/paperclip/references/api-reference.md:606", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L600:3-agent-42-is-blocked-read-comments", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L606:3-agent-42-is-blocked-read-comments", "heading": "3. Agent-42 is blocked. Read comments.", "primaryDisposition": "always_agent_tool", "semanticOperation": "report_progress", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:604", + "id": "skill:skills/paperclip/references/api-reference.md:610", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L604:4-unblock-reassign-and-comment", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L610:4-unblock-reassign-and-comment", "heading": "4. Unblock: reassign and comment.", "primaryDisposition": "always_agent_tool", "semanticOperation": "report_progress", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:608", + "id": "skill:skills/paperclip/references/api-reference.md:614", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L608:5-check-own-assignments", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L614:5-check-own-assignments", "heading": "5. Check own assignments.", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, - { - "id": "skill:skills/paperclip/references/api-reference.md:615", - "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L615:6-create-subtasks-and-delegate", - "heading": "6. Create subtasks and delegate.", - "primaryDisposition": "optional_agent_tool", - "semanticOperation": "scoped_discovery", - "expectedMockState": "operation_result" - }, { "id": "skill:skills/paperclip/references/api-reference.md:621", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L621:load-tests-depend-on-caching-layer-being-done-first-paperclip-will-auto-wake-agent-55-when-the-blocker-resolves", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L621:6-create-subtasks-and-delegate", + "heading": "6. Create subtasks and delegate.", + "primaryDisposition": "optional_agent_tool", + "semanticOperation": "scoped_discovery", + "expectedMockState": "operation_result" + }, + { + "id": "skill:skills/paperclip/references/api-reference.md:627", + "kind": "skill_heading", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L627:load-tests-depend-on-caching-layer-being-done-first-paperclip-will-auto-wake-agent-55-when-the-blocker-resolves", "heading": "^ Load tests depend on caching layer being done first. Paperclip will auto-wake agent-55 when the blocker resolves.", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:626", + "id": "skill:skills/paperclip/references/api-reference.md:632", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L626:7-dashboard-for-health-check", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L632:7-dashboard-for-health-check", "heading": "7. Dashboard for health check.", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:632", + "id": "skill:skills/paperclip/references/api-reference.md:638", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L632:comments-and-mentions", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L638:comments-and-mentions", "heading": "Comments and @-mentions", "primaryDisposition": "always_agent_tool", "semanticOperation": "report_progress", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:639", + "id": "skill:skills/paperclip/references/api-reference.md:645", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L639:update", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L645:update", "heading": "Update", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:661", + "id": "skill:skills/paperclip/references/api-reference.md:667", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L661:cross-team-work-and-delegation", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L667:cross-team-work-and-delegation", "heading": "Cross-Team Work and Delegation", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:665", + "id": "skill:skills/paperclip/references/api-reference.md:671", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L665:receiving-cross-team-work", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L671:receiving-cross-team-work", "heading": "Receiving cross-team work", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:675", + "id": "skill:skills/paperclip/references/api-reference.md:681", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L675:questions-and-dependencies", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L681:questions-and-dependencies", "heading": "Questions and dependencies", "primaryDisposition": "always_agent_tool", "semanticOperation": "request_human_input", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:687", + "id": "skill:skills/paperclip/references/api-reference.md:693", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L687:company-context", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L693:company-context", "heading": "Company Context", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:699", + "id": "skill:skills/paperclip/references/api-reference.md:705", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L699:company-branding-ceo-board", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L705:company-branding-ceo-board", "heading": "Company Branding (CEO / Board)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:719", + "id": "skill:skills/paperclip/references/api-reference.md:725", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L719:openclaw-invite-prompt-ceo", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L725:openclaw-invite-prompt-ceo", "heading": "OpenClaw Invite Prompt (CEO)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:738", + "id": "skill:skills/paperclip/references/api-reference.md:744", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L738:setting-agent-instructions-path", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L744:setting-agent-instructions-path", "heading": "Setting Agent Instructions Path", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:771", + "id": "skill:skills/paperclip/references/api-reference.md:777", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L771:project-setup-create-workspace", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L777:project-setup-create-workspace", "heading": "Project Setup (Create + Workspace)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:795", + "id": "skill:skills/paperclip/references/api-reference.md:801", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L795:option-a-one-call-create-with-workspace", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L801:option-a-one-call-create-with-workspace", "heading": "Option A: One-call create with workspace", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:814", + "id": "skill:skills/paperclip/references/api-reference.md:820", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L814:option-b-two-calls-project-first-then-workspace", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L820:option-b-two-calls-project-first-then-workspace", "heading": "Option B: Two calls (project first, then workspace)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:843", + "id": "skill:skills/paperclip/references/api-reference.md:849", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L843:governance-and-approvals", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L849:governance-and-approvals", "heading": "Governance and Approvals", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:847", + "id": "skill:skills/paperclip/references/api-reference.md:853", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L847:requesting-a-hire-management-only", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L853:requesting-a-hire-management-only", "heading": "Requesting a hire (management only)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:912", + "id": "skill:skills/paperclip/references/api-reference.md:918", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L912:ceo-strategy-approval", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L918:ceo-strategy-approval", "heading": "CEO strategy approval", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:921", + "id": "skill:skills/paperclip/references/api-reference.md:927", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L921:questions-and-waiting-for-human-input", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L927:questions-and-waiting-for-human-input", "heading": "Questions and waiting for human input", "primaryDisposition": "always_agent_tool", "semanticOperation": "request_human_input", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1025", + "id": "skill:skills/paperclip/references/api-reference.md:1031", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1025:issue-thread-confirmations", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1031:issue-thread-confirmations", "heading": "Issue-thread confirmations", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1083", + "id": "skill:skills/paperclip/references/api-reference.md:1089", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1083:conversational-confirmation-answers", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1089:conversational-confirmation-answers", "heading": "Conversational confirmation answers", "primaryDisposition": "always_agent_tool", "semanticOperation": "call_api", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1089", + "id": "skill:skills/paperclip/references/api-reference.md:1095", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1089:checkbox-confirmations", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1095:checkbox-confirmations", "heading": "Checkbox confirmations", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1204", + "id": "skill:skills/paperclip/references/api-reference.md:1210", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1204:item-verdict-requests", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1210:item-verdict-requests", "heading": "Item verdict requests", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, - { - "id": "skill:skills/paperclip/references/api-reference.md:1314", - "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1314:checking-approval-status", - "heading": "Checking approval status", - "primaryDisposition": "optional_agent_tool", - "semanticOperation": "scoped_discovery", - "expectedMockState": "operation_result" - }, { "id": "skill:skills/paperclip/references/api-reference.md:1320", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1320:approval-follow-up-requesting-agent", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1320:checking-approval-status", + "heading": "Checking approval status", + "primaryDisposition": "optional_agent_tool", + "semanticOperation": "scoped_discovery", + "expectedMockState": "operation_result" + }, + { + "id": "skill:skills/paperclip/references/api-reference.md:1326", + "kind": "skill_heading", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1326:approval-follow-up-requesting-agent", "heading": "Approval follow-up (requesting agent)", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1338", + "id": "skill:skills/paperclip/references/api-reference.md:1344", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1338:issue-lifecycle", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1344:issue-lifecycle", "heading": "Issue Lifecycle", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1368", + "id": "skill:skills/paperclip/references/api-reference.md:1374", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1368:error-handling", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1374:error-handling", "heading": "Error Handling", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1382", + "id": "skill:skills/paperclip/references/api-reference.md:1388", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1382:full-api-reference", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1388:full-api-reference", "heading": "Full API Reference", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1384", + "id": "skill:skills/paperclip/references/api-reference.md:1390", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1384:agents", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1390:agents", "heading": "Agents", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1405", + "id": "skill:skills/paperclip/references/api-reference.md:1411", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1405:issues-tasks", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1411:issues-tasks", "heading": "Issues (Tasks)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1446", + "id": "skill:skills/paperclip/references/api-reference.md:1452", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1446:companies-projects-goals", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1452:companies-projects-goals", "heading": "Companies, Projects, Goals", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1470", + "id": "skill:skills/paperclip/references/api-reference.md:1476", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1470:routines", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1476:routines", "heading": "Routines", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1486", + "id": "skill:skills/paperclip/references/api-reference.md:1492", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1486:approvals-costs-activity-dashboard", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1492:approvals-costs-activity-dashboard", "heading": "Approvals, Costs, Activity, Dashboard", "primaryDisposition": "control_plane_owned", "semanticOperation": "runtime_reconciliation", "expectedMockState": "runtime_decision_record" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1508", + "id": "skill:skills/paperclip/references/api-reference.md:1514", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1508:secrets", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1514:secrets", "heading": "Secrets", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1521", + "id": "skill:skills/paperclip/references/api-reference.md:1527", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1521:agent-secret-proposals", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1527:agent-secret-proposals", "heading": "Agent secret proposals", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1574", + "id": "skill:skills/paperclip/references/api-reference.md:1580", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1574:re-bind-an-existing-secret-under-a-new-path-no-secret-id", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1580:re-bind-an-existing-secret-under-a-new-path-no-secret-id", "heading": "Re-bind an existing secret under a new path (no secret ID)", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1621", + "id": "skill:skills/paperclip/references/api-reference.md:1627", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1621:agent-secret-access", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1627:agent-secret-access", "heading": "Agent secret access", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", "expectedMockState": "operation_result" }, { - "id": "skill:skills/paperclip/references/api-reference.md:1661", + "id": "skill:skills/paperclip/references/api-reference.md:1667", "kind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md#L1661:common-mistakes", + "sourceAnchor": "skills/paperclip/references/api-reference.md#L1667:common-mistakes", "heading": "Common Mistakes", "primaryDisposition": "optional_agent_tool", "semanticOperation": "scoped_discovery", diff --git a/packages/paperclip-runner/generated/capability/capability-contract.md b/packages/paperclip-runner/generated/capability/capability-contract.md index 6c6665b696a..d8493676bb2 100644 --- a/packages/paperclip-runner/generated/capability/capability-contract.md +++ b/packages/paperclip-runner/generated/capability/capability-contract.md @@ -5,6 +5,6 @@ Generated by `scripts/generate-capability-contract.mjs`; do not edit generated f - Skill/reference headings: 165 - Legacy MCP tools: 42 - Eval cases: 106 across 16 groups -- Deterministic content SHA-256: `83447a4f9463f9a3d73dd4bea78b580df0356545ba00d0da96763282653bdf0f` +- Deterministic content SHA-256: `74c5fcb9ac01e20178834438536f40edc8b630e15571b447cd783a77b8b69c7b` Every row has exactly one primary disposition, a source anchor, a semantic operation, and a mock-state expectation. diff --git a/packages/paperclip-runner/spec/capability/capabilities.yaml b/packages/paperclip-runner/spec/capability/capabilities.yaml index 7899ff444d0..a3bc4ddadac 100644 --- a/packages/paperclip-runner/spec/capability/capabilities.yaml +++ b/packages/paperclip-runner/spec/capability/capabilities.yaml @@ -105,9 +105,9 @@ ] }, { - "id": "skill:skills/paperclip/SKILL.md:generated-artifacts-and-work-products:198", + "id": "skill:skills/paperclip/SKILL.md:generated-artifacts-and-work-products:200", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:198", + "sourceAnchor": "skills/paperclip/SKILL.md:200", "title": "Generated Artifacts and Work Products", "expectedSemantics": "Skill guidance headed “Generated Artifacts and Work Products”.", "primaryDisposition": "always_agent_tool", @@ -116,13 +116,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:198" + "skill:skills/paperclip/SKILL.md:200" ] }, { - "id": "skill:skills/paperclip/SKILL.md:status-quick-guide:246", + "id": "skill:skills/paperclip/SKILL.md:status-quick-guide:248", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:246", + "sourceAnchor": "skills/paperclip/SKILL.md:248", "title": "Status Quick Guide", "expectedSemantics": "Skill guidance headed “Status Quick Guide”.", "primaryDisposition": "control_plane_owned", @@ -131,13 +131,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:246" + "skill:skills/paperclip/SKILL.md:248" ] }, { - "id": "skill:skills/paperclip/SKILL.md:monitors-and-watchers-say-only-what-you-actually-scheduled:256", + "id": "skill:skills/paperclip/SKILL.md:monitors-and-watchers-say-only-what-you-actually-scheduled:258", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:256", + "sourceAnchor": "skills/paperclip/SKILL.md:258", "title": "Monitors and Watchers (say only what you actually scheduled)", "expectedSemantics": "Skill guidance headed “Monitors and Watchers (say only what you actually scheduled)”.", "primaryDisposition": "optional_agent_tool", @@ -146,13 +146,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:256" + "skill:skills/paperclip/SKILL.md:258" ] }, { - "id": "skill:skills/paperclip/SKILL.md:delegating-review-tasks:269", + "id": "skill:skills/paperclip/SKILL.md:delegating-review-tasks:271", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:269", + "sourceAnchor": "skills/paperclip/SKILL.md:271", "title": "Delegating review tasks", "expectedSemantics": "Skill guidance headed “Delegating review tasks”.", "primaryDisposition": "always_agent_tool", @@ -161,13 +161,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:269" + "skill:skills/paperclip/SKILL.md:271" ] }, { - "id": "skill:skills/paperclip/SKILL.md:managing-a-user-s-inbox:280", + "id": "skill:skills/paperclip/SKILL.md:managing-a-user-s-inbox:282", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:280", + "sourceAnchor": "skills/paperclip/SKILL.md:282", "title": "Managing A User's Inbox", "expectedSemantics": "Skill guidance headed “Managing A User's Inbox”.", "primaryDisposition": "control_plane_owned", @@ -176,13 +176,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:280" + "skill:skills/paperclip/SKILL.md:282" ] }, { - "id": "skill:skills/paperclip/SKILL.md:issue-dependencies-blockers:288", + "id": "skill:skills/paperclip/SKILL.md:issue-dependencies-blockers:290", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:288", + "sourceAnchor": "skills/paperclip/SKILL.md:290", "title": "Issue Dependencies (Blockers)", "expectedSemantics": "Skill guidance headed “Issue Dependencies (Blockers)”.", "primaryDisposition": "control_plane_owned", @@ -191,13 +191,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:288" + "skill:skills/paperclip/SKILL.md:290" ] }, { - "id": "skill:skills/paperclip/SKILL.md:requesting-board-approval:313", + "id": "skill:skills/paperclip/SKILL.md:requesting-board-approval:315", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:313", + "sourceAnchor": "skills/paperclip/SKILL.md:315", "title": "Requesting Board Approval", "expectedSemantics": "Skill guidance headed “Requesting Board Approval”.", "primaryDisposition": "optional_agent_tool", @@ -206,13 +206,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:313" + "skill:skills/paperclip/SKILL.md:315" ] }, { - "id": "skill:skills/paperclip/SKILL.md:issue-thread-interactions:334", + "id": "skill:skills/paperclip/SKILL.md:issue-thread-interactions:336", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:334", + "sourceAnchor": "skills/paperclip/SKILL.md:336", "title": "Issue-Thread Interactions", "expectedSemantics": "Skill guidance headed “Issue-Thread Interactions”.", "primaryDisposition": "optional_agent_tool", @@ -221,13 +221,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:334" + "skill:skills/paperclip/SKILL.md:336" ] }, { - "id": "skill:skills/paperclip/SKILL.md:standalone-decisions:364", + "id": "skill:skills/paperclip/SKILL.md:standalone-decisions:366", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:364", + "sourceAnchor": "skills/paperclip/SKILL.md:366", "title": "Standalone Decisions", "expectedSemantics": "Skill guidance headed “Standalone Decisions”.", "primaryDisposition": "optional_agent_tool", @@ -236,13 +236,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:364" + "skill:skills/paperclip/SKILL.md:366" ] }, { - "id": "skill:skills/paperclip/SKILL.md:mcp-tool-approval-gates:468", + "id": "skill:skills/paperclip/SKILL.md:mcp-tool-approval-gates:470", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:468", + "sourceAnchor": "skills/paperclip/SKILL.md:470", "title": "MCP Tool Approval Gates", "expectedSemantics": "Skill guidance headed “MCP Tool Approval Gates”.", "primaryDisposition": "optional_agent_tool", @@ -251,13 +251,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:468" + "skill:skills/paperclip/SKILL.md:470" ] }, { - "id": "skill:skills/paperclip/SKILL.md:niche-workflow-pointers:510", + "id": "skill:skills/paperclip/SKILL.md:niche-workflow-pointers:512", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:510", + "sourceAnchor": "skills/paperclip/SKILL.md:512", "title": "Niche Workflow Pointers", "expectedSemantics": "Skill guidance headed “Niche Workflow Pointers”.", "primaryDisposition": "optional_agent_tool", @@ -266,13 +266,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:510" + "skill:skills/paperclip/SKILL.md:512" ] }, { - "id": "skill:skills/paperclip/SKILL.md:cases:520", + "id": "skill:skills/paperclip/SKILL.md:cases:522", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:520", + "sourceAnchor": "skills/paperclip/SKILL.md:522", "title": "Cases", "expectedSemantics": "Skill guidance headed “Cases”.", "primaryDisposition": "optional_agent_tool", @@ -281,13 +281,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:520" + "skill:skills/paperclip/SKILL.md:522" ] }, { - "id": "skill:skills/paperclip/SKILL.md:company-skills-workflow:525", + "id": "skill:skills/paperclip/SKILL.md:company-skills-workflow:527", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:525", + "sourceAnchor": "skills/paperclip/SKILL.md:527", "title": "Company Skills Workflow", "expectedSemantics": "Skill guidance headed “Company Skills Workflow”.", "primaryDisposition": "optional_agent_tool", @@ -296,13 +296,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:525" + "skill:skills/paperclip/SKILL.md:527" ] }, { - "id": "skill:skills/paperclip/SKILL.md:routines:536", + "id": "skill:skills/paperclip/SKILL.md:routines:538", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:536", + "sourceAnchor": "skills/paperclip/SKILL.md:538", "title": "Routines", "expectedSemantics": "Skill guidance headed “Routines”.", "primaryDisposition": "optional_agent_tool", @@ -311,13 +311,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:536" + "skill:skills/paperclip/SKILL.md:538" ] }, { - "id": "skill:skills/paperclip/SKILL.md:task-files-and-workspace-choices:547", + "id": "skill:skills/paperclip/SKILL.md:task-files-and-workspace-choices:549", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:547", + "sourceAnchor": "skills/paperclip/SKILL.md:549", "title": "Task Files and Workspace Choices", "expectedSemantics": "Skill guidance headed “Task Files and Workspace Choices”.", "primaryDisposition": "optional_agent_tool", @@ -326,13 +326,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:547" + "skill:skills/paperclip/SKILL.md:549" ] }, { - "id": "skill:skills/paperclip/SKILL.md:issue-workspace-runtime-controls:553", + "id": "skill:skills/paperclip/SKILL.md:issue-workspace-runtime-controls:555", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:553", + "sourceAnchor": "skills/paperclip/SKILL.md:555", "title": "Issue Workspace Runtime Controls", "expectedSemantics": "Skill guidance headed “Issue Workspace Runtime Controls”.", "primaryDisposition": "optional_agent_tool", @@ -341,13 +341,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:553" + "skill:skills/paperclip/SKILL.md:555" ] }, { - "id": "skill:skills/paperclip/SKILL.md:proposing-credentials-safely:560", + "id": "skill:skills/paperclip/SKILL.md:proposing-credentials-safely:562", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:560", + "sourceAnchor": "skills/paperclip/SKILL.md:562", "title": "Proposing Credentials Safely", "expectedSemantics": "Skill guidance headed “Proposing Credentials Safely”.", "primaryDisposition": "optional_agent_tool", @@ -356,13 +356,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:560" + "skill:skills/paperclip/SKILL.md:562" ] }, { - "id": "skill:skills/paperclip/SKILL.md:reading-granted-secrets:567", + "id": "skill:skills/paperclip/SKILL.md:reading-granted-secrets:569", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:567", + "sourceAnchor": "skills/paperclip/SKILL.md:569", "title": "Reading Granted Secrets", "expectedSemantics": "Skill guidance headed “Reading Granted Secrets”.", "primaryDisposition": "optional_agent_tool", @@ -371,13 +371,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:567" + "skill:skills/paperclip/SKILL.md:569" ] }, { - "id": "skill:skills/paperclip/SKILL.md:critical-rules:593", + "id": "skill:skills/paperclip/SKILL.md:critical-rules:595", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:593", + "sourceAnchor": "skills/paperclip/SKILL.md:595", "title": "Critical Rules", "expectedSemantics": "Skill guidance headed “Critical Rules”.", "primaryDisposition": "optional_agent_tool", @@ -386,13 +386,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:593" + "skill:skills/paperclip/SKILL.md:595" ] }, { - "id": "skill:skills/paperclip/SKILL.md:comment-style-required:614", + "id": "skill:skills/paperclip/SKILL.md:comment-style-required:616", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:614", + "sourceAnchor": "skills/paperclip/SKILL.md:616", "title": "Comment Style (Required)", "expectedSemantics": "Skill guidance headed “Comment Style (Required)”.", "primaryDisposition": "always_agent_tool", @@ -401,13 +401,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:614" + "skill:skills/paperclip/SKILL.md:616" ] }, { - "id": "skill:skills/paperclip/SKILL.md:update:646", + "id": "skill:skills/paperclip/SKILL.md:update:648", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:646", + "sourceAnchor": "skills/paperclip/SKILL.md:648", "title": "Update", "expectedSemantics": "Skill guidance headed “Update”.", "primaryDisposition": "optional_agent_tool", @@ -416,13 +416,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:646" + "skill:skills/paperclip/SKILL.md:648" ] }, { - "id": "skill:skills/paperclip/SKILL.md:task-documents-and-deliverables:656", + "id": "skill:skills/paperclip/SKILL.md:task-documents-and-deliverables:658", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:656", + "sourceAnchor": "skills/paperclip/SKILL.md:658", "title": "Task Documents and Deliverables", "expectedSemantics": "Skill guidance headed “Task Documents and Deliverables”.", "primaryDisposition": "always_agent_tool", @@ -431,13 +431,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:656" + "skill:skills/paperclip/SKILL.md:658" ] }, { - "id": "skill:skills/paperclip/SKILL.md:planning-required-when-planning-requested:670", + "id": "skill:skills/paperclip/SKILL.md:planning-required-when-planning-requested:672", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:670", + "sourceAnchor": "skills/paperclip/SKILL.md:672", "title": "Planning (Required when planning requested)", "expectedSemantics": "Skill guidance headed “Planning (Required when planning requested)”.", "primaryDisposition": "optional_agent_tool", @@ -446,13 +446,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:670" + "skill:skills/paperclip/SKILL.md:672" ] }, { - "id": "skill:skills/paperclip/SKILL.md:key-endpoints-hot-routes:701", + "id": "skill:skills/paperclip/SKILL.md:key-endpoints-hot-routes:703", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:701", + "sourceAnchor": "skills/paperclip/SKILL.md:703", "title": "Key Endpoints (Hot Routes)", "expectedSemantics": "Skill guidance headed “Key Endpoints (Hot Routes)”.", "primaryDisposition": "optional_agent_tool", @@ -461,13 +461,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:701" + "skill:skills/paperclip/SKILL.md:703" ] }, { - "id": "skill:skills/paperclip/SKILL.md:searching-issues:730", + "id": "skill:skills/paperclip/SKILL.md:searching-issues:733", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:730", + "sourceAnchor": "skills/paperclip/SKILL.md:733", "title": "Searching Issues", "expectedSemantics": "Skill guidance headed “Searching Issues”.", "primaryDisposition": "optional_agent_tool", @@ -476,13 +476,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:730" + "skill:skills/paperclip/SKILL.md:733" ] }, { - "id": "skill:skills/paperclip/SKILL.md:full-reference:740", + "id": "skill:skills/paperclip/SKILL.md:full-reference:743", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:740", + "sourceAnchor": "skills/paperclip/SKILL.md:743", "title": "Full Reference", "expectedSemantics": "Skill guidance headed “Full Reference”.", "primaryDisposition": "optional_agent_tool", @@ -491,13 +491,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:740" + "skill:skills/paperclip/SKILL.md:743" ] }, { - "id": "skill:skills/paperclip/SKILL.md:conversational-confirmation-answers:744", + "id": "skill:skills/paperclip/SKILL.md:conversational-confirmation-answers:747", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:744", + "sourceAnchor": "skills/paperclip/SKILL.md:747", "title": "Conversational confirmation answers", "expectedSemantics": "Skill guidance headed “Conversational confirmation answers”.", "primaryDisposition": "always_agent_tool", @@ -506,13 +506,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:744" + "skill:skills/paperclip/SKILL.md:747" ] }, { - "id": "skill:skills/paperclip/SKILL.md:incidental-feedback:761", + "id": "skill:skills/paperclip/SKILL.md:incidental-feedback:764", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/SKILL.md:761", + "sourceAnchor": "skills/paperclip/SKILL.md:764", "title": "Incidental feedback", "expectedSemantics": "Skill guidance headed “Incidental feedback”.", "primaryDisposition": "optional_agent_tool", @@ -521,7 +521,7 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/SKILL.md:761" + "skill:skills/paperclip/SKILL.md:764" ] }, { @@ -585,9 +585,9 @@ ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:issue-with-ancestors-get-api-issues-issueid:110", + "id": "skill:skills/paperclip/references/api-reference.md:issue-with-ancestors-get-api-issues-issueid:116", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:110", + "sourceAnchor": "skills/paperclip/references/api-reference.md:116", "title": "Issue with Ancestors (`GET /api/issues/:issueId`)", "expectedSemantics": "Skill guidance headed “Issue with Ancestors (`GET /api/issues/:issueId`)”.", "primaryDisposition": "optional_agent_tool", @@ -596,13 +596,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:110" + "skill:skills/paperclip/references/api-reference.md:116" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:issue-update-response-patch-api-issues-issueid:196", + "id": "skill:skills/paperclip/references/api-reference.md:issue-update-response-patch-api-issues-issueid:202", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:196", + "sourceAnchor": "skills/paperclip/references/api-reference.md:202", "title": "Issue Update Response (`PATCH /api/issues/:issueId`)", "expectedSemantics": "Skill guidance headed “Issue Update Response (`PATCH /api/issues/:issueId`)”.", "primaryDisposition": "optional_agent_tool", @@ -611,13 +611,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:196" + "skill:skills/paperclip/references/api-reference.md:202" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:blocker-diagnostics-get-api-issues-issueid-diagnostics-blockers:238", + "id": "skill:skills/paperclip/references/api-reference.md:blocker-diagnostics-get-api-issues-issueid-diagnostics-blockers:244", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:238", + "sourceAnchor": "skills/paperclip/references/api-reference.md:244", "title": "Blocker Diagnostics (`GET /api/issues/:issueId/diagnostics/blockers`)", "expectedSemantics": "Skill guidance headed “Blocker Diagnostics (`GET /api/issues/:issueId/diagnostics/blockers`)”.", "primaryDisposition": "control_plane_owned", @@ -626,13 +626,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:238" + "skill:skills/paperclip/references/api-reference.md:244" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:wake-diagnostics-get-api-issues-issueid-diagnostics-wakes:277", + "id": "skill:skills/paperclip/references/api-reference.md:wake-diagnostics-get-api-issues-issueid-diagnostics-wakes:283", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:277", + "sourceAnchor": "skills/paperclip/references/api-reference.md:283", "title": "Wake Diagnostics (`GET /api/issues/:issueId/diagnostics/wakes`)", "expectedSemantics": "Skill guidance headed “Wake Diagnostics (`GET /api/issues/:issueId/diagnostics/wakes`)”.", "primaryDisposition": "control_plane_owned", @@ -641,13 +641,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:277" + "skill:skills/paperclip/references/api-reference.md:283" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:subtree-diagnostics-get-api-issues-issueid-diagnostics-subtree:321", + "id": "skill:skills/paperclip/references/api-reference.md:subtree-diagnostics-get-api-issues-issueid-diagnostics-subtree:327", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:321", + "sourceAnchor": "skills/paperclip/references/api-reference.md:327", "title": "Subtree Diagnostics (`GET /api/issues/:issueId/diagnostics/subtree`)", "expectedSemantics": "Skill guidance headed “Subtree Diagnostics (`GET /api/issues/:issueId/diagnostics/subtree`)”.", "primaryDisposition": "optional_agent_tool", @@ -656,13 +656,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:321" + "skill:skills/paperclip/references/api-reference.md:327" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:execution-policy-fields-on-an-issue:369", + "id": "skill:skills/paperclip/references/api-reference.md:execution-policy-fields-on-an-issue:375", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:369", + "sourceAnchor": "skills/paperclip/references/api-reference.md:375", "title": "Execution Policy Fields On An Issue", "expectedSemantics": "Skill guidance headed “Execution Policy Fields On An Issue”.", "primaryDisposition": "optional_agent_tool", @@ -671,13 +671,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:369" + "skill:skills/paperclip/references/api-reference.md:375" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:cross-agent-review-gates:421", + "id": "skill:skills/paperclip/references/api-reference.md:cross-agent-review-gates:427", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:421", + "sourceAnchor": "skills/paperclip/references/api-reference.md:427", "title": "Cross-Agent Review Gates", "expectedSemantics": "Skill guidance headed “Cross-Agent Review Gates”.", "primaryDisposition": "always_agent_tool", @@ -686,13 +686,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:421" + "skill:skills/paperclip/references/api-reference.md:427" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:worked-example-ic-heartbeat:454", + "id": "skill:skills/paperclip/references/api-reference.md:worked-example-ic-heartbeat:460", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:454", + "sourceAnchor": "skills/paperclip/references/api-reference.md:460", "title": "Worked Example: IC Heartbeat", "expectedSemantics": "Skill guidance headed “Worked Example: IC Heartbeat”.", "primaryDisposition": "optional_agent_tool", @@ -701,13 +701,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:454" + "skill:skills/paperclip/references/api-reference.md:460" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:459", + "id": "skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:465", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:459", + "sourceAnchor": "skills/paperclip/references/api-reference.md:465", "title": "1. Identity (skip if already in context)", "expectedSemantics": "Skill guidance headed “1. Identity (skip if already in context)”.", "primaryDisposition": "control_plane_owned", @@ -716,13 +716,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:459" + "skill:skills/paperclip/references/api-reference.md:465" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:2-check-inbox:463", + "id": "skill:skills/paperclip/references/api-reference.md:2-check-inbox:469", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:463", + "sourceAnchor": "skills/paperclip/references/api-reference.md:469", "title": "2. Check inbox", "expectedSemantics": "Skill guidance headed “2. Check inbox”.", "primaryDisposition": "control_plane_owned", @@ -731,13 +731,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:463" + "skill:skills/paperclip/references/api-reference.md:469" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:3-already-have-issue-101-inprogress-highest-priority-continue-it:470", + "id": "skill:skills/paperclip/references/api-reference.md:3-already-have-issue-101-inprogress-highest-priority-continue-it:476", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:470", + "sourceAnchor": "skills/paperclip/references/api-reference.md:476", "title": "3. Already have issue-101 in_progress (highest priority). Continue it.", "expectedSemantics": "Skill guidance headed “3. Already have issue-101 in_progress (highest priority). Continue it.”.", "primaryDisposition": "optional_agent_tool", @@ -746,13 +746,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:470" + "skill:skills/paperclip/references/api-reference.md:476" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:4-do-the-actual-work-write-code-run-tests:477", + "id": "skill:skills/paperclip/references/api-reference.md:4-do-the-actual-work-write-code-run-tests:483", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:477", + "sourceAnchor": "skills/paperclip/references/api-reference.md:483", "title": "4. Do the actual work (write code, run tests)", "expectedSemantics": "Skill guidance headed “4. Do the actual work (write code, run tests)”.", "primaryDisposition": "optional_agent_tool", @@ -760,44 +760,44 @@ "assertionClasses": [ "control_plane_invariant" ], - "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:477" - ] - }, - { - "id": "skill:skills/paperclip/references/api-reference.md:5-work-is-done-update-status-and-comment-in-one-call:479", - "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:479", - "title": "5. Work is done. Update status and comment in one call.", - "expectedSemantics": "Skill guidance headed “5. Work is done. Update status and comment in one call.”.", - "primaryDisposition": "always_agent_tool", - "requiredGrants": [], - "assertionClasses": [ - "control_plane_invariant" - ], - "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:479" - ] - }, - { - "id": "skill:skills/paperclip/references/api-reference.md:6-still-have-time-checkout-the-next-task:483", - "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:483", - "title": "6. Still have time. Checkout the next task.", - "expectedSemantics": "Skill guidance headed “6. Still have time. Checkout the next task.”.", - "primaryDisposition": "control_plane_owned", - "requiredGrants": [], - "assertionClasses": [ - "control_plane_invariant" - ], "evidenceIds": [ "skill:skills/paperclip/references/api-reference.md:483" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:7-made-partial-progress-not-done-yet-comment-and-exit:490", + "id": "skill:skills/paperclip/references/api-reference.md:5-work-is-done-update-status-and-comment-in-one-call:485", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:490", + "sourceAnchor": "skills/paperclip/references/api-reference.md:485", + "title": "5. Work is done. Update status and comment in one call.", + "expectedSemantics": "Skill guidance headed “5. Work is done. Update status and comment in one call.”.", + "primaryDisposition": "always_agent_tool", + "requiredGrants": [], + "assertionClasses": [ + "control_plane_invariant" + ], + "evidenceIds": [ + "skill:skills/paperclip/references/api-reference.md:485" + ] + }, + { + "id": "skill:skills/paperclip/references/api-reference.md:6-still-have-time-checkout-the-next-task:489", + "sourceKind": "skill_heading", + "sourceAnchor": "skills/paperclip/references/api-reference.md:489", + "title": "6. Still have time. Checkout the next task.", + "expectedSemantics": "Skill guidance headed “6. Still have time. Checkout the next task.”.", + "primaryDisposition": "control_plane_owned", + "requiredGrants": [], + "assertionClasses": [ + "control_plane_invariant" + ], + "evidenceIds": [ + "skill:skills/paperclip/references/api-reference.md:489" + ] + }, + { + "id": "skill:skills/paperclip/references/api-reference.md:7-made-partial-progress-not-done-yet-comment-and-exit:496", + "sourceKind": "skill_heading", + "sourceAnchor": "skills/paperclip/references/api-reference.md:496", "title": "7. Made partial progress, not done yet. Comment and exit.", "expectedSemantics": "Skill guidance headed “7. Made partial progress, not done yet. Comment and exit.”.", "primaryDisposition": "always_agent_tool", @@ -806,13 +806,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:490" + "skill:skills/paperclip/references/api-reference.md:496" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:worked-example-report-a-board-user-s-mine-inbox:495", + "id": "skill:skills/paperclip/references/api-reference.md:worked-example-report-a-board-user-s-mine-inbox:501", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:495", + "sourceAnchor": "skills/paperclip/references/api-reference.md:501", "title": "Worked Example: Report A Board User's Mine Inbox", "expectedSemantics": "Skill guidance headed “Worked Example: Report A Board User's Mine Inbox”.", "primaryDisposition": "control_plane_owned", @@ -821,13 +821,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:495" + "skill:skills/paperclip/references/api-reference.md:501" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:board-user-created-the-requesting-issue:500", + "id": "skill:skills/paperclip/references/api-reference.md:board-user-created-the-requesting-issue:506", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:500", + "sourceAnchor": "skills/paperclip/references/api-reference.md:506", "title": "Board user created the requesting issue.", "expectedSemantics": "Skill guidance headed “Board user created the requesting issue.”.", "primaryDisposition": "optional_agent_tool", @@ -836,13 +836,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:500" + "skill:skills/paperclip/references/api-reference.md:506" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:fetch-the-board-user-s-mine-inbox-issues:504", + "id": "skill:skills/paperclip/references/api-reference.md:fetch-the-board-user-s-mine-inbox-issues:510", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:504", + "sourceAnchor": "skills/paperclip/references/api-reference.md:510", "title": "Fetch the board user's Mine inbox issues.", "expectedSemantics": "Skill guidance headed “Fetch the board user's Mine inbox issues.”.", "primaryDisposition": "control_plane_owned", @@ -851,13 +851,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:504" + "skill:skills/paperclip/references/api-reference.md:510" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:summarize-it-back-to-the-board-in-a-comment-or-document:518", + "id": "skill:skills/paperclip/references/api-reference.md:summarize-it-back-to-the-board-in-a-comment-or-document:524", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:518", + "sourceAnchor": "skills/paperclip/references/api-reference.md:524", "title": "Summarize it back to the board in a comment or document.", "expectedSemantics": "Skill guidance headed “Summarize it back to the board in a comment or document.”.", "primaryDisposition": "always_agent_tool", @@ -866,13 +866,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:518" + "skill:skills/paperclip/references/api-reference.md:524" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:worked-example-archive-a-resolved-inbox-item:523", + "id": "skill:skills/paperclip/references/api-reference.md:worked-example-archive-a-resolved-inbox-item:529", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:523", + "sourceAnchor": "skills/paperclip/references/api-reference.md:529", "title": "Worked Example: Archive A Resolved Inbox Item", "expectedSemantics": "Skill guidance headed “Worked Example: Archive A Resolved Inbox Item”.", "primaryDisposition": "control_plane_owned", @@ -881,13 +881,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:523" + "skill:skills/paperclip/references/api-reference.md:529" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:the-responsible-user-s-id-is-resolved-from-the-authenticated-agent-run:528", + "id": "skill:skills/paperclip/references/api-reference.md:the-responsible-user-s-id-is-resolved-from-the-authenticated-agent-run:534", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:528", + "sourceAnchor": "skills/paperclip/references/api-reference.md:534", "title": "The responsible user's id is resolved from the authenticated agent run.", "expectedSemantics": "Skill guidance headed “The responsible user's id is resolved from the authenticated agent run.”.", "primaryDisposition": "optional_agent_tool", @@ -896,13 +896,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:528" + "skill:skills/paperclip/references/api-reference.md:534" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:reverse-the-archive-if-it-was-premature-or-no-longer-desired:537", + "id": "skill:skills/paperclip/references/api-reference.md:reverse-the-archive-if-it-was-premature-or-no-longer-desired:543", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:537", + "sourceAnchor": "skills/paperclip/references/api-reference.md:543", "title": "Reverse the archive if it was premature or no longer desired.", "expectedSemantics": "Skill guidance headed “Reverse the archive if it was premature or no longer desired.”.", "primaryDisposition": "optional_agent_tool", @@ -911,13 +911,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:537" + "skill:skills/paperclip/references/api-reference.md:543" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:worked-example-reviewer-approver-heartbeat:547", + "id": "skill:skills/paperclip/references/api-reference.md:worked-example-reviewer-approver-heartbeat:553", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:547", + "sourceAnchor": "skills/paperclip/references/api-reference.md:553", "title": "Worked Example: Reviewer / Approver Heartbeat", "expectedSemantics": "Skill guidance headed “Worked Example: Reviewer / Approver Heartbeat”.", "primaryDisposition": "always_agent_tool", @@ -926,13 +926,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:547" + "skill:skills/paperclip/references/api-reference.md:553" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:worked-example-manager-heartbeat:586", + "id": "skill:skills/paperclip/references/api-reference.md:worked-example-manager-heartbeat:592", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:586", + "sourceAnchor": "skills/paperclip/references/api-reference.md:592", "title": "Worked Example: Manager Heartbeat", "expectedSemantics": "Skill guidance headed “Worked Example: Manager Heartbeat”.", "primaryDisposition": "optional_agent_tool", @@ -941,13 +941,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:586" + "skill:skills/paperclip/references/api-reference.md:592" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:589", + "id": "skill:skills/paperclip/references/api-reference.md:1-identity-skip-if-already-in-context:595", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:589", + "sourceAnchor": "skills/paperclip/references/api-reference.md:595", "title": "1. Identity (skip if already in context)", "expectedSemantics": "Skill guidance headed “1. Identity (skip if already in context)”.", "primaryDisposition": "control_plane_owned", @@ -956,13 +956,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:589" + "skill:skills/paperclip/references/api-reference.md:595" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:2-check-team-status:593", + "id": "skill:skills/paperclip/references/api-reference.md:2-check-team-status:599", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:593", + "sourceAnchor": "skills/paperclip/references/api-reference.md:599", "title": "2. Check team status", "expectedSemantics": "Skill guidance headed “2. Check team status”.", "primaryDisposition": "optional_agent_tool", @@ -971,13 +971,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:593" + "skill:skills/paperclip/references/api-reference.md:599" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:3-agent-42-is-blocked-read-comments:600", + "id": "skill:skills/paperclip/references/api-reference.md:3-agent-42-is-blocked-read-comments:606", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:600", + "sourceAnchor": "skills/paperclip/references/api-reference.md:606", "title": "3. Agent-42 is blocked. Read comments.", "expectedSemantics": "Skill guidance headed “3. Agent-42 is blocked. Read comments.”.", "primaryDisposition": "control_plane_owned", @@ -986,13 +986,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:600" + "skill:skills/paperclip/references/api-reference.md:606" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:4-unblock-reassign-and-comment:604", + "id": "skill:skills/paperclip/references/api-reference.md:4-unblock-reassign-and-comment:610", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:604", + "sourceAnchor": "skills/paperclip/references/api-reference.md:610", "title": "4. Unblock: reassign and comment.", "expectedSemantics": "Skill guidance headed “4. Unblock: reassign and comment.”.", "primaryDisposition": "control_plane_owned", @@ -1001,13 +1001,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:604" + "skill:skills/paperclip/references/api-reference.md:610" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:5-check-own-assignments:608", + "id": "skill:skills/paperclip/references/api-reference.md:5-check-own-assignments:614", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:608", + "sourceAnchor": "skills/paperclip/references/api-reference.md:614", "title": "5. Check own assignments.", "expectedSemantics": "Skill guidance headed “5. Check own assignments.”.", "primaryDisposition": "optional_agent_tool", @@ -1016,13 +1016,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:608" + "skill:skills/paperclip/references/api-reference.md:614" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:6-create-subtasks-and-delegate:615", + "id": "skill:skills/paperclip/references/api-reference.md:6-create-subtasks-and-delegate:621", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:615", + "sourceAnchor": "skills/paperclip/references/api-reference.md:621", "title": "6. Create subtasks and delegate.", "expectedSemantics": "Skill guidance headed “6. Create subtasks and delegate.”.", "primaryDisposition": "optional_agent_tool", @@ -1030,47 +1030,32 @@ "assertionClasses": [ "control_plane_invariant" ], - "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:615" - ] - }, - { - "id": "skill:skills/paperclip/references/api-reference.md:load-tests-depend-on-caching-layer-being-done-first-paperclip-will-auto-wake-agent-55-when-the-blocker-resolves:621", - "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:621", - "title": "^ Load tests depend on caching layer being done first. Paperclip will auto-wake agent-55 when the blocker resolves.", - "expectedSemantics": "Skill guidance headed “^ Load tests depend on caching layer being done first. Paperclip will auto-wake agent-55 when the blocker resolves.”.", - "primaryDisposition": "control_plane_owned", - "requiredGrants": [], - "assertionClasses": [ - "control_plane_invariant" - ], "evidenceIds": [ "skill:skills/paperclip/references/api-reference.md:621" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:7-dashboard-for-health-check:626", + "id": "skill:skills/paperclip/references/api-reference.md:load-tests-depend-on-caching-layer-being-done-first-paperclip-will-auto-wake-agent-55-when-the-blocker-resolves:627", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:626", - "title": "7. Dashboard for health check.", - "expectedSemantics": "Skill guidance headed “7. Dashboard for health check.”.", - "primaryDisposition": "optional_agent_tool", + "sourceAnchor": "skills/paperclip/references/api-reference.md:627", + "title": "^ Load tests depend on caching layer being done first. Paperclip will auto-wake agent-55 when the blocker resolves.", + "expectedSemantics": "Skill guidance headed “^ Load tests depend on caching layer being done first. Paperclip will auto-wake agent-55 when the blocker resolves.”.", + "primaryDisposition": "control_plane_owned", "requiredGrants": [], "assertionClasses": [ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:626" + "skill:skills/paperclip/references/api-reference.md:627" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:comments-and-mentions:632", + "id": "skill:skills/paperclip/references/api-reference.md:7-dashboard-for-health-check:632", "sourceKind": "skill_heading", "sourceAnchor": "skills/paperclip/references/api-reference.md:632", - "title": "Comments and @-mentions", - "expectedSemantics": "Skill guidance headed “Comments and @-mentions”.", - "primaryDisposition": "always_agent_tool", + "title": "7. Dashboard for health check.", + "expectedSemantics": "Skill guidance headed “7. Dashboard for health check.”.", + "primaryDisposition": "optional_agent_tool", "requiredGrants": [], "assertionClasses": [ "control_plane_invariant" @@ -1080,9 +1065,24 @@ ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:update:639", + "id": "skill:skills/paperclip/references/api-reference.md:comments-and-mentions:638", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:639", + "sourceAnchor": "skills/paperclip/references/api-reference.md:638", + "title": "Comments and @-mentions", + "expectedSemantics": "Skill guidance headed “Comments and @-mentions”.", + "primaryDisposition": "always_agent_tool", + "requiredGrants": [], + "assertionClasses": [ + "control_plane_invariant" + ], + "evidenceIds": [ + "skill:skills/paperclip/references/api-reference.md:638" + ] + }, + { + "id": "skill:skills/paperclip/references/api-reference.md:update:645", + "sourceKind": "skill_heading", + "sourceAnchor": "skills/paperclip/references/api-reference.md:645", "title": "Update", "expectedSemantics": "Skill guidance headed “Update”.", "primaryDisposition": "optional_agent_tool", @@ -1091,13 +1091,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:639" + "skill:skills/paperclip/references/api-reference.md:645" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:cross-team-work-and-delegation:661", + "id": "skill:skills/paperclip/references/api-reference.md:cross-team-work-and-delegation:667", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:661", + "sourceAnchor": "skills/paperclip/references/api-reference.md:667", "title": "Cross-Team Work and Delegation", "expectedSemantics": "Skill guidance headed “Cross-Team Work and Delegation”.", "primaryDisposition": "optional_agent_tool", @@ -1106,13 +1106,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:661" + "skill:skills/paperclip/references/api-reference.md:667" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:receiving-cross-team-work:665", + "id": "skill:skills/paperclip/references/api-reference.md:receiving-cross-team-work:671", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:665", + "sourceAnchor": "skills/paperclip/references/api-reference.md:671", "title": "Receiving cross-team work", "expectedSemantics": "Skill guidance headed “Receiving cross-team work”.", "primaryDisposition": "optional_agent_tool", @@ -1121,13 +1121,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:665" + "skill:skills/paperclip/references/api-reference.md:671" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:questions-and-dependencies:675", + "id": "skill:skills/paperclip/references/api-reference.md:questions-and-dependencies:681", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:675", + "sourceAnchor": "skills/paperclip/references/api-reference.md:681", "title": "Questions and dependencies", "expectedSemantics": "Skill guidance headed “Questions and dependencies”.", "primaryDisposition": "always_agent_tool", @@ -1136,13 +1136,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:675" + "skill:skills/paperclip/references/api-reference.md:681" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:company-context:687", + "id": "skill:skills/paperclip/references/api-reference.md:company-context:693", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:687", + "sourceAnchor": "skills/paperclip/references/api-reference.md:693", "title": "Company Context", "expectedSemantics": "Skill guidance headed “Company Context”.", "primaryDisposition": "optional_agent_tool", @@ -1151,13 +1151,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:687" + "skill:skills/paperclip/references/api-reference.md:693" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:company-branding-ceo-board:699", + "id": "skill:skills/paperclip/references/api-reference.md:company-branding-ceo-board:705", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:699", + "sourceAnchor": "skills/paperclip/references/api-reference.md:705", "title": "Company Branding (CEO / Board)", "expectedSemantics": "Skill guidance headed “Company Branding (CEO / Board)”.", "primaryDisposition": "optional_agent_tool", @@ -1166,13 +1166,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:699" + "skill:skills/paperclip/references/api-reference.md:705" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:openclaw-invite-prompt-ceo:719", + "id": "skill:skills/paperclip/references/api-reference.md:openclaw-invite-prompt-ceo:725", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:719", + "sourceAnchor": "skills/paperclip/references/api-reference.md:725", "title": "OpenClaw Invite Prompt (CEO)", "expectedSemantics": "Skill guidance headed “OpenClaw Invite Prompt (CEO)”.", "primaryDisposition": "optional_agent_tool", @@ -1181,13 +1181,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:719" + "skill:skills/paperclip/references/api-reference.md:725" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:setting-agent-instructions-path:738", + "id": "skill:skills/paperclip/references/api-reference.md:setting-agent-instructions-path:744", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:738", + "sourceAnchor": "skills/paperclip/references/api-reference.md:744", "title": "Setting Agent Instructions Path", "expectedSemantics": "Skill guidance headed “Setting Agent Instructions Path”.", "primaryDisposition": "optional_agent_tool", @@ -1196,13 +1196,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:738" + "skill:skills/paperclip/references/api-reference.md:744" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:project-setup-create-workspace:771", + "id": "skill:skills/paperclip/references/api-reference.md:project-setup-create-workspace:777", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:771", + "sourceAnchor": "skills/paperclip/references/api-reference.md:777", "title": "Project Setup (Create + Workspace)", "expectedSemantics": "Skill guidance headed “Project Setup (Create + Workspace)”.", "primaryDisposition": "optional_agent_tool", @@ -1211,13 +1211,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:771" + "skill:skills/paperclip/references/api-reference.md:777" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:option-a-one-call-create-with-workspace:795", + "id": "skill:skills/paperclip/references/api-reference.md:option-a-one-call-create-with-workspace:801", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:795", + "sourceAnchor": "skills/paperclip/references/api-reference.md:801", "title": "Option A: One-call create with workspace", "expectedSemantics": "Skill guidance headed “Option A: One-call create with workspace”.", "primaryDisposition": "optional_agent_tool", @@ -1226,13 +1226,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:795" + "skill:skills/paperclip/references/api-reference.md:801" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:option-b-two-calls-project-first-then-workspace:814", + "id": "skill:skills/paperclip/references/api-reference.md:option-b-two-calls-project-first-then-workspace:820", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:814", + "sourceAnchor": "skills/paperclip/references/api-reference.md:820", "title": "Option B: Two calls (project first, then workspace)", "expectedSemantics": "Skill guidance headed “Option B: Two calls (project first, then workspace)”.", "primaryDisposition": "optional_agent_tool", @@ -1241,13 +1241,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:814" + "skill:skills/paperclip/references/api-reference.md:820" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:governance-and-approvals:843", + "id": "skill:skills/paperclip/references/api-reference.md:governance-and-approvals:849", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:843", + "sourceAnchor": "skills/paperclip/references/api-reference.md:849", "title": "Governance and Approvals", "expectedSemantics": "Skill guidance headed “Governance and Approvals”.", "primaryDisposition": "optional_agent_tool", @@ -1256,13 +1256,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:843" + "skill:skills/paperclip/references/api-reference.md:849" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:requesting-a-hire-management-only:847", + "id": "skill:skills/paperclip/references/api-reference.md:requesting-a-hire-management-only:853", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:847", + "sourceAnchor": "skills/paperclip/references/api-reference.md:853", "title": "Requesting a hire (management only)", "expectedSemantics": "Skill guidance headed “Requesting a hire (management only)”.", "primaryDisposition": "optional_agent_tool", @@ -1271,13 +1271,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:847" + "skill:skills/paperclip/references/api-reference.md:853" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:ceo-strategy-approval:912", + "id": "skill:skills/paperclip/references/api-reference.md:ceo-strategy-approval:918", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:912", + "sourceAnchor": "skills/paperclip/references/api-reference.md:918", "title": "CEO strategy approval", "expectedSemantics": "Skill guidance headed “CEO strategy approval”.", "primaryDisposition": "optional_agent_tool", @@ -1286,13 +1286,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:912" + "skill:skills/paperclip/references/api-reference.md:918" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:questions-and-waiting-for-human-input:921", + "id": "skill:skills/paperclip/references/api-reference.md:questions-and-waiting-for-human-input:927", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:921", + "sourceAnchor": "skills/paperclip/references/api-reference.md:927", "title": "Questions and waiting for human input", "expectedSemantics": "Skill guidance headed “Questions and waiting for human input”.", "primaryDisposition": "always_agent_tool", @@ -1301,13 +1301,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:921" + "skill:skills/paperclip/references/api-reference.md:927" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:issue-thread-confirmations:1025", + "id": "skill:skills/paperclip/references/api-reference.md:issue-thread-confirmations:1031", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1025", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1031", "title": "Issue-thread confirmations", "expectedSemantics": "Skill guidance headed “Issue-thread confirmations”.", "primaryDisposition": "always_agent_tool", @@ -1316,30 +1316,15 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1025" + "skill:skills/paperclip/references/api-reference.md:1031" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:conversational-confirmation-answers:1083", - "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1083", - "title": "Conversational confirmation answers", - "expectedSemantics": "Skill guidance headed “Conversational confirmation answers”.", - "primaryDisposition": "always_agent_tool", - "requiredGrants": [], - "assertionClasses": [ - "control_plane_invariant" - ], - "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1083" - ] - }, - { - "id": "skill:skills/paperclip/references/api-reference.md:checkbox-confirmations:1089", + "id": "skill:skills/paperclip/references/api-reference.md:conversational-confirmation-answers:1089", "sourceKind": "skill_heading", "sourceAnchor": "skills/paperclip/references/api-reference.md:1089", - "title": "Checkbox confirmations", - "expectedSemantics": "Skill guidance headed “Checkbox confirmations”.", + "title": "Conversational confirmation answers", + "expectedSemantics": "Skill guidance headed “Conversational confirmation answers”.", "primaryDisposition": "always_agent_tool", "requiredGrants": [], "assertionClasses": [ @@ -1350,9 +1335,24 @@ ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:item-verdict-requests:1204", + "id": "skill:skills/paperclip/references/api-reference.md:checkbox-confirmations:1095", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1204", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1095", + "title": "Checkbox confirmations", + "expectedSemantics": "Skill guidance headed “Checkbox confirmations”.", + "primaryDisposition": "always_agent_tool", + "requiredGrants": [], + "assertionClasses": [ + "control_plane_invariant" + ], + "evidenceIds": [ + "skill:skills/paperclip/references/api-reference.md:1095" + ] + }, + { + "id": "skill:skills/paperclip/references/api-reference.md:item-verdict-requests:1210", + "sourceKind": "skill_heading", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1210", "title": "Item verdict requests", "expectedSemantics": "Skill guidance headed “Item verdict requests”.", "primaryDisposition": "optional_agent_tool", @@ -1361,13 +1361,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1204" + "skill:skills/paperclip/references/api-reference.md:1210" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:checking-approval-status:1314", + "id": "skill:skills/paperclip/references/api-reference.md:checking-approval-status:1320", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1314", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1320", "title": "Checking approval status", "expectedSemantics": "Skill guidance headed “Checking approval status”.", "primaryDisposition": "optional_agent_tool", @@ -1375,29 +1375,29 @@ "assertionClasses": [ "control_plane_invariant" ], - "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1314" - ] - }, - { - "id": "skill:skills/paperclip/references/api-reference.md:approval-follow-up-requesting-agent:1320", - "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1320", - "title": "Approval follow-up (requesting agent)", - "expectedSemantics": "Skill guidance headed “Approval follow-up (requesting agent)”.", - "primaryDisposition": "always_agent_tool", - "requiredGrants": [], - "assertionClasses": [ - "control_plane_invariant" - ], "evidenceIds": [ "skill:skills/paperclip/references/api-reference.md:1320" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:issue-lifecycle:1338", + "id": "skill:skills/paperclip/references/api-reference.md:approval-follow-up-requesting-agent:1326", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1338", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1326", + "title": "Approval follow-up (requesting agent)", + "expectedSemantics": "Skill guidance headed “Approval follow-up (requesting agent)”.", + "primaryDisposition": "always_agent_tool", + "requiredGrants": [], + "assertionClasses": [ + "control_plane_invariant" + ], + "evidenceIds": [ + "skill:skills/paperclip/references/api-reference.md:1326" + ] + }, + { + "id": "skill:skills/paperclip/references/api-reference.md:issue-lifecycle:1344", + "sourceKind": "skill_heading", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1344", "title": "Issue Lifecycle", "expectedSemantics": "Skill guidance headed “Issue Lifecycle”.", "primaryDisposition": "always_agent_tool", @@ -1406,13 +1406,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1338" + "skill:skills/paperclip/references/api-reference.md:1344" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:error-handling:1368", + "id": "skill:skills/paperclip/references/api-reference.md:error-handling:1374", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1368", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1374", "title": "Error Handling", "expectedSemantics": "Skill guidance headed “Error Handling”.", "primaryDisposition": "control_plane_owned", @@ -1421,13 +1421,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1368" + "skill:skills/paperclip/references/api-reference.md:1374" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:full-api-reference:1382", + "id": "skill:skills/paperclip/references/api-reference.md:full-api-reference:1388", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1382", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1388", "title": "Full API Reference", "expectedSemantics": "Skill guidance headed “Full API Reference”.", "primaryDisposition": "optional_agent_tool", @@ -1436,13 +1436,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1382" + "skill:skills/paperclip/references/api-reference.md:1388" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:agents:1384", + "id": "skill:skills/paperclip/references/api-reference.md:agents:1390", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1384", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1390", "title": "Agents", "expectedSemantics": "Skill guidance headed “Agents”.", "primaryDisposition": "optional_agent_tool", @@ -1451,13 +1451,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1384" + "skill:skills/paperclip/references/api-reference.md:1390" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:issues-tasks:1405", + "id": "skill:skills/paperclip/references/api-reference.md:issues-tasks:1411", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1405", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1411", "title": "Issues (Tasks)", "expectedSemantics": "Skill guidance headed “Issues (Tasks)”.", "primaryDisposition": "optional_agent_tool", @@ -1466,13 +1466,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1405" + "skill:skills/paperclip/references/api-reference.md:1411" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:companies-projects-goals:1446", + "id": "skill:skills/paperclip/references/api-reference.md:companies-projects-goals:1452", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1446", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1452", "title": "Companies, Projects, Goals", "expectedSemantics": "Skill guidance headed “Companies, Projects, Goals”.", "primaryDisposition": "optional_agent_tool", @@ -1481,13 +1481,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1446" + "skill:skills/paperclip/references/api-reference.md:1452" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:routines:1470", + "id": "skill:skills/paperclip/references/api-reference.md:routines:1476", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1470", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1476", "title": "Routines", "expectedSemantics": "Skill guidance headed “Routines”.", "primaryDisposition": "optional_agent_tool", @@ -1496,13 +1496,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1470" + "skill:skills/paperclip/references/api-reference.md:1476" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:approvals-costs-activity-dashboard:1486", + "id": "skill:skills/paperclip/references/api-reference.md:approvals-costs-activity-dashboard:1492", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1486", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1492", "title": "Approvals, Costs, Activity, Dashboard", "expectedSemantics": "Skill guidance headed “Approvals, Costs, Activity, Dashboard”.", "primaryDisposition": "optional_agent_tool", @@ -1511,13 +1511,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1486" + "skill:skills/paperclip/references/api-reference.md:1492" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:secrets:1508", + "id": "skill:skills/paperclip/references/api-reference.md:secrets:1514", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1508", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1514", "title": "Secrets", "expectedSemantics": "Skill guidance headed “Secrets”.", "primaryDisposition": "optional_agent_tool", @@ -1526,13 +1526,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1508" + "skill:skills/paperclip/references/api-reference.md:1514" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:agent-secret-proposals:1521", + "id": "skill:skills/paperclip/references/api-reference.md:agent-secret-proposals:1527", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1521", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1527", "title": "Agent secret proposals", "expectedSemantics": "Skill guidance headed “Agent secret proposals”.", "primaryDisposition": "optional_agent_tool", @@ -1541,13 +1541,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1521" + "skill:skills/paperclip/references/api-reference.md:1527" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:agent-secret-access:1621", + "id": "skill:skills/paperclip/references/api-reference.md:agent-secret-access:1627", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1621", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1627", "title": "Agent secret access", "expectedSemantics": "Skill guidance headed “Agent secret access”.", "primaryDisposition": "optional_agent_tool", @@ -1556,13 +1556,13 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1621" + "skill:skills/paperclip/references/api-reference.md:1627" ] }, { - "id": "skill:skills/paperclip/references/api-reference.md:common-mistakes:1661", + "id": "skill:skills/paperclip/references/api-reference.md:common-mistakes:1667", "sourceKind": "skill_heading", - "sourceAnchor": "skills/paperclip/references/api-reference.md:1661", + "sourceAnchor": "skills/paperclip/references/api-reference.md:1667", "title": "Common Mistakes", "expectedSemantics": "Skill guidance headed “Common Mistakes”.", "primaryDisposition": "optional_agent_tool", @@ -1571,7 +1571,7 @@ "control_plane_invariant" ], "evidenceIds": [ - "skill:skills/paperclip/references/api-reference.md:1661" + "skill:skills/paperclip/references/api-reference.md:1667" ] }, { diff --git a/server/src/__tests__/activity-routes.test.ts b/server/src/__tests__/activity-routes.test.ts index 76671447903..d2090f9e5a1 100644 --- a/server/src/__tests__/activity-routes.test.ts +++ b/server/src/__tests__/activity-routes.test.ts @@ -126,6 +126,33 @@ describe("activity routes", () => { mockAccessService.canUser.mockResolvedValue(false); }); + it("lets an agent read activity for an authorized issue", async () => { + mockIssueService.getByIdentifier.mockResolvedValue({ + id: "issue-1", companyId: "company-1", projectId: null, parentId: null, + assigneeAgentId: "agent-1", assigneeUserId: null, status: "done", + }); + mockActivityService.forIssue.mockResolvedValue([{ action: "issue.recovery_action_resolved", actorType: "system" }]); + const app = await createApp({ type: "agent", companyId: "company-1", agentId: "agent-1" }); + const res = await requestApp(app, baseUrl => request(baseUrl).get("/api/issues/TEST-1/activity")); + expect(res.status).toBe(200); + expect(mockAccessService.decide).toHaveBeenCalledWith(expect.objectContaining({ + action: "issue:read", resource: expect.objectContaining({ companyId: "company-1", issueId: "issue-1" }), + })); + expect(mockActivityService.forIssue).toHaveBeenCalledWith("issue-1"); + expect(res.body).toEqual([{ action: "issue.recovery_action_resolved", actorType: "system" }]); + }); + + it.each(["boundary", "company"])("denies agent activity reads outside the %s scope", async (kind) => { + const issue = { id: "issue-1", companyId: kind === "company" ? "company-2" : "company-1" }; + mockIssueService.getById.mockResolvedValue(issue); + mockIssueService.getByIdentifier.mockResolvedValue(issue); + mockAccessService.decide.mockResolvedValue({ allowed: false }); + const app = await createApp({ type: "agent", companyId: "company-1", agentId: "agent-1" }); + const res = await requestApp(app, baseUrl => request(baseUrl).get("/api/issues/issue-1/activity")); + expect(res.status).toBe(kind === "company" ? 404 : 403); + expect(mockActivityService.forIssue).not.toHaveBeenCalled(); + }); + it("returns redacted all-actors rows to a basic company reader", async () => { mockAgentActionAuditService.list.mockResolvedValue({ items: [{ diff --git a/server/src/__tests__/heartbeat-process-recovery.test.ts b/server/src/__tests__/heartbeat-process-recovery.test.ts index f9ce2234e52..50b97e82246 100644 --- a/server/src/__tests__/heartbeat-process-recovery.test.ts +++ b/server/src/__tests__/heartbeat-process-recovery.test.ts @@ -2415,7 +2415,7 @@ describeEmbeddedPostgres("heartbeat orphaned process recovery", () => { .toMatchObject({ status: "active", resolvedAt: null }); }); - it("keeps existing terminal-task disposition for a native finalization hold", async () => { + it("retains the exact native owner hold without changing a terminal task's disposition", async () => { const f = await seedPendingNativeFinalization(); await db.update(heartbeatRuns).set({ runnerProfileJson: { nativeWorkspaceFinalizationOwner: { unknown: true } } }) .where(eq(heartbeatRuns.id, f.runId)); @@ -2423,6 +2423,13 @@ describeEmbeddedPostgres("heartbeat orphaned process recovery", () => { await heartbeat.recoverNativeRunsAfterRestart(); const [hold] = await db.select().from(issueRecoveryActions).where(eq(issueRecoveryActions.sourceIssueId, f.issueId)); await db.update(issues).set({ status: "done" }).where(eq(issues.id, f.issueId)); + for (let attempt = 0; attempt < 3; attempt += 1) { + await heartbeat.reconcileStrandedAssignedIssues(); + expect((await db.select().from(issueRecoveryActions).where(eq(issueRecoveryActions.id, hold.id)))[0]) + .toEqual(hold); + expect((await db.select().from(issues).where(eq(issues.id, f.issueId)))[0].status).toBe("done"); + } + await db.update(heartbeatRuns).set({ runnerProfileJson: {} }).where(eq(heartbeatRuns.id, f.runId)); await heartbeat.reconcileStrandedAssignedIssues(); expect((await db.select().from(issueRecoveryActions).where(eq(issueRecoveryActions.id, hold.id)))[0]) .toMatchObject({ status: "resolved", resolutionNote: "source_terminal" }); diff --git a/server/src/__tests__/issue-recovery-actions.test.ts b/server/src/__tests__/issue-recovery-actions.test.ts index dd814866b58..05e96216f61 100644 --- a/server/src/__tests__/issue-recovery-actions.test.ts +++ b/server/src/__tests__/issue-recovery-actions.test.ts @@ -38,6 +38,8 @@ import { deliverReconciledExecutions } from "../services/execution-recovery-reso import { workspaceOperationService, isNativeWorkspaceFinalizationOperationActive } from "../services/workspace-operations.js"; import { issueRecoveryActionService } from "../services/issue-recovery-actions.js"; import { recoveryService } from "../services/recovery/service.js"; +import { issueService } from "../services/issues.js"; +import { withNativeWorkspaceFinalizationOwnership } from "../services/native-runtime/native-workspace-finalization-ownership.js"; import { noticeMetadataReferencesRecoveryAction } from "../services/recovery/successful-run-handoff.js"; const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport(); @@ -2479,6 +2481,51 @@ describeEmbeddedPostgres("issue recovery actions", () => { trigger: "read_projection", recoveryActionId: action.id, }); + expect(activityRows.find((row) => row.action === "issue.recovery_action_resolved")).toMatchObject({ + actorType: "system", actorId: "recovery", agentId: null, + }); + }); + + it.each(["done", "cancelled"])("keeps one workspace owner hold across reads and sweeps of a %s task", async (status) => { + const { companyId, coderId, sourceIssueId } = await seedCompany(); + const runId = randomUUID(); + const owner = { token: randomUUID(), hostname: "old-controller.invalid", pid: 42, processStartedAt: new Date(0).toISOString() }; + await db.insert(heartbeatRuns).values({ + id: runId, companyId, agentId: coderId, nativeIssueId: sourceIssueId, + runtimeMode: "native", status: "failed", finishedAt: new Date(), + runnerProfileJson: { nativeWorkspaceFinalizationOwner: owner }, + }); + await db.update(issues).set({ status }).where(eq(issues.id, sourceIssueId)); + const userId = "board-reader"; + const app = createApp({ type: "board", source: "local_implicit", userId }); + const copyback = vi.fn(); + const recovery = recoveryService(db, { enqueueWakeup: vi.fn(async () => null) }); + let firstAction: typeof issueRecoveryActions.$inferSelect | undefined; + for (let tick = 0; tick < 3; tick += 1) { + expect(await withNativeWorkspaceFinalizationOwnership({ db, companyId, runId }, copyback)).toEqual({ acquired: false }); + const detail = await request(app).get(`/api/issues/${sourceIssueId}`).expect(200); + expect(detail.body.activeRecoveryAction).toMatchObject({ + cause: "native_workspace_finalization_owner_unverified", status: "active", attemptCount: 1, + }); + await request(app).get(`/api/companies/${companyId}/issues?view=compact`).expect(200); + await request(app).get(`/api/issues/${sourceIssueId}/recovery-actions`).expect(200); + await recovery.reconcileStrandedAssignedIssues(); + const actions = await db.select().from(issueRecoveryActions).where(eq(issueRecoveryActions.sourceIssueId, sourceIssueId)); + expect(actions).toHaveLength(1); + firstAction ??= actions[0]!; + expect(actions[0]).toEqual(firstAction); + } + expect(copyback).not.toHaveBeenCalled(); + expect(await issueService(db).list(companyId, { touchedByUserId: userId })).toEqual([]); + expect(await db.select().from(activityLog).where(eq(activityLog.entityId, sourceIssueId))).toHaveLength(0); + + // Only clearing the exact physical owner receipt makes this hold stale. + await db.update(heartbeatRuns).set({ runnerProfileJson: {} }).where(eq(heartbeatRuns.id, runId)); + const cleared = await request(app).get(`/api/issues/${sourceIssueId}`).expect(200); + expect(cleared.body.activeRecoveryAction).toBeNull(); + const rows = await db.select().from(activityLog).where(eq(activityLog.entityId, sourceIssueId)); + expect(rows).toEqual([expect.objectContaining({ actorType: "system", actorId: "recovery", action: "issue.recovery_action_resolved" })]); + expect(await issueService(db).list(companyId, { touchedByUserId: userId })).toEqual([]); }); it("keeps active recovery visible when a plain comment does not create a live path", async () => { diff --git a/server/src/__tests__/issues-service.test.ts b/server/src/__tests__/issues-service.test.ts index 535990d7fd1..4475e075122 100644 --- a/server/src/__tests__/issues-service.test.ts +++ b/server/src/__tests__/issues-service.test.ts @@ -668,6 +668,39 @@ describeEmbeddedPostgres("issueService.list participantAgentId", () => { ]); }); + it("ignores historical reader-attributed recovery cleanup without hiding explicit recovery decisions", async () => { + const companyId = await seedAssignableAgentCompany(); + const userId = "board-user"; + const old = new Date("2026-03-26T10:00:00Z"); + const recent = new Date("2026-03-26T15:00:00Z"); + const variants = [ + { id: randomUUID(), details: { source: "source_revalidation", trigger: "read_projection" }, counts: false }, + { id: randomUUID(), details: null, counts: true }, + { id: randomUUID(), details: { outcome: "restored" }, counts: true }, + { id: randomUUID(), details: { source: "source_revalidation", trigger: "issue_update" }, counts: true }, + ]; + await db.insert(issues).values(variants.map(({ id }) => ({ + id, companyId, title: "Recovery audit", status: "done", updatedAt: old, + }))); + await db.insert(activityLog).values(variants.map(({ id, details }) => ({ + companyId, actorType: "user", actorId: userId, action: "issue.recovery_action_resolved", + entityType: "issue", entityId: id, details, createdAt: recent, + }))); + await db.insert(issueComments).values(variants.map(({ id }) => ({ + companyId, issueId: id, authorUserId: "other-user", body: "An older update", createdAt: old, + }))); + + const expectedIds = variants.filter(v => v.counts).map(v => v.id).sort(); + expect((await svc.list(companyId, { touchedByUserId: userId })).map(v => v.id).sort()).toEqual(expectedIds); + expect(await svc.countUnreadTouchedByUser(companyId, userId)).toBe(expectedIds.length); + const rows = await svc.list(companyId, {}); + for (const variant of variants) { + expect(rows.find(v => v.id === variant.id)?.lastActivityAt).toEqual(variant.counts ? recent : old); + } + // Audit evidence is preserved, including the wrongly attributed old row. + expect(await db.select().from(activityLog).where(eq(activityLog.companyId, companyId))).toHaveLength(variants.length); + }); + function agentRow(companyId: string, input: { id: string; name: string; diff --git a/server/src/routes/issues.ts b/server/src/routes/issues.ts index 13c5e848f6a..3ecbbdab36f 100644 --- a/server/src/routes/issues.ts +++ b/server/src/routes/issues.ts @@ -1,6 +1,7 @@ import { parseObject } from "../adapters/utils.js"; import { enqueueFastResponse } from "../services/fast-responses.js"; import { hasRequiredWorkspaceRecovery, LEGACY_WORKSPACE_RECOVERY_SCHEMA } from "../services/workspace-restore-recovery-state.js"; +import { hasUnverifiedNativeWorkspaceFinalizationOwner } from "../services/native-runtime/native-workspace-finalization-recovery-state.js"; import { monitorPoliciesEqual, applyActorMonitorScheduledBy, assertCanManageIssueMonitor, summarizeIssueMonitor } from "../services/issue-monitors.js"; import type { IssuePrivacyConstraints } from "@paperclipai/shared"; import { canActorReadHeartbeatRun } from "../services/heartbeat-run-privacy.js"; @@ -4344,6 +4345,10 @@ export function issueRoutes( : input.activeRecoveryAction; if (!activeRecoveryAction) return null; + if (await hasUnverifiedNativeWorkspaceFinalizationOwner(db, activeRecoveryAction)) { + return activeRecoveryAction; + } + const resolutionNote = await classifySourceRecoveryRevalidation(input); if (!resolutionNote) return activeRecoveryAction; @@ -4357,13 +4362,12 @@ export function issueRoutes( }); if (!resolved) return activeRecoveryAction; - const actor = input.actor; await logActivity(db, { companyId: input.issue.companyId, - actorType: actor?.actorType ?? "system", - actorId: actor?.actorId ?? "system", - agentId: actor?.agentId ?? null, - runId: actor?.runId ?? null, + actorType: "system", + actorId: "recovery", + agentId: null, + runId: input.actor?.runId ?? null, action: "issue.recovery_action_resolved", entityType: "issue", entityId: input.issue.id, diff --git a/server/src/services/issues.ts b/server/src/services/issues.ts index 35a606cf7d5..e34121a99fa 100644 --- a/server/src/services/issues.ts +++ b/server/src/services/issues.ts @@ -2842,6 +2842,16 @@ const ISSUE_USER_PARTICIPATION_ACTIVITY_ACTIONS = [ "issue.work_product_updated", ] as const; +// Old read projections attributed this automatic cleanup to the reader. Keep +// the audit rows, but do not count them as participation or issue activity. +function automaticReadRecoveryCleanupCondition() { + return sql`( + ${activityLog.action} = 'issue.recovery_action_resolved' + AND COALESCE(${activityLog.details}->>'source', '') = 'source_revalidation' + AND COALESCE(${activityLog.details}->>'trigger', '') = 'read_projection' + )`; +} + function touchedByUserCondition(companyId: string, userId: string) { return sql` ( @@ -2855,6 +2865,7 @@ function touchedByUserCondition(companyId: string, userId: string) { AND ${activityLog.companyId} = ${companyId} AND ${activityLog.actorType} = 'user' AND ${activityLog.actorId} = ${userId} + AND NOT ${automaticReadRecoveryCleanupCondition()} AND ${activityLog.action} IN (${sql.join( ISSUE_USER_PARTICIPATION_ACTIVITY_ACTIONS.map( (action) => sql`${action}`, @@ -2960,6 +2971,7 @@ function issueLatestLogAtExpr(companyId: string) { WHERE ${activityLog.companyId} = ${companyId} AND ${activityLog.entityType} = 'issue' AND ${activityLog.entityId} = ${issues.id}::text + AND NOT ${automaticReadRecoveryCleanupCondition()} AND ${activityLog.action} NOT IN (${sql.join( ISSUE_LOCAL_INBOX_ACTIVITY_ACTIONS.map((action) => sql`${action}`), sql`, `, @@ -5138,6 +5150,7 @@ async function lastActivityStatsForIssues( eq(activityLog.companyId, companyId), eq(activityLog.entityType, "issue"), inArray(activityLog.entityId, issueIdChunk), + sql`NOT ${automaticReadRecoveryCleanupCondition()}`, sql`${activityLog.action} NOT IN (${sql.join( ISSUE_LOCAL_INBOX_ACTIVITY_ACTIONS.map( (action) => sql`${action}`, diff --git a/server/src/services/native-runtime/native-workspace-finalization-ownership.ts b/server/src/services/native-runtime/native-workspace-finalization-ownership.ts index 84227de0049..fcbff05fdee 100644 --- a/server/src/services/native-runtime/native-workspace-finalization-ownership.ts +++ b/server/src/services/native-runtime/native-workspace-finalization-ownership.ts @@ -1,5 +1,6 @@ import { issueRecoveryActionService } from "../issue-recovery-actions.js"; import { nativeSha256 } from "./canonical.js"; +import { NATIVE_WORKSPACE_OWNER_UNVERIFIED } from "./native-workspace-finalization-recovery-state.js"; import { randomUUID } from "node:crypto"; import os from "node:os"; import { and, eq, sql } from "drizzle-orm"; @@ -74,11 +75,18 @@ export async function withNativeWorkspaceFinalizationOwnership( const prior = readOwner(rawPrior); if (rawPrior != null) { const requireStopVerification = async () => { - if (run.issueId) await issueRecoveryActionService(input.db).upsertSourceScoped({ + const fingerprint = nativeSha256({ runId: input.runId, owner: rawPrior }); + const recovery = issueRecoveryActionService(input.db); + const existing = run.issueId ? await recovery.getActiveForIssue(input.companyId, run.issueId) : null; + // Rechecking the same physical owner is not a new recovery attempt. + if (existing?.cause === NATIVE_WORKSPACE_OWNER_UNVERIFIED && existing.fingerprint === fingerprint) { + return { acquired: false } as const; + } + if (run.issueId) await recovery.upsertSourceScoped({ companyId: input.companyId, sourceIssueId: run.issueId, kind: "active_run_watchdog", ownerType: "board", returnOwnerAgentId: run.agentId, - cause: "native_workspace_finalization_owner_unverified", - fingerprint: nativeSha256({ runId: input.runId, owner: rawPrior }), + cause: NATIVE_WORKSPACE_OWNER_UNVERIFIED, + fingerprint, evidence: { runId: input.runId, owner: rawPrior }, nextAction: "Verify the previous controller and its workspace-copyback processes have stopped, then release only this exact workspace owner receipt using doc/native-workspace-finalization-recovery.md. Resume workspace finalization without another provider turn.", wakePolicy: null, maxAttempts: 1, supersedeOnIdentityChange: true, diff --git a/server/src/services/native-runtime/native-workspace-finalization-recovery-state.ts b/server/src/services/native-runtime/native-workspace-finalization-recovery-state.ts new file mode 100644 index 00000000000..71bc4f426c5 --- /dev/null +++ b/server/src/services/native-runtime/native-workspace-finalization-recovery-state.ts @@ -0,0 +1,24 @@ +import { and, eq } from "drizzle-orm"; +import { heartbeatRuns, type Db } from "@paperclipai/db"; +import { isUuidLike, type IssueRecoveryAction } from "@paperclipai/shared"; +import { nativeSha256 } from "./canonical.js"; + +export const NATIVE_WORKSPACE_OWNER_UNVERIFIED = "native_workspace_finalization_owner_unverified"; + +/** A terminal task does not prove that an older controller's copyback stopped. */ +export async function hasUnverifiedNativeWorkspaceFinalizationOwner( + db: Db, + action: Pick, +): Promise { + if (action.cause !== NATIVE_WORKSPACE_OWNER_UNVERIFIED) return false; + const runId = action.evidence?.runId; + if (typeof runId !== "string" || !isUuidLike(runId)) return false; + const [run] = await db.select({ profile: heartbeatRuns.runnerProfileJson }).from(heartbeatRuns).where(and( + eq(heartbeatRuns.companyId, action.companyId), + eq(heartbeatRuns.id, runId), + eq(heartbeatRuns.nativeIssueId, action.sourceIssueId), + eq(heartbeatRuns.runtimeMode, "native"), + )).limit(1); + const owner = run?.profile?.nativeWorkspaceFinalizationOwner; + return owner != null && action.fingerprint === nativeSha256({ runId, owner }); +} diff --git a/server/src/services/recovery/service.ts b/server/src/services/recovery/service.ts index 0a45ab1619b..e4c0f0eacc9 100644 --- a/server/src/services/recovery/service.ts +++ b/server/src/services/recovery/service.ts @@ -93,6 +93,7 @@ import { emitAgentTaskRun } from "../agent-task-run-telemetry.js"; import { budgetService } from "../budgets.js"; import { unadmittedChatWakeupCondition } from "../durable-chat-wakeup.js"; import { issueRecoveryActionService } from "../issue-recovery-actions.js"; +import { hasUnverifiedNativeWorkspaceFinalizationOwner } from "../native-runtime/native-workspace-finalization-recovery-state.js"; import { legacyExecutionNeedsReconciliationWithEvidence, terminalizeLegacyExecution, @@ -3428,6 +3429,10 @@ export function recoveryService( issueIds: [] as string[], }; for (const { action, issue } of rows) { + if (await hasUnverifiedNativeWorkspaceFinalizationOwner(db, action)) { + result.skipped += 1; + continue; + } const wakePolicy = parseObject(action.wakePolicy); const wakePolicyType = readNonEmptyString(wakePolicy.type); if ( diff --git a/skills/paperclip/SKILL.md b/skills/paperclip/SKILL.md index a4f0f95dd06..aa492179608 100644 --- a/skills/paperclip/SKILL.md +++ b/skills/paperclip/SKILL.md @@ -131,6 +131,8 @@ If already checked out by you, returns normally. If owned by another agent: `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. +For attribution questions, read `GET /api/issues/{issueId}/activity`. Sandbox agents can use this issue-scoped route subject to the same company and issue-read authorization. Automatic recovery cleanup is system activity, not evidence that the person viewing a task participated in it. + If the run prompt includes a Paperclip wake payload, inspect that section 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: @@ -708,6 +710,7 @@ If `plan` already exists, first `GET /api/issues/{issueId}/documents/plan` and r | Checkout task | `POST /api/issues/:issueId/checkout` | | Get task + ancestors | `GET /api/issues/:issueId` | | Compact heartbeat context | `GET /api/issues/:issueId/heartbeat-context` | +| Issue activity and attribution | `GET /api/issues/:issueId/activity` | | 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` | diff --git a/skills/paperclip/references/api-reference.md b/skills/paperclip/references/api-reference.md index 596e0648e20..72e12f6a189 100644 --- a/skills/paperclip/references/api-reference.md +++ b/skills/paperclip/references/api-reference.md @@ -107,6 +107,12 @@ POST /api/companies/company-1/exports } ``` +**Issue Activity (`GET /api/issues/:issueId/activity`)** + +Returns the issue's activity history, including actor, action, timestamp, and sanitized details. Sandbox agents can call this read-only route for issues their identity may read. Company boundaries and issue-read authorization still apply; this does not grant company-wide audit access. + +An automatic stale-recovery cancellation has `action: "issue.recovery_action_resolved"` and `details.source: "source_revalidation"`. Page reads use `details.trigger: "read_projection"`. These cancellations belong to the system. Historical reader-attributed rows with that source and trigger do not count as inbox participation or recent issue activity. + ### Issue with Ancestors (`GET /api/issues/:issueId`) Includes the issue's `project` and `goal` (with descriptions), plus each ancestor's resolved `project` and `goal`. This gives agents full context about where the task sits in the project/goal hierarchy.