@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
@@ -15,6 +15,10 @@ export {
15
15
  getToolcraftControlApplicabilityCases,
16
16
  type ToolcraftControlApplicabilityCase,
17
17
  } from "./acceptance/control-applicability-cases";
18
+ export {
19
+ createToolcraftFeatureVerificationSelection,
20
+ type ToolcraftFeatureVerificationSelection,
21
+ } from "./acceptance/feature-verification-selection";
18
22
  import {
19
23
  getToolcraftControlOrder as getToolcraftControlOrderForSchema,
20
24
  getToolcraftControlOrderTargets as getToolcraftControlOrderTargetsForSchema,
@@ -42,11 +46,25 @@ import type {
42
46
  ToolcraftInfinityCanvasCoverage,
43
47
  ToolcraftMediaLifecycleCoverage,
44
48
  ToolcraftModelImportCoverage,
49
+ ToolcraftMotionReferenceBehavior,
50
+ ToolcraftMotionReferenceCoverage,
51
+ ToolcraftMotionReferenceEvent,
52
+ ToolcraftMotionReferenceEvidence,
53
+ ToolcraftMotionReferenceEvidenceEvent,
54
+ ToolcraftMotionReferenceInput,
55
+ ToolcraftMotionReferenceOrdinalFrame,
56
+ ToolcraftMotionReferencePhase,
57
+ ToolcraftMotionReferenceSourceKind,
58
+ ToolcraftMotionReferenceStudy,
59
+ ToolcraftMotionReferenceTimedFrame,
60
+ ToolcraftMotionReferenceTimingClaim,
61
+ ToolcraftMotionReferenceTimingMode,
45
62
  ToolcraftPersistenceCoverage,
46
63
  ToolcraftProductReadiness,
47
64
  ToolcraftReferenceCoverage,
48
65
  ToolcraftReferenceFeatureInventoryItem,
49
66
  ToolcraftReferenceFeatureStatus,
67
+ ToolcraftReferenceInput,
50
68
  ToolcraftReferenceStudyEvidence,
51
69
  ToolcraftReferenceStudyStatus,
52
70
  ToolcraftReferenceTimelineContract,
@@ -55,16 +73,13 @@ import type {
55
73
  ToolcraftRenderScaleCoverage,
56
74
  ToolcraftRenderScaleState,
57
75
  ToolcraftSettingsTransferCoverage,
76
+ ToolcraftSelectionScopeCoverage,
58
77
  ToolcraftTimelineLoopDurationIntent,
59
78
  ToolcraftTimelineLoopDurationSource,
60
79
  ToolcraftTimelinePlaybackCoverage,
61
80
  ToolcraftTransferMode,
62
81
  ToolcraftViewInteractionEvidenceSource,
63
82
  ToolcraftViewInteractionIntent,
64
- ToolcraftVideoReferenceAcceptanceMapping,
65
- ToolcraftVideoReferenceStoryboardFrame,
66
- ToolcraftVideoReferenceStudyEvidence,
67
- ToolcraftVideoReferenceTransition,
68
83
  ToolcraftVisibleControl,
69
84
  } from "./acceptance/types";
70
85
  import { TOOLCRAFT_REQUIRED_MODEL_IMPORT_COVERAGE } from "./acceptance/types";
@@ -115,11 +130,25 @@ export type {
115
130
  ToolcraftInfinityCanvasCoverage,
116
131
  ToolcraftMediaLifecycleCoverage,
117
132
  ToolcraftModelImportCoverage,
133
+ ToolcraftMotionReferenceBehavior,
134
+ ToolcraftMotionReferenceCoverage,
135
+ ToolcraftMotionReferenceEvent,
136
+ ToolcraftMotionReferenceEvidence,
137
+ ToolcraftMotionReferenceEvidenceEvent,
138
+ ToolcraftMotionReferenceInput,
139
+ ToolcraftMotionReferenceOrdinalFrame,
140
+ ToolcraftMotionReferencePhase,
141
+ ToolcraftMotionReferenceSourceKind,
142
+ ToolcraftMotionReferenceStudy,
143
+ ToolcraftMotionReferenceTimedFrame,
144
+ ToolcraftMotionReferenceTimingClaim,
145
+ ToolcraftMotionReferenceTimingMode,
118
146
  ToolcraftPersistenceCoverage,
119
147
  ToolcraftProductReadiness,
120
148
  ToolcraftReferenceCoverage,
121
149
  ToolcraftReferenceFeatureInventoryItem,
122
150
  ToolcraftReferenceFeatureStatus,
151
+ ToolcraftReferenceInput,
123
152
  ToolcraftReferenceStudyEvidence,
124
153
  ToolcraftReferenceStudyStatus,
125
154
  ToolcraftReferenceTimelineContract,
@@ -128,16 +157,13 @@ export type {
128
157
  ToolcraftRenderScaleCoverage,
129
158
  ToolcraftRenderScaleState,
130
159
  ToolcraftSettingsTransferCoverage,
160
+ ToolcraftSelectionScopeCoverage,
131
161
  ToolcraftTimelineLoopDurationIntent,
132
162
  ToolcraftTimelineLoopDurationSource,
133
163
  ToolcraftTimelinePlaybackCoverage,
134
164
  ToolcraftTransferMode,
135
165
  ToolcraftViewInteractionEvidenceSource,
136
166
  ToolcraftViewInteractionIntent,
137
- ToolcraftVideoReferenceAcceptanceMapping,
138
- ToolcraftVideoReferenceStoryboardFrame,
139
- ToolcraftVideoReferenceStudyEvidence,
140
- ToolcraftVideoReferenceTransition,
141
167
  ToolcraftVisibleControl,
142
168
  };
143
169
 
@@ -83,6 +83,7 @@ describe("Toolcraft video export settings acceptance contract", () => {
83
83
  evidence: "The user explicitly removed image delivery.",
84
84
  mode: "user-removed",
85
85
  },
86
+ svg: { mode: "not-requested" },
86
87
  video: {
87
88
  evidence: "The user explicitly requested video delivery.",
88
89
  mode: "user-requested",
@@ -314,6 +315,7 @@ describe("Toolcraft video export settings acceptance contract", () => {
314
315
  evidence: "The user explicitly removed image delivery.",
315
316
  mode: "user-removed",
316
317
  },
318
+ svg: { mode: "not-requested" },
317
319
  video: {
318
320
  evidence: "The user explicitly requested video delivery.",
319
321
  mode: "user-requested",
@@ -1,262 +1,60 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
 
3
- import type {
4
- ToolcraftComponentAcceptance,
5
- ToolcraftVideoReferenceStudyEvidence,
6
- } from "./acceptance/types";
7
3
  import {
4
+ contractAcceptanceFixture,
8
5
  contractSchemaFixture,
9
- defineContractSchemaFixture,
6
+ contractTransferModeFixture,
10
7
  validateContractAcceptance,
11
8
  } from "./starter-acceptance.contract-fixtures";
12
- import {
13
- playbackTimelineAcceptance,
14
- } from "./starter-acceptance.timeline-test-utils";
15
-
16
- const videoReferenceMotionAcceptance: ToolcraftComponentAcceptance = {
17
- automated: true,
18
- automatedTestName: "video reference motion matches frame delta study",
19
- browser: true,
20
- browserTestName: "browser: video reference motion matches frame delta study",
21
- componentType: "custom-renderer",
22
- evidence: "product-output",
23
- expectedObservable:
24
- "The renderer preserves the video reference behavior observed across the storyboard transitions.",
25
- fixture: "video reference storyboard fixture",
26
- id: "reference.video.motion",
27
- kind: "runtime",
28
- target: "reference.video.motion",
29
- userAction:
30
- "Compare the implemented renderer against the storyboard frames and frame-to-frame behavior deltas.",
31
- };
32
-
33
- const videoReferenceStudyEvidence = {
34
- acceptanceMapping: [
35
- {
36
- acceptanceId: "reference.video.motion",
37
- behavior: "Planted contact points stretch across adjacent frames before retargeting.",
38
- frameIds: ["f000", "f012", "f024"],
39
- },
40
- ],
41
- behaviorDecomposition:
42
- "The video reference is decomposed into body movement, persistent contact points, delayed release, and retargeted anchors. The implementation copies those behaviors rather than a single static frame.",
43
- extractionEvidence:
44
- "Extracted frames with ffmpeg and reviewed contact sheets before implementation.",
45
- referenceLocation: "/fixtures/reference-motion/ref.mp4",
46
- storyboard: [
47
- {
48
- behaviorObservation:
49
- "Body starts moving while several endpoints remain planted in canvas space.",
50
- frameId: "f000",
51
- frameSource: "frames/frame_000.png",
52
- timeSeconds: 0,
53
- visualObservation: "The body is near the left side with legs extended outward.",
54
- },
55
- {
56
- behaviorObservation:
57
- "Body advances and planted endpoints stretch instead of following immediately.",
58
- frameId: "f012",
59
- frameSource: "frames/frame_012.png",
60
- timeSeconds: 0.2,
61
- visualObservation: "Several endpoints stay near the earlier canvas positions.",
62
- },
63
- {
64
- behaviorObservation:
65
- "Over-extended legs begin to release and choose new anchors.",
66
- frameId: "f024",
67
- frameSource: "frames/frame_024.png",
68
- timeSeconds: 0.4,
69
- visualObservation: "One side shows a retargeted leg group closer to the body.",
70
- },
71
- {
72
- behaviorObservation:
73
- "The new anchor pattern stabilizes before the next release.",
74
- frameId: "f036",
75
- frameSource: "frames/frame_036.png",
76
- timeSeconds: 0.6,
77
- visualObservation: "Legs settle into a new spread with the body further right.",
78
- },
79
- ],
80
- transitionAnalysis: [
81
- {
82
- behaviorDelta:
83
- "Between f000 and f012, body position changes faster than several leg endpoints, proving contact memory.",
84
- fromFrameId: "f000",
85
- id: "f000-f012",
86
- toFrameId: "f012",
87
- },
88
- {
89
- behaviorDelta:
90
- "Between f012 and f024, over-extension triggers release and retargeting instead of continuous sine motion.",
91
- fromFrameId: "f012",
92
- id: "f012-f024",
93
- toFrameId: "f024",
94
- },
95
- {
96
- behaviorDelta:
97
- "Between f024 and f036, newly planted anchors remain stable while the body keeps moving.",
98
- fromFrameId: "f024",
99
- id: "f024-f036",
100
- toFrameId: "f036",
101
- },
102
- ],
103
- } satisfies ToolcraftVideoReferenceStudyEvidence;
104
-
105
- function createPlaybackTimelineSchema(durationSeconds = 5.8) {
106
- return {
107
- ...contractSchemaFixture,
108
- panels: {
109
- ...contractSchemaFixture.panels,
110
- timeline: {
111
- defaultDurationSeconds: durationSeconds,
112
- enabled: true,
113
- mode: "playback" as const,
114
- },
115
- },
116
- };
117
- }
118
-
119
- describe("starter acceptance video reference study contract", () => {
120
- it("requires video reference study when a new app cites video reference evidence", () => {
121
- expect(
122
- validateContractAcceptance({
123
- schema: createPlaybackTimelineSchema(),
124
- acceptance: [playbackTimelineAcceptance],
125
- transferMode: {
126
- animationIntent: {
127
- loopDuration: {
128
- evidence: "The source reference video /fixtures/reference-motion/ref.mp4 was inspected for motion behavior.",
129
- seconds: 5.8,
130
- source: "reference",
131
- },
132
- mode: "timeline-playback",
133
- },
134
- mode: "new-toolcraft-app",
135
- },
136
- }),
137
- ).toContain(
138
- "starterTransferMode cites a video reference, screen recording, GIF, extracted frames, or contact sheet; declare videoReferenceStudy with storyboard frames, frame-to-frame transition analysis, behavior decomposition, and acceptance mapping before implementation.",
139
- );
140
- });
141
-
142
- it("does not require video reference study for ordinary video export intent", () => {
143
- const schemaWithPlaybackTimeline = defineContractSchemaFixture({
144
- canvas: {
145
- enabled: true,
146
- upload: true,
147
- },
148
- panels: {
149
- controls: {
150
- sections: [],
151
- title: "Controls",
152
- },
153
- timeline: { defaultDurationSeconds: 6, enabled: true, mode: "playback" as const },
154
- },
155
- toolbar: {
156
- history: true,
157
- radar: true,
158
- zoom: true,
159
- },
160
- });
161
-
162
- expect(
163
- validateContractAcceptance({
164
- schema: schemaWithPlaybackTimeline,
165
- acceptance: [playbackTimelineAcceptance],
166
- transferMode: {
167
- animationIntent: {
168
- loopDuration: {
169
- evidence: "The product timing model derives a six second cycle for exported video output.",
170
- seconds: 6,
171
- source: "product-derived",
172
- },
173
- mode: "timeline-playback",
174
- },
175
- mode: "new-toolcraft-app",
176
- },
177
- }),
178
- ).toEqual([]);
179
- });
180
-
181
- it("accepts a new app video reference only with storyboard and transition acceptance mapping", () => {
182
- const schemaWithPlaybackTimeline = defineContractSchemaFixture({
183
- canvas: {
184
- enabled: true,
185
- upload: true,
186
- },
187
- panels: {
188
- controls: {
189
- sections: [],
190
- title: "Controls",
191
- },
192
- timeline: { defaultDurationSeconds: 5.8, enabled: true, mode: "playback" as const },
193
- },
194
- toolbar: {
195
- history: true,
196
- radar: true,
197
- zoom: true,
198
- },
199
- });
200
9
 
10
+ describe("starter acceptance motion reference pipeline", () => {
11
+ it("does not infer reference authority from prose when referenceInputs is explicitly empty", () => {
201
12
  expect(
202
13
  validateContractAcceptance({
203
- schema: schemaWithPlaybackTimeline,
204
- acceptance: [playbackTimelineAcceptance, videoReferenceMotionAcceptance],
14
+ acceptance: contractAcceptanceFixture,
15
+ schema: contractSchemaFixture,
205
16
  transferMode: {
17
+ ...contractTransferModeFixture,
206
18
  animationIntent: {
207
- loopDuration: {
208
- evidence: "The source reference timing comes from the inspected motion reference asset.",
209
- seconds: 5.8,
210
- source: "reference",
211
- },
212
- mode: "timeline-playback",
19
+ mode: "autonomous",
20
+ behaviorCoverage: [
21
+ "no-duration-control",
22
+ "no-export-at-time",
23
+ "no-loop-control",
24
+ "no-play-pause",
25
+ "no-scrub",
26
+ "no-user-facing-transport",
27
+ ],
28
+ reason:
29
+ "A decorative loop happens to mention an inspected video but owns no product time transport.",
213
30
  },
214
- mode: "new-toolcraft-app",
215
- videoReferenceStudy: videoReferenceStudyEvidence,
31
+ referenceInputs: [],
216
32
  },
217
33
  }),
218
34
  ).toEqual([]);
219
35
  });
220
36
 
221
- it("rejects incomplete video reference studies", () => {
37
+ it("routes explicit normalized reference inputs through the semantic validator", () => {
222
38
  expect(
223
39
  validateContractAcceptance({
40
+ acceptance: contractAcceptanceFixture,
224
41
  schema: contractSchemaFixture,
225
- acceptance: [],
226
42
  transferMode: {
227
- mode: "new-toolcraft-app",
228
- videoReferenceStudy: {
229
- acceptanceMapping: [
230
- {
231
- acceptanceId: "missing.acceptance",
232
- behavior: "Motion behavior",
233
- frameIds: ["f001"],
234
- },
235
- ],
236
- behaviorDecomposition: "",
237
- extractionEvidence: "",
238
- referenceLocation: "/fixtures/reference-motion/ref.mp4",
239
- storyboard: [
240
- {
241
- behaviorObservation: "Only one frame was inspected.",
242
- frameId: "f001",
243
- frameSource: "frames/frame_001.png",
244
- timeSeconds: 0,
245
- visualObservation: "A single static state.",
246
- },
247
- ],
248
- transitionAnalysis: [],
249
- },
43
+ ...contractTransferModeFixture,
44
+ referenceInputs: [
45
+ {
46
+ behaviors: [],
47
+ kind: "motion-reference",
48
+ referenceId:
49
+ "motion-reference-v1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
50
+ studies: [],
51
+ },
52
+ ],
250
53
  },
251
54
  }),
252
- ).toEqual(
253
- expect.arrayContaining([
254
- "videoReferenceStudy.extractionEvidence must explain how frames were inspected or extracted before implementation.",
255
- "videoReferenceStudy.behaviorDecomposition must decompose the observed frame-to-frame changes into product behavior to preserve.",
256
- "videoReferenceStudy.storyboard must include at least four timecoded frames so the reference is studied as motion, not a single screenshot.",
257
- "videoReferenceStudy.transitionAnalysis must include at least three frame-to-frame deltas proving how behavior changes between sampled frames.",
258
- 'videoReferenceStudy.acceptanceMapping "Motion behavior" points to missing acceptanceId "missing.acceptance".',
259
- ]),
55
+ ).toContain(
56
+ 'motion reference "motion-reference-v1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must declare at least one study.',
260
57
  );
261
58
  });
59
+
262
60
  });
@@ -20,6 +20,7 @@ const defaultPose = {
20
20
  const noAnimation: ToolcraftTransferMode = {
21
21
  animationIntent: { mode: "none" },
22
22
  mode: "new-toolcraft-app",
23
+ referenceInputs: [],
23
24
  };
24
25
 
25
26
  const timelineAnimation: ToolcraftTransferMode = {
@@ -32,6 +33,7 @@ const timelineAnimation: ToolcraftTransferMode = {
32
33
  mode: "timeline-playback",
33
34
  },
34
35
  mode: "new-toolcraft-app",
36
+ referenceInputs: [],
35
37
  };
36
38
 
37
39
  function createProductReadiness(
@@ -40,6 +42,7 @@ function createProductReadiness(
40
42
  return {
41
43
  exportIntent: {
42
44
  image: { mode: "toolcraft-default" },
45
+ svg: { mode: "not-requested" },
43
46
  video: { mode: "not-requested" },
44
47
  },
45
48
  interactionOwnership: [],
@@ -117,6 +120,7 @@ describe("Toolcraft spatial view interaction intent", () => {
117
120
  const productReadiness = {
118
121
  exportIntent: {
119
122
  image: { mode: "toolcraft-default" },
123
+ svg: { mode: "not-requested" },
120
124
  video: { mode: "not-requested" },
121
125
  },
122
126
  mode: "product",
@@ -13,6 +13,9 @@ import {
13
13
  import {
14
14
  TOOLCRAFT_DELIVERY_VERIFICATION_COMMAND,
15
15
  } from "../../scripts/toolcraft-performance-authority-policy.mjs";
16
+ import type {
17
+ ToolcraftMotionReferenceTimingMode,
18
+ } from "./acceptance/types";
16
19
 
17
20
  const appDir = dirname(fileURLToPath(import.meta.url));
18
21
  const projectDir = join(appDir, "../..");
@@ -92,10 +95,21 @@ export type AgentWorklogFixtureOptions = {
92
95
  trailHeading?: string;
93
96
  verificationLines?: readonly string[];
94
97
  };
98
+ export type WorklogMotionReference = Readonly<{
99
+ contactSheetPath: string;
100
+ referenceId: string;
101
+ requiresRealTimeReview: boolean;
102
+ requiresSlowedReview: boolean;
103
+ sourceSha256: string;
104
+ studyId: string;
105
+ timingMode: ToolcraftMotionReferenceTimingMode;
106
+ }>;
95
107
  const worklogVideoReferencePattern =
96
108
  /\b(?:source\/reference checked|source reviewed|reference inputs):[^\n]*(?:reference\s+(?:video|gif)|screen\s*recording|contact[-\s]*sheet|storyboard|frame[-\s]*by[-\s]*frame|extracted[-\s]*frames?|cleanshot|ffprobe|[^\s]+\.(?:mp4|mov|webm|gif))\b/i;
97
- const worklogVideoReferenceStudyPattern =
98
- /\b(video reference study|storyboard|frame[-\s]*by[-\s]*frame|transition analysis|frame[-\s]*to[-\s]*frame|contact[-\s]*sheet|extracted frames?)\b/i;
109
+ const motionReferenceRecordPattern =
110
+ /^\s*[-*]\s+Motion reference study:\s*(?<fields>\S.*)$/iu;
111
+ const motionReferenceFieldPattern =
112
+ /\b(?<name>referenceId|studyId|sourceSha256|timingMode|contactSheetPath|review)=(?<value>[^;]+?)(?=;\s*|$)/giu;
99
113
  export function readToolcraftDoc(relativePath: string): string {
100
114
  return readFileSync(join(projectDir, "docs/toolcraft", relativePath), "utf8");
101
115
  }
@@ -252,8 +266,96 @@ function escapeRegExp(value: string): string {
252
266
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
253
267
  }
254
268
 
255
- export function getAgentWorklogValidationErrors(source: string): string[] {
269
+ type MotionReferenceRecord = Readonly<{
270
+ contactSheetPath?: string;
271
+ referenceId?: string;
272
+ review?: string;
273
+ sourceSha256?: string;
274
+ studyId?: string;
275
+ timingMode?: string;
276
+ }>;
277
+
278
+ function getAuthoritativeWorklogSource(source: string): string {
279
+ return requiredAgentWorklogSections
280
+ .map((section) => getMarkdownSectionBody(source, section))
281
+ .join("\n");
282
+ }
283
+
284
+ function getMotionReferenceRecords(
285
+ authoritativeSource: string,
286
+ ): readonly MotionReferenceRecord[] {
287
+ return authoritativeSource.split(/\r?\n/u).flatMap((line) => {
288
+ const recordMatch = motionReferenceRecordPattern.exec(line);
289
+ if (!recordMatch?.groups?.fields) return [];
290
+
291
+ const fields: Record<string, string> = {};
292
+ for (const match of recordMatch.groups.fields.matchAll(
293
+ motionReferenceFieldPattern,
294
+ )) {
295
+ if (!match.groups) continue;
296
+ fields[match.groups.name] = match.groups.value
297
+ .trim()
298
+ .replace(/[.]$/u, "");
299
+ }
300
+ return [fields];
301
+ });
302
+ }
303
+
304
+ function recordMatchesMotionReference(
305
+ record: MotionReferenceRecord,
306
+ motionReference: WorklogMotionReference,
307
+ ): boolean {
308
+ if (
309
+ record.contactSheetPath !== motionReference.contactSheetPath ||
310
+ record.referenceId !== motionReference.referenceId ||
311
+ record.sourceSha256 !== motionReference.sourceSha256 ||
312
+ record.studyId !== motionReference.studyId ||
313
+ record.timingMode !== motionReference.timingMode
314
+ ) {
315
+ return false;
316
+ }
317
+
318
+ const reviewModes = new Set(
319
+ (record.review ?? "")
320
+ .split(",")
321
+ .map((value) => value.trim())
322
+ .filter(Boolean),
323
+ );
324
+ if (motionReference.timingMode === "ordinal") {
325
+ return (
326
+ reviewModes.has("ordered-frames") &&
327
+ !reviewModes.has("real-time") &&
328
+ !reviewModes.has("slowed")
329
+ );
330
+ }
331
+ if (
332
+ (motionReference.timingMode === "seconds" ||
333
+ motionReference.requiresRealTimeReview) &&
334
+ !reviewModes.has("real-time")
335
+ ) {
336
+ return false;
337
+ }
338
+ return (
339
+ !motionReference.requiresSlowedReview || reviewModes.has("slowed")
340
+ );
341
+ }
342
+
343
+ function describeRequiredReview(motionReference: WorklogMotionReference): string {
344
+ if (motionReference.timingMode === "ordinal") return "ordered-frames";
345
+ return motionReference.requiresSlowedReview
346
+ ? "real-time,slowed"
347
+ : "real-time";
348
+ }
349
+
350
+ export function getAgentWorklogValidationErrors(
351
+ source: string,
352
+ options: Readonly<{
353
+ motionReferences?: readonly WorklogMotionReference[];
354
+ }> = {},
355
+ ): string[] {
256
356
  const errors: string[] = [];
357
+ const motionReferences = options.motionReferences ?? [];
358
+ const authoritativeSource = getAuthoritativeWorklogSource(source);
257
359
 
258
360
  for (const section of requiredAgentWorklogSections) {
259
361
  if (!getMarkdownSectionBody(source, section)) {
@@ -315,11 +417,25 @@ export function getAgentWorklogValidationErrors(source: string): string[] {
315
417
  }
316
418
 
317
419
  if (
318
- worklogVideoReferencePattern.test(source) &&
319
- !worklogVideoReferenceStudyPattern.test(source)
420
+ worklogVideoReferencePattern.test(authoritativeSource) &&
421
+ motionReferences.length === 0
320
422
  ) {
321
423
  errors.push(
322
- "agent-worklog.md cites a video reference, screen recording, GIF, extracted frames, or contact sheet; record a Video Reference Study with storyboard frames and frame-to-frame transition analysis.",
424
+ "agent-worklog.md cites a video reference, screen recording, GIF, extracted frames, or contact sheet, but starterTransferMode.referenceInputs registers no motion reference input.",
425
+ );
426
+ }
427
+
428
+ const motionReferenceRecords = getMotionReferenceRecords(authoritativeSource);
429
+ for (const motionReference of motionReferences) {
430
+ if (
431
+ motionReferenceRecords.some((record) =>
432
+ recordMatchesMotionReference(record, motionReference),
433
+ )
434
+ ) {
435
+ continue;
436
+ }
437
+ errors.push(
438
+ `agent-worklog.md motion reference study "${motionReference.studyId}" for reference "${motionReference.referenceId}" must include one exact "Motion reference study:" record with referenceId=${motionReference.referenceId}; studyId=${motionReference.studyId}; sourceSha256=${motionReference.sourceSha256}; timingMode=${motionReference.timingMode}; contactSheetPath=${motionReference.contactSheetPath}; review=${describeRequiredReview(motionReference)}.`,
323
439
  );
324
440
  }
325
441