HardYards/tools/site_audit
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
..
audit.html editor: one storm picker + a progress line that paints (S15 gates 2.1/2.2, B's halves) 2026-07-20 18:19:44 +10:00
audit.mjs Lane B S13: THE AUDIT REWRITE — the audit predicts the garden, on C's corrected picture 2026-07-18 13:50:15 +10:00
garden_probe.html Lane B S13: THE AUDIT REWRITE — the audit predicts the garden, on C's corrected picture 2026-07-18 13:50:15 +10:00
gardenfly.js 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
gardenfly.selftest.js Lane B S16: gate 2.3 — separation pins ATTEMPTED and honestly REFUSED, with receipts 2026-07-20 20:32:37 +10:00
scorecard.js 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
scorecard.selftest.js 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
sweep.js 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
sweep.selftest.js Lane B S13: THE AUDIT REWRITE — the audit predicts the garden, on C's corrected picture 2026-07-18 13:50:15 +10:00