{"repo":"NousResearch/hermes-agent","public_id":"56895","display_label":"Responses API history duplication and compression bugs","summary":"These issues and fixes center on the /v1/responses endpoint experiencing conversation history duplication and repeated compression loops when context exceeds model limits. Multiple related problems are addressed: compressed transcripts not being persisted correctly, history growing exponentially, and post-compression state not being properly stored or advanced.","subsystem":"agent","counts":{"members":12,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":3,"merged_prs":2,"attempt_prs":7},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":69306},"resolution":{"state":"partially_resolved","by":"pr-69306"},"freshness":{"state":"verified","last_verified_at":"2026-09-19T21:30:06+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.16242424242424242},"fix_edges":[{"issue_number":56895,"pr_number":69306,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":58081,"pr_number":69306,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":68257,"pr_number":116326,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":89891,"pr_number":116326,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":56895,"title":"`/v1/responses` enters repeated compression loop after context exceeds model limit","url":null,"state":"closed"},{"kind":"issue","number":58081,"title":"[Bug] Responses API: compressed transcript not stored in ResponseStore, causing re-compression loop","url":null,"state":"closed"},{"kind":"issue","number":68257,"title":"Exponential conversation history doubling in Responses API (_build_response_conversation_history)","url":null,"state":"closed"},{"kind":"pr","number":56933,"title":"fix(api): advance responses chain after compression","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"d12d8b3a4","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":56996,"title":"fix(api): persist compressed responses history","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#56933","number":56933},{"kind":"pr","value":"#56895","number":56895},{"kind":"pr","value":"#56933","number":56933}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":58133,"title":"fix(gateway): Responses API stores bloated context after compression","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"1c21e96ed","number":0},{"kind":"pr","value":"#69306","number":69306}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":66148,"title":"fix(gateway): prune stored /v1/responses history images and stop post-compression history duplication","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"1c21e96ed","number":0},{"kind":"commit","value":"c7502a5fe2cb","number":0},{"kind":"pr","value":"#56895","number":56895},{"kind":"pr","value":"#56933","number":56933},{"kind":"pr","value":"#56996","number":56996},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#66148","number":66148},{"kind":"pr","value":"#56933","number":56933},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#56996","number":56996},{"kind":"pr","value":"#56933","number":56933},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#66148","number":66148},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#56895","number":56895},{"kind":"pr","value":"#56933","number":56933},{"kind":"pr","value":"#56996","number":56996},{"kind":"pr","value":"#66148","number":66148},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#66148","number":66148},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#66148","number":66148},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#56933","number":56933},{"kind":"pr","value":"#56996","number":56996},{"kind":"pr","value":"#69306","number":69306},{"kind":"pr","value":"#1","number":1},{"kind":"pr","value":"#1","number":1},{"kind":"pr","value":"#15803","number":15803},{"kind":"pr","value":"#14532","number":14532},{"kind":"pr","value":"#6","number":6},{"kind":"pr","value":"#1","number":1},{"kind":"pr","value":"#9","number":9},{"kind":"pr","value":"#374151","number":374151},{"kind":"pr","value":"#4338","number":4338},{"kind":"pr","value":"#56895","number":56895},{"kind":"pr","value":"#66148","number":66148}],"category":"partial_fix","implication":"needs_llm"},"merged":false},{"kind":"pr","number":68282,"title":"fix(api): keep Responses history system-free 🩷","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"d1ea8387ba94","number":0},{"kind":"pr","value":"#68257","number":68257},{"kind":"pr","value":"#68282","number":68282},{"kind":"pr","value":"#70695","number":70695},{"kind":"pr","value":"#75289","number":75289},{"kind":"pr","value":"#68282","number":68282},{"kind":"pr","value":"#70695","number":70695},{"kind":"pr","value":"#75289","number":75289},{"kind":"pr","value":"#68282","number":68282},{"kind":"pr","value":"#70695","number":70695},{"kind":"pr","value":"#75289","number":75289},{"kind":"pr","value":"#75289","number":75289},{"kind":"pr","value":"#68282","number":68282},{"kind":"pr","value":"#70695","number":70695},{"kind":"pr","value":"#75289","number":75289},{"kind":"pr","value":"#1","number":1},{"kind":"pr","value":"#1","number":1},{"kind":"pr","value":"#15803","number":15803},{"kind":"pr","value":"#14532","number":14532},{"kind":"pr","value":"#6","number":6},{"kind":"pr","value":"#1","number":1},{"kind":"pr","value":"#9","number":9},{"kind":"pr","value":"#374151","number":374151},{"kind":"pr","value":"#4338","number":4338},{"kind":"pr","value":"#68257","number":68257},{"kind":"pr","value":"#68282","number":68282},{"kind":"pr","value":"#70695","number":70695}],"category":"partial_fix","implication":"needs_llm"},"merged":false},{"kind":"pr","number":69306,"title":"fix(api): persist compressed transcripts in ResponseStore to stop re-compression loops","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","gateway/platforms/api_server.py","tests/gateway/test_api_server.py"]},{"kind":"pr","number":70695,"title":"fix(api_server): robust Responses turn-start detection","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"60e166cbf5","number":0},{"kind":"pr","value":"#116326","number":116326}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":75289,"title":"fix(api_server): trust full transcripts via _transcript_mode to stop repair-induced duplication","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"60e166cbf5","number":0},{"kind":"pr","value":"#116326","number":116326}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":116326,"title":"Chained /v1/responses turns no longer replay earlier tool calls or double the stored history after history repair/compaction (#89891, rebuild of #70695)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/api_server_openai_routes.py","gateway/platforms/api_server_turn_boundary.py","tests/gateway/test_api_server_responses_history_dedupe.py","tests/gateway/test_api_server_turn_boundary.py","website/docs/user-guide/features/api-server.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}