Files
PaperClipAI/server
DottaandClaude Opus 5.5 8e3b64a257 fix(runner): an unknown agent id says which id and how to find the right one (#20135)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work
> - Agents delegate by creating subtasks through Paperclip's tools. A
tool error must tell the agent how to recover, or it improvises
> - Restart chaos t06 ended a delegation with four children instead of
two
> - Evidence showed no replay: the model built an assignee id from two
real agents' halves and got a bare `paperclip_runner_agent_not_found`
four times
> - To debug the error it created "diagnostic test" subtasks without an
assignee. Those succeeded and were left behind as duplicates
> - This pull request makes the error say which id was not found, which
real agents it most resembles, and to call `list_agents`
> - The benefit is that an agent corrects the id instead of creating
throwaway tasks

## Linked Issues or Issue Description

Refs #19831 (durable ownership plan). Restart chaos wave
`w-20261108T225520-s9501`, task t06 (claude, M1, K2 drain).

**Problem:** parent run 2751fe3c created Part 1 correctly. For Part 2 it
passed `assigneeActorId: 0cb62ac2-742d-442c-acc9-d21dd936e716`: Chaos
claude's prefix with Chaos codex's suffix.
- Four `create_task` calls (keys `part2`, `part2` again, `-v2`,
`-backlog`) each returned only `paperclip_runner_agent_not_found`. One
of them crossed the K2 drain and failed the same way as the one before
it.
- The model then created "Part 2 06f119cf test" (`-noassignee`) and
"Part 2 06f119cf" (`-title-test`), both described as "diagnostic test -
will be removed/ignored". With no assignee they defaulted to the caller.
They stayed in backlog.
- Only after `list_agents` did it create the real Part 2.
- Same-key replays were never the issue: `create_task` stores the
`idempotencyKey` as the child's `origin_id`.

## What Changed

-
`server/src/services/native-runtime/paperclip-runner-tool-authority.ts`:
- `create_task` (assignee) and `get_agent` now fail with
`paperclip_runner_agent_not_found: no agent in this company has id
"<id>". Closest ids: <name> (<id>), …. Call list_agents and copy a valid
id exactly; nothing was created or changed.`
- Suggestions are up to three agents of the caller's company whose ids
share at least eight leading or trailing characters with the missing id.
Another company's agents are never named.
- The recoverable-read check matches the error code before the `:`
details, so a recovered `get_agent` read still returns the error as a
tool result.

## Verification

Red/green:
- `paperclip-runner-tool-authority.test.ts` "names a missing agent id
and its closest real agent instead of a bare code (restart chaos t06)".
It uses t06's spliced id, with a second agent "Chaos claude" in the
company.
  - On master: the error is the bare code (red).
- With this PR: both `create_task` and `get_agent` name the id, `Chaos
claude (0cb62ac2-…)` and `list_agents`, and no task is created.
- The file passes (42 tests), including the existing foreign-company
assignee rejection. `tsc --noEmit -p server` is clean.

## Risks

- One extra read of the company's agents, only on the failure path.
- The message names agents of the caller's own company, which
`list_agents` already returns to it.
- No schema or persisted state change.

## Model Used

Anthropic Claude Opus 5.5 (`claude-opus-5-5`), via Claude Code, with
tool use (shell, file editing).

## 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 (#20069, #20108)
- [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 (no
user docs affected)
- [x] I have considered and documented any risks above
- [ ] All Paperclip CI gates are green (pending)
- [ ] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
(pending)
- [x] I will address all Greptile and reviewer comments before
requesting merge

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 18:26:11 -06:00
..