Confirmed by experiment: how a picker can assign skills per agent, and where the boundary is

This commit is contained in:
Sam
2026-11-11 08:58:23 +11:00
parent 47aacfd6d1
commit e44b0dff51
6 changed files with 527 additions and 0 deletions

View File

@@ -515,3 +515,88 @@ Committed as `77014d0` — documentation only, nothing in the running layout cha
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-pi-2026-11-10-21-03-21|Rich discovery: .pi 2026-11-10 21:03:21]]
- context: [[packs/paperclip-harness/20-context/home|.pi]]
- runbook: [[packs/paperclip-harness/70-runbooks/tmp-deployment-operations|.pi deployment operations]]
---
## Update (2026-11-10 21:14:03)
## Deployment/runbook details discovered (2026-11-10 21:14:03)
You are right, and my explanation was wrong in a way that matters. Correcting it.
## Per-agent skills already exist — that is the design
`GET /api/agents/{id}/skills` returns a **separate** `desiredSkills` list for every agent. Setting it is one call:
```
POST /api/agents/{id}/skills/sync
{ "mode": "replace",
"desiredSkills": ["company/<id>/nixos-workflow", "paperclipai/paperclip/paperclip"] }
```
`replace` means "this agent gets exactly these". At run time the adapter builds a directory from **that agent's** list and passes it as `--skill`. Builder had its own list; Documenter has another. Different agents, different skills, no picker needed.
What I got wrong: I let a narrow caveat ("links persist in the shared directory, so a skill can linger") stand in for the whole model, which read as "one set for everybody". It is not. The list is per agent and it is stored in Paperclip.
Skills are drawn from `GET /api/skills/available`, the company list, and the catalog — any of which can be assigned to any agent with the call above.
## Per-agent extensions: yes, through the command
The adapter's own configuration document says the command defaults to `pi` and is settable per agent, and so is `env`:
```
adapterConfig.command defaults to "pi"
adapterConfig.env KEY=VALUE pairs
```
So an agent gets its own wrapper:
```sh
#!/bin/sh
exec pi --extension npm:pi-memctx \
--extension git:https://gitea…/pi-config/extensions/tavily-search/index.ts \
"$@"
```
and `PATCH /api/agents/{id}` sets `adapterConfig.command` to that file. The adapter appends its own arguments (`--mode json`, `--session`, `--skill`, `--tools`, `--model`) to whatever the command is, so the wrapper is additive and cannot break the run. `env` is the same lever for environment.
That gives you, today and without touching Paperclip's source:
- one wrapper per role — `builder`, `documenter`, `reviewer` — each with its own extension list;
- a place to pass `--no-skills` if you ever want strict isolation;
- a place to keep the tool list deliberately small.
So the honest summary is: **skills are per agent in Paperclip already; extensions are per agent through the agent's command.** My "one global set" sentence was simply false.
## History — three options, best first
1. **Open the real Pi session in a pane.** Every run is written to `~/.pi/paperclips/<timestamp>-<agentId>.jsonl` and Pi is started with `--session <file>`. A pane running `pi --session <that file>` shows the actual conversation with Pi's own interface, and can be continued. No new code — a tool-pane entry that takes a file path. The only risk is two writers on one session file, so use it on finished runs or as a deliberate hand-over.
2. **A read-only transcript tab** in `Agents>agents`, drawn from the same JSONL. Integrated and safe, less faithful.
3. **`pi --resume`** in a tool pane and pick the session from Pi's own list. Simplest, but you find it by eye.
`GET /api/agents/{id}/task-sessions` maps task → session file and working directory, so options 1 and 2 have a reliable index.
Written into `docs/PLAN-INTERFACE.md` as a correction; committed as `47aacfd`. Nothing in the running layout changed.
If you want, the next build can be small and specific: an `Agents>skills` tab that lists an agent's skills and adds or removes them with those two calls, and a `t` tool-pane entry that opens a chosen Pi session. Say which.
## Source paths observed
- `nix/store/rg248h9sz8dylm8p6a9w9fj4zrv4sgm5-pi-coding-agent-0.82.1/lib/node_modules/pi-monorepo/docs/usage.md`
- `paperclipai/paperclip/paperclip`
- `api/skills/available`
- `pi-config/extensions/tavily-search/index.ts`
## Evidence
- Confidence: 83%
- Reason: Extracted repeatable deploy/configuration procedure from rich discovery
## Related learned memories <!-- same-turn-2026-11-10 21:14:03 -->
- session: [[packs/paperclip-harness/80-sessions/paperclip-pi-adapter-per-agent-skills-and-per-agent-extensio|Paperclip + Pi adapter: per-agent skills and per-agent extensions]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-paperclipai-2026-11-10-21-14-03|Rich discovery: paperclipai 2026-11-10 21:14:03]]
- context: [[packs/paperclip-harness/20-context/paperclipai|paperclipai]]
- runbook: [[packs/paperclip-harness/70-runbooks/tmp-deployment-operations|paperclipai deployment operations]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|paperclipai repository structure and configuration patterns]]