@x12i/graphenix-plan-format 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/test/golden-fixtures.test.d.ts +2 -0
  6. package/dist/test/golden-fixtures.test.d.ts.map +1 -0
  7. package/dist/test/golden-fixtures.test.js +31 -0
  8. package/dist/test/golden-fixtures.test.js.map +1 -0
  9. package/dist/validators/validate-executable-plan-v2.d.ts.map +1 -1
  10. package/dist/validators/validate-executable-plan-v2.js +1 -81
  11. package/dist/validators/validate-executable-plan-v2.js.map +1 -1
  12. package/dist/validators/validate-execution-unit.d.ts +13 -0
  13. package/dist/validators/validate-execution-unit.d.ts.map +1 -0
  14. package/dist/validators/validate-execution-unit.js +221 -0
  15. package/dist/validators/validate-execution-unit.js.map +1 -0
  16. package/dist/validators/validate-node-execution-plan.d.ts +6 -0
  17. package/dist/validators/validate-node-execution-plan.d.ts.map +1 -0
  18. package/dist/validators/validate-node-execution-plan.js +39 -0
  19. package/dist/validators/validate-node-execution-plan.js.map +1 -0
  20. package/fixtures/content-pipeline.plan.json +1292 -0
  21. package/fixtures/nodes/node-audience-insights.plan.json +184 -0
  22. package/fixtures/nodes/node-execution-strategies.plan.json +162 -0
  23. package/fixtures/nodes/node-hand-authored-units.plan.json +75 -0
  24. package/fixtures/nodes/node-input-synthesis-profile.plan.json +105 -0
  25. package/fixtures/nodes/node-narrative-preprocessor.plan.json +112 -0
  26. package/fixtures/nodes/node-post-audit.plan.json +106 -0
  27. package/fixtures/nodes/node-professional-answer-plain.plan.json +70 -0
  28. package/package.json +6 -3
@@ -0,0 +1,1292 @@
1
+ {
2
+ "format": "graphenix.executable-plan/v2",
3
+ "planId": "plan:content-pipeline:job-content-pipeline-reference",
4
+ "createdAt": "2026-06-07T12:00:00.000Z",
5
+ "source": {
6
+ "graphId": "graph:content-pipeline",
7
+ "graphRevision": "1.0.0",
8
+ "graphHash": "sha256:9efc44d3e758f84cf8297e18a0a33316a7e0a0b9c82a962acc6c9153fb334149",
9
+ "formatVersion": "2.0.0"
10
+ },
11
+ "runtimeBinding": {
12
+ "jobId": "job-content-pipeline-reference",
13
+ "mode": "simulate",
14
+ "inputHash": "sha256:64b22edb276304aee419e0837dff25ed0bc307e664edbf362ca0062129387343",
15
+ "contextHash": "sha256:ce8d4c0a1d149f7f4da8ae9da3e22d02071343dd647edde27f00b12931eed820",
16
+ "jobHash": "sha256:3d294507010e1207c45f55d027ce5550fd51933b9d8b448972fc6a32a3b70930",
17
+ "sourceGraphHash": "sha256:9efc44d3e758f84cf8297e18a0a33316a7e0a0b9c82a962acc6c9153fb334149",
18
+ "profileRegistryHash": "sha256:profiles-content-pipeline-reference"
19
+ },
20
+ "runtimeExpectations": {
21
+ "requiredFields": [
22
+ "jobId",
23
+ "job"
24
+ ],
25
+ "hashIncludes": [
26
+ "input",
27
+ "context"
28
+ ],
29
+ "requiresAgentId": false,
30
+ "requiresJobTypeId": false
31
+ },
32
+ "profileRegistry": {
33
+ "package": "@x12i/ai-profiles",
34
+ "version": "3.2.0",
35
+ "registryHash": "sha256:profiles-content-pipeline-reference"
36
+ },
37
+ "normalizedGraph": {
38
+ "mode": "embedded",
39
+ "graph": {
40
+ "formatVersion": "2.0.0",
41
+ "id": "graph:content-pipeline",
42
+ "revision": "1.0.0",
43
+ "name": "Content pipeline",
44
+ "graph": {
45
+ "nodes": [
46
+ {
47
+ "id": "node:audience-insights",
48
+ "name": "Audience insights",
49
+ "kind": "task",
50
+ "inputs": [
51
+ {
52
+ "id": "in:brief",
53
+ "direction": "input",
54
+ "type": "builtin:object",
55
+ "required": true
56
+ }
57
+ ],
58
+ "outputs": [
59
+ {
60
+ "id": "out:result",
61
+ "direction": "output",
62
+ "type": "builtin:object"
63
+ }
64
+ ],
65
+ "parameters": {
66
+ "profile": "graphenix.task-node/v1",
67
+ "nodeType": "task",
68
+ "skillKey": "professional-answer",
69
+ "taskVariable": {
70
+ "question": "Who is the primary audience for this campaign?",
71
+ "outputContract": {
72
+ "shortAnswer": "One paragraph summary.",
73
+ "fullAnswer": "Bullet list of segments and pains."
74
+ }
75
+ },
76
+ "inputsConfig": {
77
+ "brief": {
78
+ "executionMemoryPath": "executionMemory.input"
79
+ }
80
+ },
81
+ "smartInput": {
82
+ "paths": [
83
+ {
84
+ "path": "executionMemory.input",
85
+ "label": "Campaign brief"
86
+ }
87
+ ]
88
+ },
89
+ "executionMapping": {
90
+ "path": "content.audience",
91
+ "mode": "replace",
92
+ "map": {
93
+ "shortAnswer": "output.parsed.shortAnswer",
94
+ "fullAnswer": "output.parsed.fullAnswer"
95
+ }
96
+ },
97
+ "taskConfiguration": {
98
+ "executionStrategies": [],
99
+ "aiTaskStrategies": {
100
+ "pre": "synthesis",
101
+ "preInputStrategy": "execution-memory-only"
102
+ }
103
+ }
104
+ }
105
+ },
106
+ {
107
+ "id": "node:competitor-angles",
108
+ "name": "Competitor angles",
109
+ "kind": "task",
110
+ "inputs": [
111
+ {
112
+ "id": "in:brief",
113
+ "direction": "input",
114
+ "type": "builtin:object",
115
+ "required": true
116
+ }
117
+ ],
118
+ "outputs": [
119
+ {
120
+ "id": "out:result",
121
+ "direction": "output",
122
+ "type": "builtin:object"
123
+ }
124
+ ],
125
+ "parameters": {
126
+ "profile": "graphenix.task-node/v1",
127
+ "nodeType": "task",
128
+ "skillKey": "professional-answer",
129
+ "taskVariable": {
130
+ "question": "What angles are competitors using in this space?",
131
+ "outputContract": {
132
+ "shortAnswer": "Top three competitor themes.",
133
+ "fullAnswer": "Detailed comparison bullets."
134
+ }
135
+ },
136
+ "inputsConfig": {
137
+ "brief": {
138
+ "executionMemoryPath": "executionMemory.input"
139
+ }
140
+ },
141
+ "smartInput": {
142
+ "paths": [
143
+ {
144
+ "path": "executionMemory.input",
145
+ "label": "Campaign brief"
146
+ }
147
+ ]
148
+ },
149
+ "executionMapping": {
150
+ "path": "content.competitors",
151
+ "mode": "replace",
152
+ "map": {
153
+ "shortAnswer": "output.parsed.shortAnswer",
154
+ "fullAnswer": "output.parsed.fullAnswer"
155
+ }
156
+ },
157
+ "taskConfiguration": {
158
+ "executionStrategies": [],
159
+ "aiTaskStrategies": {
160
+ "pre": "synthesis",
161
+ "preInputStrategy": "execution-memory-only"
162
+ }
163
+ }
164
+ }
165
+ },
166
+ {
167
+ "id": "node:seo-keywords",
168
+ "name": "SEO keywords",
169
+ "kind": "task",
170
+ "inputs": [
171
+ {
172
+ "id": "in:brief",
173
+ "direction": "input",
174
+ "type": "builtin:object",
175
+ "required": true
176
+ }
177
+ ],
178
+ "outputs": [
179
+ {
180
+ "id": "out:result",
181
+ "direction": "output",
182
+ "type": "builtin:object"
183
+ }
184
+ ],
185
+ "parameters": {
186
+ "profile": "graphenix.task-node/v1",
187
+ "nodeType": "task",
188
+ "skillKey": "professional-answer",
189
+ "taskVariable": {
190
+ "question": "Which keywords should this campaign target?",
191
+ "outputContract": {
192
+ "shortAnswer": "Primary keyword cluster.",
193
+ "fullAnswer": "Grouped keyword list with intent."
194
+ }
195
+ },
196
+ "inputsConfig": {
197
+ "brief": {
198
+ "executionMemoryPath": "executionMemory.input"
199
+ }
200
+ },
201
+ "smartInput": {
202
+ "paths": [
203
+ {
204
+ "path": "executionMemory.input",
205
+ "label": "Campaign brief"
206
+ }
207
+ ]
208
+ },
209
+ "executionMapping": {
210
+ "path": "content.seo",
211
+ "mode": "replace",
212
+ "map": {
213
+ "shortAnswer": "output.parsed.shortAnswer",
214
+ "fullAnswer": "output.parsed.fullAnswer"
215
+ }
216
+ },
217
+ "taskConfiguration": {
218
+ "executionStrategies": [],
219
+ "aiTaskStrategies": {
220
+ "pre": "synthesis",
221
+ "preInputStrategy": "execution-memory-only"
222
+ }
223
+ }
224
+ }
225
+ },
226
+ {
227
+ "id": "node:finalizer:package",
228
+ "name": "Package finalizer",
229
+ "kind": "finalizer",
230
+ "inputs": [
231
+ {
232
+ "id": "in:node:audience-insights",
233
+ "direction": "input",
234
+ "type": "builtin:object",
235
+ "required": true
236
+ },
237
+ {
238
+ "id": "in:node:competitor-angles",
239
+ "direction": "input",
240
+ "type": "builtin:object",
241
+ "required": true
242
+ },
243
+ {
244
+ "id": "in:node:seo-keywords",
245
+ "direction": "input",
246
+ "type": "builtin:object",
247
+ "required": true
248
+ }
249
+ ],
250
+ "outputs": [
251
+ {
252
+ "id": "out:package",
253
+ "direction": "output",
254
+ "type": "builtin:object"
255
+ }
256
+ ],
257
+ "parameters": {
258
+ "profile": "graphenix.finalizer-node/v1",
259
+ "nodeType": "finalizer",
260
+ "finalizerType": "aggregate",
261
+ "config": {
262
+ "sections": [
263
+ {
264
+ "sourceNodeId": "node:audience-insights",
265
+ "sourcePortId": "out:result",
266
+ "executionMemoryPath": "content.audience"
267
+ },
268
+ {
269
+ "sourceNodeId": "node:competitor-angles",
270
+ "sourcePortId": "out:result",
271
+ "executionMemoryPath": "content.competitors"
272
+ },
273
+ {
274
+ "sourceNodeId": "node:seo-keywords",
275
+ "sourcePortId": "out:result",
276
+ "executionMemoryPath": "content.seo"
277
+ }
278
+ ]
279
+ }
280
+ }
281
+ }
282
+ ],
283
+ "edges": [
284
+ {
285
+ "id": "edge:node:audience-insights-to-finalizer",
286
+ "from": {
287
+ "nodeId": "node:audience-insights",
288
+ "portId": "out:result"
289
+ },
290
+ "to": {
291
+ "nodeId": "node:finalizer:package",
292
+ "portId": "in:node:audience-insights"
293
+ }
294
+ },
295
+ {
296
+ "id": "edge:node:competitor-angles-to-finalizer",
297
+ "from": {
298
+ "nodeId": "node:competitor-angles",
299
+ "portId": "out:result"
300
+ },
301
+ "to": {
302
+ "nodeId": "node:finalizer:package",
303
+ "portId": "in:node:competitor-angles"
304
+ }
305
+ },
306
+ {
307
+ "id": "edge:node:seo-keywords-to-finalizer",
308
+ "from": {
309
+ "nodeId": "node:seo-keywords",
310
+ "portId": "out:result"
311
+ },
312
+ "to": {
313
+ "nodeId": "node:finalizer:package",
314
+ "portId": "in:node:seo-keywords"
315
+ }
316
+ }
317
+ ],
318
+ "inputs": [
319
+ {
320
+ "id": "graph-input:brief-audience-insights",
321
+ "name": "Campaign brief",
322
+ "type": "builtin:object",
323
+ "target": {
324
+ "nodeId": "node:audience-insights",
325
+ "portId": "in:brief"
326
+ },
327
+ "contract": {
328
+ "semanticKind": "content",
329
+ "required": true,
330
+ "schema": {
331
+ "type": "object",
332
+ "properties": {
333
+ "title": {
334
+ "type": "string"
335
+ },
336
+ "objective": {
337
+ "type": "string"
338
+ }
339
+ }
340
+ }
341
+ }
342
+ },
343
+ {
344
+ "id": "graph-input:brief-competitor-angles",
345
+ "name": "Campaign brief",
346
+ "type": "builtin:object",
347
+ "target": {
348
+ "nodeId": "node:competitor-angles",
349
+ "portId": "in:brief"
350
+ },
351
+ "contract": {
352
+ "semanticKind": "content",
353
+ "required": true,
354
+ "schema": {
355
+ "type": "object",
356
+ "properties": {
357
+ "title": {
358
+ "type": "string"
359
+ },
360
+ "objective": {
361
+ "type": "string"
362
+ }
363
+ }
364
+ }
365
+ }
366
+ },
367
+ {
368
+ "id": "graph-input:brief-seo-keywords",
369
+ "name": "Campaign brief",
370
+ "type": "builtin:object",
371
+ "target": {
372
+ "nodeId": "node:seo-keywords",
373
+ "portId": "in:brief"
374
+ },
375
+ "contract": {
376
+ "semanticKind": "content",
377
+ "required": true,
378
+ "schema": {
379
+ "type": "object",
380
+ "properties": {
381
+ "title": {
382
+ "type": "string"
383
+ },
384
+ "objective": {
385
+ "type": "string"
386
+ }
387
+ }
388
+ }
389
+ }
390
+ }
391
+ ],
392
+ "outputs": [
393
+ {
394
+ "id": "graph-output:content-package",
395
+ "name": "Content package",
396
+ "type": "builtin:object",
397
+ "source": {
398
+ "nodeId": "node:finalizer:package",
399
+ "portId": "out:package"
400
+ },
401
+ "contract": {
402
+ "semanticKind": "final-output",
403
+ "required": true,
404
+ "schema": {
405
+ "type": "object"
406
+ }
407
+ }
408
+ }
409
+ ],
410
+ "metadata": {
411
+ "graphEntry": {
412
+ "summary": "Campaign brief required to run the content pipeline.",
413
+ "executionSchema": {
414
+ "type": "object",
415
+ "properties": {
416
+ "title": {
417
+ "type": "string"
418
+ },
419
+ "objective": {
420
+ "type": "string"
421
+ }
422
+ }
423
+ }
424
+ },
425
+ "graphResponse": {
426
+ "summary": "Structured content package from parallel research steps.",
427
+ "finalOutputSchema": {
428
+ "type": "object"
429
+ }
430
+ },
431
+ "extensions": {
432
+ "graphenix.executable/v1": {
433
+ "profileVersion": "graphenix.executable/v1",
434
+ "modelConfig": {
435
+ "version": "graph-model-config/v1",
436
+ "cases": [
437
+ {
438
+ "id": "default",
439
+ "modelConfig": {
440
+ "preActionModel": {
441
+ "kind": "profileChoice",
442
+ "key": "cheap/default"
443
+ },
444
+ "skillModel": {
445
+ "kind": "profileChoice",
446
+ "key": "vol/default"
447
+ },
448
+ "postActionModel": {
449
+ "kind": "profileChoice",
450
+ "key": "cheap/default"
451
+ }
452
+ }
453
+ },
454
+ {
455
+ "id": "rush",
456
+ "when": {
457
+ "path": "runtime.input.priority",
458
+ "op": "eq",
459
+ "value": "rush"
460
+ },
461
+ "modelConfig": {
462
+ "preActionModel": {
463
+ "kind": "profileChoice",
464
+ "key": "vol/default"
465
+ },
466
+ "skillModel": {
467
+ "kind": "profileChoice",
468
+ "key": "deep/openai_deep"
469
+ },
470
+ "postActionModel": {
471
+ "kind": "profileChoice",
472
+ "key": "vol/default"
473
+ }
474
+ }
475
+ }
476
+ ],
477
+ "fallbackPolicy": {
478
+ "enabled": true,
479
+ "allowedTriggers": [
480
+ "nodeSlotMissing",
481
+ "nodeModelUnavailable"
482
+ ],
483
+ "maxAttemptsPerSlot": 1
484
+ }
485
+ }
486
+ }
487
+ }
488
+ }
489
+ },
490
+ "types": []
491
+ },
492
+ "graphHash": "sha256:e8d59f85d015ba9cb2ce67b934caa21157939caaf08ee045c65d739f82a324c4"
493
+ },
494
+ "topology": {
495
+ "nodes": [
496
+ {
497
+ "nodeId": "node:audience-insights",
498
+ "kind": "task",
499
+ "nodeType": "task",
500
+ "executionClass": "aiTask"
501
+ },
502
+ {
503
+ "nodeId": "node:competitor-angles",
504
+ "kind": "task",
505
+ "nodeType": "task",
506
+ "executionClass": "aiTask"
507
+ },
508
+ {
509
+ "nodeId": "node:seo-keywords",
510
+ "kind": "task",
511
+ "nodeType": "task",
512
+ "executionClass": "aiTask"
513
+ },
514
+ {
515
+ "nodeId": "node:finalizer:package",
516
+ "kind": "finalizer",
517
+ "nodeType": "finalizer",
518
+ "executionClass": "finalizer"
519
+ }
520
+ ],
521
+ "edges": [
522
+ {
523
+ "edgeId": "edge:node:audience-insights-to-finalizer",
524
+ "from": {
525
+ "nodeId": "node:audience-insights",
526
+ "portId": "out:result"
527
+ },
528
+ "to": {
529
+ "nodeId": "node:finalizer:package",
530
+ "portId": "in:node:audience-insights"
531
+ },
532
+ "hasDeferredGate": false
533
+ },
534
+ {
535
+ "edgeId": "edge:node:competitor-angles-to-finalizer",
536
+ "from": {
537
+ "nodeId": "node:competitor-angles",
538
+ "portId": "out:result"
539
+ },
540
+ "to": {
541
+ "nodeId": "node:finalizer:package",
542
+ "portId": "in:node:competitor-angles"
543
+ },
544
+ "hasDeferredGate": false
545
+ },
546
+ {
547
+ "edgeId": "edge:node:seo-keywords-to-finalizer",
548
+ "from": {
549
+ "nodeId": "node:seo-keywords",
550
+ "portId": "out:result"
551
+ },
552
+ "to": {
553
+ "nodeId": "node:finalizer:package",
554
+ "portId": "in:node:seo-keywords"
555
+ },
556
+ "hasDeferredGate": false
557
+ }
558
+ ],
559
+ "entryNodeIds": [
560
+ "node:audience-insights",
561
+ "node:competitor-angles",
562
+ "node:seo-keywords"
563
+ ],
564
+ "rootNodeIds": [
565
+ "node:audience-insights",
566
+ "node:competitor-angles",
567
+ "node:seo-keywords"
568
+ ],
569
+ "finalizerNodeIds": [
570
+ "node:finalizer:package"
571
+ ],
572
+ "outputNodeIds": [
573
+ "node:finalizer:package"
574
+ ],
575
+ "graphInputIds": [
576
+ "graph-input:brief-audience-insights",
577
+ "graph-input:brief-competitor-angles",
578
+ "graph-input:brief-seo-keywords"
579
+ ],
580
+ "graphOutputIds": [
581
+ "graph-output:content-package"
582
+ ]
583
+ },
584
+ "schedulingPolicy": {
585
+ "mode": "forward",
586
+ "wavePlanning": "staticSchedule",
587
+ "failFast": false
588
+ },
589
+ "caseSelection": {
590
+ "graphModelCase": {
591
+ "caseId": "default",
592
+ "matched": true,
593
+ "defaulted": true,
594
+ "reason": "default case",
595
+ "matchedConditions": [],
596
+ "sourcePath": "/graph/metadata/extensions/graphenix.executable~1v1/modelConfig"
597
+ },
598
+ "nodeModelCases": {
599
+ "node:audience-insights": null,
600
+ "node:competitor-angles": null,
601
+ "node:seo-keywords": null
602
+ }
603
+ },
604
+ "deferredGates": {
605
+ "nodeGates": {},
606
+ "edgeGates": {}
607
+ },
608
+ "nodePlans": {
609
+ "node:audience-insights": {
610
+ "nodeId": "node:audience-insights",
611
+ "nodeType": "task",
612
+ "executionClass": "aiTask",
613
+ "skillKey": "professional-answer",
614
+ "selectedCases": {
615
+ "graphModelCaseId": "default"
616
+ },
617
+ "modelSlots": {
618
+ "preActionModel": {
619
+ "selection": {
620
+ "kind": "profileChoice",
621
+ "key": "cheap/default"
622
+ },
623
+ "source": "graphDefault",
624
+ "inherited": true,
625
+ "graphCaseId": "default"
626
+ },
627
+ "skillModel": {
628
+ "selection": {
629
+ "kind": "profileChoice",
630
+ "key": "vol/default"
631
+ },
632
+ "source": "graphDefault",
633
+ "inherited": true,
634
+ "graphCaseId": "default"
635
+ },
636
+ "postActionModel": {
637
+ "selection": {
638
+ "kind": "profileChoice",
639
+ "key": "cheap/default"
640
+ },
641
+ "source": "graphDefault",
642
+ "inherited": true,
643
+ "graphCaseId": "default"
644
+ }
645
+ },
646
+ "invokeContract": {
647
+ "taskVariable": {
648
+ "question": "Who is the primary audience for this campaign?",
649
+ "outputContract": {
650
+ "shortAnswer": "One paragraph summary.",
651
+ "fullAnswer": "Bullet list of segments and pains."
652
+ }
653
+ },
654
+ "inputsConfig": {
655
+ "brief": {
656
+ "executionMemoryPath": "executionMemory.input"
657
+ }
658
+ },
659
+ "smartInput": {
660
+ "paths": [
661
+ {
662
+ "path": "executionMemory.input",
663
+ "label": "Campaign brief"
664
+ }
665
+ ]
666
+ },
667
+ "executionMapping": {
668
+ "path": "content.audience",
669
+ "mode": "replace",
670
+ "map": {
671
+ "shortAnswer": "output.parsed.shortAnswer",
672
+ "fullAnswer": "output.parsed.fullAnswer"
673
+ }
674
+ },
675
+ "pipeline": {
676
+ "executionStrategies": [],
677
+ "aiTaskStrategies": {
678
+ "pre": "synthesis",
679
+ "preInputStrategy": "execution-memory-only"
680
+ }
681
+ }
682
+ },
683
+ "executionUnits": [
684
+ {
685
+ "unitId": "unit:node:audience-insights:pre:0",
686
+ "nodeId": "node:audience-insights",
687
+ "unitKind": "externalPreUtility",
688
+ "invokeMode": "externalRunTask",
689
+ "order": 0,
690
+ "strategyKey": "synthesis",
691
+ "actionKey": "synthesis",
692
+ "modelSlot": "preActionModel",
693
+ "modelSelection": {
694
+ "kind": "profileChoice",
695
+ "key": "cheap/default"
696
+ },
697
+ "modelSource": "graphDefault",
698
+ "unitParams": {
699
+ "synthesisInputStrategy": "execution-memory-only"
700
+ },
701
+ "invokeContract": {
702
+ "reads": [
703
+ "executionMemory.input"
704
+ ],
705
+ "writes": [
706
+ {
707
+ "destination": "execution",
708
+ "key": "xynthesized",
709
+ "mode": "replace"
710
+ }
711
+ ],
712
+ "includeContextInPrompt": true
713
+ },
714
+ "sourcePath": "/graph/nodes/0/parameters/taskConfiguration/aiTaskStrategies/pre"
715
+ },
716
+ {
717
+ "unitId": "unit:node:audience-insights:main",
718
+ "nodeId": "node:audience-insights",
719
+ "unitKind": "mainSkill",
720
+ "invokeMode": "mainRunTask",
721
+ "order": 1,
722
+ "skillKey": "professional-answer",
723
+ "modelSlot": "skillModel",
724
+ "modelSelection": {
725
+ "kind": "profileChoice",
726
+ "key": "vol/default"
727
+ },
728
+ "modelSource": "graphDefault",
729
+ "invokeContract": {
730
+ "reads": [
731
+ "executionMemory.input"
732
+ ],
733
+ "writes": [
734
+ {
735
+ "destination": "response",
736
+ "key": "skillOutput",
737
+ "mode": "replace"
738
+ }
739
+ ]
740
+ },
741
+ "sourcePath": "/graph/nodes/0/parameters/skillKey"
742
+ },
743
+ {
744
+ "unitId": "unit:node:audience-insights:mapping",
745
+ "nodeId": "node:audience-insights",
746
+ "unitKind": "mapping",
747
+ "invokeMode": "none",
748
+ "order": 2,
749
+ "outputContract": {
750
+ "path": "content.audience",
751
+ "mode": "replace",
752
+ "map": {
753
+ "shortAnswer": "output.parsed.shortAnswer",
754
+ "fullAnswer": "output.parsed.fullAnswer"
755
+ }
756
+ },
757
+ "invokeContract": {
758
+ "reads": [
759
+ "response.skillOutput"
760
+ ],
761
+ "writes": [
762
+ {
763
+ "destination": "execution",
764
+ "key": "content.audience",
765
+ "mode": "replace"
766
+ }
767
+ ]
768
+ },
769
+ "sourcePath": "/graph/nodes/0/parameters/executionMapping"
770
+ }
771
+ ],
772
+ "outputMapping": {
773
+ "path": "content.audience",
774
+ "mode": "replace",
775
+ "map": {
776
+ "shortAnswer": "output.parsed.shortAnswer",
777
+ "fullAnswer": "output.parsed.fullAnswer"
778
+ }
779
+ },
780
+ "executionMapping": {
781
+ "path": "content.audience",
782
+ "mode": "replace",
783
+ "map": {
784
+ "shortAnswer": "output.parsed.shortAnswer",
785
+ "fullAnswer": "output.parsed.fullAnswer"
786
+ }
787
+ },
788
+ "planVersion": "graphenix.node-plan/v2.1",
789
+ "compiledAt": "2026-06-07T15:01:14.861Z",
790
+ "compilerVersion": "1.1.0",
791
+ "sourcePath": "/graph/nodes/0"
792
+ },
793
+ "node:competitor-angles": {
794
+ "nodeId": "node:competitor-angles",
795
+ "nodeType": "task",
796
+ "executionClass": "aiTask",
797
+ "skillKey": "professional-answer",
798
+ "selectedCases": {
799
+ "graphModelCaseId": "default"
800
+ },
801
+ "modelSlots": {
802
+ "preActionModel": {
803
+ "selection": {
804
+ "kind": "profileChoice",
805
+ "key": "cheap/default"
806
+ },
807
+ "source": "graphDefault",
808
+ "inherited": true,
809
+ "graphCaseId": "default"
810
+ },
811
+ "skillModel": {
812
+ "selection": {
813
+ "kind": "profileChoice",
814
+ "key": "vol/default"
815
+ },
816
+ "source": "graphDefault",
817
+ "inherited": true,
818
+ "graphCaseId": "default"
819
+ },
820
+ "postActionModel": {
821
+ "selection": {
822
+ "kind": "profileChoice",
823
+ "key": "cheap/default"
824
+ },
825
+ "source": "graphDefault",
826
+ "inherited": true,
827
+ "graphCaseId": "default"
828
+ }
829
+ },
830
+ "invokeContract": {
831
+ "taskVariable": {
832
+ "question": "What angles are competitors using in this space?",
833
+ "outputContract": {
834
+ "shortAnswer": "Top three competitor themes.",
835
+ "fullAnswer": "Detailed comparison bullets."
836
+ }
837
+ },
838
+ "inputsConfig": {
839
+ "brief": {
840
+ "executionMemoryPath": "executionMemory.input"
841
+ }
842
+ },
843
+ "smartInput": {
844
+ "paths": [
845
+ {
846
+ "path": "executionMemory.input",
847
+ "label": "Campaign brief"
848
+ }
849
+ ]
850
+ },
851
+ "executionMapping": {
852
+ "path": "content.competitors",
853
+ "mode": "replace",
854
+ "map": {
855
+ "shortAnswer": "output.parsed.shortAnswer",
856
+ "fullAnswer": "output.parsed.fullAnswer"
857
+ }
858
+ },
859
+ "pipeline": {
860
+ "executionStrategies": [],
861
+ "aiTaskStrategies": {
862
+ "pre": "synthesis",
863
+ "preInputStrategy": "execution-memory-only"
864
+ }
865
+ }
866
+ },
867
+ "executionUnits": [
868
+ {
869
+ "unitId": "unit:node:competitor-angles:pre:0",
870
+ "nodeId": "node:competitor-angles",
871
+ "unitKind": "externalPreUtility",
872
+ "invokeMode": "externalRunTask",
873
+ "order": 0,
874
+ "strategyKey": "synthesis",
875
+ "actionKey": "synthesis",
876
+ "modelSlot": "preActionModel",
877
+ "modelSelection": {
878
+ "kind": "profileChoice",
879
+ "key": "cheap/default"
880
+ },
881
+ "modelSource": "graphDefault",
882
+ "unitParams": {
883
+ "synthesisInputStrategy": "execution-memory-only"
884
+ },
885
+ "invokeContract": {
886
+ "reads": [
887
+ "executionMemory.input"
888
+ ],
889
+ "writes": [
890
+ {
891
+ "destination": "execution",
892
+ "key": "xynthesized",
893
+ "mode": "replace"
894
+ }
895
+ ],
896
+ "includeContextInPrompt": true
897
+ },
898
+ "sourcePath": "/graph/nodes/1/parameters/taskConfiguration/aiTaskStrategies/pre"
899
+ },
900
+ {
901
+ "unitId": "unit:node:competitor-angles:main",
902
+ "nodeId": "node:competitor-angles",
903
+ "unitKind": "mainSkill",
904
+ "invokeMode": "mainRunTask",
905
+ "order": 1,
906
+ "skillKey": "professional-answer",
907
+ "modelSlot": "skillModel",
908
+ "modelSelection": {
909
+ "kind": "profileChoice",
910
+ "key": "vol/default"
911
+ },
912
+ "modelSource": "graphDefault",
913
+ "invokeContract": {
914
+ "reads": [
915
+ "executionMemory.input"
916
+ ],
917
+ "writes": [
918
+ {
919
+ "destination": "response",
920
+ "key": "skillOutput",
921
+ "mode": "replace"
922
+ }
923
+ ]
924
+ },
925
+ "sourcePath": "/graph/nodes/1/parameters/skillKey"
926
+ },
927
+ {
928
+ "unitId": "unit:node:competitor-angles:mapping",
929
+ "nodeId": "node:competitor-angles",
930
+ "unitKind": "mapping",
931
+ "invokeMode": "none",
932
+ "order": 2,
933
+ "outputContract": {
934
+ "path": "content.competitors",
935
+ "mode": "replace",
936
+ "map": {
937
+ "shortAnswer": "output.parsed.shortAnswer",
938
+ "fullAnswer": "output.parsed.fullAnswer"
939
+ }
940
+ },
941
+ "invokeContract": {
942
+ "reads": [
943
+ "response.skillOutput"
944
+ ],
945
+ "writes": [
946
+ {
947
+ "destination": "execution",
948
+ "key": "content.competitors",
949
+ "mode": "replace"
950
+ }
951
+ ]
952
+ },
953
+ "sourcePath": "/graph/nodes/1/parameters/executionMapping"
954
+ }
955
+ ],
956
+ "outputMapping": {
957
+ "path": "content.competitors",
958
+ "mode": "replace",
959
+ "map": {
960
+ "shortAnswer": "output.parsed.shortAnswer",
961
+ "fullAnswer": "output.parsed.fullAnswer"
962
+ }
963
+ },
964
+ "executionMapping": {
965
+ "path": "content.competitors",
966
+ "mode": "replace",
967
+ "map": {
968
+ "shortAnswer": "output.parsed.shortAnswer",
969
+ "fullAnswer": "output.parsed.fullAnswer"
970
+ }
971
+ },
972
+ "planVersion": "graphenix.node-plan/v2.1",
973
+ "compiledAt": "2026-06-07T15:01:14.862Z",
974
+ "compilerVersion": "1.1.0",
975
+ "sourcePath": "/graph/nodes/1"
976
+ },
977
+ "node:seo-keywords": {
978
+ "nodeId": "node:seo-keywords",
979
+ "nodeType": "task",
980
+ "executionClass": "aiTask",
981
+ "skillKey": "professional-answer",
982
+ "selectedCases": {
983
+ "graphModelCaseId": "default"
984
+ },
985
+ "modelSlots": {
986
+ "preActionModel": {
987
+ "selection": {
988
+ "kind": "profileChoice",
989
+ "key": "cheap/default"
990
+ },
991
+ "source": "graphDefault",
992
+ "inherited": true,
993
+ "graphCaseId": "default"
994
+ },
995
+ "skillModel": {
996
+ "selection": {
997
+ "kind": "profileChoice",
998
+ "key": "vol/default"
999
+ },
1000
+ "source": "graphDefault",
1001
+ "inherited": true,
1002
+ "graphCaseId": "default"
1003
+ },
1004
+ "postActionModel": {
1005
+ "selection": {
1006
+ "kind": "profileChoice",
1007
+ "key": "cheap/default"
1008
+ },
1009
+ "source": "graphDefault",
1010
+ "inherited": true,
1011
+ "graphCaseId": "default"
1012
+ }
1013
+ },
1014
+ "invokeContract": {
1015
+ "taskVariable": {
1016
+ "question": "Which keywords should this campaign target?",
1017
+ "outputContract": {
1018
+ "shortAnswer": "Primary keyword cluster.",
1019
+ "fullAnswer": "Grouped keyword list with intent."
1020
+ }
1021
+ },
1022
+ "inputsConfig": {
1023
+ "brief": {
1024
+ "executionMemoryPath": "executionMemory.input"
1025
+ }
1026
+ },
1027
+ "smartInput": {
1028
+ "paths": [
1029
+ {
1030
+ "path": "executionMemory.input",
1031
+ "label": "Campaign brief"
1032
+ }
1033
+ ]
1034
+ },
1035
+ "executionMapping": {
1036
+ "path": "content.seo",
1037
+ "mode": "replace",
1038
+ "map": {
1039
+ "shortAnswer": "output.parsed.shortAnswer",
1040
+ "fullAnswer": "output.parsed.fullAnswer"
1041
+ }
1042
+ },
1043
+ "pipeline": {
1044
+ "executionStrategies": [],
1045
+ "aiTaskStrategies": {
1046
+ "pre": "synthesis",
1047
+ "preInputStrategy": "execution-memory-only"
1048
+ }
1049
+ }
1050
+ },
1051
+ "executionUnits": [
1052
+ {
1053
+ "unitId": "unit:node:seo-keywords:pre:0",
1054
+ "nodeId": "node:seo-keywords",
1055
+ "unitKind": "externalPreUtility",
1056
+ "invokeMode": "externalRunTask",
1057
+ "order": 0,
1058
+ "strategyKey": "synthesis",
1059
+ "actionKey": "synthesis",
1060
+ "modelSlot": "preActionModel",
1061
+ "modelSelection": {
1062
+ "kind": "profileChoice",
1063
+ "key": "cheap/default"
1064
+ },
1065
+ "modelSource": "graphDefault",
1066
+ "unitParams": {
1067
+ "synthesisInputStrategy": "execution-memory-only"
1068
+ },
1069
+ "invokeContract": {
1070
+ "reads": [
1071
+ "executionMemory.input"
1072
+ ],
1073
+ "writes": [
1074
+ {
1075
+ "destination": "execution",
1076
+ "key": "xynthesized",
1077
+ "mode": "replace"
1078
+ }
1079
+ ],
1080
+ "includeContextInPrompt": true
1081
+ },
1082
+ "sourcePath": "/graph/nodes/2/parameters/taskConfiguration/aiTaskStrategies/pre"
1083
+ },
1084
+ {
1085
+ "unitId": "unit:node:seo-keywords:main",
1086
+ "nodeId": "node:seo-keywords",
1087
+ "unitKind": "mainSkill",
1088
+ "invokeMode": "mainRunTask",
1089
+ "order": 1,
1090
+ "skillKey": "professional-answer",
1091
+ "modelSlot": "skillModel",
1092
+ "modelSelection": {
1093
+ "kind": "profileChoice",
1094
+ "key": "vol/default"
1095
+ },
1096
+ "modelSource": "graphDefault",
1097
+ "invokeContract": {
1098
+ "reads": [
1099
+ "executionMemory.input"
1100
+ ],
1101
+ "writes": [
1102
+ {
1103
+ "destination": "response",
1104
+ "key": "skillOutput",
1105
+ "mode": "replace"
1106
+ }
1107
+ ]
1108
+ },
1109
+ "sourcePath": "/graph/nodes/2/parameters/skillKey"
1110
+ },
1111
+ {
1112
+ "unitId": "unit:node:seo-keywords:mapping",
1113
+ "nodeId": "node:seo-keywords",
1114
+ "unitKind": "mapping",
1115
+ "invokeMode": "none",
1116
+ "order": 2,
1117
+ "outputContract": {
1118
+ "path": "content.seo",
1119
+ "mode": "replace",
1120
+ "map": {
1121
+ "shortAnswer": "output.parsed.shortAnswer",
1122
+ "fullAnswer": "output.parsed.fullAnswer"
1123
+ }
1124
+ },
1125
+ "invokeContract": {
1126
+ "reads": [
1127
+ "response.skillOutput"
1128
+ ],
1129
+ "writes": [
1130
+ {
1131
+ "destination": "execution",
1132
+ "key": "content.seo",
1133
+ "mode": "replace"
1134
+ }
1135
+ ]
1136
+ },
1137
+ "sourcePath": "/graph/nodes/2/parameters/executionMapping"
1138
+ }
1139
+ ],
1140
+ "outputMapping": {
1141
+ "path": "content.seo",
1142
+ "mode": "replace",
1143
+ "map": {
1144
+ "shortAnswer": "output.parsed.shortAnswer",
1145
+ "fullAnswer": "output.parsed.fullAnswer"
1146
+ }
1147
+ },
1148
+ "executionMapping": {
1149
+ "path": "content.seo",
1150
+ "mode": "replace",
1151
+ "map": {
1152
+ "shortAnswer": "output.parsed.shortAnswer",
1153
+ "fullAnswer": "output.parsed.fullAnswer"
1154
+ }
1155
+ },
1156
+ "planVersion": "graphenix.node-plan/v2.1",
1157
+ "compiledAt": "2026-06-07T15:01:14.863Z",
1158
+ "compilerVersion": "1.1.0",
1159
+ "sourcePath": "/graph/nodes/2"
1160
+ }
1161
+ },
1162
+ "finalizerPlans": {
1163
+ "node:finalizer:package": {
1164
+ "nodeId": "node:finalizer:package",
1165
+ "finalizerType": "aggregate",
1166
+ "executionClass": "finalizer",
1167
+ "config": {
1168
+ "sections": [
1169
+ {
1170
+ "sourceNodeId": "node:audience-insights",
1171
+ "sourcePortId": "out:result",
1172
+ "executionMemoryPath": "content.audience"
1173
+ },
1174
+ {
1175
+ "sourceNodeId": "node:competitor-angles",
1176
+ "sourcePortId": "out:result",
1177
+ "executionMemoryPath": "content.competitors"
1178
+ },
1179
+ {
1180
+ "sourceNodeId": "node:seo-keywords",
1181
+ "sourcePortId": "out:result",
1182
+ "executionMemoryPath": "content.seo"
1183
+ }
1184
+ ]
1185
+ },
1186
+ "modelSlots": null,
1187
+ "executionUnits": [
1188
+ {
1189
+ "unitId": "unit:node:finalizer:package:finalizer",
1190
+ "nodeId": "node:finalizer:package",
1191
+ "unitKind": "finalizer",
1192
+ "invokeMode": "finalizer",
1193
+ "order": 0,
1194
+ "finalizerType": "aggregate",
1195
+ "sourcePath": "/graph/nodes/3/parameters/finalizerType"
1196
+ }
1197
+ ],
1198
+ "outputContractRef": "graph-output:content-package",
1199
+ "responseShapePath": "/graph/metadata/graphResponse",
1200
+ "sourcePath": "/graph/nodes/3"
1201
+ }
1202
+ },
1203
+ "contracts": {
1204
+ "entry": {
1205
+ "graphEntryRef": "/graph/metadata/graphEntry",
1206
+ "executionSchema": {
1207
+ "type": "object",
1208
+ "properties": {
1209
+ "title": {
1210
+ "type": "string"
1211
+ },
1212
+ "objective": {
1213
+ "type": "string"
1214
+ }
1215
+ }
1216
+ }
1217
+ },
1218
+ "response": {
1219
+ "graphResponseRef": "/graph/metadata/graphResponse",
1220
+ "graphOutputIds": [
1221
+ "graph-output:content-package"
1222
+ ],
1223
+ "responseShapePath": "/graph/metadata/graphResponse",
1224
+ "finalOutputSchema": {
1225
+ "type": "object"
1226
+ }
1227
+ }
1228
+ },
1229
+ "policies": {
1230
+ "directModelPolicy": "forbidden",
1231
+ "fallbackPolicy": {
1232
+ "enabled": true,
1233
+ "owner": "executor",
1234
+ "slots": [
1235
+ "preActionModel",
1236
+ "skillModel",
1237
+ "postActionModel"
1238
+ ],
1239
+ "allowedTriggers": [
1240
+ "nodeSlotMissing",
1241
+ "nodeModelUnavailable"
1242
+ ],
1243
+ "maxAttemptsPerSlot": 1
1244
+ },
1245
+ "tracePolicy": {},
1246
+ "dataPolicy": {
1247
+ "storeFullRuntimeInputInPlan": false,
1248
+ "allowInputPreview": false,
1249
+ "useDataRefsForLargeValues": true
1250
+ }
1251
+ },
1252
+ "compatibility": {
1253
+ "authoringFormatVersion": "2.0.0",
1254
+ "planFormatVersion": "graphenix.executable-plan/v2",
1255
+ "requiredExecutorCapabilities": [
1256
+ "executable-plan-v2",
1257
+ "deferred-gates",
1258
+ "invoke-contract"
1259
+ ],
1260
+ "taskNodeFieldsCovered": [
1261
+ "taskVariable",
1262
+ "inputs",
1263
+ "inputsConfig",
1264
+ "smartInput",
1265
+ "executionMapping",
1266
+ "jobContextMapping",
1267
+ "executionStrategies",
1268
+ "aiTaskStrategies",
1269
+ "aiTaskProfile",
1270
+ "inputSynthesis",
1271
+ "webScoping",
1272
+ "narrix",
1273
+ "narrixInput",
1274
+ "narrixMode",
1275
+ "llmCall",
1276
+ "conditions",
1277
+ "taskKnowledge",
1278
+ "taskPagentiKnowledge",
1279
+ "outputValidation",
1280
+ "scope",
1281
+ "memory",
1282
+ "localConfig",
1283
+ "modelConfig"
1284
+ ]
1285
+ },
1286
+ "validation": {
1287
+ "valid": true,
1288
+ "validatedAt": "2026-06-07T12:00:00.000Z",
1289
+ "errorCount": 0,
1290
+ "warningCount": 0
1291
+ }
1292
+ }