feat: D20 moves the claims pass to cutover; rule Q56 unscoped; close Q55; freeze check:claims

Four rulings from Pouya, 2026-08-30, and their sweep.

D20 — the review protocol. Per build step the review is `adversarial-reviewer`
alone. `claims-auditor` no longer runs per step; it runs ONCE, at cutover, over
the whole finished site, as a blocking item near the top of docs/06's checklist.
`check:claims` is unchanged and still runs on every build and both deploy paths.
The reasoning is recorded in full in AGENTS.md D20, as a calibration and not an
erosion: nothing has shipped, so every claims finding so far has been about a
page no visitor can reach, and one pass over twenty finished pages catches more
than nine passes over drafts because it sees the site as a reader does. The
/med-arb/ ADRIC gloss is the proof — no individual claim was false, the defect
was adjacency, and adjacency does not exist until the pages sit next to each
other. The code reviewer stays per step because what it catches compounds.
What this costs is recorded honestly beside it, not summarised away.

D17 and D19 amended to match. D19's two-round cap governs the per-step code
review only; the single cutover claims pass runs until its findings are
resolved, because there is no second pass behind it.

Q56 — mediation is NOT scoped commercial. Thirteen shipped strings corrected
across five files: page titles, meta descriptions, hero ledes, section ledes,
the `Service` node's name and description, and `ProfessionalService`'s. §4's
mediation row stays unscoped, and the reason now sits beside both rows so the
asymmetry reads as designed: arbitration is scoped commercial because of a
LEGAL GATE (Q39 — family arbitration in Ontario requires prescribed training);
mediation has no such gate. `adversarial-reviewer` then found three surfaces
the sweep had missed, the worst on /practice/ — "These describe the process the
parties are choosing between, in commercial matters" scoped mediation with the
two words never appearing in the same element, so no proximity grep reached it.

Q55 — CLOSED WITHOUT BEING RESOLVED, and the difference is the ruling. The
Q.Arb stamp is split: `[verified]` on the status, `[Pouya's stated basis]` on
the date. The 2026-08-26 record is marked UNRECONCILED, permanently and on
purpose. The date is not published and nothing depends on it.

check:claims — FROZEN. Round 2 found five defects in round 1's own fixes to
that script, two of which made it worse than before the pattern existed. A
pattern is added only after a real breach reaches dist/, never speculatively,
and each addition ships with a probe plus a negative fixture. No refactors, no
coverage improvements. It is a tripwire, not a program.

Two conventions into CLAUDE.md: sweep the VOCABULARY, not only the subject
(`git grep 'Q.Arb'` is line-anchored and could not find ten lines entirely
about Q.Arb that never name it); and agent definitions load at session start,
so an edit to .claude/agents/*.md does not reach the session that made it.

Verified: check 0 errors, lint 0, build 0 (12 pages), check:claims 0.
Lighthouse not run — tool unavailable until build step 7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
Pouya Lajevardi
2026-08-31 07:33:06 -04:00
co-authored by Claude Opus 5
parent 610edc24fd
commit 2ea4c0f8ac
14 changed files with 520 additions and 125 deletions
+29 -1
View File
@@ -1,6 +1,6 @@
--- ---
name: claims-auditor name: claims-auditor
description: Audits every factual assertion in site copy against the verified claim register in AGENTS.md section 4. Invoked before any page or article is considered complete. This is the professional-conduct guard, not a proofreading pass. description: Audits every factual assertion in site copy against the verified claim register in AGENTS.md section 4. Under D20 this runs ONCE, at cutover, over the whole finished site — not per build step. This is the professional-conduct guard, not a proofreading pass.
tools: Read, Grep, Glob tools: Read, Grep, Glob
model: opus model: opus
--- ---
@@ -13,6 +13,34 @@ The site this replaces contained a fictitious founder, invented matter values
and a testimonial attributed to a person who does not exist. Your existence is and a testimonial attributed to a person who does not exist. Your existence is
the control that stops that recurring. the control that stops that recurring.
## When you run — D20, and read this before anything else
**You run ONCE, at cutover, over the whole finished site.** Not per build step.
Pouya's ruling, 2026-08-30, recorded in full in `AGENTS.md` D20.
Three consequences, and they change how you work rather than only when:
1. **You are the only claims pass this project gets.** There is no second run
behind you and no round 3 to catch what you miss. `npm run check:claims` is a
greppable tripwire, not a reader. Treat every page as final, because it is.
2. **Read the site as a visitor does, not as a diff.** The reason the pass moved
here is that the defects worth catching late are the ones that only exist once
the pages sit next to each other. The `/med-arb/` ADRIC gloss is the case:
every individual claim was true, the quote was verbatim and correctly cited,
and the defect was **adjacency** — the sentence beneath the quote answered
ADRIC's question with a different designation than ADRIC's own answer. A
per-page audit cannot see that. Follow the reading order: `/`, then the nav,
then a practice page, then `/about/`. Ask what a visitor now believes.
3. **A finding here blocks the cutover.** `docs/06`'s checklist carries it as a
blocking item: nothing publishes until your findings are resolved. So the
uncertainty-is-a-defect rule still stands, and D19's two-round cap does **not**
apply to you — it governs the per-step code review. There is no cap on
resolving what this pass finds.
If you are invoked mid-build anyway, say so in your report: you are auditing a
draft rather than the finished site, which is the exact condition D20 says makes
this pass weaker.
## Scope — D19, and it is a hard boundary ## Scope — D19, and it is a hard boundary
**In scope:** **In scope:**
+28 -13
View File
@@ -19,7 +19,7 @@ does not apply, say which and why before moving on.
Reminders** and surface anything live to Pouya before you start. Reminders** and surface anything live to Pouya before you start.
2. Read the specs in `docs/` that bear on this task. 2. Read the specs in `docs/` that bear on this task.
3. Restate the task in your own words, and name: 3. Restate the task in your own words, and name:
- which locked decisions (D1D19) it touches - which locked decisions (D1D20) it touches
- which specs govern it - which specs govern it
- which facts it needs from the §4 Verified register - which facts it needs from the §4 Verified register
4. **Stop and ask if you find a conflict** — between the task and a locked 4. **Stop and ask if you find a conflict** — between the task and a locked
@@ -45,24 +45,36 @@ number.
## Phase 3 — Adversarial review (this is not optional) ## Phase 3 — Adversarial review (this is not optional)
Invoke **both** review agents on the change, in parallel: Invoke **one** review agent on the change:
- `adversarial-reviewer` — correctness, accessibility, crawlability, - `adversarial-reviewer` — correctness, accessibility, crawlability,
performance, security, simplicity performance, security, simplicity
- `claims-auditor` — every factual assertion traced to `AGENTS.md` §4
**Give them the diff and the specs. Do not give them your reasoning for why the **`claims-auditor` does NOT run here — D20, Pouya, 2026-08-30.** It runs **once,
work is correct.** Your rationale anchors the reviewer and produces agreement at cutover**, over the whole finished site, as a blocking item on `docs/06`'s
instead of review. They form their own view from the artefact; that independence checklist. Do not invoke it per step, and do not reinstate it because a change
is the whole point of the phase. set looks claim-heavy: that judgement was already made against the measured cost,
which `AGENTS.md` D20 records in full. If a claim genuinely worries you, the
answer is a `TODO(pouya)` and a §9 question — the thing that blocks — not an
unscheduled audit.
Two things carry the claims risk between now and cutover, and neither is
optional: **`npm run check:claims` in Phase 5**, and **Pouya reading the copy as
it is built**.
**Give it the diff and the specs. Do not give it your reasoning for why the work
is correct.** Your rationale anchors the reviewer and produces agreement instead
of review. It forms its own view from the artefact; that independence is the
whole point of the phase.
### Scope — D19 ### Scope — D19
Review is bounded. **In scope:** `dist/`, `src/`, the specs that direct copy Review is bounded. **In scope:** `dist/`, `src/`, the specs that direct copy
(`docs/01`, `03`, `04`, `07`), and `AGENTS.md` §3, §4, §7, §9, §12. **Out of (`docs/01`, `03`, `04`, `07`), and `AGENTS.md` §3, §4, §7, §9, §12. **Out of
scope:** the Change Log, the agents' own briefs, `AGENTS.md` prose outside those scope:** the Change Log, the agents' own briefs, `AGENTS.md` prose outside those
sections, and the historical accuracy of code comments. Both briefs carry the sections, and the historical accuracy of code comments. Both agent briefs carry
same boundary — do not widen it in the prompt. the same boundary — do not widen it in the prompt. It binds the cutover claims
pass too, which is the one place `claims-auditor` still runs.
### The stop signal ### The stop signal
@@ -72,8 +84,9 @@ itself, and noticing it is part of the job — not a licence to skip the phase.
The shape to watch for, from the session that produced D19: a Change Log sweep The shape to watch for, from the session that produced D19: a Change Log sweep
that could not reproduce *because writing it changed the file it counted*. that could not reproduce *because writing it changed the file it counted*.
If the change touches no user-facing copy, `claims-auditor` may be skipped — say **The claims pass is deferred, not deleted.** Say which review ran in your
so explicitly. report. "Reviewed" without naming the agent reads as both, and under D20 it is
one.
## Phase 4 — Resolve ## Phase 4 — Resolve
@@ -113,8 +126,10 @@ npm run check:claims
``` ```
`check:claims` greps the built pages for the §4 Forbidden set — Pouya's ruling, `check:claims` greps the built pages for the §4 Forbidden set — Pouya's ruling,
2026-08-29. **Every pattern it catches is a finding neither review agent has to 2026-08-29. **Under D20 it is the only per-step claims control there is**, so
spend a pass on**, which is D19 served directly. It self-tests its own patterns never skip it and never let a build ship on a stale `dist/`. It is a tripwire,
not a program: it catches the §4 breaches that are greppable and it makes no
claim about the ones that are not. It self-tests its own patterns
before it sweeps and refuses to run against an empty or stale `dist/`, so a pass before it sweeps and refuses to run against an empty or stale `dist/`, so a pass
is a pass on the bytes that would ship. **A match is not yet a finding** — read is a pass on the bytes that would ship. **A match is not yet a finding** — read
the context it prints. If a pattern is genuinely wrong, change it deliberately the context it prints. If a pattern is genuinely wrong, change it deliberately
+9 -5
View File
@@ -10,13 +10,17 @@ Scope: $ARGUMENTS
If no scope is given, review the uncommitted working tree (`git status`, If no scope is given, review the uncommitted working tree (`git status`,
`git diff`). `git diff`).
Invoke **both** agents in parallel on that scope: Invoke **`adversarial-reviewer`** on that scope.
- `adversarial-reviewer` **`claims-auditor` is not part of this command — D20, Pouya, 2026-08-30.** The
- `claims-auditor` — unless nothing user-facing changed, in which case say so claims pass runs **once, at cutover**, over the whole finished site; `AGENTS.md`
D20 records the reasoning and the measured cost of deferring it. Run it here only
if Pouya asks for it by name in `$ARGUMENTS` — in which case say in the report
that it was run out of band, and against a draft rather than the finished site,
because that is the condition D20 says weakens it.
Give them the diff and the relevant specs from `docs/`. **Do not brief them on Give it the diff and the relevant specs from `docs/`. **Do not brief it on why
why the code is correct** — that anchors the review and turns it into agreement. the code is correct** — that anchors the review and turns it into agreement.
Report findings grouped by severity, most severe first. For each: the defect, the Report findings grouped by severity, most severe first. For each: the defect, the
concrete failure it produces, and the fix. Do not fix anything yet — Pouya concrete failure it produces, and the fix. Do not fix anything yet — Pouya
+210 -8
View File
@@ -128,8 +128,9 @@ without an explicit instruction and a Change Log entry. `[verified 2026-08-25]`
| D14 | Fee structure | **Single published rate card, all mediation matters at one rate.** Confirmed by Pouya 2026-08-26; figures in `docs/07-fees.md`. No tribunal-secretary line | Two-tier card (recommended by Claude, declined); ranges; fees on request | | D14 | Fee structure | **Single published rate card, all mediation matters at one rate.** Confirmed by Pouya 2026-08-26; figures in `docs/07-fees.md`. No tribunal-secretary line | Two-tier card (recommended by Claude, declined); ranges; fees on request |
| D15 | Analytics | **Plausible.** Privacy-first and cookieless: no cookie banner, nothing to consent to, one line in the privacy policy. *Amended 2026-08-26 (Q31):* the original read "Plausible **or** Fathom", i.e. undecided, and a guessed `'plausible'` had already leaked into `src/data/site.ts` from it. **Decided, not defaulted** — Pouya checked rather than assumed and found his own assumption wrong: Fathom is Canadian-owned, which is the intuitive answer here, but it stores non-EU traffic on **US servers** and isolates in the EU only for EU visitors. Plausible keeps all data in the EU. For a practice whose privacy posture is part of the offer, EU-only beats US-hosted, and ownership is not the axis that matters | GA4; no analytics at all; **Fathom** — rejected on data residency, not on quality | | D15 | Analytics | **Plausible.** Privacy-first and cookieless: no cookie banner, nothing to consent to, one line in the privacy policy. *Amended 2026-08-26 (Q31):* the original read "Plausible **or** Fathom", i.e. undecided, and a guessed `'plausible'` had already leaked into `src/data/site.ts` from it. **Decided, not defaulted** — Pouya checked rather than assumed and found his own assumption wrong: Fathom is Canadian-owned, which is the intuitive answer here, but it stores non-EU traffic on **US servers** and isolates in the EU only for EU visitors. Plausible keeps all data in the EU. For a practice whose privacy posture is part of the offer, EU-only beats US-hosted, and ownership is not the axis that matters | GA4; no analytics at all; **Fathom** — rejected on data residency, not on quality |
| D18 | Intake email | **Two emails per submission** — notification to `info@smlcompany.ca`, and a **confirmation receipt to the inquirer**. Pouya, 2026-08-26. The receipt is what requires SES production access (Q19) | Notification only; no email; no form at all | | D18 | Intake email | **Two emails per submission** — notification to `info@smlcompany.ca`, and a **confirmation receipt to the inquirer**. Pouya, 2026-08-26. The receipt is what requires SES production access (Q19) | Notification only; no email; no form at all |
| D17 | Working method | **Pouya architects; Claude Code implements and then adversarially reviews its own work.** Six-phase loop encoded in `.claude/commands/build.md`; two independent review agents in `.claude/agents/`; extended thinking on by default. Standing agreement — not restated per prompt | Implement-and-report; single generic reviewer; review only on request | | D17 | Working method | **Pouya architects; Claude Code implements and then adversarially reviews its own work.** Six-phase loop encoded in `.claude/commands/build.md`; two independent review agents in `.claude/agents/`; extended thinking on by default. Standing agreement — not restated per prompt. ***Amended 2026-08-30 — see D20:*** *the per-step review is `adversarial-reviewer` **alone**. `claims-auditor` no longer runs per step; it runs **once, at cutover, over the whole finished site**. "Two independent review agents" now describes the project, not the step* | Implement-and-report; single generic reviewer; review only on request |
| D19 | Bounding the review loop | **Review scope is `dist/`, `src/`, the specs that direct copy (`docs/01`, `03`, `04`, `07`), and `AGENTS.md` §3, §4, §7, §9, §12. TWO ROUNDS IS THE CAP. Findings are blocking or should-fix, with a "consider" only where acting on it changes what ships. A non-gating observation is a Change Log note, not a numbered question. Comments record decisions, not history.** Pouya's ruling, 2026-08-28, on his own measurement: 48 findings across two rounds with most of round two being defects in round one's fixes; 342 lines added to `src/` for 8 functional; four findings that were stale statements inside comments written that same session; and a Change Log sweep that could not reproduce because writing it changed the file it counted. His words: *"Every one is a real defect — but they are defects in the record about the record, and that is infinite regress. My fault for never bounding scope."* **Out of scope: the Change Log, the agents' own briefs, `AGENTS.md` prose outside those five sections, and the historical accuracy of code comments.** A false statement in a Change Log entry is corrected when noticed; it does not get a review pass, because no visitor reads it. Swept into `.claude/agents/adversarial-reviewer.md`, `.claude/agents/claims-auditor.md`, `/build` Phases 24, `/wrap` and `CLAUDE.md` | Unbounded scope; a third round; reporting every "consider"; a numbered question per observation | | D19 | Bounding the review loop | **Review scope is `dist/`, `src/`, the specs that direct copy (`docs/01`, `03`, `04`, `07`), and `AGENTS.md` §3, §4, §7, §9, §12. TWO ROUNDS IS THE CAP. Findings are blocking or should-fix, with a "consider" only where acting on it changes what ships. A non-gating observation is a Change Log note, not a numbered question. Comments record decisions, not history.** Pouya's ruling, 2026-08-28, on his own measurement: 48 findings across two rounds with most of round two being defects in round one's fixes; 342 lines added to `src/` for 8 functional; four findings that were stale statements inside comments written that same session; and a Change Log sweep that could not reproduce because writing it changed the file it counted. His words: *"Every one is a real defect — but they are defects in the record about the record, and that is infinite regress. My fault for never bounding scope."* **Out of scope: the Change Log, the agents' own briefs, `AGENTS.md` prose outside those five sections, and the historical accuracy of code comments.** A false statement in a Change Log entry is corrected when noticed; it does not get a review pass, because no visitor reads it. Swept into `.claude/agents/adversarial-reviewer.md`, `.claude/agents/claims-auditor.md`, `/build` Phases 24, `/wrap` and `CLAUDE.md`. ***Amended 2026-08-30 — see D20:*** *the two-round cap governs the **per-step code review**, which is now `adversarial-reviewer` alone. It does **not** govern the single cutover claims pass — that one runs until its findings are resolved, because there is no second pass behind it. A cap on rounds is not a licence to publish an unresolved claims finding* | Unbounded scope; a third round; reporting every "consider"; a numbered question per observation |
| D20 | Where the claims pass runs | **`claims-auditor` runs ONCE, at cutover, over the whole finished site — not per build step.** Per step: **`adversarial-reviewer` alone** — correctness, accessibility, crawlability, performance, security, simplicity — two rounds max, per D19. `npm run check:claims` is **unchanged**: it runs on every build and on both deploy paths. It is the mechanical floor and it stays. **Pouya reads the copy as it is built; that is the human pass.** *Recorded in full, because "we stopped running the compliance check" must read as a calibration decision and not as erosion.* **Why.** Nothing has shipped and there is no public site, so every claims finding to date has been about a page no visitor can reach — the entire risk is deferred to cutover, and auditing nine build steps and then re-auditing the fixes is auditing a draft nobody can read. A single pass over twenty finished pages will also catch **more** than nine passes over drafts, because it sees the site as a reader does: the `/med-arb/` ADRIC gloss is the proof — no individual claim was false, the defect was **adjacency**, and adjacency defects do not exist until the pages sit next to each other. The code reviewer stays per step because **what it catches compounds** — an accessibility or crawlability defect propagates into every page built on it. A claims defect does not compound; it sits there until someone reads it. **What this costs, recorded honestly so a later reader can weigh it.** `claims-auditor` has caught, among others: the struck false universal reaching a public page in the first person; a `<title>` reading *"Sole Arbitrator"*; *"Every award I issue"* on a practice with no completed arbitration; four breaches of the Q54 gate on the day it was written; the memberships currency warranty; and a §4 Verified row authorising exactly what D16 forbids. Those are real, and several are the class of thing that reads badly on the site of a person who holds a JD. Deferring the check to cutover accepts that such a defect may live in an unpublished draft for weeks. **It must not survive cutover**`docs/06`'s checklist carries two blocking items for it, near the top, and nothing publishes until both are clean. Pouya's ruling, 2026-08-30. Swept to `CLAUDE.md`, `/build` Phase 3, `/review`, `.claude/agents/claims-auditor.md`, `docs/06` and `docs/08` | Per-step claims audit (the status quo — its cost is recorded above, not dismissed); dropping the claims pass entirely; relying on `check:claims` alone |
| D16 | Naming the boutique | **Never named.** Referred to throughout as *a Toronto litigation and ADR boutique*. Pouya's decision, 2026-08-26 | Naming the firm | | D16 | Naming the boutique | **Never named.** Referred to throughout as *a Toronto litigation and ADR boutique*. Pouya's decision, 2026-08-26 | Naming the firm |
## 4. Credential and claim register ## 4. Credential and claim register
@@ -173,7 +174,7 @@ since May.
| Q.Med designation through ADRIC / ADRIO | `[verified 2026-08-25 — strategy brief §I]` | | Q.Med designation through ADRIC / ADRIO | `[verified 2026-08-25 — strategy brief §I]` |
| Has completed multiple sole mediations | `[verified 2026-08-25 — strategy brief §I]` — count deliberately not published, see below | | Has completed multiple sole mediations | `[verified 2026-08-25 — strategy brief §I]` — count deliberately not published, see below |
| **Practised role — "Mediator"** | `[verified 2026-08-28 — Pouya, Q49]`. **The row `Person.jobTitle` stands on, and the ruling grants exactly one.** Pouya: *"one row: 'Mediator', supported by Q.Med plus completed sole mediations."* Both supports are rows immediately above. **"Arbitrator" as a practised role is still NOT a row** — §4 Offerings verifies that appointments are *accepted* and records no completed arbitration, which is why `claims-auditor` struck *"Mediator and Commercial Arbitrator"* from the same node's `description` on 2026-08-27. The arbitration **offering** is unaffected: `description` and `serviceType` both carry it. **Q49(b) is declined by the same ruling** — one row was granted and the corporate relation *"the entity the practice operates through"* was not it, so `worksFor` stays out of the graph. The row that does exist is *"Operator of SML Company Ltd. **alongside** the practice"*, a different structural relation | | **Practised role — "Mediator"** | `[verified 2026-08-28 — Pouya, Q49]`. **The row `Person.jobTitle` stands on, and the ruling grants exactly one.** Pouya: *"one row: 'Mediator', supported by Q.Med plus completed sole mediations."* Both supports are rows immediately above. **"Arbitrator" as a practised role is still NOT a row** — §4 Offerings verifies that appointments are *accepted* and records no completed arbitration, which is why `claims-auditor` struck *"Mediator and Commercial Arbitrator"* from the same node's `description` on 2026-08-27. The arbitration **offering** is unaffected: `description` and `serviceType` both carry it. **Q49(b) is declined by the same ruling** — one row was granted and the corporate relation *"the entity the practice operates through"* was not it, so `worksFor` stays out of the graph. The row that does exist is *"Operator of SML Company Ltd. **alongside** the practice"*, a different structural relation |
| **Q.Arb — HELD** | `[verified 2026-08-29 — Pouya]`. **Obtained July 2026 — RECORDED HERE, NOT PUBLISHED.** His instruction: public copy carries **`Q.Arb (ADRIC / ADRIO)`** beside Q.Med and **nothing more** — no date, no acquisition story. ⚠️ **EVERY STAGE FORM IS STRUCK: "commenced", "in progress", "pathway", "not yet", and the "once/when I hold it" constructions.** This row read *"credentialing pathway — commenced August 2026"* `[verified 2026-08-26 — Pouya]` from 2026-08-26 until 2026-08-29, and every one of those words is now false in the **opposite** direction from the one this register normally guards — the site would be **understating** a held credential. Both directions are misdescription. ⚠️ **THE TWO DATES CANNOT BOTH BE TRUE, AND THIS ROW DOES NOT RECONCILE THEM — OPEN AS Q55.** The Change Log of **2026-08-26 (a)** records *"Q.Arb dated. Old → new: `[assumed]`, stage unknown → **commenced August 2026** `[verified 2026-08-26]`"* — Pouya's own report, three days before this one. **A designation cannot have been obtained in July from a pathway that commenced in August.** One of the two self-reports is wrong and the register cannot say which. **NOTHING PUBLISHED TURNS ON IT:** the site says *held*, which is his ruling either way, and the date is not published — so this does not block. It is flagged because §4's whole function is that a stamped claim is checkable, and this one is contradicted on the face of the record. Found by `claims-auditor` 2026-08-30. **The Forbidden row against "held, imminent, nearly complete" is struck with it** | | **Q.Arb — HELD** | **The stamp is SPLIT, deliberately, and Pouya ratified the split on 2026-08-30.** Status: `[verified 2026-08-29 — Pouya]` — he holds it. Date: **Obtained July 2026** `[Pouya's stated basis 2026-08-29]` — the register vouches only for what he stated, never for the date itself, because it holds contrary evidence (below). **THE DATE IS RECORDED HERE AND NOT PUBLISHED.** His instruction: public copy carries **`Q.Arb (ADRIC / ADRIO)`** beside Q.Med and **nothing more** — no date, no acquisition story. ⚠️ **EVERY STAGE FORM IS STRUCK: "commenced", "in progress", "pathway", "not yet", and the "once/when I hold it" constructions.** This row read *"credentialing pathway — commenced August 2026"* `[verified 2026-08-26 — Pouya]` from 2026-08-26 until 2026-08-29, and every one of those words is now false in the **opposite** direction from the one this register normally guards — the site would be **understating** a held credential. Both directions are misdescription. ⚠️ **THE TWO DATES CANNOT BOTH BE TRUE, AND THIS ROW DOES NOT RECONCILE THEM — Q55, CLOSED UNRESOLVED 2026-08-30.** The Change Log of **2026-08-26 (a)** records *"Q.Arb dated. Old → new: `[assumed]`, stage unknown → **commenced August 2026** `[verified 2026-08-26]`"* — Pouya's own report, three days before this one. **A designation cannot have been obtained in July from a pathway that commenced in August.** One of the two self-reports is wrong and the register cannot say which. **NOTHING PUBLISHED TURNS ON IT:** the site says *held*, which is his ruling either way, and the date is not published — so this does not block. It is flagged because §4's whole function is that a stamped claim is checkable, and this one is contradicted on the face of the record. Found by `claims-auditor` 2026-08-30 and **closed the same day without being resolved — Pouya's ruling, and the distinction is the point.** *"The date is not published and nothing depends on it. A register that says 'two inconsistent reports of an unpublished fact, neither relied on' is complete."* So: the 2026-08-26 (a) Change Log report of *commenced August 2026* stands **UNRECONCILED**, permanently and on purpose. **Do not reconcile it by inference, do not re-stamp it, and do not put it back to Pouya** — it was closed by the architect, not left open. What makes the closure safe is the split stamp above: nothing in this register or on the site rests on the date. **The Forbidden row against "held, imminent, nearly complete" is struck with it** |
| ~~C.Med-Arb stated as long-term designation goal~~ | **STRUCK 2026-08-29 — Pouya. `C.MED-ARB IS OUT ENTIRELY`, and it must not be reinstated from the strategy brief**, which made it *"the explicit long-term professional narrative"*. **This is a deliberate deviation from the brief and it is recorded as one** — see the Change Log entry of 2026-08-30 (ad). His reasoning: *"Pouya holds Q.Med and Q.Arb, which is what med-arb requires. The page says he conducts med-arb and stops."* **The designation is still real and stays in §11 as a DEFINITION** — what is struck is its status as a published goal *of his*. Superseded `[verified 2026-08-25 — strategy brief §I, §IV]` | | ~~C.Med-Arb stated as long-term designation goal~~ | **STRUCK 2026-08-29 — Pouya. `C.MED-ARB IS OUT ENTIRELY`, and it must not be reinstated from the strategy brief**, which made it *"the explicit long-term professional narrative"*. **This is a deliberate deviation from the brief and it is recorded as one** — see the Change Log entry of 2026-08-30 (ad). His reasoning: *"Pouya holds Q.Med and Q.Arb, which is what med-arb requires. The page says he conducts med-arb and stops."* **The designation is still real and stays in §11 as a DEFINITION** — what is struck is its status as a published goal *of his*. Superseded `[verified 2026-08-25 — strategy brief §I, §IV]` |
| Kompass Arbitration Certificate Program — completed | `[verified 2026-08-25 — strategy brief §I]` | | Kompass Arbitration Certificate Program — completed | `[verified 2026-08-25 — strategy brief §I]` |
| Stitt Feld Handy negotiation and ADR workshop sequence — completed | `[verified 2026-08-25 — strategy brief §I]` | | Stitt Feld Handy negotiation and ADR workshop sequence — completed | `[verified 2026-08-25 — strategy brief §I]` |
@@ -398,8 +399,8 @@ never be read as one:
| Offering | Status | | Offering | Status |
|---|---| |---|---|
| **Mediation** — sole mediator | `[verified 2026-08-26 — Pouya]`. Q.Med held; §4 also verifies multiple completed sole mediations | | **Mediation** — sole mediator | `[verified 2026-08-26 — Pouya]`. Q.Med held; §4 also verifies multiple completed sole mediations. ⚠️ **UNSCOPED, AND DELIBERATELY SO — Q56, ruled by Pouya 2026-08-30. Do not add "commercial" to this row, and do not scope it on a page.** He mediates commercial, construction, insurance/SABS, shareholder and cross-cultural matters, and the practice pages say so. ⚠️ **THAT LIST IS ILLUSTRATIVE OF BREADTH, NOT A CLOSED SET, and it is not the authorised subject-matter list** — Q35's gate governs that, and the site publishes **six** areas of which every one offers mediation (`src/data/practice-pages.ts`), **technology and energy included**. Read as an enumeration it is short by two, and a later reader would strike two live pages or open a question that did not need opening. Flagged to Pouya rather than rewritten, because the words are his ruling. Raised by `adversarial-reviewer`, 2026-08-30. **Why this row and the arbitration row below do not match, so the asymmetry reads as designed rather than as an oversight:** arbitration is scoped commercial because of a **legal gate** — Q39, family arbitration in Ontario requires prescribed training. **Mediation has no such gate.** The site said *"Commercial Mediation"* on four surfaces until 2026-08-30; that was under-describing the offering, and it was corrected rather than ratified |
| **Arbitration — sole arbitrator** (commercial) | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. Not gated by Q.Arb. **Commercial**, and the scope is now load-bearing rather than provisional: Q39 closed 2026-08-27 and **family arbitration is excluded by Pouya's choice** — see the row below | | **Arbitration — sole arbitrator** (commercial) | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. Not gated by Q.Arb. **Commercial**, and the scope is now load-bearing rather than provisional: Q39 closed 2026-08-27 and **family arbitration is excluded by Pouya's choice** — see the row below. ⚠️ **THE SCOPE IS A LEGAL GATE, NOT A POSITIONING CHOICE — Q56, 2026-08-30.** Family arbitration in Ontario requires prescribed training, which is why this word is load-bearing here and **must not be copied onto the mediation row above**: mediation has no equivalent gate and is unscoped on purpose |
| **Arbitration — party-appointed** | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now** | | **Arbitration — party-appointed** | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now** |
| **Arbitration — co-arbitration** | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. This closes Q36, which had flagged the claim as asserted in three specs and resting on no §4 row — the row is here | | **Arbitration — co-arbitration** | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. This closes Q36, which had flagged the claim as asserted in three specs and resting on no §4 row — the row is here |
| **Med-Arb** — mediation-arbitration | `[verified 2026-08-27 — Pouya, Q35]`. Offered **now**. Both halves are live: Q.Med is held, and arbitration appointments are accepted (rows above). Ungated by the same reasoning as arbitration. This closes the "Still unanswered" note that used to sit below this table, and it is why `/med-arb/` may stay in the footer sitemap | | **Med-Arb** — mediation-arbitration | `[verified 2026-08-27 — Pouya, Q35]`. Offered **now**. Both halves are live: Q.Med is held, and arbitration appointments are accepted (rows above). Ungated by the same reasoning as arbitration. This closes the "Still unanswered" note that used to sit below this table, and it is why `/med-arb/` may stay in the footer sitemap |
@@ -650,7 +651,7 @@ cannot vouch for.
| Guarantees of outcome, or superlatives ("best", "leading", "top-rated") | Unverifiable as written, and they read as insecure to the audience this site is for. Marketing rules for regulated professions also treat them as suspect. *(Reason restated 2026-08-26: this row previously read "LSO marketing rules", which asserts the regulatory status the row above marks NOT ESTABLISHED. It was the last surviving instance, flagged in entries (o) and (q) and answered in Q26 as already fixed — it was not. **Restated by Claude Code; the rule itself is unchanged and the restatement needs Pouya's ratification.**)* | | Guarantees of outcome, or superlatives ("best", "leading", "top-rated") | Unverifiable as written, and they read as insecure to the audience this site is for. Marketing rules for regulated professions also treat them as suspect. *(Reason restated 2026-08-26: this row previously read "LSO marketing rules", which asserts the regulatory status the row above marks NOT ESTABLISHED. It was the last surviving instance, flagged in entries (o) and (q) and answered in Q26 as already fixed — it was not. **Restated by Claude Code; the rule itself is unchanged and the restatement needs Pouya's ratification.**)* |
| The word **"lawyer"** used of Pouya; "called to the bar"; "licensed"; "my law practice"; "my litigation practice"; any post-nominal implying a licence | D13. The site asserts the JD and nothing further | | The word **"lawyer"** used of Pouya; "called to the bar"; "licensed"; "my law practice"; "my litigation practice"; any post-nominal implying a licence | D13. The site asserts the JD and nothing further |
| Any phrasing that *implies* entitlement to practise law without saying so — "acts for clients", "represents parties", "my clients", "legal advice" | Same rule. Implication is the risk, not just the word. Describe the role factually instead: *Director of Firm Operations at a Toronto litigation and ADR boutique*, and the matter types worked on | | Any phrasing that *implies* entitlement to practise law without saying so — "acts for clients", "represents parties", "my clients", "legal advice" | Same rule. Implication is the risk, not just the word. Describe the role factually instead: *Director of Firm Operations at a Toronto litigation and ADR boutique*, and the matter types worked on |
| **Q.Arb described as commenced, in progress, a pathway, or not yet held** | **It is HELD** `[verified 2026-08-29 — Pouya]`. Publish `Q.Arb (ADRIC / ADRIO)`. **The acquisition date is recorded in §4 and is NOT published** — and it is itself open (Q55). `npm run check:claims` `q-arb-as-a-stage` enforces the stage words and a date near the designation, on `dist/` | | **Q.Arb described as commenced, in progress, a pathway, or not yet held** | **It is HELD** `[verified 2026-08-29 — Pouya]`. Publish `Q.Arb (ADRIC / ADRIO)`. **The acquisition date is recorded in §4 and is NOT published** — and it is itself contradicted on the record and deliberately left that way (Q55, closed unresolved 2026-08-30). `npm run check:claims` `q-arb-as-a-stage` enforces the stage words and a date near the designation, on `dist/` |
| ~~Q.Arb described as held, imminent, or "nearly complete"~~ | **STRUCK 2026-08-29 — Q.ARB IS HELD.** This row was correct from 2026-08-26 to 2026-08-29 and is now exactly backwards. **What replaces it is the opposite bar:** Q.Arb described as *commenced*, *in progress*, *a pathway*, or *not yet held* — see the Verified row. The publishable form is `Q.Arb (ADRIC / ADRIO)`; the acquisition date is recorded in §4 and is **not** published | | ~~Q.Arb described as held, imminent, or "nearly complete"~~ | **STRUCK 2026-08-29 — Q.ARB IS HELD.** This row was correct from 2026-08-26 to 2026-08-29 and is now exactly backwards. **What replaces it is the opposite bar:** Q.Arb described as *commenced*, *in progress*, *a pathway*, or *not yet held* — see the Verified row. The publishable form is `Q.Arb (ADRIC / ADRIO)`; the acquisition date is recorded in §4 and is **not** published |
### The substitution principle ### The substitution principle
@@ -770,8 +771,8 @@ Nothing below can be invented. Each needs an answer from Pouya.
| # | Question | Blocks | | # | Question | Blocks |
|---|---|---| |---|---|---|
| **Q56** | ⚠️ **IS THE MEDIATION OFFERING SCOPED COMMERCIAL, OR NOT? THE SITE SAYS BOTH.** §4 Offerings rows arbitration three times, each **scoped commercial**; the mediation row is `**Mediation** — sole mediator`, **unscoped**. Shipped output scopes it anyway: `/mediation/`'s `<title>` is *"Commercial Mediation"*, its `Service` node is `name: "Commercial mediation"`, and `/` and `/about/` both say *"I mediate commercial disputes"*. Meanwhile **`/practice/insurance/` offers mediation in matters that are not commercial on any ordinary reading** — *"Disputes between an insured person and an insurer under the Statutory Accident Benefits Schedule"*, with *"What I offer is private mediation"*. An individual claimant against their own insurer is not a commercial dispute. **Nothing here is a false claim** — scoping a page to commercial mediation asserts *less* than the unscoped §4 row grants, and narrower than the row is always safe. **The problem is that the two halves cannot both be the whole picture**: either the practice takes non-commercial mediations (and the site-wide "commercial" framing under-describes it, including on the page an appointing body reads), or it does not (and `/practice/insurance/` is offering something outside the offering). **What is needed:** either a §4 Offerings row scoping mediation, with `/practice/insurance/`'s SABS framing reconciled to it — or a decision that mediation is deliberately unscoped, in which case the site-wide "commercial" wording is a positioning choice and should be recorded as one rather than read as a limit. **Pre-existing, not created 2026-08-30** — but this change set newly wrote the claim onto `/med-arb/` and it has been removed again pending this answer. Raised by `adversarial-reviewer`, 2026-08-30 | **Nothing at present.** No page is wrong; the register is silent where the site is specific | | ~~Q56~~ | **RULED 2026-08-30 — MEDIATION IS *NOT* SCOPED COMMERCIAL.** Pouya: *"Correct the four 'Commercial Mediation' surfaces to 'Mediation'; leave §4's mediation row unscoped."* **And the asymmetry with arbitration is DESIGNED, not an oversight — the reason is now recorded beside both §4 rows so nobody tidies them into a matching pair.** **Arbitration is scoped commercial because of a LEGAL GATE:** Q39 — family arbitration in Ontario requires prescribed training, and Pouya has excluded it by choice. **Mediation has no such gate**; he mediates commercial, construction, insurance/SABS, shareholder and cross-cultural matters, and the practice pages say so. So the site-wide "commercial" framing was **under-describing a wider offering**, which is why it is corrected rather than ratified as a positioning choice. `/practice/insurance/`'s SABS framing needs no reconciliation: it was never outside the offering. **The question as raised is preserved below.** ⚠️ **IS THE MEDIATION OFFERING SCOPED COMMERCIAL, OR NOT? THE SITE SAID BOTH.** §4 Offerings rows arbitration three times, each **scoped commercial**; the mediation row is `**Mediation** — sole mediator`, **unscoped**. Shipped output scopes it anyway: `/mediation/`'s `<title>` is *"Commercial Mediation"*, its `Service` node is `name: "Commercial mediation"`, and `/` and `/about/` both say *"I mediate commercial disputes"*. Meanwhile **`/practice/insurance/` offers mediation in matters that are not commercial on any ordinary reading** — *"Disputes between an insured person and an insurer under the Statutory Accident Benefits Schedule"*, with *"What I offer is private mediation"*. An individual claimant against their own insurer is not a commercial dispute. **Nothing here is a false claim** — scoping a page to commercial mediation asserts *less* than the unscoped §4 row grants, and narrower than the row is always safe. **The problem is that the two halves cannot both be the whole picture**: either the practice takes non-commercial mediations (and the site-wide "commercial" framing under-describes it, including on the page an appointing body reads), or it does not (and `/practice/insurance/` is offering something outside the offering). **What is needed:** either a §4 Offerings row scoping mediation, with `/practice/insurance/`'s SABS framing reconciled to it — or a decision that mediation is deliberately unscoped, in which case the site-wide "commercial" wording is a positioning choice and should be recorded as one rather than read as a limit. **Pre-existing, not created 2026-08-30** — but this change set newly wrote the claim onto `/med-arb/` and it has been removed again pending this answer. Raised by `adversarial-reviewer`, 2026-08-30 | **Nothing — ruled the same day it was raised.** No page was wrong; the register was silent where the site was specific, and the ruling makes the site match the register rather than the other way round |
| **Q55** | ⚠️ **WHEN WAS Q.Arb ACTUALLY OBTAINED? THE REGISTER HOLDS TWO DATES FROM THE SAME SOURCE AND THEY CANNOT BOTH BE TRUE.** (a) **2026-08-26 (a)**, Change Log, `[verified 2026-08-26]`: *"Q.Arb dated. Old → new: `[assumed]`, stage unknown → **commenced August 2026**"*. (b) **2026-08-29**, Pouya's amendment, now the §4 Verified row: *"Obtained July 2026"*. A designation cannot have been obtained in July from a pathway reported as commencing in August, and (a) was reported three days before (b). One self-report is wrong; the register cannot say which, and **inferring it would be exactly the guessed-explanation failure `CLAUDE.md` bars**. **THIS DOES NOT BLOCK, and that is the whole reason it is a question rather than a hold.** The published claim is *held***which is faithful to his most recent instruction, and that is a different thing from correct.** §4's premise is that `[verified — Pouya]` establishes *what he reported*, never the fact, and this is the one row where the register holds documented evidence that a self-report about this credential is wrong. The date is deliberately unpublished, so no page turns on the answer. What turns on it is whether §4 can vouch for its own highest-stakes new row. **What is needed:** one line from Pouya giving the correct date, and whether (a) was a misreport, a different milestone, or something else. Then re-stamp the §4 row and correct or annotate (a) — the Change Log is append-only, so (a) gets a pointer, never an edit. Raised by `claims-auditor`, 2026-08-30 | **Nothing.** The site states what Pouya most recently instructed; what is affected is §4's ability to vouch for its own row | | ~~Q55~~ | **CLOSED 2026-08-30 — NOT RESOLVED, AND THE DIFFERENCE IS THE RULING.** Pouya: *"The date is not published and nothing depends on it. Your split stamp was right: `[verified]` on the status, `[Pouya's stated basis]` on the date, the 2026-08-26 record noted as unreconciled. A register that says 'two inconsistent reports of an unpublished fact, neither relied on' is complete. Do not put it to Pouya."* **So this row is not a question any more and must not be re-raised as one.** §4's Q.Arb row now carries the split stamp explicitly and marks the 2026-08-26 (a) report **unreconciled, permanently**. **Why closing beats answering here:** the register's job is to say what it can vouch for, and it can vouch for exactly this — that he reported a July acquisition, that he had reported an August commencement three days earlier, and that no published claim rests on either. Asking again would buy a third self-report about a fact the site does not state. **The question as raised is preserved below, because the evidence is the record.** ⚠️ **WHEN WAS Q.Arb ACTUALLY OBTAINED? THE REGISTER HOLDS TWO DATES FROM THE SAME SOURCE AND THEY CANNOT BOTH BE TRUE.** (a) **2026-08-26 (a)**, Change Log, `[verified 2026-08-26]`: *"Q.Arb dated. Old → new: `[assumed]`, stage unknown → **commenced August 2026**"*. (b) **2026-08-29**, Pouya's amendment, now the §4 Verified row: *"Obtained July 2026"*. A designation cannot have been obtained in July from a pathway reported as commencing in August, and (a) was reported three days before (b). One self-report is wrong; the register cannot say which, and **inferring it would be exactly the guessed-explanation failure `CLAUDE.md` bars**. **THIS DOES NOT BLOCK, and that is the whole reason it is a question rather than a hold.** The published claim is *held***which is faithful to his most recent instruction, and that is a different thing from correct.** §4's premise is that `[verified — Pouya]` establishes *what he reported*, never the fact, and this is the one row where the register holds documented evidence that a self-report about this credential is wrong. The date is deliberately unpublished, so no page turns on the answer. What turns on it is whether §4 can vouch for its own highest-stakes new row. **What is needed:** one line from Pouya giving the correct date, and whether (a) was a misreport, a different milestone, or something else. Then re-stamp the §4 row and correct or annotate (a) — the Change Log is append-only, so (a) gets a pointer, never an edit. Raised by `claims-auditor`, 2026-08-30 | **Nothing — and closed on that basis rather than despite it.** The site states what Pouya most recently instructed, and no page carries the date |
| ~~Q1~~ | **ANSWERED 2026-08-26.** Licensure is left out entirely; the site asserts the JD only. See D13 | — | | ~~Q1~~ | **ANSWERED 2026-08-26.** Licensure is left out entirely; the site asserts the JD only. See D13 | — |
| ~~Q2~~ | **ANSWERED 2026-08-26, AND SUPERSEDED 2026-08-29.** The answer then was *"Q.Arb commenced August 2026"*. **Q.Arb is now HELD** — see the §4 Verified row. ⚠️ Corrected in place because §9 is Current Truth; the superseded answer is preserved above rather than deleted, and **the conflict between the two dates is open as Q55** | — | | ~~Q2~~ | **ANSWERED 2026-08-26, AND SUPERSEDED 2026-08-29.** The answer then was *"Q.Arb commenced August 2026"*. **Q.Arb is now HELD** — see the §4 Verified row. ⚠️ Corrected in place because §9 is Current Truth; the superseded answer is preserved above rather than deleted, and **the conflict between the two dates is open as Q55** | — |
| ~~Q3~~ | **ANSWERED 2026-08-26.** Email `info@smlcompany.ca`. No public phone — "By scheduled call". Location: Toronto · Ontario · By appointment | — | | ~~Q3~~ | **ANSWERED 2026-08-26.** Email `info@smlcompany.ca`. No public phone — "By scheduled call". Location: Toronto · Ontario · By appointment | — |
@@ -930,6 +931,207 @@ never being raised again.
# Change Log # Change Log
## 2026-08-30 (ae) — D20 moves the claims pass to cutover; Q56 rules mediation UNSCOPED and records why the asymmetry with arbitration is designed; Q55 is closed without being resolved; and `check:claims` is frozen
**Three rulings and two conventions, all Pouya's, recorded in one entry because
they were one directive.** Build step 6 was run under them the same day and is recorded in its own entry.
### D20 — the per-step claims audit stops, and this must read as calibration
**New locked decision. `claims-auditor` runs ONCE, at cutover, over the whole
finished site.** Per step it is `adversarial-reviewer` alone, two rounds max
under D19. `npm run check:claims` is **unchanged** and still runs on every build
and both deploy paths. Pouya reads the copy as it is built; that is the human
pass.
**His reasoning, recorded in full in §3 D20 rather than summarised here**, because
"we stopped running the compliance check" is the kind of sentence a later reader
has to be able to weigh:
- **Nothing has shipped.** Every claims finding to date has been about a page no
visitor can reach — the entire risk is deferred to cutover already, and
auditing nine build steps then re-auditing the fixes is auditing a draft
nobody can read.
- **One pass over twenty finished pages catches MORE than nine over drafts**,
because it sees the site as a reader does. The `/med-arb/` ADRIC gloss is the
proof: no individual claim was false, the defect was **adjacency**, and
adjacency does not exist until the pages sit next to each other.
- **The code reviewer stays per step because what it catches compounds.** An
accessibility or crawlability defect propagates into the next page built on
it. A claims defect does not compound; it sits there until someone reads it.
**And what it costs is recorded, not glossed.** `claims-auditor` has caught the
struck false universal reaching a public page in the first person, a `<title>`
reading "Sole Arbitrator", "Every award I issue" on a practice with no completed
arbitration, four breaches of the Q54 gate on the day it was written, the
memberships currency warranty, and a §4 Verified row authorising exactly what
D16 forbids. D20 accepts that a defect of that class may now live in an
unpublished draft for weeks. **It must not survive cutover**`docs/06` carries
two blocking items for it at the top of the checklist.
**One substitution, flagged rather than made silently.** Pouya's directive wrote
that several of those defects "read badly on a legal professional's site".
`CLAUDE.md` bars describing him as a legal professional **anywhere, that file
included**, so §3 D20 says "the site of a person who holds a JD". The
substitution is his rule applied to his own sentence; the meaning is unchanged.
### The D20 sweep, as a command
D20 was swept to the six destinations Pouya named plus §3 itself. Verified by
command, output read before this line was written:
```
$ git grep -c 'D20' -- CLAUDE.md AGENTS.md docs/ .claude/
.claude/agents/claims-auditor.md:4
.claude/commands/build.md:5
.claude/commands/review.md:3
AGENTS.md:3
CLAUDE.md:5
docs/06-deployment.md:3
docs/08-execution-protocol.md:5
```
`D17` and `D19` are amended in place rather than superseded: D17's "two
independent review agents" now describes the project rather than the step, and
**D19's two-round cap is explicitly scoped to the per-step code review** — it
does not govern the cutover claims pass, which has no second pass behind it and
runs until its findings are resolved.
Three residual per-step references were caught by re-reading rather than by the
sweep: `/build`'s "Both briefs carry the same boundary", `/build` Phase 5's
"a finding neither review agent has to spend a pass on", and `docs/08`'s
"Verifying they are loaded" block, which the edit had orphaned inside a new
subsection. All three corrected.
### Q56 — RULED. Mediation is NOT scoped commercial
Pouya: *"Correct the four 'Commercial Mediation' surfaces to 'Mediation'; leave
§4's mediation row unscoped."*
**The reason is recorded beside BOTH §4 rows so the asymmetry reads as designed
rather than as an oversight.** Arbitration is scoped commercial because of a
**legal gate** — Q39, family arbitration in Ontario requires prescribed training.
**Mediation has no such gate.** A later editor tidying the two rows into a
matching pair would be reintroducing the defect, and both rows now say so.
**Q56 named four surfaces. The sweep changed thirteen shipped strings across five
files, and `adversarial-reviewer` then found three more it had missed.** The
count matters because the enumeration is what a later auditor treats as the
completeness list — the same shape as the `Q.Arb` sweep that missed ten lines in
`docs/03`. What was corrected:
| Where | Was |
|---|---|
| `/mediation/` `<title>` | `Commercial Mediation · …` |
| `/mediation/` `Service.name` | `Commercial mediation` |
| `/mediation/` `Service.description` | `Sole-mediator appointments in commercial disputes.` |
| `/mediation/` meta description | `Sole mediator for commercial disputes in Toronto.` |
| `/mediation/` §Subject matter lede | `Where a commercial mediation usually turns on…` |
| `/mediation/` §The role | `What I bring to a commercial file…`**round 2** |
| `/` meta description | `Commercial mediation and arbitration in Toronto.` |
| `/` hero lede | `I mediate commercial disputes from Toronto…` |
| `/about/` hero lede | `I mediate commercial disputes and I accept…` |
| `/practice/` meta description | `Six areas where a commercial dispute…`**round 2** |
| `/practice/` hero lede | `Each of these is a place where a commercial dispute…`**round 2** |
| `/practice/` §The processes | `…choosing between, in commercial matters.`**round 2, BLOCKING** |
| `src/data/schema.ts` `ProfessionalService.description` | `Commercial mediation and arbitration for…` |
**The blocking one is the finding of this change set, and my sweep could not have
found it.** `/practice/` shipped *"These describe the process the parties are
choosing between, in commercial matters"* immediately above links to
`/mediation/`, `/arbitration/` and `/med-arb/` — so "these" scopes **mediation**,
on the page that distributes traffic to it, hours after this same change set
wrote *"do not scope it on a page"* into §4. **"Commercial" and "mediation" are
never in the same element**, so no proximity grep reaches it. Counsel with a SABS
mediation reads the six area cards, reads that the processes are offered in
commercial matters, and concludes the practice does not take their matter.
`docs/03` now carries the command **and its limit**: the proximity grep finds the
adjacent form only, and for the split form there is no pattern — read every
`commercial` in `src/` and `dist/` and ask what each one is scoping.
**Left deliberately, so the judgement is visible rather than missed:**
`/practice/cross-cultural/` ships *"These run as commercial mediations and
arbitrations, from Toronto"*. Its referent is the cross-cultural **commercial**
matters the page has just defined — §4's own words for that area — so it is
context, not a scope on the offering. It is the only literal `commercial
mediation` string left in `dist/`. Raised by `adversarial-reviewer` as a
judgement call; called this way, and recorded here so Pouya can reverse it.
**And §4's mediation enumeration is annotated rather than edited.** Pouya's
ruling lists five subject matters — *"commercial, construction, insurance/SABS,
shareholder and cross-cultural"* — against **six** published areas, every one of
which offers mediation. Technology and energy are absent. Read as an
enumeration the row is short by two and a later reader would strike two live
pages. The row now says the list is **illustrative of breadth, not a closed
set**, and that Q35's gate governs the authorised subject matter. The words are
his ruling, so they were annotated, not rewritten. **Flagged to him.**
### Q55 — CLOSED WITHOUT BEING RESOLVED, and the difference is the ruling
Pouya: *"The date is not published and nothing depends on it… A register that
says 'two inconsistent reports of an unpublished fact, neither relied on' is
complete. Do not put it to Pouya."*
§4's Q.Arb row now carries the **split stamp explicitly**, which it did not
before: `[verified 2026-08-29 — Pouya]` on the **status**, `[Pouya's stated basis
2026-08-29]` on the **date**. The 2026-08-26 (a) Change Log report of *commenced
August 2026* stands **unreconciled, permanently and on purpose** — the row says
so, and says not to reconcile it by inference, re-stamp it, or put it back to
him. The publication rule is untouched: no date ships.
### `check:claims` IS FROZEN — a tripwire, not a program
Pouya's ruling, on his own measurement: round 2 of the Q.Arb amendment found
**five defects in round 1's fixes to that script, two of which made it worse than
before the pattern existed**. At that point it was generating defects at roughly
the rate it caught them. The rule, now in `CLAUDE.md`:
- a pattern is added **only after a real breach has reached `dist/`**, never
speculatively;
- each addition ships with **a probe** proving it catches the actual breach
**and a negative fixture** proving it stays silent on the nearest approved
copy;
- **no refactors, no coverage improvements, no tidying.**
The script was not touched in this change set, and step 6 tested the freeze
within hours, on `/for-parties/` at build step 6.
### Two conventions into `CLAUDE.md`
1. **Sweep the vocabulary, not only the subject.** `git grep 'Q.Arb'` is
line-anchored and could not find ten lines entirely about Q.Arb that never
name it. R8's sharpest edge: a sweep can be a real command, read honestly,
and still be the wrong command. The `/practice/` finding above is the same
rule from a third angle — there the two words are not even in the same
element, so **no** pattern reaches it and only reading does.
2. **Agent definitions load at session start.** An edit to `.claude/agents/*.md`
does not reach the session that made it. Restart before relying on one, and
**say in the report which version actually ran.** Found when `claims-auditor`
reconstructed the gloss lens from this Change Log rather than having it in
its brief.
Convention 2 is also in `docs/08` beside the "verifying the agents are loaded"
instruction, which is where someone checking that would look.
### Verification
```
npm run check exit 0 0 errors / 0 warnings / 0 hints
npm run lint exit 0
npm run build exit 0
npm run check:claims exit 0
```
The `Commercial Mediation` correction was verified on `dist/` rather than on
`src/`: `grep -ric 'commercial mediation' dist/` returns **1**, and it is
`/practice/cross-cultural/`'s deliberate leave, recorded above. The reviewer
independently enumerated **all 62 occurrences of `commercial`** across the 14
built pages with 240 characters of context and read each one — **none scopes
mediation.**
---
## 2026-08-30 (ad) — Q.Arb is HELD; C.Med-Arb is struck entirely; the paired-disclosure condition dissolves with the stage it required — and this deviates from the strategy brief deliberately ## 2026-08-30 (ad) — Q.Arb is HELD; C.Med-Arb is struck entirely; the paired-disclosure condition dissolves with the stage it required — and this deviates from the strategy brief deliberately
**Type:** ruling + D3-class sweep. **20 files, +1064 / 607.** `src/` alone is **Type:** ruling + D3-class sweep. **20 files, +1064 / 607.** `src/` alone is
+88 -7
View File
@@ -57,8 +57,9 @@ being restated in the prompt.
anything live), read the governing specs, name the decisions the task touches, anything live), read the governing specs, name the decisions the task touches,
and **stop and ask on any conflict**. A blocked build is a correct build. and **stop and ask on any conflict**. A blocked build is a correct build.
2. **Implement** — following the conventions below. 2. **Implement** — following the conventions below.
3. **Adversarial review** — invoke `adversarial-reviewer` and `claims-auditor` in 3. **Adversarial review** — invoke `adversarial-reviewer` on the diff. **D20:
parallel on the diff. `claims-auditor` does NOT run per step.** It runs once, at cutover, over the
whole finished site.
4. **Resolve** — fix each finding or decline it with a stated reason. Re-review 4. **Resolve** — fix each finding or decline it with a stated reason. Re-review
material fixes. material fixes.
5. **Verify** — run the checks. Never report a check as passing that you did not 5. **Verify** — run the checks. Never report a check as passing that you did not
@@ -67,6 +68,14 @@ being restated in the prompt.
`/review` runs phase 3 alone. `/wrap` runs phase 6 at session end. `/review` runs phase 3 alone. `/wrap` runs phase 6 at session end.
**Agent definitions load at session start.** An edit to `.claude/agents/*.md`
does not reach the session you made it in — the brief in force is the one that
was on disk when the session began. After committing a change to one, **restart
before relying on it, and say in the report which version actually ran.** Found
2026-08-30: the gloss lens was added to `claims-auditor` and the agent then
reconstructed it from the `AGENTS.md` Change Log rather than having it in its
brief, which is luck, not process.
**Think deeply before acting.** Extended thinking is on by default for this **Think deeply before acting.** Extended thinking is on by default for this
project (`.claude/settings.json`), and `/build` and `/review` request it project (`.claude/settings.json`), and `/build` and `/review` request it
explicitly. The planning and review phases are where it earns its cost — a defect explicitly. The planning and review phases are where it earns its cost — a defect
@@ -90,11 +99,33 @@ an accusation, and do not argue a reviewer down — either fix it, or record the
reason you declined it so a later reader can see the judgement was made rather reason you declined it so a later reader can see the judgement was made rather
than missed. than missed.
**Two reviewers, because they catch different things.** `adversarial-reviewer` **Two reviewers, because they catch different things — but they no longer run at
reads the code. `claims-auditor` reads the copy against the §4 register and knows the same time.** `adversarial-reviewer` reads the code. `claims-auditor` reads the
nothing about whether the code is elegant. A generic reviewer consistently copy against the §4 register and knows nothing about whether the code is elegant.
under-weights the professional-conduct check, which is the highest-stakes failure A generic reviewer consistently under-weights the professional-conduct check,
mode on this project — so it gets its own pass. which is the highest-stakes failure mode on this project — so it keeps its own
pass rather than being folded into the code review.
**D20, 2026-08-30 — the claims pass moved to cutover.** Per step it is
`adversarial-reviewer` alone. `claims-auditor` runs **once, over the whole
finished site**, as a blocking item on `docs/06`'s cutover checklist. Pouya's
reasoning, and it is a calibration and not an erosion: nothing has shipped, so
every claims finding so far has been about a page no visitor can reach — the risk
is deferred to cutover anyway, and one pass over twenty finished pages catches
**more** than nine passes over drafts, because it sees the site as a reader does.
The `/med-arb/` ADRIC gloss is the proof: no individual claim was false, the
defect was **adjacency**, and adjacency does not exist until the pages sit next to
each other. The code reviewer stays per step because what it catches **compounds**
— an accessibility or crawlability defect propagates into the next page built on
it, and a claims defect does not; it sits there until someone reads it.
**What it costs is recorded in `AGENTS.md` D20, not summarised away here.** Read
it before proposing any further relaxation: `claims-auditor` has caught defects
that would have been serious on a live page, and D20 accepts that such a defect
may now live in an unpublished draft for weeks. Two things carry that risk in the
meantime — **`npm run check:claims`, which is unchanged and runs on every build
and both deploy paths**, and **Pouya reading the copy as it is built**. Neither is
optional, and neither is a substitute for the cutover pass.
## Commands ## Commands
@@ -221,6 +252,16 @@ argument and the comparison never ran. Prefer `git grep`, quote or array-expand
anything you pass as flags, and re-check any result whose shape is "uniformly anything you pass as flags, and re-check any result whose shape is "uniformly
bad". bad".
**And re-check "uniformly GOOD" too — that is the dangerous half.** *Added
2026-08-30.* The same `set -- $pair` loop recurred while confirming nine restored
files matched a saved copy, and this time it printed **`same` on all nine**:
`shasum` was handed both filenames as one argument, errored, and left both
variables empty, so `"" = ""` passed. **The `DIFFER` version announces itself
because it is alarming; a false pass is the answer you wanted and it ends the
check.** A comparison must **assert that both things it compares exist** before
comparing them, and `git grep` silently misses untracked files — so a clean sweep
across new work means nothing until the files are staged.
**A parent cannot style a child component's root element.** Astro does not pass **A parent cannot style a child component's root element.** Astro does not pass
a parent's scope attribute down, so `<Button class="header-cta" />` compiles the a parent's scope attribute down, so `<Button class="header-cta" />` compiles the
parent's rule to `.header-cta[data-astro-cid-<parent>]` while the rendered `<a>` parent's rule to `.header-cta[data-astro-cid-<parent>]` while the rendered `<a>`
@@ -339,6 +380,46 @@ sweep; instances survived all three, and one of them was inside
`.claude/agents/claims-auditor.md` — the definition of the agent whose job is to `.claude/agents/claims-auditor.md` — the definition of the agent whose job is to
catch exactly that. Recall is not evidence. catch exactly that. Recall is not evidence.
**And sweep the VOCABULARY, not only the subject.** *Added 2026-08-30, from the
Q.Arb amendment.* `git grep 'Q.Arb'` is line-anchored, so it could not find **ten
lines in `docs/03` that were entirely about Q.Arb and never named it** — an
unstruck, imperative block still instructing the struck form, eleven lines below
that change set's own strike notice on the same bullet. The sweep was a real
command and its output was read honestly. It was still the wrong command.
So after sweeping the term, sweep the words its claims are **made of** — here,
the stage vocabulary (`commenced`, `in progress`, `pathway`, `not yet`) with no
mention of the designation. This is R8's sharpest edge, and it is the one that
survives an honest reader: a sweep can pass every test in the rule above and
still miss everything, because the anchor you chose is not the anchor the text
uses. The same session also excluded `docs/reference/` as "sourced extracts" —
half right. The quotations there are evidence; **the commentary around them is
this repository's voice**, and three lines of it still asserted the struck row.
**`check:claims` IS FROZEN. It is a tripwire, not a program.** *Pouya's ruling,
2026-08-30.* Round 2 of the Q.Arb amendment found **five defects in round 1's own
fixes to that script, two of which made it worse than before the pattern
existed** — a dedup key that reported two breaches of the same string as one (the
check truncating its own output), and a collapsed-text view whose window leapt
paragraph boundaries onto approved copy while its comment claimed it could not.
At that point it was generating defects at roughly the rate it caught them.
The rule, and it has no exceptions:
- **A pattern is added only after a real breach has reached `dist/`.** Never
speculatively, never to close a gap you can imagine.
- **Each addition ships with a probe** — an injected page proving it catches the
actual breach — **and a negative fixture** proving it stays silent on the
approved copy nearest to it.
- **No refactors. No coverage improvements. No tidying.** If a pattern is wrong,
change that pattern deliberately, with a Change Log entry. Do not rewrite the
scanner around it.
Under D20 this script is the only per-step claims control, which is an argument
for keeping it **correct**, not for growing it. It catches the §4 breaches that
are greppable and makes no claim about the ones that are not.
**Comments record decisions, not history — D19.** *"X because D13"* stays. **Comments record decisions, not history — D19.** *"X because D13"* stays.
*"This was Y, then flagged, then became X"* belongs in the `AGENTS.md` Change *"This was Y, then flagged, then became X"* belongs in the `AGENTS.md` Change
Log, which is where a reader looks for how something got here. **A comment Log, which is where a reader looks for how something got here. **A comment
+5 -1
View File
@@ -213,7 +213,11 @@ to an appointment. This page carries the verifiable record.
**Job:** convert counsel who have already decided on mediation and are choosing a **Job:** convert counsel who have already decided on mediation and are choosing a
neutral. neutral.
**Search intent:** `commercial mediator Toronto`, `ADRIC mediation rules`, **Search intent:** `commercial mediator Toronto`, `ADRIC mediation rules`,
`what happens at mediation Ontario`. `what happens at mediation Ontario`. **These are queries, not the page's scope —
Q56, 2026-08-30.** The mediation offering is **not** scoped commercial (§4's row
is unscoped; the arbitration scope is a legal gate and does not transfer). Do not
read the first query back into the `<title>` or the copy, which is where
*"Commercial Mediation"* came from in the first place.
1. What the service is; the neutral's role stated plainly. 1. What the service is; the neutral's role stated plainly.
2. **Formats:** full-day, half-day, shuttle, remote, hybrid. 2. **Formats:** full-day, half-day, shuttle, remote, hybrid.
+32
View File
@@ -92,6 +92,38 @@ detect padding instantly and discount everything after it.
scoped; found by `claims-auditor` on re-audit, one file over from the same scoped; found by `claims-auditor` on re-audit, one file over from the same
defect fixed in `docs/04` earlier the same day. defect fixed in `docs/04` earlier the same day.
⚠️ **AND THE MEDIATION HALF IS THE OPPOSITE — Q56, ruled by Pouya 2026-08-30.
DO NOT MIRROR THIS SCOPE ONTO MEDIATION.** The scope above exists because of a
**legal gate**: family arbitration in Ontario requires prescribed training, so
"in commercial matters" is load-bearing there. **Mediation has no such gate,
§4's mediation row is unscoped on purpose.** Pouya's list of what he mediates
— *"commercial, construction, insurance/SABS, shareholder and cross-cultural
matters"* — is **illustrative of breadth, not a closed set**: the site
publishes **six** areas and every one of them offers mediation
(`src/data/practice-pages.ts`), technology and energy included. Do not read it
as the authorised subject-matter list; §4's Q35 gate governs that.
The site-wide *"Commercial Mediation"* framing was **under-describing the
offering**, and it was corrected rather than ratified as positioning. The
asymmetry between the two halves is designed; a later editor tidying them into
a matching pair would be reintroducing the defect.
⚠️ **AND DO NOT TREAT ANY LIST OF THE CORRECTED SURFACES AS COMPLETE.** Q56
named four. The sweep that implemented it changed **thirteen shipped strings
across five files**, and `adversarial-reviewer` then found **three more it had
missed** — the worst on `/practice/`, where *"These describe the process the
parties are choosing between, in commercial matters"* scoped mediation with
the two words never appearing in the same element, so no proximity grep could
reach it. The command, and its limit:
```
git grep -nEi 'commercial[^.]{0,60}mediat|mediat[^.]{0,60}commercial' -- src/
```
That finds the **adjacent** form only. For the split form there is no pattern —
read every occurrence of `commercial` in `src/` and in `dist/`, and ask what
each one is scoping.
⚠️ **TEN LINES WERE DELETED HERE ON 2026-08-30, AND THE DELETION IS THE ⚠️ **TEN LINES WERE DELETED HERE ON 2026-08-30, AND THE DELETION IS THE
POINT.** They read *"'Pathway', never 'designation'"*, cited the **struck** POINT.** They read *"'Pathway', never 'designation'"*, cited the **struck**
Forbidden row as live, instructed that *"the limit being named is the stage of Forbidden row as live, instructed that *"the limit being named is the stage of
+18 -1
View File
@@ -342,7 +342,24 @@ Then invalidate `/*`.
## Cutover checklist — D11 is a single shot, so run all of it ## Cutover checklist — D11 is a single shot, so run all of it
**Content and compliance** **Content and compliance**
- [ ] Every claim traced to `AGENTS.md` §4 Verified
> ⚠️ **THE FIRST TWO ITEMS ARE THE PROJECT'S ONLY FULL CLAIMS PASS — D20, Pouya,
> 2026-08-30.** `claims-auditor` no longer runs per build step; `/build` Phase 3
> is `adversarial-reviewer` alone. Everything the register is meant to prevent
> therefore lands here. `AGENTS.md` D20 records both the reasoning and what
> deferring it costs — read it before treating either item as a formality, and do
> not tick one because `npm run check:claims` is green. That script is a greppable
> tripwire; it cannot read a page.
- [ ] **`claims-auditor` run over EVERY page in `dist/`, findings resolved.**
**This is the project's only full claims pass. Nothing publishes until it
is clean.** Not per-page in isolation — the pass exists here because the
defects worth catching late are the ones that only exist once the pages sit
next to each other. Give it the whole built site and the reading order a
visitor takes.
- [ ] **Pouya has read every page against `AGENTS.md` §4.** The human pass. It is
the other half of D20 and it is not delegable — his reading is what the
per-step audit was traded for.
- [ ] **Memberships RE-CONFIRMED AGAIN, on the day of cutover**`AGENTS.md` - [ ] **Memberships RE-CONFIRMED AGAIN, on the day of cutover**`AGENTS.md`
§12 **R10**, which is now an **event trigger and cutover is one of its two §12 **R10**, which is now an **event trigger and cutover is one of its two
events.** Q44 closed 2026-08-28 and the group is published on `/about/` events.** Q44 closed 2026-08-28 and the group is published on `/about/`
+56 -19
View File
@@ -14,9 +14,9 @@ it does not need restating in every prompt.
That single command runs: plan → implement → adversarial review → resolve → That single command runs: plan → implement → adversarial review → resolve →
verify → record. It requests deep reasoning, reads `AGENTS.md` and the specs, verify → record. It requests deep reasoning, reads `AGENTS.md` and the specs,
stops if the task conflicts with a locked decision, invokes two independent stops if the task conflicts with a locked decision, invokes `adversarial-reviewer`
reviewers on the finished diff, resolves what they find, runs the checks, and on the finished diff, resolves what it finds, runs the checks, and appends the
appends the Change Log entry. Change Log entry.
You do not need to ask for thinking, for review, or for the record to be updated. You do not need to ask for thinking, for review, or for the record to be updated.
Those are the agreement, not the request. Those are the agreement, not the request.
@@ -26,29 +26,53 @@ Those are the agreement, not the request.
| Command | Does | | Command | Does |
|---|---| |---|---|
| `/build <task>` | The full loop. Use for every substantive change | | `/build <task>` | The full loop. Use for every substantive change |
| `/review [scope]` | The review pass alone, on the working tree or a named scope. Reports; fixes nothing without your say-so | | `/review [scope]` | The **code** review alone, on the working tree or a named scope. Reports; fixes nothing without your say-so. Under D20 it does not run the claims pass |
| `/wrap` | End of session — updates `AGENTS.md` under its constitution and leaves the tree clean | | `/wrap` | End of session — updates `AGENTS.md` under its constitution and leaves the tree clean |
## The two reviewers ## The two reviewers, and when each of them runs — D20
Both are defined in `.claude/agents/` and run in parallel on the diff. Both are defined in `.claude/agents/`. **They no longer run together.**
**`adversarial-reviewer`** reads the code: correctness and edge cases, **`adversarial-reviewer` runs on every build step.** It reads the code:
accessibility, crawlability, performance budgets, security, and whether a correctness and edge cases, accessibility, crawlability, performance budgets,
materially simpler correct version exists. security, and whether a materially simpler correct version exists.
**`claims-auditor`** reads the copy against `AGENTS.md` §4 and nothing else. It **`claims-auditor` runs once, at cutover, over the whole finished site.** It reads
extracts every factual assertion — credentials, roles, numbers, languages, the copy against `AGENTS.md` §4 and nothing else — extracting every factual
locations, capabilities, and the JSON-LD — and traces each to the Verified table. assertion (credentials, roles, numbers, languages, locations, capabilities, and
Anything untraceable is reported and does not ship. the JSON-LD) and tracing each to the Verified table. Anything untraceable is
reported and does not ship. `docs/06`'s cutover checklist carries it as a blocking
item, alongside your own read of every page against §4.
It is a separate agent on purpose. A general-purpose reviewer will happily It is a separate agent on purpose. A general-purpose reviewer will happily
approve elegant code containing a claim that should never have been published, approve elegant code containing a claim that should never have been published,
because professional-conduct compliance is not what it is looking at. On this because professional-conduct compliance is not what it is looking at. On this
project that is the highest-stakes failure mode, so it gets its own pass. project that is the highest-stakes failure mode, so it keeps its own pass.
**Verifying they are loaded.** `.claude/agents/` is the correct location. To ### Why the claims pass moved, and what it costs
confirm the agents are live, invoke one directly:
Your ruling, 2026-08-30. `AGENTS.md` D20 carries it in full; the short form:
- **Nothing has shipped.** Every claims finding to date has been about a page no
visitor can reach. The risk is deferred to cutover whether or not the audit is.
- **One pass over twenty finished pages catches more than nine over drafts**,
because it reads the site as a visitor does. The `/med-arb/` ADRIC gloss is the
proof: no individual claim was false, the defect was **adjacency**, and
adjacency does not exist until the pages sit next to each other.
- **The code reviewer stays per step because what it catches compounds.** An
accessibility or crawlability defect propagates into the next page built on it.
A claims defect does not compound; it sits there until someone reads it.
**What it costs, stated rather than glossed:** a claims defect can now live in an
unpublished draft for weeks. Two things carry that risk in the meantime, and
neither is a substitute for the cutover pass — **`npm run check:claims`**, which
is unchanged and runs on every build and both deploy paths, and **you reading the
copy as it is built.**
## Verifying the agents are loaded
**`.claude/agents/` is the correct location.** To confirm the agents are live,
invoke one directly:
``` ```
Use the claims-auditor agent to audit README.md against AGENTS.md §4. Use the claims-auditor agent to audit README.md against AGENTS.md §4.
@@ -57,20 +81,29 @@ Use the claims-auditor agent to audit README.md against AGENTS.md §4.
A verdict table back means both are wired. "No such agent" means the frontmatter A verdict table back means both are wired. "No such agent" means the frontmatter
needs looking at. needs looking at.
**Agent definitions load at session start.** An edit to `.claude/agents/*.md`
does not reach a running session — the version in force is the one that was on
disk when the session began. So after changing a brief, restart before relying on
it, and **say in the report which version actually ran.** This is not theoretical:
the gloss lens was added to `claims-auditor` on 2026-08-30 and the agent
reconstructed it from the Change Log rather than having it in its brief, because
the edit and the run were in the same session.
**Both are instructed to treat uncertainty as a defect.** They will sometimes be **Both are instructed to treat uncertainty as a defect.** They will sometimes be
wrong. That is the intended trade: explaining why a finding is mistaken costs wrong. That is the intended trade: explaining why a finding is mistaken costs
minutes, and a missed defect on this project's public marketing pages minutes, and a missed defect on this project's public marketing pages
costs a great deal more. costs a great deal more. **This weighs heavier on the cutover pass, not lighter**
— there is nothing behind it, so D19's two-round cap does not apply there.
## The rule that makes it work ## The rule that makes it work
**The reviewers are given the diff and the specs — never the implementer's **A reviewer is given the diff and the specs — never the implementer's
explanation of why the work is correct.** explanation of why the work is correct.**
A rationale anchors the reviewer. Told why something is right, a reviewer looks A rationale anchors the reviewer. Told why something is right, a reviewer looks
for confirmation and finds it; given only the artefact, it forms an independent for confirmation and finds it; given only the artefact, it forms an independent
view. That independence is the entire mechanism. Every other detail of this view. That independence is the entire mechanism. Every other detail of this
protocol is adjustable. This one is not. protocol is adjustable — D20 just adjusted one of them. This one is not.
--- ---
@@ -135,3 +168,7 @@ see that judgement was exercised rather than the finding missed.
**A check reported as passing that was not run.** "Should pass" is not a result. **A check reported as passing that was not run.** "Should pass" is not a result.
If a build, a Lighthouse run, or a JavaScript-disabled render was not actually If a build, a Lighthouse run, or a JavaScript-disabled render was not actually
executed, it must say so. executed, it must say so.
**A report that says "reviewed" without naming which agent ran.** Under D20 a
build step gets `adversarial-reviewer` and not the claims pass; "reviewed" reads
as both. The report must name the one that ran.
+1 -1
View File
@@ -203,7 +203,7 @@ export function professionalServiceNode(imageUrl?: string) {
slogan: SITE.tagline, slogan: SITE.tagline,
url: `${SITE.url}/`, url: `${SITE.url}/`,
description: description:
'Commercial mediation and arbitration for construction, technology, ' + 'Mediation and commercial arbitration for construction, technology, ' +
'energy, insurance, shareholder and cross-border disputes. Toronto, ' + 'energy, insurance, shareholder and cross-border disputes. Toronto, ' +
'by appointment. Q.Med and Q.Arb designations held.', 'by appointment. Q.Med and Q.Arb designations held.',
provider: { '@id': PERSON_ID }, provider: { '@id': PERSON_ID },
+9 -12
View File
@@ -304,22 +304,19 @@ const CREDENTIAL_GROUPS = [
precisely because this page is where the framing now does its precisely because this page is where the framing now does its
heaviest work. heaviest work.
"I MEDIATE COMMERCIAL DISPUTES" STAYS, and a round-2 finding against THE MEDIATION HALF CARRIES NO SCOPE, AND THE ASYMMETRY IS
it was declined rather than missed. The objection: the same ground DELIBERATE — Q56, ruled 2026-08-30. Arbitration is scoped commercial
that struck "The matters I take are commercial" from the biography because of a legal gate (Q39: family arbitration in Ontario requires
should reach this sentence too. It does not. **That one was a prescribed training). Mediation has no such gate and §4's row is
universal** — it said nothing he takes is non-commercial, which is an unscoped. Do not restore "commercial" to the mediation half to make
exclusion §4 has no row for. **This one is existential**: he mediates the two read as a pair. */
commercial disputes, which §4 Offerings' mediation row supports and
which excludes nothing. A narrower claim than the row grants is
safe; a claim the row does not reach is not. */
} }
<p class="hero-lede"> <p class="hero-lede">
I am {ROLE.title} at {ROLE.at}, with {ROLE.litigationLine} across{' '} I am {ROLE.title} at {ROLE.at}, with {ROLE.litigationLine} across{' '}
{ROLE.litigationAreas.slice(0, -1).join(', ')} and{' '} {ROLE.litigationAreas.slice(0, -1).join(', ')} and{' '}
{ROLE.litigationAreas.at(-1)}. I mediate commercial disputes and I {ROLE.litigationAreas.at(-1)}. I mediate. I accept arbitration
accept arbitration appointments in commercial matters. I also work as appointments in commercial matters. I also work as a machine-learning
a machine-learning and infrastructure engineer. and infrastructure engineer.
</p> </p>
</div> </div>
+19 -41
View File
@@ -86,7 +86,7 @@ const graph = homeGraph(new URL(ldImage.src, Astro.site).href);
<BaseLayout <BaseLayout
title={`${SITE.name} · ${SITE.tagline}`} title={`${SITE.name} · ${SITE.tagline}`}
description="Commercial mediation and arbitration in Toronto. Construction, technology, energy, insurance and shareholder disputes, read as contracts and as engineering." description="Mediation and commercial arbitration in Toronto. Construction, technology, energy, insurance and shareholder disputes, read as contracts and as engineering."
imageAlt={PORTRAIT.alt} imageAlt={PORTRAIT.alt}
jsonLd={graph} jsonLd={graph}
preloadSerifItalic preloadSerifItalic
@@ -114,49 +114,27 @@ const graph = homeGraph(new URL(ldImage.src, Astro.site).href);
</h1> </h1>
{ {
/* TWO CORRECTIONS FROM `claims-auditor`, 2026-08-27, both about /* THREE CONSTRAINTS ON THIS PARAGRAPH. Trimmed to them under D19; the
implication rather than assertion — which is where D13 says the risk history is in the `AGENTS.md` Change Log.
actually lives.
(a) This read "I mediate and arbitrate commercial disputes". §4 1. ARBITRATION STAYS OFFERING-SHAPED. §4 verifies that he ACCEPTS
verifies that he ACCEPTS arbitral appointments, and separately arbitral appointments and separately verifies completed sole
verifies "multiple completed sole mediations" — there is no mediations; there is no completed-arbitration row. A present
counterpart row for a completed arbitration. Present-indicative indicative beside "mediate" invites a track record §4 does not
"arbitrate" beside "mediate" invites the reader to supply a track hold.
record for both. The offering-shaped form is what the register 2. NO COMPARATIVE CLAIM ABOUT OTHER NEUTRALS — Q41(b), closed
actually holds, and it is already the form the arbitration card 2026-08-27, and struck from `docs/03`'s positioning statement too.
below uses. 3. THE TAIL IS POUYA'S WORDING, VERBATIM: *"built for disputes that
turn on the contract, the code, and the engineering documents"*.
(b) "facts most neutrals take on faith" is a COMPARATIVE assertion Its echo of the `<h1>`'s triad is deliberate. */
about a population of third parties, and **Q41(b) CLOSED 2026-08-27:
it is not restored, and the reason is not only compliance.** Pouya:
*"That is an unverifiable empirical claim about other practitioners,
and comparative claims must be factual and verifiable. It is also
weaker copy: assert his capability, not the field's incapability."*
It is struck from `docs/03`'s core positioning statement too — the
approved-copy defence is gone, because the approved copy changed.
His replacement wording is used verbatim: *"built for disputes that
turn on the contract, the code, and the engineering documents"*. The
interim ("the documents rather than the pleadings") is also gone; it
said nothing about other neutrals but it still worked by contrast.
ON THE ECHO OF THE HEADLINE, because it is deliberate and one edit
from being reversed if he reads it as a stumble. The `<h1>` ends
"the contract, the code, and the room"; this sentence re-runs the
triad and swaps the third term for "the engineering documents". Two
of three words repeat forty words apart. Read as a rhyme it does the
work of the whole positioning statement in one move; read as an
oversight it looks careless. Judged the first, flagged as the
second. */
} }
<p class="hero-lede"> <p class="hero-lede">
I mediate commercial disputes from Toronto, and I accept commercial I mediate from Toronto, and I accept commercial arbitration
arbitration appointments. I also practise as a machine-learning and appointments. I also practise as a machine-learning and infrastructure
infrastructure engineer, so the matters I take are the ones that turn engineer, so the matters I take are the ones that turn on the
on the contract, the code, and the engineering documents: the change contract, the code, and the engineering documents: the change order,
order, the model card, the System Impact Assessment, and the the model card, the System Impact Assessment, and the regulatory
regulatory overlay around them. overlay around them.
</p> </p>
<div class="hero-cta"> <div class="hero-cta">
+10 -10
View File
@@ -33,11 +33,11 @@ const ldImage = await getImage({
}); });
const graph = serviceGraph({ const graph = serviceGraph({
path: '/mediation/', path: '/mediation/',
name: 'Commercial mediation', name: 'Mediation',
serviceType: 'Mediation', serviceType: 'Mediation',
description: description:
'Sole-mediator appointments in commercial disputes. Half day or full ' + 'Sole-mediator appointments. Half day or full day, in person, by ' +
'day, in person, by video, or shuttle.', 'video, or shuttle.',
imageUrl: new URL(ldImage.src, Astro.site).href, imageUrl: new URL(ldImage.src, Astro.site).href,
}); });
@@ -70,8 +70,8 @@ const FORMATS = [
--- ---
<BaseLayout <BaseLayout
title="Commercial Mediation · Pouya Lajevardi · Q.Med · Toronto" title="Mediation · Pouya Lajevardi · Q.Med · Toronto, Ontario"
description="Sole mediator for commercial disputes in Toronto. Q.Med through ADRIC and ADRIO. Session formats, the ADRIC National Mediation Rules, and what to bring." description="Sole mediator in Toronto, half day or full day. Q.Med through ADRIC and ADRIO. Session formats, the ADRIC National Mediation Rules, and what to bring."
jsonLd={graph} jsonLd={graph}
> >
{/* ---- 1. Hero -------------------------------------------------------- */} {/* ---- 1. Hero -------------------------------------------------------- */}
@@ -107,10 +107,10 @@ const FORMATS = [
} }
<p>{NEUTRAL_ROLE_LINE}</p> <p>{NEUTRAL_ROLE_LINE}</p>
<p> <p>
What I bring to a commercial file is that I read the contract and the What I bring to a file is that I read the contract and the technical
technical record underneath it — the change orders, the schedule, the record underneath it — the change orders, the schedule, the model
model card, the system impact assessment — rather than either side's card, the system impact assessment — rather than either side's summary
summary of them. of them.
</p> </p>
</div> </div>
</div> </div>
@@ -240,7 +240,7 @@ const FORMATS = [
<SectionHeading <SectionHeading
eyebrow="Subject matter" eyebrow="Subject matter"
level={2} level={2}
lede="Where a commercial mediation usually turns on something technical." lede="Where a mediation usually turns on something technical."
> >
<span slot="heading">Six areas.</span> <span slot="heading">Six areas.</span>
</SectionHeading> </SectionHeading>
+6 -6
View File
@@ -69,7 +69,7 @@ const ALSO_OFFERED = [
<BaseLayout <BaseLayout
title="Practice Areas · Pouya Lajevardi · Mediation and Arbitration" 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." description="Six areas where a dispute usually turns on something technical: construction, technology, energy, insurance, shareholder, and cross-border matters."
jsonLd={graph} jsonLd={graph}
> >
{/* ---- 1. Hero -------------------------------------------------------- */} {/* ---- 1. Hero -------------------------------------------------------- */}
@@ -78,10 +78,10 @@ const ALSO_OFFERED = [
<Eyebrow dot>Practice</Eyebrow> <Eyebrow dot>Practice</Eyebrow>
<h1 class="display hero-h">Six areas, one reason.</h1> <h1 class="display hero-h">Six areas, one reason.</h1>
<p class="hero-lede"> <p class="hero-lede">
Each of these is a place where a commercial dispute turns on a document Each of these is a place where a dispute turns on a document somebody
somebody has to actually read — a subcontract, a system impact has to actually read — a subcontract, a system impact assessment, a
assessment, a processing agreement, a benefits file. The process is processing agreement, a benefits file. The process is mediation or
mediation or arbitration. The area is the context it runs in. arbitration. The area is the context it runs in.
</p> </p>
</div> </div>
</section> </section>
@@ -181,7 +181,7 @@ const ALSO_OFFERED = [
<div class="prose"> <div class="prose">
<p> <p>
The area pages describe the disputes. These describe the process the The area pages describe the disputes. These describe the process the
parties are choosing between, in commercial matters. parties are choosing between.
</p> </p>
<p class="onward"> <p class="onward">
<a href="/mediation/">Mediation &rarr;</a> <a href="/mediation/">Mediation &rarr;</a>