Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
5f14f1e
docs(PRD-832..842): the untangle report and its eleven single-source …
jonit-dev Nov 7, 2026
16fdd2d
refactor(core,scripts): one owner for the kit inventory, launch flags…
jonit-dev Nov 7, 2026
4d9daaa
style(create-threenative): format the render drift spec
jonit-dev Nov 7, 2026
ccf548c
refactor(three-native,runtime-native): name the tnw_web_frame fields …
jonit-dev Nov 7, 2026
57db86b
fix(refactor): the five gaps the PRD-832 review found
jonit-dev Nov 7, 2026
53ab261
fix(scripts,core): restore the spell reader and the example's script …
jonit-dev Nov 7, 2026
dd56d90
docs(PRD-832): the counts the review measured
jonit-dev Nov 7, 2026
1897ba8
refactor(create-threenative): the scaffold pin is two hashes per kit,…
jonit-dev Nov 7, 2026
6a4e07f
docs(PRD-833): name what phase 1 has to invert before the files can move
jonit-dev Nov 7, 2026
962bc90
refactor(core,create-threenative): the environment mechanism lives on…
jonit-dev Nov 7, 2026
9b6de81
chore(scaffold): re-pin every kit for the capability manifest the pre…
jonit-dev Nov 7, 2026
577877c
style(create-threenative): format the scaffold spec the pin tool rewr…
jonit-dev Nov 7, 2026
6ed61a6
refactor(create-threenative): one manifest names the dependency patches
jonit-dev Nov 7, 2026
91f421d
chore(scaffold): re-pin for the patch manifest the tarball now ships
jonit-dev Nov 7, 2026
bbb8474
style(create-threenative): format the prepack script and the re-pinne…
jonit-dev Nov 7, 2026
ac600f4
chore(scaffold): re-pin after the formatter rewrote the pin block
jonit-dev Nov 7, 2026
1aa00f7
fix(scaffold): the pin tool writes the shape the formatter keeps
jonit-dev Nov 7, 2026
8ba6bea
docs(PRD-833): the measured delta the plumbing restamp has to carry
jonit-dev Nov 7, 2026
b25a989
chore(scripts): delete the four scripts nothing runs
jonit-dev Nov 7, 2026
04f52e7
docs(PRD-838): the orphan gates are not orphaned
jonit-dev Nov 7, 2026
c8bafa8
refactor(core): one reader for what the renderer is
jonit-dev Nov 7, 2026
b5a05dc
refactor(scripts): one dev-server wait that notices the server died
jonit-dev Nov 7, 2026
c9f3ffa
refactor(scripts): one gh wrapper for the CI scripts
jonit-dev Nov 7, 2026
b161ae1
refactor(scripts): one subprocess runner for the eight copies
jonit-dev Nov 7, 2026
bd3fa8e
docs(PRD-838): the box edit had truncated Phase 2; restore it
jonit-dev Nov 7, 2026
1166b49
refactor(scripts): one stdio MCP client, and the fake server speaks t…
jonit-dev Nov 7, 2026
3e113eb
docs(PRD-838): the box names its proof marker
jonit-dev Nov 7, 2026
039dfe4
refactor(scripts): the last two MCP clients, and the notification the…
jonit-dev Nov 7, 2026
3d97db3
refactor(playtest,scripts): the perf host-load verdict has one home
jonit-dev Nov 7, 2026
72879ea
chore(scaffold): re-pin for the manifest the perf verdict export moved
jonit-dev Nov 7, 2026
e7e41e2
style(create-threenative): format the re-pinned spec
jonit-dev Nov 7, 2026
bcdbcd4
fix(scripts): the seven gaps the PRD-838 review found
jonit-dev Nov 7, 2026
c3c92b3
fix(scripts): the three gaps the second review found
jonit-dev Nov 7, 2026
dc3c306
docs(PRD-838): the EPIPE guard's honest status
jonit-dev Nov 7, 2026
61f5111
fix(release,scripts): the pack step ran in a folder named after its l…
jonit-dev Nov 7, 2026
3ab8b99
fix(scripts): the EPIPE spec was passing on a swallowed ReferenceError
jonit-dev Nov 7, 2026
fb24401
test(scripts): poll for the closed pipe instead of sleeping at it
jonit-dev Nov 7, 2026
7dfc3ed
docs(PRD-833): one box per plumbing file, with each file's measured d…
jonit-dev Nov 7, 2026
91f7828
refactor(create-threenative): every kit's tsconfig is generated from …
jonit-dev Nov 7, 2026
002805a
refactor(create-threenative): every kit's vite config is generated fr…
jonit-dev Nov 7, 2026
54b3a11
refactor(create-threenative): every kit's entry is generated from one…
jonit-dev Nov 7, 2026
4816c5a
fix(core,create-threenative): the review's five gaps on PRD-833
jonit-dev Nov 7, 2026
52dfd32
docs(PRD-833): the status, priority and claims the code now supports
jonit-dev Nov 7, 2026
d096295
docs(PRD-833): the status lines, and the patch-manifest box restored
jonit-dev Nov 7, 2026
eb67496
fix(core,create-threenative): the second review's four gaps
jonit-dev Nov 7, 2026
d36a484
docs(PRD-833): the authorised verdict's one count
jonit-dev Nov 7, 2026
b0f66d6
refactor(core,ui): one module owns __THREENATIVE__
jonit-dev Nov 7, 2026
a8cd9c6
refactor(core): one GPU series owns the sample, its frame and its fre…
jonit-dev Nov 7, 2026
d514ce5
fix(terrain): the biome's far-impostor distance reaches the world pac…
jonit-dev Nov 7, 2026
67e89ab
refactor(terrain): the world package contract is core's, and the impo…
jonit-dev Nov 7, 2026
98bf6ab
docs(PRD-837): the LOD box is two claims, and the picture-moving one …
jonit-dev Nov 7, 2026
e11aedf
refactor(core): one selectLodFor owns the view-depth recipe
jonit-dev Nov 7, 2026
a112de6
refactor(core): one near plane for the LOD degenerate test
jonit-dev Nov 7, 2026
6bb9e88
fix(core): the scope argument is a break, and the changelog names it
jonit-dev Nov 7, 2026
a21e8b8
docs(PRD-837): restore the world.json box, and stop the GpuReadings b…
jonit-dev Nov 7, 2026
229b004
fix(core,PRD-837): the example agents copy, and the lines the review …
jonit-dev Nov 7, 2026
29e4758
fix(core): the dev-global constraint fits on one line, so the manifes…
jonit-dev Nov 7, 2026
4dd95b2
docs(core): a one-line edit to prove what a commit carries
jonit-dev Nov 7, 2026
d6d8a68
fix(hooks): the pre-commit hook stops staging derived files the autho…
jonit-dev Nov 7, 2026
90b2b24
docs(PRD-836): the hook box, with the evidence and its remaining limit
jonit-dev Nov 7, 2026
70dd6a8
docs(PRD-836): the derived-docs box is a lane change, and here is why
jonit-dev Nov 7, 2026
cbb1a4d
docs(core): the moved environment mechanism carries an example, as th…
jonit-dev Nov 7, 2026
e188431
docs(untangle): the recall floor this branch's new public API moved
jonit-dev Nov 7, 2026
28b8905
fix(core): the snow field names the recovery it already does, restori…
jonit-dev Nov 7, 2026
027e080
chore(native): the coverage report follows the engine sources this br…
jonit-dev Nov 7, 2026
a29a65d
docs(untangle): the recall floor is green again, and how
jonit-dev Nov 7, 2026
cc957a9
refactor(capabilities): one committed manifest, in core
jonit-dev Nov 7, 2026
39779b7
refactor(capabilities): the derived capability docs are build output
jonit-dev Nov 7, 2026
5c12c10
refactor(core): the scene-entry audits are one ordered list
jonit-dev Nov 7, 2026
2a78346
test(api-surface): the fixture writes the manifest the gate reads
jonit-dev Nov 7, 2026
cc060eb
fix(capabilities,hooks,core): the review's defects
jonit-dev Nov 7, 2026
fdc91be
merge(develop): the authoring layer and the stress lab start commit
jonit-dev Nov 7, 2026
4b3ea5d
chore(native): the coverage report follows the merged engine sources
jonit-dev Nov 7, 2026
436ff41
fix(ci): the scope guard reads the package list from the Git tree
jonit-dev Nov 7, 2026
21017ae
fix(prd-836): the context skill is source, not build output
jonit-dev Nov 7, 2026
4b7e51b
fix(prd-833): the framework patch manifest is tracked
jonit-dev Nov 7, 2026
2417042
fix(prd-837): the overlay reads the dev global without a cross-packag…
jonit-dev Nov 7, 2026
4253867
fix: the four reds the review lane found after the merge
jonit-dev Nov 7, 2026
b1819a1
fix: the two unit files the related lane still failed
jonit-dev Nov 7, 2026
0f00124
merge(develop): the scene-tracing probes
jonit-dev Nov 7, 2026
01414ea
fix(create-threenative): the environment move left an unused type imp…
jonit-dev Nov 7, 2026
042e333
docs(PRD-832,PRD-836,PRD-837): two PRDs finish, and the boxes their r…
jonit-dev Nov 7, 2026
7e1be65
docs(PRD-842): the libuv timer branch is not dead, and Phase 1 says s…
jonit-dev Nov 8, 2026
659f25d
docs(PRD-833,PRD-837,PRD-838): the golden path is green, and what is …
jonit-dev Nov 8, 2026
5bd4593
Merge remote-tracking branch 'origin/develop' into refactor/untangle-…
jonit-dev Nov 8, 2026
6248ff8
refactor(core): boot and loop phases take narrow interfaces over one …
jonit-dev Nov 8, 2026
b4ce620
The CI change-scope classifier and run reuse split into two modules (…
jonit-dev Nov 8, 2026
93ed47f
test(runtime-native): timers, shims and engine entry are proved by ru…
jonit-dev Nov 8, 2026
e2afbad
refactor(core): every boot acquisition pushes its own disposer, teard…
jonit-dev Nov 8, 2026
a8c7990
refactor(core): the UI bridge moves out of game.ts into game-ui.ts (P…
jonit-dev Nov 8, 2026
bc5d944
test(runtime-native): host CLI order, host-gap meter and image decode…
jonit-dev Nov 8, 2026
7f52f84
test(runtime-native): window config, UI startup and pump silence are …
jonit-dev Nov 8, 2026
442f271
The historical exposure splice becomes explicit routing cases on the …
jonit-dev Nov 8, 2026
b28799d
The CI structure spec reads a typed workflow model and drops 593 raw-…
jonit-dev Nov 8, 2026
bbdfce8
PRD-839: phases 1-3 ticked with proof, baseline correction, AC-1 plan…
jonit-dev Nov 8, 2026
18cda1a
PRD-839 AC-1: the CI contract specs pass with every package built (88…
jonit-dev Nov 8, 2026
587b90f
refactor(playtest): one registry entry per assertion, real lanes, one…
jonit-dev Nov 8, 2026
543aa0d
docs(PRD-842): timers and shims proved by the host, AC-1 green, 8 pla…
jonit-dev Nov 8, 2026
ed4d480
test(runtime-native): window mode, maxFps, mobile fetch paths and pau…
jonit-dev Nov 8, 2026
f7a4dee
docs(PRD-838): AC-1 visual half is red at stale port 5310, with the p…
jonit-dev Nov 8, 2026
9940d76
PRD-833, PRD-837 done: the visual judge returns NEUTRAL on starter, r…
jonit-dev Nov 8, 2026
93ac953
test(runtime-native): screenshot mailbox, buffer-map lifetime and TRA…
jonit-dev Nov 8, 2026
a791101
docs(PRD-835): AC-1 golden-path verdicts and AC-2 android tone on the…
jonit-dev Nov 8, 2026
23cc4cb
Merge branch 'lane/untangle-835' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
fbf8e76
PRD-835 done: one registry entry per assertion, moved to done
jonit-dev Nov 8, 2026
35aa432
docs(PRD-838): AC-1 gate now reaches the score check; the stale score…
jonit-dev Nov 8, 2026
f2a96dc
PRD-840 phases 1-2: RenderFeatures set by the host, one flags.h, one …
jonit-dev Nov 8, 2026
18256bf
docs(PRD-838): tick AC-1 with the golden path and pnpm visuals:baseli…
jonit-dev Nov 8, 2026
b735a6a
Merge branch 'lane/untangle-visuals' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
efde08d
docs(PRD-838): Decision says pnpm visuals cannot exit 0 until the own…
jonit-dev Nov 8, 2026
13b7e2a
PRD-838 done: the golden path and the visual baseline gate run end to…
jonit-dev Nov 8, 2026
514c8fc
Merge branch 'lane/untangle-visuals' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
9598f1c
PRD-840 phase 3: split renderer.cpp by concern behind renderer_intern…
jonit-dev Nov 8, 2026
f3c8c68
test(native): web-host-refusal runs the Wasm host; PRD-842 ledger, wi…
jonit-dev Nov 8, 2026
f8aa596
PRD-834 phases 1, 2 and 3 box 2: frame ops, console markers, hook nam…
jonit-dev Nov 8, 2026
56df725
test(native): resize plan and font backend get desktop policy tests; …
jonit-dev Nov 8, 2026
51b51dc
docs(PRD-842): build-ios-simulator trigger and what it asserts today
jonit-dev Nov 8, 2026
f80a472
PRD-834 phase 3 box 1 (config keys): the host reads its embedded conf…
jonit-dev Nov 8, 2026
8b23a34
PRD-834 phase 3 box 1 (render key): GameRendererConfig type and the f…
jonit-dev Nov 8, 2026
12ea77e
PRD-834: red-green for the engine hook report, and the render key err…
jonit-dev Nov 8, 2026
9d36c89
test(native): iOS UI host proved by simulator launches; hit-region ro…
jonit-dev Nov 8, 2026
1e45817
Merge branch 'lane/untangle-native' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
fd42a0b
docs(untangle): PR chain for what is left before PR #632 merges
jonit-dev Nov 8, 2026
115e19d
Merge branch 'lane/untangle-841' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
f4ea739
Merge branch 'refactor/untangle-832-842' into lane/untangle-834
jonit-dev Nov 8, 2026
74aa28d
docs(PRD-841): AC-1 and AC-2 ticked — 93 core tests and the starter g…
jonit-dev Nov 8, 2026
8ff73d1
Merge branch 'refactor/untangle-832-842' into lane/untangle-834
jonit-dev Nov 8, 2026
8a4fd5f
Merge branch 'lane/untangle-841' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
5ad5c2a
refactor(core): one renderer config key — render folds into renderer …
jonit-dev Nov 8, 2026
809bdd6
docs(PRD-834): AC-1 and AC-2 ticked, phase 3 done — fold wired, nativ…
jonit-dev Nov 8, 2026
56dd104
Merge branch 'lane/untangle-834' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
83b7e63
fix(runtime-native): the native bundler resolves a core subpath throu…
jonit-dev Nov 8, 2026
92a0d96
docs(PRD-840): AC-1 measured before/after, AC-2 web judge NEUTRAL, AC…
jonit-dev Nov 8, 2026
7c4c5b2
Merge branch 'lane/untangle-840' into refactor/untangle-832-842
jonit-dev Nov 8, 2026
79ac672
docs(untangle): the chain's state table names what landed, what is bl…
jonit-dev Nov 8, 2026
38781a7
fix(lint): the merged tree lints clean — shooter's one renderer key, …
jonit-dev Nov 8, 2026
0816ea2
chore(scaffold): re-pin the shooter kit hash after the one renderer key
jonit-dev Nov 8, 2026
d9042ff
Merge origin/develop into refactor/untangle-832-842
jonit-dev Nov 8, 2026
d674d4f
chore(scaffold): re-pin every kit after develop's agent-doc refresh
jonit-dev Nov 8, 2026
9b9813f
docs(PRD-842): the first macOS release-proof run is recorded — six of…
jonit-dev Nov 8, 2026
5852705
docs(PRD-839): AC-2 met — 25 of 25 job names identical to the last co…
jonit-dev Nov 8, 2026
d64b390
docs(untangle): PRD-834, PRD-839 and PRD-841 move to done/ at 100%, w…
jonit-dev Nov 8, 2026
12425e1
fix(native): register the shim-bootstrap contract's two extra modes i…
jonit-dev Nov 8, 2026
8bebd2f
chore(native): regenerate the coverage evidence and claim the five ne…
jonit-dev Nov 9, 2026
2b5d194
docs(untangle): the chain records what landed, what is blocked and th…
jonit-dev Nov 9, 2026
5833abf
fix(core): the engine hook reads through one intersection cast, not a…
jonit-dev Nov 9, 2026
5871de1
fix(native): the player priority flag reads through flags.h, and thre…
jonit-dev Nov 9, 2026
41d9fac
ci(ios): keep the simulator evidence when the proof fails
jonit-dev Nov 9, 2026
f661d7c
fix(native): a failed starter smoke names its exit status and its log
jonit-dev Nov 9, 2026
8f9c9e4
docs(PRD-840, PRD-842): the native capture is blocked by construction…
jonit-dev Nov 9, 2026
ee58dc3
chore(native): regenerate the coverage record for the flags.h move
jonit-dev Nov 9, 2026
f223959
docs(PRD-842): the iOS variant log is readable, and it rules the page…
jonit-dev Nov 9, 2026
8c16b5d
Merge origin/develop into refactor/untangle-832-842 (PRD-784 lands)
jonit-dev Nov 9, 2026
cb19ddf
fix(native): the merged tree keeps the flag rule and the pins its two…
jonit-dev Nov 9, 2026
9230afe
fix(native): the window probe demands only what its Linux lane can pr…
jonit-dev Nov 9, 2026
51eed38
fix(native): the shim bootstrap test sets its rollback variable the M…
jonit-dev Nov 9, 2026
406021f
Merge remote-tracking branch 'origin/develop' into refactor/untangle-…
jonit-dev Nov 9, 2026
e5c8966
fix(ios): each launch variant starts from no install
jonit-dev Nov 9, 2026
7875481
fix(native): macOS keeps its exit code, and Windows checks out .mjs w…
jonit-dev Nov 9, 2026
43ddd92
docs(PRD-840, PRD-842, PRD-862): the native leftovers move out so PR …
jonit-dev Nov 9, 2026
87e5fbc
chore(native): regenerate the coverage record for the develop merge
jonit-dev Nov 9, 2026
4e8b4b1
fix(native): main.cpp stays inside its 1913-line cap
jonit-dev Nov 9, 2026
c805543
fix(native): the exit comment keeps the phrase wait-latency pins
jonit-dev Nov 9, 2026
4de9829
chore(scaffold): re-pin 14 kits after the develop merge
jonit-dev Nov 9, 2026
b4b8a3e
Merge origin/develop (PRD-854, #637) into refactor/untangle-832-842
jonit-dev Nov 9, 2026
d1d7f17
chore(native): regenerate the coverage record after the PRD-854 merge
jonit-dev Nov 9, 2026
effa99f
Merge origin/develop (PRD-859, #642) into refactor/untangle-832-842
jonit-dev Nov 9, 2026
7c9328d
chore(native): regenerate the coverage record after the PRD-859 merge
jonit-dev Nov 9, 2026
6abdc3c
fix(ios): keep the web-ui variant alive until the page loads
jonit-dev Nov 9, 2026
7f90b9f
fix(create-threenative): prepack runs pnpm through a shell on Windows
jonit-dev Nov 9, 2026
bd066aa
Merge origin/develop (PRD-860, #641 #645) into refactor/untangle-832-842
jonit-dev Nov 9, 2026
b07c1ec
fix(ci): the desktop consumer check ignores the TN_ENGINE_CATALOG: of…
jonit-dev Nov 9, 2026
316ec20
docs(native): regenerate coverage after the develop merge (PRD-860)
jonit-dev Nov 9, 2026
13583f8
merge: origin/develop (PRD-865 capability search) into untangle
jonit-dev Nov 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ packages/three-native/tests/compatibility/goldens/** linguist-generated
packages/three-native/tests/compatibility/fixtures/** linguist-generated
packages/three-native/api/*.json linguist-generated
packages/three-native/generated/** linguist-generated

# A CRLF checkout breaks Vite's shebang strip (`/^#!.*\n/`), so a shebang module fails to import on Windows.
*.mjs text eol=lf
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,9 @@ jobs:
run: |
set -euo pipefail
pnpm lint
# PRD-836: the capability reference and the context skill are build output, not tracked
# files, and `check:docs` resolves links against the working tree.
pnpm capabilities:sync
pnpm check:docs
pnpm exec vitest run \
scripts/__tests__/check-doc-links.spec.ts \
Expand Down Expand Up @@ -1451,6 +1454,9 @@ jobs:
shared-artifact: workspace-packages
save-bundles: "false"
pack-archives: "false"
# The capability reference is build output (PRD-836): `budgets --check`s it, so a clean
# checkout generates it first, exactly as the docs lane does.
- run: pnpm capabilities:sync
- run: pnpm budgets
- run: pnpm quality
- run: pnpm sync:agents --check
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/native-platforms.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1513,6 +1513,14 @@ jobs:
pnpm --filter @threenative/runtime-native native:build
- if: runner.os != 'Windows'
run: pnpm --filter @threenative/runtime-native native:build
- name: Install the Linux display probe's tools
if: runner.os == 'Linux'
run: |
# `host-window.test.mjs` reads the window the X server reports. The hosted image ships
# Xvfb, xwininfo and xprop but no xdotool, so the verify lane below failed on the
# prerequisite instead of running the probe. Installed here, not trusted to the image.
sh scripts/retry-download.sh sudo apt-get update
sh scripts/retry-download.sh sudo apt-get install -y xdotool xvfb x11-utils
- name: Report the compiler cache hit rate
if: always() && env.CCACHE_UNAVAILABLE != '1'
shell: bash
Expand Down
7 changes: 6 additions & 1 deletion .github/workflows/native-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ jobs:
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 zlib1g-dev
xdotool xvfb x11-utils
- name: Install Windows HTTP build dependencies
if: runner.os == 'Windows'
run: >-
Expand Down Expand Up @@ -551,11 +552,15 @@ jobs:
name: runtime-ios-simulator-arm64
path: release/threenative-ios-simulator-arm64.zip
if-no-files-found: error
# Runs when the proof above fails, which is the only time anyone reads these logs: a failed
# launch writes `variant-<label>.log` and the step that uploads them came after the throw, so
# the run that needed the log was the one run that never kept it (PRD-842, web-ui variant).
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
name: evidence-ios-simulator-arm64
path: packages/runtime-native/artifacts/ios/
if-no-files-found: error
if-no-files-found: warn

publish:
needs: [validate-tag, gates, build, build-android, build-ios-simulator]
Expand Down
12 changes: 10 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,10 @@ __pycache__/
# authored `assets/hull.glb` source is tracked.
examples/auto-lod/public/

# Generated by prepack from packages/core/patches (the only tracked copy).
packages/create-threenative/template-assets/patches/
# Generated by prepack from packages/core/patches (the only tracked copy). The manifest is not
# generated: it is the list prepack reads, so a clean checkout with no manifest cannot pack at all.
packages/create-threenative/template-assets/patches/*
!packages/create-threenative/template-assets/patches/manifest.json
# scripts/stage-terrain-kits.mjs writes these kits from packages/terrain/starter, the only tracked copy.
/packages/create-threenative/template-assets/terrain/

Expand All @@ -228,3 +230,9 @@ tools/unreal-reference/gi/**/__pycache__/
examples/strata-terrain-preview/dist-engine/

dist-one-spell/

# PRD-836: the one committed capability manifest is core's; this copy and the reference it
# generates are build output. The context skill is not: its prose is hand-written and one region of
# it is generated, so it stays tracked or a clean checkout loses the words.
/packages/create-threenative/capabilities.json
/packages/create-threenative/agent-docs/references/capability-reference.md
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ One source, two runtimes: browser WebGPU and an owned C++ host for desktop/Andro

## How you work

1. **Search the manifest before you write — by rule, not judgement.** Run `engine_search_capabilities` and read every row — it carries the import path, signature, example, constraints, overrides and deprecations; call `engine_capability_detail` only for a symbol the search did not return — before any new file under `src/` or `packages/`, any helper longer than a screen, and any render stage you toggle. Skipping it has shipped 446 hand-written lines of an installed system at 9 FPS. **Search the symptom too, before you debug it** (owner, 2026-10-24: "why this capability research wasnt done BEFORE having these issues"): a slow frame, limbs out of step with motion, a blurred or wrong image. Before you report a game done, play it from the spawn and read `TN_FRAME_BUDGET`, `TN_SCENE_WARNING` and `TN_RENDER_PROJECTION`. The manifest (`packages/create-threenative/capabilities.json`, rebuilt by `pnpm build`) is the only complete public surface, including subpath exports like `@threenative/physics/navigation`. Both tools ship in `threenative-engine-mcp`, wired by the `.mcp.json` that installing `@threenative/core` writes; launch from the game-project root or the server is missing.
1. **Search the manifest before you write — by rule, not judgement.** Run `engine_search_capabilities` and read every row — it carries the import path, signature, example, constraints, overrides and deprecations; call `engine_capability_detail` only for a symbol the search did not return — before any new file under `src/` or `packages/`, any helper longer than a screen, and any render stage you toggle. Skipping it has shipped 446 hand-written lines of an installed system at 9 FPS. **Search the symptom too, before you debug it** (owner, 2026-10-24: "why this capability research wasnt done BEFORE having these issues"): a slow frame, limbs out of step with motion, a blurred or wrong image. Before you report a game done, play it from the spawn and read `TN_FRAME_BUDGET`, `TN_SCENE_WARNING` and `TN_RENDER_PROJECTION`. The manifest (`packages/core/capabilities.json`, rebuilt by `pnpm build`) is the only complete public surface, including subpath exports like `@threenative/physics/navigation`. Both tools ship in `threenative-engine-mcp`, wired by the `.mcp.json` that installing `@threenative/core` writes; launch from the game-project root or the server is missing.
For game behavior references, use `engine_search_references`, then `engine_reference_detail` for pinned source; `engine_save_reference` saves a local reference and returns a contribution command; `engine_watch_reference` returns a contact sheet of real gameplay footage.
Then be lazy (the `ponytail` skill, re-injected by the project hooks; `PONYTAIL=off` opts out): YAGNI, installed system, stdlib/platform, one line. Never simplify away validation, error handling, security, accessibility or requested behaviour.
2. **Name the layer before fixing a bug**: engine (`packages/`) or game (example/template), and why. An engine bug fixed in game code leaves every other game broken.
Expand Down
20 changes: 18 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,24 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

Nothing yet. Add the next change here. A removed or changed public symbol needs a `### Breaking`
entry that names it (`pnpm api:surface:check`).
### Added

- `@threenative/core/render/environment` is the one home of the environment measure-and-sample
mechanism that twelve templates used to copy byte-for-byte: `measureEnvironment`,
`sampleEnvironment` and its cache, `captureEnvironmentSnapshot`, `reportEnvironmentContribution`,
`sampledRadiance`, the sampling-source check, and the gate that decides which renderer may run the
material lane (`IMaterialLightingEnvironment`, `materialLightingEnabled`, `isWebGLFallbackRenderer`).

### Breaking

- `@threenative/core`'s `devGlobal` and `publishDevGlobal` take their `scope` argument explicitly
rather than defaulting to `globalThis`: a default made an explicit `undefined` read the page's
global, which is exactly the worker case a caller asks about. Both were new in this branch.

- `@threenative/core/render/environment` does not export `backlightMaterial`, `resolveKey` or
`validateControls`: the backlight's shader constants decide how a surface looks, so those files
stay in each game's `src/render/`. A game that imported them from the subpath — only this branch
ever did — keeps the identical copies its kit already ships.

## [0.3.11] - 2026-11-03

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ One source, two runtimes: browser WebGPU and an owned C++ host for desktop/Andro

## How you work

1. **Search the manifest before you write — by rule, not judgement.** Run `engine_search_capabilities` and read every row — it carries the import path, signature, example, constraints, overrides and deprecations; call `engine_capability_detail` only for a symbol the search did not return — before any new file under `src/` or `packages/`, any helper longer than a screen, and any render stage you toggle. Skipping it has shipped 446 hand-written lines of an installed system at 9 FPS. **Search the symptom too, before you debug it** (owner, 2026-10-24: "why this capability research wasnt done BEFORE having these issues"): a slow frame, limbs out of step with motion, a blurred or wrong image. Before you report a game done, play it from the spawn and read `TN_FRAME_BUDGET`, `TN_SCENE_WARNING` and `TN_RENDER_PROJECTION`. The manifest (`packages/create-threenative/capabilities.json`, rebuilt by `pnpm build`) is the only complete public surface, including subpath exports like `@threenative/physics/navigation`. Both tools ship in `threenative-engine-mcp`, wired by the `.mcp.json` that installing `@threenative/core` writes; launch from the game-project root or the server is missing.
1. **Search the manifest before you write — by rule, not judgement.** Run `engine_search_capabilities` and read every row — it carries the import path, signature, example, constraints, overrides and deprecations; call `engine_capability_detail` only for a symbol the search did not return — before any new file under `src/` or `packages/`, any helper longer than a screen, and any render stage you toggle. Skipping it has shipped 446 hand-written lines of an installed system at 9 FPS. **Search the symptom too, before you debug it** (owner, 2026-10-24: "why this capability research wasnt done BEFORE having these issues"): a slow frame, limbs out of step with motion, a blurred or wrong image. Before you report a game done, play it from the spawn and read `TN_FRAME_BUDGET`, `TN_SCENE_WARNING` and `TN_RENDER_PROJECTION`. The manifest (`packages/core/capabilities.json`, rebuilt by `pnpm build`) is the only complete public surface, including subpath exports like `@threenative/physics/navigation`. Both tools ship in `threenative-engine-mcp`, wired by the `.mcp.json` that installing `@threenative/core` writes; launch from the game-project root or the server is missing.
For game behavior references, use `engine_search_references`, then `engine_reference_detail` for pinned source; `engine_save_reference` saves a local reference and returns a contribution command; `engine_watch_reference` returns a contact sheet of real gameplay footage.
Then be lazy (the `ponytail` skill, re-injected by the project hooks; `PONYTAIL=off` opts out): YAGNI, installed system, stdlib/platform, one line. Never simplify away validation, error handling, security, accessibility or requested behaviour.
2. **Name the layer before fixing a bug**: engine (`packages/`) or game (example/template), and why. An engine bug fixed in game code leaves every other game broken.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ const game = defineGame<GameState, IPhysicsContext>({
},
},
plugins: [rapier(), playtest()],
render: config.renderer,
renderer: config.renderer,
scenes: { play: Play },
start: "play",
});
Expand Down
4 changes: 4 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,10 @@
}
}
}
},
{
"include": ["packages/runtime-native/src/runtime-scripts/frame-op-stream.js"],
"linter": { "rules": { "style": { "useNamingConvention": "off" } } }
}
]
}
Loading
Loading