@pixel-point/toolcraft 0.0.18 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/package.json +1 -1
  2. package/src/generate-demand-only-lifecycle.test.mjs +9 -1
  3. package/src/generate-performance-iteration-execution.test.mjs +3 -3
  4. package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
  5. package/src/generate-test-demand-only-lifecycle.mjs +34 -36
  6. package/src/generate-test-dependency-sandbox.mjs +4 -1
  7. package/src/generate-test-doc-assertions.mjs +55 -53
  8. package/src/generate-test-doc-assertions.test.mjs +1 -1
  9. package/src/generate-test-doc-policy-assertions.mjs +1 -1
  10. package/src/generate-test-export-doc-assertions.mjs +53 -0
  11. package/src/generate-test-file-assertions.mjs +51 -8
  12. package/src/generate-test-integrity-assertions.mjs +5 -2
  13. package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
  14. package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
  15. package/src/generate-test-package-assertions.mjs +4 -0
  16. package/src/generate-test-product-fixture.mjs +1 -1
  17. package/src/generate-test-product-fixture.test.mjs +35 -38
  18. package/src/generate-test-product-iteration.mjs +0 -1
  19. package/src/generate-test-product-iteration.test.mjs +0 -1
  20. package/src/generate-test-runtime-boundary-assertions.mjs +20 -0
  21. package/src/generate-test-standalone-assertions.mjs +0 -16
  22. package/src/generate-test-standalone-delivery-stages.mjs +2 -86
  23. package/src/generate.test.mjs +4 -0
  24. package/src/generated-integrity-manifest.test.mjs +5 -2
  25. package/src/generated-source-policy.test.mjs +0 -4
  26. package/src/package-json.mjs +5 -0
  27. package/src/package-json.test.mjs +21 -0
  28. package/src/package-manager.mjs +2 -0
  29. package/src/package-manager.test.mjs +8 -0
  30. package/src/packaged-template-fallback-helpers.mjs +254 -0
  31. package/src/packaged-template-fallback.test.mjs +121 -46
  32. package/src/packaged-template-runtime-assertions.mjs +150 -0
  33. package/templates/runtime/contracts/component-contracts.choices.test.ts +18 -3
  34. package/templates/runtime/contracts/component-contracts.choices.ts +8 -3
  35. package/templates/runtime/contracts/component-contracts.inputs.ts +2 -1
  36. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +18 -4
  37. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +1 -1
  38. package/templates/runtime/contracts/component-contracts.runtime.ts +7 -4
  39. package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
  40. package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
  41. package/templates/runtime/contracts/decision-contracts.test.ts +18 -12
  42. package/templates/runtime/contracts/decision-contracts.ts +4 -4
  43. package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
  44. package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
  45. package/templates/runtime/export/artifact-download.ts +1 -0
  46. package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
  47. package/templates/runtime/export/artifact-frame-state.ts +16 -0
  48. package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
  49. package/templates/runtime/export/artifact-scene-frame.ts +3 -3
  50. package/templates/runtime/export/export-error.ts +5 -0
  51. package/templates/runtime/export/export-renderer-coverage.ts +54 -0
  52. package/templates/runtime/export/image-artifact-export.ts +2 -2
  53. package/templates/runtime/export/index.ts +13 -0
  54. package/templates/runtime/export/product-export-renderer.test.ts +38 -4
  55. package/templates/runtime/export/product-export-renderer.ts +0 -41
  56. package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
  57. package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
  58. package/templates/runtime/export/svg-artifact-export.ts +120 -0
  59. package/templates/runtime/export/svg-document.test.ts +221 -0
  60. package/templates/runtime/export/svg-document.ts +400 -0
  61. package/templates/runtime/export/svg-policy.ts +47 -0
  62. package/templates/runtime/index.ts +1 -0
  63. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +10 -0
  64. package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
  65. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +46 -1
  66. package/templates/runtime/react/app-shell/toolcraft-app.tsx +7 -2
  67. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
  68. package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
  69. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +1 -1
  70. package/templates/runtime/react/canvas/canvas-shell.tsx +16 -5
  71. package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
  72. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
  73. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
  74. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
  75. package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
  76. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +39 -0
  77. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
  78. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +1 -4
  79. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +2 -2
  80. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
  81. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +2 -2
  82. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +40 -11
  83. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +31 -2
  84. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +4 -1
  85. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
  86. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
  87. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
  88. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
  89. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
  90. package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
  91. package/templates/runtime/schema/artifact-export-actions.ts +49 -0
  92. package/templates/runtime/schema/types.ts +1 -0
  93. package/templates/runtime/state/canvas-background-state.ts +1 -16
  94. package/templates/runtime/state/canvas-state.ts +32 -20
  95. package/templates/runtime/state/control-value-codecs.test.ts +98 -0
  96. package/templates/runtime/state/control-value-codecs.ts +700 -0
  97. package/templates/runtime/state/control-value-normalization.test.ts +1 -1
  98. package/templates/runtime/state/control-value-normalization.ts +127 -135
  99. package/templates/runtime/state/controls-reducer.ts +26 -3
  100. package/templates/runtime/state/create-template-state.test.ts +30 -0
  101. package/templates/runtime/state/create-template-state.ts +52 -31
  102. package/templates/runtime/state/orientation-pose.ts +80 -0
  103. package/templates/runtime/state/persistence-control-values.test.ts +59 -0
  104. package/templates/runtime/state/reducer-controls.test.ts +45 -0
  105. package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
  106. package/templates/runtime/state/reducer-timeline.test.ts +70 -0
  107. package/templates/runtime/state/timeline-reducer.ts +40 -2
  108. package/templates/runtime/testing/performance-schema-queries.ts +2 -2
  109. package/templates/starter/AGENTS.md +21 -22
  110. package/templates/starter/docs/toolcraft/README.md +6 -6
  111. package/templates/starter/docs/toolcraft/acceptance-testing.md +20 -20
  112. package/templates/starter/docs/toolcraft/agent-worklog.md +88 -1
  113. package/templates/starter/docs/toolcraft/assembly-workflow.md +7 -6
  114. package/templates/starter/docs/toolcraft/component-rules.md +2 -2
  115. package/templates/starter/docs/toolcraft/core/layout.md +6 -1
  116. package/templates/starter/docs/toolcraft/core/media-upload.md +1 -1
  117. package/templates/starter/docs/toolcraft/core/performance.md +8 -10
  118. package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
  119. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +2 -1
  120. package/templates/starter/docs/toolcraft/core/setup-export.md +43 -13
  121. package/templates/starter/docs/toolcraft/decision-contract.md +2 -2
  122. package/templates/starter/docs/toolcraft/performance.md +8 -10
  123. package/templates/starter/docs/toolcraft/renderer-technique.md +2 -2
  124. package/templates/starter/docs/toolcraft/schema-reference.md +8 -8
  125. package/templates/starter/docs/toolcraft/workflow.md +14 -14
  126. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +38 -0
  127. package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
  128. package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
  129. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +62 -0
  130. package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
  131. package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
  132. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
  133. package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
  134. package/templates/starter/e2e/browser-proof-session.ts +43 -15
  135. package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
  136. package/templates/starter/e2e/browser-proof-types.ts +15 -0
  137. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +22 -6
  138. package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
  139. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +97 -0
  140. package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
  141. package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
  142. package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
  143. package/templates/starter/e2e/product-observable-helpers.ts +8 -129
  144. package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
  145. package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
  146. package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
  147. package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
  148. package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
  149. package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
  150. package/templates/starter/package.json +2 -0
  151. package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
  152. package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
  153. package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
  154. package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
  155. package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
  156. package/templates/starter/scripts/run-browser-performance.mjs +0 -6
  157. package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
  158. package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
  159. package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
  160. package/templates/starter/scripts/run-feature-verification.mjs +212 -0
  161. package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
  162. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
  163. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
  164. package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
  165. package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
  166. package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
  167. package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
  168. package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
  169. package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
  170. package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
  171. package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
  172. package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
  173. package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
  174. package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
  175. package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
  176. package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
  177. package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
  178. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
  179. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
  180. package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
  181. package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
  182. package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
  183. package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
  184. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
  185. package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
  186. package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
  187. package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
  188. package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
  189. package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
  190. package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
  191. package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
  192. package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
  193. package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
  194. package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
  195. package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
  196. package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
  197. package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
  198. package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
  199. package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
  200. package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
  201. package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
  202. package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
  203. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
  204. package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
  205. package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
  206. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
  207. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
  208. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
  209. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
  210. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
  211. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
  212. package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
  213. package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
  214. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
  215. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
  216. package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
  217. package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
  218. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
  219. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
  220. package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
  221. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
  222. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
  223. package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
  224. package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
  225. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
  226. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
  227. package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
  228. package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
  229. package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
  230. package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
  231. package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
  232. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
  233. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
  234. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
  235. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
  236. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
  237. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
  238. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
  239. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
  240. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
  241. package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
  242. package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
  243. package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
  244. package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
  245. package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
  246. package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
  247. package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
  248. package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
  249. package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
  250. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
  251. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
  252. package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
  253. package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
  254. package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
  255. package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
  256. package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
  257. package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
  258. package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
  259. package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
  260. package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
  261. package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
  262. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +1 -1
  263. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +10 -1
  264. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +5 -1
  265. package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
  266. package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
  267. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
  268. package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
  269. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
  270. package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
  271. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
  272. package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
  273. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
  274. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
  275. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
  276. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
  277. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
  278. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
  279. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
  280. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
  281. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +51 -20
  282. package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
  283. package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
  284. package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
  285. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +0 -11
  286. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -3
  287. package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
  288. package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
  289. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +18 -0
  290. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
  291. package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
  292. package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
  293. package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
  294. package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
  295. package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
  296. package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
  297. package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
  298. package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
  299. package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
  300. package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
  301. package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
  302. package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
  303. package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
  304. package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
  305. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
  306. package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
  307. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +5 -1
  308. package/templates/starter/src/app/acceptance/output-export-model.ts +4 -0
  309. package/templates/starter/src/app/acceptance/output-export.ts +4 -1
  310. package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
  311. package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
  312. package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
  313. package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
  314. package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
  315. package/templates/starter/src/app/acceptance/types.ts +43 -118
  316. package/templates/starter/src/app/acceptance/validate-coverage.ts +14 -3
  317. package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
  318. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
  319. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +81 -8
  320. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +2 -0
  321. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +2 -0
  322. package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
  323. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +1 -1
  324. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +1 -0
  325. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +1 -0
  326. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
  327. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
  328. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
  329. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
  330. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
  331. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +5 -1
  332. package/templates/starter/src/app/starter-acceptance.image-export-settings.test.ts +2 -0
  333. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +19 -3
  334. package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
  335. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
  336. package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
  337. package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
  338. package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
  339. package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
  340. package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
  341. package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
  342. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +78 -4
  343. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +6 -1
  344. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +18 -1
  345. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
  346. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
  347. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
  348. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
  349. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +2 -0
  350. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
  351. package/templates/starter/src/app/starter-acceptance.ts +34 -8
  352. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +2 -0
  353. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
  354. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +4 -0
  355. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
  356. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
  357. package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
  358. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
  359. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +3 -0
  360. package/templates/starter/tsconfig.json +1 -0
  361. package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
  362. package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
  363. package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
  364. package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
  365. package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
  366. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
  367. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
  368. package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
  369. package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
  370. package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
  371. package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
  372. package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
  373. package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
  374. package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
  375. package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
  376. package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
  377. package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
  378. package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
  379. package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
  380. package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
  381. package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
  382. package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
  383. package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
  384. package/templates/starter/src/app/starter-verification-impact.json +0 -15
@@ -10,45 +10,50 @@ import type { ToolcraftArtifactExportIntent } from "./acceptance/types";
10
10
  const deliveryCases: readonly Readonly<{
11
11
  expected: Readonly<{
12
12
  imageEnabled: boolean;
13
+ svgEnabled: boolean;
13
14
  videoEnabled: boolean;
14
15
  }>;
15
16
  intent: ToolcraftArtifactExportIntent;
16
17
  name: string;
17
18
  }>[] = [
18
19
  {
19
- expected: { imageEnabled: true, videoEnabled: false },
20
+ expected: { imageEnabled: true, svgEnabled: false, videoEnabled: false },
20
21
  intent: {
21
22
  image: { mode: "toolcraft-default" },
23
+ svg: { mode: "not-requested" },
22
24
  video: { mode: "not-requested" },
23
25
  },
24
26
  name: "enables default image export without unrequested video export",
25
27
  },
26
28
  {
27
- expected: { imageEnabled: true, videoEnabled: false },
29
+ expected: { imageEnabled: true, svgEnabled: false, videoEnabled: false },
28
30
  intent: {
29
31
  image: {
30
32
  evidence: "The user explicitly requested PNG delivery.",
31
33
  mode: "user-requested",
32
34
  },
35
+ svg: { mode: "not-requested" },
33
36
  video: { mode: "not-requested" },
34
37
  },
35
38
  name: "enables explicitly requested image export",
36
39
  },
37
40
  {
38
- expected: { imageEnabled: false, videoEnabled: false },
41
+ expected: { imageEnabled: false, svgEnabled: false, videoEnabled: false },
39
42
  intent: {
40
43
  image: {
41
44
  evidence: "The user explicitly requested no image export.",
42
45
  mode: "user-removed",
43
46
  },
47
+ svg: { mode: "not-requested" },
44
48
  video: { mode: "not-requested" },
45
49
  },
46
50
  name: "disables explicitly removed image export",
47
51
  },
48
52
  {
49
- expected: { imageEnabled: true, videoEnabled: true },
53
+ expected: { imageEnabled: true, svgEnabled: false, videoEnabled: true },
50
54
  intent: {
51
55
  image: { mode: "toolcraft-default" },
56
+ svg: { mode: "not-requested" },
52
57
  video: {
53
58
  evidence: "The user explicitly requested MP4 delivery.",
54
59
  mode: "user-requested",
@@ -57,12 +62,13 @@ const deliveryCases: readonly Readonly<{
57
62
  name: "enables explicitly requested video export",
58
63
  },
59
64
  {
60
- expected: { imageEnabled: true, videoEnabled: true },
65
+ expected: { imageEnabled: true, svgEnabled: false, videoEnabled: true },
61
66
  intent: {
62
67
  image: {
63
68
  evidence: "The user explicitly requested PNG delivery.",
64
69
  mode: "user-requested",
65
70
  },
71
+ svg: { mode: "not-requested" },
66
72
  video: {
67
73
  evidence: "The user explicitly requested MP4 delivery.",
68
74
  mode: "user-requested",
@@ -71,12 +77,13 @@ const deliveryCases: readonly Readonly<{
71
77
  name: "enables explicitly requested image and video export",
72
78
  },
73
79
  {
74
- expected: { imageEnabled: false, videoEnabled: true },
80
+ expected: { imageEnabled: false, svgEnabled: false, videoEnabled: true },
75
81
  intent: {
76
82
  image: {
77
83
  evidence: "The user explicitly requested no image export.",
78
84
  mode: "user-removed",
79
85
  },
86
+ svg: { mode: "not-requested" },
80
87
  video: {
81
88
  evidence: "The user explicitly requested MP4 delivery.",
82
89
  mode: "user-requested",
@@ -84,6 +91,21 @@ const deliveryCases: readonly Readonly<{
84
91
  },
85
92
  name: "keeps requested video export when image export is removed",
86
93
  },
94
+ {
95
+ expected: { imageEnabled: false, svgEnabled: true, videoEnabled: false },
96
+ intent: {
97
+ image: {
98
+ evidence: "The user explicitly requested SVG instead of image export.",
99
+ mode: "user-removed",
100
+ },
101
+ svg: {
102
+ evidence: "The user explicitly requested editable SVG delivery.",
103
+ mode: "user-requested",
104
+ },
105
+ video: { mode: "not-requested" },
106
+ },
107
+ name: "enables requested SVG without retaining default image export",
108
+ },
87
109
  ];
88
110
 
89
111
  const evidenceCases: readonly Readonly<{
@@ -95,6 +117,7 @@ const evidenceCases: readonly Readonly<{
95
117
  expected: [],
96
118
  intent: {
97
119
  image: { mode: "toolcraft-default" },
120
+ svg: { mode: "not-requested" },
98
121
  video: { mode: "not-requested" },
99
122
  },
100
123
  name: "accepts default image and not-requested video modes",
@@ -106,6 +129,7 @@ const evidenceCases: readonly Readonly<{
106
129
  evidence: "The user explicitly requested PNG delivery.",
107
130
  mode: "user-requested",
108
131
  },
132
+ svg: { mode: "not-requested" },
109
133
  video: { mode: "not-requested" },
110
134
  },
111
135
  name: "accepts nonblank requested image evidence",
@@ -117,6 +141,7 @@ const evidenceCases: readonly Readonly<{
117
141
  evidence: "The user explicitly requested no image export.",
118
142
  mode: "user-removed",
119
143
  },
144
+ svg: { mode: "not-requested" },
120
145
  video: { mode: "not-requested" },
121
146
  },
122
147
  name: "accepts nonblank image removal evidence",
@@ -125,6 +150,7 @@ const evidenceCases: readonly Readonly<{
125
150
  expected: [],
126
151
  intent: {
127
152
  image: { mode: "toolcraft-default" },
153
+ svg: { mode: "not-requested" },
128
154
  video: {
129
155
  evidence: "The user explicitly requested MP4 delivery.",
130
156
  mode: "user-requested",
@@ -138,6 +164,7 @@ const evidenceCases: readonly Readonly<{
138
164
  ],
139
165
  intent: {
140
166
  image: { evidence: " \n\t ", mode: "user-removed" },
167
+ svg: { mode: "not-requested" },
141
168
  video: { mode: "not-requested" },
142
169
  },
143
170
  name: "rejects blank image removal evidence",
@@ -148,6 +175,7 @@ const evidenceCases: readonly Readonly<{
148
175
  ],
149
176
  intent: {
150
177
  image: { evidence: " ", mode: "user-requested" },
178
+ svg: { mode: "not-requested" },
151
179
  video: { mode: "not-requested" },
152
180
  },
153
181
  name: "rejects blank requested image evidence",
@@ -158,10 +186,22 @@ const evidenceCases: readonly Readonly<{
158
186
  ],
159
187
  intent: {
160
188
  image: { mode: "toolcraft-default" },
189
+ svg: { mode: "not-requested" },
161
190
  video: { evidence: "\t", mode: "user-requested" },
162
191
  },
163
192
  name: "rejects blank requested video evidence",
164
193
  },
194
+ {
195
+ expected: [
196
+ "SVG export user-requested intent requires non-empty evidence.",
197
+ ],
198
+ intent: {
199
+ image: { mode: "toolcraft-default" },
200
+ svg: { evidence: "\t", mode: "user-requested" },
201
+ video: { mode: "not-requested" },
202
+ },
203
+ name: "rejects blank requested SVG evidence",
204
+ },
165
205
  {
166
206
  expected: [
167
207
  "Image export user-removed intent requires non-empty evidence.",
@@ -169,6 +209,7 @@ const evidenceCases: readonly Readonly<{
169
209
  ],
170
210
  intent: {
171
211
  image: { evidence: " ", mode: "user-removed" },
212
+ svg: { mode: "not-requested" },
172
213
  video: { evidence: "\n", mode: "user-requested" },
173
214
  },
174
215
  name: "aggregates blank image and video evidence errors",
@@ -194,15 +235,17 @@ describe("Toolcraft artifact export intent", () => {
194
235
  validateToolcraftArtifactExportIntentCorrespondence({
195
236
  hasImageExportAction: false,
196
237
  hasImageExportSection: false,
238
+ hasSvgExportAction: false,
197
239
  hasVideoExportAction: true,
198
240
  hasVideoExportSection: true,
199
241
  intent: {
200
242
  image: { mode: "toolcraft-default" },
243
+ svg: { mode: "not-requested" },
201
244
  video: { mode: "not-requested" },
202
245
  },
203
246
  }),
204
247
  ).toEqual({
205
- delivery: { imageEnabled: true, videoEnabled: false },
248
+ delivery: { imageEnabled: true, svgEnabled: false, videoEnabled: false },
206
249
  errors: [
207
250
  'Image export intent "toolcraft-default" requires an export-image panel action.',
208
251
  'Image export intent "toolcraft-default" requires an "Image Export" section.',
@@ -217,15 +260,17 @@ describe("Toolcraft artifact export intent", () => {
217
260
  validateToolcraftArtifactExportIntentCorrespondence({
218
261
  hasImageExportAction: true,
219
262
  hasImageExportSection: true,
263
+ hasSvgExportAction: false,
220
264
  hasVideoExportAction: false,
221
265
  hasVideoExportSection: false,
222
266
  intent: {
223
267
  image: { evidence: " ", mode: "user-removed" },
268
+ svg: { mode: "not-requested" },
224
269
  video: { evidence: "\t", mode: "user-requested" },
225
270
  },
226
271
  }),
227
272
  ).toEqual({
228
- delivery: { imageEnabled: false, videoEnabled: true },
273
+ delivery: { imageEnabled: false, svgEnabled: false, videoEnabled: true },
229
274
  errors: [
230
275
  "Image export user-removed intent requires non-empty evidence.",
231
276
  "Video export user-requested intent requires non-empty evidence.",
@@ -236,4 +281,32 @@ describe("Toolcraft artifact export intent", () => {
236
281
  ],
237
282
  });
238
283
  });
284
+
285
+ it("requires requested SVG to correspond to one typed action without a settings section", () => {
286
+ expect(
287
+ validateToolcraftArtifactExportIntentCorrespondence({
288
+ hasImageExportAction: false,
289
+ hasImageExportSection: false,
290
+ hasSvgExportAction: false,
291
+ hasVideoExportAction: false,
292
+ hasVideoExportSection: false,
293
+ intent: {
294
+ image: {
295
+ evidence: "The user requested SVG only.",
296
+ mode: "user-removed",
297
+ },
298
+ svg: {
299
+ evidence: "The user requested editable SVG.",
300
+ mode: "user-requested",
301
+ },
302
+ video: { mode: "not-requested" },
303
+ },
304
+ }),
305
+ ).toEqual({
306
+ delivery: { imageEnabled: false, svgEnabled: true, videoEnabled: false },
307
+ errors: [
308
+ 'SVG export intent "user-requested" requires an export-svg panel action.',
309
+ ],
310
+ });
311
+ });
239
312
  });
@@ -11,6 +11,7 @@ import { makeControlAcceptance } from "./starter-acceptance.test-utils";
11
11
  const imageExportProductReadiness: ToolcraftProductReadiness = {
12
12
  exportIntent: {
13
13
  image: { mode: "toolcraft-default" },
14
+ svg: { mode: "not-requested" },
14
15
  video: { mode: "not-requested" },
15
16
  },
16
17
  interactionOwnership: [],
@@ -28,6 +29,7 @@ const videoExportProductReadiness: ToolcraftProductReadiness = {
28
29
  ...imageExportProductReadiness,
29
30
  exportIntent: {
30
31
  image: { mode: "toolcraft-default" },
32
+ svg: { mode: "not-requested" },
31
33
  video: {
32
34
  evidence: "The background fixture explicitly exercises video background export.",
33
35
  mode: "user-requested",
@@ -11,6 +11,7 @@ import type { ToolcraftProductReadiness } from "./acceptance/types";
11
11
  const infinityProductReadiness: ToolcraftProductReadiness = {
12
12
  exportIntent: {
13
13
  image: { mode: "toolcraft-default" },
14
+ svg: { mode: "not-requested" },
14
15
  video: { mode: "not-requested" },
15
16
  },
16
17
  interactionOwnership: [],
@@ -28,6 +29,7 @@ const infinityVideoProductReadiness: ToolcraftProductReadiness = {
28
29
  ...infinityProductReadiness,
29
30
  exportIntent: {
30
31
  image: { mode: "toolcraft-default" },
32
+ svg: { mode: "not-requested" },
31
33
  video: {
32
34
  evidence: "The Infinity canvas fixture explicitly exercises video export bounds.",
33
35
  mode: "user-requested",
@@ -0,0 +1,118 @@
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 makeMixedColorSchema(includeSemanticGroups: boolean) {
7
+ const withSemanticGroup = (
8
+ semanticGroup: string,
9
+ ): { semanticGroup: string } | Record<string, never> =>
10
+ includeSemanticGroups ? { semanticGroup } : {};
11
+
12
+ return defineToolcraft({
13
+ canvas: { enabled: true },
14
+ panels: {
15
+ controls: {
16
+ sections: [
17
+ {
18
+ controls: {
19
+ trackEnabled: {
20
+ defaultValue: true,
21
+ label: "Track",
22
+ target: "track.enabled",
23
+ type: "switch",
24
+ },
25
+ trackColor: {
26
+ ...withSemanticGroup("track-line"),
27
+ defaultValue: { hex: "#F1F1F1" },
28
+ label: "Track color",
29
+ target: "track.color",
30
+ type: "color",
31
+ },
32
+ lowerColor: {
33
+ ...withSemanticGroup("track-range"),
34
+ defaultValue: { hex: "#7A9CBD" },
35
+ label: "Lower",
36
+ target: "track.lower",
37
+ type: "color",
38
+ },
39
+ upperColor: {
40
+ ...withSemanticGroup("track-range"),
41
+ defaultValue: { hex: "#52AAFF" },
42
+ label: "Upper",
43
+ target: "track.upper",
44
+ type: "color",
45
+ },
46
+ },
47
+ id: "track-appearance",
48
+ title: "Track Appearance",
49
+ },
50
+ ],
51
+ title: "Controls",
52
+ },
53
+ },
54
+ });
55
+ }
56
+
57
+ function makeColorOnlySchema() {
58
+ return defineToolcraft({
59
+ canvas: { enabled: true },
60
+ panels: {
61
+ controls: {
62
+ sections: [
63
+ {
64
+ controls: {
65
+ trackColor: {
66
+ defaultValue: { hex: "#F1F1F1" },
67
+ label: "Track",
68
+ target: "track.color",
69
+ type: "color",
70
+ },
71
+ lowerColor: {
72
+ defaultValue: { hex: "#7A9CBD" },
73
+ label: "Lower",
74
+ target: "track.lower",
75
+ type: "color",
76
+ },
77
+ upperColor: {
78
+ defaultValue: { hex: "#52AAFF" },
79
+ label: "Upper",
80
+ target: "track.upper",
81
+ type: "color",
82
+ },
83
+ },
84
+ id: "track-palette",
85
+ title: "Track Palette",
86
+ },
87
+ ],
88
+ title: "Controls",
89
+ },
90
+ },
91
+ });
92
+ }
93
+
94
+ describe("starter acceptance semantic color rows", () => {
95
+ it("rejects ambiguous plain colors in a mixed section", () => {
96
+ expect(
97
+ getToolcraftControlSectionInvariantErrors(makeMixedColorSchema(false)),
98
+ ).toEqual(
99
+ expect.arrayContaining([
100
+ expect.stringContaining(
101
+ "must declare semanticGroup for every plain Color",
102
+ ),
103
+ ]),
104
+ );
105
+ });
106
+
107
+ it("accepts explicit color banks in a mixed section", () => {
108
+ expect(
109
+ getToolcraftControlSectionInvariantErrors(makeMixedColorSchema(true)),
110
+ ).toEqual([]);
111
+ });
112
+
113
+ it("keeps a color-only section as one implicit bank", () => {
114
+ expect(
115
+ getToolcraftControlSectionInvariantErrors(makeColorOnlySchema()),
116
+ ).toEqual([]);
117
+ });
118
+ });
@@ -265,7 +265,7 @@ describe("starter acceptance compound control part coverage contract", () => {
265
265
  { color: "#FFE97A", opacity: 100, position: "100%" },
266
266
  ],
267
267
  },
268
- label: "Gradient",
268
+ label: false,
269
269
  orderRole: "color",
270
270
  target: "mesh.gradient",
271
271
  type: "gradient",
@@ -73,6 +73,7 @@ export const contractSectionInventoryFixture: readonly ToolcraftControlSectionIn
73
73
  export const contractTransferModeFixture: ToolcraftTransferMode = {
74
74
  animationIntent: { mode: "none" },
75
75
  mode: "new-toolcraft-app",
76
+ referenceInputs: [],
76
77
  };
77
78
 
78
79
  export const contractProductReadinessFixture: ToolcraftProductReadiness = {
@@ -11,6 +11,7 @@ import { collectToolcraftVisibleAcceptanceControls } from "./acceptance/validate
11
11
  const productReadiness: ToolcraftProductReadiness = {
12
12
  exportIntent: {
13
13
  image: { mode: "toolcraft-default" },
14
+ svg: { mode: "not-requested" },
14
15
  video: { mode: "not-requested" },
15
16
  },
16
17
  interactionOwnership: [],
@@ -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 },
@@ -82,7 +82,7 @@ describe("starter acceptance custom control built-in fit contract", () => {
82
82
  controls: {
83
83
  shapeButtons: {
84
84
  defaultValue: "rect",
85
- label: "Shape",
85
+ label: false,
86
86
  orderRole: "style",
87
87
  target: "shape.kind",
88
88
  type: "shapeButtons",