{"repo":"NousResearch/hermes-agent","public_id":"111761","display_label":"Reasoning-only content leaking into assistant history/display","summary":"A bug where reasoning-only model outputs were incorrectly promoted into assistant message content, polluting conversation history and transcripts. Multiple fixes address gating promotion, preventing persistence, dropping such rows from transcripts, and preserving reasoning provenance.","subsystem":"apps/desktop","counts":{"members":8,"open_issues":0,"open_issues_distinct":0,"open_prs":1,"closed_issues":1,"merged_prs":4,"attempt_prs":3},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":133729,"merged_at":"2026-10-06T07:31:40+00:00"},"resolution":{"state":"resolved","by":"pr-115596"},"freshness":{"state":"verified","last_verified_at":"2026-10-06T07:31:40+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.25},"fix_edges":[{"issue_number":107094,"pr_number":113796,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-09-17T15:53:22+00:00"},{"issue_number":111761,"pr_number":113188,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-09-17T00:21:58+00:00"},{"issue_number":111761,"pr_number":113796,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-09-17T15:53:22+00:00"},{"issue_number":111761,"pr_number":115596,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T03:55:50+00:00"},{"issue_number":111761,"pr_number":133729,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-10-06T07:31:40+00:00"},{"issue_number":114082,"pr_number":133729,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-10-06T07:31:40+00:00"}],"members":[{"kind":"issue","number":111761,"title":"[Bug]: reasoning is promoted into assistant content on reasoning-only clean stop — pollutes history, not just display","url":null,"state":"closed"},{"kind":"pr","number":111780,"title":"fix(agent): preserve reasoning provenance before promotion","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#113188","number":113188},{"kind":"pr","value":"#113796","number":113796},{"kind":"pr","value":"#115596","number":115596}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":112833,"title":"fix(agent): gate reasoning-only answer promotion","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"3ffd44e4d3","number":0},{"kind":"pr","value":"#133729","number":133729}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":113188,"title":"fix(agent): reasoning promoted on a reasoning-only stop is never persisted as an ordinary reply (#111761)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/turn_final_response.py","gateway/run.py","tests/agent/test_empty_terminal_reasoning_surface.py","tests/agent/test_reasoning_only_stop_persistence.py","tests/gateway/test_replay_entry_fields.py","website/docs/developer-guide/session-storage.md"]},{"kind":"pr","number":113796,"title":"fix(agent): reasoning-only stop keeps chain-of-thought out of rows and no longer fakes a completion on a planning-monologue stall (closes remaining atoms of #111761)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/agent_runtime_helpers.py","agent/turn_final_response.py","tests/agent/test_reasoning_only_stop_persistence.py","tests/agent/test_stall_guards.py","tests/agent/test_thinking_prefill_trailing_turn.py"]},{"kind":"pr","number":114463,"title":"fix(desktop): drop reasoning-only assistant rows from the hydrated transcript (#111761)","url":null,"state":"open","close_reason":{"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":115596,"title":"fix(desktop): /reasoning hide|show hides Thinking blocks immediately (closes remaining atom of #111761)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["apps/desktop/src/app/session/hooks/use-prompt-actions/slash.ts","apps/desktop/src/lib/desktop-slash-commands.ts","apps/desktop/src/lib/desktop-slash-registry.json","apps/desktop/src/lib/reasoning-slash.test.ts","apps/desktop/src/lib/reasoning-slash.ts","hermes_cli/commands.py","website/docs/user-guide/desktop.md"]},{"kind":"pr","number":133729,"title":"fix(agent): a reasoning model's private chain-of-thought is no longer shown as the reply when it stops with empty content (#114082, salvage #112833)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/agent_init.py","agent/reasoning_promotion.py","agent/turn_empty_response.py","agent/turn_failure_copy.py","agent/turn_final_response.py","tests/agent/test_empty_terminal_reasoning_surface.py","tests/agent/test_reasoning_only_stop_persistence.py","tests/agent/test_run_agent.py","website/docs/user-guide/configuring-models.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}