HardYards/tools
type-two 1bcfcdad67 Lane B S17 gates 0.3 + 2: the card names its cloth, the session speaks for the client
GATE 0.3 — THE CHARTER, SAID OUT LOUD (D's soaker finding, A consulted on
wording and their every-card rule adopted). The audit always flew shade cloth
and never said so; on the soaker that silence read 'WINNABLE over an all-DEAD
garden — the night is broken'. Now: AUDIT.POROSITY is the one charter knob
(sweep.js + gardenfly.js both read it), scorecard.fabricCharter() names the
fabric and whether tonight's stones pass its weave (same hailBlockFor the sim
charges), and the SCORE IT header prints 'fabric · shade cloth (sweep
charter)' on EVERY card — plus, on leaky-storm nights, A's wording: the
fabric is the bet, and the audit does not place it.

GATE 2 — CLIENT CONSTRAINTS: A's shapes (seam contract, built against as
posted), this lane's teeth.
· rigging.js: validateNightConstraint (checked enum, both ends of the seam),
  setConstraints (survives reset like _startBudget; [] is the only clear).
  The house ban refuses the pick with the CLIENT'S WORDS as the ticker
  reason; the cap refuses at SPEND time on every path (rig / cycle / set /
  spares / fabric), exact at the boundary, refunds always free — and commit
  is belt-and-braces: a caller who walked around the doors gets a THROW.
  The cap covers the whole invoice, spares included — the client queries the
  invoice, not the hardware line.
· sweep.js: applyNightConstraints, ONE function both drivers share — bans
  shrink the candidate list (a card that recommends a forbidden line is the
  card lying), the cap re-prices affordable/clean without touching a load.
· scoreSite carries constraints/budget/constrainedOut; the card prints the
  client's terms next to funnel and fabric, and tells 'no geometry' from
  'client forbids all of it'.
· spent getter now measures against _startBudget (the re-banked session was
  measuring spend against the default bank).

Selftest 485/0/0 in the browser (474 + exactly the 11 added: 1 sail, 4
session, 2 charter, 4 audit-constraints). Wiring line for A filed in THREADS:
session.setConstraints(week.job?.constraints ?? []) at the night boundary.
2026-07-21 02:45:49 +10:00
..
assetcheck assetcheck/look.html: the verify that answers "is this the right shape" 2026-07-18 16:01:39 +10:00
blender Lane E S16 gate 5: the next temptations — glasshouse (collateral apex, $320, wreck empties not falls), pool kit (14 fence posts, 14 explicit tie_off denials, unpriced by the bike ruling), pergola (the 0.65 middle rung D endorsed, $120, partial-failure wreck). Shared-helper wrecks, deterministic (2 runs, 44 files shasum-identical, zero churn on the 31 existing GLBs); manifest gains exactly the pergola entry 2026-07-20 20:21:38 +10:00
cardpreview Add carport_01 for site_02, and the pyrrhic end card 2026-07-17 14:29:08 +10:00
character Lane E, Sprint 13: no wind clip — the pipeline can't supply one, and the lean was never a clip 2026-07-18 00:45:22 +10:00
fabric_bet Lane C S16: storm_06_soaker — the pea-hail soaker, measured over both yards; fabric_bet probe; gardenfly porosity opt 2026-07-20 20:06:12 +10:00
garden_bench Lane C S13 correction: the bench flew site_02 funnel-OFF and tree-FROZEN; wild-night headline dies 2026-07-18 13:08:21 +10:00
jobsheet Lane E, Sprint 11: client juice — job sheet, invoice, and the kid's bike 2026-07-17 17:39:58 +10:00
site_audit Lane B S17 gates 0.3 + 2: the card names its cloth, the session speaks for the client 2026-07-21 02:45:49 +10:00
storm_envelope storm_envelope: the wind side of the failure envelope, per anchor (gate 2.4) 2026-07-17 20:10:17 +10:00
yardshot Add hail juice, plant shred, and a way to screenshot the game 2026-07-17 03:03:54 +10:00
deploy_hardyards.sh Add deploy_hardyards.sh: partly.party deploy per the games-VPS pattern 2026-07-17 21:39:09 +10:00