{"repo":"NousResearch/hermes-agent","public_id":"15935","display_label":"Compression fallback behavior on timeout errors","summary":"These issues and PRs address how the context compressor handles timeout and model-unavailable errors, specifically improving fallback and retry logic instead of permanently failing.","subsystem":null,"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":19665,"merged_at":"2026-05-04T10:10:53+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-05-04T10:10:53+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.5},"fix_edges":[{"issue_number":15935,"pr_number":19665,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-05-04T10:10:53+00:00"}],"members":[{"kind":"issue","number":15935,"title":"bug(compression): context compression fails permanently when summary model times out","url":null,"state":"closed"},{"kind":"pr","number":15924,"title":"fix(compression): fallback to main model on timeout errors","url":null,"state":"closed","close_reason":{"category":"silent_close","implication":"active"},"merged":false},{"kind":"pr","number":16126,"title":"fix(compressor): trigger fallback on timeout errors alongside model-not-found","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#19665","number":19665}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":19665,"title":"fix(compressor): trigger fallback on timeout errors alongside model-unavailable errors","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/context_compressor.py"],"fix_hunks":[{"file":"agent/context_compressor.py","hunks":["@@ -906,15 +906,19 @@ def _generate_summary(self, turns_to_summarize: List[Dict[str, Any]], focus_topi\n                 or \"does not exist\" in _err_str\n                 or \"no available channel\" in _err_str\n             )\n+            _is_timeout = (\n+                _status in (408, 429, 502, 504)\n+                or \"timeout\" in _err_str\n+            )\n             if (\n-                _is_model_not_found\n+                (_is_model_not_found or _is_timeout)\n                 and self.summary_model\n                 and self.summary_model != self.model\n                 and not getattr(self, \"_summary_model_fallen_back\", False)\n             ):\n                 self._summary_model_fallen_back = True\n                 logging.warning(\n-                    \"Summary model '%s' not available (%s). \"\n+                    \"Summary model '%s' unavailable (%s). \"\n                     \"Falling back to main model '%s' for compression.\",\n                     self.summary_model, e, self.model,\n                 )\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}