Files
adr-sml/src/pages/for-parties.astro
T
Pouya LajevardiandClaude Opus 5 6cfe69033f
Build and deploy / build-and-deploy (push) Failing after 4s
feat: rule Q58 and close Q57; §4 lists all six areas; docs/03's checklist cites §4 instead of restating it
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
2026-08-31 08:17:59 -04:00

248 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
/**
* `/for-parties/` — build step 6. Spec: docs/01 §`/for-parties/`, docs/03 §For
* parties. The one page written in the second person, at a grade-9 reading
* level, for a party who may be arriving without counsel.
*
* ⚠️ THIS IS THE PAGE `docs/03` NAMES AS THE PLACE THE BARRED PHRASING FEELS
* MOST NATURAL AND IS MOST WRONG. Two forms are struck and must never come
* back: *"the mediator is not your lawyer"* — which presupposes lawyer status,
* and D13 treats implication as hard as assertion — and *"cannot give you legal
* advice"*, a denial of a capacity §4 records as `[unestablished]` and
* instructs this repository to answer neither way. `NEUTRAL_ROLE_LINE` is the
* ratified pattern: role, then consequence for the reader, no verb of capacity.
* It is rendered, never retyped, and it took three attempts and two audits.
*
* ⚠️ AND THE WORD "LAWYER" DOES NOT APPEAR ON THIS PAGE, DELIBERATELY. §4 bars
* it *used of Pouya*, and every natural use here is about the READER — "do I
* need my own lawyer", "coming without a lawyer". Those are compliant on §4's
* wording and `check:claims` still fails the build on them, because a bare
* `\blawyer\b` cannot tell whose. The gate is not wrong: this is the page
* `docs/03` names as where the barred phrasing is most tempting, and a broad
* pattern is the right shape there. The copy moved instead — "your own legal
* advice", which is `NEUTRAL_ROLE_LINE`'s own wording. Same call, and the same
* direction, as "my client" → "our client" on `/med-arb/`.
*
* ⚠️ THE FAQ ARRAY IS THE ONLY SOURCE. It is rendered visibly AND fed to the
* `FAQPage` node, because docs/04 allows the node here "only where the visible
* page genuinely is Q&A" — so a question cannot reach the structured data
* without appearing on the page, and the two cannot drift.
*
* ⚠️ 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 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';
import ContactBand from '../components/ContactBand.astro';
import Eyebrow from '../components/Eyebrow.astro';
import SectionHeading from '../components/SectionHeading.astro';
import Undertaking from '../components/Undertaking.astro';
import { getImage } from 'astro:assets';
import ogDefault from '../assets/og-portrait.jpg';
import { forPartiesGraph } from '../data/schema';
import { CONDUCT_UNDERTAKINGS, FEES, NEUTRAL_ROLE_LINE } from '../data/site';
const ldImage = await getImage({
src: ogDefault,
format: 'jpeg',
width: 1200,
height: 630,
});
const money = (amount: number) =>
new Intl.NumberFormat('en-CA', {
style: 'currency',
currency: FEES.currency,
maximumFractionDigits: 0,
}).format(amount);
const FAQ = [
{
q: 'What is a mediation?',
a: 'It is a meeting to try to settle a dispute without a hearing. Everyone involved comes. I run the meeting. I do not decide who is right.',
},
{
q: 'Are you on anyones side?',
a: 'No. I run the process for everyone in the room at once. If I ran it for one side it would settle nothing, and the other side would be right not to come.',
},
{
q: 'Should I get my own legal advice?',
a: 'What you sign at the end of a mediation is an agreement, so it is worth having someone look at your own position before the day rather than after it. If nobody is advising you, say so at the start.',
},
{
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. 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?',
a: 'The terms everyone signs at the start deal with confidentiality. A caucus is when I meet one side on their own, without the other side there. One part of what happens in it is mine rather than the documents:',
/* Rendered through <Undertaking> below, not as body prose — §4's third
class gets one treatment across the site so a reader can tell a promise
from a description. The graph gets lead and promise as one answer. */
undertaking: CONDUCT_UNDERTAKINGS.mediationCaucus,
},
{
q: 'What does it cost, and who pays?',
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?',
a: 'Then the mediation ends without an agreement. Nothing you said becomes a ruling, because I do not make one. What gets written down is only what everyone agrees to write down.',
},
{
q: 'How do I get ready?',
a: 'Bring the documents that matter, not all of them. Know the number you would accept and the number you would walk away at. Bring someone who can agree to a settlement on the day, or be able to reach them quickly. Expect to be asked what the weakest part of your own case is.',
},
];
/* ONE SOURCE, TWO SHAPES. The page renders the lead-in and the undertaking as
separate elements; a `FAQPage` answer is plain text, so the node gets them
joined. Neither is typed twice. */
const graph = forPartiesGraph({
faq: FAQ.map(({ q, a, undertaking }) => ({
q,
a: undertaking ? `${a} ${undertaking}` : a,
})),
imageUrl: new URL(ldImage.src, Astro.site).href,
});
---
<BaseLayout
title="For Parties · What Happens at a Mediation · Pouya Lajevardi"
description="What happens at a mediation, in plain language: who the mediator is, what the day looks like, what it costs and who pays, and how to get ready."
jsonLd={graph}
>
{/* ---- 1. Hero -------------------------------------------------------- */}
<section class="section hero">
<div class="wrap">
<Eyebrow dot>For parties</Eyebrow>
<h1 class="display hero-h">What happens at a mediation.</h1>
<p class="hero-lede">
This page is for you if you are going to a mediation and nobody has
explained what one is. It is the same day the rest of this site
describes, written without the shorthand.
</p>
</div>
</section>
{/* ---- 2. The role, before anything else ------------------------------ */}
{
/* NEUTRAL_ROLE_LINE gets its own section rather than a slot in the FAQ.
docs/03 requires this page to say it explicitly, and the sentence a party
most needs is not one to make them scroll for. */
}
<section class="section section-alt reveal">
<div class="wrap">
<div class="section-head">
<SectionHeading eyebrow="First" level={2}>
<span slot="heading">Who I am in the room.</span>
</SectionHeading>
</div>
<div class="prose">
<p class="statement">{NEUTRAL_ROLE_LINE}</p>
<p>
I also do not decide who is right. There is no ruling at the end of a
mediation. There is either an agreement everyone signs, or there is
not one.
</p>
</div>
</div>
</section>
{/* ---- 3. The questions ----------------------------------------------- */}
<section class="section reveal">
<div class="wrap">
<div class="section-head">
<SectionHeading
eyebrow="Questions"
level={2}
lede="The ones parties ask most often, answered plainly."
>
<span slot="heading">What you probably want to know.</span>
</SectionHeading>
</div>
<div class="faq">
{
FAQ.map((item) => (
<div class="faq-item">
<h3 class="faq-q">{item.q}</h3>
<p class="faq-a">{item.a}</p>
{item.undertaking && (
<Undertaking>{item.undertaking}</Undertaking>
)}
</div>
))
}
</div>
<div class="cta">
<Button href="/fees/" variant="gold">The full rate card &rarr;</Button>
<Button href="/process/" variant="ghost">The five steps &rarr;</Button>
</div>
</div>
</section>
<ContactBand />
</BaseLayout>
<style>
.hero {
padding-block-start: var(--space-9);
}
.hero-h {
margin-block: var(--space-4) var(--space-5);
font-size: var(--text-6xl);
}
.hero-lede {
max-inline-size: 58ch;
font-size: var(--text-lg);
line-height: var(--leading-body);
color: var(--text-secondary);
}
/* The compliance sentence, set larger than the paragraph under it. A party
who reads one line on this page should read this one. */
.statement {
font-size: var(--text-lg);
line-height: var(--leading-body);
}
.faq {
display: grid;
gap: var(--space-7);
max-inline-size: var(--width-prose);
}
.faq-q {
margin-block-end: var(--space-2);
font-family: var(--font-serif);
font-size: var(--text-xl);
line-height: var(--leading-tight);
}
.faq-a {
line-height: var(--leading-body);
color: var(--text-secondary);
}
/* A row of standalone CTAs, not prose: WCAG 2.5.8's inline-link exception
does not cover them, so `.btn` carries the 44px target. */
.cta {
display: flex;
flex-wrap: wrap;
gap: var(--space-3) var(--space-4);
margin-block-start: var(--space-8);
}
</style>