@@ -2784,6 +2784,17 @@ fn enqueue_exec_job(
27842784 request. capture_patch ,
27852785 )
27862786 } ) ?;
2787+ // Resolve this before runner-specific preparation so the opaque process plan
2788+ // can retain the same authority the daemon uses for durable lifecycle state.
2789+ let canonical_durable_run_id = resolve_exec_idempotency_key (
2790+ request. idempotency_key . as_deref ( ) ,
2791+ exec_request_run_ref_metadata (
2792+ request. lifecycle . as_ref ( ) ,
2793+ request. lab_runner_workload . as_ref ( ) ,
2794+ request. metadata . as_ref ( ) ,
2795+ )
2796+ . as_ref ( ) ,
2797+ ) ;
27872798 let plan = runner_exec_driver:: prepare_exec ( runner_exec_driver:: RunnerExecPrepareRequest {
27882799 runner_id : request. runner_id ,
27892800 runner : request. runner ,
@@ -2800,6 +2811,7 @@ fn enqueue_exec_job(
28002811 source_snapshot : request. source_snapshot ,
28012812 require_paths : request. require_paths ,
28022813 extension_env_providers : request. extension_env_providers ,
2814+ authoritative_run_id : canonical_durable_run_id. clone ( ) ,
28032815 validate_require_paths_on_host : true ,
28042816 } ) ?;
28052817 let source_snapshot = Some ( plan. source_snapshot . clone ( ) ) ;
@@ -2811,15 +2823,6 @@ fn enqueue_exec_job(
28112823 // controllers that predate the explicit field. Either way the resolved key
28122824 // is folded into the lifecycle's `durable_run_id` below, which is what the
28132825 // job-store dedup guard keys on.
2814- let canonical_durable_run_id = resolve_exec_idempotency_key (
2815- request. idempotency_key . as_deref ( ) ,
2816- exec_request_run_ref_metadata (
2817- lifecycle. as_ref ( ) ,
2818- request. lab_runner_workload . as_ref ( ) ,
2819- request. metadata . as_ref ( ) ,
2820- )
2821- . as_ref ( ) ,
2822- ) ;
28232826 if let Some ( durable_run_id) = canonical_durable_run_id {
28242827 lifecycle
28252828 . get_or_insert_with ( RunnerJobLifecycleMetadata :: default)
@@ -3110,6 +3113,7 @@ fn enqueue_exec_job(
31103113 let metrics = process_output. metrics . clone ( ) ;
31113114 let capture = process_output. capture . clone ( ) ;
31123115 let extension_env_provenance = process_output. extension_env_provenance . clone ( ) ;
3116+ let diagnostic_hints = process_output. diagnostic_hints . clone ( ) ;
31133117 if cancellation_requested. load ( Ordering :: SeqCst ) {
31143118 let evidence = stall_evidence
31153119 . lock ( )
@@ -3169,7 +3173,7 @@ fn enqueue_exec_job(
31693173 } else {
31703174 None
31713175 } ;
3172- let result = json ! ( {
3176+ let mut result = json ! ( {
31733177 "runner_id" : plan. runner_id,
31743178 "cwd" : plan. cwd,
31753179 "command" : plan. command,
@@ -3183,6 +3187,9 @@ fn enqueue_exec_job(
31833187 "capture" : capture,
31843188 "extension_env_providers" : extension_env_provenance,
31853189 } ) ;
3190+ if !diagnostic_hints. is_empty ( ) {
3191+ result[ "diagnostic_hints" ] = json ! ( diagnostic_hints) ;
3192+ }
31863193 if exit_code != 0 {
31873194 job. result ( result. clone ( ) ) ?;
31883195 return Err ( Error :: remote_command_failed ( RemoteCommandFailedDetails {
0 commit comments