Compare commits

...

93 Commits

Author SHA1 Message Date
sindoring c34e538dcf docs(M03): accept M2 placement transform resolver 2026-07-16 23:54:41 +04:00
sindoring 396be5e69d merge M03 M2 placement transform resolver 2026-07-16 23:52:34 +04:00
sindoring 1792938567 docs(M03): hand off M2 placement transform package 2026-07-16 23:52:20 +04:00
sindoring 0a09d7bc1e refactor(M03): extract M2 placement transform resolver 2026-07-16 23:51:59 +04:00
sindoring 91f0ba8433 coord(M03): claim M2 placement transform resolver 2026-07-16 23:38:29 +04:00
sindoring 1b6c46870d docs(M03): accept M2 unique placement registry 2026-07-16 10:02:14 +04:00
sindoring 2342430439 merge M03 M2 unique placement registry 2026-07-16 10:01:34 +04:00
sindoring c41e8886a6 docs(coordination): hand off M2 unique registry 2026-07-16 10:01:23 +04:00
sindoring acb3a809bb refactor(M03): extract M2 unique placement registry 2026-07-16 10:01:09 +04:00
sindoring c13c993645 coord(M03): claim M2 unique placement registry 2026-07-16 09:54:44 +04:00
sindoring 57ae1b8f16 docs(M03): accept terrain chunk queue planner 2026-07-16 09:52:59 +04:00
sindoring 24aef13801 merge M03 terrain chunk queue planner 2026-07-16 09:52:22 +04:00
sindoring 4b90dbc1c1 docs(coordination): hand off terrain chunk queue planner 2026-07-16 09:52:18 +04:00
sindoring f800e11cd2 refactor(M03): extract terrain chunk queue planner 2026-07-16 09:52:01 +04:00
sindoring 0d2c820ea7 coord(M03): claim terrain chunk queue planner 2026-07-16 09:47:11 +04:00
sindoring b568768866 docs(M03): accept terrain chunk LOD planner 2026-07-16 09:45:09 +04:00
sindoring f36fabb8e1 merge M03 terrain chunk LOD planner 2026-07-16 09:44:31 +04:00
sindoring 9e69a8a95b docs(coordination): hand off terrain LOD planner 2026-07-16 09:44:27 +04:00
sindoring eb94cfc646 refactor(M03): extract terrain chunk LOD planner 2026-07-16 09:44:11 +04:00
sindoring aa21aafdfa coord(M03): claim terrain chunk LOD planner 2026-07-16 09:37:45 +04:00
sindoring ea08b8ef51 docs(M03): accept terrain mesh cache integration 2026-07-16 09:30:59 +04:00
sindoring 630a0c131d merge(M03): integrate terrain mesh cache service 2026-07-16 09:30:02 +04:00
sindoring 10815be766 coord(M03): hand off terrain mesh cache service 2026-07-16 09:29:55 +04:00
sindoring 97480e06bb refactor(M03): extract terrain quality mesh cache 2026-07-16 09:29:38 +04:00
sindoring 6617dfe74e coord(M03): claim terrain mesh cache service 2026-07-16 09:25:43 +04:00
sindoring 61bad09a9c docs(M03): accept entity presentation integration 2026-07-16 01:12:55 +04:00
sindoring 606770c525 merge(M03): integrate entity presentation facade 2026-07-16 01:12:21 +04:00
sindoring b73b2e74a2 coord(M03): hand off entity presentation facade 2026-07-16 01:12:17 +04:00
sindoring 1807c3a363 feat(M03): add entity presentation facade 2026-07-16 01:11:58 +04:00
sindoring 3c5880f190 coord(M03): extend entity presentation fixture claim 2026-07-16 01:05:21 +04:00
sindoring a7b2f9475b coord(M03): claim entity presentation facade 2026-07-16 01:04:32 +04:00
sindoring a85e416cb8 docs(M03): accept environment snapshot integration 2026-07-16 01:01:25 +04:00
sindoring c69abd634f merge(M03): integrate environment snapshot facade 2026-07-16 01:00:41 +04:00
sindoring cd23a62be8 coord(M03): hand off environment snapshot facade 2026-07-16 01:00:36 +04:00
sindoring 2ee647a220 feat(M03): add environment snapshot facade 2026-07-16 01:00:19 +04:00
sindoring 60f1e363c0 coord(M03): claim facade environment snapshot 2026-07-16 00:55:17 +04:00
sindoring cb103e1fde docs(M03): accept facade ground query integration 2026-07-16 00:52:46 +04:00
sindoring d6e5b530ef merge(M03): integrate ground query cold-start fix 2026-07-16 00:52:08 +04:00
sindoring 8c46065ada coord(M03): update ground query handoff 2026-07-16 00:52:04 +04:00
sindoring 9408d887ba fix(M03): support cold rendered ground sample startup 2026-07-16 00:51:52 +04:00
sindoring 80cb08422b merge(M03): integrate facade ground query 2026-07-16 00:49:53 +04:00
sindoring 0773de5977 coord(M03): hand off facade ground query 2026-07-16 00:49:47 +04:00
sindoring b697a896e8 rnd(M03): add rendered ground query facade 2026-07-16 00:49:28 +04:00
sindoring 6117e5282e coord(M03): claim facade ground query 2026-07-16 00:40:46 +04:00
sindoring 53d84ccc8a docs(M03): accept streamer internal access gate 2026-07-16 00:38:58 +04:00
sindoring 7e35de7f61 merge(M03): integrate streamer internal access gate 2026-07-16 00:37:29 +04:00
sindoring ba9f89691d coord(M03): hand off streamer access gate 2026-07-16 00:37:15 +04:00
sindoring b58bf2caa6 test(M03): enforce streamer internal access boundary 2026-07-16 00:37:00 +04:00
sindoring 52ea639d64 coord(M03): claim streamer internal access gate 2026-07-16 00:33:32 +04:00
sindoring a023d76eea docs(M03): accept render budget scheduler integration 2026-07-16 00:32:11 +04:00
sindoring 7ece2abea2 merge(M03): integrate render budget scheduler 2026-07-16 00:31:30 +04:00
sindoring 10c5d4cc12 coord(M03): hand off render budget scheduler 2026-07-16 00:31:21 +04:00
sindoring e52f703da5 rnd(M03): extract render budget scheduler 2026-07-16 00:31:01 +04:00
sindoring 91f0724ce2 coord(M03): claim render budget scheduler 2026-07-16 00:22:16 +04:00
sindoring 650d584ff0 docs(M03): accept streaming planner integration
Work-Package: M03-RND-STREAMING-PLANNER-001
Agent: sindo-main-codex
Tests: post-merge planner/facade/focus/coordinate/manifest/shutdown and repository gates pass
Fidelity: target selection formulas and renderer behavior preserved
2026-07-16 00:11:57 +04:00
sindoring 643850c8ee Merge planner cold-start fix
Work-Package: M03-RND-STREAMING-PLANNER-001
Agent: sindo-main-codex
Tests: stale-class-cache headless verifier passes
Fidelity: no planning behavior change
2026-07-16 00:11:20 +04:00
sindoring ad8fc41ace fix(M03): support cold planner startup
Work-Package: M03-RND-STREAMING-PLANNER-001
Agent: sindo-main-codex
Tests: stale-class-cache headless planner verifier passes
Fidelity: type-resolution-only fix; planning behavior unchanged
2026-07-16 00:11:07 +04:00
sindoring d0f74f840b Merge work package M03-RND-STREAMING-PLANNER-001
Work-Package: M03-RND-STREAMING-PLANNER-001
Agent: sindo-main-codex
Tests: planner/facade/focus/coordinate/manifest/shutdown contracts, dry-run and repository gates
Fidelity: preserves target sets, boundary prefetch, queue priority, caches and visible renderer behavior
2026-07-16 00:08:32 +04:00
sindoring 5b10288ff7 docs(M03): publish streaming planner handoff
Work-Package: M03-RND-STREAMING-PLANNER-001
Agent: sindo-main-codex
Tests: planner and repository gates pass
Fidelity: no renderer policy or visual change
2026-07-16 00:08:24 +04:00
sindoring e887c3bad5 rnd(M03): extract streaming target planner
Work-Package: M03-RND-STREAMING-PLANNER-001
Agent: sindo-main-codex
Tests: planner/facade/focus/coordinate/manifest/shutdown contracts, seven-checkpoint dry-run, repository gates
Fidelity: preserves wanted/retained radii, boundary prefetch, editor preview, queue priority and cache/render behavior
2026-07-16 00:08:02 +04:00
sindoring 0c24f96ae1 rnd(M03): claim streaming target planner
Work-Package: M03-RND-STREAMING-PLANNER-001
Agent: sindo-main-codex
Tests: not run (coordination-only commit)
Fidelity: no runtime change
2026-07-15 23:58:57 +04:00
sindoring ad0532925a qar(M03): exclude reference projects from Godot imports
Work-Package: M03-QAR-REFERENCE-IMPORTS-001
Agent: sindo-main-codex
Tests: headless Godot rescan; nested reference repositories remain clean
Fidelity: reference-only tooling change; runtime and renderer behavior unchanged
2026-07-15 23:56:15 +04:00
sindoring 9c3f7018fb docs(M03): accept renderer facade integration
Work-Package: M03-RND-FACADE-001
Agent: sindo-main-codex
Tests: post-merge verification follows
Fidelity: no runtime change
2026-07-15 23:49:59 +04:00
sindoring a100cede46 Merge work package M03-RND-FACADE-001
Work-Package: M03-RND-FACADE-001
Agent: sindo-main-codex
Tests: facade/focus/coordinate/manifest contracts, dry-run, coordination and documentation gates
Fidelity: no renderer target, budget, cache or visual behavior change
2026-07-15 23:49:49 +04:00
sindoring 2466fd67d3 docs(M03): publish renderer facade handoff
Work-Package: M03-RND-FACADE-001
Agent: sindo-main-codex
Tests: facade/focus contracts and repository gates pass
Fidelity: no visual or streaming-policy change
2026-07-15 23:49:21 +04:00
sindoring 3d528e3bbf rnd(M03): introduce renderer facade seam
Work-Package: M03-RND-FACADE-001
Agent: sindo-main-codex
Tests: facade/focus/coordinate/manifest contracts, renderer dry-run, coordination and documentation gates
Fidelity: focus targets, budgets, queues, caches and visible renderer behavior remain unchanged
2026-07-15 23:48:53 +04:00
sindoring a629bedccf rnd(M03): claim renderer facade seam
Work-Package: M03-RND-FACADE-001
Agent: sindo-main-codex
Tests: not run (coordination-only commit)
Fidelity: no runtime change
2026-07-15 23:43:50 +04:00
sindoring 4f566b1957 Merge pull request 'qar(M02): close player decomposition milestone' (#28) from work/sindo-main-codex/m02-integrator-closeout into master
Reviewed-on: #28
2026-07-15 22:38:42 +03:00
sindoring d9c847c557 docs(M02): hand off milestone closeout
Work-Package: M02-QAR-INTEGRATOR-CLOSEOUT-001
Agent: sindo-main-codex
Tests: records complete post-merge and renderer verification
Fidelity: records direct, reference-only and open-gap classifications
2026-07-15 23:35:22 +04:00
sindoring 1bf5b526be qar(M02): close player decomposition milestone
Work-Package: M02-QAR-INTEGRATOR-CLOSEOUT-001
Agent: sindo-main-codex
Tests: all M02 contracts, renderer dry-run, documentation and coordination gates passed
Fidelity: direct binding evidence and reference-only timing/routing are separated; remaining locomotion/camera gaps stay explicit
2026-07-15 23:35:00 +04:00
sindoring 9275fbe04f reference, scenes 2026-07-15 23:32:50 +04:00
sindoring eb122d52a9 Merge pull request 'gmp(M02): add 3.3.5 input profile' (#27) from work/sindo-main-codex/m02-input-profile-335 into master
Reviewed-on: #27
2026-07-14 23:20:22 +03:00
sindoring e819eeb35b docs(M02): hand off 3.3.5 input profile
Work-Package: M02-GMP-INPUT-PROFILE-335-001
Agent: sindo-main-codex
Tests: records complete package and renderer verification
Fidelity: records private-source hashes, public reference revisions and remaining gaps
2026-07-15 00:18:03 +04:00
sindoring 8776a6b362 gmp(M02): add 3.3.5 input profile
Work-Package: M02-GMP-INPUT-PROFILE-335-001
Agent: sindo-main-codex
Tests: player input/movement/capability/terrain/camera/presentation, coordinate/streaming, docs/coordination and renderer dry-run passed
Fidelity: build-12340 binding hashes and selected defaults pinned; TrinityCore turn rate and WoWee mouse routing are compatibility references with explicit limits
2026-07-15 00:17:34 +04:00
sindoring c3094c9413 Merge pull request 'gmp(M02): gate debug movement capabilities' (#26) from work/sindo-main-codex/m02-sandbox-capabilities into master
Reviewed-on: #26
2026-07-14 22:58:54 +03:00
sindoring 7d5d13f702 docs(M02): publish movement capability handoff
Work-Package: M02-GMP-SANDBOX-CAPABILITIES-001

Agent: sindo-main-codex
2026-07-14 23:56:00 +04:00
sindoring 742c415885 gmp(M02): gate debug movement capabilities
Work-Package: M02-GMP-SANDBOX-CAPABILITIES-001

Agent: sindo-main-codex

Tests: capability/input/movement/terrain/camera/presentation; coordinate/streaming/docs/coordination; renderer dry-run 7/7

Fidelity: proves debug sprint/free-flight exclusion in Blizzlike335; no positive movement parity claim
2026-07-14 23:55:27 +04:00
sindoring 8c71e46872 Merge pull request 'rnd(M02): extract character presenters' (#25) from work/sindo-main-codex/m02-character-presentation into master
Reviewed-on: #25
2026-07-14 22:44:11 +03:00
sindoring ad820699bc docs(M02): publish character presentation handoff
Work-Package: M02-RND-CHARACTER-PRESENTATION-001

Agent: sindo-main-codex
2026-07-14 23:42:42 +04:00
sindoring 97bb53f6cd rnd(M02): extract character presenters
Work-Package: M02-RND-CHARACTER-PRESENTATION-001

Agent: sindo-main-codex

Tests: presentation/input/movement/terrain/camera regressions; coordinate/streaming/docs/coordination gates; renderer dry-run 7/7

Fidelity: preserves current sandbox model/outfit and Stand/Idle/Run/Walk behavior; build-12340 parity remains unverified
2026-07-14 23:42:12 +04:00
sindoring 68e6f60d90 Merge pull request 'rnd(M02): extract third-person camera rig' (#24) from work/sindo-main-codex/m02-camera-rig into master
Reviewed-on: #24
2026-07-14 22:30:33 +03:00
sindoring 02dec23c2a docs(M02): publish camera rig handoff
Work-Package: M02-RND-CAMERA-001
2026-07-14 23:27:41 +04:00
sindoring 8c1cf9be36 rnd(M02): extract third-person camera rig
Work-Package: M02-RND-CAMERA-001
2026-07-14 23:27:03 +04:00
sindoring f5bb64e6c7 Merge pull request 'gmp(M02): extract player terrain query' (#23) from work/sindo-main-codex/m02-terrain-query into master
Reviewed-on: #23
2026-07-14 22:17:12 +03:00
sindoring 0ce3cae208 docs(M02): publish terrain query handoff
Work-Package: M02-GMP-TERRAIN-QUERY-001
Agent: sindo-main-codex
Tests: coordination and documentation gates; diff check
Fidelity: documents inherited height/snap regression and remaining collision evidence gap
2026-07-14 23:11:23 +04:00
sindoring a45d521567 gmp(M02): extract player terrain query
Work-Package: M02-GMP-TERRAIN-QUERY-001
Agent: sindo-main-codex
Tests: terrain query, player input and movement regressions; asset-free scene; renderer dry-run; coordinate, streaming, documentation and coordination gates
Fidelity: preserves existing ADT outer-grid interpolation and player ground snap; build-12340 collision parity remains unverified
2026-07-14 23:10:55 +04:00
sindoring 5206c42cf0 Merge pull request 'gmp(M02): extract local player movement' (#22) from work/sindo-main-codex/m02-local-movement into master
Reviewed-on: #22
2026-07-14 22:01:21 +03:00
sindoring d2d6df3655 docs(M02): publish local movement handoff
Work-Package: M02-GMP-MOVEMENT-001
Agent: sindo-main-codex
Tests: coordination and documentation gates; diff check
Fidelity: documents preserved sandbox behavior and remaining build-12340 evidence gap
2026-07-14 22:59:59 +04:00
sindoring 435e1c95d2 gmp(M02): extract local player movement
Work-Package: M02-GMP-MOVEMENT-001
Agent: sindo-main-codex
Tests: local movement and player input regressions; asset-free scene; renderer dry-run; coordinate, streaming, documentation and coordination gates
Fidelity: preserves current sandbox speed, acceleration, sprint and camera-relative flight behavior; build-12340 parity remains unverified
2026-07-14 22:59:33 +04:00
sindoring 14dead194b Merge pull request 'gmp(M02): add player input intent seam' (#21) from work/sindo-main-codex/m02-player-input into master
Reviewed-on: #21
2026-07-14 21:52:26 +03:00
sindoring e794764269 docs(M02): publish player input handoff
Work-Package: M02-GMP-INPUT-001
Agent: sindo-main-codex
Tests: coordination and documentation gates; diff check
Fidelity: documents regression evidence and unverified build-12340 semantics
2026-07-14 22:45:14 +04:00
sindoring 6bd2e84048 gmp(M02): add player input intent seam
Work-Package: M02-GMP-INPUT-001
Agent: sindo-main-codex
Tests: verify_player_input; renderer baseline dry-run; coordinate, streaming, documentation and coordination gates
Fidelity: preserves current sandbox bindings and movement/camera behavior; exact build-12340 semantics remain unverified
2026-07-14 22:44:44 +04:00
sindoring 62eece991c Merge pull request 'docs(M01): claim milestone closeout' (#20) from work/sindo-main-codex/m01-integrator-closeout into master
Reviewed-on: #20
2026-07-14 12:55:09 +03:00
158 changed files with 12126 additions and 1014 deletions
+172 -1
View File
@@ -25,7 +25,8 @@ Paired run 2026-07-11 подтвердил крупный coordinate/placement g
## Основные файлы ## Основные файлы
- `src/scenes/streaming/streaming_world_loader.gd` - главный runtime streamer мира. - `src/render/world_render_facade.gd` - стабильная граница runtime/tools для focus и metrics.
- `src/scenes/streaming/streaming_world_loader.gd` - внутренний runtime streamer мира.
- `src/scenes/streaming/eastern_kingdoms_streaming.tscn` - текущая сцена для проверки Azeroth/Eastern Kingdoms. - `src/scenes/streaming/eastern_kingdoms_streaming.tscn` - текущая сцена для проверки Azeroth/Eastern Kingdoms.
- `addons/mpq_extractor/loaders/adt_builder.gd` - сборка ADT terrain, control splat материалов и MH2O liquids. - `addons/mpq_extractor/loaders/adt_builder.gd` - сборка ADT terrain, control splat материалов и MH2O liquids.
- `addons/mpq_extractor/loaders/m2_builder.gd` - сборка статического M2 mesh/material. - `addons/mpq_extractor/loaders/m2_builder.gd` - сборка статического M2 mesh/material.
@@ -873,6 +874,176 @@ $exe = Join-Path $env:TEMP 'godot-4.6.1-openwc\Godot_v4.6.1-stable_win64.exe'
- This closes a coordinate/renderer integration criterion only. It does not - This closes a coordinate/renderer integration criterion only. It does not
claim TrinityCore row equivalence or visual parity with the original client. claim TrinityCore row equivalence or visual parity with the original client.
## 2026-07-15 WorldRenderFacade First Seam
- Runtime streaming scenes, checkpoint capture and renderer probes now submit
typed focus through `WorldRenderFacade`; those callers no longer call the
monolithic streamer's focus methods or configure its focus source directly.
- Baseline capture reads queue/cache/activity counts through
`renderer_metrics_snapshot()`. The facade returns a deep copy, so diagnostics
cannot mutate renderer-owned state.
- `StreamingWorldLoader` remains the internal implementation and still owns all
queues, tasks, caches, nodes and RIDs. The facade adds no parallel state or
replacement scheduler.
- This package does not alter targets, budgets, cache versions, placement,
visibility, materials or animation. Environment, entity visuals and ground
query remain explicit follow-up facade contracts in M03.
## 2026-07-15 StreamingTargetPlanner Extraction
- Runtime and editor wanted/retained ADT set calculation now lives in the
scene-free `StreamingTargetPlanner`.
- `StreamingTargetPolicy` preserves existing chunk/tile radii, warm/prewarm/
retain margins and the clamped boundary-prefetch threshold.
- `StreamingTargetPlan` freezes its focus/wanted/retained result; the streamer
still owns available paths, load-queue distance sorting, loaded-tile LOD/detail
state, async work, caches, nodes and RIDs.
- Asset-free fixtures cover center, edge/corner prefetch, catalog filtering,
clamp and editor behavior plus bounded High-like iteration timing.
- Cache versions, quality profiles, queue priority and visible rendering rules
are unchanged by the extraction.
## 2026-07-16 RenderBudgetScheduler Extraction
- The scene-free `RenderBudgetScheduler` now owns the per-frame counters for 16
named renderer operation lanes. It owns no queue, task, cache, Node or RID.
- `StreamingWorldLoader` snapshots its existing exported limits once per process
frame and asks for a boolean permit immediately before each historically
budgeted operation.
- Chunk removals and creations intentionally share one `chunk_geometry` lane;
the existing removal-first drain order and combined limit are preserved.
- Loader teardown cancels permit issuance before waiting for asynchronous work.
Existing worker/result staleness checks and resource cleanup remain unchanged.
- Asset-free contracts cover exact bounds, independent/shared lanes, frame reset,
invalid inputs, terminal cancellation, detached diagnostics and hot-path timing.
- Defaults, quality presets, queue order, cache versions and visible rendering
rules are unchanged. Asset-backed p95/p99 comparison remains required.
## 2026-07-16 Streamer Internal Access Gate
- `verify_renderer_internal_access.gd` derives private queue, task, cache and
tile-state field names from `StreamingWorldLoader` declarations and rejects
external member/reflection access in gameplay and Godot `EditorPlugin` package sources.
- The gate follows the implementation inventory instead of duplicating a manual
list, so a newly named private renderer field is covered automatically when it
matches those ownership categories.
- Scene composition may still reference the loader script and the facade's
implementation path; those are composition details, not mutable queue access.
- Renderer diagnostic probes are added explicitly as their facade contracts land.
- This is a source-only boundary check and changes no renderer behavior or fidelity.
## 2026-07-16 Rendered Ground Query Facade
- `WorldRenderFacade.sample_ground_height()` accepts `GodotWorldPosition` and
returns renderer-owned immutable `RenderedGroundSample` from already loaded
quality/tile-LOD render meshes, avoiding a render-to-gameplay dependency.
- Its factories load the predeclared Script path instead of relying on a warm
global-class cache; a dedicated cold-start verifier covers this bootstrap path.
- `renderer_ground_query_snapshot()` preserves the terrain probe's tile readiness,
queue position, mesh bounds and nearby seam-fallback diagnostics as a detached
Dictionary; callers receive no queue, tile-state, Mesh or Node reference.
- `probe_render_terrain_height.gd` now uses this facade snapshot and no longer reads
`_tile_states`, `_tile_load_queue`, `_tile_loading_tasks` or `_available_tiles`.
- Gameplay continues using the independently composed M02 `TerrainQuery`/
`AdtTerrainQuery`. Loaded render meshes are diagnostic and are not authoritative
movement collision.
- The ray height, 3x3 tile search and `2/5/10/20/40`-unit nearby fallback are
preserved. No terrain geometry, cache, streaming or visual behavior changed.
## 2026-07-16 Terrain Chunk LOD Planner Extraction
- `TerrainChunkLodPlanner` now owns the pure mapping from populated parsed ADT
chunk indices to desired terrain LOD 0/1/2.
- `TerrainChunkLodPolicy` snapshots the existing enabled flag, three raw chunk
radii and chunk size once per streaming-target application.
- Horizontal XZ distance to the chunk center, inclusive squared thresholds,
sparse-index omission and historical negative-radius squaring are unchanged.
- `StreamingWorldLoader` still owns tile/chunk state, queues, operation budgets,
creation/removal, Mesh/Node/RID finalization and tile-LOD fallback.
- Cache formats, quality presets and visible behavior are unchanged. The
scene-free contract is formula evidence only; asset-backed p95/p99 and visual
acceptance remain required.
## 2026-07-16 Terrain Chunk Geometry Queue Planner Extraction
- `TerrainChunkGeometryQueuePlanner` now compares current and desired chunk state
and returns fresh chunk create/remove request arrays.
- LOD mismatches and absent chunks retain the existing request shape; creates
remain sorted by horizontal distance from chunk origin to streaming focus.
- Desired tile LOD still removes every current chunk, while sparse parsed chunk
records retain the existing tile-origin distance fallback.
- `StreamingWorldLoader` still owns queue storage/drains, removal-first execution,
the shared `chunk_geometry` budget lane and every Mesh/Node/RID side effect.
- Cache formats, quality profiles and visual rules are unchanged. Asset-backed
p95/p99 and visual acceptance remain required.
## 2026-07-16 M2 Unique Placement Registry Extraction
- `M2UniquePlacementRegistry` now owns positive ADT `MDDF.uniqueId` reservations
across streamed tiles using the existing `uid:<decimal>` keys.
- Missing/zero/negative IDs remain untracked; duplicates inside one reservation
call are suppressed and another tile records one skipped key until owner release.
- Owner release still lets the loader find eligible waiting tiles and enqueue the
existing detail retry path. First ownership remains tile-processing-order based.
- `StreamingWorldLoader` still owns tile state, retry queues, grouping/build tasks,
M2 caches, MultiMesh/Node/Mesh/material/RID creation and all operation budgets.
- M2/ADT cache formats, transforms, profiles and visible rules are unchanged.
Asset-backed cross-boundary p95/p99 and visual acceptance remain required.
## 2026-07-16 M2 Placement Transform Resolver Extraction
- `M2PlacementTransformResolver` now owns the pure ADT M2 basis and local
origin-compensation formulas used by worker grouping, placeholders and direct
instance creation.
- Regular models retain `Basis.from_euler`; `ElwynnCliffRock01/02` retain their
narrow shell correction; `NewWaterfall` and `ElwynnTallWaterfall01` retain
calibrated world yaw, local fall-axis twist and tall-sheet anchor compensation.
- Path separator/case/MDX handling, constants and caller-specific final scale
clamps are unchanged. The resolver owns no Node, task, cache or RID.
- Cache formats, placement positions and visible rules are unchanged by the
extraction. Asset-backed visual recheck and general placement parity remain gaps.
## 2026-07-16 World Environment Snapshot Facade
- `WorldEnvironmentSnapshot` carries one immutable finite time-of-day value,
normalized to `[0, 24)` hours; invalid non-finite input is explicit.
- `WorldRenderFacade.apply_environment_snapshot()` delegates the snapshot to the
scene-owned `WowSkyController`. The facade owns no `Environment`, sun, skybox,
shader global or DBC sampling state.
- Checkpoint capture now submits its manifest time through the facade instead of
locating `WowSkyController` and mutating `use_system_time`, `time_speed` and
`fixed_time_hours` directly.
- Applying a snapshot performs the same three fixed-clock assignments as the old
capture path. Light/Area/Skybox DBC lookup, interpolation, fog, sun and shader
behavior remain unchanged; weather and indoor environment state are follow-up work.
## 2026-07-16 World Entity Presentation Facade
- `EntityPresentationSnapshot` contract version 1 combines session `EntityId`,
typed Godot world position, visual PackedScene path, finite yaw/scale and visibility.
- `WorldRenderFacade.present_entity()` and `remove_entity()` delegate to an explicit
scene-owned `WorldEntityPresenter`; both runtime scenes compose that service.
- The presenter owns only visual subtrees. Same-path snapshots update transform/
visibility, changed paths replace after successful instantiation, and removal
detaches plus queues the owned root for deletion.
- The local player, authoritative state, GUID mapping and asset/display selection
remain outside this service. Runtime emits no entity commands yet, so baseline
output is unchanged.
- PackedScene loading is currently synchronous on create/replace and is a documented
prototype limitation, not an accepted network-scale frame-critical path.
## 2026-07-16 Terrain Quality Mesh Cache Extraction
- `TerrainQualityMeshCache` now owns full-quality terrain revisit Mesh references,
tile-key LRU order and source admission outside `StreamingWorldLoader`.
- The historical rules are unchanged: successful restore touches newest; store
trims oldest to `terrain_quality_mesh_cache_limit`; zero/negative capacity keeps
no entries; control-splat/splat sources are never retained in this revisit cache.
- The loader keeps three narrow adapters: restore into tile state, store after a
full-quality result and clear during existing world reset/shutdown.
- ADT parsing, quality tasks/results, tile state, cache format versions, material/
Node/RID finalization, budgets and visible terrain behavior remain loader-owned.
## Practical Rule For Future Work ## Practical Rule For Future Work
If something improves quality but creates visible hitch, it is not done. Move it to bake/cache/background work, split finalization over frames, or prewarm it before the player can see it. If something improves quality but creates visible hitch, it is not done. Move it to bake/cache/background work, split finalization over frames, or prewarm it before the player can see it.
+113
View File
@@ -0,0 +1,113 @@
# M02-GMP-INPUT-001 — Player input intent seam
<!-- OPENWC_CLAIM:M02-GMP-INPUT-001:sindo-main-codex:2026-07-16 -->
<!-- OPENWC_HANDOFF:READY:M02-GMP-INPUT-001:6bd2e84 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-INPUT-001:14dead1 -->
## Ownership
- Target: M02
- Program: GMP/FND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-player-input`
- Lease expires UTC: 2026-07-16
- Integrator: M02 milestone integrator
## Outcome
Replace direct keyboard polling in the runtime player with remappable Input Map
actions and an immutable `PlayerInputSource → MoveIntent` boundary while
preserving the current render-sandbox movement behavior.
## Non-goals
- Extract local movement, terrain query, camera rig or character presenters.
- Claim exact build-12340 movement/keybinding parity before original-client fixtures.
- Change movement speeds, camera geometry, terrain sampling or renderer behavior.
- Mark M02 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/domain/input/`, `src/gameplay/input/`,
`src/tests/scenes/player_input_regression.tscn`,
`src/tools/verify_player_input.gd`, `docs/modules/player-input.md`, this claim
- Shared/hotspots: `project.godot`,
`src/scenes/player/third_person_wow_controller.gd`, `docs/modules/README.md`
- Generated/ignored: Godot import metadata, `.uid` files and local renderer corpus
## Contracts and data
- Public API: immutable `MoveIntent`; `PlayerInputSource.sample_move_intent`
- Configuration: additive `openwc_player_*` Input Map actions
- Persistence/schema/cache: unchanged
- Consumers: current sandbox player controller; later local movement controller
## Dependencies
- Requires: merged M01 coordinate/streaming-focus contracts on master `62eece9`
- Blocks: later M02 movement-controller extraction
- External state: none; tests use synthetic Input Map events
## Verification
- Commands: dedicated player-input verifier, headless project load, coordinate
boundary gate, coordination/documentation gates and diff hygiene
- Fixtures: synthetic action strengths and configured default bindings
- Fidelity evidence: current W/S/A/D, Shift, E/Q and Space sandbox behavior remains
mapped through actions; exact 3.3.5a semantics remain unverified
- Performance budget: one immutable intent allocation per physics tick; no I/O
## Documentation deliverables
- Inline API documentation for `MoveIntent`, `PlayerInputActions` and
`PlayerInputSource`
- Player-input module specification with inputs/outputs, data-flow and sequence diagrams
- Module registry/source map and honest capability status
## Simplicity and naming
- Important names: `MoveIntent`, `PlayerInputSource`, `PlayerInputActions`
- Simplest approach: immutable value, one input adapter and one controller consumer
- Rejected complexity: input provider hierarchy, event bus and generic command framework
- Unavoidable complexity: none
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: twelve remappable actions, immutable `MoveIntent`, stateless
`PlayerInputSource`, controller migration, asset-free regression scene,
dedicated verifier and module specification
- Next: M02 integrator reviews and merges before local movement extraction
- Blocked by:
## Handoff
- Commit: `6bd2e84`
- Branch: `work/sindo-main-codex/m02-player-input`
- Outcome: the runtime player no longer polls physical keyboard keys. Movement
action strengths cross an immutable `MoveIntent` seam; camera and immediate
sandbox-flight events use the same remappable action catalog.
- Public contract: additive `MoveIntent`, `PlayerInputActions` and
`PlayerInputSource`; no schema, cache, coordinate or renderer contract change.
- Verification: `PLAYER_INPUT PASS actions=12 intent_cases=6 controller=1
regression_scene=1`; asset-free scene smoke exited `0`; coordinate boundary
(`88` files) and StreamingFocus gates passed; unified renderer dry-run passed
all eight pre-capture gates and produced seven dry-run checkpoint results;
coordination/documentation/diff gates passed.
- Fidelity: W/S/A/D, Shift, E/Q, Space, right mouse, wheel and Escape remain the
default sandbox bindings. Regression drives forward movement, camera zoom and
immediate flight toggle through the real controller. This does not establish
exact build-12340 default bindings, turn/strafe policy or gameplay movement parity.
- Local verification inputs: the isolated worktree reused the existing ignored
native DLL and generated ADT resource scripts. Proprietary extracted data and
the character GLB were absent, so the renderer dry-run logged the expected
missing-corpus diagnostics while all contract steps returned success.
- Rebuild/migration: none. Action names are additive; persisted user-binding
migration does not exist yet and is documented as a gap.
- Remaining risks: production profile gating for sprint/free flight, exact
3.3.5a bindings, local movement/terrain/camera/presentation extraction and
broader movement/camera state tests remain M02 work.
- Documentation: inline API comments plus `docs/modules/player-input.md` with
inputs/outputs, data-flow and sequence diagrams, ownership, recovery,
capability status, known gaps and source map.
@@ -0,0 +1,136 @@
# M02-GMP-INPUT-PROFILE-335-001 — WoW 3.3.5a input profile
<!-- OPENWC_CLAIM:M02-GMP-INPUT-PROFILE-335-001:sindo-main-codex:2026-07-17 -->
## Ownership
- Target: M02
- Program: GMP/QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-input-profile-335`
- Lease expires UTC: 2026-07-17
- Integrator: M02 milestone integrator
## Outcome
Add a profile-aware, remappable `Blizzlike335` input path whose default movement
bindings match the extracted build-12340 binding table while preserving the
existing `RenderSandbox` controls. Add deterministic turn intent and keyboard
turn consumption at the server-contract default turn rate.
## Non-goals
- Implement jump/fall/swim, network prediction or server reconciliation.
- Claim complete movement or camera parity from binding and turn-rate evidence.
- Persist user keybindings or build keybinding UI.
- Commit proprietary extracted client files.
- Mark M02 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/tests/fixtures/player_input_profile_335.json`, this claim
- Shared/hotspots: `project.godot`, `src/domain/input/move_intent.gd`,
`src/gameplay/input/player_input_actions.gd`,
`src/gameplay/input/player_input_source.gd`,
`src/gameplay/movement/local_player_movement_controller.gd`,
`src/scenes/player/third_person_wow_controller.gd`,
`src/scenes/player/third_person_camera_rig.gd`, player/movement verifiers
and regression scene, `docs/modules/player-input.md`,
`docs/modules/local-player-movement.md`, `docs/modules/third-person-camera.md`
- Generated/ignored: local `.godot`, native DLL and proprietary extracted corpus
## Contracts and data
- `MoveIntent` gains an immutable, clamped signed turn axis.
- `PlayerInputSource` selects explicit sandbox or compatibility action sets at
construction and routes compatibility A/D to strafe while camera rotation is held.
- `LocalPlayerMovementController` converts turn intent into a deterministic yaw
delta without reading engine input or owning a scene transform.
- A sanitized JSON fixture records selected binding facts, source hashes and the
pinned TrinityCore 3.3.5 server-contract commit.
## Dependencies
- Requires: merged sandbox capability package on master `c3094c9`.
- Blocks: final M02 integration audit and milestone closeout.
- External state: local extracted build-12340 binding files are evidence inputs
only; committed tests are reproducible without them.
## Verification
- Fixture schema/provenance and selected default-binding regression.
- Pure profile composition, A/D turn, Q/E strafe and camera-held A/D strafe cases.
- Deterministic turn-rate and controller integration regression.
- Existing M02 and repository gates remain required.
## Documentation deliverables
- Updated input/movement public API, profile matrix, data flow, sequence,
failure/recovery, fidelity provenance and source maps.
## Simplicity and naming
- Important names: `turn_axis`, `BLIZZLIKE_STRAFE_LEFT`, `TURN_LEFT`.
- Simplest approach: one profile selection at composition plus one scalar intent.
- Rejected complexity: input-context framework, command bus and persisted binding store.
- Unavoidable complexity: compatibility A/D behavior depends on camera-rotate state.
- Measured optimization evidence: not applicable.
## Status
- State: ready-for-review
- Done: added distinct remappable profiles, signed turn intent/controller path,
camera-yaw synchronization, sanitized provenance fixture, regression coverage
and updated module specifications
- Next: milestone integrator reviews and merges `8776a6b`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M02-GMP-INPUT-PROFILE-335-001:8776a6b -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-INPUT-PROFILE-335-001:eb122d5 -->
## Handoff
- Branch/commit: `work/sindo-main-codex/m02-input-profile-335` at `8776a6b`.
- Outcome: `RenderSandbox` retains A/D strafe and debug E/Q/Space/Shift behavior;
`Blizzlike335` now samples W/S and Up/Down forward/back, Q/E strafe, A/D and
Left/Right turn, with A/D routed to strafe while right-mouse rotation is active.
- Public contracts: `MoveIntent.turn_axis`; profile-selecting
`PlayerInputSource.new(profile_id)`; pure compatibility composition;
`LocalPlayerMovementController.calculate_yaw_delta_radians(...)`; camera yaw
synchronization after keyboard turn. Unknown input profiles fail closed to
`Blizzlike335`.
- Project configuration: four additive compatibility actions; existing action
names and sandbox mappings remain valid. W/S also gain the original Up/Down
secondary defaults.
- Verification: player input `actions=16 intent_cases=9 profiles=3 fixture=1
controller=1 regression_scene=3`; movement `cases=15 state_transitions=2`;
capabilities `profiles=3 sprint=2 flight=2 scenes=2`; terrain
`contract=4 interpolation=1 cache=1 failures=2`; camera
`state_cases=12 policy_cases=3`; presentation `appearance_cases=9
animation_cases=10`; coordinate boundaries `files=101`; StreamingFocus
`runtime_scenes=2 capture_tools=3`.
- Renderer: unified dry-run passed project/material/dedupe/cache/manifest/
calibration/coordinate/server-spawn gates and planned all seven checkpoints;
coordinate gate reported `files=103`. Missing proprietary GLB/DBC/ADT inputs
produced the expected diagnostics only.
- Repository gates: documentation `module_specs=8`; coordination
`fallback_claims=31`, with the same five unrelated expired M00 warnings.
- Fidelity: local build-12340 `DefaultBindings.wtf` SHA-256
`35FFA0E4E2356A13A0633A848F9E57ABE7DF9D8A16C2245E15D33013AD2F56A5`
and `Bindings.xml` SHA-256
`2E01276AFB7462F1417710F13B4BF1A456341F7F28CC8AE0D6D9C7442D7F6793`
were rechecked and selected facts sanitized into the committed fixture.
TrinityCore revision `2853a621d6af91a803787a2b8a509f4ce3e0300d` supplies the
3.141594 rad/s player server-contract turn rate. WoWee revision
`626243e937fb93965fa583a6507ed5a1aa7dda4b` supports right-mouse A/D routing.
- Fidelity limits: server turn rate and public reference routing are not direct
original-client timing/behavior proof. Jump, autorun and left-button
camera/select defaults are recorded but not implemented. This package does
not claim complete input, movement or camera parity.
- Migration/cache: no persisted settings or cache schema. Future saved bindings
must migrate stable action names; current project users receive additive actions.
- Documentation: updated input, movement and camera APIs, inputs/outputs, data
flow, sequence, ownership, failure/recovery, configuration, fidelity and source maps.
- Recommended merge order: merge after sandbox capabilities (already on master),
then run the final M02 integration/evidence audit without marking the target
done solely from this package.
+118
View File
@@ -0,0 +1,118 @@
# M02-GMP-MOVEMENT-001 — Local movement state/controller
<!-- OPENWC_CLAIM:M02-GMP-MOVEMENT-001:sindo-main-codex:2026-07-16 -->
<!-- OPENWC_HANDOFF:READY:M02-GMP-MOVEMENT-001:435e1c9 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-MOVEMENT-001:5206c42 -->
## Ownership
- Target: M02
- Program: GMP
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-local-movement`
- Lease expires UTC: 2026-07-16
- Integrator: M02 milestone integrator
## Outcome
Move local velocity, sandbox flight state, acceleration and directional speed
calculation from `ThirdPersonWowController` into a scene-free,
independently-testable local movement controller without changing current
sandbox motion.
## Non-goals
- Extract terrain queries, camera rig, character presentation or animation.
- Add jump/fall/swim, server prediction or reconciliation.
- Change current movement speeds, acceleration, camera-relative flight or ground snap.
- Gate debug movement by build profile; that remains a separate M02 package.
- Mark M02 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/gameplay/movement/`,
`src/tools/verify_local_player_movement.gd`,
`docs/modules/local-player-movement.md`, this claim
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`,
`src/tools/verify_player_input.gd`, `docs/modules/player-input.md`,
`docs/modules/README.md`
- Generated/ignored: local `.godot`, native DLL, generated ADT resources and renderer corpus
## Contracts and data
- Public API: stateful `LocalPlayerMovementController`
- Inputs: immutable `MoveIntent`, local Godot movement basis and physics delta seconds
- Outputs: local Godot displacement and read-only velocity/flight state
- Schema/cache/coordinate contracts: unchanged
- Consumer: current sandbox player scene; later gameplay composition root
## Dependencies
- Requires: merged input seam on master `14dead1`
- Blocks: terrain query and camera/presentation extraction from the player hotspot
- External state: none; unit tests use synthetic intents and bases
## Verification
- Commands: dedicated pure movement verifier, player-input regression, asset-free
scene smoke, coordinate/StreamingFocus gates, renderer dry-run and repository gates
- Fixtures: identity/rotated/pitched bases, acceleration steps, sprint and flight transitions
- Fidelity evidence: exact current 7.0/4.5/4.5 speeds, 28.0 acceleration,
6x sandbox sprint and camera-relative free flight are regression-locked only
- Performance budget: one small state update per physics tick; no allocation, I/O or scene lookup
## Documentation deliverables
- Inline public API docs for movement state/configuration and update methods
- Local movement module specification with data-flow, state and sequence diagrams
- Updated player-input consumer diagram/status and module registry
## Simplicity and naming
- Important name: `LocalPlayerMovementController`
- Simplest approach: one stateful RefCounted owning velocity and flight toggle
- Rejected complexity: generic locomotion framework, ECS component hierarchy and event bus
- Unavoidable complexity: movement basis remains an explicit local-space input
so the pure controller does not discover player/camera Nodes
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: scene-free movement state/controller, player scene migration, twelve
numeric cases, two flight transitions, integrated regression and module documentation
- Next: M02 integrator reviews and merges before TerrainQuery extraction
- Blocked by:
## Handoff
- Commit: `435e1c9`
- Branch: `work/sindo-main-codex/m02-local-movement`
- Outcome: `ThirdPersonWowController` no longer owns velocity, flight state,
acceleration or directional speed calculation. It selects an explicit
Godot-world basis, applies returned displacement, and retains terrain and
presentation adapters for later M02 packages.
- Public contract: additive `LocalPlayerMovementController` with read-only
Godot-world velocity/flight state, `toggle_sandbox_flight` and `advance`.
Input, coordinate, cache and renderer contracts remain unchanged.
- Verification: `LOCAL_PLAYER_MOVEMENT PASS cases=12 state_transitions=2
scene_boundary=1`; `PLAYER_INPUT PASS actions=12 intent_cases=6 controller=1
regression_scene=1`; asset-free scene smoke exited `0`; coordinate boundary
and StreamingFocus passed; renderer dry-run passed all eight pre-capture gates
and seven checkpoint plans; coordination/documentation/diff gates passed.
- Fidelity: exact existing defaults are regression-locked—forward `7.0`,
backward/strafe `4.5`, acceleration `28.0`, sandbox sprint `6x`, vertical
flight `7.0`, velocity reset on toggle and camera-relative pitched flight.
This preserves the sandbox baseline but is not original-client evidence.
- Local verification inputs: the isolated worktree reused the existing ignored
native DLL and generated ADT resource scripts. Proprietary extracted data and
character GLB were absent, so renderer dry-run logged expected missing-corpus
diagnostics while every contract step returned success.
- Rebuild/migration: none; transient movement state is not persisted.
- Remaining risks: exported speed changes after `_ready` do not reconfigure the
controller; exact build-12340 movement semantics, terrain/collision state,
jump/fall/swim, server prediction and debug profile gating remain open.
- Documentation: inline public API plus `docs/modules/local-player-movement.md`
with inputs/outputs, data-flow, state and sequence diagrams, ownership,
recovery, capability status, risks and source map; player-input consumer
diagrams/status were updated.
@@ -0,0 +1,127 @@
# M02-GMP-SANDBOX-CAPABILITIES-001 — Debug movement capability gate
<!-- OPENWC_CLAIM:M02-GMP-SANDBOX-CAPABILITIES-001:sindo-main-codex:2026-07-16 -->
## Ownership
- Target: M02
- Program: GMP/FND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-sandbox-capabilities`
- Lease expires UTC: 2026-07-16
- Integrator: M02 milestone integrator
## Outcome
Introduce an immutable local-player movement capability contract and require it
at the movement boundary so debug sprint and free flight execute only in the
explicit `RenderSandbox` profile and are rejected by `Blizzlike335`.
## Non-goals
- Claim that current movement values or `Blizzlike335` locomotion are 1:1.
- Build a global application/profile framework before the application shell exists.
- Remove debug Input Map actions or change their current sandbox bindings.
- Implement jump, fall, swim, collision, server authority or reconciliation.
- Mark M02 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/gameplay/movement/player_movement_capabilities.gd`,
`src/tools/verify_player_movement_capabilities.gd`, this claim
- Shared/hotspots: `src/gameplay/movement/local_player_movement_controller.gd`,
`src/scenes/player/third_person_wow_controller.gd`, movement/input verifiers,
player regression scene, `docs/modules/local-player-movement.md`,
`docs/modules/player-input.md`
- Generated/ignored: local `.godot`, native DLL, generated resources and renderer corpus
## Contracts and data
- `PlayerMovementCapabilities` owns immutable profile ID plus explicit debug
sprint/flight booleans and safe named factories.
- `LocalPlayerMovementController` requires the capability value; missing input
falls back to `Blizzlike335`, never sandbox.
- Player scene maps its exported profile selection once at the composition boundary.
- Input actions and `MoveIntent` remain unchanged; rejected debug requests have no effect.
## Dependencies
- Requires: merged character presentation package on master `8c71e46`.
- Blocks: final M02 integration audit and milestone closeout.
- External state: none; verification is asset-free.
## Verification
- Pure profile factory/default and immutability regression.
- Sprint accepted in RenderSandbox and ignored in Blizzlike335.
- Flight toggle/vertical basis accepted in RenderSandbox and rejected in Blizzlike335.
- Real regression scene verifies both profile compositions.
- Existing input/movement/terrain/camera/presentation and renderer gates remain required.
- Fidelity evidence: negative proof that debug capabilities cannot affect the
compatibility profile; no positive movement parity claim.
## Documentation deliverables
- Inline public API and profile semantics on the capability/controller boundary.
- Updated movement and input specs: API, inputs/outputs, data flow, lifecycle,
failure/recovery, capability matrix and source map.
## Simplicity and naming
- Important name: `PlayerMovementCapabilities`.
- Simplest approach: one immutable value injected into the existing controller.
- Rejected complexity: autoload singleton, generic feature-flag service and global profile registry.
- Unavoidable complexity: one profile-to-capability mapping at scene composition.
- Measured optimization evidence: not applicable.
## Status
- State: ready-for-review
- Done: added immutable capability contract, gated sprint/free-flight, covered
pure and real-scene profiles and updated movement/input specifications
- Next: milestone integrator reviews and merges `742c415`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M02-GMP-SANDBOX-CAPABILITIES-001:742c415 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-SANDBOX-CAPABILITIES-001:c3094c9 -->
## Handoff
- Branch/commit: `work/sindo-main-codex/m02-sandbox-capabilities` at `742c415`.
- Outcome: debug sprint and free flight now require explicit
`PlayerMovementCapabilities.render_sandbox()`; `Blizzlike335`, unknown and
null capability inputs reject both effects.
- Public contract: immutable profile ID plus `allows_debug_sprint` and
`allows_debug_free_flight`; named factories map configuration once at the
composition boundary. The movement controller exposes its effective profile ID.
- Runtime composition: `ThirdPersonWowController.movement_profile_id` defaults
to `RenderSandbox`, preserving renderer-scene behavior. Selecting
`Blizzlike335` keeps ordinary movement while ignoring Shift/Space/E/Q effects.
- Verification: capability `profiles=3 sprint=2 flight=2 scenes=2 boundary=1`,
movement `cases=12 state_transitions=2`, input `actions=12 intent_cases=6`,
terrain `contract=4 interpolation=1 cache=1 failures=2`, camera
`state_cases=12 policy_cases=3`, presentation
`appearance_cases=9 animation_cases=10`, coordinate boundaries
`files=101 consumers=5`, and StreamingFocus `runtime_scenes=2 capture_tools=3` passed.
- Renderer: dry-run passed project/material/dedupe/cache/manifest/calibration/