@hatiolab/figure-model 0.1.92 → 0.1.94

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 (320) hide show
  1. package/CHANGELOG.md +12 -12
  2. package/README.md +25 -25
  3. package/dist/{v3-asset-types.d.ts → asset-types.d.ts} +73 -67
  4. package/dist/asset-types.d.ts.map +1 -0
  5. package/dist/asset-types.js +2 -0
  6. package/dist/asset-types.js.map +1 -0
  7. package/dist/asset.d.ts +20 -0
  8. package/dist/asset.d.ts.map +1 -0
  9. package/dist/{v3-asset.js → asset.js} +49 -28
  10. package/dist/asset.js.map +1 -0
  11. package/dist/{v3-authoring-actions.d.ts → authoring-actions.d.ts} +77 -66
  12. package/dist/authoring-actions.d.ts.map +1 -0
  13. package/dist/{v3-authoring-actions.js → authoring-actions.js} +129 -104
  14. package/dist/authoring-actions.js.map +1 -0
  15. package/dist/{v3-authoring-session.d.ts → authoring-session.d.ts} +23 -21
  16. package/dist/authoring-session.d.ts.map +1 -0
  17. package/dist/{v3-authoring-session.js → authoring-session.js} +4 -4
  18. package/dist/authoring-session.js.map +1 -0
  19. package/dist/capabilities.d.ts +3 -0
  20. package/dist/capabilities.d.ts.map +1 -0
  21. package/dist/{v3-capabilities.js → capabilities.js} +8 -8
  22. package/dist/capabilities.js.map +1 -0
  23. package/dist/clip-keeping.d.ts +30 -0
  24. package/dist/clip-keeping.d.ts.map +1 -0
  25. package/dist/clip-keeping.js +77 -0
  26. package/dist/clip-keeping.js.map +1 -0
  27. package/dist/command-preview.d.ts +125 -0
  28. package/dist/command-preview.d.ts.map +1 -0
  29. package/dist/command-preview.js +246 -0
  30. package/dist/command-preview.js.map +1 -0
  31. package/dist/contract.d.ts +7 -0
  32. package/dist/contract.d.ts.map +1 -0
  33. package/dist/contract.js +12 -0
  34. package/dist/contract.js.map +1 -0
  35. package/dist/{v3-cost.d.ts → cost.d.ts} +5 -5
  36. package/dist/cost.d.ts.map +1 -0
  37. package/dist/{v3-cost.js → cost.js} +11 -11
  38. package/dist/cost.js.map +1 -0
  39. package/dist/{v3-create.d.ts → create.d.ts} +8 -8
  40. package/dist/{v3-create.d.ts.map → create.d.ts.map} +1 -1
  41. package/dist/{v3-create.js → create.js} +26 -26
  42. package/dist/create.js.map +1 -0
  43. package/dist/document.d.ts +5 -0
  44. package/dist/document.d.ts.map +1 -0
  45. package/dist/document.js +31 -0
  46. package/dist/document.js.map +1 -0
  47. package/dist/{v3-driver.d.ts → driver.d.ts} +10 -10
  48. package/dist/driver.d.ts.map +1 -0
  49. package/dist/{v3-driver.js → driver.js} +10 -10
  50. package/dist/driver.js.map +1 -0
  51. package/dist/{v3-editor-workspace.d.ts → editor-workspace.d.ts} +99 -73
  52. package/dist/editor-workspace.d.ts.map +1 -0
  53. package/dist/{v3-editor-workspace.js → editor-workspace.js} +48 -32
  54. package/dist/editor-workspace.js.map +1 -0
  55. package/dist/{v3-examples.d.ts → examples.d.ts} +5 -5
  56. package/dist/examples.d.ts.map +1 -0
  57. package/dist/{v3-examples.js → examples.js} +11 -11
  58. package/dist/examples.js.map +1 -0
  59. package/dist/{v3-follow.d.ts → follow.d.ts} +5 -5
  60. package/dist/follow.d.ts.map +1 -0
  61. package/dist/{v3-follow.js → follow.js} +2 -2
  62. package/dist/follow.js.map +1 -0
  63. package/dist/{v3-gate.d.ts → gate.d.ts} +36 -28
  64. package/dist/gate.d.ts.map +1 -0
  65. package/dist/{v3-gate.js → gate.js} +54 -48
  66. package/dist/gate.js.map +1 -0
  67. package/dist/{v3-graph-types.d.ts → graph-types.d.ts} +33 -33
  68. package/dist/graph-types.d.ts.map +1 -0
  69. package/dist/graph-types.js +2 -0
  70. package/dist/graph-types.js.map +1 -0
  71. package/dist/{v3-graph.d.ts → graph.d.ts} +14 -14
  72. package/dist/graph.d.ts.map +1 -0
  73. package/dist/{v3-graph.js → graph.js} +16 -16
  74. package/dist/graph.js.map +1 -0
  75. package/dist/index.d.ts +39 -33
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +39 -33
  78. package/dist/index.js.map +1 -1
  79. package/dist/{v3-instance-size.d.ts → instance-size.d.ts} +14 -14
  80. package/dist/instance-size.d.ts.map +1 -0
  81. package/dist/{v3-instance-size.js → instance-size.js} +13 -13
  82. package/dist/instance-size.js.map +1 -0
  83. package/dist/json.d.ts +12 -0
  84. package/dist/json.d.ts.map +1 -0
  85. package/dist/{v3-json.js → json.js} +13 -13
  86. package/dist/json.js.map +1 -0
  87. package/dist/kernel-version.d.ts +8 -0
  88. package/dist/kernel-version.d.ts.map +1 -0
  89. package/dist/{v3-kernel-version.js → kernel-version.js} +4 -4
  90. package/dist/kernel-version.js.map +1 -0
  91. package/dist/{v3-part-edit.d.ts → part-edit.d.ts} +12 -11
  92. package/dist/part-edit.d.ts.map +1 -0
  93. package/dist/{v3-part-edit.js → part-edit.js} +84 -68
  94. package/dist/part-edit.js.map +1 -0
  95. package/dist/proposal.d.ts +55 -0
  96. package/dist/proposal.d.ts.map +1 -0
  97. package/dist/{v3-proposal.js → proposal.js} +29 -21
  98. package/dist/proposal.js.map +1 -0
  99. package/dist/{v3-public-inputs.d.ts → public-inputs.d.ts} +4 -4
  100. package/dist/public-inputs.d.ts.map +1 -0
  101. package/dist/{v3-public-inputs.js → public-inputs.js} +3 -3
  102. package/dist/public-inputs.js.map +1 -0
  103. package/dist/recipe-build.d.ts +27 -0
  104. package/dist/recipe-build.d.ts.map +1 -0
  105. package/dist/{v3-recipe-build.js → recipe-build.js} +9 -9
  106. package/dist/recipe-build.js.map +1 -0
  107. package/dist/recipe-from-parts.d.ts +8 -0
  108. package/dist/recipe-from-parts.d.ts.map +1 -0
  109. package/dist/{v3-recipe-from-parts.js → recipe-from-parts.js} +9 -9
  110. package/dist/recipe-from-parts.js.map +1 -0
  111. package/dist/{v3-recipe.d.ts → recipe.d.ts} +25 -25
  112. package/dist/recipe.d.ts.map +1 -0
  113. package/dist/{v3-recipe.js → recipe.js} +30 -30
  114. package/dist/recipe.js.map +1 -0
  115. package/dist/release-contract.d.ts +19 -0
  116. package/dist/release-contract.d.ts.map +1 -0
  117. package/dist/{v3-release-contract.js → release-contract.js} +8 -7
  118. package/dist/release-contract.js.map +1 -0
  119. package/dist/{v3-render-batches.d.ts → render-batches.d.ts} +8 -8
  120. package/dist/render-batches.d.ts.map +1 -0
  121. package/dist/{v3-render-batches.js → render-batches.js} +4 -4
  122. package/dist/render-batches.js.map +1 -0
  123. package/dist/resize-plan.d.ts +61 -0
  124. package/dist/resize-plan.d.ts.map +1 -0
  125. package/dist/resize-plan.js +189 -0
  126. package/dist/resize-plan.js.map +1 -0
  127. package/dist/room.d.ts +53 -0
  128. package/dist/room.d.ts.map +1 -0
  129. package/dist/room.js +90 -0
  130. package/dist/room.js.map +1 -0
  131. package/dist/{v3-score.d.ts → score.d.ts} +19 -19
  132. package/dist/score.d.ts.map +1 -0
  133. package/dist/{v3-score.js → score.js} +32 -32
  134. package/dist/score.js.map +1 -0
  135. package/dist/shape-provider.d.ts +37 -0
  136. package/dist/shape-provider.d.ts.map +1 -0
  137. package/dist/shape-provider.js +69 -0
  138. package/dist/shape-provider.js.map +1 -0
  139. package/dist/{v3-shape-sampling.d.ts → shape-sampling.d.ts} +4 -4
  140. package/dist/shape-sampling.d.ts.map +1 -0
  141. package/dist/{v3-shape-sampling.js → shape-sampling.js} +3 -3
  142. package/dist/shape-sampling.js.map +1 -0
  143. package/dist/size-edit.d.ts +38 -0
  144. package/dist/size-edit.d.ts.map +1 -0
  145. package/dist/size-edit.js +178 -0
  146. package/dist/size-edit.js.map +1 -0
  147. package/dist/{v3-surface.d.ts → surface.d.ts} +5 -5
  148. package/dist/surface.d.ts.map +1 -0
  149. package/dist/{v3-surface.js → surface.js} +7 -7
  150. package/dist/surface.js.map +1 -0
  151. package/dist/{v3-words.d.ts → words.d.ts} +3 -3
  152. package/dist/words.d.ts.map +1 -0
  153. package/dist/{v3-words.js → words.js} +3 -3
  154. package/dist/words.js.map +1 -0
  155. package/docs/{assembly-constraints-v3.md → assembly-constraints.md} +1 -1
  156. package/docs/{v3-asset-persistence.md → asset-persistence.md} +8 -8
  157. package/docs/{v3-authoring-transactions.md → authoring-transactions.md} +2 -2
  158. package/docs/{v3-capability-bindings.md → capability-bindings.md} +8 -8
  159. package/docs/{v3-common-kernel-experiment.md → common-kernel-experiment.md} +4 -4
  160. package/docs/{v3-core-semantics.md → core-semantics.md} +5 -5
  161. package/docs/{v3-cutover.md → cutover.md} +4 -4
  162. package/docs/{v3-design.md → design.md} +11 -11
  163. package/docs/{v3-document-contract.md → document-contract.md} +9 -9
  164. package/docs/{v3-dryroom-profile-validation.md → dryroom-profile-validation.md} +4 -4
  165. package/docs/{v3-editor-integration.md → editor-integration.md} +6 -6
  166. package/docs/{v3-full-conveyor-validation.md → full-conveyor-validation.md} +4 -4
  167. package/docs/{v3-full-dryroom-validation.md → full-dryroom-validation.md} +4 -4
  168. package/docs/{v3-full-forklift-validation.md → full-forklift-validation.md} +5 -5
  169. package/docs/{v3-full-robot-validation.md → full-robot-validation.md} +4 -4
  170. package/docs/{v3-layout-system.md → layout-system.md} +4 -4
  171. package/docs/{v3-legacy-risk-audit-2026-09-23.md → legacy-risk-audit-2026-09-23.md} +5 -5
  172. package/docs/{v3-minimal-model.md → minimal-model.md} +6 -6
  173. package/docs/{v3-motion-contract.md → motion-contract.md} +3 -3
  174. package/docs/{v3-openusd-review.md → openusd-review.md} +8 -8
  175. package/docs/{v3-operator-contracts.md → operator-contracts.md} +6 -6
  176. package/docs/{v3-payload-collision-validation.md → payload-collision-validation.md} +4 -4
  177. package/docs/{v3-payload-contact-validation.md → payload-contact-validation.md} +5 -5
  178. package/docs/prototypes/README.md +10 -10
  179. package/docs/prototypes/{v3-asset-samples.mjs → asset-samples.mjs} +6 -6
  180. package/docs/prototypes/{v3-asset-store.mjs → asset-store.mjs} +3 -3
  181. package/docs/prototypes/{v3-asset-store.test.mjs → asset-store.test.mjs} +6 -6
  182. package/docs/prototypes/asset.mjs +1 -0
  183. package/docs/prototypes/{v3-asset.schema.json → asset.schema.json} +2 -2
  184. package/docs/prototypes/{v3-asset.test.mjs → asset.test.mjs} +10 -10
  185. package/docs/prototypes/authoring-session.mjs +1 -0
  186. package/docs/prototypes/{v3-authoring-session.test.mjs → authoring-session.test.mjs} +6 -6
  187. package/docs/prototypes/capability-plan.mjs +1 -0
  188. package/docs/prototypes/{v3-capability-plan.test.mjs → capability-plan.test.mjs} +5 -5
  189. package/docs/prototypes/{v3-capability-samples.mjs → capability-samples.mjs} +2 -2
  190. package/docs/prototypes/document.mjs +2 -0
  191. package/docs/prototypes/{v3-document.schema.json → document.schema.json} +1 -1
  192. package/docs/prototypes/{v3-document.test.mjs → document.test.mjs} +7 -7
  193. package/docs/prototypes/{v3-dryroom-mesh.mjs → dryroom-mesh.mjs} +1 -1
  194. package/docs/prototypes/{v3-dryroom-mesh.test.mjs → dryroom-mesh.test.mjs} +1 -1
  195. package/docs/prototypes/{v3-editor-browser.mjs → editor-browser.mjs} +13 -13
  196. package/docs/prototypes/editor-workspace.mjs +1 -0
  197. package/docs/prototypes/{v3-editor-workspace.test.mjs → editor-workspace.test.mjs} +3 -3
  198. package/docs/prototypes/{v3-feature-pattern.test.mjs → feature-pattern.test.mjs} +1 -1
  199. package/docs/prototypes/{v3-full-conveyor.mjs → full-conveyor.mjs} +2 -2
  200. package/docs/prototypes/{v3-full-conveyor.test.mjs → full-conveyor.test.mjs} +3 -3
  201. package/docs/prototypes/{v3-full-dryroom.mjs → full-dryroom.mjs} +2 -2
  202. package/docs/prototypes/{v3-full-dryroom.test.mjs → full-dryroom.test.mjs} +3 -3
  203. package/docs/prototypes/{v3-full-forklift.mjs → full-forklift.mjs} +2 -2
  204. package/docs/prototypes/{v3-full-forklift.test.mjs → full-forklift.test.mjs} +3 -3
  205. package/docs/prototypes/{v3-full-robot.mjs → full-robot.mjs} +2 -2
  206. package/docs/prototypes/{v3-full-robot.test.mjs → full-robot.test.mjs} +4 -4
  207. package/docs/prototypes/{v3-kernel.test.mjs → kernel.test.mjs} +1 -1
  208. package/docs/prototypes/{v3-layout.test.mjs → layout.test.mjs} +1 -1
  209. package/docs/prototypes/{v3-more-samples.test.mjs → more-samples.test.mjs} +2 -2
  210. package/docs/prototypes/{v3-payload-collision.mjs → payload-collision.mjs} +2 -2
  211. package/docs/prototypes/{v3-payload-collision.test.mjs → payload-collision.test.mjs} +3 -3
  212. package/docs/prototypes/{v3-payload-fit.mjs → payload-fit.mjs} +2 -2
  213. package/docs/prototypes/{v3-payload-fit.test.mjs → payload-fit.test.mjs} +4 -4
  214. package/docs/prototypes/render-full-dryroom.mjs +12 -12
  215. package/docs/prototypes/{v3-repeated-binding.mjs → repeated-binding.mjs} +1 -1
  216. package/docs/prototypes/{v3-repeated-binding.test.mjs → repeated-binding.test.mjs} +6 -6
  217. package/docs/prototypes/{v3-runtime-browser.mjs → runtime-browser.mjs} +26 -26
  218. package/docs/prototypes/{v3-samples.test.mjs → samples.test.mjs} +1 -1
  219. package/docs/prototypes/{v3-spatial-plan.test.mjs → spatial-plan.test.mjs} +1 -1
  220. package/docs/prototypes/typed-plan.mjs +3 -0
  221. package/docs/prototypes/{v3-typed-plan.test.mjs → typed-plan.test.mjs} +1 -1
  222. package/docs/prototypes/{v3-typed-repeat.test.mjs → typed-repeat.test.mjs} +2 -2
  223. package/docs/{v3-repeated-binding-validation.md → repeated-binding-validation.md} +4 -4
  224. package/docs/{v3-research-review.md → research-review.md} +2 -2
  225. package/docs/{v3-review-2026-09-22.md → review-2026-09-22.md} +10 -10
  226. package/docs/{v3-runtime-extraction.md → runtime-extraction.md} +16 -16
  227. package/docs/{v3-sample-validation-expanded.md → sample-validation-expanded.md} +5 -5
  228. package/docs/{v3-sample-validation.md → sample-validation.md} +3 -3
  229. package/docs/{v3-shape-dimension-contract.md → shape-dimension-contract.md} +12 -12
  230. package/docs/{v3-shapeassembly-reproduction.md → shapeassembly-reproduction.md} +4 -4
  231. package/docs/{v3-spatial-contracts.md → spatial-contracts.md} +5 -5
  232. package/docs/status.md +12 -0
  233. package/docs/{v3-storage-integration.md → storage-integration.md} +5 -5
  234. package/docs/{v3-typed-repeat-contracts.md → typed-repeat-contracts.md} +3 -3
  235. package/package.json +3 -3
  236. package/dist/v3-asset-types.d.ts.map +0 -1
  237. package/dist/v3-asset-types.js +0 -2
  238. package/dist/v3-asset-types.js.map +0 -1
  239. package/dist/v3-asset.d.ts +0 -8
  240. package/dist/v3-asset.d.ts.map +0 -1
  241. package/dist/v3-asset.js.map +0 -1
  242. package/dist/v3-authoring-actions.d.ts.map +0 -1
  243. package/dist/v3-authoring-actions.js.map +0 -1
  244. package/dist/v3-authoring-session.d.ts.map +0 -1
  245. package/dist/v3-authoring-session.js.map +0 -1
  246. package/dist/v3-capabilities.d.ts +0 -3
  247. package/dist/v3-capabilities.d.ts.map +0 -1
  248. package/dist/v3-capabilities.js.map +0 -1
  249. package/dist/v3-contract.d.ts +0 -7
  250. package/dist/v3-contract.d.ts.map +0 -1
  251. package/dist/v3-contract.js +0 -12
  252. package/dist/v3-contract.js.map +0 -1
  253. package/dist/v3-cost.d.ts.map +0 -1
  254. package/dist/v3-cost.js.map +0 -1
  255. package/dist/v3-create.js.map +0 -1
  256. package/dist/v3-document.d.ts +0 -5
  257. package/dist/v3-document.d.ts.map +0 -1
  258. package/dist/v3-document.js +0 -31
  259. package/dist/v3-document.js.map +0 -1
  260. package/dist/v3-driver.d.ts.map +0 -1
  261. package/dist/v3-driver.js.map +0 -1
  262. package/dist/v3-editor-workspace.d.ts.map +0 -1
  263. package/dist/v3-editor-workspace.js.map +0 -1
  264. package/dist/v3-examples.d.ts.map +0 -1
  265. package/dist/v3-examples.js.map +0 -1
  266. package/dist/v3-follow.d.ts.map +0 -1
  267. package/dist/v3-follow.js.map +0 -1
  268. package/dist/v3-gate.d.ts.map +0 -1
  269. package/dist/v3-gate.js.map +0 -1
  270. package/dist/v3-graph-types.d.ts.map +0 -1
  271. package/dist/v3-graph-types.js +0 -2
  272. package/dist/v3-graph-types.js.map +0 -1
  273. package/dist/v3-graph.d.ts.map +0 -1
  274. package/dist/v3-graph.js.map +0 -1
  275. package/dist/v3-instance-size.d.ts.map +0 -1
  276. package/dist/v3-instance-size.js.map +0 -1
  277. package/dist/v3-json.d.ts +0 -12
  278. package/dist/v3-json.d.ts.map +0 -1
  279. package/dist/v3-json.js.map +0 -1
  280. package/dist/v3-kernel-version.d.ts +0 -8
  281. package/dist/v3-kernel-version.d.ts.map +0 -1
  282. package/dist/v3-kernel-version.js.map +0 -1
  283. package/dist/v3-part-edit.d.ts.map +0 -1
  284. package/dist/v3-part-edit.js.map +0 -1
  285. package/dist/v3-proposal.d.ts +0 -42
  286. package/dist/v3-proposal.d.ts.map +0 -1
  287. package/dist/v3-proposal.js.map +0 -1
  288. package/dist/v3-public-inputs.d.ts.map +0 -1
  289. package/dist/v3-public-inputs.js.map +0 -1
  290. package/dist/v3-recipe-build.d.ts +0 -27
  291. package/dist/v3-recipe-build.d.ts.map +0 -1
  292. package/dist/v3-recipe-build.js.map +0 -1
  293. package/dist/v3-recipe-from-parts.d.ts +0 -8
  294. package/dist/v3-recipe-from-parts.d.ts.map +0 -1
  295. package/dist/v3-recipe-from-parts.js.map +0 -1
  296. package/dist/v3-recipe.d.ts.map +0 -1
  297. package/dist/v3-recipe.js.map +0 -1
  298. package/dist/v3-release-contract.d.ts +0 -19
  299. package/dist/v3-release-contract.d.ts.map +0 -1
  300. package/dist/v3-release-contract.js.map +0 -1
  301. package/dist/v3-render-batches.d.ts.map +0 -1
  302. package/dist/v3-render-batches.js.map +0 -1
  303. package/dist/v3-score.d.ts.map +0 -1
  304. package/dist/v3-score.js.map +0 -1
  305. package/dist/v3-shape-sampling.d.ts.map +0 -1
  306. package/dist/v3-shape-sampling.js.map +0 -1
  307. package/dist/v3-surface.d.ts.map +0 -1
  308. package/dist/v3-surface.js.map +0 -1
  309. package/dist/v3-words.d.ts.map +0 -1
  310. package/dist/v3-words.js.map +0 -1
  311. package/docs/prototypes/v3-asset.mjs +0 -1
  312. package/docs/prototypes/v3-authoring-session.mjs +0 -1
  313. package/docs/prototypes/v3-capability-plan.mjs +0 -1
  314. package/docs/prototypes/v3-document.mjs +0 -2
  315. package/docs/prototypes/v3-editor-workspace.mjs +0 -1
  316. package/docs/prototypes/v3-typed-plan.mjs +0 -3
  317. package/docs/v3-status.md +0 -50
  318. /package/docs/prototypes/{v3-kernel.mjs → kernel.mjs} +0 -0
  319. /package/docs/prototypes/{v3-linear-comparison.py → linear-comparison.py} +0 -0
  320. /package/docs/prototypes/{v3-semantics.test.mjs → semantics.test.mjs} +0 -0
@@ -1,9 +1,9 @@
1
1
  /*
2
- * Figures authored in V3 terms, with the commands the modeller and the AI share -- examples, acceptance tests of the
2
+ * Figures authored in terms, with the commands the modeller and the AI share -- examples, acceptance tests of the
3
3
  * authoring language, and the seeds a new domain starts with.
4
4
  */
5
- import { applyV3Authoring, proposeV3Occupancy } from "./v3-authoring-actions.js";
6
- import { addV3Primitive, createV3Asset } from "./v3-create.js";
5
+ import { applyFigureAuthoring, proposeFigureOccupancy } from "./authoring-actions.js";
6
+ import { addFigurePrimitive, createFigureAsset } from "./create.js";
7
7
  const box = (id, width, height, depth, token = 'palette.primary') => ({ id, kind: 'box', dimensions: { width, height, depth }, position: { x: 0, y: 0, z: 0 }, material: { token, preset: 'metal' } });
8
8
  const cylinder = (id, radius, length, token = 'palette.dark') => ({ id, kind: 'cylinder', dimensions: { radius, length }, position: { x: 0, y: 0, z: 0 }, material: { token, preset: 'metal' } });
9
9
  /** The chain, from the floor up: each part's bottom on the top of the one before. */
@@ -23,11 +23,11 @@ export const ROBOT_ARM_CHAIN = [
23
23
  * A six-axis arm: each link joined to the one before at a joint, which is the one relation the arm needs; every size is
24
24
  * the part's own number. The room it takes is worked out.
25
25
  */
26
- export function robotArmV3() {
27
- let asset = createV3Asset('6축 로봇암');
26
+ export function robotArmFigure() {
27
+ let asset = createFigureAsset('6축 로봇암');
28
28
  asset.palette = { 'palette.primary': '#477b9e', 'palette.dark': '#2b2b2b', 'palette.accent': '#f79c40', 'palette.neutral': '#9a9a9a' };
29
- const run = (action) => (asset = applyV3Authoring(asset, action));
30
- ROBOT_ARM_CHAIN.forEach(({ part }) => (asset = addV3Primitive(asset, part)));
29
+ const run = (action) => (asset = applyFigureAuthoring(asset, action));
30
+ ROBOT_ARM_CHAIN.forEach(({ part }) => (asset = addFigurePrimitive(asset, part)));
31
31
  run({ kind: 'set-joint', joint: { id: 'base', type: 'fixed', body0: { plane: 'mounting-plane' }, body1: { part: 'base', face: 'bottom' } } });
32
32
  ROBOT_ARM_CHAIN.forEach(({ part, joint }, i) => {
33
33
  if (i === 0)
@@ -41,12 +41,12 @@ export function robotArmV3() {
41
41
  run({ kind: 'set-joint', joint: { id: joint.id, type: 'revolute', ...hang, axis: joint.axis, lowerLimit: joint.min, upperLimit: joint.max } });
42
42
  });
43
43
  /* Two fingers on the gripper's top, at its two ends, closing towards each other from one value (0..45 mm): the right one mimics. */
44
- asset = addV3Primitive(asset, box('finger-left', 20, 90, 40, 'palette.neutral'));
45
- asset = addV3Primitive(asset, box('finger-right', 20, 90, 40, 'palette.neutral'));
44
+ asset = addFigurePrimitive(asset, box('finger-left', 20, 90, 40, 'palette.neutral'));
45
+ asset = addFigurePrimitive(asset, box('finger-right', 20, 90, 40, 'palette.neutral'));
46
46
  run({ kind: 'set-joint', joint: { id: 'gripper', type: 'prismatic', body0: { part: 'gripper', face: 'top' }, body1: { part: 'finger-left', face: 'bottom' }, origin: { align: { x: 'min' } }, axis: 'X', lowerLimit: 0, upperLimit: 45 } });
47
47
  run({ kind: 'set-joint', joint: { id: 'gripper-mirror', type: 'prismatic', body0: { part: 'gripper', face: 'top' }, body1: { part: 'finger-right', face: 'bottom' }, origin: { align: { x: 'max' } }, axis: 'X', mimic: { joint: 'gripper', multiplier: -1 } } });
48
48
  run({ kind: 'set-detail-level', level: 'L' });
49
- run({ kind: 'declare-occupancy', proposal: proposeV3Occupancy(asset, { over: 'range' }), placement: 'floor' });
49
+ run({ kind: 'declare-occupancy', proposal: proposeFigureOccupancy(asset, { over: 'range' }), placement: 'floor' });
50
50
  return asset;
51
51
  }
52
- //# sourceMappingURL=v3-examples.js.map
52
+ //# sourceMappingURL=examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import type { V3Asset } from './v3-asset-types.ts';
2
- import type { Axis } from './v3-words.ts';
1
+ import type { FigureAsset } from './asset-types.ts';
2
+ import type { Axis } from './words.ts';
3
3
  /** What one dimension of a part is worked out from. */
4
- export type V3Follow = {
4
+ export type FigureFollow = {
5
5
  of: 'own';
6
6
  }
7
7
  /** `times` 1 is the instance size itself; any other is a share of it. */
@@ -24,5 +24,5 @@ export type V3Follow = {
24
24
  | {
25
25
  of: 'expression';
26
26
  };
27
- export declare function v3FollowOf(asset: V3Asset, part: string, axis: Axis): V3Follow;
28
- //# sourceMappingURL=v3-follow.d.ts.map
27
+ export declare function figureFollowOf(asset: FigureAsset, part: string, axis: Axis): FigureFollow;
28
+ //# sourceMappingURL=follow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAItC,uDAAuD;AACvD,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE;AACf,yEAAyE;GACvE;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAChC,iDAAiD;GAC/C;IAAE,EAAE,EAAE,YAAY,CAAA;CAAE,CAAA;AASxB,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,YAAY,CAuDzF"}
@@ -1,5 +1,5 @@
1
1
  const AXES = ['x', 'y', 'z'];
2
- export function v3FollowOf(asset, part, axis) {
2
+ export function figureFollowOf(asset, part, axis) {
3
3
  const m = asset.document.model;
4
4
  /*
5
5
  A link routes the dimension through `<part>.dimension.<axis>`; before any link the shape reads its measure directly,
@@ -65,4 +65,4 @@ export function v3FollowOf(asset, part, axis) {
65
65
  };
66
66
  return walk(at);
67
67
  }
68
- //# sourceMappingURL=v3-follow.js.map
68
+ //# sourceMappingURL=follow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow.js","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import type { Axis, Vec3 } from './v3-words.ts';
2
- import type { V3Asset, V3Placement } from './v3-asset-types.ts';
3
- import type { V3Geometry } from './v3-graph-types.ts';
4
- import { type Point } from './v3-shape-sampling.ts';
1
+ import type { Axis, Vec3 } from './words.ts';
2
+ import type { FigureAsset, FigurePlacement } from './asset-types.ts';
3
+ import type { FigureGeometry } from './graph-types.ts';
4
+ import { type Point } from './shape-sampling.ts';
5
5
  /** One placed body in the asset frame: its centre, axis-aligned world extents and rotation. */
6
- export interface V3WorldBox {
6
+ export interface FigureWorldBox {
7
7
  part: string;
8
8
  centre: Vec3;
9
9
  /** Axis-aligned world extents, what the occupancy gate measures. */
@@ -15,25 +15,25 @@ export interface V3WorldBox {
15
15
  points?: Point[];
16
16
  }
17
17
  /** Axis-aligned world boxes of evaluated geometry. `part` is the placing node: a `place@1` id or the repeated member. */
18
- export declare function v3WorldBoxesOf(geometry: readonly V3Geometry[], writers: ReadonlyMap<string, string>, options?: {
18
+ export declare function figureWorldBoxesOf(geometry: readonly FigureGeometry[], writers: ReadonlyMap<string, string>, options?: {
19
19
  points?: boolean;
20
- }): V3WorldBox[];
20
+ }): FigureWorldBox[];
21
21
  /**
22
22
  * Every placed body including the ones that are not drawn. The declared occupancy does not shrink or grow with
23
- * visibility (V3 designer's ruling 2026-09-22), so the gate measures against this, not against the drawn set.
23
+ * visibility (designer's ruling 2026-09-22), so the gate measures against this, not against the drawn set.
24
24
  */
25
- export declare function v3OccupiedBoxesOf(geometry: readonly V3Geometry[], writers: ReadonlyMap<string, string>, options?: {
25
+ export declare function figureOccupiedBoxesOf(geometry: readonly FigureGeometry[], writers: ReadonlyMap<string, string>, options?: {
26
26
  points?: boolean;
27
- }): V3WorldBox[];
27
+ }): FigureWorldBox[];
28
28
  /**
29
29
  * How wide, tall and deep the figure's parts are, standing as they rest: the union of their boxes. The size a figure
30
30
  * is authored at -- not the room it takes, which also holds where its joints can carry its parts (a door's swing):
31
31
  * measuring that instead declared a 1100 mm door 8208 mm every way (2026-09-25).
32
32
  */
33
- export declare function v3PartsExtentOf(asset: V3Asset): Record<Axis, number>;
33
+ export declare function figurePartsExtentOf(asset: FigureAsset): Record<Axis, number>;
34
34
  /** Who writes each graph value, by node id. */
35
- export declare function v3WritersOf(asset: V3Asset): Map<string, string>;
36
- export interface V3Violation {
35
+ export declare function figureWritersOf(asset: FigureAsset): Map<string, string>;
36
+ export interface FigureViolation {
37
37
  code: 'OCCUPANCY_UNDECLARED' | 'PART_OUTSIDE_OCCUPANCY' | 'PARTS_OFF_PLACEMENT_FACE' | 'PLACEMENT_FACE_TILTED' | 'PARTS_SPLIT_ON_RESIZE' | 'SIZING_NOT_UNIFORM' | 'PUBLIC_INPUT_REFUSED';
38
38
  /** The part that is out, or the one whose face the asset declares as what it is mounted on. */
39
39
  part?: string;
@@ -61,7 +61,7 @@ export interface V3Violation {
61
61
  * them. Never a bound over the whole range.
62
62
  * defaults the caller asked for one state only
63
63
  */
64
- export interface V3Coverage {
64
+ export interface FigureCoverage {
65
65
  method: 'proven' | 'sampled' | 'defaults';
66
66
  /** The state inputs ranged over, with their bounds. */
67
67
  inputs: Array<{
@@ -75,12 +75,14 @@ export interface V3Coverage {
75
75
  sweepSteps?: number;
76
76
  /** For `sampled`: why `proven` could not be claimed. */
77
77
  unprovable?: string[];
78
+ /** `as-given`: the design values were held as the asset has them, not ranged -- this covers one size, not all. */
79
+ design?: 'as-given';
78
80
  detail: string;
79
81
  }
80
82
  /**
81
83
  * What each operator does to a value's extremes over the state box. Every operator in the kernel is listed by
82
84
  * name — no pattern, no default — so a new one has no classification until someone writes its basis down, and
83
- * `v3-state-dimension.test.ts` fails until they do.
85
+ * `state-dimension.test.ts` fails until they do.
84
86
  *
85
87
  * - `multilinear`: degree one in each state input given multilinear arguments, so the extreme sits at a corner
86
88
  * however the value is later combined. Sums; products and quotients under the conditions checked in
@@ -93,13 +95,13 @@ export interface V3Coverage {
93
95
  * keys that move or turn around, `geomean` refuses factors that share an input.
94
96
  * - `unknown`: nothing is claimed. A state-dependent argument here means the coverage falls back to sampling.
95
97
  */
96
- export declare const V3_STATE_EXTREME_BASIS: Readonly<Record<string, 'multilinear' | 'monotone' | 'unknown'>>;
98
+ export declare const FIGURE_STATE_EXTREME_BASIS: Readonly<Record<string, 'multilinear' | 'monotone' | 'unknown'>>;
97
99
  /**
98
100
  * The same basis over the design inputs a board may set (ADR-0096), which reach where state never may: a row's layout.
99
101
  * Its count is a floor -- not multilinear -- so a value that reaches a count through a public input is not proven by
100
102
  * corners (chief architect's condition, 2026-09-26: read off the table, not decided by hand).
101
103
  */
102
- export declare const V3_DESIGN_EXTREME_BASIS: Readonly<Record<string, 'multilinear' | 'monotone' | 'unknown'>>;
104
+ export declare const FIGURE_DESIGN_EXTREME_BASIS: Readonly<Record<string, 'multilinear' | 'monotone' | 'unknown'>>;
103
105
  /**
104
106
  * Why the extremes of every state-dependent coordinate lie at the corners of the state box, or why that cannot be
105
107
  * shown. The basis: a value that is multilinear in the state inputs (each input to degree one) or a monotone
@@ -110,7 +112,7 @@ export declare const V3_DESIGN_EXTREME_BASIS: Readonly<Record<string, 'multiline
110
112
  * an input. Returns the reasons it fails, empty when it holds.
111
113
  *
112
114
  * Monotone in each argument is not the same as monotone in a state input the arguments share, and a value that
113
- * is merely monotone cannot be combined further. Both were found by the V3 designer, 2026-09-23:
115
+ * is merely monotone cannot be combined further. Both were found by the designer, 2026-09-23:
114
116
  * `10 + 100·min(q, 1−q)` is widest in the middle, and `10 + 100·(√q − q)` is widest at q = ¼. The gate called
115
117
  * both proven.
116
118
  *
@@ -123,8 +125,8 @@ export declare const V3_DESIGN_EXTREME_BASIS: Readonly<Record<string, 'multiline
123
125
  * input — a sum, a product, a pose composed onto it — is refused. A new operator is bent until someone shows
124
126
  * it preserves multilinearity and adds it to the list.
125
127
  */
126
- export declare function cornerExtremalBasis(asset: V3Asset, dependence: Record<string, string[]>, basis?: Readonly<Record<string, string>>): string[];
127
- export interface V3Inspection {
128
+ export declare function cornerExtremalBasis(asset: FigureAsset, dependence: Record<string, string[]>, basis?: Readonly<Record<string, string>>): string[];
129
+ export interface FigureInspection {
128
130
  /** The declared volume as evaluated, when declared: the reach on each side of the asset origin. */
129
131
  bounds?: {
130
132
  x: {
@@ -140,24 +142,30 @@ export interface V3Inspection {
140
142
  max: number;
141
143
  };
142
144
  };
143
- placement?: V3Placement;
144
- coverage: V3Coverage;
145
- violations: V3Violation[];
145
+ placement?: FigurePlacement;
146
+ coverage: FigureCoverage;
147
+ violations: FigureViolation[];
146
148
  }
147
- export interface V3InspectOptions {
149
+ export interface FigureInspectOptions {
148
150
  /** Inspect one state only (the stored defaults plus these overrides) instead of the whole valid state range. */
149
151
  at?: Record<string, number>;
150
152
  /** Points along each input's sweep when a rotation depends on state. Default 9. */
151
153
  sweepSteps?: number;
152
154
  /** Corner enumeration is capped: above this many state inputs the corners are sampled, not enumerated. */
153
155
  maxCornerInputs?: number;
156
+ /**
157
+ * `range` (the default, and what release asks): every design value a board may set -- the instance size, and the
158
+ * inputs the figure publishes -- over its whole range, crossed with the states. `as-given`: the states only, at the
159
+ * design values the asset holds -- "at this size, every pose" -- a different question, and said so in the coverage.
160
+ */
161
+ design?: 'range' | 'as-given';
154
162
  }
155
163
  /**
156
164
  * Inspect an asset against its declared occupancy. Without `at`, the whole valid state range is covered: every
157
165
  * state input at its bounds (and, when a rotation depends on state, along its sweep), and a violation found at any
158
166
  * evaluated state is a violation. The occupancy is never widened to make one go away.
159
167
  */
160
- export declare function inspectV3Asset(asset: V3Asset, options?: V3InspectOptions | Record<string, number>): V3Inspection;
168
+ export declare function inspectFigureAsset(asset: FigureAsset, options?: FigureInspectOptions | Record<string, number>): FigureInspection;
161
169
  /**
162
170
  * Parts that touch at the drawn size must still touch when the figure is resized. The gate once had no such check, and
163
171
  * DRY_ROOM was published with its lamp 2300 mm above the frame at twice the height (2026-09-24).
@@ -167,7 +175,7 @@ export declare function inspectV3Asset(asset: V3Asset, options?: V3InspectOption
167
175
  * the pieces are the drawn bodies whose boxes touch within `SKIN`. A figure already in
168
176
  * several pieces at its drawn size is not refused for that — only for falling into more.
169
177
  */
170
- export declare function splitsOnResize(asset: V3Asset): V3Violation[];
178
+ export declare function splitsOnResize(asset: FigureAsset): FigureViolation[];
171
179
  /**
172
180
  * A figure that declares it grows by one ratio (`sizing: 'uniform'`) must do so: at each of the gate's resizes, every drawn
173
181
  * body is the body at the drawn size scaled by u -- the geometric mean of the axes' factors -- about the figure's
@@ -175,5 +183,5 @@ export declare function splitsOnResize(asset: V3Asset): V3Violation[];
175
183
  * that keeps a fixed number of its own, or reads a size some other way, is named. One finding: the first resize at
176
184
  * which any part fails, with every part that fails there.
177
185
  */
178
- export declare function notUniformOnResize(asset: V3Asset): V3Violation[];
179
- //# sourceMappingURL=v3-gate.d.ts.map
186
+ export declare function notUniformOnResize(asset: FigureAsset): FigureViolation[];
187
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"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"}
@@ -10,28 +10,28 @@
10
10
  *
11
11
  * These are violations, not compile errors: the asset is valid and can be saved, and the release door refuses it
12
12
  * (ADR-0044 decision ②). The closed list of capability names (ADR-0051 ④) is a compile error
13
- * in `v3-capabilities.ts`, because a name the scene does not know cannot be drawn at all.
13
+ * in `capabilities.ts`, because a name the scene does not know cannot be drawn at all.
14
14
  *
15
- * The rules are measured on the evaluated geometry, with one contact tolerance (`SKIN`, `v3-words.ts`).
15
+ * The rules are measured on the evaluated geometry, with one contact tolerance (`SKIN`, `words.ts`).
16
16
  *
17
17
  * The volume is declared, not measured (ADR-0044 decision ①): an asset that fills less than its `occupancy` is
18
18
  * fine. An asset with no `occupancy` cannot be released, because nothing says how big it is on a board.
19
19
  */
20
- import { compileV3Asset } from "./v3-asset.js";
21
- import { compileV3Graph } from "./v3-graph.js";
22
- import { resolveV3Surface, evaluateV3Surface } from "./v3-surface.js";
23
- import { AXES, SKIN } from "./v3-words.js";
20
+ import { compileFigureAsset, figurePlacementOf, upgradeFigurePlacement } from "./asset.js";
21
+ import { compileFigureGraph } from "./graph.js";
22
+ import { resolveFigureSurface, evaluateFigureSurface } from "./surface.js";
23
+ import { AXES, SKIN } from "./words.js";
24
24
  /** How far a declared mounting face may lean off the plane before it is not that plane any more. */
25
25
  const CONTACT_TILT_DEG = 0.1;
26
- import { transformPoints, v3ShapePoints } from "./v3-shape-sampling.js";
26
+ import { transformPoints, figureShapePoints } from "./shape-sampling.js";
27
27
  /** Axis-aligned world boxes of evaluated geometry. `part` is the placing node: a `place@1` id or the repeated member. */
28
- export function v3WorldBoxesOf(geometry, writers, options = {}) {
28
+ export function figureWorldBoxesOf(geometry, writers, options = {}) {
29
29
  const out = [];
30
30
  for (const g of geometry) {
31
31
  if (!('pose' in g))
32
32
  continue;
33
33
  // A part whose visibility flag is off is not drawn, so it is not a drawn body here. It is still evaluated and
34
- // still placed; `v3OccupiedBoxesOf` is the reader that wants it (the occupancy does not move with visibility).
34
+ // still placed; `figureOccupiedBoxesOf` is the reader that wants it (the occupancy does not move with visibility).
35
35
  if (g.visible === false)
36
36
  continue;
37
37
  const part = g.key ? writers.get(g.key) : g.id;
@@ -85,26 +85,26 @@ export function v3WorldBoxesOf(geometry, writers, options = {}) {
85
85
  rotation: r
86
86
  };
87
87
  if (options.points)
88
- box.points = transformPoints(v3ShapePoints(g.shape, g.segments), r, g.pose.t);
88
+ box.points = transformPoints(figureShapePoints(g.shape, g.segments), r, g.pose.t);
89
89
  out.push(box);
90
90
  }
91
91
  return out;
92
92
  }
93
93
  /**
94
94
  * Every placed body including the ones that are not drawn. The declared occupancy does not shrink or grow with
95
- * visibility (V3 designer's ruling 2026-09-22), so the gate measures against this, not against the drawn set.
95
+ * visibility (designer's ruling 2026-09-22), so the gate measures against this, not against the drawn set.
96
96
  */
97
- export function v3OccupiedBoxesOf(geometry, writers, options = {}) {
98
- return v3WorldBoxesOf(geometry.map(g => ('pose' in g ? { ...g, visible: true } : g)), writers, options);
97
+ export function figureOccupiedBoxesOf(geometry, writers, options = {}) {
98
+ return figureWorldBoxesOf(geometry.map(g => ('pose' in g ? { ...g, visible: true } : g)), writers, options);
99
99
  }
100
100
  /**
101
101
  * How wide, tall and deep the figure's parts are, standing as they rest: the union of their boxes. The size a figure
102
102
  * is authored at -- not the room it takes, which also holds where its joints can carry its parts (a door's swing):
103
103
  * measuring that instead declared a 1100 mm door 8208 mm every way (2026-09-25).
104
104
  */
105
- export function v3PartsExtentOf(asset) {
106
- const evaluated = compileV3Asset(asset).evaluate();
107
- const boxes = v3OccupiedBoxesOf(evaluated.geometry, v3WritersOf(asset));
105
+ export function figurePartsExtentOf(asset) {
106
+ const evaluated = compileFigureAsset(asset).evaluate();
107
+ const boxes = figureOccupiedBoxesOf(evaluated.geometry, figureWritersOf(asset));
108
108
  const out = {};
109
109
  AXES.forEach(axis => {
110
110
  const lo = Math.min(...boxes.map(b => b.centre[axis] - b.extent[axis] / 2));
@@ -114,7 +114,7 @@ export function v3PartsExtentOf(asset) {
114
114
  return out;
115
115
  }
116
116
  /** Who writes each graph value, by node id. */
117
- export function v3WritersOf(asset) {
117
+ export function figureWritersOf(asset) {
118
118
  const writers = new Map();
119
119
  for (const n of asset.document.model.nodes)
120
120
  for (const ref of Object.values(n.outputs))
@@ -124,7 +124,7 @@ export function v3WritersOf(asset) {
124
124
  /**
125
125
  * What each operator does to a value's extremes over the state box. Every operator in the kernel is listed by
126
126
  * name — no pattern, no default — so a new one has no classification until someone writes its basis down, and
127
- * `v3-state-dimension.test.ts` fails until they do.
127
+ * `state-dimension.test.ts` fails until they do.
128
128
  *
129
129
  * - `multilinear`: degree one in each state input given multilinear arguments, so the extreme sits at a corner
130
130
  * however the value is later combined. Sums; products and quotients under the conditions checked in
@@ -137,7 +137,7 @@ export function v3WritersOf(asset) {
137
137
  * keys that move or turn around, `geomean` refuses factors that share an input.
138
138
  * - `unknown`: nothing is claimed. A state-dependent argument here means the coverage falls back to sampling.
139
139
  */
140
- export const V3_STATE_EXTREME_BASIS = Object.freeze({
140
+ export const FIGURE_STATE_EXTREME_BASIS = Object.freeze({
141
141
  'add@1': 'multilinear',
142
142
  'mul@1': 'multilinear',
143
143
  'div@1': 'multilinear',
@@ -188,16 +188,19 @@ export const V3_STATE_EXTREME_BASIS = Object.freeze({
188
188
  * Its count is a floor -- not multilinear -- so a value that reaches a count through a public input is not proven by
189
189
  * corners (chief architect's condition, 2026-09-26: read off the table, not decided by hand).
190
190
  */
191
- export const V3_DESIGN_EXTREME_BASIS = Object.freeze({
192
- ...V3_STATE_EXTREME_BASIS,
191
+ export const FIGURE_DESIGN_EXTREME_BASIS = Object.freeze({
192
+ ...FIGURE_STATE_EXTREME_BASIS,
193
193
  'fit-pitch@1': 'unknown',
194
194
  'fixed-count@1': 'unknown'
195
195
  });
196
196
  /** The design inputs the gate ranges: the public ones, and with them the instance size, whose combination is the case. */
197
+ /*
198
+ * The design values a board may set: the instance size always -- any figure may be placed at any size its range
199
+ * allows -- and the inputs it publishes, crossed with it. The size was left out for a figure with no published input,
200
+ * so a room outgrown at a larger allowed size passed (designer 2026-09-27).
201
+ */
197
202
  function rangedDesignInputs(asset) {
198
203
  const listed = (asset.publicInputs ?? []).map(p => p.input);
199
- if (!listed.length)
200
- return [];
201
204
  const inputs = asset.document.model.inputs;
202
205
  const size = inputs.filter(i => /^(sizing\.)?size\.[xyz]$/.test(i.id) && Number.isFinite(i.min) && Number.isFinite(i.max) && i.max < 1e12).map(i => i.id);
203
206
  return [...listed, ...size].map(id => inputs.find(i => i.id === id)).map(i => ({ id: i.id, min: i.min, max: i.max }));
@@ -241,7 +244,7 @@ function designDependence(asset, ids) {
241
244
  * an input. Returns the reasons it fails, empty when it holds.
242
245
  *
243
246
  * Monotone in each argument is not the same as monotone in a state input the arguments share, and a value that
244
- * is merely monotone cannot be combined further. Both were found by the V3 designer, 2026-09-23:
247
+ * is merely monotone cannot be combined further. Both were found by the designer, 2026-09-23:
245
248
  * `10 + 100·min(q, 1−q)` is widest in the middle, and `10 + 100·(√q − q)` is widest at q = ¼. The gate called
246
249
  * both proven.
247
250
  *
@@ -254,7 +257,7 @@ function designDependence(asset, ids) {
254
257
  * input — a sum, a product, a pose composed onto it — is refused. A new operator is bent until someone shows
255
258
  * it preserves multilinearity and adds it to the list.
256
259
  */
257
- export function cornerExtremalBasis(asset, dependence, basis = V3_STATE_EXTREME_BASIS) {
260
+ export function cornerExtremalBasis(asset, dependence, basis = FIGURE_STATE_EXTREME_BASIS) {
258
261
  const reasons = [];
259
262
  const dep = (ref) => dependence[ref] ?? [];
260
263
  const shares = (a, b) => dep(a).some(x => dep(b).includes(x));
@@ -397,7 +400,7 @@ export function cornerExtremalBasis(asset, dependence, basis = V3_STATE_EXTREME_
397
400
  // so a kernel that grows without writing a basis down loses coverage rather than claiming one.
398
401
  if (basis[n.op] === 'multilinear')
399
402
  break;
400
- reasons.push(`${n.id}: ${n.op} (${basis[n.op] ?? 'unclassified'}) with a ${basis === V3_STATE_EXTREME_BASIS ? 'state-dependent' : 'ranged'} argument (${[...new Set(stateful.flatMap(dep))].join(', ')})`);
403
+ reasons.push(`${n.id}: ${n.op} (${basis[n.op] ?? 'unclassified'}) with a ${basis === FIGURE_STATE_EXTREME_BASIS ? 'state-dependent' : 'ranged'} argument (${[...new Set(stateful.flatMap(dep))].join(', ')})`);
401
404
  }
402
405
  }
403
406
  return reasons;
@@ -406,7 +409,7 @@ export function cornerExtremalBasis(asset, dependence, basis = V3_STATE_EXTREME_
406
409
  Holding every part inside the declared volume and touching the plane the figure is mounted on are two
407
410
  different claims, and corner extremality only settles the first. Whether the figure touches used to be read as
408
411
  the *smallest* gap over its parts, and a smallest folds the way `min@1` folds: two boxes at 20q and 20(1−q) mm
409
- above the floor each touch at one end of q and both float 10 mm at the middle (V3 designer's counterexample
412
+ above the floor each touch at one end of q and both float 10 mm at the middle (designer's counterexample
410
413
  2026-09-23). The gate evaluated the two ends, found a part on the floor at each, and said proven.
411
414
 
412
415
  The declaration names one face now, so there is no smallest to fold: the check is a single equality. What is
@@ -441,16 +444,17 @@ function stateInputs(asset) {
441
444
  * state input at its bounds (and, when a rotation depends on state, along its sweep), and a violation found at any
442
445
  * evaluated state is a violation. The occupancy is never widened to make one go away.
443
446
  */
444
- export function inspectV3Asset(asset, options = {}) {
447
+ export function inspectFigureAsset(asset, options = {}) {
448
+ asset = upgradeFigurePlacement(asset);
445
449
  // Backwards compatible: a plain record is `at`.
446
- const opts = 'at' in options || 'sweepSteps' in options || 'maxCornerInputs' in options || Object.keys(options).length === 0 ? options : { at: options };
447
- const compiled = compileV3Asset(asset);
448
- const graph = compileV3Graph(asset.document.model);
450
+ const opts = 'at' in options || 'sweepSteps' in options || 'maxCornerInputs' in options || 'design' in options || Object.keys(options).length === 0 ? options : { at: options };
451
+ const compiled = compileFigureAsset(asset);
452
+ const graph = compileFigureGraph(asset.document.model);
449
453
  /*
450
454
  The state inputs, and the design inputs a board may set crossed with the instance size (ADR-0096): a long conveyor
451
455
  with a narrow pitch is a combination, not two ranges.
452
456
  */
453
- const designRanged = rangedDesignInputs(asset);
457
+ const designRanged = opts.design === 'as-given' ? [] : rangedDesignInputs(asset);
454
458
  const inputs = [...stateInputs(asset), ...designRanged];
455
459
  const designIds = new Set(designRanged.map(i => i.id));
456
460
  const dependence = { ...graph.dependence };
@@ -489,7 +493,7 @@ export function inspectV3Asset(asset, options = {}) {
489
493
  coverage = { method: 'proven', inputs, states: 1, detail: 'no state input; the rest pose is the only pose' };
490
494
  }
491
495
  else {
492
- const unprovable = cornerExtremalBasis(asset, dependence, designIds.size ? V3_DESIGN_EXTREME_BASIS : V3_STATE_EXTREME_BASIS);
496
+ const unprovable = cornerExtremalBasis(asset, dependence, designIds.size ? FIGURE_DESIGN_EXTREME_BASIS : FIGURE_STATE_EXTREME_BASIS);
493
497
  unprovable.push(...unprovenContact(asset, graph));
494
498
  const maxCorners = opts.maxCornerInputs ?? 10;
495
499
  const allCorners = inputs.length <= maxCorners;
@@ -535,7 +539,9 @@ export function inspectV3Asset(asset, options = {}) {
535
539
  };
536
540
  }
537
541
  }
538
- const plan = designIds.size ? compileV3Graph(asset.document.model) : undefined;
542
+ if (opts.design === 'as-given')
543
+ coverage = { ...coverage, design: 'as-given', detail: `at the design values given, not over their range: ${coverage.detail}` };
544
+ const plan = designIds.size ? compileFigureGraph(asset.document.model) : undefined;
539
545
  for (const state of states) {
540
546
  if (!plan || !Object.keys(state).some(k => designIds.has(k))) {
541
547
  inspectOne(asset, graph, compiled.evaluate(state).geometry, state, push);
@@ -562,19 +568,19 @@ export function inspectV3Asset(asset, options = {}) {
562
568
  min: values[asset.occupancy.bounds[a].min],
563
569
  max: values[asset.occupancy.bounds[a].max]
564
570
  });
565
- return { bounds: { x: read('x'), y: read('y'), z: read('z') }, placement: asset.occupancy.placement, coverage, violations };
571
+ return { bounds: { x: read('x'), y: read('y'), z: read('z') }, placement: figurePlacementOf(asset), coverage, violations };
566
572
  }
567
573
  function inspectOne(asset, graph, geometry, state, push) {
568
574
  const occupancy = asset.occupancy;
569
575
  // The asset evaluation returns geometry only; the declared lengths are graph values, so read the graph itself.
570
576
  const values = graph.evaluate({ ...asset.designInputs, ...asset.stateDefaults, ...state }).values;
571
- const placement = occupancy.placement;
572
- const boxes = v3OccupiedBoxesOf(geometry, v3WritersOf(asset));
577
+ const placement = figurePlacementOf(asset);
578
+ const boxes = figureOccupiedBoxesOf(geometry, figureWritersOf(asset));
573
579
  const round = (v) => Math.round(v * 1e4) / 1e4;
574
580
  /*
575
581
  The declared volume is the reach on each side of the asset origin, so it can sit anywhere around it. The
576
582
  origin is where the figure is mounted, which is a coordinate reference and not a surface nothing may pass:
577
- an arm on a bench reaches below the bench, and that is the machine working (V3 designer's ruling 2026-09-23).
583
+ an arm on a bench reaches below the bench, and that is the machine working (designer's ruling 2026-09-23).
578
584
  */
579
585
  const low = { x: 0, y: 0, z: 0 };
580
586
  const high = { x: 0, y: 0, z: 0 };
@@ -608,14 +614,14 @@ function inspectOne(asset, graph, geometry, state, push) {
608
614
  Only an asset that names the face it is mounted on is asked to make the contact, and two things have to hold
609
615
  for that face to lie in the mounting plane: its reference point is on the plane, and its plane is the same
610
616
  plane. Checking the point alone passed a box stood on its side with the right-hand face declared as the
611
- mounting face, because that face's centre happened to sit at Y = 0 (V3 designer's counterexample
617
+ mounting face, because that face's centre happened to sit at Y = 0 (designer's counterexample
612
618
  2026-09-23). A vertical face and a horizontal floor are not the same plane.
613
619
 
614
620
  Whether the face points into the plane or away from it is a separate question — which way up the figure is
615
621
  mounted — and is not asked here. Only that the two planes coincide.
616
622
 
617
623
  The plane is Y = 0 in the asset frame, for a floor figure and a ceiling one alike. The origin is where the
618
- figure is fastened (V3 designer's ruling 2026-09-23); a ceiling figure hangs from it and names its top face.
624
+ figure is fastened (designer's ruling 2026-09-23); a ceiling figure hangs from it and names its top face.
619
625
  Reading the plane off `occupancy.bounds.y.max` moved the thing the figure is mounted on whenever someone
620
626
  widened the volume it takes up, which are two unrelated declarations.
621
627
  */
@@ -623,8 +629,8 @@ function inspectOne(asset, graph, geometry, state, push) {
623
629
  if (occupancy.contact && (placement === 'floor' || placement === 'ceiling' || placement === 'wall')) {
624
630
  const k = placement === 'wall' ? 2 : 1;
625
631
  const axis = placement === 'wall' ? 'z' : 'y';
626
- const surface = evaluateV3Surface(values, resolveV3Surface({ types: graph.outputTypes, writers: nodeWriters(asset), model: asset.document.model, assetFrame: asset.document.capabilities.assetFrame }, occupancy.contact.surface, 'occupancy.contact.surface'));
627
- const part = v3WritersOf(asset).get(surface.placement) ?? surface.placement;
632
+ const surface = evaluateFigureSurface(values, resolveFigureSurface({ types: graph.outputTypes, writers: nodeWriters(asset), model: asset.document.model, assetFrame: asset.document.capabilities.assetFrame }, occupancy.contact.surface, 'occupancy.contact.surface'));
633
+ const part = figureWritersOf(asset).get(surface.placement) ?? surface.placement;
628
634
  const off = surface.pose.t[k];
629
635
  if (Math.abs(off) > SKIN)
630
636
  push({
@@ -665,10 +671,10 @@ export function splitsOnResize(asset) {
665
671
  const sizing = Object.fromEntries(AXES.map(axis => [axis, model.inputs.find(i => i.id === `size.${axis}` && i.role === 'design')]));
666
672
  if (!AXES.some(axis => sizing[axis]))
667
673
  return [];
668
- const writers = v3WritersOf(asset);
674
+ const writers = figureWritersOf(asset);
669
675
  const piecesAt = (designInputs) => {
670
- const geometry = compileV3Asset({ ...asset, designInputs }).evaluate().geometry;
671
- return piecesOf(v3WorldBoxesOf(geometry, writers));
676
+ const geometry = compileFigureAsset({ ...asset, designInputs }).evaluate().geometry;
677
+ return piecesOf(figureWorldBoxesOf(geometry, writers));
672
678
  };
673
679
  const one = piecesAt(asset.designInputs);
674
680
  const out = [];
@@ -704,8 +710,8 @@ export function notUniformOnResize(asset) {
704
710
  return [];
705
711
  const model = asset.document.model;
706
712
  const sizing = Object.fromEntries(AXES.map(axis => [axis, model.inputs.find(i => i.id === `size.${axis}` && i.role === 'design')]));
707
- const writers = v3WritersOf(asset);
708
- const boxesAt = (designInputs) => new Map(v3WorldBoxesOf(compileV3Asset({ ...asset, designInputs }).evaluate().geometry, writers).map(box => [box.part, box]));
713
+ const writers = figureWritersOf(asset);
714
+ const boxesAt = (designInputs) => new Map(figureWorldBoxesOf(compileFigureAsset({ ...asset, designInputs }).evaluate().geometry, writers).map(box => [box.part, box]));
709
715
  const one = boxesAt(asset.designInputs);
710
716
  for (const axes of RESIZE_WAYS) {
711
717
  if (!axes.every(axis => sizing[axis]))
@@ -760,4 +766,4 @@ function piecesOf(boxes) {
760
766
  });
761
767
  return [...by.values()].map(parts => [...parts].sort());
762
768
  }
763
- //# sourceMappingURL=v3-gate.js.map
769
+ //# sourceMappingURL=gate.js.map