@forgeax/engine-scene 0.1.28 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +50 -0
  2. package/dist/__tests__/keyed-scene.integration.test.d.ts +2 -0
  3. package/dist/__tests__/keyed-scene.integration.test.d.ts.map +1 -0
  4. package/dist/assets/scene-decoder.d.ts.map +1 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.mjs +848 -229
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/instances/binding.d.ts +7 -5
  10. package/dist/instances/binding.d.ts.map +1 -1
  11. package/dist/instances/externalization.d.ts +1 -1
  12. package/dist/instances/externalization.d.ts.map +1 -1
  13. package/dist/instances/keyed.d.ts +38 -0
  14. package/dist/instances/keyed.d.ts.map +1 -0
  15. package/dist/instances/legacy.d.ts +20 -0
  16. package/dist/instances/legacy.d.ts.map +1 -0
  17. package/dist/instances/runtime-types.d.ts +20 -0
  18. package/dist/instances/runtime-types.d.ts.map +1 -0
  19. package/dist/instances/scene-instances.d.ts +27 -37
  20. package/dist/instances/scene-instances.d.ts.map +1 -1
  21. package/dist/instances/state.d.ts +6 -1
  22. package/dist/instances/state.d.ts.map +1 -1
  23. package/package.json +5 -5
  24. package/src/__tests__/asset-owner.integration.test.ts +4 -7
  25. package/src/__tests__/flat-propagation.perf.test.ts +18 -17
  26. package/src/__tests__/keyed-scene.integration.test.ts +269 -0
  27. package/src/__tests__/scene-binding.integration.test.ts +141 -32
  28. package/src/__tests__/structural.test.ts +4 -1
  29. package/src/assets/scene-decoder.ts +123 -33
  30. package/src/collect-subtree.ts +2 -2
  31. package/src/index.ts +10 -1
  32. package/src/instances/binding.ts +26 -19
  33. package/src/instances/externalization.ts +115 -97
  34. package/src/instances/keyed.ts +505 -0
  35. package/src/instances/legacy.ts +108 -0
  36. package/src/instances/runtime-types.ts +21 -0
  37. package/src/instances/scene-instances.ts +220 -83
  38. package/src/instances/state.ts +6 -1
@@ -1,5 +1,5 @@
1
1
  import type { EntityHandle } from '@forgeax/engine-ecs';
2
- import type { SceneEntityRef } from '@forgeax/engine-types';
2
+ import type { SceneEntityAddress, SceneEntityRef } from '@forgeax/engine-types';
3
3
  import { type Result } from '@forgeax/engine-types';
4
4
  export type { SceneEntityRef } from '@forgeax/engine-types';
5
5
  export type SceneBindingError = {
@@ -8,7 +8,7 @@ export type SceneBindingError = {
8
8
  readonly hint: string;
9
9
  readonly detail: {
10
10
  readonly sceneSourceKey: string;
11
- readonly bindingKey: string;
11
+ readonly address: SceneEntityAddress;
12
12
  };
13
13
  };
14
14
  export type SceneBindingDeclarationError = {
@@ -17,11 +17,13 @@ export type SceneBindingDeclarationError = {
17
17
  readonly hint: string;
18
18
  readonly detail: {
19
19
  readonly sceneSourceKey?: string;
20
- readonly bindingKey?: string;
20
+ readonly address?: SceneEntityAddress;
21
21
  };
22
22
  };
23
- export declare function validateSceneBindings(sceneSourceKey: string, bindingKeys: readonly string[]): Result<readonly string[], SceneBindingDeclarationError>;
24
- export declare function sceneEntity(sceneSourceKey: string, bindingKey: string): SceneEntityRef;
23
+ export declare function validateSceneEntityKeys(sceneSourceKey: string, entityKeys: readonly string[]): Result<readonly string[], SceneBindingDeclarationError>;
24
+ export declare function sceneEntity(sceneSourceKey: string, address: SceneEntityAddress): SceneEntityRef;
25
+ /** Stable map key shared by direct and nested SceneEntityRef addresses. */
26
+ export declare function sceneEntityAddressKey(address: SceneEntityAddress): string;
25
27
  export declare function resolveSceneEntity(ref: SceneEntityRef, instance: {
26
28
  readonly sceneSourceKey: string;
27
29
  readonly bindings: ReadonlyMap<string, EntityHandle | number>;
@@ -1 +1 @@
1
- {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/instances/binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE7D,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,8BAA8B,CAAC;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACnF,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,GAAG,8BAA8B,CAAC;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrF,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAsBzD;AAED,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAEtF;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE;IACR,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;CAC/D,GACA,MAAM,CAAC,YAAY,GAAG,MAAM,EAAE,iBAAiB,CAAC,CAmBlD"}
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/instances/binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE7D,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,8BAA8B,CAAC;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAC5F,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,GAAG,8BAA8B,CAAC;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAC9F,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAsBzD;AAED,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,cAAc,CAE/F;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAIzE;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE;IACR,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;CAC/D,GACA,MAAM,CAAC,YAAY,GAAG,MAAM,EAAE,iBAAiB,CAAC,CAmBlD"}
@@ -9,6 +9,6 @@ export interface ExternalizedSceneAsset {
9
9
  readonly payload: Record<string, unknown>;
10
10
  readonly refs: readonly AssetRef[];
11
11
  }
12
- /** Project a SceneAsset's shared asset fields into a payload plus indexed refs. */
12
+ /** Project a keyed SceneAsset's shared asset fields into a payload plus refs. */
13
13
  export declare function externalizeSceneAsset(scene: SceneAsset, resolveSchema: SceneComponentSchemaResolver): Result<ExternalizedSceneAsset, SceneExternalizationError>;
14
14
  //# sourceMappingURL=externalization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"externalization.d.ts","sourceRoot":"","sources":["../../src/instances/externalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,4BAA4B,GAAG,CACzC,aAAa,EAAE,MAAM,KAClB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CACpC;AA+BD,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,aAAa,EAAE,4BAA4B,GAC1C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,CA4F3D"}
1
+ {"version":3,"file":"externalization.d.ts","sourceRoot":"","sources":["../../src/instances/externalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAyB,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG7D,MAAM,MAAM,4BAA4B,GAAG,CACzC,aAAa,EAAE,MAAM,KAClB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CACpC;AAkFD,iFAAiF;AACjF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,aAAa,EAAE,4BAA4B,GAC1C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,CA0D3D"}
@@ -0,0 +1,38 @@
1
+ import type { World } from '@forgeax/engine-ecs';
2
+ import type { ComponentValuesMap, LocalEntityId, SceneAsset } from '@forgeax/engine-types';
3
+ import { type Handle, type Result } from '@forgeax/engine-types';
4
+ import type { SceneInstanceMount } from './runtime-types.js';
5
+ /** Numeric representation used only inside the Scene runtime. */
6
+ export interface CompiledSceneEntity {
7
+ readonly localId: LocalEntityId;
8
+ readonly components: Partial<ComponentValuesMap>;
9
+ }
10
+ export interface CompiledSceneAsset {
11
+ readonly kind: 'scene';
12
+ readonly entities: readonly CompiledSceneEntity[];
13
+ readonly mounts?: readonly SceneInstanceMount[];
14
+ readonly skinGuids?: readonly string[];
15
+ }
16
+ export interface CompiledSceneResult {
17
+ readonly asset: CompiledSceneAsset;
18
+ readonly keyByLocalId: ReadonlyMap<number, string>;
19
+ readonly mountKeyByLocalId: ReadonlyMap<number, string>;
20
+ /** Private slots that attach directly to this scene's synthetic root. */
21
+ readonly rootLocalIds: readonly number[];
22
+ /** Effective private ChildOf edges, including nested scene attachment. */
23
+ readonly hierarchyParentByLocalId: ReadonlyMap<number, number>;
24
+ readonly resolveAddress: (address: unknown, field?: string) => number | undefined;
25
+ }
26
+ export interface KeyedSceneCompileContext {
27
+ readonly resolveSource: (source: string, parent: Handle<'SceneAsset', 'shared'>) => Result<Handle<'SceneAsset', 'shared'>, unknown>;
28
+ readonly resolveAsset: (handle: Handle<'SceneAsset', 'shared'>) => Result<SceneAsset, unknown>;
29
+ readonly stack: ReadonlySet<number>;
30
+ }
31
+ /**
32
+ * Compile keyed author data to the private numeric Scene representation. The
33
+ * compiler establishes every local and nested address before the caller starts
34
+ * spawning entities, so malformed references and recursive instances cannot
35
+ * leave a partially usable World projection.
36
+ */
37
+ export declare function compileKeyedSceneAsset(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: SceneAsset, context: KeyedSceneCompileContext): Result<CompiledSceneResult, unknown>;
38
+ //# sourceMappingURL=keyed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyed.d.ts","sourceRoot":"","sources":["../../src/instances/keyed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,KAAK,MAAM,EAGX,KAAK,MAAM,EAEZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAiB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/D,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACnF;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,KACnC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/F,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC;AA4GD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAwUtC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Normalize the small set of SceneAsset fields emitted by the 0.1.27
3
+ * ScriptablePack template before the current keyed runtime validates them.
4
+ *
5
+ * This is deliberately a boundary migration. Current authoring and runtime
6
+ * types stay keyed and use `shadowFilter`; only old payloads carry numeric
7
+ * ChildOf addresses or `pcfKernelSize`.
8
+ */
9
+ export declare function migrateLegacySceneComponentFields(componentName: string, source: Record<string, unknown>, addressByLocalId?: ReadonlyMap<number, string>): Record<string, unknown>;
10
+ /**
11
+ * Lift the pre-keyed SceneAsset array into the current keyed shape.
12
+ *
13
+ * The 0.1.27 template used `localId` for storage and `bindingKey` for the
14
+ * gameplay-facing names. Keeping the binding key is essential: the runtime
15
+ * resolves `player`, `camera`, and joints by that name, not by the old number.
16
+ * This function is intentionally structural and accepts `unknown` only at the
17
+ * compatibility boundary; current authoring types remain keyed.
18
+ */
19
+ export declare function normalizeLegacySceneAsset(scene: unknown): import('@forgeax/engine-types').SceneAsset;
20
+ //# sourceMappingURL=legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/instances/legacy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC/C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AASD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,OAAO,uBAAuB,EAAE,UAAU,CAwD5C"}
@@ -0,0 +1,20 @@
1
+ import type { ComponentValuesMap, LocalEntityId } from '@forgeax/engine-types';
2
+ /** Runtime-only component update used while expanding a keyed scene. */
3
+ export interface MountOverride {
4
+ readonly localId: LocalEntityId;
5
+ readonly comp: string;
6
+ readonly field?: string;
7
+ readonly value: unknown;
8
+ }
9
+ /** Numeric SceneInstance projection; never part of SceneAsset authoring/wire data. */
10
+ export interface SceneInstanceMount {
11
+ readonly localId: LocalEntityId;
12
+ readonly source: number | string;
13
+ readonly memberFirst: LocalEntityId;
14
+ readonly memberCount: number;
15
+ readonly parent?: LocalEntityId;
16
+ readonly components?: Partial<ComponentValuesMap>;
17
+ readonly overrides?: readonly MountOverride[];
18
+ readonly publicationFence?: import('@forgeax/engine-types').ScenePublicationFence;
19
+ }
20
+ //# sourceMappingURL=runtime-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-types.d.ts","sourceRoot":"","sources":["../../src/instances/runtime-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE/E,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,uBAAuB,EAAE,qBAAqB,CAAC;CACnF"}
@@ -1,41 +1,36 @@
1
1
  import { type Component, type ComponentData, type ComponentSchema, type EcsError, type EntityHandle, type ShapeOf, type World } from '@forgeax/engine-ecs';
2
- import type { Handle, LocalEntityId, MountOverride, SceneAsset, SceneEntityRef, SceneInstanceMount } from '@forgeax/engine-types';
2
+ import type { Handle, LocalEntityId, SceneAsset, SceneEntityRef } from '@forgeax/engine-types';
3
3
  import { type Result } from '@forgeax/engine-types';
4
+ import { type CompiledSceneAsset, type CompiledSceneEntity } from './keyed.js';
5
+ import type { MountOverride, SceneInstanceMount } from './runtime-types.js';
4
6
  import { type SceneInstanceStatePayload } from './state.js';
5
7
  export type { SceneInstanceStatePayload } from './state.js';
6
8
  /**
7
- * C-R2 (feat-20260622-s5 / studio-issues): one structured, non-fatal record of
8
- * a SceneAsset payload field that did NOT match the target component's schema.
9
- *
10
- * Scene data is loader-fed and may carry a stale / deprecated / typo'd field
11
- * (an editor renames a field, an old `.pack.json` lags). `worldInstantiateScene`
12
- * does NOT blank the whole scene over one such field (#478 lesson: a
13
- * prod-silent strip re-introduced an invisible-entity class) and does NOT abort
14
- * fatally. Instead it skips the unknown key (no write, no input mutation) and
15
- * surfaces this record on the success value's `diagnostics[]` — observable in
16
- * production (NOT NODE_ENV-gated), consumed by property access (no string parse):
9
+ * Legacy diagnostic shape retained on the scene-instantiation result for
10
+ * non-blocking runtime observations. SceneAsset schema violations are
11
+ * rejected by the keyed compiler before this result is produced; no authored
12
+ * unknown-field record is emitted by the current path.
17
13
  *
18
14
  * const r = worldInstantiateScene(world, handle);
19
15
  * if (r.ok) for (const d of r.value.diagnostics)
20
- * console.warn(`unknown field ${d.component}.${d.field} on localId ${d.localId}`);
16
+ * console.warn('scene diagnostic', d);
21
17
  *
22
- * Direct `world.spawn` / `world.addComponent` / `Commands.spawn` stay fail-fast
23
- * with `SpawnDataUnknownFieldError` — those are explicit API calls where a typo
24
- * is a programming error, not loader-fed data.
18
+ * Direct `world.spawn` / `world.addComponent` / `Commands.spawn` remain
19
+ * fail-fast with `SpawnDataUnknownFieldError`.
25
20
  */
26
21
  export type SceneInstantiateDiagnostic = {
27
- /** Component name (schema key) the unknown field appeared under. */
22
+ /** Component name associated with the observation. */
28
23
  readonly component: string;
29
- /** The offending field name not declared in the component schema. */
24
+ /** Field associated with the observation. */
30
25
  readonly field: string;
31
- /** LocalEntityId (within its owning SceneAsset) of the carrying entity. */
26
+ /** LocalEntityId within the owning SceneAsset, when applicable. */
32
27
  readonly localId: number;
33
28
  };
34
29
  /**
35
30
  * Success value of `worldInstantiateScene`. `root` is the synthetic scene-root
36
- * EntityHandle (carries `SceneInstance`); `diagnostics` is the (possibly empty)
37
- * list of non-fatal unknown-field records aggregated across this scene and every
38
- * recursively mounted sub-scene (C-R2). Empty array = no diagnostics.
31
+ * EntityHandle (carries `SceneInstance`); `diagnostics` contains only
32
+ * non-blocking runtime observations. Schema-invalid authored fields fail before
33
+ * an entity is created.
39
34
  */
40
35
  export type SceneInstantiateOk = {
41
36
  readonly root: EntityHandle;
@@ -90,6 +85,7 @@ export interface SceneMembersSpawn {
90
85
  readonly mount: SceneInstanceMount;
91
86
  readonly root: EntityHandle;
92
87
  readonly mapping: Uint32Array;
88
+ readonly key?: string;
93
89
  }[];
94
90
  /** `entities.length + mounts + Σ memberCount`, captured at instantiate-time. */
95
91
  readonly totalSlots: number;
@@ -115,12 +111,12 @@ export declare function worldGetSceneAssetResolver(world: World): SceneAssetReso
115
111
  * const r = worldInstantiateScene(world, handle);
116
112
  * if (!r.ok) return r;
117
113
  * const { root, diagnostics } = r.value;
118
- * for (const d of diagnostics) // C-R2: unknown-field records, non-fatal
119
- * console.warn(`unknown field ${d.component}.${d.field} on localId ${d.localId}`);
114
+ * for (const d of diagnostics) // non-blocking runtime observations
115
+ * console.warn('scene diagnostic', d);
120
116
  * const inst = world.get(root, SceneInstance).value;
121
117
  * const member = inst.mapping[0]; // first member entity
122
118
  */
123
- export declare function worldInstantiateScene(world: World, handle: Handle<'SceneAsset', 'shared'>, parent?: EntityHandle): Result<SceneInstantiateOk, EcsError>;
119
+ export declare function worldInstantiateScene(world: World, handle: Handle<'SceneAsset', 'shared'>, parent?: EntityHandle, sceneSourceKey?: string): Result<SceneInstantiateOk, EcsError>;
124
120
  /**
125
121
  * Materialise a projected `SceneAsset` payload without exposing the temporary
126
122
  * shared-ref handle to the caller. The World remains the owner of both the
@@ -153,7 +149,7 @@ export declare function worldInstantiateSceneFlat(world: World, handle: Handle<'
153
149
  * other public callers must not see this mechanic — use `instantiateScene`
154
150
  * (D-3 / charter P1).
155
151
  */
156
- export declare function worldInstantiateSceneRec(world: World, handle: Handle<'SceneAsset', 'shared'>, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[]): Result<EntityHandle, EcsError>;
152
+ export declare function worldInstantiateSceneRec(world: World, handle: Handle<'SceneAsset', 'shared'>, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[], instanceKey?: string, sceneSourceKey?: string): Result<EntityHandle, EcsError>;
157
153
  /**
158
154
  * @internal Resolve a SceneAsset handle through the SharedRefStore.
159
155
  * The handle u32 is the SharedRefStore slot id (`world.allocSharedRef
@@ -170,7 +166,7 @@ export declare function worldResolveSceneAsset(world: World, handle: Handle<'Sce
170
166
  * synthetic root or force any `ChildOf` — that is the caller's (finisher's)
171
167
  * job. `_instantiateSceneRec` owns cycle bookkeeping.
172
168
  */
173
- export declare function worldSpawnSceneMembers(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: SceneAsset, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[]): Result<SceneMembersSpawn, EcsError>;
169
+ export declare function worldSpawnSceneMembers(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: CompiledSceneAsset, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[], mountKeys?: ReadonlyMap<number, string>): Result<SceneMembersSpawn, EcsError>;
174
170
  /**
175
171
  * @internal Spawn one SceneAsset's entities + apply mounts recursively, then
176
172
  * wrap them in a synthetic SceneInstance root (the anchor). This is the
@@ -178,7 +174,7 @@ export declare function worldSpawnSceneMembers(world: World, handle: Handle<'Sce
178
174
  * entity-with-SceneInstance). Caller (`_instantiateSceneRec`) owns cycle
179
175
  * bookkeeping.
180
176
  */
181
- export declare function worldInstantiateSceneAsset(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: SceneAsset, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[]): Result<EntityHandle, EcsError>;
177
+ export declare function worldInstantiateSceneAsset(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: SceneAsset, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[], instanceKey?: string, sceneSourceKey?: string): Result<EntityHandle, EcsError>;
182
178
  /**
183
179
  * @internal Flat finisher — spawn one SceneAsset's members WITHOUT wrapping
184
180
  * them in a synthetic SceneInstance root and WITHOUT forcing `ChildOf` onto
@@ -195,17 +191,11 @@ export declare function worldInstantiateSceneAssetFlat(world: World, handle: Han
195
191
  }, EcsError>;
196
192
  /** @internal Build ComponentData[] for one SceneEntity, remapping localIds.
197
193
  *
198
- * C-R2 (feat-20260622-s5 M6): unknown fields on a SceneAsset payload are NOT
199
- * fatal. Unlike `world.spawn` (an explicit API call where a typo is a
200
- * programming error -> `SpawnDataUnknownFieldError`), scene data is loader-fed
201
- * and may carry a stale / deprecated / typo'd field. The remap below builds a
202
- * fresh `remappedRaw` and simply SKIPS keys absent from the schema (no input
203
- * mutation — the source `raw` is never deleted-from), recording each skipped
204
- * key as a non-fatal `SceneInstantiateDiagnostic` into the passed accumulator.
205
- * All known fields still write through, so one bad field cannot blank the
206
- * entity or the scene (C-AC-02/03/04).
194
+ * SceneAsset payloads use the same schema contract as explicit ECS writes.
195
+ * Unknown fields fail before the first entity is spawned, with the component
196
+ * schema's structured error. The source object is never mutated.
207
197
  */
208
- export declare function worldBuildSceneEntityComponentDatas(world: World, node: import('@forgeax/engine-types').SceneEntity, mapping: Uint32Array, diagnostics: SceneInstantiateDiagnostic[]): Result<ComponentData[], EcsError>;
198
+ export declare function worldBuildSceneEntityComponentDatas(world: World, node: CompiledSceneEntity, mapping: Uint32Array, _diagnostics: SceneInstantiateDiagnostic[]): Result<ComponentData[], EcsError>;
209
199
  /**
210
200
  * @internal feat-20260713 M2 / w8: apply one MountOverride to a live member
211
201
  * entity column. The `field?` shape is the add-or-patch discriminant:
@@ -1 +1 @@
1
- {"version":3,"file":"scene-instances.d.ts","sourceRoot":"","sources":["../../src/instances/scene-instances.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scene-instances.d.ts","sourceRoot":"","sources":["../../src/instances/scene-instances.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
1
  import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
- import type { Handle, LocalEntityId, MountOverride } from '@forgeax/engine-types';
2
+ import type { Handle, LocalEntityId } from '@forgeax/engine-types';
3
+ import type { MountOverride } from './runtime-types.js';
3
4
  /** Internal state retained by a SceneInstance root. */
4
5
  export interface SceneInstanceStatePayload {
5
6
  readonly source: Handle<'SceneAsset', 'shared'>;
6
7
  readonly sceneSourceKey?: string;
8
+ /** Authored key for each private numeric slot, retained for collection. */
9
+ readonly keyByLocalId: Map<number, string>;
10
+ /** Authored key of this instance when it is nested in a parent scene. */
11
+ readonly instanceKey?: string;
7
12
  readonly bindings: Map<string, EntityHandle>;
8
13
  readonly entityToLocalId: Map<EntityHandle, LocalEntityId>;
9
14
  readonly detachedLocalIds: Set<LocalEntityId>;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/instances/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAElF,uDAAuD;AACvD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,GAAG,CACrB,aAAa,EACb,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CACzF,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,aAAa,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,CAM7D;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAE/D;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAgBrE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIzD"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/instances/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,uDAAuD;AACvD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,GAAG,CACrB,aAAa,EACb,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CACzF,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,aAAa,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,CAM7D;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAE/D;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAgBrE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIzD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/engine-scene",
3
- "version": "0.1.28",
3
+ "version": "0.1.30",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -22,10 +22,10 @@
22
22
  "LICENSE"
23
23
  ],
24
24
  "dependencies": {
25
- "@forgeax/engine-ecs": "0.1.28",
26
- "@forgeax/engine-math": "0.1.28",
27
- "@forgeax/engine-plugin": "0.1.28",
28
- "@forgeax/engine-types": "0.1.28"
25
+ "@forgeax/engine-ecs": "0.1.30",
26
+ "@forgeax/engine-math": "0.1.30",
27
+ "@forgeax/engine-plugin": "0.1.30",
28
+ "@forgeax/engine-types": "0.1.30"
29
29
  },
30
30
  "forgeax": {
31
31
  "metrics": {
@@ -19,12 +19,9 @@ function registerSceneWorld(world: World): void {
19
19
  function scene(): SceneAsset {
20
20
  return {
21
21
  kind: 'scene',
22
- entities: [
23
- {
24
- localId: 0 as never,
25
- components: { ScenePayloadMarker: { value: 7 } },
26
- },
27
- ],
22
+ entities: {
23
+ marker: { components: { ScenePayloadMarker: { value: 7 } } },
24
+ },
28
25
  };
29
26
  }
30
27
 
@@ -48,7 +45,7 @@ describe('scene payload ownership', () => {
48
45
 
49
46
  const result = worldInstantiateScenePayload(world, {
50
47
  kind: 'scene',
51
- entities: [{ localId: 0 as never, components: { MissingComponent: { value: 1 } } }],
48
+ entities: { missing: { components: { MissingComponent: { value: 1 } } } },
52
49
  } as SceneAsset);
53
50
 
54
51
  expect(result.ok).toBe(false);
@@ -11,8 +11,16 @@ import {
11
11
  import { GlobalTransform, propagateTransforms, Transform } from '../index';
12
12
 
13
13
  const SEED = 20260901;
14
- const WARMUP_FRAMES = 5;
15
- const SAMPLE_FRAMES = 20;
14
+
15
+ const processLike = (
16
+ globalThis as typeof globalThis & {
17
+ process?: { memoryUsage(): { heapUsed: number }; env?: Record<string, string | undefined> };
18
+ }
19
+ ).process;
20
+ const CI_MODE = processLike?.env?.CI !== undefined;
21
+ const WARMUP_FRAMES = CI_MODE ? 2 : 5;
22
+ const SAMPLE_FRAMES = CI_MODE ? 5 : 20;
23
+ const LARGE_ROWS = CI_MODE ? 20_000 : 100_000;
16
24
 
17
25
  type Mode = 'full' | 'sparse' | 'mixed';
18
26
 
@@ -68,19 +76,13 @@ const WORKLOADS: readonly Workload[] = [
68
76
  { mode: 'full', rows: 10_000, movers: 10_000 },
69
77
  { mode: 'sparse', rows: 10_000, movers: 1 },
70
78
  { mode: 'sparse', rows: 10_000, movers: 100 },
71
- { mode: 'full', rows: 100_000, movers: 100_000 },
72
- { mode: 'sparse', rows: 100_000, movers: 1 },
73
- { mode: 'sparse', rows: 100_000, movers: 100 },
74
- { mode: 'mixed', rows: 100_000, movers: 10_000 },
75
- { mode: 'full', rows: 100_000, movers: 0 },
79
+ { mode: 'full', rows: LARGE_ROWS, movers: LARGE_ROWS },
80
+ { mode: 'sparse', rows: LARGE_ROWS, movers: 1 },
81
+ { mode: 'sparse', rows: LARGE_ROWS, movers: 100 },
82
+ { mode: 'mixed', rows: LARGE_ROWS, movers: LARGE_ROWS / 10 },
83
+ { mode: 'full', rows: LARGE_ROWS, movers: 0 },
76
84
  ];
77
85
 
78
- const processLike = (
79
- globalThis as typeof globalThis & {
80
- process?: { memoryUsage(): { heapUsed: number }; env?: Record<string, string | undefined> };
81
- }
82
- ).process;
83
-
84
86
  function percentile(values: readonly number[], fraction: number): number {
85
87
  const sorted = [...values].sort((left, right) => left - right);
86
88
  const index = Math.min(sorted.length - 1, Math.ceil(sorted.length * fraction) - 1);
@@ -294,8 +296,9 @@ function runWorkload(workload: Workload): FlatReceipt {
294
296
  }
295
297
 
296
298
  describe('real ECS flat Transform propagation benchmark', () => {
297
- // Coverage instrumentation expands the 100k-row allocation-sensitive workload substantially;
298
- // keep its explicit benchmark budget separate from ordinary unit tests.
299
+ // Coverage instrumentation expands the default 100k-row allocation-sensitive workload
300
+ // substantially; CI selects a bounded 20k-row large case while local runs retain the full
301
+ // benchmark budget and receipt values.
299
302
  it('covers dynamic full, sparse, and mixed C workloads without a static shortcut', () => {
300
303
  const receipts = WORKLOADS.map(runWorkload);
301
304
  // biome-ignore lint/suspicious/noConsole: benchmark output is the machine evidence receipt.
@@ -330,7 +333,5 @@ describe('real ECS flat Transform propagation benchmark', () => {
330
333
 
331
334
  const source = readFileSync('packages/scene/src/systems/propagate-transforms.ts', 'utf8');
332
335
  expect(source).not.toMatch(/new (Map|Set)|\\b(Map|Set)</);
333
- // biome-ignore lint/suspicious/noConsole: benchmark output is the machine evidence receipt.
334
- console.info(JSON.stringify({ schemaVersion: 1, receipts }));
335
336
  }, 120_000);
336
337
  });