@pixel-point/toolcraft 0.0.16 → 0.0.18

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 (313) hide show
  1. package/package.json +1 -1
  2. package/src/generate-performance-iteration-execution.test.mjs +2 -2
  3. package/src/generate-test-demand-only-lifecycle.mjs +14 -3
  4. package/src/generate-test-dependency-sandbox.mjs +42 -5
  5. package/src/generate-test-doc-assertions.mjs +109 -69
  6. package/src/generate-test-doc-assertions.test.mjs +65 -0
  7. package/src/generate-test-doc-policy-assertions.mjs +92 -0
  8. package/src/generate-test-file-assertions.mjs +36 -118
  9. package/src/generate-test-output-assertions.mjs +95 -0
  10. package/src/generate-test-package-assertions.mjs +6 -0
  11. package/src/generate-test-performance-boundary-assertions.mjs +45 -0
  12. package/src/generate-test-product-fixture.mjs +1 -0
  13. package/src/generate-test-product-fixture.test.mjs +18 -0
  14. package/src/generate-test-product-iteration.mjs +1 -0
  15. package/src/generate-test-product-iteration.test.mjs +18 -0
  16. package/src/generate-test-runtime-boundary-assertions.mjs +158 -0
  17. package/src/generate-test-standalone-assertions.mjs +10 -0
  18. package/src/generate-test-standalone-delivery-stages.mjs +14 -6
  19. package/src/generate.test.mjs +14 -0
  20. package/templates/runtime/contracts/component-contracts.choices.test.ts +59 -12
  21. package/templates/runtime/contracts/component-contracts.choices.ts +58 -12
  22. package/templates/runtime/contracts/component-contracts.inputs.test.ts +6 -6
  23. package/templates/runtime/contracts/component-contracts.inputs.ts +6 -6
  24. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +8 -2
  25. package/templates/runtime/contracts/component-contracts.media-custom.ts +8 -2
  26. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +21 -6
  27. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +7 -1
  28. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +4 -1
  29. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +4 -1
  30. package/templates/runtime/contracts/component-contracts.runtime.ts +15 -10
  31. package/templates/runtime/contracts/component-contracts.test.ts +2 -0
  32. package/templates/runtime/contracts/decision-contracts.test.ts +43 -4
  33. package/templates/runtime/contracts/decision-contracts.ts +10 -10
  34. package/templates/runtime/contracts/performance-verification-policy.test.ts +59 -6
  35. package/templates/runtime/contracts/performance-verification-policy.ts +5 -2
  36. package/templates/runtime/export/artifact-download.test.ts +71 -0
  37. package/templates/runtime/export/artifact-download.ts +80 -0
  38. package/templates/runtime/export/artifact-export-request.ts +23 -0
  39. package/templates/runtime/export/artifact-export-settings.test.ts +75 -0
  40. package/templates/runtime/export/artifact-export-settings.ts +96 -0
  41. package/templates/runtime/export/artifact-frame-renderer.test.ts +107 -0
  42. package/templates/runtime/export/artifact-frame-renderer.ts +96 -0
  43. package/templates/runtime/export/artifact-frame-state.test.ts +54 -0
  44. package/templates/runtime/export/artifact-frame-state.ts +44 -0
  45. package/templates/runtime/export/artifact-scene-frame.test.ts +84 -0
  46. package/templates/runtime/export/artifact-scene-frame.ts +118 -0
  47. package/templates/runtime/export/export-background.ts +46 -0
  48. package/templates/runtime/export/export-error.ts +43 -0
  49. package/templates/runtime/export/export.test.ts +49 -226
  50. package/templates/runtime/export/image-artifact-export.test.ts +111 -0
  51. package/templates/runtime/export/image-artifact-export.ts +145 -0
  52. package/templates/runtime/export/index.ts +44 -3
  53. package/templates/runtime/export/product-export-renderer.test.ts +77 -0
  54. package/templates/runtime/export/product-export-renderer.ts +63 -0
  55. package/templates/runtime/export/video-artifact-export.test.ts +166 -0
  56. package/templates/runtime/export/video-artifact-export.ts +164 -0
  57. package/templates/runtime/export/video-encoding-backend.ts +124 -0
  58. package/templates/runtime/export/video-encoding-policy.test.ts +68 -0
  59. package/templates/runtime/export/video-encoding-policy.ts +86 -0
  60. package/templates/runtime/export/video-frame-schedule.test.ts +58 -0
  61. package/templates/runtime/export/video-frame-schedule.ts +42 -0
  62. package/templates/runtime/index.ts +3 -0
  63. package/templates/runtime/model-import/model-import-limits.ts +15 -4
  64. package/templates/runtime/react/app-shell/runtime-public-api-runtime.test.tsx +291 -0
  65. package/templates/runtime/react/app-shell/runtime-public-api-test-support.ts +21 -0
  66. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +15 -304
  67. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +41 -27
  68. package/templates/runtime/react/app-shell/toolcraft-app.tsx +39 -11
  69. package/templates/runtime/react/app-shell/toolcraft-source-asset-context.test.tsx +16 -57
  70. package/templates/runtime/react/app-shell/toolcraft-source-asset-context.tsx +75 -434
  71. package/templates/runtime/react/app-shell/toolcraft-source-asset-owner.test.ts +194 -0
  72. package/templates/runtime/react/app-shell/toolcraft-source-asset-owner.ts +227 -0
  73. package/templates/runtime/react/app-shell/toolcraft-source-asset-provider-ownership.test.tsx +243 -0
  74. package/templates/runtime/react/app-shell/toolcraft-source-asset-test-support.ts +51 -0
  75. package/templates/runtime/react/app-shell/toolcraft-unavailable-resource-proof.test.ts +138 -0
  76. package/templates/runtime/react/app-shell/toolcraft-unavailable-resource-proof.ts +378 -0
  77. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +76 -0
  78. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +13 -1
  79. package/templates/runtime/react/canvas/canvas-shell.tsx +16 -1
  80. package/templates/runtime/react/canvas/product-scene-surface.test.tsx +195 -0
  81. package/templates/runtime/react/canvas/product-scene-surface.tsx +155 -0
  82. package/templates/runtime/react/canvas/runtime-scene-export.ts +1 -1
  83. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +61 -0
  84. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +89 -0
  85. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +40 -19
  86. package/templates/runtime/react/controls-panel/__tests__/controls-panel.footer-actions.test.tsx +7 -12
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +18 -84
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +62 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +67 -0
  90. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +43 -87
  91. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +68 -0
  92. package/templates/runtime/react/controls-panel/conditions/control-conditions.ts +32 -119
  93. package/templates/runtime/react/controls-panel/layout/controls-panel-control-group.tsx +5 -2
  94. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +10 -8
  95. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +3 -3
  96. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.test.tsx +63 -0
  97. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.tsx +138 -0
  98. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-items.tsx +104 -0
  99. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +115 -236
  100. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.test.tsx +95 -0
  101. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.tsx +82 -0
  102. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.test.tsx +73 -1
  103. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +50 -1
  104. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +1 -1
  105. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +2 -1
  106. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +38 -6
  107. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +1 -0
  108. package/templates/runtime/react/index.ts +4 -0
  109. package/templates/runtime/react/model-rendering/model-export.ts +1 -1
  110. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-selection.ts +5 -5
  111. package/templates/runtime/react/orientation-gizmo/use-toolcraft-orientation-control-selection.ts +2 -2
  112. package/templates/runtime/react/panel-host/panel-host-runtime-placement.test.tsx +30 -0
  113. package/templates/runtime/react/panel-host/panel-host.tsx +4 -0
  114. package/templates/runtime/scene/scene-bounds.test.ts +23 -0
  115. package/templates/runtime/scene/scene-bounds.ts +32 -19
  116. package/templates/runtime/schema/app-capabilities.test.ts +4 -0
  117. package/templates/runtime/schema/canvas-render-scale.ts +62 -0
  118. package/templates/runtime/schema/collection-item-controls.ts +29 -0
  119. package/templates/runtime/schema/control-applicability.test.ts +127 -0
  120. package/templates/runtime/schema/control-applicability.ts +433 -0
  121. package/templates/runtime/schema/control-schema-normalization.ts +177 -11
  122. package/templates/runtime/schema/controls-panel-actions.ts +2 -2
  123. package/templates/runtime/schema/controls-panel-section-id.test.ts +1 -1
  124. package/templates/runtime/schema/controls-panel-section-layout.ts +14 -9
  125. package/templates/runtime/schema/controls-panel-section-roundtrip.test.ts +62 -3
  126. package/templates/runtime/schema/define-toolcraft.collection-actions-item-controls.test.ts +127 -0
  127. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +10 -4
  128. package/templates/runtime/schema/define-toolcraft.file-drop-item-controls.test.ts +98 -0
  129. package/templates/runtime/schema/define-toolcraft.file-drop-normalization.test.ts +27 -0
  130. package/templates/runtime/schema/define-toolcraft.segmented-control-fit.test.ts +20 -2
  131. package/templates/runtime/schema/define-toolcraft.setup-background.test.ts +1 -1
  132. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +16 -3
  133. package/templates/runtime/schema/define-toolcraft.setup-render-scale-timeline.test.ts +71 -3
  134. package/templates/runtime/schema/define-toolcraft.source-collection.test.ts +79 -0
  135. package/templates/runtime/schema/define-toolcraft.ts +1 -1
  136. package/templates/runtime/schema/runtime-setup-section.ts +24 -5
  137. package/templates/runtime/schema/schema-resolvers.ts +0 -56
  138. package/templates/runtime/schema/types.ts +72 -17
  139. package/templates/runtime/state/canvas-background-state.ts +6 -0
  140. package/templates/runtime/testing/performance-render-plan-integration.test.ts +64 -0
  141. package/templates/runtime/testing/performance-renderer-pipeline-validation.ts +18 -1
  142. package/templates/starter/AGENTS.md +18 -15
  143. package/templates/starter/NOTICE.md +6 -0
  144. package/templates/starter/docs/toolcraft/README.md +2 -1
  145. package/templates/starter/docs/toolcraft/acceptance-testing.md +23 -35
  146. package/templates/starter/docs/toolcraft/agent-worklog.md +18 -3
  147. package/templates/starter/docs/toolcraft/assembly-workflow.md +13 -5
  148. package/templates/starter/docs/toolcraft/component-rules.md +8 -6
  149. package/templates/starter/docs/toolcraft/core/control-selection.md +9 -3
  150. package/templates/starter/docs/toolcraft/core/layout.md +7 -7
  151. package/templates/starter/docs/toolcraft/core/media-upload.md +4 -2
  152. package/templates/starter/docs/toolcraft/core/performance.md +14 -3
  153. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +16 -3
  154. package/templates/starter/docs/toolcraft/core/setup-export.md +49 -19
  155. package/templates/starter/docs/toolcraft/core/timeline-animation.md +4 -4
  156. package/templates/starter/docs/toolcraft/custom-controls.md +6 -4
  157. package/templates/starter/docs/toolcraft/decision-contract.md +3 -1
  158. package/templates/starter/docs/toolcraft/performance.md +20 -6
  159. package/templates/starter/docs/toolcraft/renderer-technique.md +5 -1
  160. package/templates/starter/docs/toolcraft/schema-reference.md +23 -25
  161. package/templates/starter/docs/toolcraft/workflow.md +7 -2
  162. package/templates/starter/e2e/app-browser-control-applicability-requirements.spec.ts +163 -0
  163. package/templates/starter/e2e/app-browser-control-coverage.spec.ts +33 -0
  164. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +50 -3
  165. package/templates/starter/e2e/app-browser-orientation-evidence.spec.ts +174 -21
  166. package/templates/starter/e2e/app-browser-render-scale-evidence.spec.ts +60 -6
  167. package/templates/starter/e2e/app-browser-render-scale-requirements.spec.ts +77 -1
  168. package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +8 -0
  169. package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +35 -0
  170. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +5 -34
  171. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +61 -16
  172. package/templates/starter/e2e/app-browser-shell.spec.ts +13 -5
  173. package/templates/starter/e2e/app-performance-path-adapters.ts +8 -1
  174. package/templates/starter/e2e/app-performance.spec.ts +16 -9
  175. package/templates/starter/e2e/{browser-conditional-output-evidence-helpers.ts → browser-background-output-evidence.ts} +0 -68
  176. package/templates/starter/e2e/browser-control-applicability-evidence.ts +114 -0
  177. package/templates/starter/e2e/browser-infinity-canvas-evidence.ts +29 -341
  178. package/templates/starter/e2e/browser-infinity-canvas-unavailable-image-evidence.ts +370 -0
  179. package/templates/starter/e2e/browser-media-export-evidence.spec.ts +77 -0
  180. package/templates/starter/e2e/browser-media-export-evidence.ts +208 -0
  181. package/templates/starter/e2e/browser-orientation-gizmo-evidence-helpers.ts +4 -0
  182. package/templates/starter/e2e/browser-orientation-gizmo-live-preconditions.ts +86 -0
  183. package/templates/starter/e2e/browser-render-scale-evidence.ts +37 -29
  184. package/templates/starter/e2e/browser-runtime-applicability-requirements.ts +84 -0
  185. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +13 -3
  186. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +72 -35
  187. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +25 -0
  188. package/templates/starter/e2e/browser-standard-timeline-evidence.ts +106 -0
  189. package/templates/starter/e2e/decoded-pixel-observation.spec.ts +74 -0
  190. package/templates/starter/e2e/decoded-pixel-observation.ts +227 -0
  191. package/templates/starter/e2e/export-artifact-helpers.ts +206 -25
  192. package/templates/starter/e2e/image-artifact-inspection.spec.ts +41 -0
  193. package/templates/starter/e2e/image-artifact-inspection.ts +99 -0
  194. package/templates/starter/e2e/performance-canvas-helpers.ts +22 -21
  195. package/templates/starter/e2e/performance-canvas-quality-guard.spec.ts +312 -0
  196. package/templates/starter/e2e/performance-canvas-quality-guard.ts +196 -0
  197. package/templates/starter/e2e/performance-canvas-quality-observer.ts +351 -0
  198. package/templates/starter/e2e/performance-control-layout-helpers.ts +2 -2
  199. package/templates/starter/e2e/performance-path-adapter-contract.ts +4 -4
  200. package/templates/starter/e2e/performance-path-helpers.spec.ts +203 -70
  201. package/templates/starter/e2e/performance-path-helpers.ts +210 -91
  202. package/templates/starter/e2e/performance-pipeline-evidence-continuity.spec.ts +76 -0
  203. package/templates/starter/e2e/performance-pipeline-evidence-test-fixtures.ts +11 -2
  204. package/templates/starter/e2e/performance-pipeline-invariants.ts +47 -4
  205. package/templates/starter/e2e/performance-render-scale-runner.spec.ts +140 -38
  206. package/templates/starter/e2e/video-artifact-inspection.spec.ts +64 -0
  207. package/templates/starter/e2e/video-artifact-inspection.ts +281 -0
  208. package/templates/starter/gitignore +1 -0
  209. package/templates/starter/package.json +1 -0
  210. package/templates/starter/scripts/check-toolcraft-docs.mjs +17 -0
  211. package/templates/starter/scripts/toolcraft-contract-manifest.json +1 -0
  212. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +60 -0
  213. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +7 -2
  214. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +7 -3
  215. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +95 -103
  216. package/templates/starter/scripts/toolcraft-product-boundary-module-policy.mjs +101 -0
  217. package/templates/starter/scripts/toolcraft-product-boundary.mjs +12 -0
  218. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +0 -26
  219. package/templates/starter/scripts/toolcraft-product-control-bindings.mjs +182 -0
  220. package/templates/starter/scripts/toolcraft-product-control-boundary.mjs +146 -0
  221. package/templates/starter/scripts/toolcraft-product-control-boundary.test.mjs +186 -0
  222. package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +85 -20
  223. package/templates/starter/scripts/toolcraft-product-evidence-import-policy.mjs +43 -0
  224. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +157 -0
  225. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +196 -0
  226. package/templates/starter/scripts/toolcraft-typescript-analysis.d.mts +73 -0
  227. package/templates/starter/scripts/toolcraft-typescript-source-evidence-structure.test.mjs +20 -0
  228. package/templates/starter/scripts/toolcraft-typescript-source-evidence.mjs +1 -0
  229. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade-test-helpers.mjs +318 -0
  230. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade.test.mjs +157 -206
  231. package/templates/starter/scripts/toolcraft-verification-inventory.mjs +1 -0
  232. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +51 -0
  233. package/templates/starter/scripts/toolcraft-vite-env-activation.test.mjs +128 -59
  234. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +130 -0
  235. package/templates/starter/src/app/acceptance/conditions.ts +1 -1
  236. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +2 -2
  237. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +6 -20
  238. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +24 -5
  239. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -13
  240. package/templates/starter/src/app/acceptance/control-applicability-cases.test.ts +321 -0
  241. package/templates/starter/src/app/acceptance/control-applicability-cases.ts +290 -0
  242. package/templates/starter/src/app/acceptance/control-applicability.ts +332 -0
  243. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +20 -9
  244. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +4 -6
  245. package/templates/starter/src/app/acceptance/control-layout-model.ts +4 -4
  246. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +3 -10
  247. package/templates/starter/src/app/acceptance/control-parts.ts +8 -0
  248. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.test.ts +215 -0
  249. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.ts +132 -0
  250. package/templates/starter/src/app/acceptance/control-section-inventory.test.ts +87 -0
  251. package/templates/starter/src/app/acceptance/control-section-inventory.ts +74 -44
  252. package/templates/starter/src/app/acceptance/custom-controls.ts +11 -3
  253. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +113 -0
  254. package/templates/starter/src/app/acceptance/inline-layout.ts +64 -9
  255. package/templates/starter/src/app/acceptance/media-upload.ts +5 -1
  256. package/templates/starter/src/app/acceptance/orientation-gizmo.ts +18 -11
  257. package/templates/starter/src/app/acceptance/output-background-rules.ts +2 -2
  258. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +18 -10
  259. package/templates/starter/src/app/acceptance/output-export-model.ts +54 -11
  260. package/templates/starter/src/app/acceptance/output-export.ts +35 -12
  261. package/templates/starter/src/app/acceptance/output-video-export-rules.ts +99 -0
  262. package/templates/starter/src/app/acceptance/types.ts +30 -8
  263. package/templates/starter/src/app/acceptance/validate-coverage.ts +20 -2
  264. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +239 -0
  265. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +33 -0
  266. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +16 -1
  267. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +65 -0
  268. package/templates/starter/src/app/starter-acceptance.contract-fixtures.test.ts +41 -0
  269. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +112 -16
  270. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +224 -0
  271. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +58 -3
  272. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +0 -111
  273. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +3 -1
  274. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +1 -1
  275. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +131 -0
  276. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +22 -0
  277. package/templates/starter/src/app/{starter-acceptance.image-video-export-settings.test.ts → starter-acceptance.image-export-settings.test.ts} +37 -9
  278. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +12 -0
  279. package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +14 -4
  280. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +11 -1
  281. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
  282. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +384 -0
  283. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +46 -1
  284. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +112 -105
  285. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +12 -0
  286. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +1 -1
  287. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +35 -24
  288. package/templates/starter/src/app/starter-acceptance.section-size.test.ts +72 -0
  289. package/templates/starter/src/app/starter-acceptance.ts +13 -2
  290. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +336 -0
  291. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +8 -0
  292. package/templates/starter/src/app/starter-performance-test-utils.ts +103 -0
  293. package/templates/starter/src/app/starter-performance.gates.test.ts +231 -278
  294. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +261 -0
  295. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +4 -2
  296. package/templates/starter/src/routes/index.tsx +2 -0
  297. package/templates/ui/components/composites/tabs.tsx +2 -2
  298. package/templates/ui/components/controls/collection-actions/collection-item-groups.test.tsx +38 -0
  299. package/templates/ui/components/controls/collection-actions/collection-item-groups.tsx +36 -0
  300. package/templates/ui/components/controls/collection-actions/index.ts +2 -0
  301. package/templates/ui/components/controls/file-drop/file-drop-collection-control.tsx +137 -0
  302. package/templates/ui/components/controls/file-drop/file-drop-control.test.tsx +189 -0
  303. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +81 -88
  304. package/templates/ui/components/controls/file-drop/file-drop-presentation.tsx +131 -9
  305. package/templates/ui/components/controls/file-drop/file-drop-types.ts +36 -22
  306. package/templates/ui/components/controls/file-drop/index.ts +1 -0
  307. package/templates/ui/components/controls/index.ts +3 -0
  308. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +1 -1
  309. package/templates/ui/components/controls/range-slider/range-slider-value.test.ts +14 -0
  310. package/templates/ui/components/controls/range-slider/range-slider-value.ts +3 -2
  311. package/templates/runtime/export/export.ts +0 -166
  312. package/templates/starter/src/app/acceptance/condition-exclusivity.test.ts +0 -60
  313. package/templates/starter/src/app/acceptance/condition-exclusivity.ts +0 -221
@@ -6,34 +6,35 @@ import test from "node:test";
6
6
  import { createServer } from "vite";
7
7
 
8
8
  const starterRoot = path.resolve(import.meta.dirname, "..");
9
- const generatedRuntimePath = path.join(
9
+ const generatedProofControllerPath = path.join(
10
10
  starterRoot,
11
- "src/toolcraft/runtime/react/app-shell/toolcraft-source-asset-context.tsx",
11
+ "src/toolcraft/runtime/react/app-shell/toolcraft-unavailable-resource-proof.ts",
12
12
  );
13
- const monorepoRuntimePath = path.resolve(
13
+ const monorepoProofControllerPath = path.resolve(
14
14
  starterRoot,
15
- "../packages/toolcraft-runtime/src/react/app-shell/toolcraft-source-asset-context.tsx",
15
+ "../packages/toolcraft-runtime/src/react/app-shell/toolcraft-unavailable-resource-proof.ts",
16
16
  );
17
+ let transformedProofControllerSequence = 0;
17
18
 
18
- async function resolveRuntimeSource() {
19
+ async function resolveProofControllerSource() {
19
20
  try {
20
21
  return {
21
- filePath: generatedRuntimePath,
22
+ filePath: generatedProofControllerPath,
22
23
  requestPath:
23
- "/src/toolcraft/runtime/react/app-shell/toolcraft-source-asset-context.tsx",
24
+ "/src/toolcraft/runtime/react/app-shell/toolcraft-unavailable-resource-proof.ts",
24
25
  root: starterRoot,
25
- source: await fs.readFile(generatedRuntimePath, "utf8"),
26
+ source: await fs.readFile(generatedProofControllerPath, "utf8"),
26
27
  };
27
28
  } catch (error) {
28
29
  if (error?.code !== "ENOENT") throw error;
29
30
  }
30
31
 
31
32
  return {
32
- filePath: monorepoRuntimePath,
33
+ filePath: monorepoProofControllerPath,
33
34
  requestPath:
34
- "/packages/toolcraft-runtime/src/react/app-shell/toolcraft-source-asset-context.tsx",
35
+ "/packages/toolcraft-runtime/src/react/app-shell/toolcraft-unavailable-resource-proof.ts",
35
36
  root: path.resolve(starterRoot, ".."),
36
- source: await fs.readFile(monorepoRuntimePath, "utf8"),
37
+ source: await fs.readFile(monorepoProofControllerPath, "utf8"),
37
38
  };
38
39
  }
39
40
 
@@ -46,7 +47,7 @@ function readInjectedViteEnv(code, mode) {
46
47
  return JSON.parse(match[1]);
47
48
  }
48
49
 
49
- async function transformRuntime({ mode, requestPath, root }) {
50
+ async function transformProofController({ mode, requestPath, root }) {
50
51
  const server = await createServer({
51
52
  configFile: false,
52
53
  envDir: false,
@@ -65,67 +66,135 @@ async function transformRuntime({ mode, requestPath, root }) {
65
66
  }
66
67
  }
67
68
 
69
+ async function loadTransformedProofController({
70
+ fixtureFlag,
71
+ mode,
72
+ requestPath,
73
+ root,
74
+ }) {
75
+ const previousFixtureValue =
76
+ process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES;
77
+ try {
78
+ if (fixtureFlag === undefined) {
79
+ delete process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES;
80
+ } else {
81
+ process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES = fixtureFlag;
82
+ }
83
+ const code = await transformProofController({ mode, requestPath, root });
84
+ const moduleUrl =
85
+ `data:text/javascript;base64,${Buffer.from(code).toString("base64")}` +
86
+ `#toolcraft-proof-${++transformedProofControllerSequence}`;
87
+ const transformedModule = await import(moduleUrl);
88
+ assert.equal(
89
+ typeof transformedModule.decorateToolcraftUnavailableResourceProofCoordinator,
90
+ "function",
91
+ );
92
+ return {
93
+ code,
94
+ decorateCoordinator:
95
+ transformedModule.decorateToolcraftUnavailableResourceProofCoordinator,
96
+ };
97
+ } finally {
98
+ if (previousFixtureValue === undefined) {
99
+ delete process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES;
100
+ } else {
101
+ process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES = previousFixtureValue;
102
+ }
103
+ }
104
+ }
105
+
106
+ async function observeProofControllerDecoration(decorateCoordinator) {
107
+ const addedEvents = [];
108
+ const removedEvents = [];
109
+ const previousDocument = globalThis.document;
110
+ globalThis.document = {
111
+ addEventListener(eventName) {
112
+ addedEvents.push(eventName);
113
+ },
114
+ removeEventListener(eventName) {
115
+ removedEvents.push(eventName);
116
+ },
117
+ };
118
+ const originalDispose = async () => {};
119
+ const originalResolveResource = async () => new Uint8Array([1]);
120
+ const coordinator = {
121
+ dispose: originalDispose,
122
+ resolveResource: originalResolveResource,
123
+ };
124
+ try {
125
+ const returned = decorateCoordinator(coordinator, {});
126
+ const decorationApplied =
127
+ coordinator.dispose !== originalDispose &&
128
+ coordinator.resolveResource !== originalResolveResource;
129
+ await coordinator.dispose();
130
+ return {
131
+ addedEvents,
132
+ decorationApplied,
133
+ removedEvents,
134
+ returnedOriginal: returned === coordinator,
135
+ };
136
+ } finally {
137
+ if (previousDocument === undefined) delete globalThis.document;
138
+ else globalThis.document = previousDocument;
139
+ }
140
+ }
141
+
68
142
  test("unavailable-resource proof activation uses Vite-static env access and stays production-disabled", async () => {
69
- const runtime = await resolveRuntimeSource();
143
+ const proofController = await resolveProofControllerSource();
70
144
  assert.match(
71
- runtime.source,
145
+ proofController.source,
72
146
  /import\.meta\.env\?\.MODE/u,
73
- `${runtime.filePath} must read MODE through direct, Node-safe Vite-static access.`,
147
+ `${proofController.filePath} must read MODE through direct, Node-safe Vite-static access.`,
74
148
  );
75
149
  assert.match(
76
- runtime.source,
150
+ proofController.source,
77
151
  /import\.meta\.env\?\.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES/u,
78
- `${runtime.filePath} must read the protected fixture flag through direct, Node-safe Vite-static access.`,
152
+ `${proofController.filePath} must read the protected fixture flag through direct, Node-safe Vite-static access.`,
79
153
  );
80
154
  assert.doesNotMatch(
81
- runtime.source,
155
+ proofController.source,
82
156
  /\bconst\s+\w+\s*=\s*import\.meta\s*(?:;|\n)/u,
83
- `${runtime.filePath} must not alias import.meta before reading env.`,
157
+ `${proofController.filePath} must not alias import.meta before reading env.`,
84
158
  );
85
159
 
86
- const previousFixtureValue =
87
- process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES;
88
- try {
89
- process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES =
90
- "unavailable-resource";
91
- const testEnv = readInjectedViteEnv(
92
- await transformRuntime({ ...runtime, mode: "test" }),
93
- "test",
160
+ for (const scenario of [
161
+ { enabled: false, fixtureFlag: undefined, mode: "production" },
162
+ { enabled: false, fixtureFlag: undefined, mode: "development" },
163
+ { enabled: true, fixtureFlag: undefined, mode: "test" },
164
+ {
165
+ enabled: true,
166
+ fixtureFlag: "unavailable-resource",
167
+ mode: "production",
168
+ },
169
+ ]) {
170
+ const transformed = await loadTransformedProofController({
171
+ ...proofController,
172
+ fixtureFlag: scenario.fixtureFlag,
173
+ mode: scenario.mode,
174
+ });
175
+ const injectedEnv = readInjectedViteEnv(
176
+ transformed.code,
177
+ scenario.mode,
94
178
  );
95
- assert.equal(testEnv.MODE, "test");
179
+ assert.equal(injectedEnv.MODE, scenario.mode);
96
180
  assert.equal(
97
- testEnv.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES,
98
- "unavailable-resource",
181
+ injectedEnv.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES,
182
+ scenario.fixtureFlag,
99
183
  );
100
- assert.equal(
101
- testEnv.MODE === "test" ||
102
- testEnv.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES ===
103
- "unavailable-resource",
104
- true,
184
+ assert.deepEqual(
185
+ await observeProofControllerDecoration(
186
+ transformed.decorateCoordinator,
187
+ ),
188
+ {
189
+ addedEvents: scenario.enabled
190
+ ? ["toolcraft.browser-proof.unavailable-resource-request"]
191
+ : [],
192
+ decorationApplied: scenario.enabled,
193
+ removedEvents: scenario.enabled
194
+ ? ["toolcraft.browser-proof.unavailable-resource-request"]
195
+ : [],
196
+ returnedOriginal: true,
197
+ },
105
198
  );
106
-
107
- delete process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES;
108
- const productionEnv = readInjectedViteEnv(
109
- await transformRuntime({ ...runtime, mode: "production" }),
110
- "production",
111
- );
112
- assert.equal(productionEnv.MODE, "production");
113
- assert.equal(
114
- productionEnv.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES,
115
- undefined,
116
- );
117
- assert.equal(
118
- productionEnv.MODE === "test" ||
119
- productionEnv.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES ===
120
- "unavailable-resource",
121
- false,
122
- );
123
- } finally {
124
- if (previousFixtureValue === undefined) {
125
- delete process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES;
126
- } else {
127
- process.env.VITE_TOOLCRAFT_BROWSER_PROOF_FIXTURES =
128
- previousFixtureValue;
129
- }
130
199
  }
131
200
  });
@@ -0,0 +1,130 @@
1
+ import type { ToolcraftArtifactExportIntent } from "./types";
2
+
3
+ export type ToolcraftArtifactExportDelivery = Readonly<{
4
+ imageEnabled: boolean;
5
+ videoEnabled: boolean;
6
+ }>;
7
+
8
+ export type ToolcraftArtifactExportSchemaFacts = Readonly<{
9
+ hasImageExportAction: boolean;
10
+ hasImageExportSection: boolean;
11
+ hasVideoExportAction: boolean;
12
+ hasVideoExportSection: boolean;
13
+ }>;
14
+
15
+ export type ToolcraftArtifactExportIntentValidation = Readonly<{
16
+ delivery: ToolcraftArtifactExportDelivery;
17
+ errors: readonly string[];
18
+ }>;
19
+
20
+ export function resolveToolcraftArtifactExportIntent(
21
+ intent: ToolcraftArtifactExportIntent,
22
+ ): ToolcraftArtifactExportDelivery {
23
+ return Object.freeze({
24
+ imageEnabled: intent.image.mode !== "user-removed",
25
+ videoEnabled: intent.video.mode === "user-requested",
26
+ });
27
+ }
28
+
29
+ export function getToolcraftArtifactExportIntentEvidenceErrors(
30
+ intent: ToolcraftArtifactExportIntent,
31
+ ): readonly string[] {
32
+ const errors: string[] = [];
33
+
34
+ if (
35
+ intent.image.mode !== "toolcraft-default" &&
36
+ intent.image.evidence.trim() === ""
37
+ ) {
38
+ errors.push(
39
+ `Image export ${intent.image.mode} intent requires non-empty evidence.`,
40
+ );
41
+ }
42
+
43
+ if (
44
+ intent.video.mode === "user-requested" &&
45
+ intent.video.evidence.trim() === ""
46
+ ) {
47
+ errors.push(
48
+ "Video export user-requested intent requires non-empty evidence.",
49
+ );
50
+ }
51
+
52
+ return errors;
53
+ }
54
+
55
+ function getToolcraftArtifactCorrespondenceErrors({
56
+ actionRole,
57
+ artifact,
58
+ enabled,
59
+ hasAction,
60
+ hasSection,
61
+ intentMode,
62
+ sectionArticle,
63
+ sectionTitle,
64
+ }: Readonly<{
65
+ actionRole: "export-image" | "export-video";
66
+ artifact: "Image" | "Video";
67
+ enabled: boolean;
68
+ hasAction: boolean;
69
+ hasSection: boolean;
70
+ intentMode:
71
+ | ToolcraftArtifactExportIntent["image"]["mode"]
72
+ | ToolcraftArtifactExportIntent["video"]["mode"];
73
+ sectionArticle: "a" | "an";
74
+ sectionTitle: "Image Export" | "Video Export";
75
+ }>): string[] {
76
+ const errors: string[] = [];
77
+ const requirement = enabled ? "requires" : "must not have";
78
+
79
+ if (hasAction !== enabled) {
80
+ errors.push(
81
+ `${artifact} export intent "${intentMode}" ${requirement} an ${actionRole} panel action.`,
82
+ );
83
+ }
84
+
85
+ if (hasSection !== enabled) {
86
+ errors.push(
87
+ `${artifact} export intent "${intentMode}" ${requirement} ${sectionArticle} "${sectionTitle}" section.`,
88
+ );
89
+ }
90
+
91
+ return errors;
92
+ }
93
+
94
+ export function validateToolcraftArtifactExportIntentCorrespondence({
95
+ hasImageExportAction,
96
+ hasImageExportSection,
97
+ hasVideoExportAction,
98
+ hasVideoExportSection,
99
+ intent,
100
+ }: ToolcraftArtifactExportSchemaFacts &
101
+ Readonly<{
102
+ intent: ToolcraftArtifactExportIntent;
103
+ }>): ToolcraftArtifactExportIntentValidation {
104
+ const delivery = resolveToolcraftArtifactExportIntent(intent);
105
+ const errors = [
106
+ ...getToolcraftArtifactExportIntentEvidenceErrors(intent),
107
+ ...getToolcraftArtifactCorrespondenceErrors({
108
+ actionRole: "export-image",
109
+ artifact: "Image",
110
+ enabled: delivery.imageEnabled,
111
+ hasAction: hasImageExportAction,
112
+ hasSection: hasImageExportSection,
113
+ intentMode: intent.image.mode,
114
+ sectionArticle: "an",
115
+ sectionTitle: "Image Export",
116
+ }),
117
+ ...getToolcraftArtifactCorrespondenceErrors({
118
+ actionRole: "export-video",
119
+ artifact: "Video",
120
+ enabled: delivery.videoEnabled,
121
+ hasAction: hasVideoExportAction,
122
+ hasSection: hasVideoExportSection,
123
+ intentMode: intent.video.mode,
124
+ sectionArticle: "a",
125
+ sectionTitle: "Video Export",
126
+ }),
127
+ ];
128
+
129
+ return { delivery, errors };
130
+ }
@@ -26,7 +26,7 @@ export function getConditionValidationErrors({
26
26
  label,
27
27
  }: {
28
28
  condition: ToolcraftControlConditionSchema;
29
- conditionName: "disabledWhen" | "visibleWhen";
29
+ conditionName: "disabledWhen";
30
30
  controlTargets: ReadonlySet<string>;
31
31
  label: string;
32
32
  }): string[] {
@@ -1,6 +1,6 @@
1
1
  import type {
2
2
  ResolvedToolcraftAppSchema,
3
- ToolcraftControlSchema,
3
+ ResolvedToolcraftControlSchema,
4
4
  ToolcraftTimelineMode,
5
5
  } from "@repo/toolcraft-runtime";
6
6
 
@@ -21,7 +21,7 @@ export type ToolcraftControlAcceptanceContext = {
21
21
  };
22
22
 
23
23
  export type ToolcraftControlRuleContext = {
24
- control: ToolcraftControlSchema;
24
+ control: ResolvedToolcraftControlSchema;
25
25
  controlId: string;
26
26
  controlTargets: ReadonlySet<string>;
27
27
  label: string;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getToolcraftControlKeyframeCapability,
3
3
  type ResolvedToolcraftAppSchema,
4
- type ToolcraftControlSchema,
4
+ type ResolvedToolcraftControlSchema,
5
5
  type ToolcraftTimelineMode,
6
6
  } from "@repo/toolcraft-runtime";
7
7
 
@@ -21,7 +21,6 @@ import {
21
21
  import type {
22
22
  ToolcraftBackgroundOutputCoverage,
23
23
  ToolcraftComponentAcceptance,
24
- ToolcraftConditionalVisibilityCoverage,
25
24
  ToolcraftOrientationGizmoCoverage,
26
25
  ToolcraftProductReadiness,
27
26
  } from "./types";
@@ -53,7 +52,7 @@ function getControlAcceptanceEntryErrors({
53
52
  entry,
54
53
  label,
55
54
  }: {
56
- control: ToolcraftControlSchema;
55
+ control: ResolvedToolcraftControlSchema;
57
56
  entry: ToolcraftComponentAcceptance;
58
57
  label: string;
59
58
  }): string[] {
@@ -98,7 +97,7 @@ function getControlLifecycleAndCustomErrors({
98
97
  schema,
99
98
  }: {
100
99
  acceptance: readonly ToolcraftComponentAcceptance[];
101
- control: ToolcraftControlSchema;
100
+ control: ResolvedToolcraftControlSchema;
102
101
  entry: ToolcraftComponentAcceptance;
103
102
  label: string;
104
103
  layersEnabled: boolean;
@@ -155,7 +154,7 @@ function getControlEvidenceErrors({
155
154
  schema,
156
155
  sectionTitle,
157
156
  }: {
158
- control: ToolcraftControlSchema;
157
+ control: ResolvedToolcraftControlSchema;
159
158
  controlId: string;
160
159
  entry: ToolcraftComponentAcceptance;
161
160
  label: string;
@@ -177,19 +176,6 @@ function getControlEvidenceErrors({
177
176
  );
178
177
  }
179
178
 
180
- if (
181
- control.visibleWhen &&
182
- !hasTypedCoverage<ToolcraftConditionalVisibilityCoverage>(
183
- entry.visibilityCoverage,
184
- "all-conditional-visibility",
185
- ["hidden", "visible"],
186
- )
187
- ) {
188
- errors.push(
189
- `${label} uses visibleWhen and must declare visibilityCoverage for both "hidden" and "visible" states reached through ${control.visibleWhen.target}.`,
190
- );
191
- }
192
-
193
179
  if (
194
180
  schemaHasPngExportPanelAction(schema) &&
195
181
  isOutputBackgroundToggleControl({ control, controlId, sectionTitle })
@@ -228,7 +214,7 @@ function getControlPartAndRuntimeCoverageErrors({
228
214
  layersEnabled,
229
215
  timelineMode,
230
216
  }: {
231
- control: ToolcraftControlSchema;
217
+ control: ResolvedToolcraftControlSchema;
232
218
  entry: ToolcraftComponentAcceptance;
233
219
  label: string;
234
220
  layersEnabled: boolean;
@@ -281,7 +267,7 @@ export function getControlAcceptanceCoverageErrors({
281
267
  timelineMode,
282
268
  }: {
283
269
  acceptance: readonly ToolcraftComponentAcceptance[];
284
- control: ToolcraftControlSchema;
270
+ control: ResolvedToolcraftControlSchema;
285
271
  controlId: string;
286
272
  entry: ToolcraftComponentAcceptance;
287
273
  label: string;
@@ -1,5 +1,8 @@
1
1
  import { getToolcraftSegmentedStaticFitError } from "@repo/toolcraft-runtime";
2
- import type { ToolcraftControlSchema } from "@repo/toolcraft-runtime";
2
+ import type {
3
+ ToolcraftCollectionItemControlSchema,
4
+ ToolcraftControlSchema,
5
+ } from "@repo/toolcraft-runtime";
3
6
 
4
7
  import { getActionValue, isResetPanelAction } from "./actions";
5
8
  import {
@@ -103,13 +106,29 @@ function getOptionControlAcceptanceErrors({
103
106
  }
104
107
  }
105
108
 
106
- if (control.type === "collectionActions" && control.itemControl) {
107
- const segmentedLayoutError = getToolcraftSegmentedStaticFitError(
108
- control.itemControl,
109
+ const nestedItemControls: Array<
110
+ [string, ToolcraftCollectionItemControlSchema]
111
+ > = [];
112
+
113
+ if (control.itemControl) {
114
+ nestedItemControls.push(["itemControl", control.itemControl]);
115
+ }
116
+
117
+ if (control.itemControls) {
118
+ nestedItemControls.push(
119
+ ...Object.entries(control.itemControls).map(
120
+ ([itemId, itemControl]): [string, ToolcraftCollectionItemControlSchema] =>
121
+ [`itemControls.${itemId}`, itemControl],
122
+ ),
109
123
  );
124
+ }
125
+
126
+ for (const [itemId, itemControl] of nestedItemControls) {
127
+ const segmentedLayoutError =
128
+ getToolcraftSegmentedStaticFitError(itemControl);
110
129
 
111
130
  if (segmentedLayoutError) {
112
- errors.push(`${label} itemControl ${segmentedLayoutError}`);
131
+ errors.push(`${label} ${itemId} ${segmentedLayoutError}`);
113
132
  }
114
133
  }
115
134
 
@@ -140,17 +140,6 @@ function getControlStatePolicyErrors({
140
140
  >): string[] {
141
141
  const errors: string[] = [];
142
142
 
143
- if (control.visibleWhen) {
144
- errors.push(
145
- ...getConditionValidationErrors({
146
- condition: control.visibleWhen,
147
- conditionName: "visibleWhen",
148
- controlTargets,
149
- label,
150
- }),
151
- );
152
- }
153
-
154
143
  if (control.disabledWhen) {
155
144
  errors.push(
156
145
  ...getConditionValidationErrors({
@@ -164,13 +153,13 @@ function getControlStatePolicyErrors({
164
153
 
165
154
  if (control.disabled === true) {
166
155
  errors.push(
167
- `${label} sets disabled: true. Generated product panels should show only controls usable in the current state; hide unavailable product controls with visibleWhen instead of rendering disabled controls.`,
156
+ `${label} sets disabled: true. Generated product panels should show only controls usable in the current state; declare conditional applicability instead of rendering disabled controls.`,
168
157
  );
169
158
  }
170
159
 
171
160
  if (control.disabledWhen) {
172
161
  errors.push(
173
- `${label} uses disabledWhen. Generated product panels should show only controls usable in the current state; hide unavailable product controls with visibleWhen instead of rendering disabled controls.`,
162
+ `${label} uses disabledWhen. Generated product panels should show only controls usable in the current state; declare conditional applicability instead of rendering disabled controls.`,
174
163
  );
175
164
  }
176
165