feat: build step 5 — /practice/ and six area pages; check:claims gates §4 in dist
Build and deploy / build-and-deploy (push) Failing after 5s
Build and deploy / build-and-deploy (push) Failing after 5s
Step 5 ships /practice/ and the six practice-area pages (construction,
technology, energy, insurance, shareholder, cross-border) from one route, and
adds the mechanical §4 gate Pouya ruled for.
check:claims — §4 Forbidden becomes a build error
scripts/check-claims.mjs greps dist/**/*.html for 10 patterns, each carrying
the incident that put it there. It strips <style> and non-JSON-LD <script>
first (a bare sweep for "leading" returned 26 hits, 25 of them
var(--leading-body)), self-tests every pattern against fixtures before
sweeping, and refuses a missing, empty or stale dist/. Wired into /build
Phase 5 and both deploy paths.
Q54 — six conduct undertakings publish, and §4 gains a third class
Conduct undertakings sit apart from credentials and offerings: the gate is
that Pouya said it in terms. The strings live in CONDUCT_UNDERTAKINGS so a
softening is one visible diff. (e) and (f) replace the third-person sentences
already on /arbitration/ rather than joining them.
Q49, Q50 recorded as rulings. §7 records the SES us-east-1 stray identity's
deletion. R11 holds typescript at its current major, with the peer-range
reason recorded.
Three facts corrected, two of them already shipped
- The LAT gloss said mediation "before filing and continuing after filing";
the Tribunal names mediation for "Before you apply" only and its second
sentence is about negotiation. An ellipsis in docs/01 had deleted it.
- "Connection allocation" is not an Ontario term.
- "The 2026 privacy statute" does not exist — Bill C-27 died without royal
assent. Struck from docs/03 rather than corrected in place.
ADR Chambers struck from /arbitration/ and from docs/01 item 3 (Pouya,
2026-08-30): the source establishes what the firm publishes, not that an
outside neutral can be appointed under its rules.
claims-auditor gains a second lens — for every quoted source, whether the
sentence beneath stays inside what the quotation establishes. Four shipped
defects had that shape and none of them is greppable.
CLAUDE.md gains a convention: never truncate the output of a check you intend
to believe. `npm run check | tail -3` returns warnings, hints and a blank line
and drops the errors line; it was reported as passing four times while
astro check was exiting 1 with 10 type errors.
Gates, exit status read directly, not through a pipe:
npm run check exit=0
npm run lint exit=0
npm run build exit=0
npm run check:claims exit=0
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
co-authored by
Claude Opus 5
parent
f3138a0a79
commit
79b19a7bd0
@@ -0,0 +1,88 @@
|
||||
---
|
||||
/**
|
||||
* The visible breadcrumb trail. `docs/04` requires `BreadcrumbList` markup on
|
||||
* "all nested pages" AND that it **match the visible breadcrumbs** — so the
|
||||
* markup and this component are built from one array at the call site, and a
|
||||
* page cannot emit one without showing the other.
|
||||
*
|
||||
* WHICH PAGES GET ONE, AND WHY IT IS NOT EVERY PAGE. `/about/`, `/mediation/`,
|
||||
* `/arbitration/`, `/med-arb/` and `/practice/` are all ONE HOP from the root
|
||||
* and show no breadcrumb, so emitting the markup on them would assert a
|
||||
* navigation structure the page does not have. The trail begins at the
|
||||
* two-level pages: `/practice/<area>/`, and `/insights/<slug>/` at step 7.
|
||||
*
|
||||
* THE CURRENT PAGE IS NOT A LINK. A link to the page you are on is a target
|
||||
* that does nothing, and `aria-current="page"` is the property that carries the
|
||||
* meaning. `schema.org` still wants it as the last `ListItem`, which is why the
|
||||
* caller passes the full trail and this component decides what to render.
|
||||
*
|
||||
* THE SEPARATOR IS `aria-hidden` AND LIVES IN CSS-adjacent markup rather than
|
||||
* in the link text: a screen reader announcing "slash" between every crumb is
|
||||
* noise, and `<nav aria-label="Breadcrumb">` already names the structure.
|
||||
*/
|
||||
interface Props {
|
||||
/** Root-first, INCLUDING the current page as the last entry. */
|
||||
trail: ReadonlyArray<{ name: string; href: string }>;
|
||||
}
|
||||
const { trail } = Astro.props;
|
||||
---
|
||||
|
||||
<nav class="crumbs" aria-label="Breadcrumb">
|
||||
<ol role="list">
|
||||
{
|
||||
trail.map((crumb, i) =>
|
||||
i === trail.length - 1 ? (
|
||||
<li aria-current="page">{crumb.name}</li>
|
||||
) : (
|
||||
<li>
|
||||
<a href={crumb.href}>{crumb.name}</a>
|
||||
<span aria-hidden="true">/</span>
|
||||
</li>
|
||||
),
|
||||
)
|
||||
}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<style>
|
||||
/* `role="list"` on the <ol> and no local `list-style: none` — global.css does
|
||||
both for `ol[role='list']`, and WebKit drops list semantics when the marker
|
||||
goes, which is why the role is there. Same pairing as `.stage` on
|
||||
`/arbitration/`. */
|
||||
.crumbs ol {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-xs);
|
||||
letter-spacing: var(--tracking-wide);
|
||||
text-transform: uppercase;
|
||||
color: var(--text-meta);
|
||||
}
|
||||
.crumbs li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
/* 44px is the touch-target floor in docs/02. These are small uppercase mono
|
||||
links in a row, which is exactly the shape that lands under it — the same
|
||||
defect measured on `/med-arb/`'s onward links at 390px (21px tall against a
|
||||
44px floor). `inline-flex` + `min-block-size` is the fix the rest of the
|
||||
site uses. */
|
||||
.crumbs a {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-block-size: 44px;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
.crumbs a:hover {
|
||||
color: var(--text);
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 0.2em;
|
||||
}
|
||||
.crumbs [aria-current='page'] {
|
||||
color: var(--text);
|
||||
}
|
||||
</style>
|
||||
@@ -48,13 +48,25 @@ const { items, minColumn = '17rem' } = Astro.props;
|
||||
.defs {
|
||||
gap: var(--space-7);
|
||||
}
|
||||
/* ⚠️ `--def-name-fg`, NOT `--text-meta` DIRECTLY. `--text-meta` is `--muted`,
|
||||
and `tokens.css` states the constraint on that token in terms: "metadata —
|
||||
ON CREAM ONLY (3.07:1 on ink)". `/practice/` is the first page to put this
|
||||
component on an inverse ground, and it shipped these labels at **3.07:1 at
|
||||
12px** against a 4.5:1 AA floor — measured three ways by
|
||||
`adversarial-reviewer` (token arithmetic, `getComputedStyle` against the
|
||||
served build, and a screenshot), all agreeing.
|
||||
|
||||
A custom property is the fix rather than a `:global()` rule because it is
|
||||
the one mechanism that crosses Astro's component-scope boundary — the same
|
||||
route `Pill` already uses, and `global.css` sets this alongside `--pill-fg`
|
||||
on `.section-inverse, .section-accent`. The fallback keeps cream correct. */
|
||||
.def-name {
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-xs);
|
||||
font-weight: var(--weight-medium);
|
||||
letter-spacing: var(--tracking-wide);
|
||||
text-transform: uppercase;
|
||||
color: var(--text-meta);
|
||||
color: var(--def-name-fg, var(--text-meta));
|
||||
}
|
||||
.def-body {
|
||||
margin-block-start: var(--space-2);
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
/**
|
||||
* A conduct undertaking — §4's third class of claim (Q54, 2026-08-29).
|
||||
*
|
||||
* ONE TREATMENT ON ALL THREE PAGES, so a reader can tell a promise from a
|
||||
* description. Set as body prose, "the agreement should settle the switch" and
|
||||
* "I will not take the appointment unless it does" look the same, and the
|
||||
* second is the half a party weighs.
|
||||
*
|
||||
* THE TEXT ALWAYS COMES FROM `CONDUCT_UNDERTAKINGS` in `src/data/site.ts`.
|
||||
* Never type a sentence into this slot: a softened undertaking is a change to a
|
||||
* published commitment, and a page-local copy is where that happens silently.
|
||||
*
|
||||
* NO PROPS BUT `children`, AND THE INTERFACE IS LOAD-BEARING. With
|
||||
* comment-only frontmatter an Astro component's props widen to `any` and
|
||||
* `<Undertaking class="x">` compiles clean while matching nothing — the
|
||||
* parent-scope defect `CLAUDE.md` records, and the one `Pill` shipped carrying.
|
||||
* Deleting it re-disables checking at every call site.
|
||||
*/
|
||||
interface Props {
|
||||
children?: unknown;
|
||||
}
|
||||
const _props: Props = Astro.props;
|
||||
void _props;
|
||||
---
|
||||
|
||||
<p class="undertaking"><slot /></p>
|
||||
|
||||
<style>
|
||||
/* The gold rule is DECORATIVE, never text. docs/02: gold on cream measures
|
||||
2.10:1 and fails AA for body and large text alike, which is why the site
|
||||
uses it for rules, dividers and icon strokes and nowhere else on cream.
|
||||
`.rule-gold` in global.css is the same decision at full width. */
|
||||
.undertaking {
|
||||
padding-inline-start: var(--space-5);
|
||||
border-inline-start: 2px solid var(--rule);
|
||||
max-inline-size: 54ch;
|
||||
font-size: var(--text-lg);
|
||||
line-height: var(--leading-body);
|
||||
}
|
||||
|
||||
/* global.css sets `:where(.prose) > p + p` at zero specificity, and it DOES
|
||||
reach this root — global.css is a plain stylesheet, not a scoped one, so
|
||||
the usual parent-scope boundary does not apply here. This overrides it
|
||||
deliberately with a larger step: an undertaking that sits on the same
|
||||
rhythm as the paragraphs around it reads as one of them. */
|
||||
.undertaking:not(:first-child) {
|
||||
margin-block-start: var(--space-6);
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,676 @@
|
||||
/**
|
||||
* The copy for the six `/practice/<area>/` pages. Rendered by
|
||||
* `src/pages/practice/[slug].astro`, which owns the shape; this file owns the
|
||||
* words.
|
||||
*
|
||||
* ⚠️ **EVERY FACT ABOUT THE WORLD ON THESE PAGES IS SOURCED IN
|
||||
* `docs/reference/`, AND A FACT THAT IS NOT THERE IS NOT PUBLISHED HERE.**
|
||||
* That is R14 — *anything a spec makes a claim about must be reachable from the
|
||||
* repository* — applied to the six pages that need the most external material.
|
||||
* The extracts were retrieved 2026-08-29 and each carries a "What this does NOT
|
||||
* establish" section. Read that section before adding a sentence.
|
||||
*
|
||||
* - `ontario-construction-act.md` Construction Act, adjudication, ODACC,
|
||||
* prompt payment; Darlington and Bruce C
|
||||
* - `ontario-energy-regulatory.md` OEB s. 92, IESO connection assessment,
|
||||
* Bill 40, Electricity Act s. 28.1
|
||||
* - `ontario-sabs-lat.md` SABS, the MIG, LAT-AABS, caseload
|
||||
* - `lat-case-conference.md` why the LAT's case conference is not this
|
||||
* - `ontario-shareholder-remedies.md` OBCA/CBCA oppression, OBCA s. 108(6)
|
||||
* - `adr-institution-names.md` the exact names of the rule sets
|
||||
*
|
||||
* ⚠️ **NO PAGE MAY CLAIM VOLUME, HISTORY OR A NAMED MATTER.** §4's publication
|
||||
* gate for a practice area has two conditions and the second is this page's
|
||||
* job: *"The page frames it as positioning, not as claimed history."* docs/03:
|
||||
* *"Built to facilitate procurement and subcontract disputes on Ontario's
|
||||
* megaproject pipeline" — not "extensive experience resolving".* A page that
|
||||
* claims volume fails the gate even though the label passes.
|
||||
*
|
||||
* ⚠️ **AND NAMING A PROJECT IS NOT CLAIMING A CONNECTION TO IT.** Darlington
|
||||
* and Bruce C are named as programme context because `docs/01` names them.
|
||||
* `ontario-construction-act.md` records, in terms, that nothing retrieved links
|
||||
* either project to any dispute, adjudication, lien or payment proceeding — and
|
||||
* that it must not be used to imply one. The copy names the programme, never a
|
||||
* matter.
|
||||
*
|
||||
* ⚠️ **STATUTE IS DESCRIBED, NEVER APPLIED.** §4 bars this repository from
|
||||
* concluding a proposition of law, and D13 governs what may be implied about
|
||||
* who is entitled to advise on one. So these pages say what an instrument
|
||||
* provides and where it sits, and each section that recites one carries a note
|
||||
* pointing the reader to their own counsel for what it means on their file.
|
||||
* **Limitation periods are deliberately absent** — lien preservation and
|
||||
* perfection deadlines are the single highest-consequence thing on these pages
|
||||
* to get wrong, and nobody should take one from a marketing page. The extract
|
||||
* has them; the site does not.
|
||||
*/
|
||||
import type { PracticeSlug } from './site';
|
||||
import type { PublishableServiceType } from './schema';
|
||||
|
||||
/** A paragraph. `lead` renders as the bolded opener the rest of the site uses. */
|
||||
export type PracticePara = { lead?: string; text: string };
|
||||
|
||||
export type PracticeSection = {
|
||||
eyebrow: string;
|
||||
heading: string;
|
||||
lede?: string;
|
||||
paragraphs: readonly PracticePara[];
|
||||
/** Set off with a gold rule. One sentence or two — never a section's worth.
|
||||
* docs/01 on the family-law exclusion: "One sentence, not a section: it
|
||||
* saves a wasted intake call, which is the only reason it earns its place."
|
||||
* A disclaimer that grows into a paragraph reads as defensive. */
|
||||
note?: string;
|
||||
/** Declared, not computed from the index, so inserting a section cannot
|
||||
* silently restyle the ones below it. */
|
||||
ground?: 'alt' | 'inverse';
|
||||
};
|
||||
|
||||
export type PracticePage = {
|
||||
/**
|
||||
* The processes this area actually carries, for the `Service` node. **Per
|
||||
* area, because the JSON-LD has to say what the page says** — `/practice/
|
||||
* insurance/` offers private mediation and recites the LAT's exclusive
|
||||
* jurisdiction, so it must not assert commercial arbitration to a crawler.
|
||||
* `serviceLabel` leads the node's name and must match what `serviceType`
|
||||
* carries.
|
||||
*/
|
||||
serviceType: PublishableServiceType | readonly PublishableServiceType[];
|
||||
serviceLabel: string;
|
||||
title: string;
|
||||
description: string;
|
||||
h1: string;
|
||||
lede: string;
|
||||
disputeTypesLede: string;
|
||||
disputeTypes: readonly { name: string; body: string }[];
|
||||
sections: readonly PracticeSection[];
|
||||
};
|
||||
|
||||
export const PRACTICE_PAGES: Record<PracticeSlug, PracticePage> = {
|
||||
/* ------------------------------------------------------------------ */
|
||||
construction: {
|
||||
serviceType: ['Mediation', 'Commercial arbitration'],
|
||||
serviceLabel: 'Mediation and arbitration',
|
||||
title: 'Construction Disputes · Pouya Lajevardi · Toronto · Q.Med',
|
||||
description:
|
||||
'Liens, delay and change-order claims, subcontract and deficiency ' +
|
||||
'disputes. A neutral who reads the schedule and the change orders, not ' +
|
||||
'a summary of them.',
|
||||
h1: 'The dispute is in the change orders.',
|
||||
lede:
|
||||
'Construction files turn on documents nobody wants to read: the ' +
|
||||
'baseline programme, the as-built, the fourteenth revision of a scope ' +
|
||||
'letter. I read them. That is most of what a construction mediation ' +
|
||||
'needs, and it is the work that happens before the day.',
|
||||
disputeTypesLede:
|
||||
'Commercial construction and infrastructure. Owner, contractor, ' +
|
||||
'subcontractor and consultant.',
|
||||
disputeTypes: [
|
||||
{
|
||||
name: 'Lien claims',
|
||||
body: 'Priority, holdback, trust and set-off arguments running alongside the substantive dispute rather than instead of it.',
|
||||
},
|
||||
{
|
||||
name: 'Delay and disruption',
|
||||
body: 'Concurrency, float ownership, acceleration, and the gap between a critical-path analysis and what actually happened on site.',
|
||||
},
|
||||
{
|
||||
name: 'Change orders and scope',
|
||||
body: 'Directed change, constructive change, and the familiar position that the work was always in the base scope.',
|
||||
},
|
||||
{
|
||||
name: 'Deficiencies',
|
||||
body: 'Whether the work meets the specification, whether the specification was buildable, and what the cost to correct actually is.',
|
||||
},
|
||||
{
|
||||
name: 'Subcontract and payment',
|
||||
body: 'Pay-when-paid, back-charges, and the disputes that surface when a prompt-payment clock starts running.',
|
||||
},
|
||||
{
|
||||
name: 'Consultant and design',
|
||||
body: 'Coordination failures, errors and omissions, and the split between design responsibility and means and methods.',
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
eyebrow: 'Why me',
|
||||
heading:
|
||||
'Litigation exposure in the same matters, and an engineer who reads the record.',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'Construction is one of the matter types behind my active litigation exposure at a Toronto litigation and ADR boutique. That is not a claim to have decided construction cases. It is a claim to know how these files are actually built, what a set of productions looks like, and which arguments survive contact with a schedule.',
|
||||
},
|
||||
{
|
||||
text: 'The second half is the one worth being specific about. I work as an infrastructure engineer, so a programme, a delay analysis and a set of site records are documents I can interrogate rather than take on trust from whichever expert explains them most confidently. In a construction mediation that is usually where the day is won or lost.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'The machinery',
|
||||
heading: 'These disputes now run inside a statutory timetable.',
|
||||
lede: 'Which changes what a mediation or an arbitration is for.',
|
||||
ground: 'inverse',
|
||||
paragraphs: [
|
||||
{
|
||||
lead: 'Interim adjudication.',
|
||||
text: 'Part II.1 of the Construction Act — "Construction Dispute Interim Adjudication" — has been in force since 1 October 2019. An adjudicator must determine the referred matter no later than 30 days after receiving the referring party\'s documents, and a determined amount is payable within 15 days of the determination being communicated. Judicial review is available only with leave of the Divisional Court.',
|
||||
},
|
||||
{
|
||||
lead: 'A designated authority runs it.',
|
||||
text: 'The Act empowers the Minister to designate an Authorized Nominating Authority, and Ontario Dispute Adjudication for Construction Contracts — ODACC — states on its own site that it is that authority.',
|
||||
},
|
||||
{
|
||||
lead: 'Prompt payment sets the clock.',
|
||||
text: 'Part I.1 came into force on the same day. A proper invoice goes to the owner monthly unless the contract says otherwise; the owner pays within 28 days unless it delivers a notice of non-payment; and a contractor paid in full pays each subcontractor within seven days.',
|
||||
},
|
||||
{
|
||||
lead: 'And arbitration is where it lands.',
|
||||
text: "The Act treats an adjudicator's determination as interim — binding until the matter is finally decided in a court proceeding, by written agreement, or by arbitration under the Arbitration Act, 1991. The Act creates no mediation process of its own. So the question a party is actually choosing between is which of those three finally resolves it, and how quickly.",
|
||||
},
|
||||
],
|
||||
note: "Described so the process is legible, not applied to anyone's file. Everything above is sourced in docs/reference/ontario-construction-act.md against the Act itself; what it means for a particular contract is a question for each party's own counsel.",
|
||||
},
|
||||
{
|
||||
eyebrow: 'The context',
|
||||
heading: 'Ontario is building, and building generates disputes.',
|
||||
ground: 'alt',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'Ontario Power Generation holds a licence to construct a BWRX-300 small modular reactor at Darlington, granted by the Canadian Nuclear Safety Commission in April 2025, and applied in March 2026 for a licence to operate it. Bruce Power has a federal impact assessment under way for the Bruce C project, aimed at creating an option for up to 4,800 megawatts at the existing site, with reactor technology not yet selected.',
|
||||
},
|
||||
{
|
||||
text: 'Programmes on that scale run for years, through dozens of trade contracts, and they produce exactly the disputes above. This practice is built to facilitate procurement and subcontract disputes on that pipeline. I am naming it as the shape of the market, not as a list of files — nothing here is a claim to be on any of these projects.',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
technology: {
|
||||
serviceType: ['Mediation', 'Commercial arbitration'],
|
||||
serviceLabel: 'Mediation and arbitration',
|
||||
title: 'Technology and Data Disputes · Pouya Lajevardi · Toronto',
|
||||
description:
|
||||
'Software contracts, SLA and MSA failures, data residency, AI vendor ' +
|
||||
'diligence, IP and licensing — before a neutral who reads the system, ' +
|
||||
'not only the contract.',
|
||||
h1: 'I read the contract and the system.',
|
||||
lede:
|
||||
'This is the page the rest of the practice is built around. A technology ' +
|
||||
'dispute usually turns on what a system actually did, and that question ' +
|
||||
'is normally answered to a neutral second-hand, by whichever expert is ' +
|
||||
'more fluent. I can read the primary material.',
|
||||
disputeTypesLede:
|
||||
'Commercial technology matters between businesses. Vendor, customer, ' +
|
||||
'integrator and investor.',
|
||||
disputeTypes: [
|
||||
{
|
||||
name: 'Software contracts',
|
||||
body: 'Failed implementations, scope and acceptance disputes, and the argument about whether the product was ever capable of the thing that was demonstrated.',
|
||||
},
|
||||
{
|
||||
name: 'SLA and MSA breakdowns',
|
||||
body: 'Availability and credit disputes, definitions of downtime that nobody checked against the monitoring, and termination-for-cause standoffs.',
|
||||
},
|
||||
{
|
||||
name: 'Data residency and processing',
|
||||
body: 'Where data actually sits, which sub-processors touch it, and whether the processing terms match the architecture that was built.',
|
||||
},
|
||||
{
|
||||
name: 'AI vendor diligence',
|
||||
body: 'Model performance against a warranted benchmark, training-data provenance, evaluation methodology, and what a model card does and does not say.',
|
||||
},
|
||||
{
|
||||
name: 'IP and licensing',
|
||||
body: 'Ownership of work product, open-source obligations, scope-of-licence and field-of-use disputes, and derivative-work arguments.',
|
||||
},
|
||||
{
|
||||
name: 'Cloud and sub-processor',
|
||||
body: 'Shared-responsibility gaps, migration and egress disputes, and outages whose cause sits one layer below the contracting party.',
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
eyebrow: 'Why me',
|
||||
heading:
|
||||
'The claim is engineering practice, so let me state it as one.',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'I work as a machine-learning and infrastructure engineer. Not "technologically literate", not "familiar with the sector" — I build and operate these systems, now, not formerly.',
|
||||
},
|
||||
{
|
||||
text: 'What that buys a party is specific. An API trace, a set of monitoring dashboards, a model card, an evaluation harness, an architecture diagram and a data-processing addendum are all documents I can read directly. In a mediation that means the technical dispute can be tested in the room instead of deferred to an expert exchange that costs another quarter and often does not resolve it either.',
|
||||
},
|
||||
{
|
||||
text: 'It also means I can tell which technical disagreements are real. Some technology disputes are contract disputes wearing technical costume, and a neutral who cannot tell the difference will let a party spend heavily proving something that was never in issue.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'The backdrop',
|
||||
heading: 'What is actually in force, as of this page.',
|
||||
lede: 'Named precisely, because this is the area where a confident wrong statement is easiest to make.',
|
||||
paragraphs: [
|
||||
{
|
||||
lead: 'PIPEDA, still.',
|
||||
text: 'The Personal Information Protection and Electronic Documents Act remains the federal private-sector privacy statute. Bill C-27, which would have enacted the Consumer Privacy Protection Act and the Artificial Intelligence and Data Act, died without royal assent when the session ended, and was not reinstated. A newer bill — C-36, for a Protecting Privacy and Consumer Data Act — was introduced in June 2026 and was at second reading when this page was written. Canada has no federal AI statute.',
|
||||
},
|
||||
{
|
||||
lead: 'Ontario has one AI instrument, and it is mostly not switched on.',
|
||||
text: 'The Enhancing Digital Security and Trust Act, 2024 conditions each of its artificial-intelligence obligations on regulations prescribing who they apply to and when. Two regulations have been made under it — one on cyber security, one on digital technology affecting people under 18 — and neither is the AI one.',
|
||||
},
|
||||
{
|
||||
lead: 'And no federal or Ontario statute requires data to be stored in Canada.',
|
||||
text: "This is the one worth stating plainly, because data-residency clauses are often drafted against the opposite assumption. The federal Privacy Commissioner's own guidance says PIPEDA does not prohibit an organisation in Canada from transferring personal information to another jurisdiction for processing; what the Act requires instead is accountability — the organisation stays responsible for information it has transferred to a third party. Ontario's health privacy statute imposes no storage-location rule either.",
|
||||
},
|
||||
{
|
||||
text: 'Which matters in a dispute because the parties are often arguing about a clause neither of them can point to a source for. Establishing what the obligation actually is, rather than what both sides assumed it was, frequently narrows the disagreement to something a mediation can close in a day.',
|
||||
},
|
||||
],
|
||||
note: "Described as the state of the instruments, not applied to anyone's file, and the residency point is the Privacy Commissioner's own words rather than a conclusion of mine. All of it is sourced in docs/reference/canada-privacy-technology.md and all of it can change — a bill at second reading in August 2026 is not a bill at second reading forever. What any of it means for a particular contract is a question for each party's own counsel.",
|
||||
ground: 'inverse',
|
||||
},
|
||||
{
|
||||
eyebrow: 'The shape',
|
||||
heading: 'Why these disputes suit a private process.',
|
||||
ground: 'alt',
|
||||
paragraphs: [
|
||||
{
|
||||
lead: 'Confidentiality is not a preference here.',
|
||||
text: 'The evidence in a technology dispute is source code, architecture, security posture and customer data flows. That is material neither side wants in a public record, and it is a reason parties choose arbitration over litigation before any question of speed arises.',
|
||||
},
|
||||
{
|
||||
lead: 'The commercial relationship usually has to survive.',
|
||||
text: 'A dispute with a vendor mid-implementation, or with a customer who is still live on the platform, is not a matter where either side can afford a two-year fight. Mediation, or med-arb with the switch agreed in advance, is built for exactly that shape.',
|
||||
},
|
||||
{
|
||||
lead: 'And the process has to be able to look at the system.',
|
||||
text: 'A documents-only arbitration works well where the dispute is about what the contract says. Where it is about what the system did, the process needs a way to get at the artefacts — which is a matter for the first procedural order, not something to discover late.',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
energy: {
|
||||
serviceType: ['Mediation', 'Commercial arbitration'],
|
||||
serviceLabel: 'Mediation and arbitration',
|
||||
title: 'Energy and Grid Disputes · Pouya Lajevardi · Toronto',
|
||||
description:
|
||||
'Connection assessment, leave to construct, proponent and municipality ' +
|
||||
'disputes, IESO market participation, and the new data-centre ' +
|
||||
'connection regime in Ontario.',
|
||||
h1: 'Grid disputes are engineering disputes with a regulator attached.',
|
||||
lede:
|
||||
'Ontario has spent the last year rewriting how large loads and new ' +
|
||||
'generation get connected. That produces commercial disputes between ' +
|
||||
'proponents, distributors, transmitters and municipalities long before ' +
|
||||
'anything reaches a regulator.',
|
||||
disputeTypesLede:
|
||||
'Commercial disputes around connection, construction and market ' +
|
||||
'participation.',
|
||||
disputeTypes: [
|
||||
{
|
||||
name: 'Connection assessment',
|
||||
body: "Disputes arising out of the IESO connection assessment and approval process — the system impact assessment, the transmitter's customer impact assessment, and the conditions attached to either.",
|
||||
},
|
||||
{
|
||||
name: 'Leave to construct',
|
||||
body: 'Commercial disputes between proponents, landowners and affected parties around an Ontario Energy Board leave-to-construct application, as distinct from the application itself.',
|
||||
},
|
||||
{
|
||||
name: 'Proponent and municipality',
|
||||
body: 'Siting, road use, access and community-benefit disputes between a proponent and the municipality it has to build through.',
|
||||
},
|
||||
{
|
||||
name: 'Market participation',
|
||||
body: 'Disputes between registered market participants, and between a participant and a counterparty, arising out of the IESO-administered markets.',
|
||||
},
|
||||
{
|
||||
name: 'Large loads and data centres',
|
||||
body: 'The connection assessment behind a data centre or other large load, and the contractual arrangements built on an assumption about when the power arrives.',
|
||||
},
|
||||
{
|
||||
name: 'EPC and equipment',
|
||||
body: 'Construction and supply disputes on generation, storage and transmission projects, where the construction and the regulatory timetables are coupled.',
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
eyebrow: 'Why me',
|
||||
heading:
|
||||
'A System Impact Assessment is a document, and documents can be read.',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'Grid connection disputes are usually argued through technical studies. My engineering practice is in infrastructure, so the study, the single-line diagram and the constraint that produced the condition are things I can work through with the parties rather than around them.',
|
||||
},
|
||||
{
|
||||
text: 'The regulatory overlay is the other half. A commercial dispute about a connection sits next to a process at the Ontario Energy Board or the IESO with its own timetable, and a neutral who does not understand that coupling will schedule a mediation for a date at which nothing can yet be decided.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'The machinery',
|
||||
heading: 'Where the processes actually sit.',
|
||||
lede: 'Named precisely, because two of these are routinely called something they are not.',
|
||||
ground: 'inverse',
|
||||
paragraphs: [
|
||||
{
|
||||
lead: 'Leave to construct is section 92.',
|
||||
text: 'Section 92 of the Ontario Energy Board Act, 1998 provides that no person may construct, expand or reinforce an electricity transmission or distribution line, or make an interconnection, without an order from the Board granting leave. The thresholds everyone actually argues about are not in that section — they are exemptions in a regulation under it, which carves out distribution lines outright and transmission lines of two kilometres or less. Section 90 is the separate provision for hydrocarbon lines. The test is the public interest, and as of December 2025 what the Board may consider on a section 92 application expressly includes supporting economic growth consistent with Government of Ontario policy.',
|
||||
},
|
||||
{
|
||||
lead: 'Connection runs through the IESO, and it is not a queue.',
|
||||
text: 'The IESO operates a six-stage connection process and calls it connection assessment and approval. An application is assessed by system impact assessment, and the transmitter generally runs a customer impact assessment after the draft. The IESO states plainly that it does not use an interconnection queue — it works from a defined set of committed projects instead, so "our place in the queue" describes nothing.',
|
||||
},
|
||||
{
|
||||
lead: 'And large loads now have their own gate.',
|
||||
text: 'Section 28.1 of the Electricity Act, 1998 came into force on 11 December 2025 and creates a connection-approval requirement for a "specified load facility", a category defined to include data centres meeting criteria to be set by regulation. The regulation that would set them had not been made as of August 2026 — the Ministry described it then as something the province was considering drafting — and the Ministry posted a consultation on an assessment framework for new data centres in August 2026, with a comment period running to 12 September.',
|
||||
},
|
||||
],
|
||||
note: "Described so the process is legible, not applied to anyone's file — and the terms above are the ones these bodies actually use. Sourced in docs/reference/ontario-energy-regulatory.md.",
|
||||
},
|
||||
{
|
||||
eyebrow: 'The context',
|
||||
heading: 'This one is a position, not a caseload.',
|
||||
ground: 'alt',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'Bill 40 — the Protect Ontario by Securing Affordable Energy for Generations Act, 2025 — received Royal Assent on 11 December 2025. It added the large-load connection provision above and widened what the Board may weigh on a leave-to-construct application. Its own preamble names the responsible growth of energy-intensive industries like data centres.',
|
||||
},
|
||||
{
|
||||
text: 'A statute that changes how things get connected changes what parties argue about, and the disputes that follow it have not been had yet. I am saying plainly that this is a position I am building into rather than a volume of work I have already done. The engineering and the regulatory reading are both real now; the file count is not the claim.',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
insurance: {
|
||||
/* MEDIATION ONLY. The page offers private mediation and states that
|
||||
s. 280 of the Insurance Act gives the LAT exclusive jurisdiction over
|
||||
these disputes; the word arbitration appears in its visible copy only
|
||||
in the shared onward-links strip. §4 also scopes every arbitration row
|
||||
to COMMERCIAL, and a SABS entitlement dispute is statutory. */
|
||||
serviceType: 'Mediation',
|
||||
serviceLabel: 'Mediation',
|
||||
title: 'Accident Benefits and SABS · Pouya Lajevardi · Toronto',
|
||||
description:
|
||||
'Entitlement and quantum disputes under the Statutory Accident ' +
|
||||
'Benefits Schedule, minor injury designations, and private mediation ' +
|
||||
'retained by the parties.',
|
||||
h1: "Private mediation, not the Tribunal's case conference.",
|
||||
lede:
|
||||
'Accident benefits disputes are high in volume, tightly regulated, and ' +
|
||||
'unglamorous enough to be worth doing properly. The distinction in that ' +
|
||||
'headline is the one to be clear about before anyone retains me.',
|
||||
disputeTypesLede:
|
||||
'Disputes between an insured person and an insurer under the Statutory ' +
|
||||
'Accident Benefits Schedule.',
|
||||
disputeTypes: [
|
||||
{
|
||||
name: 'Entitlement and quantum',
|
||||
body: 'Whether a benefit is payable at all, and if so how much — the two questions the statutory scheme is built around.',
|
||||
},
|
||||
{
|
||||
name: 'Minor injury designation',
|
||||
body: 'Whether an impairment falls inside the minor injury definition, and the monetary limit that follows if it does.',
|
||||
},
|
||||
{
|
||||
name: 'Treatment and assessment plans',
|
||||
body: 'Denied or partially approved plans, competing assessments, and disputes about the reasonableness and necessity of proposed treatment.',
|
||||
},
|
||||
{
|
||||
name: 'Catastrophic impairment',
|
||||
body: 'The determination itself, and the very different limits that turn on it.',
|
||||
},
|
||||
{
|
||||
name: 'Income replacement',
|
||||
body: 'Eligibility, quantum, and the evidentiary disputes about pre-accident earnings and post-accident capacity.',
|
||||
},
|
||||
{
|
||||
name: 'Insurer repayment claims',
|
||||
body: 'Overpayment and repayment disputes brought by an insurer rather than by the insured person.',
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
eyebrow: 'The forum',
|
||||
heading: 'Where these disputes go, and what I am not.',
|
||||
lede: 'Worth stating precisely, because the vocabulary invites a misunderstanding.',
|
||||
paragraphs: [
|
||||
{
|
||||
lead: 'The Tribunal has exclusive jurisdiction.',
|
||||
text: "Section 280 of the Insurance Act sends disputes about an insured person's entitlement to statutory accident benefits, or the amount of them, to the Licence Appeal Tribunal, and bars a proceeding in any court other than an appeal or judicial review. The accident-benefits division is the Automobile Accident Benefits Service.",
|
||||
},
|
||||
{
|
||||
lead: "Its case conference is the Tribunal's own, and I am not appointed to it.",
|
||||
text: "The Tribunal's settlement step is a case conference led by one of its adjudicators, who is then disqualified from hearing the matter. It is sometimes called a pre-hearing, which is the Tribunal's own label for it. A privately retained neutral does not conduct it and cannot be appointed to it, and nothing on this page should be read as offering that.",
|
||||
},
|
||||
{
|
||||
lead: 'What I offer is private mediation.',
|
||||
text: 'Retained by the parties, on their own terms, under an agreement to mediate they sign. The Tribunal\'s own materials point parties toward mediation: under the heading "Consider other ways to resolve your dispute", the accident-benefits page says that before you apply, you may want to consider negotiation or mediation services.',
|
||||
},
|
||||
],
|
||||
note: 'That quotation is about mediation before an application is filed, and it is quoted no wider than it goes. Sourced in docs/reference/lat-case-conference.md, which carries the full passage and a correction to an earlier reading of it.',
|
||||
},
|
||||
{
|
||||
eyebrow: 'The scheme',
|
||||
heading: 'Everything here runs off one regulation.',
|
||||
ground: 'inverse',
|
||||
paragraphs: [
|
||||
{
|
||||
lead: 'The Schedule is the source.',
|
||||
text: 'The Statutory Accident Benefits Schedule is O. Reg. 34/10 under the Insurance Act, and it sets both the benefits and their limits. "Minor injury" and "Minor Injury Guideline" are both defined terms in section 3 of the Schedule, and the monetary limit on medical and rehabilitation benefits for a predominantly minor injury is set by section 18 of the Schedule itself.',
|
||||
},
|
||||
{
|
||||
lead: 'Which is why these files reward a neutral who reads it.',
|
||||
text: 'The arguments that actually move an accident-benefits mediation are about which provision governs, what the assessments say against it, and where the file sits on a two-year clock. That is a documentary exercise before it is a persuasion exercise.',
|
||||
},
|
||||
],
|
||||
note: "Described so the scheme is legible, not applied to anyone's file. The Schedule was amended with effect from 1 July 2026; this page cites no figure, and how any provision bears on a particular claim is a question for each party's own counsel. Sourced in docs/reference/ontario-sabs-lat.md.",
|
||||
},
|
||||
{
|
||||
eyebrow: 'The context',
|
||||
heading: 'The volume is the argument.',
|
||||
ground: 'alt',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'Tribunals Ontario reported 16,002 accident-benefit appeals received by the Licence Appeal Tribunal in the fiscal year ending 31 March 2025, and 12,081 case conferences held. It also reported that the average time from application to an oral hearing fell from 437 to 332 days over that year.',
|
||||
},
|
||||
{
|
||||
text: "Those are the Tribunal's numbers about its own docket, not mine about my practice. They are here because they describe the problem: a very large number of disputes moving through a process whose hearing dates still sat the better part of a year out after a year of improvement. Private mediation is one thing that changes that arithmetic for a particular file.",
|
||||
},
|
||||
],
|
||||
note: 'Published figures for the fiscal year ending 31 March 2025, from the Tribunals Ontario annual report. A more recent report may exist — re-check before relying on these as current. Sourced in docs/reference/ontario-sabs-lat.md.',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
shareholder: {
|
||||
serviceType: ['Mediation', 'Commercial arbitration'],
|
||||
serviceLabel: 'Mediation and arbitration',
|
||||
title: 'Shareholder and Partnership Disputes · Pouya Lajevardi',
|
||||
description:
|
||||
'Oppression, deadlock, buy-out and valuation, partnership dissolution ' +
|
||||
'and business succession in family-held companies — commercial ' +
|
||||
'disputes, not family law.',
|
||||
h1: 'The company still has to trade on Monday.',
|
||||
lede:
|
||||
'Shareholder disputes are the ones where the cost of the fight lands ' +
|
||||
'on the asset both sides are fighting over. That is the whole argument ' +
|
||||
'for resolving them privately, and quickly, and it is why the ' +
|
||||
'commercial reality has to be in the room.',
|
||||
disputeTypesLede:
|
||||
'Commercial disputes between owners of closely held businesses, ' +
|
||||
'including family-held ones.',
|
||||
disputeTypes: [
|
||||
{
|
||||
name: 'Oppression',
|
||||
body: 'Conduct said to be oppressive, unfairly prejudicial, or unfairly to disregard the interests of a shareholder, creditor, director or officer.',
|
||||
},
|
||||
{
|
||||
name: 'Deadlock',
|
||||
body: 'Fifty-fifty splits and blocked boards, where the disagreement is not legal so much as structural.',
|
||||
},
|
||||
{
|
||||
name: 'Buy-out and valuation',
|
||||
body: 'What the shares are worth, on what basis, at what date — usually the real dispute once the rest is stripped away.',
|
||||
},
|
||||
{
|
||||
name: 'Co-founder breakdowns',
|
||||
body: 'Vesting, contribution, role and control disputes in businesses young enough that the paperwork was never finished.',
|
||||
},
|
||||
{
|
||||
name: 'Partnership dissolution',
|
||||
body: 'Winding up and accounts between partners, and the disputes about what the partnership agreement displaced and what it did not.',
|
||||
},
|
||||
{
|
||||
name: 'Business succession',
|
||||
body: 'Transitions between generations in family-held companies, where the shareholders are also relatives and the roles are not written down.',
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
eyebrow: 'What this area is',
|
||||
heading:
|
||||
'Commercial disputes among family shareholders. Not family law.',
|
||||
paragraphs: [
|
||||
{
|
||||
text: '"Family business" here means a company whose owners happen to be related — succession, control, buy-outs and the arguments that follow when one branch wants out and another wants to keep building. The disputes are corporate and commercial, and they are handled as such.',
|
||||
},
|
||||
],
|
||||
note: 'I do not accept family law matters. Stating it saves an intake call rather than defending anything.',
|
||||
},
|
||||
{
|
||||
eyebrow: 'The alternative',
|
||||
heading: 'What the parties are bargaining against.',
|
||||
lede: 'A shareholder mediation works better when both sides know what the court route actually offers.',
|
||||
ground: 'inverse',
|
||||
paragraphs: [
|
||||
{
|
||||
lead: 'The oppression remedy.',
|
||||
text: "Section 248 of the Business Corporations Act (Ontario), and section 241 of the Canada Business Corporations Act, let a complainant apply to the court where the affairs of a corporation are carried on in a manner that is oppressive or unfairly prejudicial to, or that unfairly disregards, the interests of a security holder, creditor, director or officer. Both give the court a long list of orders, including an order that the corporation or another person purchase a shareholder's securities.",
|
||||
},
|
||||
{
|
||||
lead: 'And the end of the road.',
|
||||
text: 'Both statutes also provide for the company to be wound up, or liquidated and dissolved, including on the ground that it is just and equitable, and the Ontario Partnerships Act lets a partner apply to the court to dissolve a partnership on grounds that include conduct making it not reasonably practicable to carry on business together.',
|
||||
},
|
||||
{
|
||||
lead: 'One provision points the other way.',
|
||||
text: 'The Ontario Act mentions arbitration exactly once. It provides that a unanimous shareholder agreement may provide that, where the shareholders party to it are unable to agree on or resolve a matter pertaining to the agreement, the matter may be referred to arbitration on the procedures and conditions the agreement specifies. The federal Act says nothing of the kind. So the first thing worth checking in a shareholder dispute is whether the parties already wrote down how they would resolve one.',
|
||||
},
|
||||
],
|
||||
note: "Described so the alternatives are legible, not applied to anyone's file. Sourced in docs/reference/ontario-shareholder-remedies.md; what any of it means for a particular company is a question for each party's own counsel.",
|
||||
},
|
||||
{
|
||||
eyebrow: 'Why me',
|
||||
heading: 'I run a company alongside this practice.',
|
||||
ground: 'alt',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'SML Company Ltd. operates alongside the practice, which means the operating consequences of a shareholder dispute are legible rather than abstract: what a deadlock does to a supplier relationship, what an information demand costs a small finance function to answer, what a stalled decision costs a business that still has to trade.',
|
||||
},
|
||||
{
|
||||
text: 'It matters in the room because shareholder disputes are usually settled on structure rather than on liability — a price, a mechanism, a timetable, a set of undertakings about how the two sides deal with each other afterwards. Getting there needs someone who can hold the corporate law and the operating reality at the same time.',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
'cross-cultural': {
|
||||
serviceType: ['Mediation', 'Commercial arbitration'],
|
||||
serviceLabel: 'Mediation and arbitration',
|
||||
title: 'Cross-Border and Diaspora Disputes · Pouya Lajevardi',
|
||||
description:
|
||||
'Diaspora business succession, dual-jurisdiction shareholder disputes ' +
|
||||
'and cross-cultural commercial matters, conducted in English or Farsi ' +
|
||||
'in Toronto.',
|
||||
h1: 'A session in the language the deal was made in.',
|
||||
lede:
|
||||
'Some commercial disputes are harder than they need to be because the ' +
|
||||
'parties are working in a second language, in a business culture that ' +
|
||||
'is not the one the agreement was struck in. That is a resolvable ' +
|
||||
'problem and it is rarely treated as one.',
|
||||
disputeTypesLede:
|
||||
'Commercial matters where the parties, the business or the assets ' +
|
||||
'cross a border or a culture.',
|
||||
disputeTypes: [
|
||||
{
|
||||
name: 'Diaspora business succession',
|
||||
body: 'Family-held companies passing between generations where one generation built the business abroad and the next runs it here.',
|
||||
},
|
||||
{
|
||||
name: 'Dual-jurisdiction shareholder',
|
||||
body: 'Ownership disputes where the company, the shareholders or the assets sit in more than one country.',
|
||||
},
|
||||
{
|
||||
name: 'Partnership disputes',
|
||||
body: 'Breakdowns between diaspora entrepreneurs, often built on arrangements that were trusted rather than documented.',
|
||||
},
|
||||
{
|
||||
name: 'Cross-cultural commercial',
|
||||
body: 'Contract and supply disputes where the disagreement is partly about what was actually agreed and partly about how each side expected the other to behave.',
|
||||
},
|
||||
{
|
||||
name: 'Informal arrangements',
|
||||
body: 'Matters where the commercial substance is real and the paperwork is thin, and the process has to establish what the deal was before it can resolve it.',
|
||||
},
|
||||
{
|
||||
name: 'Interpreted proceedings',
|
||||
body: "Matters that have been running through an interpreter, where a session in the parties' own language changes what gets said.",
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
eyebrow: 'Language',
|
||||
heading: 'English or Farsi, and the difference is not convenience.',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'I am bilingual in English and Farsi, so a session can run in either. That is not a service line; it changes what a mediation can do. A party working through an interpreter says less, says it more carefully, and loses the qualifications and the hesitations that a mediator is actually listening for.',
|
||||
},
|
||||
{
|
||||
text: 'It matters most in caucus, which is where a mediation is usually decided. A party explaining to a neutral what they can really live with is doing something delicate, and doing it in a second language, through a third person, is a different and much worse conversation.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Culture',
|
||||
heading:
|
||||
'Some of these disputes are about the agreement behind the agreement.',
|
||||
ground: 'inverse',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'I am Iranian-Canadian, and some commercial disputes are not separable from the relationship between the parties — family-held companies and diaspora businesses in particular. In matters of this kind a significant part of the disagreement is often not about the written contract at all — it is about obligations both sides genuinely believed were understood, and which one side never thought needed writing down.',
|
||||
},
|
||||
{
|
||||
text: 'A neutral who does not recognise that reads the file as one party inventing terms after the fact. A neutral who does can get the real expectations on the table, which is usually the only route to a settlement either side will actually honour.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'The frame',
|
||||
heading: 'The process is still an Ontario commercial process.',
|
||||
ground: 'alt',
|
||||
paragraphs: [
|
||||
{
|
||||
text: 'These run as commercial mediations and arbitrations, from Toronto, on the rules the parties choose. Where assets or parties sit in another jurisdiction, that is a fact the process has to accommodate — in how an agreement is drafted to be useful in both places, and in who needs to be in the room for a settlement to hold.',
|
||||
},
|
||||
{
|
||||
text: "A question of another country's law can bear on what a settlement has to say. Each party brings their own advisers for that, here and wherever else the matter reaches, and I work from what they tell me rather than around it.",
|
||||
},
|
||||
],
|
||||
note: 'This site is written in English by design. A page in Farsi would be a different commitment from a session in Farsi, and only the second is offered.',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
/* ANNOTATED, NEVER `as const satisfies`: `as const` makes `sections` a
|
||||
heterogeneous tuple and the optional keys stop existing, which costs 10
|
||||
`astro check` errors that `astro build` does not see. See the AGENTS.md
|
||||
entry of 2026-08-29. */
|
||||
+114
-6
@@ -16,8 +16,9 @@
|
||||
* 1. `LegalService` — NEVER. docs/04: schema.org defines it as a business
|
||||
* providing legal advice and *representation*, which asserts in
|
||||
* machine-readable form exactly what D13 bars. `ProfessionalService`.
|
||||
* 2. `worksFor` — **OMITTED, and Q49(b) declined it deliberately on
|
||||
* 2026-08-28.** Two grounds, either sufficient. §4 rows "Operator of SML
|
||||
* 2. `worksFor` — **OMITTED. Declined 2026-08-28 (Q49(b)) and CONFIRMED by
|
||||
* Pouya 2026-08-29: "worksFor stays out."** Settled, not withheld pending
|
||||
* anything. Two grounds, either sufficient. §4 rows "Operator of SML
|
||||
* Company Ltd **alongside** the practice"; "the entity the practice
|
||||
* **operates through**" is a different structural relation with no row.
|
||||
* And `ProfessionalService.provider` is this Person, so `provider →
|
||||
@@ -80,8 +81,8 @@ export function personNode(
|
||||
name: SITE.name,
|
||||
url: `${SITE.url}/about/`,
|
||||
/* PRACTICE_JOB_TITLE, not ROLE.title (Q47), and §4 now rows the value:
|
||||
"Practised role — Mediator" [verified 2026-08-28 — Pouya, Q49]. Do not
|
||||
widen it to include arbitration — see the constant in site.ts. No
|
||||
"Practised role — Mediator" [verified 2026-08-28 — Pouya, Q49, confirmed
|
||||
2026-08-29]. Do not widen it to include arbitration — see the constant in site.ts. No
|
||||
`worksFor` beside it: Q49(b) declined the row. */
|
||||
jobTitle: PRACTICE_JOB_TITLE,
|
||||
description:
|
||||
@@ -168,7 +169,12 @@ export function personNode(
|
||||
* `twitter:title` and the hero eyebrow, all ratified under Q33 — so excluding
|
||||
* it from one name-like field alone would be incoherent. `serviceType` stays
|
||||
* scoped because it **enumerates services**; a slogan and a title are names.
|
||||
* §9 Q50 records this as a deviation awaiting Pouya's line.
|
||||
*
|
||||
* ✅ RATIFIED 2026-08-29 (Q50). This was recorded here as a deviation from
|
||||
* Pouya's literal ruling, awaiting his line. He gave it, and reversed his own
|
||||
* ruling: *"name: 'Pouya Lajevardi' + slogan. My ruling was wrong... Your
|
||||
* reading beat mine; record it as the decision, not as a deviation."* The
|
||||
* two-field mapping IS the decision. The concatenation is struck, not pending.
|
||||
*
|
||||
* `serviceType` lists what §4 Offerings actually records as offered now —
|
||||
* mediation, arbitration, med-arb. **Arbitration is scoped to commercial**
|
||||
@@ -308,9 +314,14 @@ export type PublishableServiceType =
|
||||
export function serviceGraph(opts: {
|
||||
path: string;
|
||||
name: string;
|
||||
serviceType: PublishableServiceType;
|
||||
/** One value, or several. The union is what constrains it either way. */
|
||||
serviceType: PublishableServiceType | readonly PublishableServiceType[];
|
||||
description: string;
|
||||
imageUrl?: string;
|
||||
/** Root-first and INCLUDING the current page — the same array the visible
|
||||
* `<Breadcrumbs>` renders, because docs/04 requires the two to match. Omit
|
||||
* on a page one hop from the root, which shows no visible trail. */
|
||||
breadcrumbs?: ReadonlyArray<{ name: string; href: string }>;
|
||||
}) {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
@@ -329,10 +340,107 @@ export function serviceGraph(opts: {
|
||||
],
|
||||
},
|
||||
personNode(opts.imageUrl),
|
||||
...(opts.breadcrumbs
|
||||
? [breadcrumbNode(opts.path, opts.breadcrumbs)]
|
||||
: []),
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* `BreadcrumbList`. docs/04: "All nested pages | Matches visible breadcrumbs" —
|
||||
* so this is never called with an array the page does not also render, and
|
||||
* `serviceGraph` takes the same array the `<Breadcrumbs>` component takes.
|
||||
*
|
||||
* `position` IS 1-BASED. schema.org's `ListItem.position` starts at 1, and a
|
||||
* 0-based list is accepted by the validator while ranking the root second.
|
||||
*/
|
||||
function breadcrumbNode(
|
||||
path: string,
|
||||
trail: ReadonlyArray<{ name: string; href: string }>,
|
||||
) {
|
||||
return {
|
||||
'@type': 'BreadcrumbList',
|
||||
'@id': `${SITE.url}${path}#breadcrumbs`,
|
||||
itemListElement: trail.map((crumb, i) => ({
|
||||
'@type': 'ListItem',
|
||||
position: i + 1,
|
||||
name: crumb.name,
|
||||
item: `${SITE.url}${crumb.href}`,
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* `/practice/<area>/` — one `Service`, the `Person`, and a `BreadcrumbList`.
|
||||
*
|
||||
* ⚠️ **A SUBJECT-MATTER AREA IS NOT AN OFFERING (§4), AND `serviceType` MUST
|
||||
* NOT MAKE IT ONE.** It carries the two rowed processes; the area belongs in
|
||||
* `name` and `description`, where it reads as subject matter. A
|
||||
* `serviceType: 'Construction dispute resolution'` would be an unrowed offering
|
||||
* asserted in a field nobody reads — the defect `claims-auditor` caught on the
|
||||
* Person node's `description`.
|
||||
*
|
||||
* Med-arb is left out deliberately: it is offered, and repeating it on six
|
||||
* pages adds nothing `/med-arb/`'s own node does not already say.
|
||||
*
|
||||
* Arbitration is scoped commercial by the union, not by this function — and
|
||||
* **which processes an area carries is the CALLER's**, not this function's.
|
||||
*/
|
||||
export function practiceAreaGraph(opts: {
|
||||
slug: string;
|
||||
/** The area's own name — §4's label, not a service name. */
|
||||
areaName: string;
|
||||
/**
|
||||
* ⚠️ PER AREA. This was fixed at `['Mediation', 'Commercial arbitration']`
|
||||
* for all six, which put a machine-readable offer of commercial arbitration
|
||||
* on `/practice/insurance/` — whose `<h1>` reads "Private mediation, not the
|
||||
* Tribunal's case conference", whose body recites Insurance Act s. 280
|
||||
* exclusive jurisdiction, and whose visible copy offers arbitration nowhere.
|
||||
* docs/04: **structured data represents the page it sits on.** Same family as
|
||||
* the Person node's "Mediator and Commercial Arbitrator", struck 2026-08-27.
|
||||
*/
|
||||
serviceType: PublishableServiceType | readonly PublishableServiceType[];
|
||||
/** Leads the `Service` name. Must describe what `serviceType` carries. */
|
||||
serviceLabel: string;
|
||||
description: string;
|
||||
imageUrl?: string;
|
||||
}) {
|
||||
const path = `/practice/${opts.slug}/`;
|
||||
return serviceGraph({
|
||||
path,
|
||||
name: `${opts.serviceLabel} — ${opts.areaName}`,
|
||||
serviceType: opts.serviceType,
|
||||
description: opts.description,
|
||||
imageUrl: opts.imageUrl,
|
||||
breadcrumbs: [
|
||||
{ name: 'Home', href: '/' },
|
||||
{ name: 'Practice', href: '/practice/' },
|
||||
{ name: opts.areaName, href: path },
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* `/practice/` — the index. **The Person node and nothing else.**
|
||||
*
|
||||
* NO `Service` NODES FOR THE SIX AREAS (each page emits its own), NONE FOR THE
|
||||
* "also offered" STRIP, AND NO `CollectionPage`. The strip is the constraint to
|
||||
* keep: all three are PUBLISHABLE (§4, Q46(a)) but gate 1 on each reads
|
||||
* `[Pouya's stated basis]`, not `[verified]`, and ENE is §4's "offering nearest
|
||||
* the NOT-NEGOTIABLE boundary" — a visible strip read in context is not the
|
||||
* same claim as a machine-readable service type a crawler lifts alone. Adding
|
||||
* any of them needs docs/04 changed first, not this file.
|
||||
*
|
||||
* No `BreadcrumbList`: one hop from the root, no visible trail.
|
||||
*/
|
||||
export function practiceIndexGraph(imageUrl?: string) {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@graph': [personNode(imageUrl)],
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* `/med-arb/`'s graph — the Service, the Person, and a `FAQPage`.
|
||||
*
|
||||
|
||||
+122
-30
@@ -267,6 +267,104 @@ export const ASYMMETRY_LINE =
|
||||
'honest part. A law degree on one side. A working engineering practice on ' +
|
||||
'the other. One is training I hold. The other is work I still do.';
|
||||
|
||||
/**
|
||||
* THE SENTENCE THAT ANSWERS THE CAPACITY QUESTION WITHOUT TAKING A SIDE OF IT.
|
||||
*
|
||||
* `docs/03` ratifies this as a reusable pattern and it took three attempts and
|
||||
* two audits to get here:
|
||||
*
|
||||
* 1. "I do not give legal advice" — an ELECTION. Implies entitlement
|
||||
* withheld by choice. Flagged by audit 1.
|
||||
* 2. "I cannot give legal advice" — a DENIAL of capacity. Flagged by audit 2.
|
||||
* 3. This one — makes no capacity claim at all.
|
||||
*
|
||||
* Both audits were right, and that is why the third version works: 1 and 2 are
|
||||
* opposite answers to a question §4 records as `[unestablished]` and instructs
|
||||
* this repository to answer neither way. The shipped sentence states the ROLE
|
||||
* and the CONSEQUENCE for the reader, and stops.
|
||||
*
|
||||
* IT IS A CONSTANT BECAUSE `docs/03` NAMED WHERE IT WOULD RECUR AND WAS RIGHT:
|
||||
* *"Where this will come up next: `/practice/` (step 5) and `/for-parties/`,
|
||||
* both of which have to tell an unrepresented party what the neutral will and
|
||||
* will not do for them — the exact place the 'cannot' phrasing feels most
|
||||
* natural and is most wrong."* It was typed into `/mediation/` at step 4 and
|
||||
* `/practice/` needs it at step 5, which is two copies of the sentence whose
|
||||
* exact wording IS the compliance. Same argument as `ASYMMETRY_LINE`.
|
||||
*
|
||||
* Three tests before any variant of this ships. It fails if any is yes:
|
||||
* 1. Could a reader infer he IS entitled to do the thing?
|
||||
* 2. Could a reader infer he is NOT?
|
||||
* 3. Does it contain a verb of capacity or permission attached to him at all?
|
||||
*/
|
||||
export const NEUTRAL_ROLE_LINE =
|
||||
'I act as a neutral. I do not act for a party in a matter I take, and each ' +
|
||||
'party should have their own legal advice.';
|
||||
|
||||
/**
|
||||
* THE SIX CONDUCT UNDERTAKINGS — Q54, ANSWERED BY POUYA 2026-08-29.
|
||||
*
|
||||
* A THIRD CLASS OF CLAIM, and the class is his: not a credential (a fact about
|
||||
* him, §4 Verified) and not an offering (a process the practice conducts, §4
|
||||
* Offerings) but **a commitment he has now made**, which binds because he made
|
||||
* it. Under Q43 these are service commitments — publishable the moment he has
|
||||
* said them. He has said them.
|
||||
*
|
||||
* THEY LIVE HERE FOR THE REASON `ROLE` AND `ASYMMETRY_LINE` LIVE HERE: the
|
||||
* wording IS the substance. With a credential, a loose paraphrase overstates a
|
||||
* fact. With an undertaking, a loose paraphrase **changes what was promised** —
|
||||
* and it does so silently, because nothing in a build fails when a promise gets
|
||||
* a little smaller. Pouya's instruction, recorded on the §4 rows: any later
|
||||
* softening is a change to a published commitment, not a copy edit.
|
||||
*
|
||||
* So: render these, never retype them, never trim one to fit a layout, and
|
||||
* never "tighten" one. If one should read differently, that is a decision for
|
||||
* Pouya and a Change Log entry, and the diff on this constant is what makes it
|
||||
* visible as one.
|
||||
*
|
||||
* (c) IS THE EXPENSIVE ONE AND IT SHIPS AS DRAFTED. Pouya's reasoning, kept
|
||||
* because it is the part a future reader would otherwise have to reconstruct:
|
||||
* it is the strongest available answer to the med-arb fairness objection, and
|
||||
* cheaper in practice than it sounds — the arbitral phase runs on the
|
||||
* evidentiary record, not the caucus, so the case where a neutral genuinely
|
||||
* cannot decide without confidential material is uncommon. `/med-arb/` was
|
||||
* raising the hardest question about med-arb and answering it only at the level
|
||||
* of process design.
|
||||
*
|
||||
* ⚠️ (d) AND (e) SHIPPED FOR ONE PASS AT STEP 4 AND WERE REMOVED. `claims-auditor`
|
||||
* found them: the gate was applied to `/med-arb/` in the same change set that
|
||||
* wrote them and not applied one file over. They are here now because they are
|
||||
* answered, not because the gate relaxed.
|
||||
*/
|
||||
export const CONDUCT_UNDERTAKINGS = {
|
||||
/** (a) `/med-arb/` — the switch. */
|
||||
medArbSwitch:
|
||||
'The switch is agreed in writing before the mediation phase begins, or I ' +
|
||||
'do not take the appointment. I will not convert a mediation into an ' +
|
||||
'arbitration on the day because the room has run out of road.',
|
||||
/** (b) `/med-arb/` — caucus material. */
|
||||
medArbCaucus:
|
||||
'If a party tells me something in caucus they are not prepared for me to ' +
|
||||
'rely on as arbitrator, they say so at the time, and it does not enter ' +
|
||||
'the arbitral record.',
|
||||
/** (c) `/med-arb/` — the hard one. See the header. Ships as drafted. */
|
||||
medArbStepOut:
|
||||
'If I cannot decide a remaining issue without relying on something said ' +
|
||||
'to me in confidence, I say so and step out of the arbitral phase rather ' +
|
||||
'than decide on it.',
|
||||
/** (d) `/mediation/` — caucus confidentiality. */
|
||||
mediationCaucus:
|
||||
'What a party tells me in caucus stays in that caucus until they tell me ' +
|
||||
'I may use it, and I do not carry a number across the hall that I was not ' +
|
||||
'given to carry.',
|
||||
/** (e) `/arbitration/` — procedure. */
|
||||
arbitrationProcedure:
|
||||
'I will not run a process whose shape nobody agreed to in advance.',
|
||||
/** (f) `/arbitration/` — the award date. */
|
||||
arbitrationAwardDate:
|
||||
'The date the award is due is fixed in the first procedural order rather ' +
|
||||
'than left open.',
|
||||
} as const; // [verified 2026-08-29 — Pouya, Q54]
|
||||
|
||||
/** The three credential slots. Never matter counts — AGENTS.md §4. */
|
||||
export const CREDENTIAL_ROW = [
|
||||
{ value: 'Q.Med', label: 'ADRIC / ADRIO designation' },
|
||||
@@ -465,47 +563,41 @@ export const PRACTICE_AREAS = [
|
||||
slug: 'energy',
|
||||
name: 'Energy, Grid & Regulatory',
|
||||
chip: 'Energy',
|
||||
/**
|
||||
* ⚠️ NOT "connection allocation" — the IESO uses no such term, and its
|
||||
* connection pages contain zero occurrences of "allocation" of any kind.
|
||||
* The real ones are connection assessment and approval (CAA), System Impact
|
||||
* Assessment and Customer Impact Assessment, and Ontario has NO
|
||||
* interconnection queue. Sourced:
|
||||
* `docs/reference/ontario-energy-regulatory.md`. The OEB's Capacity
|
||||
* Allocation Model is a different thing (housing connections). History in
|
||||
* the AGENTS.md entry of 2026-08-29.
|
||||
*/
|
||||
blurb:
|
||||
'Grid connection and allocation, leave-to-construct, ' +
|
||||
'proponent–municipality disputes, IESO market participation.',
|
||||
'Connection assessment and approval, leave to construct, ' +
|
||||
'proponent–municipality disputes, and IESO market participation.',
|
||||
},
|
||||
{
|
||||
slug: 'insurance',
|
||||
name: 'Insurance, SABS & LAT',
|
||||
chip: 'Insurance',
|
||||
/**
|
||||
* Q41(c) CLOSED 2026-08-27 — and the verification changed the wording again.
|
||||
* ⚠️ NEVER `LAT pre-hearing mediation`, and never a phrasing in which a LAT
|
||||
* proceeding appears to appoint or host the mediator. Rule 2.4 makes
|
||||
* "Pre-Hearing Conference" the Tribunal's own name for a CASE CONFERENCE;
|
||||
* Rule 14.3 puts a Member in the chair. A privately retained neutral cannot
|
||||
* be appointed to it.
|
||||
*
|
||||
* `LAT pre-hearing mediation` (a SEARCH INTENT in `docs/01`, never an
|
||||
* offering) must never be published. Pouya's ruling: *"imprecise and must
|
||||
* not imply appointment by the tribunal. Verify against LAT's own materials
|
||||
* how its case-conference process is conducted and who conducts it."*
|
||||
*
|
||||
* Verified 2026-08-28 against the LAT Rules and the LAT-AABS process page,
|
||||
* both extracted into `docs/reference/lat-case-conference.md`:
|
||||
*
|
||||
* - Rule 2.4: *"'Case Conference' has the same meaning as 'Pre-Hearing
|
||||
* Conference' as defined in the SPPA."* **"Pre-hearing" is the
|
||||
* Tribunal's own label**, and what it names is a case conference.
|
||||
* - Rule 14.3: a **Member** presides, and is then disqualified from the
|
||||
* hearing panel. Rule 14.6: parties must attend. The neutral is the
|
||||
* Tribunal's, and a privately retained one cannot be appointed to it.
|
||||
* - The Rules contain **zero** occurrences of `mediat` or `arbitrat`
|
||||
* (0 in 66,593 characters). The concept is not in them.
|
||||
*
|
||||
* The interim read "private mediation of matters before the LAT", which is
|
||||
* ambiguous in the one word that matters: `before` reads as *pending at* as
|
||||
* easily as *prior to*. Replaced with the temporal frame the Tribunal's own
|
||||
* page endorses — *"you may want to consider negotiation or mediation
|
||||
* services... before filing at the LAT-AABS, and continuing... after a
|
||||
* claim has been filed."*
|
||||
*
|
||||
* `/practice/insurance/` at step 5 must say the mediation is PRIVATE and is
|
||||
* not the Tribunal's case conference.
|
||||
* ⚠️ AND NEVER "before filing or after". The Tribunal names MEDIATION for
|
||||
* one moment only — "Before you apply" — and the "continuing after a claim
|
||||
* has been filed" clause is expressly about NEGOTIATION. The blurb below
|
||||
* carries the distinction `docs/01` requires instead. Sourced:
|
||||
* `docs/reference/lat-case-conference.md`, which holds the full passage and
|
||||
* the correction. History in the AGENTS.md entry of 2026-08-29.
|
||||
*/
|
||||
blurb:
|
||||
'Accident benefits and SABS entitlement, MIG disputes, and private ' +
|
||||
'mediation alongside a LAT application, before filing or after.',
|
||||
"mediation retained by the parties, not the Tribunal's case conference.",
|
||||
},
|
||||
{
|
||||
slug: 'shareholder',
|
||||
|
||||
+34
-11
@@ -30,10 +30,16 @@ import CredentialRow from '../components/CredentialRow.astro';
|
||||
import Eyebrow from '../components/Eyebrow.astro';
|
||||
import Pill from '../components/Pill.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 { serviceGraph } from '../data/schema';
|
||||
import { CREDENTIALS, CREDENTIAL_ROW, CREDENTIAL_ROW_ARB } from '../data/site';
|
||||
import {
|
||||
CONDUCT_UNDERTAKINGS,
|
||||
CREDENTIALS,
|
||||
CREDENTIAL_ROW,
|
||||
CREDENTIAL_ROW_ARB,
|
||||
} from '../data/site';
|
||||
|
||||
const ldImage = await getImage({
|
||||
src: ogDefault,
|
||||
@@ -198,11 +204,15 @@ const TRACKS = [
|
||||
</div>
|
||||
<div class="prose">
|
||||
{
|
||||
/* Sourced: docs/reference/adric-rules.md. ADR CHAMBERS IS DELIBERATELY
|
||||
NOT NAMED — docs/01 item 3 lists it, and nothing in this repository
|
||||
sources what rules it publishes. docs/07 cites it for published FEE
|
||||
ranges, which is a different claim. Name it here once it is sourced;
|
||||
do not name it from recall (R14). */
|
||||
/* Sourced: docs/reference/adric-rules.md.
|
||||
|
||||
⚠️ ADR CHAMBERS IS NOT NAMED HERE, AND MUST NOT BE ADDED BACK.
|
||||
Struck by Pouya 2026-08-30 from this page and from `docs/01` item 3
|
||||
in the same ruling. `docs/reference/adr-institution-names.md`
|
||||
establishes what the firm publishes — it does not establish that an
|
||||
outside neutral can be appointed under its rules, and its own model
|
||||
clause reads "at ADR Chambers". Naming it implies a relationship
|
||||
this repository does not source. ADRIC and ad hoc are enough. */
|
||||
}
|
||||
<p>
|
||||
<strong>The ADRIC Arbitration Rules.</strong> The ADR Institute of Canada
|
||||
@@ -214,8 +224,14 @@ const TRACKS = [
|
||||
<p>
|
||||
<strong>Or ad hoc, or whatever the contract names.</strong> Where a contract
|
||||
names a rule set, a seat and a language and leaves the rest to the tribunal,
|
||||
that works. What does not is a process whose shape nobody agreed to in advance.
|
||||
that works.
|
||||
</p>
|
||||
{
|
||||
/* Q54(e), rowed in §4 as a conduct undertaking. It REPLACED the
|
||||
third-person sentence that made the same point as an observation;
|
||||
do not restore that sentence beside it. */
|
||||
}
|
||||
<Undertaking>{CONDUCT_UNDERTAKINGS.arbitrationProcedure}</Undertaking>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -241,11 +257,18 @@ const TRACKS = [
|
||||
§4 Forbidden bars a time-to-award statistic outright; no figure
|
||||
appears here and none may be added. */
|
||||
}
|
||||
{
|
||||
/* Q54(f), answered by Pouya 2026-08-29 and rowed in §4 as a conduct
|
||||
undertaking. Same replacement as in the Rules section above: this
|
||||
paragraph opened "The date an award is due belongs in the first
|
||||
procedural order", the observation form of the same commitment. The
|
||||
sentence that follows it is unchanged and is the one doing the §4
|
||||
Forbidden work. */
|
||||
}
|
||||
<Undertaking>{CONDUCT_UNDERTAKINGS.arbitrationAwardDate}</Undertaking>
|
||||
<p>
|
||||
The date an award is due belongs in the first procedural order, along
|
||||
with everything else, rather than being left open. No number is
|
||||
published here: a turnaround time advertised in advance of a record is
|
||||
a guess dressed as a commitment.
|
||||
No number is published here: a turnaround time advertised in advance
|
||||
of a record is a guess dressed as a commitment.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+83
-15
@@ -8,25 +8,23 @@
|
||||
* long-term arc. So it is written to be the page that actually explains the
|
||||
* process, not a service blurb.
|
||||
*
|
||||
* THE FAIRNESS SECTION IS WRITTEN ABOUT THE PROCESS, NOT ABOUT POUYA, AND THAT
|
||||
* IS DELIBERATE. docs/03 requires the procedural-fairness objection met head-on
|
||||
* and the consent mechanics explained. What a med-arb AGREEMENT has to settle is
|
||||
* process design and needs no §4 row. What POUYA will personally commit to —
|
||||
* how he handles caucus information he cannot un-hear, and whether he would step
|
||||
* out of the arbitral phase rather than decide on it — is a claim about his
|
||||
* practice, has no §4 row, and is not invented here.
|
||||
* TODO(pouya): AGENTS.md Q54 — confirm the six conduct commitments drafted
|
||||
* there, or replace them. Three are this page's; two shipped here and on
|
||||
* `/mediation/` for one pass before `claims-auditor` removed them.
|
||||
* THE PAGE NOW ANSWERS THE FAIRNESS OBJECTION TWICE, AND THE SECOND HALF IS THE
|
||||
* ONE Q54 UNBLOCKED. The FAQ answers it at the level of PROCESS DESIGN — what a
|
||||
* med-arb agreement has to settle — which describes the process and needs no §4
|
||||
* row. Section 4 answers it at the level of CONDUCT: what Pouya will do. That
|
||||
* half was drafted at step 4 and withheld, because a page may not carry a
|
||||
* commitment its subject has not made. Q54 closed 2026-08-29; §4 now rows all
|
||||
* three as conduct undertakings and the text comes from CONDUCT_UNDERTAKINGS.
|
||||
*/
|
||||
import BaseLayout from '../layouts/BaseLayout.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 { medArbGraph } from '../data/schema';
|
||||
import { CREDENTIALS } from '../data/site';
|
||||
import { CONDUCT_UNDERTAKINGS, CREDENTIALS } from '../data/site';
|
||||
|
||||
const ldImage = await getImage({
|
||||
src: ogDefault,
|
||||
@@ -41,8 +39,8 @@ const ldImage = await getImage({
|
||||
be added to the structured data without appearing on the page. */
|
||||
const FAQ = [
|
||||
{
|
||||
q: 'The neutral who heard my client in caucus then decides the case. How is that fair?',
|
||||
a: 'That is the objection, and it is the right one. A mediator learns things a decision-maker is not supposed to know — what a party would really take, what they are afraid of, what their own counsel thinks of their case. In med-arb the same person may go on to decide it. The answer is not that the concern is overstated. It is that med-arb is only defensible where the parties agree to it knowingly and in advance, in writing, with the switch and its consequences settled before the mediation phase begins — never improvised on the day because the room has run out of road.',
|
||||
q: 'The neutral who heard our client in caucus then decides the case. How is that fair?',
|
||||
a: 'That is the objection, and it is the right one. A mediator learns things a decision-maker is not supposed to know — what a party would really take, what they are afraid of, what their own counsel thinks of their case. In med-arb the same person may go on to decide it. The answer is not that the concern is overstated. It is that med-arb is only defensible where the parties agree to it knowingly and in advance, in writing, with the switch and its consequences settled before the mediation phase begins.',
|
||||
},
|
||||
{
|
||||
q: 'What happens to what we say in caucus?',
|
||||
@@ -149,7 +147,55 @@ const graph = medArbGraph({
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 4. Rules ------------------------------------------------------- */}
|
||||
{/* ---- 4. What I undertake -------------------------------------------- */}
|
||||
{
|
||||
/* Q54, answered 2026-08-29. §4 rows these three as CONDUCT UNDERTAKINGS —
|
||||
neither a credential nor an offering, but a commitment Pouya has made.
|
||||
The strings are CONDUCT_UNDERTAKINGS in src/data/site.ts and are rendered,
|
||||
never retyped: a softened undertaking is a change to a published
|
||||
commitment, not a copy edit. */
|
||||
}
|
||||
<section class="section section-alt reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading
|
||||
eyebrow="What I undertake"
|
||||
level={2}
|
||||
lede="The section above is what the process requires. This is what I do."
|
||||
>
|
||||
<span slot="heading"
|
||||
>Three commitments, and the third is the costly one.</span
|
||||
>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<div class="commitments">
|
||||
<div class="commitment">
|
||||
<h3 class="commitment-h">Agreed first, or not at all.</h3>
|
||||
<Undertaking>{CONDUCT_UNDERTAKINGS.medArbSwitch}</Undertaking>
|
||||
</div>
|
||||
<div class="commitment">
|
||||
<h3 class="commitment-h">
|
||||
A party can put something beyond the arbitral record.
|
||||
</h3>
|
||||
<Undertaking>{CONDUCT_UNDERTAKINGS.medArbCaucus}</Undertaking>
|
||||
</div>
|
||||
<div class="commitment">
|
||||
<h3 class="commitment-h">
|
||||
And if that leaves me unable to decide, I step out.
|
||||
</h3>
|
||||
<Undertaking>{CONDUCT_UNDERTAKINGS.medArbStepOut}</Undertaking>
|
||||
<p class="commitment-note">
|
||||
That is the expensive one, and it is the answer to the objection
|
||||
that costs the neutral something rather than the parties. It is also
|
||||
less costly in practice than it sounds: the arbitral phase runs on
|
||||
the evidentiary record, not on the caucus.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 5. Rules ------------------------------------------------------- */}
|
||||
<section class="section reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
@@ -188,7 +234,7 @@ const graph = medArbGraph({
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 5. The endpoint ------------------------------------------------- */}
|
||||
{/* ---- 6. The endpoint ------------------------------------------------- */}
|
||||
<section class="section section-alt reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
@@ -243,6 +289,28 @@ const graph = medArbGraph({
|
||||
display: grid;
|
||||
gap: var(--space-8);
|
||||
}
|
||||
|
||||
/* One column on purpose. These are three sentences a reader has to weigh one
|
||||
at a time, and a grid invites a scan. `.commitment-h` is an <h3> under the
|
||||
section's <h2> — the level is not skipped. */
|
||||
.commitments {
|
||||
display: grid;
|
||||
gap: var(--space-8);
|
||||
max-inline-size: var(--width-prose);
|
||||
}
|
||||
.commitment-h {
|
||||
margin-block-end: var(--space-4);
|
||||
max-inline-size: 46ch;
|
||||
font-size: var(--text-xl);
|
||||
line-height: var(--leading-tight);
|
||||
}
|
||||
.commitment-note {
|
||||
margin-block-start: var(--space-4);
|
||||
padding-inline-start: var(--space-5);
|
||||
max-inline-size: 54ch;
|
||||
line-height: var(--leading-body);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
.faq-q {
|
||||
max-inline-size: 46ch;
|
||||
font-size: var(--text-2xl);
|
||||
|
||||
@@ -14,10 +14,16 @@ import CredentialRow from '../components/CredentialRow.astro';
|
||||
import Eyebrow from '../components/Eyebrow.astro';
|
||||
import PracticeCard from '../components/PracticeCard.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 { serviceGraph } from '../data/schema';
|
||||
import { CREDENTIAL_ROW, PRACTICE_AREAS } from '../data/site';
|
||||
import {
|
||||
CONDUCT_UNDERTAKINGS,
|
||||
CREDENTIAL_ROW,
|
||||
NEUTRAL_ROLE_LINE,
|
||||
PRACTICE_AREAS,
|
||||
} from '../data/site';
|
||||
|
||||
const ldImage = await getImage({
|
||||
src: ogDefault,
|
||||
@@ -93,14 +99,17 @@ const FORMATS = [
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<div class="prose">
|
||||
<p>
|
||||
I act as a neutral. I do not act for a party in a matter I take, and
|
||||
each party should have their own legal advice.
|
||||
</p>
|
||||
{
|
||||
/* NEUTRAL_ROLE_LINE, not typed. docs/03's worked example — three
|
||||
attempts, two audits — and `/practice/` needs the same sentence at
|
||||
step 5, which is the point at which a hand-typed copy starts to
|
||||
drift. */
|
||||
}
|
||||
<p>{NEUTRAL_ROLE_LINE}</p>
|
||||
<p>
|
||||
What I bring to a commercial file is that I read the contract and the
|
||||
technical record underneath it — the change orders, the schedule, the
|
||||
model card, the interconnection study — rather than either side's
|
||||
model card, the system impact assessment — rather than either side's
|
||||
summary of them.
|
||||
</p>
|
||||
</div>
|
||||
@@ -196,10 +205,19 @@ const FORMATS = [
|
||||
Confidentiality is set by the agreement to mediate, and that is signed
|
||||
before the session rather than described on a website. The part worth
|
||||
settling in it explicitly is the caucus: what a mediator may carry
|
||||
from one room to the other, and what a party has to say to hold
|
||||
something back. An agreement that leaves that implicit is the one that
|
||||
produces an argument on the day.
|
||||
from one room to the other, and how a party releases something for
|
||||
use. An agreement that leaves that implicit is the one that produces
|
||||
an argument on the day.
|
||||
</p>
|
||||
{
|
||||
/* Q54(d), answered by Pouya 2026-08-29 and rowed in §4 as a conduct
|
||||
undertaking. The paragraph above describes what the AGREEMENT should
|
||||
settle; this is what he does, which is the half a party weighs. It
|
||||
shipped here for one pass at step 4 and `claims-auditor` removed it,
|
||||
correctly — the gate had been applied one file over and not to this
|
||||
one. Rendered from the constant, never retyped. */
|
||||
}
|
||||
<Undertaking>{CONDUCT_UNDERTAKINGS.mediationCaucus}</Undertaking>
|
||||
{
|
||||
/* The without-prejudice question is answered by pointing, not by
|
||||
characterising legal effect. AGENTS.md §4 bars this repository from
|
||||
|
||||
@@ -0,0 +1,244 @@
|
||||
---
|
||||
/**
|
||||
* `/practice/` — build step 5. Spec: docs/01 §`/practice/` — index.
|
||||
*
|
||||
* TWO JOBS: route to the six area pages, and carry the "also offered" strip.
|
||||
*
|
||||
* ⚠️ THE STRIP'S TWO FRAMING CONSTRAINTS ARE NOT DISCRETIONARY, and they
|
||||
* survived the ruling that unblocked it (§4 Q46(a), docs/01):
|
||||
*
|
||||
* 1. **ENE is an assessment delivered to BOTH parties**, never advice to one.
|
||||
* §4 calls it "the offering nearest the NOT-NEGOTIABLE boundary" — a
|
||||
* neutral assessment of the MERITS sits closest to "providing legal
|
||||
* services", which is the gated side of §4's line.
|
||||
* 2. **Pre-dispute advisory carries a conflict caution**, and §4 names this
|
||||
* page as "where the temptation to imply it will arise": advisory work for
|
||||
* one organisation can conflict against a later appointment in the same
|
||||
* matter. No copy may imply the offering is free of that tension. It is
|
||||
* stated in its own paragraph rather than inside a grid cell, because a
|
||||
* caution a reader has to find is a caution that was not given.
|
||||
*
|
||||
* ⚠️ AND SETTLEMENT COUNSEL IS STRUCK FROM THIS STRIP AND MUST NOT BE RESTORED.
|
||||
* §4 Q42, Pouya correcting his own entry in docs/01: it acts FOR a party, which
|
||||
* fails gate 0 before the offering test starts. The positioning objection comes
|
||||
* first — it would be wrong on a site with no licensure question at all.
|
||||
*
|
||||
* Gate 1 on all three reads `[Pouya's stated basis 2026-08-28]` and NOT
|
||||
* `[verified]`; there is no source in `docs/reference/` for any of them. So
|
||||
* nothing here describes any of it as settled law, and nothing here says or
|
||||
* implies what the law requires of anyone.
|
||||
*/
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import Button from '../components/Button.astro';
|
||||
import ContactBand from '../components/ContactBand.astro';
|
||||
import DefinitionGrid from '../components/DefinitionGrid.astro';
|
||||
import Eyebrow from '../components/Eyebrow.astro';
|
||||
import PracticeCard from '../components/PracticeCard.astro';
|
||||
import SectionHeading from '../components/SectionHeading.astro';
|
||||
import { getImage } from 'astro:assets';
|
||||
import ogDefault from '../assets/og-portrait.jpg';
|
||||
import { practiceIndexGraph } from '../data/schema';
|
||||
import { NEUTRAL_ROLE_LINE, PRACTICE_AREAS } from '../data/site';
|
||||
|
||||
const ldImage = await getImage({
|
||||
src: ogDefault,
|
||||
format: 'jpeg',
|
||||
width: 1200,
|
||||
height: 630,
|
||||
});
|
||||
const graph = practiceIndexGraph(new URL(ldImage.src, Astro.site).href);
|
||||
|
||||
/* THREE, NOT FOUR. Each has a §4 Offerings row reading PUBLISHABLE (Q46(a),
|
||||
2026-08-28). Do not add a fourth without a row, and do not restore the one
|
||||
that was struck. */
|
||||
const ALSO_OFFERED = [
|
||||
{
|
||||
name: 'Early neutral evaluation',
|
||||
body: 'A reasoned assessment of the merits, delivered to both parties together, early enough to change what they do next. It is not advice to one side and it does not bind anyone. Parties use it where the gap between two positions is a disagreement about how a case would actually go.',
|
||||
},
|
||||
{
|
||||
name: 'Dispute-system design',
|
||||
body: 'Building the escalation and resolution machinery into a contract or a programme before there is a dispute — tiered clauses, who decides what and when, what triggers each stage. Advisory work for an organisation, not an appointment.',
|
||||
},
|
||||
{
|
||||
name: 'Pre-dispute technical advisory',
|
||||
body: 'Reading the technical record in a matter that has not become a dispute yet: the change orders and the schedule, the system impact assessment, the model card and the data-processing terms. Read the paragraph below before proposing this one.',
|
||||
},
|
||||
];
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
title="Practice Areas · Pouya Lajevardi · Mediation and Arbitration"
|
||||
description="Six areas where a commercial dispute usually turns on something technical: construction, technology, energy, insurance, shareholder, and cross-border matters."
|
||||
jsonLd={graph}
|
||||
>
|
||||
{/* ---- 1. Hero -------------------------------------------------------- */}
|
||||
<section class="section hero">
|
||||
<div class="wrap">
|
||||
<Eyebrow dot>Practice</Eyebrow>
|
||||
<h1 class="display hero-h">Six areas, one reason.</h1>
|
||||
<p class="hero-lede">
|
||||
Each of these is a place where a commercial dispute turns on a document
|
||||
somebody has to actually read — a subcontract, a system impact
|
||||
assessment, a processing agreement, a benefits file. The process is
|
||||
mediation or arbitration. The area is the context it runs in.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 2. The six ----------------------------------------------------- */}
|
||||
<section class="section section-alt reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading
|
||||
eyebrow="Subject matter"
|
||||
level={2}
|
||||
lede="Dispute types, the process shape, and why the area is live — one page each."
|
||||
>
|
||||
<span slot="heading">Where I take appointments.</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<div class="grid-autofit areas-grid">
|
||||
{
|
||||
PRACTICE_AREAS.map((area) => (
|
||||
<PracticeCard
|
||||
href={`/practice/${area.slug}/`}
|
||||
chip={area.chip}
|
||||
title={area.name}
|
||||
level={3}
|
||||
>
|
||||
{area.blurb}
|
||||
</PracticeCard>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 3. The role ---------------------------------------------------- */}
|
||||
{
|
||||
/* docs/03 names this page as one of the two places the "cannot" phrasing
|
||||
feels most natural and is most wrong. NEUTRAL_ROLE_LINE is the sentence
|
||||
that took three attempts and two audits; it is rendered, never retyped. */
|
||||
}
|
||||
<section class="section reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading eyebrow="The role" level={2}>
|
||||
<span slot="heading">The same role in all six.</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<div class="prose">
|
||||
<p>{NEUTRAL_ROLE_LINE}</p>
|
||||
<p>
|
||||
What changes between these pages is the record underneath the dispute
|
||||
and the vocabulary it is written in. What does not change is the
|
||||
appointment: I run a process, I do not run a case for anybody in it.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 4. Also offered ------------------------------------------------ */}
|
||||
<section class="section section-inverse reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading
|
||||
eyebrow="Also offered"
|
||||
level={2}
|
||||
lede="Three engagements that are not a mediation or an arbitration. Priced hourly."
|
||||
>
|
||||
<span slot="heading">Before, or instead of, a process.</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<DefinitionGrid items={ALSO_OFFERED} minColumn="20rem" />
|
||||
{
|
||||
/* §4's conflict caution, in its own paragraph. It is practice
|
||||
management rather than a publication gate — and §4 names this strip as
|
||||
the place the temptation to imply the tension away will arise. */
|
||||
}
|
||||
<p class="caution">
|
||||
<strong>One thing to know about the third.</strong> Advising one organisation
|
||||
before a dispute can conflict me out of an appointment in the same matter
|
||||
later. That is not a reason to avoid the work, but it is a reason to decide
|
||||
which one you want from me first — and to raise it at the outset rather than
|
||||
after a file has developed.
|
||||
</p>
|
||||
<div class="cta">
|
||||
<Button href="/fees/" variant="gold">Hourly rate →</Button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 5. Onward ------------------------------------------------------ */}
|
||||
<section class="section reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading eyebrow="The processes" level={2}>
|
||||
<span slot="heading">And how each of them runs.</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<div class="prose">
|
||||
<p>
|
||||
The area pages describe the disputes. These describe the process the
|
||||
parties are choosing between, in commercial matters.
|
||||
</p>
|
||||
<p class="onward">
|
||||
<a href="/mediation/">Mediation →</a>
|
||||
<a href="/arbitration/">Arbitration →</a>
|
||||
<a href="/med-arb/">Med-arb →</a>
|
||||
</p>
|
||||
</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);
|
||||
}
|
||||
|
||||
/* `.grid-autofit` (global.css) carries the columns and the `min()` guard. */
|
||||
.areas-grid {
|
||||
gap: var(--space-5);
|
||||
}
|
||||
|
||||
.caution {
|
||||
margin-block-start: var(--space-8);
|
||||
padding-inline-start: var(--space-5);
|
||||
border-inline-start: 2px solid var(--rule);
|
||||
max-inline-size: 58ch;
|
||||
line-height: var(--leading-body);
|
||||
color: var(--text-inverse-2);
|
||||
}
|
||||
.cta {
|
||||
margin-block-start: var(--space-7);
|
||||
}
|
||||
|
||||
/* A ROW OF STANDALONE CTAs, NOT PROSE, so WCAG 2.5.8's inline-link exception
|
||||
does not cover it — the same finding measured on `/med-arb/` at 390px.
|
||||
`inline-flex` + `min-block-size` is what `.btn`, the nav and the footer
|
||||
all use. */
|
||||
.onward {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2) var(--space-6);
|
||||
}
|
||||
.onward a {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-block-size: 44px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,265 @@
|
||||
---
|
||||
/**
|
||||
* `/practice/<area>/` — build step 5, all six pages. Spec: docs/01 §each area,
|
||||
* docs/03 §Practice areas, docs/04 §Structured data.
|
||||
*
|
||||
* ONE ROUTE, SIX PAGES, AND THE CONTENT IS DATA. `src/data/practice-pages.ts`
|
||||
* holds the copy; this file holds the shape. The alternative was six `.astro`
|
||||
* files with the same eight sections in each, which is six places for a
|
||||
* heading level to drift, six breadcrumb trails to keep matching six
|
||||
* `BreadcrumbList` nodes, and six chances to forget the onward links docs/04
|
||||
* requires ("Every practice page links to /mediation/ and /arbitration/").
|
||||
*
|
||||
* AND IT MAKES COMPLETENESS A BUILD ERROR. `PRACTICE_PAGES` is annotated
|
||||
* `Record<PracticeSlug, PracticePage>` — an annotation, never `as const
|
||||
* satisfies` — so an area in the nav with no page, or a page with no area, does
|
||||
* not compile. `docs/01` calls
|
||||
* `/practice/<area>/` "a stable namespace"; this is what keeps it one.
|
||||
*
|
||||
* ⚠️ EVERY FACT ABOUT THE WORLD ON THESE SIX PAGES IS SOURCED IN
|
||||
* `docs/reference/`, AND THAT IS R14 RATHER THAN THOROUGHNESS. A statute
|
||||
* section, a tribunal's process, a regulator's name, a programme's status —
|
||||
* each is a claim, and a claim nobody can check against a committed artefact is
|
||||
* unverifiable by construction. The market context these pages need is exactly
|
||||
* the material this project has twice got wrong from recall: the ADRIC rules
|
||||
* had the wrong name in `docs/01`, and §4 reasoned from a false universal about
|
||||
* arbitral gating for a day. Where a fetch could not establish something, the
|
||||
* page does not say it.
|
||||
*/
|
||||
import type { GetStaticPaths } from 'astro';
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Breadcrumbs from '../../components/Breadcrumbs.astro';
|
||||
import ContactBand from '../../components/ContactBand.astro';
|
||||
import DefinitionGrid from '../../components/DefinitionGrid.astro';
|
||||
import Eyebrow from '../../components/Eyebrow.astro';
|
||||
import SectionHeading from '../../components/SectionHeading.astro';
|
||||
import { getImage } from 'astro:assets';
|
||||
import ogDefault from '../../assets/og-portrait.jpg';
|
||||
import { practiceAreaGraph } from '../../data/schema';
|
||||
import { PRACTICE_AREAS } from '../../data/site';
|
||||
import { PRACTICE_PAGES } from '../../data/practice-pages';
|
||||
|
||||
export const getStaticPaths = (() =>
|
||||
PRACTICE_AREAS.map((area) => ({
|
||||
params: { slug: area.slug },
|
||||
props: { area, page: PRACTICE_PAGES[area.slug] },
|
||||
}))) satisfies GetStaticPaths;
|
||||
|
||||
const { area, page } = Astro.props;
|
||||
|
||||
const ldImage = await getImage({
|
||||
src: ogDefault,
|
||||
format: 'jpeg',
|
||||
width: 1200,
|
||||
height: 630,
|
||||
});
|
||||
|
||||
/* THE SAME TRAIL FEEDS BOTH the visible <Breadcrumbs> and the BreadcrumbList
|
||||
node, because docs/04 requires them to match and two arrays would eventually
|
||||
not. `practiceAreaGraph` builds it from the area name; this renders it. */
|
||||
const trail = [
|
||||
{ name: 'Home', href: '/' },
|
||||
{ name: 'Practice', href: '/practice/' },
|
||||
{ name: area.name, href: `/practice/${area.slug}/` },
|
||||
];
|
||||
|
||||
const graph = practiceAreaGraph({
|
||||
slug: area.slug,
|
||||
areaName: area.name,
|
||||
serviceType: page.serviceType,
|
||||
serviceLabel: page.serviceLabel,
|
||||
description: page.description,
|
||||
imageUrl: new URL(ldImage.src, Astro.site).href,
|
||||
});
|
||||
|
||||
/* Ground alternation is declared per section in the data rather than computed
|
||||
from the index, so inserting a section cannot silently restyle the three
|
||||
below it. Absent means the page's own cream. */
|
||||
const GROUND = { alt: 'section-alt', inverse: 'section-inverse' } as const;
|
||||
|
||||
/**
|
||||
* AND THE DECLARATION IS CHECKED, BECAUSE DECLARING IT BY HAND GOT IT WRONG ON
|
||||
* ALL SIX PAGES AT ONCE.
|
||||
*
|
||||
* Two adjacent sections on the same ground render as one doubled block with a
|
||||
* heading floating in the middle of it. The dispute-types section above is
|
||||
* fixed `alt` and the onward section below is fixed cream, so the declared
|
||||
* grounds have to alternate against **both ends** of the array as well as
|
||||
* against each other — which is exactly the kind of invariant a comment does
|
||||
* not enforce. Measured on the first build of these pages: every one shipped
|
||||
* `alt` immediately after `alt`. `/med-arb/` had the cream-on-cream form of the
|
||||
* same defect in the same change set.
|
||||
*
|
||||
* This is the pattern that works on this project — the one Pouya identified on
|
||||
* 2026-08-29: *"prose in a comment does not govern the writing that follows
|
||||
* it… the pattern that actually worked was mechanical."* So it throws.
|
||||
*/
|
||||
const groundRun = [
|
||||
'alt',
|
||||
...page.sections.map((section) => section.ground ?? 'cream'),
|
||||
'cream',
|
||||
];
|
||||
const clash = groundRun.findIndex(
|
||||
(ground, i) => i > 0 && ground === groundRun[i - 1],
|
||||
);
|
||||
if (clash !== -1) {
|
||||
throw new Error(
|
||||
`Two adjacent sections share a ground on /practice/${area.slug}/.\n` +
|
||||
` sequence: ${groundRun.join(' -> ')}\n` +
|
||||
` clash at position ${clash} ("${groundRun[clash]}" twice)\n` +
|
||||
` The first entry is the fixed dispute-types section and the last is the\n` +
|
||||
` fixed onward section; only the middle ones come from practice-pages.ts.\n` +
|
||||
` Change a 'ground' there — do not delete this check.`,
|
||||
);
|
||||
}
|
||||
---
|
||||
|
||||
<BaseLayout title={page.title} description={page.description} jsonLd={graph}>
|
||||
{/* ---- 1. Hero -------------------------------------------------------- */}
|
||||
<section class="section hero">
|
||||
<div class="wrap">
|
||||
<Breadcrumbs trail={trail} />
|
||||
<Eyebrow dot>{area.chip}</Eyebrow>
|
||||
<h1 class="display hero-h">{page.h1}</h1>
|
||||
<p class="hero-lede">{page.lede}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 2. Dispute types ------------------------------------------------ */}
|
||||
{
|
||||
/* docs/03 §Practice areas leads with these: "Each page: dispute types, why
|
||||
this practice fits, what the process looks like, and the market context
|
||||
that makes the area live." Concrete nouns first — docs/03 §Voice:
|
||||
"Specificity is the credential." */
|
||||
}
|
||||
<section class="section section-alt reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading
|
||||
eyebrow="What comes up"
|
||||
level={2}
|
||||
lede={page.disputeTypesLede}
|
||||
>
|
||||
<span slot="heading">The disputes.</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<DefinitionGrid items={page.disputeTypes} minColumn="20rem" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 3..n. The page's own sections ---------------------------------- */}
|
||||
{
|
||||
page.sections.map((section) => (
|
||||
<section
|
||||
class:list={[
|
||||
'section',
|
||||
'reveal',
|
||||
section.ground && GROUND[section.ground],
|
||||
]}
|
||||
>
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading
|
||||
eyebrow={section.eyebrow}
|
||||
level={2}
|
||||
lede={section.lede}
|
||||
>
|
||||
<span slot="heading">{section.heading}</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<div class="prose">
|
||||
{section.paragraphs.map((para) => (
|
||||
<p>
|
||||
{para.lead && <strong>{para.lead}</strong>}
|
||||
{para.lead ? ` ${para.text}` : para.text}
|
||||
</p>
|
||||
))}
|
||||
</div>
|
||||
{section.note && <p class="note">{section.note}</p>}
|
||||
</div>
|
||||
</section>
|
||||
))
|
||||
}
|
||||
|
||||
{/* ---- n+1. Onward ----------------------------------------------------- */}
|
||||
{
|
||||
/* docs/04 §Internal linking: "Every practice page links to /mediation/ and
|
||||
/arbitration/; those link back to the practice areas." It is in the shared
|
||||
template rather than in each page's data so it cannot be forgotten on one
|
||||
of six. */
|
||||
}
|
||||
<section class="section reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading eyebrow="The process" level={2}>
|
||||
<span slot="heading">And how it would run.</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
<div class="prose">
|
||||
<p>
|
||||
The area is the subject matter. The process is what the parties are
|
||||
choosing between, and each of these describes one — the formats, the
|
||||
rules, and what a party is expected to do and when.
|
||||
</p>
|
||||
<p class="onward">
|
||||
<a href="/mediation/">Mediation →</a>
|
||||
<a href="/arbitration/">Arbitration →</a>
|
||||
<a href="/med-arb/">Med-arb →</a>
|
||||
<a href="/practice/">All six areas →</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<ContactBand />
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
.hero {
|
||||
padding-block-start: var(--space-8);
|
||||
}
|
||||
.hero-h {
|
||||
margin-block: var(--space-4) var(--space-5);
|
||||
font-size: var(--text-5xl);
|
||||
max-inline-size: 20ch;
|
||||
}
|
||||
.hero-lede {
|
||||
max-inline-size: 58ch;
|
||||
font-size: var(--text-lg);
|
||||
line-height: var(--leading-body);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
/* The breadcrumb sits above the eyebrow, so the eyebrow needs the gap the
|
||||
hero's top padding used to supply on the other pages. */
|
||||
.hero :global(.crumbs) {
|
||||
margin-block-end: var(--space-5);
|
||||
}
|
||||
|
||||
/* `color: inherit` DELIBERATELY. This treatment appears on cream, on the alt
|
||||
ground and on the inverse ground depending on the section it belongs to,
|
||||
and a fixed colour would be unreadable on one of the three. The gold rule
|
||||
is what carries the emphasis, and it is decorative — docs/02: gold on cream
|
||||
is 2.10:1 and never sets text. */
|
||||
.note {
|
||||
margin-block-start: var(--space-7);
|
||||
padding-inline-start: var(--space-5);
|
||||
border-inline-start: 2px solid var(--rule);
|
||||
max-inline-size: 58ch;
|
||||
line-height: var(--leading-body);
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* Standalone CTAs, not prose, so WCAG 2.5.8's inline-link exception does not
|
||||
cover them — measured on `/med-arb/` at 390px: three targets 21px tall
|
||||
against docs/02's 44px floor. */
|
||||
.onward {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2) var(--space-6);
|
||||
}
|
||||
.onward a {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-block-size: 44px;
|
||||
}
|
||||
</style>
|
||||
@@ -407,6 +407,10 @@ a:hover {
|
||||
.section-accent {
|
||||
--pill-border: var(--line-dark);
|
||||
--pill-fg: var(--text-inverse-2);
|
||||
/* `DefinitionGrid`'s <dt>. Added 2026-08-29: --text-meta is --muted, which
|
||||
tokens.css marks ON CREAM ONLY (3.07:1 on ink), and `/practice/` is the
|
||||
first page to put that component on an inverse ground. */
|
||||
--def-name-fg: var(--text-inverse-2);
|
||||
}
|
||||
|
||||
hr {
|
||||
@@ -605,6 +609,7 @@ hr {
|
||||
--text-inverse: #000;
|
||||
--text-inverse-2: #000;
|
||||
--pill-fg: #000;
|
||||
--def-name-fg: #000;
|
||||
--pill-border: #000;
|
||||
--rule: #000;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user