Compare commits

..

327 Commits

Author SHA1 Message Date
sindoring f35dcf3a09 targets: accept WMO runtime Mesh finalizer 2026-07-18 14:35:39 +04:00
sindoring d65ebee57f merge: WMO runtime Mesh finalizer 2026-07-18 14:34:02 +04:00
sindoring a59086fdf0 coordination: hand off WMO runtime Mesh finalizer 2026-07-18 14:33:57 +04:00
sindoring ae40e3f1d4 render: extract WMO runtime Mesh finalizer 2026-07-18 14:33:48 +04:00
sindoring 49e70260ed coordination: claim WMO runtime Mesh finalizer 2026-07-18 14:27:17 +04:00
sindoring 406dc464c3 targets: accept WMO scene resource finalizer 2026-07-18 14:18:29 +04:00
sindoring 6a0f9bd3ba merge: WMO scene resource finalizer 2026-07-18 14:17:09 +04:00
sindoring 3525cc0ead coordination: hand off WMO scene resource finalizer 2026-07-18 14:17:04 +04:00
sindoring 7779e9e75f render: extract WMO scene resource finalizer 2026-07-18 14:16:49 +04:00
sindoring 9ba7ca3263 coordination: claim WMO scene resource finalizer 2026-07-18 14:08:02 +04:00
sindoring 8c54313f7d targets: accept WMO render resource finalizer 2026-07-18 14:04:51 +04:00
sindoring 1acddab8a5 merge: WMO render resource finalizer 2026-07-18 14:03:48 +04:00
sindoring 5a1cd9d7c8 coordination: hand off WMO render resource finalizer 2026-07-18 14:03:41 +04:00
sindoring a86f8f2212 render: extract WMO render resource finalizer 2026-07-18 14:03:27 +04:00
sindoring fb7c9f174e coordination: claim WMO render resource finalizer 2026-07-18 13:55:50 +04:00
sindoring f1a7400ed1 targets: accept M2 Mesh resource finalizer 2026-07-18 13:52:55 +04:00
sindoring 34b700051f merge: M2 Mesh resource finalizer 2026-07-18 13:51:25 +04:00
sindoring 71a1012779 coordination: hand off M2 Mesh resource finalizer 2026-07-18 13:51:21 +04:00
sindoring ddeb708c08 render: extract M2 Mesh resource finalizer 2026-07-18 13:51:08 +04:00
sindoring c328d86554 coordination: claim M2 Mesh resource finalizer 2026-07-18 13:38:02 +04:00
sindoring 75ddf6a2ed targets: accept M2 animation resource finalizer 2026-07-18 13:31:34 +04:00
sindoring 06f6394043 merge: M2 animation resource finalizer 2026-07-18 13:30:43 +04:00
sindoring b20f0d7f6f coordination: hand off M2 animation resource finalizer 2026-07-18 13:30:39 +04:00
sindoring e7cd967dce render: extract M2 animation resource finalizer 2026-07-18 13:30:24 +04:00
sindoring ff952da7d8 coordination: claim M2 animation resource finalizer 2026-07-18 13:18:53 +04:00
sindoring 70729bb341 targets: accept native M2 animation resource observer 2026-07-18 10:57:18 +04:00
sindoring d37c799850 merge: native M2 animation resource observer 2026-07-18 10:56:08 +04:00
sindoring c24c3f159c coordination: hand off native M2 animation resource observer 2026-07-18 10:56:04 +04:00
sindoring 1cb0101a73 render: extract native M2 animation resource observer 2026-07-18 10:55:47 +04:00
sindoring d22a9cd743 coordination: claim native M2 animation resource observer 2026-07-18 10:42:13 +04:00
sindoring 6f385ed261 targets: accept cached M2 animation resource observer 2026-07-18 10:24:30 +04:00
sindoring f79e064d25 merge: cached M2 animation resource observer 2026-07-18 10:23:29 +04:00
sindoring 6a23c1b996 coordination: hand off cached M2 animation resource observer 2026-07-18 10:23:22 +04:00
sindoring df87619220 render: extract cached M2 animation resource observer 2026-07-18 10:23:03 +04:00
sindoring 3519f183bb coordination: claim cached M2 animation resource observer 2026-07-18 10:10:19 +04:00
sindoring 5ebf4de2ff targets: accept static M2 build resource observer 2026-07-18 03:04:01 +04:00
sindoring a043c79654 merge: static M2 build resource observer 2026-07-18 03:02:06 +04:00
sindoring 194b64d030 coordination: hand off static M2 build resource observer 2026-07-18 03:02:02 +04:00
sindoring 7cb3e3412f render: extract static M2 build resource observer 2026-07-18 03:01:43 +04:00
sindoring f062ea91cd coordination: claim static M2 build resource observer 2026-07-18 02:51:46 +04:00
sindoring 032a256e70 targets: accept M2 build resource snapshot 2026-07-18 02:48:54 +04:00
sindoring 4354834c50 merge: M2 build resource snapshot 2026-07-18 02:47:35 +04:00
sindoring 41b3b63215 coordination: hand off M2 build resource snapshot 2026-07-18 02:47:26 +04:00
sindoring ec1b90f1e4 render: add M2 build resource snapshot 2026-07-18 02:47:10 +04:00
sindoring 0decd10e09 coordination: claim M2 build resource snapshot 2026-07-18 02:38:46 +04:00
sindoring b113db01cd targets: accept M2 build dispatch planner 2026-07-18 02:35:49 +04:00
sindoring 99a90ddfb3 merge: M2 build dispatch planner 2026-07-18 02:34:36 +04:00
sindoring ed71b36aec coordination: hand off M2 build dispatch planner 2026-07-18 02:34:31 +04:00
sindoring 17f5cc0faa render: extract M2 build dispatch planner 2026-07-18 02:34:18 +04:00
sindoring 1fb566f9bc coordination: claim M2 build dispatch planner 2026-07-18 02:27:16 +04:00
sindoring c74b90a8ea targets: accept M2 build queue 2026-07-18 02:25:14 +04:00
sindoring 1dc013e5c2 merge: M2 build queue 2026-07-18 02:24:00 +04:00
sindoring 8938350a59 coordination: hand off M2 build queue 2026-07-18 02:23:53 +04:00
sindoring 4a8338f2f0 render: extract M2 build queue 2026-07-18 02:23:40 +04:00
sindoring 3ee9e77422 coordination: claim M2 build queue 2026-07-18 02:13:15 +04:00
sindoring 81e33a9bc4 targets: accept static M2 batch materializer 2026-07-18 02:02:10 +04:00
sindoring 5e82daacb9 merge: static M2 batch materializer 2026-07-18 02:01:15 +04:00
sindoring 8339189907 coordination: hand off static M2 batch materializer 2026-07-18 02:01:09 +04:00
sindoring 252927d90c render: extract static M2 batch materializer 2026-07-18 02:00:55 +04:00
sindoring 0fd052923d coordination: claim static M2 batch materializer 2026-07-18 01:54:26 +04:00
sindoring 86814deca1 targets: accept animated M2 materializer 2026-07-18 01:50:05 +04:00
sindoring c251985256 merge: animated M2 instance materializer 2026-07-18 01:49:17 +04:00
sindoring 899a9ae012 coordination: hand off animated M2 materializer 2026-07-18 01:49:08 +04:00
sindoring 456f3e2334 render: extract animated M2 materializer 2026-07-18 01:48:55 +04:00
sindoring 9ab4c0762d coordination: claim animated M2 materializer 2026-07-18 01:39:44 +04:00
sindoring 5b2d9f23fe docs(M03): accept M2 animation playback 2026-07-18 01:27:33 +04:00
sindoring c0fc191bcd merge M03 M2 animation playback 2026-07-18 01:26:18 +04:00
sindoring 15c24692f0 coord(M03): hand off M2 animation playback 2026-07-18 01:26:10 +04:00
sindoring 9b73571dcb refactor(M03): extract M2 animation playback 2026-07-18 01:25:54 +04:00
sindoring 5be36376c2 coord(M03): claim M2 animation playback 2026-07-18 01:19:13 +04:00
sindoring c0a7bfbd8d docs(M03): accept M2 animated scene finalizer 2026-07-18 01:16:19 +04:00
sindoring e7a7c67f6d merge M03 M2 animated scene finalizer 2026-07-18 01:14:40 +04:00
sindoring bc2bd06abc coord(M03): hand off M2 animated scene finalizer 2026-07-18 01:14:32 +04:00
sindoring 1b450dc580 refactor(M03): extract M2 animated scene finalizer 2026-07-18 01:14:17 +04:00
sindoring 03ba129a52 coord(M03): claim M2 animated scene finalizer 2026-07-18 01:07:09 +04:00
sindoring c20bc62ac0 docs(M03): accept M2 animation load pipeline 2026-07-17 18:25:20 +04:00
sindoring 3dccd3e3ee merge M03 M2 animation load pipeline 2026-07-17 18:24:16 +04:00
sindoring 672e0ce2a5 coord(M03): hand off M2 animation load pipeline 2026-07-17 18:24:10 +04:00
sindoring b8e0f11ed5 refactor(M03): extract M2 animation load pipeline state 2026-07-17 18:23:55 +04:00
sindoring 2695afcdba coord(M03): claim M2 animation load pipeline 2026-07-17 18:16:59 +04:00
sindoring 20a64b5dfc docs(M03): accept M2 prototype cache state 2026-07-17 17:07:27 +04:00
sindoring 1de50f98ce merge M03 M2 prototype cache state 2026-07-17 17:00:59 +04:00
sindoring 5e828aaf01 docs(M03): hand off M2 prototype cache state 2026-07-17 16:29:28 +04:00
sindoring cd664eb4cb refactor(M03): extract M2 prototype cache state 2026-07-17 16:29:11 +04:00
sindoring 87bf067493 coord(M03): claim M2 prototype cache state 2026-07-17 16:18:29 +04:00
sindoring ca77d32be1 docs(M03): accept raw M2 model repository 2026-07-17 15:54:59 +04:00
sindoring 7cd07dda4f merge M03 raw M2 model repository 2026-07-17 15:53:54 +04:00
sindoring 8605b43b1f docs(M03): hand off raw M2 model repository 2026-07-17 15:53:39 +04:00
sindoring b608a81766 refactor(M03): extract raw M2 model repository 2026-07-17 15:53:20 +04:00
sindoring e4bb10cee7 coord(M03): claim raw M2 model repository
Work-Package: M03-RND-M2-RAW-MODEL-REPOSITORY-001
Agent: sindo-main-codex
Tests: coordination gate passed before claim
Fidelity: native-boundary extraction only; parser methods and paths unchanged
2026-07-17 15:44:15 +04:00
sindoring 1d94eace68 docs(M03): accept M2 runtime mesh finalizer
Work-Package: M03-RND-M2-RUNTIME-MESH-FINALIZER-001
Agent: sindo-main-codex
Tests: post-merge finalizer, classifier, extractor, cache, pipeline, materials, shutdown, facade, internal-access, manifest, documentation and coordination gates pass
Fidelity: preserves refresh version 2 and rebuild/fallback transitions; asset-backed visual parity remains unclaimed
2026-07-17 15:03:48 +04:00
sindoring 1fafddecb6 merge M03 M2 runtime mesh finalizer 2026-07-17 15:02:28 +04:00
sindoring 0007a69769 docs(M03): hand off M2 runtime mesh finalizer
Work-Package: M03-RND-M2-RUNTIME-MESH-FINALIZER-001
Agent: sindo-main-codex
Tests: 37 headless regressions, checkpoint dry-run, documentation and coordination gates pass
Fidelity: refresh/rebuild/fallback extraction only; asset-backed visual parity remains unclaimed
2026-07-17 15:02:16 +04:00
sindoring ece7724a28 refactor(M03): extract M2 runtime mesh finalizer
Work-Package: M03-RND-M2-RUNTIME-MESH-FINALIZER-001
Agent: sindo-main-codex
Tests: 37 headless renderer/coordinate contracts pass; checkpoint dry-run 7/7; documentation and coordination gates pass
Fidelity: preserves refresh version 2, classifier, rebuild and fallback transitions; no visual parity claim
2026-07-17 15:01:52 +04:00
sindoring 951bd54fff coord(M03): claim M2 runtime mesh finalizer
Work-Package: M03-RND-M2-RUNTIME-MESH-FINALIZER-001
Agent: sindo-main-codex
Tests: coordination gate passed before claim
Fidelity: extraction-only package; refresh version and visible behavior unchanged
2026-07-17 14:54:16 +04:00
sindoring dd8cfbf79c docs(M03): accept M2 mesh resource extractor
Work-Package: M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001
Agent: sindo-main-codex
Tests: post-merge extractor, cache, pipeline, classifier, materials, shutdown, facade, internal-access, manifest, documentation and coordination gates pass
Fidelity: preserves first-Mesh preorder and temporary PackedScene cleanup; asset-backed visual parity remains unclaimed
2026-07-17 13:04:17 +04:00
sindoring fa85985ec5 merge M03 M2 mesh resource extractor 2026-07-17 13:03:11 +04:00
sindoring f68e971cce docs(M03): hand off M2 mesh resource extractor
Work-Package: M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001
Agent: sindo-main-codex
Tests: 36 headless regressions, checkpoint dry-run, documentation and coordination gates pass
Fidelity: traversal/lifetime extraction only; asset-backed visual parity remains unclaimed
2026-07-17 13:02:58 +04:00
sindoring 7b0e1eac5f refactor(M03): extract M2 mesh resource traversal
Work-Package: M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001
Agent: sindo-main-codex
Tests: 36 headless renderer/coordinate contracts pass; checkpoint dry-run 7/7; documentation and coordination gates pass
Fidelity: preserves first-Mesh preorder and temporary PackedScene cleanup; no visual parity claim
2026-07-17 13:02:40 +04:00
sindoring 6607100686 coord(M03): claim M2 mesh resource extractor
Work-Package: M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001
Agent: sindo-main-codex
Tests: coordination gate passed before claim
Fidelity: extraction-only package; traversal and visible behavior unchanged
2026-07-17 12:57:38 +04:00
sindoring 5e2afbc400 docs(M03): accept M2 mesh resource cache state
Work-Package: M03-RND-M2-MESH-RESOURCE-CACHE-001
Agent: sindo-main-codex
Tests: post-merge cache, pipeline, classifier, materials, shutdown, facade, internal-access, manifest, documentation and coordination gates pass
Fidelity: preserves Mesh identity/replacement/final-shutdown lifetime; asset-backed visual parity remains unclaimed
2026-07-17 12:12:19 +04:00
sindoring 30945615b9 merge M03 M2 mesh resource cache state 2026-07-17 12:11:09 +04:00
sindoring c5ecaba0ab docs(M03): hand off M2 mesh resource cache state
Work-Package: M03-RND-M2-MESH-RESOURCE-CACHE-001
Agent: sindo-main-codex
Tests: 35 headless regressions, checkpoint dry-run, documentation and coordination gates pass
Fidelity: cache ownership/lifetime extraction only; asset-backed visual parity remains unclaimed
2026-07-17 12:10:53 +04:00
sindoring e990a6503d refactor(M03): extract M2 mesh resource cache state
Work-Package: M03-RND-M2-MESH-RESOURCE-CACHE-001
Agent: sindo-main-codex
Tests: 35 headless renderer/coordinate contracts pass; checkpoint dry-run 7/7; documentation and coordination gates pass
Fidelity: preserves exact Mesh references, replacement semantics and final-shutdown lifetime; no visual parity claim
2026-07-17 12:10:37 +04:00
sindoring e2bb501695 coord(M03): claim M2 mesh resource cache state
Work-Package: M03-RND-M2-MESH-RESOURCE-CACHE-001
Agent: sindo-main-codex
Tests: coordination gate passed before claim
Fidelity: extraction-only package; visible behavior unchanged
2026-07-17 12:04:34 +04:00
sindoring ef782d1f2b docs(M03): accept M2 mesh load pipeline state
Work-Package: M03-RND-M2-MESH-LOAD-PIPELINE-001
Agent: sindo-main-codex
Tests: post-merge pipeline, classifier, materials, shutdown, facade, internal-access, manifest, documentation and coordination gates pass
Fidelity: preserves request polling/completion order, statuses, metrics and shutdown drain; asset-backed visual parity remains unclaimed
2026-07-17 11:09:20 +04:00
sindoring 83b3618c50 merge M03 M2 mesh load pipeline state 2026-07-17 10:24:50 +04:00
sindoring ccbb27a9fd docs(M03): hand off M2 mesh load pipeline state
Work-Package: M03-RND-M2-MESH-LOAD-PIPELINE-001
Agent: sindo-main-codex
Tests: 34 headless regressions, documentation/coordination gates and checkpoint dry-run pass
Fidelity: lifecycle extraction only; asset-backed visual parity remains unclaimed
2026-07-17 10:24:41 +04:00
sindoring 82df7a555d refactor(M03): extract M2 mesh load pipeline state
Work-Package: M03-RND-M2-MESH-LOAD-PIPELINE-001
Agent: sindo-main-codex
Tests: 34 headless contract regressions pass; documentation and coordination gates pass; checkpoint dry-run 7/7
Fidelity: preserves request insertion polling order, terminal completion FIFO/statuses, metrics and clear/shutdown behavior; no visual parity claim
2026-07-17 10:23:52 +04:00
sindoring 5f6287905c coord(M03): claim M2 mesh load pipeline state 2026-07-17 10:15:17 +04:00
sindoring 8ec13d6018 docs(M03): accept M2 runtime rebuild classifier 2026-07-17 10:02:55 +04:00
sindoring 38f831ea2f merge M03 M2 runtime rebuild classifier 2026-07-17 10:01:54 +04:00
sindoring 0544cf22df docs(M03): hand off M2 runtime rebuild classifier 2026-07-17 10:01:47 +04:00
sindoring 19ca8f48e8 refactor(M03): extract M2 runtime rebuild classifier 2026-07-17 10:01:29 +04:00
sindoring 324e64dd6e coord(M03): claim M2 runtime rebuild classifier 2026-07-17 09:56:16 +04:00
sindoring 90b1dac56e docs(M03): accept ADT water scene finalizer 2026-07-17 09:50:33 +04:00
sindoring 874fd0f3f2 merge M03 ADT water scene finalizer 2026-07-17 09:49:30 +04:00
sindoring 9cb8bdb137 docs(M03): hand off ADT water scene finalizer 2026-07-17 09:49:18 +04:00
sindoring 235be3a36c refactor(M03): extract ADT water scene finalizer 2026-07-17 09:48:56 +04:00
sindoring 4f8fc3b3b8 coord(M03): claim ADT water scene finalizer 2026-07-17 09:43:25 +04:00
sindoring e1b2886657 docs(M03): accept ADT water load pipeline state 2026-07-17 09:41:05 +04:00
sindoring f4707750b7 merge M03 ADT water load pipeline state 2026-07-17 09:39:33 +04:00
sindoring 78adb54cfe docs(M03): hand off ADT water load pipeline state 2026-07-17 09:39:24 +04:00
sindoring b7c036f14d refactor(M03): extract ADT water load pipeline state 2026-07-17 09:38:24 +04:00
sindoring 7973945582 coord(M03): claim ADT water load pipeline state 2026-07-17 09:32:25 +04:00
sindoring 4387c66c0a docs(M03): accept WMO scene resource cache state 2026-07-17 01:20:29 +04:00
sindoring ada0fd9467 merge M03 WMO scene resource cache state 2026-07-17 01:19:40 +04:00
sindoring ff4f320412 docs(M03): hand off WMO scene resource cache state 2026-07-17 01:19:36 +04:00
sindoring c83929428d refactor(M03): extract WMO scene resource cache state 2026-07-17 01:19:19 +04:00
sindoring 71fa093118 coord(M03): claim WMO scene resource cache state 2026-07-17 01:14:11 +04:00
sindoring e690756301 docs(M03): accept WMO render resource cache state 2026-07-17 01:12:30 +04:00
sindoring b4955d6162 merge M03 WMO render resource cache state 2026-07-17 01:11:32 +04:00
sindoring b4b94b3cbb docs(M03): hand off WMO render resource cache state 2026-07-17 01:11:27 +04:00
sindoring d39f591e50 refactor(M03): extract WMO render resource cache state 2026-07-17 01:11:11 +04:00
sindoring 4314f961f6 coord(M03): claim WMO render resource cache state 2026-07-17 01:04:15 +04:00
sindoring c9547041da docs(M03): accept WMO render build queue 2026-07-17 01:00:40 +04:00
sindoring 60603e18c8 merge M03 WMO render build queue cold-load fix 2026-07-17 00:59:50 +04:00
sindoring 3411156f8f docs(M03): refresh WMO queue handoff 2026-07-17 00:59:44 +04:00
sindoring e576ae2cad fix(M03): make WMO build queue cold-load safe 2026-07-17 00:59:11 +04:00
sindoring a878e7c4e7 merge M03 WMO render build queue 2026-07-17 00:57:20 +04:00
sindoring ab40a76b62 docs(M03): hand off WMO render build queue 2026-07-17 00:57:11 +04:00
sindoring e1bb105fff refactor(M03): extract WMO render build queue 2026-07-17 00:56:55 +04:00
sindoring 040b635ec6 coord(M03): claim WMO render build queue 2026-07-17 00:51:33 +04:00
sindoring 1e740aaa65 docs(M03): accept WMO render build planner 2026-07-17 00:49:17 +04:00
sindoring c06aed568b merge M03 WMO render build planner 2026-07-17 00:48:26 +04:00
sindoring 01bad4ca26 docs(M03): hand off WMO render build planner 2026-07-17 00:48:13 +04:00
sindoring 3a6b1d306d refactor(M03): extract WMO render build planner 2026-07-17 00:47:54 +04:00
sindoring e420a8724f coord(M03): claim WMO render build planner 2026-07-17 00:42:19 +04:00
sindoring 1e73e597f8 docs(M03): accept WMO placement registry 2026-07-17 00:34:25 +04:00
sindoring f9e5a4f2e0 merge M03 WMO placement registry 2026-07-17 00:33:34 +04:00
sindoring 16053b46ca docs(M03): hand off WMO placement registry 2026-07-17 00:33:23 +04:00
sindoring c5900368d4 refactor(M03): extract WMO placement registry 2026-07-17 00:33:09 +04:00
sindoring 79bc4e6ffc coord(M03): claim WMO placement registry 2026-07-17 00:26:32 +04:00
sindoring 5aa40d6afb docs(M03): accept WMO placement resolver 2026-07-17 00:24:37 +04:00
sindoring d2cb52ff6b merge M03 WMO placement resolver 2026-07-17 00:23:29 +04:00
sindoring c2e0696fe0 docs(M03): hand off WMO placement resolver 2026-07-17 00:23:18 +04:00
sindoring 05e216a953 refactor(M03): extract WMO placement resolver 2026-07-17 00:22:53 +04:00
sindoring f01302fd44 coord(M03): claim WMO placement resolver 2026-07-17 00:16:39 +04:00
sindoring 4f40c779b9 docs(M03): accept M2 build batch planner 2026-07-17 00:14:06 +04:00
sindoring 3f847171f8 merge M03 M2 build batch planner 2026-07-17 00:13:11 +04:00
sindoring af9d077905 docs(M03): hand off M2 build batch planner 2026-07-17 00:13:01 +04:00
sindoring be6db7f7e0 refactor(M03): extract M2 build batch planner 2026-07-17 00:12:42 +04:00
sindoring a562d126b9 coord(M03): claim M2 build batch planner 2026-07-17 00:08:54 +04:00
sindoring 9d74d996d5 docs(M03): accept M2 placement grouper 2026-07-17 00:07:11 +04:00
sindoring f88bf9714e merge M03 M2 placement grouper 2026-07-17 00:06:19 +04:00
sindoring 7587d3bd3c docs(M03): hand off M2 placement grouper 2026-07-17 00:06:10 +04:00
sindoring 9df32d38ef refactor(M03): extract M2 placement grouper 2026-07-17 00:05:49 +04:00
sindoring 9c9020e60f coord(M03): claim M2 placement grouper 2026-07-16 23:57:35 +04:00
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
sindoring fc81059dfa docs(M01): mark milestone closeout ready
Work-Package: M01-QAR-INTEGRATOR-CLOSEOUT-001

Agent: sindo-main-codex
2026-07-14 12:14:39 +04:00
sindoring dd412e6d0d test(M01): close coordinates and seams milestone
Work-Package: M01-QAR-INTEGRATOR-CLOSEOUT-001

Agent: sindo-main-codex

Tests: all M01 domain gates, unified renderer dry-run, coordination and documentation gates

Fidelity: five build-12340 points, raw ADT and mapped AzerothCore spawn evidence; no 1:1 claim
2026-07-14 12:13:43 +04:00
sindoring 07f08044f4 docs(M01): claim milestone closeout
Work-Package: M01-QAR-INTEGRATOR-CLOSEOUT-001

Agent: sindo-main-codex
2026-07-14 12:01:49 +04:00
sindoring c8e99f28d6 Merge pull request 'chore(M01): remove local spawn capture logs' (#19) from work/sindo-main-codex/m01-server-spawn-renderer into master
Reviewed-on: #19
2026-07-14 10:58:37 +03:00
sindoring 48cc976ba0 docs(M01): mark server spawn renderer ready
Work-Package: M01-QAR-SERVER-SPAWN-RENDERER-001

Agent: sindo-main-codex

Tests: server spawn GUI cold/warm, unified renderer dry-run, domain and documentation gates
2026-07-14 11:56:39 +04:00
sindoring 318e6ae757 chore(M01): remove local spawn capture logs
Work-Package: M01-QAR-SERVER-SPAWN-RENDERER-001

Agent: sindo-main-codex

Tests: renderer dry-run, coordinate/domain gates, GUI cold/warm inspection
2026-07-14 11:55:05 +04:00
sindoring 747fae8e2e Merge pull request 'координаты' (#18) from work/sindo-main-codex/m01-server-spawn-renderer into master
Reviewed-on: #18
2026-07-14 10:48:53 +03:00
sindoring 24ddc99a7b координаты 2026-07-14 11:48:14 +04:00
sindoring 52b6fa2ebb Merge pull request 'docs(M01): claim server spawn renderer evidence' (#17) from work/sindo-main-codex/m01-server-spawn-renderer into master
Reviewed-on: #17
2026-07-14 10:42:14 +03:00
sindoring 3933dbfc47 docs(M01): claim server spawn renderer evidence
Work-Package: M01-QAR-SERVER-SPAWN-RENDERER-001

Agent: sindo-main-codex
2026-07-13 17:41:02 +04:00
sindoring a07a487368 docs(M01): mark coordinate boundary gate ready
Work-Package: M01-FND-COORD-BOUNDARY-GATE-001

Agent: sindo-main-codex
2026-07-13 16:40:07 +04:00
sindoring 47dec6c32c feat(M01): enforce coordinate conversion boundaries
Work-Package: M01-FND-COORD-BOUNDARY-GATE-001

Agent: sindo-main-codex
2026-07-13 16:37:29 +04:00
sindoring c8e62acf4c docs(M01): claim coordinate boundary gate
Work-Package: M01-FND-COORD-BOUNDARY-GATE-001

Agent: sindo-main-codex
2026-07-13 16:15:18 +04:00
sindoring 7c64e8d60a docs(M01): mark domain identities ready
Work-Package: M01-FND-DOMAIN-IDENTITIES-001

Agent: sindo-main-codex
2026-07-13 16:11:35 +04:00
sindoring c1dc07c705 feat(M01): add typed domain identities
Work-Package: M01-FND-DOMAIN-IDENTITIES-001

Agent: sindo-main-codex
2026-07-13 16:11:00 +04:00
sindoring d68786355c docs(M01): claim domain identity contracts
Work-Package: M01-FND-DOMAIN-IDENTITIES-001

Agent: sindo-main-codex
2026-07-13 16:05:55 +04:00
sindoring 77cd17a5bc docs(M01): mark streaming focus ready
Work-Package: M01-RND-STREAMING-FOCUS-001

Agent: sindo-main-codex
2026-07-13 15:45:32 +04:00
sindoring 7815385b3b feat(M01): add explicit streaming focus
Work-Package: M01-RND-STREAMING-FOCUS-001

Agent: sindo-main-codex
2026-07-13 15:41:16 +04:00
sindoring fbef131bcb docs(M01): claim streaming focus contract
Work-Package: M01-RND-STREAMING-FOCUS-001

Agent: sindo-main-codex
2026-07-13 15:35:45 +04:00
sindoring 52e1b2ba67 docs(M01): mark coordinate fixtures ready
Work-Package: M01-QAR-COORD-FIXTURES-001

Agent: sindo-main-codex
2026-07-13 14:28:03 +04:00
sindoring ce4f7ec0e2 test(M01): add coordinate golden fixtures
Work-Package: M01-QAR-COORD-FIXTURES-001

Agent: sindo-main-codex
2026-07-13 14:27:38 +04:00
sindoring 758b375e7e docs(M01): claim coordinate golden fixtures
Work-Package: M01-QAR-COORD-FIXTURES-001
Agent: sindo-main-codex
Tests: not applicable (claim only)
Fidelity: pinned AzerothCore spawn, raw ADT metadata and build 12340 observations scoped
2026-07-13 14:23:23 +04:00
sindoring b55bfca2a7 docs(M01): mark ADT tile axis fix ready
Work-Package: M01-FND-COORD-TILE-AXIS-002
Agent: sindo-main-codex
Tests: coordination and documentation gates passed
Fidelity: handoff records raw Azeroth_31_49 MCNK evidence
2026-07-13 14:13:10 +04:00
sindoring a7072e3d14 fix(M01): correct ADT filename coordinate axes
Work-Package: M01-FND-COORD-TILE-AXIS-002
Agent: sindo-main-codex
Tests: coordinate mapper, M00 calibration, baseline manifest, coordination and documentation gates passed
Fidelity: Azeroth_31_49 raw MCNK origins and OpenRealm confirm filename X from world Y and filename Y from world X
2026-07-13 14:12:51 +04:00
sindoring f9c467b71f docs(M01): claim ADT tile axis correction
Work-Package: M01-FND-COORD-TILE-AXIS-002
Agent: sindo-main-codex
Tests: not applicable (claim only)
Fidelity: raw Azeroth_31_49 ADT and OpenRealm independently expose swapped filename axes
2026-07-13 14:09:20 +04:00
sindoring 1c0dfc761d docs(M01): mark coordinate contract handoff ready
Work-Package: M01-FND-COORDS-001
Agent: sindo-main-codex
Tests: coordination and documentation gates passed
Fidelity: handoff records five build 12340 golden coordinate points
2026-07-13 13:30:18 +04:00
sindoring f45695c26a fnd(M01): add canonical coordinate mapper
Work-Package: M01-FND-COORDS-001
Agent: sindo-main-codex
Tests: coordinate mapper, M00 coordinate calibration, baseline manifest, coordination and documentation gates passed
Fidelity: five build 12340 camera points map within 0.002 yard; no visual parity claim
2026-07-13 13:29:59 +04:00
sindoring c2be8ae95e docs(M01): claim canonical coordinate contract
Work-Package: M01-FND-COORDS-001
Agent: sindo-main-codex
Tests: not applicable (claim only)
Fidelity: scope references merged M00 build 12340 coordinate evidence
2026-07-13 13:22:02 +04:00
sindoring 8636427234 Merge pull request 'test(M00): close renderer baseline milestone' (#16) from work/sindo-main-codex/m00-integrator-closeout into master
Reviewed-on: #16
2026-07-13 12:17:51 +03:00
sindoring 5627180fd5 docs(M00): mark closeout handoff ready
Work-Package: M00-QAR-INTEGRATOR-CLOSEOUT-001
Agent: sindo-main-codex
Tests: coordination and documentation gates
Fidelity: metadata-only handoff; no compatibility claim change
2026-07-13 13:17:06 +04:00
sindoring ba81098797 test(M00): close renderer baseline milestone
Work-Package: M00-QAR-INTEGRATOR-CLOSEOUT-001
Agent: sindo-main-codex
Tests: post-merge render baseline dry-run; comparator self-test; coordination and documentation gates
Fidelity: records seven build-12340 reference categories and measured gaps without claiming parity
2026-07-13 13:16:52 +04:00
sindoring f19c0c45a7 Merge pull request 'fix(M00): release GUI capture render resources' (#15) from work/sindo-main-codex/m00-gui-rid-shutdown into master
Reviewed-on: #15
2026-07-13 12:12:33 +03:00
sindoring 09b3e87a8d fix(M00): release GUI capture render resources
Work-Package: M00-QAR-GUI-RID-SHUTDOWN-001
Agent: sindo-main-codex
Tests: render baseline dry-run; runtime cache shutdown; comparator self-test; coordination and documentation gates
Fidelity: shutdown-only ownership fix; no visual or Blizzlike335 behavior change
2026-07-13 11:08:30 +04:00
sindoring d1df794cd6 Merge pull request 'test(M00): complete animation and sky evidence' (#14) from work/sindo-main-codex/m00-animation-sky-evidence into master
Reviewed-on: #14
2026-07-13 09:02:32 +03:00
sindoring 0327e4862d test(M00): complete animation and sky evidence
Work-Package: M00-QAR-ANIMATION-SKY-EVIDENCE-001
Agent: sindo-main-codex
Tests: 14-pair visual audit; manifest/self-test; coordination/documentation gates
Fidelity: sky evidence paired approximately; Gryphon animation observed but placement-unpaired
2026-07-13 10:01:19 +04:00
sindoring 239cb2432e Merge pull request 'test(M00): record final paired evidence' (#13) from work/sindo-main-codex/m00-final-paired-evidence into master
Reviewed-on: #13
2026-07-12 02:28:00 +03:00
sindoring b5ddc86c92 test(M00): record final paired evidence 2026-07-12 03:21:39 +04:00
sindoring 3d90c6d79a Merge pull request 'test(M00): add landmark-region visual diff' (#12) from work/sindo-main-codex/m00-landmark-region-diff into master
Reviewed-on: #12
2026-07-12 02:07:30 +03:00
sindoring a10206b797 test(M00): add landmark-region visual diff 2026-07-12 03:03:59 +04:00
sindoring 3172f41ee5 Merge pull request 'test(M00): refine Goldshire camera framing' (#11) from work/sindo-main-codex/m00-camera-framing-refinement into master
Reviewed-on: #11
2026-07-12 01:51:08 +03:00
sindoring 5a957d2ebb test(M00): refine Goldshire camera framing 2026-07-12 02:49:19 +04:00
sindoring 5092995d0c Merge pull request 'test(M00): require WMO-ready pose captures' (#10) from work/sindo-main-codex/m00-wmo-readiness into master
Reviewed-on: #10
2026-07-12 01:36:02 +03:00
sindoring 4908eb2e31 test(M00): require WMO-ready pose captures 2026-07-12 02:16:09 +04:00
sindoring eca76c5ed1 Merge pull request 'test(M00): record Goldshire pose evidence' (#9) from work/sindo-main-codex/m00-camera-pose-evidence into master
Reviewed-on: #9
2026-07-12 01:00:40 +03:00
sindoring 03891edeb2 test(M00): record Goldshire pose evidence 2026-07-12 01:59:42 +04:00
sindoring 657a1d888a Merge pull request 'test(M00): add camera pose sweep' (#8) from work/sindo-main-codex/m00-camera-pose-sweep into master
Reviewed-on: #8
2026-07-12 00:47:17 +03:00
sindoring b48195d08d test(M00): add camera pose sweep 2026-07-12 01:46:02 +04:00
sindoring 8d4641a43b Merge pull request 'fix(renderer): drain threaded loads on shutdown' (#7) from work/sindo-main-codex/m00-capture-shutdown into master
Reviewed-on: #7
2026-07-12 00:39:21 +03:00
sindoring ad9ba7af4e fix(renderer): drain threaded loads on shutdown 2026-07-12 01:28:26 +04:00
sindoring f54850718a Merge pull request 'test(M00): add empirical checkpoint FOV sweep' (#6) from work/sindo-main-codex/m00-fov-sweep into master
Reviewed-on: #6
2026-07-11 23:57:40 +03:00
sindoring 5103eed014 test(M00): add empirical checkpoint FOV sweep
Work-Package: M00-QAR-FOV-SWEEP-001
Agent: sindo-main-codex
Tests: comparator filter self-test, FOV capture dry-run, bounded real sweep, repository gates
Fidelity: projection sweep remains inconclusive without reproducible reference yaw and pitch
2026-07-12 00:51:58 +04:00
sindoring 9d34a47765 Merge pull request 'test(M00): diagnose checkpoint camera occluders' (#5) from work/sindo-main-codex/m00-camera-occluders into master
Reviewed-on: #5
2026-07-11 23:04:13 +03:00
sindoring aea7787b9b test(M00): diagnose checkpoint camera occluders
Work-Package: M00-QAR-CAMERA-OCCLUDERS-001
Agent: sindo-main-codex
Tests: five-point camera occluder probe, coordination and documentation gates
Fidelity: no camera containment found; manual target and FOV mismatch recorded
2026-07-11 22:23:33 +04:00
sindoring 230620089f Merge pull request 'test(M00): diagnose waterfall tile ownership' (#4) from work/sindo-main-codex/m00-waterfall-tile-ownership into master
Reviewed-on: #4
2026-07-11 21:11:21 +03:00
sindoring 42fdf40282 test(M00): diagnose waterfall tile ownership
Work-Package: M00-QAR-TILE-OWNERSHIP-001
Agent: sindo-main-codex
Tests: strict five-point terrain probe, coordination and documentation gates
Fidelity: tile 30_49 ownership is healthy; exact ray miss classified as triangle seam
2026-07-11 22:06:22 +04:00
sindoring f8538ba2cf Merge pull request 'test(M00): probe renderer terrain clearance' (#3) from work/sindo-main-codex/m00-terrain-height into master
Reviewed-on: #3
2026-07-11 20:48:57 +03:00
sindoring d233a41ce8 test(M00): probe renderer terrain clearance
Work-Package: M00-QAR-TERRAIN-HEIGHT-001
Agent: sindo-main-codex
Tests: five-point terrain probe, coordination and documentation gates
Fidelity: four cameras confirmed above terrain; waterfall tile missing terrain mesh recorded
2026-07-11 19:38:23 +04:00
sindoring dfc10312f8 Merge pull request 'test(M00): add renderer coordinate calibration' (#2) from work/sindo-main-codex/m00-coordinate-calibration into master
Reviewed-on: #2
2026-07-11 18:12:57 +03:00
sindoring 8e8ea32ba3 test(M00): add renderer coordinate calibration
Work-Package: M00-QAR-COORD-CALIBRATION-001
Agent: sindo-main-codex
Tests: coordinate probe, M00 dry-run, coordination and documentation gates
Fidelity: five build 12340 camera points round-trip within 0.000015 units
2026-07-11 19:09:46 +04:00
sindoring 19df5b7968 Merge pull request 'test(M00): add checkpoint perceptual comparison' (#1) from work/sindo-main-codex/m00-checkpoint-diff into master
Reviewed-on: #1
2026-07-11 17:57:04 +03:00
sindoring d467ffee7f test(M00): calibrate paired renderer checkpoints
Work-Package: M00-QAR-VISUAL-DIFF-001
Agent: sindo-main-codex
Tests: synthetic JPG/PNG diff, manifest, coordination and documentation gates
Fidelity: five build 12340 references compared; coordinate and placement gaps recorded
2026-07-11 18:23:07 +04:00
sindoring a4f60dcb06 test(M00): add checkpoint perceptual comparison
Work-Package: M00-QAR-VISUAL-DIFF-001
Agent: sindo-main-codex
Tests: synthetic visual diff, M00 dry-run, coordination and documentation gates
Fidelity: automates paired metrics; approved 3.3.5a captures and human approval remain required
2026-07-11 09:38:40 +04:00
sindoring fbe22f6a94 ещё обновление доки 2026-07-10 18:29:56 +04:00
sindoring 0eef72a2c2 крупное обновление документации 2026-07-10 18:15:05 +04:00
sindoring 01953cc25e обновление md файлов 2026-07-10 15:45:57 +04:00
sindoring b199876ce6 базовый рендер 2026-07-10 11:21:33 +04:00
478 changed files with 47029 additions and 2113 deletions
+4
View File
@@ -35,3 +35,7 @@
# CMake build директория
/src/native/build/
# Local root-level diagnostic capture logs
/*.stdout.log
/*.stderr.log
+23 -5
View File
@@ -12,9 +12,14 @@
1. Прочитать [`targets/README.md`](targets/README.md).
2. Прочитать файл текущей цели, указанный там как `Current target`.
3. Прочитать [`docs/README.md`](docs/README.md) и связанные с задачей нормативные документы.
4. Для renderer-задач прочитать [`RENDER.md`](RENDER.md).
5. Проверить рабочее дерево и не перезаписывать чужие изменения.
3. Прочитать [`targets/DEVELOPMENT_ROADMAP.md`](targets/DEVELOPMENT_ROADMAP.md) и соответствующий subsystem plan из `targets/roadmap/`.
4. Прочитать [`docs/README.md`](docs/README.md) и связанные с задачей нормативные документы.
5. Прочитать обязательный [`docs/CODING_STANDARD.md`](docs/CODING_STANDARD.md): явные имена и KISS имеют приоритет.
6. Прочитать обязательный [`docs/DOCUMENTATION_STANDARD.md`](docs/DOCUMENTATION_STANDARD.md) и определить, какие API docs, module spec и diagrams затрагивает задача.
7. Для renderer-задач прочитать [`RENDER.md`](RENDER.md).
8. Проверить рабочее дерево и не перезаписывать чужие изменения.
9. Перед созданием сложной подсистемы или добавлением dependency проверить [`docs/TOOLING_CATALOG.md`](docs/TOOLING_CATALOG.md), зарегистрировать найденные готовые решения и провести bounded evaluation вместо немедленного вендоринга.
10. При командной работе прочитать [`docs/TEAM_WORKFLOW.md`](docs/TEAM_WORKFLOW.md), проверить активные claims/draft PRs и объявить стабильный Agent ID до изменений.
Если задача пользователя противоречит target-порядку, прямое указание пользователя имеет приоритет, но агент обязан сохранить архитектурные границы и отметить влияние на roadmap.
@@ -28,10 +33,20 @@
- Интерактивный authoring UI реализуется только через Godot `EditorPlugin`.
- Любой новый формат, публичный контракт или несовместимое решение требует обновления документации и при необходимости ADR.
- Исправление дефекта должно получать regression test, когда это технически возможно.
- Не писать крупную подсистему с нуля до поиска готовых libraries, reference implementations, fixtures и tooling; результат исследования фиксируется в `docs/TOOLING_CATALOG.md`.
- Не начинать claimed work package другого агента и не редактировать его exclusive paths без явного handoff.
- Не работать двум агентам в одном worktree. Каждый агент использует собственную ветку и clone/worktree.
- Статус milestone, Evidence и `OPENWC_TARGET_DONE` изменяет только назначенный интегратор.
- Каждый новый/существенно изменённый модуль обязан иметь актуальную specification в `docs/modules/`, inline documentation публичного API и data-flow diagram по `docs/DOCUMENTATION_STANDARD.md`.
- Stateful/async/cross-layer работа обязана документировать state/sequence diagram, ownership, threading, failure и recovery paths.
- Документация обновляется в том же work package, что код. Handoff без обязательной документации имеет статус только `PARTIAL`.
- Не сокращать имена ради краткости. Variable/function/type должен явно описывать назначение, domain context, units и coordinate space, когда они неоднозначны.
- Следовать KISS: использовать самое простое корректное решение, не вводить premature abstractions/frameworks/optimizations и изолировать неизбежную сложность.
- Имена `manager`, `helper`, `utils`, `data`, `info`, `process`, `handle` без точного контекста считаются design smell и требуют переименования или обоснования.
## Метки состояния
В каждом `targets/*.md` присутствует ровно одна метка:
В каждом исполняемом target-файле `targets/[0-9][0-9]-*.md` присутствует ровно одна метка. Справочные документы `targets/DEVELOPMENT_ROADMAP.md` и `targets/roadmap/*.md` меток состояния не имеют:
- `<!-- OPENWC_TARGET:OPEN -->` — цель ещё не начата.
- `<!-- OPENWC_TARGET:ACTIVE -->` — единственная текущая цель.
@@ -51,6 +66,8 @@
3. В Evidence записаны команды, результаты и изменённые файлы.
4. Не осталось обязательных незакрытых пунктов или скрытых заглушек.
5. Обновлены `targets/README.md` и матрица функций, если применимо.
6. Публичный API, module spec, input/output tables и обязательные diagrams соответствуют фактической реализации.
7. Код соответствует `docs/CODING_STANDARD.md`: понятные имена, простой data flow и обоснованная сложность.
Агент НЕ ДОЛЖЕН ставить `DONE` только потому, что код компилируется. Если пользователь явно принял частичный результат, статус остаётся `ACTIVE`, а принятое ограничение записывается в Evidence.
@@ -62,4 +79,5 @@
- что изменено;
- какие проверки выполнены;
- fidelity evidence для поведения 3.3.5a;
- оставшиеся риски или следующий незакрытый checklist item.
- оставшиеся риски или следующий незакрытый checklist item;
- какие API/module docs и diagrams созданы или обновлены.
+653 -4
View File
@@ -1,5 +1,11 @@
# Renderer Notes
Воспроизводимый renderer baseline для текущей цели M00, regression manifest, метрики и правила сравнения описаны в [`docs/RENDER_BASELINE.md`](docs/RENDER_BASELINE.md). Baseline фиксирует текущее поведение и известные расхождения, но не заявляет parity с WoW 3.3.5a.
Парные checkpoint PNG можно автоматически проверить через `src/tools/compare_render_checkpoints.gd`; reference-снимки оригинального клиента остаются вне Git, а автоматический tolerance не заменяет human fidelity approval.
Paired run 2026-07-11 подтвердил крупный coordinate/placement gap: некоторые server-derived camera positions оказываются под terrain или внутри WMO/rocks OpenWC. До исправления этого расхождения perceptual metrics измеряют также несовпадение композиции, а не только материалы и свет.
Цель renderer-работы в этом проекте: добиться ощущения производительности оригинального клиента WoW 3.3.5a в Godot, без видимых фризов при переходе ADT -> ADT и без постоянного отката видимых участков к низкому качеству.
Этот документ фиксирует текущее состояние рендера, сделанные оптимизации и практические правила дальнейшей работы.
@@ -19,7 +25,36 @@
## Основные файлы
- `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/render/wmo/wmo_placement_resolver.gd` - value-only WMO path, identity and transform rules.
- `src/render/wmo/wmo_placement_registry.gd` - WMO placement-key to tile/global reference sets; Nodes and render jobs remain in the streamer.
- `src/render/wmo/wmo_render_build_step_planner.gd` - mesh-first lightweight WMO group operation and cursor planning without Nodes or Resources.
- `src/render/wmo/wmo_render_build_queue.gd` / `wmo_render_build_job.gd` - typed pending group jobs, FIFO placement keys and strong root/resource references without engine destruction.
- `src/render/wmo/wmo_render_resource_cache_state.gd` - validated lightweight WMO render Resources, negative cache and pending cache paths without ResourceLoader I/O.
- `src/render/wmo/wmo_render_resource_finalizer.gd` - lightweight WMO terminal polling, script/format validation and Resource/missing publication.
- `src/render/wmo/wmo_scene_resource_finalizer.gd` - cached WMO terminal polling, PackedScene probe validation/lifetime and scene/missing publication.
- `src/render/wmo/wmo_scene_resource_cache_state.gd` - validated cached-WMO PackedScenes, negative cache and pending `.tscn` paths without file/I/O/Node ownership.
- `src/render/liquid/adt_water_load_pipeline_state.gd` - ADT water pending FIFO/dedupe, active task IDs and worker-safe parsed-result mailbox without parser or Node ownership.
- `src/render/liquid/adt_water_scene_finalizer.gd` - stateless main-thread ADT water build/attach and optional persisted Editor ownership through the existing ADTBuilder.
- `src/render/m2/m2_runtime_mesh_rebuild_classifier.gd` - memoized billboard/UV-rotation decision for stale cached M2 runtime mesh refresh.
- `src/render/m2/m2_animated_scene_finalizer.gd` - animated PackedScene candidate ownership, historical material repair and AnimationPlayer validation.
- `src/render/m2/m2_animation_playback_controller.gd` - deterministic per-instance phase, default animation selection and native/imported playback mutation.
- `src/render/m2/m2_animated_instance_materializer.gd` - main-thread animated instance duplication, render settings, playback startup and non-empty batch attachment.
- `src/render/m2/m2_static_batch_materializer.gd` - main-thread static M2 MultiMesh construction, render settings and attachment.
- `src/render/m2/m2_build_queue.gd` / `m2_build_job.gd` - typed pending M2 jobs, FIFO/stale tile keys, grouped-transform references and progress cursors without engine destruction.
- `src/render/m2/m2_build_dispatch_planner.gd` - pure animation/static wait, materialization and missing-model advance decision.
- `src/render/m2/m2_build_resource_snapshot.gd` - typed per-step animated/static resource observations without engine destruction.
- `src/render/m2/m2_static_build_resource_observer.gd` - static Mesh cache lookup, threaded request selection and missing transition.
- `src/render/m2/m2_cached_animation_resource_observer.gd` - cached animated GLB eligibility, threaded request admission and snapshot production.
- `src/render/m2/m2_animation_load_pipeline_state.gd` - animated M2 threaded-load request records and completion-order finalize FIFO without I/O or Node ownership.
- `src/render/m2/m2_animation_resource_finalizer.gd` - cached animated M2 terminal status polling, Resource load, scene finalization and prototype/static-only outcome.
- `src/render/m2/m2_mesh_resource_finalizer.gd` - static M2 terminal status polling, Mesh extraction/preparation and cache/missing outcome.
- `src/render/m2/m2_mesh_load_pipeline_state.gd` - static M2 threaded-load request records, terminal statuses and completion-order finalize FIFO without I/O or Mesh ownership.
- `src/render/m2/m2_mesh_resource_cache_state.gd` - normalized-path prepared static M2 Mesh references with final-shutdown lifetime.
- `src/render/m2/m2_mesh_resource_extractor.gd` - first-Mesh selection from direct/PackedScene/Node inputs with temporary instance cleanup.
- `src/render/m2/m2_runtime_mesh_finalizer.gd` - refresh version, classifier lifetime, M2Builder rebuild and original-Mesh fallback.
- `src/render/m2/m2_prototype_cache_state.gd` - shutdown-lifetime static/animated prototype Nodes and missing/static-only path outcomes.
- `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/m2_builder.gd` - сборка статического M2 mesh/material.
@@ -298,7 +333,7 @@ Native M2 animation first pass for composite doodads:
- `M2NativeAnimator` evaluates the selected Stand sequence and applies WoW-style bone matrices:
`T(pivot + translation) * R * S * T(-pivot) * parent`.
- Vertex influences are resolved through `.skin` local bone indices and the M2 `boneCombos` palette, matching the original section/batch renderer model used by WoW/whoa.
- `StreamingWorldLoader` routes only `gryphonroost` through this native path; simple critters still use the existing GLB allowlist and most M2 world props stay on static MultiMesh.
- `M2NativeAnimationResourceObserver` routes only `gryphonroost` through this native path; simple critters still use the existing GLB allowlist and most M2 world props stay on static MultiMesh.
- Current implementation rebuilds the animated `ArrayMesh` on CPU. This is correct enough for the problematic rare doodads and gives us the same data layout that can later move to shader/GPU skinning.
Причина: композитные doodad вроде `GryphonRoost` снова ломают визуал при GLB-анимации. До M2-native renderer все world placement M2 должны оставаться статическими. GLB-анимация оставлена только как вручную включаемый debug experiment через allowlist.
@@ -387,6 +422,12 @@ Known limits:
- `WMOBuilder` строит group meshes;
- runtime registry дедуплицирует WMO по `unique_id`;
- WMO на границе ADT не дублируются;
- `WmoPlacementRegistry` owns only placement reference sets; the streamer keeps
the parallel key-to-Node map and performs final-release cancellation/free;
- `WmoRenderBuildStepPlanner` selects one mesh or MultiMesh group and its next
cursors; the streamer still materializes Nodes and consumes the frame permit;
- `WmoRenderBuildQueue` owns pending typed jobs/FIFO keys and releases references
on cancel/reset; the streamer still validates and frees engine objects;
- большие WMO не должны инстанцироваться как тяжелые `.tscn` во время движения;
- добавлен lightweight render-cache path для WMO groups;
- `wmo_render_group_ops_per_tick` ограничивает подключение WMO groups по кадрам;
@@ -782,7 +823,12 @@ $exe = Join-Path $env:TEMP 'godot-4.6.1-openwc\Godot_v4.6.1-stable_win64.exe'
- Billboard metadata is resolved per drawn vertex through the skin section bone palette and vertex bone indices. This avoids treating an entire mixed surface as billboard just because the palette contains a billboard bone.
- `M2Builder` stores billboard pivot/mode in `Mesh.ARRAY_CUSTOM0` as RGBA float data. `CUSTOM0.xyz` is the Godot-space bone pivot; `CUSTOM0.w` is the billboard mode: spherical, lock X, lock Y, or lock Z.
- `WowM2Material` applies camera-facing billboarding in the vertex shader for marked vertices. This works with grouped ADT M2 `MultiMesh` batches because the shader uses each instance transform.
- Runtime M2 cache refresh now has `M2_MATERIAL_REFRESH_VERSION`. Old cached `.tscn/.glb` meshes are replaced in memory from raw `.m2` only when the raw model actually needs custom billboard attributes or UV-rotation data. Do not rebuild every stale cached M2 during streaming: creating fresh materials for ordinary props can exhaust the D3D12 resource descriptor heap.
- Runtime M2 cache refresh uses material refresh version `2` (now
`M2RuntimeMeshFinalizer.MATERIAL_REFRESH_VERSION`). Old cached `.tscn/.glb`
meshes are replaced in memory from raw `.m2` only when the raw model actually
needs custom billboard attributes or UV-rotation data. Do not rebuild every
stale cached M2 during streaming: creating fresh materials for ordinary props
can exhaust the D3D12 resource descriptor heap.
- Verified with `ElwynnGrass1.m2`: native data exposes a billboard batch, the built mesh contains `CUSTOM0`, and the M2 shader compiles with the billboard uniform enabled.
- Remaining parity work: many Elwynn tree canopy M2s do not carry billboard bone flags, so their flat-looking leaves are a separate material/geometry parity issue, not this bone-billboard path.
@@ -792,7 +838,8 @@ $exe = Join-Path $env:TEMP 'godot-4.6.1-openwc\Godot_v4.6.1-stable_win64.exe'
- Texture transform dictionaries now expose static UV rotation matrices and approximate Z-rotation speeds, in addition to existing translation, translation speed and scale.
- `WowM2Material` applies UV rotation and scale around WoW's texture center `(0.5, 0.5)`, then applies translation/scroll. This is closer to the client path shown by `CM2Model::AnimateTextureTransformsMT`.
- All four M2 texture stages receive UV rotation and rotation-speed uniforms, matching the existing four-stage texture binding path.
- `M2_MATERIAL_REFRESH_VERSION` and `M2Builder.MATERIAL_FORMAT_VERSION` are bumped to `2`, so cached M2 meshes are rebuilt in memory when raw `.m2` data is available.
- Runtime M2 material refresh and `M2Builder.MATERIAL_FORMAT_VERSION` are `2`,
so stale cached M2 meshes can be rebuilt in memory when raw `.m2` data is available.
- Verified with `Spells/ArcaneForceShield_Blue.m2`: native data exposes a non-identity UV rotation, the built material receives the stage rotation uniform, and the shader compiles.
## 2026-07-08 Renderer Material Regression Smoke
@@ -816,6 +863,608 @@ $exe = Join-Path $env:TEMP 'godot-4.6.1-openwc\Godot_v4.6.1-stable_win64.exe'
- Added `src/tools/capture_render_checkpoints.gd` to load the Eastern Kingdoms streaming scene, move a dedicated camera to fixed regression viewpoints and save PNGs under `user://render_checkpoints`.
- Current checkpoints cover the Elwynn waterfall from front/side and Goldshire Inn/Blacksmith windows. Headless runs are dry-run only because the headless display server cannot produce viewport PNGs.
## 2026-07-13 Renderer Shutdown Ownership
- `StreamingWorldLoader` drains its asynchronous work before teardown, leaves parented streamed nodes to SceneTree ownership, then explicitly frees detached M2/WMO prototype nodes and clears resource caches.
- `ADTBuilder` explicitly frees a temporary `Water` root when an ADT liquid payload produces no child geometry. Dry tiles must not leave empty nodes in ObjectDB.
- `src/tools/verify_render_runtime_cache_shutdown.gd` regression-checks detached prototype and resource-cache release plus empty-liquid-root ownership. The unified render-baseline runner executes it before capture.
- A focused 8-second GUI checkpoint and a seven-checkpoint single-pass GUI run finish without Node, renderer resource or RID leak diagnostics. A timing-dependent anonymous zero-reference `RefCounted` ObjectDB warning can remain at engine teardown; it is tracked separately and is not suppressed.
- This is shutdown-only ownership behavior and does not alter checkpoint rendering, cache formats or the `Blizzlike335` compatibility profile.
## 2026-07-13 Explicit Streaming Focus
- `StreamingWorldLoader` consumes an immutable `StreamingFocus` containing a
typed `GodotWorldPosition`; runtime streaming no longer discovers the active
`Camera3D` from the viewport or child nodes.
- Eastern Kingdoms and Kalimdor runtime scenes explicitly use the player as the
streaming source. Checkpoint capture and terrain/occluder probes explicitly
use their dedicated camera through the same public refresh path.
- The editor viewport camera remains behind a dedicated editor-only adapter.
`camera_path` is retained solely for optional automatic overview positioning.
- Streaming radii, LOD decisions, cache formats and renderer quality profiles
are unchanged by this migration.
## 2026-07-13 Coordinate Conversion Boundary Gate
- Sky/area lookup, streaming tile ownership, player spawn/terrain sampling and
terrain diagnostics now cross world-coordinate spaces through typed
`CoordinateMapper` methods.
- Renderer distance, LOD, ray and model-local M2/WMO calculations remain in
their existing Godot/local spaces; they are not axis conversions.
- The repository gate rejects new manual world-center, WoW/Godot and
Godot-position-to-ADT formulas. The unified renderer baseline runs this gate.
- Native ADT/WDT parsers keep one shared world conversion in
`wow_chunk_reader.h`; the independent M00 calibration formula remains a test oracle.
- Coordinate contract version 2, renderer radii, cache formats and visual
quality profiles are unchanged.
## 2026-07-13 Golden Server Spawn Renderer Evidence
- The pinned AzerothCore Human Warrior start at server position
`(-8949.95, -132.493, 83.5312)` maps through `CoordinateMapper` to Godot
`(17199.159666667, 83.5312, 26016.616666667)`, ADT `(32,48)` and MCNK `(3,12)`.
- `server_spawn_render_manifest.json` drives the ordinary Eastern Kingdoms
checkpoint capture pipeline at that location; no live database or production
spawn entity is introduced.
- A renderer-native emissive marker starts at the exact mapped origin and keeps
depth testing enabled so GUI evidence exposes its relationship to terrain.
- `verify_server_spawn_renderer.gd` rejects drift between the pinned fixture,
manifest target/player coordinates and expected ADT ownership. The unified
renderer baseline runs this contract check before capture.
- This closes a coordinate/renderer integration criterion only. It does not
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 M2 Placement Grouper Extraction
- `M2PlacementGrouper` now owns pure worker-side validation, historical path
normalization and ordered tile-local transform grouping of ADT M2 placements.
- Invalid records, backslash replacement, lowercase `.mdx/.mdl` conversion,
first-seen ordering and the `0.0001` scale clamp are unchanged.
- The loader retains tasks, mutex/result queues, stale-result checks, tile/build
state, caches and all Node/MultiMesh/Mesh/material/RID finalization.
- Cache formats, batching, profiles and visible rules are unchanged. Asset-backed
traversal p95/p99, visual recheck and spatial-cell grouping remain pending.
## 2026-07-17 M2 Build Batch Planner Extraction
- `M2BuildBatchPlanner` now owns pure static/animated batch-limit selection,
remaining-count capping and next-offset/group-completion calculation.
- Existing animated/static limits still clamp to at least one; resource readiness,
queue rotation, serial progression and `M2_BUILD` permit consumption are unchanged.
- `M2BuildQueue` now retains typed pending jobs, FIFO/stale keys and cursors.
The loader retains tile cancellation, resource readiness/retries and all
Node/MultiMesh/Mesh/material/RID finalization.
- Cache formats, quality profiles, batching output and visible rules are unchanged.
Asset-backed p95/p99 and spatial-cell batching evidence remain pending.
## 2026-07-18 M2 Build Dispatch Planner Extraction
- `M2BuildDispatchPlanner` now owns the pure action priority between pending
animation, animated materialization, pending/ready static Mesh and terminally
missing-model advancement.
- Pending animation still wins before batch planning. Unresolved static Meshes
still rotate and consume one `M2_BUILD` permit without advancing progress.
- Empty batches advance without serial change; animated, static and terminally
missing positive batches retain the historical serial increment.
- Resource lookup/request order, queue/cursor adoption, materialization, permits,
Node lifetime, cache formats, profiles and visible rules remain unchanged.
## 2026-07-18 M2 Build Resource Snapshot Extraction
- `M2BuildResourceSnapshot` now carries one build-step normalized path, optional
animated prototype, pending-animation state, optional static Mesh and terminal
missing-model state through typed accessors.
- Animation observation is captured first. Static observation is adopted only
for a positive non-animated batch after animation is no longer pending.
- The dispatch planner consumes the snapshot; the loader borrows the selected
prototype/Mesh for the existing materializer calls.
- ResourceLoader/cache requests, permit/cursor transitions, engine lifetime,
cache formats, profiles and visible rules remain unchanged.
## 2026-07-18 M2 Static Build Resource Observer Extraction
- `M2StaticBuildResourceObserver` now owns prepared-Mesh lookup, existing-request
detection, `.tscn`-before-`.glb` candidate selection, pivot-prefix GLB rejection,
threaded request admission and terminal missing transition for build jobs.
- The observer fills `M2BuildResourceSnapshot`; the loader retains animation
observation, finalize drains, materialization, permits and engine lifetime.
- Candidate order, request errors, cache formats, profiles and visuals are unchanged.
## 2026-07-17 M2 Runtime Mesh Rebuild Classifier Extraction
- `M2RuntimeMeshRebuildClassifier` now owns the memoized decision used when a
stale cached M2 mesh may need an in-memory rebuild from raw data.
- Existing triggers are unchanged: any billboard flag/positive billboard vertex
count, or a referenced non-identity UV rotation/absolute rotation speed above
`0.000001` across at most four texture stages.
- Invalid batch variants and combo/transform indices remain skipped. The first
decision for a normalized path remains cached until the same two historical
map/shutdown clear sites.
- `StreamingWorldLoader` still requests raw M2 data and owns ResourceLoader,
returned-Mesh adoption and finalization budgets. Refresh-version checks,
M2Builder rebuild and fallback now belong to `M2RuntimeMeshFinalizer`.
- No cache version, shader, material, geometry or visible rule changed. Synthetic
predicate timing is not asset-backed descriptor-pressure/p95/p99 evidence.
## 2026-07-17 M2 Mesh Load Pipeline State Extraction
- `M2MeshLoadPipelineState` now owns static M2 successful threaded-load request
records and the FIFO populated when ResourceLoader polling reaches loaded or
failed terminal status.
- Pending polling snapshots preserve Dictionary insertion order; terminal FIFO
order follows completion transition order. Existing `m2_mesh` metrics still
count pending plus finalize records at all three sites.
- Shutdown still drains every pending ResourceLoader path before state clear;
map reset and shutdown retain the same two clear sites.
- `StreamingWorldLoader` still selects `.tscn`/`.glb` paths, excludes animated
pivot-prefix GLBs, performs all ResourceLoader calls, consumes
`M2_MESH_FINALIZE`, extracts/prepares Meshes and updates Mesh/missing caches.
- Cache formats, material refresh, profiles and visible output are unchanged.
Synthetic state timing is not asset-backed I/O, leak or p95/p99 evidence.
## 2026-07-17 M2 Animation Load Pipeline State Extraction
- `M2AnimationLoadPipelineState` now owns animated M2 successful threaded-load
request records and the FIFO populated at loaded/failed terminal transitions.
- Pending snapshots preserve insertion order, while finalization follows completion
order. All three historical `m2_animation` metrics still count both stages.
- Shutdown still drains pending ResourceLoader paths before clear; map reset and
shutdown preserve the same two clear sites.
- At this extraction stage, `StreamingWorldLoader` retained GLB eligibility/cache selection, every
ResourceLoader call, `M2_ANIMATION_FINALIZE` permits, scene instantiation,
material repair and prototype/static-fallback decisions.
- Cache formats, animation behavior and visible output are unchanged. Synthetic
timing is not asset-backed I/O, leak, animation-fidelity or p95/p99 evidence.
## 2026-07-18 M2 Cached Animation Resource Observer Extraction
- `M2CachedAnimationResourceObserver` now owns cached animated-prototype lookup,
allow/deny matching, historical `.glb` candidate selection, GLB animation/
primitive/schema safety validation, request admission and static-only fallback.
- The observer produces `M2BuildResourceSnapshot` with the exact borrowed cached
prototype or pending state and retains/frees no engine object.
- Native GryphonRoost raw-data build/debug logging belongs to the sibling native
observer; terminal polling, finalization, permits and SceneTree mutation remain
loader-owned.
- Defaults, path order, accepted empty/`pivot_prefix_v1` schemas, cache format,
metrics and visible behavior are unchanged. Generated GLB metadata fixtures
are not private asset, leak, p95/p99 or original-client animation evidence.
## 2026-07-18 M2 Animation Resource Finalizer Extraction
- `M2AnimationResourceFinalizer` now owns cached animated M2 terminal status
polling, completion-FIFO pops, terminal Resource retrieval, candidate
instantiation, repair/validation, prototype/static-only adoption and success log.
- The two-phase preparation/completion API preserves the prior ordering: the
loader resolves a material prototype only after a loaded PackedScene produces
a detached Node3D candidate. One scheduler permit still pops one record.
- `StreamingWorldLoader` retains the `M2_ANIMATION_FINALIZE` permit loop,
material-prototype lookup, build dispatch, materialization and SceneTree lifetime.
- No request order, status rule, cache format, profile or visible behavior changed.
Synthetic fixtures are not asset-backed animation/leak/p95/p99 evidence.
## 2026-07-18 M2 Mesh Resource Finalizer Extraction
- `M2MeshResourceFinalizer` now owns static M2 terminal status polling,
completion-FIFO pops, terminal Resource retrieval, first-Mesh extraction,
stale/current runtime preparation and Mesh/missing cache adoption.
- Pending paths are still polled in insertion order. One
`M2_MESH_FINALIZE` permit still pops at most one terminal record; cached Mesh
outcomes skip terminal retrieval exactly as before.
- Current Meshes retain exact identity and skip raw reads. Stale Meshes still
request raw data only when `M2RuntimeMeshFinalizer` requires it, preserving
refresh-version, rebuild and original-Mesh fallback rules.
- `StreamingWorldLoader` retains request admission, scheduler permits,
composition, static materialization and shutdown drain ordering. Cache paths,
profiles and visible behavior are unchanged; synthetic fixtures are not
asset-backed visual/leak/p95/p99 evidence.
## 2026-07-18 M2 Native Animation Resource Observer Extraction
- `M2NativeAnimationResourceObserver` now owns the exact case-insensitive
`gryphonroost` candidate rule, animated prototype/static-only cache checks,
synchronous raw animated read, native builder call, adoption and success log.
- The native attempt remains first. Empty raw data/surfaces and null/childless
builds retain the same static-only fallback; accepted Nodes remain owned by
`M2PrototypeCacheState` until final shutdown.
- `StreamingWorldLoader` retains observer order, typed snapshot construction,
cached-GLB fallback, terminal ResourceLoader polling/finalize, permits,
materialization and SceneTree lifetime.
- The historical unfreed childless builder result is deliberately preserved and
documented as a leak risk. No parser, cache, profile or visible rule changed;
synthetic fixtures are not asset-backed animation or performance evidence.
## 2026-07-18 M2 Animated Scene Finalizer Extraction
- `M2AnimatedSceneFinalizer` now owns terminal animated PackedScene candidate
instantiation, depth-first Mesh/AnimationPlayer traversal, static-prototype
material override mapping and rejected detached-root destruction.
- Material repair retains source/target depth-first ordering, source-index clamp,
per-surface override priority and first discovered material fallback.
- A candidate still requires at least one AnimationPlayer. Accepted exact Node3D
and player count return to the loader; invalid candidates are freed, including
the previously unhandled non-Node3D imported-root case.
- `StreamingWorldLoader` retains ResourceLoader I/O/statuses, finalize permits,
material-prototype selection/loading, prototype adoption/static fallback,
animation playback policy and diagnostic logging.
- Cache formats, profiles and visible rules are unchanged. Synthetic scene and
material fixtures are not asset-backed animation-fidelity or p95/p99 evidence.
## 2026-07-18 M2 Animation Playback Controller Extraction
- `M2AnimationPlaybackController` now owns the stable path/index phase formula,
ordinary/fish/bird animation-name priority, substring/first-name fallbacks and
AnimationPlayer linear-loop/play/seek mutation.
- Exact-script native animators retain depth-first pairing, the same five copied
fields, optional `prepare_runtime`, phase assignment and debug-state sampling.
- Native debug records are detached and sampled only when `debug_streaming` is
enabled; `StreamingWorldLoader` retains path normalization and exact log text.
- Loader still duplicates/transforms/attaches instances, applies visibility,
shadows and Editor ownership, owns build cursors/permits and obtains player inventory.
- Cache formats, playback priorities, phase behavior and visible rules are unchanged.
Synthetic timing is not asset-backed animation fidelity or p95/p99 evidence.
## 2026-07-17 M2 Mesh Resource Cache State Extraction
- `M2MeshResourceCacheState` now owns normalized-path references to prepared
static M2 Mesh resources. Lookup returns the exact retained reference and a
later store for one path keeps the historical replacement behavior.
- The cache retains map-refresh lifetime and clears only at the existing final
runtime-cache shutdown site after asynchronous work is drained.
- `StreamingWorldLoader` still owns normalization, `.tscn`/`.glb` selection,
ResourceLoader I/O, Mesh extraction, material refresh/rebuild, cache adoption
decisions, permits and MultiMesh materialization. Prototype/negative state is
now a sibling cache service.
- Cache formats, refresh metadata, profiles and visible output are unchanged.
Synthetic cache timing is not asset-backed memory/leak or p95/p99 evidence.
## 2026-07-17 M2 Mesh Resource Extractor
- `M2MeshResourceExtractor` now selects the first Mesh from direct Mesh
Resources, temporary PackedScene instances and existing prototype/rebuild
Node subtrees using the prior depth-first child order.
- PackedScene extraction still instantiates exactly once and synchronously frees
the temporary root before returning the borrowed Mesh reference.
- `StreamingWorldLoader` still owns ResourceLoader I/O and raw M2 consumers,
material refresh/rebuild, cache/missing adoption, permits and MultiMesh builds.
- Cache formats, traversal rules, profiles and visible output are unchanged.
Synthetic traversal timing is not asset-backed leak or p95/p99 evidence.
## 2026-07-17 M2 Runtime Mesh Finalizer
- `M2RuntimeMeshFinalizer` now owns material refresh version `2`, stale-Mesh
rebuild classification, M2Builder rebuild and original-Mesh fallback.
- Current Meshes still skip raw `.m2` loading. `M2RawModelRepository` owns
FileAccess/ClassDB M2Loader I/O and supplies raw data through
`M2MeshResourceFinalizer` only when the runtime finalizer reports a stale Mesh;
both historical clear sites persist.
- Billboard/UV-rotation predicates, rebuild extraction, metadata key and failure
fallback are unchanged. Mesh resource finalization owns cache adoption;
permits and MultiMesh materialization remain loader-owned, while negative
outcomes belong to prototype state.
- Synthetic triangle rebuild/fallback timing is not asset-backed material,
descriptor-pressure/leak or p95/p99 evidence.
## 2026-07-17 M2 Raw Model Repository
- `M2RawModelRepository` now owns the repeated extracted-file and optional
native `M2Loader` boundary for static `load_m2` and animated
`load_m2_animated` raw Dictionaries.
- `StreamingWorldLoader` delegates stale-Mesh refresh and static reads directly;
`M2NativeAnimationResourceObserver` delegates native animated reads. The loader
retains normalization, `.tscn/.glb` fallback order, permits and Node/Mesh use;
prototype/negative state is isolated in `M2PrototypeCacheState`.
- The repository retains no path, native object or parsed data. Empty paths,
absent files/classes/methods and invalid results produce the same empty-value
fallback contract; path join/globalization and native method names are exact.
- No cache format, parser, material, geometry, animation or visible rule changed.
Synthetic missing-input timing is not asset-backed I/O/p95/p99 or fidelity evidence.
## 2026-07-17 M2 Prototype Cache State
- `M2PrototypeCacheState` now owns the exact static and animated prototype Node
references plus missing-model and static-animation negative path outcomes.
- Sync static, native animated, threaded GLB animation, Mesh finalize and
material-prototype paths delegate lookup/adoption/negative transitions to the
service. First valid prototype remains canonical for each normalized path.
- Map refresh still retains all four states. Final shutdown still occurs after
asynchronous drain and now calls one idempotent release operation that frees
detached prototypes, queues defensive in-tree Nodes and clears path outcomes.
- `StreamingWorldLoader` retains normalization, ResourceLoader/native I/O,
builders, animation policy, fallback order, permits and materialization.
- No cache format, visible rule or profile changed. Synthetic ownership/timing
evidence is not an asset-backed traversal/leak/p95/p99 or fidelity claim.
## 2026-07-17 WMO Placement Resolver Extraction
- `WmoPlacementResolver` now owns lowercase/slash cache-key normalization,
positive MODF `uid:<decimal>` identity with the legacy tile/index fallback and
world `Transform3D` composition.
- Lightweight render roots, cached scenes and live prototypes now share the same
position/Euler/unclamped-scale formula.
- The loader retains registry refs, jobs/queues, cache/load state, resource
fallback, cancellation and all Node/Mesh/MultiMesh/material/RID ownership.
- Cache formats, placement values, profiles and visible rules are unchanged.
Asset-backed placement/p95/p99 and general WMO parity remain pending.
## 2026-07-17 WMO Render Resource Cache State Extraction
- `WmoRenderResourceCacheState` now owns validated lightweight-WMO render
Resources, negative entries and normalized-path to pending-cache-path records.
- `StreamingWorldLoader` still constructs cache paths and starts requests.
`WmoRenderResourceFinalizer` polls terminal requests and validates exact
`WMOStreamingResource` script identity plus `FORMAT_VERSION` before completing
cache state.
- Map reset and orderly request draining clear pending/negative state while
retaining accepted Resources; final runtime cache release clears all state.
- Missing render-cache files still are not negatively cached, preserving retry
and cached-scene/live fallback behavior. Formats, profiles and visuals are unchanged.
- Asset-backed corrupt-cache, traversal/leak p95/p99 and paired fidelity evidence
remain pending.
## 2026-07-18 WMO Render Resource Finalizer Extraction
- `WmoRenderResourceFinalizer` now owns lightweight WMO render-cache terminal
status polling, loaded Resource retrieval, exact script/current-format
validation and Resource/missing publication.
- Detached pending snapshots retain Dictionary insertion order. Non-terminal
requests remain pending; failed, null, wrong-script and stale-format outcomes
retain the historical negative-cache transition.
- Accepted current-or-newer Resources keep exact identity. Loader retains cache
path selection, request admission, fallback/build orchestration, Node lifetime
and shutdown drain order.
- Cache format, profiles and visible output are unchanged. Synthetic fixtures
are not serialized private assets, leak, p95/p99 or visual-fidelity evidence.
## 2026-07-17 WMO Scene Resource Cache State Extraction
- `WmoSceneResourceCacheState` now owns validated cached-WMO PackedScenes,
negative entries and normalized-path to pending-`.tscn` records.
- `StreamingWorldLoader` still checks file existence and
`wmo_max_runtime_scene_mb` and starts requests. `WmoSceneResourceFinalizer`
owns terminal ResourceLoader I/O, validation-probe instantiation, WMOBuilder
metadata validation and probe release before adoption.
- Missing files, oversize scenes, request errors, load failures and stale scenes
retain their prior negative-cache and live-prototype fallback behavior.
- Map reset clears pending/negative state while retaining accepted scenes; final
shutdown releases all scene state. Formats, profiles and visuals are unchanged.
- Asset-backed oversize/stale fixtures, traversal/leak p95/p99 and paired fidelity
evidence remain pending.
## 2026-07-18 WMO Scene Resource Finalizer Extraction
- `WmoSceneResourceFinalizer` now owns cached WMO `.tscn` terminal status
polling, loaded Resource/PackedScene validation, call-local probe lifetime and
exact scene/missing publication.
- Pending snapshots preserve Dictionary insertion order. Non-terminal requests
remain pending; failed, null, wrong-type, wrong-root and stale outcomes keep
the existing negative-cache transition.
- Current scenes retain exact PackedScene identity. Accepted and rejected probes
are freed before return; the rejected non-Node3D root now also releases its
temporary Node, closing a leak without changing fallback or visible output.
- Loader retains file/size admission, oversize log, request start, live fallback,
placed Node materialization and shutdown order. Synthetic fixtures are not
serialized private assets, long leak, p95/p99 or visual-fidelity evidence.
## 2026-07-17 ADT Water Load Pipeline State Extraction
- `AdtWaterLoadPipelineState` now owns ADT water pending FIFO/deduplication,
active WorkerThreadPool task IDs and the mutex-protected parsed-result mailbox.
- `StreamingWorldLoader` still selects concurrency, starts/waits tasks, invokes
`ADTLoader`, consumes `WATER_FINALIZE` permits, rejects stale tile/path/root
results and owns `water_loaded` timing. Main-thread Water subtree construction
and attachment are delegated separately as described below.
- Tile release still cancels only pending water requests; active work completes
and its result is discarded when tile ownership is stale. Shutdown waits task
IDs before clearing state; reset does not interrupt workers.
- Pending-plus-active `water` metrics, parsing, formats, materials, profiles and
visible behavior are unchanged.
- Asset-backed MH2O/MCLQ fidelity, long-traversal leak/p95/p99 and paired capture
evidence remain pending.
## 2026-07-17 ADT Water Scene Finalizer Extraction
- `AdtWaterSceneFinalizer` now owns the two main-thread operations that turn
validated parsed ADT data into a Water subtree: the existing
`ADTBuilder.build_tile_water_scene` call and attachment to the tile root.
- Both raw tile finalization and delayed cached-tile water results use the same
service. Optional persisted Editor ownership is assigned recursively only
when the loader supplies its existing edited-scene owner.
- The service is stateless and retains no Node, Mesh, material or RID. The tile
SceneTree subtree remains the lifetime owner; dry data still causes ADTBuilder
to free its temporary empty Water root.
- Parsing, task/result state, concurrency, stale validation, `WATER_FINALIZE`
permits, `enable_water` and `water_loaded` timing remain loader-owned.
- Geometry, materials, coordinates, cache formats, profiles and visible output
are unchanged. Synthetic geometry/ownership evidence is not an MH2O/MCLQ or
original-client parity claim; asset-backed traversal/p95/p99 remains pending.
## 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.
## 2026-07-18 WMO Runtime Mesh Finalizer Extraction
- `WmoRuntimeMeshFinalizer` now owns cached WMO Mesh material refresh version
`10`, in-place ArrayMesh surface iteration and WMOBuilder material-definition
reconstruction.
- `StreamingWorldLoader` retains cached-scene traversal, lightweight build-job
traversal, Node/MultiMesh attachment, permits and lifetime, and delegates each
borrowed Mesh to the service.
- The historical metadata keys, compact texture0/texture1/texture2 ordering,
flags/shader/blend values, cached shader colors and exact Mesh identity are
unchanged. Null/unmarked surfaces and null builder results retain their prior
Material.
- Asset-free verification covers `27` identity/version/type/material/source
cases and 1,000 current-Mesh calls. This is orchestration extraction, not new
build-12340 material or visual parity evidence.
## 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.
+4 -1
View File
@@ -788,7 +788,10 @@ static func _build_tile_water_root(data: Dictionary, origin_offset: Vector3) ->
mi.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF
root.add_child(mi)
return root if root.get_child_count() > 0 else null
if root.get_child_count() > 0:
return root
root.free()
return null
static func _append_liquid_geometry(
+14
View File
@@ -0,0 +1,14 @@
# OpenWC Coordination
Основные правила находятся в [`../docs/TEAM_WORKFLOW.md`](../docs/TEAM_WORKFLOW.md).
Предпочтительно вести claims в issue и draft PR/MR общего Git forge. Каталог `claims/` — fallback, если issue tracker недоступен. Один claim — один файл; не использовать общий изменяемый board.
## Создание fallback claim
1. Скопировать [`TASK_TEMPLATE.md`](TASK_TEMPLATE.md) в `claims/<work-package-id>.md`.
2. Заполнить owner, lease, paths, contracts и tests.
3. Опубликовать claim до production edits.
4. После интеграции заменить состояние на `accepted` или удалить claim отдельным coordination commit, сохранив историю в Git.
Claim-файлы не заменяют target Evidence и не меняют milestone status.
+74
View File
@@ -0,0 +1,74 @@
# <WORK-PACKAGE-ID> — <Title>
<!-- OPENWC_CLAIM:<WORK-PACKAGE-ID>:<AGENT-ID>:<YYYY-MM-DD> -->
## Ownership
- Target:
- Program:
- Owner/Agent ID:
- Branch:
- Lease expires UTC:
- Integrator:
## Outcome
## Non-goals
## Paths
- Exclusive:
- Shared/hotspots:
- Generated/ignored:
## Contracts and data
- Public API/events:
- Schema/format version:
- Migration/compatibility:
- Consumers:
## Dependencies
- Requires:
- Blocks:
- External state:
## Verification
- Commands:
- Fixtures:
- Fidelity evidence:
- Performance budget:
## Documentation deliverables
- Inline public API docs:
- Module specification:
- Data-flow diagram:
- Sequence/state/dependency diagrams:
- Source map/status updates:
## Simplicity and naming
- Important names introduced:
- Simplest considered solution:
- Rejected complexity/abstractions:
- Unavoidable complexity and justification:
- Measured optimization evidence:
## Status
- State: claimed
- Done:
- Next:
- Blocked by:
## Handoff
- Commit:
- Results:
- Remaining risks:
- Documentation updated:
@@ -0,0 +1,79 @@
# M00-QAR-ANIMATION-SKY-EVIDENCE-001 — Animation and sky evidence
<!-- OPENWC_CLAIM:M00-QAR-ANIMATION-SKY-EVIDENCE-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-ANIMATION-SKY-EVIDENCE-001:d1df794 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-animation-sky-evidence`
- Lease expires UTC: 2026-07-15
- Integrator: milestone integrator
## Outcome
Add private build 12340 evidence for the remaining sky-transition and native animated-M2 coverage, rerun all paired comparisons, and hand the resulting audit to the milestone integrator.
## Non-goals
- Committing proprietary screenshots or extracted assets.
- Claiming renderer parity from mismatched world placement or animation phase.
- Marking M00 DONE; only the milestone integrator may change target status or Evidence.
## Paths
- Exclusive: this claim and animation/sky evidence documentation
- Shared/hotspots: `docs/M00_FINAL_PAIRED_EVIDENCE.md`, `docs/modules/world-renderer.md`
- Generated/ignored: normalized private references under `sources/OpenWCReferenceCheckpoints`; captures and reports under `user://`
## Contracts and data
- Public API/events: unchanged
- Schema/format version: unchanged
- Migration/compatibility: existing five-reference comparison remains valid
- Consumers: M00 milestone integrator
## Dependencies
- Requires: user-captured build 12340 screenshots at 19:00 and two real `GryphonRoost01` animation phases
- Blocks: final integrator decision on M00 completion
- External state: private screenshots remain outside Git
## Verification
- Commands: private-reference preparation, full baseline runner, comparator self-test, coordination and documentation gates
- Fixtures: seven private build 12340 checkpoint references plus a second animation-phase provenance frame
- Fidelity evidence: sky-transition screenshot and observed wing pose change over three seconds
- Performance budget: existing M00 capture budgets
## Documentation deliverables
- Inline public API docs: unchanged
- Module specification: paired coverage and remaining limitations
- Data-flow diagram: unchanged
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: final paired evidence audit
## Simplicity and naming
- Important names introduced: none
- Simplest considered solution: normalize private captures outside Git and reuse the existing comparator
- Rejected complexity/abstractions: adding a video comparator or committing an asset corpus
- Unavoidable complexity and justification: animation phase and synthetic placement require human evidence classification alongside pixel metrics
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: exact-size private references registered; real ADT placement verified; canonical and visual captures completed; fourteen comparisons audited
- Next: milestone integrator reviews synthetic/real placement classification and GUI RID risk
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: `compared=14`, `failed=14`, `missing=0`; mean error `0.066893..0.176955`; original-client Gryphon wing phase changed over three seconds
- Remaining risks: synthetic probe placement differs from the original-client world placement; GUI RID/resource diagnostics remain separate
- Documentation updated: `docs/M00_FINAL_PAIRED_EVIDENCE.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-CAMERA-FRAMING-REFINEMENT-001 — Goldshire pitch/FOV refinement
<!-- OPENWC_CLAIM:M00-QAR-CAMERA-FRAMING-REFINEMENT-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-CAMERA-FRAMING-REFINEMENT-001:3172f41 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-camera-framing-refinement`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Jointly refine Goldshire checkpoint pitch and FOV against a WMO-ready build 12340 reference.
## Non-goals
- Changing runtime player camera defaults.
- Changing manifest values without an interior optimum and human approval.
- Optimizing yaw beyond the ready-scene coarse result.
## Paths
- Exclusive: joint FOV option in camera-pose sweep and framing evidence
- Shared/hotspots: camera-pose operational documentation and renderer module findings
- Generated/ignored: candidate PNGs and ranking JSON under `user://`
## Contracts and data
- Public API/events: additive `-CameraFovValues`; scalar `-CameraFov` remains compatible
- Schema/format version: ranking schema remains version 1 with existing per-candidate FOV field
- Migration/compatibility: scalar sweeps retain existing candidate paths
- Consumers: M00 fidelity workflow
## Dependencies
- Requires: WMO-ready 8-second capture contract
- Blocks: Goldshire manifest framing decision
- External state: private build 12340 reference remains outside Git
## Verification
- Commands: joint-grid plan regression, real ready-scene sweep, comparator self-test, repository gates
- Fixtures: private Goldshire Inn reference
- Fidelity evidence: joint pitch/FOV ranking and human inspection
- Performance budget: offline diagnostic
## Documentation deliverables
- Inline public API docs: PowerShell parameter
- Module specification: framing finding
- Data-flow diagram: FOV joins pose grid
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: operational guide
## Simplicity and naming
- Important names introduced: `CameraFovValues`, `effectiveCameraFovValues`
- Simplest considered solution: one additional loop around the existing grid
- Rejected complexity/abstractions: generic optimizer
- Unavoidable complexity and justification: projection and pitch jointly affect framing
- Measured optimization evidence: bounded 1x5x3 grid
## Status
- State: ready-for-review
- Done: additive joint FOV grid, compatibility-preserving paths, plan regression, ready-scene 15-candidate ranking and human inspection
- Next: add approved landmark/region scoring before any manifest camera calibration
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: numeric best FOV 62/yaw 10/pitch -25 at mean 0.078843 and ratio 0.667721 was visually rejected as grass-dominated; FOV 38/yaw 10/pitch -10 better matched building scale at mean 0.084220
- Remaining risks: full-frame metric does not preserve landmark framing; no manifest values were changed
- Documentation updated: `docs/CAMERA_POSE_SWEEP.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-CAMERA-OCCLUDERS-001 — Camera occluder diagnostic
<!-- OPENWC_CLAIM:M00-QAR-CAMERA-OCCLUDERS-001:sindo-main-codex:2026-07-13 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-CAMERA-OCCLUDERS-001:9d34a47 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-camera-occluders`
- Lease expires UTC: 2026-07-13
- Integrator: milestone integrator
## Outcome
Report scene-tree M2/WMO geometry that contains calibrated cameras or intersects each camera-to-target segment.
## Non-goals
- Changing placements, cameras, FOV, culling, or renderer behavior.
- Claiming full coverage of RenderingServer RID-only instances.
- Implementing a production visibility or collision service.
## Paths
- Exclusive: `src/tools/probe_render_camera_occluders.gd`
- Shared/hotspots: renderer baseline documentation
- Generated/ignored: local JSON probe reports
## Contracts and data
- Public API/events: headless diagnostic CLI only
- Schema/format version: report schema 1
- Migration/compatibility: none
- Consumers: M00 fidelity workflow
## Dependencies
- Requires: calibrated five-point manifest and streaming scene
- Blocks: placement versus camera-composition classification
- External state: local extracted/cache data
## Verification
- Commands: camera occluder probe, coordination and documentation gates
- Fixtures: five calibrated camera/target segments
- Fidelity evidence: scene-tree bounds at paired build 12340 viewpoints
- Performance budget: offline diagnostic
## Documentation deliverables
- Inline public API docs: probe header and output fields
- Module specification: verification/source map
- Data-flow diagram: occluder probe flow
- Sequence/state/dependency diagrams: synchronous diagnostic; not applicable
- Source map/status updates: baseline findings
## Simplicity and naming
- Important names introduced: `camera_containing_geometry`, `segment_intersecting_geometry`
- Simplest considered solution: transformed published AABBs
- Rejected complexity/abstractions: GPU visibility readback or new BVH
- Unavoidable complexity and justification: RID-only geometry cannot be named by this probe
- Measured optimization evidence: not applicable
## Status
- State: ready
- Done: five-point scene-tree AABB probe, containment/intersection classification and documentation
- Next: integrator review; calibrate reproducible reference camera direction/FOV separately
- Blocked by:
## Handoff
- Commit: branch HEAD
- Results: zero containing geometry at all five cameras; expected WMO/liquid target intersections; ADT/dense segments unobstructed
- Remaining risks: RID-only instances are excluded; manual reference direction and FOV were not recorded exactly
- Documentation updated: `docs/RENDER_BASELINE.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-CAMERA-POSE-EVIDENCE-001 — Goldshire camera pose evidence
<!-- OPENWC_CLAIM:M00-QAR-CAMERA-POSE-EVIDENCE-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-CAMERA-POSE-EVIDENCE-001:eca76c5 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-camera-pose-evidence`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Produce coarse-to-fine yaw/pitch evidence for the build 12340 Goldshire Inn reference and classify whether framing dominates the paired-image gap.
## Non-goals
- Changing manifest camera defaults before human approval.
- Treating minimum perceptual error as proof of exact camera parity.
- Committing proprietary reference images or generated candidates.
## Paths
- Exclusive: camera-pose evidence record
- Shared/hotspots: renderer baseline and module fidelity findings
- Generated/ignored: all sweep PNGs and JSON under `user://`
## Contracts and data
- Public API/events: none
- Schema/format version: unchanged
- Migration/compatibility: none
- Consumers: M00 fidelity review
## Dependencies
- Requires: merged camera-pose sweep and local build 12340 reference
- Blocks: classification of the Goldshire WMO paired gap
- External state: `sources/OpenWCReferenceCheckpoints/goldshire_inn_large_wmo.jpg`
## Verification
- Commands: coarse and fine real sweeps, ranking inspection, repository gates
- Fixtures: private Goldshire Inn build 12340 screenshot
- Fidelity evidence: ranked mean perceptual error and changed-pixel ratio
- Performance budget: offline diagnostic only
## Documentation deliverables
- Inline public API docs: unchanged
- Module specification: fidelity finding and remaining risk
- Data-flow diagram: unchanged
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: baseline evidence
## Simplicity and naming
- Important names introduced: none
- Simplest considered solution: use the merged bounded grid runner
- Rejected complexity/abstractions: optimizer or renderer changes
- Unavoidable complexity and justification: real images must be rendered for each candidate
- Measured optimization evidence: single pass per candidate
## Status
- State: ready-for-review
- Done: private reference dimensions verified; coarse, extended and limit sweeps completed; representative candidates inspected; runner failure handling hardened
- Next: investigate Goldshire Inn spatial/placement composition separately; do not change manifest yaw/pitch from this metric
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: zero offset mean error 0.099632; coarse best (-10,-20) 0.077575; metric decreased monotonically to (0,-60) 0.063574/changed ratio 0.549556, while visual inspection showed only grass and no inn
- Remaining risks: full-frame color error cannot register a missing landmark; WMO placement/streaming at this checkpoint remains unresolved
- Documentation updated: `docs/CAMERA_POSE_SWEEP.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-CAMERA-POSE-SWEEP-001 — Empirical camera pose sweep
<!-- OPENWC_CLAIM:M00-QAR-CAMERA-POSE-SWEEP-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-CAMERA-POSE-SWEEP-001:657a1d8 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-camera-pose-sweep`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Recover reproducible checkpoint framing by sweeping bounded yaw/pitch offsets and ranking paired-image error.
## Non-goals
- Changing runtime player camera defaults.
- Claiming an exact original-client camera pose from perceptual score alone.
- Adding computer-vision registration or image warping.
## Paths
- Exclusive: camera-pose CLI and sweep orchestration
- Shared/hotspots: renderer baseline documentation
- Generated/ignored: local candidate PNGs and JSON reports
## Contracts and data
- Public API/events: additive camera yaw/pitch offset and single-pass capture options; new PowerShell sweep command
- Schema/format version: capture report schema remains version 1 with additive camera-offset fields
- Migration/compatibility: existing capture commands retain zero offsets and two passes
- Consumers: M00 paired-fidelity workflow
## Dependencies
- Requires: build 12340 reference image, capture tool, paired-image comparator
- Blocks: reproducible manual-reference framing
- External state: original screenshots remain outside Git
## Verification
- Commands: capture dry-run offset regression, comparator self-test, bounded local sweep when a display/reference is available, repository gates
- Fixtures: one named M00 checkpoint
- Fidelity evidence: ranked yaw/pitch candidates with explicit human-approval requirement
- Performance budget: offline diagnostic; single-pass mode avoids redundant warm capture
## Documentation deliverables
- Inline public API docs: capture and sweep usage
- Module specification: camera-pose data flow, verification and source map
- Data-flow diagram: updated pose-sweep flow
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: baseline workflow and findings
## Simplicity and naming
- Important names introduced: `camera_yaw_offset_degrees`, `camera_pitch_offset_degrees`, `single_pass`
- Simplest considered solution: bounded grid over existing capture/comparator tools
- Rejected complexity/abstractions: feature matching, optimizer framework, image transforms
- Unavoidable complexity and justification: original-client camera angles are not exposed by tested APIs
- Measured optimization evidence: single-pass mode halves captures per candidate
## Status
- State: ready-for-review
- Done: additive capture offsets, single-pass calibration mode, bounded grid runner, ranked JSON contract, grid-plan regression and documentation
- Next: run a coarse-to-fine real sweep with the private build 12340 reference directory, then obtain human framing approval
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: dry-run reported yaw 12.50/pitch -7.50; comparator self-test passed; a 3x2 plan produced six unique candidates; full seven-checkpoint M00 dry-run passed with default zero offsets
- Remaining risks: no private reference directory was available in this worktree, so real perceptual ranking and human approval remain external evidence
- Documentation updated: `docs/CAMERA_POSE_SWEEP.md`; renderer module verification, risk and source map
@@ -0,0 +1,79 @@
# M00-QAR-CAPTURE-SHUTDOWN-001 — Capture shutdown drain
<!-- OPENWC_CLAIM:M00-QAR-CAPTURE-SHUTDOWN-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-CAPTURE-SHUTDOWN-001:8d4641a -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-capture-shutdown`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Eliminate the reproducible capture-tool ObjectDB leak by completing owned threaded resource requests and draining deferred scene deletion before process exit.
## Non-goals
- Refactoring renderer resource ownership.
- Hiding genuine RID or worker-task leaks.
- Changing capture images, metrics, or streaming behavior.
## Paths
- Exclusive: capture tool shutdown sequence
- Shared/hotspots: renderer baseline documentation
- Generated/ignored: verbose Godot logs
## Contracts and data
- Public API/events: none
- Schema/format version: unchanged
- Migration/compatibility: none
- Consumers: M00 baseline runner
## Dependencies
- Requires: reproducible verbose leak diagnostic
- Blocks: clean M00 capture shutdown evidence
- External state: none
## Verification
- Commands: identical verbose dry-run before/after, M00 dry-run, repository gates
- Fixtures: ADT-boundary filtered capture
- Fidelity evidence: no visual behavior change
- Performance budget: blocking resource completion is restricted to shutdown; two SceneTree drain frames only
## Documentation deliverables
- Inline public API docs: shutdown rationale comment
- Module specification: recovery/known-risk update
- Data-flow diagram: unchanged
- Sequence/state/dependency diagrams: shutdown sequence documented in baseline
- Source map/status updates: baseline evidence
## Simplicity and naming
- Important names introduced: none
- Simplest considered solution: await two SceneTree frames after `queue_free` and finish registered in-flight ResourceLoader requests during loader shutdown
- Rejected complexity/abstractions: resource registry or manual child traversal
- Unavoidable complexity and justification: deferred deletion requires frame drain
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: one leaked RefCounted reproduced; isolation attributed it to `StreamingWorldLoader`; active threaded tile request was confirmed as the retained object; all owned threaded resource registries now finish in-progress requests before clearing; two identical verbose ADT-boundary runs and the full M00 dry-run completed without ObjectDB leak diagnostics
- Next: integrator review and merge
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: verbose filtered capture returned one report and zero `Leaked instance`/`ObjectDB instances leaked` lines on two consecutive runs; `run_render_baseline.ps1 -DryRun` passed all gates and seven checkpoints
- Remaining risks:
- Documentation updated: `docs/modules/world-renderer.md` shutdown sequence, ownership contract, recovery table and known-risk status
@@ -0,0 +1,79 @@
# M00-QAR-COORD-CALIBRATION-001 — Renderer coordinate calibration
<!-- OPENWC_CLAIM:M00-QAR-COORD-CALIBRATION-001:sindo-main-codex:2026-07-13 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-COORD-CALIBRATION-001:dfc1031 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-coordinate-calibration`
- Lease expires UTC: 2026-07-13
- Integrator: milestone integrator
## Outcome
Record the five observed build 12340 camera positions as non-proprietary golden coordinates and determine whether the existing WoW/Godot position formula round-trips them.
## Non-goals
- Introducing the M01 production `CoordinateMapper` contract.
- Changing terrain, placement, WMO, liquid, or streaming behavior.
- Claiming camera composition parity from coordinate round-trip alone.
## Paths
- Exclusive: `src/tools/verify_render_coordinate_calibration.gd`
- Shared/hotspots: `src/tools/render_baseline_manifest.json`, renderer baseline documentation
- Generated/ignored: original-client screenshots and local reports
## Contracts and data
- Public API/events: none; headless diagnostic only
- Schema/format version: additive checkpoint calibration metadata, manifest schema remains 1
- Migration/compatibility: existing capture consumers ignore additive fields
- Consumers: M00 fidelity workflow and future M01 golden fixtures
## Dependencies
- Requires: five accepted original-client build 12340 viewpoints
- Blocks: diagnosis of paired camera/placement mismatch
- External state: screenshots remain outside Git
## Verification
- Commands: coordinate calibration probe, baseline manifest, coordination and documentation gates
- Fixtures: five `reference_wow_camera` values in renderer manifest
- Fidelity evidence: positions were observed in build 12340 during the paired session
- Performance budget: negligible headless arithmetic
## Documentation deliverables
- Inline public API docs: diagnostic script header
- Module specification: renderer verification/source map update
- Data-flow diagram: baseline calibration flow update
- Sequence/state/dependency diagrams: not applicable; stateless synchronous probe
- Source map/status updates: renderer module and baseline document
## Simplicity and naming
- Important names introduced: `reference_wow_camera`, `maximum_round_trip_error`
- Simplest considered solution: direct formula probe over manifest fixtures
- Rejected complexity/abstractions: production domain mapper before M01
- Unavoidable complexity and justification: none
- Measured optimization evidence: not applicable
## Status
- State: ready
- Done: five golden camera points, headless round-trip probe, runner integration and documentation
- Next: integrator review; diagnose terrain height/placement/composition separately
- Blocked by:
## Handoff
- Commit: branch HEAD
- Results: five points passed with maximum mapping/round-trip error 0.000015
- Remaining risks: correct position arithmetic does not prove terrain height, placement or camera direction parity
- Documentation updated: `docs/RENDER_BASELINE.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-FINAL-PAIRED-EVIDENCE-001 — Final paired evidence audit
<!-- OPENWC_CLAIM:M00-QAR-FINAL-PAIRED-EVIDENCE-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-FINAL-PAIRED-EVIDENCE-001:239cb24 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-final-paired-evidence`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Produce one final WMO-ready paired report for all available build 12340 references and reconcile the remaining M00 acceptance gaps.
## Non-goals
- Achieving renderer parity inside M00.
- Calibrating unknown manual camera parameters.
- Marking the target DONE; only the milestone integrator may do so.
## Paths
- Exclusive: paired-run exit handling and final evidence record
- Shared/hotspots: renderer baseline/module findings
- Generated/ignored: final captures and reports under `user://`
## Contracts and data
- Public API/events: visual comparison exit 0/1 both count as completed report generation
- Schema/format version: unchanged
- Migration/compatibility: comparator infrastructure errors remain fatal
- Consumers: M00 integrator
## Dependencies
- Requires: merged region diagnostic and five private reference images
- Blocks: integrator decision on M00 completion
- External state: private images remain outside Git
## Verification
- Commands: complete paired baseline run, report audit, repository gates
- Fixtures: five build 12340 references
- Fidelity evidence: cold/warm comparison metrics and human gap classification
- Performance budget: existing M00 capture budgets
## Documentation deliverables
- Inline public API docs: PowerShell comparison step semantics
- Module specification: final evidence status
- Data-flow diagram: unchanged
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: baseline acceptance summary
## Simplicity and naming
- Important names introduced: `Invoke-GodotComparisonStep`
- Simplest considered solution: allow only comparator exit codes 0 and 1
- Rejected complexity/abstractions: suppressing all process failures
- Unavoidable complexity and justification: threshold exceedance is evidence, not infrastructure failure
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: paired-run exit contract fixed; full baseline and visual capture completed; ten pairs audited; final acceptance document written
- Next: integrator decides animated/sky reference policy and GUI RID-risk disposition
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: compared=10, failed=10, missing=0; mean error 0.066892..0.176952; cold/warm gaps stable; full workflow returned success with threshold evidence preserved
- Remaining risks: no build 12340 animated-M2 or sky-transition reference; GUI renderer RID/resources still reported at exit
- Documentation updated: `docs/M00_FINAL_PAIRED_EVIDENCE.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-FOV-SWEEP-001 — Empirical camera FOV sweep
<!-- OPENWC_CLAIM:M00-QAR-FOV-SWEEP-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-FOV-SWEEP-001:f548507 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-fov-sweep`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Support a bounded empirical FOV sweep when build 12340 does not expose a readable camera FOV CVar.
## Non-goals
- Claiming exact WoW FOV from a single manually aimed screenshot.
- Changing runtime player camera defaults.
- Automating yaw/pitch registration or image warping.
## Paths
- Exclusive: FOV/filter CLI additions in checkpoint tools
- Shared/hotspots: renderer baseline documentation
- Generated/ignored: local sweep PNGs and JSON reports
## Contracts and data
- Public API/events: additive `--camera-fov` and comparator `--only` CLI options
- Schema/format version: unchanged
- Migration/compatibility: existing commands retain defaults
- Consumers: M00 fidelity workflow
## Dependencies
- Requires: build 12340 reference JPG and paired-image comparator
- Blocks: empirical projection ranking
- External state: original screenshots remain outside Git
## Verification
- Commands: synthetic comparator test, capture dry-run with override, bounded real sweep
- Fixtures: `elwynn_adt_boundary` reference
- Fidelity evidence: ranked perceptual metrics with manual-direction limitation
- Performance budget: offline diagnostic
## Documentation deliverables
- Inline public API docs: CLI headers
- Module specification: verification/source map if needed
- Data-flow diagram: FOV sweep flow
- Sequence/state/dependency diagrams: not applicable
- Source map/status updates: baseline findings
## Simplicity and naming
- Important names introduced: `camera_fov_override`, `only_filter`
- Simplest considered solution: reuse capture and comparator
- Rejected complexity/abstractions: computer vision registration framework
- Unavoidable complexity and justification: multiple captures are required because client FOV is inaccessible
- Measured optimization evidence: not applicable
## Status
- State: ready
- Done: client FOV access audit, capture override, comparator filter/regression, dedicated-camera ownership fix and bounded sweep
- Next: integrator review; obtain reproducible yaw/pitch/zoom metadata before changing normative FOV
- Blocked by:
## Handoff
- Commit: branch HEAD
- Results: corrected ranking 26=0.079588, 38=0.079633, 50=0.084353, 62=0.088360, 86=0.097993; plateau is inconclusive
- Remaining risks: build 12340 FOV is inaccessible through tested APIs; manual direction/framing dominates metrics
- Documentation updated: `docs/RENDER_BASELINE.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-GUI-RID-SHUTDOWN-001 — GUI capture RID shutdown
<!-- OPENWC_CLAIM:M00-QAR-GUI-RID-SHUTDOWN-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-GUI-RID-SHUTDOWN-001:f19c0c4 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-gui-rid-shutdown`
- Lease expires UTC: 2026-07-15
- Integrator: milestone integrator
## Outcome
Identify ownership of GUI render-baseline shutdown leaks and apply the smallest regression-covered fix that lets queued world resources release before engine teardown.
## Non-goals
- Renderer architecture decomposition.
- Hiding or filtering Godot leak diagnostics.
- Changing M00 status, Evidence or `OPENWC_TARGET_DONE`.
## Paths
- Exclusive: capture shutdown sequencing and its regression diagnostic
- Shared/hotspots: `src/tools/capture_render_checkpoints.gd`, renderer module shutdown documentation
- Generated/ignored: GUI capture output and verbose logs under `user://`
## Contracts and data
- Public API/events: unchanged
- Schema/format version: unchanged
- Migration/compatibility: capture images and report schema remain unchanged
- Consumers: M00 baseline runner and milestone integrator
## Dependencies
- Requires: merged seven-reference evidence audit
- Blocks: integrator disposition of the final GUI renderer leak risk
- External state: proprietary references are not required for the focused shutdown regression
## Verification
- Commands: focused GUI single-checkpoint capture with verbose shutdown, headless project load, manifest/self-tests, repository gates
- Fixtures: existing non-proprietary render-baseline manifest and local extracted corpus
- Fidelity evidence: no visual behavior change; focused PNG hash/report remains valid
- Performance budget: shutdown-only change
## Documentation deliverables
- Inline public API docs: shutdown method semantics if introduced
- Module specification: shutdown ownership and observed leak status
- Data-flow diagram: unchanged
- Sequence/state/dependency diagrams: update shutdown sequence only if behavior changes
- Source map/status updates: capture tool if changed
## Simplicity and naming
- Important names introduced: `_release_runtime_caches_for_shutdown`, `_free_detached_node_cache`, `_queue_free_streamed_node`
- Simplest considered solution: explicitly release capture-owned scene references and drain deferred deletion
- Rejected complexity/abstractions: global RID registry or suppressed engine diagnostics
- Unavoidable complexity and justification: async streaming jobs must finish before resource ownership can drain
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: reproduced the focused leak; assigned detached prototype/resource caches and empty liquid roots to explicit owners; added a headless regression; verified zero Node/resource/RID leak lines in focused and seven-checkpoint GUI captures
- Next: integrator review and disposition of the residual engine-level zero-reference `RefCounted` diagnostic
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: before the fix the focused capture retained 6 mesh, 6 material, 4 shader, 6 texture, 6 instance and RenderingDevice RIDs (30 resources); after the fix focused and seven-checkpoint captures retained none
- Remaining risks: D3D12 descriptor fallback remains unrelated; Godot can report a timing-dependent anonymous `RefCounted` whose reference count is already zero, without retained Node/resource/RID ownership
- Documentation updated: `RENDER.md`, `docs/modules/world-renderer.md`, `docs/M00_FINAL_PAIRED_EVIDENCE.md`; existing renderer shutdown sequence updated, no new diagram required
@@ -0,0 +1,79 @@
# M00-QAR-INTEGRATOR-CLOSEOUT-001 — M00 milestone closeout
<!-- OPENWC_CLAIM:M00-QAR-INTEGRATOR-CLOSEOUT-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_HANDOFF:READY:M00-QAR-INTEGRATOR-CLOSEOUT-001:ba81098 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-integrator-closeout`
- Lease expires UTC: 2026-07-15
- Integrator: sindo-main-codex, assigned by the user on 2026-07-13
## Outcome
Audit merged M00 work packages, refresh final Evidence, close the milestone and activate M01.
## Non-goals
- Change renderer behavior or compatibility claims.
- Start M01 implementation.
- Commit proprietary references or generated capture output.
## Paths
- Exclusive: M00/M01 target status and final M00 Evidence
- Shared/hotspots: `targets/README.md`, `targets/DEVELOPMENT_ROADMAP.md`, completed M00 claims
- Generated/ignored: `user://` post-merge reports
## Contracts and data
- Public API/events: unchanged
- Schema/format version: unchanged
- Migration/compatibility: none
- Consumers: milestone integrator and M01 work packages
## Dependencies
- Requires: merged M00 PRs #1 through #15 and final paired evidence
- Blocks: M01 activation
- External state: private reference images remain outside Git; their hashes and metrics are already recorded
## Verification
- Commands: post-merge render baseline dry-run, coordination gate, documentation gate
- Fixtures: seven-checkpoint non-proprietary manifest and recorded private-reference hashes/metrics
- Fidelity evidence: closeout preserves the explicit non-parity classification in `docs/M00_FINAL_PAIRED_EVIDENCE.md`
- Performance budget: no runtime change
## Documentation deliverables
- Inline public API docs: unchanged
- Module specification: unchanged
- Data-flow diagram: unchanged
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: target index, roadmap current state and M00 Evidence
## Simplicity and naming
- Important names introduced: none
- Simplest considered solution: status and Evidence-only integrator patch
- Rejected complexity/abstractions: new closeout tooling for a one-time milestone transition
- Unavoidable complexity and justification: none
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: verified all M00 PRs and merge commits, refreshed final Evidence, closed M00, activated M01 and passed transition gates
- Next: review and merge the closeout PR before starting an M01 implementation claim
- Blocked by:
## Handoff
- Commit: `ba81098`
- Results: exactly one ACTIVE target (M01); M00 DONE marker accepted; post-merge baseline, comparator self-test, coordination and documentation gates passed
- Remaining risks: documented renderer fidelity gaps and D3D12 fallback continue beyond M00
- Documentation updated: target status/index, development-roadmap current state and final M00 Evidence
@@ -0,0 +1,79 @@
# M00-QAR-LANDMARK-REGION-DIFF-001 — Landmark-region visual diff
<!-- OPENWC_CLAIM:M00-QAR-LANDMARK-REGION-DIFF-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-LANDMARK-REGION-DIFF-001:3d90c6d -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-landmark-region-diff`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Rank camera candidates inside an approved common screen region so unrelated grass/sky coverage cannot dominate landmark framing.
## Non-goals
- Automatic feature detection or image warping.
- Different crops for reference and candidate.
- Changing manifest camera values without human approval.
## Paths
- Exclusive: comparator common-region option and sweep pass-through
- Shared/hotspots: camera-pose documentation and renderer fidelity findings
- Generated/ignored: local ROI sweep images/reports
## Contracts and data
- Public API/events: additive comparator `--region x,y,width,height` and sweep `-ComparisonRegion`
- Schema/format version: report/ranking schema remains version 1 with additive region metadata
- Migration/compatibility: omitted region preserves full-frame behavior
- Consumers: M00 paired camera calibration
## Dependencies
- Requires: ready-scene joint pitch/FOV sweep
- Blocks: landmark-weighted Goldshire framing decision
- External state: private build 12340 reference
## Verification
- Commands: comparator synthetic ROI regression, invalid-bound regression, sweep plan, bounded real ROI sweep, repository gates
- Fixtures: synthetic 2x2 images and private Goldshire reference
- Fidelity evidence: facade-region ranking plus human inspection
- Performance budget: region comparison visits only selected pixels
## Documentation deliverables
- Inline public API docs: comparator usage and PowerShell parameter
- Module specification: ROI finding
- Data-flow diagram: approved region into comparator
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: camera-pose guide
## Simplicity and naming
- Important names introduced: `ComparisonRegion`, `comparison_region`
- Simplest considered solution: one common integer rectangle
- Rejected complexity/abstractions: masks, feature detectors, separate movable crops
- Unavoidable complexity and justification: full-frame color error is biased by large terrain regions
- Measured optimization evidence: bounded pixel loop
## Status
- State: ready-for-review
- Done: common ROI parser/validation/reporting, synthetic inclusion/exclusion regression, sweep pass-through, 15-candidate Goldshire rescoring and human inspection
- Next: define explicit approved landmark coordinates or mask; do not calibrate manifest from the common rectangle alone
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: ROI [300,100,1400,650] ranked FOV 38/yaw 10/pitch -15 first at mean 0.081777 and ratio 0.697185; visually the facade remains oversized and cropped
- Remaining risks: rectangle includes non-semantic road/terrain pixels and cannot prove landmark alignment
- Documentation updated: `docs/CAMERA_POSE_SWEEP.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-TERRAIN-HEIGHT-001 — Terrain height diagnostic
<!-- OPENWC_CLAIM:M00-QAR-TERRAIN-HEIGHT-001:sindo-main-codex:2026-07-13 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-TERRAIN-HEIGHT-001:f8538ba -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-terrain-height`
- Lease expires UTC: 2026-07-13
- Integrator: milestone integrator
## Outcome
Measure rendered terrain height and camera clearance at the five build 12340 golden checkpoints without changing renderer behavior.
## Non-goals
- Adding a runtime terrain-query API or collision system.
- Changing terrain geometry, coordinate mapping, placements, or cameras.
- Implementing the M01 CoordinateMapper.
## Paths
- Exclusive: `src/tools/probe_render_terrain_height.gd`
- Shared/hotspots: renderer baseline documentation and runner
- Generated/ignored: local JSON probe reports
## Contracts and data
- Public API/events: headless diagnostic CLI only
- Schema/format version: report schema 1
- Migration/compatibility: none
- Consumers: M00 fidelity diagnosis
## Dependencies
- Requires: calibrated renderer manifest and active terrain meshes
- Blocks: classification of under-terrain camera gaps
- External state: local extracted/cache data
## Verification
- Commands: terrain probe, M00 dry-run, coordination and documentation gates
- Fixtures: five calibrated manifest checkpoints
- Fidelity evidence: camera clearance against rendered OpenWC terrain
- Performance budget: offline diagnostic only
## Documentation deliverables
- Inline public API docs: script CLI header
- Module specification: verification/source map
- Data-flow diagram: terrain probe flow
- Sequence/state/dependency diagrams: synchronous diagnostic; not applicable
- Source map/status updates: baseline and renderer module
## Simplicity and naming
- Important names introduced: `terrain_height`, `camera_clearance`
- Simplest considered solution: CPU ray against already loaded mesh
- Rejected complexity/abstractions: new parser, physics collision, runtime query service
- Unavoidable complexity and justification: tile-local ray transform is required by mesh ownership
- Measured optimization evidence: not applicable
## Status
- State: ready
- Done: active-mesh terrain probe, four clearance measurements, isolated waterfall missing-mesh confirmation and documentation
- Next: integrator review; placement/composition diagnosis for four points and tile 30_49 ownership diagnosis remain separate packages
- Blocked by:
## Handoff
- Commit: branch HEAD
- Results: four cameras are 12.034..90.178 units above terrain; waterfall tile has no accessible terrain mesh after 10-second settle
- Remaining risks: mesh ray does not measure WMO/M2 occlusion; waterfall missing mesh requires streaming ownership investigation
- Documentation updated: `docs/RENDER_BASELINE.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-TILE-OWNERSHIP-001 — Waterfall terrain tile ownership
<!-- OPENWC_CLAIM:M00-QAR-TILE-OWNERSHIP-001:sindo-main-codex:2026-07-13 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-TILE-OWNERSHIP-001:2306200 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-waterfall-tile-ownership`
- Lease expires UTC: 2026-07-13
- Integrator: milestone integrator
## Outcome
Identify the runtime transition that prevents waterfall tile `30_49` from exposing a terrain mesh to the height probe.
## Non-goals
- Changing streaming budgets or terrain behavior.
- Rebuilding caches or modifying extracted assets.
- Adding a production terrain query service.
## Paths
- Exclusive: terrain probe runtime ownership diagnostics
- Shared/hotspots: renderer baseline documentation
- Generated/ignored: local probe reports and caches
## Contracts and data
- Public API/events: additive diagnostic JSON fields
- Schema/format version: terrain report remains schema 1
- Migration/compatibility: additive fields only
- Consumers: M00 fidelity diagnosis
## Dependencies
- Requires: merged terrain-height probe and local cache inventory
- Blocks: waterfall terrain ownership classification
- External state: local extracted/cache data
## Verification
- Commands: isolated waterfall probe, coordination and documentation gates
- Fixtures: checkpoint tile `30_49`
- Fidelity evidence: runtime state correlated with build 12340 waterfall viewpoint
- Performance budget: offline diagnostic
## Documentation deliverables
- Inline public API docs: diagnostic output fields
- Module specification: verification/source map if behavior changes
- Data-flow diagram: update ownership transition if needed
- Sequence/state/dependency diagrams: document observed tile transition
- Source map/status updates: baseline findings
## Simplicity and naming
- Important names introduced: `available`, `queued_index`, `loading`, `state_present`, `mesh_source`
- Simplest considered solution: inspect existing loader registries read-only
- Rejected complexity/abstractions: new tracing framework
- Unavoidable complexity and justification: none
- Measured optimization evidence: not applicable
## Status
- State: ready
- Done: raw/cache inventory, isolated runtime state, mesh AABB/local probe and nearby sampling diagnosis
- Next: integrator review; placement/composition remains the actual paired-camera gap
- Blocked by:
## Handoff
- Commit: branch HEAD
- Results: tile 30_49 ownership and meshes are healthy; exact ray misses a triangle seam/edge, while a 2-unit offset samples terrain at 113.872
- Remaining risks: nearby estimate is diagnostic and must not become a gameplay terrain-query contract
- Documentation updated: `docs/RENDER_BASELINE.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,79 @@
# M00-QAR-VISUAL-DIFF-001 — Renderer checkpoint visual diff
<!-- OPENWC_CLAIM:M00-QAR-VISUAL-DIFF-001:sindo-main-codex:2026-07-13 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-VISUAL-DIFF-001:19df5b7 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-checkpoint-diff`
- Lease expires UTC: 2026-07-13
- Integrator: milestone integrator
## Outcome
Provide a deterministic, headless perceptual comparison for paired renderer checkpoint PNGs, with machine-readable results and synthetic regression coverage.
## Non-goals
- Supplying or committing original-client screenshots.
- Claiming visual parity or replacing human approval.
- Image registration, camera correction, or temporal animation matching.
## Paths
- Exclusive: `src/tools/compare_render_checkpoints.gd`
- Shared/hotspots: `src/tools/render_baseline_manifest.json`, `tools/run_render_baseline.ps1`, `docs/RENDER_BASELINE.md`, `docs/modules/world-renderer.md`, `RENDER.md`
- Generated/ignored: comparison reports, diff PNGs, original-client captures
## Contracts and data
- Public API/events: headless CLI arguments and JSON report documented in renderer baseline docs
- Schema/format version: comparison report schema 1; baseline manifest schema remains 1
- Migration/compatibility: additive manifest budget fields
- Consumers: developers and CI
## Dependencies
- Requires: Godot `Image` API and M00 checkpoint naming contract
- Blocks: automated portion of original-client paired comparison
- External state: approved build 12340 screenshots remain unavailable
## Verification
- Commands: headless self-test; manifest verification; documentation and coordination gates
- Fixtures: tool-generated identical and changed 2x2 PNGs
- Fidelity evidence: algorithm is deterministic; real-client evidence remains a manual/external input
- Performance budget: offline checkpoint operation, linear in pixel count
## Documentation deliverables
- Inline public API docs: CLI usage in script header
- Module specification: update renderer verification and source map
- Data-flow diagram: update baseline documentation
- Sequence/state/dependency diagrams: not stateful or asynchronous; not applicable
- Source map/status updates: renderer module and RENDER notes
## Simplicity and naming
- Important names introduced: `mean_perceptual_error`, `changed_pixel_ratio`
- Simplest considered solution: direct Godot Image iteration with no dependency
- Rejected complexity/abstractions: external image library, SSIM window pipeline, image registration
- Unavoidable complexity and justification: sRGB linearization avoids comparing encoded channel values directly
- Measured optimization evidence: not required for offline seven-checkpoint comparison
## Status
- State: ready
- Done: comparator, runner integration, manifest tolerance contract, synthetic regression, five local build 12340 references, three viewpoint calibrations, corrected visual capture and first paired report
- Next: integrator review; coordinate/placement gap should be resolved before tolerance calibration
- Blocked by: real paired screenshots only for final human fidelity approval
## Handoff
- Commit: branch HEAD
- Results: ten pairs compared with no missing candidates; mean error 0.0707..0.1746 and changed ratio 0.5504..0.8187; human review identified under-terrain/inside-geometry camera mismatches
- Remaining risks: coordinate/placement mismatch blocks meaningful tolerance calibration; synthetic animation, dusk and full human approval remain incomplete
- Documentation updated: `docs/RENDER_BASELINE.md`, `docs/modules/world-renderer.md`, `RENDER.md`
@@ -0,0 +1,79 @@
# M00-QAR-WMO-READINESS-001 — Goldshire WMO readiness
<!-- OPENWC_CLAIM:M00-QAR-WMO-READINESS-001:sindo-main-codex:2026-07-14 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M00-QAR-WMO-READINESS-001:5092995 -->
## Ownership
- Target: M00
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m00-wmo-readiness`
- Lease expires UTC: 2026-07-14
- Integrator: milestone integrator
## Outcome
Prevent pose calibration against an under-loaded WMO scene and replace invalid Goldshire evidence with a baseline-ready comparison.
## Non-goals
- Changing runtime streaming budgets.
- Claiming all WMO queues must globally drain before a checkpoint.
- Changing manifest camera pose without valid paired evidence.
## Paths
- Exclusive: pose-sweep readiness default and Goldshire timing evidence
- Shared/hotspots: renderer baseline/module fidelity findings
- Generated/ignored: timing and sweep images under `user://`
## Contracts and data
- Public API/events: pose sweep default wait becomes 8 seconds, matching the M00 manifest
- Schema/format version: unchanged
- Migration/compatibility: explicit `-WaitSeconds` remains supported
- Consumers: M00 paired-fidelity workflow
## Dependencies
- Requires: Goldshire pose evidence and private build 12340 reference
- Blocks: valid Goldshire camera-pose ranking
- External state: private reference and generated captures remain outside Git
## Verification
- Commands: 2/8/15 second timing audit, ready-scene 3x3 pose sweep, baseline dry-run, repository gates
- Fixtures: private Goldshire Inn screenshot
- Fidelity evidence: visual WMO presence plus streaming snapshot and paired metrics
- Performance budget: offline diagnostic
## Documentation deliverables
- Inline public API docs: PowerShell default
- Module specification: corrected readiness/fidelity finding
- Data-flow diagram: readiness precondition
- Sequence/state/dependency diagrams: unchanged
- Source map/status updates: camera-pose operational guide
## Simplicity and naming
- Important names introduced: none
- Simplest considered solution: reuse the manifest's measured 8-second stabilization default
- Rejected complexity/abstractions: global queue barrier that would include unrelated distant work
- Unavoidable complexity and justification: WMO publication is asynchronous
- Measured optimization evidence: 2/8/15 second snapshots
## Status
- State: ready-for-review
- Done: timing audit invalidated the 2-second evidence; sweep default now matches the 8-second manifest; ready-scene 3x3 grid and human inspection completed
- Next: jointly refine negative pitch and FOV around the ready-scene Goldshire candidate
- Blocked by:
## Handoff
- Commit: this work-package commit
- Results: WMO instances 9/113/328 at 2/8/15 seconds; inn absent at 2 and visible at 8/15; ready grid improved mean error from 0.101402 at (0,0) to 0.087952 at (10,-10)
- Remaining risks: global WMO queues still contain unrelated work; best pitch is at the tested boundary and building scale indicates unresolved FOV/framing
- Documentation updated: `docs/CAMERA_POSE_SWEEP.md`, `docs/modules/world-renderer.md`
@@ -0,0 +1,131 @@
# M01-FND-COORD-BOUNDARY-GATE-001 — Coordinate conversion boundary gate
<!-- OPENWC_CLAIM:M01-FND-COORD-BOUNDARY-GATE-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-FND-COORD-BOUNDARY-GATE-001:c8e99f2 -->
## Ownership
- Target: M01
- Program: FND/QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-coordinate-boundary-gate`
- Lease expires UTC: 2026-07-15
- Integrator: M01 milestone integrator
## Outcome
Route remaining GDScript world/tile axis conversions through `CoordinateMapper`
and add a repository-wide gate that rejects new manual world-center, axis-swap
or world-to-ADT tile formulas outside explicit contract/native-oracle boundaries.
## Non-goals
- Rewriting model-local M2/WMO vertex or placement orientation transforms.
- Moving renderer distance/LOD geometry out of Godot space.
- Replacing the native parser boundary with GDScript calls from worker threads.
- Changing coordinate contract semantics, renderer radii or cache formats.
## Paths
- Exclusive: `src/tools/verify_coordinate_conversion_boundaries.gd`
- Shared/hotspots: `src/domain/coordinates/coordinate_mapper.gd`, coordinate
tests/docs/ADR, streamer/player/sky/terrain-probe consumers,
`docs/CODING_STANDARD.md`, this claim
- Generated/ignored: Godot import metadata, extracted assets and renderer caches
## Contracts and data
- Additive mapper methods: Godot position to ADT tile/local and ADT tile/local
to Godot position
- Native exception: one formula definition in `src/native/src/wow_chunk_reader.h`;
ADT/WDT loaders may call it but may not define copies
- Oracle exception: `verify_render_coordinate_calibration.gd` retains one
independent M00 formula to detect common-mode mapper regressions
- Model-local transforms are outside the world-coordinate gate
## Dependencies
- Requires: coordinate contract v2 and M01 seams through `7c64e8d`
- Blocks: M01 coordinate-centralization exit criterion and milestone evidence audit
- External state: no dependency or proprietary input
## Verification
- Commands: conversion-boundary gate, mapper/golden fixtures, streaming focus,
identities, renderer calibration/manifest and repository gates
- Fixtures: Godot/ADT tile center, local offsets and exact boundaries
- Fidelity evidence: existing build-12340 points and raw ADT/server fixture remain unchanged
- Performance budget: mapper allocations occur only at adapter/update boundaries;
renderer distance/LOD math remains in Godot scalars
## Documentation deliverables
- Inline public API docs: new mapper methods
- Module specification/ADR: boundary APIs, allowed exceptions and gate behavior
- Coding standard: mandatory review rule for cross-space conversions
- Data-flow diagram: existing coordinate module diagram updated for direct adapters
- State/sequence diagrams: unchanged; pure synchronous mapping
## Simplicity and naming
- Important names introduced: `godot_to_adt_tile`, `godot_to_adt_tile_local`,
`adt_tile_local_to_godot`, `verify_coordinate_conversion_boundaries`
- Simplest considered solution: extend the existing mapper and scan source text
for narrow high-signal formula signatures
- Rejected complexity/abstractions: generic coordinate algebra framework,
native-to-GDScript calls on parser workers and a broad numeric-literal ban
- Unavoidable complexity and justification: one native boundary and one
independent test oracle must remain explicit to avoid worker coupling and common-mode tests
- Measured optimization evidence: existing renderer distance/LOD scalar math is unchanged
## Status
- State: ready-for-review
- Done: mapper extensions, consumer migration, repository gate, review rule,
integrated renderer gate, regression fixtures and documentation
- Next: integrator review, merge and M01 completion-evidence audit
- Blocked by:
## Handoff
- Commit: `47dec6c`
- Branch: `work/sindo-main-codex/m01-coordinate-boundary-gate`
- Outcome: all audited GDScript world/tile conversions in sky, streaming,
player spawn/ground sampling and terrain probes route through typed
`CoordinateMapper` boundaries. A repository scan rejects new manual
world-center, legacy axis-conversion, world-to-tile, tile-local and
tile-center formulas.
- Contract/schema: additive `godot_to_adt_tile`,
`godot_to_adt_tile_local` and `adt_tile_local_to_godot` APIs; no persisted
format, cache version or renderer radius changes.
- Verification: CoordinateConversionBoundaries PASS (`83` files, one native
boundary, one independent oracle, four consumers, six classifier guards);
CoordinateMapper PASS (`5` golden points, `8` tile boundaries, `2` raw MCNK,
`5` yaw cases); renderer calibration PASS (`5` points, maximum error
`0.000015`); renderer manifest PASS (`7/7/7`); unified render baseline dry-run,
headless project load, runtime cache shutdown, coordination, documentation
and whitespace gates passed.
- GUI regression: final ADT-boundary capture compared `2/2`, missing `0`,
failed `0` (cold mean `0.0002324`, changed ratio `0.0013741`; warm mean
`0.0000226`, changed ratio `0.0001285`). Earlier full capture produced all
`14` images; `11/14` met the strict changed-pixel threshold. The three
threshold-only differences retained low mean error (`<= 0.00622`) and were
visually classified as cold M2 readiness and liquid animation phase, with
unchanged camera, geometry alignment, area and streaming focus.
- Fidelity: existing build-12340 calibrated points, raw ADT fixture and server
spawn fixture remain unchanged. Native parser workers retain exactly one
formula in `wow_chunk_reader.h`; the calibration verifier retains exactly one
independent formula so mapper and oracle cannot share a common-mode defect.
- Rebuild: none. Local ignored extracted assets/native binary/cache junctions
were used for runtime checks and are not part of the commit.
- Remaining risks: source scanning intentionally recognizes narrow high-signal
formula signatures rather than parsing arbitrary algebra; native formula
parity still relies on calibration/raw fixtures. Model-local M2/WMO basis
transforms and Godot-space LOD distance math are intentionally outside scope.
- Recommended merge order: after `7c64e8d`; this package closes the remaining
M01 manual axis-conversion checklist item, but only the milestone integrator
may update target Evidence/status or set `OPENWC_TARGET_DONE`.
- Documentation: coding review rule, coordinate-mapping module API/input-output/
data-flow/capability/risk/source-map sections, ADR 0001 and `RENDER.md` were
updated. Existing pure synchronous data-flow diagram remains authoritative;
no state/sequence diagram changed.
@@ -0,0 +1,104 @@
# M01-FND-COORD-TILE-AXIS-002 — ADT filename axis correction
<!-- OPENWC_CLAIM:M01-FND-COORD-TILE-AXIS-002:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-FND-COORD-TILE-AXIS-002:c8e99f2 -->
## Ownership
- Target: M01
- Program: FND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-coordinate-tile-axis-fix`
- Lease expires UTC: 2026-07-15
- Integrator: M01 milestone integrator
## Outcome
Correct the additive coordinate contract so `AdtTileCoordinate(tile_x, tile_y)`
matches actual `Map_tileX_tileY.adt` filenames and MCNK `indexX/indexY` axes.
## Non-goals
- Migrating renderer/native consumers.
- Changing canonical, server, Godot or ADT placement position arithmetic.
- Adding server-spawn fixtures or `StreamingFocus`.
- Committing proprietary ADT bytes.
## Paths
- Exclusive: `src/domain/coordinates/coordinate_mapper.gd`,
`src/domain/coordinates/adt_chunk_coordinate.gd`,
`src/tools/verify_coordinate_mapper.gd`
- Shared/hotspots: `docs/adr/0001-canonical-world-coordinates.md`,
`docs/modules/coordinate-mapping.md`, this claim
- Generated/ignored: local extracted ADT and Godot import metadata
## Contracts and data
- Public API/events: method names unchanged; corrected tile/chunk axis semantics
- Schema/format version: coordinate contract version increments from 1 to 2
- Migration/compatibility: no released consumer exists; contract was merged but
not yet consumed, so correction precedes consumer rollout
- Consumers: future renderer, network, gameplay and server-data adapters
## Dependencies
- Requires: merged `M01-FND-COORDS-001` at `1c0dfc7`
- Blocks: coordinate golden fixtures and all coordinate consumers
- External state: private `Azeroth_31_49.adt` used read-only for evidence
## Verification
- Commands: coordinate mapper probe, M00 calibration, manifest, documentation
and coordination gates
- Fixtures: build 12340 Elwynn point must resolve to `Azeroth_31_49.adt`;
MCNK `(0,0)` and `(15,15)` establish chunk-axis direction
- Fidelity evidence: local ADT SHA-256
`18185B5FAC9566D9C57A9C19ABD75F108370D1795639B6077167C0EFD3672FAE`;
OpenRealm independently indexes filename X from world Y and filename Y from world X
- Performance budget: unchanged constant-time scalar arithmetic
## Documentation deliverables
- Inline public API docs: corrected tile/chunk direction comments
- Module specification: contract version, formulas, capability evidence and risk
- Data-flow diagram: corrected filename/chunk axes
- ADR: corrected decision and evidence
- Sequence/state diagrams: not applicable; pure synchronous mapper
## Simplicity and naming
- Important names introduced: none
- Simplest considered solution: swap the two filename formulas and corresponding
local/chunk ownership calculations
- Rejected complexity/abstractions: compatibility flag for a contract with no consumers
- Unavoidable complexity and justification: ADT filename axes differ from client X/Y order
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: raw-corpus diagnosis, filename/local/chunk axis correction, contract
version 2 documentation and regression fixtures
- Next: integrator review and merge before coordinate consumer work
- Blocked by:
## Handoff
- Commit: `a7072e3`
- Branch: `work/sindo-main-codex/m01-coordinate-tile-axis-fix`
- Outcome: `tile_x/chunk_x` now grow east from canonical Y and
`tile_y/chunk_y` grow south from canonical X; public method names unchanged
- Contract/schema: coordinate contract version 2; no persisted format, cache or migration
- Verification: coordinate mapper PASS (5 build-12340 points, 8 boundaries,
2 recorded raw MCNK origins, 5 yaw cases); M00 calibration PASS with maximum
error `0.000015`; renderer manifest, coordination, documentation, dependency
and whitespace checks passed
- Fidelity: private `Azeroth_31_49.adt` hash and raw MCNK origins recorded in
ADR 0001; OpenRealm independently uses the same filename-axis ordering
- Rebuild: none; private/generated prerequisites remain outside Git
- Remaining risks: server spawn fixture, native placement conversion and
MDDF/MODF Euler semantics remain subsequent M01 packages
- Recommended merge order: merge this correction before golden fixture or consumer migration
- Documentation: ADR 0001 and coordinate-mapping module data flow, contract
version, capability evidence and known risks updated
+111
View File
@@ -0,0 +1,111 @@
# M01-FND-COORDS-001 — Canonical coordinate contracts
<!-- OPENWC_CLAIM:M01-FND-COORDS-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-FND-COORDS-001:c8e99f2 -->
## Ownership
- Target: M01
- Program: FND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-coordinate-mapper`
- Lease expires UTC: 2026-07-15
- Integrator: M01 milestone integrator
## Outcome
Introduce scene-free value objects for canonical WoW, server, ADT placement,
ADT tile/chunk/local and Godot world coordinate spaces, plus the single pure
`CoordinateMapper` contract for position and world-yaw conversions.
## Non-goals
- Migrating `StreamingWorldLoader`, native parsers, sky, player or renderer code.
- Defining model-specific MDDF/MODF Euler rotation corrections.
- Introducing `StreamingFocus`, typed IDs or a test framework dependency.
- Claiming visual parity from arithmetic round trips.
## Paths
- Exclusive: `src/domain/coordinates/**`, `src/tools/verify_coordinate_mapper.gd`,
`docs/modules/coordinate-mapping.md`, `docs/adr/0001-canonical-world-coordinates.md`
- Shared/hotspots: `docs/modules/README.md`, this claim
- Generated/ignored: Godot import metadata and local test output
## Contracts and data
- Public API/events: immutable coordinate value objects and pure mapper methods
- Schema/format version: no persisted format; contract version 1 in module docs
- Migration/compatibility: additive contract; existing renderer conversions remain
unchanged until a later consumer migration package
- Consumers: future renderer, network, gameplay and server-data adapters
- Rollout order: contract and fixtures first, then native/parser and renderer consumers
## Dependencies
- Requires: merged M00 build 12340 coordinate calibration evidence
- Blocks: M01 renderer coordinate migration and `StreamingFocus`
- External state: no proprietary inputs; reference formulas are source-only evidence
## Verification
- Commands: headless coordinate contract probe, headless project load,
coordination and documentation gates
- Fixtures: five build 12340 camera points, ADT map center/edge/boundary points,
server/ADT/Godot round trips and yaw normalization cases
- Fidelity evidence: M00 observed build 12340 positions plus independent
OpenRealm/WoWee and TrinityCore grid formulas
- Performance budget: constant-time scalar arithmetic with no allocation beyond result values
## Documentation deliverables
- Inline public API docs: every public value object and mapper method
- Module specification: purpose, public API, inputs/outputs, ownership, errors and source map
- Data-flow diagram: server/ADT/canonical/Godot mappings
- Dependency diagram: canonical contract consumers and forbidden scene dependency
- Sequence/state diagrams: not applicable; mapper is synchronous and stateless
- ADR: coordinate axes, units, tile indexing and compatibility rollout
## Simplicity and naming
- Important names introduced: `CanonicalWowWorldPosition`, `ServerWorldPosition`,
`AdtPlacementPosition`, `AdtTileCoordinate`, `AdtChunkCoordinate`,
`AdtTileLocalPosition`, `GodotWorldPosition`, `WorldYaw`, `CoordinateMapper`
- Simplest considered solution: scalar immutable value objects and one pure mapper
- Rejected complexity/abstractions: generic vector-space framework, matrices,
dependency injection and a third-party test framework
- Unavoidable complexity and justification: distinct source spaces prevent silent axis swaps
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: repository/reference audit, ADR, immutable value objects, pure mapper,
build 12340/boundary/yaw fixtures, module specification and repository gates
- Next: integrator review and merge before renderer/native consumer migration
- Blocked by:
## Handoff
- Commit: `f45695c`
- Branch: `work/sindo-main-codex/m01-coordinate-mapper`
- Outcome: additive contract for canonical/server/ADT/Godot positions, ADT
tile/chunk/local ownership and world-facing yaw; no existing consumer changed
- Public contracts: contract version 1 documented in
`docs/modules/coordinate-mapping.md`; no persisted schema or cache change
- Verification: coordinate mapper PASS (5 golden points, 8 tile boundaries,
5 yaw cases); M00 coordinate calibration PASS (5 points, maximum error
`0.000015`); renderer manifest, coordination, documentation, dependency and
whitespace checks passed; headless project load completed with expected
missing proprietary-data diagnostics in the isolated worktree
- Fidelity: observed build 12340 positions match within `0.002` yard; formulas
cross-checked against TrinityCore, OpenRealm and WoWee; visual parity is not claimed
- Migration/rebuild: none for this additive package; consumers migrate only
after merge and must preserve renderer checkpoints
- Remaining risks: native loaders and renderer still use manual conversions;
MDDF/MODF Euler mapping is intentionally unresolved; server-spawn integration
and finite-value adapter validation remain later M01 packages
- Recommended merge order: this contract first, coordinate fixtures/server-spawn
audit second, renderer/native consumers third, manual-conversion search gate last
- Documentation: ADR 0001; coordinate-mapping module spec with data-flow and
dependency diagrams; inline API documentation on all public symbols
@@ -0,0 +1,112 @@
# M01-FND-DOMAIN-IDENTITIES-001 — Stable domain identity namespaces
<!-- OPENWC_CLAIM:M01-FND-DOMAIN-IDENTITIES-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-FND-DOMAIN-IDENTITIES-001:c8e99f2 -->
## Ownership
- Target: M01
- Program: FND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-domain-identities`
- Lease expires UTC: 2026-07-15
- Integrator: M01 milestone integrator
## Outcome
Add scene-free, immutable identity values for stable authored content,
session-local entities, opaque WoW wire GUIDs and namespaced server entries so
callers cannot silently interchange their numeric/string representations.
## Non-goals
- Allocating Content IDs, Entity IDs or server entries.
- Decoding WoW GUID high types before the build-12340 protocol package.
- Defining map/spell/item/quest/display/sound IDs in this package.
- Migrating gameplay, network or Content Project consumers that do not exist yet.
## Paths
- Exclusive: `src/domain/identity/`, `src/tools/verify_domain_identities.gd`,
`docs/modules/domain-identities.md`, `docs/adr/0002-domain-identity-namespaces.md`
- Shared/hotspots: `docs/ARCHITECTURE.md`, this claim
- Generated/ignored: Godot import metadata
## Contracts and data
- `ContentId`: canonical lowercase UUID text persisted with schema-owned content
- `EntityId`: positive session-local integer, never a persisted content/server identity
- `WowGuid`: opaque high/low unsigned 32-bit words preserving wire bits
- `ServerEntryId`: positive integer plus non-empty adapter/table namespace
- Migration: additive types only; no existing persisted data changes
## Dependencies
- Requires: M01 coordinate/focus seams through `77cd17a`
- Blocks: Content Project schemas, server adapters, network entity mapping and gameplay registry
- External state: no dependency or proprietary input
## Verification
- Commands: identity contract/boundary verifier, dependency search,
coordination/documentation gates and headless project load
- Fixtures: valid/invalid UUIDs, session IDs, full unsigned GUID words and
duplicate numeric server entries in different namespaces
- Fidelity evidence: GUID words remain opaque and lossless until build-12340
packet fixtures establish semantic decomposition
- Performance budget: constant-time scalar/string validation outside frame loops
## Documentation deliverables
- Inline public API docs: every value and validation/equality method
- Module specification: persistence, ownership, namespace mapping and recovery
- Data-flow diagram: authored/runtime/wire/server identities into adapters
- State/sequence diagrams: lifecycle diagram for content/session/wire/server identity
- ADR: namespace separation and UUID persistence decision
## Simplicity and naming
- Important names introduced: `ContentId`, `EntityId`, `WowGuid`, `ServerEntryId`
- Simplest considered solution: four independent values with explicit fields
- Rejected complexity/abstractions: generic ID base class, registry service,
UUID generator and speculative GUID high-type enum
- Unavoidable complexity and justification: server entry namespace and split GUID
words prevent collisions and signed 64-bit loss
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: four identity values, boundary verifier, ADR, module specification,
architecture mapping and repository gates
- Next: integrator review and merge before the manual axis-conversion gate
- Blocked by:
## Handoff
- Commit: `c1dc07c`
- Branch: `work/sindo-main-codex/m01-domain-identities`
- Outcome: authored content, runtime entities, WoW wire GUIDs and namespaced
server entries now have separate immutable scene-free value objects
- Contract/schema: identity contract version 1; `ContentId` uses canonical
lowercase UUID text. No existing schema/cache is migrated; containing future
schemas still require their own version and duplicate/reference policy
- Verification: DomainIdentities PASS (`5` ContentId, `5` EntityId, `6` WowGuid,
`5` ServerEntryId cases); StreamingFocus, coordinate golden fixtures and
CoordinateMapper PASS; M00 calibration PASS with maximum error `0.000015`;
renderer manifest PASS (`7` checkpoints); headless project load exit `0`;
coordination, documentation, naming/dependency and whitespace checks passed
- Fidelity: `WowGuid` preserves two complete unsigned 32-bit wire words and
explicitly does not claim build-12340 high-type semantics without packet
fixtures; zero GUID remains an uninterpreted observable sentinel
- Rebuild: none; no dependency or proprietary input. Clean-worktree project
load reports expected missing ignored extracted assets/character resources
- Remaining risks: no ID allocator, mapping registry or server namespace
vocabulary exists yet; UUID shape does not enforce generator version/variant;
GDScript callers must use domain `equals` or canonical keys rather than
reference `==`
- Recommended merge order: after StreamingFocus at `77cd17a`, before the M01
manual axis-conversion rule/search gate
- Documentation: ADR 0002, domain-identities module API/input-output/data-flow/
lifecycle/persistence/recovery/capability/source-map sections, module registry
and architecture Domain mapping added or updated
@@ -0,0 +1,109 @@
# M01-QAR-COORD-FIXTURES-001 — Coordinate golden fixtures
<!-- OPENWC_CLAIM:M01-QAR-COORD-FIXTURES-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-QAR-COORD-FIXTURES-001:c8e99f2 -->
## Ownership
- Target: M01
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-coordinate-fixtures`
- Lease expires UTC: 2026-07-15
- Integrator: M01 milestone integrator
## Outcome
Add a versioned, non-proprietary fixture and headless validator joining one
pinned AzerothCore player spawn, raw ADT/MCNK metadata and the five M00
original-client coordinate observations through coordinate contract version 2.
## Non-goals
- Committing ADT files, SQL dumps or original-client screenshots.
- Claiming TrinityCore spawn equivalence without a pinned populated TDB source.
- Migrating renderer/native consumers or rendering a live server spawn.
- Changing coordinate formulas, IDs or `StreamingFocus`.
## Paths
- Exclusive: `src/tests/fixtures/coordinate_golden_points.json`,
`src/tools/verify_coordinate_golden_fixtures.gd`
- Shared/hotspots: `docs/modules/coordinate-mapping.md`, this claim
- Generated/ignored: extracted ADT data, server database downloads and Godot metadata
## Contracts and data
- Public API/events: no new production API; fixture schema version 1
- Coordinate contract: version 2, unchanged
- Migration/compatibility: additive test data; fixture consumers reject unknown schema versions
- Consumers: M01 coordinate mapper, future native/renderer/server adapter migrations
## Dependencies
- Requires: merged coordinate contract version 2 at `b55bfca`
- Blocks: coordinate consumer migration and golden server-spawn renderer integration
- External state: source evidence reduced to pinned revision, numeric rows and SHA-256 hashes
## Verification
- Commands: fixture validator, coordinate mapper probe, M00 calibration,
manifest, coordination and documentation gates
- Fixtures: AzerothCore Human Warrior start; raw `Azeroth_32_48.adt` MCNK
`(3,12)`; five build 12340 camera points
- Fidelity evidence: exact source provenance and mapper outputs with bounded tolerances
- Performance budget: negligible headless JSON and scalar arithmetic
## Documentation deliverables
- Inline public API docs: fixture-validator header and field validation functions
- Module specification: fixture schema, provenance, verification and source map
- Data-flow diagram: server/raw/client fixtures into mapper assertions
- State/sequence/dependency diagrams: unchanged; synchronous stateless validation
## Simplicity and naming
- Important names introduced: `coordinate_golden_points`,
`verify_coordinate_golden_fixtures`
- Simplest considered solution: one JSON fixture and one existing-style headless script
- Rejected complexity/abstractions: test framework dependency, SQL parser, ADT bytes in Git
- Unavoidable complexity and justification: three independent source categories need explicit provenance
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: pinned source research, schema 1 fixture, headless validator, module
documentation and all package gates
- Next: integrator review and merge before coordinate consumer migration
- Blocked by:
## Handoff
- Commit: `ce4f7ec`
- Branch: `work/sindo-main-codex/m01-coordinate-fixtures`
- Outcome: one versioned fixture now joins a pinned AzerothCore Human Warrior
spawn, private raw MCNK metadata and five original-client build 12340 points
through coordinate contract version 2
- Contract/schema: additive test fixture schema 1; production coordinate API and
contract version 2 are unchanged; proprietary bytes remain outside Git
- Verification: golden fixture PASS (`1` server spawn, `1` raw ADT chunk, `5`
original-client points); CoordinateMapper PASS (`5` golden points, `8` tile
boundaries, `2` raw MCNK cases, `5` yaw cases); M00 calibration PASS with
maximum error `0.000015`; renderer manifest PASS (`7` checkpoints); coordination,
documentation, dependency and whitespace checks passed
- Fidelity: AzerothCore source pinned at revision
`68fcf0098b16388093989627f37be530fc91f07d`; private
`Azeroth_32_48.adt` SHA-256
`D66E27FD82B461AE38B78562952AED428E619777A3F3E35DD8FF97444644770A`;
server and raw data independently resolve tile `(32,48)` and chunk `(3,12)`
- Rebuild: no proprietary input is required to rerun the committed fixture;
local ignored renderer resources are still required by the inherited M00
manifest probe
- Remaining risks: TrinityCore equivalence needs a pinned populated TDB snapshot;
live server adapter, renderer integration and MDDF/MODF Euler semantics remain
subsequent M01 work
- Recommended merge order: after coordinate contract version 2 (`b55bfca`) and
before live coordinate consumer migration
- Documentation: coordinate-mapping module inputs/outputs, persistence, data-flow
diagram, verification, capability matrix, risks and source map updated
@@ -0,0 +1,101 @@
# M01-QAR-INTEGRATOR-CLOSEOUT-001 — M01 milestone closeout
<!-- OPENWC_CLAIM:M01-QAR-INTEGRATOR-CLOSEOUT-001:sindo-main-codex:2026-07-16 -->
<!-- OPENWC_HANDOFF:READY:M01-QAR-INTEGRATOR-CLOSEOUT-001:dd412e6 -->
## Ownership
- Target: M01
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-integrator-closeout`
- Lease expires UTC: 2026-07-16
- Integrator: sindo-main-codex, continuing the user-directed milestone workflow on 2026-07-14
## Outcome
Audit every merged M01 work package on current `master`, record final evidence,
close M01 and activate M02 only if all target verification and documentation
criteria pass.
## Non-goals
- Change coordinate, identity, streaming or renderer behavior.
- Start M02 implementation.
- Add new compatibility or visual-parity claims.
- Commit proprietary assets, generated UIDs, caches or capture output.
## Paths
- Exclusive: M01/M02 target status, M01 final Evidence and M01 claim acceptance markers
- Shared/hotspots: `targets/README.md`, `targets/DEVELOPMENT_ROADMAP.md`, this claim
- Generated/ignored: local Godot imports, renderer corpus and `user://` reports
## Contracts and data
- Public APIs, schemas, cache formats and migrations: unchanged
- Coordinate contract remains version 2
- Fixture schema remains version 1
- Consumers: milestone sequence and M02 work packages
## Dependencies
- Requires: all seven M01 READY commits integrated through master `c8e99f2`
- Blocks: M02 activation
- External state: server-spawn GUI hashes and original-client numeric evidence are recorded; proprietary files remain outside Git
## Verification
- Commands: all M01 domain/fixture/boundary/focus/identity/spawn gates,
unified renderer dry-run, coordination/documentation checks and diff hygiene
- Fidelity evidence: five build-12340 points, raw ADT metadata, pinned
AzerothCore spawn and cache-complete GUI marker capture
- Performance: no runtime change; preserve recorded renderer cold/warm evidence
## Documentation deliverables
- M01 final target Evidence and checklist
- M01 claim integration-acceptance markers
- Target index and roadmap transition to M02
- API/module specifications and diagrams are audited, not changed unless a gap is found
## Simplicity and naming
- Important names introduced: none beyond the closeout work-package ID
- Simplest approach: evidence/status-only integrator patch
- Rejected complexity: new one-off closeout framework or behavioral changes
- Unavoidable complexity: none
## Status
- State: ready-for-review
- Done: accepted seven M01 packages, reran post-merge gates, recorded complete
target Evidence, closed M01 and activated M02
- Next: merge closeout commit before starting an M02 implementation claim
- Blocked by:
## Handoff
- Commit: `dd412e6`
- Branch: `work/sindo-main-codex/m01-integrator-closeout`
- Outcome: M01 is `DONE` with all seven checklist items and complete Evidence;
M02 is the only `ACTIVE` target and `targets/README.md` points to it.
- Integration audit: all seven M01 READY commits are ancestors of master
`c8e99f2`; their claims now carry `OPENWC_INTEGRATION:ACCEPTED` markers.
- Verification: unified renderer dry-run passed project load, material/dedupe/
shutdown gates, manifest `7/7/7`, calibration maximum error `0.000015`,
coordinate boundary (`84` files) and server-spawn renderer `(32,48)/(3,12)`;
coordinate mapper, golden fixtures, StreamingFocus and domain identity gates
passed. Coordination and documentation gates passed; coordination reports
only five already-expired M00 claim warnings.
- Fidelity: closeout preserves five build-12340 coordinate observations, raw ADT
evidence, pinned AzerothCore spawn mapping and cache-complete Northshire GUI
evidence without claiming original-client visual parity or TrinityCore row
equivalence.
- Rebuild/migration: none. Coordinate contract remains version 2; fixture schema
remains version 1; renderer cache formats are unchanged.
- Remaining risks: recorded in M01 Evidence—TrinityCore populated spawn,
placement Euler parity, native parser boundary and broader renderer parity.
- Documentation: M01 target Evidence/checklist, target index and roadmap current
state updated. Existing coordinate, identity and renderer module specs/API/
diagrams were audited and passed the documentation gate.
@@ -0,0 +1,135 @@
# M01-QAR-SERVER-SPAWN-RENDERER-001 — Golden server spawn renderer evidence
<!-- OPENWC_CLAIM:M01-QAR-SERVER-SPAWN-RENDERER-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-QAR-SERVER-SPAWN-RENDERER-001:c8e99f2 -->
## Ownership
- Target: M01
- Program: QAR/RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-server-spawn-renderer`
- Lease expires UTC: 2026-07-15
- Integrator: M01 milestone integrator
## Outcome
Route the pinned AzerothCore Human Warrior spawn fixture through
`CoordinateMapper` into the live Eastern Kingdoms renderer and produce
repeatable headless contract checks plus GUI screenshot evidence at the mapped
ADT tile/chunk.
## Non-goals
- Connecting to a live AzerothCore or TrinityCore database.
- Claiming TrinityCore spawn equivalence without a pinned populated TDB row.
- Changing coordinate formulas, streaming radii, terrain, player movement or
production character presentation.
- Adding proprietary assets or screenshots to Git.
## Paths
- Exclusive: `src/tools/server_spawn_render_manifest.json`,
`src/tools/verify_server_spawn_renderer.gd`
- Shared/hotspots: `src/tools/capture_render_checkpoints.gd`, renderer runner,
coordinate/world-renderer module documentation, `RENDER.md`, this claim
- Generated/ignored: Godot UIDs/import metadata and `user://` PNG/JSON evidence
## Contracts and data
- Fixture schema and coordinate contract version remain unchanged.
- Additive diagnostic checkpoint metadata may request a renderer-native marker;
existing M00 checkpoints remain byte-for-byte compatible.
- The spawn remains sourced from pinned AzerothCore revision
`68fcf0098b16388093989627f37be530fc91f07d`.
## Dependencies
- Requires: merged M01 packages through `a07a487`
- Blocks: M01 golden server-spawn renderer criterion and milestone closeout
- External state: GUI capture requires the existing local extracted/cached
renderer corpus; headless contract verification remains non-proprietary
## Verification
- Commands: dedicated spawn verifier, coordinate fixture/mapper/boundary gates,
renderer baseline dry-run, GUI checkpoint capture and human inspection
- Fixture: AzerothCore race `1`, class `1`, map `0`, server position
`(-8949.95, -132.493, 83.5312)`
- Expected renderer result: Godot position
`(17199.159666667, 83.5312, 26016.616666667)`, ADT `(32,48)`, MCNK `(3,12)`
- Fidelity classification: server/coordinate integration evidence only; it does
not establish full original-client visual parity
## Documentation deliverables
- Inline API/tool documentation for new verifier and marker metadata
- Coordinate-mapping module capability/evidence update
- World-renderer checkpoint input/output/source-map update when marker support is added
- Existing synchronous coordinate data-flow diagram updated only if flow changes
## Simplicity and naming
- Important names: `server_spawn_render_manifest`,
`verify_server_spawn_renderer`, `diagnostic_spawn_marker`
- Simplest approach: reuse the existing checkpoint capture pipeline with one
dedicated manifest and a renderer-native diagnostic marker
- Rejected complexity: live DB adapter, new scene-test framework and production
spawn entity implementation before the network/gameplay milestones
- Performance: one diagnostic checkpoint outside production runtime
## Status
- State: ready-for-review
- Done: fixture-to-renderer manifest/verifier, renderer-native marker, unified
baseline integration, cold/warm GUI evidence, documentation and log cleanup
- Next: integrator review, merge cleanup/handoff and M01 closeout audit
- Blocked by:
## Handoff
- Commits: implementation `24ddc99`; required cleanup `318e6ae`
- Branch: `work/sindo-main-codex/m01-server-spawn-renderer`
- Outcome: the pinned AzerothCore Human Warrior start is routed through
`CoordinateMapper` into the ordinary Eastern Kingdoms capture scene. A
depth-tested magenta marker begins at the exact mapped spawn origin.
- Contract/schema: additive diagnostic manifest schema 1 and marker metadata;
coordinate contract version 2, production renderer APIs, cache formats and
`Blizzlike335` behavior are unchanged.
- Verification: `SERVER_SPAWN_RENDERER PASS spawn=1 checkpoint=1 tile=32_48
chunk=3_12 profile=Blizzlike335`; unified renderer dry-run passed project,
materials, M2 dedupe, shutdown, `7/7/7` manifest, five-point calibration,
coordinate-boundary and server-spawn steps; coordinate golden fixtures,
mapper, StreamingFocus, domain identities, documentation and whitespace gates
passed. Coordination passed with five expired M00-claim warnings only.
- GUI evidence: two `1280x900` cold/warm PNGs captured under
`user://server_spawn_renderer_m01_gui_run2`; focus tile `(32,48)`, terrain
quality `100/100`, missing cache `0`, queues drained, report results `2`.
Human inspection confirms the marker is on rendered terrain beside the road
at Northshire Abbey rather than below terrain or in an adjacent tile. PNG
hashes: cold `c08c43bcb75e5b3277105afb0d4e5a76caae9db91a7db64488770ffa03e32589`,
warm `1b75237a090ea163836372a8e39e778c909773f4508063adc3f70a3e12a85a62`.
- Fidelity: source remains AzerothCore revision
`68fcf0098b16388093989627f37be530fc91f07d`; server
`(-8949.95,-132.493,83.5312)` maps to Godot
`(17199.159666667,83.5312,26016.616666667)`, ADT `(32,48)`, MCNK `(3,12)`.
This proves coordinate/renderer integration, not original-client visual parity
or TrinityCore populated-row equivalence.
- Runtime notes: D3D12 descriptor-heap initialization fell back to Vulkan;
optional ignored character/ambient GLB imports were unavailable. Neither
affected terrain/marker evidence. The known anonymous ObjectDB teardown
warning remained; no Node, renderer resource or RID leak diagnostic occurred
in the cache-complete run.
- Repository hygiene: four accidentally committed local GUI logs are removed by
`318e6ae`; root `*.stdout.log`/`*.stderr.log` files are now ignored. Generated
PNG/JSON evidence and proprietary corpus remain outside Git.
- Remaining risks: the diagnostic marker is not a production network entity;
live server adapters belong to M06/M08. Exact original-client character spawn
presentation and TrinityCore database equivalence remain unverified.
- Documentation: `RENDER.md`, renderer-baseline procedure, coordinate-mapping
and world-renderer module API/input-output/data-flow/capability/source-map
sections updated. No lifecycle/state diagram changed because the verifier and
mapper path are synchronous; capture reuses the documented renderer lifecycle.
- Recommended merge order: `318e6ae` after master merge `747fae8`. Then the M01
milestone integrator may accept all M01 claims, update target Evidence/checks
and evaluate `OPENWC_TARGET_DONE`.
@@ -0,0 +1,120 @@
# M01-RND-STREAMING-FOCUS-001 — Explicit streaming focus contract
<!-- OPENWC_CLAIM:M01-RND-STREAMING-FOCUS-001:sindo-main-codex:2026-07-15 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-RND-STREAMING-FOCUS-001:c8e99f2 -->
## Ownership
- Target: M01
- Program: RND/FND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m01-streaming-focus`
- Lease expires UTC: 2026-07-15
- Integrator: M01 milestone integrator
## Outcome
Introduce a scene-free `StreamingFocus` value and make runtime/test streaming
consume it through an explicit source or public setter instead of discovering
the active `Camera3D` from a viewport.
## Non-goals
- Extracting `WorldRenderFacade` or `StreamingTargetPlanner` from the monolithic loader.
- Adding direction, velocity, frustum or multi-focus planning.
- Decomposing the player controller before M02.
- Changing terrain, M2, WMO, liquid, cache or LOD formulas.
## Paths
- Exclusive: `src/domain/streaming/`, `src/tools/verify_streaming_focus.gd`
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/scenes/streaming/eastern_kingdoms_streaming.tscn`,
`src/scenes/streaming/kalimdor_streaming.tscn`, renderer diagnostic tools,
`docs/modules/world-renderer.md`, this claim
- Generated/ignored: local extracted assets, renderer caches and Godot import metadata
## Contracts and data
- Public API: immutable `StreamingFocus`; loader `set_streaming_focus` and
`refresh_streaming_focus`
- Source adapter: explicit `streaming_focus_source_path` may reference any `Node3D`
- Migration: runtime scenes use player focus; capture/probe tools explicitly use
their dedicated camera as the source
- Compatibility: streaming radii/LOD/cache behavior and coordinate contract v2 unchanged
## Dependencies
- Requires: coordinate contract version 2 and golden fixtures at `52e1b2b`
- Blocks: M01 renderer/test focus exit criterion and later renderer facade extraction
- External state: no new dependency or proprietary input
## Verification
- Commands: streaming focus contract/integration verifier, renderer baseline
manifest/calibration, headless scene smoke, coordination/documentation gates
- Fixtures: Node3D player-style source and explicit capture-style setter
- Fidelity evidence: existing seven renderer checkpoints and build-12340 coordinate
calibration must remain unchanged
- Performance budget: one scalar focus snapshot per configured streaming interval;
no new per-tile or per-chunk work
## Documentation deliverables
- Inline public API docs: focus value and loader public methods
- Module specification: inputs/outputs, ownership, lifecycle, failure/recovery and source map
- Data-flow diagram: player/editor/capture source to focus contract to loader
- State/sequence diagram: focus sampling and refresh threshold sequence
## Simplicity and naming
- Important names introduced: `StreamingFocus`, `streaming_focus_source_path`,
`set_streaming_focus`, `refresh_streaming_focus`
- Simplest considered solution: one immutable value plus one explicit scene adapter path
- Rejected complexity/abstractions: provider interface hierarchy, service locator,
multi-focus registry and predictive motion fields
- Unavoidable complexity and justification: editor viewport remains a separate
adapter because its camera is owned by `EditorInterface`
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: contract, runtime/editor/capture migration, headless regression,
module diagrams, renderer documentation and cold/warm GUI capture
- Next: integrator review and merge before typed identity work
- Blocked by:
## Handoff
- Commit: `7815385`
- Branch: `work/sindo-main-codex/m01-streaming-focus`
- Outcome: runtime streaming consumes immutable `StreamingFocus`; Eastern
Kingdoms and Kalimdor scenes explicitly follow the player, while capture and
terrain/occluder probes explicitly follow their dedicated camera
- Contract/API: new scene-free `StreamingFocus(GodotWorldPosition)` plus loader
`set_streaming_focus`, `refresh_streaming_focus` and
`streaming_focus_source_path`; `camera_path` remains only for optional overview positioning
- Verification: StreamingFocus PASS (`1` contract, `2` runtime scenes, `3`
capture tools); coordinate golden fixtures and CoordinateMapper PASS; M00
calibration PASS with maximum error `0.000015`; manifest PASS (`7`
checkpoints); runtime-cache shutdown PASS; headless runtime scene exit `0`;
coordination, documentation, dependency and whitespace checks passed
- Renderer checkpoint: standard 8-second GUI capture completed `14` images
(`7` cold + `7` warm) and wrote schema-1 `report.json`; focus tiles changed
through the public contract; no Node/resource/RID leak diagnostic appeared
- Fidelity: checkpoint camera positions, coordinate contract v2, streaming radii,
LOD formulas, cache formats and quality profiles are unchanged; this is
regression evidence, not a new `1:1` parity claim
- Rebuild: none; GUI verification used local ignored extracted assets/cache
junctions. Missing worktree `.godot/imported` copies for several incidental M2
GLBs produced existing cache-load fallback diagnostics only
- Remaining risks: the monolithic loader still owns planning/jobs/presentation;
direction, velocity, frustum and multiple foci remain M03 planner work. The
known timing-dependent zero-reference `ObjectDB` shutdown warning occurred,
without Node/resource/RID leak diagnostics
- Recommended merge order: after coordinate fixtures at `52e1b2b`, before typed
identity and renderer-facade extraction
- Documentation: `world-renderer.md` inputs/outputs, public API, lifecycle,
data-flow and sequence diagrams, ownership, recovery, verification,
capability matrix, risks and source map updated; `RENDER.md` updated
+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/
coordinate/server-spawn gates and planned all seven checkpoints; the combined
run reported coordinate `files=103`. Missing proprietary GLB/DBC/ADT inputs
produced the expected diagnostics only.
- Repository gates: documentation `module_specs=8`, coordination
`fallback_claims=30`; five unrelated expired M00 claim warnings remain.
- Fidelity: this package provides negative evidence that sandbox-only debug
movement cannot alter the `Blizzlike335` profile. It does not prove ordinary
movement, bindings, flight or timing match build 12340.
- Migration: direct `LocalPlayerMovementController.new(...)` callers that need
debug behavior must now pass `render_sandbox()`; omitted/null capability is
intentionally compatibility-safe. Existing repository scenes require no edit.
- Cache/persistence: no schema, cache, binding or stored-profile migration.
- Local ignored inputs: native extension DLL, UID cache and generated ADT
resource scripts supported renderer verification and are not committed.
- Risks: runtime renderer scenes still default to `RenderSandbox`; the future
application shell must explicitly choose its profile. `Blizzlike335` currently
guarantees only debug exclusion, not complete movement fidelity.
- Recommended merge order: merge after presentation (already on master), then
perform the final M02 integration/evidence audit before any target closeout.
- Documentation: updated movement/input API, inputs/outputs, data flow, state,
sequence, ownership, failure/recovery, capabilities, verification and source maps.
@@ -0,0 +1,119 @@
# M02-GMP-TERRAIN-QUERY-001 — Player terrain query boundary
<!-- OPENWC_CLAIM:M02-GMP-TERRAIN-QUERY-001:sindo-main-codex:2026-07-16 -->
<!-- OPENWC_HANDOFF:READY:M02-GMP-TERRAIN-QUERY-001:a45d521 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-TERRAIN-QUERY-001:f5bb64e -->
## Ownership
- Target: M02
- Program: GMP/RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-terrain-query`
- Lease expires UTC: 2026-07-16
- Integrator: M02 milestone integrator
## Outcome
Introduce a typed `TerrainQuery` boundary and move ADT loading, caching, chunk
selection and height interpolation out of `ThirdPersonWowController` without
changing current spawn/ground-snap behavior.
## Non-goals
- Change ADT topology, coordinate formulas, terrain mesh or renderer caches.
- Add physics collision, slopes, water, jump/fall/swim or server movement.
- Reuse the streaming renderer cache before its public terrain-query contract exists.
- Extract camera or character presentation.
- Mark M02 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/gameplay/terrain/`, `src/tools/verify_terrain_query.gd`,
`docs/modules/terrain-query.md`, this claim
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`,
`src/tools/verify_player_input.gd`,
`src/tools/verify_coordinate_conversion_boundaries.gd`,
`docs/modules/local-player-movement.md`,
`docs/modules/README.md`
- Generated/ignored: local `.godot`, native DLL, generated ADT resources and renderer corpus
## Contracts and data
- Public API: `TerrainQuery.sample_ground_height(GodotWorldPosition)` returning
immutable `TerrainGroundSample`
- Production adapter: `AdtTerrainQuery` with owned per-tile parse cache
- Test/data-source seam: optional ADT tile loader callable at construction
- Coordinate contract version, ADT format, renderer cache and persistence: unchanged
- Consumers: current player scene; future movement/collision policies
## Dependencies
- Requires: merged movement controller on master `5206c42`
- Blocks: camera/presentation extraction from the player hotspot
- External state: production uses existing native `ADTLoader`; synthetic tests need no proprietary data
## Verification
- Commands: synthetic height/cache/failure verifier, player input/movement
regressions, asset-free scene, coordinate/StreamingFocus gates, renderer dry-run
and repository gates
- Fixtures: synthetic 145-height chunk payload and injected flat terrain query
- Fidelity evidence: preserves existing outer-grid bilinear interpolation,
spawn ground offset and per-tick snap formula only
- Performance budget: one cached tile lookup and local interpolation per ground query;
no new I/O after first tile load
## Documentation deliverables
- Inline public API docs for query, sample and ADT adapter
- Terrain-query module spec with inputs/outputs, data-flow, cache lifecycle and sequence diagrams
- Updated movement/coordinate consumer boundaries, source maps and module registry
## Simplicity and naming
- Important names: `TerrainQuery`, `TerrainGroundSample`, `AdtTerrainQuery`
- Simplest approach: one narrow query contract, one typed result and one existing-format adapter
- Rejected complexity: general collision framework, terrain service locator and renderer-cache coupling
- Unavoidable complexity: ADT 145-height layout and chunk lookup stay isolated in adapter
- Measured optimization evidence: existing per-tile cache retained; no new optimization
## Status
- State: ready-for-review
- Done: typed query/sample contract, cached ADT adapter, player migration,
synthetic interpolation/cache/failure tests, injected scene regression and documentation
- Next: M02 integrator reviews and merges before camera-rig extraction
- Blocked by:
## Handoff
- Commit: `a45d521`
- Branch: `work/sindo-main-codex/m02-terrain-query`
- Outcome: `ThirdPersonWowController` no longer loads ADTs, caches tile
dictionaries, selects chunks or interpolates height grids. It consumes a
replaceable typed `TerrainQuery` and retains only existing offset/snap policy.
- Public contracts: additive immutable `TerrainGroundSample`, replaceable
`TerrainQuery`, cached `AdtTerrainQuery` and player `set_terrain_query`.
Coordinate contract version, ADT/native format and renderer caches are unchanged.
- Verification: `TERRAIN_QUERY PASS contract=4 interpolation=1 cache=1
failures=2 player_injection=1`; player-input and local-movement regressions
passed; asset-free scene exited `0`; coordinate boundary passed with five
required consumers and StreamingFocus passed; renderer dry-run passed eight
pre-capture gates and seven checkpoint plans; coordination/documentation/diff gates passed.
- Fidelity: synthetic fractional-grid fixture locks the inherited 145-height
outer-grid bilinear result within `0.002` Godot units; injected scene locks
spawn offset `0.05` and physics snap. This is sandbox-regression evidence,
not build-12340 triangle/hole/collision parity.
- Local verification inputs: 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 all contract steps returned success.
- Rebuild/migration: none; caches are transient and existing formats remain unchanged.
- Remaining risks: first ADT parse remains synchronous as before; unavailable
tiles cache until query replacement; player still owns snap policy; exact
ADT triangle choice, holes, slopes, liquids and collision remain open.
- Documentation: inline public APIs plus `docs/modules/terrain-query.md` with
inputs/outputs, data-flow, cache state and cross-boundary sequence diagrams,
ownership, failure/recovery, capability status and source map. Coordinate and
movement consumer specifications were updated.
@@ -0,0 +1,111 @@
# M02-QAR-INTEGRATOR-CLOSEOUT-001 — M02 milestone closeout
<!-- OPENWC_CLAIM:M02-QAR-INTEGRATOR-CLOSEOUT-001:sindo-main-codex:2026-07-17 -->
## Ownership
- Target: M02
- Program: QAR
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-integrator-closeout`
- Lease expires UTC: 2026-07-17
- Integrator: sindo-main-codex, continuing the user-directed milestone workflow on 2026-07-15
## Outcome
Audit every merged M02 package on current master, record final structural and
fidelity evidence, close M02 and activate M03 only when all target and repository
gates pass.
## Non-goals
- Change player, movement, terrain, camera, presentation or renderer behavior.
- Claim complete WoW 3.3.5a locomotion/camera parity.
- Implement recorded jump/fall/swim/fly, collision or timing gaps.
- Commit proprietary assets, generated UIDs, caches or user scene changes.
## Paths
- Exclusive: M02/M03 target status, M02 final Evidence, all M02 claim acceptance markers
- Shared/hotspots: `targets/README.md`, `targets/DEVELOPMENT_ROADMAP.md`, this claim
- Generated/ignored: local Godot imports, native DLL, renderer corpus and `user://` reports
## Contracts and data
- Runtime APIs, Input Map actions, fixture schemas and cache formats: unchanged
- Consumers: milestone sequence and future M03 renderer-facade packages
- Fidelity classification distinguishes direct build-12340 binding evidence,
server/reference compatibility evidence and explicitly unverified gaps
## Dependencies
- Requires: all seven M02 READY packages integrated through master `eb122d5`
- Blocks: M03 activation
- External state: private original-client files are hash/provenance inputs only
## Verification
- Commands: all M02 input/movement/capability/terrain/camera/presentation tests,
coordinate/streaming boundaries, unified renderer dry-run, documentation,
coordination and diff hygiene
- Fidelity evidence: build-12340 default binding hashes and selected facts;
pinned TrinityCore turn rate; public reference routing; explicit remaining gaps
- Performance: no runtime change; renderer baseline remains the performance guard
## Documentation deliverables
- M02 final target Evidence/checklist and limitation statement
- M02 claim integration-acceptance markers
- Target index and roadmap transition to M03
- Existing API/module specifications and diagrams audited without behavioral edits
## Simplicity and naming
- Important names introduced: none beyond the closeout work-package ID
- Simplest approach: evidence/status-only integrator patch
- Rejected complexity: behavioral fixes or a new closeout framework
- Unavoidable complexity: explicit evidence classification prevents false 1:1 claims
## Status
- State: ready-for-review
- Done: accepted seven M02 packages, reran post-merge gates, recorded complete
target Evidence, closed M02 and activated M03
- Next: merge closeout commit `1bf5b52` before starting an M03 implementation claim
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M02-QAR-INTEGRATOR-CLOSEOUT-001:1bf5b52 -->
## Handoff
- Commit: `1bf5b52`.
- Branch: `work/sindo-main-codex/m02-integrator-closeout`.
- Outcome: M02 is `DONE` with all eight structural checklist items and complete
classified Evidence; M03 is the only `ACTIVE` target and the target index/
roadmap point to renderer-facade extraction.
- Integration audit: all seven READY implementation commits are ancestors of
merged master `eb122d5`; their claims now carry the corresponding
`OPENWC_INTEGRATION:ACCEPTED` merge markers.
- Verification: input `16/9/3/1/3`, movement `15` cases and `2` transitions,
capability `3` profiles and `2` scenes, terrain `4/1/1/2`, camera `12/3`,
presentation `9/10/3`, coordinate boundaries `103` files and StreamingFocus
`2` runtime scenes/`3` capture tools all passed. Unified renderer dry-run
passed project/material/dedupe/shutdown gates, manifest `7/7/7`, calibration
maximum error `0.000015`, server-spawn renderer and seven checkpoint plans.
- Repository gates: documentation passed with `8` module specs and `7` required
files. Coordination passed with one active target; `13` expired M00 claim
warnings are historical and unrelated to M02.
- Fidelity: direct build-12340 binding hashes/facts are preserved in the
sanitized fixture. TrinityCore turn rate and WoWee mouse routing remain
explicitly reference-only. Translation speeds/camera values are sandbox
regressions, and jump/fall/swim/fly parity remains unimplemented/unverified.
Debug sprint/free flight is negatively proven absent from `Blizzlike335`.
- Remaining risks: target Evidence carries exact follow-up scope for M09/M10/M12:
movement/camera timing, jump/fall/swim/fly, autorun/LMB semantics, active
collision, terrain/liquid policy, persisted bindings, server authority and
prediction/reconciliation. No complete `1:1` claim is made.
- Runtime/cache/migration: no behavioral change, dependency, cache schema or
persisted settings migration in closeout.
- Documentation: M02 target Evidence/checklist, seven acceptance markers,
target index and roadmap state updated. Existing input, movement, terrain,
camera and presentation API/module specs and diagrams passed the documentation gate.
+119
View File
@@ -0,0 +1,119 @@
# M02-RND-CAMERA-001 — Third-person camera rig boundary
<!-- OPENWC_CLAIM:M02-RND-CAMERA-001:sindo-main-codex:2026-07-16 -->
## Ownership
- Target: M02
- Program: RND/GMP
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-camera-rig`
- Lease expires UTC: 2026-07-16
- Integrator: M02 milestone integrator
## Outcome
Move mouse capture, orbit yaw/pitch, zoom state and Camera3D transforms from
`ThirdPersonWowController` into a reusable `ThirdPersonCameraRig`, with an
explicit replaceable camera-collision policy that preserves the current
no-collision sandbox baseline.
## Non-goals
- Enable a new collision/raycast behavior before build-12340 comparison.
- Change initial yaw/pitch, zoom limits, sensitivity, FOV, far plane or camera path.
- Implement first-person, follow lag, shoulder offsets or cinematic cameras.
- Change movement, terrain query, character presentation or renderer streaming focus.
- Mark M02 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/scenes/player/third_person_camera_rig.gd`,
`src/scenes/player/camera_collision_policy.gd`,
`src/scenes/player/no_camera_collision_policy.gd`,
`src/tools/verify_third_person_camera_rig.gd`,
`docs/modules/third-person-camera.md`, this claim
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`,
runtime streaming scenes, player regression scene,
`src/tools/verify_player_input.gd`, `docs/modules/player-input.md`,
`docs/modules/local-player-movement.md`, `docs/modules/README.md`
- Generated/ignored: local `.godot`, native DLL, generated resources and renderer corpus
## Contracts and data
- Public API: `ThirdPersonCameraRig.initialize_for_character`,
`handle_camera_input`, `godot_world_flight_movement_basis`, state getters and
`set_collision_policy`
- Policy: `CameraCollisionPolicy.resolve_camera_distance`; default
`NoCameraCollisionPolicy` returns requested distance unchanged
- Scene paths and renderer camera path remain unchanged
- Schema/cache/coordinate contracts: unchanged
- Consumers: player composition, sandbox flight movement and renderer viewport
## Dependencies
- Requires: merged TerrainQuery package on master `f5bb64e`
- Blocks: character appearance/animation extraction from remaining player hotspot
- External state: none; tests use asset-free camera/player scene
## Verification
- Commands: dedicated orbit/zoom/clamp/policy verifier, input/movement/terrain
regressions, asset-free scene, coordinate/StreamingFocus gates, renderer dry-run
and repository gates
- Fixtures: initial state, remappable action events, mouse deltas and fixed-distance policy
- Fidelity evidence: preserve current `-18°` pitch, `8` distance, `1` zoom step,
`2..18` clamp, `0.003` sensitivity and no-collision output
- Performance budget: constant-time state/transform update; no raycast in baseline policy
## Documentation deliverables
- Inline API/export documentation for rig and collision policies
- Camera module spec with inputs/outputs, data-flow, state and sequence diagrams
- Updated input/movement consumer diagrams/source maps and module registry
## Simplicity and naming
- Important names: `ThirdPersonCameraRig`, `CameraCollisionPolicy`,
`NoCameraCollisionPolicy`
- Simplest approach: one Node3D rig on existing CameraPivot and one explicit identity policy
- Rejected complexity: generic camera framework, spring arm migration and hidden physics raycast
- Unavoidable complexity: rig mutates Camera3D/character Node transforms on main thread
- Measured optimization evidence: not applicable
## Status
- State: ready-for-review
- Done: extracted rig and collision policy, migrated all three scene compositions,
added regressions and completed required module documentation
- Next: milestone integrator reviews and merges `8c1cf9b`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M02-RND-CAMERA-001:8c1cf9b -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-RND-CAMERA-001:68e6f60 -->
## Handoff
- Outcome: `ThirdPersonCameraRig` now owns capture, orbit, zoom and camera
transforms; `ThirdPersonWowController` only dispatches camera events and
consumes the rig basis for sandbox flight.
- Public contracts: `initialize_for_character`, `handle_camera_input`,
`godot_world_flight_movement_basis`, `set_collision_policy`, read-only state,
and `CameraCollisionPolicy.resolve_camera_distance`.
- Verification: camera `state_cases=12 policy_cases=3 scenes=3`, input
`actions=12 intent_cases=6`, movement `cases=12 state_transitions=2`, terrain
`contract=4 interpolation=1 cache=1 failures=2`, coordinate boundary
`files=98 consumers=5`; documentation, coordination and diff checks passed.
- Renderer dry-run: seven checkpoint plans and report completed; expected
diagnostics only for unavailable proprietary corpus/character GLB.
- Fidelity: preserves the sandbox defaults (`-18 degrees`, distance `8`, zoom
`2..18` step `1`, sensitivity `0.003`, pivot `1.7`, far `50000`) and the prior
no-collision behavior. No build-12340 parity claim is made.
- Local ignored inputs: native extension DLL and generated ADT resource scripts
were used for the renderer dry-run and are not part of the commit.
- Migration: none; `ThirdPersonPlayer/CameraPivot/Camera3D` remains stable.
- Risks: active collision and exact original-client camera semantics remain
unverified; exported initial values are captured at ready; mouse mode is
process-global.
- Documentation: added the camera API/module spec plus data-flow, state and
sequence diagrams; updated player-input and local-movement consumer maps.
@@ -0,0 +1,125 @@
# M02-RND-CHARACTER-PRESENTATION-001 — Character presentation boundary
<!-- OPENWC_CLAIM:M02-RND-CHARACTER-PRESENTATION-001:sindo-main-codex:2026-07-16 -->
## Ownership
- Target: M02
- Program: RND/GMP
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-character-presentation`
- Lease expires UTC: 2026-07-16
- Integrator: M02 milestone integrator
## Outcome
Move character GLB composition, geoset/texture/outfit setup and locomotion
animation selection from `ThirdPersonWowController` into independently
replaceable `CharacterAppearancePresenter` and `CharacterAnimationPresenter`
components without changing the current sandbox presentation.
## Non-goals
- Add new model, equipment, animation or build-12340 behavior.
- Change character asset formats, DBC parsing, texture composition or geoset rules.
- Add network-driven appearance/movement snapshots.
- Change input, movement, terrain, camera or renderer streaming behavior.
- Mark M02 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/scenes/character/character_appearance_presenter.gd`,
`src/scenes/character/character_animation_presenter.gd`,
`src/tools/verify_character_presentation.gd`,
`docs/modules/character-presentation.md`, this claim
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`, runtime
streaming scenes, player regression scene, `src/tools/verify_player_input.gd`,
`docs/modules/local-player-movement.md`, `docs/modules/README.md`
- Reused unchanged: geoset controller, texture compositor and outfit resolver
- Generated/ignored: local `.godot`, native DLL, generated resources and renderer corpus
## Contracts and data
- Appearance API loads/replaces one character root under the existing `Visual` node.
- Animation API binds an `AnimationPlayer` from that root and accepts a typed
moving/stationary presentation state.
- Scene paths, model defaults, DBC/cache/coordinate contracts remain unchanged.
- Consumers: player scene composition and renderer viewport only.
## Dependencies
- Requires: merged camera package on master `68e6f60`.
- Blocks: final M02 sandbox-profile gate and target integration audit.
- External state: asset-free tests use a synthetic mesh and AnimationPlayer.
## Verification
- Dedicated appearance composition, replacement, grounding and failure regression.
- Dedicated animation discovery, fallback, looping, blend and state regression.
- Player source-boundary and three-scene wiring checks.
- Existing input/movement/terrain/camera regressions, coordinate gates and renderer dry-run.
- Fidelity evidence: preserve current sandbox model path, scale, yaw, outfit,
Stand/Idle and Run/Walk selection only; no original-client parity claim.
## Documentation deliverables
- Inline public API/export documentation for both presenters.
- Module specification with inputs/outputs, data-flow, lifecycle/state and sequence diagrams.
- Updated movement consumer/source map and module registry.
## Simplicity and naming
- Important names: `CharacterAppearancePresenter`, `CharacterAnimationPresenter`.
- Simplest approach: two small scene components on the existing `Visual` subtree.
- Rejected complexity: generic presenter framework, async asset scheduler and duplicated character systems.
- Unavoidable complexity: scene-tree composition and AnimationPlayer discovery run on the main thread.
- Measured optimization evidence: not applicable.
## Status
- State: ready-for-review
- Done: extracted both presenters, migrated all runtime/regression scenes,
added asset-free regressions and completed required module documentation
- Next: milestone integrator reviews and merges `97bb53f`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M02-RND-CHARACTER-PRESENTATION-001:97bb53f -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-RND-CHARACTER-PRESENTATION-001:8c71e46 -->
## Handoff
- Branch/commit: `work/sindo-main-codex/m02-character-presentation` at `97bb53f`.
- Outcome: `CharacterAppearancePresenter` owns model/geoset/compositor/outfit
composition and `CharacterAnimationPresenter` owns AnimationPlayer discovery,
loop preparation and moving/stationary playback. The player is now only the
composition and horizontal-velocity adapter.
- Changed composition: both runtime scenes and the player regression scene keep
`ThirdPersonPlayer/Visual`; they add `Visual/AnimationPresenter`.
- Public contracts: appearance load/read-root/ready signal and animation
bind/present/read-state APIs documented in the module specification.
- Verification: presentation `appearance_cases=9 animation_cases=10 scenes=3`,
input `actions=12 intent_cases=6`, movement `cases=12 state_transitions=2`,
terrain `contract=4 interpolation=1 cache=1 failures=2`, camera
`state_cases=12 policy_cases=3`, coordinate boundaries `files=99 consumers=5`,
and StreamingFocus `runtime_scenes=2 capture_tools=3` passed.
- Renderer: dry-run passed project/material/dedupe/cache/manifest/calibration/
coordinate/server-spawn gates and planned all seven checkpoints. Missing
proprietary HumanMale GLB, DBC and ADT corpus produced expected diagnostics.
- Repository gates: documentation `module_specs=8`, coordination
`fallback_claims=29`; five unrelated expired M00 claim warnings remain.
- Fidelity: current model path, scale `1`, yaw `90 degrees`, class `1`, blend
`0.15 seconds`, starter outfit and Stand/Idle/Run/Walk selection are preserved.
No build-12340 appearance or animation parity claim is made.
- Migration: repository scenes are migrated. External/custom scenes must move
model/class/scale/yaw exports from the player node to the scripted `Visual`
node and add `Visual/AnimationPresenter`. No cache/database rebuild is needed.
- Local ignored inputs: native extension DLL, UID cache and generated ADT
resource scripts supported the dry-run and are not committed.
- Risks: synchronous model load may hitch; first descendant AnimationPlayer wins;
moving state is a sandbox threshold boolean; complete equipment/animation
fidelity remains open.
- Recommended merge order: merge this package after camera (already on master),
then implement the sandbox profile gate and perform the final M02 integration audit.
- Documentation: added character-presentation API, inputs/outputs, data-flow,
lifecycle/state, sequence, ownership/failure and source-map sections; updated
the module registry and movement presentation consumer map.
@@ -0,0 +1,115 @@
# M03-RND-ADT-WATER-LOAD-PIPELINE-001 — ADT water load pipeline state
<!-- OPENWC_CLAIM:M03-RND-ADT-WATER-LOAD-PIPELINE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-adt-water-load-pipeline`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract ADT water pending-request FIFO/deduplication, active worker task IDs and
worker-safe result mailbox from the loader while preserving loader-owned parse,
budget, stale-result and scene finalization behavior.
## Non-goals
- Instantiate `ADTLoader`, start/wait WorkerThreadPool tasks or parse ADT bytes.
- Consume `WATER_FINALIZE` permits or choose concurrency/profile limits.
- Build/attach/free water Nodes, materials, Meshes or RIDs.
- Change tile/path stale checks, empty-data behavior or `water_loaded` timing.
- Change MH2O/MCLQ parsing or claim liquid fidelity/performance parity.
## Paths
- Exclusive: `src/render/liquid/adt_water_load_pipeline_state.gd`,
`src/tools/verify_adt_water_load_pipeline_state.gd`,
`docs/modules/adt-water-load-pipeline-state.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_render_runtime_cache_shutdown.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
proprietary renderer corpus
## Contracts and data
- Pending requests preserve FIFO and tile-key deduplication.
- Tile release removes all matching pending entries but does not cancel active work.
- Active task IDs are loader-created opaque integers keyed by tile.
- Worker publication and main-thread result pop/clear are mutex protected.
- Result order and Dictionary payload identity remain unchanged.
- Clear releases bookkeeping only; loader waits tasks at orderly shutdown.
- Water parsing, coordinate, material, profile and visual rules are unchanged.
## Dependencies
- Requires: current master `4387c66`; accepted scheduler and renderer lifecycle
- Blocks: further liquid parse/finalization decomposition
- External state: none; verification uses synthetic task IDs and payloads
## Verification
- Commands: dedicated FIFO/dedupe/task/result/cancel/clear/thread/source/timing
verifier; shutdown, water/material and adjacent renderer/streaming/coordinate/
documentation/coordination gates
- Fixtures: synthetic tile/path requests, task IDs and water dictionaries
- Fidelity evidence: exact current queue/task/result transitions preserved
- Performance budget: 100 cycles over 256 requests/results under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, worker sequence and dependency diagrams
- World-renderer, module registry and RENDER status updates
## Simplicity and naming
- Important names introduced: `AdtWaterLoadPipelineState`
- Simplest considered solution: one RefCounted with FIFO/dedupe/task maps and one mutex mailbox
- Rejected complexity/abstractions: generic async scheduler, signals, callbacks,
WorkerThreadPool wrapper, parser/material ownership or multi-lane framework
- Unavoidable complexity and justification: result mailbox crosses worker/main threads
- Measured optimization evidence: bounded synthetic lifecycle loop
## Status
- State: accepted
- Done: pipeline state implemented; loader enqueue/start/publish/drain/release/
reset/shutdown/metrics adapters migrated; required documentation added
- Next: continue liquid parse/finalization extraction or another remaining M03
service boundary
- Blocked by:
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-ADT-WATER-LOAD-PIPELINE-001:f470775 -->
## Handoff
- Commit: `b7c036f`
- Results: water pipeline PASS (`cases=12`, `iterations=100`,
`elapsed_ms=86.170`; initial direct cold run `94.576ms`); real Thread result
publication, FIFO/dedupe/task/cancel/clear/source contracts PASS; WMO caches/
queue/planner/registry/resolver, materials, shutdown and 18 adjacent M2/terrain/
facade/scheduler/streaming/coordinate regressions PASS; documentation and
coordination gates PASS; checkpoint dry-run PASS `7/7`.
- Remaining risks: clear does not interrupt active WorkerThreadPool work and a
post-reset publication remains stale until drained/cleared, matching prior
behavior; payload Dictionaries require no mutation after publication; parser,
main-thread water materialization and asset-backed MH2O/MCLQ traversal/leak/
p95/p99/original-client evidence remain pending.
- Documentation updated: inline public API; new
`docs/modules/adt-water-load-pipeline-state.md`; module registry, world renderer
and `RENDER.md`; data-flow/state/sequence/dependency diagrams, ownership,
threading, failure/recovery, profiles, performance limit and source map included.
- Integration: merged as `f470775`; post-merge water pipeline (`cases=12`,
`iterations=100`, `elapsed_ms=86.935`), shutdown, renderer materials, facade,
internal-access (`private_symbols=36`), `7/7` manifest, documentation and
coordination gates passed.
<!-- OPENWC_HANDOFF:READY:M03-RND-ADT-WATER-LOAD-PIPELINE-001:b7c036f -->
@@ -0,0 +1,116 @@
# M03-RND-ADT-WATER-SCENE-FINALIZER-001 — ADT water scene finalizer
<!-- OPENWC_CLAIM:M03-RND-ADT-WATER-SCENE-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-adt-water-scene-finalizer`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract main-thread ADT water subtree construction, tile-root attachment and
optional recursive editor ownership from `StreamingWorldLoader` while retaining
the existing `ADTBuilder` geometry/material implementation.
## Non-goals
- Parse or reinterpret MH2O/MCLQ data.
- Own pending requests, WorkerThreadPool tasks or parsed-result delivery.
- Consume `WATER_FINALIZE` permits or validate tile/path/result staleness.
- Mark tile state `water_loaded` or choose whether water is enabled.
- Change liquid geometry, materials, coordinates, cache formats or profiles.
## Paths
- Exclusive: `src/render/liquid/adt_water_scene_finalizer.gd`,
`src/tools/verify_adt_water_scene_finalizer.gd`,
`docs/modules/adt-water-scene-finalizer.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_adt_water_load_pipeline_state.gd`,
`docs/modules/adt-water-load-pipeline-state.md`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
proprietary renderer corpus
## Contracts and data
- Empty water data or invalid tile root produces no Node and no scene mutation.
- Existing `ADTBuilder.build_tile_water_scene` remains the only geometry/material source.
- A non-empty built Water root is attached exactly once to the supplied tile root.
- Optional editor ownership is assigned recursively only when explicitly enabled
and an edited scene root is available.
- The returned Node is borrowed and remains owned by the tile SceneTree subtree.
## Dependencies
- Requires: accepted water pipeline package on current master `e1b2886`
- Blocks: further liquid finalization/material responsibility extraction
- External state: none; verification uses synthetic liquid dictionaries
## Verification
- Commands: dedicated empty/invalid/build/attach/editor-owner/source/timing
verifier; water pipeline, materials, shutdown, facade, internal-access,
manifest, documentation and coordination gates
- Fixtures: synthetic one-cell liquid mask/heights and temporary Node roots
- Fidelity evidence: exact existing ADTBuilder output and two attachment paths preserved
- Performance budget: 100 empty finalization attempts under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, main-thread sequence and dependency diagrams
- Water-pipeline, world-renderer, module registry and RENDER status updates
## Simplicity and naming
- Important names introduced: `AdtWaterSceneFinalizer`
- Simplest considered solution: one RefCounted with one explicit attach operation
- Rejected complexity/abstractions: generic scene finalizer, signals, callbacks,
builder interface, queue ownership or alternate liquid renderer
- Unavoidable complexity and justification: editor-persisted generated subtrees
require recursive owner assignment after SceneTree attachment
- Measured optimization evidence: bounded synthetic no-water loop
## Status
- State: accepted
- Done: stateless finalizer implemented; both loader water paths migrated;
synthetic scene/owner regression and required documentation added
- Next: continue liquid parsing/task execution extraction or another remaining M03 boundary
- Blocked by:
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-ADT-WATER-SCENE-FINALIZER-001:874fd0f -->
## Handoff
- Commit: `235be3a`
- Results: scene finalizer PASS (`cases=8`, `iterations=100`,
`elapsed_ms=0.042`; initial `0.024ms`); synthetic liquid produced one
four-vertex/six-index surface with tile attachment and recursive owner; water
pipeline (`119.648ms`), WMO/M2/terrain/facade/scheduler/streaming/coordinate,
materials, shutdown, internal-access `36` and 32 headless contract regressions
PASS; documentation and coordination gates PASS; checkpoint dry-run PASS `7/7`.
- Remaining risks: main-thread mesh/material construction remains synchronous
behind one existing permit; the Dictionary builder boundary remains untyped;
proprietary MH2O/MCLQ traversal/leak/p95/p99/original-client evidence is absent.
A verifier launched concurrently with the initial cold editor import observed
the pre-existing global-class cache race; serialized editor parse and shutdown
rerun passed, with only expected missing private asset diagnostics.
- Documentation updated: inline public API; new
`docs/modules/adt-water-scene-finalizer.md`; water-pipeline spec, module registry,
world renderer and `RENDER.md`; data-flow/state/sequence/dependency diagrams,
ownership, main-thread effects, failure/recovery, migration and source map included.
- Integration: merged as `874fd0f`; post-merge finalizer (`cases=8`,
`iterations=100`, `elapsed_ms=0.025`), water pipeline (`98.398ms`), shutdown,
renderer materials, facade, internal-access (`private_symbols=36`), `7/7`
manifest, documentation and coordination gates passed.
<!-- OPENWC_HANDOFF:READY:M03-RND-ADT-WATER-SCENE-FINALIZER-001:235be3a -->
+117
View File
@@ -0,0 +1,117 @@
# M03-RND-FACADE-001 — Renderer facade first seam
<!-- OPENWC_CLAIM:M03-RND-FACADE-001:sindo-main-codex:2026-07-17 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-renderer-facade`
- Lease expires UTC: 2026-07-17
- Integrator: M03 milestone integrator
## Outcome
Introduce `WorldRenderFacade` as the only runtime/tool caller surface for typed
streaming focus updates and read-only renderer metrics, while retaining
`StreamingWorldLoader` as the unchanged internal implementation.
## Non-goals
- Extract the pure target planner or budget scheduler in this package.
- Add environment or entity-presentation commands before their contracts exist.
- Replace the M02 `TerrainQuery` gameplay boundary in this package.
- Change streaming radii, queues, cache formats, visuals or quality presets.
- Mark M03 complete or edit its checklist/Evidence.
## Paths
- Exclusive: `src/render/world_render_facade.gd`,
`src/tools/verify_world_render_facade.gd`, this claim
- Shared/hotspots: both runtime streaming scenes, three renderer capture/probe
tools, `src/tools/verify_streaming_focus.gd`, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`
- Generated/ignored: local `.godot`, native build outputs, caches and proprietary
renderer corpus
## Contracts and data
- Public API: `set_streaming_focus`, `refresh_streaming_focus`,
`renderer_metrics_snapshot`
- Scene adapter: explicit `streaming_focus_source_path` owned by the facade
- Internal implementation seam: `streaming_world_loader_path`; callers must not
read streamer queues or call its methods directly
- Schema/cache/coordinate contracts: unchanged
- Consumers: runtime scenes, capture tool and renderer probes
## Dependencies
- Requires: M01 `StreamingFocus` and merged M02 closeout on master `4f566b1`
- Blocks: environment/entity/ground facade contracts and planner extraction
- External state: none; contract verification uses a test double
## Verification
- Commands: dedicated facade verifier, streaming-focus regression, renderer
baseline manifest/dry-run, coordinate boundary and repository gates
- Fixtures: typed focus, source Node3D and read-only metrics test double
- Fidelity evidence: no renderer configuration, planner, queue, placement,
visibility, material, animation or cache behavior changes
- Performance budget: one source position sample per process frame; target
recomputation remains throttled inside the existing streamer
## Documentation deliverables
- Inline public API docs for facade properties and methods
- Updated world-renderer module specification
- Updated data-flow, sequence and dependency diagrams
- Updated source map/status and renderer notes
## Simplicity and naming
- Important names: `WorldRenderFacade`, `renderer_metrics_snapshot`
- Simplest approach: one small Node adapter delegating to the existing streamer
- Rejected complexity: service container, generic command bus, streamer rewrite
or duplicate queue/cache state
- Unavoidable complexity: scene-relative source and implementation paths are
resolved on the main thread with explicit diagnostics
- Measured optimization evidence: not applicable; behavior-preserving seam
## Status
- State: ready-for-review
- Done: introduced the facade, migrated two runtime scenes and three renderer
tools, added regression coverage and updated renderer documentation
- Next: M03 integrator reviews and merges `3d528e3`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-FACADE-001:3d528e3 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-FACADE-001:a100ced -->
## Handoff
- Commit: `3d528e3`
- Integration: accepted in master merge `a100ced`
- Results: `WorldRenderFacade` is the runtime/tool surface for typed focus and
detached metrics; the existing streamer remains the sole owner of queues,
caches, tasks, nodes and RIDs.
- Verification: facade `delegation=3 runtime_scenes=2 tools=3`; streaming focus
`contract=1 runtime_scenes=2 capture_tools=3`; coordinate boundary
`files=105 native_boundary=1 oracle=1 consumers=5 classifier_cases=6`;
render manifest `checkpoints=7 coverage=7 caches=7`; seven-checkpoint headless
dry-run; coordination/documentation/diff gates passed.
- Fidelity: no changes to renderer target calculation, budgets, queue order,
cache versions, placement, visibility, materials or animation. The dry-run
retained all seven checkpoint plans. No build-12340 parity claim is added.
- External/local inputs: ignored native DLL and generated ADT resource scripts
were copied from master only to run the worktree smoke. Proprietary extracted
ADT and character GLB data were unavailable, producing the expected dry-run
degraded-data diagnostics.
- Remaining risks: environment, entity visuals and ground query are not yet
facade contracts; streamer exported configuration remains transitional scene
composition; focus-source sampling adds one small main-thread adapter step per
process frame while target refresh remains streamer-throttled.
- Documentation updated: inline facade API, `docs/modules/world-renderer.md`
public API/inputs/outputs/data-flow/sequence/ownership/recovery/status/source
map, and `RENDER.md` file map plus implementation note.
@@ -0,0 +1,130 @@
# M03-RND-FACADE-ENTITY-001 — World entity presentation commands
<!-- OPENWC_CLAIM:M03-RND-FACADE-ENTITY-001:sindo-main-codex:2026-07-18 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-facade-entity`
- Lease expires UTC: 2026-07-18
- Integrator: M03 milestone integrator
## Outcome
Add immutable, versioned world-entity presentation input and stable facade
commands for idempotent present/update and removal, backed by a renderer-owned
scene service with explicit entity subtree ownership.
## Non-goals
- Define authoritative entity/gameplay/network state or allocate/map identities.
- Move the local player controller/presenters behind the world-entity service.
- Implement build-12340 display IDs, equipment, animation, effects or visibility rules.
- Add background loading, pooling, MultiMesh conversion or a generic ECS/framework.
- Change streamer queues, caches, world assets, baseline visuals or target status.
## Paths
- Exclusive: `src/render/entities/entity_presentation_snapshot.gd`,
`src/render/entities/world_entity_presenter.gd`,
`src/tools/verify_world_entity_presentation.gd`,
`src/tests/scenes/world_entity_visual_replacement_fixture.tscn`,
`docs/modules/world-entity-presentation.md`, this claim
- Shared/hotspots: `src/render/world_render_facade.gd`, both runtime streaming
scenes, `src/tools/verify_world_render_facade.gd`, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Reused unchanged: `EntityId`, `GodotWorldPosition`, existing asset-free
character presentation model fixture
- Generated/ignored: `.godot`, native DLL, generated resources, caches and
proprietary renderer corpus
## Contracts and data
- Contract version: `EntityPresentationSnapshot.CONTRACT_VERSION = 1`
- Snapshot: valid session-local `EntityId`, typed Godot world position, visual
PackedScene path, finite yaw radians, positive finite uniform scale and visibility
- Public API: `WorldRenderFacade.present_entity`, `remove_entity`,
`entity_presentation_snapshot`
- Presenter behavior: present is idempotent by entity key; same visual updates
transform/visibility, changed visual replaces the owned subtree; remove is explicit
- Schema/cache/coordinate contracts: no persisted schema or cache change
## Dependencies
- Requires: integrated M03 environment facade master `a85e416`, M01 identity and
coordinate contracts
- Blocks: completion of the first M03 facade checklist item and later entity renderer extraction
- External state: none; tests use a repository-owned asset-free PackedScene fixture
## Verification
- Commands: cold snapshot contract; presenter lifecycle/ownership regression;
facade delegation and runtime wiring; identity/coordinate/internal-access;
renderer manifest/shutdown/planner/scheduler/focus and repository gates
- Fixtures: invalid identity/position/yaw/scale/path, spawn, idempotent update,
visual replacement, missing asset, removal, detached diagnostic snapshot and teardown
- Fidelity evidence: no runtime commands are produced yet, so existing scene output
and seven baseline plans remain unchanged
- Performance budget: constant-time entity lookup; synchronous resource load only
on first presentation/visual replacement and explicitly excluded from hot-path acceptance
## Documentation deliverables
- Inline public API docs: snapshot, facade commands and presenter lifecycle
- Module specification: new world-entity-presentation specification
- Data-flow diagram: read model through facade into owned visual subtree
- Sequence/state/dependency diagrams: present/update/replace/remove/failure/teardown
- Source map/status updates: module registry, world renderer and `RENDER.md`
## Simplicity and naming
- Important names introduced: `EntityPresentationSnapshot`, `WorldEntityPresenter`,
`present_entity`, `remove_entity`
- Simplest considered solution: one immutable full visual snapshot and one
dictionary-owned Node3D presenter below an explicit scene service
- Rejected complexity/abstractions: ECS, event bus, command hierarchy, factory
registry, pooling, async loader framework or duplicate identity registry
- Unavoidable complexity and justification: renderer must own and deterministically
replace/free visual subtrees while authoritative state remains external
- Measured optimization evidence: no optimization claim; lifecycle is asset-free tested
## Status
- State: ready-for-review
- Done: immutable contract-v1 snapshot, presenter ownership lifecycle, facade
commands, runtime composition, asset-free regressions and module documentation
- Next: M03 integrator reviews and merges `1807c3a`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-FACADE-ENTITY-001:1807c3a -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-FACADE-ENTITY-001:606770c -->
## Handoff
- Commit: `1807c3a`
- Results: facade now exposes idempotent `present_entity`, explicit
`remove_entity` and detached diagnostics. Both runtime scenes compose a
`WorldEntityPresenter` that owns one replaceable visual subtree per valid
session `EntityId`; local player and authoritative state remain separate.
- Verification: entity `snapshot_cases=8 lifecycle_cases=14 runtime_scenes=2`;
facade `delegation=9 entity_contract=6`; identities `5/5/6/5`; character
presentation `9/10/3/1`; coordinate boundary `files=119`; internal access
`43/7/9/1`; environment/ground/terrain, manifest `7/7`, shutdown, scheduler
(`20000` iterations), planner (`250` iterations), focus, editor parse, dry-run,
coordination, documentation and diff gates passed.
- Fidelity: runtime produces no world-entity commands yet, so all seven baseline
plans and existing player/world output remain unchanged. No build-12340
display, equipment, animation, effects or visibility parity claim is added.
- External/local inputs: ignored native DLL and generated ADT scripts supported
editor/dry-run only. Missing proprietary ADT/DBC/character corpus produced the
expected degraded diagnostics.
- Remaining risks: PackedScene create/replace loads synchronously and is not an
accepted network-scale hot path; resource paths are adapter inputs rather than
stable content IDs; animation/equipment/effects and scale profiling remain open.
- Documentation updated: new world-entity-presentation API/input-output/data-flow/
lifecycle/sequence/ownership/failure/configuration/migration/diagnostic/source-map
spec; world renderer, module registry and `RENDER.md` updated.
- Integration: accepted in master merge `606770c`; post-merge entity/facade,
character, internal-access, manifest, shutdown, scheduler and planner gates passed.
@@ -0,0 +1,120 @@
# M03-RND-FACADE-ENVIRONMENT-001 — Renderer environment snapshot boundary
<!-- OPENWC_CLAIM:M03-RND-FACADE-ENVIRONMENT-001:sindo-main-codex:2026-07-18 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-facade-environment`
- Lease expires UTC: 2026-07-18
- Integrator: M03 milestone integrator
## Outcome
Add an immutable world-environment snapshot accepted by `WorldRenderFacade`,
delegate it to the existing DBC sky controller, and migrate deterministic render
checkpoint time setup away from direct sky-controller property mutation.
## Non-goals
- Change Light/Area/Skybox DBC selection, interpolation, fog, sun or shader rules.
- Add weather, indoor lighting, new clock semantics or build-12340 parity claims.
- Extract the sky service or move its Environment/Node/RID ownership.
- Change runtime scene defaults, cache formats, streaming behavior or target status.
## Paths
- Exclusive: `src/render/environment/world_environment_snapshot.gd`,
`src/tools/verify_world_environment_snapshot.gd`, this claim
- Shared/hotspots: `src/render/world_render_facade.gd`,
`src/scenes/sky/wow_sky_controller.gd`, both runtime streaming scenes,
`src/tools/capture_render_checkpoints.gd`,
`src/tools/verify_world_render_facade.gd`, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources, caches and
proprietary renderer corpus
## Contracts and data
- Public API: immutable `WorldEnvironmentSnapshot` and
`WorldRenderFacade.apply_environment_snapshot`
- Snapshot input: finite time-of-day hours normalized into one 24-hour day
- Adapter: explicit `world_environment_controller_path`; facade/controller retain
no ownership of caller snapshot
- Schema/cache/coordinate contracts and runtime defaults: unchanged
- Consumer: deterministic renderer checkpoint capture; future world-state adapter
## Dependencies
- Requires: integrated M03 facade/ground-query master `cb103e1`
- Blocks: completion of the facade environment checklist slice and later sky extraction
- External state: none for contract tests; visual comparison still needs proprietary corpus
## Verification
- Commands: dedicated cold snapshot contract, facade delegation/wiring regression,
capture source-boundary regression, renderer manifest/dry-run and repository gates
- Fixtures: normalization, non-finite rejection, missing/wrong controller,
exact snapshot delegation and existing runtime scene wiring
- Fidelity evidence: preserve existing fixed-time application and all DBC-derived
visual logic; seven checkpoint plans remain valid
- Performance budget: one immutable value allocation per environment update and
constant-time main-thread delegation
## Documentation deliverables
- Inline public API docs: snapshot, facade adapter and sky-controller application
- Module specification: update existing world-renderer specification
- Data-flow diagram: snapshot producer through facade into DBC sky controller
- Sequence/state/dependency diagrams: application/failure path and ownership notes
- Source map/status updates: world-renderer module, module registry if needed, `RENDER.md`
## Simplicity and naming
- Important names introduced: `WorldEnvironmentSnapshot`, `apply_environment_snapshot`
- Simplest considered solution: one immutable time snapshot over the existing sky implementation
- Rejected complexity/abstractions: generic weather graph, duplicated lighting DTO,
event bus, service container or alternate Environment owner
- Unavoidable complexity and justification: facade resolves a separate scene-owned
sky controller because the streamer does not own outdoor environment rendering
- Measured optimization evidence: not applicable; bounded constant-time adapter
## Status
- State: ready-for-review
- Done: immutable value, facade/controller adapter, checkpoint migration,
regressions and renderer module documentation
- Next: M03 integrator reviews and merges `2ee647a`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-FACADE-ENVIRONMENT-001:2ee647a -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-FACADE-ENVIRONMENT-001:c69abd6 -->
## Handoff
- Commit: `2ee647a`
- Results: `WorldEnvironmentSnapshot` normalizes finite time into one day and
exposes non-finite failure explicitly. `WorldRenderFacade` delegates the
immutable value to the existing sky controller; checkpoint capture no longer
locates or mutates that controller directly.
- Verification: snapshot `contract=5`; facade `delegation=6 ground_contract=2
environment_contract=7 runtime_scenes=2 tools=3`; internal access `43/7/9/1`;
terrain, coordinate (`files=116 consumers=5`), manifest (`7/7`), shutdown,
scheduler (`20000` iterations), planner (`250` iterations), focus, editor parse,
dry-run capture, coordination, documentation and diff gates passed.
- Fidelity: applying a snapshot retains the previous three fixed-clock assignments
and leaves DBC profile/area/skybox lookup, interpolation, fog, sun, shader,
cache and streaming rules unchanged. Dry-run retained all seven plans and
reported dusk as `time=19.00`. No build-12340 parity claim is added.
- External/local inputs: ignored native DLL and generated ADT resource scripts
were copied from master for parse/dry-run only. Missing proprietary ADT/DBC/
character data produced expected degraded diagnostics.
- Remaining risks: the snapshot currently covers exact world time only; weather,
indoor state and asset-backed paired zone-transition evidence remain open.
- Documentation updated: inline value/facade/controller API plus world-renderer
API/input-output/data-flow/sequence/ownership/failure/capability/source-map and
`RENDER.md` implementation notes.
- Integration: accepted in master merge `c69abd6`; post-merge snapshot, facade,
internal-access, manifest, shutdown, scheduler, planner and focus gates passed.
@@ -0,0 +1,115 @@
# M03-RND-FACADE-GROUND-QUERY-001 — Rendered ground query facade
<!-- OPENWC_CLAIM:M03-RND-FACADE-GROUND-QUERY-001:sindo-main-codex:2026-07-18 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-facade-ground-query`
- Lease expires UTC: 2026-07-18
- Integrator: M03 milestone integrator
## Outcome
Expose typed ground-height sampling and a detached readiness diagnostic through
`WorldRenderFacade`, using already loaded render terrain meshes, and migrate the
terrain-height probe away from direct streamer state/queue access.
## Non-goals
- Replace the M02 gameplay-owned `TerrainQuery`/`AdtTerrainQuery` composition.
- Make rendered mesh sampling authoritative for movement, collision or server state.
- Add slopes, holes, liquid, WMO/M2 collision or async query callbacks.
- Change terrain meshes, streaming policy, queue order, cache formats or visuals.
- Complete environment/entity-visual facade contracts or mark M03 complete.
## Paths
- Exclusive: this claim
- Shared/hotspots: `src/render/world_render_facade.gd`,
`src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/probe_render_terrain_height.gd`,
`src/tools/verify_world_render_facade.gd`,
`src/tools/verify_renderer_internal_access.gd`, `docs/modules/world-renderer.md`,
`docs/modules/terrain-query.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resource scripts,
extracted renderer corpus and probe reports
## Contracts and data
- Input: immutable `GodotWorldPosition` in Godot world units
- Output: renderer-owned immutable `RenderedGroundSample` plus optional detached diagnostic Dictionary
- Sampling source: loaded quality or tile-LOD Mesh and its live tile transform
- M02 ADT query cache, renderer cache versions and coordinate contracts: unchanged
## Dependencies
- Requires: M02 terrain query contract and integrated M03 facade/access gate `53d84cc`
- Blocks: removal of renderer diagnostic internal-access exception and later terrain service extraction
- External state: asset-backed probe is optional; contract tests use a facade double
## Verification
- Commands: facade query/snapshot isolation contract, internal-access gate,
terrain-query regression, focus/coordinate/manifest/shutdown regressions and repository gates
- Fixtures: available/unavailable sample, detached diagnostic, probe source migration
- Fidelity evidence: mesh ray/nearest fallback algorithm moves unchanged from the probe
- Performance budget: on-demand diagnostic query only; no per-frame query added
## Documentation deliverables
- Inline facade/streamer API docs
- World-renderer API/data-flow/sequence/ownership/recovery/source-map updates
- Terrain-query backend status/ownership clarification and renderer implementation note
## Simplicity and naming
- Important names: `sample_ground_height`, `renderer_ground_query_snapshot`
- Simplest approach: one typed facade query over one existing diagnostic read model
- Rejected complexity: duplicate ADT cache, physics service, callback bus, query node,
generic spatial interface or new dependency
- Unavoidable complexity: triangle-mesh ray query retains the existing bounded
nearby fallback for seam/edge diagnostic behavior
## Status
- State: ready-for-review
- Done: added renderer-owned typed sample, facade query/snapshot, migrated terrain
probe, expanded internal-access/coordinate gates and updated module docs
- Next: M03 integrator reviews and merges `b697a89` plus cold-start fix `9408d88`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-FACADE-GROUND-QUERY-001:9408d88 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-FACADE-GROUND-QUERY-001:d6e5b53 -->
## Handoff
- Commits: implementation `b697a89`; cold-start fix `9408d88`
- Results: `WorldRenderFacade` delegates loaded-mesh ground sampling and returns
renderer-owned `RenderedGroundSample`; detached diagnostic snapshots preserve
the probe report while hiding queue/tile/Mesh/Node references. Gameplay remains
on the independent M02 `TerrainQuery` composition.
- Verification: facade `delegation=5 ground_contract=2 runtime_scenes=2 tools=3`;
cold rendered-ground value `contract=3` from an empty Godot class cache;
internal access `private_symbols=43 gameplay=7 editor_sources=9 renderer_tools=1`;
terrain query contracts passed; coordinate boundary `files=113 consumers=5`;
renderer manifest `7/7`; shutdown ownership, scheduler/planner, coordination,
documentation and diff gates passed.
- Fidelity: the probe's 5000-unit ray height, 3x3 tile search, highest-hit choice,
readiness fields and `2/5/10/20/40` nearby fallback moved unchanged. No terrain
geometry, streaming, cache, material, placement or visual rule changed. No
build-12340 parity claim is added.
- External/local inputs: ignored native DLL and generated ADT resource scripts
were copied from master only for editor/streamer parse and then removed.
Proprietary extracted world data was unavailable, producing expected degraded diagnostics.
- Remaining risks: triangle-mesh generation is on-demand/main-thread and diagnostic;
it is unsuitable for per-physics-frame gameplay; exact asset-backed probe output
still depends on local corpus readiness; environment/entity facade contracts remain.
- Documentation: inline facade/loader/value API; world-renderer API/data-flow/
sequence/ownership/recovery/capability/source map; terrain-query authority
clarification and renderer implementation notes updated.
- Integration: implementation accepted in master merge `80cb084`; cold-start fix
accepted in merge `d6e5b53`. Post-merge cold/facade/access/terrain/coordinate/
manifest/shutdown/scheduler/planner/focus and repository gates passed.
@@ -0,0 +1,106 @@
# M03-RND-INTERNAL-ACCESS-GATE-001 — Streamer internal access gate
<!-- OPENWC_CLAIM:M03-RND-INTERNAL-ACCESS-GATE-001:sindo-main-codex:2026-07-18 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-streamer-internal-access-gate`
- Lease expires UTC: 2026-07-18
- Integrator: M03 milestone integrator
## Outcome
Add an automated repository boundary gate proving gameplay code and Godot
`EditorPlugin` implementations do not access `StreamingWorldLoader` private
queue, task, cache or tile-state fields.
## Non-goals
- Change renderer behavior, queues, jobs, cache formats or facade contracts.
- Ban scene composition references to the loader script or facade adapter path.
- Migrate renderer-only diagnostic probes that inspect internal readiness/terrain;
those require the later metrics/ground-query facade contract.
- Mark M03 complete.
## Paths
- Exclusive: `src/tools/verify_renderer_internal_access.gd`, this claim
- Shared/hotspots: `docs/modules/world-renderer.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Read-only scan scope: `src/gameplay/**/*.gd`, `src/editor/**/*.gd`, Godot
`EditorPlugin` package scripts under `src/**/*.gd` and `addons/**/*.gd`, and
the streamer field declarations
## Contracts and data
- Input: repository GDScript source and actual private streamer declarations
- Output: deterministic pass/fail diagnostics with consumer path and symbol
- Runtime, scene, cache, coordinate and asset contracts: unchanged
## Dependencies
- Requires: integrated facade and scheduler master `a023d76`
- Blocks: safe service extraction and M03 dependency regression acceptance
- External state: none
## Verification
- Commands: dedicated internal-access gate, facade regression, coordination,
documentation and diff gates
- Fixtures: gameplay source discovery, EditorPlugin discovery and synthetic
forbidden symbol detection
- Fidelity evidence: source-only enforcement; no runtime or visual code changes
- Performance budget: one bounded repository source scan in a headless test process
## Documentation deliverables
- World-renderer boundary/verification/known-gap/source-map updates
- Renderer implementation note documenting diagnostic-tool exception
- No new module spec because this package adds a verifier to the existing renderer module
## Simplicity and naming
- Important name: `verify_renderer_internal_access.gd`
- Simplest approach: derive forbidden fields from the current streamer instead
of maintaining a second hand-written queue list
- Rejected complexity: language plugin, custom linter framework or runtime proxy
- Unavoidable complexity: recursive source discovery expands each actual
`EditorPlugin` root to its package scripts while excluding reference mirrors
## Status
- State: ready-for-review
- Done: derived 43 private renderer symbols, scanned seven gameplay and nine
EditorPlugin-package sources, added synthetic positive/negative fixtures and docs
- Next: M03 integrator reviews and merges `b58bf2c`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-INTERNAL-ACCESS-GATE-001:b58bf2c -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-INTERNAL-ACCESS-GATE-001:7e35de7 -->
## Handoff
- Commit: `b58bf2c`
- Results: repository gate derives private queue/task/cache/state declarations
from the streamer and rejects external member/reflection access in gameplay and
EditorPlugin package sources. Current scope passes with `43/7/9` inventory counts.
- Verification: internal access, facade and budget scheduler headless contracts;
Godot editor scan with local ignored dependencies; coordination, documentation
and diff gates passed.
- Fidelity: source-only enforcement changes no runtime configuration, queue order,
cache version, placement, material, animation or visibility behavior. No
build-12340 parity claim is added.
- External/local inputs: ignored native DLL and two generated ADT resource scripts
were copied from master only for facade/editor smoke and then removed. Proprietary
extracted world data was unavailable, producing expected degraded-data diagnostics.
- Remaining risks: renderer diagnostic terrain probe remains an explicit exception;
whitespace-obfuscated dynamic reflection is outside the lightweight source gate;
future non-EditorPlugin authoring code is already prohibited by repository policy.
- Documentation: world-renderer boundary/verification/capability/known-gap/source
map and `RENDER.md` implementation note updated; no new module was introduced.
- Integration: accepted in master merge `7e35de7`; post-merge access gate
`private_symbols=43 gameplay=7 editor_sources=9`, facade/scheduler/planner and
repository gates passed.
@@ -0,0 +1,104 @@
# M03-RND-M2-ANIMATED-INSTANCE-MATERIALIZER-001
<!-- OPENWC_CLAIM:M03-RND-M2-ANIMATED-INSTANCE-MATERIALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-animated-instance-materializer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-animated-instance-materializer`
## Outcome
Extract main-thread animated M2 instance duplication, render-property application,
playback startup and batch attachment from `StreamingWorldLoader`.
## Non-goals
- Change build-job cursors, budgets, prototype selection or animation eligibility.
- Change animation selection, phase, native animator behavior or diagnostic text.
- Own Editor scene persistence, static MultiMesh materialization or tile cleanup.
- Change visible transforms, visibility ranges, shadows or placement ordering.
## Paths
- Exclusive: `src/render/m2/m2_animated_instance_materializer.gd`,
`src/tools/verify_m2_animated_instance_materializer.gd`,
`docs/modules/m2-animated-instance-materializer.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2 animation
playback/finalizer/build/facade/internal-access/manifest verifiers and specs,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources/caches and proprietary corpus
## Contracts and data
- Duplicate flags, names, transforms and input order remain unchanged.
- Visibility end/margin and shadow mode are applied recursively before attachment.
- Playback data copy/start delegates to the accepted playback controller contract.
- The batch is attached only when at least one duplicate succeeds.
- Loader retains diagnostic formatting/path normalization and Editor ownership.
## Dependencies
- Requires: accepted playback package on master `5b2d9f2`
- Blocks: further animated M2 build orchestration extraction
- External state: Godot Node duplication and SceneTree attachment remain main-thread APIs
## Verification
- Commands: dedicated duplication/order/render/playback/empty/source/timing verifier;
M2 animated pipeline/finalizer/playback/prototype/build/shutdown/material/facade/
internal-access/manifest regressions; docs/coordination/dry-run gates
- Fixtures: synthetic prototype trees with geometry, AnimationPlayer and native animator
- Fidelity evidence: exact transforms, flags, render settings, playback delegation and order
- Performance budget: 1,000 synthetic instances under 1 second
## Documentation deliverables
- Inline API docs
- Module spec with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent playback/finalizer/build/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name introduced: `M2AnimatedInstanceMaterializer`
- Simplest solution: synchronous main-thread RefCounted returning batch diagnostics
- Rejected complexity: signals, async queue, callbacks and generic scene factory
- Unavoidable complexity: imported AnimationPlayer and native animator paths coexist
- Measured optimization evidence: bounded synthetic batch materialization
## Status
- State: ready for integration
- Done: materializer, loader adapter, verifier and required documentation
- Next: integrator merge and post-merge acceptance
- Blocked by:
## Handoff
- Commit: `456f3e2`
- Results: materializer passes 12 duplication/order/render/playback/diagnostic/
source cases and 1,000 instances in 9.267 ms; all 50 autonomous headless
verifiers pass, while the proprietary ADT placement probe is unavailable
without `data/extracted`; checkpoint dry-run passes 7/7; documentation and
coordination gates pass; loader-private inventory remains 30.
- Remaining risks: private asset traversal/visual comparison, descriptor
pressure, leaks and p95/p99 remain unavailable; materialization is still
synchronous main-thread work and no original-client comparison is claimed.
- Documentation updated: inline API; `m2-animated-instance-materializer.md`
with data-flow, lifecycle, sequence and dependency diagrams; playback,
finalizer, build, world-renderer specs, module registry and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-ANIMATED-INSTANCE-MATERIALIZER-001:456f3e2 -->
## Integration
- Merge commit: `c251985`
- Post-merge results: materializer `cases=12 instances=1000 elapsed_ms=13.719`;
playback/finalizer, shutdown, facade, internal-access `30`, checkpoint dry-run
`7/7`, documentation and coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-ANIMATED-INSTANCE-MATERIALIZER-001:c251985 -->
@@ -0,0 +1,110 @@
# M03-RND-M2-ANIMATED-SCENE-FINALIZER-001
<!-- OPENWC_CLAIM:M03-RND-M2-ANIMATED-SCENE-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-animated-scene-finalizer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-animated-scene-finalizer`
## Outcome
Extract animated M2 PackedScene candidate instantiation, material override repair
and AnimationPlayer validation from `StreamingWorldLoader` into an explicit
main-thread finalizer.
## Non-goals
- Call ResourceLoader or interpret threaded-load statuses.
- Choose animation eligibility, cache paths, material prototypes or permits.
- Adopt/cache prototype Nodes or change static/native animation paths.
- Change visible materials, animation selection, cache formats or profiles.
## Paths
- Exclusive: `src/render/m2/m2_animated_scene_finalizer.gd`,
`src/tools/verify_m2_animated_scene_finalizer.gd`,
`docs/modules/m2-animated-scene-finalizer.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2
animation pipeline/prototype/material/build/shutdown/facade/internal-access/
manifest verifiers and module specs, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- Only a PackedScene whose instantiated root is Node3D becomes a candidate;
unsupported or invalid roots return null and any created invalid root is freed.
- Material repair preserves depth-first MeshInstance3D order, source-index
clamping, per-surface override priority and first-material fallback.
- Finalization accepts a candidate only when at least one descendant
AnimationPlayer exists; rejected detached candidates are freed synchronously.
- Accepted result transfers the exact Node3D and player count to the loader.
- Loader retains ResourceLoader, material-prototype acquisition, permit,
prototype adoption/static fallback and diagnostic-log decisions.
## Dependencies
- Requires: accepted animation load pipeline package on master `c20bc62`
- Blocks: further animated M2 build/materialization decomposition
- External state: imported GLB/PackedScene shape remains engine-owned input
## Verification
- Commands: dedicated invalid/ownership/traversal/material/finalization/source/
timing verifier; animation pipeline/prototype/shutdown/material/M2 build/facade/
internal-access/manifest and adjacent M2 regressions; docs/coordination/dry-run gates
- Fixtures: synthetic PackedScenes, nested AnimationPlayers and ArrayMesh materials
- Fidelity evidence: exact material mapping and accepted/rejected Node transitions
- Performance budget: 10,000 depth-first candidate queries under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent animation/prototype/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name introduced: `M2AnimatedSceneFinalizer`
- Simplest solution: one stateless main-thread RefCounted over engine scene types
- Rejected complexity: callbacks, generic scene pipeline, signals or cache ownership
- Unavoidable complexity: material repair occurs between candidate creation and acceptance
- Measured optimization evidence: bounded synthetic subtree traversal
## Status
- State: accepted
- Done: finalizer, loader adapters, lifecycle/material verifier and required documentation
- Next: continue animated M2 playback/instance materialization extraction
- Blocked by:
## Handoff
- Commit: `1b450dc`
- Results: animated scene finalizer passes 13 invalid/type/lifetime/traversal/
material/transfer/source cases and 10,000 depth-eight queries in 40.126 ms;
all 48 autonomous headless verifiers pass, while the proprietary ADT placement
probe is unavailable without `data/extracted`; checkpoint dry-run passes 7/7;
documentation and coordination gates pass; loader-private inventory remains 30.
- Remaining risks: proprietary GLB traversal, material/animation comparison,
descriptor pressure, leaks and p95/p99 remain unavailable; no paired original-
client visual comparison is claimed. Positional material mapping is unchanged.
- Documentation updated: inline API; `m2-animated-scene-finalizer.md` with
data-flow, lifecycle, sequence and dependency diagrams; animation pipeline,
prototype/world-renderer specs, module registry and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-ANIMATED-SCENE-FINALIZER-001:1b450dc -->
## Integration
- Merge commit: `e7a7c67`
- Post-merge results: finalizer `cases=13 iterations=10000
elapsed_ms=40.314`; animation pipeline, prototype state, shutdown, materials,
facade, internal-access `30`, manifest `7/7`, documentation and coordination passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-ANIMATED-SCENE-FINALIZER-001:e7a7c67 -->
@@ -0,0 +1,112 @@
# M03-RND-M2-ANIMATION-LOAD-PIPELINE-001 — M2 animation load pipeline state
<!-- OPENWC_CLAIM:M03-RND-M2-ANIMATION-LOAD-PIPELINE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-animation-load-pipeline`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract threaded animated-M2 pending request records and completion-order
finalize FIFO from `StreamingWorldLoader` into an explicit state service.
## Non-goals
- Call ResourceLoader, select/validate GLB paths or interpret status values.
- Instantiate/repair/cache animated Nodes or own prototype outcomes.
- Change animation allow/deny/candidate policy, permits or visible behavior.
- Add cancellation, persistence, retries, dependencies or cache-format changes.
## Paths
- Exclusive: `src/render/m2/m2_animation_load_pipeline_state.gd`,
`src/tools/verify_m2_animation_load_pipeline_state.gd`,
`docs/modules/m2-animation-load-pipeline-state.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2
prototype/shutdown/material/build/facade/internal-access/manifest verifiers
and module specs, `docs/modules/world-renderer.md`, `docs/modules/README.md`,
`RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- One non-empty normalized path has at most one pending cache path.
- Pending snapshots preserve Dictionary insertion order and detach records.
- Completing a known request moves one copied record with opaque status into a
completion-order FIFO; unknown/duplicate completion is rejected.
- Defensive discard removes pending state without creating a finalize record.
- Total work remains pending plus finalize count at all three historical metrics.
- Map reset and shutdown retain the same two clear sites; shutdown still drains
ResourceLoader paths before clear.
## Dependencies
- Requires: accepted prototype cache package on master `20a64b5`
- Blocks: animated M2 finalization/materialization service extraction
- External state: ResourceLoader request statuses remain loader-owned
## Verification
- Commands: dedicated validation/dedupe/order/transition/discard/snapshot/clear/
source/timing verifier; prototype/shutdown/material/M2 build/facade/internal-
access/manifest and adjacent M2 regressions; docs/coordination/dry-run gates
- Fixtures: synthetic normalized/cache paths and opaque integer statuses
- Fidelity evidence: request insertion, terminal FIFO, metrics and clear transitions
- Performance budget: 100 cycles over 256 request completions under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent M2/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name introduced: `M2AnimationLoadPipelineState`
- Simplest solution: one main-thread RefCounted with pending map and finalize FIFO
- Rejected complexity: generic Resource pipeline, signals, callbacks, typed
ResourceLoader enum wrapper, Node ownership or async abstraction
- Unavoidable complexity: pending insertion order and terminal completion order differ
- Measured optimization evidence: bounded synthetic transition loop
## Status
- State: accepted
- Done: state, loader adapters, lifecycle verifier and required documentation
- Next: continue animated M2 finalization/materialization extraction
- Blocked by:
## Handoff
- Commit: `b8e0f11`
- Results: animation pipeline passes 11 validation/dedupe/order/transition/FIFO/
discard/snapshot/source cases and 100-by-256 cycles in 69.798 ms; all 47
autonomous headless verifiers pass, while the proprietary ADT placement probe
is unavailable without `data/extracted`; checkpoint dry-run passes 7/7;
documentation and coordination gates pass; loader-private inventory decreases
from 31 to 30.
- Remaining risks: successful animated-GLB traversal, descriptor pressure,
leaks, animation fidelity and p95/p99 require proprietary data; no paired
original-client visual comparison is claimed.
- Documentation updated: inline API; `m2-animation-load-pipeline-state.md` with
data-flow, lifecycle, sequence and dependency diagrams; prototype/world-renderer
specs, module registry and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-ANIMATION-LOAD-PIPELINE-001:b8e0f11 -->
## Integration
- Merge commit: `3dccd3e`
- Post-merge results: animation pipeline `cases=11 iterations=100
elapsed_ms=70.309`; prototype state, shutdown, materials, facade,
internal-access `30`, manifest `7/7`, documentation and coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-ANIMATION-LOAD-PIPELINE-001:3dccd3e -->
@@ -0,0 +1,110 @@
# M03-RND-M2-ANIMATION-PLAYBACK-001
<!-- OPENWC_CLAIM:M03-RND-M2-ANIMATION-PLAYBACK-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-animation-playback`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-animation-playback`
## Outcome
Extract deterministic animated M2 playback selection/phase, AnimationPlayer
mutation and native animator data/start behavior from `StreamingWorldLoader`.
## Non-goals
- Duplicate or attach animated instances/batch roots.
- Own visibility, shadow, Editor owner or build-job cursor rules.
- Load/finalize/cache scenes or change animation eligibility.
- Change candidate priority, phase formula, logging text or visible playback.
## Paths
- Exclusive: `src/render/m2/m2_animation_playback_controller.gd`,
`src/tools/verify_m2_animation_playback_controller.gd`,
`docs/modules/m2-animation-playback-controller.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2 animated
finalizer/build/prototype/material/facade/internal-access/manifest verifiers and
specs, `docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources/caches and proprietary corpus
## Contracts and data
- Phase remains `abs(hash("path:index")) % 1000 / 1000.0`.
- Exact animation-name priority remains ordinary Stand/Idle/Run/Walk, fish
Run/Walk/Swim/Stand/Idle/Death, birds Run/Walk/Swim/Stand/Idle, then
case-insensitive substring fallback and first-name fallback.
- Every AnimationPlayer animation becomes linear-looping before selected play;
positive-length selection seeks to deterministic phase.
- Native animators match exact script identity in depth-first order, copy the
same five fields, call prepare_runtime when available and set phase.
- Runtime debug state is sampled only when existing debug mode requests it;
loader retains final log formatting/path normalization.
## Dependencies
- Requires: accepted animated scene finalizer package on master `c0a7bfb`
- Blocks: animated M2 instance materializer extraction
- External state: AnimationPlayer and M2NativeAnimator APIs remain engine/scene contracts
## Verification
- Commands: dedicated phase/selection/loop/play/seek/native-copy/start/diagnostic/
source/timing verifier; animated finalizer/pipeline/prototype/build/shutdown/
material/facade/internal-access/manifest regressions; docs/coordination/dry-run gates
- Fixtures: synthetic AnimationPlayers and real M2NativeAnimator nodes
- Fidelity evidence: exact priority, phase and mutation/reference contracts
- Performance budget: 20,000 selection/phase operations under 1 second
## Documentation deliverables
- Inline API docs
- Module spec with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent finalizer/build/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name introduced: `M2AnimationPlaybackController`
- Simplest solution: stateless main-thread RefCounted over supplied Nodes/players
- Rejected complexity: signals, playback state machine, generic animation framework
- Unavoidable complexity: native and imported AnimationPlayer paths coexist
- Measured optimization evidence: bounded selection/phase loop
## Status
- State: accepted
- Done: playback controller, loader adapters, verifier and required documentation
- Next: extract animated M2 instance/batch materialization
- Blocked by:
## Handoff
- Commit: `9b73571`
- Results: playback controller passes 15 phase/selection/loop/play/seek/native-
copy/start/diagnostic/source cases and 20,000 phase-selection pairs in
23.415 ms; all 49 autonomous headless verifiers pass, while the proprietary
ADT placement probe is unavailable without `data/extracted`; checkpoint
dry-run passes 7/7; documentation and coordination gates pass; loader-private
inventory remains 30.
- Remaining risks: private animation-name/timing/native visual comparison,
descriptor pressure, leaks and p95/p99 remain unavailable; default selection
is still heuristic and no paired original-client comparison is claimed.
- Documentation updated: inline API; `m2-animation-playback-controller.md` with
data-flow, lifecycle, sequence and dependency diagrams; finalizer/build/world-
renderer specs, module registry and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-ANIMATION-PLAYBACK-001:9b73571 -->
## Integration
- Merge commit: `c0fc191`
- Post-merge results: playback `cases=15 iterations=20000 elapsed_ms=23.008`;
animated finalizer/pipeline, prototype, build, shutdown, materials, facade,
internal-access `30`, manifest `7/7`, documentation and coordination passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-ANIMATION-PLAYBACK-001:c0fc191 -->
@@ -0,0 +1,84 @@
# M03-RND-M2-ANIMATION-RESOURCE-FINALIZER-001
<!-- OPENWC_CLAIM:M03-RND-M2-ANIMATION-RESOURCE-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-animation-resource-finalizer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-animation-resource-finalizer`
## Outcome
Move cached animated M2 ResourceLoader status polling, terminal Resource load,
candidate finalization, prototype/static-only adoption and success diagnostics
from the loader into a dedicated two-phase finalization service.
## Non-goals
- Change cached animation eligibility, request admission or native-first order.
- Move material-prototype lookup, permit ownership, playback or materialization.
- Change ResourceLoader status order, cache formats, profiles or visible output.
- Generalize static and animated ResourceLoader paths behind callbacks/frameworks.
## Paths
- Exclusive: `src/render/m2/m2_animation_resource_finalizer.gd`,
`src/tools/verify_m2_animation_resource_finalizer.gd`,
`docs/modules/m2-animation-resource-finalizer.md`, this claim
- Shared: loader, animation pipeline/scene finalizer/prototype cache/cached
observer/world-renderer specs and verifiers, module registry, `RENDER.md`, M03 Evidence
## Contracts and data
- Pending request snapshots are polled in existing Dictionary insertion order.
- Empty Resource paths are discarded and marked static-only immediately.
- Only LOADED/FAILED statuses move into completion-order finalize FIFO.
- One permit processes one popped terminal record, including skipped/stale records.
- Existing prototype/static-only state suppresses terminal Resource loading.
- LOADED Resource is instantiated before material-prototype lookup is requested.
- Candidate repair/finalize/adoption and exact `M2_ANIM_CACHE` debug fields remain.
- Rejected candidates are released by the existing animated scene finalizer.
## Dependencies
- Requires: accepted animation pipeline, scene finalizer, cached/native observers
- Blocks: remaining loader-owned M2 material-prototype lookup and action execution
## Verification
- Synthetic polling/status/FIFO/skip/load/candidate/repair/adoption/log/source and
timing contracts; adjacent M2/renderer gates; full headless suite and checkpoint dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, verification and documentation
- Next: static M2 Resource terminal polling/finalize extraction
- Blocked by:
## Handoff
- Commit: `e7cd967`
- Results: finalizer `28` cases / `1,000` timing iterations; all `58/58`
autonomous headless regressions; facade/internal-access/shutdown/manifest;
documentation `45`; coordination; checkpoint dry-run `7/7`.
- Remaining risks: private asset animation/visual/leak/p95/p99 evidence is absent;
terminal Resource get/instantiation/repair stays synchronous; immediate prepared-
candidate completion is a composition precondition; material lookup stays loader-owned.
- Documentation updated: new finalizer API/I/O/data-flow/state/sequence/dependency/
ownership spec; pipeline, scene finalizer, cached observer, prototype cache,
world renderer, module registry, `RENDER.md` and M03 Evidence.
## Integration
- Merge: `06f6394`
- Post-merge: finalizer, pipeline, scene finalizer, cached observer, prototype
cache, snapshot, dispatch, shutdown, facade, internal-access `30`, manifest
`7/7`, documentation `45`, coordination and checkpoint dry-run `7/7` passed.
@@ -0,0 +1,110 @@
# M03-RND-M2-BUILD-BATCH-PLANNER-001 — M2 build batch planner
<!-- OPENWC_CLAIM:M03-RND-M2-BUILD-BATCH-PLANNER-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-build-batch-planner`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract pure static/animated M2 build batch sizing and cursor progression from
the loader build-job loop into a scene-free planner.
## Non-goals
- Move build-job/queue ownership, tile eligibility or cancellation.
- Move animation/mesh requests, cache lookup, queue rotation or retry behavior.
- Create Nodes, MultiMesh, Mesh, materials or RIDs.
- Change render-budget permit consumption or per-profile batch limits.
- Introduce spatial-cell batching or claim asset-backed performance parity.
## Paths
- Exclusive: `src/render/m2/m2_build_batch_planner.gd`,
`src/tools/verify_m2_build_batch_planner.gd`,
`docs/modules/m2-build-batch-planner.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/m2-placement-grouper.md`, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
proprietary renderer corpus
## Contracts and data
- Input: transform count, current offset, animated/static path selector and raw
animated/static batch limits
- Output: fresh plan Dictionary with effective batch size, batch count, next
offset and group-complete flag
- Selected batch limit clamps to at least one
- Batch count clamps to remaining non-negative transforms
- Group completes when no batch can be consumed or offset plus batch reaches end
- Queue/cache/schema/coordinate/profile values: unchanged
## Dependencies
- Requires: current master `9d74d99`; grouped transform arrays from
`M2PlacementGrouper`
- Blocks: broader M2 build-job state extraction
- External state: none; tests use scalar synthetic counts/limits
## Verification
- Commands: dedicated static/animated/limit/remaining/complete/empty/offset and
bounded timing verifier; loader source boundary; grouper/transform/registry plus
facade/internal-access/manifest/shutdown/documentation/coordination gates
- Fidelity evidence: exact batch/count/cursor formulas moved unchanged
- Performance budget: constant-time scalar/container calculation; no Node,
Resource, RID, task, queue, mutex, cache or file access
## Documentation deliverables
- Inline planner API documentation
- New module spec with inputs/outputs, data-flow, lifecycle, ownership, failure,
performance, fidelity limitations and source map
- Grouper, renderer/module registry and `RENDER.md` updates
## Simplicity and naming
- Important name: `M2BuildBatchPlanner`
- Simplest solution: one stateless `plan_batch` query with a small detached result
- Rejected complexity: job classes, state machine framework, callbacks, signals,
Resources, strategies or scheduler integration
- Unavoidable complexity: loader retains raw build-job Dictionaries
- Measured optimization evidence: bounded synthetic planning loop
## Status
- State: accepted
- Done: planner, loader adapter, regressions and documentation verified
- Next: M2 queue/resource state extraction and spatial-cell evidence
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-BUILD-BATCH-PLANNER-001:be6db7f -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-BUILD-BATCH-PLANNER-001:3f84717 -->
## Handoff
- Commit: `be6db7f` (`refactor(M03): extract M2 build batch planner`)
- Results: dedicated planner PASS (`cases=8`, `iterations=20000`,
`elapsed_ms=13.464`); grouper, transform resolver, M2 registry/dedupe, terrain
cache/LOD/queue, facade, internal-access, manifest, shutdown, scheduler,
streaming planner/focus, terrain-query and coordinate-boundary suites PASS;
editor import parsed with only expected missing private corpus diagnostics;
documentation PASS (`module_specs=18`, `required_files=7`); coordination PASS
with 23 pre-existing expired M00/M01 warnings; checkpoint dry-run planned `7/7`.
- Remaining risks: no private asset-backed p95/p99 or visual comparison; result
and loader job remain Dictionaries; resource/queue transitions and spatial-cell
batching are still loader-owned; negative offset behavior remains permissive.
- Documentation updated: inline public API; new
`docs/modules/m2-build-batch-planner.md`; placement grouper module spec,
renderer module registry, `docs/modules/world-renderer.md` and `RENDER.md`.
- Integration: accepted in master merge `3f84717`; post-merge planner
(`cases=8`, `iterations=20000`, `elapsed_ms=14.532`), grouper, transform
resolver, registry, internal-access, facade, manifest, documentation and
coordination gates passed.
@@ -0,0 +1,97 @@
# M03-RND-M2-BUILD-DISPATCH-PLANNER-001
<!-- OPENWC_CLAIM:M03-RND-M2-BUILD-DISPATCH-PLANNER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-build-dispatch-planner`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-build-dispatch-planner`
## Outcome
Extract the pure M2 build-step dispatch decision from the loader while preserving
animation-wait priority, static-resource retry, missing-model advancement and
exact permit/cursor behavior.
## Non-goals
- Move ResourceLoader I/O, path lookup, cache state or retry ownership.
- Create/free Nodes, Meshes, MultiMeshes or animated instances in the planner.
- Change batch sizing, queue ordering, transforms, visuals or cache versions.
- Add spatial-cell batching or new diagnostics/profile settings.
## Paths
- Exclusive: `src/render/m2/m2_build_dispatch_planner.gd`,
`src/tools/verify_m2_build_dispatch_planner.gd`,
`docs/modules/m2-build-dispatch-planner.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2 build/
queue/materializer/cache verifiers and specs, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources/caches and proprietary corpus
## Contracts and data
- Pending animation request wins before empty/animated/static decisions.
- Positive batch with animated prototype selects animated materialization.
- Positive static batch selects prepared Mesh, waits when unresolved, and advances
without materialization only when the model is terminally missing.
- Zero/non-positive batch advances without materialization.
- Planner returns a fresh action plan and owns no state or engine reference.
## Dependencies
- Requires: accepted typed M2 build queue on master `c74b90a`
- Blocks: extracting stateful M2 resource readiness/dispatch orchestration
- External state: cache lookups, requests and engine lifetime remain loader APIs
## Verification
- Commands: dedicated action-priority/matrix/fresh-result/source/timing verifier;
M2 queue/planner/materializer/cache/prototype/shutdown/facade/internal-access/
manifest regressions; documentation, coordination and checkpoint dry-run gates
- Fixtures: scalar availability and terminal-state combinations only
- Fidelity evidence: exact existing branch priority and retry/advance behavior
- Performance budget: 20,000 pure dispatch plans under one second
## Documentation deliverables
- Inline API docs
- Module spec with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent M2 build/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name: `M2BuildDispatchPlanner`
- Simplest solution: one stateless RefCounted with explicit action constants
- Rejected complexity: callbacks, signals, cache references and generic state machine
- Unavoidable complexity: animation-pending priority precedes every other action
- Measured optimization evidence: bounded synthetic decision loop
## Status
- State: integration accepted
- Done: implementation, verification, documentation and worktree handoff
- Next: extract typed M2 resource observation/request orchestration
- Blocked by:
## Handoff
- Commit: `17f5cc0faa376c8ac84a7ac72d5b8c0366866980`
- Results: dispatch planner `cases=10 iterations=20000 elapsed_ms=11.933`;
all autonomous headless regressions `53/53`; internal access
`private_symbols=30`; baseline manifest/dry-run `7/7`; documentation
`module_specs=40`; coordination passed with 30 historical expired warnings.
- Remaining risks: proprietary ADT visual/p95/p99 evidence is unavailable;
resource observation/requests, action execution, permits and engine lifetime
intentionally remain loader-owned.
- Documentation updated: new `m2-build-dispatch-planner.md` with API/I/O,
data-flow, lifecycle, sequence, dependency and ownership diagrams; batch/queue/
world renderer specs, module registry, RENDER and M03 Evidence updated.
- Integration: master merge `99a90ddfb3364d6672198887198602b84dd19e58`;
post-merge dispatch planner `cases=10 iterations=20000 elapsed_ms=12.291`,
twelve adjacent M2/resource/lifetime/facade/internal-access/manifest checks,
documentation and coordination all passed; checkpoint dry-run retained `7/7` plans.
@@ -0,0 +1,98 @@
# M03-RND-M2-BUILD-QUEUE-001
<!-- OPENWC_CLAIM:M03-RND-M2-BUILD-QUEUE-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-build-queue`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-build-queue`
## Outcome
Replace loader-owned raw M2 build-job Dictionary/FIFO fields with typed job and
queue state while preserving cursor, rotation, stale-key and lifetime behavior.
## Non-goals
- Move tile eligibility, resource readiness/retry or scheduler policy.
- Create/free Nodes, Meshes, MultiMeshes or animated instances inside queue state.
- Change grouping, batch planning, materialization, transform order or visuals.
- Change M2 cache versions, diagnostics text or Editor persistence.
## Paths
- Exclusive: `src/render/m2/m2_build_job.gd`,
`src/render/m2/m2_build_queue.gd`,
`src/tools/verify_m2_build_queue.gd`,
`docs/modules/m2-build-queue.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2 build/
materializer/cache/shutdown/facade/internal-access verifiers and specs,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources/caches and proprietary corpus
## Contracts and data
- A job retains tile key, root, exact groups Dictionary, insertion-order
`groups.keys()` snapshot, group index, transform offset and batch serial.
- FIFO keeps duplicate/stale keys; front rotation moves exactly one key to tail.
- Job erase does not erase FIFO entries, preserving external-cancel stale cleanup.
- Progress adopts group index, transform offset and serial atomically.
- Queue release never frees engine objects; loader retains finish/cancel cleanup.
## Dependencies
- Requires: accepted static materializer package on master `81e33a9`
- Blocks: extracting remaining M2 build/resource orchestration
- External state: Node validity and SceneTree destruction remain loader APIs
## Verification
- Commands: dedicated invalid/FIFO/duplicate/stale/rotation/cursor/lifetime/
diagnostics/source/timing verifier; M2 planner/materializer/cache/prototype/
shutdown/facade/internal-access/manifest regressions; docs/coordination/dry-run gates
- Fixtures: synthetic Node3D roots and ordered transform-group Dictionaries
- Fidelity evidence: exact existing keyed state, FIFO and cursor transitions
- Performance budget: 100 cycles of 256 enqueue/rotate/erase operations under one second
## Documentation deliverables
- Inline API docs
- Module spec with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent build/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important names: `M2BuildJob`, `M2BuildQueue`
- Simplest solution: two small RefCounted types mirroring accepted WMO queue pattern
- Rejected complexity: signals, generic queue base, callbacks and engine destruction
- Unavoidable complexity: keyed jobs and FIFO keys intentionally permit stale entries
- Measured optimization evidence: bounded synthetic lifecycle loop
## Status
- State: integration accepted
- Done: implementation, verification, documentation and worktree handoff
- Next: extract the next unclaimed M2 resource-dispatch seam
- Blocked by:
## Handoff
- Commit: `4a8338f2f0503c2ba31c495e00a696d359518c06`
- Results: cold editor parse `exit=0`; M2 build queue `cases=13 iterations=100
elapsed_ms=66.247`; all autonomous headless regressions `52/52`; internal
access `private_symbols=30`; baseline manifest/dry-run `7/7`; documentation
`module_specs=39`; coordination passed with 30 historical expired warnings.
- Remaining risks: proprietary ADT visual/p95/p99 evidence is unavailable;
resource readiness/dispatch, permits, materializer choice and root destruction
intentionally remain loader-owned.
- Documentation updated: new `m2-build-queue.md` with API/I/O, data-flow,
lifecycle, sequence, dependency and ownership diagrams; world renderer,
batch planner, module registry, RENDER and M03 Evidence updated.
- Integration: master merge `1dc013e5c2597d5e6f26f44807f5f0a943bf1517`;
post-merge queue `cases=13 iterations=100 elapsed_ms=65.998`, ten adjacent
M2/lifetime/facade/internal-access/manifest checks, documentation and
coordination all passed; checkpoint dry-run retained `7/7` plans.
@@ -0,0 +1,98 @@
# M03-RND-M2-BUILD-RESOURCE-SNAPSHOT-001
<!-- OPENWC_CLAIM:M03-RND-M2-BUILD-RESOURCE-SNAPSHOT-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-build-resource-snapshot`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-build-resource-snapshot`
## Outcome
Replace loose per-step M2 animated/static resource variables with a typed
observation snapshot consumed by the dispatch planner and materializer adapter.
## Non-goals
- Move ResourceLoader I/O, cache lookup/request execution or retry ownership.
- Own or free prototype Nodes or Mesh Resources.
- Change dispatch priority, batch sizing, queue ordering, permits or visuals.
- Change M2 cache paths, formats, allowlists or native animation selection.
## Paths
- Exclusive: `src/render/m2/m2_build_resource_snapshot.gd`,
`src/tools/verify_m2_build_resource_snapshot.gd`,
`docs/modules/m2-build-resource-snapshot.md`, this claim
- Shared/hotspots: `src/render/m2/m2_build_dispatch_planner.gd`, its verifier/spec,
`src/scenes/streaming/streaming_world_loader.gd`, M2 queue/materializer/cache
specs and tests, `docs/modules/world-renderer.md`, `docs/modules/README.md`,
`RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources/caches and proprietary corpus
## Contracts and data
- Snapshot retains normalized path, optional animated prototype, animation
request state, optional static Mesh and terminal missing-model state.
- Static observation is adopted only after animation is not pending, the batch
is positive and no animated prototype exists.
- Accessors borrow exact engine references without transferring/freeing ownership.
- Diagnostics expose only path and scalar availability flags.
## Dependencies
- Requires: accepted M2 dispatch planner on master `b113db0`
- Blocks: extracting M2 resource observation/request service ownership
- External state: prototype/cache/pipeline/resource lifetime remains loader-owned
## Verification
- Commands: dedicated identity/adoption/diagnostic/lifetime/source/timing verifier;
dispatch/queue/batch/materializer/cache/pipeline/shutdown/facade/internal-access/
manifest regressions; documentation, coordination and checkpoint dry-run gates
- Fixtures: synthetic Node3D prototype and ArrayMesh resources
- Fidelity evidence: exact resource presence/pending/missing values and branch order
- Performance budget: 20,000 snapshot construct/adopt/read cycles under one second
## Documentation deliverables
- Inline API docs
- Module spec with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent dispatch/queue/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name: `M2BuildResourceSnapshot`
- Simplest solution: one small RefCounted value holder with explicit accessors
- Rejected complexity: generic resource union, signals, callbacks and cache ownership
- Unavoidable complexity: two-phase animation then optional static observation
- Measured optimization evidence: bounded synthetic lifecycle loop
## Status
- State: integration accepted
- Done: implementation, verification, documentation and worktree handoff
- Next: extract the M2 resource observation/request producer service
- Blocked by:
## Handoff
- Commit: `ec1b90f1e44037572e3e5052e6dedc016c29859a`
- Results: resource snapshot `cases=12 iterations=20000 elapsed_ms=42.995`;
dispatch planner remained green; all autonomous headless regressions `54/54`;
internal access `private_symbols=30`; baseline manifest/dry-run `7/7`;
documentation `module_specs=41`; coordination passed with 30 historical warnings.
- Remaining risks: proprietary ADT visual/p95/p99 evidence is unavailable;
resource lookup/request execution, action execution, permits and engine lifetime
intentionally remain loader-owned.
- Documentation updated: new `m2-build-resource-snapshot.md` with API/I/O,
data-flow, lifecycle, sequence, dependency and ownership diagrams; dispatch/
queue/world renderer specs, module registry, RENDER and M03 Evidence updated.
- Integration: master merge `4354834c50ae426640c721041af67d5265e82205`;
post-merge snapshot `cases=12 iterations=20000 elapsed_ms=42.211`, dispatch
planner and twelve adjacent resource/materializer/lifetime/facade/internal-
access/manifest checks, documentation and coordination all passed; checkpoint
dry-run retained `7/7` plans.
@@ -0,0 +1,91 @@
# M03-RND-M2-CACHED-ANIMATION-RESOURCE-OBSERVER-001
<!-- OPENWC_CLAIM:M03-RND-M2-CACHED-ANIMATION-RESOURCE-OBSERVER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-cached-animation-resource-observer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-cached-animation-resource-observer`
## Outcome
Move cached-GLB animated M2 lookup, allow/deny and primitive/schema safety
selection, threaded request admission and static-only transition from the loader
into a service that produces `M2BuildResourceSnapshot`.
## Non-goals
- Move native GryphonRoost raw-data build, debug logging or finalize drains.
- Own/free prototype Nodes or change cache/pipeline ownership.
- Change allow/deny defaults, primitive limits, candidate order or GLB rules.
- Change batching, permits, cache formats, profiles or visible output.
## Paths
- Exclusive: `src/render/m2/m2_cached_animation_resource_observer.gd`,
`src/tools/verify_m2_cached_animation_resource_observer.gd`,
`docs/modules/m2-cached-animation-resource-observer.md`, this claim
- Shared: loader, M2 snapshot/animation pipeline/prototype specs and verifiers,
world renderer, module registry, `RENDER.md` and M03 Evidence
## Contracts and data
- Cached animated prototype wins; static-only and pending states do not request.
- Empty allowlist rejects; denylist wins; matching is stripped/case-insensitive.
- Historical nested/lowercase/basename `.glb` order remains exact.
- Candidate requires animations, primitive limit and accepted empty or
`pivot_prefix_v1` schema; other schemas are rejected.
- Successful/`ERR_BUSY` request is remembered and reported pending; no usable
candidate or request failure marks animation static.
- Service produces a snapshot borrowing the exact prototype and frees nothing.
## Dependencies
- Requires: accepted static observer `5ebf4de`, snapshot and animation pipeline
- Blocks: native animation observation and remaining finalize extraction
## Verification
- Synthetic cache/pipeline/snapshot lifecycle, policy/path/GLB metadata fixtures,
source boundaries and timing; adjacent M2/renderer gates; full headless suite
and checkpoint dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, integration and post-merge acceptance
- Next: native M2 animation observation extraction
- Blocked by:
## Handoff
- Commit: `df87619` (`render: extract cached M2 animation resource observer`)
- Results: observer PASS (`33` cases, `20,000` iterations, `61.745ms`);
full autonomous suite PASS (`56/56`); renderer checkpoint dry-run PASS (`7/7`);
internal-access PASS (`30` private symbols); documentation PASS (`43` module
specs); coordination PASS with `34` historical warnings.
- Remaining risks: successful asynchronous admission is covered by source and
existing pipeline regressions because an undrained unit request leaks; generated
GLB metadata does not prove Godot import fidelity; private traversal, p95/p99,
leak and paired visual evidence remain unavailable; native observation and
terminal ResourceLoader polling/finalize remain loader-owned.
- Documentation updated: new cached observer API/I/O/data-flow/state/sequence/
dependency/ownership specification; M2 snapshot, batch/dispatch, animation
pipeline/prototype, world-renderer, module registry, `RENDER.md` and M03 Evidence.
## Integration
- Merge: `f79e064` (`merge: cached M2 animation resource observer`)
- Post-merge: observer `33` cases / `20,000` iterations / `61.514ms`;
animation pipeline `11` / `66.049ms`; snapshot `12` / `39.947ms`;
dispatch `10` / `17.915ms`; prototype cache `16` / `35.053ms`; shutdown,
facade, internal-access `30`, manifest `7/7`, documentation `43` and
coordination passed. Checkpoint dry-run completed `7/7`; expected private
Azeroth/character assets remained unavailable.
@@ -0,0 +1,109 @@
# M03-RND-M2-MESH-LOAD-PIPELINE-001 — M2 mesh load pipeline state
<!-- OPENWC_CLAIM:M03-RND-M2-MESH-LOAD-PIPELINE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-mesh-load-pipeline`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract static M2 threaded ResourceLoader request records and their terminal
finalize FIFO from `StreamingWorldLoader`, preserving request order, status
transition, metrics and reset/shutdown behavior.
## Non-goals
- Call ResourceLoader or choose `.tscn`/`.glb` cache paths.
- Own M2 Mesh, scene, missing or material-refresh caches.
- Extract Mesh from Resources or rebuild/adopt runtime Meshes.
- Consume `M2_MESH_FINALIZE` permits.
- Change cache formats, animation loading or visible M2 behavior.
## Paths
- Exclusive: `src/render/m2/m2_mesh_load_pipeline_state.gd`,
`src/tools/verify_m2_mesh_load_pipeline_state.gd`,
`docs/modules/m2-mesh-load-pipeline-state.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- One normalized path owns at most one pending request.
- Pending records preserve Dictionary insertion order for polling snapshots.
- Terminal completion removes the request and appends its record/status to FIFO.
- Finalize pop remains oldest-first; duplicate/unknown transitions are rejected.
- Total work count remains pending plus finalize records.
- Clear drops bookkeeping only; loader drains ResourceLoader requests first.
## Dependencies
- Requires: accepted classifier package on current master `8ec13d6`
- Blocks: further M2 Mesh cache/finalization service extraction
- External state: none; verification uses synthetic paths and opaque statuses
## Verification
- Commands: dedicated validation/order/transition/FIFO/clear/source/timing
verifier; M2 classifier/builder/grouper/transform/registry, materials, shutdown,
facade, internal-access, manifest, documentation and coordination gates
- Fixtures: synthetic normalized paths, resource paths and integer terminal statuses
- Fidelity evidence: exact request/finalize transitions and metric/reset sites preserved
- Performance budget: 100 cycles over 256 request/completion/pop records under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- World-renderer, module registry and RENDER status updates
## Simplicity and naming
- Important names introduced: `M2MeshLoadPipelineState`
- Simplest considered solution: one RefCounted with request map and finalize FIFO
- Rejected complexity/abstractions: generic ResourceLoader queue, signals,
callbacks, Mesh cache ownership or animation/static pipeline merger
- Unavoidable complexity and justification: polling and budgeted finalization are
distinct lifecycle stages across frames
- Measured optimization evidence: bounded synthetic transition loop
## Status
- State: accepted
- Done: state holder, loader adapters, contract verifier and required documentation
- Next: further M2 Mesh cache/finalizer extraction
- Blocked by:
## Handoff
- Commit: `82df7a5`
- Results: 34 headless contract regressions pass; dedicated pipeline state
verifier passes 100-by-256 transitions in 100.273 ms; documentation and
coordination gates pass; checkpoint dry-run passes 7/7.
- Remaining risks: no private asset traversal, leak/descriptor-pressure or
original-client visual comparison; ResourceLoader I/O and Mesh cache/finalizer
ownership remain in `StreamingWorldLoader` by design.
- Documentation updated: inline API; `m2-mesh-load-pipeline-state.md` with
data-flow, state, sequence and dependency diagrams; module registry,
`world-renderer.md` and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-MESH-LOAD-PIPELINE-001:82df7a5 -->
## Integration
- Merge commit: `83b3618`
- Post-merge results: pipeline state `cases=11 iterations=100
elapsed_ms=69.196`; classifier, materials, shutdown, facade, internal-access
`34`, manifest `7/7`, documentation and coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-MESH-LOAD-PIPELINE-001:83b3618 -->
@@ -0,0 +1,108 @@
# M03-RND-M2-MESH-RESOURCE-CACHE-001 — M2 mesh resource cache state
<!-- OPENWC_CLAIM:M03-RND-M2-MESH-RESOURCE-CACHE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-mesh-resource-cache`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract the normalized-path to static M2 Mesh resource cache from
`StreamingWorldLoader`, preserving lookup, replacement, shutdown lifetime and
all existing cache consumers.
## Non-goals
- Own the shared M2 missing-path cache or animated/prototype node caches.
- Call ResourceLoader, extract Meshes from Resources or select cache paths.
- Prepare, rebuild or materialize M2 Meshes.
- Change cache formats, material refresh, animation or visible behavior.
## Paths
- Exclusive: `src/render/m2/m2_mesh_resource_cache_state.gd`,
`src/tools/verify_m2_mesh_resource_cache_state.gd`,
`docs/modules/m2-mesh-resource-cache-state.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_m2_mesh_load_pipeline_state.gd`,
`src/tools/verify_render_runtime_cache_shutdown.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- Non-empty normalized M2 paths map to at most one Mesh resource reference.
- Store replaces the previous reference for the same path.
- Lookup returns the exact retained Mesh reference; unknown/empty paths return null.
- Clear releases all cache references only at the existing final-shutdown site.
- Shared missing/prototype/animated caches remain loader-owned and unchanged.
## Dependencies
- Requires: accepted mesh load pipeline package on master `ef782d1`
- Blocks: isolated M2 Mesh resource finalizer extraction
- External state: none; verification uses synthetic Mesh resources
## Verification
- Commands: dedicated validation/store/replace/lookup/clear/source/timing
verifier; mesh pipeline/classifier/material/shutdown/M2 build/facade/internal-
access/manifest, documentation and coordination gates
- Fixtures: synthetic ArrayMesh resources and normalized paths
- Fidelity evidence: exact cache call-site and shutdown lifetime preservation
- Performance budget: 100 cycles over 256 store/lookup entries under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state and dependency diagrams
- World-renderer, module registry and RENDER status updates
## Simplicity and naming
- Important name introduced: `M2MeshResourceCacheState`
- Simplest solution: one RefCounted with one typed-purpose Dictionary
- Rejected complexity: generic resource cache, missing-state merger, eviction,
signals, callbacks or materialization ownership
- Unavoidable complexity: none beyond retaining engine Resource references
- Measured optimization evidence: bounded synthetic store/lookup loop
## Status
- State: accepted
- Done: cache state, loader/test adapters, contract verifier and required documentation
- Next: isolated M2 Mesh resource finalizer extraction
- Blocked by:
## Handoff
- Commit: `e990a65`
- Results: dedicated cache verifier passes 100-by-256 store/lookups in
38.974 ms; 35 headless renderer/coordinate regressions pass; checkpoint
dry-run passes 7/7; documentation and coordination gates pass.
- Remaining risks: no private M2 traversal, Mesh memory/leak/descriptor-pressure
run or original-client visual comparison; extraction/preparation, shared
missing state and materialization remain loader-owned by design.
- Documentation updated: inline API; `m2-mesh-resource-cache-state.md` with
data-flow, lifecycle, sequence and dependency diagrams; pipeline spec, module
registry, `world-renderer.md` and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-MESH-RESOURCE-CACHE-001:e990a65 -->
## Integration
- Merge commit: `3094561`
- Post-merge results: cache state `cases=9 iterations=100
elapsed_ms=38.686`; pipeline, classifier, materials, shutdown, facade,
internal-access `34`, manifest `7/7`, documentation and coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-MESH-RESOURCE-CACHE-001:3094561 -->
@@ -0,0 +1,109 @@
# M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001 — M2 mesh resource extractor
<!-- OPENWC_CLAIM:M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-mesh-resource-extractor`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract first-Mesh selection from loaded M2 Resources and Node subtrees,
including temporary PackedScene instance cleanup, from `StreamingWorldLoader`.
## Non-goals
- Call ResourceLoader or select/request cache paths.
- Refresh/rebuild materials or load raw M2 data.
- Own the Mesh cache, missing state, prototypes or MultiMesh materialization.
- Change traversal order, cache formats, profiles or visible behavior.
## Paths
- Exclusive: `src/render/m2/m2_mesh_resource_extractor.gd`,
`src/tools/verify_m2_mesh_resource_extractor.gd`,
`docs/modules/m2-mesh-resource-extractor.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
M2 pipeline/cache/material/shutdown verifiers, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, M2 module specs, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- A direct Mesh Resource returns the same Mesh reference.
- A PackedScene is instantiated once, searched depth-first in child order and
its temporary root is freed before return.
- A Node subtree search returns the first MeshInstance3D Mesh in historical
depth-first preorder without changing the tree.
- Null, unsupported Resources and subtrees without a Mesh return null.
## Dependencies
- Requires: accepted Mesh resource cache package on master `5e2afbc`
- Blocks: isolated material refresh/rebuild finalizer extraction
- External state: none; verification uses synthetic Mesh/Node/PackedScene fixtures
## Verification
- Commands: dedicated direct/PackedScene/subtree/order/lifetime/source/timing
verifier; M2 pipeline/cache/classifier/material/shutdown/build/facade/internal-
access/manifest, documentation and coordination gates
- Fixtures: ArrayMesh, MeshInstance3D subtrees and synthetic PackedScene
- Fidelity evidence: exact traversal order and temporary-node destruction
- Performance budget: 10,000 synthetic subtree lookups under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- M2 cache/pipeline, world-renderer, registry and RENDER updates
## Simplicity and naming
- Important name introduced: `M2MeshResourceExtractor`
- Simplest solution: one stateless RefCounted with two explicit extraction APIs
- Rejected complexity: callback-driven finalizer, generic scene utility,
cache ownership, signals or visitor framework
- Unavoidable complexity: temporary PackedScene instance must be freed while
its referenced Mesh remains borrowed
- Measured optimization evidence: bounded synthetic depth-first traversal
## Status
- State: accepted
- Done: extractor, three loader/test adapters, contract verifier and required documentation
- Next: isolated M2 Mesh material preparation finalizer extraction
- Blocked by:
## Handoff
- Commit: `7b0e1ea`
- Results: extractor passes direct/PackedScene/subtree/order/lifetime contracts
and 10,000 traversals in 39.243 ms; 36 headless renderer/coordinate
regressions pass; checkpoint dry-run passes 7/7; documentation and
coordination gates pass.
- Remaining risks: synchronous PackedScene instantiation remains behind the
existing permit; no private M2 corrupt-scene/traversal/leak/p95/p99 or
original-client comparison; material preparation remains loader-owned.
- Documentation updated: inline API; `m2-mesh-resource-extractor.md` with
data-flow, lifecycle, sequence and dependency diagrams; cache/pipeline specs,
module registry, `world-renderer.md` and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001:7b0e1ea -->
## Integration
- Merge commit: `fa85985`
- Post-merge results: extractor `cases=10 iterations=10000
elapsed_ms=38.172`; cache, pipeline, classifier, materials, shutdown, facade,
internal-access `34`, manifest `7/7`, documentation and coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001:fa85985 -->
@@ -0,0 +1,84 @@
# M03-RND-M2-MESH-RESOURCE-FINALIZER-001
<!-- OPENWC_CLAIM:M03-RND-M2-MESH-RESOURCE-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-mesh-resource-finalizer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-mesh-resource-finalizer`
## Outcome
Move static M2 ResourceLoader status polling, terminal Resource/Mesh extraction,
runtime Mesh preparation, Mesh-cache adoption and missing outcome from the
loader into one dedicated finalization service.
## Non-goals
- Change static cache path selection or threaded request admission.
- Merge static and animated terminal services behind a generic callback layer.
- Own permits, MultiMesh materialization, prototype Nodes or SceneTree roots.
- Change material refresh version, rebuild rules, cache formats or visible output.
## Paths
- Exclusive: `src/render/m2/m2_mesh_resource_finalizer.gd`,
`src/tools/verify_m2_mesh_resource_finalizer.gd`,
`docs/modules/m2-mesh-resource-finalizer.md`, this claim
- Shared: loader, Mesh pipeline/cache/extractor/runtime-finalizer/raw-repository/
prototype specs and verifiers, world renderer, registry, `RENDER.md`, M03 Evidence
## Contracts and data
- Pending requests are polled in existing Dictionary insertion order.
- Empty Resource paths are discarded and marked missing immediately.
- Only LOADED/FAILED statuses enter completion-order finalize FIFO.
- One permit pops exactly one terminal record, including skipped/cached records.
- Existing cached Mesh suppresses terminal Resource retrieval.
- Loaded Resource uses exact first-Mesh extraction and current refresh-version path.
- Raw M2 data loads only when the extracted Mesh is stale.
- Prepared Mesh is stored by existing replacement semantics; failures mark missing.
## Dependencies
- Requires: accepted Mesh pipeline/cache/extractor/runtime finalizer/raw repository
- Blocks: remaining loader-owned M2 materialization and orchestration cleanup
## Verification
- Synthetic polling/FIFO/skip/load/extract/refresh/store/missing/source/timing
contracts; adjacent M2/renderer gates; full headless suite and checkpoint dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, verification and documentation
- Next: next unclaimed M03 renderer extraction package
- Blocked by:
## Handoff
- Commit: `ddeb708` (`render: extract M2 Mesh resource finalizer`)
- Results: finalizer PASS `cases=31 iterations=1000 elapsed_ms=0.767`;
adjacent Mesh pipeline/cache/extractor/runtime-finalizer/raw-repository/
prototype/shutdown checks passed; autonomous headless suite `59/59`;
documentation `46`; coordination passed with `34` historical warnings;
checkpoint dry-run `7/7`.
- Remaining risks: terminal instantiation/raw parsing/rebuild remain synchronous
main-thread work behind existing permits; no private-asset visual, leak,
descriptor-pressure or p95/p99 evidence was added.
- Documentation updated: new full module specification with API/I/O and
data-flow/state/sequence/dependency diagrams; adjacent M2 module specs,
world-renderer registry/spec, `RENDER.md` and M03 Evidence.
- Merge: `34b7000` (`merge: M2 Mesh resource finalizer`)
- Post-merge: finalizer PASS `cases=31 iterations=1000 elapsed_ms=0.826`;
adjacent M2 pipeline/cache/extractor/runtime/repository/prototype/shutdown,
facade, internal-access `30`, manifest `7/7`, documentation `46` and
coordination gates passed.
@@ -0,0 +1,84 @@
# M03-RND-M2-NATIVE-ANIMATION-RESOURCE-OBSERVER-001
<!-- OPENWC_CLAIM:M03-RND-M2-NATIVE-ANIMATION-RESOURCE-OBSERVER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-native-animation-resource-observer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-native-animation-resource-observer`
## Outcome
Move native GryphonRoost M2 animation candidate selection, synchronous raw read,
native animated build, prototype/static-only adoption and debug diagnostics from
the loader into a dedicated observer.
## Non-goals
- Change the exact native candidate predicate or add more animated models.
- Move cached-GLB observation, ResourceLoader polling/finalize or playback.
- Own attached instances, consume permits or change queue/batch behavior.
- Change native parsing/building, cache formats, profiles or visible output.
## Paths
- Exclusive: `src/render/m2/m2_native_animation_resource_observer.gd`,
`src/tools/verify_m2_native_animation_resource_observer.gd`,
`docs/modules/m2-native-animation-resource-observer.md`, this claim
- Shared: loader, M2 cached observer/snapshot/raw repository/prototype specs and
verifiers, world renderer, module registry, `RENDER.md` and M03 Evidence
## Contracts and data
- Only case-insensitive paths containing `gryphonroost` are native candidates.
- Cached animated prototype wins; static-only state suppresses repeated reads.
- Empty raw data or animated surfaces marks animation static.
- Builder result must be non-null with at least one child; rejection marks static.
- Successful result is adopted through first-wins prototype cache semantics.
- Existing `M2_NATIVE_ANIM_CACHE` fields and debug gating remain exact.
- Observer attaches/frees no Node and starts no async work.
## Dependencies
- Requires: accepted cached observer `6f385ed`, raw repository and prototype state
- Blocks: remaining ResourceLoader polling/finalize extraction
## Verification
- Synthetic candidate/cache/static/raw/build/adoption/lifetime/logging/source and
timing contracts; adjacent M2/renderer gates; full headless suite and checkpoint
dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, verification and documentation
- Next: remaining cached ResourceLoader terminal polling/finalize extraction
- Blocked by:
## Handoff
- Commit: `1cb0101`
- Results: observer `33` cases / `20,000` timing iterations; all `57/57`
autonomous headless regressions; facade/internal-access/shutdown/manifest;
documentation `44`; coordination; checkpoint dry-run `7/7`.
- Remaining risks: private asset animation/visual/leak/p95/p99 evidence is absent;
native parse/build stays synchronous; historical childless rejected Node remains
unfreed; cached ResourceLoader terminal polling/finalize stays loader-owned.
- Documentation updated: new native observer API/I/O/data-flow/state/sequence/
dependency/ownership spec; cached observer, snapshot, dispatch, repository,
prototype cache, world renderer, module registry, `RENDER.md` and M03 Evidence.
## Integration
- Merge: `d37c799`
- Post-merge: native/cached observers, repository, cache, snapshot, dispatch,
shutdown, facade, internal-access `30`, manifest `7/7`, documentation `44`,
coordination and checkpoint dry-run `7/7` passed on master.
@@ -0,0 +1,114 @@
# M03-RND-M2-PLACEMENT-GROUPER-001 — M2 placement grouper
<!-- OPENWC_CLAIM:M03-RND-M2-PLACEMENT-GROUPER-001:sindo-main-codex:2026-07-19 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-placement-grouper`
- Lease expires UTC: 2026-07-19
- Integrator: M03 milestone integrator
## Outcome
Extract pure ADT M2 placement validation, path normalization and local-transform
grouping from the worker callback into a scene-free service.
## Non-goals
- Change placement ordering, coordinate conversion, transform formulas or clamps.
- Move WorkerThreadPool tasks, mutex/result queues, tile state or retry behavior.
- Move build jobs, animation/mesh loading, caches, Nodes, MultiMesh or RIDs.
- Generalize grouping policy, change batching or add a dependency.
- Claim build-12340 placement or visual parity beyond preserved formulas.
## Paths
- Exclusive: `src/render/m2/m2_placement_grouper.gd`,
`src/tools/verify_m2_placement_grouper.gd`,
`docs/modules/m2-placement-grouper.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_m2_placement_transform_resolver.gd`,
`docs/modules/m2-placement-transform-resolver.md`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
proprietary renderer corpus
## Contracts and data
- Input: tile-local origin, MMDX name table and raw ADT M2 placement array
- Output: fresh Dictionary keyed by historically normalized relative M2 path;
each value is a fresh ordered Array of tile-local `Transform3D` values
- Invalid variants, out-of-range name IDs and empty paths are skipped
- Backslashes become slashes; lowercase `.mdx/.mdl` suffixes become `.m2`
- Transform basis/origin delegates to `M2PlacementTransformResolver`; final basis
scale retains the grouping-path clamp `max(scale, 0.0001)`
- Cache/schema/coordinate versions: unchanged
## Dependencies
- Requires: current master `c34e538`, `M2PlacementTransformResolver`
- Blocks: broader M2 worker/build decomposition
- External state: none; tests use synthetic names and placement dictionaries
## Verification
- Commands: dedicated invalid/name/path/group-order/default/transform/scale and
bounded timing verifier; loader source boundary; resolver/registry/dedupe plus
facade/internal-access/manifest/shutdown/documentation/coordination gates
- Fidelity evidence: exact loop rules and transform composition moved unchanged
- Performance budget: linear over placement count with fresh output containers;
no Node, Resource, RID, task, mutex, cache or file access
## Documentation deliverables
- Inline grouper API documentation
- New module spec with inputs/outputs, data-flow, lifecycle, ownership, failure,
performance, fidelity limitations and source map
- Transform resolver, renderer/module registry and `RENDER.md` updates
## Simplicity and naming
- Important name: `M2PlacementGrouper`
- Simplest solution: one stateless `group_placements` query
- Rejected complexity: group/result classes, strategy interfaces, callbacks,
Resources, policies or generic spatial batching framework
- Unavoidable complexity: raw ADT dictionaries remain at the parser adapter
- Measured optimization evidence: bounded synthetic grouping loop
## Status
- State: accepted
- Done: pure grouper, worker adapter, regressions and documentation verified
- Next: M2 worker/build state extraction and spatial-cell evidence
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-PLACEMENT-GROUPER-001:9df32d3 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-PLACEMENT-GROUPER-001:f88bf97 -->
## Handoff
- Commit: `9df32d3` (`refactor(M03): extract M2 placement grouper`)
- Results: dedicated grouper PASS (`cases=9`, `iterations=100`,
`placements=256`, `elapsed_ms=67.736`); transform resolver PASS (`cases=9`,
`iterations=10000`, `elapsed_ms=28.571`); M2 registry/dedupe, terrain
cache/LOD/queue, facade, internal-access, manifest, shutdown, scheduler,
streaming planner/focus, terrain-query and coordinate-boundary suites PASS;
editor import parsed the project with only expected missing private corpus
diagnostics; documentation PASS (`module_specs=17`, `required_files=7`);
coordination PASS with 23 pre-existing expired M00/M01 warnings; checkpoint
dry-run planned `7/7`.
- Remaining risks: no private asset-backed traversal/visual comparison;
uppercase extension preservation is historical but inconsistent with the
resolver's case-insensitive exception matching; grouping remains model-path
based rather than spatial-cell based; worker/build state and p95/p99 remain.
- Documentation updated: inline public API; new
`docs/modules/m2-placement-grouper.md`; transform resolver module spec,
renderer module registry, `docs/modules/world-renderer.md` and `RENDER.md`.
- Integration: accepted in master merge `f88bf97`; post-merge grouper
(`cases=9`, `iterations=100`, `placements=256`, `elapsed_ms=67.104`),
transform resolver, registry, internal-access, facade, manifest,
documentation and coordination gates passed.
@@ -0,0 +1,107 @@
# M03-RND-M2-PLACEMENT-TRANSFORM-001 — M2 placement transform resolver
<!-- OPENWC_CLAIM:M03-RND-M2-PLACEMENT-TRANSFORM-001:sindo-main-codex:2026-07-19 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-placement-transform`
- Lease expires UTC: 2026-07-19
- Integrator: M03 milestone integrator
## Outcome
Extract pure ADT M2 placement basis/origin-offset calculation, including the
existing waterfall and Elwynn cliff-rock calibrations, into a scene-free service.
## Non-goals
- Change coordinate conversion, placement positions, rotations or scale clamps.
- Generalize model-specific corrections or add new allowlisted models.
- Move grouping/tasks, MultiMesh/Node/Mesh/material/RID creation or caches.
- Change M2 animation/material behavior, cache versions or renderer profiles.
- Claim build-12340 placement parity beyond existing fixtures.
## Paths
- Exclusive: `src/render/m2/m2_placement_transform_resolver.gd`,
`src/tools/verify_m2_placement_transform_resolver.gd`,
`docs/modules/m2-placement-transform-resolver.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
proprietary renderer corpus
## Contracts and data
- Input: ADT-loader Godot Euler rotation, normalized/original M2 relative path,
and raw placement scale where origin compensation is requested
- Output: `Basis` and local origin-offset `Vector3`; no retained state
- Regular models use `Basis.from_euler`; two cliff rocks retain narrow YZX-style
shell correction; two waterfall sheets retain yaw/twist/anchor compensation
- Scale clamps remain caller-owned for final basis and resolver-owned at `0.0001`
only for historical waterfall anchor compensation
- Cache/schema/coordinate versions: unchanged
## Dependencies
- Requires: current master `1b6c468`
- Blocks: pure M2 grouping extraction and broader M2 service decomposition
- External state: none; tests use synthetic rotations/paths and pinned constants
## Verification
- Commands: dedicated regular/path-normalization/cliffrock/waterfall/twist-anchor/
scale and bounded timing verifier; three loader call-site/source boundaries;
M2 unique/dedupe plus facade/terrain/internal-access/manifest/shutdown gates
- Fidelity evidence: exact formulas/constants and model allowlists moved unchanged
- Performance budget: allocation-free scalar/Basis math per placement aside from
path normalization; no Node, Resource, RID, task, cache or file access
## Documentation deliverables
- Inline resolver API documentation
- New module spec with inputs/outputs, data-flow, lifecycle, ownership, failure,
performance, fidelity limitations and source map
- World renderer/module registry/`RENDER.md` updates
## Simplicity and naming
- Important name: `M2PlacementTransformResolver`
- Simplest solution: stateless service with basis and origin-offset queries
- Rejected complexity: transform strategy hierarchy, generic correction registry,
Resources, data-driven override format or callback injection
- Unavoidable complexity: four measured model-specific exceptions remain explicit
- Measured optimization evidence: bounded synthetic transform loop
## Status
- State: accepted
- Done: resolver extracted, three call sites migrated, contracts and docs verified
- Next: pure M2 grouping extraction and broader M2 service decomposition
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-PLACEMENT-TRANSFORM-001:0a09d7b -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-PLACEMENT-TRANSFORM-001:396be5e -->
## Handoff
- Commit: `0a09d7b` (`refactor(M03): extract M2 placement transform resolver`)
- Results: dedicated formula/source/timing contract PASS (`cases=9`,
`iterations=10000`, `elapsed_ms=28.732`); cold editor parse PASS;
documentation gate PASS (`module_specs=16`, `required_files=7`);
coordination gate PASS with 23 pre-existing expired M00/M01 warnings; related
M2 unique/dedupe, terrain cache/LOD/queue, facade, internal-access, manifest,
shutdown, scheduler, streaming focus/planner and coordinate-boundary suites
PASS; renderer checkpoint dry-run PASS `7/7`.
- Remaining risks: no private asset-backed visual recheck in this package;
general ADT M2 placement parity and asset-backed p95/p99 remain pending.
- Documentation updated: inline public API; new
`docs/modules/m2-placement-transform-resolver.md`; renderer module registry,
`docs/modules/world-renderer.md` and `RENDER.md`.
- Integration: accepted in master merge `396be5e`; post-merge resolver
(`cases=9`, `iterations=10000`, `elapsed_ms=27.409`), M2 registry,
internal-access, facade, manifest, documentation and coordination gates passed.
@@ -0,0 +1,111 @@
# M03-RND-M2-PROTOTYPE-CACHE-001 — M2 prototype cache state
<!-- OPENWC_CLAIM:M03-RND-M2-PROTOTYPE-CACHE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-prototype-cache`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract static/animated detached M2 prototype references plus missing-model and
static-animation negative outcomes from `StreamingWorldLoader` into one explicit
shutdown-lifetime cache-state service.
## Non-goals
- Choose `.tscn/.glb` paths, call ResourceLoader/native loaders or build Nodes.
- Own animation/Mesh request queues, Mesh resources, materials or MultiMeshes.
- Change candidate/allowlist/denylist rules, fallback order or visible behavior.
- Add persistence, eviction, async work, dependencies or cache-format changes.
## Paths
- Exclusive: `src/render/m2/m2_prototype_cache_state.gd`,
`src/tools/verify_m2_prototype_cache_state.gd`,
`docs/modules/m2-prototype-cache-state.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, runtime
cache shutdown/M2 raw/finalizer/extractor/pipeline/material/animation verifiers
and module specs, `docs/modules/world-renderer.md`, `docs/modules/README.md`,
`RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- Normalized non-empty paths key static and animated detached `Node3D` prototypes.
- Missing-model and static-animation outcomes are independent path sets.
- Exact cached Node reference is returned; first adoption for an occupied path wins.
- Shutdown frees valid detached nodes synchronously, queues in-tree nodes for free,
clears all four states and remains idempotent.
- Map refresh retains the state exactly as before; only final shutdown clears it.
## Dependencies
- Requires: accepted raw model repository package on master `ca77d32`
- Blocks: remaining M2 animation request/materialization extraction
- External state: none; verification uses synthetic Node3D instances
## Verification
- Commands: dedicated admission/identity/independence/duplicate/free/source/timing
verifier; runtime shutdown/raw/finalizer/extractor/cache/pipeline/material/
animation/M2 build/facade/internal-access/manifest, docs and coordination gates
- Fixtures: detached and in-tree synthetic Node3D prototypes
- Fidelity evidence: all existing lookup/store/negative/clear caller transitions
- Performance budget: 100 cycles over 256 path-state operations under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent M2/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name introduced: `M2PrototypeCacheState`
- Simplest solution: one main-thread RefCounted with two Node maps and two path sets
- Rejected complexity: generic Node cache, signals, callbacks, eviction policy,
weak references, async cleanup or dependency injection
- Unavoidable complexity: detached Nodes require explicit free at final shutdown
- Measured optimization evidence: bounded synthetic cache-cycle loop
## Status
- State: accepted
- Done: cache state, loader/test adapters, lifecycle verifier and required documentation
- Next: continue M2 animation request/materialization extraction
- Blocked by:
## Handoff
- Commit: `cd664eb`
- Results: prototype state passes 16 admission/identity/negative/lifecycle/source
cases and 100-by-256 cycles in 50.266 ms; 46 autonomous headless verifiers
pass, while the proprietary ADT placement probe is unavailable without
`data/extracted`; checkpoint dry-run passes 7/7; documentation and
coordination gates pass; loader-private inventory decreases from 34 to 31.
- Remaining risks: strong prototypes remain unbounded until shutdown; successful
asset traversal, descriptor pressure, leaks and p95/p99 require proprietary
data; no original-client visual comparison is claimed.
- Documentation updated: inline API; `m2-prototype-cache-state.md` with data-flow,
lifecycle, sequence and dependency diagrams; pipeline/Mesh-cache/extractor/raw
repository/world-renderer specs, module registry and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-PROTOTYPE-CACHE-001:cd664eb -->
## Integration
- Merge commit: `1de50f9`
- Post-merge results: prototype cache `cases=16 iterations=100
elapsed_ms=37.978`; shutdown, raw repository, finalizer, extractor, Mesh cache,
pipeline, materials, facade, internal-access `31`, manifest `7/7`,
documentation and coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-PROTOTYPE-CACHE-001:1de50f9 -->
@@ -0,0 +1,109 @@
# M03-RND-M2-RAW-MODEL-REPOSITORY-001 — raw M2 model repository
<!-- OPENWC_CLAIM:M03-RND-M2-RAW-MODEL-REPOSITORY-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-raw-model-repository`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract the repeated FileAccess/ClassDB native `M2Loader` boundary for static
and animated raw model Dictionaries from `StreamingWorldLoader`.
## Non-goals
- Cache raw data, Meshes, prototypes, missing paths or animation decisions.
- Build Nodes/Meshes, refresh materials or choose `.tscn/.glb` caches.
- Change static/animated parser methods, path resolution or fallback order.
- Add dependencies, persistence, retries or visible behavior.
## Paths
- Exclusive: `src/render/m2/m2_raw_model_repository.gd`,
`src/tools/verify_m2_raw_model_repository.gd`,
`docs/modules/m2-raw-model-repository.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2
finalizer/extractor/cache/pipeline/material/animation/shutdown verifiers and
module specs, `docs/modules/world-renderer.md`, `docs/modules/README.md`,
`RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- Static load calls native `load_m2`; animated load calls `load_m2_animated`.
- Paths remain `globalize_path(extracted_directory.path_join(normalized_path))`.
- Empty path, missing native class/file/instance/method, parse failure or
non-Dictionary result returns an empty Dictionary without retained state.
- Each successful request creates one native loader instance as before.
## Dependencies
- Requires: accepted runtime Mesh finalizer package on master `1d94eac`
- Blocks: M2 prototype/cache state extraction
- External state: native M2Loader registration and local extracted files
## Verification
- Commands: dedicated invalid/missing/class/source/timing verifier; finalizer/
classifier/extractor/cache/pipeline/material/animation/shutdown/M2 build/facade/
internal-access/manifest, documentation and coordination gates
- Fixtures: empty/missing normalized paths plus source contract; proprietary
success corpus remains external
- Fidelity evidence: exact native method names, path expression and three caller transitions
- Performance budget: 10,000 rejected empty-path calls under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Finalizer/extractor/cache/pipeline, world-renderer, registry and RENDER updates
## Simplicity and naming
- Important name introduced: `M2RawModelRepository`
- Simplest solution: one stateless RefCounted with static and animated load methods
- Rejected complexity: generic native repository, caching, dependency injection,
retries, diagnostics framework or async wrapper
- Unavoidable complexity: animated native method availability is a distinct guard
- Measured optimization evidence: bounded rejected-input loop
## Status
- State: accepted
- Done: repository, three loader adapters, contract verifier and required documentation
- Next: continue M2 prototype/cache state extraction
- Blocked by:
## Handoff
- Commit: `b608a81`
- Results: repository passes invalid/missing/stateless/native-boundary contracts
and 10,000 empty-path rejects in 3.275 ms; 45 repository-independent
headless verifiers pass, while the proprietary ADT placement probe is
unavailable without `data/extracted`; checkpoint dry-run passes 7/7;
documentation and coordination gates pass.
- Remaining risks: successful/corrupt native parsing, descriptor pressure,
leaks and p95/p99 remain asset-backed work; native calls are synchronous and
cannot be cancelled mid-parse; no original-client visual comparison is claimed.
- Documentation updated: inline API; `m2-raw-model-repository.md` with data-flow,
lifecycle, sequence and dependency diagrams; finalizer/classifier/world-renderer
specs, module registry and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-RAW-MODEL-REPOSITORY-001:b608a81 -->
## Integration
- Merge commit: `7cd07dd`
- Post-merge results: repository `cases=10 iterations=10000
elapsed_ms=3.200`; finalizer, extractor, cache, pipeline, shutdown, facade,
internal-access `34`, manifest `7/7`, documentation and coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-RAW-MODEL-REPOSITORY-001:7cd07dd -->
@@ -0,0 +1,110 @@
# M03-RND-M2-RUNTIME-MESH-FINALIZER-001 — M2 runtime mesh finalizer
<!-- OPENWC_CLAIM:M03-RND-M2-RUNTIME-MESH-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-runtime-mesh-finalizer`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract stale cached-Mesh refresh classification, metadata adoption,
M2Builder rebuild and fallback from `StreamingWorldLoader` into one runtime M2
Mesh finalizer while retaining raw-file I/O in the loader.
## Non-goals
- Load raw `.m2` files, call FileAccess/ClassDB M2Loader or choose cache paths.
- Own ResourceLoader requests, Mesh cache/missing state or MultiMesh builds.
- Change material refresh version `2`, classifier predicates or rebuild behavior.
- Change cache formats, profiles or visible output.
## Paths
- Exclusive: `src/render/m2/m2_runtime_mesh_finalizer.gd`,
`src/tools/verify_m2_runtime_mesh_finalizer.gd`,
`docs/modules/m2-runtime-mesh-finalizer.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2
classifier/extractor/cache/pipeline/material/shutdown verifiers and module
specs, `docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated M2 resources, caches and
proprietary renderer corpus
## Contracts and data
- Refresh version remains `2`; already-current Meshes return unchanged without raw data.
- Stale Meshes require caller-supplied raw data only when refresh is necessary.
- Empty/ordinary raw data marks the original Mesh current and returns it.
- Billboard/UV-rotation data attempts M2Builder rebuild and returns the rebuilt
first Mesh; rebuild failure marks and returns the original Mesh.
- Classifier memoization retains both existing clear sites through finalizer clear.
## Dependencies
- Requires: accepted Mesh resource extractor package on master `dd8cfbf`
- Blocks: further M2 raw-data I/O/prototype state extraction
- External state: none; verification uses synthetic Mesh/raw-data fixtures
## Verification
- Commands: dedicated current/stale/ordinary/rebuild/fallback/clear/source/timing
verifier; classifier/extractor/cache/pipeline/material/shutdown/M2 build/facade/
internal-access/manifest, documentation and coordination gates
- Fixtures: ArrayMesh and one synthetic triangle/billboard M2 Dictionary
- Fidelity evidence: exact refresh version, predicate, rebuild and fallback transitions
- Performance budget: 100 cycles over 256 ordinary finalizations under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Classifier/extractor/cache/pipeline, world-renderer, registry and RENDER updates
## Simplicity and naming
- Important name introduced: `M2RuntimeMeshFinalizer`
- Simplest solution: one service composing existing classifier/extractor and M2Builder
- Rejected complexity: callbacks for loader I/O, generic material pipeline,
cache ownership, signals or strategy framework
- Unavoidable complexity: two-phase raw-data request avoids loading raw files for current Meshes
- Measured optimization evidence: bounded synthetic ordinary finalization loop
## Status
- State: accepted
- Done: finalizer, loader/test adapters, transition/rebuild verifier and required documentation
- Next: further M2 raw-data I/O/prototype state extraction
- Blocked by:
## Handoff
- Commit: `ece7724`
- Results: finalizer passes current/stale/ordinary/synthetic-rebuild/fallback/
clear contracts and 100-by-256 finalizations in 53.719 ms; 37 headless
renderer/coordinate regressions pass; checkpoint dry-run passes 7/7;
documentation and coordination gates pass.
- Remaining risks: rebuild remains synchronous behind the existing permit; no
private M2 material/traversal/descriptor-pressure/leak/p95/p99 or original-
client comparison; raw `.m2` I/O remains loader-owned by design.
- Documentation updated: inline API; `m2-runtime-mesh-finalizer.md` with
data-flow, lifecycle, sequence and dependency diagrams; classifier/extractor/
cache/pipeline specs, module registry, `world-renderer.md` and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-RUNTIME-MESH-FINALIZER-001:ece7724 -->
## Integration
- Merge commit: `1fafdde`
- Post-merge results: finalizer `cases=11 iterations=100
elapsed_ms=54.349`; classifier, extractor, cache, pipeline, materials,
shutdown, facade, internal-access `34`, manifest `7/7`, documentation and
coordination gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-RUNTIME-MESH-FINALIZER-001:1fafdde -->
@@ -0,0 +1,115 @@
# M03-RND-M2-RUNTIME-REBUILD-CLASSIFIER-001 — M2 runtime rebuild classifier
<!-- OPENWC_CLAIM:M03-RND-M2-RUNTIME-REBUILD-CLASSIFIER-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-runtime-rebuild-classifier`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract the memoized decision that stale cached M2 meshes require an in-memory
runtime rebuild because raw batches contain billboard vertices or referenced UV
rotation transforms.
## Non-goals
- Load raw M2 files or cache Resources.
- Build, replace or mutate Meshes, materials, Nodes or RIDs.
- Change `M2_MATERIAL_REFRESH_VERSION` or cache formats.
- Interpret animation, particles, ribbons or general M2 shader fidelity.
- Change path normalization, ResourceLoader transitions or finalize budgets.
## Paths
- Exclusive: `src/render/m2/m2_runtime_mesh_rebuild_classifier.gd`,
`src/tools/verify_m2_runtime_mesh_rebuild_classifier.gd`,
`docs/modules/m2-runtime-mesh-rebuild-classifier.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT/M2 resources, caches
and proprietary renderer corpus
## Contracts and data
- Billboard metadata requires rebuild when `has_billboard` is true or
`billboard_vertex_count` is positive in any Dictionary batch.
- UV rotation requires non-empty transforms and combos plus a referenced
non-identity `Vector4` rotation or absolute rotation speed above `0.000001`.
- Only up to four texture stages per batch are inspected; invalid variants and
out-of-range combo/transform indices are skipped.
- The first decision for a normalized path is memoized until clear, matching the
existing loader cache lifetime.
## Dependencies
- Requires: current accepted master `90b1dac`
- Blocks: further M2 mesh request/cache/finalization extraction
- External state: none; verification uses synthetic raw M2 Dictionaries
## Verification
- Commands: dedicated billboard/UV/index/stage/cache/clear/source/timing verifier;
M2 builder/grouper/transform/registry, materials, shutdown, facade,
internal-access, manifest, documentation and coordination gates
- Fixtures: synthetic batches, transform combos and rotation dictionaries
- Fidelity evidence: exact existing predicate thresholds, stage cap and cache lifetime preserved
- Performance budget: 100 classifications over 256 paths under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- World-renderer, module registry and RENDER status updates
## Simplicity and naming
- Important names introduced: `M2RuntimeMeshRebuildClassifier`
- Simplest considered solution: one RefCounted with one memoized query and clear
- Rejected complexity/abstractions: generic predicate cache, strategy interface,
ResourceLoader wrapper, signals or typed rewrite of raw parser Dictionaries
- Unavoidable complexity and justification: four-stage combo indirection is the
existing build-12340 M2 material boundary
- Measured optimization evidence: bounded synthetic classification loop
## Status
- State: accepted
- Done: classifier/cache implemented; loader query and both clear sites migrated;
synthetic predicate/cache verifier and required documentation added
- Next: continue M2 mesh request/cache/finalization extraction
- Blocked by:
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-RUNTIME-REBUILD-CLASSIFIER-001:38f831e -->
## Handoff
- Commit: `19ca8f4`
- Results: classifier PASS (`cases=12`, `iterations=100`,
`elapsed_ms=64.585`; initial `35.461ms`); billboard flag/count, invalid
variants/indices, UV rotation/speed/epsilon, four-stage cap, memoization,
detached diagnostics and clear contracts PASS; 33 M2/WMO/liquid/terrain/
facade/scheduler/streaming/coordinate/material/shutdown regressions PASS;
internal-access decreased to `35`; documentation and coordination gates PASS;
checkpoint dry-run PASS `7/7`.
- Remaining risks: raw parser data remains Dictionary-based; the first decision
for a path remains authoritative until clear; classification covers the current
four-stage material implementation only; private asset descriptor-pressure,
traversal, p95/p99 and paired original-client evidence remain absent.
- Documentation updated: inline public API; new
`docs/modules/m2-runtime-mesh-rebuild-classifier.md`; module registry, world
renderer and `RENDER.md`; data-flow/state/sequence/dependency diagrams,
ownership, failure/recovery, thresholds, cache lifetime and source map included.
- Integration: merged as `38f831e`; post-merge classifier (`cases=12`,
`iterations=100`, `elapsed_ms=45.439`), materials, shutdown, M2 batch planner,
facade, internal-access (`private_symbols=35`), `7/7` manifest, documentation
and coordination gates passed.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-RUNTIME-REBUILD-CLASSIFIER-001:19ca8f4 -->
@@ -0,0 +1,106 @@
# M03-RND-M2-STATIC-BATCH-MATERIALIZER-001
<!-- OPENWC_CLAIM:M03-RND-M2-STATIC-BATCH-MATERIALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-static-batch-materializer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-static-batch-materializer`
## Outcome
Extract main-thread static M2 `MultiMesh` construction, render-property setup
and batch attachment from `StreamingWorldLoader`.
## Non-goals
- Change M2 grouping, batch sizing, build cursors, budgets or retry behavior.
- Change Mesh loading, refresh, cache ownership or missing-model outcomes.
- Own animated M2 instances, Editor persistence or tile cleanup.
- Introduce spatial cells or change transform order, visibility or shadows.
## Paths
- Exclusive: `src/render/m2/m2_static_batch_materializer.gd`,
`src/tools/verify_m2_static_batch_materializer.gd`,
`docs/modules/m2-static-batch-materializer.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, M2 build/
Mesh-cache/facade/internal-access/manifest verifiers and specs,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources/caches and proprietary corpus
## Contracts and data
- `MultiMesh.TRANSFORM_3D`, exact Mesh identity, instance count and transform
slice order remain unchanged.
- Batch node name remains model basename plus serial.
- Visibility end/margin and shadow setting remain exact renderer inputs.
- A valid batch attaches once to the supplied M2 parent and returns its node.
- Loader retains Editor-owner assignment, build cursor, budgets and retries.
## Dependencies
- Requires: accepted animated materializer package on master `86814de`
- Blocks: further M2 build-job orchestration extraction
- External state: Godot MultiMesh and SceneTree mutation remain main-thread APIs
## Verification
- Commands: dedicated invalid/name/mesh/count/order/render/attachment/source/timing
verifier; M2 build/cache/prototype/animated/shutdown/material/facade/internal-
access/manifest regressions; docs/coordination/dry-run gates
- Fixtures: synthetic ArrayMesh and ordered Transform3D slices
- Fidelity evidence: exact existing MultiMesh construction and render settings
- Performance budget: materialize 10,000 transforms under one second
## Documentation deliverables
- Inline API docs
- Module spec with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state, sequence and dependency diagrams
- Adjacent build/cache/world-renderer/module-registry/RENDER updates
## Simplicity and naming
- Important name introduced: `M2StaticBatchMaterializer`
- Simplest solution: synchronous main-thread RefCounted returning attached node
- Rejected complexity: signals, async queue, callbacks and generic materializer base
- Unavoidable complexity: MultiMesh is a Godot Resource owned through its node
- Measured optimization evidence: bounded synthetic transform upload
## Status
- State: ready for integration
- Done: materializer, loader adapter, verifier and required documentation
- Next: integrator merge and post-merge acceptance
- Blocked by:
## Handoff
- Commit: `252927d`
- Results: materializer passes 11 invalid/node/Mesh/render/attachment/source
cases and 10,000 transform API writes in 0.552 ms; all 51 autonomous headless
verifiers pass, while the proprietary ADT placement probe is unavailable
without `data/extracted`; checkpoint dry-run passes 7/7; documentation and
coordination gates pass; loader-private inventory remains 30.
- Remaining risks: headless dummy timing excludes GPU upload cost; private asset
traversal/visual comparison, spatial-cell culling, descriptor pressure, leaks
and p95/p99 remain unavailable; no original-client comparison is claimed.
- Documentation updated: inline API; `m2-static-batch-materializer.md` with
data-flow, lifecycle, sequence and dependency diagrams; build/cache/world-
renderer specs, module registry and `RENDER.md`.
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-STATIC-BATCH-MATERIALIZER-001:252927d -->
## Integration
- Merge commit: `5e82daa`
- Post-merge results: static materializer `cases=11 instances=10000
elapsed_ms=1.327`; build/cache/animated materializer, shutdown, facade,
internal-access `30`, checkpoint dry-run `7/7`, documentation and coordination
gates passed.
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-STATIC-BATCH-MATERIALIZER-001:5e82daa -->
@@ -0,0 +1,86 @@
# M03-RND-M2-STATIC-BUILD-RESOURCE-OBSERVER-001
<!-- OPENWC_CLAIM:M03-RND-M2-STATIC-BUILD-RESOURCE-OBSERVER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-m2-static-build-resource-observer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-m2-static-build-resource-observer`
## Outcome
Move static M2 build cache lookup, threaded request selection and terminal
missing transition from the loader into a service that fills
`M2BuildResourceSnapshot`.
## Non-goals
- Move animation/native prototype observation or finalize drains.
- Own/free Meshes, Nodes or cache entries.
- Change path candidate order, GLB filtering, retry behavior, permits or visuals.
- Change cache formats, profiles or batching.
## Paths
- Exclusive: `src/render/m2/m2_static_build_resource_observer.gd`,
`src/tools/verify_m2_static_build_resource_observer.gd`,
`docs/modules/m2-static-build-resource-observer.md`, this claim
- Shared: loader, M2 snapshot/dispatch/pipeline/cache specs and verifiers,
world renderer, module registry, RENDER and M03 Evidence
## Contracts and data
- Cached Mesh wins; terminal missing returns missing; existing pending request waits.
- Candidate order remains normalized/lowercase nested then basename per extension.
- `.tscn` precedes `.glb`; pivot-prefix GLB is skipped for static build.
- Successful/`ERR_BUSY` request is remembered; no usable candidate marks missing.
- Snapshot adopts exact Mesh/missing result; service never frees engine objects.
## Dependencies
- Requires: accepted resource snapshot `032a256`
- Blocks: remaining animated resource observer extraction
## Verification
- Synthetic cache/pipeline/snapshot lifecycle, path order, source boundaries and timing;
adjacent M2 and renderer gates; full headless suite and checkpoint dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, integration and post-merge acceptance
- Next: remaining animated resource observer extraction
- Blocked by:
## Handoff
- Commit: `7cb3e34` (`render: extract static M2 build resource observer`)
- Results: observer PASS (`11` cases, `20,000` iterations, `64.654ms`);
full autonomous suite PASS (`55/55`); renderer checkpoint dry-run PASS (`7/7`);
internal-access PASS (`30` private symbols); documentation PASS (`42` module
specs); coordination PASS with `30` historical warnings.
- Remaining risks: successful asynchronous admission is covered by source and
existing pipeline regressions because an undrained unit request leaks; private
asset traversal, p95/p99, leak and visual evidence remain unavailable;
animated observation and static finalize polling remain loader-owned.
- Documentation updated: new observer module API/I/O/data-flow/state/sequence/
dependency/ownership specification; M2 snapshot, pipeline/cache, world-renderer,
module registry, `RENDER.md` and M03 Evidence updated.
## Integration
- Merge: `a043c79` (`merge: static M2 build resource observer`)
- Post-merge: observer `11` cases / `20,000` iterations / `64.202ms`;
snapshot `12` / `42.895ms`; dispatch `10` / `18.096ms`; Mesh pipeline
`11` / `73.615ms`; Mesh cache `9` / `40.229ms`; prototype cache `16` /
`35.947ms`; shutdown, facade, internal-access `30`, manifest `7/7`,
documentation `42` and coordination passed. Checkpoint dry-run completed
`7/7`; expected private Azeroth/character assets remained unavailable.
@@ -0,0 +1,105 @@
# M03-RND-M2-UNIQUE-REGISTRY-001 — M2 unique placement registry
<!-- OPENWC_CLAIM:M03-RND-M2-UNIQUE-REGISTRY-001:sindo-main-codex:2026-07-19 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-m2-unique-registry`
- Lease expires UTC: 2026-07-19
- Integrator: M03 milestone integrator
## Outcome
Extract cross-tile positive `MDDF.uniqueId` reservation ownership from the
streamer into a scene-free `M2UniquePlacementRegistry`.
## Non-goals
- Move tile state, candidate requeue, group/build tasks or result queues.
- Move MultiMesh/Node/Mesh/material creation, animation or resource loading.
- Change unique-key format, first-owner semantics or unkeyed placement behavior.
- Change placement transforms, detail radius, cache versions or quality profiles.
- Add dependencies or mark the broad M2 service complete.
## Paths
- Exclusive: `src/render/m2/m2_unique_placement_registry.gd`,
`src/tools/verify_m2_unique_placement_registry.gd`,
`docs/modules/m2-unique-placement-registry.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_m2_unique_dedupe.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
proprietary renderer corpus
## Contracts and data
- Input: tile key and raw ADT M2 placement dictionaries
- Reserve output: fresh filtered placements, owned unique keys and skipped keys
- Release input/output: tile key plus claimed keys; only current owner releases
- Positive IDs map to `uid:<decimal>`; zero/negative/missing IDs remain untracked
- Registry is session-memory only and clears on renderer world reset
- Queue/cache/schema/coordinate versions: unchanged
## Dependencies
- Requires: current master `57ae1b8`
- Blocks: broader M2 service extraction and dependency/performance acceptance
- External state: none; tests use synthetic placement dictionaries
## Verification
- Commands: dedicated unkeyed/duplicate/cross-tile/release/clear/detached-
diagnostic and bounded timing verifier; loader source boundary; M2 unique-id
smoke plus facade/terrain/internal-access/manifest/shutdown/scheduler gates
- Fidelity evidence: exact positive-ID key format and first-owner/retry behavior
- Performance budget: dictionary membership over placement count; no Node,
Resource, RID, task, file or persistent cache
## Documentation deliverables
- Inline registry API documentation
- New module spec with inputs/outputs, data-flow, lifecycle, sequence, ownership,
failure, recovery, performance and source map
- World renderer/module registry/`RENDER.md` updates
## Simplicity and naming
- Important name: `M2UniquePlacementRegistry`
- Simplest solution: one private key-to-owner dictionary and explicit operations
- Rejected complexity: generic identity registry, signals, callbacks, Resources,
locks or ownership graph
- Unavoidable complexity: raw placement dictionaries remain at ADT adapter boundary
- Measured optimization evidence: bounded synthetic reserve/release verifier
## Status
- State: accepted
- Done: stateful registry, loader adapters, migrated smoke, regressions and docs
- Next: asset-backed boundary traversal and further M2-service extraction later in M03
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-M2-UNIQUE-REGISTRY-001:acb3a80 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-M2-UNIQUE-REGISTRY-001:2342430 -->
## Handoff
- Commit: `acb3a80` (`refactor(M03): extract M2 unique placement registry`)
- Results: dedicated contract PASS (`cases=10`, `iterations=100`, `35.688 ms`);
historical `uid:11785` smoke PASS; terrain/facade/internal-access/manifest/
shutdown/scheduler/streaming/focus/terrain-query/coordinate regressions PASS;
internal inventory remains `42`; editor parse and documentation/coordination/
diff gates PASS; checkpoint dry-run planned `7/7`
- Remaining risks: private Azeroth corpus was absent, so the asset-backed ADT
placement probe could not open the map and is not counted as passed evidence;
first ownership remains processing-order based; M2 grouping/build/tasks/caches/
finalization and asset-backed p95/p99 remain pending
- Documentation updated: `m2-unique-placement-registry.md`, module registry,
`world-renderer.md`, `RENDER.md`, inline API documentation and data-flow,
lifecycle and sequence diagrams
- Integration: accepted in master merge `2342430`; post-merge registry, legacy
smoke, internal-access, facade and manifest gates passed
@@ -0,0 +1,116 @@
# M03-RND-SCHEDULER-001 — Bounded render budget scheduler
<!-- OPENWC_CLAIM:M03-RND-SCHEDULER-001:sindo-main-codex:2026-07-18 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-render-budget-scheduler`
- Lease expires UTC: 2026-07-18
- Integrator: M03 milestone integrator
## Outcome
Extract the streamer's per-frame main-thread operation quotas into a scene-free
`RenderBudgetScheduler`, preserving existing queue priority and quota values and
stopping permit issuance after renderer teardown cancellation.
## Non-goals
- Move queue, worker-task, cache, Node, Resource or RID ownership out of the streamer.
- Change queue ordering, concurrency limits, exported defaults or visual behavior.
- Add a generic job framework, priority graph, time-based adaptive budgeting or dependency.
- Change cache formats, renderer profiles or target milestone status.
## Paths
- Exclusive: `src/render/streaming/render_budget_scheduler.gd`,
`src/tools/verify_render_budget_scheduler.gd`,
`docs/modules/render-budget-scheduler.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated cache resources and
proprietary renderer corpus
## Contracts and data
- Input: immutable per-frame map from documented operation lane IDs to
non-negative operation limits
- Output: boolean permits and remaining/consumed diagnostic snapshots
- Lifecycle: `begin_frame` resets permits; `cancel` permanently rejects permits
for the current scheduler instance
- Queue contents, ordering, task concurrency and schema/cache versions: unchanged
- Consumer: `StreamingWorldLoader` main-thread queue/finalize drains
## Dependencies
- Requires: integrated M03 facade and streaming planner on master `650d584`
- Blocks: renderer performance regression gate and per-service extraction
- External state: none; tests use synthetic lane limits and no world assets
## Verification
- Commands: dedicated scheduler verifier, facade/planner/focus/coordinate
regressions, renderer manifest/dry-run and repository gates
- Fixtures: shared lane priority, independent lanes, zero/negative limits,
frame reset, unknown lane and cancellation
- Fidelity evidence: operation defaults and loop order are captured before
migration; all seven renderer checkpoint plans remain valid
- Performance budget: permit checks are constant-time dictionary operations and
create no Node, Resource, worker task, cache entry or RID
## Documentation deliverables
- Inline API docs for scheduler lifecycle, permits and diagnostics
- New module specification with input/output table, data-flow, sequence and
lifecycle diagrams
- Updated world-renderer flow/ownership/source map, module registry and renderer notes
## Simplicity and naming
- Important name: `RenderBudgetScheduler`
- Simplest approach: one small main-thread service with named quota lanes
- Rejected complexity: generic job graph, callbacks, queue ownership, adaptive
timing controller, service container or third-party dependency
- Unavoidable complexity: chunk removal and creation intentionally share one
lane so removal retains priority while consuming the same historical budget
- Measured optimization evidence: no optimization claim; exact bounded extraction
## Status
- State: ready-for-review
- Done: extracted all 16 historical operation quotas, migrated ordered drains,
added terminal teardown cancellation, asset-free verification and module docs
- Next: M03 integrator reviews and merges `e52f703`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-SCHEDULER-001:e52f703 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-SCHEDULER-001:7ece2ab -->
## Handoff
- Commit: `e52f703`
- Results: `RenderBudgetScheduler` owns only per-frame lane counters and terminal
cancellation; `StreamingWorldLoader` retains queue order, task/cache/node/RID
ownership and operation execution. Chunk removal/create share one historical budget.
- Verification: scheduler `cases=6 iterations=20000 elapsed_ms=7.495`; planner
`cases=5 average_ms=1.879`; facade/focus contracts passed; coordinate boundary
`files=111 consumers=6`; renderer manifest `checkpoints=7 coverage=7 caches=7`;
shutdown ownership, documentation, coordination and diff gates passed.
- Fidelity: exported defaults, quality presets, queue order, operation sites,
cache versions and visible rendering rules are unchanged. Seven checkpoint
plans remain valid. No build-12340 parity claim is added.
- External/local inputs: ignored native DLL and two generated ADT resource scripts
were copied from master only for the worktree parse/smoke and then removed.
Proprietary extracted ADT data was unavailable, producing expected degraded-data diagnostics.
- Remaining risks: queue storage length and worker concurrency remain streamer-owned;
cancellation stops permit issuance but does not interrupt in-flight work; exact
p95/p99 impact still requires an asset-backed baseline.
- Documentation: new scheduler module spec with API, input/output, data-flow,
sequence, lifecycle, ownership, cancellation, performance and source-map sections;
world renderer, module registry and renderer implementation notes updated.
- Integration: accepted in master merge `7ece2ab`; post-merge scheduler timing
`cases=6 iterations=20000 elapsed_ms=10.216`, all listed regressions and gates passed.
@@ -0,0 +1,120 @@
# M03-RND-STREAMING-PLANNER-001 — Pure streaming target planner
<!-- OPENWC_CLAIM:M03-RND-STREAMING-PLANNER-001:sindo-main-codex:2026-07-17 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-streaming-target-planner`
- Lease expires UTC: 2026-07-17
- Integrator: M03 milestone integrator
## Outcome
Extract runtime/editor ADT wanted/retained-set calculation and boundary prefetch
selection from `StreamingWorldLoader` into a scene-free, deterministic
`StreamingTargetPlanner` with typed focus input and asset-free contract tests.
## Non-goals
- Change load/retain radii, boundary thresholds, queue priority or LOD policy.
- Move queue mutation, async jobs, cache ownership or GPU finalization.
- Extract `RenderBudgetScheduler` or asset services in this package.
- Change cache formats, renderer profiles or target milestone status.
## Paths
- Exclusive: `src/render/streaming/streaming_target_planner.gd`,
`src/render/streaming/streaming_target_policy.gd`,
`src/render/streaming/streaming_target_plan.gd`,
`src/tools/verify_streaming_target_planner.gd`,
`docs/modules/streaming-target-planner.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_coordinate_conversion_boundaries.gd`,
`docs/modules/world-renderer.md`, `docs/modules/coordinate-mapping.md`,
`docs/modules/README.md`, `RENDER.md`
- Generated/ignored: `.godot`, native DLL, generated cache resources and
proprietary renderer corpus
## Contracts and data
- Input: immutable `GodotWorldPosition`, available-tile key set and immutable
`StreamingTargetPolicy`
- Output: immutable `StreamingTargetPlan` with focus tile plus detached
wanted/retained tile-key sets
- Tile-key representation remains the streamer's existing `<x>_<y>` internal key
- Schema/cache/coordinate versions: unchanged
- Consumers: `StreamingWorldLoader` runtime/editor refresh paths
## Dependencies
- Requires: M01 typed coordinates/focus and integrated facade package `a100ced`
- Blocks: budget scheduler extraction and planner performance regression gate
- External state: none; tests use synthetic tile catalogs
## Verification
- Commands: dedicated planner verifier, facade/focus/coordinate regressions,
renderer manifest/dry-run and repository gates
- Fixtures: center, edge, corner, unavailable-tile, clamped-radius and editor cases
- Fidelity evidence: expected tile sets are captured from current formulas; full
renderer dry-run retains all seven checkpoint plans
- Performance budget: planner work remains bounded by square radii and creates no
Node, Resource, task, cache or RID
## Documentation deliverables
- Inline API docs for planner/policy/plan
- New module specification with input/output table and data-flow diagram
- Updated world-renderer data-flow/sequence/ownership/source map
- Updated module registry and renderer notes
## Simplicity and naming
- Important names: `StreamingTargetPlanner`, `StreamingTargetPolicy`,
`StreamingTargetPlan`
- Simplest approach: one pure calculator plus two immutable value objects
- Rejected complexity: generic graph planner, priority framework, service
container, job ownership or duplicate available-tile catalog
- Unavoidable complexity: boundary-prefetch cross product must preserve corner
behavior and existing string tile keys
- Measured optimization evidence: no new optimization; exact extraction
## Status
- State: ready-for-review
- Done: extracted immutable policy/plan and pure planner, migrated runtime/editor
target refresh, added behavior/dependency/performance coverage and module docs
- Next: integrated in master; next M03 package extracts the budget scheduler
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-STREAMING-PLANNER-001:ad8fc41 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-STREAMING-PLANNER-001:643850c -->
## Handoff
- Commit: `e887c3b`; cold-start fix `ad8fc41`
- Integration: accepted in master merges `d0f74f8` and `643850c`
- Results: runtime/editor wanted and retained ADT sets plus boundary-prefetch
centers are calculated by scene-free `StreamingTargetPlanner`; streamer keeps
queue ordering, LOD/detail state, jobs, caches, nodes and RIDs.
- Verification: planner `cases=5 iterations=250 average_ms=1.765`; facade
`delegation=3 runtime_scenes=2 tools=3`; focus `contract=1 runtime_scenes=2
capture_tools=3`; coordinate boundary `files=109 consumers=6`; renderer
manifest `checkpoints=7 coverage=7 caches=7`; shutdown ownership passed;
documentation, coordination and diff gates passed.
- Fidelity: center/corner/catalog/clamp/editor fixtures preserve the extracted
formulas; seven-checkpoint dry-run retained all plans. No radius, threshold,
load priority, cache version, placement, material, animation or visibility
rule changed. No build-12340 parity claim is added.
- External/local inputs: ignored native DLL and generated ADT resource scripts
were copied from master for worktree smoke only. Proprietary ADT and character
assets were unavailable, so the dry-run emitted expected degraded-data diagnostics.
- Remaining risks: exact p95/p99 impact still needs an asset-backed baseline;
pathological custom radii are not benchmarked; tile-key strings remain the
existing internal catalog representation; queue/LOD application remains monolithic.
- Documentation updated: new planner module spec with API/input/output/data-flow/
sequence/ownership/recovery/performance/source-map sections; world renderer,
coordinate mapping, module registry and renderer implementation notes updated.
@@ -0,0 +1,118 @@
# M03-RND-TERRAIN-CACHE-SERVICE-001 — Terrain quality mesh cache service
<!-- OPENWC_CLAIM:M03-RND-TERRAIN-CACHE-SERVICE-001:sindo-main-codex:2026-07-18 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-terrain-quality-cache`
- Lease expires UTC: 2026-07-18
- Integrator: M03 milestone integrator
## Outcome
Extract the full-quality terrain revisit Mesh cache, its LRU ownership and
source-admission rules from `StreamingWorldLoader` into a small scene-free
`TerrainQualityMeshCache`, preserving all call sites and observable behavior.
## Non-goals
- Move ADT parsing, tile state, quality-upgrade tasks/results or SceneTree/RID finalization.
- Change cache capacity defaults, quality profiles, source priority or cache formats.
- Cache control-splat/splat meshes that the current loader deliberately rejects.
- Extract chunk LOD, terrain material building, ground query or other asset services.
- Add dependencies, persistence, background work or mark the terrain service complete.
## Paths
- Exclusive: `src/render/terrain/terrain_quality_mesh_cache.gd`,
`src/tools/verify_terrain_quality_mesh_cache.gd`,
`docs/modules/terrain-quality-mesh-cache.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_render_runtime_cache_shutdown.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources, caches and
proprietary renderer corpus
## Contracts and data
- Public service API: `store`, `restore`, `clear`, detached `diagnostic_snapshot`
- Entry: tile key, retained Mesh reference and source string
- Admission: non-empty key, non-null Mesh, source other than
`control_splat_cache`, `splat_cache` or `splat`
- LRU: successful restore touches newest; store touches then trims oldest to
`max(0, capacity)`; invalid restored records are removed
- Persistence/cache format: none; session-memory ownership only
## Dependencies
- Requires: integrated facade contracts master `61bad09`
- Blocks: later terrain service extraction and cache/finalization acceptance audit
- External state: none; tests use synthetic ArrayMesh references
## Verification
- Commands: dedicated cache contract/LRU/ownership regression; streamer source
boundary; shutdown/facade/internal-access/manifest/planner/scheduler and repository gates
- Fixtures: admission/rejection, replacement, LRU touch/eviction, zero/negative
capacity, invalid record cleanup, clear and detached diagnostics
- Fidelity evidence: same sources/capacity/call sites; all seven baseline plans unchanged
- Performance budget: dictionary lookup plus bounded single-entry LRU operations;
no Node, task, file, cache serialization or RID creation
## Documentation deliverables
- Inline public API docs: store/restore/clear/diagnostics and ownership
- Module specification: new terrain quality mesh cache specification
- Data-flow diagram: upgrade result through cache to revisit state
- Sequence/state/dependency diagrams: store/restore/evict/reset and failure paths
- Source map/status updates: module registry, world renderer and `RENDER.md`
## Simplicity and naming
- Important names introduced: `TerrainQualityMeshCache`
- Simplest considered solution: one RefCounted with dictionary plus ordered tile-key array
- Rejected complexity/abstractions: generic cache framework, weak references,
callbacks, Resource cache integration, background eviction or persistence
- Unavoidable complexity and justification: Mesh references must survive unloaded
tile state while LRU keeps revisit memory bounded
- Measured optimization evidence: exact ownership extraction, no optimization claim
## Status
- State: ready-for-review
- Done: scene-free cache ownership/LRU extraction, loader adapter migration,
contract regression and module documentation
- Next: M03 integrator reviews and merges `97480e0`
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-TERRAIN-CACHE-SERVICE-001:97480e0 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-TERRAIN-CACHE-SERVICE-001:630a0c1 -->
## Handoff
- Commit: `97480e0`
- Results: `TerrainQualityMeshCache` now owns retained full-quality Mesh
references, source admission and oldest-to-newest LRU. The loader retains only
restore-to-state, store-after-upgrade and clear lifecycle adapters.
- Verification: cache `contract_cases=15 loader_calls=3`; facade/entity/ground/
terrain regressions; internal access `private_symbols=42 gameplay=7
editor_sources=9 renderer_tools=1`; manifest `7/7`; shutdown; scheduler
`20000` iterations; planner `250` iterations; focus; editor parse; dry-run;
coordination, documentation and diff gates passed.
- Fidelity: `baked_full` revisit retention, three excluded splat sources, LRU
touch/trim, profile capacities and all call sites remain unchanged. All seven
checkpoint plans remain valid. No visible or build-12340 parity claim is added.
- External/local inputs: ignored native DLL and generated ADT scripts supported
parse/dry-run only; missing proprietary ADT/DBC/character data produced expected diagnostics.
- Remaining risks: entry count does not measure Mesh bytes; ordered-array touch
remains linear; asset-backed revisit flash, memory and p95/p99 evidence remain pending;
terrain build/tasks/state/finalization are still monolithic.
- Documentation updated: new terrain cache API/input-output/data-flow/lifecycle/
sequence/ownership/failure/configuration/migration/diagnostic/source-map spec;
world renderer, registry and `RENDER.md` updated.
- Integration: accepted in master merge `630a0c1`; post-merge cache, facade,
internal-access, manifest, shutdown, scheduler and planner gates passed.
@@ -0,0 +1,104 @@
# M03-RND-TERRAIN-CHUNK-QUEUE-001 — Pure terrain chunk geometry queue planner
<!-- OPENWC_CLAIM:M03-RND-TERRAIN-CHUNK-QUEUE-001:sindo-main-codex:2026-07-19 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-terrain-chunk-queue`
- Lease expires UTC: 2026-07-19
- Integrator: M03 milestone integrator
## Outcome
Extract chunk-geometry create/remove desired-operation calculation from the
streamer into a scene-free `TerrainChunkGeometryQueuePlanner`.
## Non-goals
- Move queue storage/drains, render budgets, tile-LOD queues or async tasks.
- Move chunk Mesh/Node/RID creation/removal or terrain state ownership.
- Change removal-first execution, nearest-first create order or LOD selection.
- Change coordinate conversions, radii, cache formats or quality profiles.
- Add dependencies or mark the broad terrain service checklist complete.
## Paths
- Exclusive: `src/render/terrain/terrain_chunk_geometry_queue_planner.gd`,
`src/tools/verify_terrain_chunk_geometry_queue_planner.gd`,
`docs/modules/terrain-chunk-geometry-queue-planner.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
proprietary renderer corpus
## Contracts and data
- Input: loader-owned tile-state read model plus immutable `GodotWorldPosition`
- Output: fresh create/remove request arrays; planner retains no queue state
- Removal: current chunks absent from desired state, or all current chunks while
tile LOD is desired
- Creation: missing or LOD-mismatched chunks, sorted by origin XZ distance
- Queue/cache/schema/coordinate versions: unchanged
## Dependencies
- Requires: integrated terrain LOD planner master `b568768`
- Blocks: broader terrain service extraction and dependency/performance acceptance
- External state: none; tests use synthetic tile/chunk dictionaries
## Verification
- Commands: dedicated removal/create/mismatch/tile-fallback/sparse/order and
bounded timing verifier; loader source boundary; facade/cache/LOD/internal-access/
manifest/shutdown/scheduler/streaming planner and repository gates
- Fidelity evidence: extracted branch/order/distance rules and loader drain order
- Performance budget: bounded linear planning plus existing create sort; no engine
resource, task, cache or persistent allocation framework
## Documentation deliverables
- Inline planner API documentation
- New module spec with inputs/outputs, data-flow, lifecycle, sequence, ownership,
failure, performance and source map
- World renderer/module registry/`RENDER.md` updates
## Simplicity and naming
- Important name: `TerrainChunkGeometryQueuePlanner`
- Simplest solution: one stateless planner returning two fresh arrays
- Rejected complexity: generic operation graph, queue class, callback strategy,
spatial index or ownership transfer
- Unavoidable complexity: raw dictionaries remain at the loader/ADT adapter boundary
- Measured optimization evidence: bounded synthetic multi-tile verifier
## Status
- State: accepted
- Done: pure planner, loader queue adoption, semantic/timing regressions and docs
- Next: asset-backed performance acceptance and further terrain-service extraction later in M03
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-TERRAIN-CHUNK-QUEUE-001:f800e11 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-TERRAIN-CHUNK-QUEUE-001:24aef13 -->
## Handoff
- Commit: `f800e11` (`refactor(M03): extract terrain chunk queue planner`)
- Results: dedicated contract PASS (`cases=8`, `iterations=100`, `235.096 ms`);
LOD/cache/facade/internal-access/manifest/shutdown/scheduler/streaming/focus/
ground/terrain-query/coordinate regressions PASS; internal inventory remains
`42`; editor parse has no script errors; documentation/coordination/diff gates
PASS; checkpoint dry-run planned `7/7` entries with expected missing-private-
corpus diagnostics
- Remaining risks: planner adds a second linear tile-state pass; asset-backed
p95/p99 and visual acceptance remain pending; queue drains, terrain state and
Mesh/Node/RID finalization remain loader-owned
- Documentation updated: `terrain-chunk-geometry-queue-planner.md`, module
registry, `world-renderer.md`, `RENDER.md`, inline API documentation and
data-flow/lifecycle/sequence diagrams
- Integration: accepted in master merge `24aef13`; post-merge planner,
internal-access, facade and manifest gates passed
@@ -0,0 +1,103 @@
# M03-RND-TERRAIN-LOD-PLANNER-001 — Pure terrain chunk LOD planner
<!-- OPENWC_CLAIM:M03-RND-TERRAIN-LOD-PLANNER-001:sindo-main-codex:2026-07-18 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-terrain-chunk-lod-planner`
- Lease expires UTC: 2026-07-18
- Integrator: M03 milestone integrator
## Outcome
Extract chunk-level terrain LOD desired-state calculation from the streamer into
a scene-free `TerrainChunkLodPlanner` with immutable policy and typed focus input.
## Non-goals
- Move chunk/tile queues, loaded state, Mesh/Node/RID creation or budget drains.
- Change radii, chunk size, threshold inclusivity, priority sorting or tile LOD policy.
- Normalize/reorder custom radii or reinterpret negative values.
- Move ADT parsing, quality cache/tasks, materials or ground query.
- Add dependencies, persistence, workers or mark terrain extraction complete.
## Paths
- Exclusive: `src/render/terrain/terrain_chunk_lod_policy.gd`,
`src/render/terrain/terrain_chunk_lod_planner.gd`,
`src/tools/verify_terrain_chunk_lod_planner.gd`,
`docs/modules/terrain-chunk-lod-planner.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated resources, caches and
proprietary renderer corpus
## Contracts and data
- Input: ADT chunk adapter records, immutable `GodotWorldPosition`, immutable
enabled/radii/chunk-size policy
- Output: detached Dictionary mapping source chunk index to LOD `0`, `1` or `2`
- Formula: horizontal distance to `origin + half chunk`; inclusive squared thresholds
- Disabled policy and empty/sparse chunks return absent entries exactly as before
- Queue/cache/schema/coordinate versions: unchanged
## Dependencies
- Requires: integrated terrain cache slice master `ea08b8e`
- Blocks: broader terrain service extraction and dependency/performance acceptance
- External state: none; tests use synthetic chunk adapter records
## Verification
- Commands: dedicated center/boundary/outside/sparse/disabled/custom-radius and
bounded timing verifier; loader source boundary; facade/cache/internal-access/
manifest/shutdown/scheduler/streaming planner and repository gates
- Fidelity evidence: extracted formulas and all seven baseline plans remain unchanged
- Performance budget: bounded linear scan over at most the ADT chunk record count;
no Node, Resource, RID, task, cache entry or allocation framework
## Documentation deliverables
- Inline API docs for policy/planner
- New module spec with inputs/outputs, data-flow, lifecycle, sequence, ownership,
failure, performance and source map
- World renderer/module registry/`RENDER.md` updates
## Simplicity and naming
- Important names: `TerrainChunkLodPolicy`, `TerrainChunkLodPlanner`
- Simplest solution: immutable scalar policy plus one pure linear planner
- Rejected complexity: generic spatial index, quadtree, callback strategy,
normalized profile model or queue ownership
- Unavoidable complexity: raw chunk dictionaries remain at the ADT adapter boundary
- Measured optimization evidence: verifier records bounded High-like planning time
## Status
- State: accepted
- Done: immutable policy, pure planner, both loader call sites, regressions and docs
- Next: asset-backed performance acceptance and further terrain-service extraction later in M03
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-TERRAIN-LOD-PLANNER-001:eb94cfc -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-TERRAIN-LOD-PLANNER-001:f36fabb -->
## Handoff
- Commit: `eb94cfc` (`refactor(M03): extract terrain chunk LOD planner`)
- Results: dedicated contract PASS (`cases=7`, `iterations=250`, `12.726 ms`);
cache/facade/internal-access/manifest/shutdown/scheduler/streaming-focus/
streaming-planner/ground/terrain-query/coordinate regressions PASS; editor parse
has no script errors; documentation and coordination gates PASS; checkpoint
dry-run planned `7/7` entries with expected missing-private-corpus diagnostics
- Remaining risks: asset-backed p95/p99 and visual acceptance remain pending;
terrain state, queue, quality-upgrade and finalization ownership remains in loader
- Documentation updated: `terrain-chunk-lod-planner.md`, module registry,
`world-renderer.md`, `RENDER.md`, inline public API documentation and data-flow,
lifecycle and sequence diagrams
- Integration: accepted in master merge `f36fabb`; post-merge planner, facade,
internal-access and manifest gates passed
@@ -0,0 +1,106 @@
# M03-RND-WMO-PLACEMENT-REGISTRY-001 — WMO placement registry
<!-- OPENWC_CLAIM:M03-RND-WMO-PLACEMENT-REGISTRY-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-wmo-placement-registry`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract WMO placement-key to tile-reference ownership from the loader while
leaving every Node and renderer-resource lifecycle in the loader.
## Non-goals
- Change placement identity rules or WMO transforms.
- Move Node maps, world roots, tile state, jobs, queues or cancellation.
- Move cache/load requests, material refresh or render-group building.
- Change duplicate ordering, global-WMO lifetime or build budgets.
- Claim asset-backed WMO fidelity or performance acceptance.
## Paths
- Exclusive: `src/render/wmo/wmo_placement_registry.gd`,
`src/tools/verify_wmo_placement_registry.gd`,
`docs/modules/wmo-placement-registry.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/wmo-placement-resolver.md`, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT/WMO resources, caches
and proprietary renderer corpus
## Contracts and data
- Input: resolved WMO placement key and tile/global reference key
- `add_reference` creates a key/ref set or idempotently retains an existing ref
- `release_reference` erases only the supplied ref and returns true only when the
final ref removes the placement key
- `contains`, `active_count`, detached sorted diagnostics and idempotent `clear`
- Loader retains key→Node mapping and reacts to final release by cancelling the
render build and queue-freeing the corresponding Node
- Cache/schema/coordinate/profile versions: unchanged
## Dependencies
- Requires: current master `5aa40d6`, `WmoPlacementResolver` identity contract
- Blocks: WMO build/resource state decomposition
- External state: none; tests use synthetic placement/tile keys
## Verification
- Commands: dedicated add/shared/idempotent/non-owner/final/global/clear/
diagnostics/source/timing verifier; resolver/material/shutdown plus M2/terrain/
facade/internal-access/manifest/scheduler/streaming/coordinate/docs/coord gates
- Fidelity evidence: exact shared-ref and final-release behavior preserved
- Performance budget: dictionary membership over active WMO keys/refs; no Node,
Resource, RID, task, queue, mutex, cache or file access
## Documentation deliverables
- Inline registry API documentation
- New module spec with inputs/outputs, data-flow, lifecycle/state, ownership,
failure/recovery, performance, fidelity limitations and source map
- Placement resolver, renderer/module registry and `RENDER.md` updates
## Simplicity and naming
- Important name: `WmoPlacementRegistry`
- Simplest solution: one private key-to-reference-set Dictionary
- Rejected complexity: generic ref-count registry, signals, callbacks, Resources,
weak refs or Node ownership inside the service
- Unavoidable complexity: loader keeps a parallel key-to-Node map
- Measured optimization evidence: bounded synthetic add/release loop
## Status
- State: accepted
- Done: registry extracted; global/tile adapters migrated; Node/resource/job
ownership retained in loader; contract, regressions, dry-run and docs passed
- Next: WMO build/resource state extraction and asset-backed placement evidence
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-WMO-PLACEMENT-REGISTRY-001:c590036 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-WMO-PLACEMENT-REGISTRY-001:f9e5a4f -->
## Handoff
- Commit: `c590036`
- Results: `verify_wmo_placement_registry.gd` PASS cases=10,
iterations=100, elapsed_ms=53.941; 21 adjacent WMO/M2/terrain/facade/
scheduler/streaming/coordinate regressions PASS; documentation and
coordination gates PASS; render dry-run PASS 7/7.
- Remaining risks: no proprietary asset corpus or original-client paired WMO
capture; dry-run reports expected missing ADT/DBC/character assets; WMO
build/resource state remains loader-owned.
- Documentation updated: `docs/modules/wmo-placement-registry.md`,
`docs/modules/wmo-placement-resolver.md`, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`; inline public API comments added.
- Integration: accepted in master merge `f9e5a4f`; post-merge registry
(`cases=10`, `iterations=100`, `elapsed_ms=54.178`), resolver, runtime-cache
shutdown, facade, documentation and coordination gates passed.
@@ -0,0 +1,110 @@
# M03-RND-WMO-PLACEMENT-RESOLVER-001 — WMO placement resolver
<!-- OPENWC_CLAIM:M03-RND-WMO-PLACEMENT-RESOLVER-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-wmo-placement-resolver`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract pure WMO cache-path normalization, placement identity and world-transform
resolution from the loader into a scene-free service.
## Non-goals
- Change WDT/ADT coordinate conversion or WMO placement values.
- Own WMO registry references, tile lifecycle, jobs, queues or retries.
- Load cached/live WMO resources or validate cache format versions.
- Create Nodes, Mesh/MultiMesh, materials or RIDs.
- Change portal/room/material/occlusion behavior or claim WMO parity.
## Paths
- Exclusive: `src/render/wmo/wmo_placement_resolver.gd`,
`src/tools/verify_wmo_placement_resolver.gd`,
`docs/modules/wmo-placement-resolver.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT/WMO resources, caches
and proprietary renderer corpus
## Contracts and data
- `normalize_relative_path`: replace backslashes, lowercase entire cache key
- `resolve_unique_key`: positive `unique_id` becomes `uid:<decimal>`; otherwise
preserve `tile:<tile-key>:<placement-index>` fallback
- `resolve_world_transform`: defaults position/rotation to zero and scale to one;
compose the same Godot Euler basis and un-clamped uniform scale
- Three transform consumers: render-cache root, cached scene and live prototype
- Cache/schema/coordinate/profile versions: unchanged
## Dependencies
- Requires: current master `4f40c77`
- Blocks: WMO registry/build decomposition
- External state: none; tests use synthetic paths and placement dictionaries
## Verification
- Commands: dedicated path/identity/default/rotation/scale/source and bounded
timing verifier; M2/terrain/facade/internal-access/manifest/shutdown/scheduler/
streaming/coordinate/documentation/coordination gates
- Fidelity evidence: exact normalization, identity and property-transform rules
moved unchanged
- Performance budget: constant-time string/value math; no Node, Resource, RID,
task, queue, mutex, cache or file access
## Documentation deliverables
- Inline resolver API documentation
- New module spec with inputs/outputs, data-flow, lifecycle, ownership, failure,
performance, fidelity limitations and source map
- Renderer/module registry and `RENDER.md` updates
## Simplicity and naming
- Important name: `WmoPlacementResolver`
- Simplest solution: one stateless service with three explicit pure queries
- Rejected complexity: placement class hierarchy, generic model resolver,
Resources, strategies, callbacks or registry framework
- Unavoidable complexity: raw placement Dictionary remains parser boundary
- Measured optimization evidence: bounded synthetic resolver loop
## Status
- State: accepted
- Done: resolver, seven loader adapters, regressions and documentation verified
- Next: WMO registry/build extraction and asset-backed placement evidence
- Blocked by:
<!-- OPENWC_HANDOFF:READY:M03-RND-WMO-PLACEMENT-RESOLVER-001:05e216a -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-WMO-PLACEMENT-RESOLVER-001:d2cb52f -->
## Handoff
- Commit: `05e216a` (`refactor(M03): extract WMO placement resolver`)
- Results: dedicated resolver PASS (`cases=9`, `iterations=20000`,
`elapsed_ms=28.332`), including historical Node3D property equivalence;
renderer materials, M2 planner/grouper/transform/registry/dedupe, terrain
cache/LOD/queue, facade, internal-access, manifest, shutdown, scheduler,
streaming planner/focus, terrain-query and coordinate-boundary suites PASS;
editor import parsed with only expected missing private corpus diagnostics;
documentation PASS (`module_specs=19`, `required_files=7`); coordination PASS
with 23 pre-existing expired M00/M01 warnings; checkpoint dry-run planned `7/7`.
- Remaining risks: no private asset-backed WMO placement/visual/p95/p99 evidence;
old caches without positive UID retain per-tile fallback; raw Dictionaries and
WMO registry/build/resource state remain loader-owned; scale stays unclamped.
- Documentation updated: inline public API; new
`docs/modules/wmo-placement-resolver.md`; renderer module registry,
`docs/modules/world-renderer.md` and `RENDER.md`.
- Integration: accepted in master merge `d2cb52f`; post-merge resolver
(`cases=9`, `iterations=20000`, `elapsed_ms=27.919`), renderer materials,
shutdown, internal-access, facade, manifest, documentation and coordination
gates passed.
@@ -0,0 +1,108 @@
# M03-RND-WMO-RENDER-BUILD-PLANNER-001 — WMO render build step planner
<!-- OPENWC_CLAIM:M03-RND-WMO-RENDER-BUILD-PLANNER-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-wmo-render-build-planner`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract the pure one-operation WMO render build cursor decision from the loader
while preserving mesh-before-MultiMesh ordering and one budget permit per group.
## Non-goals
- Move Nodes, Resources, materials, jobs, queues, cancellation or permits.
- Change WMO placement, cache loading, transforms, visibility or shadows.
- Change build ordering, group names, editor ownership or finalization thread.
- Change cache formats, settings, presets or renderer diagnostics.
- Claim asset-backed WMO fidelity or p95/p99 acceptance.
## Paths
- Exclusive: `src/render/wmo/wmo_render_build_step_planner.gd`,
`src/tools/verify_wmo_render_build_step_planner.gd`,
`docs/modules/wmo-render-build-step-planner.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT/WMO resources, caches
and proprietary renderer corpus
## Contracts and data
- Input: mesh count/index and MultiMesh count/index
- Output: `mesh`, `multimesh` or `complete` operation, selected index and next
cursor values
- Mesh is selected while its cursor is below count; MultiMesh is selected only
after mesh exhaustion; complete follows both exhausted ranges
- Loader retains cursor adoption, Resource array access, Node creation, material
refresh, ownership, queue cancellation and budget permit consumption
- Cache/schema/coordinate/profile versions: unchanged
## Dependencies
- Requires: current master `1e73e59`, accepted WMO placement registry/resolver
- Blocks: further WMO render build state decomposition
- External state: none; verification uses scalar synthetic fixtures
## Verification
- Commands: dedicated ordering/cursor/empty/raw-edge/source/timing verifier;
WMO registry/resolver/material/shutdown plus M2/terrain/facade/internal-access/
manifest/scheduler/streaming/coordinate/docs/coord gates
- Fidelity evidence: exact mesh-first, one-step cursor behavior preserved
- Performance budget: 20,000 pure plans under 1 second; no Node, Resource, RID,
task, queue, mutex, cache or file access
## Documentation deliverables
- Inline public planner API documentation
- New module spec with inputs/outputs, data flow, sequence, ownership,
failure/recovery, performance/fidelity limits and source map
- Renderer module registry, world renderer and `RENDER.md` updates
## Simplicity and naming
- Important name: `WmoRenderBuildStepPlanner`
- Simplest solution: one stateless function and three operation constants
- Rejected complexity: job class, iterator, generic cursor framework, callbacks,
signals or ownership of engine objects
- Unavoidable complexity: loader still has separate mesh/MultiMesh materializers
- Measured optimization evidence: bounded synthetic planning loop
## Status
- State: accepted
- Done: planner and loader adapter implemented; Node/Resource/material/job/queue/
permit ownership retained in loader; regressions, dry-run and docs passed
- Next: WMO build job/resource ownership or liquid service extraction
- Blocked by:
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-WMO-RENDER-BUILD-PLANNER-001:c06aed5 -->
## Handoff
- Commit: `3a6b1d3`
- Results: dedicated planner PASS (`cases=9`, `iterations=20000`,
`elapsed_ms=11.914`); WMO registry/resolver/material/shutdown and 18 adjacent
M2/terrain/facade/scheduler/streaming/coordinate regressions PASS;
documentation and coordination gates PASS; checkpoint dry-run PASS `7/7`.
- Remaining risks: no proprietary WMO corpus, original-client paired capture or
traversal p95/p99; dry-run reports expected missing ADT/DBC/character assets;
WMO Resource arrays and untyped build jobs/queues remain loader-owned.
- Documentation updated: inline planner API;
`docs/modules/wmo-render-build-step-planner.md`, module registry,
`docs/modules/world-renderer.md`, `RENDER.md` with data-flow and sequence
diagrams, ownership, failure/recovery and source map.
- Integration: accepted in master merge `c06aed5`; post-merge planner
(`cases=9`, `iterations=20000`, `elapsed_ms=11.059`), WMO registry/resolver,
runtime-cache shutdown, facade, documentation and coordination gates passed.
<!-- OPENWC_HANDOFF:READY:M03-RND-WMO-RENDER-BUILD-PLANNER-001:3a6b1d3 -->
@@ -0,0 +1,117 @@
# M03-RND-WMO-RENDER-BUILD-QUEUE-001 — WMO render build queue
<!-- OPENWC_CLAIM:M03-RND-WMO-RENDER-BUILD-QUEUE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-wmo-render-build-queue`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract typed lightweight-WMO render build jobs and their FIFO key queue from
the loader while leaving all engine-object destruction and materialization in
the loader.
## Non-goals
- Queue-free Nodes or free Resources/RIDs.
- Move material refresh, Node creation, editor ownership or budget permits.
- Change duplicate enqueue, stale-key cleanup, cancel or clear ordering.
- Change placement, cache loading/versioning, transforms, shadows or visibility.
- Claim asset-backed WMO fidelity, leak acceptance or traversal p95/p99.
## Paths
- Exclusive: `src/render/wmo/wmo_render_build_job.gd`,
`src/render/wmo/wmo_render_build_queue.gd`,
`src/tools/verify_wmo_render_build_queue.gd`,
`docs/modules/wmo-render-build-queue.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`docs/modules/wmo-render-build-step-planner.md`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT/WMO resources, caches
and proprietary renderer corpus
## Contracts and data
- Typed job: placement key, strong Node3D/Resource references and two cursors
- FIFO queue preserves duplicate key append and first-occurrence erase behavior
- Stale front keys remain observable for loader-compatible pop-and-continue
- Cancel releases the keyed job reference and first queued key only
- Clear releases every job/key reference idempotently; never frees engine objects
- Loader retains validity checks, planner invocation, cursor adoption,
materialization, permits, cancellation reactions and Node destruction
- Cache/schema/coordinate/profile versions: unchanged
## Dependencies
- Requires: current master `1e740aa`, accepted WMO build step planner
- Blocks: further WMO cache/load and materialization decomposition
- External state: none; verification uses synthetic Node3D/Resource instances
## Verification
- Commands: dedicated invalid/FIFO/duplicate/stale/cursor/cancel/clear/
diagnostics/source/timing verifier; WMO planner/registry/resolver/material/
shutdown plus M2/terrain/facade/internal-access/manifest/scheduler/streaming/
coordinate/docs/coord gates
- Fidelity evidence: exact current queue/dictionary behavior preserved
- Performance budget: 100 cycles over 256 jobs under 1 second
## Documentation deliverables
- Inline job/queue API documentation
- New module spec with inputs/outputs, data flow, state/sequence, ownership,
threading, failure/recovery, performance/fidelity limits and source map
- Build-step planner, renderer module registry, world renderer and RENDER updates
## Simplicity and naming
- Important names: `WmoRenderBuildJob`, `WmoRenderBuildQueue`
- Simplest solution: one typed record plus Dictionary/Array queue composition
- Rejected complexity: generic job scheduler, signals, callbacks, mutexes,
Resources as job records or engine lifetime callbacks
- Unavoidable complexity: duplicate keys can intentionally leave stale entries
- Measured optimization evidence: bounded synthetic enqueue/cancel/clear loop
## Status
- State: accepted
- Done: typed job/queue implemented; three clear sites, metrics, enqueue, drain and
cancel migrated; engine destruction/materialization retained in loader
- Next: WMO cache/load state or liquid service extraction
- Blocked by:
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-WMO-RENDER-BUILD-QUEUE-001:60603e1 -->
## Handoff
- Commit: `e576ae2` (implementation `e1bb105` plus cold-load fix)
- Results: queue PASS (`cases=11`, `iterations=100`, `elapsed_ms=59.874`);
WMO planner/registry/resolver/material/shutdown and 18 adjacent M2/terrain/
facade/scheduler/streaming/coordinate regressions PASS; documentation and
coordination gates PASS; checkpoint dry-run PASS `7/7`.
- Cold-load recovery: post-merge smoke exposed an editor class-cache dependency;
typed queue accessors removed the loader/global-class dependency and a fresh
run without `.godot` passed (`cases=11`, `elapsed_ms=57.835`).
- Remaining risks: strong Node/Resource references require every loader cancel/
clear path; duplicate enqueue intentionally preserves stale FIFO keys; no
proprietary WMO corpus, original-client paired capture, leak run or traversal
p95/p99; dry-run reports expected missing ADT/DBC/character assets.
- Documentation updated: inline job/queue API;
`docs/modules/wmo-render-build-queue.md`, build-step planner spec, module
registry, world renderer and `RENDER.md`; data-flow/state/sequence diagrams,
ownership, threading, failure/recovery and source map included.
- Integration: implementation merged as `a878e7c`; its first post-merge smoke
exposed and rejected a cold global-class registration dependency. Fix merged
as `60603e1`; post-fix master queue (`cases=11`, `iterations=100`,
`elapsed_ms=56.454`), planner, registry, resolver, shutdown, facade,
documentation and coordination gates passed without parse diagnostics.
<!-- OPENWC_HANDOFF:READY:M03-RND-WMO-RENDER-BUILD-QUEUE-001:e576ae2 -->
@@ -0,0 +1,115 @@
# M03-RND-WMO-RENDER-RESOURCE-CACHE-001 — WMO render resource cache state
<!-- OPENWC_CLAIM:M03-RND-WMO-RENDER-RESOURCE-CACHE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-wmo-render-resource-cache`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract lightweight-WMO render Resource cache, negative cache and asynchronous
request bookkeeping from the loader while preserving loader-owned I/O and
cache-format validation.
## Non-goals
- Call `ResourceLoader`, construct cache paths or inspect files.
- Validate `WMOStreamingResource` script identity or format version.
- Own cached WMO scenes, live prototypes, placement/build jobs or Nodes/RIDs.
- Change fallback order, retry behavior, quality profiles or visual output.
- Claim asset-backed WMO fidelity, leak acceptance or traversal p95/p99.
## Paths
- Exclusive: `src/render/wmo/wmo_render_resource_cache_state.gd`,
`src/tools/verify_wmo_render_resource_cache_state.gd`,
`docs/modules/wmo-render-resource-cache-state.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_render_runtime_cache_shutdown.gd`,
`docs/modules/wmo-render-build-queue.md`, `docs/modules/world-renderer.md`,
`docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT/WMO resources, caches
and proprietary renderer corpus
## Contracts and data
- State keys are loader-normalized relative WMO paths copied as `String`.
- Cached values are already validated `Resource` references.
- Pending values are cache paths for loader-owned `ResourceLoader` requests.
- Terminal request removal precedes validated-resource or missing-state adoption.
- Request/missing reset preserves accepted resources; full clear releases all.
- Cache/schema/coordinate/profile versions and validation rules remain unchanged.
## Dependencies
- Requires: current master `c954704`, accepted WMO render build queue
- Blocks: further WMO cached-scene/load and materialization decomposition
- External state: none; verification uses synthetic Resources and paths
## Verification
- Commands: dedicated lifecycle/request/cache/reset/diagnostics/source/timing
verifier; WMO queue/planner/registry/resolver/material/shutdown plus adjacent
renderer/streaming/coordinate/documentation/coordination gates
- Fixtures: synthetic Resource instances and normalized relative/cache paths
- Fidelity evidence: exact current cache/missing/request transitions preserved
- Performance budget: 100 cycles over 256 resource/request keys under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state and loader interaction sequence diagrams
- World-renderer, module registry, WMO queue and RENDER status updates
## Simplicity and naming
- Important names introduced: `WmoRenderResourceCacheState`
- Simplest considered solution: one RefCounted around three Dictionaries
- Rejected complexity/abstractions: generic cache, callbacks, signals, mutexes,
ResourceLoader wrapper, persistence layer or shared WMO/M2 cache hierarchy
- Unavoidable complexity and justification: partial reset must retain validated
Resources while discarding pending/negative state at map reset and shutdown
- Measured optimization evidence: bounded synthetic store/request/reset loop
## Status
- State: accepted
- Done: state holder implemented; loader cache/request/reset/metrics adapters
migrated; shutdown regression and required documentation updated
- Next: cached WMO scene/load state or liquid service extraction
- Blocked by:
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-WMO-RENDER-RESOURCE-CACHE-001:b4955d6 -->
## Handoff
- Commit: `d39f591`
- Results: cache-state PASS (`cases=10`, `iterations=100`,
`elapsed_ms=58.727`); direct no-`.godot` cache-state run PASS (`45.361ms`);
WMO queue/planner/registry/resolver/material/shutdown plus 18 adjacent
M2/terrain/facade/scheduler/streaming/coordinate regressions PASS;
documentation and coordination gates PASS; checkpoint dry-run PASS `7/7`.
- Remaining risks: accepted Resources remain strongly referenced until full
shutdown release; cached-scene and ResourceLoader I/O seams remain in loader;
no proprietary corrupt-cache fixture, asset-backed WMO traversal/leak run,
p95/p99 or original-client paired evidence. Full loader cannot be used as a
direct empty-class-cache smoke because pre-existing typed global coordinate/
focus dependencies require editor class registration; the extracted service
itself passed cold and normal editor parse passed.
- Documentation updated: inline public API; new
`docs/modules/wmo-render-resource-cache-state.md`; module registry, WMO queue,
world renderer and `RENDER.md`; data-flow/state/sequence diagrams, ownership,
threading, cache-version boundary, failure/recovery and source map included.
- Integration: merged as `b4955d6`; post-merge cache state (`cases=10`,
`iterations=100`, `elapsed_ms=51.949`), shutdown, WMO queue/resolver, facade,
internal-access (`private_symbols=41`), `7/7` manifest, documentation and
coordination gates passed.
<!-- OPENWC_HANDOFF:READY:M03-RND-WMO-RENDER-RESOURCE-CACHE-001:d39f591 -->
@@ -0,0 +1,79 @@
# M03-RND-WMO-RENDER-RESOURCE-FINALIZER-001
<!-- OPENWC_CLAIM:M03-RND-WMO-RENDER-RESOURCE-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-wmo-render-resource-finalizer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-wmo-render-resource-finalizer`
## Outcome
Move lightweight WMO render-cache terminal ResourceLoader polling, script/format
validation and Resource/missing publication from the loader into one service.
## Non-goals
- Change `.res` cache path selection or threaded request admission.
- Own WMO build permits, queues, placement state, Nodes or materialization.
- Change `WMOStreamingResource.FORMAT_VERSION`, fallback order or visible output.
- Combine render Resource and PackedScene finalization behind a generic callback.
## Paths
- Exclusive: `src/render/wmo/wmo_render_resource_finalizer.gd`,
`src/tools/verify_wmo_render_resource_finalizer.gd`,
`docs/modules/wmo-render-resource-finalizer.md`, this claim
- Shared: loader, WMO render cache state spec/verifier, world renderer registry/spec,
`RENDER.md`, M03 Evidence
## Contracts and data
- Pending requests are polled in detached Dictionary insertion order.
- Only LOADED/FAILED statuses complete requests.
- Failed, null, wrong-script and stale-format Resources publish missing outcome.
- Current exact-script Resources are adopted without duplication.
- Request admission, reset/shutdown drain order and cache lifetime are unchanged.
## Dependencies
- Requires: accepted WMO render Resource cache state
- Blocks: remaining loader-owned WMO orchestration/materialization cleanup
## Verification
- Synthetic status/order/load/validation/adoption/source/timing contracts;
adjacent WMO/renderer gates; full headless suite and checkpoint dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, verification and documentation
- Next: next unclaimed M03 renderer extraction package
- Blocked by:
## Handoff
- Commit: `a86f8f2` (`render: extract WMO render resource finalizer`)
- Results: finalizer PASS `cases=24 iterations=1000 elapsed_ms=3.938`;
adjacent WMO cache/queue/planner/registry/resolver/scene-cache/shutdown checks
passed; autonomous headless suite `60/60`; documentation `47`; coordination
passed with `34` historical warnings; checkpoint dry-run `7/7`.
- Remaining risks: terminal ResourceLoader polling remains a synchronous
main-thread boundary; no serialized private WMO, corrupt-cache, visual, leak,
descriptor-pressure or p95/p99 evidence was added.
- Documentation updated: new full module specification with API/I/O and
data-flow/state/sequence/dependency diagrams; adjacent WMO cache/world-renderer
specs, module registry, `RENDER.md` and M03 Evidence.
- Merge: `1acddab` (`merge: WMO render resource finalizer`)
- Post-merge: finalizer PASS `cases=24 iterations=1000 elapsed_ms=3.777`;
WMO cache/queue/planner/registry/resolver/scene-cache/shutdown, facade,
internal-access `30`, manifest and checkpoint dry-run `7/7`, documentation
`47` and coordination gates passed.
@@ -0,0 +1,78 @@
# M03-RND-WMO-RUNTIME-MESH-FINALIZER-001
<!-- OPENWC_CLAIM:M03-RND-WMO-RUNTIME-MESH-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-wmo-runtime-mesh-finalizer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-wmo-runtime-mesh-finalizer`
## Outcome
Move cached WMO runtime Mesh material refresh versioning, surface iteration and
material-definition reconstruction from the loader into one service.
## Non-goals
- Change WMO traversal, placement, build-job scheduling or Node materialization.
- Change WMOBuilder shader/material behavior or cache formats.
- Change texture path ordering, metadata names or visible output.
- Generalize M2 and WMO finalization behind a shared abstraction.
## Paths
- Exclusive: `src/render/wmo/wmo_runtime_mesh_finalizer.gd`,
`src/tools/verify_wmo_runtime_mesh_finalizer.gd`,
`docs/modules/wmo-runtime-mesh-finalizer.md`, this claim
- Shared: loader, WMO build/cache and world renderer specs/verifiers,
`RENDER.md`, M03 Evidence
## Contracts and data
- Null meshes remain null; accepted meshes retain exact Resource identity.
- Refresh metadata version `10` remains the admission boundary.
- Only stale `ArrayMesh` surfaces with cached WMO texture metadata are rebuilt.
- Texture indices remain compact and ordered texture0, texture1, texture2.
- WMO flags, shader, blend mode and cached colors are forwarded unchanged.
- Scene traversal, builder material semantics and shutdown order are unchanged.
## Dependencies
- Requires: accepted WMO render and scene Resource finalizers
- Blocks: remaining loader-owned WMO runtime materialization cleanup
## Verification
- Synthetic identity/version/type/surface/metadata/color/definition/source/timing
contracts; adjacent WMO/renderer gates; full suite and checkpoint dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, verification and documentation
- Next: next unclaimed M03 renderer extraction package
- Blocked by:
## Handoff
- Commit: `ae40e3f` (`render: extract WMO runtime Mesh finalizer`)
- Results: finalizer PASS `cases=27 iterations=1000 elapsed_ms=0.402` in the
full run; autonomous headless suite `63/63`; documentation `49`; coordination
passed with `34` historical warnings; checkpoint dry-run `7/7`.
- Remaining risks: WMOBuilder surface mutation remains synchronous main-thread
work; no private WMO corpus, visual comparison, leak/GPU or p95/p99 evidence.
- Documentation updated: new full module specification with API/I/O and
data-flow/state/sequence/dependency diagrams; renderer registry/source map,
`RENDER.md` and M03 Evidence.
- Merge: `d65ebee` (`merge: WMO runtime Mesh finalizer`)
- Post-merge: finalizer PASS `cases=27 iterations=1000 elapsed_ms=0.202`;
WMO scene/render cache/finalizer/queue/planner/registry/resolver, shutdown,
materials, facade, internal-access `30`, manifest and checkpoint dry-run
`7/7`, documentation `49` and coordination gates passed.
@@ -0,0 +1,117 @@
# M03-RND-WMO-SCENE-RESOURCE-CACHE-001 — WMO cached-scene resource state
<!-- OPENWC_CLAIM:M03-RND-WMO-SCENE-RESOURCE-CACHE-001:sindo-main-codex:2026-07-20 -->
## Ownership
- Target: M03
- Program: RND
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m03-wmo-scene-resource-cache`
- Lease expires UTC: 2026-07-20
- Integrator: M03 milestone integrator
## Outcome
Extract cached-WMO `PackedScene`, negative-cache and asynchronous request state
from the loader while preserving loader-owned file limits, I/O and scene-cache
version validation.
## Non-goals
- Call `ResourceLoader`/`FileAccess`, construct `.tscn` paths or measure files.
- Instantiate scenes or validate WMO builder cache metadata/version.
- Own live WMO prototypes, placement/build jobs, instantiated Nodes or RIDs.
- Change missing/oversize/request-error fallback behavior or debug output.
- Claim asset-backed WMO fidelity, leak acceptance or traversal p95/p99.
## Paths
- Exclusive: `src/render/wmo/wmo_scene_resource_cache_state.gd`,
`src/tools/verify_wmo_scene_resource_cache_state.gd`,
`docs/modules/wmo-scene-resource-cache-state.md`, this claim
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
`src/tools/verify_render_runtime_cache_shutdown.gd`,
`docs/modules/wmo-render-resource-cache-state.md`,
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
`targets/03-renderer-facade.md`
- Generated/ignored: `.godot`, native DLL, generated ADT/WMO resources, caches
and proprietary renderer corpus
## Contracts and data
- State keys are loader-normalized relative WMO paths copied as `String`.
- Cached values are loader-validated `PackedScene` references.
- Pending values are `.tscn` paths for loader-owned threaded requests.
- Missing state accepts absent file, oversize, request-start, load and validation failures.
- Terminal pending removal precedes validated-scene or missing adoption.
- Transient clear retains accepted scenes; full clear releases all state.
- Cache metadata/version, file-size limit, profile and fallback rules are unchanged.
## Dependencies
- Requires: current master `e690756`; accepted WMO render Resource cache state
- Blocks: further WMO I/O/fallback and materialization decomposition
- External state: none; verification uses synthetic PackedScenes and paths
## Verification
- Commands: dedicated lifecycle/request/missing/reset/diagnostics/source/timing
verifier; WMO render-cache/queue/planner/registry/resolver/material/shutdown plus
adjacent renderer/streaming/coordinate/documentation/coordination gates
- Fixtures: synthetic PackedScene instances and normalized relative/cache paths
- Fidelity evidence: exact current cached-scene/missing/request transitions preserved
- Performance budget: 100 cycles over 256 scene/request keys under 1 second
## Documentation deliverables
- Inline public API docs
- Module specification with inputs/outputs, ownership and source map
- Data-flow, lifecycle/state and loader interaction sequence diagrams
- World-renderer, module registry, render-cache and RENDER status updates
## Simplicity and naming
- Important names introduced: `WmoSceneResourceCacheState`
- Simplest considered solution: one RefCounted around three Dictionaries
- Rejected complexity/abstractions: generic cache hierarchy, callbacks, signals,
mutexes, ResourceLoader wrapper, persistence layer or render/scene cache merger
- Unavoidable complexity and justification: missing can be recorded without a
pending request, and partial reset must retain validated PackedScenes
- Measured optimization evidence: bounded synthetic store/request/reset loop
## Status
- State: accepted
- Done: state holder implemented; loader lookup/request/drain/reset/metrics
adapters migrated; shutdown regression and required documentation updated
- Next: WMO I/O/live fallback or liquid service extraction
- Blocked by:
<!-- OPENWC_INTEGRATION:ACCEPTED:M03-RND-WMO-SCENE-RESOURCE-CACHE-001:ada0fd9 -->
## Handoff
- Commit: `c839294`
- Results: scene cache-state PASS (`cases=11`, `iterations=100`,
`elapsed_ms=40.768`; initial direct cold run `43.636ms`); render cache-state,
WMO queue/planner/registry/resolver/material/shutdown plus 18 adjacent
M2/terrain/facade/scheduler/streaming/coordinate regressions PASS;
documentation and coordination gates PASS; checkpoint dry-run PASS `7/7`.
- Remaining risks: accepted PackedScenes remain strongly referenced until full
shutdown release; ResourceLoader/FileAccess I/O, cache-validation probes and
live fallback remain in loader; no proprietary stale/oversize fixture,
asset-backed traversal/leak run, p95/p99 or original-client paired evidence.
The extracted scene state passed cold; full loader cold execution still needs
editor class registration for pre-existing focus/coordinate global classes.
- Documentation updated: inline public API; new
`docs/modules/wmo-scene-resource-cache-state.md`; render-cache spec, module
registry, world renderer and `RENDER.md`; data-flow/state/sequence diagrams,
ownership, threading, file-size/cache-version boundary, failure/recovery and
source map included.
- Integration: merged as `ada0fd9`; post-merge scene state (`cases=11`,
`iterations=100`, `elapsed_ms=40.113`), render state (`43.434ms`), shutdown,
WMO queue/resolver, facade, internal-access (`private_symbols=40`), `7/7`
manifest, documentation and coordination gates passed.
<!-- OPENWC_HANDOFF:READY:M03-RND-WMO-SCENE-RESOURCE-CACHE-001:c839294 -->
@@ -0,0 +1,80 @@
# M03-RND-WMO-SCENE-RESOURCE-FINALIZER-001
<!-- OPENWC_CLAIM:M03-RND-WMO-SCENE-RESOURCE-FINALIZER-001:sindo-main-codex:2026-07-20 -->
## Owner
- Agent ID: `sindo-main-codex`
- Target: M03 Renderer Facade and Safe Extraction
- Branch: `work/sindo-main-codex/m03-wmo-scene-resource-finalizer`
- Worktree: `C:\Users\sindo\open-wc-worktrees\m03-wmo-scene-resource-finalizer`
## Outcome
Move cached WMO PackedScene terminal ResourceLoader polling, probe validation,
probe lifetime and scene/missing publication from the loader into one service.
## Non-goals
- Change `.tscn` path selection, file-size admission or request start behavior.
- Own live fallback, placement/build jobs, attached Nodes or scheduler permits.
- Change WMOBuilder cache metadata/version rules or visible output.
- Merge PackedScene and lightweight render Resource finalization generically.
## Paths
- Exclusive: `src/render/wmo/wmo_scene_resource_finalizer.gd`,
`src/tools/verify_wmo_scene_resource_finalizer.gd`,
`docs/modules/wmo-scene-resource-finalizer.md`, this claim
- Shared: loader, WMO scene cache state spec/verifier, world renderer registry/spec,
`RENDER.md`, M03 Evidence
## Contracts and data
- Pending requests are polled in detached Dictionary insertion order.
- Only LOADED/FAILED statuses complete requests.
- Failed, null, non-PackedScene, non-Node3D and stale scenes publish missing.
- Accepted PackedScenes retain exact Resource identity.
- Validation instantiates once and releases accepted/rejected Node3D probes once.
- Admission, oversize logging, live fallback and shutdown order are unchanged.
## Dependencies
- Requires: accepted WMO scene Resource cache state
- Blocks: remaining loader-owned WMO live fallback/materialization cleanup
## Verification
- Synthetic status/order/type/probe/validation/lifetime/adoption/source/timing
contracts; adjacent WMO/renderer gates; full suite and checkpoint dry-run.
## Documentation deliverables
- Inline API docs; module API/I/O/ownership; data-flow/state/sequence/dependency
diagrams; adjacent renderer docs and M03 Evidence.
## Status
- State: accepted
- Done: implementation, verification and documentation
- Next: next unclaimed M03 renderer extraction package
- Blocked by:
## Handoff
- Commit: `7779e9e` (`render: extract WMO scene resource finalizer`)
- Results: finalizer PASS `cases=26 iterations=1000 elapsed_ms=4.186`;
adjacent WMO scene/render cache/finalizer/queue/planner/registry/resolver and
shutdown checks passed; autonomous headless suite `61/61`; documentation `48`;
coordination passed with `34` historical warnings; checkpoint dry-run `7/7`.
- Remaining risks: PackedScene probe validation remains synchronous main-thread
work; no serialized private WMO stale/oversize, long leak, visual,
descriptor-pressure or p95/p99 evidence was added.
- Documentation updated: new full module specification with API/I/O and
data-flow/state/sequence/dependency diagrams; adjacent WMO cache/world-renderer
specs, module registry, `RENDER.md` and M03 Evidence.
- Merge: `6a0f9bd` (`merge: WMO scene resource finalizer`)
- Post-merge: finalizer PASS `cases=26 iterations=1000 elapsed_ms=3.970`;
WMO scene/render cache/finalizer/queue/planner/registry/resolver/shutdown,
facade, internal-access `30`, manifest and checkpoint dry-run `7/7`,
documentation `48` and coordination gates passed.
+5
View File
@@ -0,0 +1,5 @@
# Fallback claims
Этот каталог используется только когда общий issue/PR tracker недоступен. Каждый активный work package создаёт отдельный Markdown-файл по [`../TASK_TEMPLATE.md`](../TASK_TEMPLATE.md).
Файл без валидного `OPENWC_CLAIM` marker не считается claim. Не хранить здесь secrets, credentials, proprietary data или большие логи.
+15 -1
View File
@@ -36,7 +36,12 @@ TrinityCore/AzerothCore ◄── Network Adapter ◄── Runtime Client
### Domain
Содержит идентификаторы, value objects, команды и события: `EntityId`, `WowGuid`, `MapPosition`, `SpellId`, `MoveIntent`, `EntityMoved`. Не содержит side effects.
Содержит идентификаторы, value objects, команды и события: stable authored
`ContentId`, session-local `EntityId`, opaque wire `WowGuid`, namespaced
`ServerEntryId`, typed coordinates, `SpellId`, `MoveIntent`, `EntityMoved`.
Эти identity namespaces не конвертируются неявно и не содержат side effects;
их lifecycle и mapping определены в
[`modules/domain-identities.md`](modules/domain-identities.md).
### Gameplay
@@ -56,6 +61,8 @@ Renderer получает `StreamingFocus`, `WorldVisualSnapshot` и presentatio
Владеет login/realm/character screens, HUD и FrameXML/Lua-compatible presentation. UI читает immutable view models и отправляет intents. Lua API получает capability-based facade; прямой доступ к network, filesystem и editor API запрещён.
Lua VM подключается через внутренний `LuaRuntime` interface. `rilua` и PUC-Rio Lua 5.1.1 рассматриваются как заменяемые backend-кандидаты; TOC, FrameXML, WoW API, event dispatch, SavedVariables, secure actions и taint не зависят от конкретного VM API. Rust/C++ типы не выходят за runtime adapter boundary.
### Audio
Владеет music, ambience, positional SFX, UI sounds и voice playback. Получает zone/combat/weather events и DBC-backed descriptors. Gameplay не управляет AudioStreamPlayer напрямую.
@@ -86,6 +93,12 @@ Godot `EditorPlugin` регистрирует workspace, docks, inspectors, gizm
Pipeline выполняет validate, allocate IDs, bake, diff, package, generate SQL, dry-run, apply-to-dev и verification. Production deployment является отдельной явно подтверждаемой операцией.
### Navigation tooling
Navigation build является частью authoring/build pipeline, а не renderer или authoritative client gameplay. Optional backend `recast-rs` получает каноническую triangle/collision geometry и создаёт OpenWC navigation cache для editor preview, reachability validation и path diagnostics. Первая интеграция должна быть process/CLI boundary; Rust GDExtension допускается только после стабильного формата обмена и измеренной необходимости интерактивных запросов.
Server `mmaps` остаются отдельным артефактом. Экспорт в TrinityCore/AzerothCore формат запрещено считать поддержанным, пока compatibility tests не докажут совпадение coordinates, Recast parameters, tile layout и server query behavior.
## Направление зависимостей
```text
@@ -129,6 +142,7 @@ src/
editor/
server_data/
build_pipeline/
navigation/
shared/
tests/
addons/
+63
View File
@@ -0,0 +1,63 @@
# Renderer Camera Pose Sweep
This offline M00 diagnostic recovers reproducible checkpoint framing when an original-client screenshot has no recorded camera yaw or pitch. It ranks a bounded grid; it does not change renderer or player-camera defaults and does not prove the exact build 12340 camera pose without human approval.
## Camera contract
`capture_render_checkpoints.gd` accepts additive `--camera-yaw-offset` and `--camera-pitch-offset` values in degrees. Yaw rotates the no-roll checkpoint basis around Godot world `Vector3.UP`; pitch then rotates around the camera-local right axis. Zero offsets preserve the manifest target exactly. `--single-pass` captures only `cold_process` and is intended for pose calibration, not performance baselines.
## Workflow
```powershell
.\tools\sweep_render_checkpoint_camera_pose.ps1 `
-ReferenceDirectory 'D:\private-fixtures\wow-3.3.5a-checkpoints' `
-Checkpoint elwynn_adt_boundary `
-YawOffsets -15,-10,-5,0,5,10,15 `
-PitchOffsets -10,-5,0,5,10 `
-CameraFovValues 38,50,62 `
-ViewportWidth 1280 -ViewportHeight 960 `
-WaitSeconds 8
```
Each candidate receives its own output directory and comparison report. `-CameraFovValues` adds FOV as another bounded grid dimension; omit it to retain the scalar `-CameraFov` workflow and legacy candidate paths. The viewport must exactly match the reference image dimensions; the runner fails on `size_mismatch` instead of inventing a score. The default 8-second wait matches the M00 manifest and is a readiness precondition: lowering it requires evidence that the checkpoint's WMO/M2 content has already appeared. `ranking.json` sorts candidates by mean perceptual error and then changed-pixel ratio. Use `-PlanOnly` to validate the Cartesian grid and output paths without rendering. Run a coarse grid first, then a finer grid around the best candidate.
```mermaid
flowchart LR
Y[Yaw offsets in degrees] --> G[Bounded Cartesian grid]
P[Pitch offsets in degrees] --> G
G --> C[Single-pass checkpoint captures]
R[Original-client reference] --> D[Perceptual comparator]
C --> D
D --> J[ranking.json]
J --> H[Human framing approval]
```
## Interpretation and recovery
The smallest error is a candidate, not automatic fidelity approval. Geometry, materials, lighting and FOV can move the perceptual optimum away from the true original-client pose. Inspect the best images manually and retain the original reference outside Git. A missing matching reference or candidate is a hard error; correct the checkpoint filter or filenames and rerun. Generated PNG and JSON outputs are disposable local evidence.
## Verification
The headless capture dry-run must report requested yaw and pitch offsets. Comparator `--self-test` covers paired metrics. Sweep `-PlanOnly` covers deterministic grid expansion and output naming without requiring a display. A real ranked sweep requires a display and a private build 12340 reference image.
## Goldshire Inn evidence — 2026-07-12
The private `2560x1440` build 12340 `goldshire_inn_large_wmo` reference was evaluated at FOV 62 degrees. A coarse 5x5 grid over yaw/pitch `[-20, -10, 0, 10, 20]` reduced mean error from `0.099632` at `(0, 0)` to `0.077575` at `(-10, -20)`. Extending pitch produced `0.070901` at `(0, -40)` and `0.063574` at `(0, -60)` with changed-pixel ratio `0.549556`.
These values are invalid camera-pose evidence because the sweep used a 2-second wait. A subsequent readiness audit showed 9 WMO instances and no inn after 2 seconds, 113 instances with the inn visible after 8 seconds, and 328 instances after 15 seconds. The apparent monotonic improvement rewarded grass while the landmark was still absent; it does not demonstrate a spatial/placement defect. The manifest pose remains unchanged pending a ready-scene rerun.
The ready-scene 3x3 rerun at FOV 62 degrees ranked `(yaw=10, pitch=-10)` first with mean error `0.087952` and changed-pixel ratio `0.665527`, compared with `0.101402`/`0.702489` at zero offsets. Human inspection confirms that the inn is present and the direction is plausible. Pitch remains on the tested boundary and the building scale differs from the reference, so these offsets are coarse evidence only; a joint pitch/FOV refinement is required before changing manifest camera values.
## Goldshire joint pitch/FOV refinement — 2026-07-12
A WMO-ready joint grid fixed yaw at 10 degrees and evaluated pitch `[-25, -20, -15, -10, -5]` across FOV `[38, 50, 62]`. Full-frame error ranked FOV 62/pitch -25 first at `0.078843` with changed-pixel ratio `0.667721`. Human inspection rejects it as a manifest calibration: the view is dominated by grass and crops the inn. FOV 38/pitch -10 is closer to the reference building scale but ranks only `0.084220`, and horizontal landmark alignment remains different.
The grid therefore has no approved joint optimum. Full-frame color error continues to trade landmark framing against large terrain regions. The manifest remains unchanged. The next registration method must score an approved inn/road/tree landmark region or explicit landmark coordinates rather than the entire image.
## Common landmark region — 2026-07-12
The comparator accepts an optional common screen rectangle through `--region x,y,width,height`; the sweep runner exposes it as `-ComparisonRegion x,y,width,height`. Coordinates are integer pixels in the shared reference/candidate image space. Both images must have identical dimensions and the rectangle must be fully inside them. Omitting the option preserves full-frame behavior.
The existing 15 WMO-ready Goldshire candidates were rescored inside `[300,100,1400,650]`, covering the reference facade/chimney and nearby trees. ROI error ranked FOV 38/yaw 10/pitch -15 first at `0.081777` with changed-pixel ratio `0.697185`. This is an interior pitch candidate and improves on the full-frame grass preference, but human inspection still rejects manifest calibration: the facade is too large, its upper part is cropped, and the rectangle retains substantial road/terrain pixels. A common rectangle is useful diagnostic weighting, not semantic landmark registration. Explicit approved landmark coordinates or a mask remain necessary.
During this run the sweep orchestration was hardened in two ways: expected comparator exit code `1` is now collected through an explicit child process, and viewport dimensions are explicit. A reference/candidate `size_mismatch` now fails before ranking instead of producing an empty metric.
+3
View File
@@ -37,6 +37,7 @@
- Packed GUIDs, update fields, create/update/out-of-range/destroy.
- Movement flags, heartbeat, jump/fall/swim/fly, transports, knockback и spline movement.
- Server time, tutorial flags, account data и feature capability detection.
- Warden handshake/module compatibility для явно поддерживаемых test/private server profiles с sandbox и без ориентации на official servers.
## Player и camera
@@ -92,6 +93,7 @@
- HUD: unit frames, target/focus, action bars, buffs, cast bars, bags, quest tracking, chat и combat text.
- FrameXML: templates, inheritance, anchors, strata, layers, scripts и events.
- Lua 5.1-compatible API surface, secure boundaries, SavedVariables и addon lifecycle.
- Заменяемый Lua 5.1.1 backend; `rilua` и PUC-Rio проходят единый WoW-specific compatibility corpus до выбора production VM.
- Widgets: Frame, Button, CheckButton, EditBox, Slider, StatusBar, ScrollFrame, Tooltip, Cooldown, Model, Texture, FontString, Minimap.
- Macro conditionals, keybindings, slash commands, localization и UI scaling.
@@ -110,6 +112,7 @@
- Quests, gossip, conditions, loot, vendors, trainers и localization.
- Zones, areas, graveyards, teleports, taxi, triggers и phase rules.
- Dungeon packages, encounters, doors, bosses, scripts и validation.
- Navigation authoring: walkability overlay, reachability, patrol/escort validation, off-mesh links и dynamic doors; optional `recast-rs` backend.
- Import, diff, package, SQL/change-set generation, dev deployment и playtest.
## Требование к расширяемости
+271
View File
@@ -0,0 +1,271 @@
# OpenWC Coding Standard
## Главные принципы
1. Код читается значительно чаще, чем пишется.
2. Явное и точное имя предпочтительнее короткого и двусмысленного.
3. KISS применяется по умолчанию: выбирается самое простое решение, которое корректно выполняет текущую задачу и сохраняет архитектурные границы.
4. Сложность допускается только там, где она следует из предметной области, формата, протокола, производительности или совместимости 3.3.5a.
5. Неизбежная сложность должна быть локализована, протестирована и документирована.
## Имена
Не нужно бояться длинных имён переменных, функций, типов, сигналов и файлов. Имя должно позволять понять назначение сущности без поиска всех мест использования.
Хорошо:
```gdscript
var terrain_control_splat_cache_finalize_queue: Array = []
var maximum_concurrent_terrain_upgrade_tasks: int = 1
func enqueue_terrain_control_splat_cache_finalize(tile_coordinate: Vector2i) -> void:
pass
func should_retain_streaming_tile_outside_visible_radius(tile_state: TileState) -> bool:
return false
```
Плохо:
```gdscript
var q = []
var max_t = 1
func do_ctl(p):
pass
func chk(s):
return false
```
Длина не является самоцелью. Не повторять контекст, который уже однозначно задаётся типом или модулем:
```gdscript
# Внутри TerrainStreamingService:
func enqueue_finalize(tile: TerrainTile) -> void:
pass
```
Такое имя допустимо, если `finalize` в этом классе имеет только одно значение. Если существуют terrain mesh, material и liquid finalization, имя должно уточнять конкретную операцию.
## Naming rules
- Типы/classes: `PascalCase`.
- GDScript functions/variables/signals: `snake_case`.
- Constants: `UPPER_SNAKE_CASE`.
- Private implementation members: `_leading_underscore` по Godot convention.
- C++ следует Godot/GDExtension convention внутри существующего native module; новый API не смешивает стили в одной области.
- Boolean: `is_`, `has_`, `can_`, `should_`, `needs_`, `was_`.
- Collections называются во множественном числе или по роли: `loaded_tiles`, `pending_packet_events`, `entity_by_guid`.
- Functions начинаются с действия: `load_`, `parse_`, `build_`, `enqueue_`, `apply_`, `validate_`, `resolve_`, `convert_`, `release_`.
- Units указываются в имени: `_milliseconds`, `_seconds`, `_bytes`, `_meters`, `_tiles`, `_radians`, `_degrees`.
- Coordinate space указывается, если возможна путаница: `canonical_wow_position`, `godot_world_position`, `adt_tile_coordinate`.
- Версия/build/profile указывается в типе или namespace, если semantics различаются: `Wotlk335ProtocolProfile`.
Допустимые устоявшиеся доменные сокращения:
- WoW, MPQ, BLP, DBC;
- ADT, WDT, WDL;
- M2, WMO;
- GUID, SRP, API, UI;
- LOD, RID, GPU, CPU;
- SQL, TCP.
Новые локальные сокращения из двух-трёх букв без общеизвестного значения запрещены.
## Запрещённые размытые имена
Избегать без уточнения:
```text
data
info
item
object
value
temp
result
state
manager
helper
utils
process
handle
do_work
```
Они допустимы только когда тип и ближайший scope делают значение полностью однозначным. Например, `parse_packet() -> PacketParseResult` может использовать локальную переменную `result`, если функция мала и другого результата нет.
`Manager`, `Helper`, `Utils` почти всегда скрывают несколько обязанностей. Предпочтительны названия по роли:
```text
WorldSession
StreamingTargetPlanner
RenderBudgetScheduler
CoordinateMapper
AssetRepository
QuestValidator
ServerSchemaAdapter
```
## KISS decision order
При выборе реализации двигаться по порядку:
1. Простая typed function с явными inputs/outputs.
2. Маленький value object или immutable result.
3. Небольшой service с одной ответственностью.
4. Composition нескольких services.
5. Interface/strategy только при реальной вариативности или boundary.
6. Generic framework только после нескольких подтверждённых use cases.
7. Native/low-level optimization только после измеренного bottleneck.
Не переходить на следующий уровень, если предыдущий решает задачу без нарушения correctness и architecture.
## Простота функций
- Одна функция выполняет одну логическую операцию.
- Название функции описывает observable effect.
- Inputs и outputs явные; hidden global state минимален.
- Guard clauses предпочтительнее глубокой вложенности.
- Happy path должен читаться сверху вниз.
- Side effects не смешиваются с pure calculation без необходимости.
- Parsing, validation, state mutation и presentation отделяются.
- Функция не принимает набор boolean flags, меняющих её смысл.
Плохо:
```gdscript
func load_tile(path: String, high: bool, async: bool, editor: bool):
pass
```
Лучше:
```gdscript
func request_streaming_tile_load(request: StreamingTileLoadRequest) -> void:
pass
```
При этом `StreamingTileLoadRequest` оправдан только если параметры действительно образуют устойчивый contract. Для двух простых аргументов не нужно создавать объект только ради архитектурности.
## Простота data flow
- Один владелец mutable state.
- Один канонический тип для одной концепции.
- Один mapper для coordinate conversion.
- Один authoritative source для content/runtime state.
- Изменения передаются commands/events/read models, а не чтением чужих внутренних dictionaries.
- Не создавать второй cache, registry или event bus без описанной отдельной ответственности.
- Не использовать строки и `call()` как основной type system.
- Dictionary допустим на binary/dynamic boundary; внутри domain данные переводятся в typed representation.
## Простота архитектуры
- Не вводить interface только потому, что «когда-нибудь может появиться второй backend».
- Interface обязателен на реальной внешней границе: renderer facade, protocol profile, Lua VM, server schema adapter, asset repository.
- Не создавать base class с одним наследником без конкретного boundary/invariant.
- Предпочитать composition inheritance.
- Не строить универсальную ECS, service container, message broker или plugin framework до подтверждённых требований OpenWC.
- Не переносить архитектуру reference-проекта целиком; извлекать только проверенное решение конкретной проблемы.
## Работа со сложностью
Сложность считается оправданной для:
- binary formats и build-specific layouts;
- encrypted/framed network protocol;
- incremental world streaming;
- animation/material compatibility;
- Lua/FrameXML/taint semantics;
- cross-core schema mappings;
- async jobs, cancellation и deterministic cleanup;
- performance-critical batching после profiling.
Если сложность неизбежна:
1. Изолировать её в одном модуле.
2. Дать точные имена промежуточным этапам.
3. Разбить pipeline на небольшие transformations.
4. Добавить data-flow/sequence/state diagram.
5. Зафиксировать invariants и ownership.
6. Создать fixtures для edge cases.
7. Объяснить, почему более простое решение недостаточно.
## Conditions and branching
- Предпочитать именованные predicates длинным boolean expressions.
- Branch по capability/profile должен быть локальным и типизированным.
- Не распространять `if core == "azerothcore"` по проекту; использовать adapter/capability.
- Не смешивать Blizzlike и Enhanced branches в каждом shader/service: выбирать profile/strategy на boundary.
- Pattern/table-driven mapping предпочтительнее сотен одинаковых `if`, если таблица остаётся читаемой и валидируемой.
## Comments
Комментарий объясняет `why`, invariant, source behavior или ограничение. Код и имя объясняют `what`.
Хорошо:
```gdscript
# WoW M2 bone indices are relative to the skin-section bone palette,
# not directly to the model-wide bone array.
```
Плохо:
```gdscript
# Increment index by one.
index += 1
```
TODO/FIXME обязан содержать target/work-package ID или diagnostic code.
## Error handling
- Ошибка содержит operation, subject и actionable context.
- Не возвращать пустой Dictionary как неразличимое сочетание `not found`, `invalid` и `unsupported`.
- Expected failure моделируется typed result/status; programming invariant может использовать assert в подходящем profile.
- Не проглатывать ошибку ради продолжения renderer/editor: degraded behavior должен быть виден diagnostics.
- Recovery path проще и предпочтительнее сложной попытки угадать состояние.
## Performance and KISS
- Не оптимизировать по предположению.
- Сначала baseline/profile, затем smallest measured fix.
- Batch/buffer/RenderingServer/native path вводится после доказательства bottleneck.
- Оптимизированный path обязан иметь простой contract и reference tests.
- Медленный понятный reference implementation полезен как oracle для optimized implementation.
- Сложная оптимизация удаляется или упрощается, если она не даёт измеримого результата.
## Coordinate conversion boundary
- Cross-space world conversions выполняются только через typed API
`CoordinateMapper`; ручные world-center offsets, swaps осей и вычисление ADT
filename indices из Godot position запрещены.
- Scene/render adapter МОЖЕТ создать `Vector3` только после получения
`GodotWorldPosition` или перевести engine vector в typed scalar value на своей границе.
- Единственная native world-position формула находится в
`src/native/src/wow_chunk_reader.h`, поскольку parser workers не вызывают
GDScript. Новая native копия требует отдельного boundary decision и parity fixture.
- `verify_render_coordinate_calibration.gd` остаётся независимым test oracle;
production code не копирует его формулы.
- Model-local M2/WMO vertex basis и placement orientation не являются world
coordinate conversion. Они документируются и тестируются своим format adapter.
- `verify_coordinate_conversion_boundaries.gd` обязателен при изменении
coordinates, native parsers, sky, player, streaming или renderer diagnostics.
## Review checklist
- Можно ли понять назначение сущности по имени?
- Есть ли двусмысленные сокращения?
- Выполняет ли функция одну операцию?
- Можно ли убрать abstraction без потери correctness/boundary?
- Есть ли скрытый mutable state или side effect?
- Не появился ли второй источник истины?
- Все ли cross-space world coordinates проходят через `CoordinateMapper` или
документированную native boundary?
- Измерена ли сложная optimization?
- Изолирована и документирована ли неизбежная сложность?
- Соответствуют ли API docs и diagrams фактическому коду?
Если reviewer не может объяснить data flow модуля после чтения имён, public API и module spec, work package не готов к интеграции.
+9
View File
@@ -91,6 +91,15 @@ Custom locations и mechanics могут требовать согласован
`ContentBundleManifest` связывает client и server artifacts общей версией. Клиент не входит в мир при несовместимой обязательной версии пакета без понятной диагностики.
## Navigation artifacts
Content Project хранит navigation profile и authoring hints, но не generated navmesh tiles. Build pipeline может создать:
- OpenWC navigation cache через pinned `recast-rs` для Editor preview и validation;
- server mmap artifact через отдельный TrinityCore/AzerothCore-compatible exporter, когда его совместимость доказана.
Артефакты имеют разные type/version IDs и не подменяют друг друга. Manifest фиксирует source geometry hash, coordinate profile, backend/version, Recast parameters и tile checksums. Любое изменение этих входов инвалидирует cache.
## Overlay и модификации
Оригинальные извлечённые файлы не изменяются in-place. Пользовательские пакеты образуют ordered overlay:
+280
View File
@@ -0,0 +1,280 @@
# OpenWC Documentation Standard
## Цель
Документация является частью реализации. Код без актуального объяснения публичного API, данных, ownership и поведения считается незавершённым, даже если компилируется и проходит тесты.
Документация должна позволить человеку ответить:
- зачем существует модуль;
- какие данные он получает и откуда;
- что он создаёт или изменяет;
- кто владеет состоянием и ресурсами;
- какие зависимости допустимы;
- что происходит по шагам;
- как модуль завершается, отменяется и восстанавливается после ошибки;
- как проверить fidelity, correctness и performance;
- какие части реализованы, запланированы или известны как gap.
Правила именования, KISS и локализации неизбежной сложности определены в [`CODING_STANDARD.md`](CODING_STANDARD.md). Документация и ясные имена дополняют друг друга: комментарий не должен компенсировать неудачное имя.
## Уровни документации
### 1. Inline API documentation
Находится рядом с кодом и является источником истины для точной сигнатуры:
- публичные classes/interfaces;
- public methods/functions;
- signals/events;
- exported properties/configuration;
- commands, events и read models;
- ownership/lifetime/threading requirements;
- error/return semantics;
- non-obvious invariants.
### 2. Module specification
Находится в `docs/modules/<module>.md` и объясняет назначение, архитектуру, data flow, state/lifecycle, extension points и verification. Шаблон: [`modules/TEMPLATE.md`](modules/TEMPLATE.md).
### 3. Data/schema documentation
Описывает persisted/wire/content formats: fields, types, units, optionality, version, migration, provenance и compatibility. Нельзя объяснять schema только примером JSON или SQL.
### 4. ADR
Фиксирует значимое решение, варианты и последствия. ADR не заменяет актуальное описание модуля: после решения module spec обновляется до текущего состояния.
### 5. Operational documentation
Команды build/test/import/bake/deploy/recovery, expected outputs и diagnostics. Команда без условий запуска и интерпретации результата недостаточна.
## Обязательная module specification
Новый самостоятельный модуль или существенно выделенная подсистема обязаны иметь документ со следующими разделами:
1. Metadata/status.
2. Purpose и non-goals.
3. Context и architecture boundaries.
4. Public API.
5. Inputs и outputs.
6. Data flow diagram.
7. State/lifecycle или sequence diagram, если применимо.
8. Ownership, threading и resource lifetime.
9. Errors, cancellation и recovery.
10. Configuration/capabilities/profiles.
11. Persistence/cache/migrations.
12. Diagnostics и observability.
13. Tests, fidelity evidence и performance budgets.
14. Extension points.
15. Known gaps.
16. Source map.
`Status` принимает только:
- `Planned`;
- `Prototype`;
- `Partial`;
- `Implemented`;
- `Verified`;
- `Deprecated`.
`Implemented` не означает fidelity; `Verified` требует evidence и ссылок на тесты.
## Обязательные схемы
### Data flow diagram
Обязательна для каждого module spec. Показывает реальные имена contracts и направление данных:
```mermaid
flowchart LR
Source[ADT bytes] --> Parser[ADTLoader]
Parser --> Data[AdtTileData]
Data --> Planner[StreamingTargetPlanner]
Planner --> Queue[RenderFinalizeCommand]
Queue --> Renderer[TerrainRenderer]
```
Диаграмма должна показывать:
- внешние источники;
- входные contracts;
- преобразования;
- выходные contracts/side effects;
- persistence/cache, если участвует;
- запрещённое направление, если оно является важной границей.
### Sequence diagram
Обязательна, если операция пересекает два и более из следующих boundary:
- thread/job queue;
- network;
- gameplay;
- renderer/UI/audio;
- Editor;
- server/database;
- filesystem/build pipeline.
```mermaid
sequenceDiagram
participant Net as WorldSession
participant Game as WorldState
participant View as EntityPresenter
participant Render as WorldRenderFacade
Net->>Game: EntityCreated
Game-->>View: EntityReadModel change
View->>Render: spawn_entity(descriptor)
```
### State diagram
Обязательна для lifecycle/state machine с тремя и более состояниями, reconnect/retry или rollback:
```mermaid
stateDiagram-v2
[*] --> Disconnected
Disconnected --> Connecting
Connecting --> Authenticated
Connecting --> Failed
Authenticated --> Disconnected
Failed --> Connecting: retry
```
### Dependency diagram
Обязательна при изменении архитектурной границы или модуле с тремя и более downstream consumers. Она показывает compile/runtime dependencies, а не случайное расположение Node в сцене.
## Public API documentation
Для каждого public symbol указываются:
- краткое назначение;
- параметры с единицами и coordinate space;
- return value или emitted event;
- preconditions/postconditions;
- ownership и mutability;
- допустимый thread;
- failure behavior;
- profile/capability restrictions;
- пример только если контракт остаётся неочевидным.
### GDScript
- Использовать `##` documentation comments для class, public methods, signals и exported properties.
- Всегда указывать типы аргументов/return, где Godot API позволяет.
- `@export` property объясняет units/range/profile и runtime mutability.
- Signal документирует момент emission, arguments и ordering guarantees.
- Internal helper получает комментарий, если содержит сложный invariant, coordinate conversion, ownership или performance assumption.
### C++/GDExtension
- Public headers используют Doxygen-compatible `///`/`/** */`.
- Документировать ownership указателей/references/buffers, thread safety и error transport.
- Binary structs указывают source format/build, packing/endianness и validation.
- Native/Godot boundary описывает allocation и lifetime Variant/PackedArray/Resource.
- Implementation comments объясняют `why` и invariant, а не пересказывают строку кода.
### Shaders/materials
- Uniform/global parameter: coordinate/color space, range, units и producer.
- Material profile: supported WoW shader/blend modes и approximations.
- Expensive branch/texture dependency имеет cost/fallback note.
- Blizzlike и Enhanced behavior документируются отдельно.
### Network codecs
- Opcode/direction/session phase.
- Exact build/profile.
- Field order/type/endianness/conditional presence.
- Domain events на выходе.
- Malformed/unknown handling.
- Fixture/reference source без sensitive payload.
### Content/server schemas
- Canonical field и mapping на каждый core adapter.
- Unit, default, null/optional semantics и flags.
- Numeric ID allocation и references.
- Migration/rollback и unsupported degradation.
## Документация потока данных
Inputs/outputs оформляются таблицей:
| Direction | Contract/data | Producer | Consumer | Ownership | Thread/lifetime |
|---|---|---|---|---|---|
| Input | `EntityMoved` | `WorldSession` | `WorldState` | Immutable event | Game-thread apply |
| Output | `EntityReadModel` | `WorldState` | Presenter/UI | Snapshot | Until next revision |
Side effects перечисляются отдельно:
- scene tree mutation;
- RenderingServer RID creation/free;
- filesystem/cache write;
- network send;
- DB query/apply;
- settings/SavedVariables mutation.
Скрытый side effect является дефектом документации и API.
## Статус реализации
Документ не должен выдавать roadmap за существующий код. Каждый важный capability помечается:
| Capability | Status | Evidence | Gap/next step |
|---|---|---|---|
После изменения кода статус и `Last verified` обновляются в том же work package. Если документацию нельзя подтвердить, ставится `Unknown`/`Planned`, а не предположение.
## Documentation change rules
Документация обновляется в том же work package, если изменились:
- public API/signal/event;
- data flow или ownership;
- state/lifecycle;
- thread boundary;
- format/schema/cache version;
- configuration/capability;
- diagnostics/error/recovery;
- fidelity или performance behavior;
- extension point.
Переименование symbol/path требует обновить source map, diagrams и ссылки. Stale documentation считается regression.
## Code comments
Хороший комментарий объясняет:
- почему решение отличается от очевидного;
- форматное или protocol ограничение;
- ownership/thread invariant;
- причину batching/budget;
- источник fidelity behavior;
- временный compatibility path и условие удаления.
Плохой комментарий:
- пересказывает код;
- обещает будущую работу без target/work package ID;
- содержит устаревшую сигнатуру;
- маскирует magic number без source/unit;
- утверждает `Blizzlike` без evidence.
TODO/FIXME должен содержать target/work package или diagnostic code.
## Review gate
Reviewer/integrator проверяет:
- public symbols имеют inline docs;
- module spec существует или обновлён;
- input/output и side effects перечислены;
- diagrams соответствуют реальным contracts;
- state/error/recovery paths показаны;
- tests/evidence и known gaps честны;
- документы не дублируют противоречивые источники истины.
Если хотя бы один обязательный пункт отсутствует, handoff остаётся `PARTIAL`, а target не может получить `DONE`.
+4
View File
@@ -36,6 +36,8 @@
Graph validator обнаруживает циклы без намеренного repeat policy, недостижимые узлы, отсутствующие targets и dead ends.
Spatial validator на основе navigation backend (первоначально optional `recast-rs`) отдельно проверяет физическую достижимость giver, objectives и turn-in для заявленного movement profile. Результат является authoring diagnostic: он не заменяет server pathfinding и требует server-integrated playtest для окончательного подтверждения.
## Локации
Локация проектируется слоями:
@@ -51,6 +53,8 @@ Graph validator обнаруживает циклы без намеренног
Редактор должен показывать heatmaps плотности spawn, quest travel paths, level/difficulty bands, line-of-sight blockers и приблизительную стоимость рендера.
Для подземелий navigation graph должен проверять связность входа, encounter rooms, дверей, recovery route и graveyard. Dynamic obstacles и off-mesh connections описываются явно, чтобы закрытая дверь или специальный переход не давали ложный положительный результат.
## Подземелья и encounters
`DungeonPackage` объединяет входы, difficulty, encounters, doors, triggers, trash groups, bosses, loot, quests, graveyards, scripts и localization.
+120
View File
@@ -0,0 +1,120 @@
# Godot Best Practices for OpenWC
## Статус
Это нормативные правила применения Godot в OpenWC. Они дополняют общую архитектуру и основаны на официальных Godot practices с учётом большого streaming world, native parsers и встроенного Editor tooling.
## Nodes только на границах
- Domain, packet codecs, validators, coordinate math, build graph и canonical content не должны быть Nodes.
- Node/Control используются для lifecycle, scene composition, input, rendering/audio presentation и Editor UI.
- Большой объём однородных данных хранится в typed objects/packed arrays/resources, а не в тысячах служебных Nodes.
- Scene не ищет глобально dependency по имени; parent composition передаёт contract/reference явно.
## Scene organization
- Каждая scene имеет одну ответственность и может запускаться в isolation с test doubles.
- Parent-child означает ownership: удаление parent логично удаляет child. Иначе системы являются siblings/services.
- Scene наружу публикует небольшой API/signals, а внутренние NodePaths не становятся публичным контрактом.
- Runtime, render sandbox, preview и capture scenes собираются из общих presenters/services.
- Generated world preview не сохраняется как authoring source.
## Dependency injection и signals
- Dependencies передаются composition root, initializer или exported interface reference.
- Signals используются для notification; commands/intents вызываются через явные методы/bus contracts.
- Signal connections снимаются симметрично при unload/plugin disable.
- Не использовать SceneTree groups как скрытый service locator для core architecture.
## Autoload policy
Autoload разрешён только для действительно process-wide lifecycle:
- composition/bootstrap coordinator;
- глобальная immutable build/version information;
- crash/diagnostic sink, если ему нужен process lifetime.
Gameplay state, network session, renderer world, editor session, caches конкретного проекта и audio emitters не должны становиться неявными глобальными managers. Они создаются/освобождаются владельцем режима.
## Resources and data
- Resource подходит для immutable/imported descriptors и editor-inspectable configuration.
- Runtime mutable authoritative state не хранится в shared Resource, который может быть случайно разделён сценами.
- Resource schema имеет version и migration, если сохраняется пользователем.
- Original extracted corpus и bulk caches не следует заставлять Godot массово импортировать без необходимости; применять `.gdignore`, custom import staging или native repository.
- Importer проверяет malformed input и записывает dependency/profile metadata.
## Background work
- Blocking `load()` не используется в frame-critical streaming path; применяются threaded load/jobs.
- Worker выполняет file I/O, parsing, decompression, grouping и pure data generation.
- SceneTree mutation, Node attach и большинство GPU/RID finalization выполняются main thread budget.
- Один Resource не модифицируется несколькими workers.
- GDScript container resize/mutation между threads защищается mutex или заменяется message passing.
- Все worker tasks ожидаются/очищаются; session cancellation не оставляет orphan work.
## Rendering performance
- Сначала измерять SceneTree/CPU/GPU bottleneck, затем переходить к RenderingServer.
- Repeated static M2 группировать spatial MultiMesh cells; один MultiMesh на весь мир ухудшает culling.
- Large transform buffers готовить линейно/в native code и отправлять батчем.
- Visibility ranges/HLOD, occlusion и automatic mesh LOD использовать совместно по профилю.
- Unique materials/textures минимизировать; descriptor/resource counts являются budget metric.
- RenderingServer RIDs имеют явного владельца и освобождаются в deterministic shutdown test.
- Shader/material profiles разделяют Blizzlike и Enhanced; runtime не компилирует тяжёлые варианты при пересечении ADT boundary.
## EditorPlugin lifecycle
- Любая регистрация в `_enter_tree()` имеет соответствующее удаление в `_exit_tree()`.
- Docks, inspectors, importers, gizmos, debugger plugins, signals и jobs снимаются при disable/reload.
- Editor UI не пишет файлы/SQL напрямую — только создаёт application commands.
- Mutation интегрирована с EditorUndoRedoManager или общей command history.
- Preview nodes считаются disposable; stable content IDs не равны instance IDs.
- Долгая операция имеет progress, cancellation и staging output.
## Editor imports and inspectors
- Custom import plugin применяется для формата, которому действительно нужен first-class Godot Resource lifecycle.
- Один extension/type имеет стабильный importer name и version.
- Platform/profile variants фиксируются явно.
- Custom inspectors редактируют canonical data через commands и показывают field-level validation.
- Gizmos не владеют сущностью и создают одну undoable logical operation на drag/stroke.
## UI
- Control tree не читает network packets и не ищет world nodes.
- View models immutable на frame/update boundary.
- Layout использует anchors/containers/theme tokens, а не hardcoded pixel positions вне fidelity backend.
- FrameXML compatibility layout изолирован от modern Godot-native screens.
- Input consumption и focus/modal context тестируются сценами.
## Profiling and diagnostics
- Использовать Godot profiler для script/physics и Visual Profiler для render CPU/GPU.
- Headless/CLI runs сохраняют JSON metrics; GPU runs фиксируют backend/device/driver/resolution.
- Performance changes сравниваются cold/warm и p50/p95/p99, а не одним FPS.
- GPU validation, memory tracking и RenderDoc workflow документируются для shader/backend defects.
- Custom monitors публикуют streaming queues, cache hits, entities, materials, RIDs и job latency.
## Tests
- Pure logic тестируется без SceneTree.
- Scene runner используется только для lifecycle/input/signals/layout/presentation.
- EditorPlugin имеет enable/disable/reload и undo/save/reload tests.
- Headless является обязательным CI path; visual tests запускаются отдельно на GPU runner.
- GdUnit4 рассматривается как кандидат для GDScript/scene tests; native tests остаются отдельным target.
## Official references
- [Godot Best practices](https://docs.godotengine.org/en/stable/tutorials/best_practices/index.html)
- [Scene organization](https://docs.godotengine.org/en/stable/tutorials/best_practices/scene_organization.html)
- [Autoloads versus regular nodes](https://docs.godotengine.org/en/stable/tutorials/best_practices/autoloads_versus_regular_nodes.html)
- [Background loading](https://docs.godotengine.org/en/stable/tutorials/io/background_loading.html)
- [Thread-safe APIs](https://docs.godotengine.org/en/stable/tutorials/performance/thread_safe_apis.html)
- [Optimization using MultiMeshes](https://docs.godotengine.org/en/stable/tutorials/performance/using_multimesh.html)
- [RenderingServer](https://docs.godotengine.org/en/stable/classes/class_renderingserver.html)
- [Import plugins](https://docs.godotengine.org/en/stable/tutorials/plugins/editor/import_plugins.html)
- [Inspector plugins](https://docs.godotengine.org/en/stable/tutorials/plugins/editor/inspector_plugins.html)
- [3D gizmo plugins](https://docs.godotengine.org/en/stable/tutorials/plugins/editor/3d_gizmos.html)
- [Command line tutorial](https://docs.godotengine.org/en/stable/tutorials/editor/command_line_tutorial.html)
- [Debugging tools](https://docs.godotengine.org/en/stable/tutorials/scripting/debug/overview_of_debugging_tools.html)
+15
View File
@@ -27,6 +27,7 @@ Editor UI вызывает services, а не SQL, MPQ parsers или файло
- Paths: waypoint, patrol, spline, taxi и transport preview.
- Volumes: area, subzone, encounter, graveyard, phase и weather.
- Visualization modes: collision, normals, chunk/tile bounds, nav/pathing, spawn density, quest dependencies и streaming budgets.
- Navigation overlay: walkable areas, isolated regions, off-mesh connections, path cost и unreachable selection.
Каждый stroke или placement создаёт одну логическую undoable command. Длительный stroke агрегируется, чтобы history не содержала команду на каждую вершину.
@@ -66,6 +67,20 @@ Import, bake, validation, packaging и DB snapshot выполняются как
- staging output и атомарная публикация результата;
- повторяемая команда для headless CI.
Navmesh bake через `recast-rs` оформляется таким же cancellable job: Editor экспортирует каноническую triangle geometry во staging, запускает pinned CLI/backend, импортирует versioned navigation artifact и показывает diagnostics. Preview-ноды navmesh не сохраняются как источник истины.
## Navigation validation
Первый navigation backend — optional `recast-rs`. Он используется для:
- проверки пути от quest giver к objectives и turn-in;
- поиска NPC/gameobject вне walkable polygon;
- проверки patrol/escort paths;
- проверки связности входов, дверей и encounter rooms;
- визуализации area costs, holes и off-mesh connections.
Профиль bake хранит версию backend и параметры agent radius/height/climb, cell size/height, slope, region и tile size. Изменение профиля инвалидирует navigation cache. Отсутствие backend не должно мешать редактированию, но navigation-dependent validation помечается как `Not run`.
## Database dock
- Показывает тип ядра, revision, schema version и capabilities.
+76
View File
@@ -0,0 +1,76 @@
# M00 Final Paired Evidence — 2026-07-13
## Scope and result
The final local M00 audit used Godot 4.6.1, the existing cache state, the manifest-standard 8-second readiness wait, and `2560x1440` visual candidates. Seven private WoW 3.3.5a build 12340 references produced fourteen cold/warm comparisons with no missing pair. Private images and generated reports remain outside Git.
Every pair exceeded the strict regression tolerance. Comparator exit code `1` means a valid report with measured visual gaps; only codes outside `0/1` are infrastructure failures. This evidence establishes coverage and current differences, not renderer parity.
```powershell
.\tools\run_render_baseline.ps1 `
-Output user://render_baseline_m00_complete_2026-07-13 `
-CacheState existing `
-WaitSeconds 8 `
-MeasureSeconds 0.5 `
-ReferenceCheckpointDirectory .\sources\OpenWCReferenceCheckpoints `
-VisualComparisonReport user://render_baseline_m00_complete_2026-07-13/visual_comparison.json `
-VisualComparisonWidth 2560 `
-VisualComparisonHeight 1440
```
The initial shell timeout detached the canonical capture process after it started. The process completed all fourteen canonical captures and wrote `report.json`; the documented visual-capture and comparator stages were then invoked separately with the same arguments. The final output directory contains both complete reports.
## Paired metrics
| Checkpoint | Pass | Mean perceptual error | Changed-pixel ratio | Classification |
|---|---|---:|---:|---|
| `elwynn_adt_boundary` | cold | 0.087258 | 0.634580 | Composition plus terrain/vegetation/material gaps |
| `elwynn_adt_boundary` | warm | 0.087255 | 0.634598 | Stable against revisit |
| `elwynn_sky_dusk` | cold | 0.094778 | 0.575956 | Approximate paired camera; sky color, lighting and scene-composition gaps |
| `elwynn_sky_dusk` | warm | 0.094757 | 0.575898 | Stable against revisit |
| `elwynn_terrain_overview` | cold | 0.174137 | 0.851791 | Largest composition/framing gap |
| `elwynn_terrain_overview` | warm | 0.176955 | 0.861271 | Stable gap, not a cold-load artifact |
| `elwynn_waterfall_liquid` | cold | 0.088629 | 0.706522 | Framing, terrain, liquid and lighting gaps |
| `elwynn_waterfall_liquid` | warm | 0.087398 | 0.693690 | Stable against revisit |
| `goldshire_dense_m2` | cold | 0.066893 | 0.575257 | Smallest available paired gap; vegetation/material differences remain |
| `goldshire_dense_m2` | warm | 0.066927 | 0.575592 | Stable against revisit |
| `goldshire_inn_large_wmo` | cold | 0.101224 | 0.701835 | WMO is ready; manual framing and presentation gaps remain |
| `goldshire_inn_large_wmo` | warm | 0.101206 | 0.701855 | Stable against revisit |
| `gryphon_roost_native_animation` | cold | 0.119467 | 0.882073 | Same build-12340 asset, different real/synthetic placement and uncontrolled animation phase |
| `gryphon_roost_native_animation` | warm | 0.119471 | 0.882076 | Full-frame metric is diagnostic only; animation observation is human evidence |
Cold and warm values are close for all seven references. The measured gaps are therefore not explained by first-visit cache readiness. Goldshire timing evidence separately demonstrated that the 8-second wait is necessary for WMO publication.
## Animation and sky provenance
The private source corpus preserves exact screenshot bytes; no resize, crop or generated content was used:
| Evidence | SHA-256 | Interpretation |
|---|---|---|
| `elwynn_sky_dusk.jpg` | `1fb06836cacae714c76eaf9b8bf7c292fd5e2f2df33eef821bfe4c4a6bd97072` | Build 12340, Elwynn camera position, server time approximately 19:00, UI hidden |
| `gryphon_roost_native_animation.jpg` | `d3488c741cb8dfe7212198e48332842631a951862a4388b67045338f37357447` | Build 12340 real-world `GryphonRoost01` placement, first visible wing phase |
| diagnostic animation phase B | `1025572c7ab9fa0d2e500ff026be46eb9c1e6e5447116dbdc3675dd5f44574ab` | Same camera three seconds later; visibly raised wing phase |
| diagnostic placement context | `b12c0b713a7d75123ed30f5a316b33537331442cd56615aea69214c7cc4e7a42` | Two real Lakeshire placements and surrounding build-12340 scene |
An ADT scan found no `GryphonRoost01` placement in Goldshire. The M00 checkpoint deliberately injects the model there as a synthetic probe. The original-client observation therefore uses two real Lakeshire placements. The three-second pose change establishes `Observed` native animation behavior, but the full-frame comparison cannot establish spatial or animation-phase parity.
## Fidelity interpretation
M00 now has private build 12340 evidence for every required coverage category: terrain, ADT boundary, dense M2, large WMO, liquid, animated M2 and sky transition. The sky reference is approximately paired by map position/time and manually approved composition. Animated-M2 evidence is asset-paired but placement-unpaired because the OpenWC probe is synthetic.
The reports demonstrate current differences and do not claim `1:1`. Camera calibration experiments also show that unknown manual yaw/pitch/FOV cannot be recovered reliably from full-frame color error alone. Region scoring reduces terrain bias but still requires semantic landmark approval.
## Operational risks
A follow-up shutdown ownership fix removed the GUI renderer leaks found by the final visual capture. Before the fix, the focused animated-M2 checkpoint retained 6 mesh, 6 material, 4 shader, 6 texture, 6 instance and associated RenderingDevice RIDs, for 30 resources in use. After the fix, both the focused 8-second capture and a seven-checkpoint single-pass capture completed without Node, resource or RID leak diagnostics.
Godot can still emit a timing-dependent ObjectDB warning for one or more anonymous `RefCounted` objects whose reported reference count is already zero. The warning has no retained Node, renderer resource or RID ownership in the verified captures. It remains recorded as an engine-teardown diagnostic rather than being hidden, but it is distinct from the resolved GUI renderer leak.
## Integrator decision checklist
- Seven required reference checkpoints: cold/warm report complete, `compared=14`, `missing=0`.
- Animated M2: build-12340 native motion observed in two phases; synthetic/real placement mismatch explicitly classified.
- Sky transition: build-12340 19:00 evidence present with approximate paired camera and human-approved composition.
- Renderer visual differences: registered as gaps, not parity claims.
- GUI renderer RID/resource diagnostics: resolved by explicit shutdown ownership and covered by a headless regression verifier; the residual zero-reference `RefCounted` engine-teardown warning remains tracked separately.
- Target status, target Evidence and `OPENWC_TARGET_DONE` marker: integrator-only actions.
+8
View File
@@ -4,6 +4,8 @@
Исполняемая последовательность текущих целей находится в [`../targets/README.md`](../targets/README.md). Все агенты обязаны следовать корневому [`../AGENTS.md`](../AGENTS.md).
Полная инженерная карта проекта находится в [`../targets/DEVELOPMENT_ROADMAP.md`](../targets/DEVELOPMENT_ROADMAP.md); она раскрывает renderer, protocol, gameplay, UI/Lua/audio, Editor tooling, server emulators и quality/release workstreams.
## Статус документов
Документы описывают целевую архитектуру. Реализованное состояние рендера зафиксировано отдельно в [`../RENDER.md`](../RENDER.md). Если описание целевого решения расходится с кодом, это считается известным архитектурным долгом, а не разрешением обходить границы слоёв.
@@ -22,6 +24,12 @@
| [TESTING.md](TESTING.md) | Стратегия тестирования runtime, протокола, рендера и authoring pipeline |
| [ROADMAP.md](ROADMAP.md) | Последовательность вертикальных срезов и критерии готовности |
| [REFERENCES.md](REFERENCES.md) | Использованные локальные reference-проекты и правила работы с ними |
| [TOOLING_CATALOG.md](TOOLING_CATALOG.md) | Реестр готовых библиотек, редакторов, test oracles и кандидатов на интеграцию |
| [GODOT_BEST_PRACTICES.md](GODOT_BEST_PRACTICES.md) | Нормативные правила scenes, data, jobs, rendering, EditorPlugin, profiling и tests |
| [TEAM_WORKFLOW.md](TEAM_WORKFLOW.md) | Ветки/worktree, task claims, ownership, handoff, integration и conflict protocol |
| [DOCUMENTATION_STANDARD.md](DOCUMENTATION_STANDARD.md) | Обязательные API docs, module specs, data-flow/state/sequence diagrams и documentation gate |
| [modules/README.md](modules/README.md) | Реестр фактических модулей и шаблон их спецификаций |
| [CODING_STANDARD.md](CODING_STANDARD.md) | Явные длинные имена, KISS, простота функций/data flow и правила оправданной сложности |
## Обязательный workflow изменения функции
+45
View File
@@ -41,6 +41,48 @@ Reference-код используется для исследования фор
Используем для сверки conversion pipeline, материалов, моделей и authoring/export edge cases. Runtime web/Blender architecture не переносится в OpenWC.
### Wowser
- [`wowserhq/wowser`](https://github.com/wowserhq/wowser) — MIT proof-of-concept браузерного клиента WoW 3.3.5a.
- [`wowserhq/client`](https://github.com/wowserhq/client) — выделенный web client.
- [`wowserhq/pipeline`](https://github.com/wowserhq/pipeline) — asset delivery pipeline.
Используем как независимый reference для auth → realm → character → world lifecycle, SRP/cryptography, binary packet handling, asset delivery и частичного terrain/model renderer. Особенно полезен для поиска уже разобранных 3.3.5a packet/data edge cases и идей test fixtures.
Не переносим напрямую старый browser stack, WebSocket proxy, React/Three.js abstractions или pipeline server. Заявленное поведение проверяем по TrinityCore/AzerothCore и оригинальному клиенту; proof-of-concept не является спецификацией полноты.
### recast-rs
- [`wowemulation-dev/recast-rs`](https://github.com/wowemulation-dev/recast-rs) — Rust-порт Recast/Detour: navmesh generation, tiled pathfinding, spatial queries, crowd simulation и dynamic obstacles.
Планируем использовать как optional offline navigation backend для Godot Editor: визуализация walkability, проверка достижимости quest/encounter targets, patrol paths и dungeon topology. Начальная интеграция выполняется через CLI/build job, а не через renderer или gameplay runtime.
Важно: принадлежность к WoW emulation ecosystem не доказывает совместимость с форматами TrinityCore/AzerothCore `.mmap/.mmtile`. Генерация server mmaps разрешается только после отдельного compatibility spike с exact parameter, coordinate, tile и binary/behavior comparison. До этого OpenWC navigation cache и server mmaps считаются разными артефактами.
### rilua
- [`wowemulation-dev/rilua`](https://github.com/wowemulation-dev/rilua) — написанная на Rust реализация Lua 5.1.1 с embedding API, bytecode, официальным Lua test corpus, fuzzing и oracle comparison с PUC-Rio.
Рассматриваем одновременно как кандидата на addon Lua runtime и как headless test oracle. TOC loader, FrameXML, WoW API, events, SavedVariables и secure execution остаются слоями OpenWC. Критический gap — отсутствие готовой WoW taint system; C ABI также намеренно не совместим с PUC-Rio. Production-решение принимается только после сравнения `rilua`, PUC-Rio 5.1.1 и оригинального клиента на WoW-specific corpus.
Подробные статусы и evaluation cards ведутся в [`TOOLING_CATALOG.md`](TOOLING_CATALOG.md).
### Godot, GdUnit4 и server tooling
- [Godot best practices](https://docs.godotengine.org/en/stable/tutorials/best_practices/index.html) — основной источник engine-specific правил; принятые решения собраны в [`GODOT_BEST_PRACTICES.md`](GODOT_BEST_PRACTICES.md).
- [`godot-gdunit-labs/gdUnit4`](https://github.com/godot-gdunit-labs/gdUnit4) — кандидат для GDScript/scene/Editor/CI тестов.
- [`azerothcore/Keira3`](https://github.com/azerothcore/Keira3) — reference существующего редактора world DB и SQL generation.
- [AzerothCore database and module documentation](https://www.azerothcore.org/wiki/documentation-index) — primary reference для AzerothCore adapter/deployment workflow.
- [WowBench](https://sourceforge.net/projects/wowbench/) — исторический offline WoW XML/Lua API emulator и источник addon test ideas.
### Warcraft format ecosystem
- [`wowemulation-dev/warcraft-rs`](https://github.com/wowemulation-dev/warcraft-rs) — современный Rust CLI/library set для MPQ/DBC/BLP/ADT/WDT/WDL/M2/WMO и независимый кандидат на format oracle.
- [`wowdev/WoWDBDefs`](https://github.com/wowdev/WoWDBDefs) — versioned definitions client database tables; полезны для schema generation и coverage.
- [`gtker/wow_dbc`](https://github.com/gtker/wow_dbc) — независимый 1.12/2.4.3/3.3.5 DBC reader/writer и converter reference.
Используем для differential testing текущих native parsers и поиска coverage gaps. Новый Rust dependency не принимается только из-за более широкого списка поддерживаемых форматов: сначала требуются build-specific fixtures и измеренное преимущество.
## Правила исследования
1. Для protocol semantics приоритет имеют wire fixtures и соответствующая версия server core.
@@ -49,6 +91,7 @@ Reference-код используется для исследования фор
4. Любое заимствование проверяется по лицензии и документируется.
5. Proprietary data не переносится в fixtures или репозиторий.
6. Вывод, влияющий на публичный контракт, оформляется ADR или обновлением соответствующей спецификации.
7. Перед собственной реализацией сложной подсистемы проверить [`TOOLING_CATALOG.md`](TOOLING_CATALOG.md) и добавить найденные решения, даже если они останутся только reference.
## Замеченные полезные уроки
@@ -57,3 +100,5 @@ Reference-код используется для исследования фор
- Coordinate conversion и ID allocation должны быть централизованы раньше world editing.
- DB export без canonical model быстро связывает UI с одной версией ядра.
- Screenshot smoke полезен, но должен дополняться deterministic state, performance и protocol tests.
- Navmesh-библиотека полезна для authoring validation, но не должна становиться источником authoritative NPC movement на клиенте.
- Готовая Lua VM сокращает объём работы только на уровне языка; WoW API, FrameXML, addon lifecycle, secure actions и taint всё равно требуют отдельной fidelity-программы.
+214
View File
@@ -0,0 +1,214 @@
# Renderer baseline M00
Этот документ описывает воспроизводимый baseline renderer перед архитектурной декомпозицией. Он не является заявлением о визуальной совместимости `1:1` с WoW 3.3.5a.
## Единый запуск
Из корня репозитория:
```powershell
.\tools\run_render_baseline.ps1
```
Скрипт последовательно проверяет headless-загрузку проекта, renderer materials,
M2 unique-id dedupe, regression manifest, coordinate boundaries и dedicated
server-spawn renderer contract, затем снимает checkpoint-ы. Для CI или быстрой
проверки контракта без PNG:
```powershell
.\tools\run_render_baseline.ps1 -DryRun -WaitSeconds 0.1 -MeasureSeconds 0.1
```
Если `godot` отсутствует в `PATH`, скрипт использует локальный executable, указанный в `RENDER.md`. Другой executable задаётся через `-GodotPath`.
Отдельный M01 server-spawn checkpoint использует тот же capture pipeline, но не
расширяет семичастный M00 visual baseline:
```powershell
godot --headless --path . --script res://src/tools/verify_server_spawn_renderer.gd
godot --path . --script res://src/tools/capture_render_checkpoints.gd -- `
--manifest res://src/tools/server_spawn_render_manifest.json `
--output user://server_spawn_renderer
```
Manifest связывает pinned AzerothCore Human Warrior spawn с Godot position,
ADT tile/chunk и renderer-native diagnostic marker. Маркер начинается точно в
spawn origin и проходит обычный depth test, поэтому screenshot показывает его
отношение к terrain; это integration evidence, а не заявление visual parity.
Результат по умолчанию находится в `user://render_baseline`:
- `report.json` — Godot, OS, CPU, GPU/backend, viewport, revision, cache inventory, cache versions, параметры checkpoint-ов и результаты;
- `<checkpoint>__cold_process.png` — первый визит в текущем процессе;
- `<checkpoint>__warm_revisit.png` — повторный визит в том же процессе после обхода контрольных точек.
## Парное визуальное сравнение
Одобренные снимки оригинального клиента хранятся вне Git. Если каталог с ними доступен локально, единый запуск может сразу сравнить PNG с одинаковыми именами:
```powershell
.\tools\run_render_baseline.ps1 `
-ReferenceCheckpointDirectory 'D:\private-fixtures\wow-3.3.5a-checkpoints'
```
Результат записывается в `user://render_baseline/visual_comparison.json`. Другой путь задаётся через `-VisualComparisonReport`. `-DryRun` несовместим с визуальным сравнением, потому что не создаёт PNG. Runner сохраняет обычный performance capture в нормативном `1280×900`, затем отдельно снимает visual candidates в `2560×1440`; разрешение можно переопределить через `-VisualComparisonWidth` и `-VisualComparisonHeight`, не меняя performance baseline.
Отдельный запуск сравнения:
```powershell
godot --headless --path . `
--script res://src/tools/compare_render_checkpoints.gd -- `
--reference 'D:\private-fixtures\wow-3.3.5a-checkpoints' `
--candidate "$env:APPDATA\Godot\app_userdata\OpenWC\render_baseline" `
--output user://render_baseline/visual_comparison.json
```
Reference-каталог принимает JPG/JPEG/PNG оригинального клиента с именем checkpoint, например `goldshire_dense_m2.jpg`. Диагностические кадры с префиксом `diagnostic_` игнорируются. Один reference автоматически сопоставляется с `<checkpoint>__cold_process.png` и `<checkpoint>__warm_revisit.png` OpenWC.
Сравнение переводит sRGB в linear color space, вычисляет взвешенную ошибку яркости/цвета для каждого пикселя, среднюю ошибку кадра и долю пикселей выше локального порога. Нормативные defaults находятся в `comparison_budgets` manifest: mean error `0.015`, changed-pixel ratio `0.01`, pixel error threshold `0.04`. Любое превышение, несовпадение размеров, отсутствие пары или пустой reference-каталог возвращает ненулевой exit code.
Автоматический pass не является доказательством parity: animation phase, weather, camera alignment и intentional gaps требуют human approval. Для проверки алгоритма без proprietary данных используется:
```powershell
godot --headless --path . --script res://src/tools/compare_render_checkpoints.gd -- --self-test
```
```mermaid
flowchart LR
R[Private approved reference PNGs] --> C[Checkpoint comparator]
N[New baseline PNGs] --> C
M[Manifest tolerance defaults] --> C
C --> J[JSON metrics and pass/fail]
J --> H[Human fidelity approval]
```
`cold_process` не означает очищенный Windows filesystem cache. Поле `cache_state` и полный inventory обязаны интерпретироваться вместе с результатом. Удаление или принудительная пересборка cache не входит в baseline-команду. Для отдельного запуска после контролируемой очистки безопасного локального cache следует передать осмысленную метку, например `-CacheState rebuilt-clean`; proprietary source assets команда не изменяет.
## Контрольные точки и детерминизм
Нормативный manifest: `res://src/tools/render_baseline_manifest.json`. Он не содержит proprietary assets и фиксирует семь обязательных классов:
- Elwynn terrain overview;
- граница ADT около world center;
- dense M2 в Goldshire;
- Goldshire Inn как large WMO;
- Elwynn waterfall как liquid;
- синтетический native-animation probe `GryphonRoost01.m2`;
- тот же Elwynn overview в 19:00 для sky transition.
Зафиксированы camera/target/player position, viewport, FOV, quality preset и время мира. Для temporal shader/animation кадров SHA-256 служит идентификатором артефакта, но не самостоятельным pass-критерием: автоматическая визуальная проверка использует perceptual diff и согласованный tolerance. Синтетический animation probe существует только внутри capture tool и не меняет runtime streaming scene.
## Метрики и budget
Каждая точка записывает load/wait time, frame time p50/p95/p99, максимальный frame hitch, static/video memory, draw calls, rendered objects и снимок streaming queues. При сравнении следующего renderer с этим baseline p95, p99, max hitch, load time и memory не должны ухудшаться более чем на 10% без отдельного принятого объяснения и обновления baseline.
Измерение считается неполным, если snapshot показывает незавершённые очереди: это состояние остаётся в `report.json` и не должно скрываться. Значения сравниваются только на одинаковых Godot, backend, hardware/profile, cache state, viewport и manifest revision.
## Cache contract
Manifest фиксирует проверяемые версии и причины invalidation:
| Cache | Version | Invalidate when |
|---|---:|---|
| baked terrain | 5 | изменились baked geometry или placement payload |
| streaming terrain | 2 | изменились streaming geometry или M2 `unique_id` payload |
| terrain splat | 1 | изменился splat resource payload |
| terrain control splat | 3 | изменились control atlas, layer map или texture array |
| WMO streaming | 2 | изменилась WMO render geometry |
| WMO builder | 2 | изменились scene transform или builder payload |
| M2 material | 2 | изменились material или custom vertex payload |
`verify_render_baseline_manifest.gd` сравнивает таблицу с runtime constants. Shader-only refresh versions, не изменяющие serialized payload, обновляются по правилам `RENDER.md`; изменение payload требует version bump и rebake.
## Fidelity gaps относительно 3.3.5a
Baseline пока не имеет approved парных кадров оригинального клиента build 12340. До их появления нельзя утверждать parity. Известны следующие классы расхождений:
- неполные M2 animation/skinning, particles и ribbons;
- приближённые M2/WMO material combiners и pass ordering;
- отсутствие настоящего WMO portal/room culling;
- упрощённые liquid depth/shore rules и texture selection;
- неполная проверка skybox/lighting transition по зонам;
- возможная смена D3D12 на Vulkan при ошибке descriptor heap — фактический backend всегда берётся из `report.json`.
Парное сравнение с клиентом 3.3.5a должно использовать те же map position, local time и weather. Каждый gap регистрируется как terrain/material, placement, animation, lighting, liquid или culling; baseline сам по себе gap не закрывает.
Локальная сессия build 12340 от 2026-07-11 откалибровала три непригодные исходные позиции: dense-M2 camera была полностью закрыта кронами, large-WMO camera находилась у дымохода кузни, liquid camera попадала под terrain оригинального клиента. Manifest теперь содержит проверенные replacement camera positions. Пять approved локальных reference JPG хранятся вне Git; synthetic animated probe и dusk checkpoint всё ещё требуют отдельной процедуры.
Первый paired run после калибровки создал десять сравнений (пять reference × cold/warm), без missing pairs. Все пары ожидаемо превысили строгий tolerance: mean perceptual error `0.0707..0.1746`, changed-pixel ratio `0.5504..0.8187`. Human inspection показал, что это пока не чистая material/lighting ошибка: при тех же WoW-derived координатах OpenWC terrain-overview camera находится под terrain/placements, WMO camera — внутри таверны, liquid camera — внутри скал; ADT и dense-M2 композиции также существенно смещены. До исправления coordinate/placement mismatch эти значения являются gap evidence, а не основанием расширять tolerance.
Capture tool строит camera basis явно из target и world-up. Это исключает неоднозначный roll `look_at` при автоматической съёмке. `ViewportTexture.get_image()` сохраняется без дополнительного vertical flip для Godot 4.6.1.
## Coordinate calibration
Пять принятых build 12340 viewpoints записаны в manifest как `reference_wow_camera`. Они содержат только числовые world coordinates и не включают proprietary данные. Headless probe:
```powershell
godot --headless --path . --script res://src/tools/verify_render_coordinate_calibration.gd
```
```mermaid
flowchart LR
O[Observed build 12340 WoW XYZ] --> W[WoW to Godot formula]
W --> G[Manifest Godot camera XYZ]
G --> R[Godot to WoW round-trip]
R --> E[Maximum numeric error]
```
На пяти точках maximum mapping/round-trip error равен `0.000015`. Это исключает текущую формулу `gx = center - wy`, `gy = wz`, `gz = center - wx` как источник крупного paired mismatch. Результат не доказывает renderer parity: следующая диагностика должна отдельно проверить terrain height, placement transforms и фактическое camera direction/FOV. Production `CoordinateMapper` остаётся задачей M01; M00 probe не создаёт второй публичный coordinate contract.
## Terrain height diagnostic
Rendered terrain проверяется без нового runtime API: offline probe использует уже загруженный tile mesh, строит `TriangleMesh` и выполняет вертикальный ray в tile-local space.
```powershell
godot --headless --path . --script res://src/tools/probe_render_terrain_height.gd -- --wait 2
```
```mermaid
flowchart LR
C[Calibrated camera XZ] --> S[Streaming tile state]
S --> M[Active terrain mesh]
M --> T[Tile-local TriangleMesh ray]
T --> H[Terrain height and camera clearance]
```
Измеренный clearance: terrain overview `89.044`, ADT boundary `44.788`, dense M2 `90.178`, large WMO `12.034`, waterfall примерно `76.128` Godot units. Следовательно, все пять камер находятся над rendered terrain; visual obstruction принадлежит placements/WMO/composition, а не terrain height.
Waterfall XZ сначала давал `no_intersection`, хотя tile `30_49` был available, полностью загружен, имел `control_splat_cache` quality mesh и LOD0 mesh, а probe находился внутри mesh AABB. Ray со смещением `2.0` units пересёк тот же mesh на высоте `113.872`; точная XZ попала на triangle seam/edge numerical miss. Probe теперь сообщает `sampled_nearby`, distance и source tile вместо ложного streaming ownership gap. `--require-all` остаётся строгим режимом для действительно неснятых точек.
## Camera occluder diagnostic
Scene-tree placement composition проверяется transformed AABB без изменения renderer:
```powershell
godot --headless --path . --script res://src/tools/probe_render_camera_occluders.gd -- --wait 3
```
```mermaid
flowchart LR
C[Calibrated camera] --> A[Published Mesh/MultiMesh AABBs]
T[Manifest target] --> S[Camera-to-target segment]
A --> P[Camera containment test]
A --> I[Segment intersection test]
S --> I
P --> J[JSON occluder report]
I --> J
```
Ни одна из пяти камер не находится внутри опубликованной scene-tree geometry. Terrain-overview segment пересекает четыре Stormwind WMO groups, large-WMO segment — три Goldshire Inn groups, waterfall segment — liquid surface; ADT boundary и dense-M2 segments не пересекают placement AABB. Поэтому прежнее визуальное впечатление «камера внутри WMO/placements» не подтверждается. Основной paired gap сейчас — неточно воспроизведённые manual look direction/target/FOV reference-кадров: например, автоматический Goldshire target направляет луч через фасад внутрь WMO, тогда как reference был вручную скадрирован на весь фасад. Probe охватывает только scene-tree MeshInstance/MultiMesh; RID-only instances не имеют доступного semantic path и явно исключены из coverage.
## Empirical FOV sweep
В build 12340 `GetCVar("cameraFoV")` возвращает `nil`, а `/console cameraFoV` и `ConsoleExec("cameraFoV")` не выдают значения. Поэтому capture tool поддерживает additive `--camera-fov`, а comparator — `--only`, позволяющий ограничить sweep одним reference checkpoint.
```mermaid
flowchart LR
F[Candidate vertical FOV] --> C[Dedicated checkpoint camera]
C --> P[Filtered checkpoint PNGs]
R[One original-client reference] --> D[Perceptual comparator --only]
P --> D
D --> M[Ranked metrics]
```
Первый sweep обнаружил capture defect: разные FOV иногда создавали одинаковые hashes, потому что scene camera могла перехватить viewport после входа в tree. Capture теперь вызывает `camera.make_current()` после добавления world и перед каждым checkpoint. После исправления ADT-boundary ranking стал: `26° → 0.079588`, `38° → 0.079633`, `50° → 0.084353`, `62° → 0.088360`, `86° → 0.097993` mean error. Plateau `2638°` и несовпавший changed-pixel optimum показывают доминирование manual look direction/framing; эти данные не обосновывают изменение нормативного manifest FOV `62°`. Для настоящей калибровки reference capture должен сохранять воспроизводимые yaw/pitch/zoom или независимый projection fixture.
+2
View File
@@ -2,6 +2,8 @@
> Этот документ объясняет стратегию на высоком уровне. Исполняемый порядок, текущий статус, checklist и доказательства завершения ведутся только в [`../targets/README.md`](../targets/README.md). При расхождении `targets/` имеет приоритет.
Полный roadmap с точки зрения разработки, contracts, subsystem dependencies и gates находится в [`../targets/DEVELOPMENT_ROADMAP.md`](../targets/DEVELOPMENT_ROADMAP.md).
## Стратегия
Работа идёт вертикальными срезами. Каждый срез включает data, domain, adapter, presentation, editor support, diagnostics и tests. Горизонтальная реализация всех opcodes или всех editor-панелей без пользовательского результата не считается milestone.
+344
View File
@@ -0,0 +1,344 @@
# Командная разработка OpenWC
## Цель
Этот workflow позволяет нескольким людям и Codex-агентам работать параллельно, не перезаписывая изменения друг друга и не разрушая архитектурные границы. Единица параллельной работы — не milestone целиком, а ограниченный `work package`.
## Основные правила
1. Каждый агент работает в отдельном clone или Git worktree и собственной ветке.
2. Никто не разрабатывает напрямую в `master`.
3. До изменений задача получает ID, владельца, claim и список затрагиваемых путей.
4. Один work package имеет только одного активного владельца.
5. Общие contracts согласуются до параллельной реализации producers/consumers.
6. Статус milestone и `OPENWC_TARGET_DONE` изменяет только интегратор.
7. Merge выполняется только после handoff, локальных проверок и синхронизации с актуальным `master`.
## Идентификаторы
### Agent ID
Каждый человек/агент выбирает стабильный ID на весь work package:
```text
<human>-<machine>-codex
```
Примеры:
```text
sindo-main-codex
alex-laptop-codex
```
ID записывается в claim, ветке, PR/MR и handoff. Нельзя использовать просто `codex`, потому что таких агентов несколько.
### Work Package ID
```text
<TARGET>-<PROGRAM>-<SHORT-NAME>-<NNN>
```
Примеры:
```text
M01-FND-COORDS-001
M03-RND-SCHEDULER-001
M08-NET-SRP-001
M12-UIA-LUA-SPIKE-001
```
Program codes определены в [`../targets/DEVELOPMENT_ROADMAP.md`](../targets/DEVELOPMENT_ROADMAP.md).
## Claim protocol
Предпочтительный канал координации — issue + ранний draft PR/MR на общем Git forge. Если forge недоступен, используется отдельный файл в `coordination/claims/`, который сначала публикуется в общей ветке.
Claim marker:
```text
<!-- OPENWC_CLAIM:M01-FND-COORDS-001:sindo-main-codex:2026-07-13 -->
```
Последнее поле — дата истечения claim в UTC. Рекомендуемый срок — 48 часов; владелец продлевает его коротким status update. Истёкший claim нельзя забирать молча: сначала оставить сообщение владельцу и интегратору.
Claim содержит:
- target и work package;
- owner/agent ID;
- outcome и non-goals;
- exclusive paths;
- shared/hotspot paths;
- contracts/schema/format changes;
- dependencies и blockers;
- verification commands;
- expected fidelity evidence.
- documentation deliverables: inline API, module spec, diagrams и source map.
## Ветки и worktrees
Имя ветки:
```text
work/<agent-id>/<target>-<short-name>
```
Пример:
```text
work/sindo-main-codex/m01-coordinate-mapper
```
Начало работы:
```powershell
git fetch origin
git worktree add ..\open-wc-m01 -b work/sindo-main-codex/m01-coordinate-mapper origin/master
```
Правила:
- один worktree принадлежит одному агенту;
- не запускать двух агентов в одном dirty worktree;
- не менять и не удалять чужой worktree;
- generated caches и proprietary data не переносятся commit/cherry-pick;
- перед handoff ветка синхронизируется с актуальным `origin/master`.
## Разделение задач
Хороший work package:
- даёт один наблюдаемый результат;
- принадлежит преимущественно одной подсистеме;
- имеет явные входы/выходы;
- меняет не более одного публичного contract одновременно;
- имеет собственные tests/diagnostics;
- может быть review и merged независимо либо после одной явно указанной dependency.
Плохое разделение:
- «сделать сеть»;
- один агент меняет protocol и UI напрямую;
- два агента одновременно рефакторят один monolithic file;
- задача зависит от незаписанного устного соглашения;
- work package оставляет временный второй источник истины.
## Parallelization patterns
### Contract first
Для cross-layer feature сначала отдельным маленьким work package фиксируются:
- domain types;
- commands/events/read models;
- version/capabilities;
- failure states;
- contract tests.
После merge независимо работают producer и consumers.
Пример:
```text
WP-A: MovementSnapshot contract
├─ WP-B: network movement decoder
├─ WP-C: gameplay reconciliation
└─ WP-D: character/camera presentation
```
### Fixtures in parallel
Пока один агент реализует pure logic, второй может готовить:
- synthetic fixtures;
- original-client comparison procedure;
- server-core matrix;
- visual checkpoints;
- documentation/reference analysis.
Fixture agent не изменяет production contract без согласования.
### Adapter split
После merge canonical interface допустимо параллельно реализовать TrinityCore и AzerothCore adapters, если у каждого разные файлы и общая contract suite.
### Hotspot extraction first
Если работа требует одного большого файла, сначала один владелец извлекает стабильный seam. Параллельная работа начинается только после merge seam, а не внутри разных участков монолита.
## Hotspot-файлы
Следующие пути требуют явного указания в claim и согласования с интегратором:
- `project.godot`;
- `AGENTS.md`, `docs/README.md`, `targets/README.md`;
- текущий `targets/[0-9][0-9]-*.md`;
- `RENDER.md`;
- `src/scenes/streaming/streaming_world_loader.gd` до декомпозиции;
- native registration/CMake/GDExtension manifests;
- editor `plugin.cfg` и root plugin lifecycle;
- shared schema/version/format constants;
- dependency lockfiles и submodules.
Два активных work packages не должны редактировать один hotspot. При необходимости интегратор выделяет serial integration window.
## Изменение contracts и форматов
Contract/schema change обязан иметь:
- owner и потребителей;
- backward compatibility или migration;
- old/new fixtures;
- version bump policy;
- rollout order;
- ADR для существенного решения.
Merge order:
1. contract + compatibility layer;
2. producers;
3. consumers;
4. removal deprecated path отдельным work package.
Нельзя одновременно удалить старый API и ожидать, что незамердженная ветка другого агента уже использует новый.
## Commits
Формат заголовка:
```text
<program>(<target>): <imperative summary>
```
Примеры:
```text
fnd(M01): add canonical coordinate mapper
net(M08): decode auth challenge safely
rnd(M03): extract streaming target planner
test(M00): add paired checkpoint manifest
```
Описание commit/PR содержит:
```text
Work-Package: M01-FND-COORDS-001
Agent: sindo-main-codex
Tests: <commands/results>
Fidelity: <evidence/gap>
```
Не смешивать formatting unrelated files, generated artifacts и функциональное изменение в одном commit.
## Handoff protocol
Готовый work package получает marker:
```text
<!-- OPENWC_HANDOFF:READY:M01-FND-COORDS-001:<commit> -->
```
Handoff обязан содержать:
- точный commit/branch;
- outcome и изменённые paths;
- публичные contracts/schema changes;
- verification commands и результаты;
- fidelity evidence/known gaps;
- migration/cache/rebuild requirements;
- unresolved risks;
- recommended merge order;
- updated API/module documentation и перечень diagrams.
Если работа частичная:
```text
<!-- OPENWC_HANDOFF:PARTIAL:M01-FND-COORDS-001:<commit> -->
```
`PARTIAL` не считается завершением и не разрешает ставить target `DONE`.
## Integration protocol
Интегратор:
1. Проверяет claim и отсутствие overlapping ownership.
2. Проверяет diff на unrelated/user changes.
3. Синхронизирует branch с `master` без уничтожения чужой истории.
4. Запускает package verification и затронутые общие gates.
5. Проверяет docs, migrations, cache versions и fidelity statement.
6. Проверяет documentation gate из `docs/DOCUMENTATION_STANDARD.md`: API docs, inputs/outputs, diagrams, ownership и recovery.
7. Проверяет coding gate из `docs/CODING_STANDARD.md`: ясные имена, KISS, отсутствие premature abstractions и скрытого data flow.
8. Merge/squash выполняет в соответствии с историей work package.
9. После merge запускает post-merge smoke.
10. Закрывает claim marker-ом:
```text
<!-- OPENWC_INTEGRATION:ACCEPTED:M01-FND-COORDS-001:<merge-commit> -->
```
Только после интеграции всех обязательных work packages интегратор обновляет target Evidence/status.
## Конфликты
При обнаружении overlapping edits агент должен остановить изменение затронутого файла и связаться с владельцем. Запрещено:
- разрешать конфликт через слепое `ours/theirs`;
- копировать чужой файл поверх своего;
- делать `reset --hard` или checkout чужих изменений;
- «временно» дублировать contract без migration plan.
Порядок разрешения:
1. определить semantic owner;
2. выбрать merge order;
3. первый владелец публикует минимальный contract/seam;
4. второй rebase и адаптирует свою ветку;
5. integration tests подтверждают совместимость.
## Status updates и stale work
Владелец обновляет claim после значимого результата или не реже срока lease. Status краткий:
```text
State: active | waiting | ready | partial
Done: ...
Next: ...
Blocked by: ...
Touched paths: ...
```
Если работа прекращена, claim явно освобождается. Незавершённую ветку не удаляют до handoff с описанием пригодных commits и известных проблем.
## Минимальная схема для двух разработчиков
- Один человек назначается интегратором текущего milestone.
- Второй берёт work package без пересечения файлов либо готовит fixtures/reference/adapter.
- Роль интегратора можно менять после каждого milestone.
- Перед началом дня оба выполняют `git fetch` и сверяют claims/draft PRs.
- Перед merge второй агент не начинает работу поверх непроверенного commit, если dependency не опубликована как contract branch.
Пример для M01:
```text
Developer A / integrator:
M01-FND-COORDS-001 — coordinate types and mapper
Developer B:
M01-QAR-COORD-FIXTURES-001 — known ADT/server points and tests
После merge contract:
A — StreamingFocus migration
B — placement/SQL conversion audit
```
## Автоматическая проверка
Перед handoff и merge запускать:
```powershell
.\tools\verify_coordination.ps1
.\tools\verify_documentation.ps1
```
Первая проверка требует ровно один `ACTIVE` numbered target, соответствие `Current target`, валидные и уникальные fallback claim markers. Вторая проверяет обязательные documentation files, структуру module specs, наличие data-flow diagram и относительные ссылки. Истёкший claim выдаёт warning и требует человеческого решения, но не удаляется автоматически.
+22
View File
@@ -23,6 +23,9 @@
- adapter round-trip `canonical → SQL → snapshot → canonical`;
- Content Project compatibility и migration fixtures;
- renderer/editor public API contracts.
- `recast-rs` navigation fixtures: geometry/profile → region/poly/detail counts и path queries.
- Lua VM contract: общий WoW-specific corpus выполняется на `rilua`, PUC-Rio 5.1.1 и, где возможно, оригинальном клиенте 3.3.5a.
- Wowser используется как дополнительный независимый источник auth/world packet cases; fixtures принимаются только после проверки build 12340 semantics и удаления credentials/proprietary payload data.
### Integration
@@ -49,6 +52,25 @@
- frame time, hitch percentiles, draw calls, memory, descriptor count и streaming queues;
- long traversal через ADT boundaries;
- dense WMO/M2, water, character equipment и UI scale matrices.
- navmesh overlay checkpoints и bake/query budgets для больших tiles/dungeons.
### Navigation compatibility
- Golden synthetic meshes проверяют slope, climb, radius erosion, holes, tiled seams и off-mesh connections.
- WoW fixtures проверяют canonical coordinates и ADT/WMO collision composition.
- `recast-rs` version и bake profile закрепляются в manifest; обновление требует baseline diff.
- OpenWC navigation cache сравнивается с C++ Recast reference на выбранных fixtures.
- Заявление о server mmap support требует отдельного сравнения с TrinityCore/AzerothCore generator: параметры, tile bounds, polygon queries и фактическое движение существ на disposable core.
- Editor reachability diagnostics должны различать `Reachable`, `Unreachable`, `Unknown` и `Not run`.
### Lua и addon compatibility
- Official Lua 5.1.1 suite запускается на pinned VM revision.
- Oracle tests сравнивают results, errors, byte strings, number formatting, coroutines, metatables, GC-visible behavior и bytecode expectations.
- WoW corpus проверяет restricted stdlib, global aliases, `bit`, BOM, GC defaults и запрещённые filesystem/native-module операции.
- TOC/load order, FrameXML inheritance, events, SavedVariables и addon errors проверяются отдельно от VM.
- Secure actions, combat lockdown и taint propagation имеют обязательные negative tests; без них addon compatibility не получает статус `Verified`.
- Performance suite измеряет `OnUpdate`, event fan-out, table churn, allocation и incremental GC frame budget.
### Exploratory и game design

Some files were not shown because too many files have changed in this diff Show More