--- /** * `/bio/` — the one-page bio, and the SOURCE of the PDF. Build step 9. * Discharges `AGENTS.md` R16 / Q45. * * ⚠️ **R16 LEFT TWO DECISIONS OPEN AND BOTH ARE TAKEN HERE, UNDER STANDING * AUTHORISATION. Read them before changing anything.** * * **(a) Generated at build, or authored once as a designed artefact?** Neither, * exactly — and the third option is better than both. The bio is a PAGE in this * repository, so every line of it is reviewed by the same apparatus that reviews * every other page: `astro check`, `npm run check:claims` on the built HTML, the * adversarial review, and the cutover claims pass. The PDF is then RENDERED from * this page by `npm run bio:pdf`, deterministically, with no new dependency — * `chrome-launcher` is already a devDependency because Lighthouse needs it. * * That answers R16's actual worry, which was never about tooling: *"It is the * one artefact class this project's review apparatus cannot reach. A web page is * re-reviewed by every audit; a PDF circulated with an appointment proposal is * read once, by the reader who matters most, and never seen by a reviewer * again."* Making the PDF a rendering of a reviewed page puts it back inside the * apparatus. **It is not generated during `astro build`** — CI has no Chrome, and * a build step that cannot run in CI is the Q22 shape again. * * **(b) Does it carry anything the site does not? NO.** Every line here renders * from the same constants as the pages: `CREDENTIALS`, `ROLE`, `BOUTIQUE`, * `PRACTICE_AREAS`, `FEES`, `CONTACT`. R16 flagged that both open sub-decisions * were "each a §4 question of its own, and the matter list would collide with §4 * Forbidden directly" — so the answer that avoids both is a bio that adds * nothing. No matter list, no referees, no figure that is not on `/fees/`. The * fee summary IS here, because R16's own reasoning says an appointment proposal * needs the rate card as much as the bio, and every figure in it is `/fees/`'s. * * `noindex`, and excluded from the sitemap in `astro.config.mjs`: it is a * condensed duplicate of `/about/` and `/fees/`, and two URLs competing on the * same content is the one thing `docs/04` is most concerned with. * * PRINT LAYOUT. `global.css`'s `@media print` block already hides the header, * the footer and the skip link, neutralises the inverse grounds, and disables * the reveal — all of it added because `/about/` is printed by people evaluating * an appointment. This page adds only what makes it fit ONE sheet, and * `scripts/bio-pdf.mjs` ASSERTS the page count rather than trusting it. */ import BaseLayout from '../layouts/BaseLayout.astro'; import Eyebrow from '../components/Eyebrow.astro'; import { getImage } from 'astro:assets'; import ogDefault from '../assets/og-portrait.jpg'; import { pageGraph } from '../data/schema'; import { BOUTIQUE, CONTACT, CREDENTIALS, FEES, PRACTICE_AREAS, ROLE, SITE, } from '../data/site'; const ldImage = await getImage({ src: ogDefault, format: 'jpeg', width: 1200, height: 630, }); const graph = pageGraph(new URL(ldImage.src, Astro.site).href); const money = (amount: number) => new Intl.NumberFormat('en-CA', { style: 'currency', currency: FEES.currency, maximumFractionDigits: 0, }).format(amount); const { halfDay, fullDay } = FEES.mediation; /* The processes, each with a §4 Offerings row. Arbitration is scoped commercial because Q39's gate is a legal one; mediation is unscoped because it has no such gate (Q56). The asymmetry is designed — do not tidy it. */ const PROCESSES = [ 'Mediation — sole mediator', 'Commercial arbitration — sole, party-appointed, co-arbitration', 'Med-arb — mediation converting to binding arbitration, agreed in advance', 'Early neutral evaluation — delivered to both parties together', 'Dispute-system design', 'Pre-dispute technical advisory', ]; ---
{ /* The download sits above the sheet and is `.no-print`, so the printed copy does not carry a link to itself. */ }

This page is the source of the one-page PDF. Download the PDF, or print this page.

{ /* THE EYEBROW IS `.no-print`, AND IT IS HERE BECAUSE `og:proof` ASKED FOR IT. That check compares each card's eyebrow against its page's first `.eyebrow`, and this page had none — so the card said "Bio" against nothing. The options were to weaken the check or to give the page the element every other page has; weakening a check to match an artefact is how a control stops controlling. On paper the sheet leads with the name, so the eyebrow prints away. */ }
Bio

{SITE.name}

{CREDENTIALS.designations.join(' · ')}

{SITE.tagline}

The practice

{ /* ⚠️ NO LEADING SCOPE. This sentence read "I act as a neutral in commercial disputes — as a mediator, as an arbitrator in commercial matters, and in med-arb…", and the leading clause scoped ALL THREE, mediation included. §4's mediation row is unscoped deliberately (Q56) and says in terms: "do not scope it on a page." It is the `/practice/` shape exactly — the two words never appear in the same element, so no proximity grep reaches it — and it was found by reading the rendered PDF. The scope belongs on the arbitration clause alone, where Q39's legal gate puts it. */ } I act as a neutral — as a mediator, as an arbitrator in commercial matters, and in med-arb where the parties want one neutral across both phases. I read the contract and the technical record underneath it rather than either side's summary of them.

I am {ROLE.title} at {BOUTIQUE}, with {ROLE.litigationLine} across {' '}{ROLE.litigationAreas.join(', ')} matters. I am also a practising machine-learning and infrastructure engineer, which is what lets me work through a technical record at first hand.

Designations

    {CREDENTIALS.designations.map((d) =>
  • {d}
  • )}

Education

    {CREDENTIALS.education.map((d) =>
  • {d}
  • )}

Certifications

    {CREDENTIALS.certifications.map((d) =>
  • {d}
  • )}

Memberships

    {CREDENTIALS.memberships.map((d) =>
  • {d}
  • )}

Languages

  • {CREDENTIALS.languages.join(' and ')}, without an interpreter

Processes

    {PROCESSES.map((p) =>
  • {p}
  • )}

Subject matter

    {PRACTICE_AREAS.map((area) =>
  • {area.name}
  • )}

Family arbitration under the Family Law Act is not offered.

Rates

  • Half day, up to {halfDay.hours} hours of session — { money(halfDay.amount) }. Fee includes up to {halfDay.prepIncluded} hours of preparation.
  • Full day, up to {fullDay.hours} hours of session — { money(fullDay.amount) }. Fee includes up to {fullDay.prepIncluded} hours of preparation.
  • Each party beyond two — {money(FEES.mediation.additionalParty)}. Overtime beyond the session hours the fee covers — {' '}{money(FEES.mediation.overtimePerHour)} an hour. {' '}{FEES.mediation.reservation}
  • Arbitration — {money(FEES.arbitration.perHour)} an hour, {' '}{money(FEES.arbitration.hearingDay)} a hearing day, or a flat fee for documents-only and expedited references.
  • {FEES.taxNote} The full card, the cancellation schedule and the terms are published at {SITE.url}/fees/.

Contact

{CONTACT.email} · {CONTACT.phoneFallback} · {CONTACT.location}
{CONTACT.responseTime} · {SITE.url} · {CONTACT.linkedin}