# 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.
