@pixel-point/toolcraft 0.0.18 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/package.json +1 -1
  2. package/src/generate-demand-only-lifecycle.test.mjs +9 -1
  3. package/src/generate-performance-iteration-execution.test.mjs +3 -3
  4. package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
  5. package/src/generate-test-demand-only-lifecycle.mjs +34 -36
  6. package/src/generate-test-dependency-sandbox.mjs +4 -1
  7. package/src/generate-test-doc-assertions.mjs +55 -53
  8. package/src/generate-test-doc-assertions.test.mjs +1 -1
  9. package/src/generate-test-doc-policy-assertions.mjs +1 -1
  10. package/src/generate-test-export-doc-assertions.mjs +53 -0
  11. package/src/generate-test-file-assertions.mjs +51 -8
  12. package/src/generate-test-integrity-assertions.mjs +5 -2
  13. package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
  14. package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
  15. package/src/generate-test-package-assertions.mjs +4 -0
  16. package/src/generate-test-product-fixture.mjs +1 -1
  17. package/src/generate-test-product-fixture.test.mjs +35 -38
  18. package/src/generate-test-product-iteration.mjs +0 -1
  19. package/src/generate-test-product-iteration.test.mjs +0 -1
  20. package/src/generate-test-runtime-boundary-assertions.mjs +20 -0
  21. package/src/generate-test-standalone-assertions.mjs +0 -16
  22. package/src/generate-test-standalone-delivery-stages.mjs +2 -86
  23. package/src/generate.test.mjs +4 -0
  24. package/src/generated-integrity-manifest.test.mjs +5 -2
  25. package/src/generated-source-policy.test.mjs +0 -4
  26. package/src/package-json.mjs +5 -0
  27. package/src/package-json.test.mjs +21 -0
  28. package/src/package-manager.mjs +2 -0
  29. package/src/package-manager.test.mjs +8 -0
  30. package/src/packaged-template-fallback-helpers.mjs +254 -0
  31. package/src/packaged-template-fallback.test.mjs +121 -46
  32. package/src/packaged-template-runtime-assertions.mjs +150 -0
  33. package/templates/runtime/contracts/component-contracts.choices.test.ts +18 -3
  34. package/templates/runtime/contracts/component-contracts.choices.ts +8 -3
  35. package/templates/runtime/contracts/component-contracts.inputs.ts +2 -1
  36. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +18 -4
  37. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +1 -1
  38. package/templates/runtime/contracts/component-contracts.runtime.ts +7 -4
  39. package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
  40. package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
  41. package/templates/runtime/contracts/decision-contracts.test.ts +18 -12
  42. package/templates/runtime/contracts/decision-contracts.ts +4 -4
  43. package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
  44. package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
  45. package/templates/runtime/export/artifact-download.ts +1 -0
  46. package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
  47. package/templates/runtime/export/artifact-frame-state.ts +16 -0
  48. package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
  49. package/templates/runtime/export/artifact-scene-frame.ts +3 -3
  50. package/templates/runtime/export/export-error.ts +5 -0
  51. package/templates/runtime/export/export-renderer-coverage.ts +54 -0
  52. package/templates/runtime/export/image-artifact-export.ts +2 -2
  53. package/templates/runtime/export/index.ts +13 -0
  54. package/templates/runtime/export/product-export-renderer.test.ts +38 -4
  55. package/templates/runtime/export/product-export-renderer.ts +0 -41
  56. package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
  57. package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
  58. package/templates/runtime/export/svg-artifact-export.ts +120 -0
  59. package/templates/runtime/export/svg-document.test.ts +221 -0
  60. package/templates/runtime/export/svg-document.ts +400 -0
  61. package/templates/runtime/export/svg-policy.ts +47 -0
  62. package/templates/runtime/index.ts +1 -0
  63. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +10 -0
  64. package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
  65. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +46 -1
  66. package/templates/runtime/react/app-shell/toolcraft-app.tsx +7 -2
  67. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
  68. package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
  69. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +1 -1
  70. package/templates/runtime/react/canvas/canvas-shell.tsx +16 -5
  71. package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
  72. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
  73. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
  74. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
  75. package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
  76. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +39 -0
  77. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
  78. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +1 -4
  79. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +2 -2
  80. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
  81. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +2 -2
  82. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +40 -11
  83. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +31 -2
  84. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +4 -1
  85. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
  86. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
  87. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
  88. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
  89. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
  90. package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
  91. package/templates/runtime/schema/artifact-export-actions.ts +49 -0
  92. package/templates/runtime/schema/types.ts +1 -0
  93. package/templates/runtime/state/canvas-background-state.ts +1 -16
  94. package/templates/runtime/state/canvas-state.ts +32 -20
  95. package/templates/runtime/state/control-value-codecs.test.ts +98 -0
  96. package/templates/runtime/state/control-value-codecs.ts +700 -0
  97. package/templates/runtime/state/control-value-normalization.test.ts +1 -1
  98. package/templates/runtime/state/control-value-normalization.ts +127 -135
  99. package/templates/runtime/state/controls-reducer.ts +26 -3
  100. package/templates/runtime/state/create-template-state.test.ts +30 -0
  101. package/templates/runtime/state/create-template-state.ts +52 -31
  102. package/templates/runtime/state/orientation-pose.ts +80 -0
  103. package/templates/runtime/state/persistence-control-values.test.ts +59 -0
  104. package/templates/runtime/state/reducer-controls.test.ts +45 -0
  105. package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
  106. package/templates/runtime/state/reducer-timeline.test.ts +70 -0
  107. package/templates/runtime/state/timeline-reducer.ts +40 -2
  108. package/templates/runtime/testing/performance-schema-queries.ts +2 -2
  109. package/templates/starter/AGENTS.md +21 -22
  110. package/templates/starter/docs/toolcraft/README.md +6 -6
  111. package/templates/starter/docs/toolcraft/acceptance-testing.md +20 -20
  112. package/templates/starter/docs/toolcraft/agent-worklog.md +88 -1
  113. package/templates/starter/docs/toolcraft/assembly-workflow.md +7 -6
  114. package/templates/starter/docs/toolcraft/component-rules.md +2 -2
  115. package/templates/starter/docs/toolcraft/core/layout.md +6 -1
  116. package/templates/starter/docs/toolcraft/core/media-upload.md +1 -1
  117. package/templates/starter/docs/toolcraft/core/performance.md +8 -10
  118. package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
  119. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +2 -1
  120. package/templates/starter/docs/toolcraft/core/setup-export.md +43 -13
  121. package/templates/starter/docs/toolcraft/decision-contract.md +2 -2
  122. package/templates/starter/docs/toolcraft/performance.md +8 -10
  123. package/templates/starter/docs/toolcraft/renderer-technique.md +2 -2
  124. package/templates/starter/docs/toolcraft/schema-reference.md +8 -8
  125. package/templates/starter/docs/toolcraft/workflow.md +14 -14
  126. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +38 -0
  127. package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
  128. package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
  129. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +62 -0
  130. package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
  131. package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
  132. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
  133. package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
  134. package/templates/starter/e2e/browser-proof-session.ts +43 -15
  135. package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
  136. package/templates/starter/e2e/browser-proof-types.ts +15 -0
  137. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +22 -6
  138. package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
  139. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +97 -0
  140. package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
  141. package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
  142. package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
  143. package/templates/starter/e2e/product-observable-helpers.ts +8 -129
  144. package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
  145. package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
  146. package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
  147. package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
  148. package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
  149. package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
  150. package/templates/starter/package.json +2 -0
  151. package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
  152. package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
  153. package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
  154. package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
  155. package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
  156. package/templates/starter/scripts/run-browser-performance.mjs +0 -6
  157. package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
  158. package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
  159. package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
  160. package/templates/starter/scripts/run-feature-verification.mjs +212 -0
  161. package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
  162. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
  163. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
  164. package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
  165. package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
  166. package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
  167. package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
  168. package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
  169. package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
  170. package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
  171. package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
  172. package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
  173. package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
  174. package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
  175. package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
  176. package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
  177. package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
  178. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
  179. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
  180. package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
  181. package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
  182. package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
  183. package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
  184. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
  185. package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
  186. package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
  187. package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
  188. package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
  189. package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
  190. package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
  191. package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
  192. package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
  193. package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
  194. package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
  195. package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
  196. package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
  197. package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
  198. package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
  199. package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
  200. package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
  201. package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
  202. package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
  203. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
  204. package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
  205. package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
  206. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
  207. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
  208. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
  209. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
  210. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
  211. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
  212. package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
  213. package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
  214. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
  215. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
  216. package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
  217. package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
  218. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
  219. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
  220. package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
  221. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
  222. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
  223. package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
  224. package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
  225. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
  226. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
  227. package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
  228. package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
  229. package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
  230. package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
  231. package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
  232. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
  233. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
  234. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
  235. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
  236. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
  237. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
  238. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
  239. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
  240. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
  241. package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
  242. package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
  243. package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
  244. package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
  245. package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
  246. package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
  247. package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
  248. package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
  249. package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
  250. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
  251. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
  252. package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
  253. package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
  254. package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
  255. package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
  256. package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
  257. package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
  258. package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
  259. package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
  260. package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
  261. package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
  262. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +1 -1
  263. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +10 -1
  264. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +5 -1
  265. package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
  266. package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
  267. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
  268. package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
  269. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
  270. package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
  271. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
  272. package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
  273. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
  274. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
  275. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
  276. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
  277. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
  278. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
  279. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
  280. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
  281. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +51 -20
  282. package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
  283. package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
  284. package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
  285. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +0 -11
  286. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -3
  287. package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
  288. package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
  289. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +18 -0
  290. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
  291. package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
  292. package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
  293. package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
  294. package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
  295. package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
  296. package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
  297. package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
  298. package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
  299. package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
  300. package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
  301. package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
  302. package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
  303. package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
  304. package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
  305. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
  306. package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
  307. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +5 -1
  308. package/templates/starter/src/app/acceptance/output-export-model.ts +4 -0
  309. package/templates/starter/src/app/acceptance/output-export.ts +4 -1
  310. package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
  311. package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
  312. package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
  313. package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
  314. package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
  315. package/templates/starter/src/app/acceptance/types.ts +43 -118
  316. package/templates/starter/src/app/acceptance/validate-coverage.ts +14 -3
  317. package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
  318. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
  319. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +81 -8
  320. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +2 -0
  321. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +2 -0
  322. package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
  323. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +1 -1
  324. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +1 -0
  325. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +1 -0
  326. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
  327. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
  328. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
  329. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
  330. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
  331. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +5 -1
  332. package/templates/starter/src/app/starter-acceptance.image-export-settings.test.ts +2 -0
  333. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +19 -3
  334. package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
  335. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
  336. package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
  337. package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
  338. package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
  339. package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
  340. package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
  341. package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
  342. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +78 -4
  343. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +6 -1
  344. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +18 -1
  345. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
  346. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
  347. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
  348. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
  349. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +2 -0
  350. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
  351. package/templates/starter/src/app/starter-acceptance.ts +34 -8
  352. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +2 -0
  353. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
  354. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +4 -0
  355. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
  356. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
  357. package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
  358. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
  359. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +3 -0
  360. package/templates/starter/tsconfig.json +1 -0
  361. package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
  362. package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
  363. package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
  364. package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
  365. package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
  366. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
  367. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
  368. package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
  369. package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
  370. package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
  371. package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
  372. package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
  373. package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
  374. package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
  375. package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
  376. package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
  377. package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
  378. package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
  379. package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
  380. package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
  381. package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
  382. package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
  383. package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
  384. package/templates/starter/src/app/starter-verification-impact.json +0 -15
@@ -6,6 +6,7 @@ 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
12
  import { assertGeneratedRuntimePublicBoundary } from "./generate-test-runtime-boundary-assertions.mjs";
@@ -87,6 +88,30 @@ export async function assertGeneratedFiles(targetDir) {
87
88
  generatedApplicabilityValidatorSource,
88
89
  /getToolcraftControlApplicabilityErrors/,
89
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/);
90
115
  const appAcceptanceSource = await fs.readFile(
91
116
  path.join(targetDir, "src/app/app-acceptance.ts"),
92
117
  "utf8",
@@ -101,9 +126,6 @@ export async function assertGeneratedFiles(targetDir) {
101
126
  /validate:\s*\(\{ sectionInventory \}\)\s*=>\s*getToolcraftControlSectionEntityCohesionErrors\(sectionInventory\)/,
102
127
  );
103
128
  assert.ok(await fs.stat(path.join(targetDir, "src/app/app-performance.ts")));
104
- assert.ok(
105
- await fs.stat(path.join(targetDir, "src/app/app-verification-impact.json")),
106
- );
107
129
  assert.ok(await fs.stat(path.join(targetDir, "src/app/app-performance.gates.test.ts")));
108
130
  assert.equal(
109
131
  generatedAppSourceFiles.some((file) => path.basename(file).startsWith("starter-")),
@@ -117,6 +139,10 @@ export async function assertGeneratedFiles(targetDir) {
117
139
  );
118
140
  assert.ok(await fs.stat(path.join(targetDir, "e2e/performance-helpers.ts")));
119
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",
120
146
  "e2e/browser-execution-ledger.ts",
121
147
  "e2e/browser-performance-measurement-evidence.ts",
122
148
  "e2e/browser-performance-measurement-report.ts",
@@ -129,7 +155,6 @@ export async function assertGeneratedFiles(targetDir) {
129
155
  "e2e/toolcraft-delivery-catalog-reporter.ts",
130
156
  "scripts/toolcraft-performance-report.mjs",
131
157
  "scripts/toolcraft-kernel-benchmark-receipt.mjs",
132
- "scripts/toolcraft-verification-impact.mjs",
133
158
  "scripts/toolcraft-targeted-performance-report.mjs",
134
159
  "scripts/run-kernel-benchmarks.mjs",
135
160
  "src/app/test-evidence/browser-performance-measurement-contract.ts",
@@ -225,11 +250,19 @@ export async function assertGeneratedFiles(targetDir) {
225
250
  assert.ok(await fs.stat(manifestPath));
226
251
 
227
252
  const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
253
+ const expectedFrameworkInventory = await collectFrameworkOwnedGeneratedFiles(
254
+ path.join(repoRoot, "starter"),
255
+ );
228
256
  const generatedPackageJson = JSON.parse(
229
257
  await fs.readFile(path.join(targetDir, "package.json"), "utf8"),
230
258
  );
231
259
  assert.equal(manifest.version, 3);
232
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
+ );
233
266
  assert.deepEqual(
234
267
  manifest.packageScripts,
235
268
  Object.fromEntries(Object.entries(generatedPackageJson.scripts).sort()),
@@ -242,10 +275,18 @@ export async function assertGeneratedFiles(targetDir) {
242
275
  manifest.packageScripts["verify:delivery"],
243
276
  "node scripts/run-delivery-verification.mjs",
244
277
  );
278
+ assert.equal(
279
+ manifest.packageScripts["test:feature"],
280
+ "node scripts/run-feature-verification.mjs",
281
+ );
245
282
  assert.equal(
246
283
  manifest.packageScripts["verify:perf"],
247
284
  "node scripts/run-browser-performance.mjs",
248
285
  );
286
+ assert.equal(
287
+ manifest.packageScripts["reference:study"],
288
+ "node scripts/create-toolcraft-motion-reference-study.mjs",
289
+ );
249
290
  assert.notEqual(
250
291
  manifest.packageScripts["verify:delivery"],
251
292
  manifest.packageScripts["verify:perf"],
@@ -310,6 +351,12 @@ export async function assertGeneratedFiles(targetDir) {
310
351
  assert.ok(
311
352
  manifest.protectedFiles["e2e/toolcraft-delivery-catalog-reporter.ts"],
312
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");
313
360
  assert.ok(manifest.protectedFiles["e2e/browser-runtime-evidence.ts"]);
314
361
  assert.ok(manifest.protectedFiles["e2e/app-performance.spec.ts"]);
315
362
  assertSignedProtectedFiles(manifest, [
@@ -400,8 +447,4 @@ export async function assertGeneratedFiles(targetDir) {
400
447
  manifest.protectedFiles["e2e/app-kernel-benchmarks.ts"],
401
448
  undefined,
402
449
  );
403
- assert.equal(
404
- manifest.protectedFiles["src/app/app-verification-impact.json"],
405
- undefined,
406
- );
407
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) {
@@ -20,10 +20,44 @@ const generatedProductFixtureRoot = new URL(
20
20
  import.meta.url,
21
21
  );
22
22
 
23
+ const starterPackageJsonUrl = new URL("../../starter/package.json", import.meta.url);
24
+
25
+ it("keeps generated product fixtures reference-free and motion preprocessing demand-only", async () => {
26
+ const fixtureSources = await Promise.all([
27
+ generatedProductFixtureRoot,
28
+ new URL("../fixtures/generated-product-material-iteration/", import.meta.url),
29
+ ].map((root) => fs.readFile(
30
+ new URL("src/app/app-acceptance-data.ts", root),
31
+ "utf8",
32
+ )));
33
+ const packageJson = JSON.parse(await fs.readFile(starterPackageJsonUrl, "utf8"));
34
+
35
+ for (const fixtureSource of fixtureSources) {
36
+ assert.match(fixtureSource, /mode:\s*"new-toolcraft-app",\s*referenceInputs:\s*\[\],/u);
37
+ }
38
+ assert.equal(
39
+ packageJson.scripts["reference:study"],
40
+ "node scripts/create-toolcraft-motion-reference-study.mjs",
41
+ );
42
+ for (const scriptName of [
43
+ "build",
44
+ "docs:check",
45
+ "test",
46
+ "test:generated",
47
+ "typecheck",
48
+ "verify:delivery",
49
+ ]) {
50
+ assert.doesNotMatch(
51
+ packageJson.scripts[scriptName],
52
+ /reference:study|create-toolcraft-motion-reference-study/u,
53
+ `${scriptName} must not invoke motion-reference preprocessing implicitly.`,
54
+ );
55
+ }
56
+ });
57
+
23
58
  it("rejects unknown and missing product fixture paths", () => {
24
59
  assert.deepEqual(generatedProductAuthorityFixturePaths, [
25
60
  "docs/toolcraft/agent-worklog.md",
26
- "src/app/app-verification-impact.json",
27
61
  ]);
28
62
  assert.equal(
29
63
  generatedProductPresentationResourcePath,
@@ -254,12 +288,6 @@ it("applies only product-owned fixture files and preserves generated infrastruct
254
288
  path.join(targetDir, generatedProductPerformanceOwnerPath),
255
289
  "utf8",
256
290
  );
257
- const verificationImpact = JSON.parse(
258
- await fs.readFile(
259
- path.join(targetDir, "src/app/app-verification-impact.json"),
260
- "utf8",
261
- ),
262
- );
263
291
  const worklog = await fs.readFile(
264
292
  path.join(targetDir, "docs/toolcraft/agent-worklog.md"),
265
293
  "utf8",
@@ -271,37 +299,6 @@ it("applies only product-owned fixture files and preserves generated infrastruct
271
299
  /export const productPulseResourcePath = "\/product-pulse\.svg";/u,
272
300
  );
273
301
  assert.match(productOutput, /src=\{productPulseResourcePath\}/u);
274
- assert.deepEqual(
275
- verificationImpact.owners.find(
276
- ({ path: ownerPath }) =>
277
- ownerPath === generatedProductPresentationResourcePath,
278
- ),
279
- {
280
- acceptanceIds: ["animation.speed"],
281
- kind: "presentation",
282
- path: generatedProductPresentationResourcePath,
283
- },
284
- );
285
- assert.equal(verificationImpact.version, 3);
286
- assert.equal(
287
- verificationImpact.owners.some(
288
- ({ path: ownerPath }) =>
289
- ownerPath === "src/app/app-export-performance-workload.ts",
290
- ),
291
- false,
292
- );
293
- assert.deepEqual(
294
- verificationImpact.owners.map(({ path: ownerPath }) => ownerPath),
295
- [
296
- "public/product-pulse.svg",
297
- "src/app/app-composition.tsx",
298
- "src/app/app-renderer-pipeline.ts",
299
- "src/app/app-schema.ts",
300
- "src/app/material-output.tsx",
301
- "src/app/material-schema.ts",
302
- "src/app/product-output.tsx",
303
- ],
304
- );
305
302
  const verificationLines = worklog.match(/^- Verification:.*$/gmu) ?? [];
306
303
  assert.ok(verificationLines.length > 0);
307
304
  assert.ok(
@@ -20,7 +20,6 @@ export const generatedProductMaterialIterationFixturePaths = Object.freeze([
20
20
  "public/material-frosting.svg",
21
21
  "public/material-sprinkles.svg",
22
22
  "src/app/app-acceptance-data.ts",
23
- "src/app/app-verification-impact.json",
24
23
  "src/app/material-acceptance-data.ts",
25
24
  "src/app/material-output.test.tsx",
26
25
  "src/app/material-output.tsx",
@@ -22,7 +22,6 @@ const expectedPaths = [
22
22
  "public/material-frosting.svg",
23
23
  "public/material-sprinkles.svg",
24
24
  "src/app/app-acceptance-data.ts",
25
- "src/app/app-verification-impact.json",
26
25
  "src/app/material-acceptance-data.ts",
27
26
  "src/app/material-output.test.tsx",
28
27
  "src/app/material-output.tsx",
@@ -50,6 +50,19 @@ const productSafeRuntimeExportIndex = [
50
50
  ' ToolcraftProductExportFrameRenderer,',
51
51
  ' ToolcraftProductExportRenderer,',
52
52
  '} from "./product-export-renderer";',
53
+ 'export type {',
54
+ ' ToolcraftProductSvgExportFrameContext,',
55
+ ' ToolcraftProductSvgExportFrameRenderer,',
56
+ ' ToolcraftProductSvgExportRenderer,',
57
+ '} from "./product-svg-export-renderer";',
58
+ 'export {',
59
+ ' TOOLCRAFT_FORBIDDEN_SVG_ELEMENTS,',
60
+ ' TOOLCRAFT_SVG_BACKGROUND_ATTRIBUTE,',
61
+ ' TOOLCRAFT_SVG_NAMESPACE,',
62
+ ' TOOLCRAFT_SVG_NON_RENDERING_CONTAINERS,',
63
+ ' TOOLCRAFT_SVG_PRODUCT_SCENE_ATTRIBUTE,',
64
+ ' TOOLCRAFT_SVG_VECTOR_PRIMITIVES,',
65
+ '} from "./svg-policy";',
53
66
  '',
54
67
  ].join("\n");
55
68
 
@@ -61,15 +74,22 @@ const requiredRuntimeExportImplementationPaths = [
61
74
  "runtime/export/artifact-scene-frame.ts",
62
75
  "runtime/export/image-artifact-export.ts",
63
76
  "runtime/export/product-export-renderer.ts",
77
+ "runtime/export/product-svg-export-renderer.ts",
78
+ "runtime/export/svg-artifact-export.ts",
79
+ "runtime/export/svg-document.ts",
80
+ "runtime/export/svg-policy.ts",
64
81
  "runtime/export/video-artifact-export.ts",
65
82
  "runtime/export/video-encoding-backend.ts",
66
83
  "runtime/export/video-frame-schedule.ts",
67
84
  ];
68
85
 
69
86
  const generatedMediaExportEvidencePaths = [
87
+ "e2e/browser-infinity-canvas-svg-evidence.ts",
70
88
  "e2e/browser-media-export-evidence.ts",
71
89
  "e2e/decoded-pixel-observation.ts",
72
90
  "e2e/image-artifact-inspection.ts",
91
+ "e2e/browser-svg-export-evidence.ts",
92
+ "e2e/svg-artifact-inspection.ts",
73
93
  "e2e/video-artifact-inspection.ts",
74
94
  ];
75
95
 
@@ -97,22 +97,6 @@ export async function assertGeneratedProductStandalone({ execFileAsync, targetDi
97
97
  );
98
98
  assert.doesNotMatch(appSchemaSource, /visibleWhen\s*:/u);
99
99
 
100
- const verificationImpact = JSON.parse(
101
- await fs.readFile(
102
- path.join(targetDir, "src/app/app-verification-impact.json"),
103
- "utf8",
104
- ),
105
- );
106
- assert.equal(verificationImpact.version, 3);
107
- assert.ok(
108
- verificationImpact.owners.every(
109
- (owner) =>
110
- owner.acceptanceIds.length > 0 &&
111
- (owner.kind !== "performance" || owner.passIds.length > 0),
112
- ),
113
- "Generated fixture verification ownership must name acceptance IDs and exact performance pass IDs.",
114
- );
115
-
116
100
  const performanceSource = await fs.readFile(
117
101
  path.join(targetDir, "src/app/app-performance.ts"),
118
102
  "utf8",
@@ -66,8 +66,8 @@ export async function assertGeneratedInitialFunctionalDelivery({
66
66
  assert.equal(checkpoint.version, 1);
67
67
  assert.equal(checkpoint.delivery.kind, "delivery-verification");
68
68
  assert.equal(checkpoint.delivery.runner, "protected-delivery");
69
- assert.equal(checkpoint.delivery.version, 7);
70
- assert.equal(checkpoint.delivery.planVersion, 4);
69
+ assert.equal(checkpoint.delivery.version, 8);
70
+ assert.equal(checkpoint.delivery.planVersion, 6);
71
71
  assert.equal(checkpoint.delivery.plan.kind, "functional");
72
72
  assert.deepEqual(checkpoint.delivery.plan.basis, { kind: "initial" });
73
73
  assert.deepEqual(
@@ -108,87 +108,3 @@ export async function assertGeneratedInitialFunctionalDelivery({
108
108
  /ENOENT/u,
109
109
  );
110
110
  }
111
-
112
- export async function assertGeneratedLaterFunctionalDelivery({
113
- acceptanceCatalog,
114
- browserEnv,
115
- checkpointPath,
116
- execFileAsync,
117
- expectedAcceptanceIds,
118
- expectedBrowserTestNames,
119
- expectedChangedFiles,
120
- expectedProductTestFiles,
121
- targetDir,
122
- }) {
123
- const { tests } = await runGeneratedDeliveryWithLedger({
124
- env: browserEnv,
125
- execFileAsync,
126
- targetDir,
127
- });
128
- const expectedRows = acceptanceCatalog.filter(({ acceptanceId }) =>
129
- expectedAcceptanceIds.includes(acceptanceId),
130
- );
131
- assert.equal(
132
- expectedRows.length,
133
- expectedAcceptanceIds.length,
134
- );
135
- const checkpoint = JSON.parse(await fs.readFile(checkpointPath, "utf8"));
136
- const receipt = checkpoint.delivery;
137
- assert.equal(receipt.version, 7);
138
- assert.equal(receipt.planVersion, 4);
139
- assert.equal(receipt.plan.kind, "functional");
140
- assert.equal(Object.hasOwn(receipt, "verificationTier"), false);
141
- assert.deepEqual(receipt.plan.basis.changedFiles, expectedChangedFiles);
142
- assert.deepEqual(
143
- receipt.plan.steps.map(({ kind }) => kind),
144
- [
145
- "code-health",
146
- "product-tests",
147
- "build",
148
- "browser-functional",
149
- ],
150
- );
151
- assert.deepEqual(
152
- receipt.plan.steps.find(({ kind }) => kind === "product-tests"),
153
- {
154
- files: expectedProductTestFiles,
155
- kind: "product-tests",
156
- },
157
- );
158
- assert.deepEqual(
159
- receipt.plan.steps.find(
160
- ({ kind }) => kind === "browser-functional",
161
- ),
162
- {
163
- kind: "browser-functional",
164
- testNames: expectedBrowserTestNames,
165
- },
166
- );
167
- assert.deepEqual(
168
- receipt.evidence.find(
169
- ({ kind }) => kind === "browser-functional",
170
- ),
171
- {
172
- kind: "browser-functional",
173
- testNames: expectedBrowserTestNames,
174
- },
175
- );
176
- assert.ok(
177
- receipt.plan.steps.some(({ kind }) => kind === "browser-functional"),
178
- );
179
- assert.equal(
180
- receipt.plan.steps.some(({ kind }) => kind === "browser-performance"),
181
- false,
182
- );
183
- assert.equal(checkpoint.performanceBaseline, null);
184
- assert.equal(checkpoint.currentPerformance, null);
185
- assert.equal(
186
- receipt.evidence.some(({ kind }) => kind === "browser-performance"),
187
- false,
188
- );
189
- assertGeneratedExecutionLedger({
190
- expectedFunctionalRows: expectedRows,
191
- expectedPerformanceEvidence: [],
192
- tests,
193
- });
194
- }
@@ -387,6 +387,10 @@ describe("generateToolcraft", () => {
387
387
  packageJson.scripts["verify:delivery"],
388
388
  "node scripts/run-delivery-verification.mjs",
389
389
  );
390
+ assert.equal(
391
+ packageJson.scripts["test:feature"],
392
+ "node scripts/run-feature-verification.mjs",
393
+ );
390
394
  assert.equal(packageJson.scripts["verify:quick"], undefined);
391
395
  assert.equal(packageJson.scripts["verify:ui"], undefined);
392
396
  assert.equal(
@@ -46,7 +46,6 @@ const independentlyProductOwnedPaths = new Set([
46
46
  "e2e/app-performance-path-adapters.ts",
47
47
  "src/app/app-acceptance-data.ts",
48
48
  "src/app/app-composition.tsx",
49
- "src/app/app-verification-impact.json",
50
49
  "src/app/app-performance.ts",
51
50
  "src/app/app-schema.test.ts",
52
51
  "src/app/app-schema.ts",
@@ -117,13 +116,17 @@ describe("collectFrameworkOwnedGeneratedFiles", () => {
117
116
  "e2e/browser-execution-ledger.ts",
118
117
  "e2e/browser-render-scale-evidence.ts",
119
118
  "e2e/toolcraft-delivery-catalog-reporter.ts",
119
+ "e2e/toolcraft-feature-verification-reporter.ts",
120
120
  "src/app/acceptance/types.ts",
121
121
  "src/app/app-acceptance.render-scale.test.ts",
122
122
  "scripts/toolcraft-delivery-anchor.mjs",
123
123
  "scripts/toolcraft-delivery-executor.mjs",
124
+ "scripts/toolcraft-delivery-lifecycle.mjs",
124
125
  "scripts/toolcraft-delivery-plan.mjs",
125
126
  "scripts/toolcraft-proof-process.mjs",
126
- "scripts/toolcraft-verification-impact.mjs",
127
+ "scripts/run-feature-verification.mjs",
128
+ "scripts/toolcraft-feature-verification-plan.mjs",
129
+ "src/app/acceptance/feature-verification-selection.ts",
127
130
  ]) {
128
131
  assert.ok(protectedFiles.includes(relativePath));
129
132
  }
@@ -17,10 +17,6 @@ describe("isGeneratedTestSupportPath", () => {
17
17
  "scripts/toolcraft-functional-proof-primitives.d.mts",
18
18
  "scripts/toolcraft-functional-proof-model.mjs",
19
19
  "scripts/toolcraft-functional-proof-model.d.mts",
20
- "scripts/toolcraft-verification-input-roles.mjs",
21
- "scripts/toolcraft-verification-input-roles.d.mts",
22
- "scripts/toolcraft-verification-impact-inventory.mjs",
23
- "scripts/toolcraft-verification-impact-inventory.d.mts",
24
20
  "scripts/toolcraft-delivery-functional-context.mjs",
25
21
  "scripts/toolcraft-delivery-functional-context.d.mts",
26
22
  ];
@@ -72,6 +72,11 @@ export function createGeneratedPackageJson({
72
72
  "starterPackageJson.scripts.verify:perf is required to create a generated package manifest.",
73
73
  );
74
74
  }
75
+ if (!starterScripts["test:feature"]) {
76
+ throw new Error(
77
+ "starterPackageJson.scripts.test:feature is required to create a generated package manifest.",
78
+ );
79
+ }
75
80
 
76
81
  const packageJson = {
77
82
  name: sanitizePackageName(name),
@@ -36,6 +36,7 @@ describe("createGeneratedPackageJson", () => {
36
36
  dev: "vite dev",
37
37
  test: "vitest run",
38
38
  "test:generated": "node scripts/check-toolcraft-integrity.mjs && vitest run",
39
+ "test:feature": "node scripts/run-feature-verification.mjs",
39
40
  typecheck: "tsc -p tsconfig.json --noEmit",
40
41
  "verify:delivery": "node scripts/run-delivery-verification.mjs",
41
42
  "verify:perf": "node scripts/run-browser-performance.mjs",
@@ -64,6 +65,7 @@ describe("createGeneratedPackageJson", () => {
64
65
  build: "tsc -p tsconfig.json --noEmit && vite build",
65
66
  dev: "vite dev",
66
67
  test: "node scripts/check-toolcraft-integrity.mjs && vitest run",
68
+ "test:feature": "node scripts/run-feature-verification.mjs",
67
69
  typecheck: "tsc -p tsconfig.json --noEmit",
68
70
  "verify:delivery": "node scripts/run-delivery-verification.mjs",
69
71
  "verify:perf": "node scripts/run-browser-performance.mjs",
@@ -130,6 +132,23 @@ describe("createGeneratedPackageJson", () => {
130
132
  );
131
133
  });
132
134
 
135
+ it("rejects starter manifests without the focused feature verifier", () => {
136
+ assert.throws(
137
+ () =>
138
+ createGeneratedPackageJson({
139
+ name: "Generated App",
140
+ starterPackageJson: {
141
+ scripts: {
142
+ "test:generated": "node scripts/check-toolcraft-integrity.mjs && vitest run",
143
+ "verify:delivery": "node scripts/run-delivery-verification.mjs",
144
+ "verify:perf": "node scripts/run-browser-performance.mjs",
145
+ },
146
+ },
147
+ }),
148
+ /scripts\.test:feature is required/,
149
+ );
150
+ });
151
+
133
152
  for (const packageManager of ["npm", "pnpm"]) {
134
153
  it(`preserves direct protected entry points without synthesizing aliases for ${packageManager}`, () => {
135
154
  const packageJson = createGeneratedPackageJson({
@@ -141,6 +160,7 @@ describe("createGeneratedPackageJson", () => {
141
160
  dev: "vite dev",
142
161
  test: "vitest run",
143
162
  "test:generated": "node scripts/check-toolcraft-integrity.mjs && vitest run",
163
+ "test:feature": "node scripts/run-feature-verification.mjs",
144
164
  typecheck: "tsc -p tsconfig.json --noEmit",
145
165
  "verify:delivery": "node scripts/run-delivery-verification.mjs",
146
166
  "verify:perf": "node scripts/run-browser-performance.mjs",
@@ -152,6 +172,7 @@ describe("createGeneratedPackageJson", () => {
152
172
  build: "vite build",
153
173
  dev: "vite dev",
154
174
  test: "node scripts/check-toolcraft-integrity.mjs && vitest run",
175
+ "test:feature": "node scripts/run-feature-verification.mjs",
155
176
  typecheck: "tsc -p tsconfig.json --noEmit",
156
177
  "verify:delivery": "node scripts/run-delivery-verification.mjs",
157
178
  "verify:perf": "node scripts/run-browser-performance.mjs",