selftest.html only imports; each lane owns js/tests/<letter>.test.js. Five lanes sharing one selftest.html would be the single guaranteed merge conflict in the repo, so the stubs are pre-created with each lane's PLAN3D asserts written into the header. No rAF anywhere: it's throttled in a hidden tab, so a rAF-driven selftest would pass only while you watch it. fixedLoop() drives time instead. Lane A's suite covers the §5-A acceptance criteria, including "camera never clips through house" — stated as the underlying invariant (no solid between the player's head and the camera) so it survives Lane E swapping the house GLB. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
27 lines
1.2 KiB
JavaScript
27 lines
1.2 KiB
JavaScript
/**
|
||
* Lane B selftests — cloth, corner loads, failure cascade.
|
||
*
|
||
* Lane B owns this file. Lane A pre-created it so that adding your suite never
|
||
* means editing selftest.html — if all five lanes shared that file it would be
|
||
* the one guaranteed merge conflict in the repo.
|
||
*
|
||
* The asserts PLAN3D §5-B asks for, once sail.js lands:
|
||
* 1. hypar sheds load — twisted rig's peak corner load < flat rig's peak,
|
||
* same storm, same hardware. This is the thesis of the whole game; if it
|
||
* doesn't hold, the wind force is being applied per-node instead of
|
||
* per-face.
|
||
* 2. cascade — break one corner at a fixed t, a neighbour's load spikes ≥2×.
|
||
* 3. determinism — two runs, same inputs, byte-equal load traces.
|
||
*
|
||
* Useful imports when you get there:
|
||
* import { FIXED_DT, STORM_LEN, HARDWARE, createStubWind } from '../contracts.js';
|
||
* import { assert, assertLess, fixedLoop } from '../testkit.js';
|
||
* Drive time with fixedLoop(), never rAF. Use createStubWind({seed}) until
|
||
* Lane C's weather.js lands — but don't tune against it, it's uniform in space.
|
||
*/
|
||
|
||
/** @param {import('../testkit.js').Suite} t */
|
||
export default function run(t) {
|
||
t.skip('sail.js not landed yet — Lane B');
|
||
}
|