Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
7a091de
test(playtest): add PRD-564 resolution measurement harness
jonit-dev Oct 10, 2026
2bec4fe
fix(playtest): type PRD-564 measurement contracts
jonit-dev Oct 10, 2026
a66652c
fix(lint): preserve donor motion schema names
jonit-dev Oct 11, 2026
e5cf6d9
test(playtest): persist resolution startup checkpoints
jonit-dev Oct 11, 2026
e540c00
docs(prd564): record NVIDIA phase one measurements
jonit-dev Oct 13, 2026
770f508
merge develop into PRD-564 measurement lane
jonit-dev Oct 13, 2026
78f74d2
docs(prd564): record post-merge qualification prerequisites
jonit-dev Oct 13, 2026
3cf6ee4
fix(playtest): load browser runner without process
jonit-dev Oct 13, 2026
6aa4362
fix(playtest): clean up resolution measurement startup
jonit-dev Oct 13, 2026
11b0a70
test(playtest): qualify PRD-564 resize continuation
jonit-dev Oct 13, 2026
a0fcca6
perf: retain render targets for resolution scaling
jonit-dev Oct 13, 2026
f623196
docs(prd564): record implementation and pending runtime proof
jonit-dev Oct 13, 2026
729d821
docs(prd564): record exact native subrect parity
jonit-dev Oct 13, 2026
f14626d
Merge remote-tracking branch 'origin/develop' into perf/prd564-resolu…
jonit-dev Oct 13, 2026
0c54f7f
docs(prd564): reopen native proof for shipped controller
jonit-dev Oct 13, 2026
3bea8ee
test(native): exercise retained resolution controller
jonit-dev Oct 13, 2026
f335aca
fix(render): retain post-process targets and preserve scaler guards
jonit-dev Oct 13, 2026
1a4e2cb
docs(prd564): verify shipped controller desktop parity
jonit-dev Oct 13, 2026
203ab90
fix(playtest): allow cold navigation within startup readiness budget
jonit-dev Oct 13, 2026
bcf872b
test(native): simplify resolution bundle contract
jonit-dev Oct 13, 2026
7d886e7
perf(render): avoid duplicate retained-target resize traversal
jonit-dev Oct 13, 2026
caba377
test(native): exercise retained resize fast path
jonit-dev Oct 13, 2026
989d053
docs: refresh current-source resolution native parity
jonit-dev Oct 13, 2026
bbe732d
docs: reopen resolution baseline after probe bias review
jonit-dev Oct 13, 2026
8be6eb8
fix(playtest): exclude step-only census work from frame timing
jonit-dev Oct 13, 2026
c27c85a
docs: reconcile verified native parity after baseline reopening
jonit-dev Oct 13, 2026
e7e9e11
test(playtest): align resolution frames with host observations
jonit-dev Oct 13, 2026
3283bc6
docs: identify remaining PRD-564 phase two proof gaps
jonit-dev Oct 13, 2026
1a7e244
test(core): prove retained target canvas resize lifecycle
jonit-dev Oct 13, 2026
4637c85
test(playtest): collect bounded resolution clock and thread evidence
jonit-dev Oct 13, 2026
402d92b
fix(core): retain timerless scaler policy with active subrect
jonit-dev Oct 13, 2026
06192a3
fix(playtest): distinguish retained artifacts from test temporary files
jonit-dev Oct 14, 2026
4dfb1bf
test(core): verify refused subrect fallback and scaffold bytes
jonit-dev Oct 14, 2026
caeca6a
Merge remote-tracking branch 'origin/develop' into perf/prd564-resolu…
jonit-dev Oct 14, 2026
1c101b9
docs: refresh integrated resolution-subrect parity proof
jonit-dev Oct 14, 2026
aa31eb2
test(render): compile canonical AO retained-view sampling
jonit-dev Oct 14, 2026
0522677
test(render): prove bloom and spatial-AA retained sampling
jonit-dev Oct 14, 2026
eec2e36
fix(assets): reject new undeclared outputs with old timestamps
jonit-dev Oct 14, 2026
a8ffb3c
docs: record full tests and remaining PRD-564 owner gates
jonit-dev Oct 14, 2026
347b8bf
Merge develop into PRD564 and correct visual review blocker
jonit-dev Oct 15, 2026
ae04050
fix(render): release spatial AA resources on chain rebuild
jonit-dev Oct 15, 2026
085595e
test(scaffold): refresh hashes for spatial AA disposal
jonit-dev Oct 15, 2026
96234a3
docs(prd564): accept matched-quality visual preservation proof
jonit-dev Oct 15, 2026
ec2e938
docs(prd564): record bounded timing qualification result
jonit-dev Oct 15, 2026
97c920f
Merge develop into PRD564 after transient MSAA depth integration
jonit-dev Oct 15, 2026
a9e691c
docs: record integrated PR489 unit qualification
jonit-dev Oct 15, 2026
c4907f9
docs: record CPU interference in fresh resolution baseline
jonit-dev Oct 15, 2026
e77260f
docs: record reserved baseline and recorder interference
jonit-dev Oct 15, 2026
1664a98
fix(core): emit guarded rung after scaler oscillation
jonit-dev Oct 15, 2026
46c3b84
docs(prd564): record latest baseline gaps and scaler repair
jonit-dev Oct 15, 2026
2417d32
docs: refresh PRD-564 native parity after scaler repair
jonit-dev Oct 15, 2026
21c5d55
docs(prd564): record unqualified final timing attempt
jonit-dev Oct 15, 2026
8e25560
docs: record repaired scaler full-suite result
jonit-dev Oct 15, 2026
345893f
docs: finalize current scaler verification status
jonit-dev Oct 15, 2026
d50cc83
docs(prd564): record administrator-reserved timing outcome
jonit-dev Oct 15, 2026
bfcfcd0
docs(pr489): record atomic quiet-window timing blocker
jonit-dev Oct 15, 2026
eec24ab
docs(prd564): record competing native GPU timing blocker
jonit-dev Oct 15, 2026
194a78f
docs(prd564): record unqualified host24 baseline
jonit-dev Oct 15, 2026
123c651
Merge branch 'develop' into perf/prd564-resolution-subrect
jonit-dev Oct 16, 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
31 changes: 31 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,37 @@
"formatter": {
"enabled": false
}
},
{
"include": ["examples/procedural-animals/src/render/donor/core/motion/quadruped.js"],
"linter": {
"rules": {
"style": {
"useNamingConvention": {
"level": "error",
"options": {
"conventions": [
{
"selector": {
"kind": "interface"
},
"match": "I(.*)"
},
{
"selector": {
"kind": "objectLiteralProperty"
},
"match": "(?:D|DL|T|F|H|W|U|Lf|(.+))",
"formats": ["camelCase"]
}
],
"strictCase": false,
"requireAscii": false
}
}
}
}
}
}
]
}

Large diffs are not rendered by default.

89 changes: 62 additions & 27 deletions packages/assets/__tests__/bake-receipt.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,34 +278,69 @@ describe("bake receipt", () => {
);
});

it.each([false, true])(
"should throw when a pass writes a file under the output root it did not declare (preserved old timestamp: %s)",
async (preserveTimestamp) => {
const root = await makeTempDir("threenative-receipt-stray-");
await mkdir(path.join(root, "assets"));
await writeFile(path.join(root, "assets", "rock.png"), rgbaPng({ height: 32, width: 32 }));

await expect(
compileAssets({
cwd: root,
transcoder: TRANSCODER,
passes: [
{
name: "stray-writer",
apply: async (input: Buffer) => {
await mkdir(path.join(root, "public"), { recursive: true });
const strayPath = path.join(root, "public", "stray.bin");
await writeFile(strayPath, "undeclared");
// A copied output can retain its source's timestamp despite being new to public/.
if (preserveTimestamp) await utimes(strayPath, new Date(0), new Date(0));
return input;
},
it.each([
["ordinary", false],
["backdated", true],
])("should throw when a pass writes an undeclared file (%s)", async (_label, backdate) => {
const root = await makeTempDir("threenative-receipt-stray-");
await mkdir(path.join(root, "assets"));
await writeFile(path.join(root, "assets", "rock.png"), rgbaPng({ height: 32, width: 32 }));

await expect(
compileAssets({
cwd: root,
transcoder: TRANSCODER,
passes: [
{
name: "stray-writer",
apply: async (input: Buffer) => {
await mkdir(path.join(root, "public"), { recursive: true });
await writeFile(path.join(root, "public", "stray.bin"), "undeclared");
if (backdate) {
await utimes(
path.join(root, "public", "stray.bin"),
new Date("2000-01-01T00:00:00Z"),
new Date("2000-01-01T00:00:00Z"),
);
}
return input;
},
},
],
}),
).rejects.toThrow(/TN_ASSETS_UNDECLARED_OUTPUT.*stray\.bin/su);
});

it("should throw when a pass overwrites a pre-existing undeclared file", async () => {
const root = await makeTempDir("threenative-receipt-stray-overwrite-");
await mkdir(path.join(root, "assets"));
await mkdir(path.join(root, "public"));
await writeFile(path.join(root, "public", "stray.bin"), "old");
await utimes(
path.join(root, "public", "stray.bin"),
new Date("2000-01-01T00:00:00Z"),
new Date("2000-01-01T00:00:00Z"),
);
await writeFile(path.join(root, "assets", "rock.png"), rgbaPng({ height: 32, width: 32 }));

await expect(
compileAssets({
cwd: root,
transcoder: TRANSCODER,
passes: [
{
name: "stray-writer",
apply: async (input: Buffer) => {
await writeFile(path.join(root, "public", "stray.bin"), "undeclared");
const future = new Date(Date.now() + 1000);
await utimes(path.join(root, "public", "stray.bin"), future, future);
return input;
},
],
}),
).rejects.toThrow(/TN_ASSETS_UNDECLARED_OUTPUT.*stray\.bin/su);
},
);
},
],
}),
).rejects.toThrow(/TN_ASSETS_UNDECLARED_OUTPUT.*stray\.bin/su);
});

it("should leave a static file the project authored alone", async () => {
const root = await makeTempDir("threenative-receipt-static-");
Expand Down
38 changes: 38 additions & 0 deletions packages/core/__tests__/render-chain.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { describe, expect, it, vi } from "vitest";
import {
type IRenderChainStage,
RENDER_CHAIN_STAGE_ORDER,
RenderChain,
readRenderChainObservation,
} from "../src/render/chain.js";
Expand Down Expand Up @@ -896,3 +897,40 @@ describe("RenderChain", () => {
).toThrow(/afterOutputTransform/u);
});
});

describe("subrect stage admission", () => {
it.each(RENDER_CHAIN_STAGE_ORDER)("requires explicit sampling support for %s", (name) => {
for (const supported of [false, true]) {
const adapter = renderer("webgpu");
const install = vi.fn();
adapter.setOutputNode = install;
const handle = {} as import("../src/render/resolution-subrect.js").ResolutionSubrect;
const report = vi.fn();
const chain = new RenderChain({
renderer: adapter,
input: {},
resolutionSubrect: handle,
report,
request: { stages: [name], tier: "high" },
stages: [
{
name,
requiresVelocity: false,
supportsResolutionSubrect: supported,
build: (input) => input,
},
],
});
expect(install.mock.calls[0]?.[2]?.resolutionSubrect).toBe(supported ? handle : undefined);
expect(
report.mock.calls.some(
([line]) =>
line.includes("TN_RESOLUTION_SUBRECT") &&
line.includes(supported ? "applied" : "refused") &&
line.includes(name),
),
).toBe(true);
chain.dispose();
}
});
});
Loading