{"repo":"NousResearch/hermes-agent","public_id":"106400","display_label":"Fix KeyError from concurrent PTY session reaping","summary":"A KeyError could occur when concurrent reap operations attempted to remove the same key from the PTY session registry. The fix makes reaping skip already-removed keys rather than raising an error.","subsystem":null,"counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":106511,"merged_at":"2026-09-09T18:31:11+00:00"},"resolution":{"state":"resolved","by":"pr-106511"},"freshness":{"state":"verified","last_verified_at":"2026-09-09T18:31:11+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":106400,"pr_number":106511,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-09T18:31:11+00:00"}],"members":[{"kind":"issue","number":106400,"title":"KeyError in PtySessionRegistry.reap_idle: concurrent reap pops same key (observed with NUL byte in session key)","url":null,"state":"closed"},{"kind":"pr","number":106415,"title":"fix(cli): concurrent PTY reaps skip already-popped keys instead of raising","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"95cfcba353","number":0},{"kind":"pr","value":"#106511","number":106511}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":106511,"title":"fix(cli): concurrent PTY reaps no longer raise KeyError into the terminal websocket (#106400, salvage #106415)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/pty_session.py","tests/test_pty_session.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}