@hatiolab/figure-model 0.1.75 → 0.1.77
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.
- package/CHANGELOG.md +11 -0
- package/README.md +60 -138
- package/dist/index.d.ts +2 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -26
- package/dist/index.js.map +1 -1
- package/dist/v3-asset-types.d.ts +1 -2
- package/dist/v3-asset-types.d.ts.map +1 -1
- package/dist/v3-asset.js +1 -1
- package/dist/v3-asset.js.map +1 -1
- package/dist/v3-authoring-actions.d.ts +9 -12
- package/dist/v3-authoring-actions.d.ts.map +1 -1
- package/dist/v3-authoring-actions.js +4 -5
- package/dist/v3-authoring-actions.js.map +1 -1
- package/dist/v3-capabilities.js +4 -1
- package/dist/v3-capabilities.js.map +1 -1
- package/dist/v3-cost.d.ts.map +1 -1
- package/dist/v3-cost.js +3 -5
- package/dist/v3-cost.js.map +1 -1
- package/dist/v3-create.d.ts +1 -1
- package/dist/v3-create.d.ts.map +1 -1
- package/dist/v3-editor-workspace.d.ts +38 -0
- package/dist/v3-editor-workspace.d.ts.map +1 -1
- package/dist/v3-editor-workspace.js +14 -0
- package/dist/v3-editor-workspace.js.map +1 -1
- package/dist/v3-examples.js +1 -1
- package/dist/v3-gate.d.ts +7 -8
- package/dist/v3-gate.d.ts.map +1 -1
- package/dist/v3-gate.js +11 -14
- package/dist/v3-gate.js.map +1 -1
- package/dist/v3-graph.d.ts +1 -2
- package/dist/v3-graph.d.ts.map +1 -1
- package/dist/v3-graph.js +5 -7
- package/dist/v3-graph.js.map +1 -1
- package/dist/v3-instance-size.d.ts +3 -5
- package/dist/v3-instance-size.d.ts.map +1 -1
- package/dist/v3-instance-size.js +2 -4
- package/dist/v3-instance-size.js.map +1 -1
- package/dist/v3-kernel-version.d.ts +1 -1
- package/dist/v3-kernel-version.js +1 -1
- package/dist/v3-part-edit.d.ts +4 -5
- package/dist/v3-part-edit.d.ts.map +1 -1
- package/dist/v3-part-edit.js +2 -2
- package/dist/v3-part-edit.js.map +1 -1
- package/dist/v3-proposal.d.ts +42 -0
- package/dist/v3-proposal.d.ts.map +1 -0
- package/dist/v3-proposal.js +179 -0
- package/dist/v3-proposal.js.map +1 -0
- package/dist/v3-release-contract.js +1 -1
- package/dist/v3-release-contract.js.map +1 -1
- package/dist/v3-score.d.ts +4 -5
- package/dist/v3-score.d.ts.map +1 -1
- package/dist/v3-score.js +7 -8
- package/dist/v3-score.js.map +1 -1
- package/dist/v3-words.d.ts +87 -0
- package/dist/v3-words.d.ts.map +1 -0
- package/dist/v3-words.js +87 -0
- package/dist/v3-words.js.map +1 -0
- package/docs/assembly-constraints-v3.md +13 -23
- package/docs/v3-asset-persistence.md +4 -4
- package/docs/v3-common-kernel-experiment.md +1 -1
- package/docs/v3-core-semantics.md +3 -3
- package/docs/v3-cutover.md +5 -3
- package/docs/v3-design.md +13 -26
- package/docs/v3-editor-integration.md +2 -2
- package/docs/v3-full-conveyor-validation.md +3 -3
- package/docs/v3-layout-system.md +1 -1
- package/docs/v3-minimal-model.md +0 -1
- package/docs/v3-motion-contract.md +21 -56
- package/docs/v3-runtime-extraction.md +7 -7
- package/docs/v3-sample-validation-expanded.md +1 -1
- package/docs/v3-sample-validation.md +1 -1
- package/docs/v3-shape-dimension-contract.md +23 -57
- package/docs/v3-status.md +5 -5
- package/docs/v3-storage-integration.md +4 -4
- package/package.json +2 -20
- package/dist/blueprint-shape.d.ts +0 -10
- package/dist/blueprint-shape.d.ts.map +0 -1
- package/dist/blueprint-shape.js +0 -194
- package/dist/blueprint-shape.js.map +0 -1
- package/dist/blueprint.d.ts +0 -73
- package/dist/blueprint.d.ts.map +0 -1
- package/dist/blueprint.js +0 -388
- package/dist/blueprint.js.map +0 -1
- package/dist/cost-chart.d.ts +0 -35
- package/dist/cost-chart.d.ts.map +0 -1
- package/dist/cost-chart.js +0 -150
- package/dist/cost-chart.js.map +0 -1
- package/dist/cost.d.ts +0 -162
- package/dist/cost.d.ts.map +0 -1
- package/dist/cost.js +0 -194
- package/dist/cost.js.map +0 -1
- package/dist/gate.d.ts +0 -65
- package/dist/gate.d.ts.map +0 -1
- package/dist/gate.js +0 -284
- package/dist/gate.js.map +0 -1
- package/dist/grouping.d.ts +0 -121
- package/dist/grouping.d.ts.map +0 -1
- package/dist/grouping.js +0 -224
- package/dist/grouping.js.map +0 -1
- package/dist/keys.d.ts +0 -45
- package/dist/keys.d.ts.map +0 -1
- package/dist/keys.js +0 -84
- package/dist/keys.js.map +0 -1
- package/dist/origin.d.ts +0 -33
- package/dist/origin.d.ts.map +0 -1
- package/dist/origin.js +0 -46
- package/dist/origin.js.map +0 -1
- package/dist/release-contract.d.ts +0 -38
- package/dist/release-contract.d.ts.map +0 -1
- package/dist/release-contract.js +0 -246
- package/dist/release-contract.js.map +0 -1
- package/dist/sizing.d.ts +0 -231
- package/dist/sizing.d.ts.map +0 -1
- package/dist/sizing.js +0 -550
- package/dist/sizing.js.map +0 -1
- package/dist/types.d.ts +0 -1233
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -547
- package/dist/types.js.map +0 -1
- package/dist/v3-from-v2.d.ts +0 -203
- package/dist/v3-from-v2.d.ts.map +0 -1
- package/dist/v3-from-v2.js +0 -2053
- package/dist/v3-from-v2.js.map +0 -1
- package/dist/v3-mesh-compare.d.ts +0 -24
- package/dist/v3-mesh-compare.d.ts.map +0 -1
- package/dist/v3-mesh-compare.js +0 -55
- package/dist/v3-mesh-compare.js.map +0 -1
- package/dist/validate.d.ts +0 -7
- package/dist/validate.d.ts.map +0 -1
- package/dist/validate.js +0 -1119
- package/dist/validate.js.map +0 -1
- package/dist/visual-evidence.d.ts +0 -21
- package/dist/visual-evidence.d.ts.map +0 -1
- package/dist/visual-evidence.js +0 -52
- package/dist/visual-evidence.js.map +0 -1
- package/docs/design.md +0 -193
- package/docs/format-survey.md +0 -108
- package/docs/format.md +0 -704
- package/docs/sizing.md +0 -183
- package/docs/validation.md +0 -357
|
@@ -6,18 +6,16 @@
|
|
|
6
6
|
|
|
7
7
|
## 결정 요약
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
있어도 portal·gate·lamp 중 무엇을 어떤 관계로 복구해야 하는지는 알 수 없다.
|
|
9
|
+
독립 부품의 기하·재질·축별 크기 반응만으로는 부품들이 **어떤 조립 의도로 붙어 있는지**를
|
|
10
|
+
표현하지 못한다. 기준 상자 면에만 매달리는 배치와 관절 운동 계층만으로는 게이트가 갈라짐을
|
|
11
|
+
측정할 수 있어도 portal·gate·lamp 중 무엇을 어떤 관계로 복구해야 하는지는 알 수 없다.
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
독립 부품 해석은 과거 데이터 읽기용 이행 경로일 뿐, 새 모델의 품질 기준은 아니다.
|
|
13
|
+
이 초안은 `assemblies`를 정본 계약으로 도입한다. 조립체는 기준 부품, 멤버, 그리고 검증·수정
|
|
14
|
+
가능한 관계 제약을 선언한다.
|
|
17
15
|
|
|
18
16
|
## 사용자 약속
|
|
19
17
|
|
|
20
|
-
저작자는
|
|
18
|
+
저작자는 기준 상자 면을 조합해서 장비를 맞추지 않는다. 모델러는 다음처럼 의도를 입력한다.
|
|
21
19
|
|
|
22
20
|
```
|
|
23
21
|
portal-in 에 붙이기
|
|
@@ -61,11 +59,11 @@ type Face = 'min-x' | 'max-x' | 'min-y' | 'max-y' | 'min-z' | 'max-z'
|
|
|
61
59
|
## 해석 순서
|
|
62
60
|
|
|
63
61
|
```text
|
|
64
|
-
|
|
62
|
+
Figure v3 원본
|
|
65
63
|
→ 부품의 기본 transform·sizing 계산
|
|
66
64
|
→ assembly root의 최종 상자 계산
|
|
67
65
|
→ assembly constraint를 위상 순서로 적용
|
|
68
|
-
→ 최종
|
|
66
|
+
→ 최종 scene transform
|
|
69
67
|
→ 제약 검사 + 1×·2× 크기 반응 검사
|
|
70
68
|
```
|
|
71
69
|
|
|
@@ -83,9 +81,8 @@ rest pose와 인스턴스 크기 반응을 담당한다. 두 역할을 섞지
|
|
|
83
81
|
| `assembly-cycle` | 관계 계산 순환 | 저장 차단 |
|
|
84
82
|
| `assembly-constraint-broken` | 기준 크기에서 면·상대치수 불일치 | 발행 차단 |
|
|
85
83
|
| `assembly-scales-apart` | 확대 시 선언한 관계가 깨짐 | 발행 차단 |
|
|
86
|
-
| `assembly-ambiguous` | 이행된 부품이 물리적으로 닿지만 관계가 선언되지 않음 | 전환 검토 |
|
|
87
84
|
|
|
88
|
-
자동 수정은
|
|
85
|
+
자동 수정은 배치 후보를 무작위 조합하지 않는다.
|
|
89
86
|
|
|
90
87
|
1. 깨진 제약과 root를 찾는다.
|
|
91
88
|
2. 제약 해석기로 멤버의 transform/반응 규칙을 다시 계산한다.
|
|
@@ -109,20 +106,14 @@ rest pose와 인스턴스 크기 반응을 담당한다. 두 역할을 섞지
|
|
|
109
106
|
}
|
|
110
107
|
```
|
|
111
108
|
|
|
112
|
-
이 계약은 “lamp
|
|
109
|
+
이 계약은 “lamp를 기준 상자 윗면에 붙여 본다”가 아니라 “lamp가 portal 상단에서 60mm를
|
|
113
110
|
유지한다”를 보존한다. 따라서 기준 상자의 비율 변화에도 수정을 설명하고 검증할 수 있다.
|
|
114
111
|
|
|
115
|
-
##
|
|
112
|
+
## 원칙
|
|
116
113
|
|
|
117
|
-
1. `version: 3`은 새 저작·AI·발행의 기준 계약이다. 새 모델은 기준 상자
|
|
114
|
+
1. `version: 3`은 새 저작·AI·발행의 기준 계약이다. 새 모델은 기준 상자 배치만으로
|
|
118
115
|
조립 의도를 표현하지 않는다.
|
|
119
|
-
2.
|
|
120
|
-
근접·이름·기존 anchor를 근거로 조립 관계 후보를 만들고, 사용자가 의도를 확인한다.
|
|
121
|
-
3. 확인된 v3 전환 결과가 기존 동작보다 조립·확대 품질이 낮으면 전환을 거절한다. “깨지지
|
|
122
|
-
않음”보다 “의도를 더 정확히 보존함”이 기준이다.
|
|
123
|
-
4. 과거에 이미 발행된 판은 당시 원본과 해석기를 함께 보관해 재현성을 유지한다. 이는 v2
|
|
124
|
-
설계를 계속 발전시키겠다는 뜻이 아니라 과거 화면을 거짓으로 바꾸지 않기 위한 기록 보존이다.
|
|
125
|
-
5. 새 Figure와 새 AI 후보는 v3 제약이 없는 상태로 저장되지 않는다. 독립 부품뿐인 단순
|
|
116
|
+
2. 새 Figure와 새 AI 후보는 v3 제약이 없는 상태로 저장되지 않는다. 독립 부품뿐인 단순
|
|
126
117
|
Figure는 빈 조립체 목록을 명시한다.
|
|
127
118
|
|
|
128
119
|
## 완료 기준
|
|
@@ -132,7 +123,6 @@ rest pose와 인스턴스 크기 반응을 담당한다. 두 역할을 섞지
|
|
|
132
123
|
- 의도적으로 독립인 port/slot은 조립체에 넣지 않아도 거짓 차단되지 않는다.
|
|
133
124
|
- AI가 새 Figure와 편집 후보 모두에서 유효한 assembly 제약을 생성한다.
|
|
134
125
|
- 게이트는 깨진 조립 제약에 대해 검증된 복합 초안 수정안을 제시한다.
|
|
135
|
-
- v2 전환 표본은 새 관계 계약 아래에서 기존보다 낮은 조립·확대 품질을 내지 않는다.
|
|
136
126
|
|
|
137
127
|
## 명시적 비목표
|
|
138
128
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
- [네 대표 모델 자산 생성 예제](prototypes/v3-asset-samples.mjs)
|
|
12
12
|
- [검증 테스트](prototypes/v3-asset.test.mjs)
|
|
13
13
|
|
|
14
|
-
버전은 `figure-v3-asset-1`이다. **정식 Figure V3 전체 포맷
|
|
14
|
+
버전은 `figure-v3-asset-1`이다. **정식 Figure V3 전체 포맷 완료를 뜻하지 않는다.**
|
|
15
15
|
|
|
16
16
|
## 저장 항목
|
|
17
17
|
|
|
@@ -42,7 +42,7 @@ appearance는 모든 `place@1`/`member@1`에 정확히 하나씩 필요하다.
|
|
|
42
42
|
|
|
43
43
|
원기둥 분할 수는 현재 지원 preset으로 명시 저장한다. 사용자에게 분할 수 직접 입력 UI를 추가하지 않았다. 다른 provider에 임의의 segments를 붙이는 것은 거부한다. 재질은 token/preset/transparent/emissive 범위를 지원하며 미지원 필드를 조용히 버리지 않고 거부한다.
|
|
44
44
|
|
|
45
|
-
부품에
|
|
45
|
+
부품에 붙이는 capability 메타데이터는 정본에 자리를 두지 않는다(2026-09-23). 자리만 남겨 두면 검증된 binding과 구별되지 않기 때문이다. `slot`을 `seat`/`grip`으로 자동 해석하지도 않는다. 이 의미를 V3로 가져오려면 검증되는 binding으로 다시 저작한다.
|
|
46
46
|
|
|
47
47
|
## 검증 결과
|
|
48
48
|
|
|
@@ -59,8 +59,8 @@ appearance는 모든 `place@1`/`member@1`에 정확히 하나씩 필요하다.
|
|
|
59
59
|
|
|
60
60
|
## 남은 제품화 범위
|
|
61
61
|
|
|
62
|
-
- 예제 생성기는 V3로 이미 재저작한 모델을 포장한다.
|
|
63
|
-
- 원본에 없는 기능을 복원했다고 주장하지 않는다. 기존 자산은 V3
|
|
62
|
+
- 예제 생성기는 V3로 이미 재저작한 모델을 포장한다. 범용 마이그레이터가 아니다.
|
|
63
|
+
- 원본에 없는 기능을 복원했다고 주장하지 않는다. 기존 자산은 V3로 재작성하며, 실제 데이터 교체 전에 대상과 복구본을 확인한다.
|
|
64
64
|
- 네 대표 모델을 넘는 provider/material 확장, 입력 라벨/저작 메타데이터 등은 정식 포맷에서 추가 정의해야 한다.
|
|
65
65
|
- 파일 시스템 원자적 교체·권한·DB revision 충돌·업로드/다운로드 API는 없다. 함수는 문자열을 반환하며 제품 저장소에 직접 쓰지 않는다.
|
|
66
66
|
- 실제 속성창·AI-dock·새 모델/다른 모델 전환·재접속은 통합 테스트가 남아 있다.
|
|
@@ -9,7 +9,7 @@ scalar 타입/참조 검증 단계이며 전체 의미론 구현과 구분한다
|
|
|
9
9
|
|
|
10
10
|
상태: **설계 검토 기준안. 출하 명세·구현 완료 아님.**
|
|
11
11
|
이 문서가 r1/r2의 설계 방향을 대체한다. 과거 실험은 근거와 반례로 보존한다.
|
|
12
|
-
|
|
12
|
+
기존 property 명칭, 현재 실험 코드의 편의는 설계의 상위 제약이 아니다.
|
|
13
13
|
|
|
14
14
|
## 1. 제품이 표현하는 것
|
|
15
15
|
|
|
@@ -271,7 +271,7 @@ AI의 자유 텍스트가 geometry나 외부 바인딩을 직접 바꾸지 않
|
|
|
271
271
|
정점 수, draw call, resolve/compile 시간, 캐시 적중과 메모리를 실제 규모에서 측정한다.
|
|
272
272
|
수치 없는 '고성능 보장'은 하지 않는다.
|
|
273
273
|
|
|
274
|
-
제품은 V3 단일 실행
|
|
274
|
+
제품은 V3 단일 실행 체계를 쓴다. 기존 자산은 V3 재작성으로 교체한다.
|
|
275
275
|
복구용 원본 보관은 데이터 교체의 안전 절차이지 모델 설계 제약이 아니다.
|
|
276
276
|
현재 좌표를 고정한 변환과 반응형 의도를 복원한 재작성을 같은 성공으로 보고하지 않는다.
|
|
277
277
|
|
|
@@ -285,7 +285,7 @@ AI의 자유 텍스트가 geometry나 외부 바인딩을 직접 바꾸지 않
|
|
|
285
285
|
3. floor 경계, 오차 전파, quaternion/축 규약, solver 후보 수치 정책.
|
|
286
286
|
4. 전체 모델 4종 이상을 proxy 없이 작성하고 실제 렌더러에서 크기×상태×topology 비교.
|
|
287
287
|
5. 나머지 16종의 표현성 검증 및 미지원 의도 목록. 통과를 위해 명세를 샘플 이름으로 분기하지 않음.
|
|
288
|
-
6. 모델러·AI 공통 편집, 삭제 참조, undo/save/reopen,
|
|
288
|
+
6. 모델러·AI 공통 편집, 삭제 참조, undo/save/reopen, 다수 배치 성능 검증.
|
|
289
289
|
|
|
290
290
|
**다음 구현은 이 의미론의 subset임을 명시하고 시작한다.** 현재 커널의 무차원 숫자,
|
|
291
291
|
Y축 cylinder, feature의 방향 없는 point, 단순 floor(span/pitch)는 이 문서의 완전한 구현이 아니다.
|
package/docs/v3-cutover.md
CHANGED
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
> 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
|
-
사용자 결정:
|
|
5
|
+
사용자 결정: 제품은 V3 하나를 쓴다. V3의 단순성·일관성·저작성·품질을 우선하며, 버전별 편집 경로는 두지 않는다.
|
|
6
6
|
|
|
7
|
-
제품 모델러·AI·저장·렌더러는 V3 하나를 기준으로
|
|
7
|
+
제품 모델러·AI·저장·렌더러는 V3 하나를 기준으로 한다. 기존 자산은 V3로 재작성한다. 기존 데이터의 파괴적 교체는 대상 확인과 복구본 확보 후 별도로 수행한다.
|
|
8
|
+
|
|
9
|
+
V2와 V1은 2026-09-26 코드와 명세에서 제거했다. ADR-0087의 전환은 제거로 마쳤다.
|
|
8
10
|
|
|
9
11
|
## 이번 변경
|
|
10
12
|
|
|
11
|
-
- figure-ui와 figure-service에 직전에 추가했던
|
|
13
|
+
- figure-ui와 figure-service에 직전에 추가했던 형식 버전 차단 전용 코드와 테스트를 제거했다.
|
|
12
14
|
- 형식 해석 실패 시 다른 자산 ID로 기존 모델을 저장하지 않도록 하는 일반적인 로드 오류 처리는 유지했다. 이는 호환 기능이 아니라 데이터 손실 방지다.
|
|
13
15
|
- `createV3Asset(name)`은 부품 없는 빈 자산을 만든다. 기본 상자는 자동 생성하지 않는다.
|
|
14
16
|
- `addV3Box(asset, request)`는 명시적 부품 추가 요청을 표준 V3 shape/rigid/place 노드와 9개 설계 입력(크기·위치·회전)으로 만든다. 별도의 레거시 parts 원본을 만들지 않는다.
|
package/docs/v3-design.md
CHANGED
|
@@ -23,25 +23,14 @@ v3의 핵심은 **치수에 따라 달라지는 3차원 배치 함수**다. 문
|
|
|
23
23
|
쓴다. 임의 CAD, 물리 시뮬레이션, 일반 비선형 제약 해결은 초기 범위 밖이다. 지원하지 않는
|
|
24
24
|
관계를 그럴듯한 결과로 대체하지 않고 지원 범위를 명시한다.
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
| `src/sizing.ts` | anchor는 Figure 기준 상자의 축에 대한 위치·크기 반응 | 부품의 개구부·부착 좌표계를 직접 참조하지 못한다 |
|
|
35
|
-
| `src/types.ts`, `src/grouping.ts`, `jointOriginPosition` | parent/joint와 부모를 따라 변하는 관절 원점은 이미 있다 | 관계가 전혀 없는 것이 아니라 크기 배치 관계가 부족하다 |
|
|
36
|
-
| `src/gate.ts: spansAt/meets/clumpsOf` | AABB의 연결 개수 증가를 검사 | 실제 접촉·개구부 맞춤·어떤 부품에 연결됐는지 보장하지 못한다 |
|
|
37
|
-
| `src/gate.ts: remedyFor` | 다른 덩어리의 느리게 커지는 부품을 골라 조언 | 실제 맞댄 면을 증명하지 않고 수정 방향을 단정할 수 있다 |
|
|
38
|
-
| `src/gate.ts: sizingReport` | 기본적으로 기준 크기와 7종 2배 검사 | 연속 치수 범위·축소·운동 상태의 증명이 아니다 |
|
|
39
|
-
| anchor 후보 탐색 | 제한된 수정 조합을 탐색 | 실패했다고 v2로 해결 불가능한 것은 아니다 |
|
|
40
|
-
| `src/grouping.ts`, things-scene `figure-real-object.ts` | 재질·운동 frame·크기 반응으로 병합/분리 | 관계 추가가 무료 성능을 보장하지 않는다 |
|
|
41
|
-
|
|
42
|
-
드라이룸에서 복합 수정안이 생성되지 않은 것은 관찰했다. 고정 revision의 원본을 확보해
|
|
43
|
-
원인과 모든 대안을 검증한 상태는 아니다. 앞서 탐색 실패를 곧바로 모델 표현력의 불가능성으로
|
|
44
|
-
설명한 것은 과도했다. v3 설계의 근거는 일반적인 조립 의도와 일관된 배치 계산의 필요성이다.
|
|
26
|
+
관계 없는 단독 상자도 정상 모델이며, 미완성 초안의 저장을 금지하지 않는다.
|
|
27
|
+
|
|
28
|
+
## 2. 설계의 근거
|
|
29
|
+
|
|
30
|
+
v3 설계의 근거는 일반적인 조립 의도와 일관된 배치 계산의 필요성이다. 배치는 기준 상자의 축만이
|
|
31
|
+
아니라 부품의 개구부·부착 좌표계를 직접 참조해야 한다. 검사는 상자의 연결 개수가 아니라 실제
|
|
32
|
+
접촉·맞춤을, 몇 가지 배율이 아니라 선언한 치수 범위·축소·운동 상태를 다뤄야 한다. 관계를
|
|
33
|
+
추가한다고 성능 이득이 보장되지는 않는다.
|
|
45
34
|
|
|
46
35
|
## 3. 형식적 문제 정의
|
|
47
36
|
|
|
@@ -195,7 +184,7 @@ geometry provider는 shape spec과 함께 해당 feature binding을 반환해야
|
|
|
195
184
|
compile:
|
|
196
185
|
schema/units/IDs → single writer check → resolve references
|
|
197
186
|
→ dependency DAG → cycle diagnostic → topological order
|
|
198
|
-
→ affine coefficients → domain obligations →
|
|
187
|
+
→ affine coefficients → domain obligations → Prepared
|
|
199
188
|
|
|
200
189
|
resolve(d):
|
|
201
190
|
check d∈D → evaluate dimensions/features/rest frames
|
|
@@ -317,7 +306,7 @@ inspectResolved(prepared, resolved, profile): Inspection
|
|
|
317
306
|
|
|
318
307
|
Prepared는 식/순서/컨테이너/feature binding/geometry spec/운동 구조를,
|
|
319
308
|
Resolved는 실제 크기/rigid frame/feature/slot/port를 반환한다.
|
|
320
|
-
source version,
|
|
309
|
+
source version, Prepared version, evaluator semantic version을 분리한다.
|
|
321
310
|
2D·3D는 같은 Resolved를 소비하고 관계 의미를 재구현하지 않는다.
|
|
322
311
|
|
|
323
312
|
compile은 자산 변경 시, layout은 치수 변경 시, pose는 상태 변경 시 처리한다.
|
|
@@ -339,7 +328,7 @@ driver는 실행 의미이므로 advisory로 무시할 수 없다. required/advi
|
|
|
339
328
|
|
|
340
329
|
| 상태 | 처리 |
|
|
341
330
|
| --- | --- |
|
|
342
|
-
| 불명 참조/순환/중복 writer | 실행 불가 진단, 작업 초안 보관 가능, 정상
|
|
331
|
+
| 불명 참조/순환/중복 writer | 실행 불가 진단, 작업 초안 보관 가능, 정상 자산으로 배포 불가 |
|
|
343
332
|
| domain 밖/음수 치수 | 해당 크기 사용 불가; 마지막 정상 표시라면 현재 결과가 아님을 명시 |
|
|
344
333
|
| required assertion 위반 | 선언한 지원 범위에서 발행 불가 |
|
|
345
334
|
| required assertion 미증명 | 위반 확정과 구분; 보장 정책/범위 조정 또는 추가 검증 필요 |
|
|
@@ -369,11 +358,9 @@ AI와 자동 수정은 typed edit API를 사용한다. 후보에 baseRevision/so
|
|
|
369
358
|
전역 차단 항목이 0이어야만 수정을 제공하는 조건은 폐기한다. 국소 해결과 남은 문제를 구분한다.
|
|
370
359
|
의미/외형을 훼손하며 검사만 통과한 후보를 안전하다고 표시하지 않는다.
|
|
371
360
|
|
|
372
|
-
## 16.
|
|
361
|
+
## 16. 식별자와 구현 단계
|
|
373
362
|
|
|
374
|
-
id는 불변, label은 표시 이름이다. 기존 name 기반 외부 참조는 자산
|
|
375
|
-
변환은 원본/hash 보존, v3 후보, 기계적 변환, 의도 선택, 미검증 진단을 반환한다.
|
|
376
|
-
v2의 잘못된 동작을 보존할 의무는 없다. 의도적으로 바뀐 외형은 승인된 차분으로 기록한다.
|
|
363
|
+
id는 불변, label은 표시 이름이다. 기존 name 기반 외부 참조는 자산 재작성 시 갱신한다.
|
|
377
364
|
초안 저장과 발행 조건을 분리한다. 미지원 consumer에 v3를 부분 해석해 보내지 않는다.
|
|
378
365
|
|
|
379
366
|
세부 구현 순서와 출하 조건은 [상위 레이아웃 계약 §12](v3-layout-system.md#12-출하-전-단계와-완료-기준)를 따른다.
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
|
|
46
46
|
## 제품 연결 시 주의점
|
|
47
47
|
|
|
48
|
-
현재 figure-ui의 `client/modeller/figure-source.ts`는 장면 파트를 저장용
|
|
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`로 가장해 전달하면 원본이 이중화된다.
|
|
49
49
|
|
|
50
|
-
제품 모델러·저장·AI·렌더러를 V3 단일 경로로 전환한다. 기존 자산은
|
|
50
|
+
제품 모델러·저장·AI·렌더러를 V3 단일 경로로 전환한다. 기존 자산은 V3로 재작성한다. 호환 분기는 만들지 않는다. 제품에서는 src에서 빌드한 공용 API를 사용한다.
|
|
51
51
|
|
|
52
52
|
## 아직 해결하지 않은 범위
|
|
53
53
|
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
- 브라우저: `node docs/prototypes/render-full-dryroom.mjs --conveyor`
|
|
12
12
|
- 전체 테스트: `node --test docs/prototypes/v3-*.test.mjs`
|
|
13
13
|
|
|
14
|
-
##
|
|
14
|
+
## 끝 롤러 공간을 먼저 확보하는 이유
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
끝 공간을 따로 두지 않고 일반 롤러를 중심 간격 150mm로 길이 전체에 깔면, 기본 길이 2,400mm에서 일반 롤러는 16개다. 양 끝 일반 롤러 중심은 ±1,125mm이며, 별도의 굵은 끝 롤러 중심은 ±1,140mm다.
|
|
17
17
|
|
|
18
18
|
일반 롤러 반지름 48mm, 끝 롤러 반지름 75mm이고 중심 거리는 15mm이므로, `15 + 48 < 75`다. 일반 롤러 길이 520mm도 끝 롤러 길이 560mm보다 작다. 즉 **일반 롤러 두 개가 끝 롤러 내부에 완전히 묻힌다.** 축 방향 회전으로 이 문제는 해결되지 않는다.
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
그래서 양쪽 끝 공간을 먼저 확보한다.
|
|
21
21
|
|
|
22
22
|
```
|
|
23
23
|
끝 여백 = 끝 롤러 중심의 가장자리 거리 60 + 반지름 75 + 최소 간격 10 = 145mm
|
package/docs/v3-layout-system.md
CHANGED
|
@@ -302,7 +302,7 @@ AI: 동일 typed transaction, sourceHash 사전조건, atomic apply, undo, 변
|
|
|
302
302
|
| L1 production kernel | schema/DAG/measure/allocate/arrange | cycle, writer, NaN, overflow, 결정성, fuzz |
|
|
303
303
|
| L2 geometry/motion | 모든 지원 primitive의 치수·feature 계약 | bounds/개구부/normal, shear, pose 합성 |
|
|
304
304
|
| L3 modeller | 계층 편집·미리보기·undo·AI transaction | 원클릭 편집, 동시 변경, 오류 복구 E2E |
|
|
305
|
-
| L4 consumer
|
|
305
|
+
| L4 consumer | 2D/3D 공통 결과 | 실제 드라이룸/롤 프레스, 회귀 스냅샷 |
|
|
306
306
|
| L5 비용/범위 | 1/100/500 instance, 범위 검증 | p95·draw call·메모리 실측, 증명 분류 |
|
|
307
307
|
|
|
308
308
|
r1은 레이아웃 규칙의 검토 가능한 기준안이다. 전체 v3 출하 명세/구현이 끝났다는 뜻이 아니다.
|
package/docs/v3-minimal-model.md
CHANGED
|
@@ -234,7 +234,6 @@ UI는 원인 입력을 수정하는 후보를 만들 수 있지만 evaluator가
|
|
|
234
234
|
- 값 DAG/feature frame은 반드시 scene node로 만들지 않는다. compile에서 정리한다.
|
|
235
235
|
- compile은 저작 변경, dimension resolve는 크기 변경, pose는 상태 변경 때 수행한다.
|
|
236
236
|
- 동일 치수/재질/운동의 병합·공유 가능성을 실제 renderer에서 측정한다.
|
|
237
|
-
- v2→v3 변환은 원본 보존, id/외부 binding 대응, 외형 차분, 의도 선택을 포함한다.
|
|
238
237
|
- 새 Figure는 독립 상태에서 시작하고 실패한 후보는 기존 장면에 덧붙이지 않는다.
|
|
239
238
|
- typed edit는 sourceHash 검사, 원자 적용, undo, 재송신 멱등성을 갖춘다.
|
|
240
239
|
- 발행 정책은 invalid / assertion violation / unverified / advisory를 구별한다.
|
|
@@ -2,12 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Status: **contract, fixed 2026-09-22; revised the same day after the chief architect's review; implemented the
|
|
4
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`),
|
|
6
|
-
|
|
7
|
-
defines motion on its own. Not yet covered by the converter: prismatic joints (none in the live assets; V2 scaled
|
|
8
|
-
their travel by the instance, the contract does not), scale channels (refused as shape deformation), a rotation
|
|
9
|
-
channel with a pivot off the part centre, channels that vary more than one axis, and parameter curves other than
|
|
10
|
-
two linear keys. The review changed three things: the direction of every transform is written down, continuous
|
|
5
|
+
`src/v3-driver.ts` (`driverValue`, `driverStates`, `validateV3Drivers`), tests in `src/v3-motion.test.ts`. Every
|
|
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
|
|
11
7
|
rotation is split into an accumulated amount and a phase, and drivers carry an explicit time convention.
|
|
12
8
|
|
|
13
9
|
## What a person sees
|
|
@@ -19,7 +15,7 @@ moves. Setting the value back to its default puts the arm exactly where it was d
|
|
|
19
15
|
|
|
20
16
|
On a board, the same arm has the same six values. A connector writes them; the arm follows. Stretching the arm's
|
|
21
17
|
instance size does not change where its joints turn: a joint sits on the part that carries it and moves with that
|
|
22
|
-
part under sizing
|
|
18
|
+
part under sizing.
|
|
23
19
|
|
|
24
20
|
## One rule for how a child moves, with every direction written down
|
|
25
21
|
|
|
@@ -37,15 +33,15 @@ part under sizing, as ADR-0066 decision 3 already says for V2.
|
|
|
37
33
|
- `jointParent` and `jointChild` are two named frames per joint, `<joint>.onParent` and `<joint>.onChild`. They
|
|
38
34
|
**coincide at `q = 0`**: `motion(0)` is the identity, and the two frames are placed so that the child then sits in
|
|
39
35
|
its rest pose.
|
|
40
|
-
- A part with no joint to its parent has `motion = identity
|
|
41
|
-
- The parent and child joint frames come from the rest pose and sizing
|
|
36
|
+
- A part with no joint to its parent has `motion = identity`.
|
|
37
|
+
- The parent and child joint frames come from the rest pose and sizing, so a joint moves
|
|
42
38
|
with the part that carries it when the instance is resized.
|
|
43
39
|
- `attach@1` already computes `A × O × inverse(B)`, and its type checker refuses a chain whose frames do not meet.
|
|
44
40
|
No parent-chain node is added; `compose@1` and `attach@1` are enough.
|
|
45
41
|
|
|
46
|
-
**`q = 0` is the rest pose. That is not the same claim as "the default is the rest pose."** A
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
**`q = 0` is the rest pose. That is not the same claim as "the default is the rest pose."** A state input's default
|
|
43
|
+
may be non-zero. The joint frames are placed for the pose at `q = 0`, and the state default is stored as authored;
|
|
44
|
+
nothing subtracts the default or forces it to 0.
|
|
49
45
|
|
|
50
46
|
## Joint kinds, their state input, and the two motion operators
|
|
51
47
|
|
|
@@ -64,10 +60,10 @@ axis-slide@1 args [ax, ay, az (ratio), q (length)] params { from, to }
|
|
|
64
60
|
- An arbitrary axis is carried as three numbers and turned with axis–angle. It is **never** collapsed into one
|
|
65
61
|
Euler component.
|
|
66
62
|
|
|
67
|
-
|
|
|
63
|
+
| joint type | state input | unit stored | `motion(q)` |
|
|
68
64
|
|---|---|---|---|
|
|
69
|
-
| `revolute` | one angle, `role: 'state'`,
|
|
70
|
-
| `prismatic` | one length, `role: 'state'`,
|
|
65
|
+
| `revolute` | one angle, `role: 'state'`, joint limits as range | rad (an input may declare `deg`; the kernel converts) | `axis-turn@1` |
|
|
66
|
+
| `prismatic` | one length, `role: 'state'`, joint limits as range | mm | `axis-slide@1` |
|
|
71
67
|
| `continuous` | one **phase** angle, `role: 'state'`, range `[−180°, 180°)` | rad | `axis-turn@1` |
|
|
72
68
|
|
|
73
69
|
### Continuous rotation: an amount and a phase, not a limit
|
|
@@ -86,16 +82,15 @@ values first would interpolate 350 → 10 and turn the wrong way. Widening the r
|
|
|
86
82
|
|
|
87
83
|
## Parameters
|
|
88
84
|
|
|
89
|
-
A
|
|
90
|
-
`
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
readers, which the graph already allows.
|
|
85
|
+
A parameter is a state input: `id` is its name, `unit` and `min`/`max` give its range, `role: 'state'`, and the
|
|
86
|
+
asset's `stateDefaults` carries its default. Its target is the joint (or part channel) whose `motion(q)` reads it. A
|
|
87
|
+
parameter that drives several joints is one input read by several `axis-turn@1` nodes: one writer, many readers,
|
|
88
|
+
which the graph already allows.
|
|
94
89
|
|
|
95
90
|
## Drivers: the asset declares, figure-model evaluates, the consumer owns time
|
|
96
91
|
|
|
97
|
-
The kernel has **no clock**. Same inputs, same result, always.
|
|
98
|
-
|
|
92
|
+
The kernel has **no clock**. Same inputs, same result, always. An animation is a **driver** declaration on the asset,
|
|
93
|
+
not a graph node. Responsibilities:
|
|
99
94
|
|
|
100
95
|
| who | does |
|
|
101
96
|
|---|---|
|
|
@@ -119,9 +114,7 @@ drivers: [{
|
|
|
119
114
|
```
|
|
120
115
|
|
|
121
116
|
- **Time convention, one for all drivers.** `time.unit` is seconds; `duration` is the clip length in seconds; every
|
|
122
|
-
key `at` is a fraction of the duration in `[0, 1]`.
|
|
123
|
-
`duration`, fractions in `at`, ADR-0051 ②) into exactly this and records the source form in the report. A driver
|
|
124
|
-
with a missing or non-positive duration is refused.
|
|
117
|
+
key `at` is a fraction of the duration in `[0, 1]`. A driver with a missing or non-positive duration is refused.
|
|
125
118
|
- **Loop end.** `wrap`: time `t` maps to `t mod duration`, and the sample at `duration` equals the sample at 0 (the
|
|
126
119
|
last key's value is reached at `at = 1` and the next period starts from key 0). For an accumulating driver, wrapping
|
|
127
120
|
adds the full-period delta to the accumulated value, so the roller keeps turning rather than snapping back.
|
|
@@ -131,45 +124,17 @@ drivers: [{
|
|
|
131
124
|
source per state** explicitly (`driver` or `external`). Values are never summed and "last call wins" is not a
|
|
132
125
|
rule. figure-model's validation refuses two drivers naming the same state.
|
|
133
126
|
|
|
134
|
-
A
|
|
135
|
-
|
|
136
|
-
clip with `accumulates: true`. The conveyor's rotation animation is therefore carried, not lost.
|
|
137
|
-
|
|
138
|
-
## What the converter does with the seven motion assets
|
|
139
|
-
|
|
140
|
-
1. For every `FigureJoint`: two joint frames from the rest pose and sizing, one state input, one `axis-turn@1` or
|
|
141
|
-
`axis-slide@1`, one `attach@1`, and the child's `place@1` reads the attached pose.
|
|
142
|
-
2. For every part with `parent` and no joint: `compose@1` of the parent's pose and the rigid offset.
|
|
143
|
-
3. For every `parameter`: a state input as above; refuse (`PARAMETER_TARGET`) if its target is not a joint or a part
|
|
144
|
-
channel this contract covers.
|
|
145
|
-
4. For every animation clip: a driver, with the clip's channels mapped to state inputs; refuse
|
|
146
|
-
(`ANIMATION_CHANNEL`) for a channel path this contract does not cover (`scale`).
|
|
127
|
+
A part that spins without a joint (the conveyor roller) has a continuous state input on that part, `<part>.spin`,
|
|
128
|
+
driving an `axis-turn@1` about the part's own axis, and a driver with `accumulates: true`.
|
|
147
129
|
|
|
148
130
|
## Two corrections to earlier wording
|
|
149
131
|
|
|
150
132
|
- **Rigid does not mean affine in the state.** A rigid pose is affine in the spatial coordinates it maps, but a
|
|
151
133
|
rotation matrix is a sin/cos function of the joint angle. So `axis-turn@1` is **not affine in `q`**, and the
|
|
152
134
|
operator-list guard is restated: `geomean@1` is the only node that is non-affine in the *design inputs*;
|
|
153
|
-
`axis-turn@1` is non-affine in a *state input*.
|
|
154
|
-
the rest pose and does not become a proof of equivalence under motion.
|
|
135
|
+
`axis-turn@1` is non-affine in a *state input*.
|
|
155
136
|
- **Rotation is compared as a relative angle**, the angle of `R₂ · R₁ᵀ`, never as a difference of Euler components.
|
|
156
137
|
|
|
157
|
-
## "The same" for motion (completion criterion)
|
|
158
|
-
|
|
159
|
-
For every converted motion asset, V2 and V3 are compared at the base size and the doubled sizes with:
|
|
160
|
-
|
|
161
|
-
- each joint at its default, its mid-point and both limits;
|
|
162
|
-
- **parent and child joints changed at the same time**, not one at a time;
|
|
163
|
-
- at least one joint with an arbitrary (non-principal) axis;
|
|
164
|
-
- a non-zero default, checked at the default and away from it;
|
|
165
|
-
- a continuous joint just before and just after the phase boundary (e.g. 179° and 181°);
|
|
166
|
-
- a looping driver just before and just after the loop end (e.g. 0.99 and 1.01 durations), and a `hold` driver past
|
|
167
|
-
its end.
|
|
168
|
-
|
|
169
|
-
Same part list, same centre and extents within 1 mm, same relative rotation within 0.1°. For each driver, the state
|
|
170
|
-
value at time 0, half and end must equal V2's clip value at those times. Exact conversion and deliberate
|
|
171
|
-
re-authoring are marked separately in the report.
|
|
172
|
-
|
|
173
138
|
## Not in this contract
|
|
174
139
|
|
|
175
140
|
- Inverse kinematics, reach checks, collision between links. Consumers may add them on top; the kernel does not.
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
> 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
|
-
> 최신 작업 기준: [V3 단일 체계 전환](v3-cutover.md). 아래의
|
|
5
|
+
> 최신 작업 기준: [V3 단일 체계 전환](v3-cutover.md). 아래의 버전별 제품 연결 방향은 과거 작업 기록이며, 향후 설계 조건에서 제외한다.
|
|
6
6
|
|
|
7
7
|
## 이번 이관 범위
|
|
8
8
|
|
|
9
|
-
실험용 JSON 입력 검사와 오류 계약을 `src/v3-json.ts`, `src/v3-contract.ts`의 strict TypeScript 소스로 옮겼다. 기본 빌드에서 JS·타입 선언을 생성하며 기존 package 루트에서 이름이 구분된 API로 내보낸다. package.json
|
|
9
|
+
실험용 JSON 입력 검사와 오류 계약을 `src/v3-json.ts`, `src/v3-contract.ts`의 strict TypeScript 소스로 옮겼다. 기본 빌드에서 JS·타입 선언을 생성하며 기존 package 루트에서 이름이 구분된 API로 내보낸다. package.json·의존성은 변경하지 않았다.
|
|
10
10
|
|
|
11
11
|
| 공개 API | 책임 |
|
|
12
12
|
|---|---|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
| v3Utf8ByteLength | 브라우저와 서버의 동일 UTF-8 바이트 계산 |
|
|
16
16
|
| V3ContractError | code/path를 가진 공통 오류 |
|
|
17
17
|
|
|
18
|
-
**parseV3Json은 모델 의미 검증기가 아니다.** JSON
|
|
18
|
+
**parseV3Json은 모델 의미 검증기가 아니다.** JSON 형식만 올바르면 V3 자산이 아닌 객체도 읽는다. V3 자산 버전·단위·그래프·appearance 검사는 여전히 자산 컴파일러가 담당한다. 공개된 이름이 전체 V3 지원이나 안정화 완료를 뜻하지 않는다.
|
|
19
19
|
|
|
20
20
|
## 단일 구현 유지
|
|
21
21
|
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
2026-09-21:
|
|
29
29
|
|
|
30
|
-
- `npm test`:
|
|
30
|
+
- `npm test`: 당시 소스 전체와 새 입력 경계 검사 포함 **442개 통과**.
|
|
31
31
|
- `node --test docs/prototypes/v3-*.test.mjs`: **143개 통과**.
|
|
32
32
|
- `npm run build`: 성공, JS와 타입 선언 생성.
|
|
33
33
|
- `node docs/prototypes/v3-runtime-browser.mjs`: 실제 Chrome에서 빌드된 ESM 실행 성공. Buffer/process가 없는 상태에서 한글·이모지 UTF-8 계산과 이스케이프 중복 키 거부 확인.
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
|
|
37
37
|
## 그래프 평가기 이관
|
|
38
38
|
|
|
39
|
-
`src/v3-graph.ts`에 기존 평가기 전체를 옮기고 루트 API에 `compileV3Graph`를 추가했다.
|
|
39
|
+
`src/v3-graph.ts`에 기존 평가기 전체를 옮기고 루트 API에 `compileV3Graph`를 추가했다. `src/v3-graph-types.ts`는 입력/상수/노드, 단위·차원, 좌표계 타입, 형상·배치, 평가 결과와 컴파일된 계획의 공개 타입을 정의한다.
|
|
40
40
|
|
|
41
41
|
실험 진입점 `docs/prototypes/v3-typed-plan.mjs`는 두 export만 남긴 호환 어댑터다. 단위 계산·위상 정렬·좌표계 검사·형상 생성·반복 배치의 구현을 두 벌 유지하지 않는다. 기존 연산자 버전과 실패 코드를 유지했다.
|
|
42
42
|
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
| v3-asset.ts | compileV3Asset, parseV3Asset, serializeV3Asset, captureV3AuthoredInputs |
|
|
63
63
|
| v3-asset-types.ts | 문서·자산·재질·binding 선언 및 평가 결과 타입 |
|
|
64
64
|
|
|
65
|
-
버전 식별자는 기존 실험 버전을 유지한다. 정식 소스에 포함되었다고 파일 포맷 안정화나 제품 저장 허용을 선언하지 않는다. package.json
|
|
65
|
+
버전 식별자는 기존 실험 버전을 유지한다. 정식 소스에 포함되었다고 파일 포맷 안정화나 제품 저장 허용을 선언하지 않는다. package.json은 변경하지 않았다.
|
|
66
66
|
|
|
67
67
|
유지한 계약:
|
|
68
68
|
|
|
@@ -104,4 +104,4 @@ workspace 이관 당시 검증: 소스 테스트 **451개**, V3 실험 테스트
|
|
|
104
104
|
|
|
105
105
|
핵심 입력·그래프·capability·자산·편집 workspace는 src로 이관했다. 제품의 저장·발행·편집·렌더러를 V3 단일 체계로 전환해야 하며, 제품 연결은 아직 미완료다. 파일 저장 실험도 제품 DB 구현으로 간주하지 않는다. 접촉/충돌 연구 모듈과 대표 모델 생성기는 계속 실험 영역에 있다.
|
|
106
106
|
|
|
107
|
-
다음 단계는 V3 단일 저작·저장·렌더링 경로의 제품 연결이다. 기존 자산은 V3 기준으로 바꾼다.
|
|
107
|
+
다음 단계는 V3 단일 저작·저장·렌더링 경로의 제품 연결이다. 기존 자산은 V3 기준으로 바꾼다. 제품 API 배포는 아직 수행하지 않았다.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> 현재 구현·검증·제품 연결 상태는 [V3 통합 현황](v3-status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
2026-09-20. [1차 검사](v3-sample-validation.md)의 후속이다.
|
|
6
|
-
|
|
6
|
+
**당시 기존 함수 검사 / 명시한 v3 의도 후보 계산 / 기구학 수치 실험**을 구별한다.
|
|
7
7
|
테스트가 통과했다는 것은 아래 관찰이 재현됐다는 뜻이며, 결함이 해결됐다는 뜻이 아니다.
|
|
8
8
|
제품 소스, 서버, 원본 샘플을 변경하지 않았다.
|
|
9
9
|
|
|
@@ -41,7 +41,7 @@ node --test docs/prototypes/v3-samples.test.mjs
|
|
|
41
41
|
|
|
42
42
|
### 로봇암: 좌표계는 가능하지만 링크 크기 변경은 별도 문제
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
원본 샘플의 position과 joint.origin은 정지 모델 좌표다. 이를 부모-relative offset과
|
|
45
45
|
자식-local pivot으로 변환한 뒤 `parent · rest · joint`로 계산했다.
|
|
46
46
|
관절 양쪽에서 계산한 동일 pivot의 월드 위치가 일치하는지 검사했다.
|
|
47
47
|
단순히 부품 중심 거리가 일정하다는 검사보다 구체적인 기구학 불변량이다.
|