@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,9 +1,10 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
 
3
- import { schemaHasVideoExportPanelAction } from "./acceptance/output-export";
3
+ import { resolveToolcraftArtifactExportIntent } from "./acceptance/artifact-export-intent";
4
4
  import { starterProductReadiness } from "./starter-acceptance";
5
5
  import {
6
6
  textLooksLikePngExport,
7
+ textLooksLikeSvgExport,
7
8
  textLooksLikeVideoExport,
8
9
  } from "./starter-acceptance.export-test-utils";
9
10
  import {
@@ -14,38 +15,37 @@ import {
14
15
  getSchemaVideoExportSection,
15
16
  getSectionControlByTarget,
16
17
  getSectionControlIdByTarget,
17
- schemaHasProductSurface,
18
18
  } from "./starter-acceptance.schema-test-utils";
19
- import { starterSchema } from "./starter-schema";
20
19
 
21
20
  describe("Toolcraft output export acceptance contract", () => {
22
21
  it("requires product output apps to expose export actions in the sticky footer", () => {
23
- if (starterProductReadiness.mode !== "product" && !schemaHasProductSurface()) {
22
+ if (starterProductReadiness.mode === "starter") {
24
23
  return;
25
24
  }
26
25
 
26
+ const delivery = resolveToolcraftArtifactExportIntent(
27
+ starterProductReadiness.exportIntent,
28
+ );
27
29
  const panelActionTexts = getSchemaPanelActionSearchTexts();
28
30
  const backgroundColorTargets = getSchemaBackgroundControlTargets(new Set(["color"]));
29
31
  const backgroundToggleTargets = getSchemaBackgroundControlTargets(
30
32
  new Set(["checkbox", "select", "segmented", "switch"]),
31
33
  );
32
34
 
33
- expect(
34
- panelActionTexts.length,
35
- "Product apps must define panelActions in the controls panel sticky footer.",
36
- ).toBeGreaterThan(0);
37
- expect(
38
- panelActionTexts.some(textLooksLikePngExport),
39
- "Every product app must expose Export PNG or Download PNG through panelActions.",
40
- ).toBe(true);
41
- expect(
42
- backgroundColorTargets.length,
43
- "Every product app with Export PNG must expose a user-facing background color control.",
44
- ).toBeGreaterThan(0);
45
- expect(
46
- backgroundToggleTargets.length,
47
- 'Every product app with Export PNG must expose export.includeBackground in runtime Setup as a Switch labeled "Background".',
48
- ).toBeGreaterThan(0);
35
+ if (delivery.imageEnabled || delivery.svgEnabled || delivery.videoEnabled) {
36
+ expect(
37
+ panelActionTexts.length,
38
+ "Product apps with artifact delivery must define panelActions in the controls panel sticky footer.",
39
+ ).toBeGreaterThan(0);
40
+ expect(
41
+ backgroundColorTargets.length,
42
+ "Product apps with artifact delivery must expose a user-facing background color control.",
43
+ ).toBeGreaterThan(0);
44
+ expect(
45
+ backgroundToggleTargets.length,
46
+ 'Product apps with artifact delivery must expose export.includeBackground in runtime Setup as a Switch labeled "Background".',
47
+ ).toBeGreaterThan(0);
48
+ }
49
49
 
50
50
  const imageExportSection = getSchemaImageExportSection();
51
51
  const imageFormatControl = getSectionControlByTarget(
@@ -78,47 +78,55 @@ describe("Toolcraft output export acceptance contract", () => {
78
78
  ) === true;
79
79
 
80
80
  expect(
81
- imageExportSection,
82
- 'Apps with Export PNG must expose image settings in a separate controls section titled "Image Export".',
83
- ).toBeDefined();
84
- expect(
85
- imageFormatControl,
86
- 'The separate "Image Export" section must include a format control with target "export.image.format".',
87
- ).toBeDefined();
88
- expect(
89
- imageFormatControl?.type,
90
- "Image Export format must use the same Select/dropdown structure as Video Export.",
91
- ).toBe("select");
92
- expect(
93
- imageFormatOptionValues,
94
- 'Image format options must include "png" and "jpg".',
95
- ).toEqual(expect.arrayContaining(["png", "jpg"]));
96
- expect(
97
- imageFormatControl?.defaultValue,
98
- 'Image format must default to "png".',
99
- ).toBe("png");
100
- expect(
101
- imageResolutionControl,
102
- 'The separate "Image Export" section must include a resolution control with target "export.image.resolution".',
103
- ).toBeDefined();
104
- expect(
105
- imageResolutionControl?.type,
106
- "Image Export resolution must use the same Select/dropdown structure as Video Export.",
107
- ).toBe("select");
108
- expect(
109
- imageResolutionOptionValues,
110
- 'Image resolution options must include "2k", "4k", and "8k".',
111
- ).toEqual(expect.arrayContaining(["2k", "4k", "8k"]));
81
+ panelActionTexts.some(textLooksLikePngExport),
82
+ "Image export action presence must match resolved product export intent.",
83
+ ).toBe(delivery.imageEnabled);
112
84
  expect(
113
- imageResolutionControl?.defaultValue,
114
- 'Image resolution must default to "4k".',
115
- ).toBe("4k");
85
+ imageExportSection !== undefined,
86
+ '"Image Export" section presence must match resolved product export intent.',
87
+ ).toBe(delivery.imageEnabled);
116
88
  expect(
117
- imageExportHasInlinePair,
118
- "Image Export format and resolution must render as a compact inline pair.",
119
- ).toBe(true);
120
- if (!schemaHasVideoExportPanelAction(starterSchema)) {
121
- return;
89
+ panelActionTexts.some(textLooksLikeSvgExport),
90
+ "SVG export action presence must match resolved product export intent.",
91
+ ).toBe(delivery.svgEnabled);
92
+
93
+ if (delivery.imageEnabled) {
94
+ expect(
95
+ imageFormatControl,
96
+ 'The separate "Image Export" section must include a format control with target "export.image.format".',
97
+ ).toBeDefined();
98
+ expect(
99
+ imageFormatControl?.type,
100
+ "Image Export format must use the same Select/dropdown structure as Video Export.",
101
+ ).toBe("select");
102
+ expect(
103
+ imageFormatOptionValues,
104
+ 'Image format options must include "png" and "jpg".',
105
+ ).toEqual(expect.arrayContaining(["png", "jpg"]));
106
+ expect(
107
+ imageFormatControl?.defaultValue,
108
+ 'Image format must default to "png".',
109
+ ).toBe("png");
110
+ expect(
111
+ imageResolutionControl,
112
+ 'The separate "Image Export" section must include a resolution control with target "export.image.resolution".',
113
+ ).toBeDefined();
114
+ expect(
115
+ imageResolutionControl?.type,
116
+ "Image Export resolution must use the same Select/dropdown structure as Video Export.",
117
+ ).toBe("select");
118
+ expect(
119
+ imageResolutionOptionValues,
120
+ 'Image resolution options must include "2k", "4k", and "8k".',
121
+ ).toEqual(expect.arrayContaining(["2k", "4k", "8k"]));
122
+ expect(
123
+ imageResolutionControl?.defaultValue,
124
+ 'Image resolution must default to "4k".',
125
+ ).toBe("4k");
126
+ expect(
127
+ imageExportHasInlinePair,
128
+ "Image Export format and resolution must render as a compact inline pair.",
129
+ ).toBe(true);
122
130
  }
123
131
 
124
132
  const videoExportSection = getSchemaVideoExportSection();
@@ -134,48 +142,12 @@ describe("Toolcraft output export acceptance contract", () => {
134
142
  const videoResolutionOptionValues = getControlOptionValues(videoResolutionControl);
135
143
  expect(
136
144
  panelActionTexts.some(textLooksLikeVideoExport),
137
- "Apps that declare video delivery must expose Export Video through panelActions.",
138
- ).toBe(true);
139
- expect(
140
- panelActionTexts.length,
141
- "Apps with image and video delivery need separate footer actions for Export Video and Export PNG.",
142
- ).toBeGreaterThanOrEqual(2);
143
- expect(
144
- videoExportSection,
145
- 'Apps with Export Video must expose video settings in a separate controls section titled "Video Export".',
146
- ).toBeDefined();
147
- expect(
148
- videoFormatControl,
149
- 'The separate "Video Export" section must include a format control with target "export.video.format".',
150
- ).toBeDefined();
151
- expect(
152
- ["select", "segmented"],
153
- "Video format must be a Select or Segmented control so the user chooses a supported container instead of typing a freeform value.",
154
- ).toContain(videoFormatControl?.type);
145
+ "Video export action presence must match resolved product export intent.",
146
+ ).toBe(delivery.videoEnabled);
155
147
  expect(
156
- videoFormatOptionValues,
157
- 'Video format options must include safe browser baseline choices: "webm" and "mp4".',
158
- ).toEqual(expect.arrayContaining(["webm", "mp4"]));
159
- expect(
160
- videoResolutionControl,
161
- 'The separate "Video Export" section must include a resolution control with target "export.video.resolution".',
162
- ).toBeDefined();
163
- expect(
164
- ["select"],
165
- "Video resolution must be a Select control with explicit output-size choices.",
166
- ).toContain(videoResolutionControl?.type);
167
- expect(
168
- videoResolutionOptionValues,
169
- 'Video resolution options must include "current" and "4k".',
170
- ).toEqual(expect.arrayContaining(["current", "4k"]));
171
- expect(
172
- videoResolutionControl?.defaultValue,
173
- 'Video resolution must default to "current".',
174
- ).toBe("current");
175
- expect(
176
- videoFormatControl?.defaultValue,
177
- 'Video format must default to "mp4".',
178
- ).toBe("mp4");
148
+ videoExportSection !== undefined,
149
+ '"Video Export" section presence must match resolved product export intent.',
150
+ ).toBe(delivery.videoEnabled);
179
151
  const videoFormatControlId = getSectionControlIdByTarget(
180
152
  videoExportSection,
181
153
  "export.video.format",
@@ -194,9 +166,49 @@ describe("Toolcraft output export acceptance contract", () => {
194
166
  group.controls.includes(videoResolutionControlId),
195
167
  ) === true;
196
168
 
197
- expect(
198
- videoExportHasInlinePair,
199
- "Video Export format and resolution must render as a compact inline pair unless a documented fit fallback is used.",
200
- ).toBe(true);
169
+ if (delivery.videoEnabled) {
170
+ if (delivery.imageEnabled) {
171
+ expect(
172
+ panelActionTexts.length,
173
+ "Apps with image and video delivery need separate footer actions for Export Video and Export PNG.",
174
+ ).toBeGreaterThanOrEqual(2);
175
+ }
176
+ expect(
177
+ videoFormatControl,
178
+ 'The separate "Video Export" section must include a format control with target "export.video.format".',
179
+ ).toBeDefined();
180
+ expect(
181
+ ["select", "segmented"],
182
+ "Video format must be a Select or Segmented control so the user chooses a supported container instead of typing a freeform value.",
183
+ ).toContain(videoFormatControl?.type);
184
+ expect(
185
+ videoFormatOptionValues,
186
+ 'Video format options must include safe browser baseline choices: "webm" and "mp4".',
187
+ ).toEqual(expect.arrayContaining(["webm", "mp4"]));
188
+ expect(
189
+ videoResolutionControl,
190
+ 'The separate "Video Export" section must include a resolution control with target "export.video.resolution".',
191
+ ).toBeDefined();
192
+ expect(
193
+ ["select"],
194
+ "Video resolution must be a Select control with explicit output-size choices.",
195
+ ).toContain(videoResolutionControl?.type);
196
+ expect(
197
+ videoResolutionOptionValues,
198
+ 'Video resolution options must include "current" and "4k".',
199
+ ).toEqual(expect.arrayContaining(["current", "4k"]));
200
+ expect(
201
+ videoResolutionControl?.defaultValue,
202
+ 'Video resolution must default to "current".',
203
+ ).toBe("current");
204
+ expect(
205
+ videoFormatControl?.defaultValue,
206
+ 'Video format must default to "mp4".',
207
+ ).toBe("mp4");
208
+ expect(
209
+ videoExportHasInlinePair,
210
+ "Video Export format and resolution must render as a compact inline pair unless a documented fit fallback is used.",
211
+ ).toBe(true);
212
+ }
201
213
  });
202
214
  });
@@ -4,6 +4,10 @@ import {
4
4
  starterProductReadiness,
5
5
  starterTransferMode,
6
6
  } from "./starter-acceptance";
7
+ import {
8
+ schemaHasSvgExportPanelAction,
9
+ schemaHasVideoExportPanelAction,
10
+ } from "./acceptance/output-export";
7
11
  import { isNeutralTemplateProject } from "./starter-acceptance.product-readiness-test-utils";
8
12
  import { schemaHasProductSurface } from "./starter-acceptance.schema-test-utils";
9
13
  import { starterSchema } from "./starter-schema";
@@ -17,11 +21,36 @@ describe("Toolcraft product readiness", () => {
17
21
  expect(starterTransferMode).toEqual({
18
22
  animationIntent: { mode: "none" },
19
23
  mode: "new-toolcraft-app",
24
+ referenceInputs: [],
20
25
  });
21
26
  });
22
27
 
28
+ it("makes the no-reference decision explicit", () => {
29
+ if (starterProductReadiness.mode !== "starter") {
30
+ return;
31
+ }
32
+
33
+ expect(starterTransferMode.referenceInputs).toEqual([]);
34
+ });
35
+
23
36
  it("allows neutral readiness only for the source starter/template folder", () => {
24
37
  if (starterProductReadiness.mode === "product") {
38
+ expect(starterProductReadiness.exportIntent).toBeDefined();
39
+ if (starterProductReadiness.exportIntent.image.mode === "toolcraft-default") {
40
+ expect(starterProductReadiness.exportIntent.image).toEqual({
41
+ mode: "toolcraft-default",
42
+ });
43
+ }
44
+ expect(starterProductReadiness.exportIntent.video.mode).toBe(
45
+ schemaHasVideoExportPanelAction(starterSchema)
46
+ ? "user-requested"
47
+ : "not-requested",
48
+ );
49
+ expect(starterProductReadiness.exportIntent.svg.mode).toBe(
50
+ schemaHasSvgExportPanelAction(starterSchema)
51
+ ? "user-requested"
52
+ : "not-requested",
53
+ );
25
54
  expect(starterProductReadiness.productName.trim()).not.toBe("");
26
55
  expect(starterProductReadiness.productSummary.trim()).not.toBe("");
27
56
  expect(starterProductReadiness.requestedBehavior.trim()).not.toBe("");
@@ -2,20 +2,141 @@ import { existsSync, readFileSync } from "node:fs";
2
2
 
3
3
  import { describe, expect, it } from "vitest";
4
4
 
5
- import { starterProductReadiness } from "./starter-acceptance";
5
+ import {
6
+ starterProductReadiness,
7
+ starterTransferMode,
8
+ } from "./starter-acceptance";
9
+ import type { ToolcraftTransferMode } from "./starter-acceptance";
10
+ import {
11
+ createMotionReferenceBehavior,
12
+ createMotionReferenceInput,
13
+ createOrdinalMotionReferenceStudy,
14
+ createTimedMotionReferenceStudy,
15
+ } from "./starter-acceptance.motion-reference-test-utils";
6
16
  import { schemaHasProductSurface } from "./starter-acceptance.schema-test-utils";
7
17
  import {
8
18
  agentWorklogPath,
9
19
  getAgentWorklogValidationErrors,
20
+ type WorklogMotionReference,
10
21
  } from "./starter-acceptance.worklog-test-utils";
11
22
 
23
+ function getWorklogMotionReferences(
24
+ transferMode: ToolcraftTransferMode,
25
+ ): readonly WorklogMotionReference[] {
26
+ return transferMode.referenceInputs.flatMap((referenceInput) =>
27
+ referenceInput.studies.map((study) => {
28
+ const requiresRealTimeReview =
29
+ study.evidence.timingMode === "seconds";
30
+ const requiresSlowedReview =
31
+ requiresRealTimeReview &&
32
+ (study.events.some(
33
+ ({ classification }) => classification === "product-behavior",
34
+ ) ||
35
+ referenceInput.behaviors.some((behavior) =>
36
+ behavior.timingClaims.some(
37
+ (claim) => claim.studyId === study.studyId,
38
+ ),
39
+ ));
40
+
41
+ return {
42
+ contactSheetPath: study.evidence.contactSheet.path,
43
+ referenceId: referenceInput.referenceId,
44
+ requiresRealTimeReview,
45
+ requiresSlowedReview,
46
+ sourceSha256: study.evidence.sourceSha256,
47
+ studyId: study.studyId,
48
+ timingMode: study.evidence.timingMode,
49
+ } satisfies WorklogMotionReference;
50
+ }),
51
+ );
52
+ }
53
+
54
+ const worklogMotionReferences = getWorklogMotionReferences(starterTransferMode);
55
+
12
56
  describe("Toolcraft product worklog", () => {
57
+ it("derives real-time, slowed, and ordered-frame review requirements per nested study", () => {
58
+ const transferMode: ToolcraftTransferMode = {
59
+ animationIntent: { mode: "none" },
60
+ mode: "new-toolcraft-app",
61
+ referenceInputs: [
62
+ createMotionReferenceInput({
63
+ behaviors: [
64
+ createMotionReferenceBehavior({
65
+ timingClaims: [{ claim: "duration", studyId: "study-claim" }],
66
+ }),
67
+ ],
68
+ studies: [
69
+ createTimedMotionReferenceStudy({
70
+ pathId: "study-event",
71
+ studyId: "study-event",
72
+ }),
73
+ createTimedMotionReferenceStudy({
74
+ pathId: "study-claim",
75
+ studyId: "study-claim",
76
+ withEvent: false,
77
+ }),
78
+ createTimedMotionReferenceStudy({
79
+ pathId: "study-quiet",
80
+ studyId: "study-quiet",
81
+ withEvent: false,
82
+ }),
83
+ createOrdinalMotionReferenceStudy({
84
+ pathId: "study-ordinal",
85
+ studyId: "study-ordinal",
86
+ }),
87
+ ],
88
+ }),
89
+ ],
90
+ };
91
+
92
+ expect(
93
+ getWorklogMotionReferences(transferMode).map(
94
+ ({ requiresRealTimeReview, requiresSlowedReview, studyId, timingMode }) =>
95
+ ({
96
+ requiresRealTimeReview,
97
+ requiresSlowedReview,
98
+ studyId,
99
+ timingMode,
100
+ }),
101
+ ),
102
+ ).toEqual([
103
+ {
104
+ requiresRealTimeReview: true,
105
+ requiresSlowedReview: true,
106
+ studyId: "study-event",
107
+ timingMode: "seconds",
108
+ },
109
+ {
110
+ requiresRealTimeReview: true,
111
+ requiresSlowedReview: true,
112
+ studyId: "study-claim",
113
+ timingMode: "seconds",
114
+ },
115
+ {
116
+ requiresRealTimeReview: true,
117
+ requiresSlowedReview: false,
118
+ studyId: "study-quiet",
119
+ timingMode: "seconds",
120
+ },
121
+ {
122
+ requiresRealTimeReview: false,
123
+ requiresSlowedReview: false,
124
+ studyId: "study-ordinal",
125
+ timingMode: "ordinal",
126
+ },
127
+ ]);
128
+ });
129
+
13
130
  it("requires product apps to replace the starter worklog with decision evidence", () => {
14
131
  if (starterProductReadiness.mode !== "product" && !schemaHasProductSurface()) {
15
132
  return;
16
133
  }
17
134
 
18
135
  expect(existsSync(agentWorklogPath)).toBe(true);
19
- expect(getAgentWorklogValidationErrors(readFileSync(agentWorklogPath, "utf8"))).toEqual([]);
136
+ expect(
137
+ getAgentWorklogValidationErrors(readFileSync(agentWorklogPath, "utf8"), {
138
+ motionReferences: worklogMotionReferences,
139
+ }),
140
+ ).toEqual([]);
20
141
  });
21
142
  });
@@ -19,6 +19,7 @@ describe("starter acceptance custom reference timeline contract", () => {
19
19
  transferMode: {
20
20
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
21
21
  mode: "reference-runtime-clone",
22
+ referenceInputs: [],
22
23
  referenceName: "legacy state timeline",
23
24
  referenceTimeline: {
24
25
  behaviorCoverage: ["state-jump", "trim-range"],
@@ -117,6 +118,7 @@ describe("starter acceptance custom reference timeline contract", () => {
117
118
  transferMode: {
118
119
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
119
120
  mode: "reference-runtime-clone",
121
+ referenceInputs: [],
120
122
  referenceFeatureInventory: makeReferenceFeatureInventory([
121
123
  {
122
124
  acceptanceId: "reference.timeline.stateJump",
@@ -27,6 +27,7 @@ describe("starter acceptance reference-runtime foundation", () => {
27
27
  "renderer-loop",
28
28
  ],
29
29
  mode: "reference-runtime-clone",
30
+ referenceInputs: [],
30
31
  referenceName: "legacy badge wall",
31
32
  sourceOfTruth: "reference-runtime",
32
33
  } as never,
@@ -57,6 +58,7 @@ describe("starter acceptance reference-runtime foundation", () => {
57
58
  transferMode: {
58
59
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
59
60
  mode: "reference-runtime-clone",
61
+ referenceInputs: [],
60
62
  referenceName: "legacy badge wall",
61
63
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
62
64
  sourceOfTruth: "reference-runtime",
@@ -86,6 +88,7 @@ describe("starter acceptance reference-runtime foundation", () => {
86
88
  transferMode: {
87
89
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
88
90
  mode: "reference-runtime-clone",
91
+ referenceInputs: [],
89
92
  referenceFeatureInventory: makeReferenceFeatureInventory(),
90
93
  referenceName: "legacy badge wall",
91
94
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
@@ -110,6 +113,7 @@ describe("starter acceptance reference-runtime foundation", () => {
110
113
  transferMode: {
111
114
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
112
115
  mode: "reference-runtime-clone",
116
+ referenceInputs: [],
113
117
  referenceFeatureInventory: makeReferenceFeatureInventory(),
114
118
  referenceName: "legacy badge wall",
115
119
  referenceStudy: {
@@ -141,6 +145,7 @@ describe("starter acceptance reference-runtime foundation", () => {
141
145
  transferMode: {
142
146
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
143
147
  mode: "reference-runtime-clone",
148
+ referenceInputs: [],
144
149
  referenceFeatureInventory: [
145
150
  {
146
151
  acceptanceId: "appearance.opacity",
@@ -180,6 +185,7 @@ describe("starter acceptance reference-runtime foundation", () => {
180
185
  transferMode: {
181
186
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
182
187
  mode: "reference-runtime-clone",
188
+ referenceInputs: [],
183
189
  referenceFeatureInventory: [
184
190
  { ...makeReferenceFeatureInventory()[0], behaviorEvidence: "" },
185
191
  ...makeReferenceFeatureInventory().slice(1),
@@ -208,6 +214,7 @@ describe("starter acceptance reference-runtime foundation", () => {
208
214
  transferMode: {
209
215
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
210
216
  mode: "reference-runtime-clone",
217
+ referenceInputs: [],
211
218
  referenceFeatureInventory: [
212
219
  {
213
220
  ...makeReferenceFeatureInventory()[0],
@@ -292,6 +299,7 @@ describe("starter acceptance reference-runtime foundation", () => {
292
299
  transferMode: {
293
300
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
294
301
  mode: "reference-runtime-clone",
302
+ referenceInputs: [],
295
303
  referenceName: "legacy iframe shell",
296
304
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
297
305
  sourceOfTruth: "reference-runtime",
@@ -67,6 +67,7 @@ describe("starter acceptance reference timeline contract", () => {
67
67
  transferMode: {
68
68
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
69
69
  mode: "reference-runtime-clone",
70
+ referenceInputs: [],
70
71
  referenceFeatureInventory: makeReferenceFeatureInventory(),
71
72
  referenceName: "legacy badge wall",
72
73
  referenceStudy: referenceStudyEvidence,
@@ -90,6 +91,7 @@ describe("starter acceptance reference timeline contract", () => {
90
91
  "pause-resume",
91
92
  ],
92
93
  mode: "reference-runtime-clone",
94
+ referenceInputs: [],
93
95
  referenceName: "legacy pause animation",
94
96
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
95
97
  sourceOfTruth: "reference-runtime",
@@ -114,6 +116,7 @@ describe("starter acceptance reference timeline contract", () => {
114
116
  "time-progress",
115
117
  ],
116
118
  mode: "reference-runtime-clone",
119
+ referenceInputs: [],
117
120
  referenceName: "legacy restart animation",
118
121
  referenceTimeline: { behaviorCoverage: [], mode: "none" },
119
122
  sourceOfTruth: "reference-runtime",
@@ -132,6 +135,7 @@ describe("starter acceptance reference timeline contract", () => {
132
135
  transferMode: {
133
136
  behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
134
137
  mode: "reference-runtime-clone",
138
+ referenceInputs: [],
135
139
  referenceName: "legacy playback animation",
136
140
  referenceTimeline: { behaviorCoverage: [], mode: "toolcraft-playback" },
137
141
  sourceOfTruth: "reference-runtime",
@@ -170,6 +174,7 @@ describe("starter acceptance reference timeline contract", () => {
170
174
  "pause-resume",
171
175
  ],
172
176
  mode: "reference-runtime-clone",
177
+ referenceInputs: [],
173
178
  referenceName: "legacy playback animation",
174
179
  referenceTimeline: { behaviorCoverage: ["playback"], mode: "toolcraft-playback" },
175
180
  sourceOfTruth: "reference-runtime",
@@ -208,6 +213,7 @@ describe("starter acceptance reference timeline contract", () => {
208
213
  "pause-resume",
209
214
  ],
210
215
  mode: "reference-runtime-clone",
216
+ referenceInputs: [],
211
217
  referenceName: "legacy playback animation",
212
218
  referenceTimeline: {
213
219
  behaviorCoverage: ["playback"],
@@ -255,6 +261,7 @@ describe("starter acceptance reference timeline contract", () => {
255
261
  "time-progress",
256
262
  ],
257
263
  mode: "reference-runtime-clone",
264
+ referenceInputs: [],
258
265
  referenceName: "legacy keyframe animation",
259
266
  referenceTimeline: { behaviorCoverage: ["keyframes"], mode: "toolcraft-keyframes" },
260
267
  sourceOfTruth: "reference-runtime",
@@ -162,6 +162,7 @@ describe("starter acceptance section cohesion contract", () => {
162
162
  reason: "The flow speed is a decorative self-running effect and does not expose product time transport.",
163
163
  },
164
164
  mode: "new-toolcraft-app",
165
+ referenceInputs: [],
165
166
  },
166
167
  });
167
168
 
@@ -247,6 +248,7 @@ describe("starter acceptance section cohesion contract", () => {
247
248
  reason: "The flow speed is a decorative self-running effect and does not expose product time transport.",
248
249
  },
249
250
  mode: "new-toolcraft-app",
251
+ referenceInputs: [],
250
252
  },
251
253
  }),
252
254
  ).toEqual([]);
@@ -311,7 +313,7 @@ describe("starter acceptance section cohesion contract", () => {
311
313
  }),
312
314
  ).toEqual(
313
315
  expect.arrayContaining([
314
- 'Controls for product entity "squares.right" are split across sections: Square 1 (Right), Appearance. Keep controls for the same product entity in one semantic section unless the Control Section Inventory declares workflowStage and splitReason for every split section.',
316
+ 'Controls for target family "squares.right" are split across sections: Square 1 (Right), Appearance. Assign one shared entityId when the sections edit one logical entity; the entity cohesion validator decides whether that split is allowed.',
315
317
  ]),
316
318
  );
317
319
  });