> Cinder 0.1.0 documentation: Status
> Canonical page: https://cinder.ash10.dev/docs/status/ · Source: `docs/STATUS.md` in the engine repository (engine commit 47c9352, imported 2026-11-09)
> Index of every page for agents: https://cinder.ash10.dev/llms.txt

# Status

Last updated: 2026-11-09. One row per phase; "verified" means executed in this repository under the pinned
toolchain, with the command named. Nothing here is claimed from memory.

| Phase | State | Verified | Open risks |
|---|---|---|---|
| 0 Reconnaissance | **Done on Linux**; macOS gate not runnable on this host | `pixi run mojo --version` = 1.2.0; `spikes/hello` runs and its TestSuite passes (2/2); all 14 third-party submodules checked out at the pinned refs via `tools/vendor_submodules.sh` | No macOS runner available (see Blockers). mojo-bindgen's generator pins a nightly (ADR-0005). |
| 1 Risk spikes | 9 of 9 pass on Linux (last full run recorded in REPORT.md); macOS not run | `tools/run_tests.sh` and `spikes/window/run_window_spike.sh` in the toolchain container. 1: SDL3 window + wgpu surface + triangle + resize, pixel-verified on X11 (Xvfb) and Wayland (Weston headless). 2: compute round trip with every callback through the shim queue. 3: 96-byte struct by value both ways. 4: Mojo `abi("C")` callback from the calling thread and a native thread. 5: Jolt world, queued contact and activation events, sleep, bit-identical rerun. 6: headless miniaudio engine, sine spatialised left/right/centre. 7: cgltf skinned fixture parsed, malformed input rejected. 8: dcimgui window drawn through the WebGPU backend, pixel-verified on both display servers. 9: layout test, 528 records and every enum/flag constant identical between the C compiler and Mojo. Native shim CTest green under ASan+UBSan. | wgpu-native 29 lacks `wgpuInstanceWaitAny` (ADR-0003 amendment). Mojo compiler OOM on large comptime array literals (`bugs/comptime_array_literal_oom`, worked around). macOS gate for every spike still open. |
| 2 Foundations | Core done on Linux: math, log, assertions, arena, pool/handles, ring, time, fs, job system; CI workflow written but not yet run on GitHub | `tests/core/test_math.mojo` (12), `test_core.mojo` (12), `test_jobs.mojo` (5, also against the ASan shim) all pass; `pixi run format-check`, `lint` clean | Containers beyond these (sparse sets, bitsets) arrive with the ECS. Benchmarks (`bench/`) not started. |
| 3 Platform + gfx | Done on Linux (X11 and Wayland); macOS not run | `cinder/platform`: SDL3 init, windows, event translation (keyboard, mouse, wheel, window, gamepad), surfaces; `cinder/gfx`: `Gfx` (instance/adapter/device/queue, diagnostics, error counting, device-lost flag), `Resources` (pooled generational handles for every wgpu object, leak accounting), `ShaderManager` (WGSL compile with `path:line:col` errors via validation scopes, hot reload with last-good fallback), typed pipeline layer (bind group layouts, bind groups, pipeline layouts, vertex layouts, render and compute pipelines), command layer (encoders, render/compute passes, copies, submit, readback), `Swapchain` (configure, acquire with outdated/lost recovery, minimise skipping, resize, present), `DebugDraw` (lines, boxes, spheres, axes, grids; bounded buffer growth). Tests: `tests/gfx/test_device` (1), `test_resources` (2), `test_shaders` (2), `test_render` (1, offscreen triangle + compute, pixel readback), `test_debug_draw` (2, pixel positions), `tests/platform/test_platform` (2) and `test_swapchain` (1) on X11 and Wayland. ADR-0009. | wgpu-native aborts the process on `wgpuQueueSubmit` validation errors (documented in MOJO_NOTES); text debug draw arrives with the ImGui tools layer (Phase 7). |
| 4 Renderer | Core done on Linux; macOS not run | `cinder/render`: camera + SIMD frustum culling, meshes with meshoptimizer LODs and morph buffers, glTF materials (KHR_texture_transform, emissive_strength), textures with mips, frame graph (ordering, culling, aliasing, external resources, DOT dump), WGSL `#include` assembly with file:line error mapping and hot reload, forward+ clustered lights (16x9x24 compute), 4 cascaded shadow maps with texel snapping and PCF, spot/point shadow atlas, GPU-baked IBL (prefiltered specular, irradiance, BRDF LUT), GTAO (single and MSAA depth), physically based bloom, AgX/ACES, exposure, 4x MSAA, FXAA, GPU skinning and morph targets, instancing, debug views (normals, cascades, clusters, overdraw, LOD, albedo, AO, wireframe). `cinder/assets/gltf.mojo` imports .gltf/.glb (files, data URIs, GLB buffers). Tests: `tests/render/*` (15), `tests/assets/test_gltf_loader` (3), `tests/golden/test_golden_gltf` (16 Khronos models, SSIM + pixel thresholds, references reviewed in `docs/RENDER_VALIDATION.md`). ADR-0010. | Golden references exist for Linux/lavapipe only (no Metal machine). GPU culling/indirect draws deferred to Phase 8; debug text waits for ImGui (Phase 7); device-loss recovery test still to add. |
| 5 Assets, ECS, scene | Done on Linux; macOS not run | `cinder/ecs`: archetype World (type-erased tight columns, 16-byte aligned), typed queries with with/without filters, change ticks, CommandBuffer, Parent/Local/World transforms with propagation, access-declared Schedule running stages in parallel on the job system; benchmarked at parity with flecs (ADR-0011). `cinder/scene`: text (diffable, exact floats) and binary formats with migrations; ECS -> RenderScene bridge. `cinder/assets`: glTF animations parsed, cooked mesh/material/clip formats, incremental content-hash cooker + `cinder-cook` CLI, AssetServer (async loads on jobs, refcounts, hot reload, materials resolving their textures), KTX2 cook/load through libktx (ETC1S/UASTC, BC7 transcode when supported). Tests: ecs (5), scene format (5), render sync (1), cook (4), textures (2), fuzz (3), asset server (1); `pixi run bench-ecs`. | GPU-side scene streaming and a scene editor wait for Phase 7 tools; cooked formats are v1 (migrations exist for scenes, cooked assets re-cook on format change). |
| 6 Physics, anim, audio, input | Done on Linux; macOS not run | `cinder/physics`: Jolt world (layers as bits, shapes incl. mesh/convex/scaled, static/kinematic/dynamic bodies, sensors, continuous motion, mass override), queued contact/activation events, closest-hit ray and shape casts with layer masks and body ignore (C collectors in the shim), `CharacterController` over CharacterVirtual (steps, slopes, jumps, pushing, moving platforms), ECS sync with interpolation, bit-identical replay of a recorded input stream (72 bodies). `cinder/anim`: skeletons from glTF skins + cooked `.cskel`, step/linear/cubic sampling, phase-synced 1D/2D blend trees, crossfades, events, root motion, one-job-per-animator system publishing `JointPalette` to the render bridge. `cinder/audio`: miniaudio buses, decoded/streamed sounds, one-shots released on their end event, 3D attenuation, ECS sources and a camera-following listener, headless engine for tests. `cinder/input`: action/axis map over keyboard, mouse, gamepad; listening rebinds; exact text save/load. Tests: physics (5), anim (4), audio (2), input (3), all also under ASan+UBSan. ADR-0012. | Jolt runs on its own 2-thread pool (ADR-0012); no device-backed audio test (headless only) until a machine with an audio device runs the suite; SIMD animation blending is per-transform SIMD (Vec3/Quat lanes), not batched across bones. |
| 7 Tools, profiling | Done on Linux; macOS not run | `cinder/app`: `App` runtime (subsystem ownership in `Boxed` cells, fixed-step `Game` loop, windowed with swapchain or `--headless` with offscreen readback, `parse_app_args`). `cinder/tools`: ImGui debug overlay (frame-time graph and render stats, entity inspector editing numeric fields through the scene registry, asset browser, render graph DOT view, log console). Tracy client with manual lifetime (`cinder/core/profile.mojo`, `native/src/profile.c`), zones in the app loop, renderer and asset server. Tests: `tests/core/test_profile` (1), `tests/app/test_app_headless` (2), `tests/tools/test_debug_ui` (1, X11 and Wayland). ADR-0013. | Built-in components are not yet `SceneComponent`s, so the inspector shows game-registered types only; Tracy capture verified only as a running client (no server attached in CI). |
| 8 Sample game, perf | Done on Linux; budgets unmeasured on reference hardware | `sample/`: third-person game over `App` (KayKit character on the character controller with idle/walk/run blend and jump, procedural arena and Sponza levels with mesh colliders, 32+ orbiting lights with shadows and IBL, 500+ crates, collectables, win and restart, 3D effects and music on buses, pause menu with settings saved to disk, text save/load, autopilot). `bench/stress` and `bench/sample_bench` write JSON; `tools/bench_check.py` fails on >10% regression against `bench/baselines/`. `tests/perf/test_zero_alloc` asserts zero Mojo allocations over 60 steady frames through an LD_PRELOADed allocation counter. Tests: gltf spawn (1), sample playthrough + save/load (2), zero alloc (1). ADR-0014. | Reference hardware (RTX 3060 Linux, Apple M2) is not available on this host; container GPU is lavapipe, so the section 8 budgets are recorded, not met (REPORT.md section 4). Sponza cold start is above 2 s here because the sample loads source glTF textures, not cooked KTX2. |
| 9 Docs, release | In progress on Linux | README quick start, sample and benchmark sections; `docs/TUTORIAL.md` built on `examples/first_game` (compiled and run headless by `tests/examples/test_first_game.mojo`); a guide per subsystem in `docs/guides/` (13); API reference generated from docstrings into `docs/api/` by `tools/gen_api_docs.py`, with `pixi run api-docs-check` failing the test task when a public symbol lacks a docstring (0 missing); `docs/BENCHMARKS.md`; `CHANGELOG.md`; `tools/check_doc_names.py` checks that names quoted in docs exist. | Defects found while documenting are being fixed before the v0.1.0 tag (REPORT.md section 5). README quick start not yet re-verified in a fresh container. |

## Blockers escalated to the operator

See `REPORT.md` → Blockers. Summary:

1. **No macOS/Metal machine or CI runner.** Every phase gate requires both platforms. Linux work proceeds;
   macOS verification is pending a runner (GitHub Actions `macos-14` or a local Apple Silicon machine).
2. **No reference GPU hardware.** Section 8 budgets cannot be measured on lavapipe. Benchmarks are built
   and run for correctness and regression tracking; budget compliance is unreported until hardware exists.

## Decisions log

- 2026-11-08 ADR-0001..0007 accepted (0005 proposed, decided by spike 9).
- 2026-11-08 ADR-0011 accepted: Mojo ECS kept after the flecs benchmark (ratios 0.91 / 1.00 / 0.98).
- 2026-11-09 ADR-0014 accepted: sample game as a `Game` over scene components, JSON benchmarks with adapter-scoped baselines, zero-allocation frame enforced by an interposed counter.
- 2026-11-09 ADR-0013 accepted: App runtime, headless mode, Tracy manual lifetime, data-driven ImGui overlay.
- 2026-11-09 ADR-0012 accepted: Phase 6 subsystem designs (Jolt thread pool, phase-synced blend trees, miniaudio buses, text input maps).
- 2026-11-08 Operator asked about forking stargine; declined, ADR-0006.
- 2026-11-08 ADR-0005 decided: own generator (mojo-bindgen output does not parse under 1.2.0).
- 2026-11-08 ADR-0011 accepted: keep the Mojo ECS (within the 10% band of flecs: ratios 0.91, 1.00, 0.98).
- 2026-11-08 ADR-0010 accepted: renderer architecture (forward+, frame graph, shader assembly, IBL bake, post chain).
- 2026-11-08 ADR-0009 accepted: gfx layer shape (pooled handles, error-scope shader diagnostics, typed pipeline layer).
- 2026-11-08 ADR-0003 amended: awaiting is a pump loop because wgpu-native 29.0.1.1 does not implement
  `wgpuInstanceWaitAny`; spike 4 shows Mojo C callbacks work from native threads, pull model kept.
