Revert the pane split; write the plan that maps every Paperclip object to a screen

This commit is contained in:
Sam
2026-11-10 16:41:17 +11:00
parent 851a15be74
commit 7f18c548fe
4 changed files with 142 additions and 0 deletions

141
docs/PLAN-INTERFACE.md Normal file
View File

@@ -0,0 +1,141 @@
# The plan, and how the interface sits on Paperclip
Written 2026-11-10, after a wrong turn: I split every workspace into three panes without
being asked, and it broke the working layout. It has been reverted. This document says what
exists, what is proposed, and which Paperclip endpoint each thing reads or writes. Nothing
here is invented: every endpoint below was called on this machine and answered.
## What is on screen today
Seven workspaces, one pane each: `Shell>shell`, `Board>board`, `Work>work`, `Reply>reply`,
`New task>new`, `Project>project`, `Repair>repair`. Inside a pane the program draws several
panels (Board draws three), and you switch focus with Tab. That is the state that works.
## Paperclip's objects, and where each one is seen
| Paperclip object | Endpoint, measured | Where it appears now |
|---|---|---|
| company | `GET /api/companies/{id}` | not shown; the id is in the project file |
| project | `GET /api/companies/{id}/projects` | `Project>project` |
| task | `GET /api/companies/{id}/issues`, `GET /api/issues/{id}` | `Board>board`, `Reply>reply` task panel |
| blockers of a task | `GET /api/issues/{id}/diagnostics/blockers` | `Board>board`, per row |
| comment thread | `GET /api/issues/{id}/comments` | `Reply>reply` |
| runs of a task | `GET /api/issues/{id}/runs` | `Work>work` |
| activity | `GET /api/issues/{id}/activity` | `Board>board` needs-you tab, `Work>work` |
| cost per task | `GET /api/issues/{id}/cost-summary` | `Board>board` detail, `Work>work` facts, `Project>project` costs |
| worktree and branch | the task's `currentExecutionWorkspace` | `Work>work` change and facts |
| agents | `GET /api/companies/{id}/agents` | `Project>project` facts and limits, by name and budget |
| **an agent's runs, company-wide** | `GET /api/companies/{id}/heartbeat-runs` | **nowhere yet** |
| **a run's log** | `GET /api/heartbeat-runs/{runId}/log` — 300 KB of JSON lines for one finished run | **nowhere yet** |
| **a run's events** | `GET /api/heartbeat-runs/{runId}/events` | **nowhere yet** |
| agent pause, resume, wake | `POST /api/agents/{id}/pause`, `/resume`, `/wakeup` | **nowhere yet** |
| agent settings | `PATCH /api/agents/{id}` — accepts `role`, `adapterConfig` (the model), `runtimeConfig` (heartbeat), `budgetMonthlyCents`, `status` | **nowhere yet** |
So the honest answer to "where do I see the Pi agents working": **you cannot, yet.** The data
is all there and the runs are already recorded — 281 of them on this instance — but no screen
shows them. That is the largest missing piece, and it is the next workspace.
## Missing: the Agents workspace
This is the one the person keeps asking for and it does not exist. Proposed as one pane, the
same shape as the others, drawing three panels with tabs:
```
Agents>agents
╭─ agents roster runs ╮
│ Campfire idle
│ ● Builder running AUD-163 started 14:12 1m 20s 1 cent
│ ● Hub idle last run 13:58
│ ● Documenter idle
╰───────────────────────────╯
```
- **roster** — every agent: name, state (`idle`, `running`, `needs input`, and Paperclip's
own status), current task if any, spend this month, budget. From
`GET /api/companies/{id}/agents`.
- **runs** — the company's run list, newest first: agent, task, state, what woke it, start,
duration, cost. From `GET /api/companies/{id}/heartbeat-runs` (281 today).
- **log** — the tail of the chosen run, from `GET /api/heartbeat-runs/{runId}/log`. This is
the closest thing to "watching Pi work": the log grows while the run is live, and
`lastOutputAt`/`lastOutputBytes` on the run say how fresh it is.
Actions, all with the user key, all reversible:
- `enter` on a run → its log in the log tab.
- `p` pause, `P` resume an agent (`POST /api/agents/{id}/pause|resume`).
- `w` wake an agent (`POST /api/agents/{id}/wakeup`).
- `e` open its settings (see below).
## Missing: working on an agent — role, model, cost
Paperclip owns these, so the interface edits Paperclip, never a local file. One more panel,
`Agents>settings`, or a tab inside `Agents>agents`:
| Field | Paperclip field | Endpoint |
|---|---|---|
| name and job title | `name`, `title` | `PATCH /api/agents/{id}` |
| role | `role` | same |
| who it reports to | `reportsTo` | same |
| model (the LLM) | `adapterConfig.model` | same, with `replaceAdapterConfig` care |
| heartbeat on/off, concurrency | `runtimeConfig.heartbeat` | same |
| monthly budget | `budgetMonthlyCents` | same |
| pause / resume | `POST /api/agents/{id}/pause`, `/resume` | separate calls |
Two rules that fall out of this and are not negotiable: a change to a model applies to that
agent's **next** run, never to one in flight; and a budget change is recorded with who
changed it, because Paperclip's audit trail is the only record we have.
## Tool panels: Lazygit, Hunk, a shell, the review
Both are installed on this machine and I verified the paths:
`/run/current-system/sw/bin/lazygit` and `/etc/profiles/per-user/sam/bin/hunk`.
They are **not** to be reimplemented. The proposal is one key in `Work>work`:
- `t` opens a chooser: `shell · lazygit · hunk · git log · ocr`.
- The chosen tool opens as a pane **in the current workspace**, beside the panel you were
reading, and takes focus.
- `q` or `esc` closes it and focus returns exactly where it was.
- Nothing is created until you ask, so the layout stays as it is today.
This is the answer to "I thought we had Lazygit and Hunk": they are installed, they are not
wired in, and wiring them in is one pane-opener plus a key.
## The review: ocr is installed and has already run
`ocr` is at `/home/sam/.local/bin/ocr`, version `open-code-review v1.13.6`. It is in the
project's `bin/merge` and `bin/review`, and it has blocked a real merge: on `AUD-165` it
reported a critical finding (`rm -rf "$HOME/tmp"` deleting `/tmp` when `HOME` is empty) and
the merge was refused. The Repair screen once said "not on the path" because a pane started
by TUIOS gets a smaller PATH than a shell; that was fixed by looking in the usual places.
Where it belongs in the interface: a **review panel inside `Work>work`**, showing the last
verdict for the chosen task, its findings, and the blocking ones in red. The merge stays a
command (`bin/merge`), because a merge is a decision with a lock, not a keystroke.
## Mouse-1 and Switch
Measured just now: **not installed** — no `mouse`, `mouse1` or `switch` binary on this
machine, and nothing obviously serving them locally. So nothing can be built on them yet
without adding software first.
Where they would fit if added: Mouse-1 is a small probability model that answers typed
questions; Switch turns a state into those questions. The honest use in this factory is
**routing and judgement that must be cheap and repeatable** — "is this task ready", "does
this comment answer the question", "which agent should take this" — rather than prose
generation. That is a later milestone, after agents and the review panel, and it needs a
decision about installing both, plus a measurement of whether they are better than the
existing cheap model already configured for agents (`omni/deepseek/deepseek-v4-flash`).
## The order I propose
1. **Agents workspace** — roster, runs, log. This is the missing view of Pi working, and it
is read-only, so it cannot break anything.
2. **Agent settings** — role, model, budget, pause/resume. First write surface aimed at
agents rather than tasks.
3. **Tool panels** — `t` opens Lazygit, Hunk, a shell, `ocr` in the current workspace.
4. **Review panel** in `Work>work` — the last verdict and its findings, beside the diff.
5. **Mouse-1 / Switch** — only after the above, and only after they are installed and
measured.
Each of the first four is one pane, one program, no change to the working layout. Nothing in
this list requires splitting workspaces again.