{"repo":"NousResearch/hermes-agent","public_id":"114240","display_label":"Non-dict JSON causing scan/drain wedge fixes","summary":"These issues and PRs address a bug where valid but non-dictionary JSON in state files or receipts causes directory scans and drain processes to become stuck. The fixes add shape validation to ensure parsed JSON is rejected unless it is a record/dict/object type.","subsystem":null,"counts":{"members":6,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":4},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":114759},"resolution":{"state":"resolved","by":"pr-114759"},"freshness":{"state":"verified","last_verified_at":"2026-09-18T16:19:05+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.4666666666666667},"fix_edges":[{"issue_number":114240,"pr_number":114759,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":114240,"title":"A parseable non-dict JSON receipt wedges the deferred Bot Chat drain (and 14 sibling scans)","url":null,"state":"closed"},{"kind":"pr","number":114241,"title":"fix(queue-state): parseable non-dict JSON no longer wedges scans and drains","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"1c121280ac1a","number":0},{"kind":"pr","value":"#114759","number":114759},{"kind":"pr","value":"#114759","number":114759},{"kind":"pr","value":"#114240","number":114240},{"kind":"pr","value":"#114241","number":114241}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":114354,"title":"fix(agent): reject non-record JSON at parse boundaries","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#114241","number":114241},{"kind":"pr","value":"#114241","number":114241}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":114407,"title":"fix: validate dict shape on JSON receipt and state scans (#114240)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#114241","number":114241},{"kind":"pr","value":"#114241","number":114241}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":114451,"title":"fix: parse JSON receipts as objects so directory scans cannot wedge","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#114241","number":114241},{"kind":"pr","value":"#114241","number":114241}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":114759,"title":"fix(cron,tools): a parseable non-dict JSON state file no longer wedges the Bot Chat drain or its 8 sibling scans (#114240, salvage #114241)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["batch_runner.py","cron/bot_chat_delivery.py","gateway/shutdown_flush.py","hermes_cli/local_runtime/binaries.py","plugins/platforms/a2a/protocol.py","tests/cron/test_bot_chat_pending.py","tests/gateway/test_shutdown_flush.py","tests/hermes_cli/test_local_runtime.py","tests/plugins/test_a2a_plugin.py","tests/test_batch_runner_discard_resume.py","tests/test_trajectory_compressor_async.py","tests/tools/test_bot_live_owner_delivery.py","tests/tools/test_bot_relay.py","tests/tools/test_browser_lightpanda.py","tests/tools/test_write_approval.py","tests/tui_gateway/test_spawn_tree_records.py","tools/bot_live_delivery.py","tools/bot_relay.py","tools/browser_lightpanda.py","tools/write_approval.py","trajectory_compressor.py","tui_gateway/methods_session.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}