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
+17 -18
View File
@@ -481,20 +481,19 @@ export const FEES = {
currency: 'CAD',
taxNote: 'All fees are plus HST.',
mediation: {
/** Prep is bundled AND stated IN HOURS on the page — [verified 2026-08-26].
* `docs/07`: *"'including 2 hours of preparation'… Do not quietly fold it
* into the hours figure."* The allowance is CAPPED, so the unqualified
* "preparation included" sells an uncapped one. `/for-parties/` shipped
* that form for one pass and `prepIncluded` had no consumer anywhere.
/**
* TWO SEPARATE ALLOWANCES, AND BOTH PUBLISH AS A CAP — Q58, 2026-08-31.
* `hours` is the **session**; `prepIncluded` is preparation, bundled but
* capped. `docs/07` requires each published as a cap and with its noun:
* *"up to 3 hours of session"*, *"including up to 2 hours of preparation"*.
* A flat "including 2 hours" sells an entitlement and a bare "preparation
* included" sells an uncapped allowance.
*
* ⚠️ `hours` IS NOT DOCUMENTED AS THE LENGTH OF THE DAY — §9 Q58, OPEN.
* `docs/07`'s card reads "Half day — up to 3.5 h, INCLUDING 2 h
* preparation", which makes 3.5 the billed envelope and the room time
* 1.5 h. Against that: 3.5 and 7 are exactly 2×, which they would not be
* if prep sat inside them. One of the two is wrong. **Do not publish this
* number as a duration until Q58 is answered.** */
halfDay: { amount: 2000, hours: 3.5, prepIncluded: 2 },
fullDay: { amount: 4000, hours: 7, prepIncluded: 3 },
* ⚠️ WHERE OVERTIME STARTS IS NOT SETTLED — §9 Q59, OPEN. `overtimePerHour`
* may be published; the trigger may not.
*/
halfDay: { amount: 2000, hours: 3, prepIncluded: 2 },
fullDay: { amount: 4000, hours: 6, prepIncluded: 3 },
additionalParty: 500, // each party beyond two
overtimePerHour: 500, // [verified 2026-08-26]
},
@@ -763,11 +762,11 @@ export type _DesignationRowParity = _AssertTrue<
* "Binding conclusion" alone would read as though a mediation binds, which it
* does not until the parties sign.
*
* NO FEE CLAIM IN ANY BODY. `docs/07` bundles a CAPPED preparation allowance
* (2 h in the half day, 3 h in the full day) and says in terms that it "must be
* stated on the page... Do not quietly fold it into the hours figure." A
* five-word strip cannot state it properly, and stating it improperly
* misdescribes money. `/fees/` at step 9.
* NO FEE CLAIM IN ANY BODY. `docs/07` §All parameters confirmed requires the
* bundled preparation allowance published **in hours and as a cap**, and a
* five-word strip cannot do that. Stating it improperly misdescribes money.
* `/fees/` at step 9. (Cited, not quoted — the quotation that stood here went
* stale when Q58 corrected the section it came from.)
*/
export const PROCESS = [
{
+17 -20
View File
@@ -28,25 +28,22 @@
* page genuinely is Q&A" — so a question cannot reach the structured data
* without appearing on the page, and the two cannot drift.
*
* ⚠️ THE FEE FIGURES ARE INTERPOLATED FROM `FEES`, NOT TYPED. D14's card is one
* source; a second hand-typed copy on the page a party reads is the copy that
* goes stale, and it goes stale silently.
* ⚠️ EVERY FEE FIGURE AND EVERY DURATION IS INTERPOLATED FROM `FEES`, NEVER
* TYPED — a second hand-typed copy on the page a party reads is the one that
* goes stale, silently. The two allowances are different things: `hours` is the
* session, `prepIncluded` is preparation, and `docs/07` requires each published
* as a cap with its own noun. **The unit here is "hours of mediation", not
* "of session"** — `docs/01` bars jargon on this page and this page defines its
* other term of art; the plainer noun is ADR Chambers' own, quoted in `docs/07`.
*
* ⚠️ AND THE BUNDLED PREPARATION IS STATED IN HOURS, NEVER AS "PREPARATION
* INCLUDED". `docs/07` §All parameters confirmed is explicit: *"Preparation time
* is bundled and MUST be stated on the page — 'including 2 hours of
* preparation'… Do not quietly fold it into the hours figure."* The allowance is
* CAPPED, so the unqualified form sells an uncapped one. This page shipped
* "with preparation included" for one pass; `adversarial-reviewer` found it, and
* `prepIncluded` had been declared in `site.ts` with no consumer anywhere.
*
* ⚠️ AND THIS PAGE DOES NOT STATE HOW LONG A MEDIATION DAY IS — see §9 Q58.
* `docs/07`'s card reads *"Half day — up to 3.5 h, INCLUDING 2 h preparation"*,
* which makes 3.5 the billed envelope and the room time 1.5 h. `FEES.mediation
* .halfDay.hours` documents neither reading. A draft answered "what happens on
* the day" with "about 3.5 hours", which is the envelope presented as the day,
* to the reader least able to check it. Do not restore a duration here until
* Q58 is answered.
* ⚠️ AND NO OVERTIME FIGURE ON THIS PAGE UNTIL §9 Q59 IS ANSWERED. The rate is
* publishable (D14, `docs/07` — **not** §4, which has no row reaching the rate
* card). **The point at which overtime STARTS is not settled**, and $500 an hour
* printed two answers below an unambiguous "up to 3 hours" defines it by
* adjacency: there is no other quantity on the page for it to attach to. Under
* the envelope reading a fourth hour carries nothing, so the inference
* over-states a party's own exposure — and it also travels alone into the
* `FAQPage` node. So the charge is named without its rate or its trigger.
*/
import BaseLayout from '../layouts/BaseLayout.astro';
import Button from '../components/Button.astro';
@@ -88,7 +85,7 @@ const FAQ = [
},
{
q: 'What happens on the day?',
a: 'I usually start with everyone in one room. After that the parties often sit separately and I move between them. Some matters run that way from the beginning, with the parties never in the same room. You book either a half day or a full day, and which one you need is settled before the date is fixed.',
a: `I usually start with everyone in one room. After that the parties often sit separately and I move between them. Some matters run that way from the beginning, with the parties never in the same room. You book either a half day or a full day. A half day is up to ${FEES.mediation.halfDay.hours} hours of mediation, a full day up to ${FEES.mediation.fullDay.hours} hours. Which one you need is settled before the date is fixed.`,
},
{
q: 'Does what I say stay private?',
@@ -100,7 +97,7 @@ const FAQ = [
},
{
q: 'What does it cost, and who pays?',
a: `${money(FEES.mediation.halfDay.amount)} for a half day, including ${FEES.mediation.halfDay.prepIncluded} hours of preparation, and ${money(FEES.mediation.fullDay.amount)} for a full day, including ${FEES.mediation.fullDay.prepIncluded} hours. ${FEES.taxNote} ${FEES.terms[0]}`,
a: `${money(FEES.mediation.halfDay.amount)} for a half day, including up to ${FEES.mediation.halfDay.prepIncluded} hours of preparation, and ${money(FEES.mediation.fullDay.amount)} for a full day, including up to ${FEES.mediation.fullDay.prepIncluded} hours of preparation. Each party beyond two is ${money(FEES.mediation.additionalParty)}, and if a mediation runs beyond the time the fee covers there is an hourly charge as well. ${FEES.taxNote} ${FEES.terms[0]}`,
},
{
q: 'What if we do not settle?',
+7 -14
View File
@@ -438,20 +438,13 @@ const graph = homeGraph(new URL(ldImage.src, Astro.site).href);
<a href="/mediation/">Mediation</a>
</h3>
{
/* THE FEE CLAIM IS GONE, and it was wrong on two counts —
`claims-auditor`, 2026-08-27, checked against `docs/07-fees.md`.
"at one published rate" reads as ONE PRICE for half and full day;
D14's card sets TWO ($2,000 half, $4,000 full). And "preparation
time included" was unqualified where `docs/07` bundles a CAPPED
allowance and says in terms: *"must be stated on the page —
'including 2 hours of preparation' ... Do not quietly fold it into
the hours figure. At these rates, saying preparation is included
is the selling point, not a footnote."*
A home card is the wrong place to state it properly, and stating
it improperly misdescribes money. `/mediation/` (step 4) and
`/fees/` (step 9) carry the card. "Published" was also
forward-looking: `/fees/` does not exist yet. */
/* NO FEE CLAIM ON THIS CARD — a constraint, not an omission.
There are two ways to get it wrong in one line and both have
shipped once: "at one published rate" reads as ONE price where
D14's card sets two, and an unqualified "preparation included"
sells an uncapped allowance where `docs/07` caps it at stated
hours. A card this size cannot state either properly.
`/mediation/` and `/fees/` carry the card. */
}
<p class="feature-body">
Sole mediator, Q.Med through ADRIC and ADRIO, with multiple
+7 -3
View File
@@ -21,6 +21,7 @@ import { serviceGraph } from '../data/schema';
import {
CONDUCT_UNDERTAKINGS,
CREDENTIAL_ROW,
FEES,
NEUTRAL_ROLE_LINE,
PRACTICE_AREAS,
} from '../data/site';
@@ -272,9 +273,12 @@ const FORMATS = [
</div>
<div class="prose">
<p>
Half day and full day, with the preparation time bundled into each one
stated rather than folded into the hours. Additional parties, overtime
and the cancellation schedule are on the same page.
Half day and full day, including up to {
FEES.mediation.halfDay.prepIncluded
} hours of preparation in a half day and up to {
FEES.mediation.fullDay.prepIncluded
} in a full day. Additional parties, overtime and the cancellation schedule
are on the rate card.
</p>
</div>
<div class="cta">
+5 -5
View File
@@ -15,7 +15,7 @@
* ⚠️ AND NOTHING ON THIS PAGE MAY ADD A SEVENTH. §4's gate: an undertaking is
* publishable only where Pouya has made it **in terms** — not "would obviously
* agree to", not "follows from the process". That is why §Conflicts says when
* the check happens and what it needs, and then stops. See the TODO below.
* the check happens and what it needs, and then stops — Q57, closed 2026-08-31.
*/
import BaseLayout from '../layouts/BaseLayout.astro';
import Button from '../components/Button.astro';
@@ -94,10 +94,10 @@ const graph = pageGraph(new URL(ldImage.src, Astro.site).href);
{/* ---- 3. Conflicts --------------------------------------------------- */}
{
/* TODO(pouya): what happens when a conflicts check turns something up? Any
sentence naming the outcome is a SEVENTH conduct undertaking, and §4's
gate requires that you have made it in terms — so it is not written here.
AGENTS.md §9 Q57. */
/* THE SECTION STOPS AT WHAT THE CHECK NEEDS, AND THE STOP IS THE ANSWER —
Q57, closed 2026-08-31. A sentence naming the outcome would be a seventh
conduct undertaking, which §4's gate does not permit this repository to
infer. Do not add one. */
}
<section class="section reveal">
<div class="wrap">