koota-kit 0.8.6 → 0.8.8
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 +20 -0
- package/README.md +4 -0
- package/dist/cjs/spatial.cjs +15 -4
- package/dist/cjs/spatial.d.cts.map +1 -1
- package/dist/esm/spatial.d.ts.map +1 -1
- package/dist/esm/spatial.js +15 -4
- package/docs/INTEGRATION_PROOF.md +121 -0
- package/examples/coordination-proof/cohort.mjs +408 -0
- package/examples/coordination-proof/consumer-package.json +15 -0
- package/examples/coordination-proof/fixture.mjs +122 -0
- package/examples/coordination-proof/open-surface.mjs +195 -0
- package/examples/coordination-proof/prepare.mjs +82 -0
- package/examples/coordination-proof/react-observer.mjs +69 -0
- package/examples/coordination-proof/registry-import.mjs +3 -0
- package/examples/coordination-proof/run.mjs +390 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.8.8 (2026-10-14)
|
|
4
|
+
|
|
5
|
+
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
|
6
|
+
|
|
7
|
+
## What's Changed
|
|
8
|
+
* test: prove registry caller composition in one World by @jbdevprimary in https://github.com/jbcom/koota-kit/pull/76
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
**Full Changelog**: https://github.com/jbcom/koota-kit/compare/v0.8.7...v0.8.8
|
|
12
|
+
|
|
13
|
+
## 0.8.7 (2026-10-14)
|
|
14
|
+
|
|
15
|
+
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
|
16
|
+
|
|
17
|
+
## What's Changed
|
|
18
|
+
* fix(spatial): reject inherited values in sparse snapshot and query arrays by @jbdevprimary in https://github.com/jbcom/koota-kit/pull/71
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
**Full Changelog**: https://github.com/jbcom/koota-kit/compare/v0.8.6...v0.8.7
|
|
22
|
+
|
|
3
23
|
## 0.8.6 (2026-10-14)
|
|
4
24
|
|
|
5
25
|
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
package/README.md
CHANGED
|
@@ -138,6 +138,10 @@ ID. Listener errors occur after a committed publication; retrieve a token with
|
|
|
138
138
|
`getRegistration(id)` if registration notification threw before `register`
|
|
139
139
|
could return it.
|
|
140
140
|
|
|
141
|
+
The [caller composition proof](docs/INTEGRATION_PROOF.md) documents the optional
|
|
142
|
+
registry consumer, copied figure inputs, immutable geometry captures and the
|
|
143
|
+
limits of open-surface integration evidence.
|
|
144
|
+
|
|
141
145
|
### Randomness has two jobs
|
|
142
146
|
|
|
143
147
|
- `rng.gen` defines stable world content: terrain, layouts, initial spawns.
|
package/dist/cjs/spatial.cjs
CHANGED
|
@@ -123,6 +123,17 @@ function copyTopology(value, label) {
|
|
|
123
123
|
enclosesSurface: true,
|
|
124
124
|
});
|
|
125
125
|
}
|
|
126
|
+
function copyDenseArray(array, mapper, label) {
|
|
127
|
+
const hasOwn = Object.prototype.hasOwnProperty;
|
|
128
|
+
const result = new Array(array.length);
|
|
129
|
+
for (let i = 0; i < array.length; i++) {
|
|
130
|
+
if (!hasOwn.call(array, i)) {
|
|
131
|
+
throw new TypeError(`spatial: ${label}[${i}] is sparse.`);
|
|
132
|
+
}
|
|
133
|
+
result[i] = mapper(array[i], i);
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
126
137
|
function copyRecord(value, label) {
|
|
127
138
|
if (typeof value !== "object" || value === null)
|
|
128
139
|
throw new TypeError(`spatial: ${label} must be a part record.`);
|
|
@@ -131,7 +142,7 @@ function copyRecord(value, label) {
|
|
|
131
142
|
throw new TypeError(`spatial: ${label}.topology must be an object.`);
|
|
132
143
|
if (!Array.isArray(record.capabilities))
|
|
133
144
|
throw new TypeError(`spatial: ${label}.capabilities must be an array.`);
|
|
134
|
-
const capabilities =
|
|
145
|
+
const capabilities = copyDenseArray(record.capabilities, (capability) => capability, `${label}.capabilities`);
|
|
135
146
|
if (capabilities.some((capability) => capability !== "nearest-surface") ||
|
|
136
147
|
new Set(capabilities).size !== capabilities.length) {
|
|
137
148
|
throw new TypeError(`spatial: ${label}.capabilities may only contain nearest-surface.`);
|
|
@@ -235,11 +246,11 @@ function queryPointClearance(provider, oracle, query) {
|
|
|
235
246
|
throw new TypeError("spatial: query.exclusions must be an array.");
|
|
236
247
|
if (query.expected !== undefined && !Array.isArray(query.expected))
|
|
237
248
|
throw new TypeError("spatial: query.expected must be an array.");
|
|
238
|
-
const exclusions =
|
|
249
|
+
const exclusions = copyDenseArray(query.exclusions ?? [], (value, index) => copyIdentity(value, `query.exclusions[${index}]`), "query.exclusions").sort(compareIdentity);
|
|
239
250
|
const exclusionKeys = new Set(exclusions.map(identityKey));
|
|
240
251
|
if (exclusionKeys.size !== exclusions.length)
|
|
241
252
|
throw new TypeError("spatial: query.exclusions must not contain duplicates.");
|
|
242
|
-
const expected =
|
|
253
|
+
const expected = copyDenseArray(query.expected ?? [], (value, index) => copyStamp(value, `query.expected[${index}]`), "query.expected");
|
|
243
254
|
const expectedKeys = new Set(expected.map((stamp) => identityKey(stamp.identity)));
|
|
244
255
|
if (expectedKeys.size !== expected.length)
|
|
245
256
|
throw new TypeError("spatial: query.expected must not contain duplicate identities.");
|
|
@@ -248,7 +259,7 @@ function queryPointClearance(provider, oracle, query) {
|
|
|
248
259
|
throw new TypeError("spatial: provider.snapshot() must return an array.");
|
|
249
260
|
let records;
|
|
250
261
|
try {
|
|
251
|
-
records =
|
|
262
|
+
records = copyDenseArray(snapshot, (record, index) => copyRecord(record, `provider.snapshot()[${index}]`), "provider.snapshot()");
|
|
252
263
|
}
|
|
253
264
|
catch {
|
|
254
265
|
return result("unsupported", "provider-contract-invalid", "none", topology, [], exclusions, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial.d.ts","sourceRoot":"","sources":["../../src/spatial.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"spatial.d.ts","sourceRoot":"","sources":["../../src/spatial.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC,CAAC;AAEH,2FAA2F;AAC3F,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEvF,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,2BAA2B,CAAC;CAC3C,CAAC,CAAC;AAEH,0FAA0F;AAC1F,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,6FAA6F;IAC7F,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe,EAAE,IAAI,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,eAAe,CAAC;IAC3B,oFAAoF;IACpF,QAAQ,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IACxE,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;QAAE,SAAS,EAAE,wBAAwB,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,CAAC,GAC7D,QAAQ,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAC,GAC1D,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,OAAO,EAAE,CACP,OAAO,EAAE,QAAQ,CAAC;QAChB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,QAAQ,EAAE,wBAAwB,CAAC;QACnC,KAAK,EAAE,YAAY,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC,KACC,kBAAkB,GAAG,SAAS,CAAC;CACrC,CAAC,CAAC;AAEH,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,MAAM,SAAS,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAAC;AAEzF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,iFAAiF;IACjF,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhG,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,CAAC;AAEtE,MAAM,MAAM,kBAAkB,GAC1B,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,6BAA6B,GAC7B,2BAA2B,GAC3B,2BAA2B,GAC3B,mBAAmB,GACnB,cAAc,CAAC;AAEnB,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,qBAAqB,CAAC;IACjC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IACvC,SAAS,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC7C,CAAC,CAAC;AAmRH;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,2BAA2B,EACnC,KAAK,EAAE,qBAAqB,GAC3B,sBAAsB,CAwNxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial.d.ts","sourceRoot":"","sources":["../../src/spatial.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"spatial.d.ts","sourceRoot":"","sources":["../../src/spatial.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/spatial.js
CHANGED
|
@@ -120,6 +120,17 @@ function copyTopology(value, label) {
|
|
|
120
120
|
enclosesSurface: true,
|
|
121
121
|
});
|
|
122
122
|
}
|
|
123
|
+
function copyDenseArray(array, mapper, label) {
|
|
124
|
+
const hasOwn = Object.prototype.hasOwnProperty;
|
|
125
|
+
const result = new Array(array.length);
|
|
126
|
+
for (let i = 0; i < array.length; i++) {
|
|
127
|
+
if (!hasOwn.call(array, i)) {
|
|
128
|
+
throw new TypeError(`spatial: ${label}[${i}] is sparse.`);
|
|
129
|
+
}
|
|
130
|
+
result[i] = mapper(array[i], i);
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
123
134
|
function copyRecord(value, label) {
|
|
124
135
|
if (typeof value !== "object" || value === null)
|
|
125
136
|
throw new TypeError(`spatial: ${label} must be a part record.`);
|
|
@@ -128,7 +139,7 @@ function copyRecord(value, label) {
|
|
|
128
139
|
throw new TypeError(`spatial: ${label}.topology must be an object.`);
|
|
129
140
|
if (!Array.isArray(record.capabilities))
|
|
130
141
|
throw new TypeError(`spatial: ${label}.capabilities must be an array.`);
|
|
131
|
-
const capabilities =
|
|
142
|
+
const capabilities = copyDenseArray(record.capabilities, (capability) => capability, `${label}.capabilities`);
|
|
132
143
|
if (capabilities.some((capability) => capability !== "nearest-surface") ||
|
|
133
144
|
new Set(capabilities).size !== capabilities.length) {
|
|
134
145
|
throw new TypeError(`spatial: ${label}.capabilities may only contain nearest-surface.`);
|
|
@@ -232,11 +243,11 @@ export function queryPointClearance(provider, oracle, query) {
|
|
|
232
243
|
throw new TypeError("spatial: query.exclusions must be an array.");
|
|
233
244
|
if (query.expected !== undefined && !Array.isArray(query.expected))
|
|
234
245
|
throw new TypeError("spatial: query.expected must be an array.");
|
|
235
|
-
const exclusions =
|
|
246
|
+
const exclusions = copyDenseArray(query.exclusions ?? [], (value, index) => copyIdentity(value, `query.exclusions[${index}]`), "query.exclusions").sort(compareIdentity);
|
|
236
247
|
const exclusionKeys = new Set(exclusions.map(identityKey));
|
|
237
248
|
if (exclusionKeys.size !== exclusions.length)
|
|
238
249
|
throw new TypeError("spatial: query.exclusions must not contain duplicates.");
|
|
239
|
-
const expected =
|
|
250
|
+
const expected = copyDenseArray(query.expected ?? [], (value, index) => copyStamp(value, `query.expected[${index}]`), "query.expected");
|
|
240
251
|
const expectedKeys = new Set(expected.map((stamp) => identityKey(stamp.identity)));
|
|
241
252
|
if (expectedKeys.size !== expected.length)
|
|
242
253
|
throw new TypeError("spatial: query.expected must not contain duplicate identities.");
|
|
@@ -245,7 +256,7 @@ export function queryPointClearance(provider, oracle, query) {
|
|
|
245
256
|
throw new TypeError("spatial: provider.snapshot() must return an array.");
|
|
246
257
|
let records;
|
|
247
258
|
try {
|
|
248
|
-
records =
|
|
259
|
+
records = copyDenseArray(snapshot, (record, index) => copyRecord(record, `provider.snapshot()[${index}]`), "provider.snapshot()");
|
|
249
260
|
}
|
|
250
261
|
catch {
|
|
251
262
|
return result("unsupported", "provider-contract-invalid", "none", topology, [], exclusions, []);
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Caller composition proof
|
|
2
|
+
|
|
3
|
+
This proof composes existing entities in one caller-owned Koota World. It is an
|
|
4
|
+
application example and a bounded test oracle, not another runtime adapter or
|
|
5
|
+
geometry backend. The package root gains no model, renderer, AI or geometry
|
|
6
|
+
dependency.
|
|
7
|
+
|
|
8
|
+
## Inputs and execution
|
|
9
|
+
|
|
10
|
+
`examples/coordination-proof/consumer-package.json` declares every optional
|
|
11
|
+
package used by the independent registry consumer. Copy it into a private
|
|
12
|
+
directory outside this workspace, copy `registry-import.mjs` beside its
|
|
13
|
+
`package.json`, install it with `npm install --ignore-scripts --bin-links=false`,
|
|
14
|
+
and retain the resulting package lock. The runner resolves all package imports
|
|
15
|
+
from that directory. It never imports this checkout's library source or build.
|
|
16
|
+
The pinned Koota Kit version must include both the coordination and spatial
|
|
17
|
+
exports; coordination alone is insufficient.
|
|
18
|
+
|
|
19
|
+
Supply an authorized copied figure fixture directory containing `fixture.json`
|
|
20
|
+
and the arrays named by its manifest. The loader reads only the rest positions,
|
|
21
|
+
rest normals, full and visible indices, and both poses' positions and normals.
|
|
22
|
+
It checks every byte length and SHA256, decodes little-endian values explicitly,
|
|
23
|
+
checks triangle ranges, and maps visible triangles to their full source face IDs.
|
|
24
|
+
Posed positions already contain their single ground lift; the proof applies no
|
|
25
|
+
additional lift or pose evaluation.
|
|
26
|
+
|
|
27
|
+
The preparation command needs no optional package:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
node examples/coordination-proof/prepare.mjs "$FIXTURE_DIRECTORY" "$RECEIPT_FILE"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The registry composition command uses the independent installed consumer:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
node examples/coordination-proof/run.mjs \
|
|
37
|
+
"$FIXTURE_DIRECTORY" "$CONSUMER_DIRECTORY" "$RECEIPT_FILE"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Run these bounded array/query checks through the project's authorized remote
|
|
41
|
+
run facility. Use canonical absolute input paths and a regular-file-only
|
|
42
|
+
consumer install. Declare exactly the copied fixture inputs and private consumer
|
|
43
|
+
inputs, preserve their hashes, and return the receipt directory. Keep logs
|
|
44
|
+
outside returned directories so artifact replacement cannot overwrite them.
|
|
45
|
+
|
|
46
|
+
## Ownership and observation
|
|
47
|
+
|
|
48
|
+
Model A uses the published Strata terrain API's portable indexed heightfield.
|
|
49
|
+
Its anchor is explicitly authored by the caller on a generated vertex; the proof
|
|
50
|
+
does not claim an unexported Strata mesh or anchor API. Model B uses actual copied
|
|
51
|
+
figure and garment arrays, with full body triangles preserved even when hidden
|
|
52
|
+
by visible outfit masking. These inputs certify open surfaces only.
|
|
53
|
+
|
|
54
|
+
Both existing entities retain caller Position, Velocity, Intent and ModelKind
|
|
55
|
+
traits. The caller writes positions, pulls them through Yuka's existing
|
|
56
|
+
`AIBridge.syncFromKoota`, writes an intent stamped with the consumed surface
|
|
57
|
+
epochs, runs its behavior, then uses `syncToKoota` to write velocity. The bridge
|
|
58
|
+
does not become a second position writer. React's existing `WorldProvider`
|
|
59
|
+
observes that exact raw World, and `useSyncExternalStore` observes the immutable
|
|
60
|
+
view selected by the same committed coordination snapshot.
|
|
61
|
+
|
|
62
|
+
The caller's resource ledger prepares copied immutable geometry versions before
|
|
63
|
+
`publishBatch`. A committed coordination snapshot selects one version for every
|
|
64
|
+
model using its owned registration lifetime and completed geometry, pose and
|
|
65
|
+
transform tuple. Geometry, topology, pose and transform remain explicit spatial
|
|
66
|
+
epochs. Replacing topology must also advance geometry; a publication generation
|
|
67
|
+
or opaque registration token never stands in for a producer epoch.
|
|
68
|
+
|
|
69
|
+
Native raw trait callbacks select the previous completed cohort; coordination
|
|
70
|
+
subscribers select the new completed cohort. Failed preparation or a raw-write
|
|
71
|
+
failure retains the old selected version. A listener exception occurs after
|
|
72
|
+
commit and retains the new selected version. Identical publication is a no-op;
|
|
73
|
+
changed bytes or provenance under the same completed tuple are rejected.
|
|
74
|
+
Pending owned models invalidate the view until every model has a completed
|
|
75
|
+
retained version. A completed model with an explicit empty part list represents
|
|
76
|
+
known absence. Invalid views remain stable for React and fail closed in queries.
|
|
77
|
+
|
|
78
|
+
The private proof can reuse a selected part's visible-to-full face correspondence
|
|
79
|
+
after validating fresh copies and comparing its explicit topology epoch, source,
|
|
80
|
+
instance, part, topology IDs and exact index bytes. Position copies, transforms,
|
|
81
|
+
bounds and fingerprints are still recomputed. A changed selection recomputes the
|
|
82
|
+
correspondence; retained captures keep their prior face ordinals.
|
|
83
|
+
|
|
84
|
+
`capture()` returns a fixed provider, oracle and idempotent `release()`. Always
|
|
85
|
+
release in `finally`. A capture retains its old copied arrays through later
|
|
86
|
+
publications and disposal. Oracle lookup uses the complete copied record stamp,
|
|
87
|
+
including source, instance, part, provider generation, frame, topology and all
|
|
88
|
+
four epochs. Unrelated entries in the binding do not invalidate owned versions.
|
|
89
|
+
Disposal attempts every owned registration, preserves entities and custom state,
|
|
90
|
+
and keeps failed cleanup retryable without touching a replacement registration.
|
|
91
|
+
|
|
92
|
+
## Evidence boundary
|
|
93
|
+
|
|
94
|
+
The reference oracle exhaustively evaluates indexed triangles in its supported
|
|
95
|
+
numerical range after transforming all vertices into the declared world Euclidean
|
|
96
|
+
metric. It returns stamped `unknown` for overflow, underflow, subnormal arithmetic
|
|
97
|
+
or thin triangles whose squared aspect ratio falls below its roundoff margin.
|
|
98
|
+
It does not
|
|
99
|
+
convert a local nearest winner into a world answer. Witness diagnostics retain
|
|
100
|
+
full source face IDs, barycentric coordinates and geometric normals; degenerate
|
|
101
|
+
faces retain segment/point witnesses without inventing a normal. This is a
|
|
102
|
+
bounded correctness oracle, not a performance backend or a production kernel.
|
|
103
|
+
|
|
104
|
+
The tests exercise checksum rejection, full/visible face ownership, a
|
|
105
|
+
nonuniform transform that changes the winning triangle, coherent two-model
|
|
106
|
+
publication, rollback, postcommit notification errors, explicit invalidation,
|
|
107
|
+
capture retention, registration reuse, reentry and retryable cleanup. New gates
|
|
108
|
+
require an observed fault-injection failure, byte-identical input/source
|
|
109
|
+
restoration, then a passing rerun.
|
|
110
|
+
|
|
111
|
+
Copied input proof, registry composition and headless mounted React observation
|
|
112
|
+
do not establish a live Humanoid producer contract or CPU-to-GPU vertex parity.
|
|
113
|
+
Fresh silent rendered acceptance remains a separate owner-reviewed requirement.
|
|
114
|
+
No containment, solid penetration, traversability or line-of-sight result is
|
|
115
|
+
claimed. The receipts report bounded measurements without a comparative
|
|
116
|
+
performance claim.
|
|
117
|
+
|
|
118
|
+
The pinned 0.8.6 composition uses dense arrays with own indexed entries. The
|
|
119
|
+
prototype-filled sparse-array defect tracked in [issue 68](https://github.com/jbcom/koota-kit/issues/68)
|
|
120
|
+
is outside this legitimate-input proof; this guide does not claim that defect
|
|
121
|
+
has been repaired in the installed release.
|