feat: eyebrow 14px and one small-text floor; fix a site-wide reflow defect; stamp TTL; §4 bars the struck universal
Pouya's five rulings of 2026-08-31, after 64bce10. One commit, because AGENTS.md
entry (aj) covers all five and the review fixes interleave across them —
recorded here rather than left to be inferred.
1. THE EYEBROW, 13 -> 14px, at the one token definition. `--text-eyebrow` is
deliberately NOT an alias of `--text-sm` despite sharing its value: the two move
for different reasons, and aliasing would mean a change to body-meta type
silently moving every eyebrow. Sweep by rendering, 22 pages x 2 widths, 801 mono
instances: 441 carry `.eyebrow`, 420 now at 14px, 21 held at 11px. Zero of 801
below 4.5:1.
Header check, which Pouya asked for explicitly: nothing header-side consumes the
token, `--header-h` is 81px, and the sticky header measures exactly 81.00px at
every width from 66rem up with the CTA on `.header-inner`'s content edge. Nothing
overflowed, so nothing was improvised.
2. /contact/'s LABELS RAISED, AND THE FLOOR CLAIM REWRITTEN BECAUSE THE RULING'S
PREMISE WAS FALSE. The ruling asked docs/02 to record the tagline as "the ONLY
sub-14px text on the site". It is not: the `--text-xs` 12px rung has ten
declaration sites and 130 elements rendering at 12px. So docs/02 records the
claim that IS verified — `--text-2xs` has one consumer in the repository — and
enumerates the 12px rung as a separate treatment. Writing a false claim into the
spec because the conclusion was handed down is the move the rules forbid.
A third block moved that the ruling did not name: /bio/'s ten <h2>s and its strap
were copies of five of `.eyebrow`'s six declarations at 11px — the same escape the
footer headings were. docs/02 justified holding them by the one-page PDF
constraint; measured, `@media print` sets both to 7pt, so the screen size never
reached the PDF and that was never the reason.
Consolidating them DID change the printed sheet, because the missing sixth
declaration was `font-weight`: 500 grew the PDF 89,496 -> 91,151 bytes. Print
therefore freezes 400, the committed PDF stays byte-identical (10 differing
bytes, all /CreationDate and /ModDate), and unifying is Pouya's call.
3. THE REFLOW DEFECT WAS SITE-WIDE AND /bio/ WAS NOT THE BINDING CAUSE.
`white-space: nowrap` on `SiteHeader .brand-name` held all 22 pages 63px over at
320px/root 32. Eight cause-specific fixes, no `overflow-x` anywhere; all eight
produce byte-identical geometry at root 16. `Pill` is marked in docs/02 as the
backstop it is — the real cause was `PracticeCard`'s rem-based padding, and with
it clamped "Construction" goes from 94x220 in six two-character lines to 158x85 in
two.
Three instrument findings now in docs/02, each of which hid a real defect:
`break-word` does not reduce min-content and `anywhere` does;
`getBoundingClientRect()` reports border boxes, so an element sweep cannot see
text spilling outside its own box; and `mobile: true` emulation expands the
layout viewport, so `scrollWidth - innerWidth` reads 0 while the reader still
scrolls sideways.
4. TTL STAMPED `ENABLED` in §7, with `DISABLED` at first verification recorded
rather than overwritten. Q60 narrowed to its second half and OPEN: no record has
been watched to vanish, and `ENABLED` proves the setting, not the behaviour.
R19's sweep found three stale copies outside §7; all now defer to it. R19 itself
was not edited — it points at §7 rather than carrying state, which is the
property that made it work.
5. §4 GAINS THE STRUCK-UNIVERSAL ROW, citing the committed ontario.ca extract and
cross-referenced to `check:claims`'s `struck-universal-q39`. It bars the claim in
BOTH directions: the commercial half is Pouya's attributed position, not a
verified fact. The row immediately caught two places asserting it flatly —
`SiteHeader.astro` and §9 Q33 — both now attributed. `check:claims` unmodified;
still frozen.
REVIEW: adversarial-reviewer, two rounds, 16 findings, ALL ACCEPTED, NONE
DECLINED. claims-auditor did not run (D20). Eight of round 2's ten were defects
in round 1's own fixes.
Round 1's blocking finding was a defect in my own record: I wrote that every
reflow residual was zero at "root 16 and root 32, 286 measurements". Two ways of
simulating 200% text are NOT equivalent, because media-query `rem` resolves
against the DEFAULT font size, not the root element's. Under the method docs/02
itself prescribes the site is 944px over on 21 pages and 508px on / at 1280, and
304px at 1920 — nav clipped mid-word, Practice/Fees/Contact and the CTA
off-screen, WCAG 1.4.4 with loss of functionality. My 286 excluded exactly the
widths where the defect lives.
NOT FIXED, DELIBERATELY: the cause is `flex-wrap: nowrap` on `.nav-list` above
66rem, a locked step-1 decision, and the standing instruction is to stop and
report rather than improvise a header change. It is now a blocking item on
docs/06's cutover checklist, ticked only by ruling on it — "not by re-measuring
it with the method that reports zero".
Round 2 also caught: a 63,743-byte figure that was the `cmp -l` differing-byte
count rather than the 1,655-byte size delta; a lost-navigation list naming
Med-Arb, which is not in the masthead at any width, while omitting Contact; the
tagline's justification left recorded at 13px, where one clause of it is false at
14px (20px of document overflow at 1216 with a seventh nav item); my own label
raise reintroducing a 38px element overflow at the width just ruled on; two
copies of the eyebrow treatment left at weight 400; three stale residual tables;
and the min-content explanation duplicated six times in src/.
VERIFIED, exit statuses read directly, never through a pipe: build 0 (22 pages),
check 0 (0 errors/0 warnings/0 hints), check:claims 0, og:proof 0, check:intake 0,
lint 0, minifier tripwire clean, TODO in dist 0 with a source sanity check.
Overflow: 374 measurements over 22 pages, every one zero, row counts asserted
before reading, with positive controls (119px at width 200, 319px at root 64).
Lighthouse 0, run three times with identical category scores: perf 99 on / and
100 elsewhere, a11y 100, best practices 100, SEO 100 on all indexable pages,
CLS 0.000. / sits at LCP 2.03s against a 2.0s budget, unchanged by this work.
The zsh `$VAR` word-split trap fired twice more and both times read as a clean
pass; caught only by asserting row counts first. Two of my own instruments were
wrong before they were right: a `grep -F '0.875rem'` state check that could never
match because Lightning CSS writes `.875rem`, and a probe whose inline
`!important` was outranked by a running CSS transition.
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
64bce105f8
commit
0f7595b602
@@ -652,6 +652,7 @@ cannot vouch for.
|
||||
| The word **"lawyer"** used of Pouya; "called to the bar"; "licensed"; "my law practice"; "my litigation practice"; any post-nominal implying a licence | D13. The site asserts the JD and nothing further |
|
||||
| Any phrasing that *implies* entitlement to practise law without saying so — "acts for clients", "represents parties", "my clients", "legal advice" | Same rule. Implication is the risk, not just the word. Describe the role factually instead: *Director of Firm Operations at a Toronto litigation and ADR boutique*, and the matter types worked on |
|
||||
| **Q.Arb described as commenced, in progress, a pathway, or not yet held** | **It is HELD** `[verified 2026-08-29 — Pouya]`. Publish `Q.Arb (ADRIC / ADRIO)`. **The acquisition date is recorded in §4 and is NOT published** — and it is itself contradicted on the record and deliberately left that way (Q55, closed unresolved 2026-08-30). `npm run check:claims` `q-arb-as-a-stage` enforces the stage words and a date near the designation, on `dist/` |
|
||||
| **"Anyone may be appointed an arbitrator in Ontario"; "nothing in law gates the role"; "no licence / designation is required to arbitrate" — and every paraphrase of that universal** | ⚠️ **THE UNIVERSAL IS FALSE, IT WAS IN THIS REGISTER FOR A DAY, AND IT REACHED A PUBLIC PAGE ONCE. Ruled a Forbidden row by Pouya, 2026-08-31.** Q39: this register carried *"Anyone may be appointed an arbitrator in Ontario. Nothing in law gates the role behind a designation"* and reasoned from it. Pouya checked the counter-example rather than defending it — *"My assertion was FALSE as a universal"* — and the source is committed at **`docs/reference/ontario-family-arbitration-training.md`** (`https://www.ontario.ca/page/training-family-arbitrators`, retrieved **2026-08-27**, per R14: the extract is in the repository so a reviewer can check the claim rather than trust it). That page states prescribed training for Ontario **family** arbitrators — 14 hours on screening for domestic violence and power imbalances, 30 hours of Ontario family law for arbitrators who are not members of a Canadian bar, and 10 hours over any two-year period ongoing. ⚠️ **THE SCOPED REPLACEMENT IS COMMERCIAL ARBITRATION AND IT IS POUYA'S ATTRIBUTED POSITION, NOT A VERIFIED FACT.** The source establishes the family half **directly** and the commercial half only by **absence** — a page about family arbitrators is not authority for what commercial arbitrators need — so §4 Offerings records the commercial half attributed to him and deliberately unstamped. **This row therefore bars the claim in BOTH directions:** do not publish the no-gate universal, and do not publish its converse either. This repository does not conclude a proposition of law. **Enforced mechanically as `struck-universal-q39` in `scripts/check-claims.mjs`**, which is where the bar lived alone — with no §4 row and no checklist line — from 2026-08-29 until this row existed; that gap was surfaced to Pouya in build step 10 and this is the side he fixed it on. Nothing on the site turns on the gated activity: he has confirmed he does not accept family arbitration under the *Family Law Act* (§4 Offerings, scope exclusion). **Swept four times before it was caught; recall is not evidence** `[verified 2026-08-27 — ontario.ca, committed extract]` |
|
||||
| ~~Q.Arb described as held, imminent, or "nearly complete"~~ | **STRUCK 2026-08-29 — Q.ARB IS HELD.** This row was correct from 2026-08-26 to 2026-08-29 and is now exactly backwards. **What replaces it is the opposite bar:** Q.Arb described as *commenced*, *in progress*, *a pathway*, or *not yet held* — see the Verified row. The publishable form is `Q.Arb (ADRIC / ADRIO)`; the acquisition date is recorded in §4 and is **not** published |
|
||||
|
||||
### The substitution principle
|
||||
@@ -721,7 +722,7 @@ the audience it targets. Revisit at month 12–18. `[verified 2026-08-25 — dec
|
||||
| ACM certificate | `arn:aws:acm:us-east-1:327082975128:certificate/2b6d5bdf-6790-430c-9b82-c00ab66e6d87` — ISSUED `[verified 2026-08-26]` |
|
||||
| Intake API | `adr-intake-api`, HTTP API `4tl0m5igkj`, endpoint `https://4tl0m5igkj.execute-api.ca-central-1.amazonaws.com` `[verified 2026-08-26]` |
|
||||
| Intake Lambda | `adr-intake-handler`, `nodejs24.x` `[verified 2026-08-26]` |
|
||||
| Intake table | `adr-intake-submissions` (DynamoDB, ca-central-1) `[verified 2026-08-26]`. ⚠️ **TTL WAS `DISABLED` AT FIRST VERIFICATION — Pouya ran `describe-time-to-live` on 2026-08-31 and it returned `DISABLED`.** `/legal/privacy/` has stated since build step 10 that a record is *"deleted automatically by the database rather than by someone remembering to do it"* after 24 months, so **that promise was unbacked from the moment it was written, and it stays unbacked in this record until a test record is confirmed deleted** — the handler wrote the attribute and nothing on the table consumed it. This is the Q22 shape on a public privacy commitment rather than on a deploy control: a documented mechanism that did not exist. **Pouya initiated enabling the same day with `AttributeName=ttl`** ``[assumed — initiated 2026-08-31 on his report; the status was NOT re-read to this record, and DynamoDB reports `ENABLING` for a period before it settles]``**, which is the attribute the handler writes** — `backend/intake/handler.mjs` writes `ttl` as a Number in **epoch seconds** at **24 months** (`RETENTION_MONTHS = 24`, added to `getUTCMonth()`), matching `docs/05` §Retention and the `ttl` row of its item table `[verified 2026-08-31 — read from the handler, not recalled]`. ⚠️ **`ENABLED` IS NOT YET STAMPED HERE, DELIBERATELY.** Enabling was initiated, not confirmed to this record, and DynamoDB reports `ENABLING` for a period before it settles — so the status must be re-run and stamped. **And `ENABLED` would prove the setting, not the behaviour:** `docs/06`'s cutover item requires a test record written with a near-future `ttl` and confirmed to disappear, and it is not ticked by reading this row or the handler code |
|
||||
| Intake table | `adr-intake-submissions` (DynamoDB, ca-central-1) `[verified 2026-08-26]`. **TTL IS `ENABLED`, `AttributeName: ttl`** ``[verified 2026-08-31 — Pouya ran `describe-time-to-live` and read `TimeToLiveStatus: ENABLED`]``. The handler side matches: `backend/intake/handler.mjs` writes `ttl` as a Number in **epoch seconds** at **24 months** (`RETENTION_MONTHS = 24`, added to `getUTCMonth()`), which is `docs/05` §Retention and the `ttl` row of its item table `[verified 2026-08-31 — read from the handler, not recalled]`. ⚠️ **IT WAS `DISABLED` AT FIRST VERIFICATION EARLIER THE SAME DAY, AND THAT IS RECORDED RATHER THAN OVERWRITTEN.** Pouya ran `describe-time-to-live` on **2026-08-31** and it returned `DISABLED`; he enabled it on **2026-08-31** and re-read `ENABLED` the same day. `/legal/privacy/` has stated since build step 10 that a record is *"deleted automatically by the database rather than by someone remembering to do it"* after 24 months, so **that promise was unbacked from the day it was written until the day it was enabled** — the handler wrote the attribute and nothing on the table consumed it. This is the Q22 shape on a public privacy commitment rather than on a deploy control: a documented mechanism that did not exist. ⚠️ **`ENABLED` PROVES THE SETTING, NOT THE BEHAVIOUR, AND THE BEHAVIOUR IS STILL UNPROVEN — §9 Q60 STAYS OPEN.** No record has been written with a near-future `ttl` and watched to disappear. `docs/06`'s cutover checklist carries that test as a blocking item, it is not ticked by reading this row or the handler code, and §12 R19 keeps it surfacing until a deletion has actually been observed |
|
||||
| SES identities | Domain `smlcompany.ca` **verified for sending** `[verified 2026-08-26]`; addresses `info@`, `intake@`, `adr@` |
|
||||
| SES account | **Production access GRANTED** — out of the sandbox in `ca-central-1`, confirmed by AWS in writing and effective immediately `[verified 2026-08-26 — Q19 closed]`. Mail now reaches unverified recipients, so the inquirer confirmation in D18 works |
|
||||
| Mail hosting | **Google Workspace** — MX `1 smtp.google.com`; `google._domainkey` present, so Google DKIM is configured `[verified 2026-08-26 — DNS query]` |
|
||||
@@ -772,7 +773,7 @@ Nothing below can be invented. Each needs an answer from Pouya.
|
||||
|
||||
| # | Question | Blocks |
|
||||
|---|---|---|
|
||||
| **Q60** | ⚠️ **IS DYNAMODB TTL `ENABLED` ON THE INTAKE TABLE, AND HAS A TEST RECORD BEEN OBSERVED TO DISAPPEAR?** Two halves, and neither substitutes for the other. `/legal/privacy/` does not merely publish a retention *period* — it asserts a **mechanism**: *"the record is deleted automatically by the database rather than by someone remembering to do it"*. `describe-time-to-live` returned **`DISABLED`** when Pouya first ran it (2026-08-31; §7 holds the status and its stamp), so the mechanism was not running from the day that sentence was written. **The handler's side is already verified and is not what is being asked** — it writes `ttl` as a Number in epoch seconds at 24 months, which is the attribute name being enabled; writing the attribute is not the mechanism. **Do not answer this from the handler code, and do not answer it from `ENABLED` alone:** `ENABLED` proves the setting, and only a record written with a near-future `ttl` and watched to vanish proves the behaviour. `TODO(pouya)` sits on the retention section of `src/pages/legal/privacy.astro`; `docs/06`'s cutover checklist carries both halves; §12 R19 keeps it surfacing. **Why this is a numbered question and not only a checklist line:** `CLAUDE.md` requires a `TODO(pouya)` plus a §9 row when a page needs a fact the repository does not have, and this page needs one — a cutover checklist fires once, at cutover, and §9 is what a person editing this page reads. Raised by `adversarial-reviewer` round 2, 2026-08-31 | **`/legal/privacy/` going public.** Nothing else — no other page states the mechanism, verified by sweeping `dist/` for the retention vocabulary and reading each hit in context |
|
||||
| **Q60** | ⚠️ **HAS A TEST RECORD BEEN OBSERVED TO DISAPPEAR FROM THE INTAKE TABLE?** **Half one closed 2026-08-31: TTL is `ENABLED` with `AttributeName: ttl`, verified by command — §7 holds that status and this row does not restate it.** The question is now the second half alone, and it was never the smaller half. `/legal/privacy/` does not merely publish a retention *period* — it asserts a **mechanism**: *"the record is deleted automatically by the database rather than by someone remembering to do it"*. **`ENABLED` proves the setting; only a record written with a near-future `ttl` and watched to vanish proves the behaviour.** Two things this may NOT be answered from: the handler code, which writes the attribute and nothing more (that side is verified and is not what is being asked); and the table setting, which is what was just confirmed. ⚠️ **AND THE FIRST HALF IS THE REASON TO TRUST THE SECOND LESS, NOT MORE:** `describe-time-to-live` returned **`DISABLED`** when Pouya first ran it on 2026-08-31, so the sentence above was published against a mechanism that was not running, and nothing in the repo, the build or AWS reported it. A setting that was off for as long as nobody looked is not evidence that the behaviour now works. `TODO(pouya)` sits on the retention section of `src/pages/legal/privacy.astro`; `docs/06`'s cutover checklist carries the test as blocking; §12 R19 keeps it surfacing. **Why this is a numbered question and not only a checklist line:** `CLAUDE.md` requires a `TODO(pouya)` plus a §9 row when a page needs a fact the repository does not have, and this page needs one — a cutover checklist fires once, at cutover, and §9 is what a person editing this page reads. Raised by `adversarial-reviewer` round 2, 2026-08-31 | **`/legal/privacy/` going public.** Nothing else — no other page states the mechanism, verified by sweeping `dist/` for the retention vocabulary and reading each hit in context |
|
||||
| ~~Q59~~ | ✅ **RULED AND CLOSED 2026-08-31 — Pouya. OVERTIME RUNS FROM THE SESSION CAP**: the fourth hour of a half day, the seventh of a full day. Not the billed envelope. `/fees/` shipped at build step 9 on this ruling and `docs/07` carries it in full. ⚠️ **THIS ROW NAMED A CONSTANT THAT NO LONGER EXISTS** — `FEES.mediation.overtimeStartsAfterSessionHours` was deleted the same day as dead data: nothing read it, so reversing it would have changed nothing and failed nothing, which is Q22's shape at constant scope. **Where the ruling actually lives:** the trigger is rendered on `/fees/` from `halfDay.hours` / `fullDay.hours`, and `FEES.mediation.reservation` carries the half that publishes as prose. Found by `adversarial-reviewer` round 2 — §9 is what a later implementer reads to find where a ruling is recorded, so pointing it at a deleted identifier is the same defect one layer up. ⚠️ **AND THE RULING CAME WITH A SECOND HALF THAT ANSWERS THE ARITHMETIC ANOMALY THIS ROW EXISTED TO ESCALATE, WHICH THE TRIGGER ALONE COULD NOT.** His words: *"a full day reserves the day; half-day overtime is subject to availability."* **The full-day fee buys the DAY, not six hours of it.** Read as a price comparison the table below says the full-day rate is never the cheaper choice; read knowing what each fee reserves, the $2,000-narrowing-to-$500 spread is the price of certainty rather than a defect. The sentence is `FEES.mediation.reservation` and it publishes **adjacent to the overtime row**, not as a footnote — the same structural rule as `PROCESS_FRAMING` beside the five timings under Q43, because a reader who takes the number and skips the framing has read a different offer. **THE ANOMALY IS NOT CLOSED AND STAYS ON §12 R5.** The gap is in D14's own figures — the half-to-full step is $2,000 against $1,500 for three hours of overtime — and the reservation point explains what it buys without removing it; the spread is largest at three to five hours, which is the band a half-day booking actually overruns into. `docs/07` §Recorded dissent carries the table for the 12-month review. **The original question, kept because the shape of it is the lesson.** *Where does the overtime hour start?* `docs/07`'s card carried *"Overtime, per hour — $500"* and had never said what it was overtime **to**. Q58's ruling settled the two allowances and did not reach this; Q15–Q17's answer records the rate with no trigger. The two candidates were the session cap (3 h / 6 h) and the billed envelope (5 h / 9 h), and this repository was barred from picking one — a fee term is a fact we do not have, and `CLAUDE.md`'s rule for that is a question, not an inference. **It cost two strikes to hold that line:** a first pass at `docs/07`'s Q58 note asserted the session cap as applied fact and `adversarial-reviewer` struck it in the change set that wrote it; a round-1 fix then published the $500 rate on `/for-parties/` beside an unambiguous *"up to 3 hours"*, which **defines the trigger by adjacency** — nothing else on the page is a quantity it can attach to — and round 2 struck that too. Both strikes were right, and the ruling supplied the value they were waiting for | ~~`/fees/`, `/for-parties/`~~ — both now unblocked and shipped |
|
||||
| ~~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 |
|
||||
@@ -812,7 +813,7 @@ Nothing below can be invented. Each needs an answer from Pouya.
|
||||
| ~~Q36-orig~~ | **Is co-arbitration work available now?** Asserted in three specs — `docs/01` §`/arbitration/`, `docs/03` §Voice as model copy, and `docs/07-fees.md`, which instructs *"The page must say so"* — and **it is in no §4 row.** §4 records the Q.Arb pathway as commenced August 2026 and nothing about what is available in the meantime. The sentence is offered under the heading *"Name the limits"*, so the unverified half travels inside advice about honesty, which is how it survived. All three files now cite this question; none has been deleted, because the *shape* of the sentence is right and only its second clause is unsourced. Raised by `claims-auditor`, 2026-08-26 | `/arbitration/` (step 4) and `/fees/` (step 9) |
|
||||
| ~~Q37~~ | **ANSWERED 2026-08-27 — the label changes.** `JD + ML` is now labelled **"Legal training and engineering practice"**, not "Law and engineering". Pouya's reasoning, and it is the finding rather than the fix: *"The parallel was doing the implying — a degree and a practice under one noun. The asymmetry is the honest part."* A degree is not a practice, and a label that renders them as two instances of one thing invites the reader to supply the missing symmetry — which for "Law" is precisely the licensure implication D13 bars. The new label is longer and less tidy, deliberately. `docs/03`'s credential-row table is amended, and the `TODO(pouya)` is gone from `src/data/site.ts`. Original question follows | — |
|
||||
| ~~Q37-orig~~ | **Is "Law and engineering" the right label under `JD + ML`?** §4's substitution principle supplies the three credential-row **values** (`Q.Med` / `JD + ML` / `EN · FA`); the labels come from `docs/03` and are not themselves registered. `claims-auditor` reads this one as a D13 implication risk: "engineering" is shorthand for a **verified practising** claim, so the parallel invites "Law" to be read the same way, and D13 bars implication as hard as assertion. Left as written — it is approved copy and changing approved copy is not an implementer's call — with a `TODO(pouya)` on it in `src/data/site.ts`. Nothing renders it yet. Raised by `claims-auditor`, 2026-08-26 | The credential row on `/` (step 2) and `/about/` (step 3) |
|
||||
| ~~Q33~~ | **ANSWERED 2026-08-26 — the question rested on a false premise.** It assumed the constraint on describing arbitration was about *entitlement*. ADR designations are voluntary credentials, not licences, and **commercial arbitral appointment in Ontario is not gated behind a designation** — so the constraint was always positional, never legal, and it was Pouya's to answer. *(This row said "anyone may be appointed an arbitrator in Ontario" until 2026-08-27. **Pouya checked it and it is false as a universal** — family arbitration is gated; see Q39. Corrected in place, because §9 is Current Truth. The Change Log entries that quote the original stand unedited, which is where the history lives.)* He accepts arbitration appointments now. `Mediation · Arbitration · Toronto` is **restored to the masthead one-liner**, and ~~`docs/04`'s specified home `<title>` stands as written~~ — **AMENDED 2026-08-28.** The literal is replaced by a composition of `SITE.name` + `SITE.tagline`, so the masthead constants and the title cannot drift; the shipped string is `Pouya Lajevardi · Mediation · Arbitration · Toronto`. Q33's substance is untouched — the unscoped masthead form is still ratified — only the instruction to keep a hand-typed literal is See **§4 Offerings**, added for exactly this class of statement. The original question text follows for the record | — |
|
||||
| ~~Q33~~ | **ANSWERED 2026-08-26 — the question rested on a false premise.** It assumed the constraint on describing arbitration was about *entitlement*. ADR designations are voluntary credentials rather than licences, and — **on Pouya's stated basis, which §4 Offerings records attributed to him and deliberately unstamped** — commercial arbitral appointment in Ontario is not gated behind a designation, so the constraint was always positional rather than legal, and it was his to answer. ⚠️ **STATED AS HIS POSITION, NOT AS FACT:** §4 Forbidden's `struck-universal-q39` row bars the class claim about arbitral gating **in both directions**, and this repository does not conclude a proposition of law. *(This row said "anyone may be appointed an arbitrator in Ontario" until 2026-08-27. **Pouya checked it and it is false as a universal** — family arbitration is gated; see Q39. Corrected in place, because §9 is Current Truth. The Change Log entries that quote the original stand unedited, which is where the history lives.)* He accepts arbitration appointments now. `Mediation · Arbitration · Toronto` is **restored to the masthead one-liner**, and ~~`docs/04`'s specified home `<title>` stands as written~~ — **AMENDED 2026-08-28.** The literal is replaced by a composition of `SITE.name` + `SITE.tagline`, so the masthead constants and the title cannot drift; the shipped string is `Pouya Lajevardi · Mediation · Arbitration · Toronto`. Q33's substance is untouched — the unscoped masthead form is still ratified — only the instruction to keep a hand-typed literal is struck. See **§4 Offerings**, added for exactly this class of statement. The original question text follows for the record | — |
|
||||
| ~~Q33-orig~~ | **How is arbitration described in site-wide copy before Q.Arb is conferred?** Not a wording question — a positioning one, and it recurs on every page. §4 records the Q.Arb pathway as **commenced August 2026**, "never as held or nearing completion". `SITE.tagline` reads `Mediation · Arbitration · Toronto`, and `docs/01` specifies that exact string as the **Home hero eyebrow** — where the hero copy beneath it can qualify it. Build step 1 promoted it to a masthead line under Pouya's name on every page, where nothing qualifies it and it reads as a designation strip; `claims-auditor` flagged it and **it has been removed from the header**. But the question it exposed is still open and lands at build step 2: does the hero eyebrow keep `Arbitration` as specified, qualify it, or hold it until designation? `/arbitration/` (step 4) is separately specced to state the position plainly, which is the honest model — the issue is the one-line forms that have no room to. **Second pass, same day:** the removal from the header did not sweep the proof sheet, where the same string was **hand-typed** as a type specimen and rendered ten times at up to 96px. Both defects fixed — the specimen is now a neutral pangram — and the lesson is the sweep rule again: a removal is a `grep`, not a memory. The nav item `Arbitration` also survives, deliberately; that is Q35. Raised by `claims-auditor`, 2026-08-26 | The Home hero (step 2); `docs/04`'s specified home `<title>`; any bio or one-line descriptor |
|
||||
| **Q34** | **Do §2's measurements of the previous build still hold, and were they measured against the deployed file?** Two of `claims-auditor`'s findings were unverified old-site assertions published in copy, which sent Claude Code to measure the live URL on 2026-08-26. What came back does not straightforwardly match §2. **Reproduced:** the response is a single **2,206,032-byte** file, and `<title>` is still `SML Company · Dispute Resolution`. **Could not be reproduced from the served HTML:** there are **zero** `base64,` occurrences anywhere in it — §2 records "two logo PNGs ~1 MB, base64-inlined" — and no reference to `unpkg` or a React development build. **Why this is a question and not a correction:** the served document is a *bundler harness*. 2,210,921 bytes of it are inline `<script>`, the real `<head>` sits JSON-escaped inside a `<script type="__bundler/template">`, and the application is loaded from **nine UUID-named script files that were not fetched**. The logos and the CDN references may well be in those bundles. So §2 may be right, may be stale, or may have been measured against the local source rather than the deployment — this record cannot tell which. **Why it matters beyond tidiness:** `docs/02` and `CLAUDE.md` both cite the base64-logo figure as the *reason* for a standing convention, and §12 R8 exists because unverified premises propagate. Nobody should quote these numbers in public copy until the question closes. Raised by Claude Code, 2026-08-26 | Nothing structural. It governs whether §2's figures may be cited as fact |
|
||||
| ~~Q39~~ | **ANSWERED 2026-08-27 — and the answer is that the register's premise was FALSE.** Pouya checked it rather than defending it. His words: *"My assertion was FALSE as a universal."* **(a) Is it gated? YES.** Family arbitrators in Ontario must complete prescribed training — 14 hours on screening for domestic violence and power imbalances, 30 hours of Ontario family law for arbitrators outside the Ontario or another Canadian bar, and 10 hours ongoing per two-year period. **Sourced, and the source is now in the repo** per R14: `docs/reference/ontario-family-arbitration-training.md`, retrieved 2026-08-27 with provenance. **(b) Does the offering extend to it? NO** — and that is what actually disposes of the question. Pouya does not do family arbitration, so it is a **scope exclusion, not a gating problem**, and the prescribed-training requirement never bears on this practice. `Shareholder & Family Business` means **commercial disputes among family shareholders** — shareholder and partnership disputes, co-founder breakdowns, business succession — and its page must state plainly that family law matters are not accepted. *One sentence, not a section: Pouya's instruction is that it earns its place only by saving a wasted intake call.* **(c) One honest limit on the source.** The extract establishes the family gate directly and the commercial half only by absence — it neither mentions nor excludes commercial arbitration. §4 therefore carries *"commercial arbitration in Ontario requires no licence and no designation"* as **Pouya's stated position, unstamped**, not as a sourced fact. Do not let the footnote promote it. **Also swept:** the false universal survived in three live places outside the paragraph that was corrected — §4's NOT-NEGOTIABLE boundary bullet, §9's Q33 closure row, and a comment in `SiteHeader.astro`. All three fixed; the `grep` and its output are pasted in **Change Log entry (w), §Sweeps**. *(`adversarial-reviewer` flagged this citation while it still pointed at nothing: the entry was written at Phase 6, after review, so for the duration of the review a §9 row asserted in the present tense that evidence "is in the Change Log" before it was. Fair catch. The row now names the entry, and the reviewer independently re-ran the sweep and confirmed it was genuinely complete.)* Original question follows | — |
|
||||
@@ -937,6 +938,126 @@ never being raised again.
|
||||
|
||||
# Change Log
|
||||
|
||||
## 2026-08-31 (aj) — The eyebrow goes to 14 px and the small-text floor becomes real; the reflow defect turns out to be site-wide and its record turns out to be wrong twice; TTL is stamped `ENABLED`; §4 gains the struck-universal row
|
||||
|
||||
**Prior commit:** `64bce10` — entry (ai)'s twelve-file tree (eyebrow 12 → 13 px, TTL confirmed and gated), committed as-is on Pouya's instruction. It is a deliberate departure from one-logical-change-per-commit: entry (ai) covers both items and splitting it would have meant rewriting the record rather than moving it.
|
||||
|
||||
**Scope:** Pouya's five rulings of 2026-08-31, after (ai) shipped.
|
||||
|
||||
---
|
||||
|
||||
### 1. `--text-eyebrow` 13 → 14 px, from the one definition
|
||||
|
||||
`0.8125rem` → `0.875rem` in `tokens.css`. One edit site; `global.css`'s `.eyebrow` already pointed at the token and did not change.
|
||||
|
||||
**14 px is the same value as `--text-sm`, and the token is deliberately NOT an alias of it.** The eyebrow and body-meta type move for different reasons, and aliasing would mean a future change to meta text silently moving every eyebrow. The "13 px is not a rung on the scale" reasoning is retired: at 14 px it *is* that rung.
|
||||
|
||||
**Rendered sweep, 22 pages × 2 widths, 801 mono uppercase-or-tracked instances measured over CDP.** 441 elements carry `.eyebrow`: **420 at 14 px, 21 held at 11 px.** Every `.eyebrow` instance moved. Contrast on all four grounds unchanged and passing — gold-l on ink 11.09, meta on cream 5.47, meta on cream-2 5.01, gold-l on maroon 8.11 — and **zero of 801 below 4.5 : 1**.
|
||||
|
||||
**Header check, which is what Pouya asked for explicitly.** Nothing header-side consumes `--text-eyebrow`: `git grep 'text-eyebrow' -- src` returns the token definition and `global.css` only. `--header-h` computes to `5.0625rem` = **81 px**, and the sticky header measures **exactly 81.00 px** at 1056 / 1200 / 1216 / 1240 / 1280 / 1440 / 1600, with the CTA landing exactly on `.header-inner`'s content edge. Nothing overflowed, so nothing was improvised.
|
||||
|
||||
### 2. `/contact/`'s labels raised, and the floor claim rewritten because the ruling's premise was false
|
||||
|
||||
`label`/`legend` and the direct-contact `<dt>`s → `--text-eyebrow`. `--text-2xs` now has **one consumer in the whole repository** — `git grep 'var(--text-2xs)' -- src` returns `SiteHeader.astro:211` and nothing else.
|
||||
|
||||
⚠️ **THE RULING ASKED FOR A RECORD THAT IS NOT TRUE, AND IT IS NOT WHAT WAS WRITTEN.** *"Record in docs/02 that it is now the ONLY sub-14px text on the site."* Measured: the `--text-xs` (12 px) rung has **ten declaration sites** and **130 elements carrying their own text** render at 12 px across the 22 pages. So `docs/02` records the claim that *is* verified — one consumer of the 11 px token — and enumerates the 12 px rung as a separate treatment that was not in scope. Softening a false claim into a defensible one is the move this project forbids; the answer was to write the true one.
|
||||
|
||||
**A third block moved that the ruling did not name, and the reason it was held turned out not to apply.** `/bio/`'s ten `<h2>`s and its strap were **copies of five of `.eyebrow`'s six declarations at 11 px** — mono, `0.18em`, uppercase, `--text-meta`: the eyebrow treatment, hand-typed, the same escape the footer's column headings were in (ai). `docs/02` justified the carve-out by `npm run bio:pdf` holding the sheet to one page. **Measured: the `@media print` block sets both to 7 pt, so the screen size never reached the PDF.** They now carry the class.
|
||||
|
||||
⚠️ **AND CONSOLIDATING THEM CHANGED THE PRINTED SHEET, WHICH IS WHY PRINT FREEZES `font-weight: 400`.** The missing sixth declaration was `font-weight`; taking `.eyebrow`'s 500 grew the PDF **89,496 → 91,151 bytes**. That is a visual change to the artefact circulated with an appointment proposal, from a ruling that was about size — so print keeps 400, the committed PDF stays byte-identical, and **whether to unify is Pouya's call**. With the freeze in place `npm run bio:pdf` renders **89,496 bytes, 1 page**, and `cmp -l` against the committed file gives **exactly 10 differing bytes, all inside `/CreationDate` and `/ModDate`**. Reverted; `git status public/` is clean.
|
||||
|
||||
### 3. The reflow defect was site-wide, not `/bio/`'s — and `/bio/` was not even the binding cause
|
||||
|
||||
Pouya ruled the 152/112/82 px overflows a WCAG defect to be fixed at the cause, never with `overflow-x: hidden`. **The sweep he asked for found the siblings on all 21 other pages.**
|
||||
|
||||
| Element | Fix | 320 px contribution | Cause |
|
||||
|---|---|---|---|
|
||||
| `SiteHeader .brand-name` | `white-space: nowrap` **removed** | **63 px, all 22 pages** | Two words glued into one unbreakable box |
|
||||
| `/bio/ .rates-list` | `overflow-wrap: anywhere` | **152 px** | `https://adr.smlcompany.ca/fees/` sized a single-column grid track; all five rate rows stretched to 424 px |
|
||||
| `/ .hero-h` | `overflow-wrap: anywhere` | 36 px | One word at 104 px held `.hero-copy` open |
|
||||
| `/ .feature-body` | `overflow-wrap: anywhere` | 26 px | "party-appointed" at 202 px |
|
||||
| `CredentialRow .credential-label` | `overflow-wrap: anywhere` | 38 px | "designation" needs 143 px in an 88 px track |
|
||||
| `SiteFooter .footer-brand` | `flex-wrap: wrap` | 12 px | Flex item at `min-width: auto` cannot shrink below "Lajevardi" |
|
||||
| `PracticeCard .card` | `padding` clamped | *(the cause under `Pill`)* | rem-based `--space-6` is 64 px a side at root 32 |
|
||||
| `Pill` | `overflow-wrap: anywhere` | 33 px → 1 px | **Backstop, not cause** — a one-word pill cannot wrap at a space that is not there |
|
||||
|
||||
`flex-wrap: wrap` on the footer brand rather than `anywhere`, because it reflows without hyphenating a person's name. **All eight produce byte-identical geometry at root 16** — the clamp holds 32 px from 320 px up, and the brand name is one line at all 16 widths.
|
||||
|
||||
**Three instrument findings, each of which hid a real defect, now in `docs/02` §Reflow:** `overflow-wrap: break-word` does not reduce min-content and `anywhere` does (five of the fixes are this distinction); `getBoundingClientRect()` reports **border boxes**, so an element sweep cannot see text spilling outside its own box — which is how a 38 px document overflow had an invisible offender; and under `mobile: true` emulation the **layout viewport expands to fit the content**, so `scrollWidth − innerWidth` reads 0 at a requested 320 while the reader still scrolls sideways. The honest formula is `scrollWidth − clientWidth`.
|
||||
|
||||
### 4. TTL stamped `ENABLED`; Q60 stays open on the half that matters
|
||||
|
||||
§7 carries `TimeToLiveStatus: ENABLED`, `AttributeName: ttl` `[verified 2026-08-31]`, and records that it was `DISABLED` at first verification the same day — the promise on `/legal/privacy/` was unbacked from the day it was written until the day it was enabled. **Q60 is narrowed to its second half and stays OPEN:** no record has been written with a near-future `ttl` and watched to vanish. `ENABLED` proves the setting, not the behaviour.
|
||||
|
||||
**R19's sweep found two stale copies outside §7 and a third that two review rounds surfaced.** `docs/05:376` said *"THE SETTING WAS MEASURED OFF"*; `privacy.astro`'s `TODO(pouya)` said *"returned `DISABLED`"*; and `privacy.astro:39` still said the promise *"depends on a control nobody has verified"*. All three now carry the constraint and defer to §7. **R19 itself was deliberately not edited** — it points at §7 and Q60 rather than carrying state, which is the property that made it work.
|
||||
|
||||
### 5. §4 gains the struck-universal row, and the sweep it demands found two files stating the claim flatly
|
||||
|
||||
A Forbidden row for *"anyone may be appointed an arbitrator in Ontario"* / *"nothing in law gates the role"* and paraphrases, citing `docs/reference/ontario-family-arbitration-training.md` (ontario.ca, retrieved 2026-08-27, the 14 / 30 / 10-hour figures) and cross-referenced to `check:claims`'s `struck-universal-q39`. **The row bars the claim in both directions**: the commercial half is Pouya's attributed position, not a verified fact, because a page about family arbitrators is not authority for what commercial arbitrators need. `docs/03`'s checklist gains a citing line — it could not have one before, because an item there cites a §4 row rather than restating a bar.
|
||||
|
||||
⚠️ **AND THE ROW IMMEDIATELY CAUGHT TWO PLACES ASSERTING IT AS FACT:** `SiteHeader.astro`'s brand comment and **§9 Q33**. Both now attribute it. §4 Offerings was already careful (*"His stated basis:"*); these two were not. `check:claims` was **not** modified — it stays frozen.
|
||||
|
||||
---
|
||||
|
||||
### Adversarial review — two rounds, 16 findings, all accepted, none declined
|
||||
|
||||
`adversarial-reviewer` only. `claims-auditor` did not run — **D20**.
|
||||
|
||||
**Round 1, six findings. One blocking, and it was a defect in my own record.** I had written into `docs/02` that every reflow residual was *"0 px on all 22 pages… at root 16 px and root 32 px — 286 measurements, every one zero"*, including that the old 602/944 px figures at 1280 were *"0 too"*. **They are not.**
|
||||
|
||||
⚠️ **THE CAUSE IS THAT TWO WAYS OF SIMULATING 200% TEXT ARE NOT EQUIVALENT, AND I GENERALISED ONE WITHOUT SAYING WHICH.** In a media query `rem` resolves against the **default** font size, not the root element's:
|
||||
|
||||
| method | `66rem` resolves to | nav above 1056 px | 1280 px, root 32 |
|
||||
|---|---|---|---|
|
||||
| `documentElement.style.fontSize='32px'` — the command `docs/02` itself prescribes | **1056 px**, matches | `sticky`, `flex-wrap: nowrap` | **944 px over** on 21 pages, 508 on `/` |
|
||||
| `Page.setFontSizes({standard:32})` — what I used | **2112 px**, never matches | `relative`, `wrap` | **0** |
|
||||
|
||||
My 286 was 176 + 110, and the 110 covered five widths that **excluded 1024/1280/1920 at root 32** — precisely where the defect lives. The prose then generalised it. Re-measured under the prescribed method: **0 at 320/360/390/414/640/1024; 944 px on 21 pages and 508 px on `/` at 1280; 304 px on 21 pages at 1920.**
|
||||
|
||||
**It is not a scroll margin.** The farthest element is `div.header-cta` at **2224 px** against a 1280 px viewport; the nav clips mid-word after "Arbitration" and **Practice, Fees, Contact and the header CTA are off-screen** — including the route to the inquiry form. WCAG 1.4.4 with loss of functionality. **And there is a third mechanism which is the reachable one:** Chrome's "Minimum font size" *floors* computed sizes and leaves media queries alone — measured **830 px** over at 1280.
|
||||
|
||||
**NOT FIXED, AND DELIBERATELY SO.** The cause is `flex-wrap: nowrap` on `.nav-list` above 66 rem, a locked step-1 decision, and Pouya's standing instruction with the eyebrow ruling was *"if anything header-side does overflow, stop and report rather than improvising a layout change."* It is now a **blocking item on `docs/06`'s cutover checklist**, ticked only by him fixing it or accepting it with the measured consequence — *"not by re-measuring it with the method that reports zero."*
|
||||
|
||||
**The other five round-1 findings, all mine:** the "exactly one exception" floor claim was falsified thirty lines below in the same document; `global.css` sets `break-word` on **`p` and** `h1`–`h6`, so the premise I wrote for `.feature-body`'s fix was false while the fix was right; two stale TTL statements survived my own R19 sweep; `Pill`'s fix was symptom-specific, the real cause being `PracticeCard`'s rem-based padding; and 107 of 129 added `src/` lines were comment prose, with each of seven measurements stored twice.
|
||||
|
||||
**Round 2, ten findings, and eight were defects in round 1's own fixes** — the ratio D19's two-round cap exists for. The material ones:
|
||||
|
||||
- **`docs/02` said the print change was "63,743 bytes".** That is the `cmp -l` differing-byte count, not the size delta — the content stream is Flate-compressed, so a one-property change scrambles most of the file. The delta is **1,655**. Two figures and I quoted the one answering a question nobody asked.
|
||||
- **The lost-navigation list named "Med-Arb", which is in `SECONDARY_NAV` and is not in the masthead at any width.** The item actually lost, and the worst of them, is **Contact**. Corrected in `docs/02` and in the `docs/06` blocker, which is ticked on the measured consequence.
|
||||
- ⚠️ **Raising the eyebrow to 14 px made the tagline's own justification stale, and one clause of it false.** `SiteHeader.astro` recorded the constraint at 13 px. Re-measured at the live 14 px: header **84.98 px** against `--header-h` 81; CTA past the content edge **1.3 px at 1216 with the six items shipping today** and **67.8 / 43.8 / 51.8 / 51.8 px** with a seventh; and **20 px of document overflow at 1216, 4 px at 1280** — so *"document overflow is 0 in every one of those cases, so a page-level check cannot see this"* was true at 13 px and false at 14. At 11 px all three are zero with six items and with seven.
|
||||
- **My own item-2 fix reintroduced an overflow at the width Pouya had just ruled on.** Moving `/contact/`'s labels 11 → 14 px put "Firm or organisation" **38 px outside its own box** at 320 px / root 32 — invisible to a document-level check, and found by the very instrument finding this change set added to `docs/02`. Fixed with `overflow-wrap: anywhere`.
|
||||
- **The same move left two copies of the eyebrow treatment rendering at weight 400** under a `p.eyebrow` of identical size and colour, while the rewrite had deleted the sentence that legitimised the duplication. `font-weight` added to both; `docs/02` carries a **named** carve-out — they keep `--text-secondary` (11.75 : 1) rather than `.eyebrow`'s `--text-meta` (5.47 : 1) because a form label is operative text.
|
||||
- **Three residual tables and an element-sweep sentence in `docs/02` still read as current** while the section below them said the residuals were zero. Annotated as dated history; the sweep sentence's own predicate now returns **0 elements**.
|
||||
- **`CredentialRow.astro:60` still asserted the false constraint** with the correction 46 lines below it. Corrected in place — the track cannot overflow, its content can.
|
||||
- **The `break-word`/min-content explanation appeared six times in `src/`.** Reduced to one-line citations of `docs/02` §Reflow; `git grep 'min-content' -- src` now returns **two hits, both predating this session** (`about.astro:751`, `index.astro:850`), which are deliberately left rather than widening the diff.
|
||||
|
||||
**Declined: none, in either round.**
|
||||
|
||||
### Verified — commands run, exit statuses read directly, never through a pipe
|
||||
|
||||
`npm run build` **0** (22 pages) · `npm run check` **0** (0 errors / 0 warnings / 0 hints, read as three lines) · `npm run check:claims` **0** · `npm run og:proof` **0** · `npm run check:intake` **0** · `npm run lint` **0** · minifier tripwire `grep -rE 'animation:[^;}]*(scroll\(\)|view\(\))' dist --include='*.css'` exit **1**, no output · `TODO` in built HTML **0**, with a source sanity check confirming the marker exists so the probe is not vacuous.
|
||||
|
||||
**Overflow, this pass: 374 measurements over 22 pages, every one zero**, row counts asserted before reading — 132 at `rootstyle` root 32 (320/360/390/414/640/1024), 132 at `default32` root 32, 110 at root 16 (320/390/640/1280/1920). **Positive controls**, because a uniform pass is the result you were hoping for and therefore ends the check: the same probe reports 119 px at width 200 and 319 px at root 64.
|
||||
|
||||
⚠️ **THE `$VAR` WORD-SPLIT TRAP FIRED TWICE MORE AND BOTH TIMES READ AS A CLEAN PASS.** zsh does not word-split parameter expansions, so `node probe.mjs 320 $PAGES` measured **one** page and printed "max=0, nonzero=0" at every width. Command substitution `$(cat file)` does split; parameter expansion does not. Caught only by asserting the row count first — which is now how every sweep in this entry is written.
|
||||
|
||||
**Two of my own instruments were wrong before they were right, and both failed in the safe direction only by luck.** A state assertion `grep -rqF '0.875rem' dist` could never match, because Lightning CSS writes `.875rem` — it would have read "BEFORE" forever. And a tagline probe reported the forced size not taking: an inline `!important` was being outranked by a **running CSS transition**, which sits above `!important` author declarations in the cascade. Reading the value it actually got, rather than asserting equality and stopping, is what found it.
|
||||
|
||||
`npm run lighthouse` **0** — 22 pages, no category below 95: perf 99 on `/` and 100 on the other 21, a11y 100 (with `prefers-reduced-motion` forced), best practices 100, SEO 100 on all 16 indexable pages and `69n` on the six deliberate `noindex`, CLS **0.000** everywhere. Run three times across this change set with identical category scores; LCP varies ±0.08 s between runs, and `/` sits at **2.03 s** against `docs/04`'s 2.0 s — unchanged by this work, and the script reports LCP rather than asserting it.
|
||||
|
||||
### Open, and what needs Pouya
|
||||
|
||||
- ⚠️ **The 1280 px / 1920 px reflow residual is his ruling to make** — fix the desktop nav or accept it with the measured consequence. Blocking on `docs/06`.
|
||||
- **Q60** — the TTL test record. `ENABLED` is stamped; the behaviour is unproven and `/legal/privacy/` carries a `TODO(pouya)`.
|
||||
- **`/bio/`'s print `font-weight` freeze** — unify to 500 and re-render the PDF, or leave it.
|
||||
- **`.hero-h` has 16 scoped rules and 2 carry `anywhere`.** The other 14 measure 0 today. The single-source fix — `global.css`'s `h1`–`h6` rule from `break-word` to `anywhere`, deleting both overrides — has a site-wide blast radius on intrinsic sizing and was not measured, so it is recorded rather than done.
|
||||
- **§12 R1 surfaced**, unchanged. R18's seven dated extracts, R10's memberships, R17's 2026-11-26 key rotation, R9's unconfirmed SES subscription and R5's fee arithmetic all remain live.
|
||||
- **R11's general half was not exercised** — this was a fix session, not a build-order phase boundary, so no dependency pins were re-checked.
|
||||
|
||||
**Not committed.** 15 files.
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-31 (ai) — The eyebrow goes to 13 px from one definition, and the sweep by rendering found one escaped copy of it and one deliberate override; DynamoDB TTL was `DISABLED` while `/legal/privacy/` promised automatic deletion
|
||||
|
||||
**Type:** design-system change (site-wide) + an operational fact recorded + a one-line handler correction.
|
||||
|
||||
Reference in New Issue
Block a user