DocsProject

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 SceneComponents, 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.
View as MarkdownSource: docs/STATUS.md