diff --git a/codex-rs/login/src/auth/storage_policy_tests.rs b/codex-rs/login/src/auth/storage_policy_tests.rs
index 9375b59be1..17e4ab035a 100644
--- a/codex-rs/login/src/auth/storage_policy_tests.rs
+++ b/codex-rs/login/src/auth/storage_policy_tests.rs
@@ -292,6 +292,7 @@ fn auto_auth_storage_load_falls_back_when_keyring_errors() -> anyhow::Result<()>
let encrypted = auth_with_prefix("encrypted");
seed_secrets_backend_with_auth(&mock_keyring, codex_home.path(), &encrypted)?;
+ assert_eq!(storage.load()?, Some(encrypted.clone()));
mock_keyring.set_error(&key, KeyringError::Invalid("error".into(), "load".into()));
let expected = auth_with_prefix("fallback");
diff --git a/codex-rs/secrets/src/lib.rs b/codex-rs/secrets/src/lib.rs
index de7e07e3cc..d934101900 100644
--- a/codex-rs/secrets/src/lib.rs
+++ b/codex-rs/secrets/src/lib.rs
@@ -210,8 +210,10 @@ pub(crate) fn keyring_service() -> &'static str {
#[cfg(test)]
mod tests {
use super::*;
+ use crate::local::SECRETS_CACHE_TEST_LOCK;
use codex_keyring_store::tests::MockKeyringStore;
use pretty_assertions::assert_eq;
+ use std::sync::PoisonError;
#[test]
fn environment_id_fallback_has_cwd_prefix() {
@@ -233,6 +235,9 @@ mod tests {
#[test]
fn manager_round_trips_local_backend() -> Result<()> {
+ let _cache_lock = SECRETS_CACHE_TEST_LOCK
+ .lock()
+ .unwrap_or_else(PoisonError::into_inner);
let codex_home = tempfile::tempdir().expect("tempdir");
let keyring = Arc::new(MockKeyringStore::default());
let manager = SecretsManager::new_with_keyring_store(
diff --git a/codex-rs/secrets/src/local.rs b/codex-rs/secrets/src/local.rs
index 7aebad1547..801b20b261 100644
--- a/codex-rs/secrets/src/local.rs
+++ b/codex-rs/secrets/src/local.rs
@@ -43,6 +43,13 @@ const CODEX_AUTH_SECRETS_FILENAME: &str = "codex_auth.age";
const MCP_OAUTH_SECRETS_FILENAME: &str = "mcp_oauth.age";
const GATEWAY_OAUTH_SECRETS_FILENAME: &str = "gateway_oauth.age";
static MCP_OAUTH_CACHE: Mutex