@hatiolab/figure-model 0.1.29 → 0.1.31

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 (146) hide show
  1. package/README.md +2 -0
  2. package/dist/index.d.ts +12 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +11 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/release-contract.d.ts +2 -2
  7. package/dist/release-contract.d.ts.map +1 -1
  8. package/dist/release-contract.js +45 -3
  9. package/dist/release-contract.js.map +1 -1
  10. package/dist/types.d.ts +16 -5
  11. package/dist/types.d.ts.map +1 -1
  12. package/dist/types.js +15 -4
  13. package/dist/types.js.map +1 -1
  14. package/dist/v3-asset-types.d.ts +116 -0
  15. package/dist/v3-asset-types.d.ts.map +1 -0
  16. package/dist/v3-asset-types.js +2 -0
  17. package/dist/v3-asset-types.js.map +1 -0
  18. package/dist/v3-asset.d.ts +8 -0
  19. package/dist/v3-asset.d.ts.map +1 -0
  20. package/dist/v3-asset.js +135 -0
  21. package/dist/v3-asset.js.map +1 -0
  22. package/dist/v3-authoring-session.d.ts +119 -0
  23. package/dist/v3-authoring-session.d.ts.map +1 -0
  24. package/dist/v3-authoring-session.js +132 -0
  25. package/dist/v3-authoring-session.js.map +1 -0
  26. package/dist/v3-capabilities.d.ts +3 -0
  27. package/dist/v3-capabilities.d.ts.map +1 -0
  28. package/dist/v3-capabilities.js +221 -0
  29. package/dist/v3-capabilities.js.map +1 -0
  30. package/dist/v3-contract.d.ts +7 -0
  31. package/dist/v3-contract.d.ts.map +1 -0
  32. package/dist/v3-contract.js +12 -0
  33. package/dist/v3-contract.js.map +1 -0
  34. package/dist/v3-create.d.ts +25 -0
  35. package/dist/v3-create.d.ts.map +1 -0
  36. package/dist/v3-create.js +50 -0
  37. package/dist/v3-create.js.map +1 -0
  38. package/dist/v3-document.d.ts +5 -0
  39. package/dist/v3-document.d.ts.map +1 -0
  40. package/dist/v3-document.js +31 -0
  41. package/dist/v3-document.js.map +1 -0
  42. package/dist/v3-editor-workspace.d.ts +334 -0
  43. package/dist/v3-editor-workspace.d.ts.map +1 -0
  44. package/dist/v3-editor-workspace.js +130 -0
  45. package/dist/v3-editor-workspace.js.map +1 -0
  46. package/dist/v3-graph-types.d.ts +91 -0
  47. package/dist/v3-graph-types.d.ts.map +1 -0
  48. package/dist/v3-graph-types.js +2 -0
  49. package/dist/v3-graph-types.js.map +1 -0
  50. package/dist/v3-graph.d.ts +5 -0
  51. package/dist/v3-graph.d.ts.map +1 -0
  52. package/dist/v3-graph.js +631 -0
  53. package/dist/v3-graph.js.map +1 -0
  54. package/dist/v3-json.d.ts +13 -0
  55. package/dist/v3-json.d.ts.map +1 -0
  56. package/dist/v3-json.js +94 -0
  57. package/dist/v3-json.js.map +1 -0
  58. package/dist/v3-part-edit.d.ts +12 -0
  59. package/dist/v3-part-edit.d.ts.map +1 -0
  60. package/dist/v3-part-edit.js +53 -0
  61. package/dist/v3-part-edit.js.map +1 -0
  62. package/dist/validate.d.ts.map +1 -1
  63. package/dist/validate.js +12 -11
  64. package/dist/validate.js.map +1 -1
  65. package/docs/assembly-constraints-v3.md +141 -0
  66. package/docs/prototypes/README.md +73 -0
  67. package/docs/prototypes/render-dryroom.py +60 -0
  68. package/docs/prototypes/render-full-dryroom.mjs +86 -0
  69. package/docs/prototypes/shapeassembly-probe-results.json +325 -0
  70. package/docs/prototypes/shapeassembly-probe.py +84 -0
  71. package/docs/prototypes/v3-asset-samples.mjs +15 -0
  72. package/docs/prototypes/v3-asset-store.mjs +52 -0
  73. package/docs/prototypes/v3-asset-store.test.mjs +59 -0
  74. package/docs/prototypes/v3-asset.mjs +1 -0
  75. package/docs/prototypes/v3-asset.schema.json +44 -0
  76. package/docs/prototypes/v3-asset.test.mjs +68 -0
  77. package/docs/prototypes/v3-authoring-session.mjs +1 -0
  78. package/docs/prototypes/v3-authoring-session.test.mjs +65 -0
  79. package/docs/prototypes/v3-capability-plan.mjs +1 -0
  80. package/docs/prototypes/v3-capability-plan.test.mjs +56 -0
  81. package/docs/prototypes/v3-capability-samples.mjs +23 -0
  82. package/docs/prototypes/v3-document.mjs +2 -0
  83. package/docs/prototypes/v3-document.schema.json +66 -0
  84. package/docs/prototypes/v3-document.test.mjs +55 -0
  85. package/docs/prototypes/v3-dryroom-mesh.mjs +60 -0
  86. package/docs/prototypes/v3-dryroom-mesh.test.mjs +30 -0
  87. package/docs/prototypes/v3-editor-browser.mjs +97 -0
  88. package/docs/prototypes/v3-editor-workspace.mjs +1 -0
  89. package/docs/prototypes/v3-editor-workspace.test.mjs +35 -0
  90. package/docs/prototypes/v3-feature-pattern.test.mjs +131 -0
  91. package/docs/prototypes/v3-full-conveyor.mjs +60 -0
  92. package/docs/prototypes/v3-full-conveyor.test.mjs +61 -0
  93. package/docs/prototypes/v3-full-dryroom.mjs +67 -0
  94. package/docs/prototypes/v3-full-dryroom.test.mjs +54 -0
  95. package/docs/prototypes/v3-full-forklift.mjs +40 -0
  96. package/docs/prototypes/v3-full-forklift.test.mjs +37 -0
  97. package/docs/prototypes/v3-full-robot.mjs +35 -0
  98. package/docs/prototypes/v3-full-robot.test.mjs +68 -0
  99. package/docs/prototypes/v3-kernel.mjs +147 -0
  100. package/docs/prototypes/v3-kernel.test.mjs +144 -0
  101. package/docs/prototypes/v3-layout.test.mjs +281 -0
  102. package/docs/prototypes/v3-linear-comparison.py +183 -0
  103. package/docs/prototypes/v3-more-samples.test.mjs +182 -0
  104. package/docs/prototypes/v3-payload-collision.mjs +54 -0
  105. package/docs/prototypes/v3-payload-collision.test.mjs +68 -0
  106. package/docs/prototypes/v3-payload-fit.mjs +58 -0
  107. package/docs/prototypes/v3-payload-fit.test.mjs +59 -0
  108. package/docs/prototypes/v3-repeated-binding.mjs +13 -0
  109. package/docs/prototypes/v3-repeated-binding.test.mjs +46 -0
  110. package/docs/prototypes/v3-runtime-browser.mjs +76 -0
  111. package/docs/prototypes/v3-samples.test.mjs +144 -0
  112. package/docs/prototypes/v3-semantics.test.mjs +55 -0
  113. package/docs/prototypes/v3-spatial-plan.test.mjs +102 -0
  114. package/docs/prototypes/v3-typed-plan.mjs +3 -0
  115. package/docs/prototypes/v3-typed-plan.test.mjs +70 -0
  116. package/docs/prototypes/v3-typed-repeat.test.mjs +96 -0
  117. package/docs/v3-asset-persistence.md +66 -0
  118. package/docs/v3-authoring-transactions.md +57 -0
  119. package/docs/v3-capability-bindings.md +109 -0
  120. package/docs/v3-common-kernel-experiment.md +116 -0
  121. package/docs/v3-core-semantics.md +303 -0
  122. package/docs/v3-cutover.md +27 -0
  123. package/docs/v3-design.md +388 -0
  124. package/docs/v3-document-contract.md +55 -0
  125. package/docs/v3-dryroom-profile-validation.md +87 -0
  126. package/docs/v3-editor-integration.md +59 -0
  127. package/docs/v3-full-conveyor-validation.md +69 -0
  128. package/docs/v3-full-dryroom-validation.md +55 -0
  129. package/docs/v3-full-forklift-validation.md +41 -0
  130. package/docs/v3-full-robot-validation.md +64 -0
  131. package/docs/v3-layout-system.md +318 -0
  132. package/docs/v3-minimal-model.md +255 -0
  133. package/docs/v3-operator-contracts.md +148 -0
  134. package/docs/v3-payload-collision-validation.md +42 -0
  135. package/docs/v3-payload-contact-validation.md +56 -0
  136. package/docs/v3-repeated-binding-validation.md +42 -0
  137. package/docs/v3-research-review.md +160 -0
  138. package/docs/v3-runtime-extraction.md +107 -0
  139. package/docs/v3-sample-validation-expanded.md +106 -0
  140. package/docs/v3-sample-validation.md +97 -0
  141. package/docs/v3-shapeassembly-reproduction.md +99 -0
  142. package/docs/v3-spatial-contracts.md +84 -0
  143. package/docs/v3-status.md +41 -0
  144. package/docs/v3-storage-integration.md +58 -0
  145. package/docs/v3-typed-repeat-contracts.md +79 -0
  146. package/package.json +1 -1
@@ -0,0 +1,303 @@
1
+ # Figure Model V3 핵심 의미론 기준안 — r3
2
+
3
+ > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
+
5
+ 실행 가능한 첫 subset: [연산·형상 타입 계약](v3-operator-contracts.md).
6
+ scalar 타입/참조 검증 단계이며 전체 의미론 구현과 구분한다.
7
+ 후속으로 [공간 타입·부착 관계 통합](v3-spatial-contracts.md)을 추가했다.
8
+ 반복의 현재 구현 범위는 [typed 반복 계약](v3-typed-repeat-contracts.md)을 따른다.
9
+
10
+ 상태: **설계 검토 기준안. 출하 명세·구현 완료 아님.**
11
+ 이 문서가 r1/r2의 설계 방향을 대체한다. 과거 실험은 근거와 반례로 보존한다.
12
+ V2 호환성, 기존 property 명칭, 현재 실험 코드의 편의는 설계의 상위 제약이 아니다.
13
+
14
+ ## 1. 제품이 표현하는 것
15
+
16
+ Figure는 **치수와 상태에 반응하는, 이름 있는 형상들의 재사용 가능한 조립체**다.
17
+ 정적인 메시를 늘이는 파일도, 임의 CAD/물리 시뮬레이터도 아니다.
18
+ 사용자는 형상과 관계를 저작하고, 엔진은 동일한 정의에서 형상·배치·부착점·진단을 계산한다.
19
+
20
+ 핵심 가치의 순서:
21
+
22
+ 1. 원하는 외형과 변화 의도를 쉽게 만들고 수정할 수 있다.
23
+ 2. 허용된 입력에서 관계가 유지되며, 불가능한 경우 이유가 명확하다.
24
+ 3. 같은 자산을 저작 화면·2D/3D 사용처·AI·검사기가 같은 뜻으로 읽는다.
25
+ 4. 동일 형상 공유, 인스턴싱, 변경 부분 재계산으로 많은 배치에 대응한다.
26
+
27
+ 단순함은 필드 수가 아니라 **사용자가 동시에 이해해야 하는 독립 규칙의 수**로 평가한다.
28
+ 각종 예외를 옵션으로 붙이는 방식과, 표현력을 낮춰 샘플을 탈락시키는 방식을 모두 경계한다.
29
+
30
+ ## 2. 사용자 의도 → 보존할 불변량
31
+
32
+ | 의도 | 명세가 표현해야 하는 관계 | 하지 않을 추정 |
33
+ | --- | --- | --- |
34
+ | 바닥에 닿는 바퀴 | 바퀴의 아래 접점과 바닥 기준이 일치 | 원형을 유지하면 접지도 된다고 가정 |
35
+ | 두 지지면 사이의 롤러 | 축 끝점 간 거리와 길이가 일치, 반지름은 독립 | 가장 긴 축이 늘어날 축이라고 추정 |
36
+ | 문틀 하단만 잘라내기 | 상단·개구부 유지, 하단 경계만 변경 | 전체 scale로 단면까지 축소 |
37
+ | 셀과 접점 반복 | 하나의 반복 항목에 셀·접점이 함께 속함 | 서로 다른 반복열의 같은 index가 영원히 같은 항목 |
38
+ | 선반 개수 증가 | 배치 정책에 따른 위치, 유지된 key의 정체성 | 위치가 비슷하면 같은 선반 |
39
+ | 링크와 함께 움직이는 공구 | 선언한 연결 변환을 한 번씩 합성 | 이름/근접도에서 운동 상속 추정 |
40
+ | 소비될수록 얇아지는 롤 | 상태가 실제 형상 치수를 변경 | 모든 상태를 rigid joint로 표현 |
41
+ | 닫힌 프레스의 소재 표현 | 의도한 간극 또는 도식적 겹침을 명시 | 모든 겹침은 오류 또는 모두 무시 |
42
+
43
+ 위 표는 단순 기능 목록이 아니라 검증해야 할 관계다. 사용자는 수식을 입력하지 않는다.
44
+
45
+ ## 3. 정본은 한 개, 표현 수준은 두 개
46
+
47
+ **저작 정본:** 단위가 있는 입력, 형상, 연결, 반복, 관계 연산, 검증 조건.
48
+ **실행 계획:** 정본으로부터 생성한 값/형상/좌표계 의존 그래프와 평가 순서.
49
+
50
+ 실행 계획은 캐시이지 두 번째 편집 가능한 모델이 아니다. 캐시를 수정해 정본과 어긋나게 하지 않는다.
51
+ 저작 관계 자체가 의미를 가진다. '붙이기'를 출처 문자열과 임의 식으로만 지우지 않는다.
52
+ UI/AI는 동일 관계의 입력을 변경한다. 저수준 직접 정의로 바꿀 때는 관계 교체라는 명시 작업이다.
53
+ 계산 결과 좌표를 움직였다는 이유로 관계를 몰래 끊지 않는다.
54
+
55
+ 개념은 다음 다섯 묶음으로 제한한다.
56
+
57
+ - **값:** 입력과 계산된 값, 단위·정의역·의존성.
58
+ - **형상:** 파라미터에서 생성되는 geometry와 이름 있는 feature.
59
+ - **연결:** 자기 기준과 대상 기준 사이의 상대 배치·운동.
60
+ - **반복:** 같은 조립체 정의의 유한한 인스턴스 집합.
61
+ - **조건:** 의도한 관계/허용 영역에 대한 검사. 계산 값을 몰래 고치지 않는다.
62
+
63
+ 재질·표시·외부 capability는 이 핵심 결과를 소비하는 부가 계약이다. 삭제 대상이 아니며
64
+ 공간 계산을 바꾸는 우회 수단으로 사용하지 않는다.
65
+
66
+ ## 4. 값과 정의역
67
+
68
+ 입력은 설계 입력 d, 상태 입력 q, 정적 선택 c로 구분한다.
69
+
70
+ - d: 폭, 두께, 반복 pitch 등 재구성이 허용되는 입력.
71
+ - q: 관절 각도, 승강량, 소비율 등 인스턴스 연속 상태.
72
+ - c: provider 종류, template 선택 등 저작 변경으로만 바꾸는 구조.
73
+
74
+ 길이·각도·시간·무차원 비율·정수 개수·bool을 구별한다. 저장/실행 표준 단위는
75
+ 길이 mm, 각도 rad, 시간 s로 정규화한다. UI는 deg/%를 변환한다.
76
+ 실험 커널의 deg 숫자는 이 계약을 구현한 것이 아니다.
77
+
78
+ 덧셈/비교는 같은 차원만, 곱셈/나눗셈은 차원 합성으로 타입을 결정한다.
79
+ 삼각함수는 각도→무차원, 나눗셈은 0 아닌 분모라는 정의역을 가진다.
80
+ vector/point는 좌표계 타입도 가진다. 서로 다른 frame의 좌표는 명시 변환 없이 더하지 않는다.
81
+ 임의 스크립트는 허용하지 않는다. 지원 연산은 버전이 있는 순수 연산 catalog로 제한한다.
82
+
83
+ 입력의 개별 min/max만으로 정의역이 끝나지 않는다.
84
+ 예: 외폭>2*벽두께, 이동량≤현재 mast의 유효 길이는 서로 의존하는 조건이다.
85
+ 현재 평가점의 유효성과 선언한 전체 영역에서의 유효성을 별도로 기록한다.
86
+ 임의 clamp는 금지한다. 제한 동작 자체가 의도라면 named saturation 연산과 UI 설명이 필요하다.
87
+
88
+ ## 5. 정의·연립 관계·검사의 분리
89
+
90
+ 각 결과 포트는 **정확히 하나의 소유 연산**이 계산한다. 그 연산은 결과 여러 개를 함께 낼 수 있다.
91
+ 따라서 'single writer'는 '모든 관계를 한 방향의 한 줄 식으로 써야 한다'는 뜻이 아니다.
92
+
93
+ 예: `between`은 두 경계와 여백으로 길이·중심을 함께 계산한다.
94
+ 길이 L과 중심 C를 별도 연산이 다시 덮어쓰면 컴파일 오류다.
95
+
96
+ ```text
97
+ L = high − low − marginLow − marginHigh
98
+ C = (low + high + marginLow − marginHigh) / 2
99
+ precondition: L > 0
100
+ ```
101
+
102
+ 상호 의존 관계가 필요한 경우, 외부 입력과 미지수를 명시한 **관계 블록** 내부에서 해결할 수 있다.
103
+ 블록 사이의 의존성은 DAG다. 순환하는 임의 runtime graph를 반복 실행해 수렴시키지 않는다.
104
+
105
+ 관계 블록의 채택 조건:
106
+
107
+ 1. 연산 종류/버전, 입력, 소유 출력, 정의역, 실패 의미가 명시된다.
108
+ 2. 유일한 결과를 구성하거나, 선택 기준을 모델이 명시한다.
109
+ 3. 여러 해/불능/수치 판정 불확실을 구분한다.
110
+ 4. 이전 실행값과 제약 삽입 순서가 숨은 선택 기준이 되지 않는다.
111
+
112
+ 일반 solver를 무조건 배제하지도, 전역 solver에 모든 의도를 맡기지도 않는다.
113
+ 초기 채택 대상은 닫힌 계산식으로 정의 가능한 관계 연산이다.
114
+ 선형 연립 블록은 별도 후보: A*x=b에서 rank(A)=미지수 수이고 일관된 경우만 직접 승인 가능하다.
115
+ 부등식·선호도가 포함된 문제는 해 선택 목적과 동률 정책이 없는 한 계산 정의로 승인하지 않는다.
116
+ 부동소수 rank 판정의 임계값/조건수 정책이 미정인 현재 이 블록은 **미구현·출하 보류**다.
117
+
118
+ assertion은 결과를 검사할 뿐 소유 출력이 없다. '접촉해야 한다'는 assertion만 추가한다고
119
+ 위치가 자동으로 바뀌지 않는다. UI는 접촉을 만드는 연결과 그 검사를 한 작업으로 생성한다.
120
+
121
+ ## 6. 형상과 feature는 같은 정의에서 나온다
122
+
123
+ provider는 동일 파라미터 p(d,q)에서 다음을 함께 정의한다.
124
+
125
+ ```text
126
+ Geometry = G(p)
127
+ LocalFeature[k] = F_k(p)
128
+ ValidGeometry = D(p)
129
+ ```
130
+
131
+ feature는 점, 방향, 유향 좌표계, 곡선 또는 표면 패치처럼 종류를 가진다.
132
+ 점 하나를 선택했다고 방향까지 유일해진 것으로 취급하지 않는다.
133
+ 면 결합에는 법선뿐 아니라 twist를 결정하는 tangent/명시 방향이 필요하다.
134
+ 곡면의 '접점'은 대상 방향/파라미터가 주어져야 하며 AABB 면으로 대체하지 않는다.
135
+
136
+ box의 면 중심, cylinder의 축 끝점, portal의 opening/top/bottom은 provider 치수에서 유도된다.
137
+ polygon은 정점/edge의 안정된 id와 extrusion 축을 명시한다.
138
+ 반올림/중공/단면 수정으로 feature가 사라지면 `FEATURE_UNAVAILABLE`이며 다른 면으로 대체하지 않는다.
139
+ 메시 삼각형 번호는 영속 feature id가 아니다.
140
+
141
+ geometry 치수에 이미 반영한 크기를 scene scale로 다시 적용하지 않는다.
142
+ 프레임은 SE(3)의 강체 변환만 전달한다. 비균일 변형은 provider의 형상 파라미터가 맡는다.
143
+ 원형과 타원형은 geometry의 서로 다른 의미이며 '무조건 원형 유지'를 전역 규칙으로 두지 않는다.
144
+
145
+ ## 7. 연결의 수학적 의미
146
+
147
+ 열벡터, 오른손 좌표계, Y 위, rigid transform 곱은 오른쪽부터 적용한다.
148
+ 각 부품의 world pose W는 하나의 연결 연산이 소유한다.
149
+ 연결은 대상 feature의 world frame A, 자기 feature의 local frame B,
150
+ 대상 feature 좌표에서의 상대 배치 O와 연결 상태 변환 J로 정의한다.
151
+
152
+ ```text
153
+ W = A · O · J(q) · inverse(B)
154
+ 따라서 W · B = A · O · J(q)
155
+ ```
156
+
157
+ J=I이면 자기 기준이 대상 기준에 offset O만큼 정확히 일치한다.
158
+ hinge/slide는 연결 좌표계에서 정의되며, 사용자가 지정한 resting state q₀에서 J(q₀)=I다.
159
+ 위 식의 동일성은 동일 시점의 B(p(d,q))를 사용해야 한다. 자기 형상이 바뀌어도
160
+ 부착 기준이 유지되도록 inverse(B)도 다시 계산한다.
161
+
162
+ 같은 면에 붙이는 것과 마주 보는 두 면을 결합하는 것은 다르다.
163
+ 법선을 반대로 해야 하는 mating은 O의 명시적인 회전으로 표현한다. 엔진이 방향을 추측하지 않는다.
164
+
165
+ 다른 부품의 치수를 참조하는 일은 그 부품의 운동 상속을 뜻하지 않는다.
166
+ 정지 형상의 위치만 참고하고 운동은 따라가지 않는 요구는 명시된 rest feature 평가로 표현한다.
167
+ rest(q₀)와 live(q) 참조는 타입/의존성이 구별되며 숨은 '상속 무시' 옵션이 아니다.
168
+ 같은 q₀와 d에서 rest/live가 일치해야 한다.
169
+
170
+ 두 기준에 동시에 물리는 폐쇄 기구는 부모를 두 개 넣어 표현하지 않는다.
171
+ pose를 함께 소유하는 검증된 관계 블록이 필요하다. 현재 지원 완료로 주장하지 않는다.
172
+
173
+ ## 8. 반복: 개수·배치·정체성의 분리
174
+
175
+ 반복 대상은 primitive가 아니라 **완전한 조립체 template**다.
176
+ 셀과 접점, 선반과 표시등은 한 항목 안에서 feature로 연결한다.
177
+ 항목 배치 뒤 내부 운동을 평가하므로 roller를 돌려도 반복열이 함께 돌지 않는다.
178
+
179
+ 반복의 핵심 입력은 key 집합과 각 key의 배치다. `고정 개수`, `일정 pitch로 채우기`는
180
+ 이를 생성하는 표준 관계 연산이지 별도 geometry sizing 모드가 아니다.
181
+
182
+ 일정 pitch p, 배치 축에 투영한 항목 외곽 길이 e, 양끝 여백 a,b, 가용 길이 L:
183
+
184
+ ```text
185
+ usable = L − a − b
186
+ n = 0 if usable < e
187
+ n = 1 + floor((usable − e) / p) otherwise
188
+ occupied = 0 if n = 0
189
+ occupied = e + (n−1)*p otherwise
190
+ slack = usable − occupied (n > 0)
191
+ center(i) = start + a + e/2 + α*slack + i*p
192
+ ```
193
+
194
+ p>0, e>0, a,b≥0, α∈[0,1]. α=0/0.5/1은 시작/중앙/끝 정렬이다.
195
+ 엔진이 시작 정렬을 보편적 정답으로 강제하지 않는다. α는 연산의 명시 입력이다.
196
+ n=0이면 항목 위치를 평가하지 않는다. 최소 개수 조건이 1 이상이면 공간 부족으로 거절한다.
197
+ 최대 개수 초과는 resource limit 진단이며 몰래 잘라내지 않는다.
198
+ e>p가 항상 오류는 아니다. 비겹침이 의도일 때 e≤p 조건을 추가한다.
199
+
200
+ e는 반복 결과 전체의 bounds를 다시 측정한 값이 아니라 항목이 선언한 layout envelope에서 온다.
201
+ envelope와 실제 형상 관계는 별도 검증한다. q에 따라 움직이는 물체의 현재 bounds로
202
+ 개수를 매 프레임 바꾸지 않는다. 초안에서 topology는 d,c만 의존한다.
203
+ 상태로 부품 생성/삭제가 필수인 사례는 이 제한을 다시 검토할 사유이며 우회 opacity로 숨기지 않는다.
204
+
205
+ 인스턴스 id는 `(asset-local pattern id, item key, template-local entity id)`의 조합이다.
206
+ 라벨·배열 정렬·화면 좌표는 id가 아니다.
207
+ 순서형 생성기의 key는 정수 ordinal이다. 같은 key가 남으면 같은 항목이며,
208
+ 중앙 정렬에서는 그 위치가 바뀔 수 있다. 물리적 선반의 영속 id가 필요하면 explicit key 목록을 사용한다.
209
+
210
+ 사라진 항목의 필수 참조는 `TARGET_ABSENT`로 평가를 실패시킨다. 선택 참조는 absent 값을
211
+ 명시적으로 처리해야 한다. 가까운 항목으로 자동 재지정하지 않는다.
212
+ 재등장 시 같은 key를 재사용하되 외부 작업 상태를 되살리는 정책은 자산 배치 계층이 명시한다.
213
+
214
+ ## 9. 의존 그래프와 평가
215
+
216
+ 값→geometry 파라미터→local feature→연결→world feature 같은 의존성을 하나의 그래프로 검사한다.
217
+ '모든 값 먼저, 모든 frame 나중'이라는 고정 순서는 충분하지 않다.
218
+ 서로 독립된 두 world feature 사이 거리에서 다른 부품 길이가 나오는 경우도 표현해야 한다.
219
+ 반대로 자기 길이가 자기 배치의 거리 측정에 다시 의존하면 순환이다.
220
+ 숨은 재시도 대신 cycle 경로를 내거나 명시 관계 블록으로 바꾼다.
221
+
222
+ 컴파일 단계는 schema/타입/id/출력 소유권/provider/정적 의존성을 검사한다.
223
+ 평가 단계는 d,c로 topology를 전개하고, 구체 그래프의 참조·cycle·예산을 재검사한 뒤
224
+ q를 포함한 값을 계산한다. 모두 성공한 snapshot만 렌더러/AI/검사기에 전달한다.
225
+ 부분 성공을 현재 모델 위에 덧붙이지 않는다.
226
+
227
+ 유한 전개, DAG, 각 연산의 정의역·결정성·단일 결과가 성립하면 결과는 위상 순서에 무관하게 유일하다.
228
+ 이는 임의 제약계의 해가 존재한다는 증명이 아니다. GPU 간 픽셀 동일성이나
229
+ 부동소수 bit 동일성도 별도 구현 계약 없이 보장하지 않는다.
230
+
231
+ ## 10. 유효성·실패·증거
232
+
233
+ | 분류 | 예시 | 반응 |
234
+ | --- | --- | --- |
235
+ | invalid definition | 단위 오류, 중복 writer, cycle | 컴파일 거절 |
236
+ | inadmissible input | 두께보다 작은 폭, 범위 밖 상태 | 현재 요청 거절, 원인 입력/부족량 제시 |
237
+ | unavailable target | 삭제 항목, 사라진 feature | 자동 대체 없이 필수/선택 참조 정책 적용 |
238
+ | failed assertion | 선언한 간극·접촉 불만족 | 해당 조건과 실제/기대값 제시 |
239
+ | unverified | 전 범위 접촉·충돌 검증 없음 | 성공 인증으로 표시하지 않음 |
240
+ | advisory | 성능 예산 경고, 외형 변경 영향 | 원인과 선택 가능 행동 제시 |
241
+
242
+ provider의 실제 형상/접촉 검사와 AABB 근접 검사를 같은 등급으로 표시하지 않는다.
243
+ 증거에는 source hash, 연산/provider 버전, 입력 영역 또는 표본, 오차 기준, 방법을 남긴다.
244
+ 정확 산술/보수적 bound 검증/표본 통과를 구분한다. 비선형 식에 corner sample만 적용해
245
+ 전 범위 보장이라고 부르지 않는다.
246
+ 위치 오차와 각도 오차는 별개다. 표시 반올림은 계산에 피드백하지 않는다.
247
+ floor 경계의 부동소수 정책은 release-blocking 미결 항목이며 임의 epsilon을 숨겨 넣지 않는다.
248
+
249
+ ## 11. 사용자·AI 편집 계약
250
+
251
+ UI와 AI는 동일한 typed transaction을 사용한다.
252
+ source revision 확인 → 변경 의도/영향 미리보기 → compile/평가 → 원자 적용 → undo 기록 순서다.
253
+ 저장·발행·씬 배치는 별도 단계로 표시한다. 화면 적용을 저장 성공으로 표현하지 않는다.
254
+
255
+ - '붙이기': 대상/자기 feature를 고르고 offset을 조정. 계산된 position 직접 덮어쓰기 금지.
256
+ - '아래 돌출 없애기': 상단 유지와 변경 하단을 명시. provider가 지원하는 profile 편집을 사용.
257
+ - '늘리기': 길이만, 전체 비례, 고정 pitch 반복 등 **해당 관계의 조정 가능 입력**을 보여준다.
258
+ - '조건 충돌 해결': 바꿀 입력과 잃는 의도를 설명하는 후보를 제시. 사용자 승인 없이 조건 삭제 금지.
259
+
260
+ AI의 자유 텍스트가 geometry나 외부 바인딩을 직접 바꾸지 않는다.
261
+ 프로퍼티 패널과 채팅은 서로 다른 명세를 만들지 않는다.
262
+ 수식 없는 대표 작업의 성공률·조작 수·원하지 않은 관계 해제 수를 실제로 측정해야 한다.
263
+
264
+ ## 12. 실행 성능과 호환 이행
265
+
266
+ 모든 feature/frame를 scene node로 만들 필요는 없다.
267
+ 구조 compile, geometry 파라미터 변경, rigid pose 변경의 무효화 범위를 분리한다.
268
+ 형상 캐시 key에는 provider/version/해결된 geometry 파라미터/품질이 들어가고 위치는 넣지 않는다.
269
+ 병합/인스턴싱은 시각·재질·독립 운동·선택/feature 참조를 보존하는 범위에서 적용한다.
270
+ 정점 수, draw call, resolve/compile 시간, 캐시 적중과 메모리를 실제 규모에서 측정한다.
271
+ 수치 없는 '고성능 보장'은 하지 않는다.
272
+
273
+ 제품은 V3 단일 실행 체계로 전환한다. 기존 자산은 일회성 변환 또는 V3 재작성으로 교체하며 V2 reader 병행 운영은 요구하지 않는다.
274
+ 복구용 원본 보관은 데이터 교체의 안전 절차이지 모델 설계 제약이 아니다.
275
+ 현재 좌표를 고정한 변환과 반응형 의도를 복원한 재작성을 같은 성공으로 보고하지 않는다.
276
+
277
+ ## 13. 확정 조건과 남은 결정
278
+
279
+ 이 기준안은 구멍을 없앴다는 선언이 아니라 구멍을 판정할 계약이다.
280
+ 출하 전에 다음을 모두 완료해야 한다.
281
+
282
+ 1. provider catalog: 기존 형상·단면·round/hollow·material·capability를 포함한 feature/domain 명세.
283
+ 2. 표준 관계 catalog와 JSON schema: 단위·포트 소유권·오류·허용 dependency 규칙.
284
+ 3. floor 경계, 오차 전파, quaternion/축 규약, solver 후보 수치 정책.
285
+ 4. 전체 모델 4종 이상을 proxy 없이 작성하고 실제 렌더러에서 크기×상태×topology 비교.
286
+ 5. 나머지 16종의 표현성 검증 및 미지원 의도 목록. 통과를 위해 명세를 샘플 이름으로 분기하지 않음.
287
+ 6. 모델러·AI 공통 편집, 삭제 참조, undo/save/reopen, V2 import, 다수 배치 성능 검증.
288
+
289
+ **다음 구현은 이 의미론의 subset임을 명시하고 시작한다.** 현재 커널의 무차원 숫자,
290
+ Y축 cylinder, feature의 방향 없는 point, 단순 floor(span/pitch)는 이 문서의 완전한 구현이 아니다.
291
+ 그 코드를 지키려고 기준안을 낮추지 않는다.
292
+
293
+ ## 14. 기준안의 독립 수치 검사
294
+
295
+ `node --test docs/prototypes/v3-semantics.test.mjs`
296
+
297
+ - 부착식: 자기 feature 크기·회전·상태 45조합에서 `W*B=A*O*J` 확인.
298
+ - 반복식: 정수 길이/경계와 3개 정렬을 조합한 3,000건을 순차 배치 oracle과 비교.
299
+ - 기존 `floor(L/pitch)`가 실제 수용 개수를 과소·과대 계산하는 반례 모두 확인.
300
+
301
+ 3개 검사 통과. 기존 커널/feature-pattern 검사와 함께 실행한 17개 검사도 통과했다.
302
+ 부착 회전 표본은 Z축 회전이므로 임의 3축 회전 커버리지를 주장하지 않는다.
303
+ 실수 경계의 반올림 정책, 전체 schema/단위 시스템, 관계 블록 구현을 검증한 것은 아니다.
@@ -0,0 +1,27 @@
1
+ # V3 단일 체계 전환 — 작업 기준
2
+
3
+ > 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
4
+
5
+ 사용자 결정: **V2 호환성과 병행 운영은 요구사항이 아니다.** V3의 단순성·일관성·저작성·품질을 우선한다. 이전 문서의 V2 유지/버전별 편집 경로를 다음 단계로 삼은 내용은 철회한다.
6
+
7
+ 제품 모델러·AI·저장·렌더러는 V3 하나를 기준으로 전환한다. 기존 자산도 V3 기준으로 변환하거나 재작성한다. 원본 보관은 데이터 복구 수단일 뿐 V2 실행 경로 유지 조건이 아니다. 기존 데이터의 파괴적 교체는 대상 확인과 복구본 확보 후 별도로 수행한다.
8
+
9
+ ## 이번 변경
10
+
11
+ - figure-ui와 figure-service에 직전에 추가했던 V2/V3 차단 전용 코드와 테스트를 제거했다.
12
+ - 형식 해석 실패 시 다른 자산 ID로 기존 모델을 저장하지 않도록 하는 일반적인 로드 오류 처리는 유지했다. 이는 호환 기능이 아니라 데이터 손실 방지다.
13
+ - `createV3Asset(name)`은 부품 없는 빈 자산을 만든다. 기본 상자는 자동 생성하지 않는다.
14
+ - `addV3Box(asset, request)`는 명시적 부품 추가 요청을 표준 V3 shape/rigid/place 노드와 9개 설계 입력(크기·위치·회전)으로 만든다. 별도의 레거시 parts 원본을 만들지 않는다.
15
+ - 중복 식별자, 잘못된 치수·재질은 거부한다. 입력 자산은 수정하지 않고 검증된 새 자산을 반환한다.
16
+
17
+ ## 검증과 범위
18
+
19
+ 상자 생성 함수 구현 당시 소스 테스트454개가 통과했다. 이후 트랜잭션 검증을 추가한 최신 수치는 [통합 현황](v3-status.md)을 따른다. Chrome에서 빈 자산0개 → 상자1개 → 높이2000→1500mm 편집 → 저장 JSON 복원 경로를 검증했다. 기존 네 대표 자산과 편집 workspace의 브라우저 비교도 통과했다.
20
+
21
+ 상자 추가 순수 함수를 workspace의 `addBox` 트랜잭션으로 연결했다. 부품 추가와 입력 수정은 같은 50단계 undo/redo 이력을 사용한다. 구조 변경도 미저장 상태에 반영되며, 잘못된 추가는 이력·revision·원본을 바꾸지 않는다. 저장 이후 undo하면 저장본과 달라졌음을 다시 표시한다.
22
+
23
+ 격리 UI에 새 Figure·상자 추가·다시 실행 버튼을 연결했다. Chrome에서 빈 자산 → 추가 → 높이 수정 → 수정 취소 → 생성 취소(빈 캔버스) → 두 단계 재실행 → 파일 저장/복원을 통과했다. 소스 테스트455개 및 빌드 통과. 화면을 직접 확인했다. 이는 제품3300 화면 배포가 아니다.
24
+
25
+ 제품의 버튼 연결, 다른 primitive 생성, 관계 편집, 실제 DB 저장·렌더러 전환은 아직 완료하지 않았다. 위치와 크기를 바꿔 바닥을 유지하려면 두 입력을 함께 편집해야 한다. 이번 상자 생성은 조립 관계를 자동 추론하지 않는다.
26
+
27
+ 이제 다음 제품 작업은 V3 생성·편집 명령을 실제 모델러의 사용자 동작에 연결하는 것이다. 호환 분기 추가는 하지 않는다. 패키지 설치·배포는 소스 구현과 구별해 확인한다.