--- status: resolved claimed-by: "019fba91-eabf-76ae-b086-a37ac061d6e8" claimed-at: "2026-07-31T20:37:00-04:00" parent: "[[012-pi-subagents-herdr-extension-boundary-research]]" blocked-by: [] tags: - ticket/prototype/afk --- # Herdr status projection spike ## Question Safely test whether a Herdr plugin or API-side adapter can make a non-interactive spawned Pi child appear, or at least project useful status, in Herdr's agents section without requiring the child itself to run as an interactive Herdr-pane Pi session. ## Resolution A non-interactive child cannot be made into its own independent Herdr agents-section entry through the pane reporting APIs unless there is a Herdr pane to attach it to. Herdr's agent reporting model is pane-bound: `herdr pane report-agent` requires a real `pane_id`, and reporting to a nonexistent pane fails with `pane_not_found`. Reporting a second agent label to the current pane replaces that pane's single agent row rather than creating a second child row. After releasing the prototype source, the pane had to be re-reported as the current Pi session, which confirms the API is assigning authority for one pane record, not adding logical children. Useful status projection is possible on the parent pane. `herdr pane report-metadata` with a distinct source can set `display_agent`, `state_labels`, and bounded `tokens` on the existing Pi row. In the prototype, setting `display_agent = "pi child: scout"`, a `working` state label, and a child token appeared in both `herdr agent list` and `herdr api snapshot` for the current pane. A 5-second TTL removed that projected metadata automatically, returning the row to the ordinary Pi display. A Herdr plugin could therefore show spawned-child status only by either receiving child lifecycle events and projecting summary metadata onto an existing pane, or by creating/using real Herdr panes for children and reporting those panes as agents. A Pi-side extension or host-neutral subagent core with a Herdr adapter is the more natural owner of the lifecycle events, because Herdr cannot infer invisible Pi subprocess state on its own. Verdict: independent agents-section entries require Herdr panes. Parent-pane status projection without child panes is feasible and safe enough for optional summary status, but it is not a substitute for true per-child Herdr visibility. ## Evidence Current environment contained `HERDR_ENV=1`, `HERDR_PANE_ID=w6:p1`, and `HERDR_SOCKET_PATH=/home/alexion/.config/herdr/herdr.sock`, so the prototype could safely target the current pane. Before projection, `herdr agent list` showed one row for the current pane with `agent = "pi"` and `agent_status = "working"`. Running `herdr pane report-metadata "$HERDR_PANE_ID" --source pi-subagent-prototype --display-agent 'pi child: scout' --state-label working='child working' --token child='scout-1' --ttl-ms 5000` added `display_agent`, `state_labels`, and `tokens` to the same row. After six seconds, `herdr api snapshot` showed those fields had returned to `null` while the pane remained the ordinary Pi agent row. Running `herdr pane report-agent "$HERDR_PANE_ID" --source pi-subagent-prototype --agent pi-subagent-child --state blocked --message 'prototype child blocked'` changed the current pane's single agent row to `agent = "pi-subagent-child"` and `agent_status = "blocked"`. It did not create a second agent row. Running `herdr pane release-agent "$HERDR_PANE_ID" --source pi-subagent-prototype --agent pi-subagent-child` removed that source's authority and left the pane as `agent = null`, `agent_status = "unknown"` until the current Pi session was re-reported. The current pane was restored with `herdr pane report-agent "$HERDR_PANE_ID" --source herdr:pi --agent pi --state working --agent-session-id "$PI_SESSION_ID"`. Running `herdr pane report-agent w999:p999 --source pi-subagent-prototype --agent pi-subagent-child --state working` failed with `pane_not_found`, confirming there is no report-only path for a logical agent without a real pane id.