{"repo":"NousResearch/hermes-agent","public_id":"87889","display_label":"Anthropic OAuth auth fixes and concurrency issues","summary":"These items address several bugs in the Anthropic OAuth implementation, including a CSRF vulnerability, a cross-process token refresh race, API-key shadowing, misuse of single-use tokens, and an unhandled PermissionError in the auth store lock under Windows concurrency.","subsystem":"agent/secret_sources","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":1.0},"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":87889,"title":"_auth_store_lock() can raise an unhandled PermissionError under real concurrency on Windows","url":null,"state":"open"},{"kind":"pr","number":87891,"title":"fix(auth): close Anthropic OAuth CSRF gap, cross-process refresh race, and API-key shadowing","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"b4403a942a55","number":0},{"kind":"pr","value":"#98245","number":98245},{"kind":"pr","value":"#95434","number":95434}],"category":"merged_via","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}}