Title: pane.report_agent silently ignores state when agent_session_id is present (docs say it's supported)
Version: herdr 0.7.5 (macOS, Homebrew bottle)
Summary
pane.report_agent accepts a request containing both state and agent_session_id and responds {"type":"ok"}, but the state is silently ignored — the pane's agent status never updates. The docs explicitly say this combination is supported:
"State-reporting integrations can still include native session references in pane.report_agent."
(source: docs/next/website/src/content/docs/socket-api.mdx, socket-api page)
Reproduction
Send over the Unix socket (AF_UNIX, JSON-RPC, newline-delimited), then query agent.list:
{"id":"t1","method":"pane.report_agent","params":{"pane_id":"w6:p9","source":"herdr:hermes","agent":"hermes","seq":1785754276330897000,"state":"idle","agent_session_id":"20260803_113806_b180fc"}}
Result: response is {"result":{"type":"ok"}} but agent_status stays unchanged (e.g. stays working).
Control (no agent_session_id):
{"id":"t2","method":"pane.report_agent","params":{"pane_id":"w6:p9","source":"herdr:hermes","agent":"hermes","seq":1785754295950373000,"state":"idle"}}
Result: agent_status correctly becomes idle.
Four-way matrix (all responded ok):
| Request |
Observed state change |
state=idle + agent_session_id |
❌ none (stays previous) |
state=idle (no session) |
✅ → idle |
state=working + agent_session_id |
❌ none |
state=working (no session) |
✅ → working |
Impact
Hermes Agent's official integration plugin (herdr integration install hermes) sends every hook report with agent_session_id (extracted from the hook kwargs). Because of this bug, all lifecycle state reports from Hermes are ignored — the sidebar stays stuck on working even when the agent is idle. The idle state in particular never shows because there is no screen-manifest fallback for lifecycle-authority agents (the pane shows screen_detection_skip_reason: full_lifecycle_hook_authority).
Workaround we applied: split the reports — send state via pane.report_agent without the session field, and send the session association via the separate pane.report_agent_session method. Both work independently; only the combined form is broken.
Expected behavior
Per the docs, a pane.report_agent request containing both state and agent_session_id should update the state AND store the session reference. Either honor the documented combination, or reject the request with an error instead of silently ignoring state.
Title: pane.report_agent silently ignores
statewhenagent_session_idis present (docs say it's supported)Version: herdr 0.7.5 (macOS, Homebrew bottle)
Summary
pane.report_agentaccepts a request containing bothstateandagent_session_idand responds{"type":"ok"}, but the state is silently ignored — the pane's agent status never updates. The docs explicitly say this combination is supported:(source:
docs/next/website/src/content/docs/socket-api.mdx, socket-api page)Reproduction
Send over the Unix socket (AF_UNIX, JSON-RPC, newline-delimited), then query
agent.list:{"id":"t1","method":"pane.report_agent","params":{"pane_id":"w6:p9","source":"herdr:hermes","agent":"hermes","seq":1785754276330897000,"state":"idle","agent_session_id":"20260803_113806_b180fc"}}Result: response is
{"result":{"type":"ok"}}butagent_statusstays unchanged (e.g. staysworking).Control (no
agent_session_id):{"id":"t2","method":"pane.report_agent","params":{"pane_id":"w6:p9","source":"herdr:hermes","agent":"hermes","seq":1785754295950373000,"state":"idle"}}Result:
agent_statuscorrectly becomesidle.Four-way matrix (all responded
ok):state=idle+agent_session_idstate=idle(no session)state=working+agent_session_idstate=working(no session)Impact
Hermes Agent's official integration plugin (
herdr integration install hermes) sends every hook report withagent_session_id(extracted from the hook kwargs). Because of this bug, all lifecycle state reports from Hermes are ignored — the sidebar stays stuck onworkingeven when the agent is idle. Theidlestate in particular never shows because there is no screen-manifest fallback for lifecycle-authority agents (the pane showsscreen_detection_skip_reason: full_lifecycle_hook_authority).Workaround we applied: split the reports — send state via
pane.report_agentwithout the session field, and send the session association via the separatepane.report_agent_sessionmethod. Both work independently; only the combined form is broken.Expected behavior
Per the docs, a
pane.report_agentrequest containing bothstateandagent_session_idshould update the state AND store the session reference. Either honor the documented combination, or reject the request with an error instead of silently ignoringstate.