feat: build step 5 — /practice/ and six area pages; check:claims gates §4 in dist
Build and deploy / build-and-deploy (push) Failing after 5s

Step 5 ships /practice/ and the six practice-area pages (construction,
technology, energy, insurance, shareholder, cross-border) from one route, and
adds the mechanical §4 gate Pouya ruled for.

check:claims — §4 Forbidden becomes a build error
  scripts/check-claims.mjs greps dist/**/*.html for 10 patterns, each carrying
  the incident that put it there. It strips <style> and non-JSON-LD <script>
  first (a bare sweep for "leading" returned 26 hits, 25 of them
  var(--leading-body)), self-tests every pattern against fixtures before
  sweeping, and refuses a missing, empty or stale dist/. Wired into /build
  Phase 5 and both deploy paths.

Q54 — six conduct undertakings publish, and §4 gains a third class
  Conduct undertakings sit apart from credentials and offerings: the gate is
  that Pouya said it in terms. The strings live in CONDUCT_UNDERTAKINGS so a
  softening is one visible diff. (e) and (f) replace the third-person sentences
  already on /arbitration/ rather than joining them.

Q49, Q50 recorded as rulings. §7 records the SES us-east-1 stray identity's
deletion. R11 holds typescript at its current major, with the peer-range
reason recorded.

Three facts corrected, two of them already shipped
  - The LAT gloss said mediation "before filing and continuing after filing";
    the Tribunal names mediation for "Before you apply" only and its second
    sentence is about negotiation. An ellipsis in docs/01 had deleted it.
  - "Connection allocation" is not an Ontario term.
  - "The 2026 privacy statute" does not exist — Bill C-27 died without royal
    assent. Struck from docs/03 rather than corrected in place.

ADR Chambers struck from /arbitration/ and from docs/01 item 3 (Pouya,
2026-08-30): the source establishes what the firm publishes, not that an
outside neutral can be appointed under its rules.

claims-auditor gains a second lens — for every quoted source, whether the
sentence beneath stays inside what the quotation establishes. Four shipped
defects had that shape and none of them is greppable.

CLAUDE.md gains a convention: never truncate the output of a check you intend
to believe. `npm run check | tail -3` returns warnings, hints and a blank line
and drops the errors line; it was reported as passing four times while
astro check was exiting 1 with 10 type errors.

Gates, exit status read directly, not through a pipe:
  npm run check        exit=0
  npm run lint         exit=0
  npm run build        exit=0
  npm run check:claims exit=0

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
Pouya Lajevardi
2026-08-30 09:35:26 -04:00
co-authored by Claude Opus 5
parent f3138a0a79
commit 79b19a7bd0
32 changed files with 6715 additions and 116 deletions
+919 -11
View File
@@ -243,11 +243,35 @@ appointments now**, and that — his acceptance — is what the rows below recor
> area, and family arbitration looked like a place where qualification *is*
> prescribed — and **Pouya checked it and confirmed the counter-example.** His
> words, 2026-08-27: *"My assertion was FALSE as a universal."* Family
> arbitrators in Ontario must complete prescribed training: **14 hours** on
> screening for domestic violence and power imbalances, **30 hours** of Ontario
> family law for arbitrators outside the Ontario or another Canadian bar, and
> **10 hours ongoing per two-year period**, five of them on domestic violence or
> power imbalance. Sourced, per the extract above.
> arbitrators in Ontario must complete training approved by the Attorney
> General: **14 hours** on screening for domestic violence and power imbalances,
> **30 hours** of Ontario family law for arbitrators outside the Ontario or
> another Canadian bar, and **10 hours ongoing per two-year period**, five of
> them on domestic violence or power imbalance. Sourced, per the extract above.
>
> ⚠️ **"PRESCRIBED" WAS THE WRONG WORD FOR THE HOURS, AND IT IS CORRECTED HERE
> RATHER THAN SWEPT. Re-checked independently 2026-08-29** —
> `docs/reference/ontario-shareholder-remedies.md` carries the re-check.
> **No hour figure appears anywhere in O. Reg. 134/07, in any version.** Section
> 3 requires only that an arbitrator *"shall have received the training approved
> by the Attorney General"*, as set out on a Government of Ontario website — so
> the **requirement** is prescribed by regulation and the **content** is
> delegated to a web page. The hours are real and are confirmed word for word on
> that page; they are simply not in the instrument. Two things the original
> extract did not record: the training must have been done **within five years**
> of an arbitration unless the arbitrator averaged at least two family
> arbitrations a year across those five, and the government states that **awards
> by family arbitrators who have not completed the training are not enforceable
> by the courts.**
>
> **The shorthand *"carries prescribed training"* is left standing in the
> NOT-NEGOTIABLE bullet below, in `docs/01`, in `schema.ts` and in
> `SiteHeader.astro` — deliberately.** A regulation that imposes a training
> requirement by reference does prescribe one, and rewriting four files to
> sharpen a phrase that gates nothing is the record-about-the-record work D19
> exists to stop. The precision matters here, where the reasoning is relied on.
> **Nothing on the site says any of this:** family arbitration is not offered,
> and `/arbitration/` says only that.
>
> **The scoped replacement, and exactly whose it is.** *Commercial arbitration
> in Ontario requires no licence and no designation.* That is **Pouya's stated
@@ -508,6 +532,72 @@ on Pouya's answer; condition 2 is each page's job at build step 5. `Med-Arb`
now has an Offerings row of its own and stays in the footer sitemap. Nothing in
the nav or footer is unrowed or ungated any more.
### Conduct undertakings — commitments made, as distinct from credentials and offerings
**Added 2026-08-29 on Pouya's ruling (Q54). A THIRD CLASS, and it is his:**
> "Add §4 rows for all six as conduct undertakings — a distinct class from both
> credentials and offerings. They are not facts about experience; they are
> commitments Pouya has now made, dated 2026-08-27, and they bind. Note in the
> row that any later softening is a change to a published commitment, not a
> copy edit."
**Why a third class rather than a row in one of the two above.** The Verified
table answers *is this claim about Pouya true?* The Offerings table answers *does
the practice offer this?* Neither question fits a commitment: an undertaking is
not true or false when it is made, and it is not a process the practice conducts.
It is a promise, and it becomes checkable only in the conduct that follows it.
Under **Q43** these are **service commitments** — the same class as Q27's
two-business-day response time — so the bar is that **he has said them**, not that
§4 can vouch for them. He has said them.
> **THE GATE, and it is one line.** An undertaking may be published only where
> **Pouya has made it in terms.** Not "would obviously agree to", not "follows
> from the process" — *said*. The three §4 gates for an offering do not apply and
> do not substitute: this class is the one where the register holds no view and
> the architect holds all of it.
> ⚠️ **ANY LATER SOFTENING IS A CHANGE TO A PUBLISHED COMMITMENT, NOT A COPY
> EDIT — Pouya's instruction, and it governs every row below.** This is the
> class's characteristic failure mode and it is silent: nothing in a build fails
> when a promise gets a little smaller, and the diff reads like tightening. The
> six strings live in **`CONDUCT_UNDERTAKINGS` in `src/data/site.ts`** and the
> pages render them, so the diff that would soften one is visible on one
> constant rather than distributed through three templates.
⚠️ **ON THE STAMP DATE, BECAUSE THE DATE IS THE WHOLE CONTENT OF A STAMP.** The
ruling says *"dated 2026-08-27"*. The rows below read **`[verified 2026-08-29 —
Pouya, Q54]`**, which is the date he actually ruled. This is not a quibble and it
is not the same call as the memberships row's two-day question: **the drafts did
not exist on 2026-08-27.** Q54 was raised by Claude Code on **2026-08-28** and
(d) and (e) shipped for one pass that same day before `claims-auditor` removed
them, so a commitment dated 2026-08-27 would predate the text of the commitment.
A stamp records when the assertion was made.
**RATIFIED 2026-08-30 — 2026-08-29 stands.** Pouya: *"You're right that a
commitment cannot predate its own text. My 2026-08-27 was the date I ruled, not
the date the undertakings existed."* The ruling date and the stamp date are
different facts about a commitment, and the stamp is the second one. **Closed —
do not re-open it against the quoted ruling above.**
| Undertaking | Where it ships | Status |
|---|---|---|
| **(a) Med-arb — the switch.** *"The switch is agreed in writing before the mediation phase begins, or I do not take the appointment. I will not convert a mediation into an arbitration on the day because the room has run out of road."* | `/med-arb/` §What I undertake | `[verified 2026-08-29 — Pouya, Q54]` |
| **(b) Med-arb — caucus material.** *"If a party tells me something in caucus they are not prepared for me to rely on as arbitrator, they say so at the time, and it does not enter the arbitral record."* | `/med-arb/` §What I undertake | `[verified 2026-08-29 — Pouya, Q54]` |
| **(c) Med-arb — the hard one.** *"If I cannot decide a remaining issue without relying on something said to me in confidence, I say so and step out of the arbitral phase rather than decide on it."* | `/med-arb/` §What I undertake | `[verified 2026-08-29 — Pouya, Q54]`. **SHIPS AS DRAFTED, and this row carries his reasoning because it is the only one that cost anything to make.** *"It is the strongest available answer to the med-arb objection, and cheaper in practice than it sounds — the arbitral phase runs on the evidentiary record, not the caucus, so the case where a neutral genuinely cannot decide without confidential material is uncommon. `/med-arb/` was raising the hardest question about med-arb and answering it only at the level of process design."* Q54 warned that *"a neutral who would not honour it must not publish it"*; he published it. **This is the row where softening would be worst and least visible** — a version that says he "may" step out, or that he "considers" stepping out, is a different commitment wearing the same words |
| **(d) Mediation — caucus confidentiality.** *"What a party tells me in caucus stays in that caucus until they tell me I may use it, and I do not carry a number across the hall that I was not given to carry."* | `/mediation/` §Confidentiality | `[verified 2026-08-29 — Pouya, Q54]`. Shipped for one pass at step 4 and removed by `claims-auditor` — correctly: the gate had been applied to `/med-arb/` in the same change set and not one file over. It is here now because it is answered, not because the gate relaxed |
| **(e) Arbitration — procedure.** *"I will not run a process whose shape nobody agreed to in advance."* | `/arbitration/` §Rules | `[verified 2026-08-29 — Pouya, Q54]`. Same one-pass history as (d). **It REPLACED a third-person sentence rather than joining it** — the page already ended that paragraph *"What does not is a process whose shape nobody agreed to in advance"*, the observation form of the same proposition, and keeping both would have set the undertaking beside its own paraphrase |
| **(f) Arbitration — the award date.** *"The date the award is due is fixed in the first procedural order rather than left open."* | `/arbitration/` §Awards | `[verified 2026-08-29 — Pouya, Q54]`. Same replacement as (e), of *"The date an award is due belongs in the first procedural order"*. **The sentence after it is unchanged and is doing different work:** *"No number is published here"* is §4 Forbidden's bar on a time-to-award statistic, which is not what this undertaking is |
**What these six buy, stated once so it is not re-argued.** Q54's finding was that
all three process pages answered the fairness question *at the level of process
design* — what an agreement has to settle, what a rule set does and does not fix —
and that this is the half a reader can get from any competent page on med-arb.
**What none of them carried is what the neutral will do**, which is the half a
party actually weighs when choosing one. That gap was not an oversight: it was the
register refusing to invent a commitment. The gap closes because he made them, and
that is the only way it could have closed.
### Forbidden — must not appear on the site
**Scope, clarified 2026-08-26.** This table governs **published pages** — anything
@@ -580,6 +670,7 @@ the audience it targets. Revisit at month 1218. `[verified 2026-08-25 — dec
| Thing | Value |
|---|---|
| Framework | **Astro 7.2.9**, `output: 'static'` `[verified 2026-08-27 — npm view astro version, D1 as amended]`. `@astrojs/mdx` 7.0.8, `@astrojs/sitemap` 3.7.3, `sharp` 0.35.4 — all three at `latest`. Bumped from 7.2.7 at the step 1 → step 2 phase boundary under R11: 7.2.8 published 2026-08-26 and 7.2.9 on 2026-08-27, i.e. **two patches appeared inside 48 hours**, which is the argument for checking at boundaries rather than on failure. `engines` unchanged at `node >=22.12.0`, `npm >=9.6.5` `[verified 2026-08-27 — npm view astro@7.2.9 engines]` |
| **TypeScript — HELD at 6.x, and the hold is a peer constraint rather than a preference** | Pinned `^6.0.3`; `npm view typescript version` returns **7.0.2** `[verified 2026-08-29 — R11, step 4 → 5 phase boundary]`. **One major behind, which is the exact shape D1 was amended over — so the reason is recorded rather than the hold being silent.** `@astrojs/check@0.9.10` declares `peerDependencies: { typescript: '^5.0.0 \|\| ^6.0.0' }` `[verified 2026-08-29 — npm view @astrojs/check@0.9.10 peerDependencies]`, and `npm run check` is `astro check`, which is the type gate the deploy path runs before it builds. **Removal trigger: `@astrojs/check` widens the range to include 7.** Re-check at every phase boundary under R11 — this is a hold on a dependency's schedule, not on a judgement, so it lifts without a decision |
| Lint toolchain | ESLint **10.9.1**, `@eslint/js` 10.0.1, `globals` 17.11.0, `eslint-plugin-astro` **3.1.0**, `eslint-plugin-jsx-a11y` 6.10.2, `typescript-eslint` 8.68.0, `typescript` **6.0.3****every pin at the registry's `latest` except `typescript`** `[verified 2026-08-27 — npm view, all 14 pins]`. `@eslint/js` and `globals` are declared explicitly; before 2026-08-26 `eslint.config.js` imported them and they resolved only by npm hoisting accident. **Accessibility linting is on**`flat/jsx-a11y-recommended`, 36 rules `[verified 2026-08-26 — 7 rules fired on a deliberately inaccessible .astro file]`. `eslint-plugin-jsx-a11y@6.10.2` declares a stale `eslint ^3..^9` peer range; a one-line `overrides` entry in `package.json` resolves it. ⚠️ **`eslint-plugin-astro@3.1.0` declares `node ^22.22.3 \|\| ^24.16.0 \|\| >=26.3.0`**, which excludes Pouya's Node 25.6.0 — `npm install` prints EBADENGINE there. Dev-time only, and `nvm use` (Node 22 LTS, per `.nvmrc`) clears it. **`typescript` — the hold, and it was too wide by a whole major until 2026-08-27.** `latest` is **7.0.2** and it is unusable here: `typescript-eslint@8.68.0` peers `typescript >=4.8.4 <6.1.0` and `@astrojs/check@0.9.10` peers `^5.0.0 \|\| ^6.0.0`, so taking 7 breaks **both** the linter and `astro check` `[verified 2026-08-27 — npm view <pkg> peerDependencies]`. **But this row previously read "held at 5.x", and 6.0.3 is a stable release both peers accept** — so the pin sat a full major behind for no reason the record could name, in a row whose whole job is to name the reason. Now at **6.0.3**, the newest version compatible with both peers; `npx tsc --version` reports 6.0.3 and the full gate is green `[verified 2026-08-27]`. The 6.x listing is mostly `-dev` and `-beta` tags; **6.0.2 and 6.0.3 are the only stable 6.x releases**, which is why `npm view typescript version` (7.0.2) is not the number to pin against here. Re-check at the next phase boundary: the hold ends when `typescript-eslint` widens its peer range past `<6.1.0` |
| Lighthouse CI | **Not installed, and that is now stated wherever the check is claimed.** `@lhci/cli` was the sole source of all 10 `npm audit` findings (7 high, via `lighthouse → puppeteer-core → extract-zip`), 0.15.1 is `latest` so there was no clean upgrade, and it cannot run at all — no pages, no `lighthouserc`. Removed 2026-08-26; **`npm audit` now reports 0 vulnerabilities** `[verified 2026-08-26 — npm audit]`. Removing it left a **documented control that no longer exists**`docs/04`, `CLAUDE.md` and `/build` Phase 5 all required a run that had silently become impossible, which is Q22's defect in a different costume. Fixed 2026-08-26: the unavailability is stated in `docs/04-seo-spec.md` (budget table, the callout under Performance, and the post-launch checklist), `CLAUDE.md` (performance budget and the definition of done), `.claude/commands/build.md` Phase 5, `docs/06-deployment.md` (PR checks and the cutover checklist), and `.claude/agents/adversarial-reviewer.md` §4 — which is also told **not** to raise the absence as a finding. **Re-add at build step 7** with a pin verified that day and a check for a patched release; do not assume 0.15.1 is still the ceiling (R11) |
| Node | **22 LTS line**, `.nvmrc` holds `22` so it tracks the latest 22.x rather than freezing at a floor. `package.json` declares **`engines.node` = `^22.13.0 || >=24`** (verbatim — it excludes Node 23, an EOL odd line, which a flat `>=22.13.0` would have admitted) and **`engines.npm >=9.6.5`** — the intersection of every dependency's own floor: Astro 7 and `@astrojs/mdx` 7 need `>=22.12.0`, ESLint 10 needs `^20.19.0 \|\| ^22.13.0 \|\| >=24` `[verified 2026-08-26 — npm view astro@7.2.7 engines, npm view eslint@10.9.1 engines]`. **Pouya's machine reports Node v25.6.0** `[verified 2026-08-26 — node -v]`, an odd-numbered non-LTS line; it satisfies the floor, but `nvm use` keeps local and CI on the same runtime |
@@ -605,8 +696,8 @@ the audience it targets. Revisit at month 1218. `[verified 2026-08-25 — dec
| Required DNS (Namecheap) | TXT `@``v=spf1 include:_spf.google.com include:amazonses.com ~all` · TXT `_dmarc``v=DMARC1; p=none; rua=mailto:info@smlcompany.ca; fo=1` `[assumed]` — start at `p=none`, tighten after monitoring |
| SES DKIM — **the set that actually resolves** | `f5puwearz5ek47aiuoskk57ya6ir66ju`, `jdue2r22cxrk27laxlgnjcpby2fq4vxu`, `kznn3cklvwh4gs342rtf5euqymlger53` — all three answer NOERROR at `<token>._domainkey.smlcompany.ca` `[verified 2026-08-26 — DNS]` |
| SES DKIM — **the set that is BROKEN** | `3zsnvsjg3ddi6hjyndjy6jgjoitvhydl`, `jejgp7na3wdpprsanamct4uxxgw2tyqw`, `xpiwyftpodmgpnzfof3ee7t7fzmlmhnh` — listed in the SES console, present in Namecheap, but **NXDOMAIN**. They were entered with the full name in Namecheap's Host field, so the zone doubled the domain: `<token>._domainkey.smlcompany.ca.smlcompany.ca` resolves, the correct name does not `[verified 2026-08-26 — DNS]` |
| SES identity — **`ca-central-1` (the one that matters)** | `Verified: true`, `DkimStatus: SUCCESS`, tokens `kznn…` / `jdue…` / `f5pu…` — the set that resolves. **Healthy. Change nothing** `[verified 2026-08-26]` |
| SES identity — `us-east-1` (unused) | `Verified: false`, `DkimStatus: PENDING`, tokens `3zsn…` / `jejgp…` / `xpiwy…` — the doubled-domain set. A stray identity in a region this project does not use `[verified 2026-08-26]` |
| SES identity — **`ca-central-1` (the one that matters)** | `Verified: true`, `DkimStatus: SUCCESS`, tokens `kznn…` / `jdue…` / `f5pu…` — the set that resolves. **Healthy. Change nothing.** **RE-VERIFIED BY DNS 2026-08-29** on the same day the `us-east-1` identity threw its health event, which is the check that made "no impact" a result rather than an assumption: all three live DKIM records answer **NOERROR**, and SPF and DMARC are present `[verified 2026-08-29 — DNS, Pouya]` |
| SES identity — `us-east-1` | **BEING DELETED — Pouya's instruction 2026-08-29, and the reason is a monitoring principle rather than a cleanup.** It was `Verified: false`, `DkimStatus: PENDING`, tokens `3zsn…` / `jejgp…` / `xpiwy…` — the doubled-domain set — a stray identity in a region this project does not use `[verified 2026-08-26]`. On **2026-08-29** it produced an AWS Health event, `AWS_SES_DKIM_PENDING_TO_FAILED`, which is the **expected** outcome of DKIM CNAMEs that never resolved. **That is its third false-alarm signal:** (1) a pending identity on the console dashboard, (2) a near-miss on requesting production access in the wrong region — the trap the row below records — and (3) this health event. Pouya's reason, kept because it generalises past SES: *"A monitoring surface that reports a failure you do not have trains you to discount the ones you do."* **No impact on mail.** Deletion removes the identity, not the records — the three live DKIM CNAMEs belong to the `ca-central-1` identity and are untouched by it |
| ⚠️ **SES sandbox is per-region** | Recorded as a standing caution, not an open task — production access **was** granted in `ca-central-1` (Q19). The trap: the AWS console defaults to `us-east-1`, and granting access there leaves `ca-central-1` in the sandbox with the intake email still failing. Applies again to any future SES request `[verified 2026-08-26]` |
| SES custom MAIL FROM | **Not configured** — SES reports "No MAIL FROM records found". This is why SES's SPF is unaligned and DMARC rests on DKIM. Optional future improvement, not required `[verified 2026-08-26]` |
| SES monitoring — SNS topic | **`ses-alerts`**, `ca-central-1`. Email subscription to `info@smlcompany.ca` is **PENDING CONFIRMATION, not confirmed** `[verified 2026-08-26]`. **Until the subscription is confirmed the alarms below fire into nothing** — confirm the link in the subscription email |
@@ -687,7 +778,7 @@ Nothing below can be invented. Each needs an answer from Pouya.
| ~~Q39~~ | **ANSWERED 2026-08-27 — and the answer is that the register's premise was FALSE.** Pouya checked it rather than defending it. His words: *"My assertion was FALSE as a universal."* **(a) Is it gated? YES.** Family arbitrators in Ontario must complete prescribed training — 14 hours on screening for domestic violence and power imbalances, 30 hours of Ontario family law for arbitrators outside the Ontario or another Canadian bar, and 10 hours ongoing per two-year period. **Sourced, and the source is now in the repo** per R14: `docs/reference/ontario-family-arbitration-training.md`, retrieved 2026-08-27 with provenance. **(b) Does the offering extend to it? NO** — and that is what actually disposes of the question. Pouya does not do family arbitration, so it is a **scope exclusion, not a gating problem**, and the prescribed-training requirement never bears on this practice. `Shareholder & Family Business` means **commercial disputes among family shareholders** — shareholder and partnership disputes, co-founder breakdowns, business succession — and its page must state plainly that family law matters are not accepted. *One sentence, not a section: Pouya's instruction is that it earns its place only by saving a wasted intake call.* **(c) One honest limit on the source.** The extract establishes the family gate directly and the commercial half only by absence — it neither mentions nor excludes commercial arbitration. §4 therefore carries *"commercial arbitration in Ontario requires no licence and no designation"* as **Pouya's stated position, unstamped**, not as a sourced fact. Do not let the footnote promote it. **Also swept:** the false universal survived in three live places outside the paragraph that was corrected — §4's NOT-NEGOTIABLE boundary bullet, §9's Q33 closure row, and a comment in `SiteHeader.astro`. All three fixed; the `grep` and its output are pasted in **Change Log entry (w), §Sweeps**. *(`adversarial-reviewer` flagged this citation while it still pointed at nothing: the entry was written at Phase 6, after review, so for the duration of the review a §9 row asserted in the present tense that evidence "is in the Change Log" before it was. Fair catch. The row now names the entry, and the reviewer independently re-ran the sweep and confirmed it was genuinely complete.)* Original question follows | — |
| ~~Q39-orig~~ | **Does the arbitration offering extend to FAMILY arbitration, and is that activity gated?** Raised by `claims-auditor` 2026-08-26 as a counter-example from inside this repo, and it is a good one. §4 Offerings rests on the proposition that arbitral appointment in Ontario is not gated behind a designation. The site ships a **`Shareholder & Family Business`** practice area — and **family** arbitration in Ontario is understood to be one of the places where arbitrator qualification *is* prescribed by statute and regulation. If so, the offering test's own boundary applies: where an activity is gated, the question is **permission**, and permission is not established. **This record does not resolve it** — Claude Code will not assert a proposition of Ontario law, and neither may a self-report. What is needed: (a) does the practice-area page contemplate family-law arbitration at all, or only shareholder, partnership and family-*business* disputes, which is a different thing; and (b) if it does, the gating question needs a checkable source in the repo, per R14. **Interim:** §4's arbitration rows are scoped to **commercial** arbitration and the universal has been removed from the reasoning. Nothing ships that turns on it | The `Shareholder & Family Business` page (step 5); `/arbitration/` (step 4) |
| ~~Q40~~ | **RULED 2026-08-27 — and deliberately BUNDLED rather than shipped as a second interim.** Two kinds of card, not one. Pouya: *"A portrait is the **right** OG image for `/` and `/about/` — a face is the strongest social preview for a personal brand. It is the **wrong** one for nineteen pages, where a typed card carrying the page title would do the work. But do not build the generator now and do not leave 'portrait everywhere' as an untracked interim. **Ship it at step 7 alongside Insights, which needs per-article cards anyway — one build, one dependency, one review.**"* So the portrait is the **decided** card for `/` and `/about/`, not a placeholder; the generated typed card covers every other page and every article, built once at step 7 against a freshly checked pin (R11). Until then all pages share the portrait, and that interim **blocks cutover, not build step 3** — recorded on the cutover checklist in `docs/06` and tracked as **R15** with its removal trigger, on his instruction: *"Record the trigger so it cannot quietly become permanent."* `docs/04` amended. | Nothing until step 7. Then the generator, and cutover |
| ~~Q41~~ | **ANSWERED 2026-08-27 — all three, and two of the three interim wordings were wrong in a way the interim had not identified.** **(a) Q37's reasoning DOES extend to prose, and prose is held to a HIGHER bar, not a looser one.** Pouya: *"The implication test applies everywhere, not just to labels. Prose has more room, so it is easier to satisfy: **state the asymmetry explicitly** rather than relying on a parallel construction to carry it."* Deleting the parallel — which is all the interim did — was half the fix; a reader can still supply the missing symmetry from silence. Both pages now name both halves, from **one constant**`ASYMMETRY_LINE` in `src/data/site.ts`, which is where a claim-bearing sentence belongs (`ROLE`'s reasoning: *"these are the two where the wording IS the compliance"*). It was typed into `/` and then into `/about/`, and **the two copies had diverged inside the same session** — a comma on one, full stops on the other — which is why it is a constant and why this row cites it rather than quoting a variant. Calling the legal half **training** is what makes the licence implication impossible rather than merely absent. `docs/01` §`/` item 3 and `docs/03` §Home both carry a warning not to lift their own phrase *"law and engineering"* into copy. **(b) NOT restored, and the editorial reason outranks the compliance one.** Pouya: *"That is an unverifiable empirical claim about other practitioners… **It is also weaker copy: assert his capability, not the field's incapability.**"* His replacement is used verbatim — *"disputes that turn on the contract, the code, and the engineering documents"* — and it replaces the comparative in `docs/03`'s **core positioning statement**, so the approved-copy defence that had protected it is gone. The interim (*"the documents rather than the pleadings"*) is also gone: it said nothing about other neutrals but still worked by contrast. **(c) Verified, and the interim was ambiguous in the one word that mattered.** `docs/reference/lat-case-conference.md` `[verified 2026-08-28]`: LAT **Rule 2.4** makes *"Pre-Hearing Conference"* the Tribunal's own term for a **case conference**; **Rule 14.3** puts a **Member** in the chair and then disqualifies them from the hearing panel; **Rule 14.6** makes attendance mandatory; and the Rules contain **zero** occurrences of `mediat` or `arbitrat` in 66,593 characters. A privately retained neutral cannot be appointed to it. The affirmative basis is on the Tribunal's own AABS page: *"you may want to consider negotiation or mediation services… including before filing at the LAT-AABS, and continuing… after a claim has been filed."* The interim read *"private mediation of matters **before** the LAT"* — where `before` reads as *pending at* as readily as *prior to*. Published: *"private mediation alongside a LAT application, before filing or after."* No roster claim, because there is no row for one | — |
| ~~Q41~~ | **ANSWERED 2026-08-27 — all three, and two of the three interim wordings were wrong in a way the interim had not identified.** **(a) Q37's reasoning DOES extend to prose, and prose is held to a HIGHER bar, not a looser one.** Pouya: *"The implication test applies everywhere, not just to labels. Prose has more room, so it is easier to satisfy: **state the asymmetry explicitly** rather than relying on a parallel construction to carry it."* Deleting the parallel — which is all the interim did — was half the fix; a reader can still supply the missing symmetry from silence. Both pages now name both halves, from **one constant**`ASYMMETRY_LINE` in `src/data/site.ts`, which is where a claim-bearing sentence belongs (`ROLE`'s reasoning: *"these are the two where the wording IS the compliance"*). It was typed into `/` and then into `/about/`, and **the two copies had diverged inside the same session** — a comma on one, full stops on the other — which is why it is a constant and why this row cites it rather than quoting a variant. Calling the legal half **training** is what makes the licence implication impossible rather than merely absent. `docs/01` §`/` item 3 and `docs/03` §Home both carry a warning not to lift their own phrase *"law and engineering"* into copy. **(b) NOT restored, and the editorial reason outranks the compliance one.** Pouya: *"That is an unverifiable empirical claim about other practitioners… **It is also weaker copy: assert his capability, not the field's incapability.**"* His replacement is used verbatim — *"disputes that turn on the contract, the code, and the engineering documents"* — and it replaces the comparative in `docs/03`'s **core positioning statement**, so the approved-copy defence that had protected it is gone. The interim (*"the documents rather than the pleadings"*) is also gone: it said nothing about other neutrals but still worked by contrast. **(c) Verified, and the interim was ambiguous in the one word that mattered.** `docs/reference/lat-case-conference.md` `[verified 2026-08-28]`: LAT **Rule 2.4** makes *"Pre-Hearing Conference"* the Tribunal's own term for a **case conference**; **Rule 14.3** puts a **Member** in the chair and then disqualifies them from the hearing panel; **Rule 14.6** makes attendance mandatory; and the Rules contain **zero** occurrences of `mediat` or `arbitrat` in 66,593 characters. A privately retained neutral cannot be appointed to it. The affirmative basis is on the Tribunal's own AABS page: *"Before you apply to the LAT-AABS, you may want to consider negotiation or mediation services."* The interim read *"private mediation of matters **before** the LAT"* — where `before` reads as *pending at* as readily as *prior to*. **⚠️ (c) IS PARTLY REOPENED AND CORRECTED 2026-08-29 — THE WORDING THAT CLOSED IT WAS WRONG ABOUT THE SOURCE.** This row quoted the Tribunal's passage with an ellipsis — *"…negotiation or mediation services… including before filing at the LAT-AABS, and continuing… after a claim has been filed"* — and **the second ellipsis deleted the word that scopes the clause.** The Tribunal's second sentence reads *"Parties are encouraged to attempt to **negotiate** the claim at all times, including before filing at the LAT-AABS, and continuing **negotiation** discussions after a claim has been filed"* — negotiation, twice. So the after-filing frame belongs to **negotiation**, not to mediation, and "private" is not the Tribunal's word either. **The published blurb rested on the elided half and shipped on three pages**`/`, `/mediation/` and `/practice/`. Now published: *"private mediation retained by the parties, not the Tribunal's case conference"* — the distinction `docs/01` actually requires, and fully supported. **The defect was in the GLOSS beneath a correctly-quoted source**, which is why two review rounds and a claims audit read the extract and passed it; caught by an independent re-fetch that read the sentence structure. Same shape as Q39. Corrected in `docs/reference/lat-case-conference.md` (correction box), `docs/01`, `src/data/site.ts` and this row. **Nothing in Rule 2.4 / 14.3 / 14.6 or the zero-`mediat` count is affected** — that half of (c) stands. No roster claim, because there is no row for one | — |
| ~~Q42~~ | **ANSWERED 2026-08-27 — 3 offered, 1 STRUCK, and the one that failed is the finding.** Pouya applied the offering test himself: **early neutral evaluation** (*"A neutral assessment of merits sits inside a Q.Med's competence"*), **dispute-system design** (*"Consulting, no appointment, no neutrality question"*) and **pre-dispute technical advisory** (*"It is the moat"*) each gained a §4 Offerings row and may now ship on `/practice/`. **Settlement counsel is struck**, as his own error in `docs/01`: *"Settlement counsel acts **FOR a party** in negotiation. That is a partisan role, and putting it on a site that (a) sells neutrality and (b) asserts no licensure under D13 is **wrong twice over**: it undercuts the brand's central claim and it edges into acting for a client."* **The positioning objection comes first** — it would be wrong on a site with no licensure question at all, so it is not a D13 consequence. **What it exposed about the test:** settlement counsel fails neither question 1 nor question 2. Run mechanically the test would have PASSED it. It fails a prior question the test does not ask — *is this a neutral's role at all?* — so §4 now records that the offering test **presumes** a neutral role, with the Q42 worked example kept as the 31 table. Swept by command: `docs/01` §`/practice/`, `docs/07-fees.md` (three services at the hourly rate, not four), `FEES.hourly`'s comment, and `/`'s areas-more comment. `AGENTS.md` lines 293 and 3298 are the §4 scope enumeration (fixed) and Change Log entry (d) (history, not edited) | — |
| ~~Q43~~ | **ANSWERED 2026-08-27 — and the ruling reversed the reasoning that had blocked it.** The interim shipped the five timings as bare numbers because `docs/03` §Process required them *"real"* rather than illustrative, which was read as **barring** the word "typical". Pouya: the timings are **service commitments, the same class as Q27's response time***"not facts about Pouya, so they need framing, not a Verified row. Present them as the TYPICAL shape of an engagement, explicitly not a guarantee: mediation timing depends on party and counsel availability, which he does not control. **Published as typical, they are honest and useful; published as commitments, the first matter that slips makes the page false.**"* So no §4 row, and **the numbers are unchanged** — softening them was never the fix. What ships is `PROCESS_FRAMING` in `src/data/site.ts`: *"This is the typical shape of an engagement, not a commitment. Timing depends on party and counsel availability, which I do not control."* **Not optional, and placed adjacent to the numbers rather than in a section lede above them** — a reader who scans the strip and skips the lede has read a commitment. `docs/03` §Process amended to record the override; `docs/01` §`/process/` requires the same rendering at step 6 | — |
| ~~Q44~~ | **ANSWERED 2026-08-28 — all four current; R10 DISCHARGED, and it changes shape rather than closing.** Pouya: *"All four are current as of today."* ADRIC, ADRIO, the three OBA sections, the CTF. §4 re-stamped and `/about/` now renders the Memberships group. **Two consequences came with the answer and both are applied:** (1) **no currency warranty on the page** — the struck sentence stays struck and nothing replaces it, because he **declined renewal-date tracking** and so nothing in this repo could support one; (2) **R10 stays live and now fires on an EVENT, not a date** — re-confirm before any cutover or major republish. His reason, recorded because it is the general lesson: *"§4 already carries OCNI as lapsed and unpublishable, and that was found roughly a year late. A stamp with no trigger behind it goes stale silently, which is exactly how OCNI got onto a list of things to feature."* **Two things this answer did NOT settle**, both flagged to him rather than assumed: the stamp date (he wrote 2026-08-26, the original confirmation; the stamp reads **2026-08-28**, when he re-confirmed — a currency stamp records when the assertion was made), and `memberOf` in the JSON-LD — **which Q53 then ruled should be emitted, 2026-08-28.** `/about/`'s Person node carries the four memberships as `Organization` nodes; this row said "still withheld" until that sweep was actually run. See §4, §12 R10, `src/data/schema.ts` | — |
@@ -696,12 +787,12 @@ Nothing below can be invented. Each needs an answer from Pouya.
| ~~Q46(b)~~ | **(b) RATIFIED AND NOW SOURCED, 2026-08-28. (a) RULED, AND THE RULING DOES NOT CLOSE IT — now tracked as its own live row above.** **(b):** §11 Glossary is the source for **definitional expansions**; §4 remains the only source for claims about Pouya. Pouya: *"The line is the same one the Offerings ruling drew — 'Q.Med stands for Qualified Mediator' is a fact about the designation's name, not about him… You were right that one standard or the other had to apply."* He attached a condition — commit the source — and `docs/reference/adrio-designations.md` satisfies R14: all five expansions in ADRIO's own words, four independent fetches, reproducible sha256. **That fetch immediately earned itself** by catching that §11's `C.Med-Arb` expansion was wrong and had shipped to a public page. **(a):** he ruled that ENE, dispute-system design and pre-dispute technical advisory *"pass all three gates"*. Gates 0 and 2 are his and are answered. **Gate 1 is not his** — §4 says so twice — and it requires **an artefact, not a decision**: a checkable source, per activity and per jurisdiction. None existed and the ruling named none, so the three rows were held and the objection was put back to him as **Q46(a)****which he then ruled a second time, and Q46(a) is CLOSED. The rows are PUBLISHABLE and step 5 is unblocked;** gate 1 carries `[Pouya's stated basis 2026-08-28]`, not `[verified]`. Read the Q46(a) row above, not this sentence, for the disposition | Both closed |
| ~~Q47~~ | **ANSWERED 2026-08-28 — set both. THEN BOTH FIELDS WERE REVERTED THE SAME DAY, AND THE OPEN HALF IS Q49.** ⚠️ **Read this first, because the text below describes an implementation that does not exist.** Measured against `dist` 2026-08-28: the Person node ships `jobTitle: "Mediator"` and **no `worksFor` key at any depth**. `jobTitle`'s ruled value was struck by **both** review agents as the role-shaped claim `claims-auditor` had removed from this same node's `description` the previous day; `worksFor` was struck because §4 rows "**alongside** the practice" where the ruling says "operates **through**", and because `ProfessionalService.provider` is this Person, making the same-entity inference transitive. **Q49** carries both open rows. *This row was written describing the pre-revert state and not updated when the revert happened hours later — verbatim the failure Q44's own history records ("four documents recording a page state that had been reversed and not swept"), reproduced inside the change set that records it. Found by `adversarial-reviewer` on re-review.* **Pouya's ruling, and the reasoning that still stands, follows.** **ANSWERED 2026-08-28 — set both.** Pouya: *"A Person with a jobTitle and no worksFor is incomplete; a worksFor naming the boutique would breach D16. This satisfies both."* The bind is broken by changing what `jobTitle` is **about**: it now describes **this practice** rather than the boutique role, so `worksFor` can name **SML Company Ltd** — verified, federally incorporated, the entity the practice operates through — without going near D16. `ROLE.title` is unchanged and still carries "Director of Firm Operations" in **visible** copy; the graph gets its own constant (`PRACTICE_JOB_TITLE`), which is the separation the ruling actually turns on. **`worksFor` carries the NAME ONLY** — no address, no jurisdiction, no legal form: §4 verifies the federal incorporation and in the same row records it as *not published*, and cautions that it must never be read together with the **Licence status — NOT ESTABLISHED** row into an implication neither makes. A JSON-LD field is exactly where that pairing would travel unedited. **One flagged deviation:** he ruled `"Mediator and Arbitrator"`; it ships as **"Mediator and Commercial Arbitrator"**, because the same message instructs that *"Q39's struck universal must not reappear in any form"* and an unscoped "Arbitrator" is that form. One word to revert, deliberately | — |
| ~~Q48~~ | **CLOSED 2026-08-28 — not site-relevant, and that is a scope answer rather than an answer to the underlying question.** Pouya: *"ADRIO retention governs whether Pouya keeps a designation, not what the site may say about holding it."* He holds Q.Med today (§4, `[verified 2026-08-28]`), so `hasCredential` and the designation line are correct today, and the retention mechanics are his to manage rather than the register's to publish. **The asymmetry in ADRIO's materials is still real and still recorded**`docs/reference/adrio-designations.md` Finding 4 — and nothing was inferred from it in either direction. **Consequence applied:** the `memberOf` comment in `src/data/schema.ts` no longer carries Q48 as an argument, because Q53 removed the withholding that argument was attached to | — |
| ~~Q49~~ | **ANSWERED 2026-08-28 — ONE ROW, and it is the value already shipping.** Pouya: *"one row: 'Mediator', supported by Q.Med plus completed sole mediations."* §4 Verified now carries **Practised role — "Mediator"** with both supports named, so `Person.jobTitle` stands on a row instead of on a derivation. **(a) closed:** the narrow value is ratified; the reverted `"Mediator and Arbitrator"` is not restored, and *"Arbitrator"* as a practised role remains unrowed. **(b) declined by the same ruling** — one row was granted and the corporate relation was not it, so **`worksFor` stays out of the graph**. ⚠️ **Read as a decline rather than as silence, and flagged as such to Pouya**: Q49 asked for two rows, the ruling granted one and named which. One line reverses it if the reading is wrong | — |
| ~~Q50~~ | **ANSWERED 2026-08-28 — the masthead string, and one claim now has one form.** Pouya: *"`ProfessionalService.name` takes the ratified masthead string. Q33 reaches it; one claim should not have two forms."* `name` was a hand-typed third variant — *"Pouya Lajevardi — Mediation & Arbitration"*, em dash and ampersand — beside the masthead (*"Mediation · Arbitration · Toronto"*) and `/`'s `<title>`. ⚠️ **IMPLEMENTED AS TWO FIELDS, WHICH DEVIATES FROM THE LITERAL RULING AND NEEDS ONE LINE FROM POUYA.** What ships is `name: "Pouya Lajevardi"` and `slogan: "Mediation · Arbitration · Toronto"` — both read from `SITE.name` and `SITE.tagline`, so the hand-typed variant is gone either way, which is what the ruling was for. **Why not the concatenation:** on a `LocalBusiness`-family type `name` means the business's name, and a name plus a service list plus a city is the name-stuffing pattern a search engine discards a rich result for — on the one project whose entire purpose is crawlability. `areaServed` already carries Toronto and Ontario. schema.org has a field for each half of a masthead, so this is a decomposition rather than a refusal. **The half that is mitigated rather than answered:** `slogan` still carries an unscoped *"Arbitration"*, which was the second objection to the concatenation. Against that — the identical string already ships in `<title>`, `og:title`, `twitter:title` and `/`'s hero eyebrow, all ratified under Q33, so excluding it from one name-like field alone would be incoherent. `serviceType` stays scoped because it **enumerates services**. **One line reinstates the concatenation** if that reading is wrong | — |
| ~~Q49~~ | **ANSWERED 2026-08-28 — ONE ROW, and it is the value already shipping.** Pouya: *"one row: 'Mediator', supported by Q.Med plus completed sole mediations."* §4 Verified now carries **Practised role — "Mediator"** with both supports named, so `Person.jobTitle` stands on a row instead of on a derivation. **(a) closed:** the narrow value is ratified; the reverted `"Mediator and Arbitrator"` is not restored, and *"Arbitrator"* as a practised role remains unrowed. **(b) declined by the same ruling** — one row was granted and the corporate relation was not it, so **`worksFor` stays out of the graph**. **CONFIRMED BY POUYA 2026-08-29, as read.** His words: *"Q49 — CONFIRMED as you read it. One row, 'Mediator'. worksFor stays out."* The register had flagged the decline as a reading rather than a ruling, because Q49 asked for two rows and one was granted; the reading is now the ruling. **`worksFor` is settled out of the graph** — not withheld pending anything, and not a candidate for a later tidy-up | — |
| ~~Q50~~ | **ANSWERED 2026-08-28 — the masthead string, and one claim now has one form.** Pouya: *"`ProfessionalService.name` takes the ratified masthead string. Q33 reaches it; one claim should not have two forms."* `name` was a hand-typed third variant — *"Pouya Lajevardi — Mediation & Arbitration"*, em dash and ampersand — beside the masthead (*"Mediation · Arbitration · Toronto"*) and `/`'s `<title>`. ⚠️ **IMPLEMENTED AS TWO FIELDS, WHICH DEVIATES FROM THE LITERAL RULING AND NEEDS ONE LINE FROM POUYA.** What ships is `name: "Pouya Lajevardi"` and `slogan: "Mediation · Arbitration · Toronto"` — both read from `SITE.name` and `SITE.tagline`, so the hand-typed variant is gone either way, which is what the ruling was for. **Why not the concatenation:** on a `LocalBusiness`-family type `name` means the business's name, and a name plus a service list plus a city is the name-stuffing pattern a search engine discards a rich result for — on the one project whose entire purpose is crawlability. `areaServed` already carries Toronto and Ontario. schema.org has a field for each half of a masthead, so this is a decomposition rather than a refusal. **The half that is mitigated rather than answered:** `slogan` still carries an unscoped *"Arbitration"*, which was the second objection to the concatenation. Against that — the identical string already ships in `<title>`, `og:title`, `twitter:title` and `/`'s hero eyebrow, all ratified under Q33, so excluding it from one name-like field alone would be incoherent. `serviceType` stays scoped because it **enumerates services**. **RATIFIED 2026-08-29, AND POUYA REVERSED HIS OWN RULING TO DO IT — RECORD IT AS THE DECISION, NOT AS A DEVIATION.** His words: *"name: 'Pouya Lajevardi' + slogan. My ruling was wrong: on LocalBusiness, `name` means the business's name, and name + service list + city is the name-stuffing pattern that gets rich results discarded — on the one project whose premise is crawlability. areaServed already carries the city. Your reading beat mine; record it as the decision, not as a deviation."* So the two-field mapping is **the ruling**, the concatenation is struck, and nothing here is awaiting a line. The half that remains **mitigated rather than answered** is unchanged and stays stated: `slogan` still carries an unscoped *"Arbitration"*, acceptable only because the identical string already ships in `<title>`, `og:title`, `twitter:title` and `/`'s hero eyebrow under Q33. `serviceType` stays scoped because it enumerates services | — |
| ~~Q51~~ | **ANSWERED 2026-08-28 — KEEP THE OBA SECTIONS. The distinction is structural, not evidentiary.** Pouya: *"the Law Society is the regulator, so membership IS licensure; the OBA is a voluntary association. Structural distinction, independent of eligibility details."* That last clause is what closes it: the question was raised as unanswerable inside this repo **because OBA eligibility is not established here** — and the ruling makes eligibility irrelevant. A voluntary association admits members it does not license, so listing it carries no licensure implication; a regulator's membership roll *is* the licence. Recorded in §4's memberships row and in `.claude/agents/claims-auditor.md` so it is not re-litigated, and removed from `docs/06`'s cutover checklist. **R1 is unaffected** — same page, same subject, different question, still live | — |
| ~~Q52~~ | **CLOSED 2026-08-28 — committed, and RE-RUN rather than transcribed.** Pouya: *"YES — commit the simulate results, the inline policy, and the `NoSuchBucketPolicy` response, access key ID redacted."* `docs/reference/deploy-credential-verification.md` — eighteen read-only calls, each with the command that produced it, generated from captured output with the key ID replaced by `AKIA…REDACTED`. **Every value in §7's row reproduced**, including all nine `simulate-principal-policy` decisions (four `allowed`, five `implicitDeny`). **Two things the re-run added that the original verification did not have.** (1) A **contrast call**: `get-bucket-policy` on the *site* bucket returns exit 0 and a real policy, which is what makes exit **254** / `NoSuchBucketPolicy` on the backup bucket a genuine absence rather than a command that failed to start — the rule `CLAUDE.md` records twice, applied to the evidence that closes a High risk. (2) A correction to §7's own wording on the key's `LastUsed` field shape. The **secret** access key was never requested; the API cannot return it | — |
| ~~Q53~~ | **ANSWERED 2026-08-28 — EMIT IT. The withholding is dropped.** Pouya: *"the memberships are already crawlable in `/about/`'s HTML, so withholding the triple reduces no exposure and only makes the graph less complete than the page."* Option (a) of the three the question offered. `src/data/schema.ts` now emits `memberOf` — the four §4 memberships as `Organization` nodes — **on `/about/` only**, which is where the page shows them, so the graph and the visible page assert the same set. **This ends a judgement that was restated three times and wrong twice:** cacheability proved too much (equally true of `hasCredential`, which ships), volatility did not survive the page already carrying the claim, and the widened *"yearly renewing"* premise it rested on was itself a §4 misstatement found on re-audit | — |
| **Q54** | **Six conduct commitments are drafted and NONE ships. Confirm them, rewrite them, or decline them — three pages are the poorer for their absence and none of them may carry a commitment you have not made.** `docs/03` requires `/med-arb/` to meet the procedural-fairness objection *"head-on"* and rates that section the reason the page is worth reading; `/mediation/` and `/arbitration/` have the same gap in smaller form. **All three pages now answer at the level of PROCESS DESIGN** — what an agreement has to settle, what a rule set does and does not fix — because that describes the process and needs no §4 row. **What none of them carries is what YOU will do**, which is the half a reader weighs when choosing a neutral. Under **Q43** these are **service commitments**, not facts about you, so they are publishable **the moment you have said them** the bar is that you said them, not that §4 rows them. Drafted, and each is a separate yes: **(a) med-arb, the switch** — *"The switch is agreed in writing before the mediation phase begins, or I do not take the appointment. I will not convert a mediation into an arbitration on the day because the room has run out of road."* **(b) med-arb, caucus material** — *"If a party tells me something in caucus they are not prepared for me to rely on as arbitrator, they say so at the time, and it does not enter the arbitral record."* **(c) med-arb, the hard one** — *"If I cannot decide a remaining issue without relying on something said to me in confidence, I say so and step out of the arbitral phase rather than decide on it."* **(d) mediation, caucus confidentiality** — *"What a party tells me in caucus stays in that caucus until they tell me I may use it, and I do not carry a number across the hall that I was not given to carry."* **(e) arbitration, procedure** — *"I will not run a process whose shape nobody agreed to in advance."* **(f) arbitration, the award date** — *"The date the award is due is fixed in the first procedural order rather than left open."* **(c) is the one to weigh hardest** — the strongest available answer to the fairness objection and by far the most expensive commitment; a neutral who would not honour it must not publish it. ⚠️ **(d) and (e) SHIPPED for one pass and were removed.** `claims-auditor` found them: the gate was applied to `/med-arb/` in the same change set that wrote them, and not applied one file over. Raised by Claude Code 2026-08-28 | The fairness section on `/med-arb/`, and one paragraph each on `/mediation/` and `/arbitration/`. Nothing else — all three pages ship |
| ~~Q54~~ | **ANSWERED 2026-08-29 — ALL SIX PUBLISH, INCLUDING (c), AND THE ANSWER CREATED A THIRD CLASS IN §4.** Pouya: *"Publish all six, including (c). (c) ships as drafted."* His reasoning on the expensive one, recorded on his instruction: *"it is the strongest available answer to the med-arb objection, and cheaper in practice than it sounds — the arbitral phase runs on the evidentiary record, not the caucus, so the case where a neutral genuinely cannot decide without confidential material is uncommon. `/med-arb/` was raising the hardest question about med-arb and answering it only at the level of process design."* **§4 now carries `Conduct undertakings` as a class distinct from both credentials and offerings** — his ruling: *"They are not facts about experience; they are commitments Pouya has now made... and they bind."* The gate for the class is one line: he must have said it in terms. The six strings are `CONDUCT_UNDERTAKINGS` in `src/data/site.ts` and the three pages render them, so **a later softening shows up as a diff on one constant** — his instruction that softening is a change to a published commitment, made mechanical rather than left as a note. (a)(b)(c) ship on `/med-arb/` in a new §What I undertake; (d) on `/mediation/` §Confidentiality; (e) and (f) on `/arbitration/`, each **replacing** the third-person sentence that already stated the same proposition as an observation. ⚠️ **The stamp reads 2026-08-29, not the 2026-08-27 he named** — the drafts did not exist on 2026-08-27 (Q54 was raised 2026-08-28), so that date would predate the text. **RATIFIED 2026-08-30: 2026-08-29 stands.** Pouya: *"You're right that a commitment cannot predate its own text. My 2026-08-27 was the date I ruled, not the date the undertakings existed."* | — |
| **Q38** | **A true vector master for the infinity mark.** The mark is a shaded ribbon — variable-width band, maroon flowing into champagne, twisting in three dimensions and passing over itself at the crossing. That is gradient-mesh artwork, and there is no honest way to express it as the flat vector paths `docs/02` assumes. An SVG **is** held — `src/assets/brand/sml-logo-source.svg` — and **it renders faithfully**: rasterised at 8333 px it reproduces the master exactly, at the same 1.566:1 `[verified 2026-08-26 — rendered and measured]`. *The characterisation has now moved twice and Pouya has settled it.* This row first called the file **"a raster in a vector wrapper"**; a later draft withdrew that as unfair. **The withdrawal went too far, and Pouya's ruling of 2026-08-27 restores the substance:** *"It renders faithfully because it IS the raster. Your first characterisation was accurate and the walk-back went too far."* Both things are true at once and the row must hold both — the file is a faithful rendering **and** it is faithful because seven base64 PNGs are carried inside it, which is why fidelity was never the question. **The Canva SVG does not close this question.** Pouya: *"Keep it committed, keep the AVIF render path. R13 stays open for a true vector master."* What rules it out is **payload and composition**: 257,278 bytes against **3,063 B** for the AVIF a Retina browser takes in the header — **84×** — plus **seven embedded base64 PNGs** and a 1,225-stop gradient mesh, so inlining it would breach `CLAUDE.md`'s rule against base64-inlining images. *Restated 2026-08-27, because the single number stopped covering the case:* build step 2 added a **232 px** call site (the home page's approach section, rendering at 225.5 px) beside the existing 64 px one, and at that size a DPR-2 device takes **14,555 B** and DPR-3 **22,639 B** — a ratio of ~11×, not 84×. `adversarial-reviewer` caught the three copies of the old figure going stale together, which is the SES-DKIM duplication in a new place. Both ladders are in `docs/reference/brand-assets.md`; **quote the size with the call site, never on its own.** Also worth knowing before someone reads it as a regression: the PNG fallback at 232 px runs **38,094 / 91,618 / 150,215 B**. Nothing that negotiates content types takes it — a DPR-3 device with neither AVIF nor WebP does not exist in practice — and the AVIF above is what real clients fetch. Accepted deliberately rather than capped, because capping it would blunt the mark on the high-DPI desktops that are the only place the 696 px variant is used at all. What is wanted is a master that is faithful **and** light. **Pouya is commissioning a proper vector master.** Until it lands, `InfinityMark.astro` renders an optimised raster and that is a **documented, temporary exception to `docs/02`'s inline-SVG rule** (R13 keeps it from becoming permanent). When the master arrives: replace the component's `<Picture>` with inline SVG, regenerate the favicons from it, and delete the exception from `docs/02` and this row. Raised by Claude Code 2026-08-26; scoped by Pouya the same day | Nothing — the mark renders correctly. This is fidelity and payload, not function |
| ~~Q32~~ | **ANSWERED 2026-08-26 — and the answer was that the reconstruction was WRONG.** Pouya rendered the committed path against the master (`SML Company Just Logo Transparent.png`, 3000×3000) and rejected it on three counts. Two reproduce from the path alone: **(a) TANGENT, NOT CROSSING** — all four cubic branches meet the origin at exactly 90°, so the loops are mutually tangent on a vertical line and at stroke-width 28 render as *two kissing circles*, the one thing an infinity mark must not be `[verified 2026-08-26 — tangent vectors computed per segment, independently reproduced]`. Both lobes are strictly confined to their own half-plane (x is monotone on every segment), so the signed crossing number is **0** — they cannot cross anywhere, not merely at the node. Worse at the size actually shipped: the two strokes stay fused into one mass wherever the centreline separation `y²/192` is under 28, i.e. across **61% of the mark's height** — at 2rem that is a 16.8px blob out of a 27.4px-tall mark. No stroke-width, viewBox or scale change can produce a crossing from this centreline; **(b) WRONG PROPORTION** — the master's ink bounding box is **2668 × 1704 = 1.5657:1** `[verified 2026-08-26 — measured]`, and **(c)** the master is a shaded ribbon where the trace was two flat uniform strokes. ***1.23:1 — RECONCILED, and it was a real measurement, not a slip.*** It is the bounding box of the path's **coordinates** rather than of the **curve**. The control points sit at y = ±160 while the curve only reaches ±120 — the standard 3/4 pull-in of a cubic — so a coordinate-hull box is 400 × 320 = 1.2500, and with stroke-width 28 applied on all four sides it is **428 × 348 = 1.2299**. Pouya's figure to four significant figures, from one method applied consistently `[verified 2026-08-26 — derived]`. **It is a trap rather than a slip:** because x is monotone on every segment, the control points give the *correct* width (±200) and a 33% inflated height, so the obvious sanity check — "does the width look right?" — passes. Any tool that reads a bbox from parsed coordinates lands here; `getBBox()` would have returned 400 × 240. **And the direction is inverted from how it read:** measured from the curve, the traced path is 6.4% *wider and flatter* than the master, not squatter. **Consequence worth keeping:** the declared viewBox 440:280 = 1.5714 is within **0.35%** of the master's 1.566, so re-tuning the layout to the true ratio was ~0.18px of work at the shipped 2rem — and **re-tuning to 1.23 would have actively broken it** — at any given width 1.2299 allocates 1.5657/1.2299 = **27% more height** than the mark occupies, so the header would have been rebuilt around a box a quarter too tall. The ratio was never sufficient grounds on its own; **(a) tangency is, and it is exact.** **The traced path is deleted, not kept as a fallback**, on Pouya's instruction: *a wrong mark that renders is worse than a missing one, because it stops looking wrong.* Now closed by Q38 for the vector master | — |
| ~~Q32-orig~~ | *(superseded — the original wording of this question is preserved in entry (v))* | `src/components/InfinityMark.astro` is built from geometry lifted verbatim from the deployed site's own loading-thumbnail SVG — the element it labels `smlMark`, fetched from `https://adr.smlcompany.ca/` on 2026-08-26. Path, both stroke widths (28 / 6) and the 0.7 inner opacity are the source's; the only change is folding a `translate(60 0)` into the coordinates. So it is SML's own artwork rather than a redrawing — but a loading placeholder is not necessarily the canonical file, and D7 says the mark carries over *unchanged*. If a master SVG or AI/EPS exists, supply it and the component gets replaced. Raised by Claude Code, 2026-08-26 | Nothing — the mark renders. This is about fidelity, not a blocker |
@@ -797,6 +888,7 @@ never being raised again.
| R15 | **Every page shares ONE Open Graph image — the portrait — and that is an interim for seventeen of the nineteen. RULED, DEFERRED, AND TRACKED HERE ON POUYA'S INSTRUCTION:** *"Record the trigger so it cannot quietly become permanent."* Q40, 2026-08-27. The portrait is the **decided** card for `/` and `/about/` — a face is the strongest social preview for a personal brand. It is the wrong card for the other seventeen, where a typed card carrying the page title does the work. **Removal trigger: build step 7**, where Insights needs per-article cards anyway — one generator (`satori` or `astro-og-canvas`, pinned against `npm view` that day per R11), one dependency, one review. Then delete the interim note from `docs/04` and the cutover line from `docs/06`. **Blocks cutover; does not block steps 36** | 2026-08-27 | Nobody on this project will ever see the defect. A link preview is rendered by LinkedIn, Slack and Teams for a reader who is not us, and `docs/04` requires a **unique** title and description per page — nineteen unique pages that all preview identically is the failure, and it is invisible from inside the repo. It costs nothing and works, which is exactly the R13 shape |
| R16 | **The one-page PDF bio does not exist, and it is deferred to build step 9 — not dropped. RULED AND TRACKED HERE ON POUYA'S INSTRUCTION:** *"Record the trigger so it doesn't become another quiet interim."* Q45, 2026-08-28. His reasoning: it is a **derived artefact**, so building it before `/about/` and `/fees/` are final means building it twice — and an appointment proposal needs the fee card as much as the bio. **Removal trigger: build step 9, alongside `/fees/`.** Two decisions travel with it and are **not** settled by the deferral: (a) generated at build (a dependency and an `npm audit` surface, against R11) or authored once as a designed artefact; (b) whether it carries anything the site does not — a matter list, a fee summary, referees — **each of which is a §4 question of its own**, and the matter list would collide with §4 Forbidden directly. Then delete `docs/01` §`/about/` item 7's pending note | 2026-08-28 | **It is the one artefact class this project's review apparatus cannot reach.** A web page is re-reviewed by every audit and re-checked by every build; a PDF circulated with an appointment proposal is read once, by the reader who matters most, and never seen by a reviewer again. `/about/` currently ships with no link to it, which is correct — a dead link on the page an appointing body reads is worse than the absence — and that means **nothing on the site will ever prompt anyone about this.** Only this row will |
| R17 | **THE DEPLOY KEY'S FIRST ROTATION IS DUE 2026-11-26, AND THAT DATE IS THE WHOLE ROW.** Access key for `adr-sml-deploy` created **2026-08-26**; D3 commits to **quarterly** rotation. Pouya's instruction when Q22 closed: *"Put the DATE in the R-series reminder, not the intention."* **Rotation procedure is in `docs/06-deployment.md` §Key rotation** — create the second key, update the Gitea secrets, verify a deploy, **then** delete the first; never delete before verifying, or the next push fails with no way to authenticate the fix. **Then set the next date here (2027-02-26) rather than deleting the row.** Also re-run **all nine** `simulate-principal-policy` checks after any policy edit (they are listed and reproducible in `docs/reference/deploy-credential-verification.md` §5) — the narrowness is the control (§10), and a widened policy is invisible from inside the repo. **The key is currently UNUSED — `AccessKeyLastUsed` returns `ServiceName`/`Region` = `N/A` and no `LastUsedDate`** — because deploys still run locally via `npm run deploy`; that does not pause the clock, and an unused long-lived key is exactly the one nobody remembers to rotate | 2026-08-28 | This is the reminder D3 has been waiting for a subject since 2026-08-26. §10 records the reason it matters more here than on a normal project: the secret lives on **jointly-administered** infrastructure, and the account also holds another business's client-database backups. A static key on shared infrastructure is only as safe as its age and its scope, and **nothing in the repo, the build, or AWS will prompt anyone on either.** §7 carries the inventory; this row carries the date |
| R18 | **THE SIX `docs/reference/` EXTRACTS BEHIND `/practice/*` ARE DATED 2026-08-29, AND SIX SHIPPED SENTENCES TURN ON FACTS THAT MOVE.** Build step 5 put statute, regulation, tribunal and bill status onto public pages — sourced, but **sourced as at one day**. The volatile ones, in order of how fast they move: **(a) federal Bill C-36** — `/practice/technology/` says it *"was introduced in June 2026 and was at second reading when this page was written"*; if it receives royal assent the page is wrong about the most load-bearing fact on it. **(b) the Ontario regulation under `Electricity Act` s. 28.1** — `/practice/energy/` says it *"had not been made as of August 2026"*. **(c) the ERO 026-0853 consultation**, comment period to **12 September 2026**. **(d) the Tribunals Ontario annual report** — `/practice/insurance/` publishes FY2024-25 figures and the extract records that a 2025-26 edition was never ruled out. **(e) the SABS**, amended with effect 1 July 2026. **(f) the ADRIC National Mediation Rules**, under review by ADRIC's own committee. **THE TRIGGER: re-check all six extracts before any cutover, and before any republish that turns on one of them — the same event trigger R10 uses.** Then re-stamp the extract. **A page that was true when it was written and is false when it is read is still a false page**, and this is the first change set on the project to put that class of fact into public copy at volume | 2026-08-29 | Six sentences, six files, one retrieval date. Nothing here fires on its own; a fact with a shelf life and no owner is exactly what §12 exists for |
| ~~R7~~ | **RATIFIED / SUPERSEDED 2026-08-26.** (a) Cache-policy table matching the pipeline — **accepted**; documenting what the pipeline does beats documenting an intention. (b) `s3:AbortMultipartUpload` omitted — **accepted, reasoning corrected**: the lifecycle rule does not exist and is therefore not the cover; the actual cover is that `aws s3 sync` only goes multipart above 8 MB and the largest asset is a 357 KB portrait. Recorded in `docs/06-deployment.md` with a revisit trigger. (c) The `aws s3 ls` pre-flight — **superseded** by the variable guard now running as the workflow's first step | 2026-08-26 | — |
| ~~R8~~ | **PROMOTED TO A RULE 2026-08-26.** A reminder was too weak for a pattern that survived three entries. *A sweep is a command, not a claim* now sits in `CLAUDE.md` under Conventions, in `/build` Phase 6, and in `/wrap` step 3: any claim that a change was applied across files must cite the command and be written only after reading its output | 2026-08-26 | — |
@@ -804,6 +896,822 @@ never being raised again.
# Change Log
## 2026-08-30 (ac) — Pouya ratifies build step 5; ADR Chambers struck from the page and from the spec; and the pattern behind three shipped defects gets a named lens in `claims-auditor`
**Type:** ruling + correction. **Files:** `src/pages/arbitration.astro`,
`docs/01-architecture.md`, `docs/reference/adric-rules.md`,
`.claude/agents/claims-auditor.md`, `AGENTS.md`.
### What Pouya ratified, so none of it is re-litigated
**Q54's stamp date — 2026-08-29 STANDS, and the question is closed.** His
words: *"You're right that a commitment cannot predate its own text. My
2026-08-27 was the date I ruled, not the date the undertakings existed."* The
ruling date and the stamp date are two different facts and the stamp records
the second. §4's stamp block and the §9 Q54 row both now carry the
ratification; the flag is discharged rather than deleted.
**The three sourced corrections — all ratified.** On the one that was his own:
*"'the 2026 privacy statute' in `docs/03` is mine and it was wrong. I took it
from the strategy brief's 'replacement privacy legislation in 2026' and never
checked whether it passed. Bill C-27 died without royal assent."* The LAT
ellipsis that deleted *"negotiation"*, and *"connection allocation"* — both
confirmed correct.
**`check:claims`, Q49, Q50, the §7 SES record, and R11's `typescript` hold —
ratified as shipped.** No change to any of them.
### ADR Chambers is struck — from `/arbitration/` AND from `docs/01` item 3
Pouya: *"Your instinct was right and my spec was the problem: the source shows
what the firm publishes, not that an outside neutral can be appointed under its
rules. Naming it implies a relationship that isn't established. ADRIC and ad hoc
are enough."*
This was the one review finding carried rather than fixed at step 5 — held
**because `docs/01` item 3 listed it**, which is exactly the wrong reason to
keep a claim, and the reason the spec was struck in the same ruling. **Both
halves had to go or the next build would reinstate it from the spec.**
- `src/pages/arbitration.astro` — the *"Or ADR Chambers"* paragraph and the
26-line comment whose entire subject was that paragraph. The replacement
comment records the strike and the reason, so nobody re-adds it.
- `docs/01-architecture.md` item 3 — now **"ADRIC, ad hoc"**, with the strike
and its date stated in the item itself.
- `docs/reference/adric-rules.md` — its exclusion note said *"`docs/01`
§`/arbitration/` names it as a rule option"*, which stopped being true the
moment the item changed. Corrected in the same pass rather than left to go
stale, which is the `docs/05` DKIM failure's shape.
- **§12 R18 loses limb (g)** — the ADR Chambers rules' amend-on-posting clause
was one of seven volatile shipped sentences and is no longer shipped. R18 now
reads **six**, in the header and in the trailing cell.
**The extract stays.** `docs/reference/adr-institution-names.md` is untouched:
it is a faithful record of what was retrieved, and R14's rule is that the
artefact is committed, not that every artefact must be cited by a page. What
changed is what the site asserts, not what was researched.
**`docs/07-fees.md` is NOT in scope and was not touched.** It cites ADR Chambers
for *published fee ranges* — internal benchmarking, a different claim, and not
public copy.
```
$ git grep -n -i 'ADR Chambers' -- src/ docs/01-architecture.md
docs/01-architecture.md:239: ⚠️ **ADR CHAMBERS WAS STRUCK FROM THIS ITEM AND FROM THE PAGE ON 2026-08-30
docs/01-architecture.md:244: rules, and the firm's own model clause reads *"at ADR Chambers"* — so naming
src/pages/arbitration.astro:209: ⚠️ ADR CHAMBERS IS NOT NAMED HERE, AND MUST NOT BE ADDED BACK.
src/pages/arbitration.astro:214: clause reads "at ADR Chambers". Naming it implies a relationship
```
**Four matches, and all four are the strike notices** — two in the `docs/01`
item, two inside an `.astro` comment that never renders. **This entry first
claimed `(no matches)`, written before the command was read**, which is the
exact failure `CLAUDE.md` names: *a sweep is a command, not a claim*. The
command was then run, the output read, and the claim replaced with it. The
sweep that actually settles the question is the one over shipped bytes:
```
$ grep -ril 'adr chambers' dist/ ; echo "exit=$?"
exit=1 # no matching file
```
### The pattern, named — and given to `claims-auditor` because it is not greppable
Pouya's instruction: *"NAME THE PATTERN, because it is now three-for-three: a
correct verbatim quote with an overreaching sentence beneath it. The quote
passes audit because it is accurate; the gloss fails because it says more than
the quotation establishes. Add it as an explicit lens to `claims-auditor`… It is
not greppable, so it needs a reviewer."*
`.claude/agents/claims-auditor.md` gains **§The second lens — does the gloss
stay inside the quote?**, placed before the existing catch-list and wired into
the Method as step 4. It states the distinction that makes it a second pass
rather than a bullet: **everything else in that brief audits claims about Pouya
against §4; this audits claims about the world against `docs/reference/`.** §4
holds no view on what the `Construction Act` says.
The four-step procedure is deliberately mechanical — read the quote, read the
sentence beneath, ask what a reader takes the second to mean, then ask whether
the first *establishes* it (not "is consistent with", not "is plausible
given"). It carries the four shapes it has actually taken here, each named so
the lens is not later trimmed as generic advice:
1. **A subject swapped between sentences** — the LAT gloss said *"mediation,
before filing and continuing after filing"*; the Tribunal's second sentence
was about **negotiation**. Shipped on three pages.
2. **A term the source never uses***"connection allocation"*; the IESO pages
contain zero occurrences of *"allocation"*. Shipped on three pages.
3. **A status assumed to have held***"the 2026 privacy statute"*; a forecast
in a brief read as an event. Caught before it shipped.
4. **A class asserted from one instance** — ADR Chambers' self-amendment clause,
quoted from the arbitration rules, written as *"amends them"* of all three
sets. `claims-auditor` caught that itself at step 5.
**It is four-for-four, not three-for-three.** The strike above is the same
defect one level up: the extract establishes that the firm *publishes* rules,
and the page read that as *an outside neutral can be appointed under them*. The
lens records it as (4)'s second half.
### Why this is its own entry and its own commit
The Q.Arb amendment Pouya issued in the same message is a separate change set
and is deliberately **not** in this one. Step 5 carries twenty review findings'
worth of fixes across thirty files and has to be reviewable on its own; mixing a
credential-wide sweep into it would make both unreadable in `git log`.
### Verification
Gates re-run after these edits, reading exit status, never truncated:
```
npm run check exit=0
npm run lint exit=0
npm run build exit=0
npm run check:claims exit=0
```
### Open after this entry
Unchanged from the previous entry except that **item 4 (ADR Chambers) is now
closed by ruling**, and the Q54 stamp-date item is closed by ratification. R1
(licensure framing) remains live and is unaffected by anything here.
---
## 2026-08-29 (ab) — `check:claims` makes §4 a build error; Q54 publishes six conduct undertakings and creates a third class in §4; build step 5 ships `/practice/` and the six area pages — and sourcing them found three wrong facts already on the site or in the specs
### The structural addition, and Pouya's reasoning is the whole design brief
He named the failure mode precisely, and it is mine:
> "Your recurring failure this project is a specific shape: you write a rule
> into a header comment, then breach it in the file below, in the same change
> set. Q53's sweep, Q54's gate four times, the D13 'cannot' phrasing fifty lines
> under your own warning about it. That is not a discipline problem — prose in a
> comment does not govern the writing that follows it. The pattern that actually
> worked was mechanical: deleting the `class` prop so passing one is a build
> error. Nobody has breached that since."
So `npm run check:claims``scripts/check-claims.mjs`, 10 patterns, greps `dist/`
after a build and exits non-zero. **Wired into `/build` Phase 5, both deploy
paths (`scripts/deploy-local.sh` after the build and before the first `s3 sync`;
`.gitea/workflows/deploy.yml` as a `Claim check` step before the AWS CLI is even
installed) and `CLAUDE.md`'s command list.**
**Seven patterns are his minimum list. Three are additions**, each named to an
incident in this record and each with near-zero false-positive surface on this
site's vocabulary — `S. M. Lawrence` / the template's company number; Q.Arb
described as held; and Q39's struck universal. Strike any of the three and the
rest stand.
**Every pattern carries an `incident` string that is PRINTED ON FAILURE** — his
instruction, *"so nobody deletes one for being noisy."* A pattern whose cost is
visible and whose reason is not is a pattern somebody deletes in week two.
### Four design decisions in that script, three of which came from measuring it
1. **`<style>` blocks are stripped before matching, and that is load-bearing.**
Measured against the step-4 build *before the file existed*: a
case-insensitive sweep for `leading` returned **26 hits, 25 of them
`var(--leading-body)`** inside Astro's inlined critical CSS. The 26th was
`Pleadings, disclosure,` on `/arbitration/` — **the exact false positive
`CLAUDE.md` already records.** Word boundaries kill the second (`\bleading\b`
does not match "pleadings"); only the strip kills the first. A check that
cries wolf on every page on its first run is a check nobody keeps.
**JSON-LD is deliberately NOT stripped** — proven by probe: an injected
`"award":"holds Q.Arb"` in `/about/`'s graph is caught.
2. **It self-tests before it sweeps.** Each pattern must match its own fixtures,
and no pattern may match 11 strings of real approved copy. **The self-test
failed on its first run** — and correctly: the CSS negative had been written
as a bare declaration rather than wrapped in `<style>`, so it was asserting
the wrong thing. A regex that has quietly stopped matching passes a clean
sweep forever and looks identical to a clean site, which is the exact shape
Q22 turned out to be.
3. **It refuses an empty or missing `dist/`.** *"An empty sweep reads exactly
like a clean one."*
4. **It refuses a STALE `dist/`** — if anything under `src/` or `public/` is
newer than the newest built page it exits 2 and names both files. A pass
against yesterday's build is the same false negative in slower motion.
All four guards were **run, not asserted**: the injected-breach probe caught 7
matches across 4 patterns including the JSON-LD one; the empty, missing and stale
guards each returned exit 2.
`eslint.config.js` gains a scoped `no-console: off` for `scripts/**` — printing
is what a CLI check is for. **It was placed above the block it overrides and had
no effect at all**; flat config applies matching blocks in order, last one wins.
Caught by re-running lint rather than by reading the config.
### Q54 — ANSWERED. All six publish, and the answer created a third class in §4
Pouya: *"Publish all six, including (c). (c) ships as drafted."* His reasoning on
the expensive one is recorded on the §4 row and in `CONDUCT_UNDERTAKINGS`,
because it is the part a later reader would otherwise have to reconstruct: the
arbitral phase runs on the evidentiary record, not the caucus, so the case where
a neutral genuinely cannot decide without confidential material is uncommon.
**§4 now carries `Conduct undertakings` as a class distinct from credentials and
offerings** — his framing: *"They are not facts about experience; they are
commitments Pouya has now made… and they bind."* The gate is one line: **he must
have said it in terms.** The three offering gates do not apply and do not
substitute; this is the class where the register holds no view and the architect
holds all of it.
**The six strings live in `CONDUCT_UNDERTAKINGS` (`src/data/site.ts`) and the
three pages render them.** That is his instruction made mechanical: *"any later
softening is a change to a published commitment, not a copy edit."* The
characteristic failure of this class is silent — nothing in a build fails when a
promise gets smaller, and the diff reads like tightening. One constant means one
diff.
(a)(b)(c) ship on `/med-arb/` in a new **What I undertake** section. (d) ships on
`/mediation/` §Confidentiality. **(e) and (f) REPLACE rather than join** the
third-person sentences already on `/arbitration/` — the page already ended a
paragraph *"What does not is a process whose shape nobody agreed to in advance"*
and opened another *"The date an award is due belongs in the first procedural
order"*, which are the observation forms of the same two commitments. Keeping
both would have set each undertaking beside its own paraphrase.
⚠️ **THE STAMP READS 2026-08-29, NOT THE 2026-08-27 HE NAMED, AND THIS IS NOT
THE SAME CALL AS THE MEMBERSHIPS ROW.** The drafts did not exist on 2026-08-27:
Q54 was raised on 2026-08-28 and (d) and (e) shipped for one pass that same day
before `claims-auditor` removed them. A commitment dated 2026-08-27 would
predate the text of the commitment. Flagged in §4; one line changes it if he
meant the stamp to record a decision reached earlier of which these six are the
wording.
New component `Undertaking.astro` gives the class one visual treatment across
three pages — because set as body prose a reader cannot tell *"the agreement
should settle the switch"* from *"I will not take the appointment unless it
does"*, and the second is the half a party weighs.
### Q49 and Q50 — both ratified, and Q50 records a reversal of his own ruling
**Q49 CONFIRMED as read.** One row, "Mediator"; `worksFor` stays out. The
register had flagged the decline as *a reading rather than a ruling*, because
Q49 asked for two rows and one was granted. The reading is now the ruling, and
`worksFor` is settled out of the graph rather than withheld pending anything.
**Q50 — the deviation is RATIFIED AS THE DECISION.** His words: *"My ruling was
wrong: on LocalBusiness, `name` means the business's name, and name + service
list + city is the name-stuffing pattern that gets rich results discarded — on
the one project whose premise is crawlability… Your reading beat mine; record it
as the decision, not as a deviation."* `schema.ts` and `docs/04` updated so
neither reads as pending. **The half that is mitigated rather than answered is
unchanged and still stated**: `slogan` still carries an unscoped "Arbitration".
### §7 — the `us-east-1` SES identity is being deleted, and the reason generalises
Pouya, on the `AWS_SES_DKIM_PENDING_TO_FAILED` health event of 2026-08-29 — the
expected outcome of DKIM CNAMEs that never resolved: **that is its third
false-alarm signal**, after the pending console dashboard and the near-miss on
requesting production access in the wrong region. His reason, recorded because it
is a monitoring principle rather than a cleanup note: *"A monitoring surface that
reports a failure you do not have trains you to discount the ones you do."*
`ca-central-1` re-verified by DNS the same day — all three live DKIM records
NOERROR, SPF and DMARC present — which is what makes "no impact" a result rather
than an assumption. Deletion removes the identity, not the records.
### R11 at the step 4 → 5 phase boundary — one pin is a major behind, deliberately
`npm view` run across all fourteen pins. Thirteen are current. **`typescript` is
pinned `^6.0.3` and latest is `7.0.2`** — one major behind, which is the exact
shape D1 was amended over, so the reason is recorded in §7 rather than left
silent: `@astrojs/check@0.9.10` declares `peerDependencies: { typescript:
'^5.0.0 || ^6.0.0' }`, and `astro check` is the type gate both deploy paths run.
**Removal trigger: `@astrojs/check` widens the range.** A hold on a dependency's
schedule, not on a judgement.
### Build step 5 — `/practice/` and the six area pages
Seven pages, 6881,129 words each, zero JavaScript, one `<h1>` each, no skipped
heading levels. `/practice/<area>/` is **one route over a data file**, declared
`satisfies Record<PracticeSlug, PracticePage>` — so an area in the nav with no
page, or a page with no area, does not compile. `docs/01` calls the namespace
stable; that is what keeps it one.
**First `BreadcrumbList` on the site**, with a new `Breadcrumbs.astro`. docs/04
requires the markup to match the visible trail, so **one array feeds both** and
the match was verified by parsing the built HTML against the built JSON-LD on all
six pages, not by reading the source.
The `/practice/` **"also offered" strip ships** — ENE, dispute-system design,
pre-dispute technical advisory (Q46(a)). Both framing constraints are honoured:
ENE is described as an assessment delivered to **both parties together** and
never as advice to one, and the **conflict caution on pre-dispute advisory has
its own paragraph** rather than a clause inside a grid cell, because a caution a
reader has to find is a caution that was not given. Settlement counsel is not
there and is not coming back. Nothing on the page describes gate 1 as settled
law.
`NEUTRAL_ROLE_LINE` is extracted to `site.ts` — docs/03 predicted `/practice/`
would be the second place that sentence was needed and was right; a hand-typed
second copy of the sentence that took three attempts and two audits is the
highest-consequence drift available.
### Sourcing the six pages found three facts that were already wrong
A twelve-agent fan-out fetched primary sources for every external fact these
pages would state, with an adversarial pass over each extract asking only whether
the pasted quotations actually support the claims drawn from them. Six extracts
are committed to `docs/reference/` (R14), each carrying its sources, its verbatim
quotations, **what it does not establish**, and the overreach the adversarial
pass found in it. **Three of the findings were about material this repository
already held.**
**1. The LAT mediation gloss — WRONG, and it was on three shipped pages.**
`docs/reference/lat-case-conference.md` quotes the Tribunal's passage **verbatim
and correctly**. The sentence *underneath* the quote read: *"The Tribunal itself
points parties at private mediation, before filing and continuing after
filing."* Read the passage again: sentence 1 names **mediation**, for one moment
only — *"Before you apply."* Sentence 2 is about **negotiation** — *"Parties are
encouraged to attempt to **negotiate** the claim at all times, including before
filing… and continuing **negotiation** discussions after a claim has been
filed."* The word appears twice. The gloss carried the after-filing frame across
onto mediation, and added the word "private", which is not the Tribunal's.
`docs/01` then quoted the passage **with an ellipsis that deleted the second
"negotiation"** — the word that scopes the clause — which made the quotation
appear to support the gloss. And the published blurb, *"private mediation
alongside a LAT application, **before filing or after**"*, rested entirely on the
elided half. It shipped on `/`, `/mediation/` and would have shipped on
`/practice/`.
**The defect was in a gloss beneath a correctly-quoted source**, which is why two
review rounds and a claims audit read that file and passed it: the quote was
right there and appeared to say it. Caught by an independent re-fetch that read
the sentence structure. **Same shape as Q39's struck universal** — the source was
fine and the sentence drawn from it was wider than the source.
Corrected in the extract (correction box), `docs/01`, `src/data/site.ts` and §9
Q41(c). Now published: *"private mediation retained by the parties, not the
Tribunal's case conference"* — the distinction `docs/01` actually requires, and
fully supported. `/practice/insurance/` quotes the Tribunal's real sentence and
says in terms that it is quoted no wider than it goes.
**2. "Connection allocation" is not an Ontario term — also on three shipped
pages.** `docs/01` §`/practice/energy/` and `site.ts`'s energy blurb both used
it. The IESO's connection-process pages contain **zero** occurrences of
"allocation" of any kind. The real terms are *connection assessment and approval
(CAA)*, *System Impact Assessment (SIA)* and *Customer Impact Assessment (CIA)*
and **Ontario has no interconnection queue**; the IESO says so in terms and works
from "committed projects". The genuinely adjacent term, the OEB's *Capacity
Allocation Model*, is about housing-development connections and is a different
thing. Same failure as "Model Mediation Rules": an institution's own vocabulary,
written from recall.
**3. "The 2026 privacy statute" does not exist.** `docs/03` §Practice areas
listed it among the market context for `/practice/technology/`. **Nothing
enacted federally or in Ontario in 2025 or 2026 is a privacy statute.** Bill C-27
— the Consumer Privacy Protection Act and the Artificial Intelligence and Data
Act — **died without royal assent** and was never reinstated. PIPEDA remains the
operative federal statute and **Canada has no federal AI statute.** Struck from
`docs/03` rather than corrected in place, so the phrase is not re-invented.
**Caught before a word of it reached a page**, and only because the phrase was
checked rather than trusted.
**4. "Prescribed training" is the wrong word for the family-arbitration hours** —
record only, gates nothing. **No hour figure appears anywhere in O. Reg. 134/07,
in any version.** Section 3 requires *"the training approved by the Attorney
General"* as set out on a Government of Ontario website: the **requirement** is
prescribed, the **content** is delegated to a web page. Corrected in §4 where the
reasoning is relied on, and **deliberately left standing as shorthand in four
other files** — rewriting them to sharpen a phrase that gates nothing is the
record-about-the-record work D19 exists to stop.
**And one thing the sourcing unblocked:** ADR Chambers is now **named on
`/arbitration/`**. `docs/01` item 3 listed it and the page omitted it because
nothing sourced what rules it publishes. It does now — ADR Chambers Arbitration
Rules, Mediation Rules and Expedited Arbitration Rules, under those exact titles.
**No edition date is published for them, deliberately**: the rules provide that
ADR Chambers may amend them in its sole discretion effective on posting, so a
date on the page would go stale without notice, which is a worse claim than none.
### Defects I found in my own step-5 work before the reviewers reported
1. **Two adjacent sections on the same ground, on all six area pages** — the
dispute-types section is fixed `alt` and every page's first declared section
was also `alt`, so each rendered as one doubled tinted block with a heading
floating in it. **`/med-arb/` had the cream-on-cream form of the same defect,
introduced by this session's own new section.** Found by extracting the
section classes from the built HTML, not by reading the source.
**Fixed, and then made a build error**: `[slug].astro` now throws on any two
adjacent grounds, checking the declared array against the fixed section at
each end. Proven by sabotaging one value and reading the failure. This is the
same lesson as `check:claims` — I had written a comment arguing that declaring
grounds explicitly was safer than computing them, and then got the
declarations wrong on six pages in the same file.
2. **"Two Ontario government consultations… were open"** — ERO 025-1001's comment
period **closed 4 November 2025**; only 026-0853 was open. The extract's own
`established` line said "two live consultations" while the notice data quoted
three sections above it read **"Closed"**. I copied the extract's overreach.
Corrected on the page and in the extract.
3. **The MIG contrast** — I wrote that the monetary limit *"sits in section 18 of
the Schedule itself rather than in the Guideline."* The extract's own
adversarial pass had flagged exactly that phrase: the Guideline's text was
never retrieved, so the negative half is unsupported. Rewritten to the
positive form.
4. **"Underserved by senior neutrals"** (insurance lede) — an unverifiable
comparative claim about other practitioners. Q41(b) is directly on point:
*"assert his capability, not the field's incapability."* Removed.
5. **"Most of which resolve"** (insurance context) — a settlement-rate
characterisation, which §4 Forbidden bars outright and which the extract
expressly warned against drawing from the combined settled/withdrawn row.
Removed.
6. **"The second half is the one that is rare"** (construction) and **"a material
share of technology disputes"** (technology) — a comparative about the field
and an unsourced quantified claim. Both rewritten. **"The only answer"** on
`/med-arb/` softened for the same reason.
7. **Statute stated wider than the statute.** Three, all caught by re-reading
the shipped text against the committed extract rather than against my memory
of writing it:
**(a)** `/practice/energy/` said leave to construct bites on a line *"over a
prescribed length"*. **There is no length in s. 92(1)** — the 2 km threshold
and the outright distribution carve-out are exemptions in O. Reg. 161/99.
**(b)** `/practice/shareholder/` said an OBCA s. 108(6)(b) clause means the
matter *"goes to arbitration"* and *"the forum is already chosen"*. The
provision is permissive twice over — an agreement **may provide** that a
matter **may be referred** — and the second clause was a legal conclusion
applied to the reader's own file, three lines above a note saying the page
does not do that.
**(c)** *"Both statutes also provide for winding up"* — the CBCA's s. 214 is
liquidation and dissolution. Reworded to cover both.
8. **"No Canadian statute requires data to be stored in Canada"** — a class
statement wider than the check behind it. The extract's own *"does NOT
establish"* section records that **BC's FIPPA and Nova Scotia's PIIDPA
public-sector residency provisions were not checked.** Scoped to "no federal
or Ontario statute", which is what was read. **This is Q39's shape exactly**,
in a change set whose own copy warns about it.
9. **Three smaller ones.** *"I build and operate these systems, and I have done
while running this practice"* — a concurrency claim §4 does not row and that
`/about/` had already removed once. *"Three engagements that are not
appointments"* — loose for ENE, which is delivered to the parties as a
neutral. And a consultation described in the past tense while it was still
open, rewritten to a date that stays true.
### The code review — 5 findings, two blocking, and the first one is mine
**BLOCKING 1 — `npm run check` was FAILING, and I reported it as passing four
times.** `astro check` exited **1 with 10 `ts(2339)`/`ts(7053)` errors** in
`[slug].astro`. Both deploy paths run `npm run check` before the build, so
nothing could have shipped.
**How I missed it is the finding, and it is a new `CLAUDE.md` convention.** I ran
`npm run check 2>&1 | tail -3`. The verdict prints as `- N errors`, `- N
warnings`, `- N hints`, followed by a blank line — so `tail -3` returns
**warnings, hints and the blank line, and drops the errors line.** Four runs,
four "0 warnings / 0 hints", zero sight of the number that mattered. **The
truncation only ever hides bad news, because the error line comes first.** This
is the stderr rule's twin — `2>/dev/null` turns "it failed" into "it found
nothing"; `| tail -3` turns "10 errors" into a clean bill — and it is easier to
commit, because the command really did run. **The fix is not a bigger `tail`: it
is reading the exit status**, which is the one signal a pipe cannot reshape.
Written into `CLAUDE.md` under Conventions.
**The cause was `as const satisfies Record<...>`.** `as const` fixes the declared
type as the literal object and `satisfies` does not widen it, so `page.sections`
became a heterogeneous tuple whose members genuinely lack the optional keys they
omit — `ground`, `lede`, `note`, `lead` all errors on the members that omit them.
`astro build` does not typecheck, **so `dist/` was green while the gate was
red.** Fixed by annotating instead, and the completeness guarantee was
re-verified by probe rather than assumed: renaming `energy` to `energyy` still
fails with `ts(2561) 'energyy' does not exist in type Record<...>`.
**BLOCKING 2 — the "also offered" labels rendered at 3.07:1.** `/practice/` is
the first page on the site to put `DefinitionGrid` on an inverse ground, and its
`<dt>` takes `--text-meta`, which is `--muted` — the token `tokens.css` marks
**"ON CREAM ONLY (3.07:1 on ink)"** and which `SiteFooter.astro` already records
the same prohibition for. Measured three independent ways by the reviewer (token
arithmetic, `getComputedStyle` against the served build, and a screenshot), all
agreeing; I reproduced 3.07:1 from the tokens myself before fixing. **The rule
was written down in two places and this change set breached it anyway** — which
is precisely Pouya's point about prose in comments. Fixed through the custom
property route the project already uses for `Pill`: `--def-name-fg`, set beside
`--pill-fg` in `global.css` and in the forced-colors block. **11.09:1 now, and
verified in the shipped bytes** rather than the source.
**SHOULD-FIX — `var(--text-primary)` does not exist.** I invented a token name in
`Breadcrumbs.astro`. An undefined custom property makes the declaration invalid
at computed-value time, so the current-page crumb and the link hover both fell
back to inherit and rendered identically — the trail's current item visually
indistinguishable from its links. The silent-no-op form of the tokens-only rule,
and the same family as the parent-scope trap: a rule that looks right in source
and never matches. `--text` is the token.
**SHOULD-FIX — six titles had dropped the practitioner's name.** `docs/04`'s
pattern is `"<Page> · Pouya Lajevardi"` with exactly one named exception
(articles, for a stated length reason). All six area titles omitted it, and the
string propagates to `og:title` and `twitter:title` — **six of twelve social
previews carrying no name, on a site whose entire strategy is a practitioner
brand.** Appending the suffix overruns the 60-char ceiling, so all six were
rewritten; every one now falls in 5257.
**SHOULD-FIX — comments longer than the code they explain (D19).** Counted, not
estimated: `Undertaking.astro` at 35 comment lines to 20 of code; two 2324 line
JSDoc blocks on 6-line functions in `schema.ts`; ~43 lines of comment on two
two-line strings in `site.ts`. Accepted and trimmed — **the constraints stay,
the revision narratives go to this entry, which is where a reader looks for how
something got here.** What was explicitly kept: the `serviceType` union
rationale, the `memberOf` opt-in warning, and `Undertaking`'s note that deleting
the `Props` interface re-disables call-site type checking — the reviewer probed
that last one (`<Undertaking bogusProp={1}>` does error) rather than taking the
comment's word for it.
**Nothing was declined in either round-1 report.** All eleven findings were real.
### What the code review found CLEAN, stated so the gaps are auditable
Zero `client:*` directives and zero JS in `dist/` (the only `<script>` tags are
twelve `application/ld+json`); unique title, 149160 char description, canonical,
full OG/Twitter set and `robots index,follow` on all seven new pages; sitemap
carries all twelve URLs; JSON-LD parses everywhere; `BreadcrumbList` 1-based and
matching the visible trail name-for-name and URL-for-URL; one `<h1>` per page and
no skipped levels; breadcrumb and onward links measured ≥44px at 390 and 1280;
no base64-inlined images; pages 2326 KB, CSS 24.8 KB total. **Overflow
re-measured at 320/360/390 with root font 16 and 32 — 0/0/0 and 63/23/0,
byte-identical to `docs/02`'s recorded site-wide floor, so no regression;** the
overflowing elements are the pre-existing header and footer brand.
### The claims audit — 6 findings, all accepted, and it caught a hole in `check:claims` itself
**It also independently found five of the defects listed above** — the LAT
"underserved", the resolution-rate inference, the MIG contrast, the s. 92
"prescribed length" and the s. 108(6) "the forum is already chosen" — verified
each against the live tree, found them already gone, and **reported only what
still shipped.** That is the right behaviour and it is worth recording: the diff
it was handed had gone stale under it, and it said so rather than reporting
fixed defects as live ones.
1. **BLOCKING — `/practice/energy/` asserted a connection queue on a card while
denying one 600 words below.** The dispute-type card read *"The connection
queue behind a data centre or other large load"*; the same page states *"the
IESO … does not use an interconnection queue."* **The word was corrected out
of `site.ts` and `docs/01` in this same change set and survived one card
over** — the incomplete-sweep shape this record has now paid for four times.
Fixed: "the connection assessment behind a data centre or other large load".
2. **BLOCKING — `/practice/cross-cultural/` shipped the election phrasing D13
bars.** *"What I do not do is advise on the law of another country."* Attempt
1 of docs/03's worked example, **narrowed by jurisdiction, which makes it
worse**: naming only foreign law invites the reader to supply the domestic
half. Already fixed on a self-audit minutes before the report landed; the
auditor found it independently.
**AND IT NAMED A HOLE IN `check:claims`, WHICH IS THE MORE VALUABLE HALF:**
the capacity pattern required the literal object *"legal advice"*, so
*"advise on the law of another country"* passed the mechanical gate. **The
pattern is widened** — a first-person negation within 25 characters of
give / provide / offer / advise / render — and the real sentence is now a
fixture. **The six approved first-person negations this site ships are all in
`mustNotMatch`**, including undertaking (c)'s *"If I cannot decide a remaining
issue…"*, which is the nearest miss. Proven by re-injecting the actual
sentence into a built page: it is caught.
3. **SHOULD-FIX — "I work with diaspora business communities."** §4 rows
*"cross-cultural fluency with diaspora business communities"*, not a client
relationship. **`/about/` had already solved this exact row** with wording
chosen to carry no quantity and no comparative, and the new page had reverted
past it. Fixed to `/about/`'s formulation.
4. **SHOULD-FIX — ADR Chambers: a class asserted from one instance.** The page
said the firm *"amends them"* — all three rule sets — at its discretion on
posting. The extract establishes the self-amendment clause for the
**arbitration rules only**; it carries a different provision for the mediation
rules and quotes nothing from the expedited rules on amendment. Scoped.
Naming ADR Chambers at all was unblocked by this session's sourcing, and the
first thing that happened was an overreach about it.
5. **CONSIDER, accepted — "what happens to a business while its owners
litigate"** offered as familiar from a row that verifies operating a company.
Knowledge of a shareholder dispute is not knowledge of running a company, and
§4 rows only the second. Replaced with an operating fact.
6. **CONSIDER, accepted — "These are commercial mediations and arbitrations,
conducted from Toronto"** reads as a body of arbitrations already conducted.
§4 records **no completed arbitration** — the row that made `claims-auditor`
strike *"Mediator and Commercial Arbitrator"* from the Person node on
2026-08-27. Reframed forward: "These run as…".
**Nothing was declined.** All six were real.
### Round 2 — 9 findings, all accepted, and four are defects the FIXES introduced
**Round 2's job is the repairs, and it earned itself.** Four of the nine did not
exist before round 1's fixes were written.
**Both reviewers found the same defect independently, and it is the one that
mattered:** `/practice/insurance/`'s JSON-LD offered **`serviceType:
['Mediation','Commercial arbitration']`** on a page whose `<h1>` reads *"Private
mediation, not the Tribunal's case conference"*, whose body recites Insurance Act
s. 280 exclusive jurisdiction, and in whose visible copy the word *arbitration*
appears only in the site header, the footer and the shared onward strip.
`practiceAreaGraph` hard-coded both processes for all six areas. **docs/04's own
principle is that structured data represents the page it sits on** — the reason
`/`'s Person node omits `memberOf` — and this is the same failure family as the
Person `description` carrying *"Mediator and Commercial Arbitrator"*, struck
2026-08-27. There is a second edge: §4 scopes every arbitration row to
**commercial**, and a SABS entitlement dispute is statutory. **Fixed per area:**
`serviceType` and a `serviceLabel` now come from the page data, the union still
constrains every member, and `/practice/insurance/` emits `serviceType:
"Mediation"` and `name: "Mediation — Insurance, SABS & LAT"`.
**Introduced by a fix — 1.** *"The Tribunal's own materials point parties toward
**it**"*, where the antecedent is *private mediation*. The extract corrected
earlier the same day says in terms: **"the word 'private' is not the Tribunal's
either — the sentence names no provider."** The note under that section closed
the *temporal* half of the old gloss and left the *provider* half open. **The
residue of the very gloss this change set corrected, re-entering through copy
written in the same change set.** Now: *"point parties toward mediation"*.
**Introduced by a fix — 2.** `[slug].astro`'s header still said `PRACTICE_PAGES`
is declared **`satisfies Record<…>`** — the exact construct round 1 removed for
producing the 10 errors. Two records in the same change set disagreeing about the
same declaration, and the one a reader hits first was the wrong one. The
reviewer re-proved the guarantee itself with an isolated `tsc --strict` probe
before reporting only the mechanism as false.
**Introduced by a fix — 3.** `/med-arb/` stated undertaking (a) **three times in
250 words**: the FAQ answer's tail, the `<h3>`, and the undertaking. Measured —
*"on the day because the room has run out of road"* occurred twice, 241 words
apart. **The replace-don't-duplicate judgement was applied on `/arbitration/` and
not one file over**, which is this project's signature failure. The FAQ tail is
trimmed and the `<h3>` reframed to *"Agreed first, or not at all."*; the
undertaking is untouched, because softening it is a change to a published
commitment.
**Introduced by a fix — 4.** The round-1 fix added a **15-line comment narrating
its own revision history** to explain a one-line type annotation. A direct D19
breach, inside the fix for a D19 finding. Cut to four lines: the constraint, and
a pointer to this entry.
**`check:claims` had a second hole, of the shape round 1 found the first.**
`\bmy clients\b` does not match **"my client"**, and `/med-arb/` was shipping
*"The neutral who heard my client in caucus"* in its FAQ and in the `FAQPage`
node. The possessive belonged to the counsel voicing the objection rather than to
Pouya — **which is exactly why it needed a decision rather than a silent gap.**
The copy now reads *"our client"*, the pattern is `\bmy clients?\b`, and both
edges are fixtures. **And the widened capacity pattern was narrowed in the same
pass:** it carried `offer`, which fires on *"I do not offer family arbitration"*
— an offering statement, not a capacity claim. The second alternative is now
`advise|advising` only; `give`/`provide`/`offer` are covered by the first, which
requires the literal object.
**Two more accepted.** *"Interconnection study"* is not a document any Ontario
body publishes — the IESO's is the **system impact assessment**, and the IESO
rejects the adjacent import *interconnection queue* in terms. **This is the
"connection allocation" defect again**, missed because the sweep that morning
looked for that phrase and not this one; swept from `/practice/`, `/mediation/`
(pre-existing from step 4) and the page data, and the two surviving matches in
`dist/` were read: OEB Act s. 92(1)'s *"or make an interconnection"* and the
IESO's own denial. And `/mediation/` §Confidentiality had been left setting an
**opt-out** caucus default one paragraph above an **opt-in** undertaking; the
framing paragraph moved, the undertaking did not.
**One CONSIDER accepted on 40% stated confidence** — `/practice/shareholder/`'s
*"the operating half of a shareholder dispute is familiar rather than abstract"*
attached shareholder-dispute events to him from a row that verifies operating a
company. Now *"the operating consequences … are legible rather than abstract"*.
**One CONSIDER carried, not fixed, and recorded as a judgement:** *"Or ADR
Chambers"* on `/arbitration/`. The reviewer's point is that the new source
establishes the rule sets' **names** — which is what the R14 hold was about — but
not that this practice can run an arbitration under them, and ADR Chambers' own
model clause reads *"at ADR Chambers"*. **Held because `docs/01` item 3 lists ADR
Chambers as one of this page's three rule options on the architect's own outline,
and the sentence asserts only what the firm publishes plus generic contract
advice.** If Pouya reads the placement as implying availability, one clause
reframes it as a rule set a contract may name. Flagged to him rather than
decided here.
**THE LOOP STOPS AT TWO ROUNDS — D19, and the reasoning is stated so a later
reader does not read the cap as laxness.** Round 1 reviews the change; round 2
reviews the fixes. Four of round 2's nine were defects in round 1's fixes, which
is exactly why round 2 exists — and it is also why round 3 does not: past two,
the manufacture rate exceeds the value of the marginal finding. Pouya's ruling,
2026-08-28, on 48 findings across two rounds.
### Verified — run, and the exit status read this time
```
npm run check exit=0 - 0 errors, 0 warnings, 0 hints (32 files)
npm run lint exit=0 eslint + prettier
npm run build exit=0 0 [ERROR] lines, 12 pages
npm run check:claims exit=0 10 patterns, self-test green, 12 pages
grep -rE 'animation:[^;}]*(scroll\(\)|view\(\))' dist exit=1 (no hits — clean)
```
Measured rather than asserted, each against the built output:
- **Zero JavaScript.** The only `<script>` tags in `dist/` are twelve
`application/ld+json`. The pages render their full content with JS disabled
because there is none to disable.
- **Metadata on all twelve pages** — unique `<title>`, one meta description,
one canonical, seven `og:*`, four `twitter:*`, one JSON-LD block each.
- **JSON-LD parses on every page**, and the node sets are what `docs/04`
specifies: `Person` on `/about/` and `/practice/`; `Service` + `Person` on the
three process pages; `+ FAQPage` on `/med-arb/`; `+ BreadcrumbList` on the six
area pages.
- **Breadcrumbs match**, verified by parsing the built HTML against the built
JSON-LD on all six pages — name-for-name and URL-for-URL, 1-based.
- **Heading structure** — one `<h1>` per page, no skipped levels, on all twelve.
- **No two adjacent sections share a ground** on any of the twelve, checked by
extracting the section classes from `dist/`.
- **The six undertakings are byte-identical** in `CONDUCT_UNDERTAKINGS`, in §4's
rows, and in the shipped HTML, each on exactly one page.
*(The first run of that check reported four as unshipped. It was the harness:
three files all named `index.html` keyed into one dict entry. Instrument, not
defect — re-run keyed by full path.)*
- **Sitemap** carries all twelve URLs.
**NOT RUN, stated rather than omitted:** Lighthouse. `@lhci/cli` was removed
2026-08-26 and is not re-added until build step 7 (R11, §7). The budget stands;
the instrument is absent. No manual DevTools run was substituted for it.
**Internal links that do not resolve yet, and they are the build order, not
defects:** `/contact/` (49 refs), `/fees/` (28), `/process/` (14),
`/for-parties/` (12), `/insights/` (12), `/legal/privacy/` (12),
`/legal/terms/` (12). All are steps 610. The state is unchanged from step 4
except in volume.
### Sweeps — the commands and their output (R8)
Every remaining match below was read with context. **All of them are
prohibitions naming the struck form** — a comment or spec note saying *never
write this* — and `dist/` is clean of all of them, which is what governs.
```
$ git grep -n 'before filing or after' -- src docs/0*.md
docs/01-architecture.md:452:> restore the "before filing or after" form** — it rested on the elided half.
src/data/site.ts:619: * application, **before filing or after**", and the comment here justified
$ git grep -ni 'connection allocation\|grid connection and allocation' -- src docs/01 docs/03
docs/01-architecture.md:387:> ⚠️ **"CONNECTION ALLOCATION" WAS THIS SECTION'S WORDING AND IT IS NOT AN
src/data/site.ts:567: * ⚠️ "CONNECTION ALLOCATION" IS NOT AN ONTARIO TERM, AND THIS BLURB USED IT.
$ git grep -n '2026 privacy statute' -- src docs
docs/03-content-spec.md:299:~~the 2026 privacy statute~~, LAT volumes.
$ grep -rn 'Model Mediation Rules' dist --include='*.html'
(no matches in dist)
$ git grep -ni 'anyone may be appointed an arbitrator\|nothing in law gates' -- src
src/pages/arbitration.astro:19: * Q39's struck universal — "anyone may be appointed an arbitrator in Ontario;
```
### Two non-gating notes, recorded rather than numbered (D19)
1. **Two table rows render with the wrong column count**, because they contain
unescaped `|` inside inline code and GFM splits on it even there — §7's
`Node` row and §9's `~~Q32-orig~~`. Both predate this change set; the §7 row
this session added had the same defect and its pipes are escaped (`\|`).
Checked by counting unescaped pipes per row against each table's header
across all 17 table blocks — and the first run of that check produced a
**false positive on the row it had just fixed**, because a naive count
counts escaped pipes too. Gates nothing, so it is here and not in §9.
2. **`docs/reference/` is in `.prettierignore` as a "frozen historical
record", and three extracts in it were CORRECTED this session** — the LAT
gloss, the energy "two live consultations" line, and the family-arbitration
hours framing. **No verbatim quotation was touched; only the analysis
beneath one.** The `.prettierignore` note is about *reformatting*, which
would obscure what a file originally said, and correcting a wrong gloss is
the opposite of that. Recorded so a later reader does not read the
corrections as a breach of the convention — and so the pattern is visible:
on all three, the quote was right and the sentence under it was wider.
### Open after this entry
**The Q-series is down to three, and none of them blocks step 6.**
- **Q23** — is a Gitea `act_runner` registered and are Actions enabled? Depends
on a second administrator, not on a fact to look up. Deploys run locally.
- **Q34** — the contested measurements of the site being replaced. Nothing in
public copy cites one.
- **Q38** — a true vector master for the infinity mark. R13 carries the trigger.
**No new numbered question was opened by this change set**, deliberately and per
D19: everything found here either blocked a page and was fixed, or gates nothing
and is a note in this entry. The one thing that needed an owner rather than a
fix became **§12 R18** — the six `docs/reference/` extracts are dated
2026-08-29 and seven shipped sentences turn on facts that move, Bill C-36 first
among them. It fires on the same event trigger R10 uses: before any cutover, and
before any republish that turns on one of them.
**For Pouya, three things that are his and not mine:**
1. **The Q54 stamp date.** §4 reads `[verified 2026-08-29]`, not the 2026-08-27
he named, because the drafts did not exist on the 27th. One line changes it.
2. **R1, surfaced again**, and step 5 gives it a third shape: six pages now
describe what he does in a subject matter, and `/practice/insurance/` and
`/practice/construction/` sit closest to the litigation-exposure wording.
Nothing here asks to change D13.
3. **The three additions to `check:claims` beyond his minimum list** — the
fabricated founder, Q.Arb-as-held, and Q39's struck universal. Each names an
incident in this record. Strike any and the rest stand.
4. **"Or ADR Chambers" on `/arbitration/`** — the one review finding carried
rather than fixed. The source establishes what the firm publishes; it does
not establish that a neutral outside the firm can be appointed under those
rules, and ADR Chambers' own model clause reads *"at ADR Chambers"*. It is on
the page because `docs/01` item 3 lists it as one of three rule options on
your outline. **One clause reframes it** as a rule set a contract may name
rather than an option on offer, if the placement reads wrong to you.
---
## 2026-08-28 (aa) — Build step 4: `/mediation/`, `/arbitration/`, `/med-arb/`. ADRIC's rules sourced, and `docs/01` had the wrong name for one of them
**Three pages, five in the build, zero JavaScript.** `/arbitration/` carries §4's