@@ -356,6 +356,32 @@ async def task_run(options: TaskRunOptions, task_cancel: TaskCancel | None) -> E
356356 # deleted below — used by register_eval and carry_forward_unlogged_samples
357357 sample_ids = [s .id for s in dataset if s .id is not None ]
358358
359+ async def finish_task_log (
360+ status : EvalStatus ,
361+ stats : EvalStats ,
362+ results : EvalResults | None = None ,
363+ reductions : list [EvalSampleReductions ] | None = None ,
364+ error : EvalError | None = None ,
365+ ) -> EvalLog :
366+ """Finish via ``_finish_task_log`` with the run-invariant context.
367+
368+ Bound once here so every terminal branch finishes with the same
369+ logger / sample-source / planned-ids context — a new branch can't
370+ accidentally thread a stale or divergent value.
371+ """
372+ return await _finish_task_log (
373+ logger = logger ,
374+ sample_source = options .sample_source ,
375+ sample_ids = sample_ids ,
376+ epochs = epochs ,
377+ log_images = log_images ,
378+ status = status ,
379+ stats = stats ,
380+ results = results ,
381+ reductions = reductions ,
382+ error = error ,
383+ )
384+
359385 # handle sample errors (raise as required). use total_samples (sliced
360386 # dataset * epochs) as the denominator for fractional fail_on_error so
361387 # the mid-run abort threshold matches the end-of-run check below.
@@ -743,12 +769,7 @@ async def create_sample_state(
743769 )
744770
745771 # finish
746- eval_log = await _finish_task_log (
747- logger = logger ,
748- sample_source = options .sample_source ,
749- sample_ids = sample_ids ,
750- epochs = epochs ,
751- log_images = log_images ,
772+ eval_log = await finish_task_log (
752773 status = "error" if mark_log_as_error else "success" ,
753774 stats = stats ,
754775 results = results ,
@@ -789,12 +810,7 @@ async def create_sample_state(
789810 f"Task cancelled by user ({ task_cancel .cancel_type } )"
790811 )
791812 error = eval_error (cancel_ex , TerminateTaskError , cancel_ex , None )
792- eval_log = await _finish_task_log (
793- logger = logger ,
794- sample_source = options .sample_source ,
795- sample_ids = sample_ids ,
796- epochs = epochs ,
797- log_images = log_images ,
813+ eval_log = await finish_task_log (
798814 status = "error" ,
799815 stats = stats ,
800816 results = results ,
@@ -811,12 +827,7 @@ async def create_sample_state(
811827 )
812828 else :
813829 # External cancellation (ctrl+c)
814- eval_log = await _finish_task_log (
815- logger = logger ,
816- sample_source = options .sample_source ,
817- sample_ids = sample_ids ,
818- epochs = epochs ,
819- log_images = log_images ,
830+ eval_log = await finish_task_log (
820831 status = "cancelled" ,
821832 stats = stats ,
822833 results = results ,
@@ -840,12 +851,7 @@ async def create_sample_state(
840851 collect_eval_data (stats )
841852
842853 # finish with error status
843- eval_log = await _finish_task_log (
844- logger = logger ,
845- sample_source = options .sample_source ,
846- sample_ids = sample_ids ,
847- epochs = epochs ,
848- log_images = log_images ,
854+ eval_log = await finish_task_log (
849855 status = "error" ,
850856 stats = stats ,
851857 results = results ,
0 commit comments