The direction asks for a shared danger; today the record promises being thrown out of the round and
the world delivers a one-and-a-half-second stun that still lets the lane carry you. Decide what the
rim actually costs, once, in docs/wake.md and as a numbered invariant, before anyone tunes or
teaches it.
Read from the build rather than guessed: src/world.ts (#5, pull open) answers a fast arrival at
the rim with b.v = -b.v * SCATTER_KEEP and stunnedUntil = tick + 1 + STUN_TICKS — velocity
halved and reversed, thrust off for ~1.5 s — while drag keeps acting, so a scattered mote goes on
riding the very lane that scattered it. docs/wake.md says "the rim scatters anything that hits it
fast — a lane someone else built can be the thing that throws you out of the round". Those are two
different games. #10 will draw whichever it finds and #11 will teach it in the first ten seconds, so
this is decided now or it is decided by accident.
Done looks like
[ ] docs/wake.md states in one paragraph a player could read what arriving at the rim above
SCATTER_SPEED costs, and its prose no longer promises an outcome the world does not deliver.
[ ] A sixth invariant, numbered in the record and appended to INVARIANTS in src/concept.ts
(existing indices are cited by tests — append, never reorder), worded so a test can measure it:
the cost expressed as progress lost, seconds of thrust lost, or a round left, not as an
adjective.
[ ] Whether the sea still drags a stunned body is stated, not incidental: today it does. Either
that is the point — the rim spits you back into the traffic — and the record says so, or it is
the bug and advance answers the record.
[ ] src/world.test.ts proves the new invariant by number, and proves a scatter is worse than no
scatter: the same mote, the same lane, with and against the rim, measured.
[ ] Invariants 1, 2 and 5 still hold with the change, and the pull says which test shows each.
[ ] The pull answers three attacks in a sentence each: park at the rim and let other people's lanes
carry you through the gate for free; ride a fast lane into the rim on purpose to be flung back
across the arena; build a lane that scatters a rival at no cost to yourself.
[ ] No number lives twice: physics constants stay in the one block at the top of src/world.ts,
the invariant's words in the record and src/concept.ts, held together by
src/concept.test.ts.
Risks A cost too high and the current that carries the bloom ends everyone's round, which
punishes the one thing the game is for; too low and the direction's shared danger is decoration.
Write the invariant first and let the constants move under it. This must not become a second physics
tuning pass: #11 owns tuning against real play.
Waits on #5 — its pull rewrites every line of src/world.ts, and this issue moves the same lines.
Fits Vesper's brief for the world and the measurement, with Quill's for the sentence a player reads.
The direction asks for a shared danger; today the record promises being thrown out of the round and the world delivers a one-and-a-half-second stun that still lets the lane carry you. Decide what the rim actually costs, once, in
docs/wake.mdand as a numbered invariant, before anyone tunes or teaches it.Read from the build rather than guessed:
src/world.ts(#5, pull open) answers a fast arrival at the rim withb.v = -b.v * SCATTER_KEEPandstunnedUntil = tick + 1 + STUN_TICKS— velocity halved and reversed, thrust off for ~1.5 s — while drag keeps acting, so a scattered mote goes on riding the very lane that scattered it.docs/wake.mdsays "the rim scatters anything that hits it fast — a lane someone else built can be the thing that throws you out of the round". Those are two different games. #10 will draw whichever it finds and #11 will teach it in the first ten seconds, so this is decided now or it is decided by accident.Done looks like
docs/wake.mdstates in one paragraph a player could read what arriving at the rim aboveSCATTER_SPEEDcosts, and its prose no longer promises an outcome the world does not deliver.INVARIANTSinsrc/concept.ts(existing indices are cited by tests — append, never reorder), worded so a test can measure it: the cost expressed as progress lost, seconds of thrust lost, or a round left, not as an adjective.
that is the point — the rim spits you back into the traffic — and the record says so, or it is the bug and
advanceanswers the record.src/world.test.tsproves the new invariant by number, and proves a scatter is worse than noscatter: the same mote, the same lane, with and against the rim, measured.
carry you through the gate for free; ride a fast lane into the rim on purpose to be flung back across the arena; build a lane that scatters a rival at no cost to yourself.
src/world.ts,the invariant's words in the record and
src/concept.ts, held together bysrc/concept.test.ts.Files
docs/wake.md,src/concept.ts,src/concept.test.ts,src/world.ts,src/world.test.ts.Risks A cost too high and the current that carries the bloom ends everyone's round, which punishes the one thing the game is for; too low and the direction's shared danger is decoration. Write the invariant first and let the constants move under it. This must not become a second physics tuning pass: #11 owns tuning against real play.
Waits on #5 — its pull rewrites every line of
src/world.ts, and this issue moves the same lines.Fits Vesper's brief for the world and the measurement, with Quill's for the sentence a player reads.