feat: build step 4 — /mediation/, /arbitration/, /med-arb/; source ADRIC's rules
Build and deploy / build-and-deploy (push) Failing after 4s

Three pages, five in the build, zero JavaScript. /arbitration/ carries §4's
paired-disclosure condition on four surfaces and Q39's struck universal appears
in no form. /med-arb/ meets the procedural-fairness objection at the level of
process design and ships deliberately without Pouya's own protocol commitments,
which are Q54.

docs/01 directed the mediation page to name the "ADRIC Model Mediation Rules".
No such document exists — 0 occurrences across all four of ADRIC's rules pages
against 10 for "National Mediation Rules"; "Model" belongs to the Model Dispute
Resolution Clause inside the rules. Caught only because R14 requires the source
before the claim. docs/reference/adric-rules.md + adric-extract/ carry it, with
the digest drift measured rather than assumed: the HTML changes per request, the
text extracts are byte-stable, so the extracts are the artefact.

Four review passes, 21 defects, and the pattern was mine: I wrote the Q54 gate
into the page and then breached it four times, then round 2 found two survivors
of round 1's own fixes and one defect round 1's fix created. Also removed a
<title> naming a practised role §4 does not grant, a habitual presupposing awards
issued, and a claim about what ADRIC's rules permit that my own reference doc
says is unsupported.

Two instrument failures caught before they became conclusions: touch targets
measured over file:// with no CSS loaded (uniform 18px, including on a .btn with
a 44px floor), and a schema.org validator call that parsed nothing and returned
0 warnings for everything. Both re-run with the instrument validated first.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0148NztQskLKKApP5SzAA78e
This commit is contained in:
Pouya Lajevardi
2026-08-28 17:06:27 -04:00
co-authored by Claude Opus 5
parent 2282183b4b
commit f3138a0a79
18 changed files with 2496 additions and 18 deletions
+63
View File
@@ -0,0 +1,63 @@
---
/**
* A `<dl>` of term/description pairs on an auto-fitting grid.
*
* EXTRACTED AT STEP 4 ON `adversarial-reviewer`'S FINDING, and the finding was
* that `/mediation/`'s `.formats` and `/arbitration/`'s `.cols` were the same
* component under two names — identical markup, near-identical CSS, and
* `.cols` was already serving two different content types on one page.
* `/practice/*` at step 5 wants it a fourth time. Same argument that extracted
* `ContactBand`: two call sites, one already divergent, pages to come.
*
* `<dl>` RATHER THAN A DIV GRID, for `CredentialRow`'s reason: each pair is a
* term and its description, so a screen reader gets them as an associated pair
* rather than as a visual arrangement. Wrapping each `<dt>`/`<dd>` in a `<div>`
* inside the `<dl>` is valid HTML and is what makes the grid tractable.
*
* A `<dt>` IS NOT A HEADING and must not become one. These sit under the
* section's `<h2>`; promoting them to `<h3>` would be a heading level that adds
* nothing to the outline, and `docs/02` forbids skipped levels either way.
*/
interface Props {
items: ReadonlyArray<{ name: string; body: string }>;
/** The grid's per-column floor, passed to `.grid-autofit` as `--grid-min`.
* The `min(N, 100%)` guard lives there, in one place. */
minColumn?: string;
}
const { items, minColumn = '17rem' } = Astro.props;
---
<dl class="grid-autofit defs" style={`--grid-min: ${minColumn}`}>
{
items.map((item) => (
<div class="def">
<dt class="def-name">{item.name}</dt>
<dd class="def-body">{item.body}</dd>
</div>
))
}
</dl>
<style>
/* Columns and the `min()` guard come from `.grid-autofit` (global.css); this
sets only the gap. It re-implemented them for one pass — a second copy of
the guard, inside the extraction made to remove copies of the guard.
`--grid-min` is passed inline by the caller because a parent cannot style
this component's root, and a custom property is the one mechanism that
crosses that boundary. */
.defs {
gap: var(--space-7);
}
.def-name {
font-family: var(--font-mono);
font-size: var(--text-xs);
font-weight: var(--weight-medium);
letter-spacing: var(--tracking-wide);
text-transform: uppercase;
color: var(--text-meta);
}
.def-body {
margin-block-start: var(--space-2);
line-height: var(--leading-body);
}
</style>