Skip to content

pane.report_agent silently ignores state when agent_session_id is present (docs say it's supported) #2231

Description

@v9yrbcgkyt-spec

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions