@hatiolab/figure-model 0.1.92 → 0.1.93

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 (296) 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} +67 -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 +8 -0
  8. package/dist/asset.d.ts.map +1 -0
  9. package/dist/{v3-asset.js → asset.js} +23 -23
  10. package/dist/asset.js.map +1 -0
  11. package/dist/{v3-authoring-actions.d.ts → authoring-actions.d.ts} +66 -66
  12. package/dist/authoring-actions.d.ts.map +1 -0
  13. package/dist/{v3-authoring-actions.js → authoring-actions.js} +77 -77
  14. package/dist/authoring-actions.js.map +1 -0
  15. package/dist/{v3-authoring-session.d.ts → authoring-session.d.ts} +21 -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/contract.d.ts +7 -0
  24. package/dist/contract.d.ts.map +1 -0
  25. package/dist/contract.js +12 -0
  26. package/dist/contract.js.map +1 -0
  27. package/dist/{v3-cost.d.ts → cost.d.ts} +5 -5
  28. package/dist/cost.d.ts.map +1 -0
  29. package/dist/{v3-cost.js → cost.js} +11 -11
  30. package/dist/cost.js.map +1 -0
  31. package/dist/{v3-create.d.ts → create.d.ts} +8 -8
  32. package/dist/{v3-create.d.ts.map → create.d.ts.map} +1 -1
  33. package/dist/{v3-create.js → create.js} +26 -26
  34. package/dist/create.js.map +1 -0
  35. package/dist/document.d.ts +5 -0
  36. package/dist/document.d.ts.map +1 -0
  37. package/dist/document.js +31 -0
  38. package/dist/document.js.map +1 -0
  39. package/dist/{v3-driver.d.ts → driver.d.ts} +10 -10
  40. package/dist/driver.d.ts.map +1 -0
  41. package/dist/{v3-driver.js → driver.js} +10 -10
  42. package/dist/driver.js.map +1 -0
  43. package/dist/{v3-editor-workspace.d.ts → editor-workspace.d.ts} +73 -73
  44. package/dist/editor-workspace.d.ts.map +1 -0
  45. package/dist/{v3-editor-workspace.js → editor-workspace.js} +29 -29
  46. package/dist/editor-workspace.js.map +1 -0
  47. package/dist/{v3-examples.d.ts → examples.d.ts} +5 -5
  48. package/dist/examples.d.ts.map +1 -0
  49. package/dist/{v3-examples.js → examples.js} +11 -11
  50. package/dist/examples.js.map +1 -0
  51. package/dist/{v3-follow.d.ts → follow.d.ts} +5 -5
  52. package/dist/follow.d.ts.map +1 -0
  53. package/dist/{v3-follow.js → follow.js} +2 -2
  54. package/dist/follow.js.map +1 -0
  55. package/dist/{v3-gate.d.ts → gate.d.ts} +28 -28
  56. package/dist/gate.d.ts.map +1 -0
  57. package/dist/{v3-gate.js → gate.js} +42 -42
  58. package/dist/gate.js.map +1 -0
  59. package/dist/{v3-graph-types.d.ts → graph-types.d.ts} +33 -33
  60. package/dist/graph-types.d.ts.map +1 -0
  61. package/dist/graph-types.js +2 -0
  62. package/dist/graph-types.js.map +1 -0
  63. package/dist/{v3-graph.d.ts → graph.d.ts} +14 -14
  64. package/dist/graph.d.ts.map +1 -0
  65. package/dist/{v3-graph.js → graph.js} +16 -16
  66. package/dist/graph.js.map +1 -0
  67. package/dist/index.d.ts +33 -33
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +33 -33
  70. package/dist/index.js.map +1 -1
  71. package/dist/{v3-instance-size.d.ts → instance-size.d.ts} +14 -14
  72. package/dist/instance-size.d.ts.map +1 -0
  73. package/dist/{v3-instance-size.js → instance-size.js} +13 -13
  74. package/dist/instance-size.js.map +1 -0
  75. package/dist/json.d.ts +12 -0
  76. package/dist/json.d.ts.map +1 -0
  77. package/dist/{v3-json.js → json.js} +13 -13
  78. package/dist/json.js.map +1 -0
  79. package/dist/kernel-version.d.ts +8 -0
  80. package/dist/kernel-version.d.ts.map +1 -0
  81. package/dist/{v3-kernel-version.js → kernel-version.js} +4 -4
  82. package/dist/kernel-version.js.map +1 -0
  83. package/dist/{v3-part-edit.d.ts → part-edit.d.ts} +10 -10
  84. package/dist/part-edit.d.ts.map +1 -0
  85. package/dist/{v3-part-edit.js → part-edit.js} +65 -65
  86. package/dist/part-edit.js.map +1 -0
  87. package/dist/proposal.d.ts +42 -0
  88. package/dist/proposal.d.ts.map +1 -0
  89. package/dist/{v3-proposal.js → proposal.js} +21 -21
  90. package/dist/proposal.js.map +1 -0
  91. package/dist/{v3-public-inputs.d.ts → public-inputs.d.ts} +4 -4
  92. package/dist/public-inputs.d.ts.map +1 -0
  93. package/dist/{v3-public-inputs.js → public-inputs.js} +3 -3
  94. package/dist/public-inputs.js.map +1 -0
  95. package/dist/recipe-build.d.ts +27 -0
  96. package/dist/recipe-build.d.ts.map +1 -0
  97. package/dist/{v3-recipe-build.js → recipe-build.js} +9 -9
  98. package/dist/recipe-build.js.map +1 -0
  99. package/dist/recipe-from-parts.d.ts +8 -0
  100. package/dist/recipe-from-parts.d.ts.map +1 -0
  101. package/dist/{v3-recipe-from-parts.js → recipe-from-parts.js} +9 -9
  102. package/dist/recipe-from-parts.js.map +1 -0
  103. package/dist/{v3-recipe.d.ts → recipe.d.ts} +25 -25
  104. package/dist/recipe.d.ts.map +1 -0
  105. package/dist/{v3-recipe.js → recipe.js} +30 -30
  106. package/dist/recipe.js.map +1 -0
  107. package/dist/release-contract.d.ts +19 -0
  108. package/dist/release-contract.d.ts.map +1 -0
  109. package/dist/{v3-release-contract.js → release-contract.js} +5 -5
  110. package/dist/release-contract.js.map +1 -0
  111. package/dist/{v3-render-batches.d.ts → render-batches.d.ts} +8 -8
  112. package/dist/render-batches.d.ts.map +1 -0
  113. package/dist/{v3-render-batches.js → render-batches.js} +4 -4
  114. package/dist/render-batches.js.map +1 -0
  115. package/dist/{v3-score.d.ts → score.d.ts} +19 -19
  116. package/dist/score.d.ts.map +1 -0
  117. package/dist/{v3-score.js → score.js} +32 -32
  118. package/dist/score.js.map +1 -0
  119. package/dist/{v3-shape-sampling.d.ts → shape-sampling.d.ts} +4 -4
  120. package/dist/shape-sampling.d.ts.map +1 -0
  121. package/dist/{v3-shape-sampling.js → shape-sampling.js} +3 -3
  122. package/dist/shape-sampling.js.map +1 -0
  123. package/dist/{v3-surface.d.ts → surface.d.ts} +5 -5
  124. package/dist/surface.d.ts.map +1 -0
  125. package/dist/{v3-surface.js → surface.js} +7 -7
  126. package/dist/surface.js.map +1 -0
  127. package/dist/{v3-words.d.ts → words.d.ts} +3 -3
  128. package/dist/words.d.ts.map +1 -0
  129. package/dist/{v3-words.js → words.js} +3 -3
  130. package/dist/words.js.map +1 -0
  131. package/docs/{assembly-constraints-v3.md → assembly-constraints.md} +1 -1
  132. package/docs/{v3-asset-persistence.md → asset-persistence.md} +8 -8
  133. package/docs/{v3-authoring-transactions.md → authoring-transactions.md} +2 -2
  134. package/docs/{v3-capability-bindings.md → capability-bindings.md} +8 -8
  135. package/docs/{v3-common-kernel-experiment.md → common-kernel-experiment.md} +4 -4
  136. package/docs/{v3-core-semantics.md → core-semantics.md} +5 -5
  137. package/docs/{v3-cutover.md → cutover.md} +4 -4
  138. package/docs/{v3-design.md → design.md} +11 -11
  139. package/docs/{v3-document-contract.md → document-contract.md} +9 -9
  140. package/docs/{v3-dryroom-profile-validation.md → dryroom-profile-validation.md} +4 -4
  141. package/docs/{v3-editor-integration.md → editor-integration.md} +6 -6
  142. package/docs/{v3-full-conveyor-validation.md → full-conveyor-validation.md} +4 -4
  143. package/docs/{v3-full-dryroom-validation.md → full-dryroom-validation.md} +4 -4
  144. package/docs/{v3-full-forklift-validation.md → full-forklift-validation.md} +5 -5
  145. package/docs/{v3-full-robot-validation.md → full-robot-validation.md} +4 -4
  146. package/docs/{v3-layout-system.md → layout-system.md} +4 -4
  147. package/docs/{v3-legacy-risk-audit-2026-09-23.md → legacy-risk-audit-2026-09-23.md} +5 -5
  148. package/docs/{v3-minimal-model.md → minimal-model.md} +6 -6
  149. package/docs/{v3-motion-contract.md → motion-contract.md} +3 -3
  150. package/docs/{v3-openusd-review.md → openusd-review.md} +8 -8
  151. package/docs/{v3-operator-contracts.md → operator-contracts.md} +6 -6
  152. package/docs/{v3-payload-collision-validation.md → payload-collision-validation.md} +4 -4
  153. package/docs/{v3-payload-contact-validation.md → payload-contact-validation.md} +5 -5
  154. package/docs/prototypes/README.md +10 -10
  155. package/docs/prototypes/{v3-asset-samples.mjs → asset-samples.mjs} +6 -6
  156. package/docs/prototypes/{v3-asset-store.mjs → asset-store.mjs} +3 -3
  157. package/docs/prototypes/{v3-asset-store.test.mjs → asset-store.test.mjs} +6 -6
  158. package/docs/prototypes/asset.mjs +1 -0
  159. package/docs/prototypes/{v3-asset.schema.json → asset.schema.json} +2 -2
  160. package/docs/prototypes/{v3-asset.test.mjs → asset.test.mjs} +10 -10
  161. package/docs/prototypes/authoring-session.mjs +1 -0
  162. package/docs/prototypes/{v3-authoring-session.test.mjs → authoring-session.test.mjs} +6 -6
  163. package/docs/prototypes/capability-plan.mjs +1 -0
  164. package/docs/prototypes/{v3-capability-plan.test.mjs → capability-plan.test.mjs} +5 -5
  165. package/docs/prototypes/{v3-capability-samples.mjs → capability-samples.mjs} +2 -2
  166. package/docs/prototypes/document.mjs +2 -0
  167. package/docs/prototypes/{v3-document.schema.json → document.schema.json} +1 -1
  168. package/docs/prototypes/{v3-document.test.mjs → document.test.mjs} +7 -7
  169. package/docs/prototypes/{v3-dryroom-mesh.mjs → dryroom-mesh.mjs} +1 -1
  170. package/docs/prototypes/{v3-dryroom-mesh.test.mjs → dryroom-mesh.test.mjs} +1 -1
  171. package/docs/prototypes/{v3-editor-browser.mjs → editor-browser.mjs} +13 -13
  172. package/docs/prototypes/editor-workspace.mjs +1 -0
  173. package/docs/prototypes/{v3-editor-workspace.test.mjs → editor-workspace.test.mjs} +3 -3
  174. package/docs/prototypes/{v3-feature-pattern.test.mjs → feature-pattern.test.mjs} +1 -1
  175. package/docs/prototypes/{v3-full-conveyor.mjs → full-conveyor.mjs} +2 -2
  176. package/docs/prototypes/{v3-full-conveyor.test.mjs → full-conveyor.test.mjs} +3 -3
  177. package/docs/prototypes/{v3-full-dryroom.mjs → full-dryroom.mjs} +2 -2
  178. package/docs/prototypes/{v3-full-dryroom.test.mjs → full-dryroom.test.mjs} +3 -3
  179. package/docs/prototypes/{v3-full-forklift.mjs → full-forklift.mjs} +2 -2
  180. package/docs/prototypes/{v3-full-forklift.test.mjs → full-forklift.test.mjs} +3 -3
  181. package/docs/prototypes/{v3-full-robot.mjs → full-robot.mjs} +2 -2
  182. package/docs/prototypes/{v3-full-robot.test.mjs → full-robot.test.mjs} +4 -4
  183. package/docs/prototypes/{v3-kernel.test.mjs → kernel.test.mjs} +1 -1
  184. package/docs/prototypes/{v3-layout.test.mjs → layout.test.mjs} +1 -1
  185. package/docs/prototypes/{v3-more-samples.test.mjs → more-samples.test.mjs} +2 -2
  186. package/docs/prototypes/{v3-payload-collision.mjs → payload-collision.mjs} +2 -2
  187. package/docs/prototypes/{v3-payload-collision.test.mjs → payload-collision.test.mjs} +3 -3
  188. package/docs/prototypes/{v3-payload-fit.mjs → payload-fit.mjs} +2 -2
  189. package/docs/prototypes/{v3-payload-fit.test.mjs → payload-fit.test.mjs} +4 -4
  190. package/docs/prototypes/render-full-dryroom.mjs +12 -12
  191. package/docs/prototypes/{v3-repeated-binding.mjs → repeated-binding.mjs} +1 -1
  192. package/docs/prototypes/{v3-repeated-binding.test.mjs → repeated-binding.test.mjs} +6 -6
  193. package/docs/prototypes/{v3-runtime-browser.mjs → runtime-browser.mjs} +26 -26
  194. package/docs/prototypes/{v3-samples.test.mjs → samples.test.mjs} +1 -1
  195. package/docs/prototypes/{v3-spatial-plan.test.mjs → spatial-plan.test.mjs} +1 -1
  196. package/docs/prototypes/typed-plan.mjs +3 -0
  197. package/docs/prototypes/{v3-typed-plan.test.mjs → typed-plan.test.mjs} +1 -1
  198. package/docs/prototypes/{v3-typed-repeat.test.mjs → typed-repeat.test.mjs} +2 -2
  199. package/docs/{v3-repeated-binding-validation.md → repeated-binding-validation.md} +4 -4
  200. package/docs/{v3-research-review.md → research-review.md} +2 -2
  201. package/docs/{v3-review-2026-09-22.md → review-2026-09-22.md} +10 -10
  202. package/docs/{v3-runtime-extraction.md → runtime-extraction.md} +16 -16
  203. package/docs/{v3-sample-validation-expanded.md → sample-validation-expanded.md} +5 -5
  204. package/docs/{v3-sample-validation.md → sample-validation.md} +3 -3
  205. package/docs/{v3-shape-dimension-contract.md → shape-dimension-contract.md} +12 -12
  206. package/docs/{v3-shapeassembly-reproduction.md → shapeassembly-reproduction.md} +4 -4
  207. package/docs/{v3-spatial-contracts.md → spatial-contracts.md} +5 -5
  208. package/docs/status.md +12 -0
  209. package/docs/{v3-storage-integration.md → storage-integration.md} +5 -5
  210. package/docs/{v3-typed-repeat-contracts.md → typed-repeat-contracts.md} +3 -3
  211. package/package.json +3 -3
  212. package/dist/v3-asset-types.d.ts.map +0 -1
  213. package/dist/v3-asset-types.js +0 -2
  214. package/dist/v3-asset-types.js.map +0 -1
  215. package/dist/v3-asset.d.ts +0 -8
  216. package/dist/v3-asset.d.ts.map +0 -1
  217. package/dist/v3-asset.js.map +0 -1
  218. package/dist/v3-authoring-actions.d.ts.map +0 -1
  219. package/dist/v3-authoring-actions.js.map +0 -1
  220. package/dist/v3-authoring-session.d.ts.map +0 -1
  221. package/dist/v3-authoring-session.js.map +0 -1
  222. package/dist/v3-capabilities.d.ts +0 -3
  223. package/dist/v3-capabilities.d.ts.map +0 -1
  224. package/dist/v3-capabilities.js.map +0 -1
  225. package/dist/v3-contract.d.ts +0 -7
  226. package/dist/v3-contract.d.ts.map +0 -1
  227. package/dist/v3-contract.js +0 -12
  228. package/dist/v3-contract.js.map +0 -1
  229. package/dist/v3-cost.d.ts.map +0 -1
  230. package/dist/v3-cost.js.map +0 -1
  231. package/dist/v3-create.js.map +0 -1
  232. package/dist/v3-document.d.ts +0 -5
  233. package/dist/v3-document.d.ts.map +0 -1
  234. package/dist/v3-document.js +0 -31
  235. package/dist/v3-document.js.map +0 -1
  236. package/dist/v3-driver.d.ts.map +0 -1
  237. package/dist/v3-driver.js.map +0 -1
  238. package/dist/v3-editor-workspace.d.ts.map +0 -1
  239. package/dist/v3-editor-workspace.js.map +0 -1
  240. package/dist/v3-examples.d.ts.map +0 -1
  241. package/dist/v3-examples.js.map +0 -1
  242. package/dist/v3-follow.d.ts.map +0 -1
  243. package/dist/v3-follow.js.map +0 -1
  244. package/dist/v3-gate.d.ts.map +0 -1
  245. package/dist/v3-gate.js.map +0 -1
  246. package/dist/v3-graph-types.d.ts.map +0 -1
  247. package/dist/v3-graph-types.js +0 -2
  248. package/dist/v3-graph-types.js.map +0 -1
  249. package/dist/v3-graph.d.ts.map +0 -1
  250. package/dist/v3-graph.js.map +0 -1
  251. package/dist/v3-instance-size.d.ts.map +0 -1
  252. package/dist/v3-instance-size.js.map +0 -1
  253. package/dist/v3-json.d.ts +0 -12
  254. package/dist/v3-json.d.ts.map +0 -1
  255. package/dist/v3-json.js.map +0 -1
  256. package/dist/v3-kernel-version.d.ts +0 -8
  257. package/dist/v3-kernel-version.d.ts.map +0 -1
  258. package/dist/v3-kernel-version.js.map +0 -1
  259. package/dist/v3-part-edit.d.ts.map +0 -1
  260. package/dist/v3-part-edit.js.map +0 -1
  261. package/dist/v3-proposal.d.ts +0 -42
  262. package/dist/v3-proposal.d.ts.map +0 -1
  263. package/dist/v3-proposal.js.map +0 -1
  264. package/dist/v3-public-inputs.d.ts.map +0 -1
  265. package/dist/v3-public-inputs.js.map +0 -1
  266. package/dist/v3-recipe-build.d.ts +0 -27
  267. package/dist/v3-recipe-build.d.ts.map +0 -1
  268. package/dist/v3-recipe-build.js.map +0 -1
  269. package/dist/v3-recipe-from-parts.d.ts +0 -8
  270. package/dist/v3-recipe-from-parts.d.ts.map +0 -1
  271. package/dist/v3-recipe-from-parts.js.map +0 -1
  272. package/dist/v3-recipe.d.ts.map +0 -1
  273. package/dist/v3-recipe.js.map +0 -1
  274. package/dist/v3-release-contract.d.ts +0 -19
  275. package/dist/v3-release-contract.d.ts.map +0 -1
  276. package/dist/v3-release-contract.js.map +0 -1
  277. package/dist/v3-render-batches.d.ts.map +0 -1
  278. package/dist/v3-render-batches.js.map +0 -1
  279. package/dist/v3-score.d.ts.map +0 -1
  280. package/dist/v3-score.js.map +0 -1
  281. package/dist/v3-shape-sampling.d.ts.map +0 -1
  282. package/dist/v3-shape-sampling.js.map +0 -1
  283. package/dist/v3-surface.d.ts.map +0 -1
  284. package/dist/v3-surface.js.map +0 -1
  285. package/dist/v3-words.d.ts.map +0 -1
  286. package/dist/v3-words.js.map +0 -1
  287. package/docs/prototypes/v3-asset.mjs +0 -1
  288. package/docs/prototypes/v3-authoring-session.mjs +0 -1
  289. package/docs/prototypes/v3-capability-plan.mjs +0 -1
  290. package/docs/prototypes/v3-document.mjs +0 -2
  291. package/docs/prototypes/v3-editor-workspace.mjs +0 -1
  292. package/docs/prototypes/v3-typed-plan.mjs +0 -3
  293. package/docs/v3-status.md +0 -50
  294. /package/docs/prototypes/{v3-kernel.mjs → kernel.mjs} +0 -0
  295. /package/docs/prototypes/{v3-linear-comparison.py → linear-comparison.py} +0 -0
  296. /package/docs/prototypes/{v3-semantics.test.mjs → semantics.test.mjs} +0 -0
@@ -1,10 +1,10 @@
1
1
  # UI·AI 공통 편집 트랜잭션 — 실행 프로토타입
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  ## 이번 구현 범위
6
6
 
7
- [입력 세션](../src/v3-authoring-session.ts)은 design/state 값 편집을 담당한다. [workspace](../src/v3-editor-workspace.ts)는 상자 추가와 입력 편집을 같은 50단계 undo/redo 이력으로 관리한다. [검증 테스트](prototypes/v3-authoring-session.test.mjs)는 정식 소스 구현을 호출한다. 격리 UI에는 새 Figure·상자 추가·undo/redo 버튼이 연결되어 있다. 제품 AI-dock·일반 그래프 재저작·삭제·재질 편집은 아직 미완료다.
7
+ [입력 세션](../src/authoring-session.ts)은 design/state 값 편집을 담당한다. [workspace](../src/editor-workspace.ts)는 상자 추가와 입력 편집을 같은 50단계 undo/redo 이력으로 관리한다. [검증 테스트](prototypes/authoring-session.test.mjs)는 정식 소스 구현을 호출한다. 격리 UI에는 새 Figure·상자 추가·undo/redo 버튼이 연결되어 있다. 제품 AI-dock·일반 그래프 재저작·삭제·재질 편집은 아직 미완료다.
8
8
 
9
9
  세션은 V3 문서와 초기 입력을 받아 동일 compiler로 검증한다. UI/AI 모두 아래 같은 요청을 사용한다.
10
10
 
@@ -1,6 +1,6 @@
1
- # V3 capability binding 설계 기준안
1
+ # capability binding 설계 기준안
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  상태: **실행 프로토타입 추가**, 제품 런타임·정식 직렬화 스키마 구현 완료 아님. 로봇암 전체 검증에서 발견한 tool-seat 간섭을 근거로 핵심 feature/frame 계약을 확장하는 부가 계약이다.
6
6
 
@@ -72,9 +72,9 @@ region은 의미상 허용/검사 영역이다. 표시용 가이드가 될 수
72
72
 
73
73
  ## 실행 프로토타입 결과 — 2026-09-21
74
74
 
75
- - [컴파일·평가 코드](prototypes/v3-capability-plan.mjs)
76
- - [로봇암·포크리프트 binding 예제](prototypes/v3-capability-samples.mjs)
77
- - [회귀 테스트](prototypes/v3-capability-plan.test.mjs)
75
+ - [컴파일·평가 코드](prototypes/capability-plan.mjs)
76
+ - [로봇암·포크리프트 binding 예제](prototypes/capability-samples.mjs)
77
+ - [회귀 테스트](prototypes/capability-plan.test.mjs)
78
78
 
79
79
  `compileCapabilities(model, declaration)`은 typed graph를 내부에서 컴파일하고 선언을 snapshot으로 보관한다. 호출자가 제공한 임의의 pose 결과를 받아 검증한 것으로 표시하지 않는다. 현재 실험 계약은 `r3-capability-3`다. V1/V2는 자동 변환하지 않고 거부한다.
80
80
 
@@ -89,8 +89,8 @@ region은 의미상 허용/검사 영역이다. 표시용 가이드가 될 수
89
89
  ### 아직 구현하지 않은 계약
90
90
 
91
91
  - `contacts`의 실제 표면 출처와 법선 검사는 아래 단계에서 추가했다. 물체와의 실제 접촉 여부 검사는 여전히 없다.
92
- - 일반 capability 평가기는 공간·충돌을 미검증으로 둔다. 이후 별도 [상자 적재물·평면 접촉 검사](v3-payload-contact-validation.md)를 추가했으며, 명시적으로 그 검사기를 호출한 경우에만 제한된 포함/접촉 결과를 얻는다. 전역 충돌 solver는 없다.
93
- - 단일 repeat의 선택 항목은 후속 [반복 참조 검증](v3-repeated-binding-validation.md)에서 연결했다. 개수 축소로 대상이 사라지면 실패하며 중첩 반복/외부 점유 복구는 미지원이다.
92
+ - 일반 capability 평가기는 공간·충돌을 미검증으로 둔다. 이후 별도 [상자 적재물·평면 접촉 검사](payload-contact-validation.md)를 추가했으며, 명시적으로 그 검사기를 호출한 경우에만 제한된 포함/접촉 결과를 얻는다. 전역 충돌 solver는 없다.
93
+ - 단일 repeat의 선택 항목은 후속 [반복 참조 검증](repeated-binding-validation.md)에서 연결했다. 개수 축소로 대상이 사라지면 실패하며 중첩 반복/외부 점유 복구는 미지원이다.
94
94
  - JSON Schema, 마이그레이션, 제품 런타임, UI/AI 편집과 영속화는 별도 작업이다.
95
95
  - 실제 tool-seat의 의미를 결정하거나 해당 solid를 자동 삭제하지 않았다.
96
96
 
@@ -106,4 +106,4 @@ region은 의미상 허용/검사 영역이다. 표시용 가이드가 될 수
106
106
 
107
107
  반환된 `verified-planar-surface`는 **출처가 검증된 평면이라는 뜻**이지 payload와 접촉했다는 뜻이 아니다. 정점/면 영역 전체, 허용 오차, 하중 지지, 충돌 여부는 별도 검사다. curved feature, portal 등의 아직 정의되지 않은 경우를 가짜 평면으로 추정하지 않고 거부한다. 단일 repeat의 선택된 평면은 V3 계약에서 지원한다.
108
108
 
109
- [직렬화 계약 및 테스트 결과](v3-document-contract.md)를 함께 참조한다.
109
+ [직렬화 계약 및 테스트 결과](document-contract.md)를 함께 참조한다.
@@ -1,6 +1,6 @@
1
1
  # 공통 v3 실행 커널 실험
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  2026-09-20. 제품 구현·출하 명세가 아닌 독립 실험이다.
6
6
  원본 seed, package.json, 서버와 제품 코드를 수정하지 않는다.
@@ -11,11 +11,11 @@
11
11
  이번에는 **모델 이름을 전혀 모르는 하나의 resolve 함수**에 선언 데이터를 입력한다.
12
12
  실제 seed/fixture를 읽는 어댑터는 테스트에만 있고 엔진에는 없다.
13
13
 
14
- - `docs/prototypes/v3-kernel.mjs`: 공통 scalar/frame/geometry/repeat 평가.
15
- - `docs/prototypes/v3-kernel.test.mjs`: 실제 자료에서 유도한 선언과 독립 기대값 검사.
14
+ - `docs/prototypes/kernel.mjs`: 공통 scalar/frame/geometry/repeat 평가.
15
+ - `docs/prototypes/kernel.test.mjs`: 실제 자료에서 유도한 선언과 독립 기대값 검사.
16
16
 
17
17
  ```sh
18
- node --test docs/prototypes/v3-kernel.test.mjs
18
+ node --test docs/prototypes/kernel.test.mjs
19
19
  ```
20
20
 
21
21
  Node 25.6.0에서 6개 검사 통과. 정상 크기·상태 조합 213개와 별도 반례/거절 검사를 실행했다.
@@ -1,11 +1,11 @@
1
1
  # Figure Model V3 핵심 의미론 기준안 — r3
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
- 실행 가능한 첫 subset: [연산·형상 타입 계약](v3-operator-contracts.md).
5
+ 실행 가능한 첫 subset: [연산·형상 타입 계약](operator-contracts.md).
6
6
  scalar 타입/참조 검증 단계이며 전체 의미론 구현과 구분한다.
7
- 후속으로 [공간 타입·부착 관계 통합](v3-spatial-contracts.md)을 추가했다.
8
- 반복의 현재 구현 범위는 [typed 반복 계약](v3-typed-repeat-contracts.md)을 따른다.
7
+ 후속으로 [공간 타입·부착 관계 통합](spatial-contracts.md)을 추가했다.
8
+ 반복의 현재 구현 범위는 [typed 반복 계약](typed-repeat-contracts.md)을 따른다.
9
9
 
10
10
  상태: **설계 검토 기준안. 출하 명세·구현 완료 아님.**
11
11
  이 문서가 r1/r2의 설계 방향을 대체한다. 과거 실험은 근거와 반례로 보존한다.
@@ -293,7 +293,7 @@ Y축 cylinder, feature의 방향 없는 point, 단순 floor(span/pitch)는 이
293
293
 
294
294
  ## 14. 기준안의 독립 수치 검사
295
295
 
296
- `node --test docs/prototypes/v3-semantics.test.mjs`
296
+ `node --test docs/prototypes/semantics.test.mjs`
297
297
 
298
298
  - 부착식: 자기 feature 크기·회전·상태 45조합에서 `W*B=A*O*J` 확인.
299
299
  - 반복식: 정수 길이/경계와 3개 정렬을 조합한 3,000건을 순차 배치 oracle과 비교.
@@ -1,6 +1,6 @@
1
1
  # V3 단일 체계 전환 — 작업 기준
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  사용자 결정: 제품은 V3 하나를 쓴다. V3의 단순성·일관성·저작성·품질을 우선하며, 버전별 편집 경로는 두지 않는다.
6
6
 
@@ -12,13 +12,13 @@ V2와 V1은 2026-09-26 코드와 명세에서 제거했다. ADR-0087의 전환
12
12
 
13
13
  - figure-ui와 figure-service에 직전에 추가했던 형식 버전 차단 전용 코드와 테스트를 제거했다.
14
14
  - 형식 해석 실패 시 다른 자산 ID로 기존 모델을 저장하지 않도록 하는 일반적인 로드 오류 처리는 유지했다. 이는 호환 기능이 아니라 데이터 손실 방지다.
15
- - `createV3Asset(name)`은 부품 없는 빈 자산을 만든다. 기본 상자는 자동 생성하지 않는다.
16
- - `addV3Box(asset, request)`는 명시적 부품 추가 요청을 표준 V3 shape/rigid/place 노드와 9개 설계 입력(크기·위치·회전)으로 만든다. 별도의 레거시 parts 원본을 만들지 않는다.
15
+ - `createFigureAsset(name)`은 부품 없는 빈 자산을 만든다. 기본 상자는 자동 생성하지 않는다.
16
+ - `addFigureBox(asset, request)`는 명시적 부품 추가 요청을 표준 shape/rigid/place 노드와 9개 설계 입력(크기·위치·회전)으로 만든다. 별도의 레거시 parts 원본을 만들지 않는다.
17
17
  - 중복 식별자, 잘못된 치수·재질은 거부한다. 입력 자산은 수정하지 않고 검증된 새 자산을 반환한다.
18
18
 
19
19
  ## 검증과 범위
20
20
 
21
- 상자 생성 함수 구현 당시 소스 테스트454개가 통과했다. 이후 트랜잭션 검증을 추가한 최신 수치는 [통합 현황](v3-status.md)을 따른다. Chrome에서 빈 자산0개 → 상자1개 → 높이2000→1500mm 편집 → 저장 JSON 복원 경로를 검증했다. 기존 네 대표 자산과 편집 workspace의 브라우저 비교도 통과했다.
21
+ 상자 생성 함수 구현 당시 소스 테스트454개가 통과했다. 이후 트랜잭션 검증을 추가한 최신 수치는 [통합 현황](status.md)을 따른다. Chrome에서 빈 자산0개 → 상자1개 → 높이2000→1500mm 편집 → 저장 JSON 복원 경로를 검증했다. 기존 네 대표 자산과 편집 workspace의 브라우저 비교도 통과했다.
22
22
 
23
23
  상자 추가 순수 함수를 workspace의 `addBox` 트랜잭션으로 연결했다. 부품 추가와 입력 수정은 같은 50단계 undo/redo 이력을 사용한다. 구조 변경도 미저장 상태에 반영되며, 잘못된 추가는 이력·revision·원본을 바꾸지 않는다. 저장 이후 undo하면 저장본과 달라졌음을 다시 표시한다.
24
24
 
@@ -1,22 +1,22 @@
1
- # Figure v3 — 3차원 레이아웃의 수학적 계약
1
+ # Figure — 3차원 레이아웃의 수학적 계약
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
- > 이 문서는 r1의 수학적 논거를 보존한다. [최소 실행 모델 r2](v3-minimal-model.md)가
5
+ > 이 문서는 r1의 수학적 논거를 보존한다. [최소 실행 모델 r2](minimal-model.md)가
6
6
  > 현재 설계 후보이며, 이 문서의 독립적인 layout/motion parent 및 상위 Flex/Grid 계약은
7
7
  > 확정 요구사항이 아니다. 두 안을 혼합해 구현하지 않는다.
8
8
 
9
9
  상태: 설계 중인 실행 계약. 구현·렌더링·실자산 검증 완료가 아니다.
10
- 2026-09-20. `assembly-constraints-v3.md`의 초기안을 대체한다.
10
+ 2026-09-20. `assembly-constraints.md`의 초기안을 대체한다.
11
11
 
12
- 상위 배치 계약: [3차원 컨테이너·Flex·Grid](v3-layout-system.md).
12
+ 상위 배치 계약: [3차원 컨테이너·Flex·Grid](layout-system.md).
13
13
  이 문서는 좌표·부착·운동의 하위 계약이다. Flex/Grid의 크기 배분과 중첩은 상위 계약을 따른다.
14
- 검증 예제: `node --test docs/prototypes/v3-layout.test.mjs`.
14
+ 검증 예제: `node --test docs/prototypes/layout.test.mjs`.
15
15
 
16
16
  ## 1. 목적과 범위
17
17
 
18
18
  Figure는 저폴리 형상을 쉽게 저작하고 많은 인스턴스를 효율적으로 배치하는 제품이다.
19
- v3의 핵심은 **치수에 따라 달라지는 3차원 배치 함수**다. 문틀·문짝·표시등은 이 함수의
19
+ 이 모델의 핵심은 **치수에 따라 달라지는 3차원 배치 함수**다. 문틀·문짝·표시등은 이 함수의
20
20
  입력 예이며 별도의 예외 알고리즘이 아니다.
21
21
 
22
22
  부품 맞춤 UI와 AI는 공통 레이아웃 언어로 편집한다. 모델·검사·2D·3D가 같은 평가 결과를
@@ -27,7 +27,7 @@ v3의 핵심은 **치수에 따라 달라지는 3차원 배치 함수**다. 문
27
27
 
28
28
  ## 2. 설계의 근거
29
29
 
30
- v3 설계의 근거는 일반적인 조립 의도와 일관된 배치 계산의 필요성이다. 배치는 기준 상자의 축만이
30
+ 이 설계의 근거는 일반적인 조립 의도와 일관된 배치 계산의 필요성이다. 배치는 기준 상자의 축만이
31
31
  아니라 부품의 개구부·부착 좌표계를 직접 참조해야 한다. 검사는 상자의 연결 개수가 아니라 실제
32
32
  접촉·맞춤을, 몇 가지 배율이 아니라 선언한 치수 범위·축소·운동 상태를 다뤄야 한다. 관계를
33
33
  추가한다고 성능 이득이 보장되지는 않는다.
@@ -298,7 +298,7 @@ lamp는 portal feature 기준점에 고정 크기로 정렬하고, readout은 fe
298
298
  ## 13. 실행 모델과 성능
299
299
 
300
300
  ```ts
301
- compileV3(source): PreparedFigureV3 | Diagnostics
301
+ compileFigure(source): PreparedFigure | Diagnostics
302
302
  resolveLayout(prepared, dimensions): ResolvedLayout | Diagnostics
303
303
  evaluatePose(layout, state): ResolvedFigure | Diagnostics
304
304
  inspectResolved(prepared, resolved, profile): Inspection
@@ -361,9 +361,9 @@ AI와 자동 수정은 typed edit API를 사용한다. 후보에 baseRevision/so
361
361
  ## 16. 식별자와 구현 단계
362
362
 
363
363
  id는 불변, label은 표시 이름이다. 기존 name 기반 외부 참조는 자산 재작성 시 갱신한다.
364
- 초안 저장과 발행 조건을 분리한다. 미지원 consumer에 v3를 부분 해석해 보내지 않는다.
364
+ 초안 저장과 발행 조건을 분리한다. 미지원 consumer에 부분 해석한 자산을 보내지 않는다.
365
365
 
366
- 세부 구현 순서와 출하 조건은 [상위 레이아웃 계약 §12](v3-layout-system.md#12-출하-전-단계와-완료-기준)를 따른다.
366
+ 세부 구현 순서와 출하 조건은 [상위 레이아웃 계약 §12](layout-system.md#12-출하-전-단계와-완료-기준)를 따른다.
367
367
  fixture는 단독 box, 두짝문, 회전 portal, 원형 roller, 선반+lamp repeat, slot/port,
368
368
  의도적 분리, 서로 다른 개도의 portal 두 개를 포함한다.
369
369
  실제 드라이룸 revision fixture 취득은 남아 있다.
@@ -1,26 +1,26 @@
1
1
  # V3 그래프·capability 직렬화 계약 — 실험판
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  ## 범위와 상태
6
6
 
7
7
  실험 그래프와 capability 선언을 저장하고 재로드해 의미 검증하는 계약을 구현했다. **전체 Figure V3 제품 파일 포맷 확정이 아니다.** 현재 전체 모델 예제의 재질·분할 수·외부 capability 메타데이터 일부는 어댑터가 공급한다. 그 데이터까지 이 포맷이 저장한다고 주장하지 않는다. 제품 DB·서버·UI는 변경하지 않았다.
8
8
 
9
- 후속 [자산 저장 envelope](v3-asset-persistence.md)는 이 document를 감싸 설계 입력·동작 기본값·재질·팔레트·분할 품질을 함께 저장한다. document 단독 포맷과 자산 envelope의 지원 범위를 혼동하지 않는다.
9
+ 후속 [자산 저장 envelope](asset-persistence.md)는 이 document를 감싸 설계 입력·동작 기본값·재질·팔레트·분할 품질을 함께 저장한다. document 단독 포맷과 자산 envelope의 지원 범위를 혼동하지 않는다.
10
10
 
11
- - [JSON Schema draft-07](prototypes/v3-document.schema.json)
12
- - [저장·읽기·의미 검증](prototypes/v3-document.mjs)
13
- - [표면 출처 및 round-trip 테스트](prototypes/v3-document.test.mjs)
11
+ - [JSON Schema draft-07](prototypes/document.schema.json)
12
+ - [저장·읽기·의미 검증](prototypes/document.mjs)
13
+ - [표면 출처 및 round-trip 테스트](prototypes/document.test.mjs)
14
14
 
15
15
  ```
16
16
  {
17
- version: "figure-v3-prototype-1",
17
+ version: "figure-prototype-1",
18
18
  model: { version: "r3-spatial-1", inputs, constants, nodes },
19
19
  capabilities: { version: "r3-capability-3", assetFrame, bindings }
20
20
  }
21
21
  ```
22
22
 
23
- 위 코드는 구조 설명이며 생략된 값을 포함한 유효 JSON 예제는 아니다. 재현 가능한 실제 선언은 `v3-capability-samples.mjs`의 model/declaration을 사용한다.
23
+ 위 코드는 구조 설명이며 생략된 값을 포함한 유효 JSON 예제는 아니다. 재현 가능한 실제 선언은 `capability-samples.mjs`의 model/declaration을 사용한다.
24
24
 
25
25
  ## 두 단계 검증
26
26
 
@@ -36,7 +36,7 @@ JSON Schema는 필드 구조·자료형·기본 enum·버전을 검사한다. op
36
36
  - JSON 키 중복은 마지막 값으로 덮지 않고 거부한다. Unicode escape로 같은 키가 표현된 경우도 포함한다.
37
37
  - 잘린 JSON, 비유한 수, undefined, 함수, Date, 순환, sparse array, accessor·숨겨진 속성 등 JSON으로 손실되는 입력을 거부한다.
38
38
  - 실험 자원 제한: 1MiB UTF-8, 객체 깊이64, 그래프 node512. 제품 용량 정책으로 확정된 값이 아니다.
39
- - 선언 공간(occupancy)의 경계는 `affine-bounds@1` 한 노드의 출력 여섯이다. 압축 인자 모양(`layout` = `L` + 여섯 묶음 + 후보별 항 수)은 [연산 계약 §4](v3-operator-contracts.md#4-연산-catalog)에 적었다 — AI 저작·내보내기는 거기서 풀어 읽는다.
39
+ - 선언 공간(occupancy)의 경계는 `affine-bounds@1` 한 노드의 출력 여섯이다. 압축 인자 모양(`layout` = `L` + 여섯 묶음 + 후보별 항 수)은 [연산 계약 §4](operator-contracts.md#4-연산-catalog)에 적었다 — AI 저작·내보내기는 거기서 풀어 읽는다.
40
40
  - round-trip은 의미·수치·선언 동일성을 대상으로 한다. 원본 JSON의 공백·키 표기·서식은 보존하지 않는다.
41
41
  - 함수는 파일/DB에 직접 쓰지 않는다. 저장 API의 원자성, 권한, 버전 충돌, 마이그레이션은 제품 통합 시 별도로 구현해야 한다.
42
42
 
@@ -53,4 +53,4 @@ capability contacts는 `placement`와 `feature` 출력 ID로 명시한다. 실
53
53
  3. 로봇 상완을 -90/0/90°로 회전하면 실제 surface normal도 같은 회전을 따른다.
54
54
  4. 잘린 문서, 중복 키, 구버전, 크기 제한과 손실되는 JavaScript 값을 거부한다.
55
55
 
56
- 후속 단계에서 반복 표면 참조, 제한된 payload 접촉/충돌 검사, 전체 asset 직렬화와 공통 편집 workspace를 구현했다. 현황은 [통합 현황](v3-status.md)을 따른다. 제품 편집기·DB 통합과 일반적인 공간·안전성 보장은 아직 미완료다.
56
+ 후속 단계에서 반복 표면 참조, 제한된 payload 접촉/충돌 검사, 전체 asset 직렬화와 공통 편집 workspace를 구현했다. 현황은 [통합 현황](status.md)을 따른다. 제품 편집기·DB 통합과 일반적인 공간·안전성 보장은 아직 미완료다.
@@ -1,6 +1,6 @@
1
1
  # 드라이룸: 비대칭 단면 → typed feature → 실제 메시 검증
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  > **2026-09-26:** `portal-profile@1`(좌표 여덟)은 `portal-profile@2`로 바뀌었다. 입력은 폭 · 높이 · 깊이 · 기둥 두께 · 인방 두께의 다섯이고, 좌우로 가운데, 바닥에 서며, 좌표 여덟은 이 값에서 나온다. 앞 셋이 상자와 같아 크기를 따를 수 있다. 아래는 @1 때의 기록이다.
6
6
 
@@ -73,12 +73,12 @@ ray 검사: 개구부 중앙은 관통, 상부/다리는 충돌, y=−30의 다
73
73
  최종 이미지는 world 기준선과 픽셀별 depth 비교를 사용한다.
74
74
 
75
75
  ```sh
76
- node --test docs/prototypes/v3-dryroom-mesh.test.mjs
76
+ node --test docs/prototypes/dryroom-mesh.test.mjs
77
77
  # Pillow + NumPy가 있는 Python 환경 사용. 실제 생성 메시 JSON을 입력한다.
78
- node docs/prototypes/v3-dryroom-mesh.mjs | python3 docs/prototypes/render-dryroom.py /tmp/figure-v3-dryroom-before-after.png
78
+ node docs/prototypes/dryroom-mesh.mjs | python3 docs/prototypes/render-dryroom.py /tmp/figure-dryroom-before-after.png
79
79
  ```
80
80
 
81
- 현재 이미지: `/private/tmp/figure-v3-dryroom-before-after.png` (임시 생성물, 위 명령으로 재생성).
81
+ 현재 이미지: `/private/tmp/figure-dryroom-before-after.png` (임시 생성물, 위 명령으로 재생성).
82
82
  2개 mesh 검사 통과. 기존 검사와 함께 재실행한다.
83
83
 
84
84
  ## 5. 설계에 대한 결론
@@ -1,14 +1,14 @@
1
1
  # V3 편집 화면 연결 검증 — 실험판
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  ## 완료 범위
6
6
 
7
7
  저장된 V3 자산을 공통 편집 세션으로 열고, 입력 변경을 평가된 3D 장면으로 전달하는 연결 계층을 구현했다. **제품 모델러·서버·DB에는 아직 연결하지 않았다.**
8
8
 
9
- - 연결 계층: [v3-editor-workspace.ts](../src/v3-editor-workspace.ts) — 실험 mjs는 re-export만 유지
10
- - 계약 검증: [v3-editor-workspace.test.mjs](prototypes/v3-editor-workspace.test.mjs)
11
- - 격리 브라우저 검증: [v3-editor-browser.mjs](prototypes/v3-editor-browser.mjs)
9
+ - 연결 계층: [editor-workspace.ts](../src/editor-workspace.ts) — 실험 mjs는 re-export만 유지
10
+ - 계약 검증: [editor-workspace.test.mjs](prototypes/editor-workspace.test.mjs)
11
+ - 격리 브라우저 검증: [editor-browser.mjs](prototypes/editor-browser.mjs)
12
12
 
13
13
  원본은 관계 그래프와 저작 입력이다. 메시를 직접 수정한 뒤 그래프로 역추정하지 않는다. 속성창과 AI는 같은 단위·역할·revision 검사 및 편집 트랜잭션을 사용한다.
14
14
 
@@ -41,11 +41,11 @@
41
41
  6. 저장본을 다시 열어 1275mm 복원 확인.
42
42
  7. 빈 화면으로 전환해 메시 0개·입력 0개 확인.
43
43
 
44
- 위 기록은 최초 메모리 저장 검증이다. 이후 저장 버튼을 HTTP 기반 임시 파일 저장으로 연결했고 별도 프로세스 복원·저장 충돌 검증을 추가했다. 최신 범위는 [저장 연결 검증](v3-storage-integration.md)을 따른다. 브라우저 page error는 0개이며 `/private/tmp/figure-v3-editor.png`와 `/private/tmp/figure-v3-editor-empty.png`의 캔버스도 직접 확인했다. 제품 UI 연결을 뜻하지 않는다.
44
+ 위 기록은 최초 메모리 저장 검증이다. 이후 저장 버튼을 HTTP 기반 임시 파일 저장으로 연결했고 별도 프로세스 복원·저장 충돌 검증을 추가했다. 최신 범위는 [저장 연결 검증](storage-integration.md)을 따른다. 브라우저 page error는 0개이며 `/private/tmp/figure-editor.png`와 `/private/tmp/figure-editor-empty.png`의 캔버스도 직접 확인했다. 제품 UI 연결을 뜻하지 않는다.
45
45
 
46
46
  ## 제품 연결 시 주의점
47
47
 
48
- 현재 figure-ui의 `client/modeller/figure-source.ts`는 장면 파트를 저장용 이전 형식 source로 변환한다. `figure-inspector.ts`와 `figure-modeller-page.ts`의 update-part/update-draft 경로도 이전 형식의 draft/parts 중심이다. V3 graph를 이 경로의 `parts`로 가장해 전달하면 원본이 이중화된다.
48
+ 현재 figure-ui의 `client/modeller/figure-source.ts`는 장면 파트를 저장용 이전 형식 source로 변환한다. `figure-inspector.ts`와 `figure-modeller-page.ts`의 update-part/update-draft 경로도 이전 형식의 draft/parts 중심이다. graph를 이 경로의 `parts`로 가장해 전달하면 원본이 이중화된다.
49
49
 
50
50
  제품 모델러·저장·AI·렌더러를 V3 단일 경로로 전환한다. 기존 자산은 V3로 재작성한다. 호환 분기는 만들지 않는다. 제품에서는 src에서 빌드한 공용 API를 사용한다.
51
51
 
@@ -1,13 +1,13 @@
1
1
  # V3 전체 컨베이어 검증 — 2026-09-21
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  ## 판정과 범위
6
6
 
7
7
  저장소 CONVEYOR seed의 **17개 파트 유형 전체**를 실험 V3 그래프로 작성했다. 기본 형상과 재질을 재현하면서 기존 반복 배치의 겹침을 의도적으로 제거했다. 제품 모델러 통합·애니메이션 재생·AI 저작 검증은 아직 아니다.
8
8
 
9
- - 선언 및 메시 어댑터: [v3-full-conveyor.mjs](prototypes/v3-full-conveyor.mjs)
10
- - 회귀 검사: [v3-full-conveyor.test.mjs](prototypes/v3-full-conveyor.test.mjs)
9
+ - 선언 및 메시 어댑터: [full-conveyor.mjs](prototypes/full-conveyor.mjs)
10
+ - 회귀 검사: [full-conveyor.test.mjs](prototypes/full-conveyor.test.mjs)
11
11
  - 브라우저: `node docs/prototypes/render-full-dryroom.mjs --conveyor`
12
12
  - 전체 테스트: `node --test docs/prototypes/v3-*.test.mjs`
13
13
 
@@ -55,7 +55,7 @@ Chrome WebGL에서 직접 이미지를 확인했다. 환경 반사광을 포함
55
55
  | V3 회전 37° | 30 | 1,516 |
56
56
  | V3 길이3000·폭900·높이700·회전37° | 34 | 1,708 |
57
57
 
58
- 원본과 V3 기본 상태의 해당 시점 RGBA 채널 차이는 0이었다. **메시가 같다는 뜻은 아니다.** 원본의 불필요한 두 롤러가 완전히 가려져 영상에는 나타나지 않기 때문이다. 영상만으로 내부 중첩을 판정할 수 없다는 사례다. 브라우저 pageerror는 없었다. 임시 이미지: `/private/tmp/figure-v3-full-conveyor.png`.
58
+ 원본과 V3 기본 상태의 해당 시점 RGBA 채널 차이는 0이었다. **메시가 같다는 뜻은 아니다.** 원본의 불필요한 두 롤러가 완전히 가려져 영상에는 나타나지 않기 때문이다. 영상만으로 내부 중첩을 판정할 수 없다는 사례다. 브라우저 pageerror는 없었다. 임시 이미지: `/private/tmp/figure-full-conveyor.png`.
59
59
 
60
60
  ## 남은 한계
61
61
 
@@ -1,6 +1,6 @@
1
1
  # V3 전체 DRY_ROOM 검증 — 2026-09-21
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  ## 판정
6
6
 
@@ -9,8 +9,8 @@
9
9
  ## 범위와 재현 방법
10
10
 
11
11
  - 원본: `operato-application/packages/operato-figure/server/seed/figure-samples.json`의 DRY_ROOM.
12
- - 전체 선언: [v3-full-dryroom.mjs](prototypes/v3-full-dryroom.mjs).
13
- - 테스트: [v3-full-dryroom.test.mjs](prototypes/v3-full-dryroom.test.mjs).
12
+ - 전체 선언: [full-dryroom.mjs](prototypes/full-dryroom.mjs).
13
+ - 테스트: [full-dryroom.test.mjs](prototypes/full-dryroom.test.mjs).
14
14
  - 브라우저 실험: [render-full-dryroom.mjs](prototypes/render-full-dryroom.mjs).
15
15
  - 실행: `node --test docs/prototypes/v3-*.test.mjs`, `node docs/prototypes/render-full-dryroom.mjs`.
16
16
 
@@ -34,7 +34,7 @@
34
34
  - 전체 프로토타입 회귀 테스트 **80/80 통과**.
35
35
  - Chrome WebGL 동일 카메라 기준 원본 재구현과 V3 기본 상태의 RGBA 채널 차이 **0**.
36
36
  - 원본·V3 기본·하단 제거·크기 및 램프 위치 변경의 네 상태 모두 **6 draw calls / 336 triangles**. 브라우저 pageerror 없음.
37
- - 생성 이미지: `/private/tmp/figure-v3-full-dryroom.png` (임시 산출물).
37
+ - 생성 이미지: `/private/tmp/figure-full-dryroom.png` (임시 산출물).
38
38
 
39
39
  동일 영상은 해당 카메라에서만 비교했다. 보이지 않는 후면은 정점·관계 검사로 확인했으며, 후면 영상 비교나 실제 제품 전체 렌더링 검증을 대체하지 않는다.
40
40
 
@@ -1,13 +1,13 @@
1
1
  # V3 전체 포크리프트 검증 — 2026-09-21
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  ## 판정
6
6
 
7
7
  저장소 FORKLIFT seed의 **20개 파트 전체**와 lift/reach/drive를 실험 V3 그래프로 작성했다. 기본 형상 재현과 동시 상태 갱신 검증을 통과했다. 실제 제품 모델러·시간 재생기·적재 기능·충돌/안전성까지 완료한 것은 아니다.
8
8
 
9
- - [전체 선언](prototypes/v3-full-forklift.mjs)
10
- - [테스트](prototypes/v3-full-forklift.test.mjs)
9
+ - [전체 선언](prototypes/full-forklift.mjs)
10
+ - [테스트](prototypes/full-forklift.test.mjs)
11
11
  - 실행: `node --test docs/prototypes/v3-*.test.mjs`
12
12
  - 브라우저: `node docs/prototypes/render-full-dryroom.mjs --forklift`
13
13
 
@@ -28,7 +28,7 @@ forkLength는 설계 입력이며 포크 뒤쪽 z=360mm를 유지하고 앞쪽
28
28
  - 포크 뒤쪽 장착 좌표, 상하 포크 간격400mm, carriage와 포크 상대 높이218mm 유지.
29
29
  - 주 휠 축 방향·반지름에 따른 바닥 높이 유지, 잘못된 입력 거부, 오류 후 복구, 노드 순서 독립성 확인.
30
30
 
31
- Chrome에서 원본·V3 기본·상승1000/내밈200·상승2000/내밈400/포크1275mm 이미지를 직접 확인했다. 각 상태 **20 draw calls / 1,032 triangles**, pageerror 없음. 원본 재구현과 V3 기본의 동일 카메라 픽셀 채널 차이는 0이었다. 이미지: `/private/tmp/figure-v3-full-forklift.png`.
31
+ Chrome에서 원본·V3 기본·상승1000/내밈200·상승2000/내밈400/포크1275mm 이미지를 직접 확인했다. 각 상태 **20 draw calls / 1,032 triangles**, pageerror 없음. 원본 재구현과 V3 기본의 동일 카메라 픽셀 채널 차이는 0이었다. 이미지: `/private/tmp/figure-full-forklift.png`.
32
32
 
33
33
  ## 한계
34
34
 
@@ -36,6 +36,6 @@ Chrome에서 원본·V3 기본·상승1000/내밈200·상승2000/내밈400/포
36
36
 
37
37
  닫힌 개별 메시와 올바른 pose는 전체 조립의 무충돌을 증명하지 않는다. 원본 mast와 stage는 실선체 상자로 표현되어 정지 상태부터 내부가 겹친다. 텔레스코픽 기구의 실제 중공 단면을 재현한 것이 아니다. 경고등/라이다 등의 원본 배치도 미적·물리적 품질 검증을 별도로 받아야 한다.
38
38
 
39
- 적재 binding은 원본에 없으며 추가 구현한 것으로 계산하지 않는다. [capability binding 계약](v3-capability-bindings.md)은 물리 형상과 적재/파지 위치를 분리할 설계 초안이다.
39
+ 적재 binding은 원본에 없으며 추가 구현한 것으로 계산하지 않는다. [capability binding 계약](capability-bindings.md)은 물리 형상과 적재/파지 위치를 분리할 설계 초안이다.
40
40
 
41
41
  이로써 드라이룸·컨베이어·로봇암·포크리프트 네 대표 모델의 전체 파트 실험은 존재한다. **제품 가치 검증 완료**를 의미하지 않는다. 발견한 원본 품질 문제, capability 구현, V3 직렬화/런타임, 실제 UI와 AI 편집 검증이 남아 있다.
@@ -1,6 +1,6 @@
1
1
  # V3 전체 로봇암 검증 — 2026-09-21
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  ## 판정
6
6
 
@@ -8,8 +8,8 @@
8
8
 
9
9
  ## 구현과 재현
10
10
 
11
- - [전체 선언 및 어댑터](prototypes/v3-full-robot.mjs)
12
- - [검증 테스트](prototypes/v3-full-robot.test.mjs)
11
+ - [전체 선언 및 어댑터](prototypes/full-robot.mjs)
12
+ - [검증 테스트](prototypes/full-robot.test.mjs)
13
13
  - `node --test docs/prototypes/v3-*.test.mjs`
14
14
  - `node docs/prototypes/render-full-dryroom.mjs --robot`
15
15
 
@@ -37,7 +37,7 @@
37
37
  - 관절 범위 초과와 잘못된 링크 길이 거부, 오류 이후 복구, 노드 선언 순서 독립성 검사 통과.
38
38
  - 전체 프로토타입 회귀 테스트 **88/88 통과**. 이 숫자에는 아래 알려진 결함을 탐지하는 테스트도 포함하므로 제품 합격률이 아니다.
39
39
 
40
- Chrome WebGL에서 기본 상태·6축과 그리퍼 동시 변경·링크 길이 변경 이미지를 직접 확인했다. 네 패널 모두 **10 draw calls / 220 triangles**, pageerror 없음. 원본 재구현과 V3 기본 상태의 해당 카메라 RGBA 채널 차이는 0이다. 임시 이미지: `/private/tmp/figure-v3-full-robot.png`.
40
+ Chrome WebGL에서 기본 상태·6축과 그리퍼 동시 변경·링크 길이 변경 이미지를 직접 확인했다. 네 패널 모두 **10 draw calls / 220 triangles**, pageerror 없음. 원본 재구현과 V3 기본 상태의 해당 카메라 RGBA 채널 차이는 0이다. 임시 이미지: `/private/tmp/figure-full-robot.png`.
41
41
 
42
42
  원본 렌더러를 직접 구동한 것이 아니라 형상 생성 경로를 재구현했다. 독립 FK도 같은 직렬 체인이라는 전제를 공유한다. 이미지 한 시점의 일치는 전체 동작·충돌·물리적 타당성 보장이 아니다.
43
43
 
@@ -1,13 +1,13 @@
1
1
  # Figure v3: 계층형 3차원 레이아웃 시스템
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
5
  > 상태 변경: Flex/Grid 도입을 전제한 **r1 비교안**으로 보존한다. 구현 기준으로 확정하지 않는다.
6
6
  > 자동 크기 측정과 Grid 다중 span 배분에 확인된 반례가 있다.
7
- > 현재 검토 방향은 [최소 실행 모델 r2](v3-minimal-model.md)이며, Flex/Grid는 필수 요구가 아니다.
7
+ > 현재 검토 방향은 [최소 실행 모델 r2](minimal-model.md)이며, Flex/Grid는 필수 요구가 아니다.
8
8
 
9
9
  2026-09-20 · 설계 기준안 r1. **제품에 구현/배포된 기능이 아니다.**
10
- 좌표·부착·운동의 하위 수학 계약은 [v3-design.md](v3-design.md).
10
+ 좌표·부착·운동의 하위 수학 계약은 [design.md](design.md).
11
11
  이 문서가 컨테이너, 크기 배분, 순환 의존, overflow, 증명 범위를 우선 정의한다.
12
12
  CSS 호환 구현을 목표로 하지 않는다. Flex/Grid의 공간 배분 개념을 Figure에 적용한다.
13
13
 
@@ -311,7 +311,7 @@ geometry별 feature catalog, 전체 JSON schema, 보수적 수치 증명기, ren
311
311
 
312
312
  ### 현재 검증 기록
313
313
 
314
- 실행: `node --test docs/prototypes/v3-layout.test.mjs` — 18개 테스트 통과.
314
+ 실행: `node --test docs/prototypes/layout.test.mjs` — 18개 테스트 통과.
315
315
  100개 문 폭의 간격/끝점, 800개 seed 고정 제한 배분 조합, fr/auto span,
316
316
  회전 정렬/contain, branch 전환, 참조 순서/순환/중복 writer를 검증했다.
317
317
  두짝문 travel=W/2라는 이전 예제의 오류를 발견해 (W-gap)/2로 수정했다.
@@ -9,11 +9,11 @@
9
9
  | 우선순위 | 근거 | 위험 | 조치/완료 기준 |
10
10
  | --- | --- | --- | --- |
11
11
  | P1 | things-factory `figure-service/server/service/figure/figure-source.ts`, `figure-mutation.ts` | V3 저장은 별도 경로지만 기존 생성·수정·복원은 V2 parseSource를 사용한다. V3 데이터 전환 뒤 제품 경로가 깨질 수 있다. | 전환 전 저장·발행·복원·AI·썸네일 전체 V3 경로 시험. 이번 점검에서 운영 경로 전환하지 않음. |
12
- | P1 | things-scene `src/figure/v3/figure-v3-rig.ts`의 clipOf | driver ID의 `/` 앞부분을 재생 그룹으로 해석한다. V3 타입은 ID 문자열 형식을 요구하지 않는다. 이름 변경이 동작을 바꿀 수 있다. | 명시적 재생 그룹 계약을 설계하고 소비처와 변환기를 함께 수정. ID는 불투명 식별자. 런타임에서 V2 이름을 추측하는 fallback은 최종 제거. |
13
- | P2 | `src/v3-asset-types.ts`, `v3-asset.ts`, scene rig | legacyCapability가 V3 정본·평가·렌더러에 남아 있다. 검증된 binding과 혼동되고 유지 비용이 생긴다. | V3 binding으로 재저작하거나 변환 보고서에 보존. 정본에서 제거할 때 fixture·소비처 동시 수정. 단순 삭제로 의미 손실을 숨기지 않음. |
14
- | P2 | `src/v3-gate.ts` → `v3-mesh-compare.ts` | 제품 검사기가 V2 비교용 코드를 의존한다. 비교용 변경이 제품 판정에 전파된다. | 이번 변경에서 V3 형상 유틸리티를 `v3-shape-sampling.ts`로 분리. migration이 유틸리티를 사용하고 역방향 의존을 금지하는 테스트 추가. |
15
- | P2 | things-scene `src/figure/v3/figure-v3-real-object.ts` effectiveDepth | depth 생략 시 평면 크기 배율의 기하평균으로 높이를 결정하는 V2 정책이 V3 소비처에 남아 있다. | V3 설계 입력과 씬 크기 매핑 정책을 명시. 자동 기하평균은 V3 보편 규칙으로 취급하지 말 것. 정책 변경 시 기존 배치의 변화 검증. |
16
- | P2 | `src/index.ts`, `v3-capabilities.ts`, `v3-asset.ts` | 공개 진입점에 V2 변환·비교 API가 섞이고 capability/placement 목록을 V2 types에서 가져온다. | 제품 공통 어휘와 구버전 전용 계약을 분리하고 V3 전용 진입점과 migration 진입점을 설계. 이번 점검에서는 package.json/exports를 변경하지 않음. |
12
+ | P1 | things-scene `src/figure/figure-rig.ts`의 clipOf | driver ID의 `/` 앞부분을 재생 그룹으로 해석한다. V3 타입은 ID 문자열 형식을 요구하지 않는다. 이름 변경이 동작을 바꿀 수 있다. | 명시적 재생 그룹 계약을 설계하고 소비처와 변환기를 함께 수정. ID는 불투명 식별자. 런타임에서 V2 이름을 추측하는 fallback은 최종 제거. |
13
+ | P2 | `src/asset-types.ts`, `asset.ts`, scene rig | legacyCapability가 V3 정본·평가·렌더러에 남아 있다. 검증된 binding과 혼동되고 유지 비용이 생긴다. | binding으로 재저작하거나 변환 보고서에 보존. 정본에서 제거할 때 fixture·소비처 동시 수정. 단순 삭제로 의미 손실을 숨기지 않음. |
14
+ | P2 | `src/gate.ts` → `mesh-compare.ts` | 제품 검사기가 V2 비교용 코드를 의존한다. 비교용 변경이 제품 판정에 전파된다. | 이번 변경에서 V3 형상 유틸리티를 `shape-sampling.ts`로 분리. migration이 유틸리티를 사용하고 역방향 의존을 금지하는 테스트 추가. |
15
+ | P2 | things-scene `src/figure/figure-real-object.ts` effectiveDepth | depth 생략 시 평면 크기 배율의 기하평균으로 높이를 결정하는 V2 정책이 V3 소비처에 남아 있다. | V3 설계 입력과 씬 크기 매핑 정책을 명시. 자동 기하평균은 V3 보편 규칙으로 취급하지 말 것. 정책 변경 시 기존 배치의 변화 검증. |
16
+ | P2 | `src/index.ts`, `capabilities.ts`, `asset.ts` | 공개 진입점에 V2 변환·비교 API가 섞이고 capability/placement 목록을 V2 types에서 가져온다. | 제품 공통 어휘와 구버전 전용 계약을 분리하고 V3 전용 진입점과 migration 진입점을 설계. 이번 점검에서는 package.json/exports를 변경하지 않음. |
17
17
 
18
18
  ## 유지할 것과 격리할 것
19
19
 
@@ -1,18 +1,18 @@
1
1
  # Figure v3 최소 실행 모델 — r2 설계 후보
2
2
 
3
- > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
3
+ > 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
4
 
5
- > 설계 방향은 [r3 핵심 의미론 기준안](v3-core-semantics.md)으로 대체한다.
5
+ > 설계 방향은 [r3 핵심 의미론 기준안](core-semantics.md)으로 대체한다.
6
6
  > 이 문서는 과거 가설과 실험 근거로 보존하며 현재 명세와 혼용하지 않는다.
7
7
 
8
- > 채택 보류: [선행 연구 검토](v3-research-review.md)를 먼저 따른다.
8
+ > 채택 보류: [선행 연구 검토](research-review.md)를 먼저 따른다.
9
9
  > 아핀 DAG만 허용하거나 배치/운동 부모를 일치시키는 선택도 비교 검증 전의 가설이다.
10
- > [실제 샘플 대입 검증](v3-sample-validation.md): 컨베이어의 가변 반복을 후속 범위로
10
+ > [실제 샘플 대입 검증](sample-validation.md): 컨베이어의 가변 반복을 후속 범위로
11
11
  > 미루면 기존 기능을 보존하지 못한다. 실제 단면 feature와 복합 운동 migration도 미완이다.
12
- > [16종 확대 검증](v3-sample-validation-expanded.md): 상태 기반 형상 변화(G(d,q)),
12
+ > [16종 확대 검증](sample-validation-expanded.md): 상태 기반 형상 변화(G(d,q)),
13
13
  > 원형과 바닥 접촉의 분리, 고정 개수/고정 pitch 반복의 구분도 필수 보완사항이다.
14
14
  > 현재의 아핀 치수 + 강체 운동만으로 기존 샘플 전부를 표현한다는 주장은 성립하지 않는다.
15
- > [공통 커널 실험](v3-common-kernel-experiment.md): 213개 크기·상태 조합을 실행했다.
15
+ > [공통 커널 실험](common-kernel-experiment.md): 213개 크기·상태 조합을 실행했다.
16
16
  > 반복 배치와 개별 형상 회전 순서, 상태 기반 geometry가 추가 계약으로 드러났다.
17
17
  > 부분 모델/proxy 실험이며 최종 명세가 아니다.
18
18
 
@@ -1,8 +1,8 @@
1
- # V3 motion contract — joints, parameters, animations
1
+ # motion contract — joints, parameters, animations
2
2
 
3
3
  Status: **contract, fixed 2026-09-22; revised the same day after the chief architect's review; implemented the
4
- same day** (ADR-0087 decision 2, ruling 4). Implementation: `src/v3-graph.ts` (`axis-turn@1`, `axis-slide@1`),
5
- `src/v3-driver.ts` (`driverValue`, `driverStates`, `validateV3Drivers`), tests in `src/v3-motion.test.ts`. Every
4
+ same day** (ADR-0087 decision 2, ruling 4). Implementation: `src/graph.ts` (`axis-turn@1`, `axis-slide@1`),
5
+ `src/driver.ts` (`driverValue`, `driverStates`, `validateFigureDrivers`), tests in `src/motion.test.ts`. Every
6
6
  consumer uses this contract; none of them defines motion on its own. The review changed three things: the direction of every transform is written down, continuous
7
7
  rotation is split into an accumulated amount and a phase, and drivers carry an explicit time convention.
8
8
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  상태: **문헌·소스 검토.** 구현이나 변환 실험은 하지 않았다. 2026-09-25 작성.
4
4
  범위: OpenUSD 를 Figure V3 의 개념 기반·이름 정렬 대상·교환 형식으로 쓸 수 있는지. 기준 문서는
5
- [r3 핵심 의미론](v3-core-semantics.md), [선행 연구 검토](v3-research-review.md)(URDF·USD 는 다루지 않았다),
6
- `operato-application/adr/ADR-0093.md`, 그리고 이미 들어간 레코드 `src/v3-authoring-actions.ts:52` `V3Joint`(커밋 `d15c0ba`, 미발행).
5
+ [r3 핵심 의미론](core-semantics.md), [선행 연구 검토](research-review.md)(URDF·USD 는 다루지 않았다),
6
+ `operato-application/adr/ADR-0093.md`, 그리고 이미 들어간 레코드 `src/authoring-actions.ts:52` `FigureJoint`(커밋 `d15c0ba`, 미발행).
7
7
 
8
8
  근거 표기: 본문의 `[S#]` 는 맨 아래 출처 표의 번호다. **모든 URL 의 접근일은 2026-09-25 다.** 출처 표의 「근거」 열은
9
9
  원문(파일 원문을 직접 읽음) · 페이지 요약(웹 페이지를 요약 도구로 읽음) · 검색 요약(검색 결과 문단만 봄)으로 나눈다.
@@ -12,7 +12,7 @@
12
12
  ## 결론
13
13
 
14
14
  1. **(a) 개념 기반으로 삼지 않는다.** USD 는 평가가 끝난 값(숫자·time sample)을 합성한다. V3 정본의 중심인 「설계 입력의 식으로 정해지는 치수·pivot·반복 개수」, feature 기준 부착, occupancy, capability 를 담는 구조가 없다. 식을 계산하는 OpenExec 는 25.08 preview 이고 계산은 C++ 로 schema 에 등록해야 하며 장면 파일에 식을 적을 수 없다. 26.08 의 rig 기능도 "not yet ready for production use" 다 [S15][S20]. variable expression 은 asset path·variant 선택에만 쓰이고 산술이 없다 [S21].
15
- 2. **(b) 이름·모양은 비용이 작은 곳에서 맞춘다.** V3 joint 레코드는 이미 UsdPhysics 의 양쪽 frame 구조와 같다(부모 feature+origin ↔ `body0`+`localPos0/localRot0`, 자식 feature ↔ `body1`+`localPos1/localRot1`). limit 필드 이름·각도 단위·축 토큰·mimic 부호 규약을 발행 전에 정한다(아래 ADR-0093 권고 R1–R7).
15
+ 2. **(b) 이름·모양은 비용이 작은 곳에서 맞춘다.** joint 레코드는 이미 UsdPhysics 의 양쪽 frame 구조와 같다(부모 feature+origin ↔ `body0`+`localPos0/localRot0`, 자식 feature ↔ `body1`+`localPos1/localRot1`). limit 필드 이름·각도 단위·축 토큰·mimic 부호 규약을 발행 전에 정한다(아래 ADR-0093 권고 R1–R7).
16
16
  3. **(c) USD 는 교환 형식으로 쓴다. export 먼저, import 는 URDF 뒤에.** export 는 설계 입력을 평가한 스냅샷을 `usda` 로 쓴다(UsdGeom + UsdPhysics + UsdPreviewSurface, `metersPerUnit = 0.001`, `upAxis = "Y"`). import 한 자산은 모든 치수가 상수인 V3 자산이 된다.
17
17
  4. **USD 가 담지 못하는 V3 의 것:** 설계 입력 식, 식을 따르는 joint pivot·travel, 길이를 채우는 반복의 개수 계산, 이름 있는 feature, occupancy, capability, 관계 검사(assertion). **V3 에 없고 USD 에 있는 것:** layer 합성과 비파괴 override, variantSet, payload, 교환 가능한 instancing(scenegraph instancing·PointInstancer), 질량·충돌·drive·articulation root, time sample, 표준 재질(UsdPreviewSurface·MaterialX), Omniverse·Isaac Sim·Siemens 등의 도구 생태계 [S1][S6].
18
18
  5. **표준 상태:** AOUSD Core Spec 1.0.1(2025-12-12)은 데이터 모델·합성·`usda/usdc/usdz` 만 규정하고 Geometry·Materials·Physics 는 별도 규격으로 작성 중이다 [S2][S3]. UsdPhysics 이름은 OpenUSD 코드(21.08 부터)가 기준이다. mimic 은 UsdPhysics 에 없고 PhysX·Newton 확장에 부호가 다른 식으로 있다 [S14][S16][S19].
@@ -50,9 +50,9 @@
50
50
 
51
51
  ## 2. ADR-0093 joint 레코드 · UsdPhysics · URDF 필드 대조
52
52
 
53
- V3 열은 ADR-0093 본문과 구현된 `V3Joint`(`src/v3-authoring-actions.ts:52-76`)를 함께 적었다.
53
+ V3 열은 ADR-0093 본문과 구현된 `FigureJoint`(`src/authoring-actions.ts:52-76`)를 함께 적었다.
54
54
 
55
- | 뜻 | V3 (ADR-0093 / `V3Joint`) | UsdPhysics [S14] | URDF [S18] | 판정 |
55
+ | 뜻 | (ADR-0093 / `FigureJoint`) | UsdPhysics [S14] | URDF [S18] | 판정 |
56
56
  |---|---|---|---|---|
57
57
  | 이름 | `id: string` | prim 이름(경로) | `joint@name` | USD 이름 규칙 때문에 매핑 필요 (R6) |
58
58
  | 종류 | `fixed·revolute·continuous·prismatic` | `PhysicsFixedJoint`, `PhysicsRevoluteJoint`, `PhysicsPrismaticJoint` (+ Spherical, Distance, D6=`PhysicsJoint`) | `fixed·revolute·continuous·prismatic` (+ floating, planar) | 그대로. continuous → Revolute, limit ±inf |
@@ -71,7 +71,7 @@ V3 열은 ADR-0093 본문과 구현된 `V3Joint`(`src/v3-authoring-actions.ts:52
71
71
  ### ADR-0093 발행 전 권고
72
72
 
73
73
  - **R1. `limit: {min, max}` → `limit: {lower, upper}`.** URDF `lower/upper` 와 UsdPhysics `lowerLimit/upperLimit` 가 같은 낱말을 쓴다. 미발행이라 이름 변경 비용이 지금 가장 작다.
74
- - **R2. 각도 단위를 ADR 에 명시하고 r3 와 맞춘다.** r3 §4 는 저장 단위를 rad 로 정했고 "실험 커널의 deg 숫자는 이 계약을 구현한 것이 아니다"라고 적었다. ADR-0093 과 `V3Joint` 는 `limit`·`origin.turn`·continuous 위상(−180..180)에 deg 를 쓴다. UsdPhysics 는 deg [S13], URDF 는 rad [S18]. 어느 쪽이든 export 는 곱셈 하나다. 권고는 r3 를 따라 rad 로 저장하는 것이다. deg 를 유지하려면 r3 §4 를 먼저 고친다.
74
+ - **R2. 각도 단위를 ADR 에 명시하고 r3 와 맞춘다.** r3 §4 는 저장 단위를 rad 로 정했고 "실험 커널의 deg 숫자는 이 계약을 구현한 것이 아니다"라고 적었다. ADR-0093 과 `FigureJoint` 는 `limit`·`origin.turn`·continuous 위상(−180..180)에 deg 를 쓴다. UsdPhysics 는 deg [S13], URDF 는 rad [S18]. 어느 쪽이든 export 는 곱셈 하나다. 권고는 r3 를 따라 rad 로 저장하는 것이다. deg 를 유지하려면 r3 §4 를 먼저 고친다.
75
75
  - **R3. 축은 부호 없는 `X|Y|Z` 로 유지하고, 방향 반전은 `origin.turn` 으로 표현한다고 ADR 에 적는다.** UsdPhysics `physics:axis` 가 같은 토큰 셋이다. URDF export 는 `(1,0,0)` 같은 단위벡터로 쓴다.
76
76
  - **R4. URDF/USD import 의 임의 회전을 어떻게 받을지 발행 전에 정한다.** `origin.turn` 은 quarter-turn 만 받는다. URDF `origin rpy` 와 `axis xyz` 는 임의 값이고 USD `localRot0/1` 도 임의 quaternion 이다. 둘 중 하나: (가) origin 에 일반 회전(각도 식 또는 quaternion)을 추가, (나) 축 정렬되지 않은 joint 는 이유를 밝히고 import 를 거절. ADR §5 가 URDF import 를 약속하므로 레코드 모양에 영향이 있다.
77
77
  - **R5. mimic 은 `{joint, multiplier, offset}` 그대로 두고 세 가지를 ADR 에 적는다.** ① `offset` 단위는 따르는 joint 의 단위다(NewtonMimicAPI 와 같음 [S19]). ② 리더와 따르는 joint 는 같은 운동 종류여야 한다(Newton 은 같은 joint type 을 요구 [S19]; revolute·continuous 는 USD 에서 둘 다 Revolute). ③ PhysX export 는 `gearing = −multiplier`, `offset = −offset` 로 부호를 바꾸고, PhysX 는 mimic 에 쓰이는 joint 에 유한 limit 을 요구한다 [S16][S29].
@@ -117,7 +117,7 @@ V3 열은 ADR-0093 본문과 구현된 `V3Joint`(`src/v3-authoring-actions.ts:52
117
117
  - UsdPhysics 는 21.08 에 처음 들어갔다 [S15]. schema 원문 기준 이름은 §2 표와 같다 [S14]. joint 속성은 `rel physics:body0/body1`, `point3f physics:localPos0/localPos1`, `quatf physics:localRot0/localRot1`, `bool physics:jointEnabled`(true), `bool physics:collisionEnabled`(false), `uniform bool physics:excludeFromArticulation`, `float physics:breakForce/breakTorque`(inf).
118
118
  - Revolute·Prismatic: `uniform token physics:axis`(`"X"|"Y"|"Z"`, 기본 `"X"`), `float physics:lowerLimit/upperLimit` (revolute 는 deg, prismatic 은 distance). Spherical: `physics:axis`, `physics:coneAngle0Limit`, `physics:coneAngle1Limit`. Distance: `physics:minDistance`, `physics:maxDistance`. 기본 `PhysicsJoint` 는 6 자유도 모두 풀린 D6 이다 [S14].
119
119
  - `PhysicsLimitAPI:<dof>`(`physics:low`, `physics:high`)와 `PhysicsDriveAPI:<dof>`(`physics:type` = force|acceleration, `maxForce`, `targetPosition`, `targetVelocity`, `damping`, `stiffness`)는 multiple-apply 이고 dof 이름은 `transX, transY, transZ, rotX, rotY, rotZ, distance` [S14].
120
- - frame: joint frame 은 두 body 각각에 대해 정의되며 world 에서 꼭 일치할 필요는 없다(시뮬레이터가 오차를 허용) [S13]. body 의 위치는 body prim 자신의 xformOp 가 정한다. Newton 문서는 URDF joint origin 을 「자식 link 의 xformOp」와 「joint 의 `localPos0/localRot0`」 두 곳에 쓰라고 한다 [S18]. **UsdPhysics joint 는 두 body 사이의 제약을 표현하고, 배치는 body 의 xform 이 정한다.** V3 export 는 평가한 자세로 body xform 을 쓰고, joint frame 을 그 자세와 일치하게 쓴다.
120
+ - frame: joint frame 은 두 body 각각에 대해 정의되며 world 에서 꼭 일치할 필요는 없다(시뮬레이터가 오차를 허용) [S13]. body 의 위치는 body prim 자신의 xformOp 가 정한다. Newton 문서는 URDF joint origin 을 「자식 link 의 xformOp」와 「joint 의 `localPos0/localRot0`」 두 곳에 쓰라고 한다 [S18]. **UsdPhysics joint 는 두 body 사이의 제약을 표현하고, 배치는 body 의 xform 이 정한다.** export 는 평가한 자세로 body xform 을 쓰고, joint frame 을 그 자세와 일치하게 쓴다.
121
121
  - articulation: `PhysicsArticulationRootAPI` 를 fixed base 는 world 와 잇는 fixed joint(또는 조상)에, floating base 는 루트 link 에 둔다. link 마다 들어오는 joint 는 하나, tree 여야 하며 폐루프는 한 joint 에 `excludeFromArticulation` 을 켠다 [S16]. 중첩 강체(body 안의 body)는 25.11 에 표준으로 들어왔다 [S15].
122
122
  - **mimic:** UsdPhysics 에 없다 [S13][S18]. PhysX: `PhysxMimicJointAPI:<axis>` 의 `rel physxMimicJoint:<axis>:referenceJoint`, `physxMimicJoint:<axis>:referenceJointAxis`, `gearing`, `offset`, `naturalFrequency`, `dampingRatio`, 식 `q + gearing·q_ref + offset = 0`, articulation 안의 joint 에만 [S16][S17]. Newton(`newton-usd-schemas` v0.4.1, 2026-07-30): `NewtonMimicAPI` 의 `bool newton:mimicEnabled`, `rel newton:mimicJoint`, `float newton:mimicCoef0`(offset), `float newton:mimicCoef1`(배율), 식 `joint0 = coef0 + coef1·joint1`, 같은 joint type 끼리만 [S19]. Newton 변환기 문서는 관계 이름을 `newton:target` 으로 적었으나 schema 원문은 `newton:mimicJoint` 다 [S18][S19].
123
123
 
@@ -138,7 +138,7 @@ V3 열은 ADR-0093 본문과 구현된 `V3Joint`(`src/v3-authoring-actions.ts:52
138
138
 
139
139
  - `UsdPreviewSurface` 규격 2.6. 입력: `diffuseColor`(0.18 회색), `emissiveColor`, `useSpecularWorkflow`, `specularColor`, `metallic`(0), `roughness`(0.5), `clearcoat`, `clearcoatRoughness`, `opacity`(1), `opacityMode`, `opacityThreshold`, `ior`(1.5), `normal`, `displacement`, `occlusion`. 목적은 플랫폼 간 교환용 기본 재질이다. geometry 와는 `material:binding` 관계로 묶는다 [S22].
140
140
  - MaterialX 는 `UsdMtlx` 로 USD 에서 읽는다. USD 25.05 부터 MaterialX 1.39.3 이 기본이며 OpenPBR 을 쓸 수 있다 [S23, 검색 요약].
141
- - 팔레트 대응: V3 `palette: Record<token, color>`(`src/v3-asset-types.ts:182`) → 쓰인 토큰마다 `/Looks/<token>` 의 `Material` + `UsdPreviewSurface`, `diffuseColor` 에 색, 나머지는 기본값. part 마다 `material:binding`. 토큰 이름도 PrimName 규칙을 따라야 한다(R6 과 같은 매핑).
141
+ - 팔레트 대응: `palette: Record<token, color>`(`src/asset-types.ts:182`) → 쓰인 토큰마다 `/Looks/<token>` 의 `Material` + `UsdPreviewSurface`, `diffuseColor` 에 색, 나머지는 기본값. part 마다 `material:binding`. 토큰 이름도 PrimName 규칙을 따라야 한다(R6 과 같은 매핑).
142
142
 
143
143
  ### 3.8 브라우저에서 USD 읽고 쓰기
144
144