{"repo":"NousResearch/hermes-agent","public_id":"9270","display_label":"Placeholder text shown for empty LLM responses","summary":"These items concern empty LLM responses being replaced by the literal \"(No response generated)\" text and delivered to users and cron targets. One issue reports the behavior, and two pull requests propose changes to stop the placeholder leaking; one of them also mentions an empty response nudge crash.","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":11021,"merged_at":"2026-04-16T13:10:40+00:00"},"resolution":{"state":"resolved","by":"pr-11021"},"freshness":{"state":"stale","last_verified_at":"2026-04-16T13:10:40+00:00","is_stale":true},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":9270,"pr_number":11021,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-04-16T13:10:40+00:00"}],"members":[{"kind":"issue","number":9270,"title":"Empty LLM responses get replaced with literal \"(No response generated)\" and delivered to users, including cron targets","url":null,"state":"closed"},{"kind":"pr","number":9292,"title":"fix: stop leaking placeholder text to users and cron targets","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#11021","number":11021}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":11021,"title":"fix: empty response nudge crash + placeholder leak to cron targets","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["cron/scheduler.py","gateway/run.py","run_agent.py","scripts/release.py"],"fix_hunks":[{"file":"cron/scheduler.py","hunks":["@@ -837,6 +837,9 @@ def run_job(job: dict) -> tuple[bool, str, str, Optional[str]]:\n             )\n \n         final_response = result.get(\"final_response\", \"\") or \"\"\n+        # Strip leaked placeholder text that upstream may inject on empty completions.\n+        if final_response.strip() == \"(No response generated)\":\n+            final_response = \"\"\n         # Use a separate variable for log display; keep final_response clean\n         # for delivery logic (empty response = no delivery).\n         logged_response = final_response if final_response else \"(No response generated)\""]},{"file":"gateway/run.py","hunks":["@@ -8886,7 +8886,7 @@ def _approval_notify_sync(approval_data: dict) -> None:\n             _resolved_model = getattr(_agent, \"model\", None) if _agent else None\n \n             if not final_response:\n-                error_msg = f\"⚠️ {result['error']}\" if result.get(\"error\") else \"(No response generated)\"\n+                error_msg = f\"⚠️ {result['error']}\" if result.get(\"error\") else \"\"\n                 return {\n                     \"final_response\": error_msg,\n                     \"messages\": result.get(\"messages\", []),"]},{"file":"run_agent.py","hunks":["@@ -10945,8 +10945,9 @@ def _stop_spinner():\n                             #   tool(result) → assistant(\"(empty)\") → user(nudge)\n                             # Without this, we'd have tool → user which most\n                             # APIs reject as an invalid sequence.\n-                            assistant_msg[\"content\"] = \"(empty)\"\n-                            messages.append(assistant_msg)\n+                            _nudge_msg = self._build_assistant_message(assistant_message, finish_reason)\n+                            _nudge_msg[\"content\"] = \"(empty)\"\n+                            messages.append(_nudge_msg)\n                             messages.append({\n                                 \"role\": \"user\",\n                                 \"content\": ("]},{"file":"scripts/release.py","hunks":["@@ -179,6 +179,7 @@\n     \"[redacted:email]\": \"limars874\",\n     \"[redacted:email]\": \"lesterli\",\n     \"[redacted:email]\": \"MagicRay1217\",\n+    \"[redacted:email]\": \"GenKoKo\",\n     \"[redacted:email]\": \"spniyant\",\n     \"[redacted:email]\": \"olafthiele\",\n     \"[redacted:email]\": \"sprmn24\",\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}