@raishin/vanguard-frontier-agentic 3.15.0 → 3.17.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 (374) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +3 -1
  3. package/.cursor-plugin/plugin.json +3 -1
  4. package/.github/plugin/marketplace.json +1 -1
  5. package/README.md +11 -11
  6. package/agents/AGENTS.md +1 -1
  7. package/agents/README.md +1 -1
  8. package/agents/cross-functional/agentic-security-review-agent/AGENT.md +168 -0
  9. package/agents/cross-functional/agentic-security-review-agent/harnesses/claude-code.agent.md +158 -0
  10. package/agents/cross-functional/agentic-security-review-agent/harnesses/codex.toml +165 -0
  11. package/agents/cross-functional/agentic-security-review-agent/harnesses/copilot.agent.md +163 -0
  12. package/agents/cross-functional/agentic-security-review-agent/harnesses/cursor.agent.md +158 -0
  13. package/agents/cross-functional/agentic-security-review-agent/harnesses/gemini.agent.md +164 -0
  14. package/agents/cross-functional/agentic-security-review-agent/harnesses/kiro-cli.agent.json +5 -0
  15. package/agents/cross-functional/agentic-security-review-agent/harnesses/kiro-ide.agent.md +157 -0
  16. package/agents/cross-functional/agentic-security-review-agent/metadata.json +45 -0
  17. package/agents/cross-functional/agentic-system-architecture-review-agent/AGENT.md +157 -0
  18. package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/claude-code.agent.md +147 -0
  19. package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/codex.toml +154 -0
  20. package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/copilot.agent.md +152 -0
  21. package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/cursor.agent.md +147 -0
  22. package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/gemini.agent.md +153 -0
  23. package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/kiro-cli.agent.json +5 -0
  24. package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/kiro-ide.agent.md +146 -0
  25. package/agents/cross-functional/agentic-system-architecture-review-agent/metadata.json +46 -0
  26. package/agents/typescript/typescript-maestro-agent/AGENT.md +1 -1
  27. package/agents/typescript/typescript-maestro-agent/harnesses/claude-code.agent.md +1 -1
  28. package/agents/typescript/typescript-maestro-agent/harnesses/codex.toml +1 -1
  29. package/agents/typescript/typescript-maestro-agent/harnesses/copilot.agent.md +1 -1
  30. package/agents/typescript/typescript-maestro-agent/harnesses/cursor.agent.md +1 -1
  31. package/agents/typescript/typescript-maestro-agent/harnesses/gemini.agent.md +1 -1
  32. package/agents/typescript/typescript-maestro-agent/harnesses/kiro-cli.agent.json +1 -1
  33. package/agents/typescript/typescript-maestro-agent/harnesses/kiro-ide.agent.md +1 -1
  34. package/agents/typescript/typescript-mcp-tool-contract-agent/AGENT.md +1 -1
  35. package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/claude-code.agent.md +1 -1
  36. package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/copilot.agent.md +1 -1
  37. package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/cursor.agent.md +1 -1
  38. package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/gemini.agent.md +1 -1
  39. package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/kiro-cli.agent.json +1 -1
  40. package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/kiro-ide.agent.md +1 -1
  41. package/catalog/AGENTS.md +2 -1
  42. package/catalog/agents.json +71 -0
  43. package/catalog/asset-integrity.json +1639 -92
  44. package/catalog/index.json +3 -2
  45. package/catalog/install-roles.json +24 -3
  46. package/catalog/model-assignments.json +66 -0
  47. package/catalog/mods.json +131 -0
  48. package/catalog/skill-manifest.json +134 -8
  49. package/catalog/skills.json +89 -0
  50. package/mods/README.md +220 -0
  51. package/mods/audit-trail/README.md +70 -0
  52. package/mods/audit-trail/bin/hook.mjs +65 -0
  53. package/mods/audit-trail/claude-code/UNSUPPORTED.md +11 -0
  54. package/mods/audit-trail/claude-code/settings.hooks.json +14 -0
  55. package/mods/audit-trail/codex/hooks.json +14 -0
  56. package/mods/audit-trail/kiro/UNSUPPORTED.md +7 -0
  57. package/mods/audit-trail/kiro/audit-trail-post-tool-use-hook.json +14 -0
  58. package/mods/audit-trail/lib/common.mjs +213 -0
  59. package/mods/audit-trail/lib/core.mjs +50 -0
  60. package/mods/audit-trail/lib/runtime.mjs +140 -0
  61. package/mods/audit-trail/mod.toml +37 -0
  62. package/mods/blast-radius-guard/.claude-plugin/plugin.json +5 -0
  63. package/mods/blast-radius-guard/README.md +53 -0
  64. package/mods/blast-radius-guard/bin/hook.mjs +18 -0
  65. package/mods/blast-radius-guard/claude-code/settings.hooks.json +14 -0
  66. package/mods/blast-radius-guard/codex/UNSUPPORTED.md +7 -0
  67. package/mods/blast-radius-guard/codex/hooks.json +14 -0
  68. package/mods/blast-radius-guard/hooks/hooks.json +5 -0
  69. package/mods/blast-radius-guard/hooks/register.test.ts +97 -0
  70. package/mods/blast-radius-guard/hooks/register.ts +13 -0
  71. package/mods/blast-radius-guard/kiro/UNSUPPORTED.md +7 -0
  72. package/mods/blast-radius-guard/kiro/blast-radius-guard-pre-tool-use-hook.json +14 -0
  73. package/mods/blast-radius-guard/lib/common.mjs +213 -0
  74. package/mods/blast-radius-guard/lib/core.mjs +66 -0
  75. package/mods/blast-radius-guard/lib/patterns.mjs +102 -0
  76. package/mods/blast-radius-guard/lib/runtime.mjs +140 -0
  77. package/mods/blast-radius-guard/mod.toml +34 -0
  78. package/mods/blast-radius-guard/patterns.json +101 -0
  79. package/mods/context-burn/.claude-plugin/plugin.json +5 -0
  80. package/mods/context-burn/README.md +66 -0
  81. package/mods/context-burn/bin/hook.mjs +38 -0
  82. package/mods/context-burn/claude-code/UNSUPPORTED.md +7 -0
  83. package/mods/context-burn/claude-code/settings.hooks.json +24 -0
  84. package/mods/context-burn/codex/UNSUPPORTED.md +7 -0
  85. package/mods/context-burn/codex/hooks.json +24 -0
  86. package/mods/context-burn/hooks/hooks.json +5 -0
  87. package/mods/context-burn/hooks/register.test.ts +151 -0
  88. package/mods/context-burn/hooks/register.ts +35 -0
  89. package/mods/context-burn/kiro/UNSUPPORTED.md +7 -0
  90. package/mods/context-burn/kiro/context-burn-post-tool-use-hook.json +14 -0
  91. package/mods/context-burn/kiro/context-burn-session-start-hook.json +14 -0
  92. package/mods/context-burn/lib/common.mjs +213 -0
  93. package/mods/context-burn/lib/core.mjs +79 -0
  94. package/mods/context-burn/lib/runtime.mjs +140 -0
  95. package/mods/context-burn/mod.toml +37 -0
  96. package/mods/live-guard-gate/.claude-plugin/plugin.json +5 -0
  97. package/mods/live-guard-gate/README.md +43 -0
  98. package/mods/live-guard-gate/bin/hook.mjs +12 -0
  99. package/mods/live-guard-gate/claude-code/settings.hooks.json +14 -0
  100. package/mods/live-guard-gate/codex/UNSUPPORTED.md +7 -0
  101. package/mods/live-guard-gate/codex/hooks.json +14 -0
  102. package/mods/live-guard-gate/hooks/hooks.json +5 -0
  103. package/mods/live-guard-gate/hooks/register.test.ts +59 -0
  104. package/mods/live-guard-gate/hooks/register.ts +11 -0
  105. package/mods/live-guard-gate/kiro/UNSUPPORTED.md +7 -0
  106. package/mods/live-guard-gate/kiro/live-guard-gate-pre-tool-use-hook.json +14 -0
  107. package/mods/live-guard-gate/lib/common.mjs +213 -0
  108. package/mods/live-guard-gate/lib/core.mjs +24 -0
  109. package/mods/live-guard-gate/lib/live-agents.mjs +65 -0
  110. package/mods/live-guard-gate/lib/patterns.mjs +523 -0
  111. package/mods/live-guard-gate/lib/runtime.mjs +140 -0
  112. package/mods/live-guard-gate/mod.toml +34 -0
  113. package/mods/live-guard-gate/patterns.json +522 -0
  114. package/mods/secret-redactor/.claude-plugin/plugin.json +5 -0
  115. package/mods/secret-redactor/README.md +86 -0
  116. package/mods/secret-redactor/bin/hook.mjs +35 -0
  117. package/mods/secret-redactor/claude-code/UNSUPPORTED.md +7 -0
  118. package/mods/secret-redactor/claude-code/settings.hooks.json +24 -0
  119. package/mods/secret-redactor/codex/UNSUPPORTED.md +11 -0
  120. package/mods/secret-redactor/codex/hooks.json +14 -0
  121. package/mods/secret-redactor/hooks/hooks.json +5 -0
  122. package/mods/secret-redactor/hooks/register.test.ts +150 -0
  123. package/mods/secret-redactor/hooks/register.ts +19 -0
  124. package/mods/secret-redactor/kiro/UNSUPPORTED.md +11 -0
  125. package/mods/secret-redactor/kiro/secret-redactor-pre-tool-use-hook.json +14 -0
  126. package/mods/secret-redactor/lib/common.mjs +213 -0
  127. package/mods/secret-redactor/lib/core.mjs +61 -0
  128. package/mods/secret-redactor/lib/patterns.mjs +75 -0
  129. package/mods/secret-redactor/lib/runtime.mjs +140 -0
  130. package/mods/secret-redactor/mod.toml +43 -0
  131. package/mods/secret-redactor/patterns.json +74 -0
  132. package/package.json +9 -4
  133. package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
  134. package/powers/vanguard-generic/POWER.md +6 -6
  135. package/powers/vanguard-kubernetes/POWER.md +1 -1
  136. package/powers/vanguard-multi-cloud/POWER.md +1 -1
  137. package/schemas/agentic-handoff.schema.json +443 -0
  138. package/scripts/generate-kiro-powers.mjs +17 -6
  139. package/scripts/generate-mods.mjs +784 -0
  140. package/scripts/mods/common.mjs +213 -0
  141. package/scripts/mods/runtime.mjs +140 -0
  142. package/scripts/typescript_data/agents/00-typescript-maestro-agent.json +2 -2
  143. package/scripts/typescript_data/agents/11-typescript-mcp-tool-contract-agent.json +4 -4
  144. package/skills/cross-functional/agentic-board-protocol/SKILL.md +85 -0
  145. package/skills/cross-functional/agentic-board-protocol/metadata.json +28 -0
  146. package/skills/cross-functional/agentic-board-protocol/references/decision-record.md +134 -0
  147. package/skills/cross-functional/agentic-board-protocol/references/handoff-envelope.md +208 -0
  148. package/skills/cross-functional/agentic-board-protocol/references/risk-tier-crosswalk.md +88 -0
  149. package/skills/cross-functional/agentic-board-protocol/references/stop-conditions.md +122 -0
  150. package/skills/cross-functional/agentic-board-protocol/references/value-case.md +159 -0
  151. package/skills/cross-functional/agentic-security-review/SKILL.md +78 -0
  152. package/skills/cross-functional/agentic-security-review/metadata.json +30 -0
  153. package/skills/cross-functional/agentic-security-review/references/identity-and-delegated-authorization.md +144 -0
  154. package/skills/cross-functional/agentic-security-review/references/supply-chain-and-provenance.md +111 -0
  155. package/skills/cross-functional/agentic-security-review/references/threat-model-owasp-asi.md +55 -0
  156. package/skills/cross-functional/agentic-security-review/references/tools-memory-and-data-reach.md +125 -0
  157. package/skills/cross-functional/agentic-security-review/references/workflow-and-output.md +210 -0
  158. package/skills/cross-functional/agentic-system-architecture-review/SKILL.md +74 -0
  159. package/skills/cross-functional/agentic-system-architecture-review/metadata.json +31 -0
  160. package/skills/cross-functional/agentic-system-architecture-review/references/delegation-and-handoff-review.md +107 -0
  161. package/skills/cross-functional/agentic-system-architecture-review/references/pattern-selection.md +81 -0
  162. package/skills/cross-functional/agentic-system-architecture-review/references/reliability-and-containment.md +86 -0
  163. package/skills/cross-functional/agentic-system-architecture-review/references/state-memory-and-durability.md +102 -0
  164. package/skills/cross-functional/agentic-system-architecture-review/references/workflow-and-output.md +135 -0
  165. package/skills/typescript/typescript-maestro/SKILL.md +1 -1
  166. package/skills/typescript/typescript-maestro/references/routing-taxonomy.md +1 -1
  167. package/skills/typescript/typescript-mcp-tool-contract/SKILL.md +1 -1
  168. package/tests/agentic-board-suite/_build_fixtures.py +1751 -0
  169. package/tests/agentic-board-suite/_build_harnesses.py +123 -0
  170. package/tests/agentic-board-suite/agentic_board_rules.py +857 -0
  171. package/tests/agentic-board-suite/fixtures/invalid/CH-PROPOSAL-LINK--challenge-names-a-later-envelope.json +244 -0
  172. package/tests/agentic-board-suite/fixtures/invalid/CH-PROPOSAL-LINK--dangling-challenge-beside-a-request.json +410 -0
  173. package/tests/agentic-board-suite/fixtures/invalid/CH-PROPOSAL-LINK--dangling-proposal.json +187 -0
  174. package/tests/agentic-board-suite/fixtures/invalid/CH-ROUND-COUNTED--round-two-declared-as-one.json +481 -0
  175. package/tests/agentic-board-suite/fixtures/invalid/CH-ROUND-COUNTED--self-declared-round.json +187 -0
  176. package/tests/agentic-board-suite/fixtures/invalid/DR-ALTERNATIVES--no-alternatives.json +340 -0
  177. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--hard-gate-left-behind-by-proposer-swap.json +532 -0
  178. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--hard-gate-left-unattached.json +480 -0
  179. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--hard-gate-on-root-left-unattached.json +410 -0
  180. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--late-challenge-before-record.json +410 -0
  181. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--superseded-request-missed-earlier-challenge.json +565 -0
  182. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-PRECEDES--withdrawal-attached-before-it-was-sent.json +483 -0
  183. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-PRECEDES--withdrawal-descends-from-the-record.json +547 -0
  184. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-REQUIRED--r1-flag-without-challenge.json +349 -0
  185. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-REQUIRED--r2-without-challenge.json +339 -0
  186. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-REQUIRED--r3-no-flags-without-challenge.json +339 -0
  187. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-RESOLVES--dangling-challenge.json +347 -0
  188. package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-TARGETS-PROPOSAL--challenge-of-requester-message.json +415 -0
  189. package/tests/agentic-board-suite/fixtures/invalid/DR-CLASS-FROM-ROOT--root-declares-no-class.json +345 -0
  190. package/tests/agentic-board-suite/fixtures/invalid/DR-CLASS-FROM-ROOT--root-declares-other-class.json +346 -0
  191. package/tests/agentic-board-suite/fixtures/invalid/DR-DESIGNATED-CHALLENGER--designated-challenger-only-on-the-framing.json +346 -0
  192. package/tests/agentic-board-suite/fixtures/invalid/DR-DESIGNATED-CHALLENGER--investment-without-finance.json +436 -0
  193. package/tests/agentic-board-suite/fixtures/invalid/DR-DESIGNATED-CHALLENGER--stopped-designated-challenge.json +348 -0
  194. package/tests/agentic-board-suite/fixtures/invalid/DR-HARD-GATE--conditional-over-hard-gate.json +357 -0
  195. package/tests/agentic-board-suite/fixtures/invalid/DR-HARD-GATE--unresolved-hard-gate.json +357 -0
  196. package/tests/agentic-board-suite/fixtures/invalid/DR-NO-APPROVE-OVER-DISSENT--approve-over-a-stopped-challenge.json +413 -0
  197. package/tests/agentic-board-suite/fixtures/invalid/DR-NO-APPROVE-OVER-DISSENT--approve-over-dissent.json +346 -0
  198. package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--re-ask-without-supersedes.json +426 -0
  199. package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--request-superseded-twice.json +581 -0
  200. package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersedes-a-challenge.json +427 -0
  201. package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersedes-a-dangling-id.json +427 -0
  202. package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersedes-a-later-request.json +500 -0
  203. package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--superseding-request-from-another-proposer.json +621 -0
  204. package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersession-cycle.json +501 -0
  205. package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--agent-opens-decision-path.json +480 -0
  206. package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--owner-is-the-requester.json +273 -0
  207. package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--request-to-later-sorting-non-owner.json +273 -0
  208. package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--request-to-non-owner.json +273 -0
  209. package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--root-names-no-owner.json +341 -0
  210. package/tests/agentic-board-suite/fixtures/invalid/DR-PROPOSER-IS-SENDER--challenger-assembles-request.json +337 -0
  211. package/tests/agentic-board-suite/fixtures/invalid/DR-PROPOSER-NOT-CHALLENGER--self-challenge.json +411 -0
  212. package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--concurrent-higher-tier-envelope.json +403 -0
  213. package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--r5-decided-through-lower-tier-request.json +433 -0
  214. package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--request-drops-materiality-flags.json +479 -0
  215. package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--risk-raised-after-request-before-decision.json +403 -0
  216. package/tests/agentic-board-suite/fixtures/invalid/DR-TO-PRINCIPAL--request-to-agent.json +272 -0
  217. package/tests/agentic-board-suite/fixtures/invalid/DR-UNRESOLVED-DISSENT--dissent-dropped.json +341 -0
  218. package/tests/agentic-board-suite/fixtures/invalid/DR-UNRESOLVED-DISSENT--stopped-challenge-recorded-withdrawn.json +408 -0
  219. package/tests/agentic-board-suite/fixtures/invalid/DR-UNRESOLVED-DISSENT--unresolved-without-dissent.json +341 -0
  220. package/tests/agentic-board-suite/fixtures/invalid/DR-VALUE-CASE-REQUIRED--investment-without-value-case.json +353 -0
  221. package/tests/agentic-board-suite/fixtures/invalid/DRC-AFTER-REQUEST--decided-before-request.json +408 -0
  222. package/tests/agentic-board-suite/fixtures/invalid/DRC-AFTER-REQUEST--request-descends-from-its-record.json +408 -0
  223. package/tests/agentic-board-suite/fixtures/invalid/DRC-APPROVAL-STATE--state-contradicts-outcome.json +346 -0
  224. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-approves-a-redesign.json +433 -0
  225. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-contradicts-outcome.json +433 -0
  226. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-does-not-descend-from-its-record.json +499 -0
  227. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-is-the-parent-of-its-record.json +500 -0
  228. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-names-another-approver.json +438 -0
  229. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-nobody-asked-for.json +421 -0
  230. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-sent-before-the-record.json +499 -0
  231. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGNED--decision-in-force-not-co-signed.json +591 -0
  232. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGNED--later-sorting-second-approver-never-signs.json +359 -0
  233. package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGNED--named-second-approver-never-signs.json +359 -0
  234. package/tests/agentic-board-suite/fixtures/invalid/DRC-COMPLETED--record-left-dispatched.json +346 -0
  235. package/tests/agentic-board-suite/fixtures/invalid/DRC-DECIDER-IS-ADDRESSEE--decided-by-non-addressee.json +408 -0
  236. package/tests/agentic-board-suite/fixtures/invalid/DRC-DECIDER-IS-ADDRESSEE--earlier-sorting-non-addressee-decides.json +408 -0
  237. package/tests/agentic-board-suite/fixtures/invalid/DRC-DECIDER-IS-SENDER--relayed-decision.json +408 -0
  238. package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--override-without-acceptance.json +356 -0
  239. package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--same-round-withdrawal.json +423 -0
  240. package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--stopped-over-cap-withdrawal.json +623 -0
  241. package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--unrelated-withdrawal-does-not-clear-gate.json +482 -0
  242. package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--withdrawal-names-an-undelivered-envelope.json +482 -0
  243. package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--withdrawal-on-another-proposers-revision.json +600 -0
  244. package/tests/agentic-board-suite/fixtures/invalid/DRC-NOT-REQUESTER--second-approver-is-requester.json +433 -0
  245. package/tests/agentic-board-suite/fixtures/invalid/DRC-ONE-RECORD--contradicting-records.json +416 -0
  246. package/tests/agentic-board-suite/fixtures/invalid/DRC-ONE-RECORD--duplicate-co-signature.json +507 -0
  247. package/tests/agentic-board-suite/fixtures/invalid/DRC-PRINCIPAL-SOURCE--agent-writes-decision.json +345 -0
  248. package/tests/agentic-board-suite/fixtures/invalid/DRC-REQUEST-BINDING--points-at-challenge.json +346 -0
  249. package/tests/agentic-board-suite/fixtures/invalid/DRC-REQUEST-BINDING--record-names-a-missing-request.json +346 -0
  250. package/tests/agentic-board-suite/fixtures/invalid/DRC-REQUEST-BINDING--request-edited-after-decision.json +346 -0
  251. package/tests/agentic-board-suite/fixtures/invalid/DRC-SECOND-APPROVER--r5-request-decided-on-lower-tier-branch.json +418 -0
  252. package/tests/agentic-board-suite/fixtures/invalid/DRC-SECOND-APPROVER--r5-single-approver.json +354 -0
  253. package/tests/agentic-board-suite/fixtures/invalid/DRC-SECOND-APPROVER--second-approver-is-decider.json +359 -0
  254. package/tests/agentic-board-suite/fixtures/invalid/HO-AGENT-NO-APPROVAL--agent-claims-approval.json +132 -0
  255. package/tests/agentic-board-suite/fixtures/invalid/HO-APPROVAL-ONLY-ON-RECORD--principal-delegate-claims-approval.json +132 -0
  256. package/tests/agentic-board-suite/fixtures/invalid/HO-ATTEN-ACTIONS--child-widens-actions.json +345 -0
  257. package/tests/agentic-board-suite/fixtures/invalid/HO-ATTEN-BUDGET--child-raises-limit.json +132 -0
  258. package/tests/agentic-board-suite/fixtures/invalid/HO-ATTEN-BUDGET--currency-changed.json +132 -0
  259. package/tests/agentic-board-suite/fixtures/invalid/HO-BLOCK-AS-CHALLENGE--block-sent-as-return.json +184 -0
  260. package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-CUSTODY--parent-sender-continues-unstopped.json +187 -0
  261. package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-CUSTODY--reply-from-outside-chain.json +132 -0
  262. package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-PARENT--hop-skips.json +132 -0
  263. package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-TIME--sent-before-parent.json +132 -0
  264. package/tests/agentic-board-suite/fixtures/invalid/HO-DESTINATION-TIER--delegate-to-live-guard.json +132 -0
  265. package/tests/agentic-board-suite/fixtures/invalid/HO-DESTINATION-TIER--delegate-to-untiered-agent.json +132 -0
  266. package/tests/agentic-board-suite/fixtures/invalid/HO-ESCALATE-TO-PRINCIPAL--escalate-to-agent.json +131 -0
  267. package/tests/agentic-board-suite/fixtures/invalid/HO-ESCALATE-TO-PRINCIPAL--escalated-delegate-to-agent.json +132 -0
  268. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-CLASS--classification-lowered.json +346 -0
  269. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-DEADLINE--deadline-extended.json +132 -0
  270. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-MATERIALITY--flag-dropped.json +434 -0
  271. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-MAX-HOPS--max-hops-raised.json +132 -0
  272. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-PROHIBITIONS--prohibition-dropped.json +131 -0
  273. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-SPENT--one-counter-decreases.json +346 -0
  274. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-SPENT--spent-counter-reset.json +346 -0
  275. package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-TIER--tier-lowered.json +346 -0
  276. package/tests/agentic-board-suite/fixtures/invalid/HO-NO-EXECUTION--deploy-authorized.json +133 -0
  277. package/tests/agentic-board-suite/fixtures/invalid/HO-NO-SELF-ADDRESS--challenge-to-self.json +187 -0
  278. package/tests/agentic-board-suite/fixtures/invalid/HO-ONE-CORRELATION--two-correlations.json +132 -0
  279. package/tests/agentic-board-suite/fixtures/invalid/HO-ONE-ROOT--second-root-beside-a-decision.json +410 -0
  280. package/tests/agentic-board-suite/fixtures/invalid/HO-ONE-ROOT--two-roots.json +190 -0
  281. package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-CHALLENGE--challenge-without-payload.json +180 -0
  282. package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-DECISION-RECORD--record-without-payload.json +331 -0
  283. package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-DECISION-REQUEST--request-without-payload.json +324 -0
  284. package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-ESCALATE--escalate-without-payload.json +128 -0
  285. package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-EXCLUSIVE--return-with-escalation.json +136 -0
  286. package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-RETURN--return-without-verdict.json +124 -0
  287. package/tests/agentic-board-suite/fixtures/invalid/HO-REASON-HAS-STATUS--reason-on-completed.json +134 -0
  288. package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-EVIDENCE--pass-on-inference-only.json +132 -0
  289. package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-EVIDENCE--pass-over-blocking-gap.json +137 -0
  290. package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-EVIDENCE--pass-with-no-evidence.json +127 -0
  291. package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-TO-SENDER--return-skips-the-delegator.json +185 -0
  292. package/tests/agentic-board-suite/fixtures/invalid/HO-ROOT-PARENT--root-with-parent.json +132 -0
  293. package/tests/agentic-board-suite/fixtures/invalid/HO-SCHEMA--unknown-credential-field.json +133 -0
  294. package/tests/agentic-board-suite/fixtures/invalid/HO-STOP-NOTE--conflict-without-note.json +133 -0
  295. package/tests/agentic-board-suite/fixtures/invalid/HO-STOPPED-HAS-REASON--stopped-without-reason.json +132 -0
  296. package/tests/agentic-board-suite/fixtures/invalid/HO-UNIQUE-TASK-ID--duplicate-task-id.json +198 -0
  297. package/tests/agentic-board-suite/fixtures/invalid/STOP-BUDGET--budget-undeclared.json +123 -0
  298. package/tests/agentic-board-suite/fixtures/invalid/STOP-BUDGET--return-overspent.json +132 -0
  299. package/tests/agentic-board-suite/fixtures/invalid/STOP-CHALLENGE-ROUNDS--revisions-carried-in-rebuttal-challenges.json +461 -0
  300. package/tests/agentic-board-suite/fixtures/invalid/STOP-CHALLENGE-ROUNDS--third-round.json +454 -0
  301. package/tests/agentic-board-suite/fixtures/invalid/STOP-CHALLENGE-ROUNDS--third-version-by-return-naming-the-original.json +461 -0
  302. package/tests/agentic-board-suite/fixtures/invalid/STOP-DEADLINE--sent-after-deadline.json +132 -0
  303. package/tests/agentic-board-suite/fixtures/invalid/STOP-DEPTH--depth-undeclared.json +182 -0
  304. package/tests/agentic-board-suite/fixtures/invalid/STOP-INSTRUCTION-BAIT--claimed-approval-dispatched.json +132 -0
  305. package/tests/agentic-board-suite/fixtures/invalid/STOP-LIVE-GUARD--mutation-dispatched.json +130 -0
  306. package/tests/agentic-board-suite/fixtures/invalid/STOP-MISSING-EVIDENCE--blocking-gap-dispatched.json +137 -0
  307. package/tests/agentic-board-suite/fixtures/invalid/STOP-MISSING-EVIDENCE--decision-request-blocking-gap.json +351 -0
  308. package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--exchanges-on-the-original-envelope.json +381 -0
  309. package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--loop-undeclared.json +182 -0
  310. package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--revisit-to-challenger-of-another-party.json +256 -0
  311. package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--second-revisit-to-challenger.json +540 -0
  312. package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--challenge-answers-stopped-delegate.json +247 -0
  313. package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--decision-on-escalated-request.json +353 -0
  314. package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--decision-on-stopped-request.json +422 -0
  315. package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--reply-to-stopped-delegate.json +244 -0
  316. package/tests/agentic-board-suite/fixtures/invalid/VC-BENEFIT-CEILING--benefit-above-baseline.json +436 -0
  317. package/tests/agentic-board-suite/fixtures/invalid/VC-COST-SIGN--negative-risk-loss.json +436 -0
  318. package/tests/agentic-board-suite/fixtures/invalid/VC-COST-SIGN--risk-loss-low-minus-one.json +436 -0
  319. package/tests/agentic-board-suite/fixtures/invalid/VC-COUNTERFACTUALS--single-agent-counterfactual-missing.json +427 -0
  320. package/tests/agentic-board-suite/fixtures/invalid/VC-COUNTERFACTUALS--workflow-counterfactual-missing.json +427 -0
  321. package/tests/agentic-board-suite/fixtures/invalid/VC-NAV-ARITHMETIC--nav-off-by-one.json +436 -0
  322. package/tests/agentic-board-suite/fixtures/invalid/VC-ORDER--inverted-range.json +436 -0
  323. package/tests/agentic-board-suite/fixtures/invalid/VC-OVERSIGHT--free-oversight.json +436 -0
  324. package/tests/agentic-board-suite/fixtures/invalid/VC-PROMOTION--measured-but-not-incremental.json +436 -0
  325. package/tests/agentic-board-suite/fixtures/invalid/VC-PROMOTION--promoted-on-estimate.json +436 -0
  326. package/tests/agentic-board-suite/fixtures/invalid/VC-RECOMMEND-INCREMENTAL--recommend-non-incremental.json +436 -0
  327. package/tests/agentic-board-suite/fixtures/invalid/VC-RUNS-BOUND--more-successes-than-runs.json +436 -0
  328. package/tests/agentic-board-suite/fixtures/invalid/VC-SYNTHETIC--synthetic-claims-measured.json +436 -0
  329. package/tests/agentic-board-suite/fixtures/invalid/VC-UNIT-COST--no-successes-nonzero-cost.json +436 -0
  330. package/tests/agentic-board-suite/fixtures/invalid/VC-UNIT-COST--unit-cost-mismatch.json +436 -0
  331. package/tests/agentic-board-suite/fixtures/valid/v01-r0-single-review.json +129 -0
  332. package/tests/agentic-board-suite/fixtures/valid/v01x-block-return-on-inference.json +125 -0
  333. package/tests/agentic-board-suite/fixtures/valid/v01x-block-return-to-principal.json +125 -0
  334. package/tests/agentic-board-suite/fixtures/valid/v01x-pass-return-documentation-evidence.json +129 -0
  335. package/tests/agentic-board-suite/fixtures/valid/v01x-pass-return-mixed-evidence.json +133 -0
  336. package/tests/agentic-board-suite/fixtures/valid/v01x-pass-return-nonblocking-gap.json +134 -0
  337. package/tests/agentic-board-suite/fixtures/valid/v02-r2-architecture-dissent.json +343 -0
  338. package/tests/agentic-board-suite/fixtures/valid/v02x-challenge-after-decision.json +407 -0
  339. package/tests/agentic-board-suite/fixtures/valid/v02x-challenge-after-record-same-second.json +464 -0
  340. package/tests/agentic-board-suite/fixtures/valid/v02x-redispatch-after-cured-stop.json +534 -0
  341. package/tests/agentic-board-suite/fixtures/valid/v02x-security-proposal-returned-to-its-delegator.json +407 -0
  342. package/tests/agentic-board-suite/fixtures/valid/v03-investment-loses-to-workflow.json +433 -0
  343. package/tests/agentic-board-suite/fixtures/valid/v04-r3-hard-gate-risk-acceptance.json +354 -0
  344. package/tests/agentic-board-suite/fixtures/valid/v04x-live-hard-gate-recommend-escalate.json +354 -0
  345. package/tests/agentic-board-suite/fixtures/valid/v04x-live-hard-gate-recommend-reject.json +354 -0
  346. package/tests/agentic-board-suite/fixtures/valid/v05-live-guard-escalation.json +129 -0
  347. package/tests/agentic-board-suite/fixtures/valid/v06-r5-dual-approval.json +430 -0
  348. package/tests/agentic-board-suite/fixtures/valid/v06x-co-sign-same-second.json +430 -0
  349. package/tests/agentic-board-suite/fixtures/valid/v06x-re-asked-r5-decision-co-signed-again.json +662 -0
  350. package/tests/agentic-board-suite/fixtures/valid/v06x-unsigned-approve-superseded-by-co-signed-reject.json +588 -0
  351. package/tests/agentic-board-suite/fixtures/valid/v07-depth-and-routing-loop.json +180 -0
  352. package/tests/agentic-board-suite/fixtures/valid/v08-budget-exhausted.json +186 -0
  353. package/tests/agentic-board-suite/fixtures/valid/v09-instruction-bait.json +131 -0
  354. package/tests/agentic-board-suite/fixtures/valid/v09x-requester-restates-after-bait.json +251 -0
  355. package/tests/agentic-board-suite/fixtures/valid/v10-r1-optional-challenge.json +184 -0
  356. package/tests/agentic-board-suite/fixtures/valid/v10x-report-up-after-challenge.json +246 -0
  357. package/tests/agentic-board-suite/fixtures/valid/v11-two-rounds-hard-gate-withdrawn.json +478 -0
  358. package/tests/agentic-board-suite/fixtures/valid/v11x-designated-challenge-first-answer-over-cap.json +598 -0
  359. package/tests/agentic-board-suite/fixtures/valid/v11x-interleaved-challenger-round-two.json +604 -0
  360. package/tests/agentic-board-suite/fixtures/valid/v11x-proposal-handed-to-the-challenger-capped.json +860 -0
  361. package/tests/agentic-board-suite/fixtures/valid/v11x-round-three-escalation-path.json +747 -0
  362. package/tests/agentic-board-suite/fixtures/valid/v11x-same-second-round-two.json +478 -0
  363. package/tests/agentic-board-suite/fixtures/valid/v11x-two-findings-one-round.json +549 -0
  364. package/tests/agentic-board-suite/fixtures/valid/v12-superseded-request.json +497 -0
  365. package/tests/agentic-board-suite/fixtures/valid/v12x-challenge-after-the-first-decision.json +566 -0
  366. package/tests/agentic-board-suite/fixtures/valid/v12x-late-challenge-cured-by-supersede.json +566 -0
  367. package/tests/agentic-board-suite/fixtures/valid/v12x-supersede-in-the-same-second.json +497 -0
  368. package/tests/agentic-board-suite/test_agentic_board.py +502 -0
  369. package/tests/fixtures/README.md +1 -1
  370. package/tests/fuzz-properties.test.mjs +254 -0
  371. package/tests/mods.test.mjs +768 -0
  372. package/tests/validate-agent-tool-tiers.py +7 -5
  373. package/tests/validate-asset-integrity.py +1 -0
  374. package/tests/validate-mods.py +821 -0
@@ -0,0 +1,107 @@
1
+ # Delegation and handoff review
2
+
3
+ Use this reference after the pattern is chosen, to review how work and authority move between agents, tools and humans. The review is static: it reads the design, the contracts and the configuration that were supplied. It does not exercise any handoff.
4
+
5
+ ## Topology and delegation boundaries
6
+
7
+ Draw the delegation graph from the supplied evidence before judging it. Nodes are agents, workers, tools and humans. Edges are delegations and handoffs. Mark on each node its trust domain, permission set and the highest data classification it touches, and mark where a human gate sits.
8
+
9
+ For every edge, answer:
10
+
11
+ - Who may delegate to whom, and is that written down or only implied by a prompt?
12
+ - What travels with the delegation: the objective, the inputs, the permissions, the budget, the deadline, the prohibitions?
13
+ - What comes back, in what shape, and who validates it before the next step uses it?
14
+ - Who owns the outcome? Exactly one accountable owner per outcome; a delegating agent still owns what it delegates until it has verified the result.
15
+ - Is the hop justified? Each hop adds latency, cost and a failure surface. Prefer shallow topologies and demand a reason for each added level (`inference`).
16
+
17
+ Delegation is a privilege boundary. If a child needs authority its parent does not hold, that is an escalation to a human or to a different principal, not a delegation. Identity, token handling and confused-deputy paths belong to the security agent: see [identity and delegated authorization](../../agentic-security-review/references/identity-and-delegated-authorization.md) and hand the question over instead of answering it here.
18
+
19
+ ## Routing confidence and fallback
20
+
21
+ A router that always picks something is guessing. Review these points:
22
+
23
+ - Does the router emit a score, a confidence, or an explicit unclassified outcome? Unclassified must stop the flow and ask or escalate, never fall through to a default specialist that can act.
24
+ - Where does the threshold come from: a labeled routing set that was measured, or a number someone chose? An unmeasured threshold is `inference`.
25
+ - What happens on a tie, or when two specialists both match? Serialize, run read-only first, or ask; do not pick at random.
26
+ - Is there loop detection (A routes to B routes to A) and a cap on re-routing?
27
+ - Is the fallback side-effect free? A human queue or a read-only answer is a safe fallback; a default action-taking agent is not.
28
+ - Is an action-taking specialist ever reachable by classification alone? Prefer a human or policy gate in front of any specialist whose tools mutate state.
29
+
30
+ Repository pattern (`repo-evidence`): this repository's maestro routing gate in `tests/validate-maestro-routing.py` models an unclassified mode on zero score, and its live-guard agents are never auto-dispatched. Adopters can mirror the shape; the gate itself only checks this repository's fixtures.
31
+
32
+ Plan-only scenarios to request from the owner: an ambiguous input, an input that names a specialist the user should not reach, an empty input, and an input that matches two specialists equally.
33
+
34
+ ## Handoff contract review
35
+
36
+ A handoff is a contract between two parties that may fail independently. Review it as one. The board's own contract, [schemas/agentic-handoff.schema.json](../../../../schemas/agentic-handoff.schema.json), is a worked example. This reference does not restate its rules; the fields, the message types and the rule list live in the [handoff envelope reference](../../agentic-board-protocol/references/handoff-envelope.md).
37
+
38
+ Ask of the design under review:
39
+
40
+ - Is the handoff schema versioned, and is it validated at the receiving boundary rather than trusted because the sender is "one of ours"?
41
+ - Does it carry the objective as a question, evidence references with labels, missing evidence flagged as blocking or not, the budget, the deadline, the permitted actions, the prohibitions, the data classification and the risk tier?
42
+ - Is the channel closed? A side channel (shared scratchpad, free-form chat, a shared memory key) that bypasses the contract defeats it.
43
+ - What does the receiver do with a malformed handoff: reject, or repair silently? Reject, and report.
44
+ - Do handoffs carry secrets? They must not. Credentials belong to the runtime's identity layer, not the message.
45
+ - Does each handoff carry a correlation identifier so the whole task can be reconstructed later?
46
+
47
+ What a valid handoff does not prove: a schema checks shape only. Whether the sender is who it claims to be, whether it is authorized to send, and whether an approval really happened are runtime properties. The repository's rule module (`python3 tests/agentic-board-suite/agentic_board_rules.py <record-set.json>`) checks internal consistency of a record set offline; it authenticates nothing and enforces nothing at runtime. State this limit when the design relies on the contract for assurance.
48
+
49
+ ## Privilege attenuation down chains
50
+
51
+ Authority should only narrow down a delegation chain, and sensitivity should only rise. Concretely, check that each child has no permitted action, budget, deadline, depth allowance or data reach larger than its parent's, and that the risk tier, data classification, materiality flags and prohibitions never shrink.
52
+
53
+ Review questions:
54
+
55
+ - Can a child be given a tool its parent lacks?
56
+ - Does a child inherit the parent's credentials wholesale, or is it issued its own narrower, shorter-lived grant? (Credential handling goes to the security agent.)
57
+ - Does a returned result carry authority back up the chain (an output that an upstream agent treats as an instruction)?
58
+ - Is attenuation enforced by the runtime, or only written in a prompt or schema?
59
+
60
+ The board encodes monotonic attenuation as checkable fields; see the [handoff envelope reference](../../agentic-board-protocol/references/handoff-envelope.md). Encoding is not enforcement. A schema rule that passes offline does not stop a runtime from granting more.
61
+
62
+ ## Loop and recursion bounds
63
+
64
+ Every loop needs a bound that the runtime enforces, not one the model is asked to respect. Check for:
65
+
66
+ - a maximum delegation depth and a maximum number of iterations per agent,
67
+ - a round limit on critic, debate and challenge loops,
68
+ - a task-level budget (tokens, tool calls, cost, wall-clock) shared down the tree,
69
+ - repetition and no-progress detection (same tool, same arguments, same state),
70
+ - what happens at the bound: stop and escalate, not "best effort."
71
+
72
+ The board's computed stop conditions for depth, deadline, budget, missing evidence, routing loops and challenge rounds are defined in the [stop conditions reference](../../agentic-board-protocol/references/stop-conditions.md). They are fixture checks over envelope fields run by an offline gate. They are not runtime containment. Whether the design under review contains a loop at runtime is reviewed in [reliability and containment](reliability-and-containment.md).
73
+
74
+ ## Human-in-the-loop placement
75
+
76
+ Place approvals where a wrong action is costly or irreversible, not on every step; constant prompts teach approvers to click through (`inference`). Usual placements: before an irreversible or external side effect, at any privilege escalation, at an unclassified or ambiguous routing result, and at a budget overrun.
77
+
78
+ Review questions:
79
+
80
+ - Can the system pause and resume? An approval that holds a connection open for hours is a durability defect. See [state, memory and durability](state-memory-and-durability.md).
81
+ - Is the approver an authenticated individual, and is the approval bound to the exact action proposed (for example by a digest of the request) rather than to the agent's summary of it? The board binds a decision to a request by a sha256 digest of its canonical form; see the [decision record reference](../../agentic-board-protocol/references/decision-record.md). Authenticating the approver is a runtime task.
82
+ - What happens on approval timeout or an unavailable approver? Fail closed: no action.
83
+ - Can the agent re-ask with different wording until it gets a yes? Cap and log repeated requests.
84
+ - Does the approval prompt show the real action and its arguments, or only a model-written description? A persuasive description can be an instance of Human-Agent Trust Exploitation (OWASP ASI09, per https://genai.owasp.org/2025/12/09/owasp-top-10-for-agentic-applications-the-benchmark-for-agentic-security-in-the-age-of-autonomous-ai/); hand it to the security agent.
85
+ - Does any agent approve its own or another agent's work? Agents never record approvals under the board contract.
86
+
87
+ ## A2A task lifecycle as a resumability boundary
88
+
89
+ When agents communicate over the Agent2Agent protocol, the task lifecycle marks where work can pause and where it ends. From the specification at https://a2a-protocol.org/latest/specification/ (the latest released revision when this was verified on 2026-10-30; verify against the revision your implementation targets):
90
+
91
+ - Interrupted states are INPUT_REQUIRED and AUTH_REQUIRED. The task is waiting on something outside the agent.
92
+ - Terminal states are COMPLETED, FAILED, CANCELED and REJECTED.
93
+ - The full state list, per the same specification (https://a2a-protocol.org/latest/specification/), is SUBMITTED, WORKING, COMPLETED, FAILED, CANCELED, INPUT_REQUIRED, REJECTED and AUTH_REQUIRED, spelled with a TASK_STATE_ prefix in the enumeration. The full enumeration was not re-verified here; check it against the revision you target.
94
+
95
+ Design consequences to review:
96
+
97
+ - An interrupted state is a durable wait, not a blocked thread. The design must persist what it needs to resume: the task identifier, the context, the pending question, and who must answer. It needs a timeout for a task never resumed. See [state, memory and durability](state-memory-and-durability.md).
98
+ - A terminal state ends the task's lifecycle. Treat a retry as a new task unless the specification revision you target says otherwise.
99
+ - State updates can repeat. Handle a duplicate transition idempotently.
100
+ - Does the client treat REJECTED and FAILED differently? Verify what each means in the revision you target, and check that the follow-up behavior matches it.
101
+ - AUTH_REQUIRED is not authorization. The specification states that agents "MUST NOT treat the TASK_STATE_AUTH_REQUIRED state transition, by itself, as authorization for any particular operation", and that a credential obtained in that state "MUST NOT be assumed to authorize subsequent messages on the Task unless that behavior is explicitly defined by the implementation, credential issuer, or extension". Review the lifecycle here; hand the authorization aspect, including security schemes and Agent Card signatures, to `agentic-security-review-agent`.
102
+
103
+ ## What to hand off
104
+
105
+ - Authentication, delegated authorization, token handling, Agent Card trust: `agentic-security-review-agent`.
106
+ - MCP tool-schema fidelity and protocol version for tools exposed over MCP: `typescript-mcp-tool-contract-agent`.
107
+ - How to measure routing accuracy and task completion: `llm-ai-pipeline-test-review-agent`.
@@ -0,0 +1,81 @@
1
+ # Pattern selection
2
+
3
+ Use this reference to decide the lowest sufficient pattern for an agentic system and to read an orchestration design for its failure modes. It covers the technical rungs only. The business rungs eliminate, redesign and keep the existing process come before them, and the conventional-automation rung (rules engines, ERP-native matching, scripts, RPA) sits between the deterministic-workflow rung and the single-agent rung. The [value case reference](../../agentic-board-protocol/references/value-case.md) owns those business rungs and the value case. If the design under review never faced them, say so and route the question there instead of answering it here.
4
+
5
+ Everything below is design judgment, labeled `inference`, unless a cell names a source. Framework facts come only from the delegate research snapshot further down this file, are labeled `documentation-based`, and carry the source lists stated there.
6
+
7
+ ## The technical rungs
8
+
9
+ | Rung | Enter when | Evidence demanded | Move up only when |
10
+ |---|---|---|---|
11
+ | Deterministic workflow | Steps and branches are known at design time, inputs are structured or can be normalized, and each step can be tested alone. A step may call a model (classify, extract, draft) without making the flow agentic. | The step list or graph; the branch conditions; which steps call a model and why rules cannot replace that call; behavior on each step's failure; where state lives between steps. | The set of paths cannot be enumerated because the next step depends on what a tool or document returns, and a sample of real cases shows the workflow's branches miss some of them. |
12
+ | Single agent with tools | The path depends on observed results, the tool set is small and bounded, one permission set and one trust domain cover every tool, and the conventional-automation alternative was considered and rejected with a reason (see the value case reference). | A tool list with the permission each tool needs; turn, tool-call and cost caps; an evaluation showing the agent reaches the outcome (design it with `llm-ai-pipeline-test-review-agent`); why a workflow with a model step was insufficient. | One of the four needs below is demonstrated and a single agent with a better prompt or more tools does not meet it. |
13
+ | Multi-agent | At least one of the four needs below is demonstrated with evidence rather than asserted. | Evidence for each need claimed; the extra cost (model calls, latency, handoff surfaces, failure modes) accepted by the owner; the controls listed for the pattern in use. | Top rung. Re-justify it whenever the need changes. |
14
+
15
+ ### The four needs that can justify more than one agent
16
+
17
+ | Need | Counts as evidence | Does not count |
18
+ |---|---|---|
19
+ | Separation of duties | A requirement or control that names the separation; the agents hold different permission sets and, ideally, different contexts, so the producer cannot verify or approve its own output. | Two prompts on the same tools with the same context. |
20
+ | Parallelism | Independent subtasks (no shared writes) and a latency or throughput target that a sequential run misses, with measured or modeled timings. | "It might be faster." |
21
+ | Context-window limits | Token measurements on real inputs showing the task does not fit one context, and an evaluation showing that summarizing or retrieving on demand loses decisive information. | An assumption with no measurement; retrieval or chunking never tried. |
22
+ | Distinct tool permission sets | A tool-to-permission map showing the sets differ and cannot be merged without widening any principal's access. | One permission set split into prompt personas. |
23
+
24
+ A claim of multi-agent need that supplies none of this evidence is `inference`. The verdict is simpler-pattern-sufficient, and the finding names the lower rung and what it would look like. Every extra agent adds model calls, a handoff surface and failure modes; the owner should accept that cost knowingly.
25
+
26
+ ## Orchestration patterns as vendor-neutral concepts
27
+
28
+ A pattern is a shape of control flow, not a product. Most frameworks can express several of these, and a graph framework can express a deterministic workflow. Review the pattern first and the framework second.
29
+
30
+ | Pattern | Use when | Failure modes | Control required |
31
+ |---|---|---|---|
32
+ | Supervisor or manager-worker | Subtasks differ in skill or permission and one coordinator must integrate the results. | Coordinator becomes a bottleneck and a single point of failure; worker output enters the coordinator's context as data that may carry instructions; unbounded re-delegation. | Depth and re-delegation cap; per-worker budget carved from the coordinator's; worker output treated as data; the coordinator can never widen a worker's permissions. |
33
+ | Sequential pipeline | Stages are known, ordered and dependent. | An early mistake is laundered by later stages; no stage owns the end-to-end result. | Schema-validated stage boundaries; per-stage idempotency; stop on a failed validation instead of repairing silently. |
34
+ | Concurrent fan-out and fan-in | Subtasks are independent and the merge rule is defined. | Fan-out explosion; partial failure; merge conflicts; cost spikes; inconsistent reads. | Fan-out cap; per-branch timeout; an explicit partial-result policy; a deterministic merge rule. |
35
+ | Handoff or routing | A specialist should own the next step, or a router classifies the task. | Misrouting; routing loops; lost context; privilege carried across the handoff; guessing at low confidence. | A confidence threshold with an explicit unclassified outcome; hop cap; loop detection; minimal context transfer; attenuation of authority. |
36
+ | Group chat or debate | Adversarial challenge adds value and its token cost is accepted. | Runaway conversation; agreement that comes from a shared model family; no deterministic termination; token blowup. | Round cap; a terminator condition outside the model; a transcript budget. Independence between same-model participants is procedural, not epistemic. |
37
+ | Planner-executor-verifier | A plan can be validated before execution and verification costs less than the error it prevents. | Plan and execution drift; the verifier shares the executor's blind spots; a poisoned plan. | Executor limited to the plan's steps; a verifier with its own context and permissions; a digest binding approval to the exact plan. |
38
+ | Generator-critic loop | Output quality improves under critique and acceptance criteria are objective. | Oscillation; endless refinement; the generator gaming the critic. | Iteration cap; objective acceptance criteria; stop when an iteration produces no improvement. |
39
+ | Event-driven | Work is asynchronous, long-lived, or integrates with existing queues and systems. | Duplicate and out-of-order delivery; poison messages; event loops and storms; hidden coupling. | Idempotent consumers; a dead-letter path; versioned event schemas; a loop breaker; a stated ordering assumption. See [webhook delivery: dedup and ordering](../../revenue-critical-journey-integrity-review/references/webhook-delivery-dedup-ordering.md) for the consumer-side checks. |
40
+ | Graph or stateful workflow | Control flow branches or cycles, needs pause and resume, or needs human approval mid-run. | State schema drift between versions; checkpoint bloat; cycles that never terminate; conflicting writes to shared state. | State schema versioning; checkpoint retention; a cycle bound; defined merge rules for shared state. |
41
+
42
+ ## Framework primitives (research snapshot)
43
+
44
+ Versions drift. Verify against Context7 or the official docs for the installed version before asserting any cell about the system under review. No version numbers are recorded here on purpose. The cells come from a delegate research pass on 2026-10-30 and are labeled `documentation-based`. Not every cell maps to a page listed under the table, and none was re-verified against an installed version. Treat the table as a lead for the review, not as a finding.
45
+
46
+ | Framework | Orchestration primitive | Human-approval primitive | Persistence and replay | Caveat |
47
+ |---|---|---|---|---|
48
+ | LangGraph | StateGraph, subgraphs, Functional API | interrupt() resumed with Command(resume=); needs a checkpointer | Checkpointers keyed by thread_id | The langgraph-supervisor library is archived; its README, as researched, recommends building the supervisor from tools. Verify which checkpointer backend is configured and whether it survives a restart. |
49
+ | OpenAI Agents SDK | Handoffs, Agent.as_tool(), guardrails | needs_approval produces interruptions; RunState approve or reject | Sessions retrieve and store conversation history; the docs list Dapr, Temporal, Restate and DBOS integrations separately, for durable orchestration of long waits, retries and process restarts | Pre-stable release line; the research noted breaking changes between minor releases, so pin and re-verify. |
50
+ | Microsoft Agent Framework | Sequential, concurrent, handoff, group chat and magentic orchestrations | RequestPort and request_info; tool approval; plan review in magentic | Superstep checkpoints; a Durable Task extension exists but its status was not verified | The research characterized the durability options as Azure-oriented; verify the extension's status and scope. |
51
+ | Google ADK | Sequential, Parallel and Loop agents plus LLM delegation; the newer major line adds graph and dynamic workflows (whether they supersede the first three is not stated on adk.dev/workflows; unverified) | Graph RequestInput; Tool Confirmation (marked Experimental) | SessionService; the in-memory implementation is lost on restart | A2A support was marked Experimental. Check which workflow model the installed version offers. |
52
+ | CrewAI | Crews (sequential or hierarchical) and Flows | The @human_feedback decorator | @persist and checkpointing | The default A2A protocol revision was noted as a pre-stable one; compare it with the A2A release you need to interoperate with. |
53
+ | LlamaIndex Workflows | Event-driven steps (@step) | InputRequiredEvent and HumanResponseEvent | Ephemeral by default; Context.to_dict for serialization; a DBOS-backed runtime for durability | A2A support was not established by the research. |
54
+ | Bedrock AgentCore | None. It hosts any framework and is not an orchestrator | Gateway elicitation and Policy | Memory service and Runtime sessions; no workflow replay | Review the hosted framework's orchestration and durability separately. Use `aws-agentcore-agent` for AgentCore specifics. |
55
+ | Temporal | Workflows, activities and timers | Signals and updates with wait_condition | Event-history replay with deterministic workflow code, as reported by the research pass; the page listed below does not show this, so verify against the Temporal documentation for the installed version | The research pass noted official integrations for the OpenAI Agents SDK, LangGraph (public preview) and ADK (pre-release). The listed page is an index and gives no statuses, so verify each integration's status on its own page before relying on it. |
56
+
57
+ Pages the research pass consulted (page-to-claim mapping within each list was not recorded, and a listed page may not support every cell):
58
+
59
+ - LangGraph: https://docs.langchain.com/oss/python/langgraph/persistence and https://docs.langchain.com/oss/python/langgraph/interrupts
60
+ - OpenAI Agents SDK: https://openai.github.io/openai-agents-python/multi_agent/, https://openai.github.io/openai-agents-python/handoffs/, https://openai.github.io/openai-agents-python/human_in_the_loop/ and https://openai.github.io/openai-agents-python/running_agents/
61
+ - Microsoft Agent Framework: https://learn.microsoft.com/agent-framework/workflows/orchestrations/, https://learn.microsoft.com/agent-framework/workflows/checkpoints/ and https://learn.microsoft.com/agent-framework/workflows/human-in-the-loop/
62
+ - Google ADK: https://adk.dev/workflows/, https://adk.dev/sessions/state and https://adk.dev/a2a
63
+ - CrewAI: https://docs.crewai.com/en/concepts/flows
64
+ - LlamaIndex Workflows: https://developers.llamaindex.ai/python/llamaagents/workflows/durable_workflows/
65
+ - Bedrock AgentCore: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/release-notes.html
66
+ - Temporal: https://docs.temporal.io/develop/python/integrations (an integrations index; it does not by itself support the replay, determinism or integration-status cells above)
67
+
68
+ Reading the table:
69
+
70
+ - Durable execution is not native in most agent SDKs. The generalization is `inference`, drawn from the OpenAI Agents SDK row (the docs present sessions and the durable-orchestration integrations as separate things) and the ADK row (in-memory sessions are lost on restart). A multi-agent framework is not a durable workflow, so the review must ask where durability comes from. See [state, memory and durability](state-memory-and-durability.md).
71
+ - AgentCore hosts frameworks rather than orchestrating them. A design that says "AgentCore orchestrates our agents" has an unreviewed orchestration layer.
72
+ - An archived library, an experimental feature, or a preview integration is a finding when the design depends on it for a control (approval, persistence, A2A). Condition the verdict on a verified replacement or an accepted risk.
73
+
74
+ ## Recording the result
75
+
76
+ Write down, for the verdict:
77
+
78
+ - the lowest sufficient rung and the evidence that supports stopping there,
79
+ - each higher rung rejected, with the missing evidence named,
80
+ - for a multi-agent verdict, the demonstrated need from the four above and the controls required for each pattern used,
81
+ - the framework facts relied on, each labeled `context7-grounded` or `documentation-based`, or marked "verify against the official docs for the installed version".
@@ -0,0 +1,86 @@
1
+ # Reliability and cascading-failure containment
2
+
3
+ Use this reference to review whether a failure in one agent, tool, model or tenant stays where it started. Cascading-failure containment is owned here: the board's one-owner table gives it to the architecture review, while attack-driven failures belong to the security agent and unit prices belong to `finops-ai-economist-agent`.
4
+
5
+ Containment is a runtime property. This reference reviews whether the design has it and whether the controls are enforced outside the model. This repository enforces none of it at runtime: its stop conditions are computed over handoff-envelope fields by an offline gate and are fixture checks, not containment (see the [stop conditions reference](../../agentic-board-protocol/references/stop-conditions.md)).
6
+
7
+ ## What a cascade looks like
8
+
9
+ OWASP lists Cascading Failures as ASI08 in its Top 10 for Agentic Applications (per https://genai.owasp.org/2025/12/09/owasp-top-10-for-agentic-applications-the-benchmark-for-agentic-security-in-the-age-of-autonomous-ai/). In design terms the mechanisms to look for are:
10
+
11
+ - retry amplification, where layered retries multiply load on a dependency that is already struggling,
12
+ - fan-out explosion, where one request spawns many subtasks that each spawn more,
13
+ - agent loops that keep spending tokens and tool calls without progress,
14
+ - a slow or failing dependency that grows queues until other work starves,
15
+ - one tenant's workload consuming a shared model quota or worker pool,
16
+ - errors that one agent returns being consumed as facts by the next agent and compounded.
17
+
18
+ If a cascade starts from an attacker's input rather than a fault, hand it to `agentic-security-review-agent`.
19
+
20
+ ## Controls to look for
21
+
22
+ | Control | What to look for | Failure if absent | Evidence to request |
23
+ |---|---|---|---|
24
+ | Budgets per task | Tokens, tool calls, cost, wall-clock and depth, enforced by the runtime and carved down the delegation tree (a child's budget comes out of its parent's). Exhaustion stops the task and escalates; it does not degrade to "best effort". | A single runaway task spends the quota for everyone. | Runtime configuration, not a prompt instruction; a trace of a task hitting its limit. |
25
+ | Fan-out caps | Maximum parallel branches and maximum total subtasks per task, a per-branch timeout, and a stated partial-result policy. | Exponential spawning; partial results presented as complete. | The cap values and where they are enforced. |
26
+ | Circuit breakers on tool and model calls | Per-dependency breakers that open on error rate or latency, probe before closing, and have a defined fallback while open. | Retries pile onto a failing dependency; the failure spreads upstream. | Breaker settings per dependency; the fallback each breaker triggers. |
27
+ | Bulkheads | Separate pools, queues and quotas between tenants and between workflows, with per-tenant rate and budget limits. | One tenant or one workflow starves the rest. | Quota and queue topology; the per-tenant limit values. |
28
+ | Loop and no-progress detection | Detection of repeated tool calls with the same arguments, repeated state, and iterations without improvement, with a hard cap. | Silent loops that look like long-running work. | The detector, its thresholds, and the action it takes. |
29
+ | Backpressure and load shedding | Bounded queues; early rejection with a clear status instead of unbounded buffering. | Latency grows without bound, then everything times out at once. | Queue bounds; the behavior at the bound. |
30
+ | Degraded modes and safe fallbacks | A defined behavior per dependency: serve cached or read-only results, route to a human queue, or return a partial result with an explicit flag. Fail closed for authorization and approval dependencies: when the approval service is down, nothing executes. Fail open only for non-safety features and only by explicit decision. | Ad hoc behavior during an outage, often fail-open. | The fallback table, and the owner's decision for each fail-open choice. |
31
+ | Kill switch and disengage path | The ability to stop one task, one tenant, one agent type, or the whole system without a deployment; named roles who may pull it; defined effect on in-flight tasks (pause, cancel, or compensate); tested. | A misbehaving system cannot be stopped quickly. | Runbook, the access list, and the date of the last drill. |
32
+
33
+ Treat a fallback model as a different dependency: it may have different data handling and different guardrails. A breaker that switches models must not change authorization or data residency (`inference`).
34
+
35
+ ### Kill switch and the NIST AI RMF
36
+
37
+ NIST AI RMF MANAGE 2.4 addresses mechanisms to supersede, disengage, or deactivate AI systems (per https://airc.nist.gov/airmf-resources/airmf/5-sec-core/; read the subcategory text there for its exact wording). Use it as a candidate mapping aid when an owner asks which framework language a kill-switch finding relates to. It is not a claim that any design satisfies the subcategory; an accountable owner confirms any mapping. The same page carries the banner "The AI RMF 1.0 is being updated. A revised version is in progress." so re-check the subcategory text before citing it.
38
+
39
+ ## SLOs for agent tasks
40
+
41
+ An agent system that has no service objectives cannot tell a regression from a bad day. Ask for:
42
+
43
+ - Task success rate, with success defined against a quality bar that an evaluation measures. Design the evaluation with `llm-ai-pipeline-test-review-agent`.
44
+ - Time to completion as a distribution, including the tail where retries and loops show up.
45
+ - Human intervention rate and escalation rate. A rising intervention rate is a cost the value case must carry.
46
+ - Cost per successful task, reported as a distribution and not as a mean.
47
+ - An error-budget policy: what changes when an objective is burned. A reasonable default is to freeze changes that expand autonomy until the budget recovers (`inference`).
48
+
49
+ On cost, report cost per successful task as a distribution rather than a mean, per https://www.finops.org/wg/finops-for-ai-overview/; the definition and the formula live in the [value case reference](../../agentic-board-protocol/references/value-case.md), and unit prices for models and tokens are not owned here.
50
+
51
+ This repository holds no baseline for any of these objectives. An adopter measures its own.
52
+
53
+ ## Observability hooks
54
+
55
+ Caveat first. Per https://github.com/open-telemetry/semantic-conventions-genai, the OpenTelemetry GenAI semantic conventions are maintained in that repository and are at Development status, which means no stability guarantee. Never present them as a stable contract. Pin the convention version in the telemetry configuration and expect renames (`inference`).
56
+
57
+ Span names recorded in the agent-spans page (per https://raw.githubusercontent.com/open-telemetry/semantic-conventions-genai/main/docs/gen-ai/gen-ai-agent-spans.md):
58
+
59
+ - create_agent {gen_ai.agent.name}
60
+ - invoke_agent {gen_ai.agent.name}
61
+ - invoke_workflow, used as the operation name
62
+
63
+ Per https://github.com/open-telemetry/semantic-conventions-genai, an execute_tool {gen_ai.tool.name} span and these attributes are also listed: gen_ai.operation.name, gen_ai.agent.id, gen_ai.agent.name, gen_ai.agent.version, gen_ai.conversation.id, gen_ai.usage.input_tokens, gen_ai.usage.output_tokens, gen_ai.tool.name, gen_ai.tool.call.id, gen_ai.provider.name and gen_ai.request.model. That list was not independently re-verified; check the repository for the version in use.
64
+
65
+ What to review in the design:
66
+
67
+ - Can one task be reconstructed end to end: delegation hops, tool calls, retries, approvals, and breaker state changes? A single trace or correlation identifier must follow the task across handoffs. The board's handoff contract carries correlation and task identifiers for the same reason; see the [handoff envelope reference](../../agentic-board-protocol/references/handoff-envelope.md).
68
+ - Are budgets spent and limits hit visible as events or metrics?
69
+ - Do spans and attributes carry prompts, tool arguments or results? They may hold sensitive data. Apply the data classification and redaction before export.
70
+ - Is observability mistaken for audit? Traces are commonly sampled and mutable. Audit evidence needs an append-only store owned by the deploying runtime; this repository stores no audit records.
71
+
72
+ ## What to hand off
73
+
74
+ - Attack-driven cascades, poisoned inputs, and abuse of the kill switch: `agentic-security-review-agent`.
75
+ - Evaluation design for success-rate objectives: `llm-ai-pipeline-test-review-agent`.
76
+ - Model and token unit prices: `finops-ai-economist-agent`.
77
+ - Value-case treatment of oversight and run cost: the protocol value case.
78
+
79
+ ## Plan-only containment probes to request
80
+
81
+ This skill never runs them. Ask the owner for the results, or for a plan to obtain them:
82
+
83
+ - a tabletop drill of the kill switch against a task that holds a pending side effect,
84
+ - a scenario in which one dependency becomes slow, to see which breakers open and what fallback each triggers,
85
+ - a runaway-loop scenario that must hit the budget cap and stop,
86
+ - a noisy-tenant scenario, to see whether other tenants' latency and quota are protected.
@@ -0,0 +1,102 @@
1
+ # State, memory and durability
2
+
3
+ Use this reference to review what an agentic system remembers, what survives a failure, and what happens when a step runs twice. Pattern selection decides who does what; this decides what persists and what is safe to repeat.
4
+
5
+ Memory poisoning (an attacker writing into long-term memory or context) is a security threat owned by the security agent. This reference covers memory as a state-lifecycle concern only; for the threat, see [tools, memory and data reach](../../agentic-security-review/references/tools-memory-and-data-reach.md).
6
+
7
+ ## State scope
8
+
9
+ Every piece of state belongs to one scope. Ask for an inventory that names, for each scope, the owner, the schema and its version, the store, the retention, the deletion path, the isolation key, and who may read and write.
10
+
11
+ | Scope | Typically holds | Lifetime | Isolation key | Review questions |
12
+ |---|---|---|---|---|
13
+ | Per task | Working state, intermediate results, pending approvals, tool-call results | Until the task ends plus an audit retention period | Task identifier | Is it checkpointed? Who can read it after the task ends? Does it copy restricted data into a lower-classified store? |
14
+ | Per conversation or session | Message history, summaries | The session | Session identifier within a tenant | What bounds its growth? Is a summary treated as a trusted source later? |
15
+ | Per user or tenant | Long-term memory, preferences, cached retrievals | Until deleted or expired | Tenant and user keys enforced by the store | Is isolation enforced by the store or only by a prompt? Does it expire? |
16
+ | Per system | Configuration, prompts, tool registries, caches | Until redeployed | Environment | Is a change versioned and attributable? |
17
+
18
+ Isolation that exists only in a prompt ("only use this tenant's data") is not isolation (`inference`). Request evidence that the store enforces the partition key on reads and writes, and a plan-only cross-tenant retrieval test.
19
+
20
+ ## Memory isolation, retention and deletion
21
+
22
+ - Retention. Every memory class needs an explicit expiry or a documented reason to have none. Long-term memory with no expiry and no review is a finding.
23
+ - Deletion. A deletion request must reach every copy: the memory store, checkpoints, replicas, caches, vector indexes, derived summaries, and any recorded execution history that captured the data. Deleting the memory store while checkpoints still hold the same content is a failed deletion.
24
+ - Replay history. Where a system replays from recorded history, payloads in that history fall inside the deletion scope. Ask how the engine supports redaction or expiry of recorded payloads, and verify against its docs for the installed version. Prefer recording references to data over recording the data itself (`inference`).
25
+ - Classification travels with state. Restricted data must not be checkpointed or summarized into a store with a lower classification.
26
+ - Backups. State the backup policy for deleted data; "deleted" and "removed from backups after N days" are different claims and should be stated separately.
27
+
28
+ ## Checkpointing
29
+
30
+ A checkpoint is what lets a task resume after a pause or a failure. Review:
31
+
32
+ - What is captured: state after each side-effecting step, the pending approval, the tool results already obtained, and the position in the flow.
33
+ - Granularity. Checkpointing only at the end of a task defeats the purpose; checkpointing every token is wasteful. Ask what the design loses on a crash at its worst moment.
34
+ - Resume semantics. Resuming from the last checkpoint re-executes whatever came after it. Any side effect in that window must be safe to repeat; see idempotency below.
35
+ - Schema versioning. What happens to in-flight tasks when the state schema or the flow definition changes on deploy?
36
+ - Retention and size. Checkpoints grow and may hold sensitive data; they need the same retention and deletion treatment as other state.
37
+
38
+ Framework checkpoint primitives (for example LangGraph checkpointers keyed by thread identifier, and Microsoft Agent Framework superstep checkpoints, per the sources in [pattern selection](pattern-selection.md)) are documentation-based leads. Verify the backend and its restart behavior for the installed version.
39
+
40
+ ## Finding: agent session storage is not durable execution
41
+
42
+ State this finding whenever a design calls session or history storage "durable":
43
+
44
+ - Per https://openai.github.io/openai-agents-python/running_agents/, OpenAI Agents SDK sessions automatically retrieve conversation history before each run and store new messages after each run. The same page lists separate integrations (Dapr, Temporal, Restate and DBOS) as "durable orchestration when runs may span long waits, retries, or process restarts". The page does not say whether sessions are or are not durable execution.
45
+ - Per https://adk.dev/sessions/state, the in-memory session service is lost when the process restarts.
46
+ - Both facts are `documentation-based` and were not verified against an installed version. The conclusion drawn from them is `inference`: a store of conversation history does not by itself record which side effects a run already performed, or resume a half-finished run at the step that failed. The generalization that durable execution is not native in most agent SDKs is also `inference`. Verify the installed version.
47
+
48
+ The review test: kill the process mid-task. Where does the task resume, what does it repeat, what is lost, and who finds out? A design that cannot answer has no durable execution regardless of how much history it stores.
49
+
50
+ Durable execution is needed when a task waits for a human or an external event, runs longer than a request, has side effects that must take effect once, or carries a completion commitment. It is not needed for a short single-request flow whose steps are read-only or idempotent; there, retrying the whole request is a valid design. Severity guidance: block when a multi-step process with side effects, long waits or approvals has no durable mechanism and a failure scenario is reachable; otherwise make it a condition.
51
+
52
+ ## Idempotency keys for side-effecting tool calls
53
+
54
+ A tool call that changes state needs a way to be repeated safely, because retries, resumes and replays will repeat it.
55
+
56
+ - Generate the key before the call and store it with the result. A fresh random key per attempt defeats the purpose: derive it from the stable identity of the business operation and the step.
57
+ - Bind the key to the recorded decision, not to regenerated text. A model may produce different arguments on a second attempt; the key and the arguments must be recorded together and reused.
58
+ - The receiving system must deduplicate on the key and return the original result on a repeat. If the tool does not support keys, wrap it with an outbox or a check-then-act under a uniqueness constraint, or do not retry it automatically.
59
+ - Define the key's scope and lifetime. A key that expires before the longest retry or resume window protects nothing.
60
+ - The repository's own live-guard contract requires an idempotency key generated before the write and recorded in the audit log (docs/execution-tiers.md, `repo-evidence`). That contract governs this repository's gated guards, not your system, but it is a usable reference shape.
61
+
62
+ For money-moving and account-creating seams see [idempotency and safe retries](../../revenue-critical-journey-integrity-review/references/idempotency-and-safe-retries.md).
63
+
64
+ ## Timeouts, retries and backoff
65
+
66
+ - Every external call, including model calls, has a timeout.
67
+ - Retries are bounded: a cap on attempts, exponential backoff with jitter, and a cap on delay. Retry only errors classified as transient. A side-effecting call without an idempotency key is not retried automatically.
68
+ - Retries share a task-level budget. Layered retries (client, gateway, agent, tool) multiply; count them across layers and charge them to the task.
69
+ - Separate transient failures (rate limits, timeouts) from content failures. A model output that fails schema validation gets a bounded number of repair attempts and then stops and escalates; it does not loop.
70
+ - Retrying a model call changes the output. If the first output was already acted on, a retry is a different decision, not a repeat.
71
+
72
+ ## Compensation (saga) design
73
+
74
+ When a task spans systems with no shared transaction, plan the undo as part of the design.
75
+
76
+ - Each step has a compensating action, or is explicitly marked non-compensable.
77
+ - Identify the pivot step, the point after which the task can only move forward, and put the human approval and the highest scrutiny immediately before it.
78
+ - Compensations are idempotent and retried like any other step.
79
+ - A failed compensation has a defined owner and path, normally a human queue, not silence.
80
+ - Partial completion is visible to users and operators; a half-done task must not look finished.
81
+ - A compensating action is itself a mutation and needs the same authorization as the original. Under the board contract, agents recommend compensations; they never execute them.
82
+
83
+ ## Replay safety
84
+
85
+ Where a runtime recovers by replaying recorded history, the replayed code must reach the same decisions every time.
86
+
87
+ - Durable-workflow engines such as Temporal are reported to recover by replaying recorded event history, which requires deterministic workflow code. This reference did not corroborate that against a primary page, so treat it as a lead and verify against the Temporal documentation for the installed version.
88
+ - Nondeterministic work (model calls, tool calls, clock reads, random numbers) must run as recorded activity or step results, so a replay reuses the recorded result instead of calling again.
89
+ - Review: is the model call inside the replayed workflow function, or in a recorded step? A model call in the replayed path will return something different on replay.
90
+ - Are the prompt version, model identifier and tool schema version recorded beside each result, so an investigator can see which version produced it?
91
+ - What happens to in-flight tasks on a deploy that changes the flow? Ask for the versioning strategy.
92
+ - A low sampling temperature is not determinism (`inference`). Do not accept it as a substitute for recorded results.
93
+
94
+ ## Plan-only probes to request
95
+
96
+ This skill never runs them. Ask the owner for the results, or for a plan to obtain them:
97
+
98
+ - kill the process between a side effect and its checkpoint, then resume,
99
+ - deliver the same input or event twice,
100
+ - let an approval expire and confirm nothing executes,
101
+ - delete one user's data and check checkpoints, indexes and summaries,
102
+ - deploy a state schema change while a task is paused.
@@ -0,0 +1,135 @@
1
+ # Workflow and output contract
2
+
3
+ Use this reference for an end-to-end architecture review of an agentic system. It fixes the order of the steps and the shape of the result so two reviews of the same design converge on the same findings. The review is static: it reads what was supplied and executes nothing.
4
+
5
+ ## Workflow
6
+
7
+ 1. **Classify the scope.**
8
+ - Identify what was supplied (design document, code, configuration, trace export) and whether the system is single-vendor. A single-vendor system goes to that vendor's agent; a system that composes vendors or a custom framework stays here for the seams. The routing list is in the skill.
9
+ - Name the decision under review and its canonical risk tier, R0 to R5, using the [risk tier crosswalk](../../agentic-board-protocol/references/risk-tier-crosswalk.md). The envelope's tier is the tier of the decision under review; the board's own work is static review. Never invent or redefine an R-label.
10
+ - Set materiality flags from the schema's list: financial, regulatory, security-critical, external-communication, personal-data, irreversible. A flag forces full-depth review and escalation to a principal. It never changes the tier.
11
+ - The decision class is architecture.
12
+ 2. **Gather evidence.**
13
+ - List every evidence reference with its label: `live-evidence`, `repo-evidence`, `user-provided-sanitized-evidence`, `context7-grounded`, `documentation-based`, or `inference`.
14
+ - List missing evidence and mark each item blocking or not. Blocking missing evidence means stop and escalate to a principal; do not guess. See the [stop conditions reference](../../agentic-board-protocol/references/stop-conditions.md).
15
+ - Ground framework API claims in Context7 for the installed version when the harness provides it. Otherwise write "verify against the official docs for the installed version".
16
+ - Redact and flag any credential-shaped string that appears in the material. Do not echo it.
17
+ 3. **Find the lowest sufficient pattern.** Walk the rungs in [pattern selection](pattern-selection.md) from the bottom. Record each rejected rung with the missing evidence that rejects it. Before accepting the single-agent rung, check that the conventional-automation alternative was considered (see the [value case reference](../../agentic-board-protocol/references/value-case.md)); if it was not, say so and route that question to the protocol instead of answering it here.
18
+ 4. **Review delegation and handoff.** Use [delegation and handoff review](delegation-and-handoff-review.md): topology, routing fallback, handoff contract, attenuation, loop bounds, human placement, and the A2A lifecycle if A2A is in use.
19
+ 5. **Review state and durability.** Use [state, memory and durability](state-memory-and-durability.md): scope, isolation and deletion, checkpointing, idempotency, retries, compensation, replay.
20
+ 6. **Review reliability and containment.** Use [reliability and containment](reliability-and-containment.md): budgets, caps, breakers, bulkheads, fallbacks, kill switch, SLOs, observability.
21
+ 7. **Reach the verdict.** Pick exactly one outcome.
22
+ - pass: the pattern is the lowest sufficient one and no finding stands.
23
+ - pass-with-conditions: the pattern is acceptable and each condition is specific and verifiable.
24
+ - block: a finding with a reachable failure scenario in the design as documented has no accepted fix.
25
+ - simpler-pattern-sufficient: a lower rung meets the stated need and the proposed topology lacks a demonstrated need. Return this even when the proposed topology also has blocking findings, and list them so they are not reintroduced.
26
+ Block only on a failure scenario you can describe from the evidence. A general unease is not a block.
27
+ 8. **Hand the verdict to the designated challenger.** For an architecture decision the designated challenger is `agentic-security-review-agent`. Send it a delegate envelope whose objective is a review question ("Assess whether ..."), not an instruction, with attenuated actions, a budget, a deadline and a do-not-do list, per the [handoff envelope reference](../../agentic-board-protocol/references/handoff-envelope.md). At R0 and R1 without materiality flags the challenge is optional under the protocol, but still name the designated challenger in the result. Its challenge references your verdict; the challenge round limit is in the stop conditions reference. Record the challenge outcome as it comes; never delete an unresolved one. Independence here is procedural, not epistemic: a separate contract and context, possibly the same underlying model family.
28
+ 9. **Raise the decision request.** For R2 and above, with any materiality flag, or for an automation-investment decision, the protocol requires an attached challenge and at least one materially different alternative, and a decision request addressed to a human principal with dissent preserved. For R0 and R1 without materiality flags the challenge is optional and a return envelope with the verdict is enough. See the [decision record reference](../../agentic-board-protocol/references/decision-record.md). Agents never decide and never record an approval.
29
+
30
+ ## Output template
31
+
32
+ ```markdown
33
+ # Architecture review: <system name>
34
+
35
+ Verdict: <pass | pass-with-conditions | block | simpler-pattern-sufficient> - one sentence.
36
+ Status: proposal. Not approved. Designated challenger: <agent id>. Decision owner: a human principal.
37
+
38
+ ## Scope
39
+ - Supplied: <artifacts and their evidence labels>
40
+ - Decision class: architecture. Canonical risk tier of the decision under review: <R0-R5>.
41
+ - Materiality flags: <list or none>. Single-vendor or cross-vendor: <which>.
42
+
43
+ ## Lowest sufficient pattern
44
+ <rung> - why it is sufficient, and the evidence.
45
+
46
+ ### Rungs considered and rejected
47
+ | Rung | Rejected because | Missing evidence |
48
+ |---|---|---|
49
+
50
+ ## Findings
51
+ | ID | Severity | Area | Failure scenario | Evidence label | Fix direction | Verification step |
52
+ |---|---|---|---|---|---|---|
53
+
54
+ Severity is blocking (reachable failure scenario, no accepted fix), condition (acceptable only with a named, verifiable change), or advisory.
55
+
56
+ ## Evidence and gaps
57
+ - Evidence used, each with its label.
58
+ - Missing evidence, each marked blocking or not.
59
+ - Not reviewed here or runtime-only: <list>
60
+
61
+ ## Handoffs
62
+ - <agent id>: <what it receives and why>
63
+
64
+ ## Decision request
65
+ <For R2 and above, with any flag, or for automation investment: alternatives, challenges, dissent, recommended outcome. Otherwise state that the challenge is optional per the protocol.>
66
+ ```
67
+
68
+ Rules for the result:
69
+
70
+ - Every finding carries a failure scenario that says how the design reaches a wrong outcome. A finding without one is an opinion; drop it or mark it advisory.
71
+ - Never present a framework fact without its label or a "verify against the official docs for the installed version" note.
72
+ - Never write that a design satisfies a framework or is certified or compliant. A mapping is a candidate that an accountable owner confirms.
73
+ - Never include credentials, tokens, tenant identifiers, names or email addresses.
74
+
75
+ ## Example verdict (synthetic)
76
+
77
+ This example is invented for illustration. No real system, team or data is described.
78
+
79
+ Scenario: a fictional team proposes a five-agent group-chat design (intake, classifier, researcher, resolver, reviewer) to triage invoice disputes for a non-production pilot. A sanitized design document was supplied.
80
+
81
+ ```markdown
82
+ # Architecture review: invoice dispute triage (synthetic)
83
+
84
+ Verdict: simpler-pattern-sufficient - a deterministic workflow with two model steps and a human approval meets the stated need.
85
+ Status: proposal. Not approved. Designated challenger: agentic-security-review-agent. Decision owner: a human principal.
86
+
87
+ ## Scope
88
+ - Supplied: design document (user-provided-sanitized-evidence).
89
+ - Decision class: architecture. Canonical risk tier of the decision under review: R2 (pilot scoped to a non-production environment).
90
+ - Materiality flags: financial. The flag forces a designated challenge and a principal decision; it does not change the tier.
91
+
92
+ ## Lowest sufficient pattern
93
+ Deterministic workflow: classify the dispute into the fixed taxonomy (one model call), fetch facts with fixed read-only tools, draft a reply (one model call), require a human approval before any credit request, then create the request with an idempotency key.
94
+
95
+ ### Rungs considered and rejected
96
+ | Rung | Rejected because | Missing evidence |
97
+ |---|---|---|
98
+ | Single agent with tools | The path does not depend on open-ended tool results; the taxonomy is fixed and enumerable (inference). Revisit if disputes need open-ended investigation. | A sample of disputes the fixed branches miss |
99
+ | Multi-agent | None of the four needs is demonstrated: all five agents hold the same tools and context, the steps are sequential, and no context-size measurement was supplied. | Any evidence for separation of duties, parallelism, context limits, or distinct permissions |
100
+
101
+ ## Findings
102
+ | ID | Severity | Area | Failure scenario | Evidence label | Fix direction | Verification step |
103
+ |---|---|---|---|---|---|---|
104
+ | F1 | blocking (as proposed) | Separation of duties | The reviewer agent holds the resolver's tools and context, so it agrees with the resolver's mistaken credit request and nothing independent stops it. | user-provided-sanitized-evidence | Replace the reviewer agent with a human approval before any credit request. | Confirm no credit request path exists without an approval step. |
105
+ | F2 | condition | Durability | A dispute waits days for a customer reply while state sits in the framework's default in-memory session; a restart loses the task and the late reply has nothing to resume. | inference (verify the installed version's restart behavior) | Persist pending disputes in a durable store keyed by dispute identifier. | Kill the process mid-wait in a pilot environment and resume. |
106
+ | F3 | condition | Loop bounds | The group chat has no round cap; two agents that disagree on classification alternate until the budget of the whole pilot is spent. | user-provided-sanitized-evidence | Drop the group chat; cap any critic step at a fixed round count. | Review the configured cap and where it is enforced. |
107
+ | F4 | condition | Idempotency | The credit-request call has no idempotency key, so a retry after a timeout can create two requests. | user-provided-sanitized-evidence | Derive a key from the dispute identifier and the step. | Replay the same dispute twice in a pilot environment. |
108
+
109
+ ## Evidence and gaps
110
+ - Design document: user-provided-sanitized-evidence.
111
+ - Missing, not blocking: measured token counts for real disputes; a sample of disputes the fixed taxonomy misses.
112
+ - Not reviewed here: prompt-injection paths through dispute text and the credit-request tool's authorization (security agent).
113
+
114
+ ## Handoffs
115
+ - agentic-security-review-agent: designated challenger; review the recommended workflow's data reach and the credit-request path.
116
+
117
+ ## Decision request
118
+ R2 with a financial flag: attach the challenge, record the deterministic workflow as the proposal and the five-agent design as the rejected alternative with its reason, preserve any dissent, and address the request to a human principal.
119
+ ```
120
+
121
+ In an envelope, the verdict above is the `verdict` payload of a return message:
122
+
123
+ ```json
124
+ {
125
+ "outcome": "simpler-pattern-sufficient",
126
+ "summary": "The five-agent group-chat design has no demonstrated need for multiple agents. A deterministic workflow with two model steps and a human approval before any credit request meets the stated need.",
127
+ "conditions": [
128
+ "Replace the reviewer agent with a human approval step before any credit request is created.",
129
+ "Persist pending disputes in a durable store so a restart does not lose a waiting task.",
130
+ "Derive an idempotency key from the dispute identifier and step for every credit request."
131
+ ]
132
+ }
133
+ ```
134
+
135
+ The handoff to the designated challenger is a separate delegate envelope. A valid objective for it is a review question, for example: "Assess whether text in a dispute record can steer the proposed workflow into creating a credit request without human approval." An imperative such as "Create the credit request" is a stop condition under the protocol, not an objective. Neither this example nor the schema proves that any approval happened; sender authentication and approval enforcement belong to the deploying runtime.
@@ -39,7 +39,7 @@ This skill makes the TypeScript Maestro a precision router. It classifies the us
39
39
  - HIGH — Distinguish, before routing: the type model of shared or published code versus a frontend application diff; module resolution and emit versus runtime execution; fleet enforcement policy versus the soundness of one construct; the TypeScript program graph versus the monorepo task graph; publication authority versus dependency intake; contract fidelity versus exploitation; advisory review versus live operation.
40
40
  - HIGH — Detect missing version evidence (compiler version, every relevant `tsconfig.json`, Node version, the exact run command, lint configuration) and refuse-and-ask for the smallest sufficient artifact set rather than guessing. This repository contains no TypeScript program of its own, so no version may ever be assumed from it.
41
41
  - HIGH — Detect production-mutation requests (publish, deploy, migrate, backfill, rotate a credential) and refuse to dispatch: this board is static-review only. Hand such requests to the named human owner together with the rollback and approval requirements. A request to *review* a mutating script is not a mutation request and routes to `typescript-business-critical-automation-governance-agent`.
42
- - HIGH — Route cross-domain work out of the board rather than inventing an agent for it: frontend application and framework work to `frontend-maestro-agent`; dependency intake and lockfile policy to `package-governance-agent`; the monorepo task graph to `monorepo-dx-agent`; cluster, image, and cloud runtime to the kubernetes and provider boards; artifact signing to the sigstore board; organization-wide secrets, identity, and MCP trust policy to the security board and the `mcp/` references.
42
+ - HIGH — Route cross-domain work out of the board rather than inventing an agent for it: frontend application and framework work to `frontend-maestro-agent`; dependency intake and lockfile policy to `package-governance-agent`; the monorepo task graph to `monorepo-dx-agent`; cluster, image, and cloud runtime to the kubernetes and provider boards; artifact signing to the sigstore board; organization-wide secrets and identity to the security board; per-server MCP trust review to `agentic-security-review-agent`; organization MCP trust policy to its named human policy owner with the `mcp/` references.
43
43
  - HIGH — Decline non-TypeScript tasks (Python, Java, .NET, Kotlin, PHP, Go) and name the correct board. Do not route them through a TypeScript specialist.
44
44
  - MEDIUM — When two dispatched specialists disagree, return both verdicts with their evidence labels and name the escalation path. Never pick a winner the router has no basis to pick, and never suppress the disagreement.
45
45
  - MEDIUM — Label any reasoning offered as `documentation-based` or `inference`, and never invent a specialist that is not in the routing table.
@@ -8,7 +8,7 @@ The thirteen domains, the signals that select each one, and the boundaries that
8
8
  - `build-graph-performance` owns the TypeScript program graph measured with evidence; `monorepo-dx-agent` on the frontend board owns the task graph and remote caching. A request to speed something up without a measurement is a refuse-and-ask, not a dispatch.
9
9
  - `static-enforcement-policy` owns what the toolchain must prove and at what cost across packages; `type-soundness` owns whether one construct is sound. A question about which flags or lint rules the fleet must run routes to enforcement; a question about whether a specific predicate lies routes to soundness.
10
10
  - `package-publication-integrity` owns publish authority, provenance, and what ships in the tarball; dependency intake, lockfile policy, and install-time scripts belong to `package-governance-agent` on the frontend board.
11
- - `mcp-tool-contract` owns whether a declared MCP tool contract matches its TypeScript handler; transport, hosting, and organization MCP trust policy belong to the security board and the `mcp/` references, and vendor connectors to their own agents.
11
+ - `mcp-tool-contract` owns whether a declared MCP tool contract matches its TypeScript handler; whether to trust a specific third-party MCP server belongs to `agentic-security-review-agent`; transport and hosting belong to the `mcp/` references; organization MCP trust policy belongs to its named human policy owner; vendor connectors belong to their own agents.
12
12
  - `engineering-economics` is never dispatched first: it consumes measurements another specialist produced and refuses to originate one. A cost question with no supplied measurements routes to the specialist who can measure it, not to economics.
13
13
 
14
14
  ## Routing table
@@ -25,7 +25,7 @@ This skill decides whether a declared MCP tool contract matches what its TypeScr
25
25
  ## When not to use
26
26
 
27
27
  - The question is where to host the server or which transport to use — route to the `mcp/` references and the security board.
28
- - The question is whether to trust a third-party MCP server — route to the security board.
28
+ - The question is whether to trust a third-party MCP server — route to `agentic-security-review-agent`.
29
29
  - The connector is a vendor-specific product with its own agent — route to that agent.
30
30
  - The question is application-side validation unrelated to a declared MCP tool schema — route to `typescript-runtime-boundary-contract-agent`.
31
31
  - The task requires actually running or hosting the server — this skill is static-review only.