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