Cleanup confirms and refreshes; projects switch sessions in place; explain verify.sh, headroom and Mouse-1

This commit is contained in:
Sam
2026-11-11 15:57:42 +11:00
parent 36abdc1f84
commit e02b39943d
13 changed files with 662 additions and 7 deletions

View File

@@ -0,0 +1,87 @@
---
type: context
id: context.paperclip-harness.omni
title: omni
status: active
source_of_truth: false
freshness: current
last_reviewed: 2026-11-11
tags:
- pack/paperclip-harness
- agent-memory/context
- autolearn
- rich-discovery
- repo/omni
---
# omni
## Rich discovery update (2026-11-11 04:06:03)
The cleanup column navigates now, and the remaining list is finished except the one item that needs a decision from you.
## Cleanup navigation
The bug was that `↑`/`↓` scrolled the body, never the selection. They now move through the list, the chosen row shows `▸`, and a ticked row shows `*`:
```
session panes last used state
▸ paperclip-harness 10 11 Nov 15:04 this project's session
tuios coding harness 4 11 Nov 15:03 attached, or on another machine
* office-test-1 26 10 Nov 11:24 ticked for closing
```
`space` ticks, `x` closes the ticked ones after asking, and protected or attached sessions are refused with a line saying why.
## The rest of the list
**7. Costs as a chart** — `Project>costs` now draws each task's spend against the largest, using the figures already loaded, so no extra API calls:
```
task state cents runs share of the largest
AUD-163 done 3 3 ████████████████████████
AUD-164 done 2 2 ████████████████
AUD-159 done 1 1 ████████
```
**5. The `office` scaffold** — `bin/office` now writes what is missing, never overwriting: `.harness/verify.sh` (with a comment explaining how to replace it, and what happens if you do not) and `.harness/NOTES.md` for the person. Adopting a folder no longer leaves it without a place to say what "finished" means.
**8. Memory per agent, read-only** — `Agents>settings` ends with a line read from the agent's command and the global Pi settings:
```
memory and extensions
extensions: the global set · memory: pi-memctx
```
It states only what it has read. When you want to decide which agent uses engram or headroom, that line is where the answer will go — but the switch itself needs your input on what "using headroom" should mean for an agent that runs for ninety seconds.
## What is left, honestly
- **MOUSE-1** — key present, software not installed. Policy from the old project stands: triage only, never a gate. It needs the software before it needs a screen.
- **Switching projects** — the list is there; actually switching means tearing down these panes and building another project's, and a project on `.27` cannot be opened from `.13` at all. That is a design decision for you, not a missing key.
- **Memory switches** — awaiting your call on what they control.
Everything else in `docs/NEXT.md` is now marked done. Committed as `36abdc1`; the eight workspaces were rebuilt and are running on the new build.
## Source paths observed
- `omni/deepseek/deepseek-v4-flash`
## Evidence
- Confidence: 84%
- Reason: Update component/repository context with detailed discovered structure and configuration
## Related
- [[packs/paperclip-harness/00-system/pi-agent/memory-manifest|Memory Manifest]]
## Related learned memories <!-- same-turn-2026-11-11 04:06:03 -->
- observation: [[packs/paperclip-harness/60-observations/paperclip-harness-cleanup-navigation-and-ui-conventions|paperclip-harness cleanup/navigation and UI conventions]]
- decision: [[packs/paperclip-harness/50-decisions/paperclip-harness-ui-six-workspaces-spec-first-four-panel-li|Deferred agent memory switch (engram vs headroom) pending user definition]]
- action: [[packs/paperclip-harness/40-actions/2026-11-10-wrote-docs-ui-layout-md-and-three-live-layout-mockups|Implemented cleanup navigation, cost bars, office scaffold, and per-agent memory read-out (commit 36abdc1)]]
- session: [[packs/paperclip-harness/80-sessions/paperclip-harness-cleanup-column-navigation-fix-cost-bars-of|paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-omni-2026-11-11-04-06-03|Rich discovery: omni 2026-11-11 04:06:03]]
- context: [[packs/paperclip-harness/20-context/omni|omni]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|omni repository structure and configuration patterns]]

View File

@@ -667,3 +667,35 @@ Remaining in `docs/NEXT.md`: spend chart, the `office` scaffold, memory per agen
- context: [[packs/paperclip-harness/20-context/config|.config]]
- runbook: [[packs/paperclip-harness/70-runbooks/tmp-deployment-operations|.config deployment operations]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|.config repository structure and configuration patterns]]
---
## Update (2026-11-11 04:06:03)
Deliverable: finished remaining docs/NEXT.md items for paperclip-harness except blocked/design-decision items.
Key artifacts/changes:
- Cleanup list UI: ↑/↓ now move selection (▸) rather than scroll; space ticks (*); x closes ticked after confirmation; protected/attached sessions refused with a reason line.
- Project>costs: bar chart of each task's spend relative to the largest, reusing loaded figures (no extra API calls).
- bin/office: writes only missing .harness/verify.sh (with replacement/comments guidance) and .harness/NOTES.md; never overwrites.
- Agents>settings: appends read-only 'memory and extensions' line read from agent command and global Pi settings (e.g. extensions: the global set · memory: pi-memctx).
Validation/result: verified via build=0, syntax ok, screens exercised in tuios panes (project/agents/repair windows). Eight workspaces rebuilt and running on new build. Committed as 36abdc1.
Follow-ups: MOUSE-1 (triage-only, needs software), project switching design (.27 vs .13 boundary), memory switch semantics pending user input.
## Evidence
- Confidence: 90%
- Reason: Completed work with commit, artifacts, and validation results.
## Related learned memories <!-- same-turn-2026-11-11 04:06:03 -->
- observation: [[packs/paperclip-harness/60-observations/paperclip-harness-cleanup-navigation-and-ui-conventions|paperclip-harness cleanup/navigation and UI conventions]]
- decision: [[packs/paperclip-harness/50-decisions/paperclip-harness-ui-six-workspaces-spec-first-four-panel-li|Deferred agent memory switch (engram vs headroom) pending user definition]]
- action: [[packs/paperclip-harness/40-actions/2026-11-10-wrote-docs-ui-layout-md-and-three-live-layout-mockups|Implemented cleanup navigation, cost bars, office scaffold, and per-agent memory read-out (commit 36abdc1)]]
- session: [[packs/paperclip-harness/80-sessions/paperclip-harness-cleanup-column-navigation-fix-cost-bars-of|paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-omni-2026-11-11-04-06-03|Rich discovery: omni 2026-11-11 04:06:03]]
- context: [[packs/paperclip-harness/20-context/omni|omni]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|omni repository structure and configuration patterns]]

View File

@@ -213,3 +213,76 @@ Decision: In the paperclip-harness TUI, pressing `m` on a task no longer merges
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-tmp-2026-11-11-01-58-59|Rich discovery: tmp 2026-11-11 01:58:59]]
- context: [[packs/paperclip-harness/20-context/tmp|tmp]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|tmp repository structure and configuration patterns]]
---
## Update (2026-11-11 04:06:03)
Decision: keep Agents>settings memory line read-only for now; do not implement a per-agent memory backend switch (engram vs headroom) until the user defines what 'using headroom' means for an agent that runs ~90 seconds.
Context: memory read-out shows 'memory: pi-memctx' from Pi global settings. Switching projects also deferred: list exists but actual switching requires tearing down panes and building another project's; projects on .27 cannot be opened from .13 — a design decision for the user.
Consequences: docs/NEXT.md otherwise complete at commit 36abdc1. MOUSE-1 remains triage-only, never a gate, and needs software installed.
## Detailed decision context from completed turn
The cleanup column navigates now, and the remaining list is finished except the one item that needs a decision from you.
## Cleanup navigation
The bug was that `↑`/`↓` scrolled the body, never the selection. They now move through the list, the chosen row shows `▸`, and a ticked row shows `*`:
```
session panes last used state
▸ paperclip-harness 10 11 Nov 15:04 this project's session
tuios coding harness 4 11 Nov 15:03 attached, or on another machine
* office-test-1 26 10 Nov 11:24 ticked for closing
```
`space` ticks, `x` closes the ticked ones after asking, and protected or attached sessions are refused with a line saying why.
## The rest of the list
**7. Costs as a chart** — `Project>costs` now draws each task's spend against the largest, using the figures already loaded, so no extra API calls:
```
task state cents runs share of the largest
AUD-163 done 3 3 ████████████████████████
AUD-164 done 2 2 ████████████████
AUD-159 done 1 1 ████████
```
**5. The `office` scaffold** — `bin/office` now writes what is missing, never overwriting: `.harness/verify.sh` (with a comment explaining how to replace it, and what happens if you do not) and `.harness/NOTES.md` for the person. Adopting a folder no longer leaves it without a place to say what "finished" means.
**8. Memory per agent, read-only** — `Agents>settings` ends with a line read from the agent's command and the global Pi settings:
```
memory and extensions
extensions: the global set · memory: pi-memctx
```
It states only what it has read. When you want to decide which agent uses engram or headroom, that line is where the answer will go — but the switch itself needs your input on what "using headroom" should mean for an agent that runs for ninety seconds.
## What is left, honestly
- **MOUSE-1** — key present, software not installed. Policy from the old project stands: triage only, never a gate. It needs the software before it needs a screen.
- **Switching projects** — the list is there; actually switching means tearing down these panes and building another project's, and a project on `.27` cannot be opened from `.13` at all. That is a design decision for you, not a missing key.
- **Memory switches** — awaiting your call on what they control.
Everything else in `docs/NEXT.md` is now marked done. Committed as `36abdc1`; the eight workspaces were rebuilt and are running on the new build.
## Evidence
- Confidence: 80%
- Reason: Explicit deferral and rationale for design decisions.; enriched with final-answer detail because persistence should be reusable
## Related learned memories <!-- same-turn-2026-11-11 04:06:03 -->
- observation: [[packs/paperclip-harness/60-observations/paperclip-harness-cleanup-navigation-and-ui-conventions|paperclip-harness cleanup/navigation and UI conventions]]
- decision: [[packs/paperclip-harness/50-decisions/paperclip-harness-ui-six-workspaces-spec-first-four-panel-li|Deferred agent memory switch (engram vs headroom) pending user definition]]
- action: [[packs/paperclip-harness/40-actions/2026-11-10-wrote-docs-ui-layout-md-and-three-live-layout-mockups|Implemented cleanup navigation, cost bars, office scaffold, and per-agent memory read-out (commit 36abdc1)]]
- session: [[packs/paperclip-harness/80-sessions/paperclip-harness-cleanup-column-navigation-fix-cost-bars-of|paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-omni-2026-11-11-04-06-03|Rich discovery: omni 2026-11-11 04:06:03]]
- context: [[packs/paperclip-harness/20-context/omni|omni]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|omni repository structure and configuration patterns]]

View File

@@ -0,0 +1,92 @@
---
type: observation
id: observation.paperclip-harness.paperclip-harness-cleanup-navigation-and-ui-conventions
title: paperclip-harness cleanup/navigation and UI conventions
status: active
source_of_truth: false
freshness: current
last_reviewed: 2026-11-11
tags:
- pack/paperclip-harness
- agent-memory/observation
- paperclip-harness
- ui-conventions
- safety
- office
---
# paperclip-harness cleanup/navigation and UI conventions
paperclip-harness tabular list conventions (from cleanup column and costs work):
- List selection is rendered with '▸' on the current row; ticked/selected-for-action rows show '*'.
- Navigation keys ↑/↓ move list selection, not body scroll; space toggles tick; x acts (closes ticked items after confirmation).
- Destructive actions must refuse protected sessions and attached/on-another-machine sessions, printing an explanatory line rather than failing silently.
- Cost bars scale to the largest spender and reuse already-fetched numbers; avoid new API calls for display-only features.
- bin/office adoption semantics: only create missing files (.harness/verify.sh, .harness/NOTES.md); never overwrite existing ones.
- Agents>settings should only state what it has read (extensions + memory from agent command/global Pi settings), not infer choices.
## Detailed observations from completed turn
The cleanup column navigates now, and the remaining list is finished except the one item that needs a decision from you.
## Cleanup navigation
The bug was that `↑`/`↓` scrolled the body, never the selection. They now move through the list, the chosen row shows `▸`, and a ticked row shows `*`:
```
session panes last used state
▸ paperclip-harness 10 11 Nov 15:04 this project's session
tuios coding harness 4 11 Nov 15:03 attached, or on another machine
* office-test-1 26 10 Nov 11:24 ticked for closing
```
`space` ticks, `x` closes the ticked ones after asking, and protected or attached sessions are refused with a line saying why.
## The rest of the list
**7. Costs as a chart** — `Project>costs` now draws each task's spend against the largest, using the figures already loaded, so no extra API calls:
```
task state cents runs share of the largest
AUD-163 done 3 3 ████████████████████████
AUD-164 done 2 2 ████████████████
AUD-159 done 1 1 ████████
```
**5. The `office` scaffold** — `bin/office` now writes what is missing, never overwriting: `.harness/verify.sh` (with a comment explaining how to replace it, and what happens if you do not) and `.harness/NOTES.md` for the person. Adopting a folder no longer leaves it without a place to say what "finished" means.
**8. Memory per agent, read-only** — `Agents>settings` ends with a line read from the agent's command and the global Pi settings:
```
memory and extensions
extensions: the global set · memory: pi-memctx
```
It states only what it has read. When you want to decide which agent uses engram or headroom, that line is where the answer will go — but the switch itself needs your input on what "using headroom" should mean for an agent that runs for ninety seconds.
## What is left, honestly
- **MOUSE-1** — key present, software not installed. Policy from the old project stands: triage only, never a gate. It needs the software before it needs a screen.
- **Switching projects** — the list is there; actually switching means tearing down these panes and building another project's, and a project on `.27` cannot be opened from `.13` at all. That is a design decision for you, not a missing key.
- **Memory switches** — awaiting your call on what they control.
Everything else in `docs/NEXT.md` is now marked done. Committed as `36abdc1`; the eight workspaces were rebuilt and are running on the new build.
## Evidence
- Confidence: 85%
- Reason: Durable UI and safety conventions evidenced by the implemented behavior.; enriched with final-answer detail because persistence should be reusable
## Related
- [[packs/paperclip-harness/00-system/pi-agent/memory-manifest|Memory Manifest]]
## Related learned memories <!-- same-turn-2026-11-11 04:06:03 -->
- observation: [[packs/paperclip-harness/60-observations/paperclip-harness-cleanup-navigation-and-ui-conventions|paperclip-harness cleanup/navigation and UI conventions]]
- decision: [[packs/paperclip-harness/50-decisions/paperclip-harness-ui-six-workspaces-spec-first-four-panel-li|Deferred agent memory switch (engram vs headroom) pending user definition]]
- action: [[packs/paperclip-harness/40-actions/2026-11-10-wrote-docs-ui-layout-md-and-three-live-layout-mockups|Implemented cleanup navigation, cost bars, office scaffold, and per-agent memory read-out (commit 36abdc1)]]
- session: [[packs/paperclip-harness/80-sessions/paperclip-harness-cleanup-column-navigation-fix-cost-bars-of|paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-omni-2026-11-11-04-06-03|Rich discovery: omni 2026-11-11 04:06:03]]
- context: [[packs/paperclip-harness/20-context/omni|omni]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|omni repository structure and configuration patterns]]

View File

@@ -2746,3 +2746,74 @@ Committed as `3ec960e`; `docs/NEXT.md` updated with what is done and what remain
- context: [[packs/paperclip-harness/20-context/config|.config]]
- runbook: [[packs/paperclip-harness/70-runbooks/tmp-deployment-operations|.config deployment operations]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|.config repository structure and configuration patterns]]
---
## Update (2026-11-11 04:06:03)
## Structural/configuration observations (2026-11-11 04:06:03)
The cleanup column navigates now, and the remaining list is finished except the one item that needs a decision from you.
## Cleanup navigation
The bug was that `↑`/`↓` scrolled the body, never the selection. They now move through the list, the chosen row shows `▸`, and a ticked row shows `*`:
```
session panes last used state
▸ paperclip-harness 10 11 Nov 15:04 this project's session
tuios coding harness 4 11 Nov 15:03 attached, or on another machine
* office-test-1 26 10 Nov 11:24 ticked for closing
```
`space` ticks, `x` closes the ticked ones after asking, and protected or attached sessions are refused with a line saying why.
## The rest of the list
**7. Costs as a chart** — `Project>costs` now draws each task's spend against the largest, using the figures already loaded, so no extra API calls:
```
task state cents runs share of the largest
AUD-163 done 3 3 ████████████████████████
AUD-164 done 2 2 ████████████████
AUD-159 done 1 1 ████████
```
**5. The `office` scaffold** — `bin/office` now writes what is missing, never overwriting: `.harness/verify.sh` (with a comment explaining how to replace it, and what happens if you do not) and `.harness/NOTES.md` for the person. Adopting a folder no longer leaves it without a place to say what "finished" means.
**8. Memory per agent, read-only** — `Agents>settings` ends with a line read from the agent's command and the global Pi settings:
```
memory and extensions
extensions: the global set · memory: pi-memctx
```
It states only what it has read. When you want to decide which agent uses engram or headroom, that line is where the answer will go — but the switch itself needs your input on what "using headroom" should mean for an agent that runs for ninety seconds.
## What is left, honestly
- **MOUSE-1** — key present, software not installed. Policy from the old project stands: triage only, never a gate. It needs the software before it needs a screen.
- **Switching projects** — the list is there; actually switching means tearing down these panes and building another project's, and a project on `.27` cannot be opened from `.13` at all. That is a design decision for you, not a missing key.
- **Memory switches** — awaiting your call on what they control.
Everything else in `docs/NEXT.md` is now marked done. Committed as `36abdc1`; the eight workspaces were rebuilt and are running on the new build.
## Source paths observed
- `omni/deepseek/deepseek-v4-flash`
## Evidence
- Confidence: 82%
- Reason: Captured factual repo structure/configuration patterns from rich discovery
## Related learned memories <!-- same-turn-2026-11-11 04:06:03 -->
- observation: [[packs/paperclip-harness/60-observations/paperclip-harness-cleanup-navigation-and-ui-conventions|paperclip-harness cleanup/navigation and UI conventions]]
- decision: [[packs/paperclip-harness/50-decisions/paperclip-harness-ui-six-workspaces-spec-first-four-panel-li|Deferred agent memory switch (engram vs headroom) pending user definition]]
- action: [[packs/paperclip-harness/40-actions/2026-11-10-wrote-docs-ui-layout-md-and-three-live-layout-mockups|Implemented cleanup navigation, cost bars, office scaffold, and per-agent memory read-out (commit 36abdc1)]]
- session: [[packs/paperclip-harness/80-sessions/paperclip-harness-cleanup-column-navigation-fix-cost-bars-of|paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-omni-2026-11-11-04-06-03|Rich discovery: omni 2026-11-11 04:06:03]]
- context: [[packs/paperclip-harness/20-context/omni|omni]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|omni repository structure and configuration patterns]]

View File

@@ -0,0 +1,55 @@
---
type: session
id: session.paperclip-harness.paperclip-harness-cleanup-column-navigation-fix-cost-bars-of
title: paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line
status: active
source_of_truth: false
freshness: current
last_reviewed: 2026-11-11
tags:
- pack/paperclip-harness
- agent-memory/session
- paperclip-harness
- cleanup
- costs
- office-scaffold
- agent-memory
- session
---
# paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line
Session snapshot for the paperclip-harness project (git commit 36abdc1, message: 'Cleanup list navigates; spend bars; office writes the missing scaffold; memory read-out per agent').
Completed in this turn:
1. Cleanup-column navigation bug fixed: ↑/↓ previously scrolled the body instead of moving selection. Now they move through the list; selected row shows '▸', ticked row shows '*'. Space ticks a row; x closes ticked sessions after confirmation. Protected or attached sessions are refused with an explanatory line.
2. Project>costs now renders per-task spend as horizontal bars scaled to the largest spender, using already-loaded figures (no extra API calls).
3. bin/office scaffold now writes missing files only, never overwriting: .harness/verify.sh (with comment on how to replace it and consequences of not doing so) and .harness/NOTES.md for the human owner. Adopted folders therefore always have a place to define what 'finished' means.
4. Agents>settings now shows a read-only line at the end derived from the agent's command plus global Pi settings, e.g. 'extensions: the global set · memory: pi-memctx'.
Rebuilt and running: eight workspaces (Reply, New task, Project, Repair, plus existing) on window ids including project 7404ce0b, agents a53f999b, repair 4f1230ff.
Honest remaining items:
- MOUSE-1: key present but software not installed; policy from old project is triage-only, never a gate.
- Switching projects: list exists, but actual switching requires tearing down current panes and building another project's; a project on .27 cannot be opened from .13 — design decision pending for user.
- Memory switches (engram vs headroom choice per agent): awaiting user's definition of what the switch should mean, especially for short-lived (~90s) agents.
All other items in docs/NEXT.md marked done.
## Evidence
- Confidence: 90%
- Reason: Rich sanitized discovery/implementation snapshot with concrete artifacts, commit, and open decisions.
## Related
- [[packs/paperclip-harness/00-system/pi-agent/memory-manifest|Memory Manifest]]
## Related learned memories <!-- same-turn-2026-11-11 04:06:03 -->
- observation: [[packs/paperclip-harness/60-observations/paperclip-harness-cleanup-navigation-and-ui-conventions|paperclip-harness cleanup/navigation and UI conventions]]
- decision: [[packs/paperclip-harness/50-decisions/paperclip-harness-ui-six-workspaces-spec-first-four-panel-li|Deferred agent memory switch (engram vs headroom) pending user definition]]
- action: [[packs/paperclip-harness/40-actions/2026-11-10-wrote-docs-ui-layout-md-and-three-live-layout-mockups|Implemented cleanup navigation, cost bars, office scaffold, and per-agent memory read-out (commit 36abdc1)]]
- session: [[packs/paperclip-harness/80-sessions/paperclip-harness-cleanup-column-navigation-fix-cost-bars-of|paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-omni-2026-11-11-04-06-03|Rich discovery: omni 2026-11-11 04:06:03]]
- context: [[packs/paperclip-harness/20-context/omni|omni]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|omni repository structure and configuration patterns]]

View File

@@ -0,0 +1,90 @@
---
type: session
id: session.paperclip-harness.rich-discovery-omni-2026-11-11-04-06-03
title: Rich discovery: omni 2026-11-11 04:06:03
status: active
source_of_truth: false
freshness: current
last_reviewed: 2026-11-11
tags:
- pack/paperclip-harness
- agent-memory/session
- autolearn
- rich-discovery
- repo/omni
---
# Rich discovery: omni 2026-11-11 04:06:03
Sanitized rich discovery snapshot captured automatically from the completed turn.
## Source paths observed
- `omni/deepseek/deepseek-v4-flash`
## Final answer snapshot
The cleanup column navigates now, and the remaining list is finished except the one item that needs a decision from you.
## Cleanup navigation
The bug was that `↑`/`↓` scrolled the body, never the selection. They now move through the list, the chosen row shows `▸`, and a ticked row shows `*`:
```
session panes last used state
▸ paperclip-harness 10 11 Nov 15:04 this project's session
tuios coding harness 4 11 Nov 15:03 attached, or on another machine
* office-test-1 26 10 Nov 11:24 ticked for closing
```
`space` ticks, `x` closes the ticked ones after asking, and protected or attached sessions are refused with a line saying why.
## The rest of the list
**7. Costs as a chart** — `Project>costs` now draws each task's spend against the largest, using the figures already loaded, so no extra API calls:
```
task state cents runs share of the largest
AUD-163 done 3 3 ████████████████████████
AUD-164 done 2 2 ████████████████
AUD-159 done 1 1 ████████
```
**5. The `office` scaffold** — `bin/office` now writes what is missing, never overwriting: `.harness/verify.sh` (with a comment explaining how to replace it, and what happens if you do not) and `.harness/NOTES.md` for the person. Adopting a folder no longer leaves it without a place to say what "finished" means.
**8. Memory per agent, read-only** — `Agents>settings` ends with a line read from the agent's command and the global Pi settings:
```
memory and extensions
extensions: the global set · memory: pi-memctx
```
It states only what it has read. When you want to decide which agent uses engram or headroom, that line is where the answer will go — but the switch itself needs your input on what "using headroom" should mean for an agent that runs for ninety seconds.
## What is left, honestly
- **MOUSE-1** — key present, software not installed. Policy from the old project stands: triage only, never a gate. It needs the software before it needs a screen.
- **Switching projects** — the list is there; actually switching means tearing down these panes and building another project's, and a project on `.27` cannot be opened from `.13` at all. That is a design decision for you, not a missing key.
- **Memory switches** — awaiting your call on what they control.
Everything else in `docs/NEXT.md` is now marked done. Committed as `36abdc1`; the eight workspaces were rebuilt and are running on the new build.
## Evidence
- Confidence: 86%
- Reason: Preserve full sanitized discovery detail from a rich investigation turn
## Related
- [[packs/paperclip-harness/00-system/pi-agent/memory-manifest|Memory Manifest]]
## Related learned memories <!-- same-turn-2026-11-11 04:06:03 -->
- observation: [[packs/paperclip-harness/60-observations/paperclip-harness-cleanup-navigation-and-ui-conventions|paperclip-harness cleanup/navigation and UI conventions]]
- decision: [[packs/paperclip-harness/50-decisions/paperclip-harness-ui-six-workspaces-spec-first-four-panel-li|Deferred agent memory switch (engram vs headroom) pending user definition]]
- action: [[packs/paperclip-harness/40-actions/2026-11-10-wrote-docs-ui-layout-md-and-three-live-layout-mockups|Implemented cleanup navigation, cost bars, office scaffold, and per-agent memory read-out (commit 36abdc1)]]
- session: [[packs/paperclip-harness/80-sessions/paperclip-harness-cleanup-column-navigation-fix-cost-bars-of|paperclip-harness: cleanup-column navigation fix, cost bars, office scaffold, per-agent memory line]]
- session: [[packs/paperclip-harness/80-sessions/rich-discovery-omni-2026-11-11-04-06-03|Rich discovery: omni 2026-11-11 04:06:03]]
- context: [[packs/paperclip-harness/20-context/omni|omni]]
- observation: [[packs/paperclip-harness/60-observations/tmp-repository-structure-and-configuration-patterns|omni repository structure and configuration patterns]]

Binary file not shown.

View File

@@ -32,6 +32,12 @@ The cheap version first: a `t` entry that opens `~/.pi/paperclips` in Yazi, and
`Agents>agents` that reads the JSONL directly. `GET /api/agents/{id}/task-sessions` maps a task
to its session file, so neither version has to guess.
## Done: Project>projects — switching project
`bin/office` records each adopted project; the tab lists session, machine and folder; `enter`
asks once and switches the client with `tuios call switch-session`, including to a session on
another machine when that machine is in the client's `[hosts]` table. See `docs/SESSIONS.md`.
## 3. Project>projects — switching project
A tab listing every adopted project from a small local registry
@@ -98,8 +104,9 @@ step; a switch is only worth adding after one agent has been run both ways and m
## 9. MOUSE-1
The key is in the environment; the software is not installed. The old project's policy stands:
triage only, never a gate, never a permit. It would order `Board>needs`, never decide a merge.
Corrected: Mouse-1 is a hosted API, not software to install. `MOUSE_API_KEY` is present; what is
missing is a client call from our side. The old project's policy stands: triage only, never a
gate, never a permit — it could order `Board>needs`, never decide a merge.
## Unproven, and worth a test

View File

@@ -575,3 +575,53 @@ minutes of work and neither invents anything.
A transcript tab inside `Agents>agents` is the integration option: read the JSONL, draw the
messages, no second process. Worth doing only if the file browser feels like a detour after a
week of use. Recommendation: do the cheap one now, decide later.
## verify.sh, plainly
`.harness/verify.sh` is a shell script in the project folder. Its only job is to answer one
question: **is this project's work finished?** It exits 0 when the answer is yes.
- It is **not** Paperclip's. Paperclip has no such concept; an agent sets a task's status.
- It is **our** convention, from the old project, and `bin/office` now writes a template:
```sh
#!/bin/sh
echo "no verify command agreed for this project"
exit 0
```
As it stands it says yes to everything, which is honest: there is no agreed check. Replace
the body with the project's real tests when they exist:
```sh
exec go test ./...
```
- `bin/merge` runs it in the task's worktree, and again on the base branch after merging.
- A task may carry its own command in its description; that one wins for that task only.
So: a per-project default, a per-task override, both optional. If neither exists, the merge
says so and lets the `ocr` review decide.
## Headroom, and whether it is good for a project
Headroom is a **compression proxy**: requests pass through it and long prompts are shortened
before they reach the model. It is running here at `192.168.20.13:8787` (v0.24.0, healthy,
memory backend disabled, compression on).
It is good where prompts are long and repetitive — a big repository, a long thread, many tool
results. It is pointless for a small task whose prompt is already short, and it adds a hop and a
failure mode.
The lever is per **agent**, not per project, because a Paperclip agent's provider is configured
on the agent. `adapterConfig.env` accepts variables, so an agent can be pointed at the proxy
without touching anything else. That is why the interface offers a read-out first: until one
agent has run both ways and you have compared cost and quality, "good for some projects" stays
a hypothesis rather than a setting.
## Mouse-1, corrected
Earlier notes in this file said "software is not installed". That was wrong: Mouse-1 is a
**hosted API**, not a program. What exists here is `MOUSE_API_KEY`; what is missing is a client
integration — an HTTP call like any other. No install is needed, and nothing has to run locally.
The old project's policy still applies: triage only, never a gate, never a permit.

View File

@@ -71,3 +71,24 @@ on.
- `factory`, `office-test-1` and the `harness-demo-*` sessions have one pane each and are
detached — they *are* the junk, but they are indistinguishable from a deliberately parked
session by age alone. Hence the pattern, and hence the confirmation.
## Switching sessions, and what "on another machine" means
A session lives on a daemon, and a daemon runs on one machine. Where you *sit* does not matter:
a client on `.27` can drive a session whose daemon is on `.13`, and that is exactly what happens
here. So the phrase "a project on another machine" really means "a session on another daemon".
TUIOS has a verb for moving an attached client:
```
tuios call switch-session '{"name":"office","host":"nixos-desktop"}'
```
- `name` is the session to show.
- `host` may be omitted for the local daemon, or named for a machine in the client's `[hosts]`
table. A machine that is not in that table cannot be reached this way; attach by hand then.
`Project>project` → **projects** now uses this. Every adopted project is listed with its
session, machine and folder; `enter` asks once and then switches the client in place. A
project whose session is on a daemon your client does not know is still listed, and the
confirmation says which machine it needs.

View File

@@ -6,6 +6,7 @@ package main
// to a command with a name, not a keystroke.
import (
"encoding/json"
"fmt"
"os"
"os/exec"
@@ -49,8 +50,11 @@ type projectModel struct {
err error
readAt time.Time
tab int
scroll int
tab int
scroll int
regAt int
regs []registryRow
confirmSwitch bool
showHelp bool
width, height int
@@ -145,6 +149,29 @@ func (m projectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, tea.Batch(m.load(), tickEvery(10*time.Second))
case tea.KeyMsg:
if m.confirmSwitch {
switch msg.String() {
case "y":
m.confirmSwitch = false
if m.regAt < len(m.regs) {
r := m.regs[m.regAt]
params := map[string]any{"name": r.session}
me, _ := os.Hostname()
if r.host != "" && r.host != me && r.host != strings.Split(me, ".")[0] {
params["host"] = r.host
}
body, _ := json.Marshal(params)
out, err := exec.Command("tuios", "call", "switch-session", string(body)).CombinedOutput()
if err != nil {
m.err = fmt.Errorf("could not switch to %q: %v %s", r.session, err, strings.TrimSpace(string(out)))
}
}
return m, nil
case "esc", "n", "q":
m.confirmSwitch = false
}
return m, nil
}
if m.showHelp {
m.showHelp = false
return m, nil
@@ -163,6 +190,14 @@ func (m projectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, nil
}
return m, tea.Quit
case "enter":
if m.tab == 4 {
m.regs = readRegistry()
if len(m.regs) > 0 && m.regAt < len(m.regs) {
m.confirmSwitch = true
}
}
return m, nil
case "(", "[", "h":
if m.tab > 0 {
m.tab--
@@ -176,9 +211,15 @@ func (m projectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
return m, nil
case "up", "k":
if m.tab == 4 && m.regAt > 0 {
m.regAt--
}
m.scroll--
return m, nil
case "down", "j":
if m.tab == 4 && m.regAt < len(m.regs)-1 {
m.regAt++
}
m.scroll++
return m, nil
case "esc":
@@ -186,6 +227,8 @@ func (m projectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
case projectMsg:
m.regs = readRegistry()
m.regAt = min(m.regAt, max(0, len(m.regs)-1))
m.dash = msg.dash
m.project = msg.project
m.cfg = msg.cfg
@@ -207,6 +250,17 @@ func (m projectModel) View() string {
fmt.Sprintf("This workspace needs 80 × 24.\nThis panel is %d × %d.", m.width, m.height))
}
if m.confirmSwitch && m.regAt < len(m.regs) {
r := m.regs[m.regAt]
return helpOverlay("switch to "+r.session+"?", [][2]string{
{"what happens", "your TUIOS client moves to that session"},
{"session", r.session},
{"machine", r.host},
{"folder", r.folder},
{"y", "switch"},
{"esc or n", "stay here"},
}, m.width, m.height)
}
if m.showHelp {
return helpOverlay("the project", [][2]string{
{"[ ] h l", "facts, costs, settings"},
@@ -497,7 +551,7 @@ func (m projectModel) projectListLines(width int) []string {
rows := readRegistry()
out := []string{"", dimStyle().Render(fmt.Sprintf(" %-26s %-12s %-14s %s", "project", "machine", "session", "folder"))}
me, _ := os.Hostname()
for _, r := range rows {
for i, r := range rows {
here := ""
if r.host == me || r.host == strings.Split(me, ".")[0] {
here = " (this machine)"
@@ -505,13 +559,18 @@ func (m projectModel) projectListLines(width int) []string {
line := fmt.Sprintf(" %-26s %-12s %-14s %s%s",
truncateVisible(r.name, 26), r.host, truncateVisible(r.session, 14),
truncateVisible(r.folder, max(10, width-60)), here)
if i == m.regAt {
out = append(out, selectedStyle2().Render(padTo("▸"+line[1:], width)))
continue
}
out = append(out, line)
}
if len(rows) == 0 {
out = append(out, " "+mutedStyle2().Render("none adopted yet: bin/office <folder> adds one"))
}
out = append(out, "")
out = append(out, dimStyle().Render(" a project on another machine can be listed here but not opened from this one."))
out = append(out, dimStyle().Render(" to open one: attach to its session, or run bin/office <folder> there."))
out = append(out, dimStyle().Render(" enter switches your TUIOS client to that project's session."))
out = append(out, dimStyle().Render(" a session on another machine switches only when that machine is in your"))
out = append(out, dimStyle().Render(" ~/.config/tuios hosts table; otherwise attach to it by hand."))
return out
}

View File

@@ -345,6 +345,24 @@ func (m repairModel) View() string {
fmt.Sprintf("This workspace needs 80 × 24.\nThis panel is %d × %d.", m.width, m.height))
}
if m.confirmKill {
var names []string
for name := range m.ticked {
names = append(names, name)
}
sort.Strings(names)
entries := [][2]string{
{"what happens", "these TUIOS sessions are closed and their panes end"},
{"", "nothing in ~/.pi/paperclips is deleted; that is your Pi history"},
{"", "this project's session and attached sessions are never touched"},
{"y", "close them"},
{"esc or n", "do nothing"},
}
for _, n := range names {
entries = append(entries, [2]string{"", n})
}
return helpOverlay(fmt.Sprintf("close %s?", fmtCount(len(names), "session", "sessions")), entries, m.width, m.height)
}
if m.showHelp {
return helpOverlay("repair", [][2]string{
{"[ ] h l", "health, layout, rebuild log"},