@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
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  defineToolcraft,
3
+ resolveToolcraftControlApplicability,
4
+ type ResolvedToolcraftAppSchema,
3
5
  type ToolcraftAppSchema,
4
6
  } from "@repo/toolcraft-runtime";
5
7
 
@@ -16,8 +18,32 @@ import {
16
18
  } from "./acceptance/validate-coverage";
17
19
 
18
20
  export function defineContractSchemaFixture(schema: ToolcraftAppSchema) {
21
+ const controls = schema.panels.controls
22
+ ? {
23
+ ...schema.panels.controls,
24
+ sections: schema.panels.controls.sections.map((section) => ({
25
+ ...section,
26
+ controls: Object.fromEntries(
27
+ Object.entries(section.controls).map(([controlId, control]) => [
28
+ controlId,
29
+ control.applicability || control.visibleWhen
30
+ ? control
31
+ : {
32
+ ...control,
33
+ applicability: { mode: "always" as const },
34
+ },
35
+ ]),
36
+ ),
37
+ })),
38
+ }
39
+ : undefined;
40
+
19
41
  return defineToolcraft({
20
42
  ...schema,
43
+ panels: {
44
+ ...schema.panels,
45
+ ...(controls ? { controls } : {}),
46
+ },
21
47
  persistence: { storage: "none" },
22
48
  });
23
49
  }
@@ -47,6 +73,7 @@ export const contractSectionInventoryFixture: readonly ToolcraftControlSectionIn
47
73
  export const contractTransferModeFixture: ToolcraftTransferMode = {
48
74
  animationIntent: { mode: "none" },
49
75
  mode: "new-toolcraft-app",
76
+ referenceInputs: [],
50
77
  };
51
78
 
52
79
  export const contractProductReadinessFixture: ToolcraftProductReadiness = {
@@ -54,28 +81,98 @@ export const contractProductReadinessFixture: ToolcraftProductReadiness = {
54
81
  reason: "Neutral contract fixture without a product-owned spatial scene.",
55
82
  };
56
83
 
57
- export function validateContractAcceptance(
58
- overrides: Partial<ToolcraftAcceptanceValidationInput> = {},
59
- ): string[] {
60
- return validateToolcraftAcceptanceCoverage({
84
+ type ContractAcceptanceOverrides = Omit<
85
+ Partial<ToolcraftAcceptanceValidationInput>,
86
+ "schema"
87
+ > & {
88
+ schema?: ContractValidationSchemaFixture;
89
+ };
90
+
91
+ type ContractValidationSchemaFixture = Omit<
92
+ ResolvedToolcraftAppSchema,
93
+ "panels"
94
+ > & {
95
+ panels: Omit<ResolvedToolcraftAppSchema["panels"], "controls"> & {
96
+ controls?: ToolcraftAppSchema["panels"]["controls"];
97
+ };
98
+ };
99
+
100
+ function resolveContractValidationSchemaFixture(
101
+ schema: ContractValidationSchemaFixture,
102
+ ): ResolvedToolcraftAppSchema {
103
+ const {
104
+ controls: _fixtureControls,
105
+ ...panelsWithoutFixtureControls
106
+ } = schema.panels;
107
+ const controls = schema.panels.controls
108
+ ? {
109
+ ...schema.panels.controls,
110
+ sections: schema.panels.controls.sections.map((section) => ({
111
+ ...section,
112
+ controls: Object.fromEntries(
113
+ Object.entries(section.controls).map(([controlId, control]) => {
114
+ const {
115
+ applicability: authoredApplicability,
116
+ visibleWhen,
117
+ ...controlWithoutApplicability
118
+ } = control;
119
+
120
+ return [
121
+ controlId,
122
+ {
123
+ ...controlWithoutApplicability,
124
+ applicability: resolveToolcraftControlApplicability({
125
+ applicability:
126
+ authoredApplicability ??
127
+ (visibleWhen ? undefined : { mode: "always" }),
128
+ visibleWhen,
129
+ }),
130
+ },
131
+ ];
132
+ }),
133
+ ),
134
+ })),
135
+ }
136
+ : undefined;
137
+
138
+ // Contract tests deliberately preserve malformed post-normalization fields so
139
+ // the matching acceptance validator, rather than defineToolcraft, reports them.
140
+ return {
141
+ ...schema,
142
+ panels: {
143
+ ...panelsWithoutFixtureControls,
144
+ ...(controls ? { controls } : {}),
145
+ },
146
+ } as ResolvedToolcraftAppSchema;
147
+ }
148
+
149
+ function resolveContractAcceptanceInput(
150
+ overrides: ContractAcceptanceOverrides,
151
+ ): ToolcraftAcceptanceValidationInput {
152
+ const { schema = contractSchemaFixture, ...remainingOverrides } = overrides;
153
+
154
+ return {
61
155
  acceptance: contractAcceptanceFixture,
62
156
  productReadiness: contractProductReadinessFixture,
63
- schema: contractSchemaFixture,
157
+ schema: resolveContractValidationSchemaFixture(schema),
64
158
  sectionInventory: contractSectionInventoryFixture,
65
159
  transferMode: contractTransferModeFixture,
66
- ...overrides,
67
- });
160
+ ...remainingOverrides,
161
+ };
162
+ }
163
+
164
+ export function validateContractAcceptance(
165
+ overrides: ContractAcceptanceOverrides = {},
166
+ ): string[] {
167
+ return validateToolcraftAcceptanceCoverage(
168
+ resolveContractAcceptanceInput(overrides),
169
+ );
68
170
  }
69
171
 
70
172
  export function validateContractAcceptanceDiagnostics(
71
- overrides: Partial<ToolcraftAcceptanceValidationInput> = {},
173
+ overrides: ContractAcceptanceOverrides = {},
72
174
  ) {
73
- return validateToolcraftAcceptanceDiagnostics({
74
- acceptance: contractAcceptanceFixture,
75
- productReadiness: contractProductReadinessFixture,
76
- schema: contractSchemaFixture,
77
- sectionInventory: contractSectionInventoryFixture,
78
- transferMode: contractTransferModeFixture,
79
- ...overrides,
80
- });
175
+ return validateToolcraftAcceptanceDiagnostics(
176
+ resolveContractAcceptanceInput(overrides),
177
+ );
81
178
  }
@@ -0,0 +1,225 @@
1
+ import {
2
+ defineToolcraft,
3
+ type ToolcraftControlSchema,
4
+ } from "@repo/toolcraft-runtime";
5
+ import { describe, expect, it } from "vitest";
6
+
7
+ import { getToolcraftControlApplicabilityErrors } from "./acceptance/control-applicability";
8
+ import type { ToolcraftProductReadiness } from "./acceptance/types";
9
+ import { collectToolcraftVisibleAcceptanceControls } from "./acceptance/validate-coverage";
10
+
11
+ const productReadiness: ToolcraftProductReadiness = {
12
+ exportIntent: {
13
+ image: { mode: "toolcraft-default" },
14
+ svg: { mode: "not-requested" },
15
+ video: { mode: "not-requested" },
16
+ },
17
+ interactionOwnership: [],
18
+ mode: "product",
19
+ productName: "Shape fixture",
20
+ productSummary: "Neutral applicability contract fixture.",
21
+ requestedBehavior: "Show only controls that apply to the selected shape.",
22
+ viewInteraction: { mode: "non-spatial", reason: "Schema-only fixture." },
23
+ };
24
+
25
+ const shapeKind: ToolcraftControlSchema = {
26
+ applicability: { mode: "always" },
27
+ defaultValue: "circle",
28
+ options: [
29
+ { label: "Circle", value: "circle" },
30
+ { label: "Square", value: "square" },
31
+ { label: "Polygon", value: "polygon" },
32
+ { label: "Star", value: "star" },
33
+ ],
34
+ target: "shape.kind",
35
+ type: "segmented",
36
+ };
37
+
38
+ const alwaysControls: Record<string, ToolcraftControlSchema> = {
39
+ kind: shapeKind,
40
+ cornerRadius: {
41
+ applicability: {
42
+ all: [
43
+ {
44
+ oneOf: ["square", "polygon", "star"],
45
+ target: "shape.kind",
46
+ },
47
+ ],
48
+ mode: "conditional",
49
+ },
50
+ target: "shape.cornerRadius",
51
+ type: "slider",
52
+ },
53
+ depth: {
54
+ applicability: {
55
+ all: [{ equals: "star", target: "shape.kind" }],
56
+ mode: "conditional",
57
+ },
58
+ target: "shape.depth",
59
+ type: "slider",
60
+ },
61
+ sides: {
62
+ applicability: {
63
+ all: [
64
+ { oneOf: ["polygon", "star"], target: "shape.kind" },
65
+ ],
66
+ mode: "conditional",
67
+ },
68
+ target: "shape.sides",
69
+ type: "slider",
70
+ },
71
+ };
72
+
73
+ function validateProduct(
74
+ controls: Record<string, ToolcraftControlSchema>,
75
+ ): string[] {
76
+ const schema = defineToolcraft({
77
+ canvas: { enabled: true },
78
+ panels: {
79
+ controls: {
80
+ sections: [{ controls, id: "shape", title: "Shape" }],
81
+ title: "Controls",
82
+ },
83
+ },
84
+ });
85
+
86
+ return getToolcraftControlApplicabilityErrors({
87
+ controls: collectToolcraftVisibleAcceptanceControls(schema),
88
+ productReadiness,
89
+ });
90
+ }
91
+
92
+ describe("starter product control applicability", () => {
93
+ it("requires explicit product applicability and rejects legacy visibility", () => {
94
+ expect(
95
+ validateProduct({
96
+ kind: shapeKind,
97
+ sides: { target: "shape.sides", type: "slider" },
98
+ }),
99
+ ).toContainEqual(
100
+ expect.stringContaining("shape.sides must declare explicit applicability"),
101
+ );
102
+
103
+ expect(
104
+ validateProduct({
105
+ kind: shapeKind,
106
+ sides: {
107
+ target: "shape.sides",
108
+ type: "slider",
109
+ visibleWhen: { equals: "star", target: "shape.kind" },
110
+ },
111
+ }),
112
+ ).toContainEqual(
113
+ expect.stringContaining("shape.sides uses legacy visibleWhen"),
114
+ );
115
+ });
116
+
117
+ it("rejects missing, invalid, contradictory, and unsupported selectors", () => {
118
+ expect(
119
+ validateProduct({
120
+ kind: shapeKind,
121
+ sides: {
122
+ applicability: {
123
+ all: [{ equals: true, target: "shape.missing" }],
124
+ mode: "conditional",
125
+ },
126
+ target: "shape.sides",
127
+ type: "slider",
128
+ },
129
+ }),
130
+ ).toContainEqual(
131
+ expect.stringContaining('predicate target "shape.missing" does not exist'),
132
+ );
133
+
134
+ expect(
135
+ validateProduct({
136
+ kind: shapeKind,
137
+ sides: {
138
+ applicability: {
139
+ all: [{ equals: "triangle", target: "shape.kind" }],
140
+ mode: "conditional",
141
+ },
142
+ target: "shape.sides",
143
+ type: "slider",
144
+ },
145
+ }),
146
+ ).toContainEqual(
147
+ expect.stringContaining(
148
+ 'value "triangle" is not an option of shape.kind',
149
+ ),
150
+ );
151
+
152
+ expect(
153
+ validateProduct({
154
+ kind: shapeKind,
155
+ sides: {
156
+ applicability: {
157
+ all: [
158
+ { equals: "polygon", target: "shape.kind" },
159
+ { equals: "star", target: "shape.kind" },
160
+ ],
161
+ mode: "conditional",
162
+ },
163
+ target: "shape.sides",
164
+ type: "slider",
165
+ },
166
+ }),
167
+ ).toContainEqual(
168
+ expect.stringContaining("shape.sides applicability is unsatisfiable"),
169
+ );
170
+
171
+ expect(
172
+ validateProduct({
173
+ kind: shapeKind,
174
+ name: {
175
+ applicability: { mode: "always" },
176
+ target: "shape.name",
177
+ type: "text",
178
+ },
179
+ sides: {
180
+ applicability: {
181
+ all: [{ equals: "named", target: "shape.name" }],
182
+ mode: "conditional",
183
+ },
184
+ target: "shape.sides",
185
+ type: "slider",
186
+ },
187
+ }),
188
+ ).toContainEqual(
189
+ expect.stringContaining(
190
+ "shape.name is not a supported applicability selector",
191
+ ),
192
+ );
193
+ });
194
+
195
+ it("rejects numeric gates with no satisfying selector value", () => {
196
+ expect(
197
+ validateProduct({
198
+ count: {
199
+ applicability: { mode: "always" },
200
+ defaultValue: 2,
201
+ max: 3,
202
+ min: 1,
203
+ step: 1,
204
+ target: "shape.count",
205
+ type: "slider",
206
+ variant: "discrete",
207
+ },
208
+ sides: {
209
+ applicability: {
210
+ all: [{ greaterThan: 10, target: "shape.count" }],
211
+ mode: "conditional",
212
+ },
213
+ target: "shape.sides",
214
+ type: "slider",
215
+ },
216
+ }),
217
+ ).toContainEqual(
218
+ expect.stringContaining("shape.sides has no satisfying value in shape.count"),
219
+ );
220
+ });
221
+
222
+ it("accepts a complete finite applicability declaration", () => {
223
+ expect(validateProduct(alwaysControls)).toEqual([]);
224
+ });
225
+ });
@@ -52,6 +52,7 @@ describe("starter acceptance control label context contract", () => {
52
52
  reason: "The motion speed is a decorative self-running effect and does not expose product time transport.",
53
53
  },
54
54
  mode: "new-toolcraft-app",
55
+ referenceInputs: [],
55
56
  },
56
57
  }),
57
58
  ).toEqual([]);
@@ -259,8 +259,81 @@ describe("starter acceptance control label contract", () => {
259
259
  }),
260
260
  ).toEqual(
261
261
  expect.arrayContaining([
262
- 'Accent Shades / accent1 uses visible label "Color 1" for a palette variation color. When colors only add variety to one shared palette, set label: false or use collectionActions with unlabeled items. Keep visible labels only when each color edits a distinct user-facing entity such as Fill, Stroke, Background, Connector, or Object color.',
263
- 'Accent Shades / accent2 uses visible label "Color 2" for a palette variation color. When colors only add variety to one shared palette, set label: false or use collectionActions with unlabeled items. Keep visible labels only when each color edits a distinct user-facing entity such as Fill, Stroke, Background, Connector, or Object color.',
262
+ 'Accent Shades / accent1 uses visible label "Color 1" for one of multiple sibling colors. Set label: false when the colors form one shared bank, or use a distinct user-facing role such as Fill, Stroke, Background, Connector, or Object color.',
263
+ 'Accent Shades / accent2 uses visible label "Color 2" for one of multiple sibling colors. Set label: false when the colors form one shared bank, or use a distinct user-facing role such as Fill, Stroke, Background, Connector, or Object color.',
264
+ ]),
265
+ );
266
+ });
267
+
268
+ it("rejects sequential labels for sibling colors without palette keywords", () => {
269
+ const schemaWithSpectrumColors = defineContractSchemaFixture({
270
+ canvas: { enabled: true },
271
+ panels: {
272
+ controls: {
273
+ sections: [
274
+ {
275
+ controls: {
276
+ spectrum: {
277
+ defaultValue: "custom",
278
+ label: "Spectrum",
279
+ options: [{ label: "Custom", value: "custom" }],
280
+ target: "dispersion.spectrum",
281
+ type: "select",
282
+ },
283
+ customColorA: {
284
+ defaultValue: { hex: "#A65F15" },
285
+ label: "Color 1",
286
+ semanticGroup: "custom-spectrum",
287
+ target: "dispersion.customColorA",
288
+ type: "color",
289
+ },
290
+ customColorB: {
291
+ defaultValue: { hex: "#371C4D" },
292
+ label: "Color 2",
293
+ semanticGroup: "custom-spectrum",
294
+ target: "dispersion.customColorB",
295
+ type: "color",
296
+ },
297
+ customColorC: {
298
+ defaultValue: { hex: "#375B75" },
299
+ label: "Color 3",
300
+ semanticGroup: "custom-spectrum",
301
+ target: "dispersion.customColorC",
302
+ type: "color",
303
+ },
304
+ customColorD: {
305
+ defaultValue: { hex: "#2A343E" },
306
+ label: "Color 4",
307
+ semanticGroup: "custom-spectrum",
308
+ target: "dispersion.customColorD",
309
+ type: "color",
310
+ },
311
+ },
312
+ title: "Spectrum",
313
+ },
314
+ ],
315
+ title: "Controls",
316
+ },
317
+ },
318
+ });
319
+
320
+ expect(
321
+ validateContractAcceptance({
322
+ schema: schemaWithSpectrumColors,
323
+ acceptance: [
324
+ makeControlAcceptance("dispersion.spectrum", "select"),
325
+ makeControlAcceptance("dispersion.customColorA", "color"),
326
+ makeControlAcceptance("dispersion.customColorB", "color"),
327
+ makeControlAcceptance("dispersion.customColorC", "color"),
328
+ makeControlAcceptance("dispersion.customColorD", "color"),
329
+ ],
330
+ }),
331
+ ).toEqual(
332
+ expect.arrayContaining([
333
+ expect.stringContaining('customColorA uses visible label "Color 1"'),
334
+ expect.stringContaining('customColorB uses visible label "Color 2"'),
335
+ expect.stringContaining('customColorC uses visible label "Color 3"'),
336
+ expect.stringContaining('customColorD uses visible label "Color 4"'),
264
337
  ]),
265
338
  );
266
339
  });
@@ -312,7 +385,7 @@ describe("starter acceptance control label contract", () => {
312
385
  ).toEqual(
313
386
  expect.arrayContaining([
314
387
  "Accent Shades mixes labeled and unlabeled color items in one palette variation group. Decide label visibility for the whole group: omit all per-item labels when colors only add variety, or label every item only when each color has a distinct user-facing role.",
315
- 'Accent Shades / accent2 uses visible label "Color 2" for a palette variation color. When colors only add variety to one shared palette, set label: false or use collectionActions with unlabeled items. Keep visible labels only when each color edits a distinct user-facing entity such as Fill, Stroke, Background, Connector, or Object color.',
388
+ 'Accent Shades / accent2 uses visible label "Color 2" for one of multiple sibling colors. Set label: false when the colors form one shared bank, or use a distinct user-facing role such as Fill, Stroke, Background, Connector, or Object color.',
316
389
  ]),
317
390
  );
318
391
  });
@@ -328,12 +401,14 @@ describe("starter acceptance control label contract", () => {
328
401
  accent1: {
329
402
  defaultValue: { hex: "#9CE6FF" },
330
403
  label: false,
404
+ semanticGroup: "accent-palette",
331
405
  target: "palette.accent1",
332
406
  type: "color",
333
407
  },
334
408
  accent2: {
335
409
  defaultValue: { hex: "#FF7A90" },
336
410
  label: false,
411
+ semanticGroup: "accent-palette",
337
412
  target: "palette.accent2",
338
413
  type: "color",
339
414
  },
@@ -128,12 +128,88 @@ describe("starter acceptance control naming rules", () => {
128
128
  ).toEqual(
129
129
  expect.arrayContaining([
130
130
  expect.stringContaining(
131
- 'export.includeBackground) toggle label "Background" duplicates section title "Background". Use a shorter contextual label such as "Include" or rename the toggle to a more specific setting.',
131
+ 'Background / includeBackground visible label "Background" duplicates section title "Background". Set label: false when the section supplies the complete visible context, or use a more specific label for a distinct setting.',
132
132
  ),
133
133
  ]),
134
134
  );
135
135
  });
136
136
 
137
+ it("rejects visible select labels that duplicate their section title", () => {
138
+ const schemaWithDuplicateSelectLabel = defineContractSchemaFixture({
139
+ canvas: { enabled: true },
140
+ panels: {
141
+ controls: {
142
+ sections: [
143
+ {
144
+ controls: {
145
+ spectrum: {
146
+ defaultValue: "custom",
147
+ label: "Spectrum",
148
+ options: [{ label: "Custom", value: "custom" }],
149
+ target: "dispersion.spectrum",
150
+ type: "select",
151
+ },
152
+ },
153
+ title: "Spectrum",
154
+ },
155
+ ],
156
+ title: "Controls",
157
+ },
158
+ },
159
+ });
160
+
161
+ expect(
162
+ validateContractAcceptance({
163
+ schema: schemaWithDuplicateSelectLabel,
164
+ acceptance: [
165
+ makeControlAcceptance("dispersion.spectrum", "select"),
166
+ ],
167
+ }),
168
+ ).toEqual(
169
+ expect.arrayContaining([
170
+ expect.stringContaining(
171
+ 'Spectrum / spectrum visible label "Spectrum" duplicates section title "Spectrum". Set label: false when the section supplies the complete visible context, or use a more specific label for a distinct setting.',
172
+ ),
173
+ ]),
174
+ );
175
+ });
176
+
177
+ it("allows tabs accessibility names that match their section title", () => {
178
+ const schemaWithMatchingTabsName = defineContractSchemaFixture({
179
+ canvas: { enabled: true },
180
+ panels: {
181
+ controls: {
182
+ sections: [
183
+ {
184
+ controls: {
185
+ spectrum: {
186
+ defaultValue: "custom",
187
+ label: "Spectrum",
188
+ options: [{ label: "Custom", value: "custom" }],
189
+ target: "dispersion.spectrum",
190
+ type: "tabs",
191
+ },
192
+ },
193
+ title: "Spectrum",
194
+ },
195
+ ],
196
+ title: "Controls",
197
+ },
198
+ },
199
+ });
200
+
201
+ const errors = validateContractAcceptance({
202
+ schema: schemaWithMatchingTabsName,
203
+ acceptance: [makeControlAcceptance("dispersion.spectrum", "tabs")],
204
+ });
205
+
206
+ expect(errors).not.toEqual(
207
+ expect.arrayContaining([
208
+ expect.stringContaining("duplicates section title"),
209
+ ]),
210
+ );
211
+ });
212
+
137
213
  it("rejects single Actions controls that duplicate their only button label", () => {
138
214
  const schemaWithDuplicateActionLabel = defineContractSchemaFixture({
139
215
  canvas: { enabled: true },
@@ -1,6 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import {
3
3
  getToolcraftSegmentedStaticFitError,
4
+ type ToolcraftCollectionItemControlType,
4
5
  } from "@repo/toolcraft-runtime";
5
6
 
6
7
  import {
@@ -18,7 +19,7 @@ const SCREENSHOT_LABELS = ["Default", "Ink Drops", "Solar", "Background"];
18
19
  const BOUNDARY_LABELS = ["Ink Drops", "Default", "Solar", "RGB"];
19
20
 
20
21
  function createRawCollectionModesSchema(
21
- itemControlType: string,
22
+ itemControlType: ToolcraftCollectionItemControlType,
22
23
  labels: readonly string[],
23
24
  ) {
24
25
  return {
@@ -64,6 +65,11 @@ const collectionModesAcceptance = [
64
65
  browser: true,
65
66
  browserTestName: "browser: collection modes update rendered output",
66
67
  componentType: "collectionActions",
68
+ controlPartCoverage: [
69
+ "collectionActions.add",
70
+ "collectionActions.remove",
71
+ "collectionActions.items",
72
+ ] as const,
67
73
  evidence: "rendered-pixels" as const,
68
74
  expectedObservable: "Adding and editing modes changes rendered output.",
69
75
  fixture: "collection modes fixture",
@@ -339,7 +345,7 @@ describe("starter acceptance control order contract", () => {
339
345
  it("reports canonical fit guidance for an overwide collectionActions itemControl", () => {
340
346
  const itemControl = {
341
347
  options: SCREENSHOT_LABELS.map((label) => ({ label })),
342
- type: "segmented",
348
+ type: "segmented" as const,
343
349
  };
344
350
  const fitGuidance = getToolcraftSegmentedStaticFitError(itemControl);
345
351
 
@@ -359,10 +365,59 @@ describe("starter acceptance control order contract", () => {
359
365
  );
360
366
  });
361
367
 
368
+ it("reports canonical fit guidance for every compound itemControls field", () => {
369
+ const schema = createRawCollectionModesSchema("segmented", SCREENSHOT_LABELS);
370
+ const modes = schema.panels.controls.sections[0]!.controls.modes;
371
+ const compoundSchema = {
372
+ ...schema,
373
+ panels: {
374
+ ...schema.panels,
375
+ controls: {
376
+ ...schema.panels.controls,
377
+ sections: [
378
+ {
379
+ ...schema.panels.controls.sections[0],
380
+ controls: {
381
+ modes: {
382
+ ...modes,
383
+ defaultValue: [{ enabled: true, mode: "default" }],
384
+ itemControl: undefined,
385
+ itemControls: {
386
+ enabled: {
387
+ defaultValue: true,
388
+ label: "Enabled",
389
+ type: "switch" as const,
390
+ },
391
+ mode: modes.itemControl,
392
+ },
393
+ },
394
+ },
395
+ },
396
+ ],
397
+ },
398
+ },
399
+ };
400
+ const fitGuidance = getToolcraftSegmentedStaticFitError(
401
+ modes.itemControl,
402
+ );
403
+
404
+ expect(fitGuidance).not.toBeNull();
405
+ expect(
406
+ validateContractAcceptance({
407
+ schema: compoundSchema,
408
+ acceptance: collectionModesAcceptance,
409
+ }),
410
+ ).toEqual(
411
+ expect.arrayContaining([
412
+ `Style / modes (appearance.modes) itemControls.mode ${fitGuidance}`,
413
+ ]),
414
+ );
415
+ });
416
+
362
417
  it.each([
363
418
  { labels: BOUNDARY_LABELS, type: "segmented" },
364
419
  { labels: SCREENSHOT_LABELS, type: "select" },
365
- ])(
420
+ ] as const)(
366
421
  "does not report itemControl fit guidance for nested $type",
367
422
  ({ labels, type }) => {
368
423
  const errors = validateContractAcceptance({