Skip to content

feat(animation): add weighted playback and authored locomotion evaluation - #395

Merged
jonit-dev merged 32 commits into
developfrom
fix/vq04-interrupted-locomotion
Oct 5, 2026
Merged

jonit-dev merged 32 commits into
developfrom
fix/vq04-interrupted-locomotion

Conversation

@jonit-dev

@jonit-dev jonit-dev commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Current result

AnimationPlayer.playWeighted blends authored clip weights on the existing mixer, preserves contributing actions through reversals, joins entering clips by normalized phase and releases outgoing actions. Editable game source evaluates deterministic 1D/2D weights and drives a first-person visible body, a third-person Quaternius rig and a CC0 KayKit Rig_Medium consumer with real left/right/backward gaits. No replacement mixer or core numerical evaluator was added.

Canonical completed PRD-VQ-04: 6/6 phase items, 2/2 acceptance items. Merged through the ordinary squash queue on 2026-10-05 at 08:17:27 UTC as 9b3c482.

Current proof and limits

  • Actual merge-candidate proof: Queue run 37277964744 tested 9b3c4824c523de9f49fba6e24299ad56ae6e21a9, whose tree equals the qualified PR head. Browser/native artifacts 11330929421 and 11331537103, with native success receipt 11331666720 / job 111660946518, each pass 46/46 assertions, 586 frames, zero diagnostics; the same 14 retained wait checkpoints / three consumers have exact clip, weight and phase parity, with the two input offsets excluded. All 66 substantive queue jobs passed, including ci-required job 111673844710 at 08:16:54 UTC. The final run-summary was cancelled at 08:17:40 UTC, after the 08:17:27 merge; the aggregate run is therefore recorded cancelled, not aggregate success. No failed or pending substantive check remains.
  • Fresh exact-head proof: CI run 37272881680, attempt 1, tests candidate 53638dd91cb6b952ebbeef06a00e8e3eacb9fb4d from published head 4b52788d1520a24f055ec4643275fbb1f50c82fe and base d5d169705f34b6b41d1888f3885cb8968e81cb60. Browser animation and freshly built ARM Linux-native locomotion each pass 46/46 assertions, 586 frames, zero diagnostics. Artifacts 11329847950 and 11330160809, with success receipt 11330430129 for native job 111649219544, match clips, every weight and normalized phase at all 14 retained fixed-tick wait checkpoints across all three consumers, with cross-runtime difference 0. The same two differing input ticks below are excluded. Fresh CI typecheck and the full required board pass; ci-required succeeded at 07:27:17 UTC in this run. The native host SHA-256 remains 8296f86ed64fb2704a056cc021ff8af352013308b816efde6798b04774c8dceb; software-rendered correctness limits still apply.
  • Earlier qualification: CI run 37270100498, attempt 1, tested candidate e81fb686086c834893f2e4e16ff1083f2110b5ee with core 0.3.4. Its browser animation and freshly built ARM Linux-native locomotion jobs each passed 46/46 assertions, 586 frames, zero diagnostics. Browser: headed WebGPU, Google SwiftShader. Native: Vulkan llvmpipe; host SHA-256 8296f86ed64fb2704a056cc021ff8af352013308b816efde6798b04774c8dceb. These jobs passed even though the aggregate run was later cancelled after source advancement.
  • Independent comparison of artifacts 11328392524 and 11327683944, tied to exact-candidate success receipt 11328503119, matches selected clips, every weight and normalized phase at 14 fixed-tick wait checkpoints across all three rigs, with maximum cross-runtime difference 0. Input snapshots at browser/native ticks 2/1 and 176/175 sample different fixture ticks and are excluded. No full per-tick comparison is claimed.
  • The four focused animation/evaluator/real-rig CPU suites pass 94/94 on the code-equivalent candidate. All 12 browser screenshot digests match the retained summary, and all 12 are distinct. The three unmodified KayKit GLB digests match the committed source/license provenance.
  • Phase synchronization means entry-time joins and continued contributor playback, as documented by the API. These fixtures disable strideSync; no moving-ground foot-contact, sustained phase locking, allocation measurement or hardware performance is claimed. Human aesthetic review remains outstanding and is not an original PRD checkbox. The earlier failed asset-manifest capture and stale-host receipts remain historical below.
  • Fresh CI on the current published head passed, including Windows desktop, Android emulator parity and all required collectors. Independent review found documentation drift in the former core-version receipt and stale PR body, with no executable delta from the qualified candidate. Local root typecheck passed; recursive typecheck in this new lane stopped on missing optional UI build declarations, a dependency-closure prerequisite, so no new full recursive pass is claimed.

Canonical checklist

Phase 1 — Continuous weights with explicit boundaries

  • Implement and test deterministic 1D and 2D weight evaluation, including degenerate and out-of-domain inputs.
  • Integrate weighted action ownership and phase synchronization without breaking existing play/once/stride behavior.

Phase 2 — Two real locomotion consumers

  • Drive a first-person-visible body and a third-person rig through the same weight/phase mechanism with game-owned settings.
  • Expose selected clips, weights and phase in existing gameplay observations and verify rapid reversals against sampled poses.

Phase 3 — Qualify the visible result

  • The real-rig speed/strafe sweep passes weight, phase and pose-continuity assertions on browser WebGPU.
  • The identical input trace passes on Linux native; inspect the transition sequence rather than a single still frame.

Acceptance

  • Continuous speed/direction changes require no game-specific replacement mixer, and a same-rig trace produces matching clip weights across the two qualified runtimes.
  • The feature preserves its documented inactive/fallback path and releases owned resources after repeated lifecycle transitions.

Historical implementation receipts

The receipts below retain their original source, scope and failures. Statements about partial progress or draft state describe those historical milestones. The current counts and state are above.

Scope

Bounded PRD-VQ-04 prerequisite: repair interrupted crossfades and add AnimationPlayer.playWeighted on the existing authoritative mixer. Games supply clip weights, authored transition duration and phase-sync opt-out; clip selection, numerical evaluation and locomotion states remain game-owned. No replacement mixer, graph or dependency is added.

  • Returning to a contributing loop keeps its current weight and playback phase, then ramps from that weight to 1.
  • Rapid no-frame requests no longer revive zero-weight actions at full weight.
  • Fresh clips, completed fades, immediate cuts, explicit one-shots and mode changes preserve restart semantics.
  • The opt-in fixture now loads the repository's actual Quaternius CC0 mannequin through SkeletalMesh3D. Nine Idle/Walk/Jog requests exercise all 65 bones. It starts on scenario input and freezes at exact ticks, so startup timing cannot change the captured pose.

Historical canonical PRD-VQ-04 at f742def was partial at that receipt.

Historical verified interruption screenshots

Hosted run 36996637583 passed at source a53db062fec7b1b3ae99268470dfa06d15ee3494. Headed Chromium, WebGPU, Google SwiftShader. All five reports pass with zero diagnostics, including a separate bright-silhouette region bound. Errors and device-loss warnings are rejected. This proves rendered correctness, not hardware performance, full blend spaces, native execution or foot-contact quality.

All five images were visually inspected independently and copied unchanged from the Actions artifact. Every immutable raw URL was fetched successfully (HTTP 200) and its SHA-256 matched the original PNG. These historical images qualify the earlier interruption repair at the captured source; they do not qualify the new weighted API.

Tick 24: walking/jogging blend before the return request

Actual mannequin, tick 24

Tick 25: return to the still-contributing idle action

Actual mannequin, tick 25

Tick 26: first subsequent frame

Actual mannequin, tick 26

Tick 48: later rapid reversal

Actual mannequin, tick 48

Tick 108: settled idle

Actual mannequin, tick 108

Weights, phases and adapter · Source/run/artifact/per-image digests and assertion verdicts.

Across the trace: weight-sum error ≤ 2.220446049250313e-16; request-time phase and local-position jump 0; normalized-quaternion jump ≤ 4.2146848510894035e-8 radians. Seven requests returned to live actions. Final weights [1, 0, 0], one active action. Artifact ZIP SHA-256: ba1e0cff8e340330f98096695bd9e84840a3e0c15f5659a00e70a08475c91e08.

Checks and remaining limits

  • 53 animation/fixture tests passed locally and in the hosted job. Restoring the pre-fix player makes the actual mannequin regression fail (weight error 1).
  • A fixture-construction regression also caught and fixed its missing initial state before the successful run.
  • Root/example TypeScript, core build/publint, focused lint, capability/API checks passed during implementation. Final documentation links (2,405) and evidence budget pass.
  • An earlier real screenshot was correctly rejected for an asset-manifest 404. The build now publishes the actual emitted model manifest; no 404 was suppressed. Historical diagnostic proof remains labeled failed.
  • Local pnpm test is blocked at the tsx Unix-socket lifecycle preflight; no complete aggregate-suite pass is claimed. Local GPU rendering is unavailable, so actual pixels came from the hosted runner.
  • Current real-rig Linux-native execution, continuous 1D/2D weighting and the two-game-consumer criteria remain open. Draft remains on; auto-merge remains off. These screenshots close the bounded reversal-proof milestone only.

Weighted API repair at ee535d1c6 — 2026-10-04

Preserved the unpublished owner snapshot before integration; original checkout is unchanged. Weighted playback retains contributors until zero, joins compatible phases, uses normalized overflow-safe weights and bounded full-delta ramps, preserves the deadline under identical per-frame requests, and hands ownership back to single/once playback. Eighteen regressions exercise these paths, including idle-dominant stride timing and static-clip phase transfer.

  • 71 animation/weighted/real-rig CPU tests pass; expanded core export/boundary and resolution checks total 80 CPU tests. Independent review reran 73 focused tests and accepted the bounded delta and honest PRD receipt.
  • Normal pnpm typecheck passes root and recursive packages/examples. Core build/declarations/MCP/publint, budgets, capability/API gates and root lint pass. Quality scanning completed with 186 reported findings; it is not a clean quality report.
  • Published 10823978 independently reproduces inherited root failures with exact locked dependencies and its own fresh core build. The narrow public core/playtest source mapping (as on develop) and fixture-local Vite types repair these; regression tests preserve private package boundaries.
  • Import-free native JavaScript bundle contract and four tests pass; no native executable or GPU was run. No new browser/native proof is claimed.
  • All normal pre-push gates pass, including 323 drift tests. Initial publication was correctly stopped by two shared /tmp ENOSPC failures (321 pass / 2 fail); moving only this task's scratch to the workspace disk passed unchanged tests/hooks. No skip, threshold or source weakening.
  • At the weighted publication above, develop integration conflicts were held; they are now resolved by the reviewed base merge below. Draft remains on, all original criteria remain open.

Game-owned evaluator slice at f95b4ffab — 2026-10-04

Adds editable sorted/clamped 1D evaluation and declared triangular 2D barycentric weights with nearest-domain-edge projection. Authored snapshots and declaration-order ties make replay deterministic; duplicate, malformed, overlapping, degenerate and numerically unrepresentable domains fail explicitly. No numerical core export or second mixer is added.

  • Canonical evaluator/real-mannequin CPU suite 11/11 passes; expanded relevant regression suite 91/91 passes. Normal root/recursive typecheck, lint, docs, budgets and all pre-push gates pass, including 323 drift tests. Fresh independent review accepts the code, corrected malformed-tuple regression and honest completion record.
  • Actual seven-clip CC0 mannequin integration preserves request-time poses/live phases, normalized contributing weights and disposal. 2D sample names remain synthetic numerical metadata: no left/right/backward clips, two genuine consumers or new browser/native execution are claimed.
  • Only the numerical criterion is complete: 1/6 phase items, 0/2 acceptance items; no full phase complete. The repository calculator ignores acceptance until readiness and maps the phase ratio 1/6 (16.7%) to the coarse prd:25% bucket. Total actual criteria are 1/8 (12.5%). Existing PR label prd:0% is retained pending the coordinator's percentage-policy correction; no exact 25% completion claim is made.
  • Real first-person-visible body/third-person consumers, compatible licensed directional gaits, visible lifecycle/performance and identical browser/native traces remain open. Develop integration conflicts remain held.

Develop conflict repair at a7f578097 — 2026-10-04

Merged exact develop 15adf350da53addfa33675c2b3f0e2722e086e37 into published f95b4ffab0b842dc9a851ab10c719345ec67a6d6 with one normal fast-forward push. All develop integration jobs remain; the animation capture lane uses the current exact-base/head routing selector and includes weighted/evaluator CPU suites. The relocated PRD preserves its original checklist, partial status and historical evidence, with an immutable link to removed batch execution instructions.

Routing regressions: develop-only 2 failed/58 passed; resolved focused routing/workflow/animation/mannequin checks 347/347 pass. Root and recursive typecheck, lint, docs and budgets pass; normal precommit synchronization and prepush gates pass, including 320 drift tests. Fresh independent review accepts the resolution. GitHub reports MERGEABLE / CLEAN at this exact head and base. Draft remains on; hosted jobs skip draft runs, so this is no new rendered/native acceptance claim. No consumer implementation was added; remaining PRD criteria stay open.

VQ-04 bounded prerequisite. Keep broad blend-space and platform acceptance open; no runtime screenshot or full-suite pass is claimed.
@jonit-dev jonit-dev added the prd:0% PRD implementation has no verified phase yet label Oct 2, 2026 — with ChatGPT Codex Connector
jonit-dev and others added 4 commits October 2, 2026 18:54
Conflict: docs/PRDs/batch-2026-10-01-visual-quality/PRD-VQ-04-locomotion-blend-spaces.md
(add/add, docs only). Kept this branch's work notes (Status PARTIAL, the bounded
interruption-repair and verified real-rig capture sections) and adopted develop's
relative README.md / EXECUTE.md links, which now resolve because develop ships
both files. No feature source conflicted.
… workflow, per AGENTS.md)

Root AGENTS.md: no workflow file per feature. The animation lane becomes job
`animation` behind the shared `paths` gate, keeping its own 25-minute timeout,
steps, runner and `vq04-animation-*` artifact names, so what the pull request
runs is unchanged.

Lane regex translated from the removed file's `paths:` globs (glob to anchored
ERE, `.` escaped, `*` as `[^/]*`); the removed workflow's own path entry becomes
`^\.github/workflows/integration\.yml$`, as every other lane already does.

Also ignore `docs/verification/vq04/**` in biome: those two reports are
machine-written evidence whose bytes the PRD pins to the hosted artifact, and
`pnpm lint` was already red on this branch for their formatting alone.
@jonit-dev jonit-dev changed the title fix(core): preserve loop phase and weight across locomotion reversals (VQ-04) feat(animation): add weighted playback with bounded phase-preserving transitions Oct 4, 2026
@jonit-dev jonit-dev changed the title feat(animation): add weighted playback with bounded phase-preserving transitions feat(animation): add weighted playback and authored locomotion evaluation Oct 4, 2026
…ional-clip search

One playWeighted call per frame from game settings; direction fails closed without authored clips. Phase boxes stay open: no scene consumer, no browser or native run, no directional clips.
…river

Opt-in ?vq-locomotion fixture: third-person rig and first-person body on the CC0 mannequin, one scripted speed trace, per-tick clips, weights, phase and action counts in the observation channel, plus the playtest scenario. CPU, lint, typecheck and native bundle pass; the rendered run is unverified locally (SwiftShader blank).
…and record Phase 1-2 evidence

Adds scripts/verify-vq-locomotion.ts to the integration animation job with routing cases (red first), native and browser frames with provenance, and ticks Phase 1 box 2 and both Phase 2 boxes. Phase 3 and acceptance stay open: no directional clips, native host stale, hosted run not yet recorded.
@jonit-dev jonit-dev added prd:50% PRD half the phases verified and removed prd:0% PRD implementation has no verified phase yet labels Oct 5, 2026
@jonit-dev
jonit-dev marked this pull request as ready for review October 5, 2026 03:40
@jonit-dev jonit-dev added prd:75% PRD phases in, acceptance open and removed prd:50% PRD half the phases verified labels Oct 5, 2026
@jonit-dev jonit-dev added prd:100% prd:75% PRD phases in, acceptance open and removed prd:75% PRD phases in, acceptance open prd:100% labels Oct 5, 2026
@jonit-dev jonit-dev added prd:100% and removed prd:75% PRD phases in, acceptance open labels Oct 5, 2026
@jonit-dev
jonit-dev added this pull request to the merge queue Oct 5, 2026
Merged via the queue into develop with commit 9b3c482 Oct 5, 2026
90 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant