diff --git a/AGENTS.md b/AGENTS.md index d7f394f..c65ec36 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -216,7 +216,8 @@ condition below, which is a **condition**, not a formality. **Pouya's ruling, and the reasoning to keep.** His stated basis: ADRIC and ADRIO designations — Q.Med, Q.Arb, C.Med-Arb — are **voluntary credentials, not licences**, and **commercial arbitral appointment in Ontario is not gated behind -a designation**. So the constraint on offering arbitration was never *may he +a designation** — scoped and sourced as the box below now sets out, after the +unscoped version of that sentence turned out to be false. So the constraint on offering arbitration was never *may he act* — only *will parties appoint someone at this stage of the arc*, which is **positional** and his to answer. He answers it: **he accepts arbitration appointments now**, and that — his acceptance — is what the rows below record. @@ -224,20 +225,41 @@ appointments now**, and that — his acceptance — is what the rows below recor > ⚠️ **The legal proposition underneath is the architect's, not this register's, > and it is deliberately NOT stamped `[verified]`.** `[verified — Pouya]` means > *the subject reported it*, which can establish what he offers and cannot -> establish a proposition of Ontario law. No statute or regulation is cited here -> and none is in the repo, so **no reviewer can check it** — R14 again, in a -> place that matters more than a logo. +> establish a proposition of Ontario law. That much is unchanged. > -> It is also **not a universal, and must never be restated as one.** An earlier -> draft of this paragraph wrote "Anyone may be appointed an arbitrator in -> Ontario. Nothing in law gates the role behind a designation." `claims-auditor` -> produced a counter-example from inside this repo: 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. This record does not resolve that — it is **Q39** — but it -> will not carry an unqualified universal that the site's own nav may already -> contradict. The rows below are scoped to **commercial** arbitration for that -> reason. +> **What HAS changed: there is now a source in the repo** — +> `docs/reference/ontario-family-arbitration-training.md`, the extract Pouya's +> Q39 ruling named, retrieved 2026-08-27 with its provenance and the method that +> produced it. R14 is satisfied for the half of the proposition it covers, and +> **it does not cover both halves.** Read the next paragraph before relying on +> either. +> +> **THE UNIVERSAL IS STRUCK, AND IT WAS FALSE.** This paragraph carried +> *"Anyone may be appointed an arbitrator in Ontario. Nothing in law gates the +> role behind a designation."* `claims-auditor` produced a counter-example from +> inside this repo — the site ships a **Shareholder & Family Business** practice +> 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. +> +> **The scoped replacement, and exactly whose it is.** *Commercial arbitration +> in Ontario requires no licence and no designation.* That is **Pouya's stated +> position** — `[Pouya's stated basis 2026-08-27]`, deliberately **not** +> `[verified]`. The extract establishes the **family** gate directly; it +> establishes the **commercial** half only by *absence*, because a government +> page about family arbitrators is not authority for what a commercial +> arbitrator needs. It neither mentions nor excludes commercial arbitration. +> **Do not cite it as if it did**, and do not let the scoped form drift back +> toward a universal because it now has a footnote attached. +> +> **The reason nothing on the site turns on any of this** is the scope exclusion +> two paragraphs down, not the reasoning above: family arbitration is not +> offered. ### The offering test @@ -288,8 +310,16 @@ footer pending Q35(a).* licence gates the activity.** It is not a general licence-free zone, and it must never be read as one: -- **Mediation and arbitration are ungated.** No designation is required to be - appointed. The offering test governs, and Pouya has answered it. +- **Mediation, and COMMERCIAL arbitration, are ungated.** No designation is + required to be appointed. The offering test governs, and Pouya has answered it. + *Scoped 2026-08-27 (Q39).* This bullet read "Mediation and arbitration are + ungated" — an unqualified statement about arbitration as a class, in the + paragraph headed **NOT NEGOTIABLE**, which is the worst place in this file for + one. **Family arbitration in Ontario carries prescribed training** + (`docs/reference/ontario-family-arbitration-training.md`), so the class + statement was false and the boundary paragraph was the thing breaching its own + boundary. Family arbitration is separately **not offered** — see the Offerings + table — so the site never relied on the false half; the record did. - **Legal services are gated.** Providing legal services and practising law in Ontario are restricted activities. For anything on that side of the line the binding question is **permission**, the answer is **not established** (see the @@ -306,9 +336,11 @@ never be read as one: | Offering | Status | |---|---| | **Mediation** — sole mediator | `[verified 2026-08-26 — Pouya]`. Q.Med held; §4 also verifies multiple completed sole mediations | -| **Arbitration — sole arbitrator** (commercial) | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. Not gated by Q.Arb. **Commercial** — see Q39 on family arbitration | +| **Arbitration — sole arbitrator** (commercial) | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. Not gated by Q.Arb. **Commercial**, and the scope is now load-bearing rather than provisional: Q39 closed 2026-08-27 and **family arbitration is excluded by Pouya's choice** — see the row below | | **Arbitration — party-appointed** | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now** | | **Arbitration — co-arbitration** | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. This closes Q36, which had flagged the claim as asserted in three specs and resting on no §4 row — the row is here | +| **Med-Arb** — mediation-arbitration | `[verified 2026-08-27 — Pouya, Q35]`. Offered **now**. Both halves are live: Q.Med is held, and arbitration appointments are accepted (rows above). Ungated by the same reasoning as arbitration. This closes the "Still unanswered" note that used to sit below this table, and it is why `/med-arb/` may stay in the footer sitemap | +| ~~**Family arbitration** under the *Family Law Act*~~ | **NOT OFFERED — a scope exclusion, not a gating problem** `[verified 2026-08-27 — Pouya, Q39]`. Pouya has confirmed he does not do family arbitration. It is therefore out of scope by his choice, and the prescribed-training question never arises for this practice. Recorded because the register reasoned from a false universal for one day and must not do so again — see the box above and `docs/reference/ontario-family-arbitration-training.md`. **`Shareholder & Family Business` does not touch this:** it means commercial disputes among family shareholders — shareholder and partnership disputes, co-founder breakdowns, business succession — and its page must say plainly that family law matters are not accepted | | ~~Tribunal secretary~~ | **Not offered.** D14 removed the rate and bars offering it | **How the arbitration page must read** (`docs/01` §`/arbitration/`, step 4): @@ -318,10 +350,39 @@ about the stage is the differentiator — do not hedge it into vagueness.* So neither half may be dropped. Naming the stage is not a disclaimer bolted onto an offering; it is the reason a sophisticated reader believes the offering. -**Still unanswered — do not infer from this section.** Whether **Med-Arb** is -offered now is not recorded here; Pouya named the three arbitration forms and -mediation, and nothing else. Med-Arb is ungated by the same reasoning, so the -question is his competence call alone — but it is still a question. See Q35. +### Subject-matter areas — the publication gate (Q35, 2026-08-27) + +**This gate did not exist, and its absence is what let `Med-Arb` sit in the +site-wide footer as an unrowed offering three sentences below a paragraph +telling readers not to infer exactly that.** Pouya's words: *"Add the +publication gate you identified was missing."* Same force as the two gates +above. + +> **A practice area may be named — in the nav, in the footer, in a card — where +> BOTH hold:** +> +> 1. **He can competently accept an appointment in that subject matter.** His +> call, and only his. A subject-matter area is not a gated activity (the +> processes conducted in it are mediation and arbitration, both ungated), so +> the offering test's question 1 is already answered for it and question 2 is +> what remains. +> 2. **The page frames it as positioning, not as claimed history.** `docs/03`: +> *"Built to facilitate procurement and subcontract disputes on Ontario's +> megaproject pipeline"* — not *"extensive experience resolving"*. A page that +> claims volume it does not have fails this gate even though the label passes +> condition 1. +> +> Condition 1 is about the **label**; condition 2 is about the **page**. A label +> may ship before its page exists only where the page is already specified to +> meet condition 2 — which `docs/01` does for all six areas, `/practice/energy/` +> most explicitly (*"Write it as a genuine position, not a claim of existing +> volume"*). + +**Applied, 2026-08-27 — Q35 CLOSED.** `Energy, Grid & Regulatory`, +`Shareholder & Family Business`, and the other four labels **pass condition 1** +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. ### Forbidden — must not appear on the site @@ -394,12 +455,14 @@ the audience it targets. Revisit at month 12–18. `[verified 2026-08-25 — dec | Thing | Value | |---|---| -| Framework | **Astro 7.2.7**, `output: 'static'` `[verified 2026-08-26 — npm view astro version, D1 as amended]`. `@astrojs/mdx` 7.0.8, `@astrojs/sitemap` 3.7.3, `sharp` 0.35.4 | -| 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` 5.9.3 — **every pin at the registry's `latest` except `typescript`** `[verified 2026-08-26 — 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` is held at 5.x: `typescript-eslint` peers `<6.1.0` and `@astrojs/check` peers `^5 \|\| ^6`, so TypeScript 7.0.2 is unusable here `[verified 2026-08-26 — npm view]` | +| 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]` | +| 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 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 | | Styling | Plain CSS with custom properties. No Tailwind, no CSS-in-JS `[verified 2026-08-25]` | -| Client JS | **Zero. Not "minimal" — none.** `dist/type-scale/index.html` contains **0 `