feat: rule Q58 and close Q57; §4 lists all six areas; docs/03's checklist cites §4 instead of restating it
Build and deploy / build-and-deploy (push) Failing after 4s

Four rulings from Pouya, plus what implementing them turned up.

Q58 — RULED, and he attributed the ambiguity to his own document: "3.5 was meant
as the TOTAL time committed, of which 2 is preparation — leaving 1.5 hours in the
room. Your arithmetic caught it: if prep sat inside, 3.5 and 7 wouldn't be
exactly 2x, because preparation doesn't scale with session length." The card now
reads: half day up to 3 hours of session, fee includes up to 2 hours of
preparation, $2,000; full day up to 6 hours, up to 3 hours of preparation,
$4,000. docs/07's own research table corroborates 3 and 6 — Patey and Zuber both
publish those hours, and ADR Chambers' roster rate counts preparation separately
from "up to three hours of mediation". One provenance note under R14: he recalled
"all or part of 3 hours" as their wording; the committed extract carries the
hours but not the phrase, so docs/07 cites the hours and attributes the phrase to
nobody.

Two things fell out of the ruling that the instruction did not name, and both
were defects. docs/07 §All parameters confirmed was itself prescribing the flat
"including 2 hours of preparation" — the sentence /for-parties/ was built
against, so the spec was generating the defect. And the cap had to reach the
copy: "including up to 2 hours". FEES.mediation.*.hours is corrected 3.5 -> 3 and
7 -> 6; it had no consumer in src/ while the question was open, which is the only
reason no page was ever wrong. /fees/ is unblocked for step 9 on the question Q58
asked.

Q57 — CLOSED with no seventh undertaking. "A reader assumes the outcome, and the
obvious undertaking adds nothing a reader doesn't already infer." The TODO(pouya)
is replaced by the ruling where the question was; src/ now carries zero live
TODO(pouya) markers.

§4's mediation row lists all six published areas. Q56's ruling had named five,
which was four areas plus the word "commercial" — a scope descriptor, not a
seventh area. The hedge is struck on his instruction; the clause saying the six
are not the authorised subject-matter list is restored, because his ruling
supplied a correct value and did not close Q35(c)'s class. Split-stamped.

docs/03's compliance checklist now names what to look for on a page and which §4
row decides it, never the bar's own wording. 12 items before, 12 after — a
structural fix, not a coverage change.

Thirteen review findings across two rounds, all applied, none declined. Three
were mine to own. The capped-form rule was written and then applied to one
surface: /mediation/ shipped an uncapped form in words no barred-string grep
could reach, site.ts quoted a docs/07 sentence Q58 had just deleted, and §9's
Q15/Q16/Q17 row prescribed the flat form — which is what a later implementer
building /fees/ reads. A derived fee term was asserted as applied fact in the
document that is the authority on money: "overtime begins after 3 h and 6 h" is
in no ruling. Struck, and opened as Q59.

And round 2 caught the arithmetic in round 1's own fix. The full-day route is
flat $4,000 until hour 6, so generalising it as 500n+1000 for all n>=3 was valid
only from 6 h, and "cheaper by $500 at every length" was wrong across the whole
3-6 h band. The real spread is $2,000 at three hours narrowing to $500 from six
on — up to four times larger, and largest exactly where a half-day booking
overruns. Written into docs/07 §Recorded dissent and §12's R5 row, which is where
the 12-month fee review will read it. Round 1's fix for the missing consequence
also published the overtime rate on a page that now states an unambiguous cap,
defining the trigger by adjacency with no other quantity for it to attach to; the
rate came off the page.

R11 at the step 6 -> 7 boundary: 13 of 14 pins current. §7's TypeScript hold
named one gate and there are two — typescript-eslint requires <6.1.0, tighter
than @astrojs/check, so the recorded removal trigger was unreachable. Both are
now named.

Verified: check 0 errors, lint 0, build 0 (14 pages), check:claims 0, npm audit
0, minifier tripwire clean, zero JS shipped, all copy present with JavaScript
disabled. Lighthouse not run — tool unavailable until step 7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
Pouya Lajevardi
2026-08-31 08:17:59 -04:00
co-authored by Claude Opus 5
parent 13b97841b9
commit 6cfe69033f
9 changed files with 594 additions and 132 deletions
+18 -8
View File
@@ -253,14 +253,24 @@ anything you pass as flags, and re-check any result whose shape is "uniformly
bad".
**And re-check "uniformly GOOD" too — that is the dangerous half.** *Added
2026-08-30.* The same `set -- $pair` loop recurred while confirming nine restored
files matched a saved copy, and this time it printed **`same` on all nine**:
`shasum` was handed both filenames as one argument, errored, and left both
variables empty, so `"" = ""` passed. **The `DIFFER` version announces itself
because it is alarming; a false pass is the answer you wanted and it ends the
check.** A comparison must **assert that both things it compares exist** before
comparing them, and `git grep` silently misses untracked files — so a clean sweep
across new work means nothing until the files are staged.
2026-08-30; sharpened on Pouya's instruction 2026-08-31, as "the sharpest
instrument finding yet".* The same `set -- $pair` loop recurred while confirming
nine restored files matched a saved copy, and this time it printed **`same` on
all nine**: `shasum` was handed both filenames as one argument, errored, and left
both variables empty, so `"" = ""` passed.
**The distinguishing property, and it is the whole rule: a broken verification
that fails loudly is safe; one that passes uniformly is not.** `DIFFER` on every
row announces itself — it is alarming, so it starts an investigation, and the
investigation finds the broken loop. A uniform pass is **the result you were
hoping for, so it ends the check** instead of starting one. The two failures come
from the identical bug and only one of them is survivable.
So a comparison must **assert that both things it compares exist** before
comparing them — that is the assertion the shell loop skipped, and it is what
turns this class of bug back into the loud kind. Note the same hole in `git grep`:
it silently misses untracked files, so a clean sweep across new work means
nothing until the files are staged.
**A parent cannot style a child component's root element.** Astro does not pass
a parent's scope attribute down, so `<Button class="header-cta" />` compiles the