@@ -328,4 +328,203 @@ describe("RunEngine trigger()", () => {
328328 await engine . quit ( ) ;
329329 }
330330 } ) ;
331+
332+ containerTest ( "Annotations are stored on the run" , async ( { prisma, redisOptions } ) => {
333+ const authenticatedEnvironment = await setupAuthenticatedEnvironment ( prisma , "PRODUCTION" ) ;
334+
335+ const engine = new RunEngine ( {
336+ prisma,
337+ worker : {
338+ redis : redisOptions ,
339+ workers : 1 ,
340+ tasksPerWorker : 10 ,
341+ pollIntervalMs : 100 ,
342+ } ,
343+ queue : {
344+ redis : redisOptions ,
345+ masterQueueConsumersDisabled : true ,
346+ processWorkerQueueDebounceMs : 50 ,
347+ } ,
348+ runLock : { redis : redisOptions } ,
349+ machines : {
350+ defaultMachine : "small-1x" ,
351+ machines : {
352+ "small-1x" : { name : "small-1x" as const , cpu : 0.5 , memory : 0.5 , centsPerMs : 0.0001 } ,
353+ } ,
354+ baseCostInCents : 0.0001 ,
355+ } ,
356+ tracer : trace . getTracer ( "test" , "0.0.0" ) ,
357+ } ) ;
358+
359+ try {
360+ const taskIdentifier = "test-task" ;
361+ await setupBackgroundWorker ( engine , authenticatedEnvironment , taskIdentifier ) ;
362+
363+ const run = await engine . trigger (
364+ {
365+ number : 1 ,
366+ friendlyId : "run_ann1234" ,
367+ environment : authenticatedEnvironment ,
368+ taskIdentifier,
369+ payload : "{}" ,
370+ payloadType : "application/json" ,
371+ context : { } ,
372+ traceContext : { } ,
373+ traceId : "t12345" ,
374+ spanId : "s12345" ,
375+ workerQueue : "main" ,
376+ queue : `task/${ taskIdentifier } ` ,
377+ isTest : false ,
378+ tags : [ ] ,
379+ annotations : {
380+ triggerSource : "schedule" ,
381+ triggerAction : "trigger" ,
382+ rootTriggerSource : "schedule" ,
383+ rootScheduleId : "sched_abc123" ,
384+ } ,
385+ } ,
386+ prisma
387+ ) ;
388+
389+ const runFromDb = await prisma . taskRun . findUnique ( {
390+ where : { id : run . id } ,
391+ } ) ;
392+
393+ expect ( runFromDb ) . toBeDefined ( ) ;
394+ expect ( runFromDb ?. annotations ) . toEqual ( {
395+ triggerSource : "schedule" ,
396+ triggerAction : "trigger" ,
397+ rootTriggerSource : "schedule" ,
398+ rootScheduleId : "sched_abc123" ,
399+ } ) ;
400+ } finally {
401+ await engine . quit ( ) ;
402+ }
403+ } ) ;
404+
405+ containerTest (
406+ "Annotations propagation pattern (parent → child)" ,
407+ async ( { prisma, redisOptions } ) => {
408+ const authenticatedEnvironment = await setupAuthenticatedEnvironment ( prisma , "PRODUCTION" ) ;
409+
410+ const engine = new RunEngine ( {
411+ prisma,
412+ worker : {
413+ redis : redisOptions ,
414+ workers : 1 ,
415+ tasksPerWorker : 10 ,
416+ pollIntervalMs : 100 ,
417+ } ,
418+ queue : {
419+ redis : redisOptions ,
420+ masterQueueConsumersDisabled : true ,
421+ processWorkerQueueDebounceMs : 50 ,
422+ } ,
423+ runLock : { redis : redisOptions } ,
424+ machines : {
425+ defaultMachine : "small-1x" ,
426+ machines : {
427+ "small-1x" : {
428+ name : "small-1x" as const ,
429+ cpu : 0.5 ,
430+ memory : 0.5 ,
431+ centsPerMs : 0.0001 ,
432+ } ,
433+ } ,
434+ baseCostInCents : 0.0001 ,
435+ } ,
436+ tracer : trace . getTracer ( "test" , "0.0.0" ) ,
437+ } ) ;
438+
439+ try {
440+ const parentTask = "parent-task" ;
441+ const childTask = "child-task" ;
442+ await setupBackgroundWorker ( engine , authenticatedEnvironment , [ parentTask , childTask ] ) ;
443+
444+ // Trigger parent with schedule annotations
445+ const parentRun = await engine . trigger (
446+ {
447+ number : 1 ,
448+ friendlyId : "run_p1234ann" ,
449+ environment : authenticatedEnvironment ,
450+ taskIdentifier : parentTask ,
451+ payload : "{}" ,
452+ payloadType : "application/json" ,
453+ context : { } ,
454+ traceContext : { } ,
455+ traceId : "t12345" ,
456+ spanId : "s12345" ,
457+ workerQueue : "main" ,
458+ queue : `task/${ parentTask } ` ,
459+ isTest : false ,
460+ tags : [ ] ,
461+ annotations : {
462+ triggerSource : "schedule" ,
463+ triggerAction : "trigger" ,
464+ rootTriggerSource : "schedule" ,
465+ rootScheduleId : "sched_abc123" ,
466+ } ,
467+ } ,
468+ prisma
469+ ) ;
470+
471+ // Trigger child — simulating what RunEngineTriggerTaskService builds:
472+ // triggerSource is "sdk" (child triggered from within parent),
473+ // but rootTriggerSource and rootScheduleId are propagated from parent
474+ const childRun = await engine . trigger (
475+ {
476+ number : 2 ,
477+ friendlyId : "run_c1234ann" ,
478+ environment : authenticatedEnvironment ,
479+ taskIdentifier : childTask ,
480+ payload : "{}" ,
481+ payloadType : "application/json" ,
482+ context : { } ,
483+ traceContext : { } ,
484+ traceId : "t12345" ,
485+ spanId : "s12346" ,
486+ workerQueue : "main" ,
487+ queue : `task/${ childTask } ` ,
488+ isTest : false ,
489+ tags : [ ] ,
490+ parentTaskRunId : parentRun . id ,
491+ resumeParentOnCompletion : true ,
492+ annotations : {
493+ triggerSource : "sdk" ,
494+ triggerAction : "trigger" ,
495+ rootTriggerSource : "schedule" ,
496+ rootScheduleId : "sched_abc123" ,
497+ } ,
498+ } ,
499+ prisma
500+ ) ;
501+
502+ const parentFromDb = await prisma . taskRun . findUnique ( {
503+ where : { id : parentRun . id } ,
504+ } ) ;
505+ const childFromDb = await prisma . taskRun . findUnique ( {
506+ where : { id : childRun . id } ,
507+ } ) ;
508+
509+ // Parent: schedule-triggered
510+ expect ( parentFromDb ?. annotations ) . toEqual ( {
511+ triggerSource : "schedule" ,
512+ triggerAction : "trigger" ,
513+ rootTriggerSource : "schedule" ,
514+ rootScheduleId : "sched_abc123" ,
515+ } ) ;
516+
517+ // Child: sdk-triggered but root is still schedule
518+ expect ( childFromDb ?. annotations ) . toEqual ( {
519+ triggerSource : "sdk" ,
520+ triggerAction : "trigger" ,
521+ rootTriggerSource : "schedule" ,
522+ rootScheduleId : "sched_abc123" ,
523+ } ) ;
524+ } finally {
525+ await engine . quit ( ) ;
526+ }
527+ }
528+ ) ;
529+
331530} ) ;
0 commit comments