diff --git a/evals/postmortem/live_ab/batch_failure_notice.py b/evals/postmortem/live_ab/batch_failure_notice.py index d713e8f3bf..1e17dc895a 100644 --- a/evals/postmortem/live_ab/batch_failure_notice.py +++ b/evals/postmortem/live_ab/batch_failure_notice.py @@ -27,7 +27,9 @@ dd._Batch.run_child = fake_run_child # Background dispatch requires an async-capable session; emulate a CLI session key. import tools.async_delegation as ad t0 = time.time() -out = dt.delegate_task(tasks=[{"goal": "fail fast on a simulated 401 error"}, {"goal": "slow successful worker number one"}, {"goal": "slow successful worker number two"}], background=True, parent_agent=parent) +out = dt.delegate_task(# Grouped: siblings share ONE final result, so a dead sibling would otherwise wait for the slowest. (Ungrouped tasks are +# their own async unit since the per-group split landed on main and already report as they finish.) +tasks=[{"goal": "fail fast on a simulated 401 error", "group": "g"}, {"goal": "slow successful worker number one", "group": "g"}, {"goal": "slow successful worker number two", "group": "g"}], background=True, parent_agent=parent) print("dispatch:", json.dumps(json.loads(out))[:160]) seen = [] deadline = time.time() + 30 diff --git a/evals/postmortem/review_probes/notice_delivery_probe.py b/evals/postmortem/review_probes/notice_delivery_probe.py index 8869b13f96..70a6a8f547 100644 --- a/evals/postmortem/review_probes/notice_delivery_probe.py +++ b/evals/postmortem/review_probes/notice_delivery_probe.py @@ -35,9 +35,11 @@ class Sink(GatewayNotificationsMixin): return True def batch_run(did, gates): - tasks=[{'goal':f'worker task {i}'} for i in range(3)] + tasks=[{'goal':f'worker task {i}','group':'g'} for i in range(3)] # grouped: one shared final, so the early notice matters children=[(i,t,SimpleNamespace()) for i,t in enumerate(tasks)] b=dd._Batch(tasks,children,SimpleNamespace(quiet_mode=True),{'model':'offline'},None,'leaf',3,did,[],[], '', '',None,None,time.monotonic()) + # Since the per-group split on main, a detached unit carries its registry id; the notice keys on it. + if hasattr(b,'unit_id'): b.unit_id=did; b.group='g' def child(i,t,c): assert gates[i].wait(15) return {'task_index':i,'status':'error' if i<2 else 'completed','error':'offline failure' if i<2 else None,'summary':None if i<2 else 'FINISHED_SUCCESS','duration_seconds':0.1}