Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
63ed401
perf: add PRD-570 crowd baseline measurement gate
jonit-dev Oct 10, 2026
5e0cba5
fix: publish absent crowd measurements as JSON-safe nulls
jonit-dev Oct 10, 2026
6a5a00b
test: wait for complete post-startup crowd measurement window
jonit-dev Oct 10, 2026
cd48d5a
feat: expose observed GPU main sample coverage
jonit-dev Oct 10, 2026
234bd3f
docs: record bounded crowd functional preflight failure
jonit-dev Oct 10, 2026
16f2173
fix(skinned-crowd): latch completed measurement receipt
jonit-dev Oct 10, 2026
a311f99
docs(prd570): record passing functional measurement window
jonit-dev Oct 10, 2026
5fd6b25
docs(prd570): record Phase 1 series run on a loaded host as not accepted
jonit-dev Oct 11, 2026
14984cc
feat(core): AnimationPlayer update rate with screen-size auto policy …
jonit-dev Oct 11, 2026
36acb17
docs(prd570): record shooter template gate results; AC-2 stays open
jonit-dev Oct 12, 2026
0e32cd9
Merge remote-tracking branch 'origin/develop' into perf/prd570-skin-a…
jonit-dev Oct 13, 2026
172b80b
feat(core): rate skinned animation by visibility
jonit-dev Oct 13, 2026
d05be2f
docs(prd570): record runtime verification boundary
jonit-dev Oct 13, 2026
86d2845
fix(core): preserve moved roots on skipped skin writes
jonit-dev Oct 13, 2026
4ef9265
docs(prd570): record moving-root and GPU doctor proof
jonit-dev Oct 13, 2026
bfa55ee
fix(perf): measure skipped skinned write calls
jonit-dev Oct 13, 2026
c579311
fix(prd570): select crowd spans fixture from launch flag
jonit-dev Oct 13, 2026
210264d
fix(prd570): package crowd asset manifest
jonit-dev Oct 13, 2026
69af1d2
docs(prd570): verify policy on native desktop
jonit-dev Oct 13, 2026
64a2d04
test(prd570): capture matched crowd rate visuals
jonit-dev Oct 13, 2026
58c0d51
fix(prd570): keep camera targets at full animation rate
jonit-dev Oct 13, 2026
54a3c1b
docs(prd570): publish animation rate guidance
jonit-dev Oct 13, 2026
b2e90ef
docs(prd570): record independent pose judgment
jonit-dev Oct 13, 2026
6eff5a7
docs(prd570): verify paired CPU reduction and pose fidelity
jonit-dev Oct 13, 2026
0833ebf
docs(prd570): verify CPU attribution at all crowd sizes
jonit-dev Oct 13, 2026
6a9e17d
docs(prd570): reopen incomplete visual evidence gate
jonit-dev Oct 13, 2026
39b9a3d
docs(prd570): compact update rate template guidance
jonit-dev Oct 13, 2026
28c4d8f
docs(prd570): record qualification repairs and fresh measurement prot…
jonit-dev Oct 13, 2026
a2bf706
docs(prd570): record current proofs and reopen CPU acceptance
jonit-dev Oct 13, 2026
f56cc74
fix(core): invalidate hidden skinned palette caches
jonit-dev Oct 13, 2026
0119a0c
fix(core): publish camera animation rate before render prep
jonit-dev Oct 13, 2026
156f5f0
fix(core): preserve animation loop event timing
jonit-dev Oct 13, 2026
1c0fcf7
fix(core): cull against final render transforms
jonit-dev Oct 13, 2026
498745b
fix(core): synchronize late animation loop listeners
jonit-dev Oct 13, 2026
18f3b5f
fix(core): preserve animation and projection review contracts
jonit-dev Oct 13, 2026
067b2fe
fix(core): preserve public action interpolation timing
jonit-dev Oct 13, 2026
269ccc9
docs(prd570): record current gates and loaded-host protocol
jonit-dev Oct 13, 2026
ebfb1a4
docs(prd570): align phase status with verified GPU decision
jonit-dev Oct 13, 2026
54b62d4
docs(prd570): record final CPU attribution and inconclusive comparison
jonit-dev Oct 13, 2026
925c53d
docs(prd570): retain rejected loaded-host observations
jonit-dev Oct 13, 2026
8035e39
style(core): format game regression spec
jonit-dev Oct 13, 2026
e513e85
docs(prd570): verify final native and visual behavior
jonit-dev Oct 13, 2026
3e4b9c8
Merge origin/develop into PRD-570 and reconcile template contracts
jonit-dev Oct 13, 2026
2f96d3c
fix(skinned-crowd): initialize measurement window
jonit-dev Oct 13, 2026
3e7e86d
docs(prd570): retain failed stable laptop CPU comparison
jonit-dev Oct 13, 2026
7df90c0
docs(prd570): align phase status with stable CPU failure
jonit-dev Oct 13, 2026
c0b83d1
fix(skinned-crowd): align readiness with simulation windows
jonit-dev Oct 13, 2026
175b2ba
Merge remote-tracking branch 'origin/develop' into perf/prd570-skin-a…
jonit-dev Oct 13, 2026
e89f2a1
docs(prd570): declare integrated candidate measurement
jonit-dev Oct 13, 2026
ebcf303
docs(prd570): verify refreshed native policy
jonit-dev Oct 13, 2026
334ec34
docs(prd570): retain inconclusive integrated CPU series
jonit-dev Oct 13, 2026
8b564d9
docs(prd570): record browser attribution and controlled CPU condition
jonit-dev Oct 13, 2026
d22df97
fix(core): preserve stop poses and per-frame dynamic bounds
jonit-dev Oct 14, 2026
a84a5ca
fix(shooter): keep living soldiers opaque while fading corpses
jonit-dev Oct 14, 2026
321e579
Merge develop into PRD-570 and retain measured scaffold contracts
jonit-dev Oct 14, 2026
9e527b7
fix(core): preserve public animation callback state
jonit-dev Oct 14, 2026
17d4a67
docs: judge visual outcomes against task intent
jonit-dev Oct 14, 2026
de7d052
docs: record verified native and visual animation gates
jonit-dev Oct 14, 2026
f23e7ae
fix(playtest): measure browser frame budgets on the live clock
jonit-dev Oct 14, 2026
f225cf8
docs: record default-clock shooter acceptance results
jonit-dev Oct 14, 2026
90516ea
docs(prd570): record cache, call-cost and shooter baseline diagnostics
jonit-dev Oct 14, 2026
c1f8939
docs(prd570): reject insufficient policy and stride candidates
jonit-dev Oct 14, 2026
75daec2
fix(core): avoid enumerating numeric buffers during contact discovery
jonit-dev Oct 14, 2026
4b2f671
test(core): restore buffer-enumeration spy on sample failure
jonit-dev Oct 14, 2026
15b817d
docs(prd570): reject cadence motion loss and record shooter gate
jonit-dev Oct 14, 2026
75ef6af
Merge remote-tracking branch 'origin/develop' into perf/prd570-skin-a…
jonit-dev Oct 14, 2026
eb1b094
docs(prd570): record integrated qualification and interpolation stop …
jonit-dev Oct 14, 2026
4690765
fix(benchmark): enable precise crowd CPU timing
jonit-dev Oct 14, 2026
7b32730
docs(animation): bound motion repair and refresh native proof
jonit-dev Oct 14, 2026
ab1d2b2
fix(animation): interpolate skipped skinned batch poses
jonit-dev Oct 14, 2026
0a9dcbd
revert(animation): reject interpolation with visible pose lag
jonit-dev Oct 14, 2026
123fc0c
fix(animation): flush edited clip data before held draw
jonit-dev Oct 14, 2026
272a790
Merge branch 'develop' into perf/prd570-skin-animation-gate
jonit-dev Oct 14, 2026
9e4b6fa
wip(animation): internal readPose query and baked pose table (unwired)
jonit-dev Oct 14, 2026
9e6d648
feat(animation): shared baked pose lookup for skipped-rate skinned ba…
jonit-dev Oct 15, 2026
2adcb96
fix(animation): preserve one evaluation per rate-one control tick
jonit-dev Oct 15, 2026
e5eafd4
Merge remote-tracking branch 'origin/develop' into perf/prd570-skin-a…
jonit-dev Oct 15, 2026
91ea3d0
docs: record PRD-570 integrated candidate checks
jonit-dev Oct 15, 2026
df5c9c0
Merge remote-tracking branch 'origin/perf/prd570-skin-animation-gate'…
jonit-dev Oct 15, 2026
db9330e
fix(animation): preserve bone edits after evaluated ticks
jonit-dev Oct 15, 2026
359473d
fix(tests): typecheck current-time pose lookup coverage
jonit-dev Oct 15, 2026
1f184bf
docs: record PRD-570 qualification blocker and direct launch proof
jonit-dev Oct 15, 2026
5043993
fix(core): preserve authored poses across lookup invalidation
jonit-dev Oct 15, 2026
9b3d46d
revert(animation): reject current-time lookup after bounded CPU attempt
jonit-dev Oct 15, 2026
929c1e1
docs: record PRD-570 ownership and direct-track stop
jonit-dev Oct 15, 2026
0c0241f
docs: verify restored native crowd and reject matrix-work route
jonit-dev Oct 15, 2026
742c045
docs: verify restored shooter behavior and retain wrapper caveat
jonit-dev Oct 15, 2026
647dd52
docs: verify clean shooter exit and screen raw-keyframe geometry
jonit-dev Oct 15, 2026
f9bac71
merge: integrate develop into PRD-570 and preserve stopped CPU screen
jonit-dev Oct 15, 2026
b2d73eb
fix(playtest): own compile cache before orphan baseline
jonit-dev Oct 15, 2026
53f1ead
docs: bound live-input deformation and verify zero-dt mutation semantics
jonit-dev Oct 15, 2026
854a943
fix(test): align orphan fixtures with owned compile cache
jonit-dev Oct 15, 2026
2b0c667
docs: record raw-route rejection and qualification handoff
jonit-dev Oct 15, 2026
11266e0
docs: correct mutation reference and record native fixture proof
jonit-dev Oct 15, 2026
91a73a3
docs: record integrated suite passes and bound transition evidence
jonit-dev Oct 15, 2026
86e33ae
docs: record current-time proofs and cached-basis boundary
jonit-dev Oct 15, 2026
3d5bd56
docs(prd570): record integrated native crowd qualification
jonit-dev Oct 15, 2026
2974ac3
docs(prd570): verify crowd on rebuilt native host
jonit-dev Oct 15, 2026
30e4dcc
docs(prd570): record desktop gate and reviewed cache model
jonit-dev Oct 15, 2026
06aa277
docs(prd570): distinguish writer behavior from CPU readiness
jonit-dev Oct 15, 2026
d8bc895
docs: record independent writer proof and reopen shooter gate
jonit-dev Oct 15, 2026
835cd94
docs: retain stopped CPU screen and verified writer correction
jonit-dev Oct 15, 2026
9ca077c
docs: retain stopped CPU and shooter qualification outcomes
jonit-dev Oct 15, 2026
26d3881
docs: record shared-key checks and CPU capacity blocker
jonit-dev Oct 15, 2026
e0a69b3
docs(prd570): record current stable original CPU shortfall
jonit-dev Oct 15, 2026
8708c8c
docs(prd570): record current frozen-build profiling diagnostic
jonit-dev Oct 15, 2026
a1baf6e
docs(prd570): record bounded attribution and shooter diagnostic
jonit-dev Oct 15, 2026
aaed0fb
fix(playtest): bound stalled animation frame waits
jonit-dev Oct 15, 2026
d631605
docs(prd570): record original-clock headshot proof
jonit-dev Oct 15, 2026
4d8de0c
docs(prd570): record skeleton override compatibility failure
jonit-dev Oct 15, 2026
0b9e83e
docs(prd570): reject incomplete transaction compatibility proof
jonit-dev Oct 15, 2026
3fdac2f
docs(prd570): record bounded callback barrier proof
jonit-dev Oct 15, 2026
915f794
docs(prd570): qualify repaired runner on full installed shooter gate
jonit-dev Oct 15, 2026
4ecce2d
docs(prd570): record current runner qualification and owned packet pr…
jonit-dev Oct 15, 2026
81c9040
docs: bound rigid endpoint screening and reject unproved cost gain
jonit-dev Oct 15, 2026
439fd1a
docs: retain translation operator proofs and failed cost admission
jonit-dev Oct 15, 2026
ab28c33
docs: prove scoped quaternion zero identities before cost admission
jonit-dev Oct 15, 2026
a793ed1
docs: record same-build alignment and compose H proof
jonit-dev Oct 15, 2026
758a94c
docs: reject identity compose after stable cost comparison
jonit-dev Oct 15, 2026
a1151f4
docs: start exact-head CI and record read-only audit limits
jonit-dev Oct 15, 2026
41fc28d
docs: record stock override repair and displayed history proof
jonit-dev Oct 15, 2026
d3fad75
fix: refresh shooter convention citations for budgets
jonit-dev Oct 15, 2026
437e0f6
fix(playtest): share one deadline across cold startup
jonit-dev Oct 15, 2026
d017ae4
docs(animation): record raw renderer probe and remaining gates
jonit-dev Oct 15, 2026
c670e95
docs(animation): preserve first velocity probe failure
jonit-dev Oct 15, 2026
e8fc49c
docs(animation): record passing GPU velocity consumer
jonit-dev Oct 15, 2026
89b4bfa
docs: record guarded packet consumer CPU preflight
jonit-dev Oct 15, 2026
674c44d
docs: record laptop 128-rig packet GPU proof
jonit-dev Oct 15, 2026
4e5bf14
refactor(core): isolate genuine stock skinning fallback
jonit-dev Oct 15, 2026
3daf07b
feat(core): expose internal animation pose ownership and logical time
jonit-dev Oct 15, 2026
3cca847
perf(core): evaluate admitted throttled skin poses on GPU
jonit-dev Oct 15, 2026
512fdab
fix: repair candidate type checks and rapid terrain saves
jonit-dev Oct 15, 2026
48fff63
refactor(core): name private pose evaluators by their operation
jonit-dev Oct 15, 2026
e3ed336
test(native): require consumed velocity from scalar skin packets
jonit-dev Oct 15, 2026
ca82444
fix(native): provision velocity attachment in skinned proof
jonit-dev Oct 15, 2026
fa44abf
ci(native): run shipped crowd rate assertions on desktop
jonit-dev Oct 15, 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
32 changes: 32 additions & 0 deletions .github/workflows/native-platforms.yml
Original file line number Diff line number Diff line change
Expand Up @@ -988,6 +988,38 @@ jobs:
run: ccache --zero-stats
- name: Build the native host
run: pnpm --filter @threenative/runtime-native native:build
- name: Verify the shipped Crowd rate scenario on desktop
# Software adapters prove the native scenario contract, not physical GPU performance.
env:
TN_PLAYTEST_ALLOW_SOFTWARE: "1"
TN_FRAME_SPANS: "1"
shell: bash
run: |
set -euo pipefail
project="$GITHUB_WORKSPACE/packages/runtime-native/artifacts/conformance/crowd-rate-project"
mkdir -p "$project"
pnpm --filter skinned-crowd exec node ../../packages/runtime-native/scripts/bundle.mjs \
--project . --entry src/game.ts --target desktop --output "$project/skinned-crowd-native.js"
cp examples/skinned-crowd/public/assets.manifest.json "$project/assets.manifest.json"
timeout --kill-after=15s 315s node --input-type=module - \
"$GITHUB_WORKSPACE/examples/skinned-crowd/playtests/crowd-rate.playtest.json" \
--project "$project" --target desktop \
--executable "$GITHUB_WORKSPACE/packages/runtime-native/build/tn-linux/mystral" \
--host-arg run --host-arg "$project/skinned-crowd-native.js" \
--artifacts "$GITHUB_WORKSPACE/packages/runtime-native/artifacts/conformance/crowd-rate" <<'NODE'
import { main, flushStdout } from './packages/playtest/dist/runner/cli.js';
const keepalive = setInterval(() => {}, 1000);
const bound = setTimeout(() => process.exit(124), 300_000);
let code = 3;
try {
code = await main(process.argv.slice(2));
} finally {
clearTimeout(bound);
clearInterval(keepalive);
}
await flushStdout();
process.exit(code);
NODE
- name: Report the compiler cache hit rate
if: always() && env.CCACHE_UNAVAILABLE != '1'
shell: bash
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Results go in the existing PRD, PR or response; a separate evidence file only wh

**Fail closed**: malformed input throws, a missing observation fails, an empty assertion set fails. `pnpm test` proves units; **a playtest scenario proves the game** — every runtime-behaviour change gets one, rerun on each later change to that behaviour.
**Nearest lane first, CI last.** A CI round trip costs over an hour; prove it locally (unit test, playtest, emulator, attached device) and push once green. While `TN_RUNNER` is set, run only the focused checks for what you changed and push: the full board runs once, on `tn-local`. **Prefer an emulator over hardware** when it can hold the claim; a stopped emulator means start it, not "blocked". Never call `xvfb-run` (its exit status is its own cleanup kill; `sh scripts/xvfb.sh <cmd>` is the wrapper). An unnamed WebGPU adapter may be SwiftShader: pass `--browser-recipe webgpu` and check `adapter.info`. Free a port with `lsof -ti tcp:<port> | xargs -r kill`; `pkill -f vite` kills your own shell.
**Visual judge subagent (owner rule, 2026-10-09).** Any change that alters what reaches the screen — materials, lights, shadows, exposure, fog, post, terrain, particles, LOD, resolution scale, and any perf change that touches them — needs a visual judge. Capture the same pose before and after (headed, `--browser-recipe webgpu`, `adapter.info` checked, at least two runs per arm, BEFORE and AFTER burned in large). Give both sets and the intended effect to a fresh read-only subagent that did not write the change. It returns IMPROVEMENT, NEUTRAL or REGRESSION per frame and overall. NEUTRAL or REGRESSION means fix the cause and judge again; do not explain it away. Record the verdict in the PRD box that claims the outcome and post the images on the PR (orphan `<prd>-screenshots` branch). A pixel diff or a green gate is not a verdict, and a perf win counts only when the judge passes.
**Visual judge subagent (owner rule, 2026-10-09).** Any change that alters what reaches the screen — materials, lights, shadows, exposure, fog, post, terrain, particles, LOD, resolution scale, and any perf change that touches them — needs a visual judge. Capture the same pose before and after (headed, `--browser-recipe webgpu`, `adapter.info` checked, at least two runs per arm, BEFORE and AFTER burned in large). Give both sets and the intended effect to a fresh read-only subagent that did not write the change. Set visual acceptance criteria from the task before judging. The judge returns IMPROVEMENT, NEUTRAL or REGRESSION against those criteria per frame and overall. Performance-only and appearance-preserving tasks pass with NEUTRAL or IMPROVEMENT when there is no visible regression; tasks promising visual improvement require IMPROVEMENT. Intentional appearance changes must meet their stated visual target. REGRESSION, or NEUTRAL when improvement is required, means fix the cause and judge again; do not explain it away. Record the verdict in the PRD box that claims the outcome and post the images on the PR (orphan `<prd>-screenshots` branch). A pixel diff or a green gate is not a verdict, and a perf win counts only when the judge passes.
Long gates write `artifacts/gates/status.json`: read it with `pnpm gate:status`, probe a stale phase with `pnpm gate:doctor`; `pnpm gate:resume` continues only while worktree, branch, HEAD, lease and artifact still match. None of them repair or remove a worktree.

## Working outside the repo
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ Results go in the existing PRD, PR or response; a separate evidence file only wh

**Fail closed**: malformed input throws, a missing observation fails, an empty assertion set fails. `pnpm test` proves units; **a playtest scenario proves the game** — every runtime-behaviour change gets one, rerun on each later change to that behaviour.
**Nearest lane first, CI last.** A CI round trip costs over an hour; prove it locally (unit test, playtest, emulator, attached device) and push once green. While `TN_RUNNER` is set, run only the focused checks for what you changed and push: the full board runs once, on `tn-local`. **Prefer an emulator over hardware** when it can hold the claim; a stopped emulator means start it, not "blocked". Never call `xvfb-run` (its exit status is its own cleanup kill; `sh scripts/xvfb.sh <cmd>` is the wrapper). An unnamed WebGPU adapter may be SwiftShader: pass `--browser-recipe webgpu` and check `adapter.info`. Free a port with `lsof -ti tcp:<port> | xargs -r kill`; `pkill -f vite` kills your own shell.
**Visual judge subagent (owner rule, 2026-10-09).** Any change that alters what reaches the screen — materials, lights, shadows, exposure, fog, post, terrain, particles, LOD, resolution scale, and any perf change that touches them — needs a visual judge. Capture the same pose before and after (headed, `--browser-recipe webgpu`, `adapter.info` checked, at least two runs per arm, BEFORE and AFTER burned in large). Give both sets and the intended effect to a fresh read-only subagent that did not write the change. It returns IMPROVEMENT, NEUTRAL or REGRESSION per frame and overall. NEUTRAL or REGRESSION means fix the cause and judge again; do not explain it away. Record the verdict in the PRD box that claims the outcome and post the images on the PR (orphan `<prd>-screenshots` branch). A pixel diff or a green gate is not a verdict, and a perf win counts only when the judge passes.
**Visual judge subagent (owner rule, 2026-10-09).** Any change that alters what reaches the screen — materials, lights, shadows, exposure, fog, post, terrain, particles, LOD, resolution scale, and any perf change that touches them — needs a visual judge. Capture the same pose before and after (headed, `--browser-recipe webgpu`, `adapter.info` checked, at least two runs per arm, BEFORE and AFTER burned in large). Give both sets and the intended effect to a fresh read-only subagent that did not write the change. Set visual acceptance criteria from the task before judging. The judge returns IMPROVEMENT, NEUTRAL or REGRESSION against those criteria per frame and overall. Performance-only and appearance-preserving tasks pass with NEUTRAL or IMPROVEMENT when there is no visible regression; tasks promising visual improvement require IMPROVEMENT. Intentional appearance changes must meet their stated visual target. REGRESSION, or NEUTRAL when improvement is required, means fix the cause and judge again; do not explain it away. Record the verdict in the PRD box that claims the outcome and post the images on the PR (orphan `<prd>-screenshots` branch). A pixel diff or a green gate is not a verdict, and a perf win counts only when the judge passes.
Long gates write `artifacts/gates/status.json`: read it with `pnpm gate:status`, probe a stale phase with `pnpm gate:doctor`; `pnpm gate:resume` continues only while worktree, branch, HEAD, lease and artifact still match. None of them repair or remove a worktree.

## Working outside the repo
Expand Down
Loading
Loading