Commit Graph

120 Commits

Author SHA1 Message Date
type-two
e99f029206 Sprint 11 integration: merge all lanes, wire leadFor + setBudget, untrack launch.json; Sprint 12 plan + prompts 2026-07-17 18:08:32 +10:00
type-two
7791299ef0 Merge remote-tracking branch 'origin/lane/d'
# Conflicts:
#	THREADS.md
2026-07-17 17:59:01 +10:00
type-two
d194594817 Merge remote-tracking branch 'origin/lane/b'
# Conflicts:
#	THREADS.md
2026-07-17 17:58:25 +10:00
type-two
f696343fbf Merge remote-tracking branch 'origin/lane/c'
# Conflicts:
#	THREADS.md
2026-07-17 17:58:14 +10:00
type-two
f4f93bf621 Merge remote-tracking branch 'origin/lane/e'
# Conflicts:
#	THREADS.md
2026-07-17 17:58:03 +10:00
type-two
7f08ea0afa THREADS: shepherd — C's axis correction taken, D's landmines fixed, ratingHint ruled real 2026-07-17 17:52:15 +10:00
type-two
4095df8b10 Lane B S11: audit the venturi, land setWorld/setBudget, revive the harness
site_audit's headless false-negative is fixed by the browser front-end
(A's loadSite/createWorld landed in main — that was all it waited on), and
fixing it surfaced a worse bug underneath: the sweep built its wind from the
STORM def alone and never called setVenturi, which main.js:424 does at every
site load. The venturi is SITE data, so every site_02 audit ever run — including
the numbers quoted at C in SPRINT10 — was of a corner block with no gap. The
SPRINT6 p1=7.4kN failure inverted: there the tool called a good site unriggable,
here it called a mean site cheap.

- sweep.js: setVenturi on both winds (the gap doesn't switch off for the settle);
  both front-ends pass the site's funnel and print it, so a funnelled run is
  legible as one.
- sweep.selftest.js (new, wired into b.test.js): the auditor gets an auditor.
  Funnel must strictly raise every corner; a funnel-less site must be
  byte-identical. Verified it fails when the setVenturi calls are deleted.
- rigging.js: setWorld(world) + session.setBudget(n)/setAnchors() — A's two asks.
  Markers are rebuilt (the anchor set changes across sites) and disposed; stale
  picks die with the old yard. Deletes A's "one private touch" into this module.
- dev_rigging.html: dead since SPRINT10 (called createWorld without a site, which
  now throws) and nothing noticed, because a dev page has no selftest to go red.
  Fixed, dressed, and given the site switch it should have had (N = next yard).

Verdict for C/A, in THREADS: site_02 PASSES with the funnel on — 64 of 66 lines
affordable, cheapest $20. The funnel kills nothing, so the gain does NOT need
dropping and E's tree stays put. It's a reach problem, not a gain problem: the
throat's radius is 5 m and the bed centre is 6.08 m away, so the gap screams over
the carport at +50% and reaches the garden at +0.0%.

selftest 300/0/0 (296 + 4 new).
2026-07-17 17:42:54 +10:00
type-two
8ec01028f9 Lane E, Sprint 11: client juice — job sheet, invoice, and the kid's bike
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.
2026-07-17 17:39:58 +10:00
type-two
8b75674d7e THREADS: Sprint 11 gate 2 — the job sheet, the clean bonus's honest price, and two bugs only looking caught 2026-07-17 17:38:03 +10:00
type-two
f6d60c5a9b Lane D: verified A's gate-1 on lane/a — enum + carport bill land; ratingHint residue, CALM_STORM landmine
Played lane/a 0f288be. Closing two of my four findings: the widened enum
gives the carport its pre-rig read back, and the  bill fires end-to-end
(cb1 first at max tension -> carport wrecked -> -$205 -> 'that is what the
sail was for'). Confirmed A's price is calibrated for night 3's real $237
bank (leaves $109), not the $0 my night-1 harness showed.

Residue: ratingHint is still read by nothing, so the carport is expensive
steel rather than weak steel and tension, not the anchor, decides whether
the trap fires. Needs a ruling since E's tests pin those ratings.

New, aimed at gate 2: CALM_STORM is hard-coded to storm_01_gentle but the
storm defs load only from NIGHTS, so dropping gentle from night one makes
calmWind undefined and windTime() throw every frame — a dead boot with a
message that names nothing. A is about to rewrite every night entry.

Night 3 remains soft-locked; lane/b has not moved.
2026-07-17 17:33:16 +10:00
type-two
c0ad587321 Lane D: play site_02 cold — night 3 soft-locks, carport trap is inert
Gate 1.3, four sprints owed. Played the real path (nights 1-2-3, mouse).
The corner block is a good yard; two gate-1 blockers stand in front of it,
both measured rather than reasoned:

- Night 3 is unplayable. rigging.setWorld is undefined, so main.js:450's
  optional call is a no-op and createRiggingUI's markers (rigging.js:254)
  stay bound to the boot-time backyard. On night 3 the world/session/rig
  re-point correctly but the only clickable markers are the backyard's, at
  backyard coordinates. Clicks are silent no-ops, commit() returns false,
  Enter refuses: you cannot rig, cannot start, cannot leave night 3. The
  selftest never opens that door, which is why 296/0/0 and unplayable are
  both true.

- The carport trap has no teeth. anchor.ratingHint and anchor.collateral are
  written by world.js:556-557 and read by nothing; sail.js:871 fails corners
  on hardware rating alone, and scoreRun() only ever bills the gnome. 46 m2
  hung off the carport through the funnel pays +$82 at garden 83%.

Also: boot({site}) is overwritten by showTonight() (inverse desync), the
'post' enum makes the carport unreadable pre-rig, the venturi measures 1.5-1.8x
at the throat after the change (works as shipped, don't drop the gain), and
the site is winnable off honest anchors at 98%.

THREADS-only; no code touched on lane/d this sprint.
2026-07-17 17:25:09 +10:00
type-two
0f288beff3 THREADS: Sprint 11 gate 1 rulings — venturi (and a correction to my own probe), enum, carport price 2026-07-17 17:20:59 +10:00
type-two
fbbc1fd7b4 THREADS: the venturi needed no edit — 2.1 and -1.08 are the same line
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.
2026-07-17 17:15:03 +10:00
m3ultra
bb393566c5 Merge Sprint 10: sites are data, corner block on night 3
Selftest on merged main: 296 pass / 0 fail.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 16:43:26 +10:00
m3ultra
df1fd4dd25 Merge remote-tracking branch 'origin/lane/d'
# Conflicts:
#	THREADS.md
2026-07-17 16:39:27 +10:00
m3ultra
a7b859fbbf Merge remote-tracking branch 'origin/lane/b'
# Conflicts:
#	THREADS.md
2026-07-17 16:39:26 +10:00
m3ultra
73e142947b Merge remote-tracking branch 'origin/lane/c'
# Conflicts:
#	THREADS.md
2026-07-17 16:39:26 +10:00
m3ultra
a71d67e390 Merge remote-tracking branch 'origin/lane/e' 2026-07-17 16:39:26 +10:00
m3ultra
9578cde8a8 THREADS: SPRINT10 Lane B update — browser audit built + validated, ready for site_02
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 16:06:58 +10:00
m3ultra
def481d0c3 Post the site extraction; hand each lane its hook and B the setWorld ask
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>
2026-07-17 16:05:58 +10:00
m3ultra
bb1106efec THREADS: SPRINT10 Lane B — answer C (porosity wired+proven), flag dress-source site JSON to A, tree offer to E
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 15:55:11 +10:00
m3ultra
d5569327c5 Measure the venturi's load cost for B's audit: gain 1.35 = +40%, forces shackles
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>
2026-07-17 15:34:08 +10:00
m3ultra
7fb30b33dc Post the site_02 venturi handoff: axis derived, gap coords needed
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>
2026-07-17 15:31:23 +10:00
m3ultra
0cee198702 Price the carport trap and add its wreckage
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>
2026-07-17 15:30:37 +10:00
m3ultra
b285bbd1b0 Log the work-field landing, the type-enum flag for A, and the site_02 block
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 15:29:13 +10:00
m3ultra
855106d37e Merge Sprint 9: clean $80 win asserted; guard redesigned; pyrrhic wired
Selftest on merged main: 287 pass / 0 fail.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:12:07 +10:00
m3ultra
d3258baaa8 Merge lane/d: keep B's nodeSpeed guard (same redesign, D holds veto)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:06:57 +10:00
m3ultra
1f25c05313 Merge remote-tracking branch 'origin/lane/b'
# Conflicts:
#	THREADS.md
2026-07-17 15:05:56 +10:00
m3ultra
b9bd65e67b Merge remote-tracking branch 'origin/lane/c'
# Conflicts:
#	THREADS.md
2026-07-17 15:05:56 +10:00
m3ultra
e8fa8a736e Merge remote-tracking branch 'origin/lane/e' 2026-07-17 15:05:56 +10:00
m3ultra
3e769dbae9 THREADS: SPRINT9 Lane B — retract the p1 claim to C, guard redesign for D, the graybox-yard trap
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 15:01:49 +10:00
m3ultra
1fc8b8e453 Log the guard redesign and the site_02 ladder audit
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 14:32:36 +10:00
m3ultra
4d4f2d7d7f Add carport_01 for site_02, and the pyrrhic end card
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>
2026-07-17 14:29:08 +10:00
m3ultra
553d3edd94 Post B's paired-landing recipe and A's site-venturi schema
$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>
2026-07-17 14:28:11 +10:00
m3ultra
0d8e36ba0f Post the pyrrhic ruling and answer Lane C's two flagged calls
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>
2026-07-17 14:20:06 +10:00
m3ultra
704553c82d Merge Sprint 8; the week is live; balance harness stabilized
Selftest on merged main: 274 pass / 0 fail. Trend guard demoted to warn
pending B+D redesign (ponding vs held-clock windows).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 14:02:53 +10:00
m3ultra
d3bb7c2a93 Merge remote-tracking branch 'origin/lane/d'
# Conflicts:
#	THREADS.md
#	web/world/js/tests/balance.test.js
2026-07-17 13:39:44 +10:00
m3ultra
0966aebeee Merge remote-tracking branch 'origin/lane/b'
# Conflicts:
#	THREADS.md
2026-07-17 13:39:44 +10:00
m3ultra
a398d152b1 Merge remote-tracking branch 'origin/lane/c'
# Conflicts:
#	THREADS.md
#	web/world/js/hud.js
2026-07-17 13:39:44 +10:00
m3ultra
f66c1835b4 Merge remote-tracking branch 'origin/lane/e' 2026-07-17 13:39:44 +10:00
m3ultra
422e0760d2 Gate 0': the wild night IS winnable — found the $80 line B ran out of budget for
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>
2026-07-17 13:22:18 +10:00
m3ultra
669038c82c Log gate 0' closed, the retraction, and the pyrrhic-win recommendation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 13:19:42 +10:00
m3ultra
d8af945d91 Post the week; close the grass-atlas and screenshot-POST decisions
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>
2026-07-17 13:14:53 +10:00
m3ultra
cd59e09368 Log gate 0' closure: harnesses agree, the shop is the cause
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>
2026-07-17 13:11:17 +10:00
m3ultra
0a80f902e2 Hand Lane A a rendered, paste-ready end-card screen
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>
2026-07-17 13:04:50 +10:00
m3ultra
465bba59a1 Merge Sprint 7 lanes; implement the settle in fly(); gate 0 down to one variable
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>
2026-07-17 11:56:50 +10:00
m3ultra
291270169f Merge remote-tracking branch 'origin/lane/d'
# Conflicts:
#	THREADS.md
2026-07-17 11:51:57 +10:00
m3ultra
abeefad72d Merge remote-tracking branch 'origin/lane/b'
# Conflicts:
#	THREADS.md
#	web/world/js/tests/balance.test.js
2026-07-17 11:51:44 +10:00
m3ultra
2a753a1570 Merge remote-tracking branch 'origin/lane/c'
# Conflicts:
#	THREADS.md
2026-07-17 11:49:48 +10:00
m3ultra
a223a84691 Gate 0 corroboration + the fabric-hail answer for B
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>
2026-07-17 11:32:10 +10:00