mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-04 19:28:46 +01:00
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - Contributors use the feature map to understand and verify product capabilities. > - Agents need APIs and usable entry points within their permission boundaries. > - Product recipes and agent access need separate records with shared capability IDs. > - This pull request establishes that contract and gives maintenance ownership of both maps. > - The benefit is repeatable access review without changing product behavior or permissions. ## Linked Issues or Issue Description Refs: #15983, which added the portable verification skills and updated the feature map. This is its contract-only follow-up. Related: #15288 added the original feature map. **Issue type** Missing documentation and maintenance contract. **Where is the issue?** The product map, its missing agent access companions, and the verification skills. **What's wrong?** There is no shared convention for API presence, agent entry points, permission boundaries, access gaps, or evidence. An API declaration does not prove that a permitted native or remote agent can use it. **Suggested fix** Keep the product and agent access maps as siblings under `maps/`. Reuse capability IDs. Record representative source inventory separately from operation review and live proof. Keep both maps aligned through the maintenance skill. ## What Changed - Move the existing product map to `maps/feature-map/`. Preserve its recipes and Poteto format. Update relative links and add companion links. - Add `maps/agent-access-map/` with 35 area files and 171 matching capability IDs. Seed representative API operations, agent paths, policies and known gaps from the reviewed source inventory. Mark entries as `baseline`, `source-only`, and live verification `not-run`. - Define the shared contract in `maps/README.md`. Track API presence, agent availability, policy, evidence and review depth separately. Require operation enumeration before marking a broad capability operation-reviewed. - Extend `maintain-verification-skill` to reconcile both maps and inspect actual route policy and production tool admission. Update creation, verification, notices and contributor references to use the shared contract. - Add `scripts/check-maps.mjs` and ten regression tests. Check matching areas/IDs, indexes, references, contract fields, API method/path examples, justified exceptions and evidence-state consistency. - Keep the coverage inventory unchanged. Preserve skill invocation policies and both MIT license blocks. No product API, permission, UI, runtime helper, migration, dependency or workflow changes. ## Verification - Passed: `node scripts/check-maps.mjs` reports 35 paired areas and 171 matching capability IDs. All local map references resolve. - Passed: `node --test scripts/check-maps.test.mjs` runs ten tests. Fixtures cover missing companions, renamed/orphan/duplicate IDs, broken references, missing operation fields, empty exceptions, missing API examples, empty policy fields, and verified evidence without passed verification. - Passed: metadata validation for all three verification skills. Skill and contributor links resolve. Invocation policies and both license blocks are unchanged. - Compared relocated recipes with current master. Contents differ only in relative links and companion links. `coverage.json` is byte-for-byte unchanged. Master's updated read-only interaction test reference is retained. - Passed: `git diff --check`. The branch starts from current master and contains only this contract change. - Repository-wide typecheck, tests and build were not run locally for this documentation and Node structural-check scope. Live agent access was not exercised. Those gaps are explicit in the baseline entries; the structural check does not certify behavior. CI and automated review are pending. ## Risks - The companions are representative source baselines. They are not complete operation inventories or passed agent journeys. - The checker cannot establish actual permissions, native tool admission, operation completeness or truthful live evidence. Maintenance must inspect source and verify with the actual permitted agent context. - External links to the old product-map directory may need updates. Repository references have been updated. - Existing access gaps and board/user restrictions remain recorded. This contract does not change authority or implement missing paths. ## Model Used OpenAI GPT-6 through Codex assisted with this change. The session does not expose the exact serving model ID, configured context-window size, or reasoning setting. Capabilities used: source analysis, file edits, shell commands, and structural regression tests. ## 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 - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [ ] All Paperclip CI gates are green - [ ] 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>
162 lines
8.5 KiB
Markdown
162 lines
8.5 KiB
Markdown
# Recovery
|
|
|
|
People can see why a task stopped, who owns the next action, and whether a safe
|
|
continuation is available. Recovery retains task context and ownership, honors
|
|
pause and budget gates, and distinguishes confirmed failure from an uncertain
|
|
external outcome. A retry acknowledgement alone is not proof that work resumed.
|
|
|
|
Agent access: [companion](../agent-access-map/recovery.md).
|
|
|
|
## Sub-features
|
|
|
|
- `diagnosis`: a task/run exposes the recorded cause, evidence, owner, attempt
|
|
progress, and next action without requiring a raw-log interpretation.
|
|
- `bounded-continuation`: supported interrupted work continues with preserved
|
|
conversation context and bounded attempts, without blindly replaying tools.
|
|
- `source-action`: source-scoped recovery actions remain attached to the task;
|
|
independent repair work may have its own issue and return owner.
|
|
- `exhaustion`: exhausted or overdue recovery exposes the current gate and
|
|
permitted operator action; it does not claim an automatic path is still live.
|
|
- `workspace`: workspace divergence/export failures show the applicable repair,
|
|
reconcile, or isolated reissue action with evidence and authority checks.
|
|
- `unknown-outcome`: uncertain external side effects require inspection and
|
|
an explicit decision, not automatic replay.
|
|
- `user-continuation`: saved user messages after a stop are reconsidered once
|
|
cleanup proves the old execution is stopped; duplicate wakes are avoided.
|
|
- `reconnect`: browser stream recovery refreshes persisted state without claiming
|
|
the agent itself restarted or that a failed run succeeded.
|
|
|
|
## How to get to it (user POV)
|
|
|
|
### `source-task`
|
|
|
|
Open the affected task from Tasks, Inbox/Blocked, search, or a direct task link.
|
|
Inspect the recovery notice/card in its history, expand details if needed, and
|
|
use the currently offered action. Follow any linked repair task and return owner.
|
|
|
|
### `run-detail`
|
|
|
|
Open the agent's run (`/agents/:agentId/runs/:runId`) from activity or the task's
|
|
run link. The run page hosts workspace recovery controls only for a failed run
|
|
with error code `workspace_validation_failed` and a linked source task that still
|
|
has a live `workspace_validation` recovery action. Use the source task for other
|
|
stopped-run recovery checks.
|
|
|
|
### `operator-retry`
|
|
|
|
On an exhausted disposition or workspace recovery card, inspect the current
|
|
reason and use the permitted retry/repair/reconcile action. Some repairs require
|
|
confirmation; unavailable actions must explain the gate or remain absent.
|
|
|
|
### `post-stop-message`
|
|
|
|
After a stop, send a new instruction on the same task or inspect one already
|
|
saved while cleanup was pending. Observe the waiting message, continuation, and
|
|
eventual result rather than manually changing the task status to look complete.
|
|
|
|
### `browser-reconnect`
|
|
|
|
While viewing an active or recovering task, interrupt the browser connection
|
|
and restore it, or suspend and return to the tab. Reload is a separate check.
|
|
The current task and run state should reconcile with the server.
|
|
|
|
## Driving it
|
|
|
|
Preconditions: follow the [baseline](./README.md#before-driving-a-journey).
|
|
Use a disposable instance and reproducible failure. Record source task/run,
|
|
adapter/runtime mode, cause, attempt count, current owner, and verified stop
|
|
evidence. Do not kill an unrelated server or induce provider side effects just
|
|
to get a failure screen. Use the existing deterministic recovery suite first.
|
|
|
|
### `source-task`
|
|
|
|
Automated: [recovery actions](../../server/src/__tests__/issue-recovery-actions.test.ts)
|
|
covers source scoping, bounded attempts, operator stops, quota monitoring,
|
|
ownership, stale action retirement, and continuation deduplication.
|
|
[Recovery cards](../../ui/src/components/IssueRecoveryActionCard.test.tsx) cover
|
|
diagnosis, retry progress, exhaustion, and action availability. The fixture-backed
|
|
[execution-recovery journeys](../../tests/e2e/execution-recovery/recovery.spec.ts)
|
|
start their own test-drive instances and exercise safe, uncertain, restart,
|
|
manager-lineage, and legacy-unknown paths:
|
|
|
|
```sh
|
|
pnpm exec vitest run server/src/__tests__/issue-recovery-actions.test.ts ui/src/components/IssueRecoveryActionCard.test.tsx
|
|
pnpm exec playwright test -c tests/e2e/execution-recovery/playwright.config.ts recovery.spec.ts
|
|
```
|
|
|
|
Manual: open a stopped task through each affected navigation path. Confirm its
|
|
explanation, original owner, recovery owner if different, and next action. Follow
|
|
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.
|
|
|
|
### `run-detail`
|
|
|
|
Automated: [run workspace recovery](../../ui/src/components/RunWorkspaceRecoverySurface.test.tsx)
|
|
tests this host; it is component coverage, not an end-to-end repair.
|
|
|
|
Manual: prepare a failed run with error code `workspace_validation_failed`, a
|
|
linked source task, and a live `workspace_validation` recovery action on that
|
|
task. Open that exact run and compare its recovery diagnosis to the source task.
|
|
Use an eligible action from the run surface, return to the task,
|
|
and verify the same action state, persisted outcome, and restored execution.
|
|
Repeat with an actor who lacks authority. Verify that the run-page controls are
|
|
absent for other error codes or after the source action retires; continue other
|
|
recovery checks on the source task. Full run-detail navigation remains a manual
|
|
gap.
|
|
|
|
### `operator-retry`
|
|
|
|
Automated: [disposition notices](../../ui/src/components/DispositionRecoveryNotice.test.tsx)
|
|
tests pending/error/gated states and waiting for the real retry acknowledgement.
|
|
The recovery-card suite covers workspace divergence, reissue, reconcile, and
|
|
confirmation. [Workspace export](../../ui/src/components/WorkspaceExportRecovery.test.tsx)
|
|
covers its separate repair surface.
|
|
|
|
Manual: reproduce an exhausted disposable action. Click once, verify pending
|
|
state prevents repeated clicks, and inspect a successful continuation or an
|
|
explicit rejection. Reload to confirm the durable outcome. For a workspace
|
|
repair, record the compared branches/revisions and preserve uncommitted work;
|
|
confirm the repair's actual result before resuming. Check the denied and stale
|
|
action paths. A changed card label is insufficient proof of workspace integrity.
|
|
|
|
### `post-stop-message`
|
|
|
|
Automated: [legacy continuation](../../server/src/services/recovery/legacy-continuation.test.ts),
|
|
[queue routes](../../server/src/__tests__/issue-queued-comments-routes.test.ts), and
|
|
[native restart recovery](../../server/src/services/native-runtime/native-restart-recovery.test.ts)
|
|
cover their respective recovery paths. [Legacy failure continuation](../../tests/e2e/legacy-failure-continuation.spec.ts)
|
|
adds a browser journey; it is not native runtime proof.
|
|
|
|
Manual: stop a disposable run, submit a distinguishable follow-up, and observe
|
|
any cleanup wait. After confirmed stop, verify the follow-up reaches one eligible
|
|
continuation and produces the requested answer. Repeat with a task/ancestor
|
|
pause and a budget hold: recovery must not bypass the gate. For unknown external
|
|
outcomes, inspect the provider before authorizing another operation.
|
|
|
|
### `browser-reconnect`
|
|
|
|
Automated: [live-update recovery](../../ui/src/context/LiveUpdatesProvider.recovery.test.tsx)
|
|
covers client transport recovery with mocks. It does not prove runner restart.
|
|
|
|
Manual: go offline during a disposable run, let the server reach a new state,
|
|
then reconnect. Confirm task/run/attention data refresh without duplicate
|
|
comments or decisions; reload and compare. A healthy websocket proves transport
|
|
only. Separately inspect the underlying execution if it is still stuck.
|
|
|
|
## Gotchas
|
|
|
|
- Legacy and native runtimes have different ownership and restart paths. Record
|
|
which one was exercised instead of inferring coverage from the adapter name.
|
|
- A process disappearance, elapsed timeout, or successful API retry does not
|
|
prove an external tool operation never happened. Unknown outcomes stay unknown
|
|
until corroborated; automatic replay can duplicate a side effect.
|
|
- Active-run watchdogs, task watchdogs, reviewers, and recovery owners have
|
|
different authority. No recovery card grants board permission by itself.
|
|
- Idle Agent Chat is not stranded work. An intentional operator stop must not
|
|
silently trigger recovery that fights the user's instruction.
|
|
- Source inspection and mocked component tests do not qualify real server
|
|
restart continuity. Use the appropriate runtime suite for that claim.
|
|
- See [execution semantics](../../doc/execution-semantics.md) for the governing
|
|
recovery contract and [steering](./steering.md) for saved follow-ups.
|