
> stratum-fx-workspace@0.1.0 pretest
> node scripts/build.js

Built five reusable packages and standalone app (301 KiB). Static site: dist/

> stratum-fx-workspace@0.1.0 test
> node --test tests/*.test.js

TAP version 13
# Subtest: Switching projects ignores a stale resync result
ok 1 - Switching projects ignores a stale resync result
  ---
  duration_ms: 5.426934
  type: 'test'
  ...
# Subtest: Disconnect ignores a late connection fetch
ok 2 - Disconnect ignores a late connection fetch
  ---
  duration_ms: 2.782085
  type: 'test'
  ...
# Subtest: Stale operation completion cannot clear a newer in-flight request
ok 3 - Stale operation completion cannot clear a newer in-flight request
  ---
  duration_ms: 0.823361
  type: 'test'
  ...
# Subtest: Viewer edits are rolled back against the authoritative graph
ok 4 - Viewer edits are rolled back against the authoritative graph
  ---
  duration_ms: 1.894766
  type: 'test'
  ...
# Subtest: expression precedence, parentheses, variables and functions
ok 5 - expression precedence, parentheses, variables and functions
  ---
  duration_ms: 4.237379
  type: 'test'
  ...
# Subtest: expression interpreter rejects arbitrary JS and prototype access
ok 6 - expression interpreter rejects arbitrary JS and prototype access
  ---
  duration_ms: 0.648283
  type: 'test'
  ...
# Subtest: expression bounds reject infinity, excessive size and nesting
ok 7 - expression bounds reject infinity, excessive size and nesting
  ---
  duration_ms: 0.443419
  type: 'test'
  ...
# Subtest: linear and step keyframes interpolate and clamp endpoints
ok 8 - linear and step keyframes interpolate and clamp endpoints
  ---
  duration_ms: 0.374541
  type: 'test'
  ...
# Subtest: operator box cooks through the graph engine
ok 9 - operator box cooks through the graph engine
  ---
  duration_ms: 7.571918
  type: 'test'
  ...
# Subtest: operator sphere cooks through the graph engine
ok 10 - operator sphere cooks through the graph engine
  ---
  duration_ms: 4.183248
  type: 'test'
  ...
# Subtest: operator grid cooks through the graph engine
ok 11 - operator grid cooks through the graph engine
  ---
  duration_ms: 5.712108
  type: 'test'
  ...
# Subtest: operator torus cooks through the graph engine
ok 12 - operator torus cooks through the graph engine
  ---
  duration_ms: 8.219169
  type: 'test'
  ...
# Subtest: operator cylinder cooks through the graph engine
ok 13 - operator cylinder cooks through the graph engine
  ---
  duration_ms: 4.351362
  type: 'test'
  ...
# Subtest: operator helix cooks through the graph engine
ok 14 - operator helix cooks through the graph engine
  ---
  duration_ms: 8.344654
  type: 'test'
  ...
# Subtest: operator terrain cooks through the graph engine
ok 15 - operator terrain cooks through the graph engine
  ---
  duration_ms: 44.139304
  type: 'test'
  ...
# Subtest: operator transform cooks through the graph engine
ok 16 - operator transform cooks through the graph engine
  ---
  duration_ms: 1.178455
  type: 'test'
  ...
# Subtest: operator noise cooks through the graph engine
ok 17 - operator noise cooks through the graph engine
  ---
  duration_ms: 1.979343
  type: 'test'
  ...
# Subtest: operator twist cooks through the graph engine
ok 18 - operator twist cooks through the graph engine
  ---
  duration_ms: 0.974995
  type: 'test'
  ...
# Subtest: operator taper cooks through the graph engine
ok 19 - operator taper cooks through the graph engine
  ---
  duration_ms: 1.150824
  type: 'test'
  ...
# Subtest: operator subdivide cooks through the graph engine
ok 20 - operator subdivide cooks through the graph engine
  ---
  duration_ms: 2.414688
  type: 'test'
  ...
# Subtest: operator smooth cooks through the graph engine
ok 21 - operator smooth cooks through the graph engine
  ---
  duration_ms: 1.474459
  type: 'test'
  ...
# Subtest: operator normals cooks through the graph engine
ok 22 - operator normals cooks through the graph engine
  ---
  duration_ms: 0.659584
  type: 'test'
  ...
# Subtest: operator color cooks through the graph engine
ok 23 - operator color cooks through the graph engine
  ---
  duration_ms: 0.816538
  type: 'test'
  ...
# Subtest: operator scatter cooks through the graph engine
ok 24 - operator scatter cooks through the graph engine
  ---
  duration_ms: 2.601818
  type: 'test'
  ...
# Subtest: operator copy cooks through the graph engine
ok 25 - operator copy cooks through the graph engine
  ---
  duration_ms: 1.80096
  type: 'test'
  ...
# Subtest: operator merge cooks through the graph engine
ok 26 - operator merge cooks through the graph engine
  ---
  duration_ms: 2.994052
  type: 'test'
  ...
# Subtest: operator switch cooks through the graph engine
ok 27 - operator switch cooks through the graph engine
  ---
  duration_ms: 0.498703
  type: 'test'
  ...
# Subtest: operator output cooks through the graph engine
ok 28 - operator output cooks through the graph engine
  ---
  duration_ms: 0.476471
  type: 'test'
  ...
# Subtest: operator null cooks through the graph engine
ok 29 - operator null cooks through the graph engine
  ---
  duration_ms: 0.530372
  type: 'test'
  ...
# Subtest: operator realize cooks through the graph engine
ok 30 - operator realize cooks through the graph engine
  ---
  duration_ms: 0.91923
  type: 'test'
  ...
# Subtest: operator wrangle cooks through the graph engine
ok 31 - operator wrangle cooks through the graph engine
  ---
  duration_ms: 4.350581
  type: 'test'
  ...
# Subtest: operator particles cooks through the graph engine
ok 32 - operator particles cooks through the graph engine
  ---
  duration_ms: 14.783129
  type: 'test'
  ...
# Subtest: operator cloth cooks through the graph engine
ok 33 - operator cloth cooks through the graph engine
  ---
  duration_ms: 73.900252
  type: 'test'
  ...
# Subtest: operator rigid cooks through the graph engine
ok 34 - operator rigid cooks through the graph engine
  ---
  duration_ms: 30.555035
  type: 'test'
  ...
# Subtest: operator obj cooks through the graph engine
ok 35 - operator obj cooks through the graph engine
  ---
  duration_ms: 0.584934
  type: 'test'
  ...
# Subtest: editable example basalt validates and cooks
ok 36 - editable example basalt validates and cooks
  ---
  duration_ms: 61.374982
  type: 'test'
  ...
# Subtest: editable example lattice validates and cooks
ok 37 - editable example lattice validates and cooks
  ---
  duration_ms: 9.888743
  type: 'test'
  ...
# Subtest: editable example terrain validates and cooks
ok 38 - editable example terrain validates and cooks
  ---
  duration_ms: 39.957752
  type: 'test'
  ...
# Subtest: editable example cloth validates and cooks
ok 39 - editable example cloth validates and cooks
  ---
  duration_ms: 194.570331
  type: 'test'
  ...
# Subtest: editable example particles validates and cooks
ok 40 - editable example particles validates and cooks
  ---
  duration_ms: 15.882308
  type: 'test'
  ...
# Subtest: editable example rigid validates and cooks
ok 41 - editable example rigid validates and cooks
  ---
  duration_ms: 131.422614
  type: 'test'
  ...
# Subtest: editable example sculpture validates and cooks
ok 42 - editable example sculpture validates and cooks
  ---
  duration_ms: 27.250958
  type: 'test'
  ...
# Subtest: cooking reuses unchanged subgraphs and invalidates downstream only
ok 43 - cooking reuses unchanged subgraphs and invalidates downstream only
  ---
  duration_ms: 1.146646
  type: 'test'
  ...
# Subtest: cycle creation is rejected without mutating the input document
ok 44 - cycle creation is rejected without mutating the input document
  ---
  duration_ms: 0.498283
  type: 'test'
  ...
# Subtest: operations reject prototype keys, invalid fields and invalid bypass
ok 45 - operations reject prototype keys, invalid fields and invalid bypass
  ---
  duration_ms: 0.366806
  type: 'test'
  ...
# Subtest: mixed invalid batch is atomic
ok 46 - mixed invalid batch is atomic
  ---
  duration_ms: 0.285504
  type: 'test'
  ...
# Subtest: undo and redo restore parameter values and maintain an operation history
ok 47 - undo and redo restore parameter values and maintain an operation history
  ---
  duration_ms: 1.445986
  type: 'test'
  ...
# Subtest: compensating undo leaves unrelated remote edits intact
ok 48 - compensating undo leaves unrelated remote edits intact
  ---
  duration_ms: 0.417632
  type: 'test'
  ...
# Subtest: node deletion disconnects dependencies; undo restores them
ok 49 - node deletion disconnects dependencies; undo restores them
  ---
  duration_ms: 0.554798
  type: 'test'
  ...
# Subtest: document diff roundtrip restores all edited fields
ok 50 - document diff roundtrip restores all edited fields
  ---
  duration_ms: 0.381344
  type: 'test'
  ...
# Subtest: expressions drive transform vector components per frame
ok 51 - expressions drive transform vector components per frame
  ---
  duration_ms: 0.524642
  type: 'test'
  ...
# Subtest: keyframed numeric parameters cook interpolated geometry
ok 52 - keyframed numeric parameters cook interpolated geometry
  ---
  duration_ms: 1.352771
  type: 'test'
  ...
# Subtest: custom registry nodes accept structurally compatible external geometry
ok 53 - custom registry nodes accept structurally compatible external geometry
  ---
  duration_ms: 0.45966
  type: 'test'
  ...
# Subtest: frame validation rejects NaN and unbounded values
ok 54 - frame validation rejects NaN and unbounded values
  ---
  duration_ms: 0.255999
  type: 'test'
  ...
# Subtest: FPS changes invalidate time-dependent nodes at the same frame
ok 55 - FPS changes invalidate time-dependent nodes at the same frame
  ---
  duration_ms: 8.699811
  type: 'test'
  ...
# Subtest: static attribute noise does not recook on timeline-only changes
ok 56 - static attribute noise does not recook on timeline-only changes
  ---
  duration_ms: 1.595365
  type: 'test'
  ...
# Subtest: box: finite indexed geometry and normals
ok 57 - box: finite indexed geometry and normals
  ---
  duration_ms: 7.260967
  type: 'test'
  ...
# Subtest: sphere: finite indexed geometry and normals
ok 58 - sphere: finite indexed geometry and normals
  ---
  duration_ms: 14.076649
  type: 'test'
  ...
# Subtest: torus: finite indexed geometry and normals
ok 59 - torus: finite indexed geometry and normals
  ---
  duration_ms: 10.344749
  type: 'test'
  ...
# Subtest: grid: finite indexed geometry and normals
ok 60 - grid: finite indexed geometry and normals
  ---
  duration_ms: 21.874571
  type: 'test'
  ...
# Subtest: cylinder: finite indexed geometry and normals
ok 61 - cylinder: finite indexed geometry and normals
  ---
  duration_ms: 5.998584
  type: 'test'
  ...
# Subtest: helix: finite indexed geometry and normals
ok 62 - helix: finite indexed geometry and normals
  ---
  duration_ms: 12.105667
  type: 'test'
  ...
# Subtest: terrain: finite indexed geometry and normals
ok 63 - terrain: finite indexed geometry and normals
  ---
  duration_ms: 47.231274
  type: 'test'
  ...
# Subtest: matrix inversion reverses translated rotated nonuniform scale
ok 64 - matrix inversion reverses translated rotated nonuniform scale
  ---
  duration_ms: 1.058671
  type: 'test'
  ...
# Subtest: matrix product identity and singular inversion rejection
ok 65 - matrix product identity and singular inversion rejection
  ---
  duration_ms: 1.421733
  type: 'test'
  ...
# Subtest: seeded RNG and fBm are reproducible
ok 66 - seeded RNG and fBm are reproducible
  ---
  duration_ms: 0.829693
  type: 'test'
  ...
# Subtest: invalid mesh indices, finite values and UVs are rejected
ok 67 - invalid mesh indices, finite values and UVs are rejected
  ---
  duration_ms: 2.679957
  type: 'test'
  ...
# Subtest: clone does not alias geometry buffers
ok 68 - clone does not alias geometry buffers
  ---
  duration_ms: 0.398555
  type: 'test'
  ...
# Subtest: transforms stay instanced until realization
ok 69 - transforms stay instanced until realization
  ---
  duration_ms: 1.531475
  type: 'test'
  ...
# Subtest: copy zero variation keeps exact unit transforms and material
ok 70 - copy zero variation keeps exact unit transforms and material
  ---
  duration_ms: 0.766054
  type: 'test'
  ...
# Subtest: zero instances have finite empty bounds
ok 71 - zero instances have finite empty bounds
  ---
  duration_ms: 0.453238
  type: 'test'
  ...
# Subtest: merging applies transforms and offsets indices
ok 72 - merging applies transforms and offsets indices
  ---
  duration_ms: 1.157276
  type: 'test'
  ...
# Subtest: linear triangle subdivision quadruples topology
ok 73 - linear triangle subdivision quadruples topology
  ---
  duration_ms: 1.757078
  type: 'test'
  ...
# Subtest: smoothing preserves index topology
ok 74 - smoothing preserves index topology
  ---
  duration_ms: 1.804327
  type: 'test'
  ...
# Subtest: surface scattering is deterministic and constrained to a grid
ok 75 - surface scattering is deterministic and constrained to a grid
  ---
  duration_ms: 3.734358
  type: 'test'
  ...
# Subtest: degenerate scatter and non-finite deform fail explicitly
ok 76 - degenerate scatter and non-finite deform fail explicitly
  ---
  duration_ms: 0.487122
  type: 'test'
  ...
# Subtest: OBJ roundtrip preserves triangle positions and triangle count
ok 77 - OBJ roundtrip preserves triangle positions and triangle count
  ---
  duration_ms: 11.459533
  type: 'test'
  ...
# Subtest: OBJ accepts negative polygon indices and rejects invalid references
ok 78 - OBJ accepts negative polygon indices and rejects invalid references
  ---
  duration_ms: 0.480499
  type: 'test'
  ...
# Subtest: binary STL has correct triangle count and byte length
ok 79 - binary STL has correct triangle count and byte length
  ---
  duration_ms: 0.750184
  type: 'test'
  ...
# Subtest: BVH returns closest transformed instance and exact point
ok 80 - BVH returns closest transformed instance and exact point
  ---
  duration_ms: 1.785411
  type: 'test'
  ...
# Subtest: BVH safely skips singular instances
ok 81 - BVH safely skips singular instances
  ---
  duration_ms: 0.4596
  type: 'test'
  ...
# Subtest: cloth pins remain fixed and backward seek recomputes deterministically
ok 82 - cloth pins remain fixed and backward seek recomputes deterministically
  ---
  duration_ms: 81.685058
  type: 'test'
  ...
# Subtest: rigid sphere seek is reproducible and render radii match collision radii
ok 83 - rigid sphere seek is reproducible and render radii match collision radii
  ---
  duration_ms: 47.904144
  type: 'test'
  ...
# Subtest: particle emitter is seed/frame deterministic
ok 84 - particle emitter is seed/frame deterministic
  ---
  duration_ms: 3.013389
  type: 'test'
  ...
# Subtest: realization handles UV buffers larger than JavaScript argument limit
ok 85 - realization handles UV buffers larger than JavaScript argument limit
  ---
  duration_ms: 343.906605
  type: 'test'
  ...
# Subtest: Mesh rejects fractional or non-finite raw triangle indices before uint conversion
ok 86 - Mesh rejects fractional or non-finite raw triangle indices before uint conversion
  ---
  duration_ms: 0.746207
  type: 'test'
  ...
# Subtest: Mesh rejects normal accumulation overflow instead of returning NaN normals
ok 87 - Mesh rejects normal accumulation overflow instead of returning NaN normals
  ---
  duration_ms: 0.265346
  type: 'test'
  ...
# Subtest: Independent ESM geometry interoperates with independent core bundle
ok 88 - Independent ESM geometry interoperates with independent core bundle
  ---
  duration_ms: 9.060553
  type: 'test'
  ...
# Subtest: Core browser-global bundle resolves its readiness promise
ok 89 - Core browser-global bundle resolves its readiness promise
  ---
  duration_ms: 11.303852
  type: 'test'
  ...
# Subtest: Each published package entry and declarations exist
ok 90 - Each published package entry and declarations exist
  ---
  duration_ms: 7.937823
  type: 'test'
  ...
# Subtest: SQLite / HTTP / live collaboration integration
    # Subtest: malformed protocol-relative request URL is rejected without terminating server
    ok 1 - malformed protocol-relative request URL is rejected without terminating server
      ---
      duration_ms: 14.466188
      type: 'test'
      ...
    # Subtest: health and static app are served with security headers
    ok 2 - health and static app are served with security headers
      ---
      duration_ms: 18.870555
      type: 'test'
      ...
    # Subtest: private files and dot paths are not served
    ok 3 - private files and dot paths are not served
      ---
      duration_ms: 23.792168
      type: 'test'
      ...
    # Subtest: registration issues HttpOnly SameSite cookies and distinct accounts
    ok 4 - registration issues HttpOnly SameSite cookies and distinct accounts
      ---
      duration_ms: 255.23437
      type: 'test'
      ...
    # Subtest: malformed authentication bodies and weak credentials are rejected
    ok 5 - malformed authentication bodies and weak credentials are rejected
      ---
      duration_ms: 101.05026
      type: 'test'
      ...
    # Subtest: unauthenticated and cross-origin writes are denied
    ok 6 - unauthenticated and cross-origin writes are denied
      ---
      duration_ms: 5.80364
      type: 'test'
      ...
    # Subtest: owner creates a persisted project; nonmember cannot access it
    ok 7 - owner creates a persisted project; nonmember cannot access it
      ---
      duration_ms: 10.436223
      type: 'test'
      ...
    # Subtest: editor and viewer invitations grant exactly their assigned roles
    ok 8 - editor and viewer invitations grant exactly their assigned roles
      ---
      duration_ms: 20.117292
      type: 'test'
      ...
    # Subtest: SSE establishes a real initial state and authenticated presence
    ok 9 - SSE establishes a real initial state and authenticated presence
      ---
      duration_ms: 3.081165
      type: 'test'
      ...
    # Subtest: concurrent independent edits merge and are streamed to another client
    ok 10 - concurrent independent edits merge and are streamed to another client
      ---
      duration_ms: 9.016261
      type: 'test'
      ...
    # Subtest: viewer cannot mutate operations, checkpoints or members
    ok 11 - viewer cannot mutate operations, checkpoints or members
      ---
      duration_ms: 7.753938
      type: 'test'
      ...
    # Subtest: operation IDs make retries idempotent
    ok 12 - operation IDs make retries idempotent
      ---
      duration_ms: 6.96331
      type: 'test'
      ...
    # Subtest: cycle and invalid batches roll back without revision changes
    ok 13 - cycle and invalid batches roll back without revision changes
      ---
      duration_ms: 6.086719
      type: 'test'
      ...
    # Subtest: cursor updates propagate over SSE with the actual account identity
    ok 14 - cursor updates propagate over SSE with the actual account identity
      ---
      duration_ms: 3.239171
      type: 'test'
      ...
    # Subtest: checkpoint creation, listing and owner restoration are persisted revisions
    ok 15 - checkpoint creation, listing and owner restoration are persisted revisions
      ---
      duration_ms: 13.052778
      type: 'test'
      ...
    # Subtest: role changes immediately enforce server-side permissions
    ok 16 - role changes immediately enforce server-side permissions
      ---
      duration_ms: 8.036894
      type: 'test'
      ...
    # Subtest: audit log is owner-only and includes committed operations
    ok 17 - audit log is owner-only and includes committed operations
      ---
      duration_ms: 4.160733
      type: 'test'
      ...
    # Subtest: SQLite project, membership, checkpoints and session survive restart
    ok 18 - SQLite project, membership, checkpoints and session survive restart
      ---
      duration_ms: 4094.35374
      type: 'test'
      ...
    # Subtest: logout invalidates the previously issued session token
    ok 19 - logout invalidates the previously issued session token
      ---
      duration_ms: 5.559162
      type: 'test'
      ...
    1..19
ok 91 - SQLite / HTTP / live collaboration integration
  ---
  duration_ms: 4851.536568
  type: 'test'
  ...
1..91
# tests 110
# suites 0
# pass 110
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 5509.808518
