@@ -254,6 +254,15 @@ test("worker execution dispatches claimed parallel tasks and completes only from
254254 assert . equal ( stale . find ( ( worker ) => worker . id === "w2" ) ?. state , "unhealthy" ) ;
255255} ) ;
256256
257+ test ( "worker dispatch rejects non-claimed tasks with active claims without mutation" , ( ) => {
258+ const graph = { tasks : [ { id : "done" , status : "completed" as const , dependencies : [ ] , assignedWorker : "w1" , claim : { token : "tok" , workerId : "w1" , claimedAt : "2026-01-01T00:00:00.000Z" , expiresAt : "2026-01-01T00:20:00.000Z" } } ] } ;
259+ const state : WorkerExecutionState = { graph, workers : [ { id : "w1" , state : "ready" , lastHeartbeatAt : "2026-01-01T00:01:00.000Z" } ] , dispatches : [ ] , reports : [ ] } ;
260+
261+ assert . throws ( ( ) => dispatchClaimedTask ( state , { taskId : "done" , workerId : "w1" , claimToken : "tok" , now : "2026-01-01T00:02:00.000Z" } ) , / n o t c l a i m e d / ) ;
262+ assert . equal ( state . graph . tasks [ 0 ] ?. status , "completed" ) ;
263+ assert . deepEqual ( state . dispatches , [ ] ) ;
264+ } ) ;
265+
257266test ( "stale worker reports cannot mutate expired or recovered claims" , ( ) => {
258267 const state : WorkerExecutionState = {
259268 graph : { tasks : [ { id : "build" , status : "in_progress" as const , dependencies : [ ] , assignedWorker : "w1" , claim : { token : "old" , workerId : "w1" , claimedAt : "2026-01-01T00:00:00.000Z" , expiresAt : "2026-01-01T00:10:00.000Z" } } ] } ,
@@ -269,7 +278,10 @@ test("stale worker reports cannot mutate expired or recovered claims", () => {
269278 assert . deepEqual ( state . reports , [ ] ) ;
270279
271280 const recovered = recoverExpiredClaim ( state . graph , { taskId : "build" , workerId : "w2" , token : "new" , now : "2026-01-01T00:11:00.000Z" , leaseExpiresAt : "2026-01-01T00:20:00.000Z" } ) ;
272- assert . throws ( ( ) => captureWorkerReport ( { ...state , graph : recovered } , { ...report , reportedAt : "2026-01-01T00:12:00.000Z" } ) , / m a t c h i n g c l a i m t o k e n / ) ;
281+ const recoveredState = { ...state , graph : recovered } ;
282+ assert . throws ( ( ) => captureWorkerReport ( recoveredState , { ...report , reportedAt : "2026-01-01T00:12:00.000Z" } ) , / m a t c h i n g c l a i m t o k e n / ) ;
283+ assert . equal ( recoveredState . workers [ 0 ] ?. state , "busy" ) ;
284+ assert . deepEqual ( recoveredState . reports , [ ] ) ;
273285} ) ;
274286
275287test ( "worker heartbeat stale detection and terminal retention are modeled" , ( ) => {
0 commit comments