coord(M03): claim M2 animated scene finalizer

This commit is contained in:
2026-07-18 01:07:09 +04:00
parent c20bc62ac0
commit 03ba129a52
@@ -0,0 +1,91 @@
# 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: claimed
- Done: candidate/material/player ownership boundary audited on current master
- Next: implement finalizer, migrate adapters, verify and document
- Blocked by:
## Handoff
- Commit:
- Results:
- Remaining risks:
- Documentation updated: