feat: build step 5 — /practice/ and six area pages; check:claims gates §4 in dist
Build and deploy / build-and-deploy (push) Failing after 5s
Build and deploy / build-and-deploy (push) Failing after 5s
Step 5 ships /practice/ and the six practice-area pages (construction,
technology, energy, insurance, shareholder, cross-border) from one route, and
adds the mechanical §4 gate Pouya ruled for.
check:claims — §4 Forbidden becomes a build error
scripts/check-claims.mjs greps dist/**/*.html for 10 patterns, each carrying
the incident that put it there. It strips <style> and non-JSON-LD <script>
first (a bare sweep for "leading" returned 26 hits, 25 of them
var(--leading-body)), self-tests every pattern against fixtures before
sweeping, and refuses a missing, empty or stale dist/. Wired into /build
Phase 5 and both deploy paths.
Q54 — six conduct undertakings publish, and §4 gains a third class
Conduct undertakings sit apart from credentials and offerings: the gate is
that Pouya said it in terms. The strings live in CONDUCT_UNDERTAKINGS so a
softening is one visible diff. (e) and (f) replace the third-person sentences
already on /arbitration/ rather than joining them.
Q49, Q50 recorded as rulings. §7 records the SES us-east-1 stray identity's
deletion. R11 holds typescript at its current major, with the peer-range
reason recorded.
Three facts corrected, two of them already shipped
- The LAT gloss said mediation "before filing and continuing after filing";
the Tribunal names mediation for "Before you apply" only and its second
sentence is about negotiation. An ellipsis in docs/01 had deleted it.
- "Connection allocation" is not an Ontario term.
- "The 2026 privacy statute" does not exist — Bill C-27 died without royal
assent. Struck from docs/03 rather than corrected in place.
ADR Chambers struck from /arbitration/ and from docs/01 item 3 (Pouya,
2026-08-30): the source establishes what the firm publishes, not that an
outside neutral can be appointed under its rules.
claims-auditor gains a second lens — for every quoted source, whether the
sentence beneath stays inside what the quotation establishes. Four shipped
defects had that shape and none of them is greppable.
CLAUDE.md gains a convention: never truncate the output of a check you intend
to believe. `npm run check | tail -3` returns warnings, hints and a blank line
and drops the errors line; it was reported as passing four times while
astro check was exiting 1 with 10 type errors.
Gates, exit status read directly, not through a pipe:
npm run check exit=0
npm run lint exit=0
npm run build exit=0
npm run check:claims exit=0
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
co-authored by
Claude Opus 5
parent
f3138a0a79
commit
79b19a7bd0
@@ -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 12–18. `[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 12–18. `[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 3–1 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 3–6** | 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, 688–1,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 52–57.
|
||||
|
||||
**SHOULD-FIX — comments longer than the code they explain (D19).** Counted, not
|
||||
estimated: `Undertaking.astro` at 35 comment lines to 20 of code; two 23–24 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, 149–160 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 23–26 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 6–10. 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
|
||||
|
||||
Reference in New Issue
Block a user