@pixel-point/toolcraft 0.0.18 → 0.0.19

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 (384) hide show
  1. package/package.json +1 -1
  2. package/src/generate-demand-only-lifecycle.test.mjs +9 -1
  3. package/src/generate-performance-iteration-execution.test.mjs +3 -3
  4. package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
  5. package/src/generate-test-demand-only-lifecycle.mjs +34 -36
  6. package/src/generate-test-dependency-sandbox.mjs +4 -1
  7. package/src/generate-test-doc-assertions.mjs +55 -53
  8. package/src/generate-test-doc-assertions.test.mjs +1 -1
  9. package/src/generate-test-doc-policy-assertions.mjs +1 -1
  10. package/src/generate-test-export-doc-assertions.mjs +53 -0
  11. package/src/generate-test-file-assertions.mjs +51 -8
  12. package/src/generate-test-integrity-assertions.mjs +5 -2
  13. package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
  14. package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
  15. package/src/generate-test-package-assertions.mjs +4 -0
  16. package/src/generate-test-product-fixture.mjs +1 -1
  17. package/src/generate-test-product-fixture.test.mjs +35 -38
  18. package/src/generate-test-product-iteration.mjs +0 -1
  19. package/src/generate-test-product-iteration.test.mjs +0 -1
  20. package/src/generate-test-runtime-boundary-assertions.mjs +20 -0
  21. package/src/generate-test-standalone-assertions.mjs +0 -16
  22. package/src/generate-test-standalone-delivery-stages.mjs +2 -86
  23. package/src/generate.test.mjs +4 -0
  24. package/src/generated-integrity-manifest.test.mjs +5 -2
  25. package/src/generated-source-policy.test.mjs +0 -4
  26. package/src/package-json.mjs +5 -0
  27. package/src/package-json.test.mjs +21 -0
  28. package/src/package-manager.mjs +2 -0
  29. package/src/package-manager.test.mjs +8 -0
  30. package/src/packaged-template-fallback-helpers.mjs +254 -0
  31. package/src/packaged-template-fallback.test.mjs +121 -46
  32. package/src/packaged-template-runtime-assertions.mjs +150 -0
  33. package/templates/runtime/contracts/component-contracts.choices.test.ts +18 -3
  34. package/templates/runtime/contracts/component-contracts.choices.ts +8 -3
  35. package/templates/runtime/contracts/component-contracts.inputs.ts +2 -1
  36. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +18 -4
  37. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +1 -1
  38. package/templates/runtime/contracts/component-contracts.runtime.ts +7 -4
  39. package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
  40. package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
  41. package/templates/runtime/contracts/decision-contracts.test.ts +18 -12
  42. package/templates/runtime/contracts/decision-contracts.ts +4 -4
  43. package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
  44. package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
  45. package/templates/runtime/export/artifact-download.ts +1 -0
  46. package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
  47. package/templates/runtime/export/artifact-frame-state.ts +16 -0
  48. package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
  49. package/templates/runtime/export/artifact-scene-frame.ts +3 -3
  50. package/templates/runtime/export/export-error.ts +5 -0
  51. package/templates/runtime/export/export-renderer-coverage.ts +54 -0
  52. package/templates/runtime/export/image-artifact-export.ts +2 -2
  53. package/templates/runtime/export/index.ts +13 -0
  54. package/templates/runtime/export/product-export-renderer.test.ts +38 -4
  55. package/templates/runtime/export/product-export-renderer.ts +0 -41
  56. package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
  57. package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
  58. package/templates/runtime/export/svg-artifact-export.ts +120 -0
  59. package/templates/runtime/export/svg-document.test.ts +221 -0
  60. package/templates/runtime/export/svg-document.ts +400 -0
  61. package/templates/runtime/export/svg-policy.ts +47 -0
  62. package/templates/runtime/index.ts +1 -0
  63. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +10 -0
  64. package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
  65. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +46 -1
  66. package/templates/runtime/react/app-shell/toolcraft-app.tsx +7 -2
  67. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
  68. package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
  69. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +1 -1
  70. package/templates/runtime/react/canvas/canvas-shell.tsx +16 -5
  71. package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
  72. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
  73. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
  74. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
  75. package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
  76. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +39 -0
  77. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
  78. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +1 -4
  79. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +2 -2
  80. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
  81. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +2 -2
  82. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +40 -11
  83. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +31 -2
  84. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +4 -1
  85. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
  86. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
  87. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
  88. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
  89. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
  90. package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
  91. package/templates/runtime/schema/artifact-export-actions.ts +49 -0
  92. package/templates/runtime/schema/types.ts +1 -0
  93. package/templates/runtime/state/canvas-background-state.ts +1 -16
  94. package/templates/runtime/state/canvas-state.ts +32 -20
  95. package/templates/runtime/state/control-value-codecs.test.ts +98 -0
  96. package/templates/runtime/state/control-value-codecs.ts +700 -0
  97. package/templates/runtime/state/control-value-normalization.test.ts +1 -1
  98. package/templates/runtime/state/control-value-normalization.ts +127 -135
  99. package/templates/runtime/state/controls-reducer.ts +26 -3
  100. package/templates/runtime/state/create-template-state.test.ts +30 -0
  101. package/templates/runtime/state/create-template-state.ts +52 -31
  102. package/templates/runtime/state/orientation-pose.ts +80 -0
  103. package/templates/runtime/state/persistence-control-values.test.ts +59 -0
  104. package/templates/runtime/state/reducer-controls.test.ts +45 -0
  105. package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
  106. package/templates/runtime/state/reducer-timeline.test.ts +70 -0
  107. package/templates/runtime/state/timeline-reducer.ts +40 -2
  108. package/templates/runtime/testing/performance-schema-queries.ts +2 -2
  109. package/templates/starter/AGENTS.md +21 -22
  110. package/templates/starter/docs/toolcraft/README.md +6 -6
  111. package/templates/starter/docs/toolcraft/acceptance-testing.md +20 -20
  112. package/templates/starter/docs/toolcraft/agent-worklog.md +88 -1
  113. package/templates/starter/docs/toolcraft/assembly-workflow.md +7 -6
  114. package/templates/starter/docs/toolcraft/component-rules.md +2 -2
  115. package/templates/starter/docs/toolcraft/core/layout.md +6 -1
  116. package/templates/starter/docs/toolcraft/core/media-upload.md +1 -1
  117. package/templates/starter/docs/toolcraft/core/performance.md +8 -10
  118. package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
  119. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +2 -1
  120. package/templates/starter/docs/toolcraft/core/setup-export.md +43 -13
  121. package/templates/starter/docs/toolcraft/decision-contract.md +2 -2
  122. package/templates/starter/docs/toolcraft/performance.md +8 -10
  123. package/templates/starter/docs/toolcraft/renderer-technique.md +2 -2
  124. package/templates/starter/docs/toolcraft/schema-reference.md +8 -8
  125. package/templates/starter/docs/toolcraft/workflow.md +14 -14
  126. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +38 -0
  127. package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
  128. package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
  129. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +62 -0
  130. package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
  131. package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
  132. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
  133. package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
  134. package/templates/starter/e2e/browser-proof-session.ts +43 -15
  135. package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
  136. package/templates/starter/e2e/browser-proof-types.ts +15 -0
  137. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +22 -6
  138. package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
  139. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +97 -0
  140. package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
  141. package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
  142. package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
  143. package/templates/starter/e2e/product-observable-helpers.ts +8 -129
  144. package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
  145. package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
  146. package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
  147. package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
  148. package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
  149. package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
  150. package/templates/starter/package.json +2 -0
  151. package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
  152. package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
  153. package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
  154. package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
  155. package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
  156. package/templates/starter/scripts/run-browser-performance.mjs +0 -6
  157. package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
  158. package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
  159. package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
  160. package/templates/starter/scripts/run-feature-verification.mjs +212 -0
  161. package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
  162. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
  163. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
  164. package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
  165. package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
  166. package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
  167. package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
  168. package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
  169. package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
  170. package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
  171. package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
  172. package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
  173. package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
  174. package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
  175. package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
  176. package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
  177. package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
  178. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
  179. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
  180. package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
  181. package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
  182. package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
  183. package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
  184. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
  185. package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
  186. package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
  187. package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
  188. package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
  189. package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
  190. package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
  191. package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
  192. package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
  193. package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
  194. package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
  195. package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
  196. package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
  197. package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
  198. package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
  199. package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
  200. package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
  201. package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
  202. package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
  203. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
  204. package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
  205. package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
  206. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
  207. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
  208. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
  209. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
  210. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
  211. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
  212. package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
  213. package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
  214. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
  215. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
  216. package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
  217. package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
  218. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
  219. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
  220. package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
  221. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
  222. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
  223. package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
  224. package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
  225. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
  226. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
  227. package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
  228. package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
  229. package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
  230. package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
  231. package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
  232. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
  233. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
  234. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
  235. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
  236. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
  237. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
  238. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
  239. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
  240. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
  241. package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
  242. package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
  243. package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
  244. package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
  245. package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
  246. package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
  247. package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
  248. package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
  249. package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
  250. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
  251. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
  252. package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
  253. package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
  254. package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
  255. package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
  256. package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
  257. package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
  258. package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
  259. package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
  260. package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
  261. package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
  262. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +1 -1
  263. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +10 -1
  264. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +5 -1
  265. package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
  266. package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
  267. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
  268. package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
  269. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
  270. package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
  271. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
  272. package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
  273. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
  274. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
  275. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
  276. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
  277. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
  278. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
  279. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
  280. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
  281. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +51 -20
  282. package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
  283. package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
  284. package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
  285. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +0 -11
  286. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -3
  287. package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
  288. package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
  289. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +18 -0
  290. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
  291. package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
  292. package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
  293. package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
  294. package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
  295. package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
  296. package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
  297. package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
  298. package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
  299. package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
  300. package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
  301. package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
  302. package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
  303. package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
  304. package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
  305. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
  306. package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
  307. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +5 -1
  308. package/templates/starter/src/app/acceptance/output-export-model.ts +4 -0
  309. package/templates/starter/src/app/acceptance/output-export.ts +4 -1
  310. package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
  311. package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
  312. package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
  313. package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
  314. package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
  315. package/templates/starter/src/app/acceptance/types.ts +43 -118
  316. package/templates/starter/src/app/acceptance/validate-coverage.ts +14 -3
  317. package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
  318. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
  319. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +81 -8
  320. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +2 -0
  321. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +2 -0
  322. package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
  323. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +1 -1
  324. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +1 -0
  325. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +1 -0
  326. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
  327. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
  328. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
  329. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
  330. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
  331. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +5 -1
  332. package/templates/starter/src/app/starter-acceptance.image-export-settings.test.ts +2 -0
  333. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +19 -3
  334. package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
  335. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
  336. package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
  337. package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
  338. package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
  339. package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
  340. package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
  341. package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
  342. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +78 -4
  343. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +6 -1
  344. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +18 -1
  345. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
  346. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
  347. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
  348. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
  349. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +2 -0
  350. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
  351. package/templates/starter/src/app/starter-acceptance.ts +34 -8
  352. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +2 -0
  353. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
  354. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +4 -0
  355. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
  356. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
  357. package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
  358. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
  359. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +3 -0
  360. package/templates/starter/tsconfig.json +1 -0
  361. package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
  362. package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
  363. package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
  364. package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
  365. package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
  366. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
  367. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
  368. package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
  369. package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
  370. package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
  371. package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
  372. package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
  373. package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
  374. package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
  375. package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
  376. package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
  377. package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
  378. package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
  379. package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
  380. package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
  381. package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
  382. package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
  383. package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
  384. package/templates/starter/src/app/starter-verification-impact.json +0 -15
@@ -8,6 +8,7 @@ import { describe, expect, it } from "vitest";
8
8
  import {
9
9
  getToolcraftOutputExportErrors,
10
10
  schemaHasPngExportPanelAction,
11
+ schemaHasSvgExportPanelAction,
11
12
  schemaHasVideoExportPanelAction,
12
13
  } from "./acceptance/output-export";
13
14
  import { buildToolcraftOutputExportFacts } from "./acceptance/output-export-model";
@@ -46,9 +47,11 @@ function makeProductReadiness(
46
47
 
47
48
  function makeOutputActionsSection({
48
49
  image,
50
+ svg,
49
51
  video,
50
52
  }: {
51
53
  image: boolean;
54
+ svg: boolean;
52
55
  video: boolean;
53
56
  }): ToolcraftControlSectionSchema {
54
57
  const actions: ToolcraftActionSchema[] = [];
@@ -62,6 +65,15 @@ function makeOutputActionsSection({
62
65
  });
63
66
  }
64
67
 
68
+ if (svg) {
69
+ actions.push({
70
+ icon: "upload-simple",
71
+ label: "Export SVG",
72
+ role: "export-svg",
73
+ value: "export.svg",
74
+ });
75
+ }
76
+
65
77
  if (video) {
66
78
  actions.push({
67
79
  icon: "upload-simple",
@@ -87,19 +99,21 @@ function makeOutputActionsSection({
87
99
  function makeExportSchema({
88
100
  imageAction = false,
89
101
  imageSection = false,
102
+ svgAction = false,
90
103
  timeline = false,
91
104
  videoAction = false,
92
105
  videoSection = false,
93
106
  }: {
94
107
  imageAction?: boolean;
95
108
  imageSection?: boolean;
109
+ svgAction?: boolean;
96
110
  timeline?: boolean;
97
111
  videoAction?: boolean;
98
112
  videoSection?: boolean;
99
113
  } = {}) {
100
114
  const sections: ToolcraftControlSectionSchema[] = [];
101
115
 
102
- if (imageAction || videoAction) {
116
+ if (imageAction || svgAction || videoAction) {
103
117
  sections.push(makeBackgroundSection());
104
118
  }
105
119
  if (imageSection) {
@@ -108,8 +122,14 @@ function makeExportSchema({
108
122
  if (videoSection) {
109
123
  sections.push(makeVideoExportSection());
110
124
  }
111
- if (imageAction || videoAction) {
112
- sections.push(makeOutputActionsSection({ image: imageAction, video: videoAction }));
125
+ if (imageAction || svgAction || videoAction) {
126
+ sections.push(
127
+ makeOutputActionsSection({
128
+ image: imageAction,
129
+ svg: svgAction,
130
+ video: videoAction,
131
+ }),
132
+ );
113
133
  }
114
134
 
115
135
  const panels: ToolcraftAppSchema["panels"] = {
@@ -133,12 +153,14 @@ function makeExportSchema({
133
153
 
134
154
  function makeArtifactCoverage({
135
155
  image,
156
+ svg,
136
157
  video,
137
158
  }: {
138
159
  image: boolean;
160
+ svg: boolean;
139
161
  video: boolean;
140
162
  }): readonly ToolcraftComponentAcceptance[] {
141
- if (!image && !video) {
163
+ if (!image && !svg && !video) {
142
164
  return [];
143
165
  }
144
166
 
@@ -147,6 +169,9 @@ function makeArtifactCoverage({
147
169
  if (image) {
148
170
  exportArtifactCoverage.push("all-required-image-export-behavior");
149
171
  }
172
+ if (svg) {
173
+ exportArtifactCoverage.push("all-required-svg-export-behavior");
174
+ }
150
175
  if (video) {
151
176
  exportArtifactCoverage.push("all-required-video-export-behavior");
152
177
  }
@@ -155,6 +180,7 @@ function makeArtifactCoverage({
155
180
  {
156
181
  actionCoverage: [
157
182
  ...(image ? ["export.png"] : []),
183
+ ...(svg ? ["export.svg"] : []),
158
184
  ...(video ? ["export.video"] : []),
159
185
  ],
160
186
  automated: true,
@@ -184,6 +210,7 @@ function getExplicitExportErrors({
184
210
  return getToolcraftOutputExportErrors({
185
211
  acceptance: makeArtifactCoverage({
186
212
  image: schemaHasPngExportPanelAction(schema),
213
+ svg: schemaHasSvgExportPanelAction(schema),
187
214
  video: schemaHasVideoExportPanelAction(schema),
188
215
  }),
189
216
  controls: collectToolcraftVisibleAcceptanceControls(schema),
@@ -197,6 +224,7 @@ describe("Toolcraft explicit output export intent", () => {
197
224
  const errors = getExplicitExportErrors({
198
225
  intent: {
199
226
  image: { mode: "toolcraft-default" },
227
+ svg: { mode: "not-requested" },
200
228
  video: { mode: "not-requested" },
201
229
  },
202
230
  schema: makeExportSchema({
@@ -219,6 +247,7 @@ describe("Toolcraft explicit output export intent", () => {
219
247
  const errors = getExplicitExportErrors({
220
248
  intent: {
221
249
  image: { mode: "toolcraft-default" },
250
+ svg: { mode: "not-requested" },
222
251
  video: {
223
252
  evidence: "The user explicitly requested MP4 delivery.",
224
253
  mode: "user-requested",
@@ -265,6 +294,7 @@ describe("Toolcraft explicit output export intent", () => {
265
294
  evidence: "The user explicitly requested no image artifact.",
266
295
  mode: "user-removed",
267
296
  },
297
+ svg: { mode: "not-requested" },
268
298
  video: { mode: "not-requested" },
269
299
  },
270
300
  schema: makeExportSchema({ imageAction, imageSection }),
@@ -277,6 +307,7 @@ describe("Toolcraft explicit output export intent", () => {
277
307
  getExplicitExportErrors({
278
308
  intent: {
279
309
  image: { mode: "toolcraft-default" },
310
+ svg: { mode: "not-requested" },
280
311
  video: { mode: "not-requested" },
281
312
  },
282
313
  schema: makeExportSchema(),
@@ -291,6 +322,7 @@ describe("Toolcraft explicit output export intent", () => {
291
322
  getExplicitExportErrors({
292
323
  intent: {
293
324
  image: { evidence: " \n\t", mode: "user-removed" },
325
+ svg: { mode: "not-requested" },
294
326
  video: { mode: "not-requested" },
295
327
  },
296
328
  schema: makeExportSchema(),
@@ -308,6 +340,7 @@ describe("Toolcraft explicit output export intent", () => {
308
340
  evidence: "The user explicitly requested no image artifact.",
309
341
  mode: "user-removed",
310
342
  },
343
+ svg: { mode: "not-requested" },
311
344
  video: {
312
345
  evidence: "The user explicitly requested MP4 delivery.",
313
346
  mode: "user-requested",
@@ -326,6 +359,7 @@ describe("Toolcraft explicit output export intent", () => {
326
359
  evidence: "The user explicitly requested no downloadable artifacts.",
327
360
  mode: "user-removed",
328
361
  },
362
+ svg: { mode: "not-requested" },
329
363
  video: { mode: "not-requested" },
330
364
  },
331
365
  schema: makeExportSchema(),
@@ -333,10 +367,48 @@ describe("Toolcraft explicit output export intent", () => {
333
367
  ).toEqual([]);
334
368
  });
335
369
 
370
+ it("accepts explicit editable SVG-only delivery without inventing a settings section", () => {
371
+ expect(
372
+ getExplicitExportErrors({
373
+ intent: {
374
+ image: {
375
+ evidence: "The user requested SVG instead of image export.",
376
+ mode: "user-removed",
377
+ },
378
+ svg: {
379
+ evidence: "The user explicitly requested editable SVG delivery.",
380
+ mode: "user-requested",
381
+ },
382
+ video: { mode: "not-requested" },
383
+ },
384
+ schema: makeExportSchema({ svgAction: true }),
385
+ }),
386
+ ).toEqual([]);
387
+ });
388
+
389
+ it("requires the typed SVG action when SVG delivery was requested", () => {
390
+ expect(
391
+ getExplicitExportErrors({
392
+ intent: {
393
+ image: { mode: "toolcraft-default" },
394
+ svg: {
395
+ evidence: "The user explicitly requested editable SVG delivery.",
396
+ mode: "user-requested",
397
+ },
398
+ video: { mode: "not-requested" },
399
+ },
400
+ schema: makeExportSchema({ imageAction: true, imageSection: true }),
401
+ }),
402
+ ).toContain(
403
+ 'SVG export intent "user-requested" requires an export-svg panel action.',
404
+ );
405
+ });
406
+
336
407
  it("does not infer video delivery from an enabled playback timeline", () => {
337
408
  const errors = getExplicitExportErrors({
338
409
  intent: {
339
410
  image: { mode: "toolcraft-default" },
411
+ svg: { mode: "not-requested" },
340
412
  video: { mode: "not-requested" },
341
413
  },
342
414
  schema: makeExportSchema({
@@ -356,6 +428,7 @@ describe("Toolcraft explicit output export intent", () => {
356
428
  getExplicitExportErrors({
357
429
  intent: {
358
430
  image: { mode: "toolcraft-default" },
431
+ svg: { mode: "not-requested" },
359
432
  video: {
360
433
  evidence: "The user explicitly requested video delivery.",
361
434
  mode: "user-requested",
@@ -377,6 +450,7 @@ describe("Toolcraft explicit output export intent", () => {
377
450
  });
378
451
 
379
452
  expect(facts.hasImageExportAction).toBe(false);
453
+ expect(facts.hasSvgExportAction).toBe(false);
380
454
  expect(facts.hasVideoExportAction).toBe(false);
381
455
  expect(facts.imageExportSectionIndex).toBeGreaterThanOrEqual(0);
382
456
  expect(facts.finalExportSettingsIndex).toBe(-1);
@@ -4,6 +4,7 @@ import { resolveToolcraftArtifactExportIntent } from "./acceptance/artifact-expo
4
4
  import { starterProductReadiness } from "./starter-acceptance";
5
5
  import {
6
6
  textLooksLikePngExport,
7
+ textLooksLikeSvgExport,
7
8
  textLooksLikeVideoExport,
8
9
  } from "./starter-acceptance.export-test-utils";
9
10
  import {
@@ -31,7 +32,7 @@ describe("Toolcraft output export acceptance contract", () => {
31
32
  new Set(["checkbox", "select", "segmented", "switch"]),
32
33
  );
33
34
 
34
- if (delivery.imageEnabled || delivery.videoEnabled) {
35
+ if (delivery.imageEnabled || delivery.svgEnabled || delivery.videoEnabled) {
35
36
  expect(
36
37
  panelActionTexts.length,
37
38
  "Product apps with artifact delivery must define panelActions in the controls panel sticky footer.",
@@ -84,6 +85,10 @@ describe("Toolcraft output export acceptance contract", () => {
84
85
  imageExportSection !== undefined,
85
86
  '"Image Export" section presence must match resolved product export intent.',
86
87
  ).toBe(delivery.imageEnabled);
88
+ expect(
89
+ panelActionTexts.some(textLooksLikeSvgExport),
90
+ "SVG export action presence must match resolved product export intent.",
91
+ ).toBe(delivery.svgEnabled);
87
92
 
88
93
  if (delivery.imageEnabled) {
89
94
  expect(
@@ -4,7 +4,10 @@ import {
4
4
  starterProductReadiness,
5
5
  starterTransferMode,
6
6
  } from "./starter-acceptance";
7
- import { schemaHasVideoExportPanelAction } from "./acceptance/output-export";
7
+ import {
8
+ schemaHasSvgExportPanelAction,
9
+ schemaHasVideoExportPanelAction,
10
+ } from "./acceptance/output-export";
8
11
  import { isNeutralTemplateProject } from "./starter-acceptance.product-readiness-test-utils";
9
12
  import { schemaHasProductSurface } from "./starter-acceptance.schema-test-utils";
10
13
  import { starterSchema } from "./starter-schema";
@@ -18,9 +21,18 @@ describe("Toolcraft product readiness", () => {
18
21
  expect(starterTransferMode).toEqual({
19
22
  animationIntent: { mode: "none" },
20
23
  mode: "new-toolcraft-app",
24
+ referenceInputs: [],
21
25
  });
22
26
  });
23
27
 
28
+ it("makes the no-reference decision explicit", () => {
29
+ if (starterProductReadiness.mode !== "starter") {
30
+ return;
31
+ }
32
+
33
+ expect(starterTransferMode.referenceInputs).toEqual([]);
34
+ });
35
+
24
36
  it("allows neutral readiness only for the source starter/template folder", () => {
25
37
  if (starterProductReadiness.mode === "product") {
26
38
  expect(starterProductReadiness.exportIntent).toBeDefined();
@@ -34,6 +46,11 @@ describe("Toolcraft product readiness", () => {
34
46
  ? "user-requested"
35
47
  : "not-requested",
36
48
  );
49
+ expect(starterProductReadiness.exportIntent.svg.mode).toBe(
50
+ schemaHasSvgExportPanelAction(starterSchema)
51
+ ? "user-requested"
52
+ : "not-requested",
53
+ );
37
54
  expect(starterProductReadiness.productName.trim()).not.toBe("");
38
55
  expect(starterProductReadiness.productSummary.trim()).not.toBe("");
39
56
  expect(starterProductReadiness.requestedBehavior.trim()).not.toBe("");
@@ -2,20 +2,141 @@ import { existsSync, readFileSync } from "node:fs";
2
2
 
3
3
  import { describe, expect, it } from "vitest";
4
4
 
5
- import { starterProductReadiness } from "./starter-acceptance";
5
+ import {
6
+ starterProductReadiness,
7
+ starterTransferMode,
8
+ } from "./starter-acceptance";
9
+ import type { ToolcraftTransferMode } from "./starter-acceptance";
10
+ import {
11
+ createMotionReferenceBehavior,
12
+ createMotionReferenceInput,
13
+ createOrdinalMotionReferenceStudy,
14
+ createTimedMotionReferenceStudy,
15
+ } from "./starter-acceptance.motion-reference-test-utils";
6
16
  import { schemaHasProductSurface } from "./starter-acceptance.schema-test-utils";
7
17
  import {
8
18
  agentWorklogPath,
9
19
  getAgentWorklogValidationErrors,
20
+ type WorklogMotionReference,
10
21
  } from "./starter-acceptance.worklog-test-utils";
11
22
 
23
+ function getWorklogMotionReferences(
24
+ transferMode: ToolcraftTransferMode,
25
+ ): readonly WorklogMotionReference[] {
26
+ return transferMode.referenceInputs.flatMap((referenceInput) =>
27
+ referenceInput.studies.map((study) => {
28
+ const requiresRealTimeReview =
29
+ study.evidence.timingMode === "seconds";
30
+ const requiresSlowedReview =
31
+ requiresRealTimeReview &&
32
+ (study.events.some(
33
+ ({ classification }) => classification === "product-behavior",
34
+ ) ||
35
+ referenceInput.behaviors.some((behavior) =>
36
+ behavior.timingClaims.some(
37
+ (claim) => claim.studyId === study.studyId,
38
+ ),
39
+ ));
40
+
41
+ return {
42
+ contactSheetPath: study.evidence.contactSheet.path,
43
+ referenceId: referenceInput.referenceId,
44
+ requiresRealTimeReview,
45
+ requiresSlowedReview,
46
+ sourceSha256: study.evidence.sourceSha256,
47
+ studyId: study.studyId,
48
+ timingMode: study.evidence.timingMode,
49
+ } satisfies WorklogMotionReference;
50
+ }),
51
+ );
52
+ }
53
+
54
+ const worklogMotionReferences = getWorklogMotionReferences(starterTransferMode);
55
+
12
56
  describe("Toolcraft product worklog", () => {
57
+ it("derives real-time, slowed, and ordered-frame review requirements per nested study", () => {
58
+ const transferMode: ToolcraftTransferMode = {
59
+ animationIntent: { mode: "none" },
60
+ mode: "new-toolcraft-app",
61
+ referenceInputs: [
62
+ createMotionReferenceInput({
63
+ behaviors: [
64
+ createMotionReferenceBehavior({
65
+ timingClaims: [{ claim: "duration", studyId: "study-claim" }],
66
+ }),
67
+ ],
68
+ studies: [
69
+ createTimedMotionReferenceStudy({
70
+ pathId: "study-event",
71
+ studyId: "study-event",
72
+ }),
73
+ createTimedMotionReferenceStudy({
74
+ pathId: "study-claim",
75
+ studyId: "study-claim",
76
+ withEvent: false,
77
+ }),
78
+ createTimedMotionReferenceStudy({
79
+ pathId: "study-quiet",
80
+ studyId: "study-quiet",
81
+ withEvent: false,
82
+ }),
83
+ createOrdinalMotionReferenceStudy({
84
+ pathId: "study-ordinal",
85
+ studyId: "study-ordinal",
86
+ }),
87
+ ],
88
+ }),
89
+ ],
90
+ };
91
+
92
+ expect(
93
+ getWorklogMotionReferences(transferMode).map(
94
+ ({ requiresRealTimeReview, requiresSlowedReview, studyId, timingMode }) =>
95
+ ({
96
+ requiresRealTimeReview,
97
+ requiresSlowedReview,
98
+ studyId,
99
+ timingMode,
100
+ }),
101
+ ),
102
+ ).toEqual([
103
+ {
104
+ requiresRealTimeReview: true,
105
+ requiresSlowedReview: true,
106
+ studyId: "study-event",
107
+ timingMode: "seconds",
108
+ },
109
+ {
110
+ requiresRealTimeReview: true,
111
+ requiresSlowedReview: true,
112
+ studyId: "study-claim",
113
+ timingMode: "seconds",
114
+ },
115
+ {
116
+ requiresRealTimeReview: true,
117
+ requiresSlowedReview: false,
118
+ studyId: "study-quiet",
119
+ timingMode: "seconds",
120
+ },
121
+ {
122
+ requiresRealTimeReview: false,
123
+ requiresSlowedReview: false,
124
+ studyId: "study-ordinal",
125
+ timingMode: "ordinal",
126
+ },
127
+ ]);
128
+ });
129
+
13
130
  it("requires product apps to replace the starter worklog with decision evidence", () => {
14
131
  if (starterProductReadiness.mode !== "product" && !schemaHasProductSurface()) {
15
132
  return;
16
133
  }
17
134
 
18
135
  expect(existsSync(agentWorklogPath)).toBe(true);
19
- expect(getAgentWorklogValidationErrors(readFileSync(agentWorklogPath, "utf8"))).toEqual([]);
136
+ expect(
137
+ getAgentWorklogValidationErrors(readFileSync(agentWorklogPath, "utf8"), {
138
+ motionReferences: worklogMotionReferences,
139
+ }),
140
+ ).toEqual([]);
20
141
  });
21
142
  });
@@ -19,6 +19,7 @@ describe("starter acceptance custom reference timeline contract", () => {
19
19
  transferMode: {
20
20
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
21
21
  mode: "reference-runtime-clone",
22
+ referenceInputs: [],
22
23
  referenceName: "legacy state timeline",
23
24
  referenceTimeline: {
24
25
  behaviorCoverage: ["state-jump", "trim-range"],
@@ -117,6 +118,7 @@ describe("starter acceptance custom reference timeline contract", () => {
117
118
  transferMode: {
118
119
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
119
120
  mode: "reference-runtime-clone",
121
+ referenceInputs: [],
120
122
  referenceFeatureInventory: makeReferenceFeatureInventory([
121
123
  {
122
124
  acceptanceId: "reference.timeline.stateJump",
@@ -27,6 +27,7 @@ describe("starter acceptance reference-runtime foundation", () => {
27
27
  "renderer-loop",
28
28
  ],
29
29
  mode: "reference-runtime-clone",
30
+ referenceInputs: [],
30
31
  referenceName: "legacy badge wall",
31
32
  sourceOfTruth: "reference-runtime",
32
33
  } as never,
@@ -57,6 +58,7 @@ describe("starter acceptance reference-runtime foundation", () => {
57
58
  transferMode: {
58
59
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
59
60
  mode: "reference-runtime-clone",
61
+ referenceInputs: [],
60
62
  referenceName: "legacy badge wall",
61
63
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
62
64
  sourceOfTruth: "reference-runtime",
@@ -86,6 +88,7 @@ describe("starter acceptance reference-runtime foundation", () => {
86
88
  transferMode: {
87
89
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
88
90
  mode: "reference-runtime-clone",
91
+ referenceInputs: [],
89
92
  referenceFeatureInventory: makeReferenceFeatureInventory(),
90
93
  referenceName: "legacy badge wall",
91
94
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
@@ -110,6 +113,7 @@ describe("starter acceptance reference-runtime foundation", () => {
110
113
  transferMode: {
111
114
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
112
115
  mode: "reference-runtime-clone",
116
+ referenceInputs: [],
113
117
  referenceFeatureInventory: makeReferenceFeatureInventory(),
114
118
  referenceName: "legacy badge wall",
115
119
  referenceStudy: {
@@ -141,6 +145,7 @@ describe("starter acceptance reference-runtime foundation", () => {
141
145
  transferMode: {
142
146
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
143
147
  mode: "reference-runtime-clone",
148
+ referenceInputs: [],
144
149
  referenceFeatureInventory: [
145
150
  {
146
151
  acceptanceId: "appearance.opacity",
@@ -180,6 +185,7 @@ describe("starter acceptance reference-runtime foundation", () => {
180
185
  transferMode: {
181
186
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
182
187
  mode: "reference-runtime-clone",
188
+ referenceInputs: [],
183
189
  referenceFeatureInventory: [
184
190
  { ...makeReferenceFeatureInventory()[0], behaviorEvidence: "" },
185
191
  ...makeReferenceFeatureInventory().slice(1),
@@ -208,6 +214,7 @@ describe("starter acceptance reference-runtime foundation", () => {
208
214
  transferMode: {
209
215
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
210
216
  mode: "reference-runtime-clone",
217
+ referenceInputs: [],
211
218
  referenceFeatureInventory: [
212
219
  {
213
220
  ...makeReferenceFeatureInventory()[0],
@@ -292,6 +299,7 @@ describe("starter acceptance reference-runtime foundation", () => {
292
299
  transferMode: {
293
300
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
294
301
  mode: "reference-runtime-clone",
302
+ referenceInputs: [],
295
303
  referenceName: "legacy iframe shell",
296
304
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
297
305
  sourceOfTruth: "reference-runtime",
@@ -67,6 +67,7 @@ describe("starter acceptance reference timeline contract", () => {
67
67
  transferMode: {
68
68
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
69
69
  mode: "reference-runtime-clone",
70
+ referenceInputs: [],
70
71
  referenceFeatureInventory: makeReferenceFeatureInventory(),
71
72
  referenceName: "legacy badge wall",
72
73
  referenceStudy: referenceStudyEvidence,
@@ -90,6 +91,7 @@ describe("starter acceptance reference timeline contract", () => {
90
91
  "pause-resume",
91
92
  ],
92
93
  mode: "reference-runtime-clone",
94
+ referenceInputs: [],
93
95
  referenceName: "legacy pause animation",
94
96
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
95
97
  sourceOfTruth: "reference-runtime",
@@ -114,6 +116,7 @@ describe("starter acceptance reference timeline contract", () => {
114
116
  "time-progress",
115
117
  ],
116
118
  mode: "reference-runtime-clone",
119
+ referenceInputs: [],
117
120
  referenceName: "legacy restart animation",
118
121
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
119
122
  sourceOfTruth: "reference-runtime",
@@ -132,6 +135,7 @@ describe("starter acceptance reference timeline contract", () => {
132
135
  transferMode: {
133
136
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
134
137
  mode: "reference-runtime-clone",
138
+ referenceInputs: [],
135
139
  referenceName: "legacy playback animation",
136
140
  referenceTimeline: { behaviorCoverage: [], mode: "toolcraft-playback" },
137
141
  sourceOfTruth: "reference-runtime",
@@ -170,6 +174,7 @@ describe("starter acceptance reference timeline contract", () => {
170
174
  "pause-resume",
171
175
  ],
172
176
  mode: "reference-runtime-clone",
177
+ referenceInputs: [],
173
178
  referenceName: "legacy playback animation",
174
179
  referenceTimeline: { behaviorCoverage: ["playback"], mode: "toolcraft-playback" },
175
180
  sourceOfTruth: "reference-runtime",
@@ -208,6 +213,7 @@ describe("starter acceptance reference timeline contract", () => {
208
213
  "pause-resume",
209
214
  ],
210
215
  mode: "reference-runtime-clone",
216
+ referenceInputs: [],
211
217
  referenceName: "legacy playback animation",
212
218
  referenceTimeline: {
213
219
  behaviorCoverage: ["playback"],
@@ -255,6 +261,7 @@ describe("starter acceptance reference timeline contract", () => {
255
261
  "time-progress",
256
262
  ],
257
263
  mode: "reference-runtime-clone",
264
+ referenceInputs: [],
258
265
  referenceName: "legacy keyframe animation",
259
266
  referenceTimeline: { behaviorCoverage: ["keyframes"], mode: "toolcraft-keyframes" },
260
267
  sourceOfTruth: "reference-runtime",
@@ -162,6 +162,7 @@ describe("starter acceptance section cohesion contract", () => {
162
162
  reason: "The flow speed is a decorative self-running effect and does not expose product time transport.",
163
163
  },
164
164
  mode: "new-toolcraft-app",
165
+ referenceInputs: [],
165
166
  },
166
167
  });
167
168
 
@@ -247,6 +248,7 @@ describe("starter acceptance section cohesion contract", () => {
247
248
  reason: "The flow speed is a decorative self-running effect and does not expose product time transport.",
248
249
  },
249
250
  mode: "new-toolcraft-app",
251
+ referenceInputs: [],
250
252
  },
251
253
  }),
252
254
  ).toEqual([]);
@@ -67,6 +67,7 @@ describe("starter acceptance timeline playback contract", () => {
67
67
  transferMode: {
68
68
  animationIntent: { mode: "timeline-playback" },
69
69
  mode: "new-toolcraft-app",
70
+ referenceInputs: [],
70
71
  } as unknown as ToolcraftTransferMode,
71
72
  }),
72
73
  ).toContain(
@@ -82,6 +83,7 @@ describe("starter acceptance timeline playback contract", () => {
82
83
  transferMode: {
83
84
  animationIntent: { mode: "none" },
84
85
  mode: "new-toolcraft-app",
86
+ referenceInputs: [],
85
87
  },
86
88
  }),
87
89
  ).toContain(
@@ -97,6 +99,7 @@ describe("starter acceptance timeline playback contract", () => {
97
99
  transferMode: {
98
100
  animationIntent: { mode: "none" },
99
101
  mode: "new-toolcraft-app",
102
+ referenceInputs: [],
100
103
  },
101
104
  }),
102
105
  ).toContain(
@@ -119,6 +122,7 @@ describe("starter acceptance timeline playback contract", () => {
119
122
  mode: "timeline-playback",
120
123
  },
121
124
  mode: "new-toolcraft-app",
125
+ referenceInputs: [],
122
126
  },
123
127
  }),
124
128
  ).toContain(
@@ -141,6 +145,7 @@ describe("starter acceptance timeline playback contract", () => {
141
145
  mode: "timeline-playback",
142
146
  },
143
147
  mode: "new-toolcraft-app",
148
+ referenceInputs: [],
144
149
  },
145
150
  }),
146
151
  ).toContain(