@@ -454,6 +454,7 @@ fn subagent_thread_started_review_serializes_expected_shape() {
454454 let event = TrackEventRequest :: ThreadInitialized ( subagent_thread_started_event_request (
455455 SubAgentThreadStartedInput {
456456 thread_id : "thread-review" . to_string ( ) ,
457+ parent_thread_id : None ,
457458 product_client_id : "codex-tui" . to_string ( ) ,
458459 client_name : "codex-tui" . to_string ( ) ,
459460 client_version : "1.0.0" . to_string ( ) ,
@@ -496,6 +497,7 @@ fn subagent_thread_started_thread_spawn_serializes_parent_thread_id() {
496497 let event = TrackEventRequest :: ThreadInitialized ( subagent_thread_started_event_request (
497498 SubAgentThreadStartedInput {
498499 thread_id : "thread-spawn" . to_string ( ) ,
500+ parent_thread_id : None ,
499501 product_client_id : "codex-tui" . to_string ( ) ,
500502 client_name : "codex-tui" . to_string ( ) ,
501503 client_version : "1.0.0" . to_string ( ) ,
@@ -526,6 +528,7 @@ fn subagent_thread_started_memory_consolidation_serializes_expected_shape() {
526528 let event = TrackEventRequest :: ThreadInitialized ( subagent_thread_started_event_request (
527529 SubAgentThreadStartedInput {
528530 thread_id : "thread-memory" . to_string ( ) ,
531+ parent_thread_id : None ,
529532 product_client_id : "codex-tui" . to_string ( ) ,
530533 client_name : "codex-tui" . to_string ( ) ,
531534 client_version : "1.0.0" . to_string ( ) ,
@@ -550,6 +553,7 @@ fn subagent_thread_started_other_serializes_expected_shape() {
550553 let event = TrackEventRequest :: ThreadInitialized ( subagent_thread_started_event_request (
551554 SubAgentThreadStartedInput {
552555 thread_id : "thread-guardian" . to_string ( ) ,
556+ parent_thread_id : None ,
553557 product_client_id : "codex-tui" . to_string ( ) ,
554558 client_name : "codex-tui" . to_string ( ) ,
555559 client_version : "1.0.0" . to_string ( ) ,
@@ -562,6 +566,31 @@ fn subagent_thread_started_other_serializes_expected_shape() {
562566
563567 let payload = serde_json:: to_value ( & event) . expect ( "serialize other subagent event" ) ;
564568 assert_eq ! ( payload[ "event_params" ] [ "subagent_source" ] , "guardian" ) ;
569+ assert_eq ! ( payload[ "event_params" ] [ "parent_thread_id" ] , json!( null) ) ;
570+ }
571+
572+ #[ test]
573+ fn subagent_thread_started_other_serializes_explicit_parent_thread_id ( ) {
574+ let event = TrackEventRequest :: ThreadInitialized ( subagent_thread_started_event_request (
575+ SubAgentThreadStartedInput {
576+ thread_id : "thread-guardian" . to_string ( ) ,
577+ parent_thread_id : Some ( "parent-thread-guardian" . to_string ( ) ) ,
578+ product_client_id : "codex-tui" . to_string ( ) ,
579+ client_name : "codex-tui" . to_string ( ) ,
580+ client_version : "1.0.0" . to_string ( ) ,
581+ model : "gpt-5" . to_string ( ) ,
582+ ephemeral : false ,
583+ subagent_source : SubAgentSource :: Other ( "guardian" . to_string ( ) ) ,
584+ created_at : 126 ,
585+ } ,
586+ ) ) ;
587+
588+ let payload = serde_json:: to_value ( & event) . expect ( "serialize guardian subagent event" ) ;
589+ assert_eq ! ( payload[ "event_params" ] [ "subagent_source" ] , "guardian" ) ;
590+ assert_eq ! (
591+ payload[ "event_params" ] [ "parent_thread_id" ] ,
592+ "parent-thread-guardian"
593+ ) ;
565594}
566595
567596#[ tokio:: test]
@@ -574,6 +603,7 @@ async fn subagent_thread_started_publishes_without_initialize() {
574603 AnalyticsFact :: Custom ( CustomAnalyticsFact :: SubAgentThreadStarted (
575604 SubAgentThreadStartedInput {
576605 thread_id : "thread-review" . to_string ( ) ,
606+ parent_thread_id : None ,
577607 product_client_id : "codex-tui" . to_string ( ) ,
578608 client_name : "codex-tui" . to_string ( ) ,
579609 client_version : "1.0.0" . to_string ( ) ,
0 commit comments