A feature is done when it works in the exported desktop build and in the web
build served locally, not when it works in the editor. Every check here runs
the real exports, prints PASS or FAIL lines, and leaves evidence in
docs/qa/<plan>/.
Read RULES.md for why each step exists. Commands are in WORKFLOW.md. The scenario list is in references/qa-scenarios.md, and the budgets in references/budgets.md.
The loop
tools/test.sh -> export macos -> --qa=<scenario> in the app -> export web -> serve -> browser-qa
^ |
| fix in code or content, never by loosening a budget |
+------------------ pack check <- room budgets <- reel <- docs/qa/<plan>/ <-------------+
|
deploy.sh [--prod]
- Tests.
tools/test.sh: headless import (fails on any script or import error), GUT, and the content lint. Logs inbuild/test-logs/. - Desktop.
tools/build/export.sh macos, then run the exported app with-- --qa=<scenario> --qa-out=<dir>. TheQaautoload plays the scenario, saves screenshots, prints[qa] PASS|FAILlines and a final[qa] RESULT, and quits with exit code 0 or 1. - Browser.
tools/build/export.sh web,bun tools/build/serve.ts, thenbun tools/build/browser-qa.ts <scenario>: a visible Chrome window with backgrounding off,?qa=<scenario>in the URL, two passes (cold and warm). - Pack.
export.shlists the real pack withtools/build/pck_list.pyand fails if a part left out of the web build is still in it. Runpython3 tools/build/pck_list.py build/web/index.pck --sizesto see what takes the space. - Budgets.
--qa=rooms --part=<id>tours every room: load time, frame p95, video memory with both eras and every character loaded. It fails past 400 MiB, 1 s or 16.7 ms. - Reels.
--write-moviewith a temporary 1920×1080override.cfg. - Evidence. Screenshots,
[qa]lines, measurements and reels indocs/qa/<plan>/, with a README table of checks and results. - Deploy.
tools/build/deploy.shfor a preview,--prodfor production, thenbrowser-qa.tsagain against the deployed URL.
Quick start
tools/test.sh
tools/build/export.sh macos
build/macos/<Game>.app/Contents/MacOS/<Game> -- --qa=greybox --qa-out=$PWD/docs/qa/<plan>/greybox
tools/build/export.sh web
bun tools/build/serve.ts & # http://localhost:8060/
bun tools/build/browser-qa.ts greybox
QA_BASE_URL=https://<project>.vercel.app bun tools/build/browser-qa.ts greybox # after deploy
Per-slice checklist
tools/test.shends with== ALL PASSED.- The slice's own scenario passes in the exported desktop app.
- The same scenario passes in Chrome on the web export, both passes.
- If the slice added rooms or characters: the part's room tour passes, and its numbers go in the evidence.
- The web pack is within its budget and holds nothing it should not.
- Evidence and a one-line result are in
docs/qa/<plan>/README.md, and the board has an entry. - After any deploy, the deployed URL passes
browser-qa.ts.
Do not
- Do not call a feature done from the editor or from GUT alone.
- Do not loosen a budget or a QA threshold to make a check pass. Fix the content, or record a decision.
- Do not judge frame times from a hidden or covered browser tab.
- Do not leave
override.cfgin the project after recording. - Do not deploy without exporting first; the export wipes
build/web. - Do not print or upload
.envor.env.local.
Back to the production map. The next part starts with story-track.