feat: D20 moves the claims pass to cutover; rule Q56 unscoped; close Q55; freeze check:claims
Four rulings from Pouya, 2026-08-30, and their sweep. D20 — the review protocol. Per build step the review is `adversarial-reviewer` alone. `claims-auditor` no longer runs per step; it runs ONCE, at cutover, over the whole finished site, as a blocking item near the top of docs/06's checklist. `check:claims` is unchanged and still runs on every build and both deploy paths. The reasoning is recorded in full in AGENTS.md D20, as a calibration and not an erosion: nothing has shipped, so every claims finding so far has been about a page no visitor can reach, and one pass over twenty finished pages catches more than nine passes over drafts because it sees the site as a reader does. The /med-arb/ ADRIC gloss is the proof — no individual claim was false, the defect was adjacency, and adjacency does not exist until the pages sit next to each other. The code reviewer stays per step because what it catches compounds. What this costs is recorded honestly beside it, not summarised away. D17 and D19 amended to match. D19's two-round cap governs the per-step code review only; the single cutover claims pass runs until its findings are resolved, because there is no second pass behind it. Q56 — mediation is NOT scoped commercial. Thirteen shipped strings corrected across five files: page titles, meta descriptions, hero ledes, section ledes, the `Service` node's name and description, and `ProfessionalService`'s. §4's mediation row stays unscoped, and the reason now sits beside both rows so the asymmetry reads as designed: arbitration is scoped commercial because of a LEGAL GATE (Q39 — family arbitration in Ontario requires prescribed training); mediation has no such gate. `adversarial-reviewer` then found three surfaces the sweep had missed, the worst on /practice/ — "These describe the process the parties are choosing between, in commercial matters" scoped mediation with the two words never appearing in the same element, so no proximity grep reached it. Q55 — CLOSED WITHOUT BEING RESOLVED, and the difference is the ruling. The Q.Arb stamp is split: `[verified]` on the status, `[Pouya's stated basis]` on the date. The 2026-08-26 record is marked UNRECONCILED, permanently and on purpose. The date is not published and nothing depends on it. check:claims — FROZEN. Round 2 found five defects in round 1's own fixes to that script, two of which made it worse than before the pattern existed. A pattern is added only after a real breach reaches dist/, never speculatively, and each addition ships with a probe plus a negative fixture. No refactors, no coverage improvements. It is a tripwire, not a program. Two conventions into CLAUDE.md: sweep the VOCABULARY, not only the subject (`git grep 'Q.Arb'` is line-anchored and could not find ten lines entirely about Q.Arb that never name it); and agent definitions load at session start, so an edit to .claude/agents/*.md does not reach the session that made it. Verified: check 0 errors, lint 0, build 0 (12 pages), check:claims 0. Lighthouse not run — tool unavailable until build step 7. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
co-authored by
Claude Opus 5
parent
610edc24fd
commit
2ea4c0f8ac
@@ -213,7 +213,11 @@ to an appointment. This page carries the verifiable record.
|
||||
**Job:** convert counsel who have already decided on mediation and are choosing a
|
||||
neutral.
|
||||
**Search intent:** `commercial mediator Toronto`, `ADRIC mediation rules`,
|
||||
`what happens at mediation Ontario`.
|
||||
`what happens at mediation Ontario`. **These are queries, not the page's scope —
|
||||
Q56, 2026-08-30.** The mediation offering is **not** scoped commercial (§4's row
|
||||
is unscoped; the arbitration scope is a legal gate and does not transfer). Do not
|
||||
read the first query back into the `<title>` or the copy, which is where
|
||||
*"Commercial Mediation"* came from in the first place.
|
||||
|
||||
1. What the service is; the neutral's role stated plainly.
|
||||
2. **Formats:** full-day, half-day, shuttle, remote, hybrid.
|
||||
|
||||
@@ -92,6 +92,38 @@ detect padding instantly and discount everything after it.
|
||||
scoped; found by `claims-auditor` on re-audit, one file over from the same
|
||||
defect fixed in `docs/04` earlier the same day.
|
||||
|
||||
⚠️ **AND THE MEDIATION HALF IS THE OPPOSITE — Q56, ruled by Pouya 2026-08-30.
|
||||
DO NOT MIRROR THIS SCOPE ONTO MEDIATION.** The scope above exists because of a
|
||||
**legal gate**: family arbitration in Ontario requires prescribed training, so
|
||||
"in commercial matters" is load-bearing there. **Mediation has no such gate,
|
||||
§4's mediation row is unscoped on purpose.** Pouya's list of what he mediates
|
||||
— *"commercial, construction, insurance/SABS, shareholder and cross-cultural
|
||||
matters"* — is **illustrative of breadth, not a closed set**: the site
|
||||
publishes **six** areas and every one of them offers mediation
|
||||
(`src/data/practice-pages.ts`), technology and energy included. Do not read it
|
||||
as the authorised subject-matter list; §4's Q35 gate governs that.
|
||||
|
||||
The site-wide *"Commercial Mediation"* framing was **under-describing the
|
||||
offering**, and it was corrected rather than ratified as positioning. The
|
||||
asymmetry between the two halves is designed; a later editor tidying them into
|
||||
a matching pair would be reintroducing the defect.
|
||||
|
||||
⚠️ **AND DO NOT TREAT ANY LIST OF THE CORRECTED SURFACES AS COMPLETE.** Q56
|
||||
named four. The sweep that implemented it changed **thirteen shipped strings
|
||||
across five files**, and `adversarial-reviewer` then found **three more it had
|
||||
missed** — the worst on `/practice/`, where *"These describe the process the
|
||||
parties are choosing between, in commercial matters"* scoped mediation with
|
||||
the two words never appearing in the same element, so no proximity grep could
|
||||
reach it. The command, and its limit:
|
||||
|
||||
```
|
||||
git grep -nEi 'commercial[^.]{0,60}mediat|mediat[^.]{0,60}commercial' -- src/
|
||||
```
|
||||
|
||||
That finds the **adjacent** form only. For the split form there is no pattern —
|
||||
read every occurrence of `commercial` in `src/` and in `dist/`, and ask what
|
||||
each one is scoping.
|
||||
|
||||
⚠️ **TEN LINES WERE DELETED HERE ON 2026-08-30, AND THE DELETION IS THE
|
||||
POINT.** They read *"'Pathway', never 'designation'"*, cited the **struck**
|
||||
Forbidden row as live, instructed that *"the limit being named is the stage of
|
||||
|
||||
+18
-1
@@ -342,7 +342,24 @@ Then invalidate `/*`.
|
||||
## Cutover checklist — D11 is a single shot, so run all of it
|
||||
|
||||
**Content and compliance**
|
||||
- [ ] Every claim traced to `AGENTS.md` §4 Verified
|
||||
|
||||
> ⚠️ **THE FIRST TWO ITEMS ARE THE PROJECT'S ONLY FULL CLAIMS PASS — D20, Pouya,
|
||||
> 2026-08-30.** `claims-auditor` no longer runs per build step; `/build` Phase 3
|
||||
> is `adversarial-reviewer` alone. Everything the register is meant to prevent
|
||||
> therefore lands here. `AGENTS.md` D20 records both the reasoning and what
|
||||
> deferring it costs — read it before treating either item as a formality, and do
|
||||
> not tick one because `npm run check:claims` is green. That script is a greppable
|
||||
> tripwire; it cannot read a page.
|
||||
|
||||
- [ ] **`claims-auditor` run over EVERY page in `dist/`, findings resolved.**
|
||||
**This is the project's only full claims pass. Nothing publishes until it
|
||||
is clean.** Not per-page in isolation — the pass exists here because the
|
||||
defects worth catching late are the ones that only exist once the pages sit
|
||||
next to each other. Give it the whole built site and the reading order a
|
||||
visitor takes.
|
||||
- [ ] **Pouya has read every page against `AGENTS.md` §4.** The human pass. It is
|
||||
the other half of D20 and it is not delegable — his reading is what the
|
||||
per-step audit was traded for.
|
||||
- [ ] **Memberships RE-CONFIRMED AGAIN, on the day of cutover** — `AGENTS.md`
|
||||
§12 **R10**, which is now an **event trigger and cutover is one of its two
|
||||
events.** Q44 closed 2026-08-28 and the group is published on `/about/`
|
||||
|
||||
@@ -14,9 +14,9 @@ it does not need restating in every prompt.
|
||||
|
||||
That single command runs: plan → implement → adversarial review → resolve →
|
||||
verify → record. It requests deep reasoning, reads `AGENTS.md` and the specs,
|
||||
stops if the task conflicts with a locked decision, invokes two independent
|
||||
reviewers on the finished diff, resolves what they find, runs the checks, and
|
||||
appends the Change Log entry.
|
||||
stops if the task conflicts with a locked decision, invokes `adversarial-reviewer`
|
||||
on the finished diff, resolves what it finds, runs the checks, and appends the
|
||||
Change Log entry.
|
||||
|
||||
You do not need to ask for thinking, for review, or for the record to be updated.
|
||||
Those are the agreement, not the request.
|
||||
@@ -26,29 +26,53 @@ Those are the agreement, not the request.
|
||||
| Command | Does |
|
||||
|---|---|
|
||||
| `/build <task>` | The full loop. Use for every substantive change |
|
||||
| `/review [scope]` | The review pass alone, on the working tree or a named scope. Reports; fixes nothing without your say-so |
|
||||
| `/review [scope]` | The **code** review alone, on the working tree or a named scope. Reports; fixes nothing without your say-so. Under D20 it does not run the claims pass |
|
||||
| `/wrap` | End of session — updates `AGENTS.md` under its constitution and leaves the tree clean |
|
||||
|
||||
## The two reviewers
|
||||
## The two reviewers, and when each of them runs — D20
|
||||
|
||||
Both are defined in `.claude/agents/` and run in parallel on the diff.
|
||||
Both are defined in `.claude/agents/`. **They no longer run together.**
|
||||
|
||||
**`adversarial-reviewer`** reads the code: correctness and edge cases,
|
||||
accessibility, crawlability, performance budgets, security, and whether a
|
||||
materially simpler correct version exists.
|
||||
**`adversarial-reviewer` runs on every build step.** It reads the code:
|
||||
correctness and edge cases, accessibility, crawlability, performance budgets,
|
||||
security, and whether a materially simpler correct version exists.
|
||||
|
||||
**`claims-auditor`** reads the copy against `AGENTS.md` §4 and nothing else. It
|
||||
extracts every factual assertion — credentials, roles, numbers, languages,
|
||||
locations, capabilities, and the JSON-LD — and traces each to the Verified table.
|
||||
Anything untraceable is reported and does not ship.
|
||||
**`claims-auditor` runs once, at cutover, over the whole finished site.** It reads
|
||||
the copy against `AGENTS.md` §4 and nothing else — extracting every factual
|
||||
assertion (credentials, roles, numbers, languages, locations, capabilities, and
|
||||
the JSON-LD) and tracing each to the Verified table. Anything untraceable is
|
||||
reported and does not ship. `docs/06`'s cutover checklist carries it as a blocking
|
||||
item, alongside your own read of every page against §4.
|
||||
|
||||
It is a separate agent on purpose. A general-purpose reviewer will happily
|
||||
approve elegant code containing a claim that should never have been published,
|
||||
because professional-conduct compliance is not what it is looking at. On this
|
||||
project that is the highest-stakes failure mode, so it gets its own pass.
|
||||
project that is the highest-stakes failure mode, so it keeps its own pass.
|
||||
|
||||
**Verifying they are loaded.** `.claude/agents/` is the correct location. To
|
||||
confirm the agents are live, invoke one directly:
|
||||
### Why the claims pass moved, and what it costs
|
||||
|
||||
Your ruling, 2026-08-30. `AGENTS.md` D20 carries it in full; the short form:
|
||||
|
||||
- **Nothing has shipped.** Every claims finding to date has been about a page no
|
||||
visitor can reach. The risk is deferred to cutover whether or not the audit is.
|
||||
- **One pass over twenty finished pages catches more than nine over drafts**,
|
||||
because it reads the site as a visitor does. The `/med-arb/` ADRIC gloss is the
|
||||
proof: no individual claim was false, the defect was **adjacency**, and
|
||||
adjacency does not exist until the pages sit next to each other.
|
||||
- **The code reviewer stays per step because what it catches compounds.** An
|
||||
accessibility or crawlability defect propagates into the next page built on it.
|
||||
A claims defect does not compound; it sits there until someone reads it.
|
||||
|
||||
**What it costs, stated rather than glossed:** a claims defect can now live in an
|
||||
unpublished draft for weeks. Two things carry that risk in the meantime, and
|
||||
neither is a substitute for the cutover pass — **`npm run check:claims`**, which
|
||||
is unchanged and runs on every build and both deploy paths, and **you reading the
|
||||
copy as it is built.**
|
||||
|
||||
## Verifying the agents are loaded
|
||||
|
||||
**`.claude/agents/` is the correct location.** To confirm the agents are live,
|
||||
invoke one directly:
|
||||
|
||||
```
|
||||
Use the claims-auditor agent to audit README.md against AGENTS.md §4.
|
||||
@@ -57,20 +81,29 @@ Use the claims-auditor agent to audit README.md against AGENTS.md §4.
|
||||
A verdict table back means both are wired. "No such agent" means the frontmatter
|
||||
needs looking at.
|
||||
|
||||
**Agent definitions load at session start.** An edit to `.claude/agents/*.md`
|
||||
does not reach a running session — the version in force is the one that was on
|
||||
disk when the session began. So after changing a brief, restart before relying on
|
||||
it, and **say in the report which version actually ran.** This is not theoretical:
|
||||
the gloss lens was added to `claims-auditor` on 2026-08-30 and the agent
|
||||
reconstructed it from the Change Log rather than having it in its brief, because
|
||||
the edit and the run were in the same session.
|
||||
|
||||
**Both are instructed to treat uncertainty as a defect.** They will sometimes be
|
||||
wrong. That is the intended trade: explaining why a finding is mistaken costs
|
||||
minutes, and a missed defect on this project's public marketing pages
|
||||
costs a great deal more.
|
||||
costs a great deal more. **This weighs heavier on the cutover pass, not lighter**
|
||||
— there is nothing behind it, so D19's two-round cap does not apply there.
|
||||
|
||||
## The rule that makes it work
|
||||
|
||||
**The reviewers are given the diff and the specs — never the implementer's
|
||||
**A reviewer is given the diff and the specs — never the implementer's
|
||||
explanation of why the work is correct.**
|
||||
|
||||
A rationale anchors the reviewer. Told why something is right, a reviewer looks
|
||||
for confirmation and finds it; given only the artefact, it forms an independent
|
||||
view. That independence is the entire mechanism. Every other detail of this
|
||||
protocol is adjustable. This one is not.
|
||||
protocol is adjustable — D20 just adjusted one of them. This one is not.
|
||||
|
||||
---
|
||||
|
||||
@@ -135,3 +168,7 @@ see that judgement was exercised rather than the finding missed.
|
||||
**A check reported as passing that was not run.** "Should pass" is not a result.
|
||||
If a build, a Lighthouse run, or a JavaScript-disabled render was not actually
|
||||
executed, it must say so.
|
||||
|
||||
**A report that says "reviewed" without naming which agent ran.** Under D20 a
|
||||
build step gets `adversarial-reviewer` and not the claims pass; "reviewed" reads
|
||||
as both. The report must name the one that ran.
|
||||
|
||||
Reference in New Issue
Block a user