{"repo":"NousResearch/hermes-agent","public_id":"53099","display_label":"Misleading API-key error messages for proxy/WAF 403 responses","summary":"The members concern 403 responses from a proxy, WAF, or relay being reported as an API-key rejection rather than a firewall or request block. One also mentions anthropic_messages routes sending custom extra_headers, and one is a bug report involving a relay blocking an OpenAI/Python User-Agent.","subsystem":"agent","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":115812,"merged_at":"2026-09-19T16:57:22+00:00"},"resolution":{"state":"resolved","by":"pr-115812"},"freshness":{"state":"verified","last_verified_at":"2026-09-19T16:57:22+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":9721,"pr_number":115812,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T16:57:22+00:00"},{"issue_number":24293,"pr_number":115812,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T16:57:22+00:00"},{"issue_number":46000,"pr_number":115812,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-09-19T16:57:22+00:00"},{"issue_number":53099,"pr_number":115812,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T16:57:22+00:00"},{"issue_number":70566,"pr_number":115812,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-19T16:57:22+00:00"}],"members":[{"kind":"issue","number":53099,"title":"[Bug]: Misleading API key rejection message when custom OpenAI-compatible relay blocks OpenAI/Python User-Agent","url":null,"state":"closed"},{"kind":"pr","number":53114,"title":"fix(agent): don't mislabel a proxy/WAF 403 block as an API-key rejection","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"cb062f7bd3d1","number":0},{"kind":"pr","value":"#115812","number":115812},{"kind":"pr","value":"#24293","number":24293},{"kind":"pr","value":"#9721","number":9721},{"kind":"pr","value":"#53099","number":53099},{"kind":"pr","value":"#70566","number":70566},{"kind":"pr","value":"#46002","number":46002},{"kind":"pr","value":"#70567","number":70567},{"kind":"pr","value":"#53114","number":53114}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":115812,"title":"fix(providers): WAF 403s report as a firewall block, not a rejected key; anthropic_messages routes send custom extra_headers (#24293, #9721, #53099, #70566, salvage #46002 #70567 #53114)","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/anthropic_adapter.py","agent/error_classifier.py","agent/error_surface.py","agent/turn_failure_copy.py","agent/turn_recovery.py","apps/desktop/src/i18n/en.ts","apps/desktop/src/lib/error-surface.test.ts","apps/desktop/src/lib/error-surface.ts","cli.py","cron/scheduler_failure_copy.py","hermes_cli/cli_chat_error_copy.py","tests/agent/test_anthropic_adapter_extra_headers.py","tests/agent/test_error_classifier.py","tests/agent/test_error_classifier_upstream_blocked.py","tests/agent/test_run_agent_codex_responses.py","tests/cron/test_cron_failure_notice_copy.py","tests/hermes_cli/test_single_query_exit_contract.py","tui_gateway/user_messages.py","ui-tui/src/app/userMessages.ts","website/docs/user-guide/configuring-models.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}