feat: Q.Arb is held; strike C.Med-Arb entirely; dissolve the paired disclosure
Build and deploy / build-and-deploy (push) Failing after 4s
Build and deploy / build-and-deploy (push) Failing after 4s
Pouya's ruling, 2026-08-29. Treated as D3-class and swept accordingly. §4 Q.Arb becomes a HELD designation. Obtained July 2026 — recorded in the register, deliberately not published. Public copy carries "Q.Arb (ADRIC / ADRIO)" beside Q.Med and nothing more. Every stage form is struck: "commenced", "in progress", "pathway", "not yet". C.Med-Arb as a stated goal is struck. This DEVIATES FROM THE STRATEGY BRIEF, which made it "the explicit long-term professional narrative"; the brief is not in this repository, so the deviation is recorded in four places so nobody reinstates it from a document no reader can open. The designation stays in §11 as a definition — what is struck is its status as a goal of his. The paired-disclosure condition dissolves. It existed only because Q.Arb was in progress; there is no stage left to disclose, and a condition with no subject cannot be half-kept. Pages /about/'s credentialing arc is DELETED, not rewritten — two held designations are not a journey. /arbitration/ loses its stage section and its "Available now, and open about the stage" h1. /med-arb/'s endpoint section is rewritten. Deleting CREDENTIALS.goal/goalName rather than emptying them turned every consumer into a build error, which is how the last two surfaced. hasCredential now maps CREDENTIALS.designations instead of indexing [0]; _DesignationRowParity pins the visible credential row to the same constant. check:claims q-arb-as-a-stage (inverted from the predecessor, which barred Q.Arb reading as HELD) and c-med-arb-struck. Each page is now scanned twice — as published, and with inline tags collapsed — because [^<] cannot cross <strong>, which this site sets in prose. Two open questions for Pouya, neither blocking: Q55 — the acquisition date. §4 says obtained July 2026; the Change Log of 2026-08-26 records "commenced August 2026", both stamped [verified — Pouya]. They cannot both be true. Nothing published turns on it. Q56 — is the mediation offering scoped commercial? §4 leaves it unscoped; four surfaces say "commercial mediation"; /practice/insurance/ offers mediation in insured-versus-insurer SABS matters. Two review rounds, all findings applied or declined with a stated reason. Round 2 found ten lines in docs/03 still instructing the struck form — the 2026-08-29 sweep missed them because `git grep 'Q.Arb'` is line-anchored and the block never names it. Sweep the vocabulary, not only the subject. Gates, exit statuses read directly, never through a pipe: npm run check exit=0 (0 errors, 0 warnings, 0 hints) npm run lint exit=0 npm run build exit=0 (12 pages) npm run check:claims exit=0 (11 patterns, 26 approved strings) npm audit exit=0 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
79b19a7bd0
commit
610edc24fd
+85
-247
@@ -11,11 +11,19 @@
|
||||
* 1 Portrait, name, designation line → the hero
|
||||
* 2 Narrative biography, 400–600 words → §Background
|
||||
* 3 Credentials, structured → §Credentials
|
||||
* 4 The credentialing arc → §The arc
|
||||
* 4 The credentialing arc → REMOVED 2026-08-29, see below
|
||||
* 5 Languages and cross-cultural → §Language
|
||||
* 6 Speaking and publications → OMITTED, per the spec itself
|
||||
* 7 Person JSON-LD + PDF bio → JSON-LD ships; the PDF does not
|
||||
*
|
||||
* ⚠️ ITEM 4 IS GONE, AND IT WAS DELETED RATHER THAN REWRITTEN. Pouya, 2026-08-29:
|
||||
* *"Two held designations, no journey… An arc invites 'where are you on it';
|
||||
* two designations don't."* Q.Arb is held and C.Med-Arb is off the site
|
||||
* entirely, so the section had no subject left — three pills reading Held,
|
||||
* Held, and nothing. What it used to carry now sits in item 3, which is a list
|
||||
* of held things and was always the right shape for it. **Do not restore it
|
||||
* from docs/01's seven-item outline**; that item is struck there too.
|
||||
*
|
||||
* ITEM 6 IS OMITTED ON THE SPEC'S OWN INSTRUCTION, not by oversight: "Omit the
|
||||
* section entirely until there is something in it. An empty 'Speaking' heading
|
||||
* is worse than no heading." Nothing to list.
|
||||
@@ -69,7 +77,6 @@ import { Picture, getImage } from 'astro:assets';
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import ContactBand from '../components/ContactBand.astro';
|
||||
import Eyebrow from '../components/Eyebrow.astro';
|
||||
import Pill from '../components/Pill.astro';
|
||||
import SectionHeading from '../components/SectionHeading.astro';
|
||||
import portrait from '../assets/pouya-lajevardi.jpg';
|
||||
import ogDefault from '../assets/og-portrait.jpg';
|
||||
@@ -77,7 +84,9 @@ import { aboutGraph } from '../data/schema';
|
||||
import {
|
||||
ASYMMETRY_LINE,
|
||||
CREDENTIALS,
|
||||
DESIGNATIONS_HELD_LINE,
|
||||
PORTRAIT,
|
||||
PRACTICE_AREAS,
|
||||
ROLE,
|
||||
SITE,
|
||||
} from '../data/site';
|
||||
@@ -129,141 +138,47 @@ const ldImage = await getImage({
|
||||
});
|
||||
const graph = aboutGraph(new URL(ldImage.src, Astro.site).href);
|
||||
|
||||
/* THE BIOGRAPHY ENUMERATES THE PRACTICE AREAS IN PROSE, which means it is the
|
||||
one place on the site that names them without rendering `PRACTICE_AREAS`.
|
||||
Card labels ("Insurance, SABS & LAT") do not read as prose, and a joined list
|
||||
of them in a paragraph was worse than the duplication. So the count is
|
||||
asserted instead: add a seventh area and this throws, which is the prompt to
|
||||
rewrite the sentence. Same mechanism as the ground-alternation check in
|
||||
`practice/[slug].astro`. */
|
||||
/* `: number`, NOT the inferred literal. `PRACTICE_AREAS` is `as const`, so
|
||||
`.length` is the literal type `6`; with `AREAS_NAMED_IN_BIO` also literal `6`,
|
||||
adding a seventh area makes the comparison `7 !== 6` — non-overlapping
|
||||
literals — and `astro check` fails first with `ts(2367) This comparison
|
||||
appears to be unintentional`, which reads like lint noise. Both deploy paths
|
||||
run `npm run check` BEFORE the build, so the implementer would never see the
|
||||
message below, and the message is the whole point of the guard. Widening the
|
||||
left side keeps the comparison live at runtime. Measured by
|
||||
`adversarial-reviewer` 2026-08-30. */
|
||||
const AREAS_NAMED_IN_BIO: number = 6;
|
||||
if (PRACTICE_AREAS.length !== AREAS_NAMED_IN_BIO) {
|
||||
throw new Error(
|
||||
`/about/'s biography names ${AREAS_NAMED_IN_BIO} practice areas in prose, ` +
|
||||
`but PRACTICE_AREAS now has ${PRACTICE_AREAS.length}. Rewrite the ` +
|
||||
`"I accept appointments in six areas" paragraph, then update this count.`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The designation line — docs/01 item 1. Assembled from constants so it cannot
|
||||
* drift from §4, and ordered held-first.
|
||||
* drift from §4.
|
||||
*
|
||||
* Q.Arb IS NOT IN IT, deliberately. It is not held (§4: "Describe as newly
|
||||
* commenced, never as held or nearing completion"), and a designation line is
|
||||
* precisely a list of things held. The arc section states the stage plainly,
|
||||
* which is what §4's paired-disclosure condition requires — this page offers
|
||||
* arbitration, so the stage appears on this page and not only in the footer.
|
||||
* BOTH DESIGNATIONS, because a designation line is a list of things held and
|
||||
* as of 2026-08-29 Q.Arb is one of them. It was excluded while it was a stage.
|
||||
* The issuing bodies repeat across the two entries; that is what the strings in
|
||||
* `CREDENTIALS.designations` say, and spelling them once across a joined pair
|
||||
* would be this file re-typing §4 rather than rendering it.
|
||||
*/
|
||||
const designationLine = [
|
||||
'Mediator',
|
||||
CREDENTIALS.designations[0],
|
||||
...CREDENTIALS.designations,
|
||||
CREDENTIALS.education[0],
|
||||
];
|
||||
|
||||
/**
|
||||
* The credentialing arc — docs/01 item 4, and docs/03: "the credentialing
|
||||
* pathway from Q.Med through Q.Arb to C.Med-Arb is stated openly, **with Q.Arb
|
||||
* described as commenced August 2026** and never as 'in progress', which is
|
||||
* looser than §4 and is barred by docs/06's cutover checklist. The brief treats
|
||||
* that arc as part of the story rather than something to obscure."
|
||||
*
|
||||
* ⚠️ THAT QUOTATION WAS STALE AND THE STALE HALF WAS THE BARRED PHRASE. It
|
||||
* quoted docs/03's pre-2026-08-28 text, which ended "...stated openly as in
|
||||
* progress" — so THIS FILE cited docs/03 as REQUIRING the phrase six lines
|
||||
* above citing it as BARRING the phrase. Found by `adversarial-reviewer`.
|
||||
*
|
||||
* **And the Q.Arb-wording sweep missed it because the phrase was line-wrapped**
|
||||
* as `as in\n * progress`: a grep for "in progress" on one line returns
|
||||
* nothing. Same defect CLAUDE.md already records for a docs/03 phrase that
|
||||
* wrapped behind a blockquote marker. Sweep the wrapped form too.
|
||||
*
|
||||
* `state` is the load-bearing column. "Commenced August 2026" is §4's exact
|
||||
* wording and the ONLY permitted wording — docs/03: not "in progress", because
|
||||
* the weaker form drifts toward "nearly complete", which §4 Forbidden bars
|
||||
* outright.
|
||||
*/
|
||||
/*
|
||||
* FIVE CLAIMS CAME OUT OF THIS BLOCK, and the first was the worst thing in the
|
||||
* step-3 diff. BOTH review agents found it independently, which is the strongest
|
||||
* signal this loop produces.
|
||||
*
|
||||
* 1. ⚠️ "arbitral appointments are not gated behind it, which is why I accept
|
||||
* them now" — **the false universal Q39 struck, on a public page.**
|
||||
* Unscoped ("arbitral", not commercial), asserted as flat fact in the first
|
||||
* person, and it publishes a proposition of Ontario law that §4 holds only
|
||||
* in scoped form and deliberately does NOT stamp `[verified]`. Family
|
||||
* arbitration is an arbitral appointment and it IS gated
|
||||
* (`docs/reference/ontario-family-arbitration-training.md`). Q39 swept
|
||||
* three instances of this universal on 2026-08-27; this was the fourth and
|
||||
* the first outside a comment. §4 requires the STAGE be stated — never the
|
||||
* register's gating rationale. Deleted rather than rescoped: this page has
|
||||
* no business carrying the argument at all.
|
||||
* 2. "on the same institutional pathway" and
|
||||
* 3. "Three designations on one institutional pathway" (the section lede) —
|
||||
* §4 attaches ADRIC / ADRIO to **Q.Med only**. Neither the Q.Arb row nor
|
||||
* the C.Med-Arb row names a body.
|
||||
* 4. "The senior hybrid designation" — a ranking claim about a third party's
|
||||
* credential structure, with no row and no source.
|
||||
* 5. The expansions — "Qualified Mediator", "Qualified Arbitrator",
|
||||
* "Chartered Mediator-Arbitrator". Flagged as being in §11 Glossary but
|
||||
* not in §4 Verified. **The third was also simply WRONG** — ADRIO's term
|
||||
* is "Chartered Med-Arbitrator" — but that is not what this finding
|
||||
* caught, and no review pass caught it either: four passes read the string
|
||||
* and checked only whether it was *sourced*. Pouya caught it on
|
||||
* 2026-08-28. The wrong form is quoted here because it is what was
|
||||
* flagged; it is corrected in the arc below and swept from the repo.
|
||||
*
|
||||
* ⚠️ ITEM 5 WAS REMOVED AND IS NOW RESTORED, AND IT IS THE ONE PLACE THIS
|
||||
* SESSION WENT AGAINST A REVIEW FINDING. The reason is a SECOND finding, from
|
||||
* the next audit pass, and it is a consistency point rather than a claim point:
|
||||
* this page also publishes "Provincial Offences Act", "Statutory Accident
|
||||
* Benefits Schedule" (as SABS) and "the ADR Institute of Canada and the ADR
|
||||
* Institute of Ontario" — every one of them a §11 Glossary expansion, on exactly
|
||||
* the ground the designation names were struck. *"One standard or the other."*
|
||||
*
|
||||
* ✅ **RATIFIED BY POUYA 2026-08-28 (Q46(b)), AND NO LONGER RESTING ON §11
|
||||
* ASSERTING ITS OWN CONTENT.** The standard: **§11 Glossary is the source for
|
||||
* DEFINITIONAL expansions** — what an abbreviation stands for — while §4
|
||||
* Verified remains the only source for claims ABOUT POUYA. Expanding `Q.Med`
|
||||
* says nothing about him; "he holds it" is the claim, and that has a row. His
|
||||
* words: *"the same line the Offerings ruling drew"*, and *"You were right that
|
||||
* one standard or the other had to apply."*
|
||||
*
|
||||
* The alternative standard would have required stripping POA, SABS and the
|
||||
* institute names from the prose and `recognizedBy` from the JSON-LD — making
|
||||
* the page materially worse for a reader who does not already know the acronyms,
|
||||
* in exchange for no reduction in risk.
|
||||
*
|
||||
* **R14 IS NOW SATISFIED, which it was not when this comment was first written.**
|
||||
* Pouya's ruling attached a condition — fetch and commit the source — and
|
||||
* `docs/reference/adrio-designations.md` is it: all five expansions in ADRIO's
|
||||
* own words, four independent fetches, reproducible sha256. The earlier attempt
|
||||
* had failed on the obvious URL (`adric.ca/designations/` redirects to
|
||||
* `/designations-cee/` and serves **zero** occurrences of "Q.Med", "Qualified
|
||||
* Mediator" or "Chartered Mediator" in 114,985 bytes — navigation only, body
|
||||
* assembled client-side), and that failure is why this rested on §11 alone for
|
||||
* one day. `adr-ontario.ca` serves them server-side. **The lesson is that one
|
||||
* dead URL is not a sourcing dead end** — the national body's page was
|
||||
* client-rendered and the provincial affiliate's was not.
|
||||
*/
|
||||
const ARC = [
|
||||
{
|
||||
name: 'Q.Med',
|
||||
state: 'Held',
|
||||
/* NOT "the designation I mediate under". That imported a PERMISSION framing
|
||||
onto what §4 records as a voluntary credential, in a register that says
|
||||
no designation is required to be appointed as a mediator — the
|
||||
credential-as-licence slip §4 says produced a wrong answer twice. */
|
||||
body:
|
||||
'Qualified Mediator, held through the ADR Institute of Canada and the ' +
|
||||
'ADR Institute of Ontario. The designation I hold as a mediator today.',
|
||||
},
|
||||
{
|
||||
name: 'Q.Arb',
|
||||
state: 'Commenced August 2026',
|
||||
body:
|
||||
'Qualified Arbitrator. Newly commenced — not held, and not nearing ' +
|
||||
'completion.',
|
||||
},
|
||||
{
|
||||
name: 'C.Med-Arb',
|
||||
state: 'The endpoint',
|
||||
/* "Chartered Med-Arbitrator", NOT "Chartered Mediator-Arbitrator". The
|
||||
second form shipped in this string until 2026-08-28 and was in
|
||||
dist/about/index.html; ADRIO's own term is the first
|
||||
(docs/reference/adrio-designations.md, Finding 2). Pouya's correction,
|
||||
and it was his own error carried from the strategy brief. */
|
||||
body:
|
||||
'Chartered Med-Arbitrator. The designation this practice is built ' +
|
||||
'toward.',
|
||||
},
|
||||
];
|
||||
|
||||
/**
|
||||
* The structured credentials — docs/01 item 3: "designations, education,
|
||||
* certifications, memberships. Every line from AGENTS.md §4 Verified."
|
||||
@@ -331,8 +246,8 @@ const CREDENTIAL_GROUPS = [
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
title="About · Pouya Lajevardi · Mediator, Q.Med · Toronto"
|
||||
description="Pouya Lajevardi, JD, Q.Med — a Toronto mediator who also practises as a machine-learning and infrastructure engineer. Credentials, background, designations."
|
||||
title="About · Pouya Lajevardi · Mediator, Q.Med, Q.Arb · Toronto"
|
||||
description="Pouya Lajevardi, JD, Q.Med, Q.Arb — a Toronto mediator who also practises as a machine-learning and infrastructure engineer. Credentials and background."
|
||||
ogType="profile"
|
||||
imageAlt={PORTRAIT.alt}
|
||||
jsonLd={graph}
|
||||
@@ -387,15 +302,24 @@ const CREDENTIAL_GROUPS = [
|
||||
|
||||
EXPLICITLY INTERIM — AGENTS.md R1, surfaced again 2026-08-28
|
||||
precisely because this page is where the framing now does its
|
||||
heaviest work. */
|
||||
heaviest work.
|
||||
|
||||
"I MEDIATE COMMERCIAL DISPUTES" STAYS, and a round-2 finding against
|
||||
it was declined rather than missed. The objection: the same ground
|
||||
that struck "The matters I take are commercial" from the biography
|
||||
should reach this sentence too. It does not. **That one was a
|
||||
universal** — it said nothing he takes is non-commercial, which is an
|
||||
exclusion §4 has no row for. **This one is existential**: he mediates
|
||||
commercial disputes, which §4 Offerings' mediation row supports and
|
||||
which excludes nothing. A narrower claim than the row grants is
|
||||
safe; a claim the row does not reach is not. */
|
||||
}
|
||||
<p class="hero-lede">
|
||||
I am {ROLE.title} at {ROLE.at}, with {ROLE.litigationLine} across{' '}
|
||||
{ROLE.litigationAreas.slice(0, -1).join(', ')} and{' '}
|
||||
{ROLE.litigationAreas.at(-1)}. I mediate commercial disputes and I
|
||||
accept arbitration appointments in commercial matters; the Q.Arb
|
||||
pathway commenced in August 2026. I also work as a machine-learning
|
||||
and infrastructure engineer.
|
||||
accept arbitration appointments in commercial matters. I also work as
|
||||
a machine-learning and infrastructure engineer.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -519,9 +443,8 @@ const CREDENTIAL_GROUPS = [
|
||||
EVERY CLAIM TRACES TO §4 Verified: the JD, the boutique role, active
|
||||
litigation exposure and its four matter types, Q.Med, multiple
|
||||
completed sole mediations, arbitration appointments (§4 Offerings,
|
||||
scoped to commercial), the Q.Arb pathway commenced August 2026,
|
||||
C.Med-Arb as the goal, engineering practice, SML Company Ltd, Farsi,
|
||||
Iranian-Canadian. Nothing here asserts or implies licensure. */
|
||||
scoped to commercial), Q.Arb, engineering practice, SML Company Ltd,
|
||||
Farsi, Iranian-Canadian. Nothing here asserts or implies licensure. */
|
||||
}
|
||||
<div class="prose bio-prose">
|
||||
<p>
|
||||
@@ -554,21 +477,18 @@ const CREDENTIAL_GROUPS = [
|
||||
drift. */
|
||||
}
|
||||
<p>{ASYMMETRY_LINE}</p>
|
||||
{
|
||||
/* A SECOND PARAGRAPH HERE WAS CANDOUR ABOUT AN INCOMPLETE CREDENTIAL
|
||||
— "I would rather say where I am on the arc". Q.Arb is held; do not
|
||||
write another. `check:claims` q-arb-as-a-stage catches the form. */
|
||||
}
|
||||
<p>
|
||||
Mediation is where they meet. I hold the Q.Med designation through the
|
||||
ADR Institute of Canada and the ADR Institute of Ontario, and I have
|
||||
Mediation is where they meet. {DESIGNATIONS_HELD_LINE}, and I have
|
||||
completed multiple sole mediations. I accept arbitration appointments
|
||||
in commercial matters — as sole arbitrator, as a party-appointed
|
||||
arbitrator, and in co-arbitration. Where a matter turns on a technical
|
||||
question, I read the technical material myself.
|
||||
</p>
|
||||
<p>
|
||||
My Q.Arb pathway commenced in August 2026, and C.Med-Arb is the
|
||||
designation I am working toward. I state the stage openly because an
|
||||
appointing body will establish it anyway, and because a reader can do
|
||||
more with the fact than with a hedge. I would rather say where I am on
|
||||
the arc than leave it to be inferred.
|
||||
</p>
|
||||
{
|
||||
/* BOTH ADDITIONS TO THIS SENTENCE CAME BACK OUT. §4 verifies exactly
|
||||
one relation — *"Operator of SML Company Ltd. alongside the
|
||||
@@ -596,6 +516,25 @@ const CREDENTIAL_GROUPS = [
|
||||
`worksFor` is withheld. */
|
||||
}
|
||||
<p>I run SML Company Ltd alongside the practice.</p>
|
||||
{
|
||||
/* ⚠️ NO SCOPE CLAIM AND NO COVERAGE CLAIM. §4 has no row for the
|
||||
subject matter of his ADR work, and `/practice/insurance/` ships
|
||||
"Disputes between an insured person and an insurer" — an
|
||||
individual-versus-insurer SABS dispute is not commercial, so this
|
||||
paragraph must not declare the six areas a commercial class.
|
||||
What Q35 grants is the frame used here: an area may be named where
|
||||
he can competently accept an appointment, framed as positioning
|
||||
rather than claimed history. "I accept appointments in" is that
|
||||
frame; "the subject matter runs across" is not, because §Background
|
||||
is where a reader defaults to reading history. */
|
||||
}
|
||||
<p>
|
||||
I accept appointments in six areas: construction and infrastructure;
|
||||
technology, AI and data; energy and the grid; insurance and accident
|
||||
benefits; shareholder and family-business disputes; and cross-border
|
||||
matters. What those have in common is a record somebody has to read
|
||||
closely, and a dispute that turns on what is actually in it.
|
||||
</p>
|
||||
<p>
|
||||
I have also completed the Kompass Arbitration Certificate Program and
|
||||
the Stitt Feld Handy negotiation and ADR workshop sequence. Neither is
|
||||
@@ -652,62 +591,6 @@ const CREDENTIAL_GROUPS = [
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 4. The credentialing arc -------------------------------------- */}
|
||||
{
|
||||
/* SECTION 4 BEFORE SECTION 3, and the reorder is deliberate. docs/01 lists
|
||||
credentials (item 3) then the arc (item 4). The arc is the part a reader
|
||||
is likely to have a question about — it is the thing this practice is
|
||||
candid about that others are not — and burying it under a scannable list
|
||||
of things already held reads as a footnote to them. §4's paired-disclosure
|
||||
condition also wants the stage stated where the offering is made, and the
|
||||
offering is made in the narrative directly above. The list follows. */
|
||||
}
|
||||
<section class="section section-inverse arc-section reveal">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<SectionHeading
|
||||
eyebrow="The arc"
|
||||
level={2}
|
||||
lede="Three designations. Two of them are ahead of me, and saying so is the point."
|
||||
>
|
||||
<span slot="heading">Where the credentials sit.</span>
|
||||
</SectionHeading>
|
||||
</div>
|
||||
|
||||
{
|
||||
/* `role="list"` RESTORED, AND THE REASON I REMOVED IT WAS WRONG ABOUT
|
||||
ARIA. The comment here claimed that on an <ol> the role "re-announces
|
||||
an ordered list as an unordered one". It does not: **both <ul> and <ol>
|
||||
map to the `list` role**, so `role="list"` on an <ol> is a no-op for
|
||||
ordering, not a downgrade. What it is actually for is the WebKit
|
||||
heuristic that strips list semantics from a list with
|
||||
`list-style-type: none` — and `.arc` sets exactly that.
|
||||
|
||||
It also left the two <ol>s on this two-page site DISAGREEING, with
|
||||
`/`'s `.process-strip` keeping the role. That is the state that gets
|
||||
copied seventeen times.
|
||||
|
||||
Not verified here: whether WebKit's heuristic covers <ol> as well as
|
||||
<ul>. There is no Safari instrument in this environment, so the role
|
||||
stays on the precautionary side, which costs nothing. Chrome's AX tree
|
||||
exposes `.arc` as `list` with three `listitem` children either way. */
|
||||
}
|
||||
<ol class="arc" role="list">
|
||||
{
|
||||
ARC.map((stage) => (
|
||||
<li class="arc-item">
|
||||
<h3 class="arc-name">{stage.name}</h3>
|
||||
<p class="arc-state">
|
||||
<Pill>{stage.state}</Pill>
|
||||
</p>
|
||||
<p class="arc-body">{stage.body}</p>
|
||||
</li>
|
||||
))
|
||||
}
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---- 3. Credentials, structured ------------------------------------ */}
|
||||
<section class="section section-alt creds reveal">
|
||||
<div class="wrap">
|
||||
@@ -955,51 +838,6 @@ const CREDENTIAL_GROUPS = [
|
||||
page. "Provincial Offences Act" is set in roman. If a statute name ever
|
||||
needs italics here, load a face for it first. */
|
||||
|
||||
/* --- 4. The arc ------------------------------------------------------ */
|
||||
|
||||
.arc {
|
||||
display: grid;
|
||||
/* `min(18rem, 100%)` rather than a bare 18rem floor: a bare floor cannot
|
||||
shrink below itself and overflows at a large default font size. The
|
||||
credential row on `/` is the measured instance of that mistake. */
|
||||
grid-template-columns: repeat(auto-fit, minmax(min(18rem, 100%), 1fr));
|
||||
gap: var(--space-6);
|
||||
/* NO `padding: 0` OR `list-style: none` HERE — `global.css`'s
|
||||
`ul[role='list'], ol[role='list']` reset already supplies both, and this
|
||||
block was re-implementing it by hand. Two rules for one job, and the
|
||||
hand-written copy is the one that drifts. `margin: 0` also comes from the
|
||||
global `* { margin: 0 }` reset. */
|
||||
}
|
||||
.arc-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-3);
|
||||
padding-block-start: var(--space-4);
|
||||
border-block-start: 1px solid var(--line-dark);
|
||||
}
|
||||
/* <h3>, not <p>. These are the headings of the three arc items and they set
|
||||
at --text-2xl serif, so marking them up as paragraphs was the fake-heading
|
||||
pattern: a screen-reader user got no heading navigation for the one section
|
||||
on this page a reader is most likely to jump to. `ProcessStep` on `/` uses
|
||||
<h3> for exactly this shape. Outline stays h1 -> h2 -> h3 with no skips. */
|
||||
.arc-name {
|
||||
font-family: var(--font-serif);
|
||||
font-size: var(--text-2xl);
|
||||
line-height: var(--leading-tight);
|
||||
}
|
||||
.arc-state {
|
||||
margin: 0;
|
||||
}
|
||||
.arc-body {
|
||||
margin: 0;
|
||||
font-size: var(--text-base);
|
||||
line-height: var(--leading-body);
|
||||
/* NOT --text-secondary. On an inverse ground `--ink-soft` measures ~1.4:1
|
||||
against `--ink` — the inherited `--text-inverse` (cream, 16.81:1) is what
|
||||
carries body copy here, so the colour is deliberately left alone rather
|
||||
than set to a token that is correct only on cream. */
|
||||
}
|
||||
|
||||
/* --- 3. Credentials -------------------------------------------------- */
|
||||
|
||||
.cred-grid {
|
||||
|
||||
Reference in New Issue
Block a user