@hatiolab/figure-model 0.1.76 โ 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 +1 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -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-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.js +1 -1
- package/dist/v3-proposal.js.map +1 -1
- 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
|
@@ -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
|
๋จ์ํ ๋ถํ ์ค์ฌ ๊ฑฐ๋ฆฌ๊ฐ ์ผ์ ํ๋ค๋ ๊ฒ์ฌ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ๊ธฐ๊ตฌํ ๋ถ๋ณ๋์ด๋ค.
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
# V3 shape-dimension contract โ per-axis radii, elliptic sections, and dimensions that follow state
|
|
2
2
|
|
|
3
3
|
Status: **contract, fixed 2026-09-22 by the V3 designer** (ADR-0087, stage-review rulings 3 and 5). ยง1 (per-axis
|
|
4
|
-
dimensions) implemented the same day: `cylinder-shape@2`, `rounded-box@2`, `hollow-box@2`, the
|
|
5
|
-
them
|
|
4
|
+
dimensions) implemented the same day: `cylinder-shape@2`, `rounded-box@2`, `hollow-box@2`, and the sampler reading
|
|
5
|
+
them. ยง2โ3 implemented the same night: dependence on state is tracked per value in the
|
|
6
6
|
compiler and printed as `dependence` beside `outputTypes`; every operator carries a `state` policy (`follows` or
|
|
7
7
|
`refuses`; an operator without one fails with `STATE_POLICY`); `occupancy.extent` may not depend on state
|
|
8
8
|
(`OCCUPANCY_STATE`); `inspectV3Asset` covers the state range and reports `proven` (corners; no state-dependent
|
|
9
9
|
rotation), `sampled` (a rotation depends on state; corners plus per-input sweeps, step stated, not a proof) or
|
|
10
10
|
`defaults` (one state, as asked). The `bounded` method of ยง3 (swept envelope) is not implemented; such assets report
|
|
11
|
-
`sampled`.
|
|
12
|
-
parameters (`STATE_DIMENSION` note). This is one rule for what a shape's dimensions are and what they may depend on. It is not three
|
|
11
|
+
`sampled`. This is one rule for what a shape's dimensions are and what they may depend on. It is not three
|
|
13
12
|
exceptions bolted on for the three assets that needed them.
|
|
14
13
|
|
|
15
14
|
## What a person sees
|
|
@@ -19,11 +18,11 @@ cradle gets thinner: its radius shrinks, its length does not. The edge plates th
|
|
|
19
18
|
stay on its surface. Nothing else moves. At 0 % the roll is exactly the drawn roll.
|
|
20
19
|
|
|
21
20
|
An author stretches a kiosk to twice its width. The bezel's corners stay the same round in front view where the
|
|
22
|
-
section did not stretch, and go wider than they are tall where it did, because
|
|
23
|
-
back to a circle on its own.
|
|
21
|
+
section did not stretch, and go wider than they are tall where it did, because each corner radius follows its own
|
|
22
|
+
axis. Nothing pops back to a circle on its own.
|
|
24
23
|
|
|
25
24
|
An author opens the worker figure and stretches it sideways. The legs, which the author chose not to keep round,
|
|
26
|
-
become oval
|
|
25
|
+
become oval. The renderer draws the oval it is given. It never "fixes" it to a circle.
|
|
27
26
|
|
|
28
27
|
## 1. Every round thing has per-axis dimensions
|
|
29
28
|
|
|
@@ -32,7 +31,7 @@ A section is round only when its two cross dimensions are equal. The providers w
|
|
|
32
31
|
| operator | evaluated provider | dimensions | round when | status |
|
|
33
32
|
|---|---|---|---|---|
|
|
34
33
|
| `cylinder-shape@2` | `ellipticCylinder` | `radiusX`, `radiusZ`, `length` (axis Y) | `radiusX = radiusZ` | implemented 2026-09-22 |
|
|
35
|
-
| `frustum-shape@2` | โ | `topRadiusX`, `topRadiusZ`, `bottomRadiusX`, `bottomRadiusZ`, `height` | pairs equal | not implemented
|
|
34
|
+
| `frustum-shape@2` | โ | `topRadiusX`, `topRadiusZ`, `bottomRadiusX`, `bottomRadiusZ`, `height` | pairs equal | not implemented |
|
|
36
35
|
| `sphere-shape@1` | `sphere` | `radiusX`, `radiusY`, `radiusZ` (already so) | all equal | implemented |
|
|
37
36
|
| `rounded-box@2` | `roundedBoxXZ` | `width`, `height`, `depth`, `roundX`, `roundZ` | `roundX = roundZ` | implemented 2026-09-22 |
|
|
38
37
|
| `hollow-box@2` | `hollowBoxXZ` | as `hollow-box@1` with `roundX`, `roundZ` in place of `round` | same | implemented 2026-09-22 |
|
|
@@ -41,38 +40,32 @@ The evaluated provider name is distinct from the `@1` one so a renderer can neve
|
|
|
41
40
|
single radius. Features on `ellipticCylinder` are `start` and `end` only; `radialBottom` has no single meaning on an
|
|
42
41
|
ellipse.
|
|
43
42
|
|
|
44
|
-
- `@1` of each provider stays valid and means the equal case
|
|
45
|
-
unequal section. Nothing that exists today is invalidated.
|
|
43
|
+
- `@1` of each provider stays valid and means the equal case. `@2` is needed only for an unequal section.
|
|
46
44
|
- **The renderer draws what it is given.** An elliptic section is an ellipse; an elliptic corner is the quadratic
|
|
47
45
|
Bรฉzier from `(hw โ roundX, โhd)` to `(hw, โhd + roundZ)` with the corner `(hw, โhd)` as control point, which is
|
|
48
|
-
what things-scene's `roundedRect` draws
|
|
49
|
-
|
|
50
|
-
section to a circle is wrong, and the mesh-level comparison of the completion criterion is what catches it.
|
|
46
|
+
what things-scene's `roundedRect` draws. It is not a circular or elliptic arc: an arc differs from the Bรฉzier by
|
|
47
|
+
up to 0.06 ร round at the corner's middle. A renderer that snaps a section to a circle is wrong.
|
|
51
48
|
- Validity: every dimension positive (a corner radius may be 0), `roundX โค width/2`, `roundZ โค depth/2`. A
|
|
52
|
-
declared corner larger than the section is refused at compile
|
|
53
|
-
what V2 drew (ruling 2) and reports it.
|
|
49
|
+
declared corner larger than the section is refused at compile.
|
|
54
50
|
|
|
55
|
-
###
|
|
51
|
+
### A round section under non-uniform sizing
|
|
56
52
|
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
What happens to a round section when the instance is sized differently along its two cross axes is not a flag. It
|
|
54
|
+
is two possible expressions for two dimensions:
|
|
59
55
|
|
|
60
56
|
```
|
|
61
|
-
kept round radiusX = radiusZ = rโ ยท geomean(fx, fz)
|
|
62
|
-
follows axes radiusX = rโ ยท fx, radiusZ = rโ ยท fz
|
|
57
|
+
kept round radiusX = radiusZ = rโ ยท geomean(fx, fz)
|
|
58
|
+
follows axes radiusX = rโ ยท fx, radiusZ = rโ ยท fz
|
|
63
59
|
```
|
|
64
60
|
|
|
65
|
-
Both are ordinary length expressions
|
|
66
|
-
|
|
67
|
-
corner written with two semi-axes. The same two shapes apply to corners: V2 scaled a rounded box's finished mesh
|
|
68
|
-
per axis, so a corner drawn with radius `rโ` becomes `roundX = rโยทfx`, `roundZ = rโยทfz`. That is what
|
|
69
|
-
`ROUND_NOT_SCALED` (40 parts in the last run) was reporting as a loss; with `@2` corners it is no longer a loss.
|
|
61
|
+
Both are ordinary length expressions; the author chooses which one to write. The same two shapes apply to corners:
|
|
62
|
+
a corner drawn with radius `rโ` that follows the axes is `roundX = rโยทfx`, `roundZ = rโยทfz`.
|
|
70
63
|
|
|
71
64
|
## 2. A dimension may depend on state
|
|
72
65
|
|
|
73
66
|
A state input (`role: 'state'`) may be an argument of a shape or length node. A consumed roll's radius is
|
|
74
67
|
`rโ โ fed ยท k`; a lamp's glow radius grows with the gate. This is the core-semantics ยง2 invariant ("state changes the
|
|
75
|
-
actual shape dimension") made concrete
|
|
68
|
+
actual shape dimension") made concrete. A dimension that scales with a state input is `dims ร affine(p)`.
|
|
76
69
|
|
|
77
70
|
### Dependence is tracked in the type, apart from unit and frame
|
|
78
71
|
|
|
@@ -114,30 +107,14 @@ range, and says how it knows:
|
|
|
114
107
|
- The endpoint-only shortcut is **wrong** for a rotating long part: inside at both end angles, out in the middle.
|
|
115
108
|
That case takes the `bounded` row, not the `proven` one.
|
|
116
109
|
|
|
117
|
-
## 4.
|
|
118
|
-
|
|
119
|
-
- V2 cylinder with `keepRound: false` and differing cross factors โ `cylinder-shape@2` with `radiusX`, `radiusZ`
|
|
120
|
-
following their own axes. WORKER converts; `ELLIPTIC_SECTION` is retired.
|
|
121
|
-
- V2 rect or hollow rect whose section follows the instance โ `rounded-box@2` / `hollow-box@2` with per-axis corner
|
|
122
|
-
radii `rยทfx`, `rยทfz`. `ROUND_NOT_SCALED` is retired.
|
|
123
|
-
- V2 `scale` channel on a part, two linear keys, from a parameter โ each scaled dimension becomes
|
|
124
|
-
`dim ร affine(p)`; the part's centre is unchanged (V2 scaled about the part centre). The dependence set of every
|
|
125
|
-
affected length includes the parameter. DRY_ROOM's lamps and ROLL_CRADLE's roll convert; `ANIMATION_CHANNEL`
|
|
126
|
-
stays only for channels the contract does not cover (pivots, compound axes, curves other than two linear keys).
|
|
127
|
-
- The report marks every state-dependent dimension it wrote, and the occupancy inspection of a converted asset
|
|
128
|
-
runs over the parameter ranges as ยง3 says.
|
|
129
|
-
|
|
130
|
-
## 5. Completion criterion for this contract
|
|
110
|
+
## 4. Completion criterion for this contract
|
|
131
111
|
|
|
132
112
|
- The four providers' `@2` forms compile, evaluate, and their `@1` forms are unchanged (the operator-list guard
|
|
133
113
|
gains the four names).
|
|
134
114
|
- Dependence appears in `outputTypes`; a synthetic new operator with no policy fails to compile when handed a
|
|
135
115
|
state-dependent value; `fit-pitch@1` and `fixed-count@1` still refuse it; a shape provider accepts it.
|
|
136
|
-
- The three assets convert and match V2 at box level at 8 sizes ร states, and the WORKER's legs match as ovals.
|
|
137
116
|
- An occupancy check on the roll cradle reports `proven` over the `fed` range, and a synthetic rotating long part
|
|
138
117
|
reports `bounded`, with a violation found at a middle angle that the endpoints alone would have missed.
|
|
139
|
-
- The mesh-level comparison of the completion criterion covers sections and corners, so an elliptic section drawn
|
|
140
|
-
round would fail it.
|
|
141
118
|
|
|
142
119
|
## Not in this contract
|
|
143
120
|
|
|
@@ -145,10 +122,9 @@ range, and says how it knows:
|
|
|
145
122
|
- Shape deformation beyond dimensions: bending, twisting, free-form profiles that change with state. Those would be
|
|
146
123
|
new providers with their own contracts.
|
|
147
124
|
|
|
148
|
-
##
|
|
125
|
+
## 5. ํ์ ์ฌ๋ถ (visibility) โ ์ ๋ณด์ด๋ ๊ฒ๊ณผ ์์ ๊ฒ์ ๋ค๋ฅด๋ค
|
|
149
126
|
|
|
150
|
-
**V3 ์ค๊ณ์ ๊ฒฐ์ 2026-09-22.**
|
|
151
|
-
์๋๋ค. 0 ์ ์์ฃผ ์์ ์์๋ก ๋ฐ๊พธ๋ ๊ฒ๋ ์ฐ์ง ์๋๋ค โ ํ๋ยท๊ทธ๋ฆผ์ยทํฌ์ธํฐ ์ ํ์์ ์ฐจ์ด๊ฐ
|
|
127
|
+
**V3 ์ค๊ณ์ ๊ฒฐ์ 2026-09-22.** ๋ถํ์ ์จ๊ธฐ๋ ค๊ณ ํฌ๊ธฐ๋ฅผ 0 ์ผ๋ก ๋ง๋ค์ง ์๋๋ค. 0 ์ ์์ฃผ ์์ ์์๋ก ๋ฐ๊พธ๋ ๊ฒ๋ ์ฐ์ง ์๋๋ค โ ํ๋ยท๊ทธ๋ฆผ์ยทํฌ์ธํฐ ์ ํ์์ ์ฐจ์ด๊ฐ
|
|
152
128
|
์๊ธฐ๊ณ , ใ์ ๋ณด์ใ์ด ใ์์ฃผ ์์ใ์ด ๋์ด ๋ฒ๋ฆฐ๋ค.
|
|
153
129
|
|
|
154
130
|
### ๊ท์น
|
|
@@ -172,19 +148,9 @@ range, and says how it knows:
|
|
|
172
148
|
|
|
173
149
|
| ๋ชฉ๋ก | ๋ฌด์์ด ๋ค์ด๊ฐ๋๊ฐ | ๋๊ฐ ์ฐ๋๊ฐ |
|
|
174
150
|
| --- | --- | --- |
|
|
175
|
-
| `v3WorldBoxesOf` | ๊ทธ๋ฆฌ๋ ๋ชธํต๋ง (`visible === false` ์ ์ธ) | renderer
|
|
151
|
+
| `v3WorldBoxesOf` | ๊ทธ๋ฆฌ๋ ๋ชธํต๋ง (`visible === false` ์ ์ธ) | renderer |
|
|
176
152
|
| `v3OccupiedBoxesOf` | ๋์ธ ๋ชธํต ์ ๋ถ (์จ๊ธด ๊ฒ ํฌํจ) | occupancy ๊ฒ์ฌ |
|
|
177
153
|
|
|
178
|
-
### ๋ณํ๊ธฐ๊ฐ V2 ์ scale 0 ์ ์ฎ๊ธฐ๋ ๋ฐฉ๋ฒ
|
|
179
|
-
|
|
180
|
-
์ฑ๋์ด **๋ชจ๋ ๋ณํ๋ ์ถ์์ 0 ์ผ๋ก ์์ํ๊ณ , ์ฒ์ 0 ์ด ์๋ key ๋ถํฐ ๋๊น์ง ์ ํํ 1** ์ด๋ฉด
|
|
181
|
-
(= ๋ถํ ์ ํฌ๊ธฐ) visibility ๋ก ์ฎ๊ธด๋ค. ๋ถํ์ ์ ์น์๋ฅผ ๊ณ์ ๊ฐ๊ณ , flag ๊ฐ ๊ทธ key ์ `at` ์์
|
|
182
|
-
์ผ์ง๋ค. ๊ทธ ์ธ โ ์จ๊ธฐ๋ฉด์ ํฌ๊ธฐ๋ ๋ฐ๊พธ๋ ์ฑ๋ โ ์ `SCALE_ZERO` ๋ก ๊ฑฐ์ ํ๋ค.
|
|
183
|
-
|
|
184
|
-
์ด๊ฒ์ **์๋์ ์ฌ์ ์์ด๋ค**(`method: 're-authored'`, `RE_AUTHORED_VISIBILITY` note). 0 ๊ณผ
|
|
185
|
-
๋ฌธํฑ ์ฌ์ด์์ V2 ๋ ์๋ผ๋๋ ๋ถํ์ ๊ทธ๋ฆฌ๊ณ V3 ๋ ์ ๊ทธ๋ฆฐ๋ค. DRY_ROOM ์์ ์ค์ธกํ๋ค: ๋ฌธํฑ์
|
|
186
|
-
ํ๋ผ๋ฏธํฐ ๋ฒ์์ 1 %, ๊ทธ ๋ฐ ๋ชจ๋ ์ํ์์ V2 ์ ๊ฐ๊ณ ์ฐจ์ด๋ ๊ทธ 1 % ์์์๋ง ๋๋ค.
|
|
187
|
-
|
|
188
154
|
## When `proven` may be said (added 2026-09-23, after two counterexamples from the V3 designer)
|
|
189
155
|
|
|
190
156
|
`proven` means the gate evaluated the corners of the state box and nothing else. That is only a proof when every
|
package/docs/v3-status.md
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
> **2026-09-22 โ this file is a progress note, not the document of record.** The decision and the order of work are
|
|
4
4
|
> `operato-application/adr/ADR-0087.md`; the current state is the app's
|
|
5
|
-
> `operato-application/packages/operato-figure/docs/CURRENT_STATUS.md
|
|
5
|
+
> `operato-application/packages/operato-figure/docs/CURRENT_STATUS.md`. Where this
|
|
6
6
|
> file disagrees with those two, they win.
|
|
7
7
|
|
|
8
8
|
๊ธฐ์ค์ผ: 2026-09-21. **ํ์ฌ ์ํ๋ฅผ ํ๋จํ๋ ๋ฌธ์๋ค.** ๊ฐ๋ณ ์ฐ๊ตฌยท๊ฒ์ฆ ๋ฌธ์์ ๊ณผ๊ฑฐ ๋จ๊ณ ์์น๋ '๋ค์ ๋จ๊ณ'๋ณด๋ค ์ด ํํฉ์ ์ฐ์ ํ๋ค.
|
|
9
9
|
|
|
10
10
|
## ์ ํ ๋ฐฉํฅ
|
|
11
11
|
|
|
12
|
-
๋ชจ๋ธ๋ฌยทAI
|
|
12
|
+
๋ชจ๋ธ๋ฌยทAIยท์ ์ฅยท๋ ๋๋ฌ๋ **V3(`figure-v3-asset-1`) ํ๋**๋ฅผ ์ด๋ค. V2์ V1์ 2026-09-26 ์ฝ๋์ ๋ช
์ธ์์ ์ ๊ฑฐํ๋ค(ADR-0087 ์ ํ์ ์ ๊ฑฐ๋ก ๋ง์ณค๋ค). [์ ํ ๊ฒฐ์ ](v3-cutover.md)
|
|
13
13
|
|
|
14
14
|
## ์๋ฃ ๋ฒ์์ ๋ฏธ์๋ฃ ๋ฒ์
|
|
15
15
|
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
## ๊ฒ์ฆ ๊ทผ๊ฑฐ
|
|
29
29
|
|
|
30
|
-
- `
|
|
30
|
+
- `node --test src/*.test.ts`: ์์ค **286๊ฐ ํต๊ณผ**(2026-09-26, V2ยทV1 ์ ๊ฑฐ ๋ค). ์ํ ์์ด๋ฉฐ V3 ๊ธฐ๋ฅ ์๊ฐ ์๋๋ค.
|
|
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์์ ๋น๋๋ ๋ชจ๋ ์คํ, ๋ค ๋ํ ๋ชจ๋ธ(๋๋ผ์ด๋ฃธยท์ปจ๋ฒ ์ด์ดยท๋ก๋ด์ยทํฌํฌ๋ฆฌํํธ)์ ๊ณ์ฐ๊ฐ/ํ์/์ฌ์ง/binding์ Node์ ๋น๊ต.
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
4. [์์ฐ ๊ณ์ฝ](v3-asset-persistence.md), [์ ์ฅ ๊ฒ์ฆ](v3-storage-integration.md).
|
|
44
44
|
5. [V3 ๋จ์ผ ์ ํ](v3-cutover.md).
|
|
45
45
|
|
|
46
|
-
๋ค์ ์์
์ ๋ชจ๋ธ๋ฌ์ ์ฌ์ฉ์ ๋์ยทAIยท์ค์ ์ ์ฅยท๋ ๋๋ง์ ์ด ๊ณต์ฉ V3 ๊ตฌํ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค.
|
|
46
|
+
๋ค์ ์์
์ ๋ชจ๋ธ๋ฌ์ ์ฌ์ฉ์ ๋์ยทAIยท์ค์ ์ ์ฅยท๋ ๋๋ง์ ์ด ๊ณต์ฉ V3 ๊ตฌํ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค.
|
|
47
47
|
|
|
48
48
|
## ์ ํ ์ฐ๊ฒฐ ์์
์ถ๊ฐ ๊ธฐ๋ก (2026-09-21)
|
|
49
49
|
|
|
50
|
-
things-factory์ `packages/figure-ui/docs/v3-product-cutover.md`์ ์ ํ ์ ํ ์งํ ์ํ๋ฅผ ๊ธฐ๋กํ๋ค. V3 ์ ํ ์ธ์
ยท์บ๋ฒ์คยทํธ์ง ์ปดํฌ๋ํธยท์ ์ฅ API์ ํ์ด์ง๋ฅผ ์์ฑํ์ผ๋, ๊ธฐ๋ณธ route๋ ์์ง ๊ต์ฒดํ์ง ์์๋ค. ๋ก์ปฌ ํ์ฑ ์์ฐ32
|
|
50
|
+
things-factory์ `packages/figure-ui/docs/v3-product-cutover.md`์ ์ ํ ์ ํ ์งํ ์ํ๋ฅผ ๊ธฐ๋กํ๋ค. V3 ์ ํ ์ธ์
ยท์บ๋ฒ์คยทํธ์ง ์ปดํฌ๋ํธยท์ ์ฅ API์ ํ์ด์ง๋ฅผ ์์ฑํ์ผ๋, ๊ธฐ๋ณธ route๋ ์์ง ๊ต์ฒดํ์ง ์์๋ค. ๋น์ ๋ก์ปฌ ํ์ฑ ์์ฐ 32๊ฐ๋ ์์ง V3๋ก ์ ํ๋์ง ์์๊ณ , ์์ฐ ์ ํยทAI ๋๊ตฌยท๋ฐํ/์๋น์ฒ ์ฐ๊ฒฐ์ด ๋จ์ ์์๋ค. UI241๊ฐ ํ
์คํธ ๋ฐ ํด๋ผ์ด์ธํธ/์๋น์ค ํ์
๊ฒ์ฌ ํต๊ณผ๋ V3 ์ ํ end-to-end ๊ฒ์ฆ ์๋ฃ๋ฅผ ๋ปํ์ง ์๋๋ค. ์ด์ DB ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด๋ ๋ฐฐํฌ๋ ํ์ง ์์๋ค.
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
## ์ ๊ธฐ์กด ์ ์ฅ API์ ๋ฐ๋ก ์ฐ๊ฒฐํ์ง ์์๋๊ฐ
|
|
14
14
|
|
|
15
|
-
์ ํ figure-service์ `figure-source.ts`๋
|
|
15
|
+
๋น์ ์ ํ figure-service์ `figure-source.ts`๋ ์ด์ ํ์์ ๊ฒ์ฆยท์ปดํ์ผยท๋น์ฉยท์ ์ ํจ์๋ฅผ ํธ์ถํ๋ค. `figure-mutation.ts`์ ์์ฑยท์์ ยท๋๋๋ฆฌ๊ธฐ์ ๋ฐํ๋ ๊ทธ ๊ฒ์ฌ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค. figure-ui๋ draft/parts๋ฅผ ์ง์ ํธ์งํ๋ค.
|
|
16
16
|
|
|
17
|
-
์คํ ํฌ๋งท๋ง ํ์ฉํ๋ฉด ์ ์ฅ์ ๋์ง๋ง ๊ธฐ์กด ์๋น์๊ฐ ์ฝ์ ์ ์๋ ์์ฐ์ด ๋๋ค. ๋ฐ๋ผ์ **์ ํ V3 ๊ฒฝ๋ก ์ฐ๊ฒฐ์ ์์ง ๋ฏธ์๋ฃ**๋ค. ์คํ ์ฝ๋์ ์ง์ import, package.json ๋ณ๊ฒฝ,
|
|
17
|
+
์คํ ํฌ๋งท๋ง ํ์ฉํ๋ฉด ์ ์ฅ์ ๋์ง๋ง ๊ธฐ์กด ์๋น์๊ฐ ์ฝ์ ์ ์๋ ์์ฐ์ด ๋๋ค. ๋ฐ๋ผ์ **์ ํ V3 ๊ฒฝ๋ก ์ฐ๊ฒฐ์ ์์ง ๋ฏธ์๋ฃ**๋ค. ์คํ ์ฝ๋์ ์ง์ import, package.json ๋ณ๊ฒฝ, ๊ธฐ์กด ๊ฒ์ฆ ์ฐํ๋ ํ์ง ์์๋ค.
|
|
18
18
|
|
|
19
19
|
## ์ ์ฅ ๊ณ์ฝ
|
|
20
20
|
|
|
@@ -51,8 +51,8 @@ scope/id ์กฐํฉ์ ํด์ํ ํ์ผ๋ช
์ผ๋ก ์ฌ์ฉํด ์ฌ์ฉ์ ์๋ณ์๋ฅผ
|
|
|
51
51
|
## ์ ํ ์ฐ๊ฒฐ ์์
|
|
52
52
|
|
|
53
53
|
1. ์
๋ ฅยท๊ทธ๋ํยทcapabilityยท๋ฌธ์ยท์์ฐยทํธ์ง workspace์ ์ ์ ์์ค ์ด๊ด์ [์๋ฃ](v3-runtime-extraction.md)ํ๋ค. ์ด ๋ชจ๋๋ค์ ์ ํ์ ๋ฐ์ํ๋ค.
|
|
54
|
-
2. figure-service์ ์ ์ฅยท์กฐํยท๋ฐํ์ V3 ๋จ์ผ ๊ธฐ์ค์ผ๋ก ์ ํํ๊ณ ์ ์ฅ revision CAS๋ฅผ ๊ตฌํํ๋ค.
|
|
55
|
-
3. figure-ui์ ๋ ๋๋ฌยทAI๋ฅผ V3 ๋จ์ผ ๊ฒฝ๋ก์ ์ฐ๊ฒฐํ๋ค. ๊ธฐ์กด ์์ฐ์ V3๋ก
|
|
54
|
+
2. figure-service์ ์ ์ฅยท์กฐํยท๋ฐํ์ V3 ๋จ์ผ ๊ธฐ์ค์ผ๋ก ์ ํํ๊ณ ์ ์ฅ revision CAS๋ฅผ ๊ตฌํํ๋ค.
|
|
55
|
+
3. figure-ui์ ๋ ๋๋ฌยทAI๋ฅผ V3 ๋จ์ผ ๊ฒฝ๋ก์ ์ฐ๊ฒฐํ๋ค. ๊ธฐ์กด ์์ฐ์ V3๋ก ์ฌ์์ฑํ๋ค.
|
|
56
56
|
4. ์ค์ ์ธ์ฆยทDB๋ก ๋ ํธ์ง ์ธ์
์ ์ถฉ๋, ์ ์ฅ ์คํจ, ์ฌ์ ์, ๋ชจ๋ธ ์ ํ, AI ๋ฆ์ ์๋ต์ ๊ฒ์ฆํ๋ค.
|
|
57
57
|
|
|
58
58
|
์ด ๋ฌธ์์ ์๋ฃ ๋ฒ์๋ ์ ์ฅ ๊ฒฝ๊ณ์ ์คํ ๊ฐ๋ฅํ ๊ฒ์ฆ์ด๋ฉฐ, ์ ํ ์ฐ๊ฒฐยท๋ฐฐํฌ ์๋ฃ๊ฐ ์๋๋ค.
|
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hatiolab/figure-model",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.77",
|
|
4
|
+
"description": "The figure format (figure-v3-asset-1): a kernel that evaluates a figure from its declared relations, the authoring commands a modeller and an AI share, the release gate and the score.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"figure",
|
|
7
7
|
"low-poly",
|
|
8
8
|
"3d",
|
|
9
|
-
"blueprint",
|
|
10
9
|
"authoring",
|
|
11
10
|
"things-scene",
|
|
12
11
|
"digital-twin",
|
|
@@ -31,22 +30,6 @@
|
|
|
31
30
|
"types": "./dist/index.d.ts",
|
|
32
31
|
"default": "./dist/index.js"
|
|
33
32
|
},
|
|
34
|
-
"./types": {
|
|
35
|
-
"types": "./dist/types.d.ts",
|
|
36
|
-
"default": "./dist/types.js"
|
|
37
|
-
},
|
|
38
|
-
"./validate": {
|
|
39
|
-
"types": "./dist/validate.d.ts",
|
|
40
|
-
"default": "./dist/validate.js"
|
|
41
|
-
},
|
|
42
|
-
"./blueprint": {
|
|
43
|
-
"types": "./dist/blueprint.d.ts",
|
|
44
|
-
"default": "./dist/blueprint.js"
|
|
45
|
-
},
|
|
46
|
-
"./cost": {
|
|
47
|
-
"types": "./dist/cost.d.ts",
|
|
48
|
-
"default": "./dist/cost.js"
|
|
49
|
-
},
|
|
50
33
|
"./package.json": "./package.json"
|
|
51
34
|
},
|
|
52
35
|
"files": [
|
|
@@ -67,7 +50,6 @@
|
|
|
67
50
|
"check": "tsc -p tsconfig.json --noEmit",
|
|
68
51
|
"test": "npm run check && node --test src/*.test.ts",
|
|
69
52
|
"test:coverage": "node --test --experimental-test-coverage --test-coverage-lines=100 --test-coverage-branches=95 --test-coverage-functions=100 src/*.test.ts",
|
|
70
|
-
"bench": "node src/perf.bench.ts",
|
|
71
53
|
"format": "prettier --write \"src/**/*.ts\" \"docs/**/*.md\" \"*.md\" \"*.json\"",
|
|
72
54
|
"format:check": "prettier --check \"src/**/*.ts\" \"docs/**/*.md\" \"*.md\" \"*.json\"",
|
|
73
55
|
"clean": "rm -rf dist",
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ์ฒญ์ฌ์ง์ ํํ๋ฅผ ํ์ธํ๋ค โ **์ฝ๊ธฐ ์ ์ ํ ๋ฒ**, ๋ฑ๋ก ์์ ์.
|
|
3
|
-
*
|
|
4
|
-
* ๊ทธ๋ฆฌ๋ ์์ ์ด ์๋๋ผ ๋ฑ๋ก ์์ ์ ๋ณด๋ ์ด์ ๋, ์๋ชป๋ ์ฒญ์ฌ์ง์ด ํ๋ ์๋ง๋ค ์กฐ์ฉํ
|
|
5
|
-
* ์คํจํ๋ ๋์ ๋ฑ๋ก์์ ํ ๋ฒ ํฌ๊ฒ ์คํจํ๊ฒ ํ๋ ค๋ ๊ฒ์ด๋ค.
|
|
6
|
-
*
|
|
7
|
-
* ๋ฌธ์ ๋ฅผ ์ฐพ์ผ๋ฉด ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ฌ์ ๋ชฉ๋ก์ ๋๋ ค์ค๋ค. ๋น์ด ์์ผ๋ฉด ์ฝ์ ์ ์๋ค.
|
|
8
|
-
*/
|
|
9
|
-
export declare function blueprintProblems(value: unknown): string[];
|
|
10
|
-
//# sourceMappingURL=blueprint-shape.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint-shape.d.ts","sourceRoot":"","sources":["../src/blueprint-shape.ts"],"names":[],"mappings":"AAgCA;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CA+J1D"}
|