Game guide · source of truth
Ledger

M0-11C2

One-simulation spike part C2: the zoen-sim static lib inside the Unity Web build; golden vectors pass in the browser

← Ledger

donestatus · M0
14✓ 2✗tests passed / failed
0tokens · 20 min
9evidence files · 163 kB

Evidence

From logs/evidence/M0-11C2/. Click a thumbnail for the full image.

Images (2)

web-sim-default.png
web-sim-default.png · 49 kB
web-sim-low.png
web-sim-low.png · 56 kB

Logs and data (7)

web-sim-sim-default.txt · 1 kB · open
# http://localhost:4350/ (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/155.0.0.0 Safari/537.36)
ZOEN_BOOT {"product":"Zoen","version":"0.1.0","unity":"6000.3.25f1","platform":"WebGLPlayer","graphicsApi":"OpenGLES3","graphicsVersion":"OpenGL ES 3.0 (WebGL 2.0 (OpenGL ES 3.0 Chromium))","gpu":"ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)","device":"Chrome 155.0.0.0","os":"MacOS 10.15.7","systemMemoryMb":109,"screenWidth":960,"screenHeight":600,"tier":"Mid","tiers":["Low","Mid"],"tierRequest":"","tierRefused":"","tierSource":"PlatformDefault","capKey":"web","cycle":["Low","Mid"],"ultraGate":"none","benchmark":"off","deviceMemoryGb":16.0,"logicalCores":8,"displayHz":60.0,"fpsTarget":30,"targetFrameRate":30,"vSyncCount":0}

ZOEN_SIM {"platform":"WebGLPlayer","abi":1,"loaded":true,"scenario":"walk_eight_directions","finalHash":"bb46012ea5aaaebf","expectedHash":"bb46012ea5aaaebf","match":true,"scenarios":4,"ticks":60,"allMatch":true,"bench":[{"actors":1,"inputsPerTick":1,"medianNsPerTick":100,"samples":11,"ticksPerSample":20000},{"actors":5000,"inputsPerTick":5000,"medianNsPerTick":212500,"samples":11,"ticksPerSample":40}]}

# console errors: 0
web-sim-sim-low-end.txt · 1 kB · open
# http://localhost:4350/ (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/155.0.0.0 Safari/537.36)
ZOEN_BOOT {"product":"Zoen","version":"0.1.0","unity":"6000.3.25f1","platform":"WebGLPlayer","graphicsApi":"OpenGLES3","graphicsVersion":"OpenGL ES 3.0 (WebGL 2.0 (OpenGL ES 3.0 Chromium))","gpu":"ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)","device":"Chrome 155.0.0.0","os":"MacOS 10.15.7","systemMemoryMb":109,"screenWidth":960,"screenHeight":600,"tier":"Low","tiers":["Low","Mid"],"tierRequest":"","tierRefused":"","tierSource":"WebLowEnd","capKey":"web","cycle":["Low","Mid"],"ultraGate":"none","benchmark":"off","deviceMemoryGb":2.0,"logicalCores":8,"displayHz":60.0,"fpsTarget":30,"targetFrameRate":30,"vSyncCount":0}

ZOEN_SIM {"platform":"WebGLPlayer","abi":1,"loaded":true,"scenario":"walk_eight_directions","finalHash":"bb46012ea5aaaebf","expectedHash":"bb46012ea5aaaebf","match":true,"scenarios":4,"ticks":60,"allMatch":true,"bench":[{"actors":1,"inputsPerTick":1,"medianNsPerTick":70,"samples":11,"ticksPerSample":20000},{"actors":5000,"inputsPerTick":5000,"medianNsPerTick":160000,"samples":11,"ticksPerSample":40}]}

# console errors: 0
web-sim-sim-low.txt · 1 kB · open
# http://localhost:4350/?tier=low (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/155.0.0.0 Safari/537.36)
ZOEN_BOOT {"product":"Zoen","version":"0.1.0","unity":"6000.3.25f1","platform":"WebGLPlayer","graphicsApi":"OpenGLES3","graphicsVersion":"OpenGL ES 3.0 (WebGL 2.0 (OpenGL ES 3.0 Chromium))","gpu":"ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)","device":"Chrome 155.0.0.0","os":"MacOS 10.15.7","systemMemoryMb":109,"screenWidth":960,"screenHeight":600,"tier":"Low","tiers":["Low","Mid"],"tierRequest":"low","tierRefused":"","tierSource":"Launch","capKey":"web","cycle":["Low","Mid"],"ultraGate":"none","benchmark":"off","deviceMemoryGb":16.0,"logicalCores":8,"displayHz":60.0,"fpsTarget":30,"targetFrameRate":30,"vSyncCount":0}

ZOEN_SIM {"platform":"WebGLPlayer","abi":1,"loaded":true,"scenario":"walk_eight_directions","finalHash":"bb46012ea5aaaebf","expectedHash":"bb46012ea5aaaebf","match":true,"scenarios":4,"ticks":60,"allMatch":true,"bench":[{"actors":1,"inputsPerTick":1,"medianNsPerTick":100,"samples":11,"ticksPerSample":20000},{"actors":5000,"inputsPerTick":5000,"medianNsPerTick":214997.5,"samples":11,"ticksPerSample":40}]}

# console errors: 0
web-sim-sim-ultra-refused.txt · 1 kB · open
# http://localhost:4350/?tier=ultra (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/155.0.0.0 Safari/537.36)
ZOEN_BOOT {"product":"Zoen","version":"0.1.0","unity":"6000.3.25f1","platform":"WebGLPlayer","graphicsApi":"OpenGLES3","graphicsVersion":"OpenGL ES 3.0 (WebGL 2.0 (OpenGL ES 3.0 Chromium))","gpu":"ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)","device":"Chrome 155.0.0.0","os":"MacOS 10.15.7","systemMemoryMb":109,"screenWidth":960,"screenHeight":600,"tier":"Mid","tiers":["Low","Mid"],"tierRequest":"ultra","tierRefused":"ultra","tierSource":"PlatformDefault","capKey":"web","cycle":["Low","Mid"],"ultraGate":"none","benchmark":"off","deviceMemoryGb":16.0,"logicalCores":8,"displayHz":60.0,"fpsTarget":30,"targetFrameRate":30,"vSyncCount":0}

ZOEN_SIM {"platform":"WebGLPlayer","abi":1,"loaded":true,"scenario":"walk_eight_directions","finalHash":"bb46012ea5aaaebf","expectedHash":"bb46012ea5aaaebf","match":true,"scenarios":4,"ticks":60,"allMatch":true,"bench":[{"actors":1,"inputsPerTick":1,"medianNsPerTick":100,"samples":11,"ticksPerSample":20000},{"actors":5000,"inputsPerTick":5000,"medianNsPerTick":212500,"samples":11,"ticksPerSample":40}]}

# console errors: 0
plugin-web.json · 3 kB · open
{
  "what": "zoen-sim C ABI static library for the Unity Web player (wasm32-unknown-emscripten, M0-11C)",
  "finished": "2026-10-10T20:20:01.474Z",
  "rustc": "rustc 1.99.0 (b940084d7 2026-09-28); LLVM version: 23.1.1",
  "target": "wasm32-unknown-emscripten",
  "emscripten": {
    "path": "~/Unity/Hub/Editor/6000.3.25f1/PlaybackEngines/WebGLSupport/BuildTools/Emscripten",
    "version": "3.1.39-git",
    "clang": "clang version 17.0.0 (https://github-com-cache.bf.unity3d.com/Unity-Technologies/llvm-project 7c3f21cd3094c188678906d0459cda3b715e1963)",
    "bundledWith": "Unity 6000.3.25f1"
  },
  "rustflags": "-C panic=abort",
  "profile": "plugin (release, lto, codegen-units 1) as staticlib only",
  "route": "stable rustc object files (LLVM 23) link with the bundled wasm-ld (LLVM 17); target_features names the bundled tools do not know are dropped (implied by the listed ones)",
  "droppedFeatureNames": [
    "bulk-memory-opt",
    "call-indirect-overlong"
  ],
  "features": [
    "bulk-memory",
    "exception-handling",
    "multivalue",
    "mutable-globals",
    "nontrapping-fptoint",
    "reference-types",
    "sign-ext"
  ],
  "members": 270,
  "exports": [
    "zoen_sim_abi_version",
    "zoen_sim_create",
    "zoen_sim_destroy",
    "zoen_sim_push_inputs",
    "zoen_sim_read_actors",
    "zoen_sim_read_events",
    "zoen_sim_spawn",
    "zoen_sim_state",
    "zoen_sim_step"
  ],
  "cSmokeLinkFlags": [
…
web-build-size.json · 897 B · open
{
  "task": "M0-11C2",
  "reference": {
    "summary": "logs/test-output/unity/20261008-154205-build-web.json",
    "sizeBytes": 11762776,
    "defines": [
      "ZOEN_GM"
    ]
  },
  "current": {
    "summary": "logs/test-output/unity/20261011-042721-build-web.json",
    "sizeBytes": 11800723,
    "defines": [
      "ZOEN_GM",
      "ZOEN_SIM_STATIC"
    ],
    "files": {
      "Web.data.br": 3899665,
      "Web.framework.js.br": 76419,
      "Web.loader.js": 26983,
      "Web.wasm.br": 7778203
    }
  },
  "deltaBytes": 37947,
  "deltaPercent": 0.32,
  "staticLibBytes": 3662566,
  "note": "Delta of the whole Web build (Brotli files on disk) against the 2026-10-08 build; it also holds every client change since then (SimBootCheck, sky, GM panel). The 3.66 MB archive is not shipped as such: the linker keeps only the reachable zoen-sim code, so the wasm grows by tens of KB, not MB."
}
web-smoke-sim.json · 49 kB · open
{
  "label": "sim",
  "finished": "2026-10-10T20:36:49.966Z",
  "gmSend": null,
  "gmOff": false,
  "simExpect": true,
  "sim": {
    "platform": "WebGLPlayer",
    "abi": 1,
    "loaded": true,
    "scenario": "walk_eight_directions",
    "finalHash": "bb46012ea5aaaebf",
    "expectedHash": "bb46012ea5aaaebf",
    "match": true,
    "scenarios": 4,
    "ticks": 60,
    "allMatch": true,
    "bench": [
      {
        "actors": 1,
        "inputsPerTick": 1,
        "medianNsPerTick": 100,
        "samples": 11,
        "ticksPerSample": 20000
      },
      {
        "actors": 5000,
        "inputsPerTick": 5000,
        "medianNsPerTick": 212500,
        "samples": 11,
        "ticksPerSample": 40
      }
    ]
  },
  "graphicsApi": "OpenGLES3",
  "graphicsVersion": "OpenGL ES 3.0 (WebGL 2.0 (OpenGL ES 3.0 Chromium))",
  "consoleErrors": 0,
  "consoleWarnings": 105,
  "checkFailures": 0,
  "pass": true,
…

Tests

pass build-plugin web (install) · 1.5 s · raw log$ node tools/sim/build-plugin.mjs web --out logs/evidence/M0-11C2/plugin-web.json
fail unity editmode (web plugin import, sim define) · 16.8 s · raw log$ node tools/unity-run.mjs editmode
pass unity setup (Ensure writes the web plugin .meta) · 5.6 s · raw log$ node tools/unity-run.mjs setup
pass unity editmode (web plugin import, sim define) · 8.6 s · raw log$ node tools/unity-run.mjs editmode
pass unity build web (ZOEN_SIM_STATIC) · 266.3 s · raw log$ node tools/unity-run.mjs build web
fail web-smoke --sim (Chrome, golden vectors in the browser) · 54.1 s · raw log$ node tools/unity/web-smoke.mjs --sim --label sim --out logs/evidence/M0-11C2
pass unity build web (ZOEN_SIM_STATIC, longer Web bench samples) · 509.5 s · raw log$ node tools/unity-run.mjs build web
pass web-smoke --sim (Chrome, golden vectors in the browser) · 55.3 s · raw log$ node tools/unity/web-smoke.mjs --sim --label sim --out logs/evidence/M0-11C2
pass data tests · 10.1 s · raw log$ pnpm data:test
pass data tests · 8.3 s · raw log$ pnpm data:test
pass zoen-sim cargo tests + clippy · 12.7 s · raw log$ pnpm sim:test
pass Zoen.Core dotnet build + xunit · 3.4 s · raw log$ pnpm core:test
pass docs lint + index · 0.3 s · raw log$ pnpm docs:lint
pass wiki typecheck · 3.1 s · raw log$ pnpm --filter @zoen/wiki typecheck
pass wiki production build · 15.0 s · raw log$ pnpm wiki:build
pass wiki e2e (changed specs) · 1.2 s · raw log$ pnpm --filter @zoen/wiki exec playwright test --only-changed

Notes

2026-10-10 20:38 UTC · Done. SimPluginImport.cs: WebPlugin Assets/Zoen/Plugins/WebGL/libzoen_sim_ffi.a + ApplyWeb (OnlyPlayer WebGL, editor off; Android and all other players off) in OnPreprocessAsset and Ensure; the first import wrote a default .meta (asset imported before the postprocessor compiled), so unity-run setup (Ensure) wrote the WebGL-only .meta (scene regen churn reverted). Build.cs: PlayerDefines(target, cmd, webSimLibrary) adds ZOEN_SIM_STATIC to WebGL only when the .a exists; ZoenSimNative.cs header updated. EditMode 79/79 (+WebPluginImportsForTheWebPlayerOnly, +OnlyTheWebBuildGetsTheStaticSimDefine: Android/macOS never get the define, the .a is not Android-compatible). Web build defines ZOEN_GM,ZOEN_SIM_STATIC, 11,800,723 B (+37,947 B, +0.32% vs 20261008-154205; includes all client changes since then). First web-smoke --sim failed: 1-mover bench 0 ns/tick (Chrome clamps performance.now ~100 us without cross-origin isolation; 200 ticks too short). Fix: SimBootCheck times 20,000 ticks (1 mover) / 40 ticks (5,000) per sample on UNITY_WEBGL player only. Rebuild + web-smoke --sim pass, 4 cases, headless Chrome 155: finalHash bb46012ea5aaaebf, allMatch 4 scenarios, 0 console errors (105 warnings: Unity AudioContext/persistentDataPath/getInternalformatParameter baseline), median 70-100 ns/tick 1 mover, 160-215 us/tick 5,000 movers (timer-quantized). web-smoke.mjs serves the build itself on :4350 and closed it (port free after). tools/unity/web-smoke.mjs --sim (sim-expect.mjs), UNITY_TOOLKIT.md updated. Evidence logs/evidence/M0-11C2/: plugin-web.json, web-smoke-sim.json, web-sim-sim-<case>.txt, web-sim-default.png, web-sim-low.png, web-build-size.json. Next M0-11D.