Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e63bda2
fix(core): preserve contributing loops across interrupted crossfades
jonit-dev Oct 2, 2026
7a4a09e
test(animation): capture actual mannequin reversal poses on WebGPU
jonit-dev Oct 2, 2026
691e917
fix(test): initialize the real-rig capture game state
jonit-dev Oct 2, 2026
a53db06
test(animation): publish clean-manifest capture and diagnostic screen…
jonit-dev Oct 2, 2026
b800a0c
docs(animation): attach verified five-frame real mannequin proof
jonit-dev Oct 2, 2026
bb0aca5
Merge origin/develop into fix/vq04-interrupted-locomotion
jonit-dev Oct 3, 2026
aa7055c
ci: fold integration-animation-reversal.yml into integration.yml (one…
jonit-dev Oct 3, 2026
1082397
Merge branch 'develop' into fix/vq04-interrupted-locomotion
jonit-dev Oct 3, 2026
ee535d1
feat(animation): preserve phase and bounded transitions in weighted p…
jonit-dev Oct 4, 2026
f95b4ff
feat(example): evaluate authored locomotion weights with explicit dom…
jonit-dev Oct 4, 2026
a7f5780
Merge develop into PR395 preserving animation integration coverage
jonit-dev Oct 4, 2026
5cef362
Merge current develop CI improvements into PR #395
jonit-dev Oct 4, 2026
06afda6
Merge hosted template concurrency improvement into PR #395
jonit-dev Oct 4, 2026
d5ef54d
ci: retain animation producer coverage
jonit-dev Oct 4, 2026
78b3e2a
feat(example): add game-owned locomotion driver and record the direct…
jonit-dev Oct 5, 2026
38f37f7
feat(example): run two locomotion consumers on one weight and phase d…
jonit-dev Oct 5, 2026
5ec5c57
test(example): keep the locomotion scenario target-neutral (no visual…
jonit-dev Oct 5, 2026
16e26c1
fix(example): load the locomotion mannequin as a project asset so the…
jonit-dev Oct 5, 2026
275ab37
test(example): capture the locomotion trace mid-run and frame both ri…
jonit-dev Oct 5, 2026
44f1d82
ci(animation): prove the two-rig locomotion fixture on headed WebGPU …
jonit-dev Oct 5, 2026
e1bd940
Merge develop into PR #395
jonit-dev Oct 5, 2026
cca077f
assets(example): add the CC0 KayKit Rig_Medium directional gait clips…
jonit-dev Oct 5, 2026
bfbbf18
docs(verification): keep locomotion evidence frames small to stay ins…
jonit-dev Oct 5, 2026
0e1ed87
Merge develop into PR #395
jonit-dev Oct 5, 2026
16c0497
ci(integration): join the animation lane in the completion receipts
jonit-dev Oct 5, 2026
45219e5
feat(example): drive the CC0 KayKit rig by 2D direction with real str…
jonit-dev Oct 5, 2026
0a41add
docs(prd): record the KayKit directional clips, the 2D consumer and t…
jonit-dev Oct 5, 2026
fd36dd8
Merge the PR tip into the KayKit work
jonit-dev Oct 5, 2026
2a47a72
ci(animation): add the fresh-host native locomotion lane and the anim…
jonit-dev Oct 5, 2026
f742def
docs(prd): tick Phase 3 browser and lifecycle acceptance with the hos…
jonit-dev Oct 5, 2026
673d509
docs(prd): close PRD-VQ-04 with hosted native proof and move it to done/
jonit-dev Oct 5, 2026
4b52788
Merge develop into PR #395
jonit-dev Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 128 additions & 2 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ env:
TN_BASE_SHA: ${{ inputs.base_sha }}

jobs:
# The per-lane trigger filters these six files used to carry, as one gate: the pull request's own
# The per-lane trigger filters these lane files used to carry, as one gate: the pull request's own
# changed paths decide which lanes run, and a lane this commit does not touch is skipped rather than
# spending a runner. Lane-local workflow edits select that lane; shared scheduling edits
# fail closed to every lane. Source filters remain independent of workflow-only selection.
Expand All @@ -48,6 +48,7 @@ jobs:
contents: read
actions: read
outputs:
animation: ${{ steps.filter.outputs.animation }}
candidate_sha: ${{ steps.filter.outputs.candidate_sha }}
required_jobs: ${{ steps.filter.outputs.required_jobs }}
exposure: ${{ steps.filter.outputs.exposure }}
Expand All @@ -74,6 +75,7 @@ jobs:
TN_HEAD_SHA: ${{ inputs.candidate_sha }}
# Exact source filters; workflow-only changes compare each job and filter separately.
TN_LANE_FILTERS: |
animation ^packages/core/src/animation\.ts$|^packages/core/__tests__/animation[^/]*\.spec\.ts$|^examples/abyss-framework/src/render/animation-reversal[^/]*\.ts$|^examples/abyss-framework/src/animation-reversal-main\.ts$|^examples/abyss-framework/animation-reversal\.html$|^examples/abyss-framework/playtests/animation-reversal\.playtest\.json$|^scripts/verify-animation-reversal\.ts$|^packages/core/__tests__/vq-locomotion-blend-spaces\.spec\.ts$|^examples/abyss-framework/src/render/locomotion-[^/]*\.ts$|^examples/abyss-framework/src/render/vq-locomotion-[^/]*\.ts$|^examples/abyss-framework/src/vq-locomotion-main\.ts$|^examples/abyss-framework/playtests/vq-locomotion-blend-spaces\.playtest\.json$|^examples/abyss-framework/assets/mannequin\.glb$|^scripts/verify-vq-locomotion\.ts$
cold-boot ^packages/create-threenative/(template-assets|templates/[^/]+/src/render)/(autoExposure|exposure|exposureGraph|exposureReadback|worldEnvironment)\.ts$|^packages/create-threenative/__tests__/auto-exposure[^/]*\.spec\.ts$|^packages/create-threenative/__tests__/fixtures/auto-exposure/.*$|^packages/core/src/.*$|^packages/core/patches/.*$|^packages/playtest/.*$|^packages/runtime-native/.*$|^pnpm-lock\.yaml$|^scripts/xvfb\.sh$|^\.github/actions/(workspace-dist|pnpm|playwright-chromium)/.*$
exposure ^packages/create-threenative/(template-assets|templates/[^/]+/src/render)/(autoExposure|exposure|exposureGraph|exposureReadback|worldEnvironment)\.ts$|^packages/create-threenative/__tests__/auto-exposure[^/]*\.spec\.ts$|^packages/create-threenative/__tests__/fixtures/auto-exposure/.*$|^packages/core/src/.*$|^packages/core/patches/.*$|^packages/playtest/.*$|^packages/runtime-native/.*$|^pnpm-lock\.yaml$|^scripts/xvfb\.sh$|^\.github/actions/(workspace-dist|pnpm|playwright-chromium)/.*$
csg ^examples/integrations/csg/.*$
Expand Down Expand Up @@ -348,6 +350,130 @@ jobs:
path: ${{ github.workspace }}/artifacts/ci-integration-receipts/${{ github.job }}.json
if-no-files-found: error

animation:
name: animation
if: ${{ needs.paths.outputs.animation == 'true' && !github.event.pull_request.draft }}
needs: paths
runs-on: ${{ (github.event.pull_request.head.repo.fork || !vars.TN_RUNNER) && 'ubuntu-24.04' || vars.TN_RUNNER }}
timeout-minutes: 25
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
persist-credentials: false
ref: ${{ inputs.candidate_sha }}
- uses: ./.github/actions/pnpm
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: '22'
cache: pnpm
- run: pnpm install --frozen-lockfile
- uses: ./.github/actions/workspace-dist
with:
pack-archives: 'false'
save-bundles: 'false'
- uses: ./.github/actions/playwright-chromium
- run: pnpm exec vitest run --maxWorkers=1 packages/core/__tests__/animation.spec.ts packages/core/__tests__/animation-reversal-fixture.spec.ts packages/core/__tests__/animation-weighted.spec.ts packages/core/__tests__/vq-locomotion-blend-spaces.spec.ts
- name: Capture real mannequin gait reversals on headed WebGPU
run: node --import tsx scripts/verify-animation-reversal.ts
- name: Capture the two-rig locomotion blend spaces on headed WebGPU
run: node --import tsx scripts/verify-vq-locomotion.ts
- uses: actions/upload-artifact@v7
if: always()
with:
name: vq04-animation-${{ github.run_id }}-${{ github.run_attempt }}-${{ inputs.candidate_sha }}
path: artifacts/vq04-animation
if-no-files-found: error
- name: Record exact current-attempt integration receipt
if: ${{ always() }}
env:
GH_TOKEN: ${{ github.token }}
TN_CI_JOB_RESULT: ${{ job.status }}
run: node "$GITHUB_WORKSPACE/scripts/ci-integration-receipts.mjs" --write
- uses: actions/upload-artifact@v7
if: ${{ always() }}
with:
name: ci-integration-receipt-${{ github.run_id }}-${{ github.run_attempt }}-${{ inputs.candidate_sha }}-${{ github.job }}
path: ${{ github.workspace }}/artifacts/ci-integration-receipts/${{ github.job }}.json
if-no-files-found: error

animation-native:
name: Linux native locomotion correctness
needs: [animation]
# The browser capture cannot say what the compiled runtime does with the same blend-space
# trace, and a stale host binary answers for the wrong source. Build this candidate's ARM
# desktop host and run the authored scenario file unchanged, so the lane's own scenario is
# the native proof rather than a second near-copy of it.
runs-on: ubuntu-24.04-arm
timeout-minutes: 60
env:
CMAKE_BUILD_PARALLEL_LEVEL: '2'
TN_PLAYTEST_ALLOW_SOFTWARE: '1'
TN_PLAYTEST_NATIVE_SCREENSHOT_TIMEOUT_MS: '30000'
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
persist-credentials: false
ref: ${{ inputs.candidate_sha }}
- uses: ./.github/actions/pnpm
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: '22'
cache: pnpm
- uses: actions/setup-python@v7
with:
python-version: '3.12'
- run: pnpm install --frozen-lockfile
- name: Build this source's public JavaScript packages
uses: ./.github/actions/workspace-dist
with:
save-bundles: 'false'
pack-archives: 'false'
- name: Restore checksum-provisioned native dependencies
uses: actions/cache/restore@v4
with:
path: packages/runtime-native/third_party
key: native-third-party-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('packages/runtime-native/scripts/download-deps.mjs', 'packages/runtime-native/scripts/package-android.mjs') }}
- name: Install the existing native lane's system prerequisites
run: >-
sudo apt-get update && sudo apt-get install -y
libasound2-dev libcurl4-openssl-dev libfontconfig1-dev libfreetype6-dev
libpulse-dev libudev-dev libx11-dev libxext-dev libxrandr-dev
libxcursor-dev libxi-dev libxfixes-dev libxss-dev libxkbcommon-dev
libgtk-3-dev libwebkit2gtk-4.1-dev libxcomposite-dev xcompmgr
libvulkan1 mesa-vulkan-drivers vulkan-tools xvfb zlib1g-dev
- name: Build the ordinary ARM desktop host from this source
run: pnpm --filter @threenative/runtime-native native:build
- name: Bundle the authored locomotion entry for the native host
run: node packages/runtime-native/scripts/bundle.mjs --project examples/abyss-framework --entry src/render/vq-locomotion-game.ts --target desktop --output examples/abyss-framework/dist/vq-locomotion-native.js
- name: Record this run's host identity beside its screenshots
run: |
mkdir -p examples/abyss-framework/artifacts/playtest
sha256sum packages/runtime-native/build/tn-linux/mystral > examples/abyss-framework/artifacts/playtest/native-host-identity.txt
git rev-parse HEAD >> examples/abyss-framework/artifacts/playtest/native-host-identity.txt
- name: Run the authored locomotion trace on the freshly built host
# A non-zero CLI status fails the step, so a run that never reached its assertions fails too.
run: sh scripts/xvfb.sh node packages/playtest/dist/runner/cli.js playtests/vq-locomotion-blend-spaces.playtest.json --target desktop --executable ${{ github.workspace }}/packages/runtime-native/build/tn-linux/mystral --project examples/abyss-framework --host-arg run --host-arg dist/vq-locomotion-native.js
- name: Retain native screenshots, host console and executable identities
if: always()
uses: actions/upload-artifact@v7
with:
name: vq04-locomotion-native-${{ github.run_id }}-${{ github.run_attempt }}-${{ inputs.candidate_sha }}
path: examples/abyss-framework/artifacts/playtest
retention-days: 30
if-no-files-found: warn
- name: Record exact current-attempt integration receipt
if: ${{ always() }}
env:
GH_TOKEN: ${{ github.token }}
TN_CI_JOB_RESULT: ${{ job.status }}
run: node "$GITHUB_WORKSPACE/scripts/ci-integration-receipts.mjs" --write
- uses: actions/upload-artifact@v7
if: ${{ always() }}
with:
name: ci-integration-receipt-${{ github.run_id }}-${{ github.run_attempt }}-${{ inputs.candidate_sha }}-${{ github.job }}
path: ${{ github.workspace }}/artifacts/ci-integration-receipts/${{ github.job }}.json
if-no-files-found: error

fog:
name: fog capture
if: ${{ needs.paths.outputs.fog == 'true' && !github.event.pull_request.draft }}
Expand Down Expand Up @@ -827,7 +953,7 @@ jobs:

completion:
name: Verify required integration receipts
needs: [paths, csg, ik, vegetation, decals, decals-native, tone, fog, fog-native, capture, fluid-collision, fluid-collision-native, packaged-quickjs, exposure, cold-boot]
needs: [paths, csg, ik, vegetation, decals, decals-native, tone, animation, animation-native, fog, fog-native, capture, fluid-collision, fluid-collision-native, packaged-quickjs, exposure, cold-boot]
if: ${{ always() }}
runs-on: ${{ (github.event.pull_request.head.repo.fork || !vars.TN_RUNNER_LIGHT) && 'ubuntu-24.04' || vars.TN_RUNNER_LIGHT }}
timeout-minutes: 5
Expand Down
1 change: 1 addition & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"docs/benchmark/rounds/**",
"docs/verification/prd-357-c4-duplicate-inventory.json",
"docs/verification/prd-357-c4-duplicate-inventory-before.json",
"docs/verification/vq04/**",
"docs/verification/visuals/**",
"benchmark/engine-load-test/godot-lights-meshes/benchmark_box_1000.json"
]
Expand Down
65 changes: 0 additions & 65 deletions docs/PRDs/animation/PRD-VQ-04-locomotion-blend-spaces.md

This file was deleted.

Loading
Loading