Files
PaperClipAI/maps/agent-access-map/tasks.md
T
DottaandPaperclip 4145b5048a docs: deepen task, approval, secret, and recovery maps (#16994)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Its feature map describes user journeys. Its access map describes
the matching agent paths.
> - The recent index and capability additions improved discovery and
breadth.
> - Broad baseline records still combined operations with different
actors, permissions, and retry behavior.
> - This pull request reviews the existing task, approval, secret, and
recovery capabilities at operation level.
> - Each operation now has its own access boundary, source evidence, and
verification recipe. Source review remains separate from live proof.

## Linked Issues or Issue Description

Refs: #16987, #16990, #16025. These related pull requests are merged.
The search found no open duplicate or matching issue.

**Issue type**

Missing documentation.

**Where is the issue?**

The paired task, questions-and-approvals, secrets, and recovery files
under `maps/feature-map/` and `maps/agent-access-map/`.

**What's wrong?**

Baseline records do not show enough detail to verify who can perform
each action, which state must persist, or what happens after a denial,
race, or retry. A declared scenario tool can also be mistaken for an
admitted production tool.

**Suggested fix**

Split the four areas into source-reviewed operation records. Add compact
checkpoints to their user recipes. Preserve existing capability IDs and
the map schema.

## What Changed

- Promote 27 existing capability records to `operation-reviewed`, with
125 operation records: tasks 32, questions and approvals 39, secrets 28,
recovery 26.
- Give each operation its own API, agent surface, policy, source
evidence, verification recipe, and remaining gap.
- Separate human, legacy agent, run JWT, native binding, mode, and
resource authority. Split operations where those rules differ.
- Correct production completion paths, plan acceptance and handoff,
question dismissal and withdrawal, secret proposal authority, runtime
recovery grants, and explicit duplicate-risk decisions.
- Preserve access gaps found in source, including the binding-proposal
dependency cascade and narrower native/CLI fields.
- Add one checkpoint table per product recipe for saved results, denial,
races, and retries.
- Keep all 191 existing capability IDs. Change only eight Markdown
files. Keep every operation's evidence `source-only` and verification
`not-run`; the subset below does not prove an entire operation across
its actors and surfaces.

## Verification

Source review uses revision `3bbc2104b65caf9f7763938a01260a5673e12f7a`.
Read-only area reviews and a second source review covered the changed
pairs.

Passed:

- `node scripts/check-maps.mjs`: 35 paired areas, 191 capability IDs,
valid references and fields. This is structural verification.
- `node --test scripts/check-maps.test.mjs
scripts/storybook-feature-index.test.mjs`: 17 passed.
- `node scripts/storybook-catalog.mjs`: 308 files, 2,899 stories.
Generated outputs remain ignored.
- Capability comparison with the base: all 191 IDs unchanged; the four
reviewed areas contain 27 capabilities and 125 source-only operation
records.
- `pnpm -r typecheck` and `pnpm build`.
- `git diff --check`.
- Focused existing interaction and proposal route tests: 80 passed. The
two selected DB-backed suites skipped 119 tests because local embedded
PostgreSQL could not start. These skipped tests are not passes.

Live subset on a fresh local instance with a disposable PostgreSQL
container:

- Created the company and an unassigned task through the browser. Added
a comment and completed the task. The saved status and comment survived
reload.
- Created a managed secret with inert dummy data through the browser.
Its metadata and version survived reload. The metadata response did not
contain the dummy value.
- Created a question fixture through board REST. Invalid input returned
422 and left it pending. Browser dismissal kept it pending and preserved
the draft. Reopening restored the choice. Submission survived reload. A
duplicate response returned 409 and left the saved answer unchanged.
- Used a real issued legacy agent API key. Task read and safe
company-secret catalog returned 200. Full secret listing and run-only
secret list/value routes returned 403. Revoked the key after the checks.
- Read an empty recovery projection. Resolving a nonexistent action
returned 404 and left the task unchanged. This did not execute recovery.
- Closed the owned browser tab and stopped only the verified test
runtime and labelled database container. Evidence survived cleanup. No
provider or model ran.

Limits and retained failures:

- Native embedded PostgreSQL launch failed because the host could not
allocate semaphores. The container-backed app was the successful
alternate environment.
- Full `pnpm test:run` was attempted. Fifteen DB-dependent
native-session cases failed at database startup, and several DB suites
skipped. The run was stopped after repeated failures of that
prerequisite. The full local suite did not pass.
- The sandboxed build attempt failed at the local tsx IPC socket. The
required build passed outside the sandbox.
- The first CI build job passed compilation and production boot, then
its npm-install check was interrupted when the runner received a
shutdown signal. The corrected head passed the full CI run, including
the build and public-install checks.
- Initial Greptile review found the recovery note field and native
search/history limits were inaccurate. Corrected `resolutionNote` and
the production cap of 100, then reran the map checks. Greptile reviewed
the corrected head at 5/5; both earlier threads are resolved.
- An initial harness used a nonexistent generic secret-value URL and
received 404. The actual mapped agent routes were then checked
separately. An initial recovery assertion expected 409; the actual
missing-action contract returned 404. These were harness corrections,
not product fixes.
- Native run bindings, two-person ownership, secret delivery/rotation,
external vaults, provider-stop proof, workspace repair, and actual
recovery execution remain unexecuted. The map does not claim those
journeys passed.

The separate external **Paperclip Review** check is still in progress on
`904509df80cc6de16d36906a410a66786f619b20`. The reviewer reports that
its full changed-file request is pending. CI is green and Greptile is
5/5, but this external review has not published a final assessment. Its
review service must finish that request and assessment.

## Risks

Documentation can become stale as policy and runtime bindings change.
Each operation cites source and retains its verification gaps. The
records describe observed enforcement; they do not authorize broader
access or certify live behavior. This pull request changes no product
code, schema, or permission enforcement.

## Model Used

OpenAI Codex, `gpt-6.1-sol`; 475,000-token context window; xhigh
reasoning; tool use and code execution. Read-only source agents assisted
the area reviews.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` /
`Closes: #` / `Refs: #` OR (b) described the issue in-PR following the
relevant issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass (focused map and route
checks; full-suite host blocker recorded above)
- [x] I have added or updated tests where applicable (existing map
regression tests cover this documentation-only change)
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-10-20 13:59:25 -05:00

51 KiB

Task creation and lifecycle — agent access

Product map: Task creation and lifecycle.

Feature ID: tasks.

Source revision: 3bbc2104b65caf9f7763938a01260a5673e12f7a.

Review depth and executed proof are separate. The operation records enumerate the named behavior and access boundaries. Their evidence states describe the reviewed sources; run results and environment limits belong in the PR or verification artifacts. A listed API or source test does not establish a live authorized journey. Follow the map contract.

Operation review of the six existing task capabilities at 3bbc2104b65caf9f7763938a01260a5673e12f7a. Evidence remains source-only and live verification not-run. Legacy agent REST/CLI require the actual issued identity, company and run context. Native tools require their advertised binding, running native run, current assignment/executionRunId, company/budget/actor authority and responsible-user privacy intersection. Generic native search_api/call_api additionally requires operator rollout admission and a permitted current mode; ordinary mutations are restricted in Ask/Plan, and Muse excludes generic API. GET/HEAD and title PUT are separate mode exceptions. See native transport, paperclip-runner-tool-authority.ts, runner-api-rollout.ts and runner-api-catalog.ts. Declared scenario tools are not production admission. Detailed coordination, questions, steering, documents, goals, workspaces and recovery subflows retain their own maps; the following records enumerate their task-facing entry points without claiming those engines are completely qualified.

create

Capability ID: tasks/create.

Review: operation-reviewed.

Create ordinary work, retry safely, and create child/accepted-plan work with the correct parent and attribution.

create-task

API: present — POST /api/companies/{companyId}/issues.

Agent access: partial — legacy agent REST; CLI issue create; admitted native create_task for its narrow advertised fields, call_api for other permitted fields.

Policy: Title OR nonblank description; assigned omission defaults todo, unassigned omission backlog. Same-company readable parent/project/origin run, tasks:assign and eligible agent/active company person. Agent responsibleUserId rejected; creator attribution server-derived. Skill-test creation forbidden; trust/watchdog/task-bridge ceilings, delegation cycles and host-command denials remain. Native title required, maximum 500 characters, backlog|todo only, standard mode, fixed active-task parent (standalone project work in conversation), default caller assignee; no advertised privacy/labels/mode/workspace/review config. CLI requires title, supports --standalone/--parent-id but lacks many rich fields.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, paperclip-runner-tool-authority.ts, issue.ts, issue-assigned-backlog-contract-routes.test.ts, issue-agent-mutation-ownership-routes.test.ts, task-creation-backlog.test.ts. No live execution claimed.

Verification: not-run — Create unassigned backlog and assigned todo; reload saved content/context/attribution and verify no backlog wake vs one eligible todo wake. Reject foreign/inaccessible parent/project, unavailable assignee, spoofed responsible user, skill-test create and agent host commands. Compare actual native and REST paths.

Gaps: Native/CLI field parity is incomplete. Rich fields require an actually admitted REST fallback; no native/remote CLI availability assumed.

retry-create

API: present — POST /api/companies/{companyId}/issues with a stable idempotencyKey, duplicate policy and optional initialPlan.

Agent access: partial — REST/call_api and native create_task stable key; CLI create has no idempotency-key flag.

Policy: REST deduplicated reuse responds 200 with reason; new task 201. allowDuplicate skips recent-title guard but not key replay. Native durable child origin/fingerprint rejects changed arguments and repairs one durable dispatch on replay. Replays retain current authorization.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, paperclip-runner-tool-authority.ts, issue-create-deduplication-routes.test.ts. No live execution claimed.

Verification: not-run — Repeat identical key after uncertain response; assert same task/plan and one wake. Changed native input/key conflicts. Test recent-title reuse and explicit duplicate separately.

Gaps: No exactly-once external execution inferred from a receipt or single returned ID.

create-child-or-plan-batch

API: present — POST /api/issues/{id}/children; GET/POST /api/issues/{id}/accepted-plan-decompositions.

Agent access: partial — agent REST/call_api; CLI issue child:create --payload-json; dedicated create_task is one current-task child, not arbitrary-parent/batch.

Policy: Readable same-company parent and write influence, tasks:assign, normal creation restrictions. Child API fixes parent/inheritance; acceptanceCriteria maximum 20 entries, 500 characters each; blockParentUntilDone. Batch binds acceptedPlanRevisionId and 1..25 child definitions, with no stale/unaccepted-plan substitution. Source privacy follows child/handoff.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, paperclip-runner-tool-authority.ts, issue.ts, issue-agent-mutation-ownership-routes.test.ts. No live execution claimed.

Verification: not-run — Create child and accepted-plan batch; reload parent/children/criteria/blockers, reject foreign parent/stale plan and verify retry adds no duplicate work. Follow coordination and plan review for their engines.

Gaps: Accepted-plan approval/decomposition engine remains owned by its detailed companion review; this record covers task creation entry/limits.

organize

Capability ID: tasks/organize.

Review: operation-reviewed.

Read task collections, navigation projections and blocked counts; distinguish domain reads from browser layout state.

list-filter-page

API: present — GET /api/companies/{companyId}/issues; optional view=compact.

Agent access: partial — REST/call_api full query; CLI issue list exposes status/agent/project and local --match on one fetched page; native search_tasks query up to 500 characters, statuses, and a declared limit 1..200; production clamps the limit to 1..100 (default 50), without full paging/project/label/workspace knobs.

Policy: Company/read privacy filtering and inaccessible edge redaction; task-bridge company list denied. Default 500, maximum 1000, offset>=0, sortField updated|id, sortDir asc|desc, afterId. Supports status/assignee/participant/project/workspace/parent/descendant/label/origin/text/date and routine/plugin/blocker query groups. includeAgentCreatedTasks=false filters independent roots before search/pagination; omission retains agent/API behavior. includeParticipatedTasks and user me filters require board identity. Compact ETag is actor-private; 429 is not empty results.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, paperclip-runner-tool-authority.ts, issue.ts, issues-list-query-parsing.test.ts, issues-creation-visibility.test.ts, issue-list-assignee-filter-routes.test.ts, private-json-etag.test.ts. No live execution claimed.

Verification: not-run — Compare human/agent/routine/channel tasks, list/compact/full filters and ID pagination without duplicates or inaccessible rows. Reject invalid boolean/date/sort/limit and agent human-only/task-bridge query. Preserve failed/429 result visibly. Request native limit 200 and confirm the production result contains at most 100 tasks.

Gaps: Bounded native search and one-page CLI local match are not complete company-search substitutes.

read-task-and-summaries

API: present — GET /api/issues/{id}; GET /api/companies/{companyId}/issues/summaries?ids=... .

Agent access: partial — REST/CLI issue get; native get_task_context reads CURRENT task only; call_api for eligible arbitrary task/summaries. No dedicated summaries CLI/tool.

Policy: Company/task issue:read; exact identifiers resolved in company context. Summary strict query 1..5 UUIDs/no extra parameters, no-store, omits missing/hidden/private/foreign IDs; task-bridge denied. Locked/redacted parent/project/blocker context does not grant read.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, paperclip-runner-tool-authority.ts, issue.ts, issue-summaries-routes.test.ts, issue-identifier-routes.test.ts, issue-access-grants-routes.test.ts. No live execution claimed.

Verification: not-run — Cold-open current task/identifier, reload after rename, batch own/private/missing/foreign IDs and compare exact navigation fields. Switch company/account, reject private/full read and ensure no stale actor content.

Gaps: A summary result proves neither workspace inspection nor full task/comment access.

blocked-count

API: present — GET /api/companies/{companyId}/issues/count?attention=blocked.

Agent access: available — agent REST/admitted call_api; no dedicated CLI/native count.

Policy: Company/actor/read filters and low-trust boundaries apply. Task-bridge denied; attention=blocked required, limit/offset rejected; supported collection filters shape visible count.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue-blocker-attention.test.ts. No live execution claimed.

Verification: not-run — Compare count to accessible filtered blocked tasks, including inaccessible fixtures; reject other attention/pagination and foreign company.

Gaps: A count is not proof the underlying blocker can be resolved.

collection-presentation

API: not-applicable — list/board, grouping/sort/columns/hierarchy/expanded rows and saved collection preference are browser presentation; resource reads use listed APIs.

Agent access: not-applicable — no agent layout API; permitted underlying task data is separate.

Policy: IssuesList loads/saves browser preferences by company/collection, with separate agent-created visibility. Contextual ancestors/descendants do not become unrelated independent results. No shared server view preference inferred.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; IssuesList.tsx, Issues.tsx, Issues.test.tsx. No live execution claimed.

Verification: not-run — Set list/board/grouping/columns, hide/show automation, search child, open task/back and reload. Verify company/collection scope and Clear filters hidden-automation default; failed read stays visible.

Gaps: Issues.test.tsx covers helpers/URL/paging/constants, not a mounted real-browser list journey. Full shell permutations remain live scope.

properties

Capability ID: tasks/properties.

Review: operation-reviewed.

Separate rename, generic metadata, company labels, assignment, blockers, execution configuration, monitor and watchdog contracts.

rename

API: present — PUT /api/issues/{id}/title; PATCH /api/issues/{id} title is a distinct metadata path.

Agent access: partial — native set_task_title is active/current-task-only; REST/call_api dedicated PUT; CLI issue update --title uses PATCH and lacks provisional/retry-key fields.

Policy: The dedicated title path validates trimmed input, supports onlyIfProvisional, and accepts an optional retry key. Agent must be assigned active RUNNING run bound to exact task/current execution/checkout and chat generation. Board cannot supply run retry key. The per-run receipt limit applies; same-key replay never overwrites later human edit, changed arguments409. Generic PATCH has different policy.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue-title.ts, paperclip-runner-tool-authority.ts, issue.ts, task-title-routes.test.ts. No live execution claimed.

Verification: not-run — Rename/reload references; onlyIfProvisional no-op after human rename. Replay accepted key after later human edit preserves edit. Reject stale/nonowner/idle run, changed key arguments and blank title.

Gaps: Do not claim visible peer PATCH authority grants dedicated title authority.

edit-metadata-context

API: present — PATCH /api/issues/{id}: description, priority, billing/request depth, labels, goal/project/parent and supported metadata.

Agent access: partial — REST/call_api; CLI update exposes a subset, lacking human assignment, label IDs, mode/review/adapter/workspace configuration and CAS flags; no dedicated generic native editor.

Policy: PATCH uses issue:read and issue:mutate with visible-idle-peer writes; another assignee active lock requires management override, own in-progress writes current checkout/run. Same-company readable parent/project and service-valid goals/relations; reject cycles, forged onBehalfOfUserId and agent host commands. Priority API exists but ordinary priority UI editing is hidden.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, issues.ts, issue.ts, IssueProperties.tsx, issue-agent-mutation-ownership-routes.test.ts, issue-workspace-command-authz.test.ts. No live execution claimed.

Verification: not-run — Persist each property group after reload; verify context/ref/count changes without gratuitous execution restart. Reject foreign/private project/parent/goal, cycles, spoof attribution and agent host commands.

Gaps: Goal/workspace engines and configuration variants retain their owning maps; metadata persistence is not usable runtime evidence.

manage-labels

API: present — GET/POST /api/companies/{companyId}/labels; DELETE /api/labels/{labelId}; PATCH task labelIds for attach/detach.

Agent access: available — agent REST/call_api; CLI issue label:list/create/delete for catalog, task labelIds via REST; no dedicated native labels tool.

Policy: Actual catalog routes use company access/resource lookup, without added board role gate. Name trim1..48, color#RRGGBB. Task label attach/detach retains task mutation rules; deleting label affects catalog, not just one task.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, issue.ts, IssueProperties.tsx. No live execution claimed.

Verification: not-run — Create/attach label, filter tasks, reload, detach and delete disposable label. Reject invalid name/color, foreign company and denied task write.

Gaps: No live label workflow claimed; do not confuse catalog delete with per-task detach.

assign-reassign

API: present — PATCH /api/issues/{id} assigneeAgentId/assigneeUserId.

Agent access: partial — REST/call_api; CLI agent assignment only; native reassign_task for another eligible task, never own active task.

Policy: tasks:assign with exact target/project/parent; eligible agent or active person, single assignee. Stop old run before transfer; unconfirmed stop409. Narrow signed legacy current-run self→human handoff can finish; late outgoing edits denied; board/native/key/agent transfer keeps stop rules. Native reassignment requires a retry key, reason, expected owner and status version, denies current task/conversations/terminal/in_review/pending review; preserves blocked/backlog and durable wake replay.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, paperclip-runner-tool-authority.ts, issue.ts, reassign-task.ts, issue-agent-mutation-ownership-routes.test.ts, task-reassignment.test.ts. No live execution claimed.

Verification: not-run — Reload recipient/ownership, race expected-version reassignments and inspect single handoff/wake. Compare legacy self→human final report with board stop; reject late write, stale owner/version and foreign/unavailable recipient.

Gaps: Detailed delegation and governed review handoffs remain task coordination.

set-dependencies

API: present — PATCH /api/issues/{id} blockedByIssueIds replaces whole set.

Agent access: partial — native set_dependencies CURRENT task/standard mode/key+array; REST/call_api arbitrary permitted target; CLI update lacks blocker-set flag.

Policy: Task mutation and valid same-company, nonself/noncycle dependencies. Preserve existing blockers explicitly when replacing. Native Muse additionally checks blocker read. Eligible continuation retains pause/budget/responsible-user/finalization authority.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, paperclip-runner-tool-authority.ts, issue-dependency-wakeups-routes.test.ts, issue-dependency-restore-wake-policy.test.ts. No live execution claimed.

Verification: not-run — Add/replace/remove blockers and reload; reject self/foreign/cycle. Finish prerequisite and verify one eligible dependent continuation, not inferred business success from cancelled status.

Gaps: Detailed readiness and wake variants belong dependencies.

configure-execution

API: present — PATCH /api/issues/{id}: workMode/harnessKind, reviewPolicy/executionPolicy, assigneeAdapterOverrides and supported workspace settings.

Agent access: partial — permitted REST/call_api fields; no general CLI/native configuration tool. Native mode restrictions apply to current call, regardless of requested future mode.

Policy: Policy CAS expectedExecutionPolicy must accompany policy-only write; stale conflict, no smuggled owner/status. Existing governed stage actor/resolver remains authoritative. MCP OAuth cannot participate in review/pending stage or active execution (MCP_REVIEW_REQUIRED/MCP_ACTIVE_EXECUTION). Same-company supported environment; no agent host commands. Saved override is not proof authorized account/runtime.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, runner-api-catalog.ts, issue-execution-policy-routes.test.ts, issue-execution-policy-persistence.test.ts, issue-workspace-command-authz.test.ts. No live execution claimed.

Verification: not-run — Persist config then inspect subsequent actual run mode/model. Reject stale/mixed CAS, foreign environment, agent host commands and restricted-mode mutation; verify no denied request stops existing execution.

Gaps: Review/workspace/runtime engines remain separately reviewed; broad account/provider/config permutations not claimed.

manage-monitor

API: present — PATCH /api/issues/{id} with executionPolicy.monitor; POST /api/issues/{id}/monitor/check-now; GET /api/issues/{id}/diagnostics/wakes.

Agent access: partial — native set_task_monitor standard-mode binding; permitted agent REST/call_api policy PATCH/check-now; no CLI monitor flags. No REST operation named set_task_monitor. Queue and HTTP/2 sandbox callbacks admit the wake-diagnostics read and monitor check-now request. Controller task-read, monitor-management and assignment checks still apply. Recovery resolution and scheduled-retry controls are outside this callback allowance. See the callback bridge and callback boundary tests.

Policy: Native nested monitor|null, optional OWNED target taskId, key<=240, notes1..500, future check/timeouts/attempts<=100; reserved quota service denied, externalRef sanitized. Target assigned same agent/no human, in_progress|in_review; issue:read,runtime:manage,responsible-user authority. REST monitor changes require runtime:manage+current assignee for agent; board role gate differs. Receipt replay returns current schedule without rearming consumed monitor. Check-now cannot bypass recovery/finalization/eligibility.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, paperclip-runner-tool-authority.ts, issue-monitors.ts, issue-monitor-scheduler.test.ts, task-monitor.integration.test.ts, scheduling.test.ts. No live execution claimed.

Verification: not-run — Schedule/reload/yield monitor wait→one wake and consumption; replace/clear, malformed schema correction and consumed-key replay. Deny mode/owner/time/reserved service. Recovery/finalization hold retains due schedule and throttled issue.monitor_deferred; settle/clear then one wake; expiry uses recorded policy with no duplicate escalation or successor ownership change.

Gaps: Retain existing detailed PostgreSQL scheduler/native-monitor/late-result regression boundaries; scripted/no-op execution is not live model recovery.

manage-watchdog

API: present — GET/PUT/DELETE /api/issues/{id}/watchdog; PUT{agentId,instructions?}; create can attach watchdog.

Agent access: partial — agent REST/call_api with exact issue authority; no dedicated native/CLI watchdog editor.

Policy: Read task; mutations stricter task helper, low-trust denial and eligible company watchdog agent. Watchdog-scoped run cannot change watchdog configuration even in watched subtree. Remove disables active config and queues evaluation; repeated disable returnsok.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, task-watchdogs.ts, issue-watchdogs-routes.test.ts. No live execution claimed.

Verification: not-run — Set/update/remove, reload config/activity; retry no duplicate active watcher. Deny wrong company, active peer ownership, low-trust and watchdog self-configuration.

Gaps: Watchdog execution/recovery acceptance remains recovery, beyond this config operation.

discussion

Capability ID: tasks/discussion.

Review: operation-reviewed.

Read, append/retry, author-delete or queued-cancel messages, attach allowed files, and distinguish human feedback from agent reporting.

read-history-comment

API: present — GET /api/issues/{id}/comments and /comments/{commentId}.

Agent access: available — REST/call_api, CLI issue comments/comment:get; native get_task_history CURRENT task only, declared limit 1..200 but production clamps to 1..100 (default 50).

Policy: Company/task issue:read, exact task/comment binding, run/trust redaction. API supports after/afterCommentId, asc|desc, limit cap500. Locked mention edge is not comment read authority.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, paperclip-runner-tool-authority.ts, issue.ts, issue-comment-redaction.test.ts, issue-agent-mutation-ownership-routes.test.ts. No live execution claimed.

Verification: not-run — Read multipage history and exact comment, reload same content; reject inaccessible task, foreign/mismatched comment and inspect trust redaction. Request native limit 200 and confirm at most 100 comments.

Gaps: Native bounded history is not an arbitrary-task/paginated API substitute.

append-retry-comment

API: present — POST /api/issues/{id}/comments; PATCH task with comment.

Agent access: partial — REST/call_api, CLI issue comment/update--comment; native report_progress plain CURRENT-task body+stable key only. answer_status_question is declared but not production-admitted.

Policy: issue:comment/responsible-user/influence ceilings may allow peer/direct-parent reporting without disposition authority. body nonempty, clientRequestId UUID, maximum 20 unique attachment IDs. Agent onBehalfOfUserId rejected; presentation/metadata board-only; authorType cannot gain board wake. Board paused task returns 409. Board Agent Chat additionally flag/owner/clientRequestId. Pending/running retries preserved by ordinary board comments; explicit control separate.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, paperclip-runner-tool-authority.ts, issue.ts, issue-comment-attribution-audit-routes.test.ts, issue-comment-reopen-routes.test.ts, cross-issue-influence-limit-postgres.test.ts. No live execution claimed.

Verification: not-run — Append/mention/reference/file, reload actor/content. Retry same request/key after uncertain response→single message; changed native args conflict. Deny spoof/structured agent fields, foreign task and pause-gated board message; closed peer report stays inert.

Gaps: Conversation, queued delivery, steering, human question continuation and artifacts retain owning recipes; saved message is not delivery/continuation proof.

delete-own-or-cancel-queued

API: present — DELETE /api/issues/{id}/comments/{commentId}; mode=cancel is distinct legacy queued-cancel path.

Agent access: partial — REST/call_api and CLI issue comment:delete; no dedicated native delete.

Policy: Stricter task mutation before author check; only own comment normal deletion. Tombstones and scrubbed references/annotations/training snapshots; repeated deleted result stable. Queued cancel must still own cancelable queue; delivery race409. No general delivered-comment editor.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, issue-comment-cancel-routes.test.ts, issue-queued-comments-routes.test.ts. No live execution claimed.

Verification: not-run — Delete own/reload tombstone/derived cleanup and retry; reject other-author/foreign task. Race queued cancel vs dispatch and inspect persisted winner.

Gaps: Modern queue edit/order/steer/interrupt/discard contract remains steering.

attach-reference

API: present — GET task attachments; POST /api/companies/{companyId}/issues/{issueId}/attachments multipart; GET /api/attachments/{attachmentId}/content; DELETE /api/attachments/{attachmentId}.

Agent access: partial — REST/CLI attachments/upload/download/delete; admitted native multipart call_api or scoped register_deliverable/current-task attachment tools according to actual binding. report_progress is not upload.

Policy: Company/task binding, stricter mutation and deliverable run-context gates. Nonempty permitted bytes, default 10 MiB deployment ceiling via PAPERCLIP_ATTACHMENT_MAX_BYTES; bound conversation owner/flag. In-progress agent requires run; CLI multipart forwards header. Content reads enforce retained task/run privacy including removed records.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, attachment-types.ts, issue-attachment-routes.test.ts, privacy-production-review.test.ts. No live execution claimed.

Verification: not-run — Upload/read/download compare bytes/reload, reject foreign comment/task/wrong run and missing/empty/disallowed/oversize file; delete disposable attachment and verify no read disclosure.

Gaps: Document/work-product/annotation detail and live upload journey belong documents/artifacts; pathname alone is not uploaded deliverable.

human-feedback-vote

API: present — GET/POST /api/issues/{id}/feedback-votes; POST targetType,targetId,vote,reason<=1000,allowSharing.

Agent access: restricted — board identity only; CLI issue feedback:votes/feedback:vote still requires board context; no delegated/native agent voting tool. Human-input request can ask, not impersonate.

Policy: Actual handlers require company-accessible issue lookup and board; GET own user votes. Explicit selected sharing may persist preference/queue export;201 does not wait for remote upload. Do not infer private-task read guard absent from these handlers.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, feedback.ts, feedback.ts, issue-feedback-routes.test.ts, feedback-service.test.ts. No live execution claimed.

Verification: not-run — Vote disposable AI target, reload same-user preference and another user separately; reject agent/foreign company; inspect selected consent and queued state without claiming export completion.

Gaps: Private-task denial must be proved, not invented. Trace/report/export belongs feedback export.

completion

Capability ID: tasks/completion.

Review: operation-reviewed.

Separate status/report acceptance, versioned start, follow-up, checkout/release and deletion; accepted provider report is not final task state.

transition-report-review

API: present — PATCH /api/issues/{id}; POST /api/issues/{id}/stalled-review-decision for board; native paperclip_finish/paperclip_block uses admitted PRP protocol, not a REST endpoint.

Agent access: partial — authorized REST/call_api and CLI status updates; native actual PRP completion/block tools. finish_task/block_task/request_review declarations are excluded from production IMPLEMENTED_OPERATIONS.

Policy: Task mutation/run/assignment/recovery/resolver gates. Blocked requires unresolved blocker/pending input/approval or unblockDescriptor; agent can name only SELF unblock owner. In_review requires actionable path. Native bound completion contract/criterion revision, deliverable evidence and verification must agree; done rejects unfinished work; needs_review names valid different reviewer. Pending input/approval/review/blocker can keep task open. Final state commits after provider turn/workspace finalization; report never overwrites successor/already terminal state.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, paperclip-runner-tool-authority.ts, native-completion-feedback.ts, native-completion-feedback.test.ts, native-deliverable-feedback.test.ts, paperclip-runner-tool-authority.test.ts, issue-stalled-review-decision-routes.test.ts. No live execution claimed.

Verification: not-run — Actual native accepted report→provider stop→workspace finalization→persisted status/output; stale/failed report correction without repeating work. Test blocked/review/done, pending question/blocker, invalid/self/foreign reviewer, missing output and duplicate report.

Gaps: Governed review/approval engines remain questions/approvals; protocol report acceptance is not immediate status commit.

start-backlog-cas

API: present — PATCH /api/issues/{id} exactly{status:todo,expectedStatusVersion:N}, N>=0.

Agent access: partial — agent REST/admitted call_api; CLI update has no expectedStatusVersion; native create_task creates backlog but does not promote existing task.

Policy: Status-only backlog→todo compare under row lock. Intervening status/assignment version including ABA409/no wake; mixed fields422. Existing assignment/run/responsible-user/eligibility gates remain.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, issue-status-version-route-service.test.ts. No live execution claimed.

Verification: not-run — Fresh version start→one eligible wake; race another change and replay old version→unchanged conflict, no second wake; mixed field denial.

Gaps: Use fresh authoritative response; a matching displayed status is not matching version.

follow-up-reopen-restore

API: present — POST /api/issues/{id}/comments or PATCH /api/issues/{id} with a comment and explicit resume/reopen where permitted; tree restore is a separate operation in the coordination map.

Agent access: partial — REST/call_api and CLI comment--resume/--reopen; report_progress alone is not resume authority; no generic dedicated native reopen tool.

Policy: Resume requires comment, eligible assignee, no unresolved blockers/pause and current actor/responsible-user/control authority. Bare cancelled status/reopen uses dedicated restore; structured resume has separate branch. Closed peer reporting inert. Ordinary board comment preserves active/queued retry; parked retry may supersede. Closed workspace restores only after authority gates. MCP pending review/active execution stays blocked.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue.ts, issue-comment-reopen-routes.test.ts, issue-update-comment-wakeup-routes.test.ts, issue-scheduled-retry-routes.test.ts, issue-closed-workspace-routes.test.ts. No live execution claimed.

Verification: not-run — Finish then authorized follow-up→same-task one continuation; plain terminal assignee note stays terminal. Reject paused/blocked/cancelled invalid path/wrong owner. Board message during running retry keeps same executor; parked retry supersedes once.

Gaps: Steering/tree control/recovery recipes own pause/restore/stop and retry repair; do not broaden comment authority.

checkout

API: present — POST /api/issues/{id}/checkout{agentId,expectedStatuses}.

Agent access: partial — REST/CLI issue checkout; agent must claim itself with run ID. Native call_api only where actual admitted run needs it; native is normally already bound.

Policy: Company lookup, tasks:assign when changing assignee, assignability, project pause/budget, subtree pause, dependency readiness and atomic expected status/assignee/execution locks. Same-run retry differs from competing run. Run-id gate before closed workspace reopen. Exact handler differs from generic read/mutation helper; do not invent blanket guard.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, issue.ts, issues-checkout-wakeup.test.ts, issue-stale-execution-lock-routes.test.ts, issue-closed-workspace-routes.test.ts. No live execution claimed.

Verification: not-run — Race two claimants: one owner/executor; same-run retry no duplicate wake. Deny wrong agent/missing run, blocked dependencies, paused project and foreign company; inspect persisted locks.

Gaps: Private-target admission requires negative proof because checkout does not mirror generic issue-read guard placement.

release-force-release

API: present — POST /api/issues/{id}/release; POST /api/issues/{id}/admin/force-release?clearAssignee=true(optional).

Agent access: partial — REST/call_api/CLI issue release permitted owner path; force-release requires board user (CLI command does not confer role); no dedicated native release.

Policy: Normal release stricter mutation, agent run+assignee/matching live checkout; stale missing/terminal lock handled safely. In_progress→todo clears assignee/locks; terminal keeps historic assignee while clearing locks. Force-release explicit clearAssignee and audit, not verified process stop.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, issue.ts, issue-stale-execution-lock-routes.test.ts, issues-service.test.ts. No live execution claimed.

Verification: not-run — Owner release/reload, wrong live agent/run denied, stale lock handling; terminal assignment preserved; agent force-release denied and board prior-lock audit retained.

Gaps: Use recovery for verified termination; clearing locks alone is not provider-stop evidence.

delete-task

API: present — DELETE /api/issues/{id}.

Agent access: partial — permitted REST/call_api and CLI issue delete--yes; no dedicated native deletion.

Policy: Stricter task mutation including active ownership/run constraints; company/task boundaries. Service removes task-owned rows; attachment object cleanup best effort with logged failures. Delete differs from complete/hide/archive; never imply unrelated child erasure.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, issue.ts, issue-remove-cascade.test.ts. No live execution claimed.

Verification: not-run — Delete disposable task/files, inspect list/direct reads/cascades and inaccessible orphan content; reject wrong actor/company, repeat404. Preserve unrelated records per actual service behavior.

Gaps: Storage cleanup failure and retention are distinct from returned task removal; parent removal is not proof all children vanished.

privacy

Capability ID: tasks/privacy.

Review: operation-reviewed.

Treat restriction, audience inspection, direct sharing/revocation, publishing and explicit emergency read as distinct operations.

create-restrict-private

API: present — POST scoped issues visibility=private; PATCH /api/issues/{id} visibility=private.

Agent access: partial — authorized agent REST/call_api restriction; native create_task has no privacy field but inherits source privacy; CLI create/update lacks visibility.

Policy: Read/mutation/current authority; standalone private requires responsible user/personal private project. Parent/private project/source-run privacy provenance protects descendants and standalone handoffs. Server derives responsible identity; management authority is exact task, never privacy-root authority.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, paperclip-runner-tool-authority.ts, privacy-production-review.test.ts, issue-access-grants-routes.test.ts. No live execution claimed.

Verification: not-run — Private create/restrict→reload; protect existing/new descendants and private-run standalone handoff. Ordinary other user cannot discover/open; wrong actor/spoof responsible identity denied.

Gaps: App-record privacy is not filesystem isolation or memory erasure.

inspect-constraints-grants

API: present — GET /api/issues/{id}/privacy-constraints; GET /api/issues/{id}/access-grants.

Agent access: restricted — authorized BOARD manager; agents/shared readers can read eligible task but cannot inspect grants/action hints. Catalog GET label does not override route.

Policy: Issue read then board responsible user/creator/human assignee, active company owner/admin, instance admin/local implicit. Safe publicBlockedBy/leavesPersonalProject hints omit inaccessible scope identity. Lists direct/inherited owner/assignment/project sources; inherited rows no local revoke.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, authorization.ts, IssueShareSheet.tsx, PrivateTaskPrivacyControls.test.tsx, privacy-production-review.test.ts. No live execution claimed.

Verification: not-run — Manager sees correct audience/hints after reload; reader/agent403 and inaccessible404. No unreadable parent/project names.

Gaps: Management role does not automatically grant normal private task read; use actual actor/read branch.

share-directly

API: present — POST /api/issues/{id}/access-grants{subjectType:user|agent,subjectId}.

Agent access: restricted — authorized board manager; no CLI/dedicated native grant tool or delegated agent share. Human-input request can ask responsible person.

Policy: Exact readable managed task; active company user/company agent only(422 invalid); open task returns 409. Created201/existing active200. Read flows downward descendants, never parent/sibling/private project metadata. Shared agent access intersects responsible/authorizing user; memory warning cannot promise unlearning.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, authorization.ts, issue-access-grants-routes.test.ts, privacy-production-review.test.ts. No live execution claimed.

Verification: not-run — Share child/reload both people: child+descendants visible, parent/sibling/project hidden. Repeat share one grant. Reject open/foreign/nonmember and shared-reader/agent mutation.

Gaps: A grant alone does not authorize shared agent acting for another unauthorized person.

revoke-direct-inherited

API: present — POST /api/issues/{id}/access-grants/{grantId}/revoke; inherited source edits use ancestor grant/project membership APIs.

Agent access: restricted — authorized board manager; no agent delegation established.

Policy: Grant must belong to EXACT managed task, active matching grant else404; child manager cannot revoke ancestor/sibling. Other assignment/project/ancestor grants remain; assignment grants sticky after unassignment until revoked. Implicit owner access changes via role not local revoke. Live reads reauthorize; memory cannot be erased.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, authorization.ts, IssueShareSheet.tsx, issue-access-grants-routes.test.ts, privacy-production-review.test.ts. No live execution claimed.

Verification: not-run — Revoke/reload/retry cold/direct/socket access with no independent source→denied. Source-edit inherited access separately, independent source retained. Reject wrong ancestor/sibling grant and repeat404.

Gaps: A successful direct revoke does not prove complete audience removal if independent sources remain.

publish-private

API: present — PATCH /api/issues/{id} visibility=open.

Agent access: restricted — authorized board manager; agent call_api cannot publish.

Policy: Private parent/nonpersonal private project blocks; personal-project task may leave personal project. Confirmation discloses task/comments/docs/history; private children stay private. Current constraints rechecked under privacy-tree lock, not just optimistic hints.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issues.ts, IssuePrivacyActions.tsx, PrivateTaskPrivacyControls.test.tsx, privacy-production-review.test.ts. No live execution claimed.

Verification: not-run — Cancel confirmation leaves private; valid publish visible after reload/private child remains denied. Reject private parent/project and raced stale constraint; deny agent widening.

Gaps: Do not infer existing private descendants became public from parent or project discovery.

break-glass-read

API: present — GET /api/issues/{id}?breakGlass=true.

Agent access: restricted — eligible board company owner/admin explicit read, no agent path; instance/local normal admin bypass separate.

Policy: Private-read denial plus eligible explicit owner/admin gate; emits audit and owner-visible issue notice, not persistent share or arbitrary grant mutation. Ordinary member flag still404.

Evidence: source-only — reviewed at 3bbc2104b65caf9f7763938a01260a5673e12f7a; issues.ts, issue-access-grants-routes.test.ts. No live execution claimed.

Verification: not-run — Compare eligible owner/admin ordinary denied with explicit read/audit+notice; ordinary operator/agent/foreign denied, grants unchanged.

Gaps: Local implicit/instance admin bypass cannot establish ordinary two-user private isolation.