ai-delivery-workflow 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +45 -14
  2. package/bin/ai-delivery.mjs +181 -6
  3. package/bin/benchmark-autonomy.mjs +217 -0
  4. package/bin/release-check.mjs +382 -0
  5. package/docs/CLI-PARAMETER-REFERENCE.zh-CN.md +346 -0
  6. package/docs/CODEGRAPH-INTEGRATION.zh-CN.md +89 -0
  7. package/docs/DUAL-REPOSITORY-WORKSPACE.zh-CN.md +2 -2
  8. package/docs/EVOLUTION-MAINTENANCE.zh-CN.md +7 -7
  9. package/docs/EVOLUTION-USER-GUIDE.zh-CN.md +2 -2
  10. package/docs/FILE-REFERENCE.zh-CN.md +120 -39
  11. package/docs/MAINTENANCE-VERIFICATION.zh-CN.md +51 -0
  12. package/docs/MOCK-SYSTEM.zh-CN.md +141 -0
  13. package/docs/NPM-RELEASE-MANAGEMENT.zh-CN.md +106 -0
  14. package/docs/PROJECT-MANUAL.zh-CN.md +154 -95
  15. package/docs/PROTOTYPE-MIGRATION.zh-CN.md +164 -0
  16. package/docs/STATE-CLI-MAINTENANCE.zh-CN.md +35 -17
  17. package/docs/STATE-CLI-USER-GUIDE.zh-CN.md +115 -39
  18. package/docs/VIEWER-MAINTENANCE.zh-CN.md +101 -324
  19. package/docs/VIEWER-USER-GUIDE.zh-CN.md +68 -190
  20. package/docs/adr/0001-prototype-first-ui-governance.md +3 -0
  21. package/docs/adr/0002-microcks-as-default-mock-system.md +3 -0
  22. package/docs/adr/0003-workflow-manager-governed-control-surface.md +46 -0
  23. package/docs/adr/0004-operational-carbon-visual-standard.md +9 -0
  24. package/docs/adr/0005-prototype-management-as-routed-pages.md +7 -0
  25. package/docs/agents/domain.md +12 -0
  26. package/docs/agents/issue-tracker.md +27 -0
  27. package/docs/agents/triage-labels.md +11 -0
  28. package/docs/agents/workflow-manager-acceptance-matrix.md +93 -0
  29. package/docs/agents/workflow-manager-agent-interface.md +145 -0
  30. package/docs/agents/workflow-manager-current-state.md +205 -0
  31. package/lib/artifact-files.mjs +47 -0
  32. package/lib/codegraph.mjs +405 -0
  33. package/lib/delivery-state.mjs +3079 -198
  34. package/lib/frontend-guard.mjs +288 -0
  35. package/lib/fs-utils.mjs +53 -0
  36. package/lib/history-anchor.mjs +98 -0
  37. package/lib/mock-scenario-pack.mjs +687 -0
  38. package/lib/mock-system.mjs +897 -0
  39. package/lib/npm-package-result.mjs +11 -0
  40. package/lib/png-evidence.mjs +149 -0
  41. package/lib/project-bootstrap.mjs +96 -55
  42. package/lib/project-installer.mjs +1484 -164
  43. package/lib/project-migration.mjs +1193 -0
  44. package/lib/prototype-migration.mjs +713 -0
  45. package/lib/prototype-page-review.mjs +384 -0
  46. package/lib/prototype-review-target.mjs +334 -0
  47. package/lib/prototype-revision.mjs +812 -0
  48. package/lib/stable-value.mjs +15 -0
  49. package/lib/toml-hooks.mjs +69 -0
  50. package/lib/ui-acceptance.mjs +565 -0
  51. package/lib/visual-standard.mjs +232 -0
  52. package/lib/workflow-manager-contracts.mjs +367 -0
  53. package/lib/workflow-manager-facts.mjs +778 -0
  54. package/lib/workflow-manager-governance.mjs +514 -0
  55. package/lib/workflow-manager-mock.mjs +183 -0
  56. package/lib/workflow-manager-prototypes.mjs +1847 -0
  57. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  58. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  59. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  60. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  61. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  62. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  63. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  64. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  65. package/lib/workflow-manager-public/assets/index-Chlg6r8f.css +1 -0
  66. package/lib/workflow-manager-public/assets/index-E-hGB5ZD.js +13 -0
  67. package/lib/workflow-manager-public/fonts/OFL-1.1.txt +90 -0
  68. package/lib/workflow-manager-public/index.html +14 -0
  69. package/lib/workflow-manager-systems.mjs +519 -0
  70. package/lib/workflow-manager-transaction.mjs +397 -0
  71. package/lib/workflow-manager.mjs +745 -0
  72. package/package.json +8 -2
  73. package/skills/ai-delivery-assemble-release/agents/openai.yaml +3 -3
  74. package/skills/ai-delivery-assemble-release/assets/release-material-index.csv +1 -1
  75. package/skills/ai-delivery-assemble-release/assets/version-inclusion.csv +1 -1
  76. package/skills/ai-delivery-bootstrap/SKILL.md +4 -4
  77. package/skills/ai-delivery-bootstrap/agents/openai.yaml +3 -3
  78. package/skills/ai-delivery-bootstrap/references/bootstrap-contract.md +4 -2
  79. package/skills/ai-delivery-checkpoint-task/SKILL.md +17 -3
  80. package/skills/ai-delivery-checkpoint-task/agents/openai.yaml +3 -3
  81. package/skills/ai-delivery-checkpoint-task/assets/runtime-template/task.json +7 -1
  82. package/skills/ai-delivery-checkpoint-task/references/checkpoint-contract.md +22 -8
  83. package/skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs +91 -0
  84. package/skills/ai-delivery-checkpoint-task/scripts/task-state.mjs +1086 -51
  85. package/skills/ai-delivery-close-version/SKILL.md +9 -8
  86. package/skills/ai-delivery-close-version/agents/openai.yaml +3 -3
  87. package/skills/ai-delivery-close-version/assets/version-lineage.yaml +1 -1
  88. package/skills/ai-delivery-close-version/references/version-closeout-contract.md +2 -2
  89. package/skills/ai-delivery-define-product/SKILL.md +8 -4
  90. package/skills/ai-delivery-define-product/agents/openai.yaml +4 -4
  91. package/skills/ai-delivery-define-product/references/product-contract.md +2 -2
  92. package/skills/ai-delivery-deploy-production/agents/openai.yaml +3 -3
  93. package/skills/ai-delivery-design-architecture/SKILL.md +9 -5
  94. package/skills/ai-delivery-design-architecture/assets/architecture-template/prototype-architecture-validation.yaml +16 -16
  95. package/skills/ai-delivery-design-architecture/references/architecture-contract.md +1 -1
  96. package/skills/ai-delivery-design-experience/SKILL.md +36 -30
  97. package/skills/ai-delivery-design-experience/agents/openai.yaml +4 -4
  98. package/skills/ai-delivery-design-experience/assets/experience-template/LEGACY-COMPATIBILITY.md +16 -0
  99. package/skills/ai-delivery-design-experience/assets/experience-template/design-reference-selection.yaml +32 -0
  100. package/skills/ai-delivery-design-experience/assets/experience-template/experience-baseline.yaml +2 -2
  101. package/skills/ai-delivery-design-experience/assets/experience-template/formal-ui-confirmation.yaml +16 -3
  102. package/skills/ai-delivery-design-experience/assets/experience-template/frontend-change-scope.yaml +30 -0
  103. package/skills/ai-delivery-design-experience/assets/experience-template/interaction-contract.csv +1 -1
  104. package/skills/ai-delivery-design-experience/assets/experience-template/mock-admin-export.yaml +8 -0
  105. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-mappings.csv +1 -0
  106. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-pack-request.yaml +24 -0
  107. package/skills/ai-delivery-design-experience/assets/experience-template/product-prototype-reconciliation.yaml +2 -1
  108. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-adjustment-log.csv +1 -1
  109. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-bindings.csv +1 -0
  110. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-candidates.csv +1 -0
  111. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-components.csv +1 -0
  112. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-confirmation.yaml +18 -18
  113. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-data-contracts.csv +1 -0
  114. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-impact-assessment.yaml +5 -5
  115. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-implementation-bindings.csv +1 -0
  116. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-manifest.yaml +2 -0
  117. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-pages.csv +1 -0
  118. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-product-coverage.csv +1 -1
  119. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-comments.csv +1 -1
  120. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-decision.yaml +13 -12
  121. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-scenes.csv +1 -0
  122. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-sessions.csv +1 -1
  123. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-unit-pages.csv +1 -0
  124. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-units.csv +1 -0
  125. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-revision.yaml +88 -0
  126. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-routes.csv +1 -0
  127. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-set.yaml +2 -0
  128. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-source-inspection-snapshots.csv +1 -0
  129. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-terminals.csv +1 -0
  130. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-candidates.csv +1 -1
  131. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-selection.yaml +2 -3
  132. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-traceability.csv +1 -1
  133. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-trigger-conditions.csv +1 -0
  134. package/skills/ai-delivery-design-experience/assets/experience-template/prototype.yaml +6 -0
  135. package/skills/ai-delivery-design-experience/assets/experience-template/ui-framework-selection.yaml +17 -1
  136. package/skills/ai-delivery-design-experience/assets/experience-template/ui-handoff.yaml +6 -5
  137. package/skills/ai-delivery-design-experience/assets/experience-template/ui-mapping.csv +1 -0
  138. package/skills/ai-delivery-design-experience/assets/experience-template/visual-direction.yaml +4 -0
  139. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference-manifest.yaml +23 -0
  140. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference.html +163 -0
  141. package/skills/ai-delivery-design-experience/assets/experience-template/visual-system-confirmation.yaml +11 -0
  142. package/skills/ai-delivery-design-experience/references/experience-contract.md +26 -27
  143. package/skills/ai-delivery-design-experience/references/prototype-management-contract.md +42 -21
  144. package/skills/ai-delivery-design-tests/SKILL.md +13 -7
  145. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-scope.csv +1 -1
  146. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-validation.yaml +17 -16
  147. package/skills/ai-delivery-design-tests/references/test-design-contract.md +7 -5
  148. package/skills/ai-delivery-develop-iteration/SKILL.md +18 -11
  149. package/skills/ai-delivery-develop-iteration/agents/openai.yaml +3 -3
  150. package/skills/ai-delivery-develop-iteration/assets/development-template/candidate-manifest.yaml +36 -0
  151. package/skills/ai-delivery-develop-iteration/assets/development-template/task-prototype-traceability.csv +1 -1
  152. package/skills/ai-delivery-develop-iteration/references/development-contract.md +5 -3
  153. package/skills/ai-delivery-evolve-workflow/agents/openai.yaml +3 -3
  154. package/skills/ai-delivery-execute-test/SKILL.md +6 -2
  155. package/skills/ai-delivery-execute-test/agents/openai.yaml +4 -4
  156. package/skills/ai-delivery-execute-work-package/SKILL.md +10 -3
  157. package/skills/ai-delivery-execute-work-package/agents/openai.yaml +4 -4
  158. package/skills/ai-delivery-execute-work-package/references/work-package-contract.md +1 -1
  159. package/skills/ai-delivery-manage-git/agents/openai.yaml +3 -3
  160. package/skills/ai-delivery-manage-standards/agents/openai.yaml +4 -4
  161. package/skills/ai-delivery-orchestrate/SKILL.md +47 -29
  162. package/skills/ai-delivery-orchestrate/agents/openai.yaml +3 -3
  163. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/migrations/.gitkeep +0 -0
  164. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/repairs/.gitkeep +0 -0
  165. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/project.yaml +1 -0
  166. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/workflow-state.yaml +2 -0
  167. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/frontend-guard/frontend-guard.mjs +50 -0
  168. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/hooks/hook-event.mjs +91 -0
  169. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/manager.mjs +64 -0
  170. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.cmd +4 -0
  171. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.ps1 +2 -0
  172. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/{viewer → manager}/start.sh +1 -1
  173. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/mock/mock.mjs +50 -0
  174. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/ui-acceptance/ui-acceptance.mjs +37 -0
  175. package/skills/ai-delivery-orchestrate/assets/project-template/AGENTS.md +32 -6
  176. package/skills/ai-delivery-orchestrate/assets/project-template/gitignore.template +1 -0
  177. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/CONTRIBUTING.md +25 -0
  178. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/LICENSE +21 -0
  179. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/README.md +250 -0
  180. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/UPSTREAM.yaml +19 -0
  181. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/DESIGN.md +545 -0
  182. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/README.md +5 -0
  183. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/DESIGN.md +554 -0
  184. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/README.md +5 -0
  185. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/DESIGN.md +562 -0
  186. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/README.md +5 -0
  187. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/DESIGN.md +634 -0
  188. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/README.md +5 -0
  189. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/DESIGN.md +544 -0
  190. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/README.md +5 -0
  191. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/DESIGN.md +503 -0
  192. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/README.md +5 -0
  193. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/DESIGN.md +454 -0
  194. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/README.md +5 -0
  195. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/DESIGN.md +542 -0
  196. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/README.md +5 -0
  197. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/DESIGN.md +589 -0
  198. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/README.md +5 -0
  199. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/DESIGN.md +541 -0
  200. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/README.md +5 -0
  201. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/DESIGN.md +544 -0
  202. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/README.md +5 -0
  203. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/DESIGN.md +451 -0
  204. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/README.md +5 -0
  205. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/DESIGN.md +570 -0
  206. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/README.md +5 -0
  207. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/DESIGN.md +506 -0
  208. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/README.md +5 -0
  209. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/DESIGN.md +537 -0
  210. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/README.md +5 -0
  211. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/DESIGN.md +632 -0
  212. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/README.md +5 -0
  213. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/DESIGN.md +504 -0
  214. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/README.md +5 -0
  215. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/DESIGN.md +526 -0
  216. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/README.md +5 -0
  217. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/DESIGN.md +531 -0
  218. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/README.md +5 -0
  219. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/DESIGN.md +578 -0
  220. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/README.md +5 -0
  221. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/DESIGN.md +544 -0
  222. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/README.md +5 -0
  223. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/DESIGN.md +575 -0
  224. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/README.md +5 -0
  225. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/DESIGN.md +670 -0
  226. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/README.md +5 -0
  227. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/DESIGN.md +550 -0
  228. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/README.md +5 -0
  229. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/DESIGN.md +546 -0
  230. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/README.md +5 -0
  231. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/DESIGN.md +125 -0
  232. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/README.md +5 -0
  233. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/DESIGN.md +288 -0
  234. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/README.md +5 -0
  235. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/DESIGN.md +548 -0
  236. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/README.md +5 -0
  237. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/DESIGN.md +298 -0
  238. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/README.md +5 -0
  239. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/DESIGN.md +365 -0
  240. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/README.md +5 -0
  241. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/DESIGN.md +683 -0
  242. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/README.md +5 -0
  243. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/DESIGN.md +746 -0
  244. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/README.md +5 -0
  245. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/DESIGN.md +852 -0
  246. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/README.md +5 -0
  247. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/DESIGN.md +825 -0
  248. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/README.md +5 -0
  249. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/DESIGN.md +773 -0
  250. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/README.md +5 -0
  251. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/DESIGN.md +767 -0
  252. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/README.md +5 -0
  253. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/DESIGN.md +575 -0
  254. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/README.md +5 -0
  255. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/DESIGN.md +649 -0
  256. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/README.md +5 -0
  257. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/DESIGN.md +821 -0
  258. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/README.md +5 -0
  259. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/DESIGN.md +640 -0
  260. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/README.md +5 -0
  261. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/DESIGN.md +539 -0
  262. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/README.md +5 -0
  263. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/DESIGN.md +521 -0
  264. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/README.md +5 -0
  265. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/DESIGN.md +597 -0
  266. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/README.md +5 -0
  267. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/DESIGN.md +661 -0
  268. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/README.md +5 -0
  269. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/DESIGN.md +690 -0
  270. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/README.md +5 -0
  271. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/DESIGN.md +669 -0
  272. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/README.md +5 -0
  273. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/DESIGN.md +589 -0
  274. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/README.md +5 -0
  275. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/DESIGN.md +616 -0
  276. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/README.md +5 -0
  277. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/DESIGN.md +585 -0
  278. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/README.md +5 -0
  279. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/DESIGN.md +636 -0
  280. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/README.md +5 -0
  281. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/DESIGN.md +244 -0
  282. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/README.md +5 -0
  283. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/DESIGN.md +357 -0
  284. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/README.md +5 -0
  285. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/DESIGN.md +551 -0
  286. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/README.md +5 -0
  287. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/DESIGN.md +516 -0
  288. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/README.md +5 -0
  289. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/slack/DESIGN.md +482 -0
  290. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/DESIGN.md +363 -0
  291. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/README.md +5 -0
  292. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/DESIGN.md +246 -0
  293. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/README.md +5 -0
  294. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/DESIGN.md +580 -0
  295. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/README.md +5 -0
  296. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/DESIGN.md +487 -0
  297. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/README.md +5 -0
  298. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/DESIGN.md +462 -0
  299. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/README.md +5 -0
  300. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/DESIGN.md +448 -0
  301. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/README.md +5 -0
  302. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/DESIGN.md +286 -0
  303. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/README.md +5 -0
  304. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/DESIGN.md +339 -0
  305. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/README.md +5 -0
  306. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/DESIGN.md +633 -0
  307. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/README.md +5 -0
  308. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/DESIGN.md +636 -0
  309. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/README.md +5 -0
  310. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/DESIGN.md +736 -0
  311. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/README.md +5 -0
  312. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/DESIGN.md +538 -0
  313. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/README.md +5 -0
  314. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/DESIGN.md +521 -0
  315. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/README.md +5 -0
  316. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/DESIGN.md +526 -0
  317. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/README.md +5 -0
  318. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/DESIGN.md +588 -0
  319. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/README.md +5 -0
  320. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/DESIGN.md +497 -0
  321. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/README.md +5 -0
  322. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/DESIGN.md +544 -0
  323. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/README.md +5 -0
  324. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/DESIGN.md +465 -0
  325. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/README.md +5 -0
  326. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/DESIGN.md +537 -0
  327. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/README.md +5 -0
  328. package/skills/ai-delivery-orchestrate/references/formal-state-contract.md +65 -20
  329. package/skills/ai-delivery-orchestrate/references/workflow-model.md +7 -5
  330. package/skills/ai-delivery-orchestrate-release/SKILL.md +2 -2
  331. package/skills/ai-delivery-orchestrate-release/agents/openai.yaml +4 -4
  332. package/skills/ai-delivery-orchestrate-release/references/release-workflow-contract.md +1 -1
  333. package/skills/ai-delivery-plan-iteration/SKILL.md +11 -4
  334. package/skills/ai-delivery-plan-iteration/agents/openai.yaml +4 -4
  335. package/skills/ai-delivery-plan-iteration/assets/planning-template/scope-manifest.yaml +17 -0
  336. package/skills/ai-delivery-plan-iteration/assets/planning-template/slice-prototype-traceability.csv +1 -1
  337. package/skills/ai-delivery-plan-iteration/references/planning-contract.md +8 -2
  338. package/skills/ai-delivery-prepare-platform/SKILL.md +5 -1
  339. package/skills/ai-delivery-prepare-platform/agents/openai.yaml +4 -4
  340. package/skills/ai-delivery-prepare-release/agents/openai.yaml +4 -4
  341. package/skills/ai-delivery-review-change/SKILL.md +14 -4
  342. package/skills/ai-delivery-review-change/agents/openai.yaml +4 -4
  343. package/skills/ai-delivery-review-change/references/review-contract.md +6 -0
  344. package/skills/ai-delivery-triage-failure/SKILL.md +5 -1
  345. package/skills/ai-delivery-triage-failure/agents/openai.yaml +4 -4
  346. package/skills/ai-delivery-validate-artifacts/SKILL.md +6 -3
  347. package/skills/ai-delivery-validate-artifacts/agents/openai.yaml +4 -4
  348. package/skills/ai-delivery-validate-artifacts/references/artifact-contract.md +13 -13
  349. package/skills/ai-delivery-verify-candidate/SKILL.md +13 -6
  350. package/skills/ai-delivery-verify-candidate/agents/openai.yaml +3 -3
  351. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-request.yaml +19 -0
  352. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-results.yaml +53 -0
  353. package/skills/ai-delivery-verify-candidate/references/candidate-verification-contract.md +10 -2
  354. package/skills/ai-delivery-verify-production/agents/openai.yaml +3 -3
  355. package/skills/ai-delivery-design-experience/assets/experience-template/low-fidelity-confirmation.yaml +0 -32
  356. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/app.js +0 -546
  357. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/index.html +0 -199
  358. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/styles.css +0 -529
  359. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/server.mjs +0 -780
  360. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.cmd +0 -4
  361. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.ps1 +0 -2
@@ -0,0 +1,384 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { stringify as stringifyYaml } from "./yaml-runtime.mjs";
5
+ import { readYamlMapping, resolveContainedPath } from "./artifact-files.mjs";
6
+
7
+ const receiptRootRelative = path.join(".workflow", "delivery", "reviews", "prototype-pages");
8
+ const receiptIdPattern = /^PAGE-REVIEW-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
9
+ const safeIdentityPattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
10
+ const pageIdPattern = /^P[0-9]{2,}(?:-[0-9]{2,})?$/;
11
+ const sceneIdPattern = /^RS[0-9]{4,}$/;
12
+ const sha256Pattern = /^[a-f0-9]{64}$/;
13
+ const evidenceDomains = Object.freeze([
14
+ "page",
15
+ "review_scenes",
16
+ "triggers",
17
+ "routes",
18
+ "ui_mapping",
19
+ "page_sources",
20
+ "shared_components",
21
+ "visual_standard",
22
+ ]);
23
+ const receiptFields = Object.freeze([
24
+ "actor",
25
+ "artifact_type",
26
+ "comment",
27
+ "decided_at",
28
+ "decision",
29
+ "evidence_checksums",
30
+ "iteration_id",
31
+ "page_checksum",
32
+ "page_id",
33
+ "prototype_id",
34
+ "prototype_revision_checksum",
35
+ "prototype_revision_id",
36
+ "rationale",
37
+ "receipt_checksum",
38
+ "receipt_id",
39
+ "scene_checksums",
40
+ "schema_version",
41
+ "terminal_id",
42
+ ]);
43
+
44
+ function stableValue(value) {
45
+ if (Array.isArray(value)) return value.map(stableValue);
46
+ if (!value || typeof value !== "object") return value;
47
+ return Object.fromEntries(
48
+ Object.keys(value).sort().map((key) => [key, stableValue(value[key])]),
49
+ );
50
+ }
51
+
52
+ function digest(value) {
53
+ return crypto.createHash("sha256").update(JSON.stringify(stableValue(value))).digest("hex");
54
+ }
55
+
56
+ function receiptChecksum(receipt) {
57
+ const { receipt_checksum: ignored, ...unsigned } = receipt;
58
+ return digest(unsigned);
59
+ }
60
+
61
+ function mapping(value) {
62
+ return value && typeof value === "object" && !Array.isArray(value);
63
+ }
64
+
65
+ function requireSafeIdentity(value, label) {
66
+ if (typeof value !== "string" || !safeIdentityPattern.test(value)) {
67
+ throw new Error(`${label} is invalid.`);
68
+ }
69
+ }
70
+
71
+ function requireChecksum(value, label) {
72
+ if (typeof value !== "string" || !sha256Pattern.test(value)) {
73
+ throw new Error(`${label} is invalid.`);
74
+ }
75
+ }
76
+
77
+ function validatePrototypePageReviewReceipt(receipt, options = {}) {
78
+ if (!mapping(receipt) || receipt.schema_version !== 1
79
+ || receipt.artifact_type !== "prototype-page-review-receipt"
80
+ || !receiptIdPattern.test(String(receipt.receipt_id || ""))) {
81
+ throw new Error("Prototype Page review receipt identity is invalid.");
82
+ }
83
+ if (Object.keys(receipt).sort().join("\0") !== receiptFields.join("\0")) {
84
+ throw new Error("Prototype Page review receipt fields are invalid.");
85
+ }
86
+ requireSafeIdentity(receipt.prototype_id, "Prototype identity");
87
+ requireSafeIdentity(receipt.prototype_revision_id, "Prototype revision identity");
88
+ requireSafeIdentity(receipt.iteration_id, "Iteration identity");
89
+ requireSafeIdentity(receipt.terminal_id, "Terminal identity");
90
+ if (!pageIdPattern.test(String(receipt.page_id || ""))) {
91
+ throw new Error("Prototype Page review receipt Page identity is invalid.");
92
+ }
93
+ requireChecksum(receipt.prototype_revision_checksum, "Prototype revision checksum");
94
+ requireChecksum(receipt.page_checksum, "Page checksum");
95
+ if (!mapping(receipt.scene_checksums)) {
96
+ throw new Error("Prototype Page review receipt Scene checksums are invalid.");
97
+ }
98
+ for (const [sceneId, checksum] of Object.entries(receipt.scene_checksums)) {
99
+ if (!sceneIdPattern.test(sceneId)) {
100
+ throw new Error("Prototype Page review receipt Scene identity is invalid.");
101
+ }
102
+ requireChecksum(checksum, `Review Scene ${sceneId} checksum`);
103
+ }
104
+ if (!mapping(receipt.evidence_checksums)
105
+ || Object.keys(receipt.evidence_checksums).sort().join("\0") !== [...evidenceDomains].sort().join("\0")) {
106
+ throw new Error("Prototype Page review receipt evidence domains are invalid.");
107
+ }
108
+ for (const domain of evidenceDomains) {
109
+ requireChecksum(receipt.evidence_checksums[domain], `Page evidence ${domain} checksum`);
110
+ }
111
+ if (!new Set(["approved", "changes-requested"]).has(receipt.decision)) {
112
+ throw new Error("Prototype Page review receipt decision is invalid.");
113
+ }
114
+ if (!/^human:[A-Za-z0-9._@/-]+$/.test(String(receipt.actor || ""))) {
115
+ throw new Error("Prototype Page review receipt actor is invalid.");
116
+ }
117
+ if (!new Set(["string", "object"]).has(typeof receipt.rationale)
118
+ || (receipt.rationale !== null && typeof receipt.rationale !== "string")
119
+ || (receipt.comment !== null && typeof receipt.comment !== "string")) {
120
+ throw new Error("Prototype Page review receipt rationale or comment is invalid.");
121
+ }
122
+ if (receipt.decision === "changes-requested" && !String(receipt.rationale || "").trim()) {
123
+ throw new Error("Prototype Page review receipt rationale is required.");
124
+ }
125
+ if (!Number.isFinite(Date.parse(receipt.decided_at || ""))) {
126
+ throw new Error("Prototype Page review receipt decision time is invalid.");
127
+ }
128
+ if (receipt.receipt_checksum !== receiptChecksum(receipt)) {
129
+ throw new Error("Prototype Page review receipt checksum is invalid.");
130
+ }
131
+ if (options.file) {
132
+ const file = path.resolve(options.file);
133
+ const receiptRoot = path.resolve(options.receiptRoot);
134
+ const relative = path.relative(receiptRoot, file);
135
+ const segments = relative.split(path.sep);
136
+ if (!relative || relative.startsWith("..") || path.isAbsolute(relative)
137
+ || segments.length !== 2
138
+ || segments[0] !== receipt.prototype_revision_id
139
+ || !new RegExp(`^${receipt.receipt_id}\\.ya?ml$`, "i").test(path.basename(file))) {
140
+ throw new Error("Prototype Page review receipt file path does not match its identities.");
141
+ }
142
+ }
143
+ return receipt;
144
+ }
145
+
146
+ function active(rows) {
147
+ return rows.filter((row) => row.lifecycle_status === "active");
148
+ }
149
+
150
+ export function buildPrototypePageReviewEvidence(revision, rows) {
151
+ const routeById = new Map(rows.routes.map((route) => [route.route_id, route]));
152
+ const triggerById = new Map(
153
+ rows.trigger_conditions.map((trigger) => [trigger.trigger_condition_id, trigger]),
154
+ );
155
+ const activeMappings = active(rows.ui_mapping);
156
+ const affectedPagesByUnit = new Map();
157
+ for (const relation of rows.review_unit_pages) {
158
+ const pageIds = affectedPagesByUnit.get(relation.review_unit_id) || [];
159
+ pageIds.push(relation.page_id);
160
+ affectedPagesByUnit.set(relation.review_unit_id, pageIds);
161
+ }
162
+ const activeUnits = active(rows.review_units).map((unit) => ({
163
+ ...unit,
164
+ affected_page_ids: [...(affectedPagesByUnit.get(unit.review_unit_id) || [])].sort(),
165
+ }));
166
+ const sceneEvidence = new Map();
167
+ for (const scene of active(rows.review_scenes)) {
168
+ const mappings = activeMappings.filter((mapping) => mapping.review_scene_id === scene.review_scene_id);
169
+ const routes = mappings.flatMap((mapping) => [
170
+ routeById.get(mapping.prototype_route_id),
171
+ routeById.get(mapping.production_route_id),
172
+ ]).filter(Boolean);
173
+ const units = activeUnits.filter((unit) => unit.unit_kind === "review-scene"
174
+ && unit.target_id === scene.review_scene_id);
175
+ const shared = activeUnits.filter((unit) => unit.unit_kind === "shared-component"
176
+ && unit.affected_page_ids.includes(scene.page_id));
177
+ sceneEvidence.set(scene.review_scene_id, digest({
178
+ scene,
179
+ trigger: triggerById.get(scene.trigger_condition_id),
180
+ routes,
181
+ mappings,
182
+ units,
183
+ shared_components: shared,
184
+ visual_standard: revision.visual_standard.checksum,
185
+ }));
186
+ }
187
+
188
+ const pages = new Map();
189
+ for (const page of active(rows.pages)) {
190
+ const scenes = active(rows.review_scenes).filter((scene) => scene.page_id === page.page_id);
191
+ const sceneIds = new Set(scenes.map((scene) => scene.review_scene_id));
192
+ const mappings = activeMappings.filter((mapping) => mapping.page_id === page.page_id);
193
+ const routeIds = new Set(mappings.flatMap((mapping) => [
194
+ mapping.prototype_route_id, mapping.production_route_id,
195
+ ]));
196
+ const pageUnits = activeUnits.filter((unit) => unit.unit_kind === "page"
197
+ && unit.target_id === page.page_id);
198
+ const shared = activeUnits.filter((unit) => unit.unit_kind === "shared-component"
199
+ && unit.affected_page_ids.includes(page.page_id));
200
+ const evidenceChecksums = {
201
+ page: digest(page),
202
+ review_scenes: digest(scenes),
203
+ triggers: digest(scenes.map((scene) => triggerById.get(scene.trigger_condition_id))),
204
+ routes: digest(active(rows.routes).filter((route) => routeIds.has(route.route_id))),
205
+ ui_mapping: digest(mappings),
206
+ page_sources: digest(pageUnits),
207
+ shared_components: digest(shared),
208
+ visual_standard: revision.visual_standard.checksum,
209
+ };
210
+ const sceneChecksums = Object.fromEntries(
211
+ [...sceneIds].sort().map((sceneId) => [sceneId, sceneEvidence.get(sceneId)]),
212
+ );
213
+ pages.set(page.page_id, {
214
+ evidence_checksums: evidenceChecksums,
215
+ scene_checksums: sceneChecksums,
216
+ page_checksum: digest({ evidence_checksums: evidenceChecksums, scene_checksums: sceneChecksums }),
217
+ changed_domains: ["initial-review"],
218
+ review_status: "pending-review",
219
+ });
220
+ }
221
+ return { pages, scenes: sceneEvidence };
222
+ }
223
+
224
+ export function createPrototypePageReviewReceipt(target, page, input, now = () => new Date().toISOString()) {
225
+ const decision = String(input.decision || "").toLowerCase().replaceAll("_", "-");
226
+ if (!new Set(["approved", "changes-requested"]).has(decision)) {
227
+ throw new Error("Page review decision must be approved or changes-requested.");
228
+ }
229
+ const actor = String(input.actor || "");
230
+ if (!/^human:[A-Za-z0-9._@/-]+$/.test(actor)) {
231
+ throw new Error("Page review actor must use a human:<identity> value.");
232
+ }
233
+ const rationale = String(input.rationale || "").trim();
234
+ if (decision === "changes-requested" && !rationale) {
235
+ throw new Error("Page changes-requested decisions require a rationale.");
236
+ }
237
+ if (input.target_checksum !== target.targetChecksum || input.page_checksum !== page.page_checksum) {
238
+ throw new Error("Page review target or Page checksum is stale.");
239
+ }
240
+ if (input.terminal_id !== page.terminal_id) {
241
+ throw new Error("Page review Logical Terminal does not match its Page.");
242
+ }
243
+ const decidedAt = now();
244
+ if (!Number.isFinite(Date.parse(decidedAt))) throw new Error("Page review decision time is invalid.");
245
+ const receipt = {
246
+ schema_version: 1,
247
+ receipt_id: `PAGE-REVIEW-${crypto.randomUUID()}`,
248
+ artifact_type: "prototype-page-review-receipt",
249
+ prototype_id: target.prototypeId,
250
+ prototype_revision_id: target.targetId,
251
+ prototype_revision_checksum: target.targetChecksum,
252
+ iteration_id: target.iterationId,
253
+ terminal_id: page.terminal_id,
254
+ page_id: page.page_id,
255
+ page_checksum: page.page_checksum,
256
+ scene_checksums: page.scene_checksums,
257
+ evidence_checksums: page.evidence_checksums,
258
+ decision,
259
+ actor,
260
+ rationale: rationale || null,
261
+ comment: String(input.comment || "").trim() || null,
262
+ decided_at: decidedAt,
263
+ };
264
+ receipt.receipt_checksum = receiptChecksum(receipt);
265
+ return receipt;
266
+ }
267
+
268
+ export function prototypePageReviewReceiptWrite(projectRoot, receipt) {
269
+ validatePrototypePageReviewReceipt(receipt);
270
+ const receiptRoot = path.join(path.resolve(projectRoot), receiptRootRelative);
271
+ const directory = resolveContainedPath(
272
+ receiptRoot,
273
+ receipt.prototype_revision_id,
274
+ "Prototype Page review receipt revision directory",
275
+ );
276
+ const file = resolveContainedPath(directory, `${receipt.receipt_id}.yaml`, "Prototype Page review receipt");
277
+ if (fs.existsSync(file)) throw new Error(`Prototype Page review receipt already exists: ${receipt.receipt_id}.`);
278
+ return { file, content: stringifyYaml(receipt, { lineWidth: 0 }) };
279
+ }
280
+
281
+ function listReceiptFiles(directory) {
282
+ if (!fs.existsSync(directory)) return [];
283
+ if (!fs.statSync(directory).isDirectory()) throw new Error("Prototype Page review receipt root must be a directory.");
284
+ const files = [];
285
+ const visit = (current) => {
286
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
287
+ const absolute = path.join(current, entry.name);
288
+ if (entry.isSymbolicLink()) throw new Error("Prototype Page review receipts must not contain symbolic links.");
289
+ if (entry.isDirectory()) visit(absolute);
290
+ else if (entry.isFile() && /\.ya?ml$/i.test(entry.name)) files.push(absolute);
291
+ }
292
+ };
293
+ visit(directory);
294
+ return files.sort();
295
+ }
296
+
297
+ export function readPrototypePageReviewReceipts(projectRoot) {
298
+ const receiptRoot = path.join(path.resolve(projectRoot), receiptRootRelative);
299
+ return listReceiptFiles(receiptRoot).map((file) => {
300
+ const receipt = readYamlMapping(file, "Prototype Page review receipt");
301
+ try {
302
+ return validatePrototypePageReviewReceipt(receipt, { file, receiptRoot });
303
+ } catch {
304
+ throw new Error(`Prototype Page review receipt is invalid or tampered: ${path.basename(file)}.`);
305
+ }
306
+ });
307
+ }
308
+
309
+ function receiptOrder(left, right) {
310
+ return String(left.decided_at).localeCompare(String(right.decided_at))
311
+ || String(left.receipt_id).localeCompare(String(right.receipt_id));
312
+ }
313
+
314
+ function changedDomains(page, receipt) {
315
+ const changed = Object.keys(page.evidence_checksums)
316
+ .filter((key) => page.evidence_checksums[key] !== receipt.evidence_checksums?.[key]);
317
+ if (JSON.stringify(page.scene_checksums) !== JSON.stringify(receipt.scene_checksums)
318
+ && !changed.includes("review_scenes")) changed.push("review_scenes");
319
+ return changed.length ? changed.sort() : ["receipt-binding"];
320
+ }
321
+
322
+ function receiptMatchesPage(target, page, receipt, revisionChecksum) {
323
+ return receipt.iteration_id === target.iterationId
324
+ && receipt.terminal_id === page.terminal_id
325
+ && receipt.page_checksum === page.page_checksum
326
+ && digest(receipt.scene_checksums) === digest(page.scene_checksums)
327
+ && digest(receipt.evidence_checksums) === digest(page.evidence_checksums)
328
+ && receipt.prototype_revision_checksum === revisionChecksum;
329
+ }
330
+
331
+ export function applyPrototypePageReviewReceipts(target, receipts) {
332
+ const pages = target.pages.map((page) => {
333
+ const candidates = receipts.filter((receipt) => receipt.prototype_id === target.prototypeId
334
+ && receipt.page_id === page.page_id).sort(receiptOrder);
335
+ const current = candidates.filter((receipt) => receipt.prototype_revision_id === target.targetId).at(-1);
336
+ if (current) {
337
+ if (!receiptMatchesPage(target, page, current, target.targetChecksum)) {
338
+ return { ...page, review_status: "stale", changed_domains: changedDomains(page, current) };
339
+ }
340
+ return {
341
+ ...page,
342
+ review_status: current.decision === "approved" ? "approved" : "changes-requested",
343
+ changed_domains: [],
344
+ latest_review: current,
345
+ };
346
+ }
347
+ const ancestorRevisions = Array.isArray(target.ancestorRevisions)
348
+ ? target.ancestorRevisions
349
+ : [];
350
+ const priorBinding = ancestorRevisions
351
+ .map((ancestor) => ({
352
+ ancestor,
353
+ receipt: candidates
354
+ .filter((receipt) => receipt.prototype_revision_id === ancestor.prototype_revision_id)
355
+ .at(-1),
356
+ }))
357
+ .find((binding) => binding.receipt);
358
+ const prior = priorBinding?.receipt;
359
+ if (!prior) return page;
360
+ if (receiptMatchesPage(
361
+ target,
362
+ page,
363
+ prior,
364
+ priorBinding.ancestor.prototype_revision_checksum,
365
+ )) {
366
+ return {
367
+ ...page,
368
+ review_status: prior.decision === "approved" ? "approved" : "changes-requested",
369
+ changed_domains: [],
370
+ ...(prior.decision === "approved"
371
+ ? { inherited_from_revision: prior.prototype_revision_id }
372
+ : {}),
373
+ latest_review: prior,
374
+ };
375
+ }
376
+ return { ...page, review_status: "stale", changed_domains: changedDomains(page, prior), latest_review: prior };
377
+ });
378
+ const statusByPage = new Map(pages.map((page) => [page.page_id, page.review_status]));
379
+ const scenes = target.reviewScenes.map((scene) => ({
380
+ ...scene,
381
+ review_status: statusByPage.get(scene.page_id) || "pending-review",
382
+ }));
383
+ return { pages, reviewScenes: scenes };
384
+ }