@@ -337,7 +337,17 @@ pub fn cleanup_old(days: u32) {
337337
338338// ─── Helpers ────────────────────────────────────────────
339339
340+ #[ cfg( test) ]
341+ thread_local ! {
342+ pub static MOCK_TRANSCRIPT_DIR : std:: cell:: RefCell <Option <PathBuf >> = const { std:: cell:: RefCell :: new( None ) } ;
343+ }
344+
340345fn transcripts_dir ( ) -> PathBuf {
346+ #[ cfg( test) ]
347+ if let Some ( mock) = MOCK_TRANSCRIPT_DIR . with ( |d| d. borrow ( ) . clone ( ) ) {
348+ return mock;
349+ }
350+
341351 if let Ok ( custom) = std:: env:: var ( "OMNI_TRANSCRIPT_DIR" ) {
342352 return PathBuf :: from ( custom) ;
343353 }
@@ -368,19 +378,12 @@ fn truncate_payload(payload: &str, max_bytes: usize) -> String {
368378#[ cfg( test) ]
369379mod tests {
370380 use super :: * ;
371- use std:: sync:: Mutex ;
372381 use tempfile:: tempdir;
373382
374- // Serialize all transcript tests — they share the OMNI_TRANSCRIPT_DIR env var
375- static TEST_LOCK : Mutex < ( ) > = Mutex :: new ( ( ) ) ;
376-
377- fn setup_test_dir ( ) -> ( tempfile:: TempDir , std:: sync:: MutexGuard < ' static , ( ) > ) {
378- let guard = TEST_LOCK . lock ( ) . unwrap ( ) ;
383+ fn setup_test_dir ( ) -> tempfile:: TempDir {
379384 let dir = tempdir ( ) . unwrap ( ) ;
380- unsafe {
381- std:: env:: set_var ( "OMNI_TRANSCRIPT_DIR" , dir. path ( ) . to_str ( ) . unwrap ( ) ) ;
382- }
383- ( dir, guard)
385+ MOCK_TRANSCRIPT_DIR . with ( |d| * d. borrow_mut ( ) = Some ( dir. path ( ) . to_path_buf ( ) ) ) ;
386+ dir
384387 }
385388
386389 #[ test]
@@ -414,7 +417,7 @@ mod tests {
414417
415418 #[ test]
416419 fn test_save_and_load_roundtrip ( ) {
417- let ( _dir, _lock ) = setup_test_dir ( ) ;
420+ let _dir = setup_test_dir ( ) ;
418421
419422 let mut t = Transcript :: new ( "roundtrip_1" , "/project" ) ;
420423 let entry = TranscriptEntry :: new_input ( "git status" , Some ( "git" ) ) ;
@@ -428,7 +431,7 @@ mod tests {
428431
429432 #[ test]
430433 fn test_atomic_write_no_corrupt_file ( ) {
431- let ( _dir, _lock ) = setup_test_dir ( ) ;
434+ let _dir = setup_test_dir ( ) ;
432435
433436 let t = Transcript :: new ( "atomic_1" , "/project" ) ;
434437 t. save ( ) . unwrap ( ) ;
@@ -444,7 +447,7 @@ mod tests {
444447
445448 #[ test]
446449 fn test_mark_last_completed ( ) {
447- let ( _dir, _lock ) = setup_test_dir ( ) ;
450+ let _dir = setup_test_dir ( ) ;
448451
449452 let mut t = Transcript :: new ( "complete_1" , "/project" ) ;
450453 t. append_entry ( TranscriptEntry :: new_input ( "input1" , None ) )
@@ -461,7 +464,7 @@ mod tests {
461464
462465 #[ test]
463466 fn test_mark_last_failed ( ) {
464- let ( _dir, _lock ) = setup_test_dir ( ) ;
467+ let _dir = setup_test_dir ( ) ;
465468
466469 let mut t = Transcript :: new ( "fail_1" , "/project" ) ;
467470 t. append_entry ( TranscriptEntry :: new_input ( "bad input" , None ) )
@@ -497,13 +500,13 @@ mod tests {
497500
498501 #[ test]
499502 fn test_find_pending_with_no_transcripts ( ) {
500- let ( _dir, _lock ) = setup_test_dir ( ) ;
503+ let _dir = setup_test_dir ( ) ;
501504 assert ! ( find_pending( ) . is_none( ) ) ;
502505 }
503506
504507 #[ test]
505508 fn test_find_pending_finds_interrupted_session ( ) {
506- let ( _dir, _lock ) = setup_test_dir ( ) ;
509+ let _dir = setup_test_dir ( ) ;
507510
508511 let mut t = Transcript :: new ( "interrupted_1" , "/project" ) ;
509512 t. append_entry ( TranscriptEntry :: new_input ( "pending work" , None ) )
@@ -516,7 +519,7 @@ mod tests {
516519
517520 #[ test]
518521 fn test_find_pending_skips_completed_sessions ( ) {
519- let ( _dir, _lock ) = setup_test_dir ( ) ;
522+ let _dir = setup_test_dir ( ) ;
520523
521524 let mut t = Transcript :: new ( "done_1" , "/project" ) ;
522525 t. append_entry ( TranscriptEntry :: new_input ( "done work" , None ) )
@@ -528,7 +531,7 @@ mod tests {
528531
529532 #[ test]
530533 fn test_load_or_new_creates_if_missing ( ) {
531- let ( _dir, _lock ) = setup_test_dir ( ) ;
534+ let _dir = setup_test_dir ( ) ;
532535
533536 let t = Transcript :: load_or_new ( "new_session" , "/project" ) ;
534537 assert_eq ! ( t. session_id, "new_session" ) ;
@@ -537,7 +540,7 @@ mod tests {
537540
538541 #[ test]
539542 fn test_load_or_new_loads_if_exists ( ) {
540- let ( _dir, _lock ) = setup_test_dir ( ) ;
543+ let _dir = setup_test_dir ( ) ;
541544
542545 let mut original = Transcript :: new ( "existing_1" , "/project" ) ;
543546 original
@@ -551,7 +554,7 @@ mod tests {
551554
552555 #[ test]
553556 fn test_cleanup_old_removes_stale_transcripts ( ) {
554- let ( _dir, _lock ) = setup_test_dir ( ) ;
557+ let _dir = setup_test_dir ( ) ;
555558
556559 // Create a transcript with very old updated_at
557560 let mut t = Transcript :: new ( "old_1" , "/project" ) ;
@@ -570,7 +573,7 @@ mod tests {
570573
571574 #[ test]
572575 fn test_list_recent_returns_all ( ) {
573- let ( _dir, _lock ) = setup_test_dir ( ) ;
576+ let _dir = setup_test_dir ( ) ;
574577
575578 let t1 = Transcript :: new ( "list_a" , "/project" ) ;
576579 t1. save ( ) . unwrap ( ) ;
@@ -600,7 +603,7 @@ mod tests {
600603
601604 #[ test]
602605 fn test_snapshot_state_persists ( ) {
603- let ( _dir, _lock ) = setup_test_dir ( ) ;
606+ let _dir = setup_test_dir ( ) ;
604607
605608 let mut t = Transcript :: new ( "state_1" , "/project" ) ;
606609 let mut state = SessionState :: new ( ) ;
0 commit comments