@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
@@ -5,11 +5,54 @@ import path from "node:path";
5
5
  import test from "node:test";
6
6
 
7
7
  import {
8
+ assertGeneratedExportIntentDocsDoNotInferVideo,
8
9
  collectGeneratedAgentFacingDocs,
9
10
  getMissingGeneratedPerformanceLifecycleMarkers,
10
11
  getStaleAgentPerformanceWorkflowFailures,
11
12
  } from "./generate-test-doc-assertions.mjs";
12
13
 
14
+ test("rejects animation-derived video rules without rejecting explicit authority", () => {
15
+ for (const source of [
16
+ [
17
+ "Products whose requested delivery includes",
18
+ "animation also expose",
19
+ "`Export Video`.",
20
+ ].join(" "),
21
+ ["Animated apps automatically show", "Export Video."].join(" "),
22
+ ["Animation also", "requires", "Export Video."].join(" "),
23
+ "Timeline playback enables Export Video.",
24
+ "Animated apps automatically expose video export.",
25
+ "Timeline playback enables video export.",
26
+ "Animation implies video delivery.",
27
+ ]) {
28
+ assert.throws(
29
+ () =>
30
+ assertGeneratedExportIntentDocsDoNotInferVideo([
31
+ { docPath: "docs/toolcraft/stale.md", source },
32
+ ]),
33
+ /docs\/toolcraft\/stale\.md contains animation-derived video export guidance/,
34
+ );
35
+ }
36
+
37
+ assert.doesNotThrow(() =>
38
+ assertGeneratedExportIntentDocsDoNotInferVideo([
39
+ {
40
+ docPath: "docs/toolcraft/allowed.md",
41
+ source: [
42
+ "Do not infer video from animation, playback, keyframes, or timeline.",
43
+ "Animation, playback, keyframes, and timeline presence never add Export Video.",
44
+ "Animated apps do not automatically expose video export.",
45
+ "Timeline playback never enables video export.",
46
+ "Animation does not imply video delivery.",
47
+ "An animated app includes Export Video because the user explicitly requested video delivery.",
48
+ "An animated app exposes video export because the user explicitly requested video delivery.",
49
+ "Any app with Export Video must enable the top Toolcraft timeline.",
50
+ ].join("\n"),
51
+ },
52
+ ]),
53
+ );
54
+ });
55
+
13
56
  test("scans every generated agent-facing Markdown source independently", async (t) => {
14
57
  const targetDir = await fs.mkdtemp(path.join(os.tmpdir(), "toolcraft-doc-scan-"));
15
58
  t.after(() => fs.rm(targetDir, { force: true, recursive: true }));
@@ -47,7 +90,7 @@ test("requires adaptive routing in every generated performance lifecycle documen
47
90
  const routingMarker =
48
91
  "<!-- toolcraft-performance-routing: localized=agent-targeted; ambiguous=one-user-facing-choice; broad=offer-targeted-or-full; full=explicit-only -->";
49
92
  const existingMarkers = [
50
- "<!-- toolcraft-performance-lifecycle: first-delivery=functional; later-delivery=functional-targeted; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only -->",
93
+ "<!-- toolcraft-performance-lifecycle: first-delivery=functional-complete; later-edits=focused-only; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only -->",
51
94
  "<!-- toolcraft-performance-iteration: authority=exact-request-evidence+canonical-path-ids; fixture=reachable-development; after-pass=return-app-to-user+stop -->",
52
95
  "<!-- toolcraft-performance-full-authority: automatic=forbidden; recommendation=two-compatible-iterations-or-broad-unlocalizable-problem; command=pnpm verify:perf; authority=explicit-user-request-or-accepted-offer -->",
53
96
  ].join("\n");
@@ -0,0 +1,92 @@
1
+ import assert from "node:assert/strict";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+
5
+ const staleAgentPerformanceWorkflowPattern =
6
+ /app-performance-impact|explicit-performance-work|test:browser:perf|verify:(?:final|quick|ui)|verify:perf:(?:playwright|record-iteration|refresh)|--reason=performance-iteration|--performance-test/iu;
7
+
8
+ const exportIntentSentencePatternSource = String.raw`[^\n.!?]`;
9
+ const videoArtifactTargetPatternSource = String.raw`(?:Export Video|video\s+(?:export|delivery))`;
10
+ const explicitVideoAuthorityPatternSource = String.raw`(?:explicit(?:ly)?\s+(?:(?:user[- ]?)?request(?:ed|s)?\s+)?${videoArtifactTargetPatternSource}|user\s+explicitly\s+request(?:ed|s)?\s+${videoArtifactTargetPatternSource}|user[- ]request(?:ed|s)?\s+${videoArtifactTargetPatternSource})`;
11
+ const animationInferenceVerbPatternSource = String.raw`(?:exposes?|includes?|shows?|adds?|enables?|implies?|has|needs?|requires?|produces?|proves?)`;
12
+ const staleAnimationInferencePatternSource = [
13
+ String.raw`products?\s+whose\s+requested\s+delivery\s+includes\s+animation`,
14
+ String.raw`animated\s+apps?\b(?!${exportIntentSentencePatternSource}{0,100}\b(?:do(?:es)?\s+not|never)\b)${exportIntentSentencePatternSource}{0,100}\b${animationInferenceVerbPatternSource}\b${exportIntentSentencePatternSource}{0,60}\b${videoArtifactTargetPatternSource}\b`,
15
+ String.raw`(?:animation|playback|keyframes?|timeline(?:\s+playback)?)\b\s+(?:also\s+)?${animationInferenceVerbPatternSource}\b${exportIntentSentencePatternSource}{0,60}\b${videoArtifactTargetPatternSource}\b`,
16
+ ].join("|");
17
+
18
+ export const staleAnimationDerivedVideoPattern = new RegExp(
19
+ String.raw`(?:^|[\n.!?]\s*)(?!${exportIntentSentencePatternSource}{0,240}\b${explicitVideoAuthorityPatternSource}\b)${exportIntentSentencePatternSource}{0,240}(?:${staleAnimationInferencePatternSource})`,
20
+ "iu",
21
+ );
22
+
23
+ const generatedPerformanceLifecycleMarkers = [
24
+ "<!-- toolcraft-performance-lifecycle: first-delivery=functional-complete; later-edits=focused-only; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only -->",
25
+ "<!-- toolcraft-performance-iteration: authority=exact-request-evidence+canonical-path-ids; fixture=reachable-development; after-pass=return-app-to-user+stop -->",
26
+ "<!-- toolcraft-performance-full-authority: automatic=forbidden; recommendation=two-compatible-iterations-or-broad-unlocalizable-problem; command=pnpm verify:perf; authority=explicit-user-request-or-accepted-offer -->",
27
+ "<!-- toolcraft-performance-routing: localized=agent-targeted; ambiguous=one-user-facing-choice; broad=offer-targeted-or-full; full=explicit-only -->",
28
+ ];
29
+
30
+ export function getMissingGeneratedPerformanceLifecycleMarkers(sources) {
31
+ return sources.flatMap(({ docPath, source }) =>
32
+ generatedPerformanceLifecycleMarkers.flatMap((marker) =>
33
+ source.includes(marker)
34
+ ? []
35
+ : [`docs/toolcraft/${docPath} must include canonical marker: ${marker}`],
36
+ ),
37
+ );
38
+ }
39
+
40
+ async function collectMarkdownPaths(rootDir, relativeDir = "") {
41
+ const currentDir = path.join(rootDir, relativeDir);
42
+ const entries = await fs.readdir(currentDir, { withFileTypes: true });
43
+ const markdownPaths = [];
44
+
45
+ for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
46
+ const relativePath = path.join(relativeDir, entry.name);
47
+ if (entry.isDirectory()) {
48
+ markdownPaths.push(...(await collectMarkdownPaths(rootDir, relativePath)));
49
+ } else if (entry.isFile() && entry.name.endsWith(".md")) {
50
+ markdownPaths.push(relativePath);
51
+ }
52
+ }
53
+
54
+ return markdownPaths;
55
+ }
56
+
57
+ export async function collectGeneratedAgentFacingDocs(targetDir) {
58
+ const docsRoot = path.join(targetDir, "docs/toolcraft");
59
+ const docPaths = await collectMarkdownPaths(docsRoot);
60
+ const docs = await Promise.all(
61
+ docPaths.map(async (docPath) => ({
62
+ docPath: path.posix.join("docs/toolcraft", docPath.split(path.sep).join("/")),
63
+ source: await fs.readFile(path.join(docsRoot, docPath), "utf8"),
64
+ })),
65
+ );
66
+
67
+ return [
68
+ {
69
+ docPath: "AGENTS.md",
70
+ source: await fs.readFile(path.join(targetDir, "AGENTS.md"), "utf8"),
71
+ },
72
+ ...docs,
73
+ ];
74
+ }
75
+
76
+ export function getStaleAgentPerformanceWorkflowFailures(sources) {
77
+ return sources.flatMap(({ docPath, source }) =>
78
+ staleAgentPerformanceWorkflowPattern.test(source)
79
+ ? [`${docPath} contains removed performance workflow guidance`]
80
+ : [],
81
+ );
82
+ }
83
+
84
+ export function assertGeneratedExportIntentDocsDoNotInferVideo(sources) {
85
+ for (const { docPath, source } of sources) {
86
+ assert.doesNotMatch(
87
+ source,
88
+ staleAnimationDerivedVideoPattern,
89
+ `${docPath} contains animation-derived video export guidance`,
90
+ );
91
+ }
92
+ }
@@ -0,0 +1,53 @@
1
+ import assert from "node:assert/strict";
2
+
3
+ export function assertGeneratedExportDocs({
4
+ agentsSource,
5
+ coreRuntimeBoundarySource,
6
+ coreSetupExportSource,
7
+ }) {
8
+ assert.match(agentsSource, /svgExportRenderer/);
9
+ assert.match(coreRuntimeBoundarySource, /svgExportRenderer/);
10
+ assert.match(
11
+ coreRuntimeBoundarySource,
12
+ /runtime owns typed image\/SVG\/video actions end to end/i,
13
+ );
14
+ assert.match(coreSetupExportSource, /productReadiness\.exportIntent/);
15
+ assert.match(
16
+ coreSetupExportSource,
17
+ /image[^\n]*`toolcraft-default`[^\n]*`user-requested`[^\n]*`user-removed`/i,
18
+ );
19
+ assert.match(coreSetupExportSource, /video[^\n]*`not-requested`[^\n]*`user-requested`/i);
20
+ assert.match(coreSetupExportSource, /SVG[^\n]*`not-requested`[^\n]*`user-requested`/i);
21
+ assert.match(
22
+ coreSetupExportSource,
23
+ /image[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
24
+ );
25
+ assert.match(
26
+ coreSetupExportSource,
27
+ /image[^\n]*`user-removed`[^\n]*non-empty[^\n]*evidence/i,
28
+ );
29
+ assert.match(
30
+ coreSetupExportSource,
31
+ /video[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
32
+ );
33
+
34
+ for (const decisionStep of [
35
+ "Start every product with image export.",
36
+ "Add SVG export only when the user explicitly requests SVG delivery.",
37
+ "Add video export only when the user explicitly requests video delivery.",
38
+ "Do not infer SVG from an SVG preview renderer, or video from animation, playback, keyframes, or timeline.",
39
+ "Keep image with requested SVG/video unless the user explicitly requests image removal.",
40
+ "Record all three decisions in `productReadiness.exportIntent`.",
41
+ ]) {
42
+ assert.equal(
43
+ coreSetupExportSource.split(decisionStep).length - 1,
44
+ 1,
45
+ `Canonical export-intent step must appear exactly once: ${decisionStep}`,
46
+ );
47
+ }
48
+
49
+ assert.match(
50
+ coreSetupExportSource,
51
+ /Clipboard copy may be an additional product action, but it never changes or substitutes for the recorded artifact intent/,
52
+ );
53
+ }
@@ -6,9 +6,10 @@ import {
6
6
  assertGeneratedDeliveryArchitecture,
7
7
  deliveryArchitecturePaths,
8
8
  } from "./generate-test-delivery-architecture-assertions.mjs";
9
+ import { collectFrameworkOwnedGeneratedFiles } from "./generated-integrity-manifest.mjs";
9
10
  import { listRelativeFiles, repoRoot } from "./generate-test-fs-utils.mjs";
10
11
  import { assertGeneratedPerformanceCanvasBoundary } from "./generate-test-performance-boundary-assertions.mjs";
11
- import { isGeneratedTestSupportPath } from "./generated-source-policy.mjs";
12
+ import { assertGeneratedRuntimePublicBoundary } from "./generate-test-runtime-boundary-assertions.mjs";
12
13
 
13
14
  export {
14
15
  assertGeneratedRoutesAndStyles,
@@ -44,16 +45,7 @@ export async function assertGeneratedFiles(targetDir) {
44
45
  "scripts/toolcraft-targeted-verification-selection.mjs",
45
46
  ];
46
47
 
47
- assert.ok(await fs.stat(path.join(targetDir, "src/toolcraft/ui/index.ts")));
48
- assert.ok(await fs.stat(path.join(targetDir, "src/toolcraft/runtime/react/index.ts")));
49
- assert.ok(
50
- await fs.stat(
51
- path.join(
52
- targetDir,
53
- "src/toolcraft/runtime/model-import/worker/model-import.worker.bundle.js",
54
- ),
55
- ),
56
- );
48
+ await assertGeneratedRuntimePublicBoundary(targetDir);
57
49
  assert.ok(await fs.stat(path.join(targetDir, "playwright.config.ts")));
58
50
  await assert.rejects(
59
51
  fs.stat(path.join(targetDir, ".toolcraft")),
@@ -61,70 +53,6 @@ export async function assertGeneratedFiles(targetDir) {
61
53
  "Fresh generated apps must not inherit starter server ports or verification receipts.",
62
54
  );
63
55
 
64
- const generatedToolcraftFiles = await listRelativeFiles(
65
- path.join(targetDir, "src/toolcraft"),
66
- );
67
- const expectedRuntimeFiles = (await listRelativeFiles(
68
- path.join(repoRoot, "packages/toolcraft-runtime/src"),
69
- ))
70
- .filter((relativePath) => !isGeneratedTestSupportPath(relativePath))
71
- .map((relativePath) => `runtime/${relativePath}`);
72
- assert.deepEqual(
73
- generatedToolcraftFiles.filter((relativePath) => relativePath.startsWith("runtime/")),
74
- expectedRuntimeFiles,
75
- "Generated standalone runtime must contain every production runtime module.",
76
- );
77
- for (const relativePath of [
78
- "runtime/export/artifact-export-settings.ts",
79
- "runtime/export/artifact-export-request.ts",
80
- "runtime/export/artifact-frame-renderer.ts",
81
- "runtime/export/artifact-frame-state.ts",
82
- "runtime/export/artifact-scene-frame.ts",
83
- "runtime/export/image-artifact-export.ts",
84
- "runtime/export/product-export-renderer.ts",
85
- "runtime/export/video-artifact-export.ts",
86
- "runtime/export/video-encoding-backend.ts",
87
- "runtime/export/video-frame-schedule.ts",
88
- ]) {
89
- assert.ok(
90
- generatedToolcraftFiles.includes(relativePath),
91
- `Generated runtime must contain ${relativePath}.`,
92
- );
93
- }
94
- assert.equal(
95
- generatedToolcraftFiles.includes("runtime/export/export.ts"),
96
- false,
97
- "Generated runtime must not copy the removed legacy export helper.",
98
- );
99
- for (const relativePath of [
100
- "e2e/browser-media-export-evidence.ts",
101
- "e2e/decoded-pixel-observation.ts",
102
- "e2e/image-artifact-inspection.ts",
103
- "e2e/video-artifact-inspection.ts",
104
- ]) {
105
- assert.ok(
106
- await fs.stat(path.join(targetDir, relativePath)),
107
- `Generated output must contain ${relativePath}.`,
108
- );
109
- }
110
- for (const relativePath of generatedToolcraftFiles) {
111
- assert.equal(
112
- isGeneratedTestSupportPath(relativePath),
113
- false,
114
- `Generated runtime contains test support: ${relativePath}`,
115
- );
116
- }
117
-
118
- const removedRuntimeTestHelpers = [
119
- "runtime/react/canvas/canvas-shell-test-utils.tsx",
120
- "runtime/react/controls-panel/testing/controls-panel-test-utils.tsx",
121
- "runtime/react/layers/layers-panel-test-utils.tsx",
122
- "runtime/react/timeline/timeline-panel-test-utils.tsx",
123
- ];
124
- for (const relativePath of removedRuntimeTestHelpers) {
125
- assert.equal(generatedToolcraftFiles.includes(relativePath), false);
126
- }
127
-
128
56
  const playwrightConfigSource = await fs.readFile(
129
57
  path.join(targetDir, "playwright.config.ts"),
130
58
  "utf8",
@@ -144,15 +72,60 @@ export async function assertGeneratedFiles(targetDir) {
144
72
  assert.ok(await fs.stat(path.join(targetDir, "src/app/app-acceptance-data.ts")));
145
73
  assert.ok(await fs.stat(path.join(targetDir, "src/app/app-composition.tsx")));
146
74
  assert.ok(await fs.stat(path.join(targetDir, "src/app/app-acceptance.base-coverage.test.ts")));
75
+ assert.ok(
76
+ await fs.stat(
77
+ path.join(
78
+ targetDir,
79
+ "src/app/acceptance/control-section-entity-cohesion.ts",
80
+ ),
81
+ ),
82
+ );
83
+ const generatedApplicabilityValidatorSource = await fs.readFile(
84
+ path.join(targetDir, "src/app/acceptance/control-applicability.ts"),
85
+ "utf8",
86
+ );
87
+ assert.match(
88
+ generatedApplicabilityValidatorSource,
89
+ /getToolcraftControlApplicabilityErrors/,
90
+ );
91
+ for (const relativePath of [
92
+ "src/app/acceptance/selection-scope.ts",
93
+ "e2e/app-browser-selection-scope-evidence.spec.ts",
94
+ "e2e/browser-product-raster-snapshot.ts",
95
+ "e2e/browser-proof-session.ts",
96
+ "e2e/browser-proof-surface-action.ts",
97
+ "e2e/browser-proof-types.ts",
98
+ "e2e/browser-selection-scope-evidence.ts",
99
+ ]) {
100
+ assert.ok(
101
+ await fs.stat(path.join(targetDir, relativePath)),
102
+ `Generated output must contain ${relativePath}.`,
103
+ );
104
+ }
105
+ const generatedSelectionValidatorSource = await fs.readFile(
106
+ path.join(targetDir, "src/app/acceptance/selection-scope.ts"),
107
+ "utf8",
108
+ );
109
+ assert.match(generatedSelectionValidatorSource, /two-entity-isolation/);
110
+ const generatedRuntimeEvidenceSource = await fs.readFile(
111
+ path.join(targetDir, "e2e/browser-runtime-evidence-requirements.ts"),
112
+ "utf8",
113
+ );
114
+ assert.match(generatedRuntimeEvidenceSource, /selection-scoped-control/);
147
115
  const appAcceptanceSource = await fs.readFile(
148
116
  path.join(targetDir, "src/app/app-acceptance.ts"),
149
117
  "utf8",
150
118
  );
151
119
  assert.match(appAcceptanceSource, /from "\.\/app-acceptance-data"/);
152
- assert.ok(await fs.stat(path.join(targetDir, "src/app/app-performance.ts")));
153
- assert.ok(
154
- await fs.stat(path.join(targetDir, "src/app/app-verification-impact.json")),
120
+ const generatedValidationPipeline = await fs.readFile(
121
+ path.join(targetDir, "src/app/acceptance/validate-coverage.ts"),
122
+ "utf8",
123
+ );
124
+ assert.match(
125
+ generatedValidationPipeline,
126
+ /validate:\s*\(\{ sectionInventory \}\)\s*=>\s*getToolcraftControlSectionEntityCohesionErrors\(sectionInventory\)/,
155
127
  );
128
+ assert.ok(await fs.stat(path.join(targetDir, "src/app/app-performance.ts")));
156
129
  assert.ok(await fs.stat(path.join(targetDir, "src/app/app-performance.gates.test.ts")));
157
130
  assert.equal(
158
131
  generatedAppSourceFiles.some((file) => path.basename(file).startsWith("starter-")),
@@ -166,6 +139,10 @@ export async function assertGeneratedFiles(targetDir) {
166
139
  );
167
140
  assert.ok(await fs.stat(path.join(targetDir, "e2e/performance-helpers.ts")));
168
141
  for (const relativePath of [
142
+ "e2e/toolcraft-feature-verification-reporter.ts",
143
+ "scripts/run-feature-verification.mjs",
144
+ "scripts/toolcraft-feature-verification-plan.mjs",
145
+ "src/app/acceptance/feature-verification-selection.ts",
169
146
  "e2e/browser-execution-ledger.ts",
170
147
  "e2e/browser-performance-measurement-evidence.ts",
171
148
  "e2e/browser-performance-measurement-report.ts",
@@ -178,7 +155,6 @@ export async function assertGeneratedFiles(targetDir) {
178
155
  "e2e/toolcraft-delivery-catalog-reporter.ts",
179
156
  "scripts/toolcraft-performance-report.mjs",
180
157
  "scripts/toolcraft-kernel-benchmark-receipt.mjs",
181
- "scripts/toolcraft-verification-impact.mjs",
182
158
  "scripts/toolcraft-targeted-performance-report.mjs",
183
159
  "scripts/run-kernel-benchmarks.mjs",
184
160
  "src/app/test-evidence/browser-performance-measurement-contract.ts",
@@ -274,11 +250,19 @@ export async function assertGeneratedFiles(targetDir) {
274
250
  assert.ok(await fs.stat(manifestPath));
275
251
 
276
252
  const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
253
+ const expectedFrameworkInventory = await collectFrameworkOwnedGeneratedFiles(
254
+ path.join(repoRoot, "starter"),
255
+ );
277
256
  const generatedPackageJson = JSON.parse(
278
257
  await fs.readFile(path.join(targetDir, "package.json"), "utf8"),
279
258
  );
280
259
  assert.equal(manifest.version, 3);
281
260
  assert.match(manifest.signature, /^[A-Za-z0-9+/]+={0,2}$/);
261
+ assert.deepEqual(
262
+ Object.keys(manifest.protectedFiles).sort(),
263
+ expectedFrameworkInventory,
264
+ "Generated protected files must equal the canonical starter framework inventory.",
265
+ );
282
266
  assert.deepEqual(
283
267
  manifest.packageScripts,
284
268
  Object.fromEntries(Object.entries(generatedPackageJson.scripts).sort()),
@@ -291,10 +275,18 @@ export async function assertGeneratedFiles(targetDir) {
291
275
  manifest.packageScripts["verify:delivery"],
292
276
  "node scripts/run-delivery-verification.mjs",
293
277
  );
278
+ assert.equal(
279
+ manifest.packageScripts["test:feature"],
280
+ "node scripts/run-feature-verification.mjs",
281
+ );
294
282
  assert.equal(
295
283
  manifest.packageScripts["verify:perf"],
296
284
  "node scripts/run-browser-performance.mjs",
297
285
  );
286
+ assert.equal(
287
+ manifest.packageScripts["reference:study"],
288
+ "node scripts/create-toolcraft-motion-reference-study.mjs",
289
+ );
298
290
  assert.notEqual(
299
291
  manifest.packageScripts["verify:delivery"],
300
292
  manifest.packageScripts["verify:perf"],
@@ -359,6 +351,12 @@ export async function assertGeneratedFiles(targetDir) {
359
351
  assert.ok(
360
352
  manifest.protectedFiles["e2e/toolcraft-delivery-catalog-reporter.ts"],
361
353
  );
354
+ assertSignedProtectedFiles(manifest, [
355
+ "e2e/toolcraft-feature-verification-reporter.ts",
356
+ "scripts/run-feature-verification.mjs",
357
+ "scripts/toolcraft-feature-verification-plan.mjs",
358
+ "src/app/acceptance/feature-verification-selection.ts",
359
+ ], "focused feature verification infrastructure");
362
360
  assert.ok(manifest.protectedFiles["e2e/browser-runtime-evidence.ts"]);
363
361
  assert.ok(manifest.protectedFiles["e2e/app-performance.spec.ts"]);
364
362
  assertSignedProtectedFiles(manifest, [
@@ -449,8 +447,4 @@ export async function assertGeneratedFiles(targetDir) {
449
447
  manifest.protectedFiles["e2e/app-kernel-benchmarks.ts"],
450
448
  undefined,
451
449
  );
452
- assert.equal(
453
- manifest.protectedFiles["src/app/app-verification-impact.json"],
454
- undefined,
455
- );
456
450
  }
@@ -51,10 +51,13 @@ export async function assertGeneratedAppPerformance(targetDir) {
51
51
  );
52
52
  assert.match(
53
53
  verificationPolicySource,
54
- /modes:\s*\[\s*"functional",\s*"performance-iteration"\s*\]/,
54
+ /modes:\s*\[\s*"initial-functional",\s*"performance-iteration"\s*\]/,
55
55
  );
56
56
  assert.match(verificationPolicySource, /command:\s*"verify:delivery"/);
57
- assert.match(verificationPolicySource, /selectors:\s*"automatic"/);
57
+ assert.match(
58
+ verificationPolicySource,
59
+ /selectors:\s*"initial-complete-or-authority-exact"/,
60
+ );
58
61
  assert.match(verificationPolicySource, /fullPerformance:\s*\{/);
59
62
  assert.match(
60
63
  verificationPolicySource,
@@ -59,9 +59,17 @@ export async function assertGeneratedManifestIntegrity(context) {
59
59
  "e2e/app-browser-render-scale-evidence.spec.ts",
60
60
  "e2e/app-browser-render-scale-requirements.spec.ts",
61
61
  "e2e/browser-execution-ledger.ts",
62
+ "e2e/app-browser-selection-scope-evidence.spec.ts",
63
+ "e2e/browser-proof-session.ts",
64
+ "e2e/browser-proof-surface-action.ts",
65
+ "e2e/browser-proof-types.ts",
62
66
  "e2e/browser-render-scale-evidence.ts",
67
+ "e2e/browser-product-raster-snapshot.ts",
68
+ "e2e/browser-selection-scope-evidence.ts",
63
69
  "e2e/toolcraft-delivery-catalog-reporter.ts",
70
+ "e2e/toolcraft-feature-verification-reporter.ts",
64
71
  "src/app/acceptance/types.ts",
72
+ "src/app/acceptance/selection-scope.ts",
65
73
  "src/app/app-acceptance.render-scale.test.ts",
66
74
  "scripts/toolcraft-delivery-anchor.mjs",
67
75
  "scripts/toolcraft-delivery-executor.mjs",
@@ -74,11 +82,9 @@ export async function assertGeneratedManifestIntegrity(context) {
74
82
  "scripts/toolcraft-functional-proof-primitives.d.mts",
75
83
  "scripts/toolcraft-functional-proof-primitives.mjs",
76
84
  "scripts/toolcraft-proof-process.mjs",
77
- "scripts/toolcraft-verification-impact-inventory.d.mts",
78
- "scripts/toolcraft-verification-impact-inventory.mjs",
79
- "scripts/toolcraft-verification-impact.mjs",
80
- "scripts/toolcraft-verification-input-roles.d.mts",
81
- "scripts/toolcraft-verification-input-roles.mjs",
85
+ "scripts/run-feature-verification.mjs",
86
+ "scripts/toolcraft-feature-verification-plan.mjs",
87
+ "src/app/acceptance/feature-verification-selection.ts",
82
88
  ]) {
83
89
  assert.ok(
84
90
  manifest.protectedFiles[relativePath],
@@ -94,6 +100,11 @@ export async function assertGeneratedManifestIntegrity(context) {
94
100
  manifest.packageScripts.test,
95
101
  "Generated integrity manifest must protect the generated test command.",
96
102
  );
103
+ assert.equal(
104
+ manifest.packageScripts["test:feature"],
105
+ "node scripts/run-feature-verification.mjs",
106
+ "Generated integrity manifest must protect the focused product feature command.",
107
+ );
97
108
  assert.equal(
98
109
  manifest.packageScripts["verify:delivery"],
99
110
  "node scripts/run-delivery-verification.mjs",
@@ -33,6 +33,42 @@ export async function assertGeneratedOwnershipBoundaries(context) {
33
33
  await assertIntegrityFailure(/modified package script test/);
34
34
  },
35
35
  );
36
+
37
+ for (const relativePath of [
38
+ "scripts/create-toolcraft-motion-reference-study.mjs",
39
+ "src/app/acceptance/motion-reference-evidence.mjs",
40
+ "scripts/toolcraft-motion-reference-group-inventory.mjs",
41
+ "scripts/toolcraft-motion-reference-publication-journal.mjs",
42
+ ]) {
43
+ const filePath = path.join(targetDir, relativePath);
44
+ const source = await fs.readFile(filePath, "utf8");
45
+ await withTemporaryFileSource(
46
+ filePath,
47
+ `${source}\n// integrity mutation proof\n`,
48
+ async () => {
49
+ await assertIntegrityFailure(
50
+ new RegExp(`modified ${relativePath.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")}`),
51
+ );
52
+ },
53
+ );
54
+ }
55
+ await withTemporaryFileSource(
56
+ packageJsonPath,
57
+ `${JSON.stringify(
58
+ {
59
+ ...packageJson,
60
+ scripts: {
61
+ ...packageJson.scripts,
62
+ "reference:study": "echo skipped",
63
+ },
64
+ },
65
+ null,
66
+ 2,
67
+ )}\n`,
68
+ async () => {
69
+ await assertIntegrityFailure(/modified package script reference:study/);
70
+ },
71
+ );
36
72
  await withTemporaryFileSource(
37
73
  packageJsonPath,
38
74
  `${JSON.stringify(
@@ -108,10 +144,6 @@ export async function assertGeneratedOwnershipBoundaries(context) {
108
144
  relativePath: "src/app/app-performance.ts",
109
145
  suffix: "\n// product performance evidence stays editable\n",
110
146
  },
111
- {
112
- relativePath: "src/app/app-verification-impact.json",
113
- transform: (source) => source.replace(/\n\}$/u, ',\n "note": "product ownership stays editable"\n}\n'),
114
- },
115
147
  {
116
148
  relativePath: "e2e/app-controls.spec.ts",
117
149
  suffix: "\n// product browser scenarios stay editable\n",
@@ -54,6 +54,10 @@ export async function assertGeneratedPackageJson(targetDir) {
54
54
  'playwright install chromium && playwright test --grep-invert "browser perf:|toolcraft kernel:"',
55
55
  );
56
56
  assert.equal(packageJson.scripts["test:browser:perf"], undefined);
57
+ assert.equal(
58
+ packageJson.scripts["test:feature"],
59
+ "node scripts/run-feature-verification.mjs",
60
+ );
57
61
  assert.equal(packageJson.scripts["verify:quick"], undefined);
58
62
  assert.equal(
59
63
  packageJson.scripts["verify:delivery"],
@@ -15,7 +15,6 @@ const generatedProductFixtureDir = path.resolve(
15
15
 
16
16
  export const generatedProductAuthorityFixturePaths = Object.freeze([
17
17
  "docs/toolcraft/agent-worklog.md",
18
- "src/app/app-verification-impact.json",
19
18
  ]);
20
19
 
21
20
  export const generatedProductPresentationResourcePath =
@@ -54,6 +53,7 @@ export const generatedProductFixturePaths = Object.freeze([
54
53
  "src/app/material-output.tsx",
55
54
  "src/app/material-schema.ts",
56
55
  generatedProductPerformanceOwnerPath,
56
+ "src/app/svg-export-renderer.test.ts",
57
57
  ]);
58
58
 
59
59
  function compareCodeUnits(left, right) {