Files
adr-sml/.claude/commands/build.md
T
Pouya LajevardiandClaude Opus 5 79b19a7bd0
Build and deploy / build-and-deploy (push) Failing after 5s
feat: build step 5 — /practice/ and six area pages; check:claims gates §4 in dist
Step 5 ships /practice/ and the six practice-area pages (construction,
technology, energy, insurance, shareholder, cross-border) from one route, and
adds the mechanical §4 gate Pouya ruled for.

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
2026-08-30 09:35:26 -04:00

162 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
description: The standing execution loop for this repo — plan, implement, adversarial review, resolve, verify, record. Use for every substantive change.
argument-hint: <what to build, e.g. "the /med-arb/ page" or "step 4 of the build order">
---
**ultrathink**
Task: $ARGUMENTS
Execute the six-phase loop below. Do not skip a phase because the task looks
small — the loop is the quality mechanism, not ceremony. If a phase genuinely
does not apply, say which and why before moving on.
---
## Phase 1 — Plan (think hard before writing anything)
1. Read `AGENTS.md` in full if you have not this session. Read **§12 Standing
Reminders** and surface anything live to Pouya before you start.
2. Read the specs in `docs/` that bear on this task.
3. Restate the task in your own words, and name:
- which locked decisions (D1D19) it touches
- which specs govern it
- which facts it needs from the §4 Verified register
4. **Stop and ask if you find a conflict** — between the task and a locked
decision, between two specs, or between the task and a fact you do not have.
A blocked build is a correct build. Never resolve a conflict by guessing, and
never soften a claim to make it defensible.
5. State your plan before implementing.
## Phase 2 — Implement
Follow `CLAUDE.md` conventions. Zero JavaScript by default. Tokens only, no raw
hex, no magic numbers. Semantic HTML. Every page gets its metadata.
Where you need a fact you do not have: `TODO(pouya): <the exact question>` in the
source **and** a new numbered question in `AGENTS.md` §9. Do not invent it.
**But do not open a numbered question for something that gates nothing — D19.**
The Q-series is past 50 and most recent additions gate nothing. If an observation
does not block a page, a deploy or a claim, it is a **Change Log note**, not a
numbered question — and retire the non-gating ones you find. A `TODO(pouya)` in
source is not this case: it blocks the page it sits on, so it still gets a
number.
## Phase 3 — Adversarial review (this is not optional)
Invoke **both** review agents on the change, in parallel:
- `adversarial-reviewer` — correctness, accessibility, crawlability,
performance, security, simplicity
- `claims-auditor` — every factual assertion traced to `AGENTS.md` §4
**Give them the diff and the specs. Do not give them your reasoning for why the
work is correct.** Your rationale anchors the reviewer and produces agreement
instead of review. They form their own view from the artefact; that independence
is the whole point of the phase.
### Scope — D19
Review is bounded. **In scope:** `dist/`, `src/`, the specs that direct copy
(`docs/01`, `03`, `04`, `07`), and `AGENTS.md` §3, §4, §7, §9, §12. **Out of
scope:** the Change Log, the agents' own briefs, `AGENTS.md` prose outside those
sections, and the historical accuracy of code comments. Both briefs carry the
same boundary — do not widen it in the prompt.
### The stop signal
**If a round's findings are predominantly about the record rather than the
output, stop the round and say so.** That is the symptom of the loop feeding on
itself, and noticing it is part of the job — not a licence to skip the phase.
The shape to watch for, from the session that produced D19: a Change Log sweep
that could not reproduce *because writing it changed the file it counted*.
If the change touches no user-facing copy, `claims-auditor` may be skipped — say
so explicitly.
## Phase 4 — Resolve
For every finding: **fix it, or decline it with a stated reason.** Silence is not
a response. A declined finding is recorded in the Change Log with the reasoning,
so a later reader can see the judgement was made rather than missed.
If you fix anything material, **re-run Phase 3 on the fix.** A patch written
under review pressure is exactly where the second defect lives.
> **This is not ceremony, and here is the measurement.** On the Astro 5 → 7
> upgrade (`AGENTS.md` entry (t), 2026-08-26) the second review pass returned
> six findings. **Four of the six were defects in the first round's own fixes** —
> including a date validator whose replacement silently rolled `2026-02-30`
> forward to `2026-03-02`, and a title rule whose fix rejected all five planned
> launch articles. None of the four existed before the review started. Skip the
> re-review and you ship the repair, not the bug.
### Two rounds is the cap — D19
Round 1 reviews the change. Round 2 reviews the material fixes. **There is no
round 3: fix what round 2 finds, and ship.**
The measurement above is why round 2 exists. The measurement below is why round 3
does not. On 2026-08-28 two rounds produced **48 findings, and most of round
two's were defects in round one's own fixes** — so each further round both finds
and manufactures defects, and past two the manufacture rate exceeds the value of
the marginal finding. Pouya's ruling. **State this reasoning when you stop at
two**, so a later reader does not read the cap as laxness.
## Phase 5 — Verify — run it, do not assert it
```bash
npm run check
npm run build
npm run check:claims
```
`check:claims` greps the built pages for the §4 Forbidden set — Pouya's ruling,
2026-08-29. **Every pattern it catches is a finding neither review agent has to
spend a pass on**, which is D19 served directly. It self-tests its own patterns
before it sweeps and refuses to run against an empty or stale `dist/`, so a pass
is a pass on the bytes that would ship. **A match is not yet a finding** — read
the context it prints. If a pattern is genuinely wrong, change it deliberately
with a Change Log entry; do not delete one to make a build pass.
Then, as applicable to what changed:
- Serve `dist/` and confirm the page **renders its full content with JavaScript
disabled** — the failure this whole project exists to fix
- `curl` the built HTML and confirm real content, not a shell
- ~~Lighthouse mobile ≥ 95 on all four categories~~ — **UNAVAILABLE.**
`@lhci/cli` was removed on 2026-08-26 and is not re-added until build step 7
(`AGENTS.md` R11, §7). Report it as *not run, tool unavailable*. Do not
substitute a manual DevTools run and describe it as the same check
- Every internal link resolves
- Metadata present: unique title, description, canonical, OG, JSON-LD
- **No scroll-driven animation was eaten by the minifier.** This must return
nothing:
```bash
grep -rE 'animation:[^;}]*(scroll\(\)|view\(\))' dist --include='*.css'
```
A hit means an `animation` shorthand was written beside `animation-timeline`
and Lightning CSS folded them into an invalid declaration, which the parser
then discards. The effect works in `npm run dev` and is dead in the build.
**Never report a check as passing that you did not run.** "Should pass" is not a
result. If you could not run something, say which and why.
## Phase 6 — Record
Append a `AGENTS.md` Change Log entry, newest first: what changed, old → new,
why, and any decision or plan — including declined findings and anything
deferred. Update Current Truth in place where the change made a section stale.
Re-stamp facts you re-checked with today's date.
**If the entry claims a change was applied across files, cite the command and
paste its output.** Write that claim only after reading the output. Recall is
not evidence — three entries on this project asserted a completed sweep and
instances survived all three.
Then report to Pouya: what shipped, what the review found, what you declined and
why, and what remains open.