Lane D S18: [D] THE KNIFE — the verb, the four unwired seams, and the week re-flown honestly

The knife as shipped (hold X at a cleat, the trade printed, its own section on
the invoice), the hold-E prompt that has never once been drawn in five sprints,
the ruling that a cut is not a break on any surface that reads a corner, four
seams this sprint published and nobody wired, seven nights re-flown on the
fabric the game actually flies now, and the two branches of night 5 measured
side by side: +$142 with the knife against −$83 without it, on 1.2 seconds of
held key.

Two things filed for John rather than tuned by me: the knife has no PRICE on
the shipped emergency (the cut costs 1 HP of garden, because the hail is over
before you arrive and pay.garden is 0), and declining is free again at ★0.0
because the clamp eats it. Both are rulings where two correct decisions meet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-25 21:33:14 +10:00
parent 60771875d6
commit 097f453b9d

View File

@ -10976,3 +10976,326 @@ anchors are your GLB), but the tooling is now waiting, not TODO.
**Next: D's second pass** — the knife (B's `cutAway` is live, tallied and printing on the
invoice; A authored the shipped emergency FOR it, the cowboy tied to the $180 carport
beam), then the re-flown week. Gate 6 is John's.
[D] 2026-07-25 — 🔪 **GATE 1.3 LANDED: THE KNIFE — hold X at a cleat, the trade printed on the
glass, and the ruling that stops it being a trap. Plus FOUR SEAMS THIS SPRINT PUBLISHED AND
NEVER WIRED, all four found by playing the night rather than by a green suite.**
Selftest **584/0/0** (574 baseline + 10, all in d.test.js).
── **1 · THE KNIFE AS SHIPPED** ────────────────────────────────────────────────────────────
**INPUT — hold X for 1.2 s, standing at a cleat.** One verb, the WHOLE sail (B's `cutAway()`
with no argument), because that is what DESIGN.md line 165 means. The per-corner cut B also
exposed is not this verb: DESIGN.md lists the **quick-release corner** ("installed in prep") as
its own tool, and depowering one corner is that tool's job. One sprint, one verb.
· **X, not a third hold-E target.** At a post base E already offers two things and
`interact.nearest()` picks by DISTANCE, so a knife registered at the same position would race
the repair for the same key — and the one input a player must never misfire is the
irreversible one.
· **A HOLD, not a press.** This is the most irreversible input in the game; a tap that spends
the sail is a button. It dies the three ways a hold-E dies: let go, walk off the cleat, get
put down by a gust (measured: `knockdown` mid-cut zeroes the progress and the knife does NOT
stomp the knocked state).
· ⚖️ **IT DOES NOT WRITE `player.busy`, and that is deliberate.** interact.js's header states
the invariant — that module both enters and leaves `busy`, "so a dropped release cannot
strand the player". A second writer is how a player gets locked in a state nothing releases.
So the knife refuses to START while busy (no cutting mid-crank, mid-poke) and cancels itself
if a locked state arrives. The cost is that there is no cut animation: **filed, not faked.**
· ⚖️ **WHERE YOU CAN CUT: at the cleat, never at the bracket** — and this is the mechanic, not
a limitation. ladder.js's own header states the yard's rule ("a sail post is tensioned from a
cleat at its base, a tree anchor is a strop you throw") while a bracket is worked at height.
**The corner about to take the $180 carport is CB1, a bracket at y=2.36 that needs a ladder
you have no time to fetch.** So you cannot reach the corner that is failing — you cut the
sail at one you CAN reach and the whole thing goes limp. The ladder is for repairs (slow, two
trips, both hands); the knife is for the seconds you actually have. Complements, not rivals.
· ⚖️ **HANDS ARE NOT A GATE.** A knife is on your belt and cutting one line is one-handed — but
the real reason is that gating the signature decision behind dropping the spare would put an
undiscoverable inventory step inside a 5.9-second window, and a player reads that as the game
refusing rather than as a choice.
**THE HUD READ — and building it found something five sprints old (see §2).** The panel prints
the trade, both halves, always, because "cut or ride it out" is unanswerable off one of them:
[X] CUT THE SAIL LOOSE — hold
saves $205 at risk · garden gnome, the carport
costs the garden — 100% now, bare for 59s
"$N at risk" is **the board's own vocabulary**, deliberately: that morning's offer card priced
this night at "$205 at risk", and the knife is the one move that takes that number off the
table. Same words, two cards apart. And the saves side is priced through **main.js's own
collateral walk, injected** (`collateralWalk`, extracted pure for this) — one walk, two readers,
so the panel cannot advertise a saving the invoice will not honour. The refusal names the real
reason and there are two of them (a cleat to walk to, versus every live corner up a wall);
the first version was one constant that always blamed the bracket, and on the swing lawn it
told me to fetch a ladder for a corner that does not exist. `needsLadder`'s own SPRINT10 disease
on the surface that exists to explain it — caught by playing.
**THE PAPERWORK.** A's invoice line was already waiting. What it needed:
· **its own section, on ANY night.** The cut rows shipped INSIDE `w?.emergency`, so a sail cut
loose on an ordinary Tuesday printed nothing. Principle 2 has no "callouts only" clause.
Now: `THE KNIFE — sail cut loose at CB1, Q1, Q3 — 32s in, deliberate · for the carport ·
your call`, and B's `reason` field finally carries something (the most expensive thing those
corners were holding up, which is the sentence a player would say out loud).
· **a subtitle** — a cut sail headlined "Every corner held." would put three accounts of one
night on one card, one of them false.
· **a verdict.** With `lost` empty and hp under the line, `verdictFor` reached mode `uncovered`
and told a player who had just cut the sail down that *"the hail fell where your sail
wasn't"*. That is the worst sentence the card could say: it blames placement for a decision.
Two new modes, and they fire ONLY when nothing of yours failed — if a corner blew as well
that failure is the louder fact and the existing modes keep speaking truthfully.
── **2 · ⚠️ THE HOLD-E PROMPT HAS NEVER BEEN DRAWN. FIVE SPRINTS.** ────────────────────────
`interact.step()` returns `{target, progress, label, holding, usable}` "for hud.js to draw the
prompt + radial" — its own words, my file. **main.js throws the return value away, hud.js has
no prompt element, and the only renderer of a prompt in this repo is `dev_player.html`, a
bench.** So every sentence this lane has written for the player's hands — *"out of reach —
needs the ladder"*, *"push the water off (169 kg)"*, *"hands full"*, and the entire greyed-
prompt surface I built for Lane A in SPRINT13 — has never reached a player. You walk to a
broken corner, hold a key a help line mentioned, and the game says nothing until dawn.
**Same disease as `setFabric` and the F key before it: the code was right, the wire was
missing, and no assert could see it because the gap was on the glass.** It is now
`createVerbPanel` (knife.js, D's own overlay — hud.js is A's file and its header already
assigns "the repair prompt, which Lane D already owns" to this lane; z-index 9, so a card
always wins). It lives in knife.js and not player.js for one reason and it is the suite:
player.js statically imports GLTFLoader, which is why d.test.js has never imported it. **A
prompt surface only a browser can construct is a prompt surface with no asserts.** Now pinned.
Verified by play, first time on the glass: `[E] take the broom``[E] put the broom back`
`[E] push the water off (165 kg)` → poke → 165 kg becomes 34 and the player STAGGERS, with
q1 dropping 2.63 kN → 0.69 kN. Sprint 5's joke, finally legible.
── **3 · ⚖️ THE MONEY: A CORNER YOU CUT IS NOT A CORNER THAT FAILED** ──────────────────────
B ruled it on the rig ("a cut is a DECISION… warranty must never chase a corner the player
chose to let go") and emitted no `break`. But `_releaseCorner` sets `c.broken` for a cut exactly
as for an overload, and **every ledger surface reads `broken`.** So on the tree as merged,
taking DESIGN.md's signature decision billed you for it on five surfaces at once:
the cut corner's hardware went on `bill` · the collateral walk BILLED AND WRECKED the $180
carport you cut the sail to save · a four-corner cut tripped the gnome's two-corner rule ·
`clean` was voided by the collateral it caused · week.js booked a free warranty callout
tomorrow for every corner you let go, and docked standing for each one.
The invoice would have printed *"You spent the sail to keep the steel. That is the trade the
knife is for"* directly above a $180 charge for the thing you kept. Nobody wrote a wrong line:
A built both halves, B built the physics, and **the join is a flag on an object that no verb
set until now.**
⚖️ **THE RULING, B's extended to every surface that reads a corner: a cut bills nothing, wrecks
nothing, books no warranty and costs no standing. Its price is the garden — and through the
garden the night's fee — and that is enough.** `answerableFor` gains `cut` and drops it from
`yours`; `rigRecordFor` gains `cut`; week.js's warranty and rep blocks skip it exactly where
they already skip `theirs`. `lost` still counts it (the sail IS on the lawn; the corners-intact
read stays honest) and the refund now counts it too — **"lose the sail, save the anchors" is a
ledger line, not a slogan**, and `!c.broken` alone was quietly taking your steel as well.
── **4 · 🚨 FOUR SEAMS PUBLISHED THIS SPRINT AND NEVER WIRED.** ────────────────────────────
Every one is data or a name in A's files, every one was B's to rule and A's to apply, every one
was pre-authorised in writing ("revert-and-tell-me applies… yours is canon the moment it
lands"), and **not one of them was visible to 574 green asserts.** I found all four by playing
night 5 and reading the cards.
1. ⚖️ **B's AUTHORED COWBOY RIG had not landed.** The dispatch read *"CB1 carabiner — ON THE
GROUND"*: A's flagged placeholder. That is a different night from the one this sprint is
about — with the carport corner arriving down, the $180 is `theirs`, unbillable and
unwreckable, and **DESIGN.md line 165's signature decision has no object.** B's set adopted
verbatim: `q3 shackle · q1 carabiner · tr1b carabiner BROKEN · cb1 SHACKLE on the 0.22 beam`.
2. ⚖️ **`pay: { garden: 0 }` had not landed** — B's ruling that the garden BONUS is off on a
callout. The first emergency invoice I rendered paid **+$38** for a bed nobody had a prep
phase to protect.
3. ⚠️ **`rig.breakCorner?.()` — THE DOOR IS CALLED `failCorner`.** Measured live:
`typeof rig.failCorner === 'function'`, `typeof rig.breakCorner === 'undefined'`. **An
optional call to a renamed method is a silent no-op that reads exactly like a call** — D's
own `rigging.setWorld` lesson, quoted in that very file, arriving through the pattern built
to prevent it. So no corner arrived down and every card that said "ON THE GROUND" was wrong.
A's fallback reasoning covered it ("a $5 carabiner on the beam fails in seconds anyway") and
**that is exactly what hid it** — under B's canon rig the arrived-broken corner is a
carabiner on a 0.88 branch that does not self-destruct.
4. ⚠️ **`attach(…, {at, wind})` was never passed, so the cloth flew the wrong storm.** C found
it, B fixed it, nobody wired it: measured on the shipped emergency, **`rig.clockSkew` read
30.02** while the sky, garden, debris and player were all thirty seconds in. B's own number
for what that hides: the same rig pulls **90 N at t=0 and 655 N at t=40**. The knife's own
invoice line said *"cut loose 9s in"* on a night you arrive at 30, because the log stamps
the SAIL's clock — one bug, two symptoms. Wired by asking the night (`week.job.emergency`),
not by a flag: with a `wind` B's attach genuinely PRE-FLIES the thirty seconds.
**Pinned so it cannot come back:** every door main.js feature-detects on the emergency path is
asserted to EXIST (`failCorner`/`cutAway`/`seedClock`/`setFabric`, plus `attach`'s `{at}`),
because a feature-detect is only safe if something checks the feature.
── **5 · THE RE-FLOWN WEEK — first honest measurement of this game** ───────────────────────
Real path: splash → board → click an offer → sheet/dispatch → rig → ENTER → storm at
`SHADES.step(1/60)` → invoice, seven nights. Disclosed harness: picks go through
`session.rig()/cycleHardware()` (the exact calls the click handler makes) because RMB-orbit is
a pointer-capture drag the pane cannot do; **every board click, F, ENTER, WASD, E and X was a
real event.** Post-fabric-fix, shade cloth throughout except N7.
· **N1 — TOOK THE BOOKED JOB (the change from S17, and the ruling caused it).** The pool yard
was $57 against the Hendersons' $42 and I took it cold in S17 for free. With **"−½★
standing" printed on the card**, +$15 for +$45 exposure and a rep multiplier that prices the
whole week read like a bad trade on night one. Rigged the post quad in **carabiners ($20)
off the brief's own words ("Nothing tonight will test it")** — and **P5 BLEW ANYWAY**, on the
calmest night in the game. Garden 98, +$94, ★3.0→2.5.
· **N2 — spine, southerly × backyard.** Post quad, shackles, +spare. 4/4, garden 91, +$75.
**The fabric fix's first visible consequence: the shade cloth LEAKS** — "6 HP of hail reached
the bed", and B's SPRINT16 sentence *"The membrane stops every stone"* fires for the first
time in a played game. Pre-fix the sim always flew the membrane, so that note was unreachable.
· **N3 — spine, earlybuster × corner block. Flew FOUR CARABINERS ($20)** — a harness slip on my
side that I am reporting rather than hiding, and it is the week's most uncomfortable number:
**q1 blew, three held, garden 86, +$104, the best night of the week.** The cheapest rig in
the shop on the $205-exposure yard, because the quad never touches the carport. The trap you
do not tie to cannot bite.
· **N4 — TOOK THE BOOKED SWING LAWN: site_03's FIRST COLD PLAY EVER** (S17's N4 took the capped
repeat, so nobody has ever played this yard). Quad t1/t2/p1/s1_f1, **rated shackle on the
swing frame** (2925 N effective) because the yard tells you it is the weak link. **The rated
shackle went FIRST at t≈45 and took t1 and t2 with it.** Garden 91, and: garden gnome $25,
**the swing set $140**, clean bonus struck through, **$148, ★2.5→0.0.** The biggest single
loss I have measured. 📇 **Filed for E/A:** the yard's anchor spread forces a big sail (my
quad was **80 m²** against 3542 m² on the other yards) and the only 4th corner near the bed
is the swing frame at 0.45 with $140 under it. The best steel in the shop is not enough at
80 m². And ⚠️ **the pyrrhic verdict is too warm here**: "THE GARDEN MADE IT… That is what the
sail was for" over $148, a wrecked swing set and ★0.0 reads as congratulations. Collateral,
not corner count, should be able to cool that sentence.
· **N5 — TOOK THE EMERGENCY. The mandated decline and the mandated callout are the same
choice, exactly as A designed.** See §6.
· **N6 — spine, the icenight.** **THE GRUDGE LANDED**: the board card said *"They remember
night 5 — you took another job"* and the job sheet *"They have not forgotten night 5. You
are here on their second-choice terms."* Post quad in shackles; **p5 blew again, this time
with a SHACKLE** (3200 N). Garden 16, +$12. ⚠️ **S17 measured this night at $83**; the whole
difference is the warranty chain, not the ice — my N5 was a cut, and a cut books no warranty.
· **N7 — spine, the soaker, membrane (F), and the broom.** $75 ring rated-on-q1 on the audit's
cheapest-holding quad (q1/tr1/tr1b/q3). Broomed a **165 kg** belly at t=43 → 34 kg, staggered,
and q1 fell 2.63 → 0.69 kN: **4/4 held.** And then **garden 49% — ONE POINT under the win
line**, fee docked to 35%, +$4. *"THE GARDEN IS GONE — and every corner held. The hail fell
where your sail wasn't."* ⚠️ **The audit's cheapest-HOLDING quad misses the bed by enough to
lose the night**, which is the coverage-vs-holding trade stated as a number: I saved the rig
and lost the job by 1 HP. S17 flew a quad including q2 and got garden 96.
**THE WEEK:** 7/7 nights · **5/7 gardens** · **$327** · ★0.5 · 6 warranty jobs ·
*"You made the least wrong call seven times running."*
S17 read 7/7 · 6/7 · $401 · ★0.0 · 5 warranty jobs. Different choices on three mornings, so
this is not a controlled comparison and I am not presenting it as one.
── **6 · NIGHT 5, BOTH BRANCHES OF ONE MORNING — the number the sprint asked for** ─────────
Same seek (`week.advance()`×4 — A's disclosed move; bank $80, ★3.0, so it is comparable to A's
retracted run), same dispatch, same arrival at t=30. One decision.
| | corners at dawn | garden | fee | garden bonus | clean | collateral | **AMOUNT DUE** | standing |
|---|---|---|---|---|---|---|---|---|
| **CUT at t=32.3** | 0/4 (3 cut, 1 arrived down) | 84% | +$114 | **$0** | +$20 | none | **+$142** | ★3.0 → 3.0 |
| **RIDE IT OUT** | 1/4 (cb1+q1 blew) | 85% | +$114 | $0 | $0 void | **$205** | **$83** | ★3.0 → **0.0** |
**A $225 swing on 1.2 seconds of held key.** Ran to q3's cleat in 1.1 s, held X from t=31.1,
the cut landed at **32.3**, and riding it out puts **cb1 and q1 down between t=35 and t=36**
B's 35.9 confirmed in the shipped game, so **the window from arrival is 5.9 s and I used 2.3 of
it.** (At the honest night-5 bank from the cold play, $205, riding it out leaves $122 and ★0.0:
crippling, not a game over. The $0 above is the seek's $80 bank, not a balance claim.)
⚠️ **AND HERE IS THE PROBLEM, WHICH I AM REPORTING AND NOT TUNING: THE KNIFE'S STATED PRICE IS
NOT CHARGED ON THIS NIGHT.** The cut cost **1 HP of garden** — 84% cut versus 85% ridden —
because the southerly's hail is 2 s of pea stones that are over before you arrive, and the
remaining 58 s is wind and 5 mm/hr of rain the bed barely notices. B's ruling that "the garden
is the STAKE, not the wage" is right in principle, and with `pay.garden = 0` the garden only
reaches the money through `win = hp >= 50` — which 84% is nowhere near. **So on the shipped
emergency the knife is a $225 free win with no trade-off, and a player who knows it takes it
every time.** The two rulings are in tension and it needs one person to hold both:
· B's `pay.garden = 0` is what removes the knife's price (correct for the callout, fatal for
the trade).
· the storm cannot be re-authored — it is night 2's, and that is the one-variable law.
· `arriveAt` is ROADMAP's own number.
⚖️ **Not mine to re-rule at the end of a sprint. Gate 6, John's, with the numbers above.** The
shape of the decision is right and it is the best thirty seconds in this game; the PRICE is
missing, and it is missing because two correct rulings meet on one night.
── **7 · ⚠️ JOHN'S RULING HAS A FLOOR HOLE, and it costs nothing at exactly the wrong moment** ──
Measured in the cold play: I reached night 5 at **★0.0**, and standing a client up at ★0.0
**costs nothing**`settle()` clamps at `REP.MIN`, the fee multiplier is already ×0.88, and
there is nothing left to dock. **A fee-maximiser who has bled out can dodge every booked night
for free again, which is precisely the player the ruling was written for.**
Both papers were also lying about it: the offer card promised "−½★ standing" the game would not
charge, and the invoice printed *"stood up the Hendersons · −½★ standing"* four rows above
*"reputation ★ 0.0 → ★ 0.0"***the invoice arguing with itself, on John's own ruling.** I
fixed the PAPER half only (`standUpCost` clamps against the standing the charge lands on; at
the floor both surfaces say **"nothing left to dock"**, and the invoice adds *"Your standing is
already on the floor, so this one was free. They will remember the phone call anyway."*).
⚖️ **Whether the ruling should have teeth at the floor is John's, not mine** — the candidates
are a money component, letting rep go negative, or accepting that the floor is the floor. Until
he rules, the documents tell the truth about the number. **And the thing I actually felt was
not the star: it was night 6's board saying "They remember night 5 — you took another job."
Clause 3 is carrying the ruling at ★0.0, on its own.**
── **8 · WHICH OF MY OWN S17 NUMBERS NO LONGER HOLD** ─────────────────────────────────────
· ❌ **"the audit's own $40 clean line broke at tr1b 1.17/1.2" — WITHDRAWN as filed.** B is
right and their re-ruling is better than my filing: the boundary was never the defect. tr1b's
hint is 0.88, so a $5 carabiner there holds **1.056 kN, not 1.2**, and it broke at 1.168 —
10.6% over its REAL ceiling. I reasoned from the price list instead of the yard. And the
information was already on the panel: `summary.weakest` reads **tr1b** before you commit.
**B's diagnosis stands: $40 is a total, not a line.** My own N3 this week flew four
carabiners at $20 and lost only q1 — the corner with the worst load-to-rating ratio.
· ❌ **"the wildnight's pinned recipe loses p2 then p3 in the played game" — RESOLVED, and it
was a real bug, not a harness artefact.** B found the variable: `setFabric` never reached the
sim, so my play flew the membrane while every card said cloth. My decimals (3.48 / 3.90) were
the membrane's. Vindicated and void in the same breath.
· ❌ **"+$401 / 6-of-7 gardens / the $80 clean-win line" — all measured on a fabric the game
never flew.** This week reads $327 and 5/7 on different choices; nothing above should be
treated as a target until somebody re-flies a controlled week.
· ❌ **"N7 garden 96 FULL, +$28"** — I flew a different quad. Same yard, same storm, same
hardware budget, same fabric: **49%.** Coverage, not steel.
· ✅ **"declining costs nothing, so the board is a free option"** — answered by John, and the
answer works everywhere except the floor (§7).
· ✅ **the two-Vasilaros morning** (N7 offers the same client the same yard twice under "the
other goes to somebody else") is still there. Still cosmetic, still filed with a smile.
── **9 · DOES DECLINING COST ENOUGH TO HURT, AND LITTLE ENOUGH TO BE WORTH IT SOMETIMES?** ──
**Yes in the middle of the ladder, and no at the bottom.** −½★ is priced exactly right where it
bites: it is a real 2% fee cut compounding over the week plus the warranty exposure that comes
with a night you did not rig, and on night 1 it flipped my choice away from a job I took
without thinking in S17. That is the ruling working — it made a marginal morning into a
decision. And it is little enough to be worth paying: **+$142 against $83 made night 5 an
obvious yes even with the star on the line**, which is right, because that is what a $205
emergency at double rates SHOULD look like.
Where it fails is ★0.0, and it fails completely (§7). One sentence for gate 6: **the price of
saying no should not be the only currency a broke player has already spent.**
── **10 · DOES THE KNIFE FEEL LIKE A DECISION OR A BUTTON?** ──────────────────────────────
**A decision, and the best thirty seconds in the game — with one caveat that is not about the
input.** What makes it a decision rather than a button, in the order I felt them:
1. **You have to get there.** The carport corner is up a wall; the cleat is 2.8 m the other
way; and the clock is running in weather that shoves you. The verb has a WALK in it.
2. **The trade is printed before you commit**, both halves, in the board's own words, and the
two numbers are genuinely incommensurable ($205 of somebody's property against a bed you
were called out to save). I hesitated with my hand on the key, which is the test.
3. **It is a hold**, so the decision has a length, and a gust can take it off you.
4. **The paperwork admits it.** THE KNIFE on the invoice, in the verdict, in the subtitle —
nowhere does the card pretend the sail came down by itself.
⚠️ **The caveat: the TELL is knowledge, not a gauge.** CB1's bar reads 63% of its effective
704 N at t=35 and the corner is gone at 35.9 — **the amber band lasts about one second.** So a
first-time player cannot react to the HUD; they react to the DISPATCH having told them cb1 is a
shackle on a carport beam. That is defensible (DESIGN.md: "half the puzzle is finding what's
about to fail") and it is worth stating out loud, because it means the emergency teaches by
reading the card, not by watching the bar. 📇 **Filed, one idea, not a request:** the corner bar
could carry rate-of-change on a bracket corner — the one place a second of amber is not enough.
And the honest remaining gap: **there is no cut ANIMATION**, because the knife refuses to write
`busy`. The radial carries it; a `Crank`-family clip driven without touching the busy state is
the fix and it needs interact.js's handshake widened rather than bypassed. Filed for S19.
── **FILED, in priority order** ───────────────────────────────────────────────────────────
1. ⚖️ **John / gate 6: the knife has no price on the shipped emergency** (§6) and **declining
is free at ★0.0** (§7). Both are rulings, both have their numbers above, neither is a bug.
2. 📇 **A:** three of my edits are in your files and every one is `revert on sight` if you
disagree — the `answerableFor`/`rigRecordFor` cut split, `collateralWalk` extracted pure
(the knife's read is injected with it), the two `verdictFor` modes, the subtitle branch, the
refund predicate, THE KNIFE section in hud.js, and the clamped stand-up wording. The
settlement drops `booked`, which is why the invoice says *"nobody was expecting you"* on a
night you took the booked job — **that line is false as it stands** and the fix needs one
field carried onto the settlement, which is yours.
3. 📇 **E/A: site_03 forces an 80 m² sail** and the best steel in the shop fails there (§N4).
4. 📇 **B:** `attach({at, wind})` pre-flies all four corners and `failCorner` runs after, so the
arrived-down corner is not down during those 30 s — you offered to take the broken set into
`attach` and it is now worth it: on the canon rig, `tr1b` being up for the pre-fly is load
the other three did not have to carry. Small, but it is the night's opening state.
5. 📇 **Integrator: hud.js's ticker does not refresh under stepped fast-forward** (it is called
from `frame()`, not `step()`), so `pushEvent` lines are invisible in every stepped playtest —
including "sail cut loose". The verb panel updates inside `player.update` and does not have
this problem. Not a shipped bug; it is a harness blind spot, and it hid the knife's ticker
line from me for an hour.