Index of everything under docs/. Most subsystem code comments link here by path,
so keep references in sync when moving a file (git grep "docs/<name>" before a rename).
Adding a doc? Add it here too. This index drifted to 5-of-46 on agent-rules/ once already;
an unlisted doc is an unread doc.
Two genres: postmortems (one real failure each) and the notes-*.md reference guides
(accumulated per-subsystem gotchas). Two indexes, deliberately:
- agent-rules/README.md Part A — indexed by subsystem, one sentence each. Use this when you know what you're touching.
- agent-rules/README.md Part B — the same set indexed by failure mode (green-but-wrong, one-contract-several-mirrors, silent drop, your-instrument-is-lying, ordering/lifetime, never-actually-called). Use this when you know what you're doing but not what can go wrong.
Read the relevant file before non-trivial work; don't duplicate its content into CLAUDE.md.
- testing.md — the canonical testing opinion doc: why we test what we test, the renderer L1–L11 pyramid + Functional axis, value heuristic, anti-patterns, classification. The hub the test suite, CI, and
agent-rules/testing-architecture.mdall point at. test-catalogue.{renderer,functional,unit}.md— generated & git-ignored per-file catalogues, rendered fromtest_catalogue.json+ in-file// OLO_TEST_LAYERtags byOloEngine/tests/scripts/generate_test_catalogue.py. Not tracked; regenerate on demand.
- guides/ai-goap.md — GOAP planner / AI action system.
- guides/ai-perception.md — AI perception (sight/sound/awareness).
- guides/cinematic-sequencer.md — cinematic sequencer / timeline.
- guides/gltf-material-extensions.md — what the glTF transmission / IOR / volume extensions import and render, and where that stops.
- guides/skin-material-profiles.md — what a
.oloskinprofile holds, in which units and colour space, how a skin material names one, and how to look at the four outputs a skin surface exposes. - guides/foliage-leaf-material.md — the vegetation material: which fields a foliage layer's leaf material has, why its transmission is split into a shadowed direct half and an environment half, what the distant impostor keeps and what it loses, and how to look at the transmission term on its own.
- guides/skin-transmission.md — the thin-region transmission term: the unit chain from an authored thickness in metres to an optical depth, the three-premise argument for why it cannot double-count the diffusion beside it, and the four ways it silently does nothing.
- guides/skin-diffusion.md — how the screen-space skin scattering works, which diffusion profile it uses and the reference comparison that chose it, what its radius is in world units, and exactly where it stops.
- guides/skin-layered-specular.md — the two-lobe skin specular, the pore/normal filtering that stops it sparkling, and the expression-driven detail band: which five fields an author sets, the measured comparison that chose the model, why the variance is read from screen space and not from the normal map, and why the detail follows the APPLIED morph weights.
- guides/skin-oral-surfaces.md — lips, gums, tongue and teeth: the wet coat that TAKES energy from the tissue rather than adding to it, the cavity weight that stops a closed mouth glowing under a back light, why teeth are a matter of authoring rather than a second code path, and the two limits (no coat under IBL, no oral anatomy in this repo).
- guides/eye-cornea-iris.md — the eye: the corneal refraction that moves the iris you see, the left/right convention that needs no mirrored asset, why the index is the aqueous humour's and not the cornea's, why the tear line is #1245's wet coat rather than a second code path, and why a front-on screenshot cannot tell you whether any of it works.
- guides/skin-digital-human.md — running skin, eyes and mouth on ONE subject: a complete face spends the whole seven-slot skin-profile budget and an eighth profile silently renders as not-skin, the material debug views are deferred-only, how to switch the three lighting rigs without changing two things at once, and why the decomposition is checked by cross-talk rather than by a sum.
- guides/input-action-maps.md — input action maps & contexts.
- guides/localization.md — localization &
LocalizedTextComponent. - guides/mcp-diagnostics-server.md — the read-only MCP diagnostics server (tools, resources, prompts, attach flow).
- guides/oloctl.md —
oloctl, the CLI frontend generated from the automation registry (spelling rules, arguments, exit codes, the closed write path). - guides/perf-stress-scenes.md — perf stress-scene generator + measurement runbook.
- guides/player-camera-rigs.md — reusable player + camera rigs (first-person / third-person follow spring arm).
- guides/procedural-terrain.md — procedural terrain generation.
- guides/ui-system.md — runtime UI system.
- guides/video-playback.md — video playback component.
- design/water-ocean.md — design record for the shipped water/FFT-ocean system. Cited by ~57 code comments via bare
water-ocean.md §X.Y— keep this basename AND the section numbering stable; add new sections at the end. Open work lives in issues #1033-#1035, not here. - design/animation-retargeting.md — animation retargeting (humanoid bone roles, rebasing).
- design/locomotion.md — character locomotion (issue #631).
- design/soundgraph-metasounds.md — SoundGraph / MetaSounds-style audio graph refactor.
- design/restir-gi-reconnection-shift.md — ReSTIR GI (#1169): the measure convention, the reconnection shift and its Jacobian, the DDGI hand-off, and why the DI chain is not renameable. Cited from source as
restir-gi-reconnection-shift.md §X— keep the section numbering stable.
Roadmap docs describe intended/future work — verify "doneness" against the code, not these files.
- process/issue-scoring.md — the rubric for rating issues/tasks (WSJF-derived, engine-tuned: Capability/Craft/Stability/Decay over Effort, plus Learning/Fun). Drives
/start-worktask picking; raw axes live in anolo-scoreblock in each issue body, ranked on demand byscripts/issue_scores.py(nothing derived is stored). - process/task-loop.md — the worker-session contract: what a session started from
HANDOVER.mddoes, from implementing through self-review, PR, CI and CodeRabbit, to a green thread-clean PR. Absorbed the former/finish-prand/pr-statuscommands. Stops short of merging.
The three workflow slash commands live in .claude/commands/ and are versioned with the repo because they reference repo content: /start-work (pick + scaffold), /cleanup-worktree (reclaim merged worktrees, heal the registry), /resume-worktrees (reopen windows).
- analysis/dead-code.md — dead-code analysis (LOC reduction).
- analysis/perf-stress-findings-2026-07.md — perf stress-scene battery findings (2026-07-03).
- analysis/sonarqube-rules.md — SonarCloud rule tuning suggestions & high-volume-rule decisions.
- analysis/ue5.8-hzb-occlusion-analysis.md — UE 5.8 HZB occlusion culling, source-level analysis.
- ops/build.md — full Windows / Linux / WSL build matrix.
- ops/deployment.md — OloServer deployment / packaging.
- ops/self-hosted-gpu-runner.md — the self-hosted AMD GPU CI runner.
- ops/self-hosted-host-hygiene.md — the box behind the runners: the update timer must not reboot under a job, the GPU resets during the suite, one host is shared.
- ops/self-hosted-linux-toolchain.md — both Linux arms take clang-23 and LLD 23 from the same LLVM release tarball at
/opt/llvm-23.1.0(the box keeps its own ICU 70 beside it); on the box a missing pin or sanitizer runtime warns and falls back, never installs.
- adr/0001-functional-tests-as-separate-axis.md — Functional tests live on a separate axis from the renderer testing pyramid.
- adr/0002-headless-tick-default-for-functional-tests.md — headless
Scene::OnUpdateRuntimeis the default tick model for Functional tests. - adr/0003-functional-tests-mount-editor-asset-root.md — Functional fixtures mount an isolated copy of the editor asset root.
- adr/0004-lock-free-allocator-singleton-init.md — lock-free link allocator uses a never-destructed magic static.
- adr/0005-mcp-script-tools-lua-sandbox.md — script-defined MCP tools run in a capability-stripped
sol::state, not engine bindings. - adr/0006-progression-databases-as-assetmanager-assets.md — progression data ships as AssetManager asset types, not static registries.
- adr/0007-ddgi-hit-point-cache-gather.md — DDGI gathers rays from a relit static hit-point cache, not per-frame cube rasterization.
- adr/0008-no-mcp-endpoint-in-cooked-builds.md — no MCP endpoint in cooked builds; deferred behind seven preconditions.
- adr/0009-scripting-bindings-from-reflection-emitted-schema.md — scripting bindings come from a reflection-emitted, language-neutral schema.
- adr/0010-vulkan-rhi-heap-bindless-only.md — add a Vulkan backend alongside GL 4.6: heap-bindless only, no legacy descriptor-set path.
- adr/0011-rhi-neutral-resource-and-binding-model.md — API-neutral RHI resource/binding model: identity vs binding address vs native handle. The decisions plus an index of all 88 amendments (what each decided, whether it still binds); the amendment bodies are in adr/0011-amendments.md.
- adr/0012-adopt-the-ue-container-library-for-engine-owned-data.md — adopt the UE container library for engine-owned data; close the half-adopted state by growing usage.
- adr/0013-destructible-debris-asset-swap-not-runtime-fracture.md — destructible objects swap in pre-authored debris assets; no runtime mesh fracture.
- adr/0017-windows-ci-critical-path-measure-before-a-self-hosted-runner.md — the Windows CI critical path is measured on a writable cache before any self-hosted Windows runner is built, and never on the interactive workstation.
- adr/0018-gaussian-splats-gpu-ordering-and-merge-lod.md — Gaussian splats order per view on the GPU and coarsen by merging; a CPU sort and a selection budget are both dead ends.
- adr/0019-windows-ci-self-hosted-routing-lands-switched-off.md — the Windows jobs can be routed to a self-hosted runner behind a
vars.kill switch and a fork guard; the switch stays off until a runner exists and both paths are measured. - adr/0020-reflection-tier-selection-contract.md — the four reflection sources are competing estimates of one quantity; they composite bottom-up by confidence with the bottom tier pinned at 1, so the weights sum to exactly one and a double-count is impossible by construction.
- adr/0021-structural-connectivity-is-derived-from-collider-adjacency.md — a destructible structure's support graph is derived from collider adjacency, not authored per piece; the component carries only anchor/timing policy; same-course neighbours support each other so a lintel can cantilever, but the flood charges for each sideways step, because free lateral transfer makes a wall all-or-nothing.
- adr/0022-reference-tracer-owns-its-sampling-model.md — the reference path tracer's scene description may be as rich as a bake needs, but its sampling model is its own (level 0, never the raster's mip chain) and is pinned by tests that do not involve the raster path; parity fixtures stay in the subset both worlds express, so they keep pinning what they always pinned.
- adr/0023-virtual-geometry-is-ray-traced-through-a-fixed-proxy.md — a cluster LOD DAG cannot be a BLAS (the cut is per view, per frame), so each virtual-mesh part is ray-traced through one FIXED proxy built from the DAG's coarsest cut: watertight and view-independent by construction, classified Static, built once. Whatever still gets no proxy stays counted in
GPUSceneUnsupportedCategory::Virtualized, now per part. - adr/0024-material-kind-is-not-the-closure-version.md — a material carries three independent selectors (what the surface IS, which version of the closure evaluates it, and which version of the skin transport its profile was authored against); none is derived from another, and the G-Buffer headroom that separation costs.
- bug-investigations/fog-ubo-binding-knockout-investigation.md — flaky
FogVisualEvidenceTest(#446): a persistent UBO bound only in its ctor gets its slot knocked to 0 by cross-test buffer churn; re-bind on upload. - bug-investigations/nanite-foliage-white-fringe-investigation.md — Nanite (#629): Sponza foliage white-fringe investigation.
- bug-investigations/rendergraph-ghosting-investigation.md — render-graph ghosting investigation.