@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixel-point/toolcraft",
3
- "version": "0.0.18",
3
+ "version": "0.0.19",
4
4
  "license": "SEE LICENSE IN LICENSE.md",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,7 +18,7 @@ import {
18
18
  } from "./dependency-install.mjs";
19
19
  import { generateToolcraft } from "./generate.mjs";
20
20
 
21
- test("fresh generated app runs initial proof then one semantic material delivery", async (t) => {
21
+ test("fresh generated app runs one initial proof then focused material verification", async (t) => {
22
22
  const tempRoot = await fs.mkdtemp(
23
23
  path.join(os.tmpdir(), "toolcraft-demand-only-lifecycle-"),
24
24
  );
@@ -97,6 +97,14 @@ test("fresh generated app runs initial proof then one semantic material delivery
97
97
  command: "pnpm",
98
98
  },
99
99
  { args: ["verify:delivery"], command: "pnpm" },
100
+ {
101
+ args: ["exec", "vitest", "run", "src/app/material-output.test.tsx"],
102
+ command: "pnpm",
103
+ },
104
+ {
105
+ args: ["test:feature", "--", "material.layer"],
106
+ command: "pnpm",
107
+ },
100
108
  { args: ["verify:delivery"], command: "pnpm" },
101
109
  ]);
102
110
  });
@@ -50,7 +50,7 @@ test("generated standalone app preserves authority-bound performance iteration l
50
50
  receiptModule.TOOLCRAFT_DELIVERY_RECEIPT_VERSION,
51
51
  targetedReportModule.TOOLCRAFT_TARGETED_PERFORMANCE_REPORT_VERSION,
52
52
  ],
53
- [1, 4, 7, 3],
53
+ [1, 6, 8, 3],
54
54
  );
55
55
  const authorityPolicySource = await fs.readFile(
56
56
  path.join(
@@ -99,7 +99,7 @@ test("generated standalone app preserves authority-bound performance iteration l
99
99
  }
100
100
  const output = `${stdout}\n${stderr}`;
101
101
  assert.doesNotMatch(output, /ERR_MODULE_NOT_FOUND/u);
102
- assert.match(output, /^# tests 11$/mu);
103
- assert.match(output, /^# pass 11$/mu);
102
+ assert.match(output, /^# tests 7$/mu);
103
+ assert.match(output, /^# pass 7$/mu);
104
104
  assert.match(output, /^# fail 0$/mu);
105
105
  });
@@ -1,13 +1,13 @@
1
1
  import assert from "node:assert/strict";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
- import { pathToFileURL } from "node:url";
5
4
 
6
5
  export const deliveryArchitecturePaths = Object.freeze([
7
6
  "e2e/toolcraft-delivery-catalog-reporter.ts",
8
7
  "scripts/run-delivery-verification.mjs",
9
8
  "scripts/toolcraft-delivery-anchor.mjs",
10
9
  "scripts/toolcraft-delivery-executor.mjs",
10
+ "scripts/toolcraft-delivery-lifecycle.mjs",
11
11
  "scripts/toolcraft-delivery-functional-context.d.mts",
12
12
  "scripts/toolcraft-delivery-functional-context.mjs",
13
13
  "scripts/toolcraft-delivery-plan-construction.mjs",
@@ -17,64 +17,12 @@ export const deliveryArchitecturePaths = Object.freeze([
17
17
  "scripts/toolcraft-functional-proof-primitives.d.mts",
18
18
  "scripts/toolcraft-functional-proof-primitives.mjs",
19
19
  "scripts/toolcraft-proof-process.mjs",
20
- "scripts/toolcraft-verification-impact-inventory.d.mts",
21
- "scripts/toolcraft-verification-impact-inventory.mjs",
22
- "scripts/toolcraft-verification-impact.mjs",
23
- "scripts/toolcraft-verification-input-roles.d.mts",
24
- "scripts/toolcraft-verification-input-roles.mjs",
25
20
  ]);
26
21
 
27
22
  async function readGeneratedScript(targetDir, relativePath) {
28
23
  return fs.readFile(path.join(targetDir, "scripts", relativePath), "utf8");
29
24
  }
30
25
 
31
- async function assertGeneratedInputRoleBehavior(targetDir) {
32
- const scriptsDir = path.join(targetDir, "scripts");
33
- const [
34
- { toolcraftVerificationInputRootFamilies },
35
- { createToolcraftProductVerificationContext },
36
- ] = await Promise.all([
37
- import(
38
- pathToFileURL(
39
- path.join(
40
- scriptsDir,
41
- "toolcraft-verification-input-roles.mjs",
42
- ),
43
- ).href
44
- ),
45
- import(
46
- pathToFileURL(
47
- path.join(scriptsDir, "toolcraft-verification-impact.mjs"),
48
- ).href
49
- ),
50
- ]);
51
- const { generated, starter } = toolcraftVerificationInputRootFamilies;
52
- const generatedPaths = [
53
- ...generated.runtimeRootPaths,
54
- ...generated.semanticProofRootPaths,
55
- ];
56
- const starterPaths = [
57
- ...starter.runtimeRootPaths,
58
- ...starter.semanticProofRootPaths,
59
- ];
60
- assert.equal(
61
- generatedPaths.some((repoPath) => starterPaths.includes(repoPath)),
62
- false,
63
- "Generated and starter semantic root families must stay distinct.",
64
- );
65
- const { inputRoles: roles } =
66
- await createToolcraftProductVerificationContext(targetDir);
67
- assert.equal(roles.rootFamily, generated.name);
68
- assert.equal(
69
- roles.impactInventoryPath,
70
- generated.impactInventoryPath,
71
- );
72
- assert.equal(
73
- roles.runtimeProductionPaths.includes(generated.compositionPath),
74
- true,
75
- );
76
- }
77
-
78
26
  export async function assertGeneratedDeliveryArchitecture(targetDir) {
79
27
  for (const relativePath of deliveryArchitecturePaths) {
80
28
  assert.ok(
@@ -82,15 +30,14 @@ export async function assertGeneratedDeliveryArchitecture(targetDir) {
82
30
  `Generated output must contain ${relativePath}.`,
83
31
  );
84
32
  }
85
-
86
33
  const sources = {
87
34
  catalog: await readGeneratedScript(
88
35
  targetDir,
89
36
  "playwright-test-title-selection.mjs",
90
37
  ),
91
- impact: await readGeneratedScript(
38
+ lifecycle: await readGeneratedScript(
92
39
  targetDir,
93
- "toolcraft-verification-impact-inventory.mjs",
40
+ "toolcraft-delivery-lifecycle.mjs",
94
41
  ),
95
42
  model: await readGeneratedScript(
96
43
  targetDir,
@@ -104,34 +51,25 @@ export async function assertGeneratedDeliveryArchitecture(targetDir) {
104
51
  targetDir,
105
52
  "toolcraft-delivery-receipt.mjs",
106
53
  ),
107
- resolution: await readGeneratedScript(
108
- targetDir,
109
- "toolcraft-verification-impact-resolution.mjs",
110
- ),
111
54
  };
112
55
 
113
56
  assert.match(sources.catalog, /Delivery catalog\.version must be 2/);
114
- assert.match(
115
- sources.impact,
116
- /TOOLCRAFT_VERIFICATION_IMPACT_VERSION = 3/,
117
- );
118
57
  assert.match(
119
58
  sources.model,
120
- /TOOLCRAFT_FUNCTIONAL_PROOF_MODEL_VERSION = 1/,
59
+ /TOOLCRAFT_FUNCTIONAL_PROOF_MODEL_VERSION = 2/,
121
60
  );
122
- assert.match(sources.plan, /TOOLCRAFT_DELIVERY_PLAN_VERSION = 4/);
123
- assert.match(sources.receipt, /TOOLCRAFT_DELIVERY_RECEIPT_VERSION = 7/);
124
- assert.doesNotMatch(
125
- sources.resolution,
126
- /createCompleteCurrentProof|requiresCompleteCurrentProofForPath/,
61
+ assert.match(sources.plan, /TOOLCRAFT_DELIVERY_PLAN_VERSION = 6/);
62
+ assert.match(sources.receipt, /TOOLCRAFT_DELIVERY_RECEIPT_VERSION = 8/);
63
+ assert.match(
64
+ sources.lifecycle,
65
+ /TOOLCRAFT_INITIAL_PROOF_ALREADY_COMPLETE/,
127
66
  );
128
67
  assert.doesNotMatch(
129
68
  sources.plan,
130
- /TOOLCRAFT_DELIVERY_PLAN_VERSION = [123]\b/,
69
+ /TOOLCRAFT_DELIVERY_PLAN_VERSION = [1-5]\b/,
131
70
  );
132
71
  assert.doesNotMatch(
133
72
  sources.receipt,
134
- /TOOLCRAFT_DELIVERY_RECEIPT_VERSION = [1-6]\b/,
73
+ /TOOLCRAFT_DELIVERY_RECEIPT_VERSION = [1-7]\b/,
135
74
  );
136
- await assertGeneratedInputRoleBehavior(targetDir);
137
75
  }
@@ -5,17 +5,17 @@ import path from "node:path";
5
5
  import {
6
6
  loadGeneratedProofModule,
7
7
  runGeneratedCommand,
8
+ runGeneratedExecutable,
9
+ runGeneratedScript,
8
10
  } from "./generate-test-dependency-sandbox.mjs";
9
11
  import {
10
12
  assertGeneratedInitialFunctionalDelivery,
11
- assertGeneratedLaterFunctionalDelivery,
12
13
  } from "./generate-test-standalone-delivery-stages.mjs";
13
14
  import {
14
15
  writeGeneratedProductFixture,
15
16
  } from "./generate-test-product-fixture.mjs";
16
17
  import {
17
18
  applyGeneratedProductMaterialIteration,
18
- generatedProductMaterialIterationFixturePaths,
19
19
  } from "./generate-test-product-iteration.mjs";
20
20
  const materialAcceptanceIds = Object.freeze([
21
21
  "material.chocolate",
@@ -35,30 +35,6 @@ const materialBrowserTestNames = Object.freeze([
35
35
  "browser: sprinkle color changes material output",
36
36
  "browser: sprinkles visibility changes material output",
37
37
  ]);
38
- const materialDeliveryBrowserTestNames = Object.freeze([
39
- "browser: ambient speed changes product output",
40
- ...materialBrowserTestNames,
41
- "browser: timeline playback drives product output",
42
- ]);
43
- const materialDeliveryAcceptanceIds = Object.freeze([
44
- "animation.speed",
45
- ...materialAcceptanceIds,
46
- "runtime.timeline",
47
- ]);
48
- const materialProductTestFiles = Object.freeze([
49
- "src/app/acceptance/validation-pipeline.test.ts",
50
- "src/app/app-acceptance.base-coverage.test.ts",
51
- "src/app/app-acceptance.product-output-export.test.ts",
52
- "src/app/app-acceptance.product-readiness.test.ts",
53
- "src/app/app-acceptance.product-worklog.test.ts",
54
- "src/app/app-automated-runtime-evidence.test.ts",
55
- "src/app/app-performance.fixture-helper.test.ts",
56
- "src/app/app-performance.gates.test.ts",
57
- "src/app/app-performance.lifecycle.test.ts",
58
- "src/app/app-schema.test.ts",
59
- "src/app/material-output.test.tsx",
60
- ]);
61
-
62
38
  function deepFreeze(value) {
63
39
  if (value && typeof value === "object" && !Object.isFrozen(value)) {
64
40
  Object.values(value).forEach(deepFreeze);
@@ -131,6 +107,7 @@ async function loadInitialPlan({ targetDir }) {
131
107
  const functionalContext =
132
108
  await collectToolcraftDeliveryFunctionalContext(targetDir);
133
109
  const planningInputs = await loadToolcraftDeliveryPlanningInputs({
110
+ authority: null,
134
111
  currentInventory,
135
112
  functionalContext,
136
113
  integrity,
@@ -200,10 +177,11 @@ async function assertMalformedFunctionalPlanFailsClosed({
200
177
  getEscalationRecommendation: () => null,
201
178
  loadPlanningInputs: async () => fixture.planningInputs,
202
179
  readDeliveryAnchor: async () => ({ missing: true }),
180
+ readPerformanceAuthority: async () => null,
203
181
  }),
204
182
  projectDir: targetDir,
205
183
  }),
206
- /functional.*performance/iu,
184
+ /initial delivery proof is not the fixed complete functional proof/iu,
207
185
  );
208
186
  assert.deepEqual(proofCalls, []);
209
187
  assert.equal(checkpointWrites, 0);
@@ -287,6 +265,7 @@ export async function assertGeneratedFreshDemandOnlyLifecycle({
287
265
  execFileAsync,
288
266
  targetDir,
289
267
  });
268
+ const initialCheckpointBytes = await fs.readFile(checkpointPath);
290
269
  await applyGeneratedProductMaterialIteration(targetDir);
291
270
  const materialCatalog = await collectToolcraftDeliveryCatalog(targetDir);
292
271
  const materialRows = materialCatalog.acceptance.filter(
@@ -300,15 +279,34 @@ export async function assertGeneratedFreshDemandOnlyLifecycle({
300
279
  materialRows.map(({ testName }) => testName).sort(),
301
280
  materialBrowserTestNames,
302
281
  );
303
- await assertGeneratedLaterFunctionalDelivery({
304
- acceptanceCatalog: materialCatalog.acceptance,
305
- browserEnv,
306
- checkpointPath,
282
+ await runGeneratedExecutable(
307
283
  execFileAsync,
308
- expectedAcceptanceIds: materialDeliveryAcceptanceIds,
309
- expectedBrowserTestNames: materialDeliveryBrowserTestNames,
310
- expectedChangedFiles: generatedProductMaterialIterationFixturePaths,
311
- expectedProductTestFiles: materialProductTestFiles,
312
284
  targetDir,
313
- });
285
+ "vitest",
286
+ ["run", "src/app/material-output.test.tsx"],
287
+ );
288
+ const focusedResult = await runGeneratedCommand(
289
+ execFileAsync,
290
+ targetDir,
291
+ ["test:feature", "--", "material.layer"],
292
+ { env: browserEnv },
293
+ );
294
+ const focusedOutput = `${focusedResult.stdout ?? ""}\n${focusedResult.stderr ?? ""}`;
295
+ for (const acceptanceId of materialAcceptanceIds.filter(
296
+ (id) => id !== "material.exportedAppearance",
297
+ )) {
298
+ assert.match(focusedOutput, new RegExp(acceptanceId.replace(".", "\\."), "u"));
299
+ }
300
+ assert.doesNotMatch(focusedOutput, /material\.exportedAppearance/u);
301
+ assert.doesNotMatch(focusedOutput, /actions\.output|canvas\.|lighting\./u);
302
+ await runGeneratedScript(
303
+ execFileAsync,
304
+ targetDir,
305
+ "verify:delivery",
306
+ );
307
+ assert.deepEqual(
308
+ await fs.readFile(checkpointPath),
309
+ initialCheckpointBytes,
310
+ "A repeated ordinary delivery command must preserve the initial checkpoint byte-for-byte.",
311
+ );
314
312
  }
@@ -103,7 +103,10 @@ export async function withDeclaredDependencySandbox(targetDir, callback) {
103
103
  }
104
104
  }
105
105
 
106
- function createGeneratedCommandEnvironment(packageManager, overrides = {}) {
106
+ export function createGeneratedCommandEnvironment(
107
+ packageManager,
108
+ overrides = {},
109
+ ) {
107
110
  const childEnv = {
108
111
  ...process.env,
109
112
  ...overrides,
@@ -8,6 +8,7 @@ import {
8
8
  getMissingGeneratedPerformanceLifecycleMarkers,
9
9
  getStaleAgentPerformanceWorkflowFailures,
10
10
  } from "./generate-test-doc-policy-assertions.mjs";
11
+ import { assertGeneratedExportDocs } from "./generate-test-export-doc-assertions.mjs";
11
12
 
12
13
  export {
13
14
  assertGeneratedExportIntentDocsDoNotInferVideo,
@@ -80,12 +81,15 @@ export async function assertGeneratedDocs(targetDir) {
80
81
  assert.match(agentsSource, /Verification Tier Classifier/);
81
82
  assert.match(agentsSource, /Verification tier: Tier N/);
82
83
  assert.match(agentsSource, /npm run verify:delivery/);
83
- assert.match(agentsSource, /coherent user-visible delivery batch/i);
84
+ assert.match(agentsSource, /first product delivery/i);
84
85
  assert.match(
85
86
  agentsSource,
86
- /toolcraft-performance-lifecycle: first-delivery=functional; later-delivery=functional-targeted; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only/,
87
+ /toolcraft-performance-lifecycle: first-delivery=functional-complete; later-edits=focused-only; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only/,
88
+ );
89
+ assert.match(
90
+ agentsSource,
91
+ /repeated bare `verify:delivery` exits before inventory, build, tests, export, and performance work/is,
87
92
  );
88
- assert.match(agentsSource, /bare `npm run verify:delivery` derives the required proof/i);
89
93
  assert.match(
90
94
  agentsSource,
91
95
  /only exact request authority[^\n]*measured targeted performance/i,
@@ -94,7 +98,7 @@ export async function assertGeneratedDocs(targetDir) {
94
98
  agentsSource,
95
99
  /during development[^\n]*affected performance scenarios|targeted performance scenarios only for touched/i,
96
100
  );
97
- assert.match(agentsSource, /app-verification-impact\.json/);
101
+ assert.match(agentsSource, /ordinary edits use only the smallest feature-focused tests and browser checks/i);
98
102
  assert.match(agentsSource, /does not depend only on a mutable package script/i);
99
103
  assert.match(agentsSource, /pnpm ai:check/);
100
104
  assert.match(agentsSource, /use `brainstorming`/);
@@ -102,6 +106,7 @@ export async function assertGeneratedDocs(targetDir) {
102
106
  assert.match(agentsSource, /use `systematic-debugging`/);
103
107
  assert.match(agentsSource, /browser` workflow/);
104
108
  assert.match(agentsSource, /pnpm test:browser/);
109
+ assert.match(agentsSource, /npm run test:feature --/);
105
110
  assert.match(agentsSource, /signed local `AGENTS\.md` and `docs\/toolcraft\/\*` files are the mandatory workflow authority/i);
106
111
  assert.match(agentsSource, /generated with `--no-skills`, continue through the equivalent signed local workflow/i);
107
112
  assert.match(agentsSource, /Do not silently ignore a missing workflow capability/);
@@ -116,6 +121,8 @@ export async function assertGeneratedDocs(targetDir) {
116
121
  assert.match(agentsSource, /exportRenderer/);
117
122
  assert.match(agentsSource, /renderDefaultCanvasMedia=\{false\}/);
118
123
  assert.match(agentsSource, /onPanelAction/);
124
+ assert.match(agentsSource, /canonical runtime representation across defaults, live edits, persistence, settings import, and keyframes/i);
125
+ assert.match(agentsSource, /property edits declare `selectionScope` as global or selected-entity/i);
119
126
  assert.match(agentsSource, /MIT License/);
120
127
  assert.match(agentsSource, /LICENSE\.md/);
121
128
  assert.match(agentsSource, /NOTICE\.md/);
@@ -156,6 +163,10 @@ export async function assertGeneratedDocs(targetDir) {
156
163
  path.join(targetDir, "docs/toolcraft/core/timeline-animation.md"),
157
164
  "utf8",
158
165
  );
166
+ const coreReferenceStudySource = await fs.readFile(
167
+ path.join(targetDir, "docs/toolcraft/core/reference-study.md"),
168
+ "utf8",
169
+ );
159
170
 
160
171
  assert.match(componentRulesSource, /Slider `step` means numeric snapping only/);
161
172
  assert.match(componentRulesSource, /variant: "discrete"/);
@@ -189,48 +200,32 @@ export async function assertGeneratedDocs(targetDir) {
189
200
  assert.match(coreRuntimeBoundarySource, /copied runtime tree or its signed integrity manifest is missing/);
190
201
  assert.match(coreRuntimeBoundarySource, /modelPresentation/);
191
202
  assert.match(coreRuntimeBoundarySource, /exportRenderer/);
192
- assert.match(coreRuntimeBoundarySource, /runtime owns typed image\/video actions end to end/i);
193
203
  assert.match(coreRuntimeBoundarySource, /does not suppress runtime model layers/);
194
204
  assert.match(componentRulesSource, /Do not show Layers for a single-layer app/);
195
205
  assert.match(coreTimelineSource, /Any app with `Export Video` must enable the top Toolcraft timeline/);
196
- assert.match(coreSetupExportSource, /productReadiness\.exportIntent/);
197
- assert.match(
198
- coreSetupExportSource,
199
- /image[^\n]*`toolcraft-default`[^\n]*`user-requested`[^\n]*`user-removed`/i,
200
- );
201
- assert.match(
202
- coreSetupExportSource,
203
- /video[^\n]*`not-requested`[^\n]*`user-requested`/i,
204
- );
205
- assert.match(
206
- coreSetupExportSource,
207
- /image[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
208
- );
209
- assert.match(
210
- coreSetupExportSource,
211
- /image[^\n]*`user-removed`[^\n]*non-empty[^\n]*evidence/i,
212
- );
213
- assert.match(
214
- coreSetupExportSource,
215
- /video[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
216
- );
217
- for (const decisionStep of [
218
- "Start every product with image export.",
219
- "Add video export only when the user explicitly requests video delivery.",
220
- "Do not infer video from animation, playback, keyframes, or timeline.",
221
- "Keep image with video unless the user explicitly requests removal.",
222
- "Record in `productReadiness.exportIntent`.",
206
+ for (const requiredReferenceStudyTerm of [
207
+ "npm run reference:study",
208
+ "--kind",
209
+ "--grid",
210
+ "--fps",
211
+ "--timestamps-file",
212
+ "12 FPS",
213
+ "120",
214
+ "referenceInputs",
215
+ "reference-parity",
216
+ "no-reference fast path",
223
217
  ]) {
224
- assert.equal(
225
- coreSetupExportSource.split(decisionStep).length - 1,
226
- 1,
227
- `Canonical export-intent step must appear exactly once: ${decisionStep}`,
218
+ assert.match(
219
+ coreReferenceStudySource,
220
+ new RegExp(requiredReferenceStudyTerm.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&"), "iu"),
221
+ `Core reference-study docs must mention ${requiredReferenceStudyTerm}.`,
228
222
  );
229
223
  }
230
- assert.match(
224
+ assertGeneratedExportDocs({
225
+ agentsSource,
226
+ coreRuntimeBoundarySource,
231
227
  coreSetupExportSource,
232
- /Clipboard copy may be an additional product action, but it never changes or substitutes for the recorded artifact intent/,
233
- );
228
+ });
234
229
  assert.match(coreSetupExportSource, /renderScaleCoverage/);
235
230
  assert.match(coreSetupExportSource, /selected-backing-pixels/);
236
231
  assert.match(coreSetupExportSource, /canvas-render-scale-backing/);
@@ -281,7 +276,8 @@ export async function assertGeneratedDocs(targetDir) {
281
276
  assert.match(acceptanceDocsSource, /Framework meta-tests are product-invariant/);
282
277
  assert.match(acceptanceDocsSource, /protected neutral contract fixtures/);
283
278
  assert.match(acceptanceDocsSource, /do not edit supplied `app-performance\.\*` meta-tests/i);
284
- assert.match(acceptanceDocsSource, /app-verification-impact\.json/);
279
+ assert.match(acceptanceDocsSource, /Later ordinary edits do not derive an aggregate proof model/i);
280
+ assert.match(acceptanceDocsSource, /^(?=[\s\S]*test:feature)(?=[\s\S]*semantic)(?=[\s\S]*--all[\s\S]*product acceptance)/i);
285
281
  assert.match(acceptanceDocsSource, /app-kernel-benchmarks\.ts/);
286
282
  assert.match(acceptanceDocsSource, /renderScaleCoverage/);
287
283
  assert.match(acceptanceDocsSource, /selected-backing-pixels/);
@@ -296,14 +292,8 @@ export async function assertGeneratedDocs(targetDir) {
296
292
  );
297
293
  assert.match(acceptanceDocsSource, /actual encoded packet metadata/i);
298
294
  assert.match(acceptanceDocsSource, /distinct decoded frame hashes/i);
299
- assert.match(
300
- acceptanceDocsSource,
301
- /Each browser file owns one acceptance domain/i,
302
- );
303
- assert.match(
304
- acceptanceDocsSource,
305
- /proof and test paths cannot own them/i,
306
- );
295
+ assert.match(acceptanceDocsSource, /selectionScopeCoverage: "two-entity-isolation"/);
296
+ assert.match(acceptanceDocsSource, /editing A changes only A, editing B changes only B/i);
307
297
  for (const coverage of [
308
298
  "package-extraction",
309
299
  "deterministic-root-selection",
@@ -339,6 +329,14 @@ export async function assertGeneratedDocs(targetDir) {
339
329
  path.join(targetDir, "docs/toolcraft/core/performance.md"),
340
330
  "utf8",
341
331
  );
332
+ const schemaDocsSource = await fs.readFile(
333
+ path.join(targetDir, "docs/toolcraft/schema-reference.md"),
334
+ "utf8",
335
+ );
336
+ assert.match(schemaDocsSource, /one canonical runtime value model/i);
337
+ assert.match(schemaDocsSource, /`color` state is an expanded uppercase `#RRGGBB` string/i);
338
+ assert.match(componentRulesSource, /Built-in controls own canonical runtime values/i);
339
+ assert.match(worklogDocsSource, /Canonical control values and selected-entity isolation/i);
342
340
  assert.deepEqual(
343
341
  getMissingGeneratedPerformanceLifecycleMarkers([
344
342
  { docPath: "workflow.md", source: workflowDocsSource },
@@ -357,6 +355,7 @@ export async function assertGeneratedDocs(targetDir) {
357
355
  assert.match(rendererDocsSource, /combined fixtures/i);
358
356
  assert.match(rendererDocsSource, /modelPresentation/);
359
357
  assert.match(rendererDocsSource, /ToolcraftAppComposition\.exportRenderer/);
358
+ assert.match(rendererDocsSource, /svgExportRenderer/);
360
359
  assert.match(rendererDocsSource, /useToolcraftModelPresentationConsumer/);
361
360
  assert.match(rendererDocsSource, /acquirePresentation/);
362
361
  assert.match(rendererDocsSource, /lease\.release/);
@@ -387,9 +386,12 @@ export async function assertGeneratedDocs(targetDir) {
387
386
  );
388
387
  assert.match(corePerformanceDocsSource, /exact 30 FPS packet cadence[\s\S]*functional correctness/i);
389
388
  assert.match(performanceDocsSource, /exact 30 FPS packet cadence[\s\S]*functional proof/i);
390
- assert.match(performanceDocsSource, /coherent (?:user-visible )?delivery batch/i);
389
+ assert.match(performanceDocsSource, /first product delivery/i);
391
390
  assert.match(performanceDocsSource, /verify:delivery/);
392
- assert.match(performanceDocsSource, /immediately previous successful delivery/i);
391
+ assert.match(
392
+ performanceDocsSource,
393
+ /repeated bare `verify:delivery` exits before inventory, build, tests, export, and performance work/i,
394
+ );
393
395
  assert.match(performanceDocsSource, /performance-iteration/);
394
396
  assert.match(performanceDocsSource, /renderScaleCoverage/);
395
397
  assert.match(performanceDocsSource, /canvas-render-scale-backing/);
@@ -416,15 +418,15 @@ export async function assertGeneratedDocs(targetDir) {
416
418
  assert.match(performanceDocsSource, /Use bare `npm run verify:delivery` once/i);
417
419
  assert.match(
418
420
  workflowDocsSource,
419
- /immediate previous and current semantic functional proof models/i,
421
+ /Later ordinary edits:[^\n]*exact unit\/component test[^\n]*npm run test:feature -- <acceptance-id>/i,
420
422
  );
421
423
  assert.match(
422
424
  workflowDocsSource,
423
- /unchanged `sourceHash` fast path does not collect the catalog, dependency graph, or functional proof model/i,
425
+ /repeated bare `npm run verify:delivery` is a protected no-op[^\n]*exits before inventory, build, tests, export, and performance work/i,
424
426
  );
425
427
  assert.match(
426
428
  workflowDocsSource,
427
- /do not rerun the aggregate, export, or performance matrix after every edit/i,
429
+ /do not rerun the aggregate, export, or performance matrix after edits/i,
428
430
  );
429
431
  assert.match(
430
432
  performanceDocsSource,
@@ -90,7 +90,7 @@ test("requires adaptive routing in every generated performance lifecycle documen
90
90
  const routingMarker =
91
91
  "<!-- toolcraft-performance-routing: localized=agent-targeted; ambiguous=one-user-facing-choice; broad=offer-targeted-or-full; full=explicit-only -->";
92
92
  const existingMarkers = [
93
- "<!-- 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 -->",
94
94
  "<!-- toolcraft-performance-iteration: authority=exact-request-evidence+canonical-path-ids; fixture=reachable-development; after-pass=return-app-to-user+stop -->",
95
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 -->",
96
96
  ].join("\n");
@@ -21,7 +21,7 @@ export const staleAnimationDerivedVideoPattern = new RegExp(
21
21
  );
22
22
 
23
23
  const generatedPerformanceLifecycleMarkers = [
24
- "<!-- toolcraft-performance-lifecycle: first-delivery=functional; later-delivery=functional-targeted; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only -->",
24
+ "<!-- toolcraft-performance-lifecycle: first-delivery=functional-complete; later-edits=focused-only; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only -->",
25
25
  "<!-- toolcraft-performance-iteration: authority=exact-request-evidence+canonical-path-ids; fixture=reachable-development; after-pass=return-app-to-user+stop -->",
26
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
27
  "<!-- toolcraft-performance-routing: localized=agent-targeted; ambiguous=one-user-facing-choice; broad=offer-targeted-or-full; full=explicit-only -->",
@@ -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
+ }