feat: rule Q58 and close Q57; §4 lists all six areas; docs/03's checklist cites §4 instead of restating it
Build and deploy / build-and-deploy (push) Failing after 4s

Four rulings from Pouya, plus what implementing them turned up.

Q58 — RULED, and he attributed the ambiguity to his own document: "3.5 was meant
as the TOTAL time committed, of which 2 is preparation — leaving 1.5 hours in the
room. Your arithmetic caught it: if prep sat inside, 3.5 and 7 wouldn't be
exactly 2x, because preparation doesn't scale with session length." The card now
reads: half day up to 3 hours of session, fee includes up to 2 hours of
preparation, $2,000; full day up to 6 hours, up to 3 hours of preparation,
$4,000. docs/07's own research table corroborates 3 and 6 — Patey and Zuber both
publish those hours, and ADR Chambers' roster rate counts preparation separately
from "up to three hours of mediation". One provenance note under R14: he recalled
"all or part of 3 hours" as their wording; the committed extract carries the
hours but not the phrase, so docs/07 cites the hours and attributes the phrase to
nobody.

Two things fell out of the ruling that the instruction did not name, and both
were defects. docs/07 §All parameters confirmed was itself prescribing the flat
"including 2 hours of preparation" — the sentence /for-parties/ was built
against, so the spec was generating the defect. And the cap had to reach the
copy: "including up to 2 hours". FEES.mediation.*.hours is corrected 3.5 -> 3 and
7 -> 6; it had no consumer in src/ while the question was open, which is the only
reason no page was ever wrong. /fees/ is unblocked for step 9 on the question Q58
asked.

Q57 — CLOSED with no seventh undertaking. "A reader assumes the outcome, and the
obvious undertaking adds nothing a reader doesn't already infer." The TODO(pouya)
is replaced by the ruling where the question was; src/ now carries zero live
TODO(pouya) markers.

§4's mediation row lists all six published areas. Q56's ruling had named five,
which was four areas plus the word "commercial" — a scope descriptor, not a
seventh area. The hedge is struck on his instruction; the clause saying the six
are not the authorised subject-matter list is restored, because his ruling
supplied a correct value and did not close Q35(c)'s class. Split-stamped.

docs/03's compliance checklist now names what to look for on a page and which §4
row decides it, never the bar's own wording. 12 items before, 12 after — a
structural fix, not a coverage change.

Thirteen review findings across two rounds, all applied, none declined. Three
were mine to own. The capped-form rule was written and then applied to one
surface: /mediation/ shipped an uncapped form in words no barred-string grep
could reach, site.ts quoted a docs/07 sentence Q58 had just deleted, and §9's
Q15/Q16/Q17 row prescribed the flat form — which is what a later implementer
building /fees/ reads. A derived fee term was asserted as applied fact in the
document that is the authority on money: "overtime begins after 3 h and 6 h" is
in no ruling. Struck, and opened as Q59.

And round 2 caught the arithmetic in round 1's own fix. The full-day route is
flat $4,000 until hour 6, so generalising it as 500n+1000 for all n>=3 was valid
only from 6 h, and "cheaper by $500 at every length" was wrong across the whole
3-6 h band. The real spread is $2,000 at three hours narrowing to $500 from six
on — up to four times larger, and largest exactly where a half-day booking
overruns. Written into docs/07 §Recorded dissent and §12's R5 row, which is where
the 12-month fee review will read it. Round 1's fix for the missing consequence
also published the overtime rate on a page that now states an unambiguous cap,
defining the trigger by adjacency with no other quantity for it to attach to; the
rate came off the page.

R11 at the step 6 -> 7 boundary: 13 of 14 pins current. §7's TypeScript hold
named one gate and there are two — typescript-eslint requires <6.1.0, tighter
than @astrojs/check, so the recorded removal trigger was unreachable. Both are
now named.

Verified: check 0 errors, lint 0, build 0 (14 pages), check:claims 0, npm audit
0, minifier tripwire clean, zero JS shipped, all copy present with JavaScript
disabled. Lighthouse not run — tool unavailable until step 7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
Pouya Lajevardi
2026-08-31 08:17:59 -04:00
co-authored by Claude Opus 5
parent 13b97841b9
commit 6cfe69033f
9 changed files with 594 additions and 132 deletions
+308 -6
View File
@@ -399,7 +399,7 @@ 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. ⚠️ **UNSCOPED, AND DELIBERATELY SO — Q56, ruled by Pouya 2026-08-30. Do not add "commercial" to this row, and do not scope it on a page.** He mediates commercial, construction, insurance/SABS, shareholder and cross-cultural matters, and the practice pages say so. ⚠️ **THAT LIST IS ILLUSTRATIVE OF BREADTH, NOT A CLOSED SET, and it is not the authorised subject-matter list** — Q35's gate governs that, and the site publishes **six** areas of which every one offers mediation (`src/data/practice-pages.ts`), **technology and energy included**. Read as an enumeration it is short by two, and a later reader would strike two live pages or open a question that did not need opening. Flagged to Pouya rather than rewritten, because the words are his ruling. Raised by `adversarial-reviewer`, 2026-08-30. **Why this row and the arbitration row below do not match, so the asymmetry reads as designed rather than as an oversight:** arbitration is scoped commercial because of a **legal gate** — Q39, family arbitration in Ontario requires prescribed training. **Mediation has no such gate.** The site said *"Commercial Mediation"* on four surfaces until 2026-08-30; that was under-describing the offering, and it was corrected rather than ratified |
| **Mediation** — sole mediator | `[verified 2026-08-26 — Pouya]`. Q.Med held; §4 also verifies multiple completed sole mediations. ⚠️ **UNSCOPED, AND DELIBERATELY SO — Q56, ruled by Pouya 2026-08-30. Do not add "commercial" to this row, and do not scope it on a page.** **He mediates in all six published practice areas** — construction, technology, energy, insurance, shareholder, and cross-cultural. `PRACTICE_AREAS` in `src/data/site.ts` carries the full names and the six pages are built (`src/data/practice-pages.ts`); **every one of the six offers mediation**, and each is named under **Q35(c)'s subject-matter publication gate**. ⚠️ **THE SIX ARE THE VALUE, AND THE HEDGE THAT STOOD HERE FOR ONE DAY IS STRUCK — Pouya, 2026-08-31:** *"The register should match the site; 'illustrative' is a hedge covering a gap that has a correct value. Technology and energy go in."* Q56's ruling had named five — *"commercial, construction, insurance/SABS, shareholder and cross-cultural"* — which is **four of the six areas plus the word *commercial***, a scope descriptor rather than a seventh area. `adversarial-reviewer` found the row two short; it was annotated as illustrative rather than rewritten, because the words were his ruling and only he could supply the missing value. He has, so the enumeration is now the site's own six and a reader comparing register against site finds them equal. ⚠️ **BUT THE SIX ARE THE PUBLISHED AREAS, NOT THE AUTHORISED SUBJECT-MATTER LIST — that clause was struck with the hedge on 2026-08-31 and is restored the same day.** Pouya's ruling replaced *"illustrative"* with a correct value; it did not close the class. **Q35(c)'s gate still governs what may be named** — a practice area may be named where he can competently accept an appointment in that subject matter and the page frames it as positioning without claiming history — and the gate is not spent by having been used six times. Read as a closed list this row would withdraw the register's support from `/practice/cross-cultural/`'s shipped *"commercial mediations and arbitrations"*, which was deliberately left on the recorded ground that the class is open. **The six-area fact is `[verified 2026-08-31 — Pouya]`; the row's opening stamp is 2026-08-26 and said nothing about subject matter** — split, on the device this register ratified for the Q.Arb row. **Why this row and the arbitration row below do not match, so the asymmetry reads as designed rather than as an oversight:** arbitration is scoped commercial because of a **legal gate** — Q39, family arbitration in Ontario requires prescribed training. **Mediation has no such gate.** The site said *"Commercial Mediation"* on four surfaces until 2026-08-30; that was under-describing the offering, and it was corrected rather than ratified |
| **Arbitration — sole arbitrator** (commercial) | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now**. Not gated by Q.Arb. **Commercial**, and the scope is now load-bearing rather than provisional: Q39 closed 2026-08-27 and **family arbitration is excluded by Pouya's choice** — see the row below. ⚠️ **THE SCOPE IS A LEGAL GATE, NOT A POSITIONING CHOICE — Q56, 2026-08-30.** Family arbitration in Ontario requires prescribed training, which is why this word is load-bearing here and **must not be copied onto the mediation row above**: mediation has no equivalent gate and is unscoped on purpose |
| **Arbitration — party-appointed** | `[verified 2026-08-26 — Pouya, Q33/Q36]`. Offered **now** |
| **Arbitration — 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 |
@@ -703,7 +703,7 @@ the audience it targets. Revisit at month 1218. `[verified 2026-08-25 — dec
| Thing | Value |
|---|---|
| Framework | **Astro 7.2.9**, `output: 'static'` `[verified 2026-08-27 — npm view astro version, D1 as amended]`. `@astrojs/mdx` 7.0.8, `@astrojs/sitemap` 3.7.3, `sharp` 0.35.4 — all three at `latest`. Bumped from 7.2.7 at the step 1 → step 2 phase boundary under R11: 7.2.8 published 2026-08-26 and 7.2.9 on 2026-08-27, i.e. **two patches appeared inside 48 hours**, which is the argument for checking at boundaries rather than on failure. `engines` unchanged at `node >=22.12.0`, `npm >=9.6.5` `[verified 2026-08-27 — npm view astro@7.2.9 engines]` |
| **TypeScript — HELD at 6.x, and the hold is a peer constraint rather than a preference** | Pinned `^6.0.3`; `npm view typescript version` returns **7.0.2** `[verified 2026-08-30 — R11, step 56 phase boundary; unchanged from 2026-08-29]`. **The removal trigger was re-checked rather than recalled:** `npm view @astrojs/check@0.9.10 peerDependencies` still returns `{ typescript: '^5.0.0 || ^6.0.0' }`, so the hold stands. **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 |
| **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-31 — R11, step 67 phase boundary; 13 of 14 pins current, this the only hold]`. **The removal trigger was re-checked rather than recalled:** `npm view @astrojs/check@0.9.10 peerDependencies` still returns `{ typescript: '^5.0.0 || ^6.0.0' }`, so the hold stands. ⚠️ **AND THERE ARE TWO GATES, NOT ONE — corrected 2026-08-31, and this row named only the first for two days.** `npm view typescript-eslint peerDependencies` returns `{ typescript: '>=4.8.4 <6.1.0' }`, which is **tighter**: widening `@astrojs/check` alone would not lift the hold, so the trigger as recorded was unreachable. **A second consequence, live:** the pin is a caret, so if a 6.1.x ever ships, a plain `npm install` moves the tree into a peer-range breach with nothing in the repo saying so. Nothing is breached today — `npm ls typescript` resolves **6.0.3**, which is the highest stable 6.x on the registry. Found by running R11's own check rather than reading the row. **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` AND `typescript-eslint` both widen to include 7** — either alone is not enough. 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-30 — npm view, all 14 pins, R11 at the step 5 → 6 boundary; thirteen current, one held]`. `@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 |
@@ -771,8 +771,9 @@ Nothing below can be invented. Each needs an answer from Pouya.
| # | Question | Blocks |
|---|---|---|
| **Q58** | **DOES `hours` IN THE MEDIATION RATE CARD MEAN THE LENGTH OF THE DAY, OR THE BILLED ENVELOPE INCLUDING PREPARATION?** `docs/07-fees.md` reads *"Half day — **up to 3.5 h, including 2 h preparation**"* and *"Full day — up to 7 h, including 3 h preparation"*. Taken at face value, 3.5 is the whole billed envelope and the **time in the room is 1.5 h** for a half day and **4 h** for a full day. **Against that reading:** 3.5 and 7 are exactly 2×, which they would not be if preparation sat inside them (1.5 vs 4 is not 2×). So either the card's wording is wrong in the one document that is the authority on money, or `FEES.mediation.*.hours` in `src/data/site.ts` does not mean what a page would naturally publish it as. **This was one sentence from shipping.** A draft of `/for-parties/` answered *"What happens on the day?"* with *"A half day is about 3.5 hours"* — the envelope presented as the day, to the reader least able to check it. The sentence was removed rather than resolved by inference; the page now says only that you book a half day or a full day. **What is needed:** one line from Pouya saying which the 3.5 and 7 are. Then `docs/07`'s two rows or `site.ts`'s field gains the correction, and the semantics go in the constant's doc comment (a warning is there now). **`/fees/` at build step 9 publishes this table and cannot be built without the answer.** Raised by `adversarial-reviewer`, 2026-08-30 | **`/fees/` (step 9), and any sentence anywhere stating how long a mediation day is.** Nothing currently shipping — no page states a duration |
| **Q57** | **WHAT HAPPENS WHEN A CONFLICTS CHECK TURNS SOMETHING UP?** `/process/` §Conflicts ships saying **when** the check runs (the intake call, before anything is agreed) and **what it needs** (full legal names of the parties, the parent or affiliate actually behind the dispute, counsel on each side). It stops there, and the stop is deliberate: **any sentence naming the outcome is a SEVENTH conduct undertaking**, and §4's gate for that class 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."* *"If a conflict appears I decline the appointment"* is exactly what that gate refuses to let this repository infer, however obvious it looks. **What is needed:** one sentence from Pouya, in his words, or a decision that the page says nothing further. `TODO(pouya)` sits at `src/pages/process.astro` §Conflicts. Raised at build step 6, 2026-08-30 | **The outcome half of `/process/` §Conflicts.** The section ships and is accurate; a reader who asks the obvious next question does not find the answer on the page |
| **Q59** | **WHERE DOES THE OVERTIME HOUR START?** `docs/07`'s card carries *"Overtime, per hour — $500"* and has never said what it is overtime **to**. Q58's ruling settled the two allowances (up to 3 h / 6 h of session, up to 2 h / 3 h of preparation) and did not reach this, and Q15Q17's answer records the rate with no trigger either. **The two candidates are the session cap (3 h / 6 h) and the billed envelope (5 h / 9 h), and this repository must not pick one** — it is a fee term, and `CLAUDE.md`'s rule for a fact we do not have is a question, not an inference. A first pass at `docs/07`'s Q58 note asserted the session cap as applied fact; `adversarial-reviewer` struck it in the same change set that wrote it. ⚠️ **AND THE ANSWER EXPOSES SOMETHING IN D14's FIGURES THAT IS WORTH SEEING BEFORE `/fees/` PUBLISHES THEM.** Under the session-cap trigger the half-day route costs `2000 + 500 × max(0, n 3)` and the full-day route is **flat $4,000 until hour 6** — so **booking a half day and paying overtime is cheaper at EVERY length: by $2,000 at 3 h, $1,500 at 4 h, $1,000 at 5 h, and $500 from 6 h on. The full-day rate is never the cheaper choice.** The cause is the relationship between two of D14's own numbers rather than the trigger — the half-to-full step is $2,000 and three hours of overtime is $1,500 — and the envelope trigger trades bands rather than fixing it (worse at 6 h, closing to zero from 9 h). ⚠️ *This row first stated the spread as a flat $500 and generalised the full-day route as `500n + 1000` for all `n ≥ 3`, which is only valid from hour 6. The real spread is up to FOUR TIMES larger and is largest at 35 h, the band a half-day booking actually overruns into — so the wrong figure understated exactly the thing this row exists to escalate. Corrected 2026-08-31; found by `adversarial-reviewer` on round 2 of the change set that wrote it.* The table is in `docs/07` §The confirmed rate card and, for the rate decision, §Recorded dissent. **What is needed:** one line on where the hour starts, and a decision on whether the half/full step is a choice or an oversight (R5's 12-month review is the other place that belongs). Raised by `adversarial-reviewer`, 2026-08-31 | **`/for-parties/` NOW, and the overtime line on `/fees/` at step 9.** That page states an unambiguous session cap, so an overtime RATE printed on it defines the trigger **by adjacency** — there is no other quantity for the charge to attach to, and the answer travels alone into the `FAQPage` node. The rate is therefore off that page until this is answered; it names the charge without its rate or its trigger. `/mediation/` says only that overtime is on the rate card |
| ~~Q58~~ | **RULED 2026-08-31 — `hours` IS THE SESSION, AND THE AMBIGUITY WAS IN `docs/07` RATHER THAN IN ANY COPY. Pouya owned it in terms:** *"the ambiguity is mine… My `docs/07` wording said "up to 3.5 h, including 2 h preparation", which is genuinely unclear: 3.5 was meant as the TOTAL time committed, of which 2 is preparation — leaving 1.5 hours in the room. Your arithmetic caught it: if prep sat inside, 3.5 and 7 wouldn't be exactly 2×, because preparation doesn't scale with session length. The intended reading is the market's, and my wording obscured it."* **THE CORRECTED CARD, in his words:** *"Half day — up to 3 hours of session. Fee includes up to 2 hours of preparation. $2,000. Full day — up to 6 hours of session. Fee includes up to 3 hours of preparation. $4,000."* His reason for 3 and 6: *"the market convention — Patey and Zuber both publish "all or part of 3 hours" and "all or part of 6 hours", and those were the comparables the rate was set against. Selling 1.5 hours of room time as a half day would be an outlier nobody would recognise."* ⚠️ **ONE PROVENANCE NOTE, and it is R14's rule rather than a doubt about the ruling:** `docs/07`'s committed extract records Patey and Zuber at **3 h** and **6 h** but **does not carry the phrase "all or part of"** — so `docs/07` cites the hours, not the phrase, and the phrase is not attributed to them anywhere in the repository. The hours corroborate the ruling on their own, and ADR Chambers' roster rate in the same table is the clearest corroboration of the *shape*: *"one half hour of preparation time per party **and** up to three hours of mediation"* — preparation counted separately from a three-hour session. **APPLIED:** `docs/07`'s two card rows and its §All parameters confirmed (which prescribed the flat *"including 2 hours"*, the form `/for-parties/` then shipped); `FEES.mediation.*.hours` 3.5 → 3 and 7 → 6 with the semantics in the constant's doc comment; `/for-parties/` now states the session length interpolated from the constant and the preparation allowance **as a cap**. **The preparation allowance is CAPPED and must be published as capped***"including **up to** 2 hours"*, never the flat form and never "preparation included". **`/fees/` is UNBLOCKED for build step 9.** **The question as raised is preserved below.** **DOES `hours` IN THE MEDIATION RATE CARD MEAN THE LENGTH OF THE DAY, OR THE BILLED ENVELOPE INCLUDING PREPARATION?** `docs/07-fees.md` reads *"Half day — **up to 3.5 h, including 2 h preparation**"* and *"Full day — up to 7 h, including 3 h preparation"*. Taken at face value, 3.5 is the whole billed envelope and the **time in the room is 1.5 h** for a half day and **4 h** for a full day. **Against that reading:** 3.5 and 7 are exactly 2×, which they would not be if preparation sat inside them (1.5 vs 4 is not 2×). So either the card's wording is wrong in the one document that is the authority on money, or `FEES.mediation.*.hours` in `src/data/site.ts` does not mean what a page would naturally publish it as. **This was one sentence from shipping.** A draft of `/for-parties/` answered *"What happens on the day?"* with *"A half day is about 3.5 hours"* — the envelope presented as the day, to the reader least able to check it. The sentence was removed rather than resolved by inference; the page now says only that you book a half day or a full day. **What is needed:** one line from Pouya saying which the 3.5 and 7 are. Then `docs/07`'s two rows or `site.ts`'s field gains the correction, and the semantics go in the constant's doc comment (a warning is there now). **`/fees/` at build step 9 publishes this table and cannot be built without the answer.** Raised by `adversarial-reviewer`, 2026-08-30 | **Nothing.** No page stated a duration while the question was open — the one draft sentence that did was removed rather than reconciled, which is why the ruling had nothing to correct in public copy |
| ~~Q57~~ | **CLOSED 2026-08-31 — NO SEVENTH UNDERTAKING, AND THE PAGE IS COMPLETE AS IT STANDS.** Pouya: *"`/process/` stating when conflicts are run and what the check needs is complete. A reader assumes the outcome, and the obvious undertaking ("if a conflict is found I decline") adds nothing a reader doesn't already infer. Your restraint was right — §4's gate held. Record it closed rather than open, so it stops appearing in the live list."* **So this is a closure, not a deferral:** the answer is that the page says nothing further, which was one of the two outcomes the question named. §4 gains no seventh conduct undertaking and `CONDUCT_UNDERTAKINGS` still holds six. **APPLIED:** the `TODO(pouya)` is removed from `src/pages/process.astro` §Conflicts and replaced with the ruling, so a later reader finds the decision where the question was rather than an open marker; the file header's *"see the TODO below"* is corrected to cite this closure. `src/` now carries **zero** live `TODO(pouya)` markers. **The question as raised is preserved below.** **WHAT HAPPENS WHEN A CONFLICTS CHECK TURNS SOMETHING UP?** `/process/` §Conflicts ships saying **when** the check runs (the intake call, before anything is agreed) and **what it needs** (full legal names of the parties, the parent or affiliate actually behind the dispute, counsel on each side). It stops there, and the stop is deliberate: **any sentence naming the outcome is a SEVENTH conduct undertaking**, and §4's gate for that class 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."* *"If a conflict appears I decline the appointment"* is exactly what that gate refuses to let this repository infer, however obvious it looks. **What is needed:** one sentence from Pouya, in his words, or a decision that the page says nothing further. `TODO(pouya)` sits at `src/pages/process.astro` §Conflicts. Raised at build step 6, 2026-08-30 | **Nothing.** The section shipped accurate and unchanged; what closed is whether anything more was owed |
| ~~Q56~~ | **RULED 2026-08-30 — MEDIATION IS *NOT* SCOPED COMMERCIAL.** Pouya: *"Correct the four 'Commercial Mediation' surfaces to 'Mediation'; leave §4's mediation row unscoped."* **And the asymmetry with arbitration is DESIGNED, not an oversight — the reason is now recorded beside both §4 rows so nobody tidies them into a matching pair.** **Arbitration is scoped commercial because of a LEGAL GATE:** Q39 — family arbitration in Ontario requires prescribed training, and Pouya has excluded it by choice. **Mediation has no such gate**; he mediates commercial, construction, insurance/SABS, shareholder and cross-cultural matters, and the practice pages say so. So the site-wide "commercial" framing was **under-describing a wider offering**, which is why it is corrected rather than ratified as a positioning choice. `/practice/insurance/`'s SABS framing needs no reconciliation: it was never outside the offering. **The question as raised is preserved below.** ⚠️ **IS THE MEDIATION OFFERING SCOPED COMMERCIAL, OR NOT? THE SITE SAID BOTH.** §4 Offerings rows arbitration three times, each **scoped commercial**; the mediation row is `**Mediation** — sole mediator`, **unscoped**. Shipped output scopes it anyway: `/mediation/`'s `<title>` is *"Commercial Mediation"*, its `Service` node is `name: "Commercial mediation"`, and `/` and `/about/` both say *"I mediate commercial disputes"*. Meanwhile **`/practice/insurance/` offers mediation in matters that are not commercial on any ordinary reading** — *"Disputes between an insured person and an insurer under the Statutory Accident Benefits Schedule"*, with *"What I offer is private mediation"*. An individual claimant against their own insurer is not a commercial dispute. **Nothing here is a false claim** — scoping a page to commercial mediation asserts *less* than the unscoped §4 row grants, and narrower than the row is always safe. **The problem is that the two halves cannot both be the whole picture**: either the practice takes non-commercial mediations (and the site-wide "commercial" framing under-describes it, including on the page an appointing body reads), or it does not (and `/practice/insurance/` is offering something outside the offering). **What is needed:** either a §4 Offerings row scoping mediation, with `/practice/insurance/`'s SABS framing reconciled to it — or a decision that mediation is deliberately unscoped, in which case the site-wide "commercial" wording is a positioning choice and should be recorded as one rather than read as a limit. **Pre-existing, not created 2026-08-30** — but this change set newly wrote the claim onto `/med-arb/` and it has been removed again pending this answer. Raised by `adversarial-reviewer`, 2026-08-30 | **Nothing — ruled the same day it was raised.** No page was wrong; the register was silent where the site was specific, and the ruling makes the site match the register rather than the other way round |
| ~~Q55~~ | **CLOSED 2026-08-30 — NOT RESOLVED, AND THE DIFFERENCE IS THE RULING.** Pouya: *"The date is not published and nothing depends on it. Your split stamp was right: `[verified]` on the status, `[Pouya's stated basis]` on the date, the 2026-08-26 record noted as unreconciled. A register that says 'two inconsistent reports of an unpublished fact, neither relied on' is complete. Do not put it to Pouya."* **So this row is not a question any more and must not be re-raised as one.** §4's Q.Arb row now carries the split stamp explicitly and marks the 2026-08-26 (a) report **unreconciled, permanently**. **Why closing beats answering here:** the register's job is to say what it can vouch for, and it can vouch for exactly this — that he reported a July acquisition, that he had reported an August commencement three days earlier, and that no published claim rests on either. Asking again would buy a third self-report about a fact the site does not state. **The question as raised is preserved below, because the evidence is the record.** ⚠️ **WHEN WAS Q.Arb ACTUALLY OBTAINED? THE REGISTER HOLDS TWO DATES FROM THE SAME SOURCE AND THEY CANNOT BOTH BE TRUE.** (a) **2026-08-26 (a)**, Change Log, `[verified 2026-08-26]`: *"Q.Arb dated. Old → new: `[assumed]`, stage unknown → **commenced August 2026**"*. (b) **2026-08-29**, Pouya's amendment, now the §4 Verified row: *"Obtained July 2026"*. A designation cannot have been obtained in July from a pathway reported as commencing in August, and (a) was reported three days before (b). One self-report is wrong; the register cannot say which, and **inferring it would be exactly the guessed-explanation failure `CLAUDE.md` bars**. **THIS DOES NOT BLOCK, and that is the whole reason it is a question rather than a hold.** The published claim is *held***which is faithful to his most recent instruction, and that is a different thing from correct.** §4's premise is that `[verified — Pouya]` establishes *what he reported*, never the fact, and this is the one row where the register holds documented evidence that a self-report about this credential is wrong. The date is deliberately unpublished, so no page turns on the answer. What turns on it is whether §4 can vouch for its own highest-stakes new row. **What is needed:** one line from Pouya giving the correct date, and whether (a) was a misreport, a different milestone, or something else. Then re-stamp the §4 row and correct or annotate (a) — the Change Log is append-only, so (a) gets a pointer, never an edit. Raised by `claims-auditor`, 2026-08-30 | **Nothing — and closed on that basis rather than despite it.** The site states what Pouya most recently instructed, and no page carries the date |
| ~~Q1~~ | **ANSWERED 2026-08-26.** Licensure is left out entirely; the site asserts the JD only. See D13 | — |
@@ -780,7 +781,7 @@ Nothing below can be invented. Each needs an answer from Pouya.
| ~~Q3~~ | **ANSWERED 2026-08-26.** Email `info@smlcompany.ca`. No public phone — "By scheduled call". Location: Toronto · Ontario · By appointment | — |
| ~~Q4 / Q14~~ | **ANSWERED 2026-08-26.** Rate card confirmed by Pouya — see D14 and `docs/07-fees.md` | — |
| ~~Q13~~ | **ANSWERED 2026-08-26.** Self-hosted Gitea with Gitea Actions | — |
| ~~Q15 / Q16 / Q17~~ | **ANSWERED 2026-08-26.** Non-mediation hourly $500. Prep bundled: 2 h in the half day, 3 h in the full day, **stated on the page**. Overtime $500/h | — |
| ~~Q15 / Q16 / Q17~~ | **ANSWERED 2026-08-26.** Non-mediation hourly $500. Prep bundled and **CAPPED**: **up to** 2 h in the half day, **up to** 3 h in the full day, and `docs/07` §All parameters confirmed requires it published **in hours and as a cap**. Overtime $500/h — **the RATE only; where it begins is §9 Q59, open.** ⚠️ *Corrected 2026-08-31 with Q58: this row prescribed the flat form ("2 h in the half day"), which is the form `docs/07` now says must never be published — and §9 is what a later implementer building `/fees/` reads. Found by `adversarial-reviewer` in the change set that wrote the new rule.* | — |
| ~~Q25~~ | **ANSWERED 2026-08-26. Struck.** The §4 row permitting the boutique to be named is removed; D16 governs alone | — |
| ~~Q26~~ | **ANSWERED 2026-08-26.** §4 now carries an explicit **Licence status — NOT ESTABLISHED** row, and its opening no longer asserts that LSO rules apply. The register's rationale stands on the fabricated-credentials history alone | — |
| ~~Q24~~ | **ANSWERED 2026-08-26.** `AWS-Hosting-Guide.md` copied into `docs/reference/` — it is the only record of how the hand-built infrastructure was created. Scanned for credentials before copying: no access keys, no secrets, no account ID | — |
@@ -914,7 +915,7 @@ never being raised again.
| R2 | **Matter counts stay off the site until they are independently credible.** Revisit once there is a number a sophisticated GC would find persuasive on its own | 2026-08-26 | §4 forbids them now. That rule has an expiry date nobody has set |
| R3 | **The month 1218 practice-area review — now two candidates, not one.** *(a)* **Indigenous engagement**, deliberately omitted at launch (§6). *(b)* **Tax-adjacent disputes**, added 2026-08-26 on the Canadian Tax Foundation membership: it is the one credential none of the six areas touch, and valuation, earn-out, indemnity and shareholder disputes that turn on a tax position are ADR territory. Reasoning for both is in `docs/01-architecture.md`. One review, two candidates | 2026-08-26 | The brief rates the Indigenous niche the most valuable single one, and omission there is a timing call rather than a permanent one. The tax case is the same shape and fails for the same reason today: a practice page is a claim of present capability, and a membership is a credential, not a caseload. Both stop being true at some point, and nothing will tell you when |
| R4 | **Insights cadence.** D9 commits to monthly. A blog that stops is worse than one that never started | 2026-08-26 | The section's whole value is compounding |
| R5 | **Fee review at 12 months.** Published rates are sticky; the right moment to move them is deliberate, not reactive | 2026-08-26 | D14 is priced for where the practice is going, not where it is |
| R5 | **Fee review at 12 months.** Published rates are sticky; the right moment to move them is deliberate, not reactive. ⚠️ **ONE ITEM IS ALREADY WAITING AND IT IS ARITHMETIC RATHER THAN JUDGEMENT — added 2026-08-31:** the half-day-plus-overtime route is cheaper than the full-day rate at **every** session length, by $2,000 at three hours narrowing to $500 from six on, because the half-to-full step is $2,000 and three hours of overtime is $1,500. Written out in `docs/07` §Recorded dissent with the table, which is the section built for this review to test against. The **trigger** for the overtime hour is a separate open question — §9 Q59 | 2026-08-26 | D14 is priced for where the practice is going, not where it is. And the anomaly above was assigned to this reminder twice in one change set and written into neither place the reminder lives, which is the failure §12 exists to prevent |
| R6 | **Booking tool.** Parked by Pouya on 2026-08-26; `/contact/` ships with the intake form and a reserved slot for an embed | 2026-08-26 | He asked to be reminded. D10 committed to booking because it removes the back-and-forth that loses appointments — the form alone is a partial answer |
| R9 | **The SES alarms notify nobody until the `ses-alerts` email subscription is confirmed.** `SES-BounceRate-High` and `SES-ComplaintRate-High` are configured and live; the SNS email subscription to `info@smlcompany.ca` is **pending confirmation**, and an unconfirmed subscription drops every message | 2026-08-26 | A monitoring control that exists but does not deliver is worse than none, because it reads as covered. At this volume five bounces can cross the ~5% suspension threshold. Tracked in §7 and on the cutover checklist, but a one-click task nobody owns is exactly what §12 is for |
| R10 | ⚠️ **A THIRD SURFACE, 2026-08-30: `/process/` §Confidentiality renders `MEMBERSHIP_ORGS[0]` ("I am a member of the ADR Institute of Canada").** It is rendered from the constant rather than typed, so the sweep this reminder prescribes reaches it — that was `adversarial-reviewer`'s finding and the fix, in that order. **DISCHARGED AS WRITTEN 2026-08-28 — AND RE-ARMED WITH AN EVENT TRIGGER INSTEAD OF A DATE. STILL LIVE.** Pouya re-confirmed all four memberships as current (Q44), which discharges the prohibition this row carried, and `/about/` now publishes the Memberships group. **The row does not close, because he declined renewal-date tracking**, and that was his instruction for what to do about it: *"Without renewal months it cannot fire on a date, so make it fire on an event: re-confirm memberships before any cutover or major republish, and re-stamp §4 when confirmed."* **THE TRIGGER: re-confirm before any cutover, and before any major republish. Then re-stamp §4 the same day.** **His reason, kept verbatim because it is the general principle and not a membership detail:** *"§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 the discharge did NOT license.** (1) **No currency warranty on the page** — list the memberships, promise nothing about their future state; the struck sentence stays struck and nothing replaces it. (2) ~~`memberOf` stays out of the JSON-LD~~**SUPERSEDED. Q53, ruled 2026-08-28: EMIT IT.** `/about/`'s Person node now carries the four memberships as `Organization` nodes. Pouya took `adversarial-reviewer`'s argument: they are already crawlable in `/about/`'s HTML, so withholding the triple reduced no exposure and only made the graph less complete than the page. **The consequence for THIS reminder is that it now covers two surfaces** — re-confirming before a cutover means `src/data/schema.ts` as well as the visible list, and they must not be allowed to diverge. **Renewal periods, stated once and not widened again:** the OBA sections and the CTF renew yearly; §4 records **nothing** about ADRIC's or ADRIO's period, and the widened form ("all four renew yearly") reached four files before it was swept. *Previous text described the prohibition and the withheld group; it held for one session and did its job.* | 2026-08-26 | A credential that lapses quietly is the failure mode §4 exists to prevent, and OCNI already did exactly this. The group is on a public page now, which raises the cost of a lapse rather than lowering it — *(This rationale ended by pointing at **Q48** as a possible widening of the row. Q48 closed 2026-08-28 as not site-relevant — ADRIO retention governs whether Pouya keeps a designation, not what the site may say about holding one — so the clause is struck. §12 is read aloud every session; a live reminder pointing at a struck row produces a false surface every time.)*, not just a list |
@@ -933,6 +934,307 @@ never being raised again.
# Change Log
## 2026-08-31 (ag) — Q58 and Q57 ruled and closed; §4's mediation row enumerates all six areas; `docs/03`'s compliance checklist stops paraphrasing §4 and cites it; and a derived fee term was struck from the one document that is the authority on money
**Four rulings from Pouya, plus what implementing them turned up.** Both of the
previous session's change sets are committed and pushed first, on his
instruction — `2ea4c0f` (the D20/Q55/Q56 rulings, 14 files, builds and passes on
its own at 12 pages) and `13b9784` (build step 6, 14 pages). The split was
prepared in the prior session and he ratified it: *"COMMIT AND PUSH both sets.
The split you prepared is correct."*
### Q58 — RULED, and Pouya attributed the ambiguity to his own document
*"The ambiguity is mine. My `docs/07` wording said 'up to 3.5 h, including 2 h
preparation', which is genuinely unclear: 3.5 was meant as the TOTAL time
committed, of which 2 is preparation — leaving 1.5 hours in the room. Your
arithmetic caught it: if prep sat inside, 3.5 and 7 wouldn't be exactly 2×,
because preparation doesn't scale with session length. The intended reading is
the market's, and my wording obscured it."*
The card now reads, in his words: **half day — up to 3 hours of session, fee
includes up to 2 hours of preparation, $2,000; full day — up to 6 hours of
session, up to 3 hours of preparation, $4,000.** His reason for 3 and 6 is the
market convention, and **`docs/07`'s own research table corroborates it** — which
is why the corroboration is recorded there rather than asserted: Patey publishes
3 h / 6 h in both tiers, Zuber 3 h video and 6 h full day, and ADR Chambers'
roster rate covers *"one half hour of preparation time per party **and** up to
three hours of mediation"*, preparation counted separately from a three-hour
session.
⚠️ **One provenance note, under R14 rather than as a doubt about the ruling.** He
recalled Patey and Zuber as publishing *"all or part of 3 hours"*. The committed
extract records their **hours** and not that phrase, so `docs/07` cites the hours
and the phrase is attributed to nobody. The hours carry the point on their own.
**Two things fell out of the ruling that the instruction did not name, and both
were defects rather than extensions.**
**(a) `docs/07` §All parameters confirmed was prescribing the flat form** —
*"must be stated on the page — 'including 2 hours of preparation'"*. That is the
sentence `/for-parties/` was built against, so **the spec was generating the
defect the same spec elsewhere forbids.** Corrected to require the cap: *"in
hours AND AS A CAP"*.
**(b) The cap had to reach the copy.** `/for-parties/` shipped *"including 2
hours of preparation"* — a flat entitlement where the allowance is capped. Now
*"including up to 2 hours of preparation"*. The session length also returned to
the page, interpolated from `FEES` rather than typed; it had been removed for one
build **only** because Q58 was open.
`FEES.mediation.*.hours` is corrected 3.5 → 3 and 7 → 6 and now means the
session. **It had no consumer in `src/` when the question was open**, which is
the only reason no page was ever wrong. `/fees/` is unblocked for step 9 on the
question Q58 asked.
### Q57 — CLOSED, and a closure is not a deferral
*"`/process/` stating when conflicts are run and what the check needs is
complete. A reader assumes the outcome, and the obvious undertaking ('if a
conflict is found I decline') adds nothing a reader doesn't already infer. Your
restraint was right — §4's gate held. Record it closed rather than open, so it
stops appearing in the live list."*
The answer is one of the two the question offered: the page says nothing further.
§4 gains no seventh undertaking; `CONDUCT_UNDERTAKINGS` still holds six. The
`TODO(pouya)` is replaced by the ruling at the place the question was, and **`src/`
now carries zero live `TODO(pouya)` markers.**
### §4's mediation row — all six areas, and the hedge struck
*"The register should match the site; 'illustrative' is a hedge covering a gap
that has a correct value. Technology and energy go in."*
Q56's ruling had named five, which was **four of the six areas plus the word
*commercial*** — a scope descriptor, not a seventh area. The row is now the
site's own six (construction, technology, energy, insurance, shareholder,
cross-cultural) and a reader comparing register against site finds them equal.
The six-area fact is stamped `[verified 2026-08-31 — Pouya]` against the row's
2026-08-26 opening stamp, on the split-stamp device this register ratified for
Q.Arb.
**The vocabulary sweep found the same hedge in `docs/03`**, which a
subject-anchored sweep would have missed:
```
$ git grep -n 'illustrative of breadth\|illustrative, not a closed' -- docs/ src/ AGENTS.md CLAUDE.md .claude/
AGENTS.md:1367:pages. The row now says the list is **illustrative of breadth, not a closed
docs/03-content-spec.md:101: matters"* — is **illustrative of breadth, not a closed set**: the site
```
`AGENTS.md:1367` is entry (ae) — append-only history, correctly left. `docs/03`
was live instruction and was corrected.
### `docs/03`'s compliance checklist — a structural fix, on the third instance
*"The checklist paraphrases §4 rows and drops qualifiers… Every time, the
checklist is what gets grepped and §4 is what's correct. So: the checklist must
CITE the §4 row, not restate it. Same single-source rule as §7 and operational
facts."*
Every item that bars something now names **what to look for on the page** and
**which §4 row decides it** — never the bar's own wording — and names the
`check:claims` pattern that sweeps `dist/` for it where one exists. **Item count
is unchanged: 12 before, 12 after.** This is a structural fix and deliberately
not a coverage change; the same discipline the frozen `check:claims` is under.
The three instances, all caught by review and never by the checklist, and in each
case §4 was right: *"no dollar figures"* for §4's *"attached to **past
matters**"*, which read as forbidding the rate card D8 commits to; *"no
testimonials"* for §4's bar on endorsements **of the practice or of Pouya**,
which read as forbidding the institutional quotations `docs/01` directs; and the
licence-capacity item, which unscoped rejected the exact sentence the section
above it exists to bless.
### An argument for the freeze, recorded because Pouya asked for it
*"That is twice the freeze has forced a copy change and twice the replacement was
better. Record that, it is an argument for the freeze."*
Both on `/med-arb/` and `/for-parties/`, `check:claims` failed the build on copy
that was **compliant on §4's wording***"my client"* used of a party, and five
uses of *"lawyer"* about the **reader**. There is no allowlist and the freeze
bars narrowing a pattern, so the copy moved instead. *"our client"* is better
than *"my client"* on a neutral's site whatever §4 says, and *"Should I get my
own legal advice?"* is better than *"Do I need my own lawyer?"* on the page
written for a party without one. **A tripwire slightly wider than the rule it
guards produces better copy at the cost of an argument you have to win twice.**
Narrowing it would have produced worse copy and a looser instrument.
### Ratified as shipped
The `/process/` contrast fix and its load-bearing `:not(.btn)`; the unrowed
terms-of-appointment claim replaced with the sourced ADRIC obligation; the
`/practice/` *"in commercial matters"* scoping breach; and the gloss lens's
fourth catch — the *"one sentence"* completeness claim, where the cited source
supplied its own counter-example.
### The review — two rounds, thirteen findings, all applied
`adversarial-reviewer` only, per D20. `claims-auditor` did **not** run and must
not until cutover. **Stopped at two rounds under D19**, and the cap is not
laxness: round 2 found five defects and **three of them were in round 1's own
fixes**, which is the measured reason round 2 exists — and past two the
manufacture rate exceeds the value of the marginal finding.
**Round 1 — seven findings, and three were mine to own.**
**(a) The sweep failure, and it is R8's sharpest edge committed two commits after
writing it into `CLAUDE.md`.** This change set wrote *"the preparation allowance
is CAPPED and must be published as capped"* into `docs/07` and applied it to one
surface. Three restatements still carried the flat or uncapped form:
`/mediation/` shipped *"with the preparation time bundled into each one stated
rather than folded into the hours"* — the *"preparation included"* form the new
rule bars, **in different words, so grepping the barred strings could never reach
it** — and its second clause described a distinction the corrected card no longer
draws; `site.ts` quoted a `docs/07` sentence that Q58 had just deleted; and
**§9's Q15/Q16/Q17 row prescribed the flat form**, which is what a later
implementer building `/fees/` reads. All three corrected.
**(b) A derived fee term asserted as applied fact in the document this file calls
the authority on money.** *"The overtime rate begins after 3 h and 6 h of session
respectively"* is nowhere in Pouya's ruling, nowhere in the card, and nowhere in
Q15Q17's answer. Struck, and opened as **Q59**. `CLAUDE.md`'s rule for a fact we
do not have is a question, not an inference — and `/fees/` had just been declared
unblocked to publish from it.
**(c) The ruling struck less than the implementation did.** Pouya replaced
*"illustrative"* with a correct value; the clause saying the six are **not** the
authorised subject-matter list went with it, in both files. That would have
withdrawn the register's support from `/practice/cross-cultural/`'s shipped
*"commercial mediations and arbitrations"*, left deliberately on the recorded
ground that Q35(c)'s class is open. Restored, and the gate noted as not spent by
having been used six times.
The other four: `/for-parties/` measured the session cap *"in the room"* two
sentences after telling a party they may never be in the same room as the other
side — `docs/07` uses a format-neutral noun for exactly that reason and the page
had not carried it over; the cost answer dropped *"of preparation"* from its
second half, where the number collides with the new session figure; the page
stated a cap with no consequence, disclosing neither overtime nor the
additional-party fee; and **D19 — 40 comment lines in `src/` for 4 functional
lines**, roughly 13 of them pure revision history.
**Round 2 — five findings and one `consider`, and the sharpest was arithmetic.**
**⚠️ THE ARITHMETIC IN ROUND 1's OWN FIX WAS WRONG, AND WRONG IN THE DIRECTION
THAT UNDERSTATED THE THING IT EXISTED TO ESCALATE.** The Q59 note generalised the
full-day route as `500n + 1000` for all `n ≥ 3`. **The route is flat $4,000 until
hour 6**, so the formula was valid only from 6 h and the stated spread — *"$500
cheaper at every length"* — was wrong across the whole 36 h band. The real
spread is **$2,000 at three hours, narrowing to $500 from six on: up to four
times larger, and largest exactly where a half-day booking overruns.** The
document's own table contradicted the formula three lines above it. Pouya was
being asked to rule on whether the half/full step is a choice, on a number wrong
in the direction that makes it look like one. *A formula is an instrument, and a
measurement is a claim about your instrument.* The claim that the envelope
trigger is *"worse, not better"* was also half wrong: it is worse at six hours
and closes to **zero** from nine.
**And round 1's fix for the missing consequence supplied the very term Q59 says
must not be inferred.** Publishing *"Overtime is $500 an hour"* on a page that
now states an unambiguous *"up to 3 hours"* **defines the trigger by adjacency**
there is no other quantity on the page for the charge to attach to, and the
answer travels alone into the `FAQPage` node where no context follows it. Under
the envelope reading a fourth hour carries nothing, so the inference makes a
party **over-state their own exposure by $500**. Same shape as D20's `/med-arb/`
ADRIC gloss: no sentence false, the defect is adjacency. **The rate came off the
page.** It now names the charge without its rate and without its trigger, and
Q59's Blocks column — which had asserted the page *"publishable as it stands"*,
closing the question against the page before Pouya read it — now names
`/for-parties/` as blocked.
**Round-1 finding (a) recurred inside its own fix.** The half/full anomaly was
assigned to R5's 12-month review **twice** and written into neither place R5
lives: not into `docs/07` §Recorded dissent — the section whose stated purpose is
*"so the 12-month review has something to test against"* — and not into §12's R5
row. Both now carry it, with the corrected table.
Also: `/mediation/`'s swept sentence claimed a disclosure it did not make — *"each
including a capped amount of preparation time, stated in hours"*, under a heading
reading **"Published in full"**, with no hours anywhere on the page, and it leaked
`docs/07`'s internal publication rule onto a public page. It now states the hours,
interpolated. And the D19 fix **did not land**: 39 comment lines for 7 functional
lines, a net reduction of one, including a block in `/for-parties/` restating the
one three lines above it, and a comment calling the overtime and additional-party
figures **"§4-publishable"** when they are D14/`docs/07` and `docs/03`'s own new
checklist item says in terms that no §4 row reaches the rate card. Folded, trimmed,
and the authority corrected.
The `consider` was taken: *"hours of session"* is an undefined unit on the page
`docs/01` requires to carry no jargon, and the page defines its other term of art.
It now reads *"up to 3 hours of mediation, a full day up to 6 hours"* — ADR
Chambers' own noun, quoted in `docs/07`, and the elided unit restored.
**Nothing was declined.** All thirteen findings and the `consider` were applied.
### Two things found by running a check rather than reading a row
**§7's TypeScript hold named one gate and there are two.** R11's check at the
step 6 → 7 boundary: 13 of 14 pins current, TypeScript the only hold.
`npm view typescript-eslint peerDependencies` returns
`{ typescript: '>=4.8.4 <6.1.0' }`, **tighter** than `@astrojs/check`'s
`^5.0.0 || ^6.0.0` — so the recorded removal trigger, *"`@astrojs/check` widens
the range to include 7"*, was **unreachable**: widening it alone would not lift
the hold. And the pin is a caret, so a future 6.1.x would move the tree into a
peer-range breach on a plain `npm install`, with nothing in the repo saying so.
Nothing is breached today: `npm ls typescript` resolves **6.0.3**, the highest
stable 6.x. Both gates are now named and the trigger requires both.
**`struck-universal-q39` is enforced on `dist/` and has no §4 row.** The bar
lives only in `scripts/check-claims.mjs` and in Q39's §9 entry, so the rewritten
`docs/03` checklist has nothing to point at and **deliberately does not carry a
line for it** — writing the bar into the checklist is the exact failure mode the
rewrite was for. Surfaced to Pouya rather than fixed: which side it gets fixed on
is his call, and it gates nothing today, so it is a note and not a numbered
question (D19).
### Verified — commands run, exit statuses read, never through a pipe
```
npm run check exit 0 0 errors / 0 warnings / 0 hints (34 files)
npm run lint exit 0
npm run build exit 0 14 pages
npm run check:claims exit 0 11 patterns, self-test clean
npm audit exit 0 0 vulnerabilities
minifier tripwire exit 1 (clean — no `animation` shorthand beside a timeline)
```
Also measured on `dist/`, not asserted: **zero `.js` files and zero `client:*`
directives**, so every page renders in full with JavaScript disabled; one `<h1>`
per page across all 14; unique title (5060) and description (143160) on every
page; canonical, 10 Open Graph and 5 Twitter tags on every page; all JSON-LD
parses, and `/for-parties/`'s `FAQPage` answers are byte-identical to the visible
copy because both come from one array. **Five distinct dangling internal links**
`/contact/`, `/fees/`, `/insights/`, `/legal/privacy/`, `/legal/terms/` — all
pages on the build order not yet built, unchanged by this change set.
**Lighthouse: NOT RUN — tool unavailable.** `@lhci/cli` returns at step 7.
### The sweeps, with the commands and their output
```
$ git grep -n 'illustrative of breadth\|illustrative, not a closed' -- docs/ src/ AGENTS.md CLAUDE.md .claude/
AGENTS.md:1367:pages. The row now says the list is **illustrative of breadth, not a closed
docs/03-content-spec.md:105: "commercial", and this block called the list "illustrative of breadth, not a
```
`AGENTS.md:1367` is entry (ae) — append-only, correctly untouched. `docs/03:105`
is the labelled historical note that replaced the live instruction.
```
$ git grep -c 'TODO(pouya):' -- src/
(exit 1 — no matches)
$ awk '/^## Compliance checklist/,0' docs/03-content-spec.md | grep -c '^- \[ \]'
12 # HEAD: 12. Structural fix, not a coverage change.
```
⚠️ **And the sweep that mattered was the one round 1 caught me not running** — the
capped-form rule, swept by its **vocabulary** rather than by the barred strings,
because `/mediation/`'s breach used none of them.
---
## 2026-08-30 (af) — Build step 6: `/process/` and `/for-parties/`, the first step under D20 — and the frozen `check:claims` failed the build on compliant copy, which is the freeze working
**Two pages, 14 in `dist/` (was 12), zero JavaScript, one `<h1>` each, no skipped