The letterhead is the point: one business, two documents, same masthead, so
the job sheet and the invoice read as a pair of papers off the same outfit's
printer rather than two game screens. DESIGN.md has opened with "you run a
small landscaping outfit" since day one and it has never been on the glass.
tools/jobsheet/ — paste-ready for Lane A between CUT markers, purely additive
(.card/.row/.ledger untouched), rendered to four PNGs before handover, each
state addressable as ?v=. The ledger already WAS an invoice; it just never
said so. The line worth keeping is .void: a bonus that was on the job sheet
and didn't survive the night, struck through in the same column as the money
that did — a bonus you never watch fail is one you never learn to protect.
Two design calls left as A's with the reasoning beside them, same as the
carport's $180: the business name (proposal: HARD YARDS) and the ABN
(sequential digits on purpose — a plausible one could be a real business's).
bike_kid_01.glb — 1.15 x 0.33 x 0.74 m, 700 tris, lean baked in because a
bike doesn't stand up on its own. Two bugs caught by LOOKING at the render,
neither catchable by the existing suite: a comment claiming a step-through
above a diamond frame, and a fork with negative rake that drew head tube and
fork as one pole through the front wheel. Both passed the Blender verify —
a bounding box can't answer "is this the right shape".
The lean is an export-time axis fact (+Y in Blender is -Z in three.js), so
e.test.js now pins it in browser coords. Proved the assert fails: rebuilt at
lean=0 and Blender still said PASS while the selftest went red.
selftest 299/0/0. 32/32 GLBs byte-identical across three full factory runs.
Answer to A's blocking gate 1 question, by measurement. venturiFactor
aligns on |dot|, so an axis is a line defined mod pi. 2.1 - (-1.08) =
3.1800 vs pi = 3.1416: the two are 2.2 degrees apart, the same gap read
from opposite ends. Measured at the throat through all of storm_03b,
axis 2.1 peaks 33.5061 m/s and axis -1.08 peaks 33.5329 — 0.08% apart,
same gust, same second. Ship 2.1 as it stands.
The error was mine and it is the repo's own lesson again: -1.08 was
dirAt(40), a wind DIRECTION, never a proposed axis. I compared it to a
gap ORIENTATION and called it a conflict. A number gathered from the
wrong harness, fourth time.
Also posted for B: gain 1.35 vs 1.5 measured at the throat (30.16 vs
33.51 m/s peak), the standing offer to drop it if no $80 line survives,
and the note that the throat sits on the carport — the gain is nearly a
dial on how hard the trap bites. And an honest accounting of which half
of my new assert can actually fail.
Records the venturi gap coordinates for C, the needsLadder mechanism-key for D,
the honest-quad geometry for B's audit, and the one Lane B API the site switch
still needs — rigging.setWorld(world) to re-point the clickable markers, already
called guarded from loadSiteInto.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Load goes as wind^2 but the funnel only fires while aligned, so gain 1.35 adds
+40% not +82% — a small quad in the throat peaks 1.99 kN, above a carabiner
(1.2) and under a shackle (3.2). The funnel punishes the cheap corner
specifically without being unwinnable: the corner block teaching itself.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Night 3 = corner block + storm_03b is the right pairing (the funnel teaches the
southerly, 03b is the southerly). Its post-change wind blows toward -1.08 rad,
so that's the venturi axis. Gave A/E the ready template needing only the two gap
coordinates, and flagged B that the venturi is a balance lever their site_audit
must include (gain is mine to tune to their sweep).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The carport anchors have said collateral="carport" since Sprint 9, but the root
carried no collateral_value — so main.js, which reads world.gnome.collateralValue
for the gnome, had no number to reach for. A trap with no price is a warning
label. The root now carries it in the same shape and place, pinned above the
gnome's 25, with the proposed 180 and its reasoning as a named constant so Lane A
can argue with the number rather than the asset.
carport_01_wrecked is the payoff, on the intact one's origin for a mesh-for-mesh
swap: the pads stay (they were never the weak part), the frame racks over like a
parallelogram, the roof peels off downwind in one piece.
Two bugs found by measuring rather than reasoning, both now comments where the
numbers are: the beams were rotated when a beam spans the axis the frame racks
in, so it rides level — tilting it made the wreck taller than the carport; and
the roof sheets dipped below ground, which is what inflated the height. Asserts
now pin the wreck shorter than its twin and sitting on the grass.
291/0/0, Lane E 64 asserts, 40/40 output files byte-identical.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
carport_01 is site_02's dressing and its whole design. DESIGN.md wants the
corner block anchor-poor, and the interesting way to build that isn't to give
the yard nothing — an empty yard is just a smaller yard. It's to give it
something that looks like four free anchors and isn't. Light posts on small
pads, a beam sized for one sheet of roofing: tie 25 m2 to it in a southerly and
you take the carport, not the shackle. Ships with the worst ratings in the game
(beam 0.22 vs the fascia's 0.35) and collateral="carport", pinned in e.test.js
below the fascia with the reason attached, so nobody quietly fixes them upward
and turns the site back into a small yard.
The pyrrhic card is the third outcome on the same camera: dawn, bed green, gnome
standing, sail post down across the yard behind him. Warm light on purpose — a
pyrrhic result is a win, and the wreckage is the price, not the verdict. Copy
goes to Lane A in THREADS; cardpreview renders all three.
277/0/0, Lane E 60 asserts, 39/39 output files byte-identical.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
$80 win re-verified on rebased main (porous + 0.40, hp 52, 1 lost). Not
flipping 0.40 until B's fabric is selectable — the win needs porous cloth.
Handed A the site-JSON venturi shape to wire from their extraction.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Both yes, with reasons: the 25%-cover squeak-win is decision 13 paying off
rather than a loophole, and the repair becomes the margin instead of a toll —
SPRINT6's "the line must need the repair" is retired, since enforcing it means
tuning so the best rig always breaks. C gets the go on 0.40, paired with B's
fabric per SPRINT9 decision 2.
Also logs the ninth harness artifact: read 274/0/0 off another session's tree
because my server died on a bound port. The pass count not moving when I added
two asserts was the tell.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Swept all 299 bed-covering quads settled: only p1,p2,p3,p4 is holdable, wins
outright ($90 today). Porous shade cloth + downdraft 0.40 drop p1 under the
carabiner tier → the same win at exactly $80. Both levers needed; neither moves
a tier alone. Not flipping 0.40 unilaterally (B's balance pen, needs fabric
wired first) — offered it. Flagged two design calls (25% thin-cover win, wins
without a repair) for A+B.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
grass_atlas.png binned (six sprints, zero refs, Lane E's own recommendation).
Screenshot POST declined — yardshot works standalone, so it buys convenience not
capability. Saying no rather than carrying either an eighth sprint.
Also records the two economy questions the harness can't settle, and the reason
to distrust my own curve: the bad-player model returned fixed gear value
regardless of spend.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Live game and suite now agree (hp 58/57, 2 lost). A's number was right,
their corner count was the miscount, and my phase-contamination
hypothesis was wrong. None of the three candidates flips it because
holding all four corners costs $105 on an $80 budget. Hands A the
pyrrhic-win call with a recommendation, and records why D's settle guard
had to be a trend test (the cloth breathes and never converges).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The lane's brief is "whatever the week's cards need, nothing else", and it's
blocked on the week — so the useful answer to "what do they need" was the wiring
A would otherwise write at the end of a long sprint.
tools/cardpreview/index.html renders both end screens from the JPEGs already on
disk with the drafted copy: headline, sub, kicker, tally, button. The CSS sits
between CUT markers to paste into hud.js, and the COPY object swaps out for a
real week tally. Both screens were screenshotted before handing over, so it's a
tested snippet rather than a hopeful one.
The left scrim only deepens the third the art was already framed to leave empty,
so the yard stays visible behind the score, and the win headline is warm against
the loss's flat white — the diptych should tell you which you got before you
read a word.
No assets touched; Lane E is 57/57 green on merged main.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
hp 36 -> 59 through the suite (A's 58 reproduced). Corner count (2 vs 1)
is the last open variable; the assert stays red as the true state.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Third harness agrees with the suite (2 lost); the two breaks are independent
(t=15.3, t=58.9), so no repair reaches 1-lost; debris makes zero difference
(A's inversion thread crossed off). Delta is in main.js's rigSail/tension path.
Plus hailBlockFor delivered to B with the wiring formula and the rain-weight
ruling (don't raise it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
B asked for the rigSail/RiggingSession check and said to say so if it matched.
It matches: their hypothesis is refuted, A scored the rig they bought. Kept
digging and found the actual cause, measured with one variable on fresh pages:
0s settle -> 2/4 intact, t2 peak 4.54 kN (what fly() measures)
12s settle -> 3/4 intact, t2 peak 1.71 kN (what a human gets)
A plays through prep so the yard reaches steady state; fly() rigs and advances
in the same tick, so the storm lands on trees still at rest. The corners that
spike are t2/t2b — both tree anchors — while the posts load LESS, so the
transient is mostly tree-sway, not cloth. It also explains B's four identical
tensions: the transient swamps tension, which settled is worth 2.75x.
Not landing a fix — gate 0 is A+B's pen. Also answering A's testkit call: Lane
D's suite has no async tests and no skips, and I proved the new guard fails
before trusting it to pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Each limb was one straight uniform tube — a peg poking out of a pole, and the
most visible art problem in docs/yard_day.jpg. They now leave the trunk thick,
sweep up on a bezier and taper to nothing, which is what a gum does. +96 tris on
gum_01, silhouette bounds unchanged.
Nothing physical moved. The tip is a bezier endpoint and the four rng draws per
branch are the same four in the same order, so every branch_anchor_* is
bit-for-bit where it was — verified before and after, all five identical to 6dp.
Lane A's winning line rigs off t2 and is untouched; no balance number can shift.
e.test.js now hard-codes those five world positions as a tripwire, so no future
art change of mine can quietly invalidate a sprint of someone else's physics. If
it goes red, the art moved an anchor — fix the art, not the numbers.
Card text and the dawn-tint treatment go to Lane A in THREADS. The tint is a CSS
snippet rather than a ninth texture: only two of my eight are consumed, and a
full-screen gradient needs no asset at all.
Selftest 262/0/0, 38/38 output files byte-identical.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Names the cause (camera-less skyfx zeroing the hail shadow), my own error (a win
reported without its tension), what remains open (the corners half, with the next
two suspects), and the testkit find that let the dispute survive a merge — skips
recorded as passes, including two of my own router tests that have asserted
nothing for two sprints.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rules out shelter, tension, drain wiring, yard drift and sway by
measurement; the cause is arithmetic (t2 peaks 4.4-4.9 kN vs a 3.2 kN
shackle, and hp=36 is the bare-bed constant). Hands A a one-line check for
the suspected phase-boundary artifact, and specifies the cheap
peak-load-per-quad filter that either finds a winnable line or proves the
yard needs another anchor.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>