diff --git a/THREADS.md b/THREADS.md index b3912bc..d06d7e3 100644 --- a/THREADS.md +++ b/THREADS.md @@ -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 35–42 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.