mirror of
https://github.com/Heretek-AI/game-engine.git
synced 2026-11-07 10:55:58 -10:00
2.0 KiB
2.0 KiB
AGENTS.md — game-engine
Invariants
- Native owns all frame state (
native/). Managed (managed/) holds no gameplay state; zero-copy only viaEcsChunkView*+[UnmanagedCallersOnly]+SuppressGCTransition. - Every change to
native/bridge/engine_abi.hmust regeneratemanaged/Engine.Bindings/NativeApi.g.csviatools/abi_codegenand run layout assertions. - No
malloc/newon frame path:LinearFrameAllocator(reset/frame) +PageArenaAllocator(virtual memory). Flecs columnsalignas(64). IComponentstructs are blittable only (nostring/class/interface/arrays/LINQ/closures in hot path). Analyzers ENG0001–ENG0003 enforce.- Hot-reload is stateless: component data stays in Flecs;
GameScripts.dllloads from memory stream via collectible ALC; schema evolution migrates tables.
Workflow (Hermes orchestration)
- Board:
game-engine. One task per issueM1-01…M5-04. Worker claims atomically, works inhermes -wworktree, opens PR,qa-gatereviews. - Profiles:
chief-architect(routes + gates),cpp-ecs-core,dotnet-roslyn-bridge,vulkan-renderer,editor-cli-ux,qa-gate(adversarial verify, must pass CMake +dotnet test+ Lavapipe headless before merge). - Memory: record ABI breaks, Flecs/Jolt gotchas, failed-build postmortems. Prefer
flecs-jolt-patterns,zero-copy-abi-guard,roslyn-incremental-genskills.
Verification gates (definition of done per milestone)
- M1: Benchmark1M <1.5ms,
GC.GetAllocatedBytesForCurrentThread()==0. - M2: edit-save → 100k entities change behavior <100ms, no state loss, exceptions fault-isolate.
- M3:
vulkaninfo+ Lavapipe headless pass; 250k draws viavkCmdDrawIndexedIndirectCount, <0.5ms CPU render thread. - M4: 30k bodies locked 60 FPS,
Physics.RaycastBatchparallel, collision ring-buffer →ReadOnlySpan<CollisionEvent>. - M5: drop
.glb/.png→ visible <16ms/1 frame;engine-cli scene tree|entity set|snapshot capture|profile --frames 60;.pak+dotnet publish -r <rid> /p:PublishAot=true, cold boot <1.0s.