Skip to content

Commit 8a14e35

Browse files
runtime: Remove telemetry readiness marker lifecycle
Use the persisted auth.db telemetry credential as the sole readiness source by removing marker writes and clears, and delete the obsolete readiness module and path. Keep logout and session replacement deletion ordering, derive provisioning status from credential persistence, and cover the post-logout lookup state. Plan: remove-telemetry-readiness-marker (T04) Co-authored-by: SCE <sce@crocoder.dev>
1 parent 3d06ebb commit 8a14e35

8 files changed

Lines changed: 68 additions & 189 deletions

File tree

‎cli/src/services/auth_command/mod.rs‎

Lines changed: 17 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use crate::services::managed_telemetry::{self, run_with_deadline, CREDENTIAL_LOO
2121
use crate::services::output_format::OutputFormat;
2222
use crate::services::style::{label, prompt_label, prompt_value, value};
2323
use crate::services::telemetry_credential_storage;
24-
use crate::services::telemetry_readiness;
2524
use crate::services::token_storage::{self, StoredTokens, TokenStorageError};
2625

2726
pub const NAME: &str = "auth";
@@ -272,25 +271,21 @@ where
272271
pub async fn run_logout(format: AuthFormat) -> Result<String, CliError> {
273272
run_logout_with(
274273
format,
275-
telemetry_readiness::clear,
276274
token_storage::delete_tokens(),
277275
telemetry_credential_storage::delete_telemetry_credential(),
278276
)
279277
.await
280278
}
281279

282-
async fn run_logout_with<C, W, T>(
280+
async fn run_logout_with<W, T>(
283281
format: AuthFormat,
284-
clear_readiness: C,
285282
delete_workos: W,
286283
delete_telemetry: T,
287284
) -> Result<String, CliError>
288285
where
289-
C: FnOnce() -> Result<()>,
290286
W: Future<Output = Result<bool, TokenStorageError>>,
291287
T: Future<Output = Result<bool, TokenStorageError>>,
292288
{
293-
clear_readiness().map_err(unexpected_auth_command_error)?;
294289
let workos_result = delete_workos.await;
295290
let telemetry_result = delete_telemetry.await;
296291
let workos_deleted = workos_result.map_err(auth_storage_error)?;
@@ -397,25 +392,21 @@ where
397392

398393
async fn save_new_session_tokens(token: &auth::TokenResponse) -> Result<StoredTokens, CliError> {
399394
replace_session_with(
400-
telemetry_readiness::clear,
401395
telemetry_credential_storage::delete_telemetry_credential(),
402396
|| token_storage::save_tokens(token, CredentialAccess::Interactive),
403397
)
404398
.await
405399
}
406400

407-
async fn replace_session_with<C, D, S, SF>(
408-
clear_readiness: C,
401+
async fn replace_session_with<D, S, SF>(
409402
invalidate_telemetry: D,
410403
save_session: S,
411404
) -> Result<StoredTokens, CliError>
412405
where
413-
C: FnOnce() -> Result<()>,
414406
D: Future<Output = Result<bool, TokenStorageError>>,
415407
S: FnOnce() -> SF,
416408
SF: Future<Output = Result<StoredTokens, TokenStorageError>>,
417409
{
418-
clear_readiness().map_err(unexpected_auth_command_error)?;
419410
invalidate_telemetry.await.map_err(login_storage_error)?;
420411
save_session().await.map_err(login_storage_error)
421412
}
@@ -437,34 +428,11 @@ where
437428
async fn provision_telemetry_credential(
438429
client: &AuthenticatedControlPlaneClient,
439430
) -> TelemetryProvisioningResult {
440-
let provisioned = client.issue_and_save_telemetry_credential().await;
441-
let result = record_telemetry_readiness(
442-
provisioned.as_ref().ok(),
443-
telemetry_readiness::mark_ready,
444-
telemetry_readiness::clear,
445-
);
446-
if result == TelemetryProvisioningResult::Issued {
447-
enroll_current_repository_if_unbound().await;
448-
}
449-
result
450-
}
451-
452-
fn record_telemetry_readiness<M, C>(
453-
provisioned: Option<&telemetry_credential_storage::TelemetryCredential>,
454-
mark_ready: M,
455-
clear: C,
456-
) -> TelemetryProvisioningResult
457-
where
458-
M: FnOnce(u64) -> Result<()>,
459-
C: FnOnce() -> Result<()>,
460-
{
461-
let recorded = provisioned
462-
.is_some_and(|credential| mark_ready(credential.expires_at_unix_seconds).is_ok());
463-
if recorded {
464-
return TelemetryProvisioningResult::Issued;
431+
if client.issue_and_save_telemetry_credential().await.is_err() {
432+
return TelemetryProvisioningResult::Unavailable;
465433
}
466-
let _ = clear();
467-
TelemetryProvisioningResult::Unavailable
434+
enroll_current_repository_if_unbound().await;
435+
TelemetryProvisioningResult::Issued
468436
}
469437

470438
async fn enroll_current_repository_if_unbound() {
@@ -860,10 +828,6 @@ mod tests {
860828
async fn new_session_invalidates_previous_telemetry_credential_before_saving() {
861829
let order = std::sync::Mutex::new(Vec::new());
862830
let saved = replace_session_with(
863-
|| {
864-
order.lock().unwrap().push("clear");
865-
Ok(())
866-
},
867831
async {
868832
order.lock().unwrap().push("invalidate");
869833
Ok(true)
@@ -876,29 +840,23 @@ mod tests {
876840
.await
877841
.expect("replacement should succeed");
878842
assert_eq!(saved, stored_tokens());
879-
assert_eq!(*order.lock().unwrap(), ["clear", "invalidate", "save"]);
843+
assert_eq!(*order.lock().unwrap(), ["invalidate", "save"]);
880844

881845
let save_called = std::sync::atomic::AtomicBool::new(false);
882-
let failed = replace_session_with(
883-
|| Ok(()),
884-
async { Err(storage_failure()) },
885-
|| async {
886-
save_called.store(true, std::sync::atomic::Ordering::SeqCst);
887-
Ok(stored_tokens())
888-
},
889-
)
846+
let failed = replace_session_with(async { Err(storage_failure()) }, || async {
847+
save_called.store(true, std::sync::atomic::Ordering::SeqCst);
848+
Ok(stored_tokens())
849+
})
890850
.await;
891851
assert!(!save_called.load(std::sync::atomic::Ordering::SeqCst));
892852
assert_login_storage_guidance(
893853
&failed.expect_err("invalidation failure fails login"),
894854
AuthStorageFailure::Database,
895855
);
896856

897-
let failed = replace_session_with(
898-
|| Ok(()),
899-
async { Ok(true) },
900-
|| async { Err(TokenStorageError::CredentialAccessUnavailable) },
901-
)
857+
let failed = replace_session_with(async { Ok(true) }, || async {
858+
Err(TokenStorageError::CredentialAccessUnavailable)
859+
})
902860
.await;
903861
assert_login_storage_guidance(
904862
&failed.expect_err("save failure fails login"),
@@ -965,7 +923,6 @@ mod tests {
965923
async fn logout_storage_failure_keeps_command_storage_guidance() {
966924
let error = run_logout_with(
967925
AuthFormat::Json,
968-
|| Ok(()),
969926
async { Err(TokenStorageError::CredentialAccessUnavailable) },
970927
async { Ok(false) },
971928
)
@@ -1265,7 +1222,7 @@ mod tests {
12651222
}
12661223

12671224
#[tokio::test]
1268-
async fn logout_clears_readiness_and_attempts_both_deletions_before_reporting() {
1225+
async fn logout_attempts_both_deletions_before_reporting() {
12691226
use AuthStorageFailure::{CredentialAccess, DatabaseLocked};
12701227

12711228
fn deletion(result: Result<bool, AuthStorageFailure>) -> Result<bool, TokenStorageError> {
@@ -1288,10 +1245,6 @@ mod tests {
12881245
let events = std::sync::Mutex::new(Vec::new());
12891246
let result = run_logout_with(
12901247
AuthFormat::Json,
1291-
|| {
1292-
events.lock().unwrap().push("clear-readiness");
1293-
Ok(())
1294-
},
12951248
async {
12961249
events.lock().unwrap().push("delete-workos");
12971250
deletion(workos)
@@ -1305,7 +1258,7 @@ mod tests {
13051258

13061259
assert_eq!(
13071260
*events.lock().unwrap(),
1308-
["clear-readiness", "delete-workos", "delete-telemetry"],
1261+
["delete-workos", "delete-telemetry"],
13091262
"{workos:?} {telemetry:?}"
13101263
);
13111264
match (result, expected) {
@@ -1320,56 +1273,6 @@ mod tests {
13201273
}
13211274
}
13221275

1323-
#[test]
1324-
fn telemetry_readiness_is_recorded_only_after_credential_persistence() {
1325-
let credential = telemetry_credential("tok-ready");
1326-
let marked = std::cell::Cell::new(None);
1327-
let cleared = std::cell::Cell::new(false);
1328-
1329-
let issued = record_telemetry_readiness(
1330-
Some(&credential),
1331-
|expires_at| {
1332-
marked.set(Some(expires_at));
1333-
Ok(())
1334-
},
1335-
|| {
1336-
cleared.set(true);
1337-
Ok(())
1338-
},
1339-
);
1340-
assert_eq!(issued, TelemetryProvisioningResult::Issued);
1341-
assert_eq!(marked.get(), Some(credential.expires_at_unix_seconds));
1342-
assert!(!cleared.get());
1343-
1344-
marked.set(None);
1345-
let failed = record_telemetry_readiness(
1346-
None,
1347-
|expires_at| {
1348-
marked.set(Some(expires_at));
1349-
Ok(())
1350-
},
1351-
|| {
1352-
cleared.set(true);
1353-
Ok(())
1354-
},
1355-
);
1356-
assert_eq!(failed, TelemetryProvisioningResult::Unavailable);
1357-
assert_eq!(marked.get(), None);
1358-
assert!(cleared.get());
1359-
1360-
cleared.set(false);
1361-
let unrecorded = record_telemetry_readiness(
1362-
Some(&credential),
1363-
|_| Err(anyhow!("read-only state directory")),
1364-
|| {
1365-
cleared.set(true);
1366-
Ok(())
1367-
},
1368-
);
1369-
assert_eq!(unrecorded, TelemetryProvisioningResult::Unavailable);
1370-
assert!(cleared.get());
1371-
}
1372-
13731276
fn access_policy(mode: AuthMode, source: ValueSource, telemetry: bool) -> ResolvedAccessPolicy {
13741277
use crate::services::config::{
13751278
ResolvedValue, TelemetryDisabledReason, TelemetryPolicyState,
@@ -1663,10 +1566,6 @@ mod tests {
16631566
let events = std::sync::Mutex::new(Vec::new());
16641567
let output = run_logout_with(
16651568
AuthFormat::Json,
1666-
|| {
1667-
events.lock().unwrap().push("clear-readiness");
1668-
Ok(())
1669-
},
16701569
async {
16711570
events.lock().unwrap().push("delete-workos");
16721571
Ok(true)
@@ -1681,7 +1580,7 @@ mod tests {
16811580

16821581
assert_eq!(
16831582
*events.lock().unwrap(),
1684-
["clear-readiness", "delete-workos", "delete-telemetry"]
1583+
["delete-workos", "delete-telemetry"]
16851584
);
16861585
assert!(output.contains("\"credentials_removed\": true"));
16871586
}

‎cli/src/services/auth_db/multiprocess_tests.rs‎

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,35 @@ fn valid_credential_without_readiness_marker_resolves_managed_telemetry_and_head
559559
assert!(!marker.exists());
560560
}
561561

562+
#[test]
563+
fn logout_then_lookup_reports_not_configured() {
564+
let _fan_out = serialize_fan_out();
565+
let sandbox = Sandbox::new();
566+
sandbox.seed();
567+
assert_eq!(telemetry_health(&sandbox, TEST_SECRET), "healthy");
568+
569+
let logout = run_cli(
570+
&sandbox,
571+
sandbox.dir.path(),
572+
&["sce", "auth", "logout", "--format", "json"],
573+
None,
574+
);
575+
assert!(logout.success, "{}{}", logout.stdout, logout.stderr);
576+
assert!(
577+
logout.stdout.contains("\"credentials_removed\": true"),
578+
"{}",
579+
logout.stdout
580+
);
581+
582+
assert!(sandbox.sce_state_dir().join("auth.db").is_file());
583+
assert_eq!(telemetry_health(&sandbox, TEST_SECRET), "not_configured");
584+
assert_eq!(hook_telemetry(&sandbox), "not_configured");
585+
assert!(!sandbox
586+
.sce_state_dir()
587+
.join(LEGACY_READINESS_MARKER)
588+
.exists());
589+
}
590+
562591
#[test]
563592
fn legacy_readiness_marker_is_ignored() {
564593
let _fan_out = serialize_fan_out();
@@ -1366,7 +1395,6 @@ async fn seed() {
13661395
})
13671396
.await
13681397
.expect("telemetry credential seeds");
1369-
crate::services::telemetry_readiness::mark_ready(FAR_FUTURE).expect("readiness seeds");
13701398
}
13711399

13721400
fn writer_rows() -> Vec<String> {

‎cli/src/services/default_paths.rs‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,10 +254,6 @@ pub fn auth_db_path() -> anyhow::Result<PathBuf> {
254254
Ok(sce_state_dir()?.join("auth.db"))
255255
}
256256

257-
pub fn telemetry_readiness_path() -> anyhow::Result<PathBuf> {
258-
Ok(sce_state_dir()?.join("telemetry-ready.json"))
259-
}
260-
261257
pub fn agent_trace_db_path_for_repository(repository_id: &str) -> anyhow::Result<PathBuf> {
262258
let state_root = resolve_sce_default_locations()?
263259
.roots()

‎cli/src/services/mod.rs‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,5 @@ pub mod structured_patch;
3737
pub mod style;
3838
pub mod sync;
3939
pub mod telemetry_credential_storage;
40-
pub mod telemetry_readiness;
4140
pub mod token_storage;
4241
pub mod version;

‎cli/src/services/telemetry_readiness.rs‎

Lines changed: 0 additions & 59 deletions
This file was deleted.

‎context/cli/access-policy.md‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)