@pixel-point/toolcraft 0.0.17 → 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 (503) 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 +81 -89
  8. package/src/generate-test-doc-assertions.test.mjs +44 -1
  9. package/src/generate-test-doc-policy-assertions.mjs +92 -0
  10. package/src/generate-test-export-doc-assertions.mjs +53 -0
  11. package/src/generate-test-file-assertions.mjs +77 -83
  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 +17 -1
  20. package/src/generate-test-runtime-boundary-assertions.mjs +178 -0
  21. package/src/generate-test-standalone-assertions.mjs +7 -13
  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 +64 -5
  34. package/templates/runtime/contracts/component-contracts.choices.ts +55 -5
  35. package/templates/runtime/contracts/component-contracts.inputs.test.ts +6 -6
  36. package/templates/runtime/contracts/component-contracts.inputs.ts +8 -7
  37. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +8 -2
  38. package/templates/runtime/contracts/component-contracts.media-custom.ts +8 -2
  39. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +22 -8
  40. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +7 -1
  41. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +3 -0
  42. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +4 -1
  43. package/templates/runtime/contracts/component-contracts.runtime.ts +19 -12
  44. package/templates/runtime/contracts/component-contracts.test.ts +2 -0
  45. package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
  46. package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
  47. package/templates/runtime/contracts/decision-contracts.test.ts +35 -11
  48. package/templates/runtime/contracts/decision-contracts.ts +12 -12
  49. package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
  50. package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
  51. package/templates/runtime/export/artifact-download.ts +1 -0
  52. package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
  53. package/templates/runtime/export/artifact-frame-state.ts +16 -0
  54. package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
  55. package/templates/runtime/export/artifact-scene-frame.ts +3 -3
  56. package/templates/runtime/export/export-background.ts +0 -19
  57. package/templates/runtime/export/export-error.ts +5 -0
  58. package/templates/runtime/export/export-renderer-coverage.ts +54 -0
  59. package/templates/runtime/export/export.test.ts +45 -42
  60. package/templates/runtime/export/image-artifact-export.ts +2 -2
  61. package/templates/runtime/export/index.ts +57 -16
  62. package/templates/runtime/export/product-export-renderer.test.ts +38 -4
  63. package/templates/runtime/export/product-export-renderer.ts +0 -41
  64. package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
  65. package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
  66. package/templates/runtime/export/svg-artifact-export.ts +120 -0
  67. package/templates/runtime/export/svg-document.test.ts +221 -0
  68. package/templates/runtime/export/svg-document.ts +400 -0
  69. package/templates/runtime/export/svg-policy.ts +47 -0
  70. package/templates/runtime/index.ts +3 -0
  71. package/templates/runtime/model-import/model-import-limits.ts +15 -4
  72. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +21 -1
  73. package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
  74. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +75 -1
  75. package/templates/runtime/react/app-shell/toolcraft-app.tsx +24 -9
  76. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
  77. package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
  78. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +77 -1
  79. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +13 -1
  80. package/templates/runtime/react/canvas/canvas-shell.tsx +32 -6
  81. package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
  82. package/templates/runtime/react/canvas/product-scene-surface.test.tsx +195 -0
  83. package/templates/runtime/react/canvas/product-scene-surface.tsx +155 -0
  84. package/templates/runtime/react/canvas/runtime-scene-export.ts +1 -1
  85. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
  86. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +61 -0
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +89 -0
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
  90. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +40 -19
  91. package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
  92. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +40 -1
  93. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
  94. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +59 -0
  95. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +67 -0
  96. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
  97. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +4 -6
  98. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +41 -6
  99. package/templates/runtime/react/controls-panel/conditions/control-conditions.ts +32 -119
  100. package/templates/runtime/react/controls-panel/layout/controls-panel-control-group.tsx +5 -2
  101. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +41 -10
  102. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +7 -4
  103. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
  104. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
  105. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.test.tsx +63 -0
  106. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.tsx +138 -0
  107. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-items.tsx +104 -0
  108. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +115 -236
  109. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.test.tsx +95 -0
  110. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.tsx +82 -0
  111. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.test.tsx +73 -1
  112. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +50 -1
  113. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +1 -1
  114. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +2 -1
  115. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +38 -6
  116. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
  117. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
  118. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +1 -0
  119. package/templates/runtime/react/index.ts +4 -0
  120. package/templates/runtime/react/model-rendering/model-export.ts +1 -1
  121. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
  122. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-selection.ts +5 -5
  123. package/templates/runtime/react/orientation-gizmo/use-toolcraft-orientation-control-selection.ts +2 -2
  124. package/templates/runtime/scene/scene-bounds.test.ts +23 -0
  125. package/templates/runtime/scene/scene-bounds.ts +31 -17
  126. package/templates/runtime/schema/app-capabilities.test.ts +4 -0
  127. package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
  128. package/templates/runtime/schema/artifact-export-actions.ts +49 -0
  129. package/templates/runtime/schema/collection-item-controls.ts +29 -0
  130. package/templates/runtime/schema/control-applicability.test.ts +127 -0
  131. package/templates/runtime/schema/control-applicability.ts +433 -0
  132. package/templates/runtime/schema/control-schema-normalization.ts +177 -11
  133. package/templates/runtime/schema/controls-panel-actions.ts +2 -2
  134. package/templates/runtime/schema/controls-panel-section-layout.ts +14 -9
  135. package/templates/runtime/schema/controls-panel-section-roundtrip.test.ts +59 -0
  136. package/templates/runtime/schema/define-toolcraft.collection-actions-item-controls.test.ts +127 -0
  137. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +10 -4
  138. package/templates/runtime/schema/define-toolcraft.file-drop-item-controls.test.ts +98 -0
  139. package/templates/runtime/schema/define-toolcraft.file-drop-normalization.test.ts +27 -0
  140. package/templates/runtime/schema/define-toolcraft.segmented-control-fit.test.ts +20 -2
  141. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +16 -3
  142. package/templates/runtime/schema/define-toolcraft.source-collection.test.ts +79 -0
  143. package/templates/runtime/schema/runtime-setup-section.ts +24 -5
  144. package/templates/runtime/schema/types.ts +69 -13
  145. package/templates/runtime/state/canvas-background-state.ts +1 -16
  146. package/templates/runtime/state/canvas-state.ts +32 -20
  147. package/templates/runtime/state/control-value-codecs.test.ts +98 -0
  148. package/templates/runtime/state/control-value-codecs.ts +700 -0
  149. package/templates/runtime/state/control-value-normalization.test.ts +1 -1
  150. package/templates/runtime/state/control-value-normalization.ts +127 -135
  151. package/templates/runtime/state/controls-reducer.ts +26 -3
  152. package/templates/runtime/state/create-template-state.test.ts +30 -0
  153. package/templates/runtime/state/create-template-state.ts +52 -31
  154. package/templates/runtime/state/orientation-pose.ts +80 -0
  155. package/templates/runtime/state/persistence-control-values.test.ts +59 -0
  156. package/templates/runtime/state/reducer-controls.test.ts +45 -0
  157. package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
  158. package/templates/runtime/state/reducer-timeline.test.ts +70 -0
  159. package/templates/runtime/state/timeline-reducer.ts +40 -2
  160. package/templates/runtime/testing/performance-schema-queries.ts +2 -2
  161. package/templates/starter/AGENTS.md +29 -28
  162. package/templates/starter/docs/toolcraft/README.md +6 -6
  163. package/templates/starter/docs/toolcraft/acceptance-testing.md +34 -48
  164. package/templates/starter/docs/toolcraft/agent-worklog.md +103 -1
  165. package/templates/starter/docs/toolcraft/assembly-workflow.md +16 -8
  166. package/templates/starter/docs/toolcraft/component-rules.md +9 -7
  167. package/templates/starter/docs/toolcraft/core/control-selection.md +9 -3
  168. package/templates/starter/docs/toolcraft/core/layout.md +13 -8
  169. package/templates/starter/docs/toolcraft/core/media-upload.md +3 -1
  170. package/templates/starter/docs/toolcraft/core/performance.md +8 -10
  171. package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
  172. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +15 -3
  173. package/templates/starter/docs/toolcraft/core/setup-export.md +67 -11
  174. package/templates/starter/docs/toolcraft/custom-controls.md +6 -4
  175. package/templates/starter/docs/toolcraft/decision-contract.md +4 -2
  176. package/templates/starter/docs/toolcraft/performance.md +8 -10
  177. package/templates/starter/docs/toolcraft/renderer-technique.md +6 -2
  178. package/templates/starter/docs/toolcraft/schema-reference.md +24 -22
  179. package/templates/starter/docs/toolcraft/workflow.md +14 -14
  180. package/templates/starter/e2e/app-browser-control-applicability-requirements.spec.ts +163 -0
  181. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +45 -2
  182. package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
  183. package/templates/starter/e2e/app-browser-orientation-evidence.spec.ts +174 -21
  184. package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
  185. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +63 -33
  186. package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
  187. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +61 -15
  188. package/templates/starter/e2e/{browser-conditional-output-evidence-helpers.ts → browser-background-output-evidence.ts} +0 -68
  189. package/templates/starter/e2e/browser-control-applicability-evidence.ts +114 -0
  190. package/templates/starter/e2e/browser-infinity-canvas-evidence.ts +20 -11
  191. package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
  192. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
  193. package/templates/starter/e2e/browser-orientation-gizmo-evidence-helpers.ts +4 -0
  194. package/templates/starter/e2e/browser-orientation-gizmo-live-preconditions.ts +86 -0
  195. package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
  196. package/templates/starter/e2e/browser-proof-session.ts +43 -15
  197. package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
  198. package/templates/starter/e2e/browser-proof-types.ts +15 -0
  199. package/templates/starter/e2e/browser-runtime-applicability-requirements.ts +84 -0
  200. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +9 -2
  201. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +51 -32
  202. package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
  203. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +122 -0
  204. package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
  205. package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
  206. package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
  207. package/templates/starter/e2e/product-observable-helpers.ts +8 -129
  208. package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
  209. package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
  210. package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
  211. package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
  212. package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
  213. package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
  214. package/templates/starter/package.json +2 -0
  215. package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
  216. package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
  217. package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
  218. package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
  219. package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
  220. package/templates/starter/scripts/run-browser-performance.mjs +0 -6
  221. package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
  222. package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
  223. package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
  224. package/templates/starter/scripts/run-feature-verification.mjs +212 -0
  225. package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
  226. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
  227. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
  228. package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
  229. package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
  230. package/templates/starter/scripts/toolcraft-contract-manifest.json +1 -0
  231. package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
  232. package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
  233. package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
  234. package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
  235. package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
  236. package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
  237. package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
  238. package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
  239. package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
  240. package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
  241. package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
  242. package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
  243. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
  244. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
  245. package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
  246. package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
  247. package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
  248. package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
  249. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
  250. package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
  251. package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
  252. package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
  253. package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
  254. package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
  255. package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
  256. package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
  257. package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
  258. package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
  259. package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
  260. package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
  261. package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
  262. package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
  263. package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
  264. package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
  265. package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
  266. package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
  267. package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
  268. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
  269. package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
  270. package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
  271. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
  272. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
  273. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
  274. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
  275. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
  276. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
  277. package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
  278. package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
  279. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
  280. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
  281. package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
  282. package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
  283. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
  284. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
  285. package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
  286. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
  287. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
  288. package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
  289. package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
  290. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
  291. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
  292. package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
  293. package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
  294. package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
  295. package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
  296. package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
  297. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
  298. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
  299. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
  300. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
  301. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
  302. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
  303. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
  304. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
  305. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
  306. package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
  307. package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
  308. package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
  309. package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
  310. package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
  311. package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
  312. package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
  313. package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
  314. package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
  315. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
  316. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
  317. package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
  318. package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
  319. package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
  320. package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
  321. package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
  322. package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
  323. package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
  324. package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
  325. package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
  326. package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
  327. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +85 -115
  328. package/templates/starter/scripts/toolcraft-product-boundary-module-policy.mjs +101 -0
  329. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +0 -72
  330. package/templates/starter/scripts/toolcraft-product-control-bindings.mjs +182 -0
  331. package/templates/starter/scripts/toolcraft-product-control-boundary.mjs +146 -0
  332. package/templates/starter/scripts/toolcraft-product-control-boundary.test.mjs +186 -0
  333. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +16 -18
  334. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +200 -0
  335. package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
  336. package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
  337. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
  338. package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
  339. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
  340. package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
  341. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
  342. package/templates/starter/scripts/toolcraft-typescript-source-evidence-structure.test.mjs +20 -0
  343. package/templates/starter/scripts/toolcraft-typescript-source-evidence.mjs +1 -0
  344. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade.test.mjs +2 -0
  345. package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
  346. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
  347. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
  348. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
  349. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
  350. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
  351. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
  352. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
  353. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
  354. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +161 -0
  355. package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
  356. package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
  357. package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
  358. package/templates/starter/src/app/acceptance/conditions.ts +1 -1
  359. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +2 -2
  360. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +6 -31
  361. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +24 -5
  362. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +4 -16
  363. package/templates/starter/src/app/acceptance/control-applicability-cases.test.ts +321 -0
  364. package/templates/starter/src/app/acceptance/control-applicability-cases.ts +290 -0
  365. package/templates/starter/src/app/acceptance/control-applicability.ts +332 -0
  366. package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
  367. package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
  368. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +20 -9
  369. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +4 -6
  370. package/templates/starter/src/app/acceptance/control-layout-model.ts +4 -4
  371. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +21 -10
  372. package/templates/starter/src/app/acceptance/control-parts.ts +8 -0
  373. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.test.ts +215 -0
  374. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.ts +132 -0
  375. package/templates/starter/src/app/acceptance/control-section-inventory.test.ts +87 -0
  376. package/templates/starter/src/app/acceptance/control-section-inventory.ts +74 -44
  377. package/templates/starter/src/app/acceptance/custom-controls.ts +11 -3
  378. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
  379. package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
  380. package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
  381. package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
  382. package/templates/starter/src/app/acceptance/inline-layout.ts +64 -9
  383. package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
  384. package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
  385. package/templates/starter/src/app/acceptance/media-upload.ts +5 -1
  386. package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
  387. package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
  388. package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
  389. package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
  390. package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
  391. package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
  392. package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
  393. package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
  394. package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
  395. package/templates/starter/src/app/acceptance/orientation-gizmo.ts +18 -11
  396. package/templates/starter/src/app/acceptance/output-background-rules.ts +2 -2
  397. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
  398. package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
  399. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +22 -10
  400. package/templates/starter/src/app/acceptance/output-export-model.ts +58 -11
  401. package/templates/starter/src/app/acceptance/output-export.ts +25 -10
  402. package/templates/starter/src/app/acceptance/output-video-export-rules.ts +99 -0
  403. package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
  404. package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
  405. package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
  406. package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
  407. package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
  408. package/templates/starter/src/app/acceptance/types.ts +65 -125
  409. package/templates/starter/src/app/acceptance/validate-coverage.ts +33 -5
  410. package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
  411. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
  412. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +312 -0
  413. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +35 -0
  414. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +18 -1
  415. package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
  416. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +66 -1
  417. package/templates/starter/src/app/starter-acceptance.contract-fixtures.test.ts +41 -0
  418. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +113 -16
  419. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +225 -0
  420. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
  421. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
  422. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
  423. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +58 -3
  424. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +0 -111
  425. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +3 -1
  426. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
  427. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +1 -1
  428. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
  429. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +26 -0
  430. package/templates/starter/src/app/{starter-acceptance.image-video-export-settings.test.ts → starter-acceptance.image-export-settings.test.ts} +39 -9
  431. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +31 -3
  432. package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
  433. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +11 -1
  434. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +56 -0
  435. package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
  436. package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
  437. package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
  438. package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
  439. package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
  440. package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
  441. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +458 -0
  442. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +4 -0
  443. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +116 -104
  444. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +29 -0
  445. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
  446. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
  447. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
  448. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
  449. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +3 -1
  450. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +35 -24
  451. package/templates/starter/src/app/starter-acceptance.section-size.test.ts +72 -0
  452. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
  453. package/templates/starter/src/app/starter-acceptance.ts +45 -10
  454. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +338 -0
  455. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
  456. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +12 -0
  457. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
  458. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
  459. package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
  460. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
  461. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +5 -2
  462. package/templates/starter/src/routes/index.tsx +1 -0
  463. package/templates/starter/tsconfig.json +1 -0
  464. package/templates/ui/components/composites/tabs.tsx +2 -2
  465. package/templates/ui/components/controls/collection-actions/collection-item-groups.test.tsx +38 -0
  466. package/templates/ui/components/controls/collection-actions/collection-item-groups.tsx +36 -0
  467. package/templates/ui/components/controls/collection-actions/index.ts +2 -0
  468. package/templates/ui/components/controls/file-drop/file-drop-collection-control.tsx +137 -0
  469. package/templates/ui/components/controls/file-drop/file-drop-control.test.tsx +189 -0
  470. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +81 -88
  471. package/templates/ui/components/controls/file-drop/file-drop-presentation.tsx +131 -9
  472. package/templates/ui/components/controls/file-drop/file-drop-types.ts +36 -22
  473. package/templates/ui/components/controls/file-drop/index.ts +1 -0
  474. package/templates/ui/components/controls/index.ts +3 -0
  475. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +1 -1
  476. package/templates/ui/components/controls/range-slider/range-slider-value.test.ts +14 -0
  477. package/templates/ui/components/controls/range-slider/range-slider-value.ts +3 -2
  478. package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
  479. package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
  480. package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
  481. package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
  482. package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
  483. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
  484. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
  485. package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
  486. package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
  487. package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
  488. package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
  489. package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
  490. package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
  491. package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
  492. package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
  493. package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
  494. package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
  495. package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
  496. package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
  497. package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
  498. package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
  499. package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
  500. package/templates/starter/src/app/acceptance/condition-exclusivity.test.ts +0 -60
  501. package/templates/starter/src/app/acceptance/condition-exclusivity.ts +0 -221
  502. package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
  503. package/templates/starter/src/app/starter-verification-impact.json +0 -15
@@ -58,6 +58,7 @@ describe("starter acceptance section dependency contract", () => {
58
58
  sectionInventory: [
59
59
  {
60
60
  entity: "Shape",
61
+ entityId: "shape",
61
62
  groupingReason: "Shape setup",
62
63
  id: "shape",
63
64
  targets: ["shape.kind"],
@@ -73,7 +74,7 @@ describe("starter acceptance section dependency contract", () => {
73
74
  );
74
75
  });
75
76
 
76
- it("allows explicit workflow split evidence for one target entity", () => {
77
+ it("rejects workflow splitting when one entity fits in one section", () => {
77
78
  const schemaWithWorkflowSplit = defineContractSchemaFixture({
78
79
  canvas: { enabled: true },
79
80
  panels: {
@@ -118,6 +119,33 @@ describe("starter acceptance section dependency contract", () => {
118
119
  },
119
120
  });
120
121
 
122
+ const workflowSplitInventory = [
123
+ {
124
+ entity: "Object shape",
125
+ entityId: "object-shape",
126
+ groupingReason:
127
+ "Structure controls tune the physical footprint of the object.",
128
+ id: "shape-structure",
129
+ splitReason:
130
+ "Structure and density are separate workflow stages in this editor.",
131
+ targets: ["object.shape.size"],
132
+ title: "Shape Structure",
133
+ workflowStage: "structure",
134
+ },
135
+ {
136
+ entity: "Object shape",
137
+ entityId: "object-shape",
138
+ groupingReason:
139
+ "Density controls tune how many objects appear after structure is set.",
140
+ id: "shape-density",
141
+ splitReason:
142
+ "Density is separated from structure because users set count after the shape footprint.",
143
+ targets: ["object.shape.count"],
144
+ title: "Shape Density",
145
+ workflowStage: "density",
146
+ },
147
+ ] as const;
148
+
121
149
  expect(
122
150
  validateContractAcceptance({
123
151
  schema: schemaWithWorkflowSplit,
@@ -126,28 +154,11 @@ describe("starter acceptance section dependency contract", () => {
126
154
  makeControlAcceptance("object.shape.count", "slider"),
127
155
  ],
128
156
  transferMode: contractTransferModeFixture,
129
- sectionInventory: [
130
- {
131
- entity: "Object shape",
132
- groupingReason: "Structure controls tune the physical footprint of the object.",
133
- id: "shape-structure",
134
- splitReason: "Structure and density are separate workflow stages in this editor.",
135
- targets: ["object.shape.size"],
136
- title: "Shape Structure",
137
- workflowStage: "structure",
138
- },
139
- {
140
- entity: "Object shape",
141
- groupingReason: "Density controls tune how many objects appear after structure is set.",
142
- id: "shape-density",
143
- splitReason: "Density is separated from structure because users set count after the shape footprint.",
144
- targets: ["object.shape.count"],
145
- title: "Shape Density",
146
- workflowStage: "density",
147
- },
148
- ],
157
+ sectionInventory: workflowSplitInventory,
149
158
  }),
150
- ).toEqual([]);
159
+ ).toContain(
160
+ 'Control Section Inventory entity "object-shape" owns 2 controls across 2 sections (Shape Structure, Shape Density). Entities with 10 or fewer controls must stay in one section.',
161
+ );
151
162
  });
152
163
 
153
164
  it("rejects mode-gated controls split away from their selector section", () => {
@@ -203,7 +214,7 @@ describe("starter acceptance section dependency contract", () => {
203
214
  }),
204
215
  ).toEqual(
205
216
  expect.arrayContaining([
206
- 'Image / sourceUpload is gated by visibleWhen target "source.mode" in Source, but it belongs to the same dependency group. Keep selectors and their dependent controls in one semantic section when they describe one product entity or branch; use visibleWhen for branch-specific controls inside that section instead of splitting branch controls into their own section. Do not use disabledWhen for product controls.',
217
+ 'Image / sourceUpload is gated by applicability target "source.mode" in Source, but it belongs to the same dependency group. Keep selectors and their dependent controls in one semantic section when they describe one product entity or branch; use conditional applicability for branch-specific controls inside that section instead of splitting branch controls into their own section. Do not use disabledWhen for product controls.',
207
218
  ]),
208
219
  );
209
220
  });
@@ -259,7 +270,7 @@ describe("starter acceptance section dependency contract", () => {
259
270
  }),
260
271
  ).toEqual(
261
272
  expect.arrayContaining([
262
- 'Library / libraryAsset is gated by visibleWhen target "shape.kind" in Shape, but it belongs to the same dependency group. Keep selectors and their dependent controls in one semantic section when they describe one product entity or branch; use visibleWhen for branch-specific controls inside that section instead of splitting branch controls into their own section. Do not use disabledWhen for product controls.',
273
+ 'Library / libraryAsset is gated by applicability target "shape.kind" in Shape, but it belongs to the same dependency group. Keep selectors and their dependent controls in one semantic section when they describe one product entity or branch; use conditional applicability for branch-specific controls inside that section instead of splitting branch controls into their own section. Do not use disabledWhen for product controls.',
263
274
  ]),
264
275
  );
265
276
  });
@@ -0,0 +1,72 @@
1
+ import { defineToolcraft } from "@repo/toolcraft-runtime";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { getToolcraftControlSectionInvariantErrors } from "./acceptance/control-layout";
5
+
6
+ function makeSliderControls(count: number, includeSemanticGroup: boolean) {
7
+ return Object.fromEntries(
8
+ Array.from({ length: count }, (_, index) => {
9
+ const control = {
10
+ defaultValue: 0,
11
+ label: `Value ${index + 1}`,
12
+ max: 1,
13
+ min: 0,
14
+ orderRole: "detail" as const,
15
+ target: `dense.value${index + 1}`,
16
+ type: "slider" as const,
17
+ variant: "continuous" as const,
18
+ };
19
+
20
+ return [
21
+ `value${index + 1}`,
22
+ includeSemanticGroup
23
+ ? { ...control, semanticGroup: "dense-entity" }
24
+ : control,
25
+ ];
26
+ }),
27
+ );
28
+ }
29
+
30
+ function makeDenseSchema(count: number, includeSemanticGroup = true) {
31
+ return defineToolcraft({
32
+ canvas: { enabled: true },
33
+ panels: {
34
+ controls: {
35
+ sections: [
36
+ {
37
+ controls: makeSliderControls(count, includeSemanticGroup),
38
+ id: "dense-entity",
39
+ title: "Dense Entity",
40
+ },
41
+ ],
42
+ title: "Controls",
43
+ },
44
+ },
45
+ });
46
+ }
47
+
48
+ describe("starter acceptance section size boundaries", () => {
49
+ it("does not require semanticGroup at seven controls", () => {
50
+ expect(
51
+ getToolcraftControlSectionInvariantErrors(makeDenseSchema(7, false)),
52
+ ).toEqual([]);
53
+ });
54
+
55
+ it("accepts ten grouped controls in one section", () => {
56
+ expect(
57
+ getToolcraftControlSectionInvariantErrors(makeDenseSchema(10)),
58
+ ).toEqual([]);
59
+ });
60
+
61
+ it("requires semanticGroup beginning at eight controls", () => {
62
+ expect(
63
+ getToolcraftControlSectionInvariantErrors(makeDenseSchema(8, false)),
64
+ ).toEqual(
65
+ expect.arrayContaining([
66
+ expect.stringContaining(
67
+ "has 8 controls and must declare semanticGroup for every control",
68
+ ),
69
+ ]),
70
+ );
71
+ });
72
+ });
@@ -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(
@@ -4,6 +4,21 @@ import {
4
4
  } from "@repo/toolcraft-runtime";
5
5
 
6
6
  import { getRequiredToolcraftControlPartCoverage } from "./acceptance/control-parts";
7
+ export {
8
+ getToolcraftApplicabilitySelectorDomain,
9
+ getToolcraftControlApplicabilityErrors,
10
+ type ToolcraftApplicabilitySelectorDomain,
11
+ type ToolcraftApplicabilitySelectorValue,
12
+ } from "./acceptance/control-applicability";
13
+ export {
14
+ getToolcraftApplicabilityRequirementId,
15
+ getToolcraftControlApplicabilityCases,
16
+ type ToolcraftControlApplicabilityCase,
17
+ } from "./acceptance/control-applicability-cases";
18
+ export {
19
+ createToolcraftFeatureVerificationSelection,
20
+ type ToolcraftFeatureVerificationSelection,
21
+ } from "./acceptance/feature-verification-selection";
7
22
  import {
8
23
  getToolcraftControlOrder as getToolcraftControlOrderForSchema,
9
24
  getToolcraftControlOrderTargets as getToolcraftControlOrderTargetsForSchema,
@@ -17,7 +32,6 @@ import type {
17
32
  ToolcraftBuiltInFitCheck,
18
33
  ToolcraftBackgroundOutputCoverage,
19
34
  ToolcraftCanvasSizingCoverage,
20
- ToolcraftConditionalVisibilityCoverage,
21
35
  ToolcraftComponentAcceptance,
22
36
  ToolcraftControlOrderItem,
23
37
  ToolcraftControlPartCoverage,
@@ -32,11 +46,25 @@ import type {
32
46
  ToolcraftInfinityCanvasCoverage,
33
47
  ToolcraftMediaLifecycleCoverage,
34
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,
35
62
  ToolcraftPersistenceCoverage,
36
63
  ToolcraftProductReadiness,
37
64
  ToolcraftReferenceCoverage,
38
65
  ToolcraftReferenceFeatureInventoryItem,
39
66
  ToolcraftReferenceFeatureStatus,
67
+ ToolcraftReferenceInput,
40
68
  ToolcraftReferenceStudyEvidence,
41
69
  ToolcraftReferenceStudyStatus,
42
70
  ToolcraftReferenceTimelineContract,
@@ -45,16 +73,13 @@ import type {
45
73
  ToolcraftRenderScaleCoverage,
46
74
  ToolcraftRenderScaleState,
47
75
  ToolcraftSettingsTransferCoverage,
76
+ ToolcraftSelectionScopeCoverage,
48
77
  ToolcraftTimelineLoopDurationIntent,
49
78
  ToolcraftTimelineLoopDurationSource,
50
79
  ToolcraftTimelinePlaybackCoverage,
51
80
  ToolcraftTransferMode,
52
81
  ToolcraftViewInteractionEvidenceSource,
53
82
  ToolcraftViewInteractionIntent,
54
- ToolcraftVideoReferenceAcceptanceMapping,
55
- ToolcraftVideoReferenceStoryboardFrame,
56
- ToolcraftVideoReferenceStudyEvidence,
57
- ToolcraftVideoReferenceTransition,
58
83
  ToolcraftVisibleControl,
59
84
  } from "./acceptance/types";
60
85
  import { TOOLCRAFT_REQUIRED_MODEL_IMPORT_COVERAGE } from "./acceptance/types";
@@ -91,7 +116,6 @@ export type {
91
116
  ToolcraftBuiltInFitCheck,
92
117
  ToolcraftBackgroundOutputCoverage,
93
118
  ToolcraftCanvasSizingCoverage,
94
- ToolcraftConditionalVisibilityCoverage,
95
119
  ToolcraftComponentAcceptance,
96
120
  ToolcraftControlOrderItem,
97
121
  ToolcraftControlPartCoverage,
@@ -106,11 +130,25 @@ export type {
106
130
  ToolcraftInfinityCanvasCoverage,
107
131
  ToolcraftMediaLifecycleCoverage,
108
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,
109
146
  ToolcraftPersistenceCoverage,
110
147
  ToolcraftProductReadiness,
111
148
  ToolcraftReferenceCoverage,
112
149
  ToolcraftReferenceFeatureInventoryItem,
113
150
  ToolcraftReferenceFeatureStatus,
151
+ ToolcraftReferenceInput,
114
152
  ToolcraftReferenceStudyEvidence,
115
153
  ToolcraftReferenceStudyStatus,
116
154
  ToolcraftReferenceTimelineContract,
@@ -119,16 +157,13 @@ export type {
119
157
  ToolcraftRenderScaleCoverage,
120
158
  ToolcraftRenderScaleState,
121
159
  ToolcraftSettingsTransferCoverage,
160
+ ToolcraftSelectionScopeCoverage,
122
161
  ToolcraftTimelineLoopDurationIntent,
123
162
  ToolcraftTimelineLoopDurationSource,
124
163
  ToolcraftTimelinePlaybackCoverage,
125
164
  ToolcraftTransferMode,
126
165
  ToolcraftViewInteractionEvidenceSource,
127
166
  ToolcraftViewInteractionIntent,
128
- ToolcraftVideoReferenceAcceptanceMapping,
129
- ToolcraftVideoReferenceStoryboardFrame,
130
- ToolcraftVideoReferenceStudyEvidence,
131
- ToolcraftVideoReferenceTransition,
132
167
  ToolcraftVisibleControl,
133
168
  };
134
169
 
@@ -0,0 +1,338 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import type { ToolcraftComponentAcceptance } from "./acceptance/types";
4
+ import { getToolcraftOutputExportErrors } from "./acceptance/output-export";
5
+ import { buildToolcraftOutputExportFacts } from "./acceptance/output-export-model";
6
+ import { getToolcraftVideoExportErrors } from "./acceptance/output-video-export-rules";
7
+ import { collectToolcraftVisibleAcceptanceControls } from "./acceptance/validate-coverage";
8
+ import { defineContractSchemaFixture, validateContractAcceptance } from "./starter-acceptance.contract-fixtures";
9
+ import {
10
+ makeBackgroundSection,
11
+ makeExportSettingsProductReadiness,
12
+ } from "./starter-acceptance.export-test-utils";
13
+ import { makeControlAcceptance } from "./starter-acceptance.test-utils";
14
+
15
+ describe("Toolcraft video export settings acceptance contract", () => {
16
+ it("accepts a Segmented video format paired with a Select resolution", () => {
17
+ const schemaWithSegmentedVideoFormat = defineContractSchemaFixture({
18
+ canvas: {
19
+ enabled: true,
20
+ sizing: { mode: "editable-output" },
21
+ },
22
+ panels: {
23
+ controls: {
24
+ sections: [
25
+ makeBackgroundSection(),
26
+ {
27
+ controls: {
28
+ videoFormat: {
29
+ defaultValue: "mp4",
30
+ label: "Format",
31
+ options: [
32
+ { label: "MP4", value: "mp4" },
33
+ { label: "WebM", value: "webm" },
34
+ ],
35
+ target: "export.video.format",
36
+ type: "segmented",
37
+ },
38
+ videoResolution: {
39
+ defaultValue: "current",
40
+ label: "Resolution",
41
+ options: [
42
+ { label: "Current", value: "current" },
43
+ { label: "4K", value: "4k" },
44
+ ],
45
+ target: "export.video.resolution",
46
+ type: "select",
47
+ },
48
+ },
49
+ layoutGroups: [
50
+ {
51
+ columns: 2,
52
+ controls: ["videoFormat", "videoResolution"],
53
+ layout: "inline",
54
+ },
55
+ ],
56
+ title: "Video Export",
57
+ },
58
+ {
59
+ actionGroup: "secondary",
60
+ controls: {
61
+ outputActions: {
62
+ actions: [
63
+ {
64
+ icon: "upload-simple",
65
+ label: "Export Video",
66
+ role: "export-video",
67
+ value: "export.video",
68
+ },
69
+ ],
70
+ target: "actions.output",
71
+ type: "panelActions",
72
+ },
73
+ },
74
+ title: "Export",
75
+ },
76
+ ],
77
+ title: "Controls",
78
+ },
79
+ },
80
+ });
81
+ const segmentedProductReadiness = makeExportSettingsProductReadiness({
82
+ image: {
83
+ evidence: "The user explicitly removed image delivery.",
84
+ mode: "user-removed",
85
+ },
86
+ svg: { mode: "not-requested" },
87
+ video: {
88
+ evidence: "The user explicitly requested video delivery.",
89
+ mode: "user-requested",
90
+ },
91
+ });
92
+ const videoFormatAcceptance = makeControlAcceptance(
93
+ "export.video.format",
94
+ "segmented",
95
+ );
96
+ videoFormatAcceptance.optionCoverage = ["mp4", "webm"];
97
+ const videoResolutionAcceptance = makeControlAcceptance(
98
+ "export.video.resolution",
99
+ "select",
100
+ );
101
+ videoResolutionAcceptance.optionCoverage = ["current", "4k"];
102
+ const acceptance: readonly ToolcraftComponentAcceptance[] = [
103
+ makeControlAcceptance("appearance.background", "color"),
104
+ makeControlAcceptance("export.includeBackground", "switch"),
105
+ videoFormatAcceptance,
106
+ videoResolutionAcceptance,
107
+ {
108
+ actionCoverage: ["export.video"],
109
+ automated: true,
110
+ automatedTestName: "exports segmented-format video output",
111
+ browser: true,
112
+ browserTestName: "browser: exports segmented-format video output",
113
+ componentType: "panelActions",
114
+ evidence: "exported-bytes",
115
+ expectedObservable: "Export Video creates validated video bytes.",
116
+ exportArtifactCoverage: "all-required-video-export-behavior",
117
+ fixture: "segmented video export fixture",
118
+ id: "actions.output",
119
+ kind: "control",
120
+ target: "actions.output",
121
+ userAction: "Choose MP4 or WebM, then export and inspect the video artifact.",
122
+ },
123
+ ];
124
+
125
+ expect(
126
+ getToolcraftOutputExportErrors({
127
+ acceptance,
128
+ controls: collectToolcraftVisibleAcceptanceControls(
129
+ schemaWithSegmentedVideoFormat,
130
+ ),
131
+ productReadiness: segmentedProductReadiness,
132
+ schema: schemaWithSegmentedVideoFormat,
133
+ }),
134
+ ).toEqual([]);
135
+
136
+ expect(
137
+ validateContractAcceptance({
138
+ acceptance,
139
+ productReadiness: segmentedProductReadiness,
140
+ schema: schemaWithSegmentedVideoFormat,
141
+ }),
142
+ ).not.toEqual(
143
+ expect.arrayContaining([
144
+ expect.stringContaining("includes segmented control videoFormat"),
145
+ ]),
146
+ );
147
+ });
148
+
149
+ it.each([
150
+ {
151
+ expected:
152
+ 'Video Export format options must be exactly "mp4" and "webm".',
153
+ formatOptions: ["mp4", "webm", "mov"],
154
+ name: "extra video format",
155
+ resolutionOptions: ["current", "4k"],
156
+ },
157
+ {
158
+ expected:
159
+ 'Video Export format options must be exactly "mp4" and "webm".',
160
+ formatOptions: ["mp4", "webm", "webm"],
161
+ name: "duplicate video format",
162
+ resolutionOptions: ["current", "4k"],
163
+ },
164
+ {
165
+ expected:
166
+ 'Video Export resolution options must be exactly "current" and "4k".',
167
+ formatOptions: ["mp4", "webm"],
168
+ name: "extra video resolution",
169
+ resolutionOptions: ["current", "4k", "8k"],
170
+ },
171
+ {
172
+ expected:
173
+ 'Video Export resolution options must be exactly "current" and "4k".',
174
+ formatOptions: ["mp4", "webm"],
175
+ name: "duplicate video resolution",
176
+ resolutionOptions: ["current", "4k", "4k"],
177
+ },
178
+ ])("rejects an $name option", ({
179
+ expected,
180
+ formatOptions,
181
+ resolutionOptions,
182
+ }) => {
183
+ const schema = defineContractSchemaFixture({
184
+ canvas: { enabled: true },
185
+ panels: {
186
+ controls: {
187
+ sections: [
188
+ {
189
+ controls: {
190
+ videoFormat: {
191
+ defaultValue: "mp4",
192
+ label: "Format",
193
+ options: formatOptions.map((value) => ({
194
+ label: value.toUpperCase(),
195
+ value,
196
+ })),
197
+ target: "export.video.format",
198
+ type: "select",
199
+ },
200
+ videoResolution: {
201
+ defaultValue: "current",
202
+ label: "Resolution",
203
+ options: resolutionOptions.map((value) => ({
204
+ label: value.toUpperCase(),
205
+ value,
206
+ })),
207
+ target: "export.video.resolution",
208
+ type: "select",
209
+ },
210
+ },
211
+ layoutGroups: [
212
+ {
213
+ columns: 2,
214
+ controls: ["videoFormat", "videoResolution"],
215
+ layout: "inline",
216
+ },
217
+ ],
218
+ title: "Video Export",
219
+ },
220
+ ],
221
+ title: "Controls",
222
+ },
223
+ },
224
+ });
225
+
226
+ expect(
227
+ getToolcraftVideoExportErrors(
228
+ buildToolcraftOutputExportFacts({ schema }),
229
+ ),
230
+ ).toContain(expected);
231
+ });
232
+
233
+ it("validates the complete video format, resolution, defaults, and layout contract", () => {
234
+ const malformedVideoSchema = defineContractSchemaFixture({
235
+ canvas: {
236
+ enabled: true,
237
+ sizing: { mode: "editable-output" },
238
+ },
239
+ panels: {
240
+ controls: {
241
+ sections: [
242
+ makeBackgroundSection(),
243
+ {
244
+ controls: {
245
+ videoFormat: {
246
+ defaultValue: "mov",
247
+ label: "Format",
248
+ target: "export.video.format",
249
+ textValueKind: "single-line",
250
+ type: "text",
251
+ },
252
+ videoResolution: {
253
+ defaultValue: "8k",
254
+ label: "Resolution",
255
+ options: [
256
+ { label: "Current", value: "current" },
257
+ { label: "8K", value: "8k" },
258
+ ],
259
+ target: "export.video.resolution",
260
+ type: "segmented",
261
+ },
262
+ },
263
+ title: "Video Export",
264
+ },
265
+ {
266
+ actionGroup: "secondary",
267
+ controls: {
268
+ outputActions: {
269
+ actions: [
270
+ {
271
+ icon: "upload-simple",
272
+ label: "Export Video",
273
+ role: "export-video",
274
+ value: "export.video",
275
+ },
276
+ ],
277
+ target: "actions.output",
278
+ type: "panelActions",
279
+ },
280
+ },
281
+ title: "Export",
282
+ },
283
+ ],
284
+ title: "Controls",
285
+ },
286
+ },
287
+ });
288
+
289
+ expect(
290
+ validateContractAcceptance({
291
+ acceptance: [
292
+ makeControlAcceptance("appearance.background", "color"),
293
+ makeControlAcceptance("export.includeBackground", "switch"),
294
+ makeControlAcceptance("export.video.format", "text"),
295
+ makeControlAcceptance("export.video.resolution", "segmented"),
296
+ {
297
+ actionCoverage: ["export.video"],
298
+ automated: true,
299
+ automatedTestName: "exports video output",
300
+ browser: true,
301
+ browserTestName: "browser: exports video output",
302
+ componentType: "panelActions",
303
+ evidence: "exported-bytes",
304
+ expectedObservable: "Export Video creates validated video bytes.",
305
+ exportArtifactCoverage: "all-required-video-export-behavior",
306
+ fixture: "video-only export fixture",
307
+ id: "actions.output",
308
+ kind: "control",
309
+ target: "actions.output",
310
+ userAction: "Export and inspect the video artifact.",
311
+ },
312
+ ],
313
+ productReadiness: makeExportSettingsProductReadiness({
314
+ image: {
315
+ evidence: "The user explicitly removed image delivery.",
316
+ mode: "user-removed",
317
+ },
318
+ svg: { mode: "not-requested" },
319
+ video: {
320
+ evidence: "The user explicitly requested video delivery.",
321
+ mode: "user-requested",
322
+ },
323
+ }),
324
+ schema: malformedVideoSchema,
325
+ }),
326
+ ).toEqual(
327
+ expect.arrayContaining([
328
+ "Video Export format must be a Select or Segmented control.",
329
+ 'Video Export format options must be exactly "mp4" and "webm".',
330
+ 'Video Export format must default to "mp4".',
331
+ "Video Export resolution must be a Select control.",
332
+ 'Video Export resolution options must be exactly "current" and "4k".',
333
+ 'Video Export resolution must default to "current".',
334
+ "Video Export format and resolution must render as one exact two-column inline row.",
335
+ ]),
336
+ );
337
+ });
338
+ });