Documentation Maintenance
Engine-owned documentation. This page explains how to keep the FOnline engine documentation source-grounded, navigable, and separated from embedding-project content.
Purpose
Use this page when adding, verifying, or reorganizing engine docs. It is the maintainer workflow companion to the machine-readable documentation manifest, documentation backlog, research template, verification report, site publication guide, documentation index, and AI-maintainer entry point.
Source paths inspected
../AGENTS.mdREADME.mdDocs/en/index.mdDocs/ru/index.mdDocs/README.md(legacy route)Docs/_meta/DocumentationBacklog.mdDocs/_meta/DocumentationExpansionPlan.mdDocs/_meta/DocumentationResearchTemplate.mdDocs/_meta/DocumentationVerificationReport.mdDocs/documentation-manifest.jsonDocs/generated/api.jsonDocs/generated/api/*.mdDocs/contract-change-dispositions.jsonDocs/generated/source-inventory.jsonDocs/generated/cli.jsonDocs/en/reference/buildtools/*.mdDocs/ru/reference/buildtools/*.mdDocs/generated/cli/*.md(legacy routes)Docs/generated/helper-cli.jsonDocs/en/reference/helper-cli/*.mdDocs/ru/reference/helper-cli/*.mdDocs/generated/helper-cli/*.md(legacy routes)Docs/generated/cmake.jsonDocs/en/reference/cmake/*.mdDocs/ru/reference/cmake/*.mdDocs/generated/cmake/*.md(legacy routes)Docs/generated/native-extension.jsonDocs/generated/native-extension/*.mdDocs/generated/prototype-format.jsonDocs/generated/prototype-format/*.mdDocs/generated/map-format.jsonDocs/generated/map-format/*.mdDocs/generated/model-format.jsonDocs/generated/model-format/*.mdDocs/generated/text-format.jsonDocs/generated/text-format/*.mdDocs/generated/effect-format.jsonDocs/generated/effect-format/*.mdDocs/generated/image-format.jsonDocs/generated/image-format/*.mdDocs/generated/particle-format.jsonDocs/en/reference/particle-format/*.mdDocs/generated/font-format.jsonDocs/en/reference/font-format/*.mdDocs/generated/audio.jsonDocs/en/reference/audio/*.mdDocs/generated/video.json-
Docs/en/reference/video/*.md BuildTools/AiControlProtocol.jsonBuildTools/ai_control_client.pyBuildTools/docs_ai_control_protocol.pyBuildTools/tests/test_ai_control_protocol.pyBuildTools/tests/test_docs_ai_control_protocol.pyExamples/AiControlSample/Docs/generated/ai-control-protocol.jsonDocs/generated/ai-control-protocol/*.mdDocs/generated/package.jsonDocs/generated/package/*.mdExamples/PublicRepositories.jsonExamples/PublicRepositoryTemplate/BuildTools/docs_examples.pyBuildTools/tests/test_docs_examples.pyDocs/generated/public-examples.jsonDocs/generated/public-examples/*.mdBuildTools/SupportMatrix.jsonBuildTools/docs_support_matrix.pyBuildTools/tests/test_docs_support_matrix.pyDocs/generated/support-matrix.jsonDocs/generated/support-matrix/*.mdBuildTools/DocumentationDiagrams.jsonBuildTools/docs_diagrams.pyBuildTools/tests/test_docs_diagrams.pyDocs/generated/diagrams.jsonDocs/assets/diagrams/*.svgBuildTools/DocumentationScreenshots.jsonBuildTools/docs_screenshots.pyBuildTools/tests/test_docs_screenshots.pyDocs/generated/screenshots.jsonDocs/assets/screenshots/*.pngBuildTools/SnippetPolicy.jsonBuildTools/docs_snippets.pyBuildTools/tests/test_docs_snippets.pyDocs/generated/snippets.jsonDocs/translation-glossary.jsonBuildTools/docs_localization.pyBuildTools/tests/test_docs_localization.pyDocs/generated/translation-status.jsonDocs/description-translations.ru.jsonBuildTools/docs_description_translations.pyBuildTools/tests/test_docs_description_translations.pyDocs/generated/description-translation-status.jsonDocs/ai-evaluation.jsonBuildTools/docs_ai_eval.pyBuildTools/tests/test_docs_ai_eval.pyDocs/generated/ai-evaluation-report.jsonBuildTools/docs_ai_delivery.pyBuildTools/tests/test_docs_ai_delivery.pyBuildTools/docs_site.pyBuildTools/docs_site_artifact.pyBuildTools/tests/test_docs_site.pyBuildTools/tests/test_docs_site_layout.pyBuildTools/tests/test_docs_site_artifact.pyBuildTools/docs-browser/package.jsonBuildTools/docs-browser/package-lock.jsonBuildTools/docs-browser/audit.mjsBuildTools/tests/test_docs_browser.pyBuildTools/web/default-index.htmlBuildTools/web/simple-web-server.py_data/docs-site.jsonassets/docs-search.jsonassets/docs-search.ru.jsonDocs/generated/document-routes.jsonllms.txtllms-full.txtdocs-manifest.jsonBuildTools/docs_api.pyBuildTools/docs_api_diff.pyBuildTools/docs_contract_diff.pyBuildTools/docs_public_api.pyDocs/en/reference/public-contract/index.md, its RU mirror, and thePUBLIC_API.mdlegacy routeBuildTools/ExternalProjectEvidence.jsonBuildTools/docs_external_evidence.pyBuildTools/tests/test_docs_external_evidence.pyBuildTools/gameplay_test_runner.pyBuildTools/tests/test_gameplay_test_runner.pyBuildTools/tests/test_docs_gameplay_testing.pyDocs/generated/external-project-evidence.jsonDocs/generated/external-project-evidence/index.mdBuildTools/docs_reference.pyBuildTools/docs_metadata.pyBuildTools/docs_inventory.pyBuildTools/docs_cli.pyBuildTools/docs_helper_cli.pyBuildTools/docs_native_extension.pyBuildTools/docs_prototype_format.pyBuildTools/docs_map_format.pyBuildTools/docs_model_format.pyBuildTools/docs_text_format.pyBuildTools/docs_effect_format.pyBuildTools/docs_image_format.pyBuildTools/docs_particle_format.pyBuildTools/docs_font_format.pyBuildTools/docs_audio.pyBuildTools/docs_video.pyBuildTools/docs_package.pyBuildTools/docs_validate.pyBuildTools/tests/test_docs_api.pyBuildTools/tests/test_docs_api_diff.pyBuildTools/tests/test_docs_contract_diff.pyBuildTools/tests/test_docs_public_api.pyBuildTools/tests/test_docs_reference.pyBuildTools/tests/test_docs_metadata.pyBuildTools/tests/test_docs_inventory.pyBuildTools/tests/test_docs_cli.pyBuildTools/tests/test_docs_helper_cli.pyBuildTools/tests/test_docs_native_extension.pyBuildTools/tests/test_docs_prototype_format.pyBuildTools/tests/test_docs_map_format.pyBuildTools/tests/test_docs_model_format.pyBuildTools/tests/test_docs_text_format.pyBuildTools/tests/test_docs_effect_format.pyBuildTools/tests/test_docs_image_format.pyBuildTools/tests/test_docs_particle_format.pyBuildTools/tests/test_docs_font_format.pyBuildTools/tests/test_docs_audio.pyBuildTools/tests/test_docs_video.pyBuildTools/tests/validate_native_extension_interface.cmakeBuildTools/tests/test_docs_package.pyBuildTools/tests/validate_package_interface.cmakeBuildTools/tests/test_docs_validate.py.github/workflows/validate.yml_config.yml,Gemfile,.ruby-version, andCNAME- representative source-grounded subsystem docs under
Docs/
Documentation ownership rules
Engine docs should explain reusable engine behavior:
- source layout and architecture;
- application and build-tool entry points;
- runtime/entity/network/persistence/client/server/frontend behavior;
- scripting, generated metadata, nullability, and native method exports;
- bakers, mapper, editor, and reusable tool mechanics;
- platform build/debug flows;
- tests and validation routing.
Embedding-project docs should own:
- concrete game content, balance, quests, text, maps, factions, and release policy;
- game-specific scripts and native extensions;
- exact binary names/presets unless explicitly shown as examples;
- product-specific generated outputs and downstream pipelines.
Engine docs must not depend on embedding-project scripts, tests, tools, CI jobs, or generated artifacts as normative validation for engine behavior. If a reusable validation helper is important enough to cite from an engine doc, keep that helper in the engine repository. If a project-specific helper is useful, cite it from that project’s docs instead.
Engine documentation now lives in Engine/Docs/. Do not maintain parallel engine-owned explanations in an embedding project’s docs; route project docs back to the engine page and keep only project-specific wrappers, commands, and policy there.
Engine Markdown links must resolve inside the engine checkout. Do not use parent-project paths even for non-normative examples: use a stable HTTPS link to a tagged public example repository, or describe the project-owned responsibility in plain prose until such an example exists.
Every maintained Markdown entry is classified in Docs/documentation-manifest.json. The manifest owns its stable ID, audience, Diataxis kind, visibility, translation scope, domain owner, lifecycle state, migration destination, and source paths. The same manifest owns the rolling/current version channel, deferred release-snapshot policy, canonical and planned locales, explicit README locale pairs, and route migration strategy. A documentation change that adds, moves, retires, retargets, or translates a page must update the manifest in the same change.
Owners and review requirements
The manifest also owns one review contract for every domain owner. A documentation change needs the primary owner named by the page or structured contract, the evidence listed for that owner, and every co-review triggered by the affected boundary. localization owns documentation locale parity and native-language review; content-data still owns Engine text-format behavior and authored-data mechanics. Build/release, runtime, scripting, content, frontend, networking, tooling, platform, quality, localization, and documentation review are separate responsibilities even when one maintainer currently fills several roles.
External Project Evidence And Promotion Inventory is the checked internal discovery ledger for Last Frontier and TLA. Its records must name an exact snapshot source, disposition, priority, Engine or project target, primary owner, required reviews, and promotion gate. External projects never become normative merely because a record exists: a promoted claim is re-derived from Engine source/tests, boundary-owned keeps the concrete implementation outside Engine, promotion-candidate names missing reusable artifacts, and project-owned forbids an invented Engine contract. Update and source-verify this ledger when either project’s evidence changes a promotion decision or reveals a new reusable concern; the ledger itself is excluded from the public site and AI delivery.
Standard doc slice workflow
- Pick a coherent slice from the documentation backlog.
- Inspect the source paths named in the backlog and any related tests/build files.
- Write or update the owning doc with
Source paths inspected. - Prefer source relationships and ownership boundaries over long API trivia.
- Add a validation checklist to deep subsystem docs.
- Review the owning structured contract when a generated surface changes. For native API changes, update
///@ ApiContractmetadata as needed and useBuildTools/docs_api_diff.pyfor symbol-level diagnosis. For project-facing CMake changes, updateBuildTools/cmake/ProjectInterface.jsonand run the structural CMake test. For main BuildTools CLI changes, keepcreate_parser()authoritative. For helper-script CLI changes, keep the executablecreate_parser()authoritative, updateBuildTools/HelperCliInterface.jsonwhen ownership/audience/invocation changes, and regenerate the helper reference. For native-extension role/hook/binding changes, updateBuildTools/NativeExtensionInterface.json, run its structural test, and validate the minimal starter or affected project. For prototype parser/property/metadata changes, updateBuildTools/PrototypeFormatInterface.jsonand PrototypeFormat.md, regenerate its model/reference, run the focused test, and rebake an affected project. For map parser/baker/mapper/materialization changes, updateBuildTools/MapFormatInterface.jsonand Map Format, regenerate its model/reference, run focused map tests, and rebake an affected project. For.fo3dparser state/tokens, FBX/OBJ import, model layers, attachments, particles, transforms, materials, cuts, rendering flags, or model limits, updateBuildTools/ModelFormatInterface.jsonand Model Format, regenerate its model/reference, run focused model tests, and validate a visible client scene. For.fotxt, language normalization, prototype$Text, text script methods, or inline color tags, updateBuildTools/TextFormatInterface.jsonand Text and Localization, regenerate its model/reference, run focused text tests, and rebake an affected project. For.fofx, effect state, shader resources,EffectBaker, backend bindings,EffectManager, script values, orFO_EFFECT_*limits, updateBuildTools/EffectFormatInterface.jsonand Effect Format, regenerate its model/reference, run focused effect tests, and validate every affected backend/profile in a visible client scene. ForImageBaker, FOFRM, built-in image loaders, baked sprite records, default factory coverage, atlas upload, or image caches, updateBuildTools/ImageFormatInterface.jsonand Image And Sprite Formats, regenerate its model/reference, run focused image documentation/native tests, and rebake plus visibly inspect an affected project. ForFO_*_PARTICLES,.spark/.efkprojparsing,.spk/.efkbaking, backend composition, SPARK/Effekseer rendering, Mapper particle tools, particle caches, script methods, or model-particle links, updateBuildTools/ParticleFormatInterface.jsonand Particle Format And Runtime, regenerate its model/reference, run focused particle documentation and baker/runtime tests, and rebake plus visibly inspect every affected backend and integration path. For.fofnt/.fnt, raw-copy selection,FontManager, slot/flag enums, bind-time scale, measurement, wrapping, or inline colors, updateBuildTools/FontFormatInterface.jsonand Font Formats And Text Layout, regenerate its model/reference, run focused font documentation and native tests, and rebake plus visibly inspect an affected project. ForAudioManager, WAV/Ogg decoding, sound-name indexing,Game.PlaySound/Game.PlayMusic, audio settings,AppAudio, or AudioBaker delivery, updateBuildTools/AudioInterface.jsonand Audio.md, regenerate its model/reference, run focused audio documentation and native tests, and rebake plus audibly inspect an affected project on every claimed platform. ForVideoClip, Ogg/Theora decoding, fullscreen queue/input/music/drawing,VideoPlayback, script drawing, or raw-copy OGV delivery, updateBuildTools/VideoInterface.jsonand Video.md, regenerate its model/reference, run focused video documentation and native tests, and rebake plus visibly inspect an affected project on every claimed platform. For native GUI render/input primitives or their script exports, update Frontend and Rendering and GUI Integration Boundary, regenerate the script API, run focused native tests, and validate every affected scripting backend and screen visibly in an embedding project; high-level libraries, formats, generators, and their references remain project-owned. For AiControl framing, methods, errors, common command fields, authorization, bounds, lifecycle, threat policy, reference client, or sample behavior, updateBuildTools/AiControlProtocol.jsonand AiControl Protocol, regenerate the AiControl protocol plus helper-CLI references, run both focused AiControl suites, and validate every affected project-native/client/MCP path; project observations, game actions, administrator commands, and MCP namespaces stay project-owned. For model animation tokens, clip durations, aliases, baked duration metadata, or script lookup changes, also update Model Animation, run its focused source test, regenerate the native API/reference when needed, and rebake an affected project. For image-frame offsets, baked sprite offset transport, or client walk/run phase behavior, update Sprite Root Motion, run its focused source test and image-baker tests, and validate the affected locomotion in a visible client scene. For package declarations or payload behavior, updateBuildTools/PackageInterface.jsonand run the structural package test. For the public example portfolio, shared repository files, source scaffold, compatibility boundaries, or publication state, updateExamples/PublicRepositories.jsonand PublicExampleRepositories.md, regenerate its model/reference, and validate affected external repositories in both Engine modes. Regenerate every affected runtime model, compare all seventeen generated contract domains withBuildTools/docs_contract_diff.py, regenerate the root contract index withBuildTools/docs_public_api.py, and complete Contract Change Management dispositions for baseline-public or model-contract breaks. Project-authored remote calls remain project-owned: bake both sides and regenerate/check their catalog withBuildTools/docs_metadata.py. For the current 3D subsystem, treatModelSourceLoader,ModelAnimationConverter,ModelAnimationData,ModelMeshData,ModelManager,ModelInformation,ModelInstance, andModelAnimationas co-owners with the two bakers. A parser, source, compatibility, mesh/rig wire, Ozz runtime, or ownership change updates both model guides and the structured model contract, runs the focused model/Ozz native suites, force-rebakes an affected project, proves the following incremental bake is clean, and validates the affected pose/composition visibly. - Add or update the page entry in
Docs/documentation-manifest.json, keep its stable ID and locale target authoritative, and assign each public current human top-level page to exactly onesite_delivery.navigationgroup. Regenerate source-owned diagrams first withBuildTools/docs_diagrams.pywhenever their manifest, owning prose, or source provenance changes. Recapture any source-owned screenshot whose recorded trigger fired, then regenerateDocs/generated/screenshots.jsonwithBuildTools/docs_screenshots.py; changing only the catalog to preserve an obsolete image is not reconciliation. RegenerateDocs/generated/snippets.jsonnext withBuildTools/docs_snippets.pywhenever any scoped fence or snippet policy changes. Regenerate the canonical EN/RU public contract indexes and root legacy route after their seventeen source models and references. Regenerate translation status after these source assets; every existing Russian page must carry the new normalized English hash or the change fails. Then regenerate_data/docs-site.json, bothassets/docs-search.jsonandassets/docs-search.ru.json, andDocs/generated/document-routes.jsonwithBuildTools/docs_site.py. RegenerateDocs/generated/ai-evaluation-report.jsonwithBuildTools/docs_ai_eval.pywhenever an evaluation owner/evidence heading or English search behavior changes. Finally regeneratellms.txt,llms-full.txt, anddocs-manifest.jsonwithBuildTools/docs_ai_delivery.py. The public manifest hashes all diagram/screenshot/snippet/site/evaluation data; none of these files may be edited manually. - Update the documentation index when a new user-facing page is added.
- Promote backlog status only after semantic source review, not just link checks.
- Add a dated section to the verification report with scope, sources, fixes, and checks.
- Run
python BuildTools/docs_validate.pyand keep staging empty unless the owner explicitly asks to stage/commit.
Moving a public document
Do not treat a file rename as sufficient route migration:
- Keep the stable document ID on the new canonical page.
- Move the canonical content to the manifest-owned English target and add the matching Russian target only when its reviewed translation exists.
- Retain the old Markdown path as a short durable pointer to the canonical page so GitHub and Jekyll both preserve the legacy URL.
- Mark the old record as a replacement/route alias and make the new record the one non-
replaceowner of the target. - Regenerate
Docs/generated/document-routes.json; the old route must appear inlegacy_redirectsand resolve to the expected canonical document ID. - Update navigation/search only for the canonical page. A legacy pointer is not a second searchable owner.
- Require
locale: en/locale: rufront matter on the new pair, verify the stable-ID language switch, and prove that each locale index returns only its own canonical routes. - Run the focused localization, site, AI-delivery, standalone validation, Jekyll artifact, and browser locale-interaction checks before removing any temporary migration state.
The current route remains canonical until this complete change lands. A planned path in the route catalog does not authorize deleting the old file.
Revision update reconciliation
Pulling or changing the engine revision is a documentation event, not only a Git operation. Every incoming commit is a candidate contract change even when it already contains documentation. The maintainer performing the update owns the reconciliation in the same worktree.
Before updating:
- Record the current engine SHA and target branch/ref.
- Preserve a dirty worktree with a named stash or separate worktree, including untracked generated documentation, and retain that safety copy until validation passes.
- Preserve the current generated JSON model under ignored
Workspace/when it is not available from a committed baseline.
Integrate upstream with a normal merge (a fast-forward is fine when possible). Do not rewrite published history: keep each published branch tip as an ancestor of the updated tip, independently for the Engine and any embedding project.
After the normal merge:
git log --oneline <old-engine-sha>..<new-engine-sha>
git diff --name-status <old-engine-sha>..<new-engine-sha>
git diff --stat <old-engine-sha>..<new-engine-sha>
Then reconcile each changed surface:
- Read the incoming source and tests, not only commit subjects or incoming prose.
- Find the owning page through the documentation index and the
sourcesfields in the documentation manifest. - Keep useful incoming documentation, but correct stale paths, project dependencies, unsupported claims, or missing validation evidence immediately.
- Update the owning page and cross-links in the same worktree. An embedding-project workaround or test is not normative engine proof; reusable proof belongs under this repository.
- Record the exact SHA range, contract changes, generated delta, affected docs, and checks in the verification report.
Generated-surface triggers:
| Incoming change | Required reconciliation |
|---|---|
BuildTools/codegen.py, native metadata annotations, Source/Scripting/, or Source/Common/Settings.inc |
Regenerate Docs/generated/api.json and native Markdown pages; use docs_api_diff.py for symbol details and include the model in the aggregate contract diff. |
BuildTools/cmake/ProjectInterface.json or the project-facing CMake option/stage/helper implementation |
Regenerate/check Docs/generated/cmake.json, canonical English pages under Docs/en/reference/cmake/, and legacy route pointers under Docs/generated/cmake/; update the reviewed Russian mirror and its source hash in the same change. Run validate_project_interface.cmake, the focused CMake documentation test, localization checks, and site validation. Add newly public declarations to the manifest rather than documenting implementation-only helpers. For project library roles/linking, update ProjectDependencies.md, its focused test, the minimal fixture, and an affected embedding-project configure/build. |
BuildTools/buildtools.py::create_parser() or command-line help/default/choice behavior |
Regenerate/check Docs/generated/cli.json, canonical English pages under Docs/en/reference/buildtools/, and legacy route pointers under Docs/generated/cli/ with docs_cli.py; update the reviewed Russian mirror and its source hash in the same change. Run the focused CLI documentation test, localization checks, and site validation. |
A helper script’s create_parser() or BuildTools/HelperCliInterface.json |
Regenerate/check Docs/generated/helper-cli.json, canonical English pages under Docs/en/reference/helper-cli/, and legacy route pointers under Docs/generated/helper-cli/ with docs_helper_cli.py; update the reviewed Russian mirror and its source hash in the same change. Run the focused helper CLI test, localization checks, and site validation, and review owner/audience/invocation changes. |
ProtoBaker, ConfigFile prototype syntax, property text loading/serialization, HasProtos metadata, or Baking.ProtoFileExtensions |
Update BuildTools/PrototypeFormatInterface.json and PrototypeFormat.md; regenerate/check the prototype-format model/pages, run test_docs_prototype_format.py and the aggregate diff, then rebake an affected embedding project and update its companion metadata/semantic docs. |
MapLoader, MapBaker, mapper load/save, ItemOwnership, static-map loading, or map content materialization |
Update BuildTools/MapFormatInterface.json and Map Format; regenerate/check the map-format model/pages, run test_docs_map_format.py, affected engine map tests, and the aggregate diff, then rebake an affected embedding project and update project map/content guidance. |
ModelMeshBaker, ModelSourceLoader, ModelAnimationConverter, ModelInfoBaker, .fo3d syntax/state, FBX/OBJ import, model layers/links, particles, transforms, textures/effects, cuts, rendering flags, ModelManager/ModelInformation/ModelInstance/ModelAnimation, or FO_MODEL_* shape limits |
Update BuildTools/ModelFormatInterface.json, Model Format, and Model Animation as applicable; regenerate/check the model-format model/pages, run both focused documentation suites plus the owning native model tests and aggregate diff, then force-rebake an affected project, verify the incremental bake settles, and validate every changed composition/animation in a visible client scene. |
TextPack, TextBaker, ProtoTextBaker, .fotxt, Baking.BakeLanguages, Client.Language, text script methods, or inline @color parsing |
Update BuildTools/TextFormatInterface.json and Text and Localization; regenerate/check the text-format model/pages, run test_docs_text_format.py, focused text-baker tests, and the aggregate diff, then rebake an affected project and validate language switching plus project formatting in a visible client. |
EffectBaker, .fofx sections/state, RenderEffect buffers, renderer descriptor/pipeline handling, EffectManager, effect script methods, or FO_EFFECT_* limits |
Update BuildTools/EffectFormatInterface.json and Effect Format; regenerate/check the effect-format model/pages, run test_docs_effect_format.py, focused effect-baker tests, and the aggregate diff, then rebake an affected project and validate every changed slot/backend/profile in a visible client. |
ImageBaker, FOFRM fields/flattening, built-in image loaders, baked sprite records, DefaultSpriteFactory, SpriteManager extension/cache behavior, or TextureAtlas upload |
Update BuildTools/ImageFormatInterface.json and Image And Sprite Formats; regenerate/check the image-format model/pages, run test_docs_image_format.py, focused image/atlas tests, and the aggregate diff, then rebake an affected project and inspect dimensions, alpha, directions, cadence, hit masks, and relevant client profiles visibly. |
FO_*_PARTICLES, .spark/.efkproj parsing, .spk/.efk baking, backend composition/rendering, Mapper particle tools, ParticleManager, ParticleSpriteFactory, script methods, or model-particle links |
Update BuildTools/ParticleFormatInterface.json and Particle Format And Runtime; regenerate/check the particle-format model/pages, run test_docs_particle_format.py, focused baker/runtime/model tests, and the aggregate diff, then rebake an affected project and inspect every enabled backend plus sprite, map, script, and model-bone routes visibly. |
MapperEngine, stock Mapper menus/windows/controls/hotkeys/history/layout, mapper-side script exports, headless map capture, TGA/atlas readback, or visible-window evidence |
Update Mapper Interactive Manual and Mapper Tools, run test_docs_mapper_tools.py, and exercise the affected interactive or headless path against an Engine-owned fixture. A changed UI, capture path, fixture, or recorded trigger also requires recapturing the exact screenshot, regenerating its provenance, rebuilding Jekyll, and inspecting desktop/mobile output; a changed map format or particle path additionally follows its owning row. |
AnimationViewer, ParticleViewer, their application hosts/libraries/targets/output paths/package roles, Mapper embedding, focused controls, data-source mounting, or persisted settings |
Update Animation and Particle Viewers, run test_docs_viewer_tools.py, build and launch both viewers when shared host/CMake/settings behavior changed (otherwise the affected viewer), and execute the affected visible review workflow against current content. Particle changes also follow the particle-format row; model/animation changes also follow the model-format and model-animation routes. |
.fofnt/.fnt parsing, Baking.RawCopyFileExtensions, FontManager, FontType, FontFlag, TextFormat, Game.BindFont, measurement, wrapping, or inline colors |
Update BuildTools/FontFormatInterface.json and Font Formats And Text Layout; regenerate/check the font-format model/pages, run test_docs_font_format.py, native unit tests, and the aggregate diff, then rebake an affected project and validate measurement plus visible text rendering. |
AudioManager, ResourceManager sound indexing, WAV/Ogg decoding, Game.PlaySound/Game.PlayMusic, Audio.*, AppAudio, or audio baking |
Update BuildTools/AudioInterface.json and Audio.md; regenerate/check the audio model/pages, run test_docs_audio.py, native unit tests, and the aggregate diff, then rebake representative formats and validate effects, music, repeat, volume, and diagnostics audibly in a visible client on every claimed platform. |
VideoClip, Ogg/Theora decoding, Game.PlayVideo, fullscreen queue/input/music/drawing, VideoPlayback, Game.DrawVideoPlayback, or OGV raw-copy delivery |
Update BuildTools/VideoInterface.json and Video.md; regenerate/check the video model/pages, run test_docs_video.py, native unit tests, and the aggregate diff, then rebake representative assets and validate first frame, motion, completion, skip, queue, aspect, audio, cleanup, and any claimed loop visibly on every claimed platform. |
| Native GUI input/render primitives or their script exports | Update Frontend and Rendering plus the generated script API, run focused native tests, then compile/bake affected scripting backends in an embedding project and validate screens, resolutions, languages, input modes, and renderers visibly. Keep high-level GUI libraries, declarative formats, generators, and their references in project documentation. |
BuildTools/PackageInterface.json, DefinePackage, Packages.cmake, package.py, Examples/PackagingMatrix, or package target/platform/pack/payload/config behavior |
Update Packaging and Release and, when qualification changed, the Support Matrix; regenerate/check Docs/generated/package.json and its Markdown pages with docs_package.py; regenerate/check the fixture config after Settings.inc changes; run the focused Python and structural CMake package tests plus every affected *-package-smoke or product package path. Re-audit signing order, secret boundaries, artifact inventory, updater payloads, acceptance, and rollback claims. |
Native build configurations or symbol flags, is_run_in_debugger, break_into_debugger, stack capture/resolution, exception/crash handlers, FO_SELFTEST_CRASH, Natvis/NatJMC, AngelScript.Debugger*, the AngelScript debugger endpoint/protocol, Managed exception/stack reporting, generated C# projects, managed-debugger qualification, or the VS Code adapter |
Update Native, AngelScript, and Managed Debugging and its Russian mirror; refresh exact project evidence when cited files or revisions changed; run test_docs_debugging.py, stack/exception and affected runtime tests, the adapter typecheck/build or live-endpoint gate when applicable, and project static/live launch checks. Keep debugger bind loopback, distinguish symbols from debug semantics, preserve crash-artifact privacy ownership, and never infer a live capability from mock adapter controls or static profiles. |
| Emscripten pin/preparation, Web CMake flags, Web package/shell/server, canvas/clipboard/IDBFS/main-loop behavior, WebSocket selection, Web native-updater capability, support label, hosting/security contract, or project Web evidence | Update Web Build, Packaging, and Browser Debugging, plus Packaging, Security, Support Matrix, Networking, or Client Updater when their boundary changed; run test_docs_web_debugging.py, package/security/support tests, the affected Web build, a fresh bake/package, HTTP artifact/header inspection, and applicable browser/release acceptance rows. Build-only evidence must not be promoted to browser or production-deployment qualification. |
Android platform/ABI mappings, SDK/NDK/API pins, package settings, Gradle/manifest/SDL templates, FOnlineActivity, resource staging, ADB endpoint/install/launch/log behavior, Android native-updater capability, support labels, or project Android evidence |
Update Android Build, Packaging, and Device Debugging, plus Packaging, Security, Support Matrix, or Client Updater when their boundary changed; run test_docs_android_debugging.py, package/security/support tests, the affected Android native build, a fresh bake and Gradle assembly, APK inspection, install/update, cold/warm launch, and applicable device acceptance rows. Build-only evidence must not be promoted to APK, device, release, or store qualification. |
GlobalSettings substitution/precedence/save/draw/log behavior, Common.SecretSettingTokens, ConfigBaker, package signing fields or host directive resolution, the Android Gradle signing template, or workflow credential boundaries |
Update Security and Secrets, Project Configuration, and affected release/platform docs; run test_package_security.py, test_docs_security_and_secrets.py, settings unit tests when native behavior changed, and the affected package lane. Inspect baked configs, generated package trees, logs, archives, caches, and manifests with synthetic values only; re-audit project secret provisioning, rotation, and incident routing without copying credentials into evidence. |
DataBase.*, Server.DbStorage, DataBase.* settings, JSON/SQLite/Mongo/Memory storage, commit drain, recovery oplog, panic/reconnect, persisted startup/shutdown, migration compatibility, or project backup/restore procedure |
Update Persistence, Backup and Recovery, and affected release/upgrade/security docs; run test_docs_backup_recovery.py, database unit tests, and the affected backend/project restore lane. Re-prove the complete durable set, consistency method, oplog behavior, isolated semantic restore, RPO/RTO evidence, and old/new binary compatibility without checking provider credentials or production data into the Engine. |
Examples/PublicRepositories.json, Examples/PublicRepositoryTemplate, Examples/MinimalProject, public example ownership/lifecycle/remote visibility/pins, source-staging exclusions/materialization, common fixed settings required by the minimal config, or a compatibility boundary consumed by examples |
Update Public Example Repositories, regenerate/check the public-example model with docs_examples.py, run its focused tests, rematerialize the affected candidate from a clean remotely fetchable exact Engine commit, and validate each affected source-staged or published repository in pinned and current modes. Keep private remote state separate from source readiness, and do not publish or update external links until its owner-gated exit gate is green. |
BuildTools/buildtools.py validation profiles, required workflow platform matrices, platform detection, application construction, runtime smoke evidence, or uploaded validation artifacts |
Update BuildTools/SupportMatrix.json and the Support Matrix, regenerate/check its model/page with docs_support_matrix.py, run the affected validation target, and keep build, smoke, package-fixture, source-capable, and project-qualified claims separate. |
BuildTools/gameplay_test_runner.py, its manifest schema, Examples/GameplayTestHarness, or an Engine example’s process smoke |
Update Gameplay and Integration Testing, HelperCliInterface.json when CLI syntax/ownership changes, and the affected example manifest; run test_gameplay_test_runner.py, test_docs_gameplay_testing.py, helper-CLI generation/tests, and at least one real baked headless server/client smoke. Keep project script registries, fixtures, content assertions, ports, backends, platform labs, and thresholds in the embedding project. |
Profiling_* configurations, FO_TRACE_ENABLED/FO_TRACE_CATEGORIES/TRACY_* wiring, TracyVersion.hpp, native/script zones, frame marks, plots, log messages, thread names, or allocation tracking |
Update Profiling, run test_docs_profiling.py, build the affected on-demand/total profile, and record one isolated client or server capture as appropriate. A Tracy update also requires matching capture/export tools and one capture on each runtime side before changing protocol/version claims. |
| Canonical English human prose, locale targets, glossary terms, or an existing Russian translation | Update the paired Russian page, retain identical fenced code, refresh only after review, regenerate Docs/generated/translation-status.json with docs_localization.py, then regenerate both locale search indexes and the route/navigation model with docs_site.py. Run focused parity, site, artifact, and browser locale-interaction tests. Complete manifest enforcement rejects every missing or stale page pair. |
Reader-facing prose in any generated contract model, Docs/description-translations.ru.json, or a Russian generated reference |
Keep canonical JSON and stable IDs unchanged, update the stable-locator translation and its exact source hash, regenerate the owning model/pages, then regenerate Docs/generated/description-translation-status.json with docs_description_translations.py. Run its focused test plus the owning generator test. Missing records remain explicit until semantic enforcement becomes complete; unknown, stale, position-based, type-changing, or code-changing records are defects. |
BuildTools/DocumentationDiagrams.json, a diagram-owning document, diagram source provenance, caption/alt text, or shared diagram CSS |
Update the source manifest and owning prose together, regenerate/check Docs/generated/diagrams.json plus Docs/assets/diagrams/*.svg with docs_diagrams.py, run test_docs_diagrams.py, rebuild Jekyll, and inspect the retained desktop/mobile diagram screenshots. Do not edit generated SVG by hand or use a diagram as the only representation of a required procedure. |
BuildTools/DocumentationScreenshots.json, Mapper/SPARK/viewer UI, a capture fixture, screenshot-owning prose, image bytes, capture environment, or listed source provenance |
Rebuild the exact recorded fixture, reproduce the interaction at the recorded viewport/backend, recapture without cosmetic edits, update the source manifest and owning alt/caption together, regenerate/check Docs/generated/screenshots.json, run test_docs_screenshots.py, rebuild Jekyll, and inspect the decoded desktop/mobile page. Never update only a hash to bless an unexplained visual difference. |
A fenced block in public/current/human Markdown or BuildTools/SnippetPolicy.json |
Declare a supported language, update Documentation Snippet Validation when policy changes, regenerate/check Docs/generated/snippets.json, run test_docs_snippets.py plus docs_snippets.py --check --external, and run the semantic compile/bake/smoke owner for every claimed outcome. Untyped/ignored fences are not allowed. |
| Export methods, native test files, or settings declarations | Regenerate/check Docs/generated/source-inventory.json. |
| Any inventoried Markdown, its visibility/state/owner/target/sources, publication URL, versioning policy, locale policy, or canonical generated model path | Update Docs/documentation-manifest.json as needed, regenerate/check snippets first when fenced content/scope changed, site delivery next, AI evaluation after search when affected, then root llms.txt, llms-full.txt, and docs-manifest.json with docs_ai_delivery.py. A context-budget failure requires an explicit manifest/policy review, never truncation. |
Any public Markdown title/path/state/target, README locale pair, site_delivery navigation/routing/search/browser policy, Jekyll include/exclude rule, layout, or site asset |
Regenerate/check _data/docs-site.json, both locale search indexes, and Docs/generated/document-routes.json with docs_site.py; run the focused source/layout/artifact/browser tests, docs_site_artifact.py, and the pinned docs-browser audit against the same completed _site tree. Route collisions, missing rendered pages/endpoints, wrong html lang, broken language pairs, cross-locale search results, browser runtime/resource failures, WCAG violations, keyboard/focus regressions, page overflow, ambiguous replacement owners, or a per-locale search-budget failure require an explicit policy fix, never silent document removal or a lowered gate. |
Docs/ai-evaluation.json, a task-owning stable ID, an answer-evidence heading/term, compact-search tokenization/ranking, or the current source ref |
Update AI Documentation Evaluation, regenerate/check Docs/generated/ai-evaluation-report.json with docs_ai_eval.py after docs_site.py, run its focused test, and record model-family findings separately. Never add irrelevant keywords or lower a threshold merely to make a rank green. |
| Metadata baker or remote-call format/runtime | Update Remote Calls; an embedding project must rebake both sides and regenerate its project-owned remote-call catalog. |
Module init, callback attributes, Yield, server script scheduling/synchronization, mutable-global policy, or entity callback teardown |
Update Script Lifecycle and Concurrency, run test_docs_script_lifecycle.py, and run the narrow source/runtime tests named by the guide. |
.fos module ordering, side macros, namespace/file ownership, CoreScripts formatting, mutable globals, attributed calls, generated-script discipline, or refactoring guidance |
Update AngelScript Style and Refactoring and its Russian mirror, run test_docs_angelscript_style.py, use the owning formatter, compile every affected side warning-free, and execute the narrowest behavior/contract test. Keep game comment language, domain vocabulary, generated formats, migrations, and gameplay acceptance in the embedding project. |
ModelInfoBaker, .fo3d animation tokens, model mesh clip durations, state/action aliases, ModelAnimationInfo.foinfo, metadata registration, or duration script methods |
Update Model Animation, run test_docs_model_animation.py, regenerate/check the native API/reference and aggregate diff when exports changed, run focused model-baker/common-script tests, and rebake an affected embedding project. |
ImageBaker::FrameShot::NextX / NextY, baked sprite offsets, SpriteSheet, movement interpolation consumed by rendering, or CritterHexView walk/run phase and anchor behavior |
Update Sprite Root Motion, run test_docs_sprite_root_motion.py plus focused image-baker tests, rebake affected sprite assets, and validate straight movement, turns, and stop/start in a visible client scene. |
| Build, package, platform, runtime, persistence, networking, or pointer/nullability behavior | Update the owning source-grounded page and run the narrow behavior/test path named there. |
After every generated-surface trigger, run docs_contract_diff.py against the preserved old models or the intended Git base. A zero native API delta does not dispose CMake, main CLI, package, helper CLI, native-extension, prototype-format, map-format, model-format, text-format, effect-format, image-format, particle-format, font-format, audio, video changes.
The update is not complete while a generator reports stale output, incoming behavior has no owning documentation disposition, conflict markers remain, or the safety stash is the only copy of unresolved work. Drop the safety stash only after final checks and an empty staged area are confirmed.
Backlog status meanings
planned— topic is identified but not researched yet.researching— source inspection is in progress.drafted— a first doc exists, but semantic validation is incomplete.verified— the page was checked against current source and post-edit mechanical checks passed.
Do not leave chat-only progress as the source of truth. If a slice is complete or blocked, record it in the backlog/report.
Link and path validation
At minimum, validate:
- manifest coverage, ownership metadata, and declared source paths;
- Markdown links and anchors across every inventoried doc;
- resolved local links remain inside the engine root;
- Backticked source/build/doc paths that should exist in the engine checkout.
- Stale alternate-layout terms known from older snapshots.
- Test inventory coverage when editing Testing.
git diff --check.- staged area and working-tree status.
Run the complete standalone gate from the engine root. Test discovery prevents a newly added test_docs_*.py file from being silently omitted from the local procedure:
python -m unittest discover -s BuildTools/tests -p "test_docs_*.py"
python BuildTools/tests/test_gameplay_test_runner.py
python BuildTools/tests/test_minimal_multiplayer_package.py
python BuildTools/tests/test_ai_control_protocol.py
python BuildTools/tests/test_package_security.py
python BuildTools/tests/test_angelscript_cmake.py
cmake -P BuildTools/tests/validate_project_interface.cmake
cmake -P BuildTools/tests/validate_package_interface.cmake
cmake -P BuildTools/tests/validate_native_extension_interface.cmake
python BuildTools/docs_snippets.py --check --external
python BuildTools/docs_validate.py
The Validate documentation and Parse documentation snippets jobs in .github/workflows/validate.yml are the authoritative CI expansion: they run each focused test and generator check explicitly, then classify contract changes against the base revision. Keep those jobs and this aggregate local route behaviorally equivalent. They do not require an embedding project or native build.
Changes that affect rendered output must also follow the site publication guide. Run bundle exec jekyll build --trace, python BuildTools/docs_site_artifact.py --site-dir _site, and the pinned browser audit when the Ruby/Bundler/Node environment is available; every pull request also receives a GitHub Pages-compatible _site artifact plus static and browser validation reports from the Build documentation site job.
Planned future docs should be written as plain prose unless the checker intentionally exempts them; do not backtick/link missing docs as if they already exist.
Source-grounded writing conventions
- Start with purpose and reader routing.
- Include
Source paths inspectedfor subsystem pages. - Route to sibling docs instead of duplicating deep details.
- Use exact file paths for source ownership.
- Use tagged public example URLs for cross-project evidence; never make a local embedding-project checkout part of an engine procedure.
- Avoid promising unsupported workflows; say what the current source/test/build wiring supports.
- Update related docs when a change moves ownership between pages.
AI maintainer notes
AGENTS.md is the AI-maintainer entry point. It routes AI agents to human docs and records repository conventions such as not committing/pushing without explicit instruction. Keep it concise and navigational; put detailed human-readable procedures in Docs/. Root llms.txt, llms-full.txt, and docs-manifest.json are generated retrieval routes for external agents; _data/docs-site.json, both locale search indexes, and Docs/generated/document-routes.json are the matching human navigation/search/routing projection. All seven must stay derived from the same manifest/corpus.
If a future AI agent continues this roadmap, it should re-anchor from git status, the backlog, and the verification report before editing. Context from chat is secondary to the repository state.
Validation checklist
- New docs are classified in
Docs/documentation-manifest.jsonand linked from the documentation index and, if relevant, AGENTS.md. - Backlog status matches actual source validation state.
- Verification report records every promoted slice.
- API changes have a base-revision report and every required public disposition passes Contract Change Management.
- AI delivery and human site delivery are regenerated and their focused tests/checks pass.
python BuildTools/tests/test_docs_validate.pyandpython BuildTools/docs_validate.pypass.- Link/path/test/stale-term checks pass after report updates.
git diff --cached --name-onlyis empty unless staging was explicitly requested.- Final report names changed files and confirms no commit/push happened unless requested.