{"repo":"NousResearch/hermes-agent","public_id":"92606","display_label":"Anthropic OAuth token rotation and refresh handling","summary":"These items concern a bug where stale credential files overwrite rotated tokens and shared refresh logic incorrectly consumes single-use tokens, leading to 401 errors and empty pools. The work addresses keeping OAuth sessions valid through token rotation.","subsystem":"agent","counts":{"members":3,"open_issues":1,"open_issues_distinct":1,"open_prs":0,"closed_issues":0,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":98245,"merged_at":"2026-08-30T01:34:35+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-08-30T01:34:35+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":87887,"pr_number":98245,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-08-30T01:34:35+00:00"},{"issue_number":87888,"pr_number":98245,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-08-30T01:34:35+00:00"},{"issue_number":87889,"pr_number":98245,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-08-30T01:34:35+00:00"},{"issue_number":92606,"pr_number":98245,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-08-30T01:34:35+00:00"}],"members":[{"kind":"issue","number":92606,"title":"Anthropic OAuth (hermes_pkce/dashboard_pkce): stale credential file overwrites rotated token and two pool rows share one single-use refresh token -> 401 revoked -> empty pool","url":null,"state":"open"},{"kind":"pr","number":92619,"title":"fix(auth): keep Anthropic OAuth sessions valid after token rotation","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"b4403a942a55","number":0},{"kind":"pr","value":"#98245","number":98245},{"kind":"pr","value":"#87891","number":87891}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":98245,"title":"Anthropic OAuth: shared-credential refreshes stop burning single-use tokens; dashboard PKCE removed (salvage #87891)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/anthropic_adapter.py","agent/anthropic_credentials.py","agent/anthropic_endpoints.py","agent/anthropic_message_convert.py","agent/auxiliary_client.py","agent/credential_persistence.py","agent/credential_pool.py","hermes_cli/auth.py","hermes_cli/web_server.py","tests/agent/test_anthropic_adapter.py","tests/agent/test_anthropic_borrowed_row_authority.py","tests/agent/test_anthropic_credential_persist_failure.py","tests/agent/test_anthropic_keychain.py","tests/agent/test_anthropic_oauth_stress.py","tests/agent/test_anthropic_spent_rotation_verdict.py","tests/agent/test_anthropic_token_scope_isolation.py","tests/agent/test_auxiliary_client.py","tests/agent/test_credential_pool.py","tests/agent/test_credential_pool_anthropic_refresh_race.py","tests/agent/test_credential_pool_oat_authtype.py","tests/agent/test_credential_pool_oauth_writethrough.py","tests/conftest.py","tests/hermes_cli/test_auth_store_lock_concurrent.py","tests/hermes_cli/test_web_oauth_dispatch.py","tests/hermes_cli/test_web_server_oauth_write.py","tests/test_hermetic_side_effect_guards.py","tests/tools/test_subprocess_stdin_guard.py","web/src/lib/api.test.ts","web/src/lib/api.ts"]}],"trust":{"default_tier":"verified","includes_suggested":false}}