{"repo":"NousResearch/hermes-agent","public_id":"87422","display_label":"Race condition between close() and run_turn() in session","summary":"These issues and fixes address a concurrency race condition where calling close() while run_turn() is executing causes an AttributeError crash instead of a clean interrupt. The work focuses on preventing close() from conflicting with run_turn()'s client reads and poll loop.","subsystem":"agent","counts":{"members":4,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":2},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":115758,"merged_at":"2026-09-19T16:36:14+00:00"},"resolution":{"state":"resolved","by":"pr-115758"},"freshness":{"state":"verified","last_verified_at":"2026-09-19T16:36:14+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.5},"fix_edges":[{"issue_number":83127,"pr_number":115758,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T16:36:14+00:00"},{"issue_number":87422,"pr_number":115758,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T16:36:14+00:00"},{"issue_number":87433,"pr_number":115758,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T16:36:14+00:00"}],"members":[{"kind":"issue","number":87422,"title":"[BUG]:codex_app_server_session: close() racing run_turn() raises AttributeError instead of a clean interrupt","url":null,"state":"closed"},{"kind":"pr","number":87424,"title":"fix(codex-app-server): stop close() racing run_turn()'s poll loop","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"1db043b3dc90","number":0},{"kind":"pr","value":"#115758","number":115758},{"kind":"pr","value":"#87433","number":87433},{"kind":"pr","value":"#87422","number":87422},{"kind":"pr","value":"#83127","number":83127},{"kind":"pr","value":"#87434","number":87434},{"kind":"pr","value":"#83129","number":83129},{"kind":"pr","value":"#87424","number":87424}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":91769,"title":"fix: race between close() and run_turn's self._client reads crashes turns","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#87424","number":87424}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":115758,"title":"fix(codex-app-server): closing or losing the app-server mid-turn ends the turn cleanly instead of hanging or crashing (#87433, #87422, #83127, salvage #87434 #83129 #87424)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/transports/codex_app_server.py","agent/transports/codex_app_server_session.py","tests/agent/transports/test_codex_app_server.py","tests/agent/transports/test_codex_app_server_runtime.py","tests/agent/transports/test_codex_app_server_session.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}