@adcp/sdk 6.2.0 → 6.4.0

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 (65) hide show
  1. package/AGENTS.md +5 -0
  2. package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts +4 -4
  3. package/dist/lib/adapters/legacy/v2-5/sync_creatives.js +4 -4
  4. package/dist/lib/adapters/legacy/v2-5/types.d.ts +1 -1
  5. package/dist/lib/adapters/legacy/v2-5/types.js +1 -1
  6. package/dist/lib/core/ConversationTypes.d.ts +3 -3
  7. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  8. package/dist/lib/core/TaskExecutor.d.ts +4 -4
  9. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  10. package/dist/lib/core/TaskExecutor.js +13 -13
  11. package/dist/lib/core/TaskExecutor.js.map +1 -1
  12. package/dist/lib/errors/index.d.ts +10 -8
  13. package/dist/lib/errors/index.d.ts.map +1 -1
  14. package/dist/lib/errors/index.js +10 -9
  15. package/dist/lib/errors/index.js.map +1 -1
  16. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  17. package/dist/lib/server/decisioning/account.d.ts +84 -16
  18. package/dist/lib/server/decisioning/account.d.ts.map +1 -1
  19. package/dist/lib/server/decisioning/account.js.map +1 -1
  20. package/dist/lib/server/decisioning/index.d.ts +2 -2
  21. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  22. package/dist/lib/server/decisioning/index.js +4 -1
  23. package/dist/lib/server/decisioning/index.js.map +1 -1
  24. package/dist/lib/server/decisioning/runtime/from-platform.js +65 -3
  25. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  26. package/dist/lib/server/decisioning/tenant-registry.d.ts +127 -3
  27. package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -1
  28. package/dist/lib/server/decisioning/tenant-registry.js +223 -0
  29. package/dist/lib/server/decisioning/tenant-registry.js.map +1 -1
  30. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  31. package/dist/lib/testing/compliance/comply.js +46 -11
  32. package/dist/lib/testing/compliance/comply.js.map +1 -1
  33. package/dist/lib/testing/compliance/storyboard-tracks.js +22 -5
  34. package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
  35. package/dist/lib/testing/compliance/types.d.ts +21 -1
  36. package/dist/lib/testing/compliance/types.d.ts.map +1 -1
  37. package/dist/lib/testing/storyboard/assertions.d.ts +19 -1
  38. package/dist/lib/testing/storyboard/assertions.d.ts.map +1 -1
  39. package/dist/lib/testing/storyboard/assertions.js.map +1 -1
  40. package/dist/lib/testing/storyboard/default-invariants.js +17 -0
  41. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  42. package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
  43. package/dist/lib/testing/storyboard/loader.js +41 -0
  44. package/dist/lib/testing/storyboard/loader.js.map +1 -1
  45. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  46. package/dist/lib/testing/storyboard/runner.js +157 -21
  47. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  48. package/dist/lib/testing/storyboard/types.d.ts +69 -1
  49. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  50. package/dist/lib/testing/storyboard/types.js.map +1 -1
  51. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  52. package/dist/lib/testing/storyboard/validations.js +176 -0
  53. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  54. package/dist/lib/utils/sync-creatives-adapter.d.ts +7 -7
  55. package/dist/lib/utils/sync-creatives-adapter.d.ts.map +1 -1
  56. package/dist/lib/utils/sync-creatives-adapter.js +28 -44
  57. package/dist/lib/utils/sync-creatives-adapter.js.map +1 -1
  58. package/dist/lib/version.d.ts +3 -3
  59. package/dist/lib/version.js +3 -3
  60. package/examples/decisioning-platform-broadcast-tv.ts +2 -8
  61. package/examples/decisioning-platform-mock-seller.ts +2 -4
  62. package/examples/decisioning-platform-multi-tenant.ts +26 -4
  63. package/examples/decisioning-platform-programmatic.ts +4 -17
  64. package/package.json +1 -1
  65. package/skills/build-decisioning-platform/SKILL.md +62 -44
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/loader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmDH,OAAO,KAAK,EAYV,UAAU,EACV,cAAc,EAEd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAA4B,cAAc,EAAE,MAAM,UAAU,CAAC;AAwCzE;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQ/E;AAkKD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAED,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAiDD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AA4DD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,cAAc,GAC5B,gBAAgB,CA6ClB;AAy3BD;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,qBAAqB,EAAE,GAC9B,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC,CA0B9G;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,uBAAuB,CA4BlG;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAsE/B;AA89BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwCzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AA8OD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,iBAAsB,GAC9B,qBAAqB,GAAG,SAAS,CAgBnC"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmDH,OAAO,KAAK,EAYV,UAAU,EACV,cAAc,EAEd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAA4B,cAAc,EAAE,MAAM,UAAU,CAAC;AAwCzE;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQ/E;AAkKD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAED,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAiDD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AA4DD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,cAAc,GAC5B,gBAAgB,CA6ClB;AA0gCD;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,qBAAqB,EAAE,GAC9B,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC,CA0B9G;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,uBAAuB,CA4BlG;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAsE/B;AA89BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwCzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AA8OD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,iBAAsB,GAC9B,qBAAqB,GAAG,SAAS,CAgBnC"}
@@ -635,6 +635,11 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
635
635
  // or skipped to materialize state, every downstream stateful step
636
636
  // stays cascade-skipped regardless of which phase it lives in.
637
637
  let statefulFailed = false;
638
+ // `substitution_chain` is set when the trigger came from a
639
+ // deferred-and-unrescued `peer_substitutes_for` declaration (#1144) so
640
+ // the cascade-detail message can name the substitute(s) that didn't
641
+ // pass. Absent for the immediate-trip path and the legacy any-peer
642
+ // not_applicable path.
638
643
  let statefulSkipTrigger = null;
639
644
  // Step results whose failures the main loop added to failedCount. The
640
645
  // branch-set post-pass decrements only for entries that were actually
@@ -789,17 +794,51 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
789
794
  // cross-phase setup → assertion patterns. See declaration site for
790
795
  // the rationale (signal_marketplace/governance_denied story).
791
796
  //
792
- // Phase-scoped substitution tracking (adcp-client#1005, round-9).
793
- // A `not_applicable` skip on a stateful step doesn't mean state
794
- // never materialized — it means *this* path doesn't apply, and the
795
- // storyboard may have a peer step (e.g. `list_accounts` paired
796
- // with `sync_accounts`) that establishes equivalent state. We
797
- // record the trigger and defer the cascade decision to phase end:
798
- // if any stateful step in this phase passed, the substitute did
799
- // its job and we don't trip. If none did, we promote the pending
800
- // trigger to a hard cascade so downstream phases skip cleanly.
797
+ // Phase-scoped substitution tracking (adcp-client#1005, round-9; #1144).
798
+ //
799
+ // Two deferral paths:
800
+ // 1. `not_applicable` on a stateful step (any-peer rescue) — preserved
801
+ // from the F6 fix. Rescued by ANY passing stateful step in the
802
+ // phase. Backward-compatible with storyboards that haven't adopted
803
+ // explicit substitution declarations.
804
+ // 2. `missing_tool` / `missing_test_controller` on a stateful step
805
+ // WITH a declared substitute peer (`peer_substitutes_for`) in the
806
+ // same phase. Rescued ONLY when the declared substitute actually
807
+ // passes. Without a declaration, hard-missing reasons trip the
808
+ // cascade immediately as before.
809
+ //
810
+ // Path (2) is opt-in via storyboard YAML: a substitute step declares
811
+ // `peer_substitutes_for: <target_step_id>` to assert that its passing
812
+ // establishes equivalent state. Phase membership alone is NOT treated
813
+ // as substitutability — explicit declaration is required.
801
814
  let phasePendingNotApplicable = null;
802
815
  let phaseEstablishedStatefulState = false;
816
+ // Path (2): index of declared substitutions for this phase. Map keys
817
+ // are target step IDs (the steps being substituted FOR); values are the
818
+ // step IDs that declared the substitution. Built once per phase from
819
+ // each step's `peer_substitutes_for` field.
820
+ const phaseSubstitutes = new Map();
821
+ for (const declaringStep of phase.steps) {
822
+ const decl = declaringStep.peer_substitutes_for;
823
+ if (decl === undefined)
824
+ continue;
825
+ const targets = Array.isArray(decl) ? decl : [decl];
826
+ for (const target of targets) {
827
+ const arr = phaseSubstitutes.get(target) ?? [];
828
+ arr.push(declaringStep.id);
829
+ phaseSubstitutes.set(target, arr);
830
+ }
831
+ }
832
+ // Path (2) state. `phasePendingMissingTool` is the deferred-cascade
833
+ // trigger for a stateful step that skipped with a hard-missing reason
834
+ // AND has at least one declared substitute in this phase. Only the
835
+ // first such trigger is recorded — the cascade-detail message
836
+ // references the leftmost step.
837
+ let phasePendingMissingTool = null;
838
+ // Targets actually rescued by a passing declared substitute. Populated
839
+ // when a step with `peer_substitutes_for: X` passes — every X in its
840
+ // declaration list lands here.
841
+ const phaseRescuedTargets = new Set();
803
842
  // PRM presence-probe state (adcp-client#677). `phaseAbsent` flips when
804
843
  // /.well-known/oauth-protected-resource returns 404 — subsequent steps
805
844
  // in this phase cascade-skip instead of failing their http_status:200
@@ -886,13 +925,45 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
886
925
  continue;
887
926
  }
888
927
  // Skip remaining steps if a stateful dependency failed (or
889
- // skipped for a missing-state reason). The detail message
890
- // distinguishes the two so adopters reading the cascade know
891
- // whether to look at a real failure or a structural mismatch
892
- // (storyboard step requires a tool the agent doesn't advertise).
928
+ // skipped for a missing-state reason). Before applying the
929
+ // cascade reason, check the step's intrinsic skip-eligibility:
930
+ // if the agent never advertised this step's tool, the correct
931
+ // reason is `missing_tool` (a benign, passed: true skip)
932
+ // not `prerequisite_failed` (a failed skip). This distinguishes
933
+ // "this agent has a real setup bug" from "this agent doesn't
934
+ // claim this surface, by design" (adcp-client#1169).
935
+ //
936
+ // Uses resolveTaskName so that $test_kit.* steps are checked
937
+ // against the resolved concrete task name, not the template
938
+ // string (which would never be in agentTools).
893
939
  if (statefulFailed && step.stateful) {
940
+ const resolvedTask = resolveTaskName(step, options);
941
+ if (options.agentTools && resolvedTask && !options.agentTools.includes(resolvedTask)) {
942
+ const toolDetail = `Agent did not advertise tool "${resolvedTask}"; agent tools: [${options.agentTools.join(', ')}].`;
943
+ const missingToolResult = {
944
+ storyboard_id: storyboard.id,
945
+ step_id: step.id,
946
+ phase_id: phase.id,
947
+ title: step.title,
948
+ task: resolvedTask,
949
+ passed: true,
950
+ skipped: true,
951
+ skip_reason: 'missing_tool',
952
+ skip: buildSkip('missing_tool', toolDetail),
953
+ duration_ms: 0,
954
+ validations: [],
955
+ context,
956
+ extraction: { path: 'none' },
957
+ };
958
+ stepResults.push(missingToolResult);
959
+ priorStepResults.set(step.id, missingToolResult);
960
+ skippedCount++;
961
+ continue;
962
+ }
894
963
  const detail = statefulSkipTrigger
895
- ? `Skipped: prior stateful step "${statefulSkipTrigger.stepId}" skipped (${statefulSkipTrigger.reason}); state never materialized.`
964
+ ? statefulSkipTrigger.substitution_chain
965
+ ? `Skipped: prior stateful step "${statefulSkipTrigger.stepId}" skipped (${statefulSkipTrigger.reason}); ${statefulSkipTrigger.substitution_chain}; state never materialized.`
966
+ : `Skipped: prior stateful step "${statefulSkipTrigger.stepId}" skipped (${statefulSkipTrigger.reason}); state never materialized.`
896
967
  : 'Skipped: prior stateful step failed.';
897
968
  stepResults.push({
898
969
  storyboard_id: storyboard.id,
@@ -933,6 +1004,17 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
933
1004
  }
934
1005
  stepResults.push(result);
935
1006
  priorStepResults.set(step.id, result);
1007
+ // Thread accumulated cross-step context into each assertion context
1008
+ // before onStep fires. `context` here is the accumulated state from
1009
+ // all prior steps (updated at the bottom of this loop); assertions
1010
+ // read it via ctx.storyboardContext to implement cross-step comparison
1011
+ // validators (adcp-client#1140, Option 2 / context-outputs style).
1012
+ // Each assertion gets its own shallow copy so a mutating handler
1013
+ // doesn't corrupt the view seen by subsequent assertions in the same
1014
+ // step, or the live accumulator seen by subsequent steps.
1015
+ for (const spec of assertions) {
1016
+ assertionContexts.get(spec.id).storyboardContext = { ...context };
1017
+ }
936
1018
  // Fire per-step assertions. Each result is appended to the step's
937
1019
  // `validations[]` under `check: "assertion"` so existing UI renders
938
1020
  // them alongside inline checks, and mirrored into `assertionResults`
@@ -1021,13 +1103,31 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
1021
1103
  // path) deliberately don't trip the flag.
1022
1104
  if (step.stateful) {
1023
1105
  if (isHardMissingStateSkipReason(result.skip_reason)) {
1024
- statefulFailed = true;
1025
- // Record provenance for the cascade detail message. First trip
1026
- // winssubsequent triggers don't overwrite, since the cascade
1027
- // text references the originating diagnostic (the leftmost
1028
- // missing-state stateful step in the phase).
1029
- if (statefulSkipTrigger === null) {
1030
- statefulSkipTrigger = { stepId: step.id, reason: result.skip_reason ?? 'missing_tool' };
1106
+ // Hard-missing skip on a stateful step. Defer the cascade only
1107
+ // when a peer in this phase has declared
1108
+ // `peer_substitutes_for: <this_step_id>` that peer's pass
1109
+ // establishes equivalent state. Without a declaration,
1110
+ // missing_tool / missing_test_controller trips the cascade
1111
+ // immediately (existing behavior).
1112
+ const substitutes = phaseSubstitutes.get(step.id);
1113
+ if (substitutes && substitutes.length > 0) {
1114
+ if (phasePendingMissingTool === null) {
1115
+ phasePendingMissingTool = {
1116
+ stepId: step.id,
1117
+ reason: result.skip_reason ?? 'missing_tool',
1118
+ substitutes,
1119
+ };
1120
+ }
1121
+ }
1122
+ else {
1123
+ statefulFailed = true;
1124
+ // Record provenance for the cascade detail message. First trip
1125
+ // wins — subsequent triggers don't overwrite, since the cascade
1126
+ // text references the originating diagnostic (the leftmost
1127
+ // missing-state stateful step in the phase).
1128
+ if (statefulSkipTrigger === null) {
1129
+ statefulSkipTrigger = { stepId: step.id, reason: result.skip_reason ?? 'missing_tool' };
1130
+ }
1031
1131
  }
1032
1132
  }
1033
1133
  else if (result.skip_reason === 'not_applicable') {
@@ -1064,6 +1164,17 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
1064
1164
  // the deferred cascade should NOT fire at phase end.
1065
1165
  if (step.stateful) {
1066
1166
  phaseEstablishedStatefulState = true;
1167
+ // Path (2) rescue tracking: a passing step that declared
1168
+ // `peer_substitutes_for: X` rescues X. Recorded against every
1169
+ // declared target so phase-end resolution sees the target as
1170
+ // covered even if its skip arrives later in the loop.
1171
+ const decl = step.peer_substitutes_for;
1172
+ if (decl !== undefined) {
1173
+ const targets = Array.isArray(decl) ? decl : [decl];
1174
+ for (const target of targets) {
1175
+ phaseRescuedTargets.add(target);
1176
+ }
1177
+ }
1067
1178
  }
1068
1179
  }
1069
1180
  else {
@@ -1110,6 +1221,26 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
1110
1221
  statefulSkipTrigger = phasePendingNotApplicable;
1111
1222
  }
1112
1223
  }
1224
+ // Phase-end cascade resolution for deferred `missing_tool` triggers
1225
+ // (#1144). A stateful step that skipped with a hard-missing reason
1226
+ // and had at least one declared substitute (`peer_substitutes_for`)
1227
+ // was deferred above. If none of the declared substitutes passed,
1228
+ // the substitution path failed to establish state — promote to a
1229
+ // hard cascade with a detail message that names the substitute(s)
1230
+ // tried so adopters reading the report see the substitution chain
1231
+ // rather than a bare `missing_tool` cascade origin.
1232
+ if (phasePendingMissingTool && !phaseRescuedTargets.has(phasePendingMissingTool.stepId) && !statefulFailed) {
1233
+ statefulFailed = true;
1234
+ if (statefulSkipTrigger === null) {
1235
+ const subs = phasePendingMissingTool.substitutes;
1236
+ const subsList = subs.length === 1 ? `"${subs[0]}"` : subs.map(s => `"${s}"`).join(', ');
1237
+ statefulSkipTrigger = {
1238
+ stepId: phasePendingMissingTool.stepId,
1239
+ reason: phasePendingMissingTool.reason,
1240
+ substitution_chain: `declared substitute ${subsList} did not pass`,
1241
+ };
1242
+ }
1243
+ }
1113
1244
  phaseResults.push({
1114
1245
  phase_id: phase.id,
1115
1246
  phase_title: phase.title,
@@ -1131,6 +1262,11 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
1131
1262
  const branchSetsByPhaseId = resolveBranchSets(storyboard);
1132
1263
  const branchSetDelta = applyBranchSetGrading(storyboard.phases, phaseResults, branchSetsByPhaseId, contributions, contributionSources, countedAsFailed);
1133
1264
  skippedCount += branchSetDelta.skippedDelta;
1265
+ // Update assertion contexts with the final accumulated context so onEnd
1266
+ // handlers see the full run's context (not just through the penultimate step).
1267
+ for (const spec of assertions) {
1268
+ assertionContexts.get(spec.id).storyboardContext = { ...context };
1269
+ }
1134
1270
  // Fire storyboard-scoped assertions. These observe the full run and can
1135
1271
  // emit `scope: "storyboard"` findings that flip `overall_passed` without
1136
1272
  // being attributable to a single step (e.g. "saw >1 acquire for the same