/* ═══════════════════════════════════════════════════════════════════
   CORVUS PROOF DISTRICT — proof.css  (place 1a)
   The pr-* primitive definitions for the proof/derivation output family.
   <link>ed AFTER brand.css. Composes brand-core primitives in MARKUP
   (class="panel pr-claim"); authors ZERO hex — every value is a brand.css
   token via var(). Every rule's KEY (leading) class is pr-* — the three-way
   namespace guarantee (pr- never redefines a brand-core or s- class).

   Districts (haven-family-contract Trigger B): content-types (claim ·
   root-evidence · question) · primitives (below) · usage principles (the
   against-column-is-load-bearing invariant + the defeat-capped confidence
   model). Thirteen canonical primitives: pr-walk · pr-claim · pr-question ·
   pr-gauge · pr-grounds · pr-against · pr-provenance · pr-review-note ·
   pr-figure · pr-diff · pr-masthead · pr-arc-locator · pr-orientation.
   Discovery index: PROOF-INDEX.md.

   pr- IS DEFINED ONLY HERE (R1 2026-07-28). The namespace guarantee gained a
   fourth direction: a .pr-* rule authored in any other file — a page-local
   stylesheet, an emitted inline <style>, an emitter's template string — fails
   verify.mjs's pr-canon-home gate. Page composition belongs to the surface's
   own namespace (cc-offer.css ships cc-*), never to this one. The reason is
   the R1 defect itself: 53 pr- classes lived in one page's inline <style>,
   OVERRODE four canonical rules from a later cascade position, and were
   invisible to every gate because gates scoped to DS-proper stylesheets.
   ═══════════════════════════════════════════════════════════════════ */

/* ───────────────────────────────────────────────────────────────────
   1 · pr-walk — the derivation-walk container
   Altitude-navigable layout: conclusion (hero) → vectors (scan) → pillars
   → roots (drill). A layered LATTICE, not a hairball (altitude = Y, honest).
   The ramp is NOT spent here (Restraint-Earns-Ramp — chrome stays quiet so
   the gauges + the one earned verdict carry the color budget).
   ─────────────────────────────────────────────────────────────────── */
.pr-walk{display:flex;flex-direction:column;gap:clamp(14px,2vw,22px)}
.pr-walk-altitude{position:relative;padding-top:clamp(10px,1.6vw,16px)}
.pr-walk-altitude + .pr-walk-altitude{border-top:1px solid var(--hairline);margin-top:clamp(6px,1vw,10px)}
.pr-walk-altitude-label{font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-caps-lg);
  text-transform:uppercase;color:var(--muted);margin-bottom:var(--space-4);display:flex;align-items:center;gap:var(--space-2)}
.pr-walk-altitude-label::before{content:"";width:20px;height:3px;border-radius:var(--radius-pill);background:var(--hairline)}
.pr-walk-lane{display:grid;gap:clamp(12px,1.6vw,18px)}
@media(min-width:900px){.pr-walk-lane--pillars{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* pr-walk-conclusion — the hero altitude: the ranked conclusion, up-and-out.
   The ONE place the walk earns the ramp edge (compose with .panel.ring in markup). */
.pr-walk-conclusion{position:relative}
.pr-walk-verdict{position:relative;display:inline-flex;align-items:center;gap:var(--space-3);
  font-family:var(--font-mono);font-size:var(--text-mono);letter-spacing:var(--track-mono);
  border:1px solid var(--hairline);border-radius:var(--radius-pill);padding:var(--space-2) var(--space-4);color:var(--ink-2)}
/* position:relative is load-bearing: the composed .ring::before is position:absolute;inset:0 and
   must scope to the verdict pill. Without it the ring escaped to .pr-walk-conclusion (position:relative),
   drawing the gradient edge around the whole altitude — the "conclusion badge collides with the rounded
   edge" report (Aaron 2026-07-25). Root cause was ring-scope, not padding; see ds-foundation-assessment. */
/* ── pr-walk-verdict is the SOLE authority-bearing element (representation-contract §4.3):
   reachable from exactly ONE state — data-state="passed". No other state may borrow the ramp edge. */
.pr-walk-verdict[data-state="passed"]{border-color:transparent;color:var(--ink)}
.pr-walk-verdict[data-state="passed"].ring::before{opacity:.85}
.pr-walk-verdict .pr-verdict-mark{width:8px;height:8px;border-radius:50%;background:var(--pr-tier-k)}
.pr-walk-verdict[data-state="draft"]{border-style:dashed;color:var(--muted)}
.pr-walk-verdict[data-state="draft"] .pr-verdict-mark{background:var(--muted)}
.pr-walk-verdict .pr-verdict-exceptions{color:var(--pr-tier-u)}

/* ───────────────────────────────────────────────────────────────────
   2 · pr-claim — the claim-shaped node container (pillar / vector altitudes)
   Composes .panel in markup. Refuses to render CLEAN without a pr-against
   child (the invariant, realized visually below via pr-against--empty +
   the data-against-missing cap). Altitude is a modifier driving weight.
   ─────────────────────────────────────────────────────────────────── */
.pr-claim{display:flex;flex-direction:column;gap:var(--space-4)}
.pr-claim-head{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-3) var(--space-4);justify-content:space-between}
.pr-claim-id{font-family:var(--font-mono);font-size:var(--text-mono);color:var(--muted);letter-spacing:var(--track-mono);flex:none}
.pr-claim-statement{font-family:var(--font-display);font-weight:600;letter-spacing:var(--track-tight);
  line-height:var(--leading-snug);color:var(--ink);flex:1 1 min(var(--measure-lede),100%)}
.pr-claim--pillar .pr-claim-statement{font-size:var(--text-h3)}
.pr-claim--vector .pr-claim-statement{font-size:var(--text-body-lg)}
.pr-claim-body{display:flex;flex-direction:column;gap:var(--space-3)}

/* pr-claim-status — the disposition register (shipped-floor / bounded-pilot /
   aspirational / U-gated). Text stays ink-safe; the accent DOT carries the register. */
.pr-claim-status{display:inline-flex;align-items:center;gap:var(--space-2);
  font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-mono);text-transform:uppercase;color:var(--muted)}
.pr-claim-status::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--muted)}
.pr-claim-status[data-status="shipped-floor"]::before{background:var(--pr-tier-k)}
.pr-claim-status[data-status="bounded-pilot"]::before{background:var(--pr-conf-3)}
.pr-claim-status[data-status="aspirational"]::before{background:var(--muted)}
.pr-claim-status[data-status="u-gated"]::before{background:var(--pr-tier-u)}
/* drifted — the ground moved after the record was made; the approval no longer covers
   the current content. --warn carries the register, and a HOLLOW dot is a REQUIRED second
   channel, not polish: --warn is a deliberately darkened value tuned to clear the 4.5:1 TEXT
   floor (pr-against--empty copy), which makes it a poor 7px mark — against --muted it sits at
   near-equal lightness, so discrimination falls almost entirely on hue, the weakest channel at
   that size and a red-green confusion axis for protan/deutan readers. Hollow reads as "the
   standing is not solid" and survives forced-colors + one-ink print. Reuses the district's own
   hollow precedent (pr-prov-tier[data-tier="U"]) at the existing 1px hairline convention —
   Corvus has no border/stroke-width scale, and none is authored here (token-foundation I10). */
.pr-claim-status[data-status="drifted"]::before{background:transparent;border:1px solid var(--warn)}

/* ── rendered states (representation-contract §4). draft is VALID + unmistakable;
   passed is authority-bearing (verdict only); capped shows floor + pending ceiling;
   defeated renders as defeated, never vanishes. ── */
.pr-claim[data-state="draft"]{border-style:dashed}
.pr-claim[data-state="draft"]::after{content:"DRAFT";position:absolute;top:.7rem;right:.9rem;
  font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-caps-xl);color:var(--muted);
  border:1px dashed var(--hairline);border-radius:var(--radius-xs);padding:var(--space-1) var(--space-2);pointer-events:none}
.pr-claim[data-state="capped"] .pr-gauge-ceiling{display:flex}
.pr-claim[data-state="defeated"]{opacity:.72}
.pr-claim[data-state="defeated"] .pr-claim-statement{text-decoration:line-through;
  text-decoration-color:var(--muted);text-decoration-thickness:1.5px;color:var(--ink-2)}
/* DS-3/DS-1 2026-07-28: was font-mono @ --text-mono (12.5px) with NO measure cap — five lines of
   narrative prose in the LABEL face at the floor tier, measured 122ch on cc-offer.html. BRAND.md
   §Type scopes mono to "labels, timestamps, section markers" — a paragraph is none of those, so
   this was a canon contradiction, not a preference. The on-the-record register is carried by the
   .pr-claim-defeat-kind label + the --warn rule (accumulation: two channels already), so spending
   the FACE on it too bought nothing and cost the reading. */
/* S6, 2026-07-30 — the SECOND half of the DS-3 fix above. That pass moved the
   defeat prose off the label FACE and stopped there, leaving it at --text-small /
   --muted while the objection it corrects (.pr-against-item p) sits at
   --text-body / --ink-2. Measured: 15.04px vs 18px. So the document's strongest
   trust move — the place it says on the record that a claim of its own failed —
   was its faintest prose, quieter than the thing being retracted. A retraction
   typed weaker than the claim it retracts is the against-column's whole argument
   undercut by its own type ramp. Now matched to the objection register.
   (Failure-shape sibling: the same "corrective element typed weaker than the
   thing it corrects" signature F10 is sweeping for.) */
.pr-claim-defeat{font-family:var(--font-text);font-size:var(--text-body);color:var(--ink-2);
  border-left:2px solid var(--warn);padding-left:var(--space-3);line-height:var(--leading-relaxed);
  max-width:var(--measure-prose)}
.pr-claim-defeat b{color:var(--ink-2)}
/* defeat sub-parts (R1 2026-07-28) — codified from the cc-offer inline block, where they had been
   hand-authored TWICE (emit-cc-story.mjs AND emit-cc.mjs, 13 selectors verbatim-identical across the
   two). Two copies of a rule is a define-once violation that has not drifted YET; the promotion floor
   was met at the second emitter and went unnoticed because neither copy was in a gated file.
   pr-claim-defeat-kind is the ON-THE-RECORD register label — the first of the two channels that let
   the defeat prose drop the mono face (see pr-claim-defeat above); pr-claim-defeat-succ is the
   what-replaced-it line, which is why it reads --pr-tier-k on its lead: a successor is grounded. */
.pr-claim-defeat-kind{display:block;font-family:var(--font-mono);font-size:var(--text-micro);
  letter-spacing:var(--track-caps);text-transform:uppercase;color:var(--warn);margin-bottom:var(--space-2)}
/* the cap is redundant against its parent's 66ch box and is authored anyway: gate 6 fired on this rule
   the moment it entered a gated file (reading size + prose leading, no cap) and it was RIGHT to — a
   containment-derived cap is an accident of composition, and the rule must stand alone. */
.pr-claim-defeat-succ{margin-top:var(--space-3);padding-top:var(--space-2);border-top:1px solid var(--hairline);
  color:var(--ink-2);font-family:var(--font-text);font-size:var(--text-small);line-height:var(--leading-relaxed);
  max-width:var(--measure-prose)}
/* The district's one 600, and it is a declared permission rather than a default (F13 § 5).
   Until 2026-07-30 this was the audit's doubly-wrong instance: the rule exists to make a
   SUCCESSOR claim read as grounded — it carries --pr-tier-k, the Known/cited ink — and it
   reached for a weight step the face did not have, so the authority arrived as a smear.
   The intent was right and the channel did not exist. R1 loaded Instrument Sans 600 upright;
   this now resolves to a real master, and it is the canonical case the permission names. */
.pr-claim-defeat-succ b{color:var(--pr-tier-k);font-weight:600}

/* pr-question — a claim whose band cannot resolve until an input lands: un-crystallized,
   dashed, NOT low-graded (gated ≠ low). Carries its gates + what-would-resolve. */
.pr-question{border-style:dashed;border-color:color-mix(in oklab,var(--pr-tier-u) 40%,var(--hairline))}
.pr-question .pr-claim-statement{color:var(--ink-2)}
.pr-question-gate{display:inline-flex;align-items:center;gap:var(--space-2);
  font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-mono);color:var(--pr-tier-u)}
.pr-question-gate::before{content:"?";display:grid;place-items:center;width:16px;height:16px;border-radius:50%;
  border:1px solid var(--pr-tier-u);font-size:var(--text-micro);color:var(--pr-tier-u)}
.pr-question-resolve{font-size:var(--text-small);color:var(--muted);margin-top:var(--space-1);
  line-height:var(--leading-relaxed);max-width:var(--measure-prose)}
.pr-question-resolve b{color:var(--ink-2)}

/* ───────────────────────────────────────────────────────────────────
   3 · pr-gauge — the confidence gauge (NEW; no existing shape encodes a
   defeat-capped multi-dimensional score). Band is the hero (One-Hero-Metric);
   cap names the weak leg (Story-Over-Readout); dims are drill-down. Single-hue
   sequential fill; a High band earns the .ring edge in markup.
   ─────────────────────────────────────────────────────────────────── */
.pr-gauge{display:flex;flex-direction:column;gap:var(--space-2);min-width:11rem}
/* pr-gauge-label — the noun the band was missing. A bare "High" is an adjective with no
   scale, and to an uninitiated reader it invites the TRUTH reading digest 11 refuses
   (the verdict certifies examined-ness, never truth). The noun rides the ELEMENT rather
   than a page legend: meaning parked in a legend does not travel with the thing it
   explains, and a client walk runs many screens — a legend read once at the top is off-screen
   for nearly all of it (mark-never-alone, ratified 2026-07-29). The argument deliberately
   carries NO page-height figure: it never needed one, and a measured number in a rationale is
   a cached value with no dirty bit — the one that was here went stale by 2x in a day. */
.pr-gauge-label{display:block;font-family:var(--font-mono);font-size:var(--text-micro);
  letter-spacing:var(--track-caps);color:var(--muted)}
.pr-gauge-band{display:inline-flex;align-items:center;gap:var(--space-2);align-self:flex-start;
  font-family:var(--font-mono);font-size:var(--text-mono);letter-spacing:var(--track-wide);color:var(--ink-2);
  border:1px solid var(--hairline);border-radius:var(--radius-pill);padding:var(--space-2) var(--space-3)}
.pr-gauge-band .pr-band-dot{width:9px;height:9px;border-radius:50%;background:var(--pr-conf-3)}
/* the sequential encoding — band drives the dot hue; hue = the DEFEAT-CAPPED value, never the composite */
.pr-gauge[data-band="low"]      .pr-band-dot{background:var(--pr-conf-1)}
.pr-gauge[data-band="med-low"]  .pr-band-dot{background:var(--pr-conf-2)}
.pr-gauge[data-band="med"]      .pr-band-dot{background:var(--pr-conf-3)}
.pr-gauge[data-band="med-high"] .pr-band-dot{background:var(--pr-conf-4)}
.pr-gauge[data-band="high"]     .pr-band-dot{background:var(--pr-conf-5)}
/* pr-gauge-cap — the weak-leg story ("capped by build-feasibility") */
.pr-gauge-cap{font-family:var(--font-mono);font-size:var(--text-micro);color:var(--muted);letter-spacing:var(--track-wide)}
.pr-gauge-cap b{color:var(--ink-2);font-weight:400}
/* pr-gauge-ceiling — the capped-by-dependency cue (shown only in capped state, §2.1 req 3) */
.pr-gauge-ceiling{display:none;align-items:center;gap:var(--space-2);
  font-family:var(--font-mono);font-size:var(--text-micro);color:var(--pr-tier-u)}
.pr-gauge-ceiling::before{content:"⟂";color:var(--pr-tier-u)}
/* pr-gauge-dims — the per-dimension drill-down (A/B/C/D bars). Drill-only; composite never headlines. */
.pr-gauge-dims{display:flex;flex-direction:column;gap:var(--space-2);margin-top:var(--space-1)}
.pr-gauge-dim{display:grid;grid-template-columns:1.4rem 1fr auto;align-items:center;gap:var(--space-2);
  font-family:var(--font-mono);font-size:var(--text-micro);color:var(--muted)}
.pr-gauge-dim-track{height:5px;border-radius:var(--radius-pill);background:var(--hairline);overflow:hidden}
.pr-gauge-dim-fill{height:100%;border-radius:var(--radius-pill);background:var(--pr-conf-3);
  width:calc(var(--pr-dim,0) / 5 * 100%)}
.pr-gauge-dim[data-capping="true"] .pr-gauge-dim-fill{background:var(--pr-conf-1)}
.pr-gauge-dim[data-capping="true"]{color:var(--ink-2)}
.pr-gauge-composite{font-family:var(--font-mono);font-size:var(--text-micro);color:var(--muted);opacity:.8}
/* pr-gauge-drill (R1 2026-07-28) — the <details> wrapper the dims live behind. PROOF-INDEX has
   documented this affordance since the primitive landed ("pr-gauge-dims may live inside a <details>
   drill") while its CSS lived in two emitters' inline blocks and nowhere in canon: a five-place gap
   in a SHIPPED primitive, which is the exact shape codify-at-creation exists to prevent. The custom
   marker replaces the UA triangle because list-style:none is required to suppress it in WebKit. */
.pr-gauge-drill{margin-top:var(--space-1)}
.pr-gauge-drill > summary{font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-mono);
  color:var(--muted);cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:var(--space-2);
  border:1px solid var(--hairline);border-radius:var(--radius-pill);padding:var(--space-1) var(--space-2)}
.pr-gauge-drill > summary::-webkit-details-marker{display:none}
.pr-gauge-drill > summary::before{content:"▸";color:var(--muted)}
.pr-gauge-drill[open] > summary::before{content:"▾"}
.pr-gauge-drill > summary:hover{color:var(--ink-2)}
/* the OPEN band — a pr-question's gauge, whose band cannot resolve until an input lands. It carries
   NO band dot on purpose: gated ≠ low (pr-question's stated invariant), and a dot on the sequential
   ramp would grade a claim the district has declared ungradeable. The cap text takes --pr-tier-u,
   the district's open/unresolved register, rather than a confidence step. min-width:0 releases the
   11rem gauge floor because there is no band pill to hold open. */
.pr-gauge[data-band="open"]{min-width:0}
.pr-gauge[data-band="open"] .pr-gauge-cap{color:var(--pr-tier-u)}
.pr-gauge[data-band="open"] .pr-gauge-cap b{color:var(--pr-tier-u)}
/* the WITHHELD band (2026-07-30) — a band that RESOLVED and is deliberately not shown to this
   audience, distinct from `open` (cannot resolve yet). Conflating them would let a surface imply
   a claim is un-scorable when it is merely un-scored HERE. It generalizes exactly what `open`
   already established and adds nothing else: min-width:0 releases the band-pill floor. NO hue,
   NO token, NO ramp spend — the state is defined by what it does not render, and reaching for a
   colour would give a withheld grade a visual weight the withholding exists to remove. */
.pr-gauge[data-band="withheld"]{min-width:0}

/* ───────────────────────────────────────────────────────────────────
   4 · pr-grounds — the FOR region (support). Quiet, structural; encoded on
   the for-pole of the diverging margin. Grounds SUPPORT, never prove.
   ─────────────────────────────────────────────────────────────────── */
.pr-grounds{border-left:2px solid var(--pr-for);padding-left:var(--space-3);color:var(--ink-2);
  font-size:var(--text-body);line-height:var(--leading-relaxed);max-width:var(--measure-prose)}
.pr-grounds-label{font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-caps);text-transform:uppercase;
  color:var(--pr-for);margin-bottom:var(--space-1);display:block}

/* ───────────────────────────────────────────────────────────────────
   5 · pr-against — the LOAD-BEARING counter-evidence margin.
   Composes .railed / .rail-note in markup — the annotation rail is Corvus's
   structural signature, so examined counter-evidence is a NATIVE identity
   element and a MISSING margin is a visible hole in the drawing set.
   Encoded on the against-pole. The --empty state is invalid-by-construction.
   ─────────────────────────────────────────────────────────────────── */
.pr-against{display:flex;flex-direction:column;gap:var(--space-3)}
.pr-against-label{font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-caps);text-transform:uppercase;
  color:var(--pr-against);display:flex;align-items:center;gap:var(--space-2)}
.pr-against-item{border-left:2px solid var(--pr-against);padding-left:var(--space-3)}
.pr-against-item .pr-against-kind{display:inline-flex;align-items:center;gap:var(--space-2);
  font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-mono);text-transform:uppercase;color:var(--muted)}
.pr-against-item .pr-against-disp{color:var(--ink-2);font-weight:500}
/* DS-3 2026-07-28 — POLE SYMMETRY. This read --text-small (15px) + --muted while .pr-grounds (the
   FOR pole) reads --text-body (18px) + --ink-2: one full scale step and one ink step of advantage
   to the supporting evidence. The district's hardest declared invariant is that for/against are two
   STRUCTURAL poles in tension and never a good/bad register (BRAND-proof.md) — a typographic
   asymmetry contradicts it as surely as a green/red one would, and it systematically demotes the
   counter-evidence the against-column-is-load-bearing invariant exists to protect. The poles are now
   typographically equal; identity stays carried by RAIL POLE + hue, which is where it belongs. */
.pr-against-item p{color:var(--ink-2);font-size:var(--text-body);line-height:var(--leading-relaxed);
  margin-top:var(--space-1);max-width:var(--measure-prose)}
/* pr-against-weight — RETIRED 2026-07-30 (Steward ruling). The bar rendered a value the
   model reads only on `live` items and only as one binary at 0.6 (resolver.mjs:43,69,225):
   5 of 8 shipped bars encoded a number nothing consumed, and the 3 that mattered carried
   one bit across 1.7px of track. Re-scaling it to discriminate was refused on thesis
   grounds — manufacturing visible difference the resolver treats as identical is the
   laundering move this district exists to forbid, aimed at our own encoding. It was also
   the family's only mark-never-alone violator (the bar was the sole carrier of the value;
   "weight" labels the axis, not the number). `weight` survives as an authoring attribute
   and a model input; its consequence renders as words at pr-gauge-cap.
   Absence is pinned by an invariant tripwire — do not re-add without re-opening the ruling. */
/* ── the invariant made visible: an empty/unexamined margin renders as a WARN hatched hole,
   never a clean margin. Pairs with the gauge capping to floor (data-against-missing on the claim). */
.pr-against--empty{border-left:2px dashed var(--warn);padding:var(--space-3) var(--space-4);
  background:repeating-linear-gradient(135deg,transparent 0 6px,
    color-mix(in oklab,var(--warn) 12%,transparent) 6px 12px);
  font-family:var(--font-mono);font-size:var(--text-mono);color:var(--warn);line-height:var(--leading-body);
  max-width:var(--measure-prose)}
/* the ONE honest empty: a FILLED attestation item ("examined, none found") — passes the gate */
.pr-against-item[data-disposition="attested"] .pr-against-kind{color:var(--pr-tier-k)}

/* ───────────────────────────────────────────────────────────────────
   6 · pr-provenance — the evidence trail (KIU-tier badges + source anchors).
   Takes .s-provenance's selectable-not-link discipline (a view points home
   without becoming a nav trap). Collapsed by default via native <details>.
   ─────────────────────────────────────────────────────────────────── */
.pr-provenance{margin-top:var(--space-2)}
.pr-provenance > summary{font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-mono);
  color:var(--muted);cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:var(--space-2);
  border:1px solid var(--hairline);border-radius:var(--radius-pill);padding:var(--space-1) var(--space-3)}
.pr-provenance > summary::-webkit-details-marker{display:none}
.pr-provenance > summary:hover{color:var(--ink-2);border-color:color-mix(in oklab,var(--pr-for) 40%,var(--hairline))}
.pr-provenance[open] > summary{color:var(--ink-2)}
.pr-prov-list{display:flex;flex-direction:column;gap:var(--space-2);margin-top:var(--space-2);padding-left:var(--space-1)}
.pr-prov-item{display:flex;align-items:baseline;gap:var(--space-2);
  font-family:var(--font-mono);font-size:var(--text-mono);color:var(--muted);
  border-top:1px solid var(--hairline);padding-top:var(--space-2);user-select:text}
/* pr-prov-tier — K grounded/lit, I reasoned, U hollow/open: honesty encoded in weight */
.pr-prov-tier{flex:none;display:inline-grid;place-items:center;width:18px;height:18px;border-radius:var(--radius-xs);
  font-size:var(--text-micro);font-weight:700;color:var(--ground)}
.pr-prov-tier[data-tier="K"]{background:var(--pr-tier-k)}
.pr-prov-tier[data-tier="I"]{background:var(--pr-tier-i)}
/* U = hollow: an OUTLINE, not a fill — the honest gap reads as absence, not evidence */
.pr-prov-tier[data-tier="U"]{background:transparent;border:1px solid var(--pr-tier-u);color:var(--pr-tier-u)}
/* DS-1 2026-07-28: capped. Each entry is "SOURCE-ID — <a full explanatory gloss>", so this is
   reading prose wearing a citation's clothes, and it measured 92ch at 12.5px mono. Gate 6 did NOT
   catch it: the rule sets a reading size but NO line-height, so the "reading size + prose leading"
   proxy has nothing to match on. Named as an honest limit of that gate, not papered over. The mono
   citation register is KEPT — this is the deepest drill altitude, behind a collapsed <details> the
   reader opts into, and mono is right for a source trail; the defect was the uncapped width, which
   is what compounded it. Whether the gloss belongs at this altitude at all is a content question,
   flagged to the layout/content seam rather than answered by restyling the primitive. */
.pr-prov-src{color:var(--ink-2);max-width:var(--measure-prose)}

/* the inline provenance span (Pandoc [K5]{.pr-prov}) — a single citation woven into prose.
   Namespaced pr-prov (not the design-of-record's .prov) to hold the three-way pr-disjoint invariant.
   THE DOTTED BORDER WAS REMOVED 2026-07-30 (Steward ruling 2a). It was the browser's own
   <abbr title> convention with nothing behind it — no href, no title, no aria-describedby, no
   hover rule — so it recruited the reader into hovering and returned nothing: a false
   affordance, in the one district whose entire thesis is that what a surface shows is what it
   can back. The fix is not to decorate around it. The marker BECOMES interactive (compose
   .pr-xref, § 6b) and the pretend treatment is replaced by the real one. data-tier keeps
   owning TIER; pr-xref owns the LINK — orthogonal channels, one owner each.
   user-select:text SURVIVES on pr-prov-item / pr-prov-src, where the selectable-not-link
   reasoning is sound: the collapsed trail's citation text is for copying, not clicking. It was
   only the INLINE case where that reasoning failed. */
.pr-prov{font-family:var(--font-mono);font-size:.82em;color:var(--ink-2);user-select:text}
.pr-prov[data-tier="U"]{color:var(--pr-tier-u)}

/* ───────────────────────────────────────────────────────────────────
   6b · pr-xref / pr-source-link — the two access paths
   TWO destinations, therefore two primitives with one visual grammar.
   pr-xref points INSIDE this surface's own apparatus (the inline tier
   marker into the provenance trail; the "Rests on P1, FAR-16.601, K5."
   ids). Its failure mode is a dead anchor. pr-source-link points OUT to
   a primary source the reader can check without us in the middle. Its
   failure mode is an OVERCLAIM, which is why only it carries the
   read-date, the honest-absence sibling, and the new-tab treatment.
   THE CUE IS STRUCTURAL, NEVER HUE. The diverging poles own the hue
   channel and the ramp is rationed to where it is earned, so a coloured
   link would both spend a rationed register on chrome AND read as a
   STANDING — a reference tinted --pr-for inside an against-item would
   tell the reader the counter-evidence supports. color:inherit is
   therefore deliberate: a link inside the for pole and a link inside the
   against margin must not both turn one colour. The underline says
   "link"; the ↗ says "leaves the page". Both survive forced-colors and
   one-ink print (the pr-claim-status hollow-dot standard).
   ─────────────────────────────────────────────────────────────────── */
.pr-xref,.pr-source-link{color:inherit;text-decoration:underline;
  text-decoration-color:var(--hairline);text-decoration-thickness:1px;
  text-underline-offset:2px;transition:text-decoration-color .3s var(--ease)}
.pr-xref:hover,.pr-xref:focus-visible,
.pr-source-link:hover,.pr-source-link:focus-visible{text-decoration-color:var(--ink-2)}
.pr-xref:focus-visible,.pr-source-link:focus-visible{outline:1px solid var(--ink-2);
  outline-offset:2px;border-radius:var(--radius-xs)}
/* the access path is its OWN LINE, not a continuation of the source sentence. Added on
   render evidence (2026-07-30): composed inline per the ruling's markup it read as run-on
   prose — "…THE anchor gap. not publicly checkable — a direct conversation" parses as one
   sentence, and colour alone at this size is too weak a boundary to separate the surface's
   own voice from the source's. A block line is the same fix pr-gauge-cap already uses to
   keep the frame off the band. */
.pr-source-path{display:block;margin-top:var(--space-1)}
/* the outbound mark — a monochrome symbol glyph, aria-hidden so it never enters the
   accessible name. The visible non-hue cue that distinguishes off-page from in-page. */
.pr-source-link{white-space:nowrap}
.pr-source-out{margin-left:.25em;font-size:.85em;vertical-align:baseline}
/* the honest no-URL case. NEVER --warn and never a hatch: digest 11 reserves the hole for
   missing counter-evidence, and a source having no public URL is a fact about the SOURCE,
   not a defect in the argument — spending the warn register here would dilute the one mark
   the district cannot afford to dilute. Never a disabled-looking link either: a dead
   affordance is the half-state promise § 6 just retired. It states the absence in words, in
   the neutral register — the same move pr-against's "examined, none found" makes, where the
   honest empty is a FILLED slot rather than a missing one. */
.pr-source-none{color:var(--muted)}
/* the read-date. Provenance-drill altitude ONLY — never on a claim, never in pr-gauge:
   claim currency is data-attest's channel, and two currency channels at one altitude is
   drift (the one at glance altitude would win, and it is the wrong one). The words are
   "read against the source", never "verified": they name the ACT, not the OUTCOME, exactly
   as "examined" does at the verdict (representation-contract §4.3 vocabulary floor). */
.pr-source-read{color:var(--muted);font-size:var(--text-micro)}
/* visually-hidden utility — the district had none anywhere. Scoped here as its first
   confirming driver: an unannounced target=_blank is a real a11y defect, not polish, and
   B9's retirement note asked for exactly such a driver before scoping this. Appended to
   visible link text so the accessible name stays DERIVED from visible copy plus one fixed
   suffix, never hand-authored per link (the pr-figure discipline). */
.pr-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0}

/* ───────────────────────────────────────────────────────────────────
   7 · pr-review-note — BUILD-MODE review scaffolding (PG-1)
   The load-bearing half of this primitive is NOT here. It is the emit-time
   OMISSION in render/handlers.mjs: when the renderer's review flag is off the
   note is NEVER EMITTED, so the shipped output contains no trace. CSS hiding
   was rejected outright — it leaves notes addressed to a named pre-reviewer in
   view-source on a client-facing host (a confidentiality defect), and it fails
   the diff requirement on its face. There is deliberately NO [data-review]
   selector in this file; a runtime notes-on/off toggle would re-create the
   rejected implementation (gate: review-note-residue).
   Register: the district's OPEN/UNRESOLVED vocabulary (--pr-tier-u), NOT --warn.
   A note is an open question about the surface, not a compromise of its standing;
   --warn is spoken for by pr-against--empty and must stay unmistakable.
   Residue-freedom is structural: no counter participation, no inbound refs, no
   id, no reserved layout slot, no ancestor mutation. It is a flow sibling only.
   ─────────────────────────────────────────────────────────────────── */
.pr-review-note{display:flex;flex-direction:column;gap:var(--space-1);
  border:1px dashed color-mix(in oklab,var(--pr-tier-u) 55%,var(--hairline));
  border-radius:var(--radius-xs);padding:var(--space-2) var(--space-3);
  margin:var(--space-3) 0}
.pr-review-note-to{font-family:var(--font-mono);font-size:var(--text-micro);
  letter-spacing:var(--track-caps);text-transform:uppercase;color:var(--pr-tier-u);
  display:inline-flex;align-items:center;gap:var(--space-2)}
/* the scaffolding mark — the annotation rail's note-head tick geometry (16×3px pill), in the
   OPEN register rather than the ramp: a review note is a kind of margin note, so it rhymes with
   .rd rather than inventing a mark, and it spends no ramp (Restraint-Earns-Ramp). A dashed rule
   was tried first and read as an em-dash run in the text — a solid tick cannot be misread. */
.pr-review-note-to::before{content:"";width:16px;height:3px;flex:none;
  border-radius:var(--radius-pill);background:var(--pr-tier-u)}
.pr-review-note-body{font-size:var(--text-small);color:var(--muted);line-height:var(--leading-relaxed);max-width:var(--measure-prose)}

/* ───────────────────────────────────────────────────────────────────
   8 · pr-figure — the figure family (PG-3)
   Framed by a STATEMENT TITLE carrying the takeaway, not a caption: it must
   stand alone when the image does not render. NO figure numbers (#78) — a
   scrolling surface with no cross-references has nothing to number for, and
   numbers invite a counter, which is residue (gate: figure-no-numbers).
   Alt is DERIVED in the handler from statement + note and is never authored,
   so it cannot drift and carries no unproofread string; a longer description
   is VISIBLE content (pr-figure-desc + aria-describedby), never a hidden attr.
   The media frame is its own bounded region rather than a composed .panel: a
   .panel carries a hover border-lift and an inset top-light meant for an
   interactive content card, both wrong for a static image frame. (This
   DIVERGES from the resolution's §3.2 sketch, which named `.block` — section.block
   is a page-section frame with --space-section vertical padding and a top rule;
   composing it inside a figure would import a page-scale gap. Divergence stated,
   not silent.) No aspect-ratio or max-height is authored: Corvus has no named
   scale for either, so the frame takes width:100% and the asset's own intrinsic
   ratio — no dimensional value is authored at all (token-foundation I10).
   ─────────────────────────────────────────────────────────────────── */
.pr-figure{display:flex;flex-direction:column;gap:var(--space-3);margin:0}
.pr-figure-statement{font-family:var(--font-display);font-weight:600;font-size:var(--text-body-lg);
  letter-spacing:var(--track-tight);line-height:var(--leading-snug);color:var(--ink);max-width:var(--measure-lede)}
.pr-figure-media{border:1px solid var(--hairline);border-radius:var(--radius-md);
  background:var(--inset);overflow:hidden}
.pr-figure-media img,.pr-figure-media svg{display:block;width:100%;height:auto}
/* ── the media slot's SECOND legal filling: a composed brand-core block ──
   The contract was widened to admit one (a `.stat`, a `.compare`) as the condition of `.stat`
   collapsing into this primitive instead of taking a `pr-stat`. The frame itself was still tuned
   for the first filling only: an ASSET bleeds to the border by design (`width:100%`, its own
   intrinsic ratio), so the base rule authors no padding — and live text inherited that and sat on
   the border.
   Two declarations, and both are consequences of the widening rather than taste:
   · padding, because text needs a margin from a rule and an image does not;
   · the first child's own top margin is zeroed, because brand-core blocks carry a `margin-top`
     sized to separate them from the PROSE ABOVE THEM (`.compare`, `.terms`), and inside a frame
     that separation is already the frame's job — left alone it opens a gap at the top with none
     at the bottom, which reads as a misaligned block rather than a framed one.
   Still no aspect-ratio and no max-height: a composed block's height is governed by its content
   and the type tiers it consumes, which is the same thing that governs it anywhere else. ── */
.pr-figure-media--composed{padding:var(--space-6)}
.pr-figure-media--composed > :first-child{margin-top:0}
/* the margin note composes brand-core .rail-note in markup — the SAME note register
   pr-against rides, so figure asides and counter-evidence asides speak one voice.
   .rail-note carries its own family + size since 2026-07-27, so no .mono is needed. */
.pr-figure-note{margin-bottom:0}
.pr-figure-desc{font-size:var(--text-small);color:var(--muted);line-height:var(--leading-relaxed);max-width:var(--measure-prose)}
.pr-figure-access{margin-top:0}
/* ── the access invariant made visible: a figure that DECLARES a claim class
   (data-claim-class, C1–C8) and offers no access path cannot render clean. This is
   the against-invariant's refuse-to-render-clean mechanism reused, deliberately.
   TREATMENT NOTE: a dashed --warn rule + --warn mono text, NOT the hatched field.
   The hatch is pr-against--empty's alone — one treatment, one meaning — and a second
   hatch would blur the district's most load-bearing signal. */
.pr-figure--unsourced{border-left:2px dashed var(--warn);padding:var(--space-3) var(--space-4);
  font-family:var(--font-mono);font-size:var(--text-mono);color:var(--warn);
  line-height:var(--leading-body);max-width:var(--measure-prose)}

/* ───────────────────────────────────────────────────────────────────
   9 · pr-diff — what changed relative to an approved snapshot (§5.3)
   Provenance-shaped, so it lives in this district: "what changed since approval"
   is an evidence question, not a UI one. THE POLE ASSIGNMENT IS THE CODIFIED PART:
   removals ride --pr-against, insertions ride --pr-for — what WAS there is the
   against pole, what REPLACED it is the for pole, and neither reads as good-or-bad.
   The obvious instinct (red deletions, green insertions) would violate the district's
   hardest color constraint outright, so --success/--error are refused by gate
   (diff-pole-encoding). Semantics carried by <del>/<ins>, not by class alone.
   ─────────────────────────────────────────────────────────────────── */
.pr-diff{border:1px solid var(--hairline);border-radius:var(--radius-sm);
  padding:var(--space-4);background:var(--inset)}
.pr-diff-label{display:block;font-family:var(--font-mono);font-size:var(--text-micro);
  letter-spacing:var(--track-caps);text-transform:uppercase;color:var(--muted);margin-bottom:var(--space-2)}
.pr-diff-body{font-size:var(--text-body);line-height:var(--leading-relaxed);color:var(--ink-2);max-width:var(--measure-prose)}
.pr-diff-from{text-decoration:line-through;text-decoration-thickness:1.5px;
  text-decoration-color:var(--pr-against);color:var(--muted)}
.pr-diff-to{text-decoration:none;color:var(--ink);border-bottom:2px solid var(--pr-for);padding-bottom:1px}

/* ───────────────────────────────────────────────────────────────────
   10 · pr-masthead — standing orientation chrome (R1 2026-07-28)
   Composes brand-core .masthead in markup (sticky + backdrop + hairline)
   and .brandmark for the identity line. THE INVARIANT THAT MAKES THIS A
   pr- PRIMITIVE RATHER THAN PAGE FURNITURE: it carries NO authority
   register — no pr-claim, no pr-gauge, no .ring — because a masthead is
   read as the surface speaking about itself, and a surface that decorates
   its own frame with the earned edge has spent authority it did not earn
   (representation-contract §4.3: the verdict is the SOLE authority-bearing
   element). Orientation is allowed to say what this page IS and what it
   will do; it is not allowed to say how well it did it.
   Codified from cc-offer.html's inline block, where it was flagged for
   five-place codification at authoring time and then sat un-codified.
   ─────────────────────────────────────────────────────────────────── */
.pr-masthead{padding:clamp(12px,1.8vw,18px) 0}
/* the column body composes .wrap in markup for its gutter + max-width; this class carries ONLY the
   stacking delta. Styling `.pr-masthead .wrap` directly would restyle a brand-core primitive from
   inside the district, which the compose-don't-fork boundary refuses (PROOF-INDEX § brand-default). */
.pr-masthead-body{display:flex;flex-direction:column;gap:var(--space-2)}
.pr-masthead-top{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);flex-wrap:wrap}
/* composes .brandmark (face/weight/size/tracking/flex/gap live there, once); the delta is ink only */
.pr-masthead-identity{color:var(--ink)}
.pr-masthead-eyebrow{font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-caps-xl);
  text-transform:uppercase;color:var(--muted)}
/* the wordmark inside the eyebrow — the display face at reading weight, secondary ink, and
   text-transform:none to opt OUT of the eyebrow's uppercase (a name is not a label). */
.pr-wordmark{font-family:var(--font-display);font-weight:700;letter-spacing:var(--track-tight);
  color:var(--ink-2);text-transform:none}
/* The two orientation prose lines that lived here moved out of the sticky masthead
   into the page's own opening block on 2026-07-29, and the class names followed on
   07-30: see § 12 · pr-orientation. The masthead keeps identity, eyebrow, and the
   control it hosts — the parts that are genuinely standing chrome. */

/* ───────────────────────────────────────────────────────────────────
   11 · pr-arc-locator — the wayfinding rail over a derivation arc
   A cousin of the site layer's .s-anchor-rail, NOT a fork: it shows
   position (aria-current) + adjacency (every stop visible at once) and
   adds the one thing a site rail has no concept of — A STATE MIRROR PER
   STOP, drawn from the DISTRICT'S OWN proof-state vocabulary (framing ·
   passed · defeated · capped · contested · verdict). That mirror is the
   invariant: the rail reports each station's standing rather than merely
   naming it, so a reader can see the shape of the walk — including where
   it FAILED — before reading a word of it. A stop whose dot did not track
   its station's real state would be an authority claim the walk never made.
   TYPE REGISTER (DS-4, 2026-07-28): uppercase is a LABEL register, never a
   NAVIGATION register — these stops converge on .s-nav-link's type rather
   than inventing a second nav register. The stop NUMBER keeps mono +
   tracking: a bare numeral is a label with no word-shape to lose.
   ─────────────────────────────────────────────────────────────────── */
.pr-arc-locator{margin-top:var(--space-1)}
.pr-arc-list{display:flex;flex-wrap:wrap;gap:var(--space-2);list-style:none;padding:0;margin:0}
.pr-arc-stop{display:inline-flex;align-items:center;gap:var(--space-2);text-decoration:none;white-space:nowrap;
  font-family:var(--font-text);font-weight:500;font-size:var(--text-small);letter-spacing:var(--track-normal);
  color:var(--muted);border:1px solid var(--hairline);border-radius:var(--radius-pill);
  padding:var(--space-1) var(--space-3);
  transition:color .3s var(--ease),border-color .3s var(--ease)}
.pr-arc-stop:hover{color:var(--ink-2)}
.pr-arc-stop[aria-current="location"]{color:var(--ink);border-color:color-mix(in oklab,var(--c3) 45%,var(--hairline))}
.pr-arc-stop-no{color:var(--muted);font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-caps)}
.pr-arc-stop[aria-current="location"] .pr-arc-stop-no{color:var(--ink-2)}
/* the state mirror. --hairline is the honest DEFAULT (a station with no declared state reads as
   unmarked, never as passed) and each state maps to the register it already owns elsewhere in the
   district — so the rail cannot invent a standing the walk does not hold. */
.pr-arc-stop-state{width:8px;height:8px;border-radius:50%;background:var(--hairline);flex:none}
.pr-arc-stop[data-state="framing"]   .pr-arc-stop-state{background:var(--muted)}
.pr-arc-stop[data-state="passed"]    .pr-arc-stop-state{background:var(--pr-conf-5)}
.pr-arc-stop[data-state="defeated"]  .pr-arc-stop-state{background:var(--warn)}
.pr-arc-stop[data-state="capped"]    .pr-arc-stop-state{background:var(--pr-conf-3)}
.pr-arc-stop[data-state="contested"] .pr-arc-stop-state{background:var(--pr-tier-u)}
.pr-arc-stop[data-state="verdict"]   .pr-arc-stop-state{background:var(--pr-tier-k)}
/* the waypoint stop — a dashed edge in the defeat register, marking the station where the walk
   turns on a defeated thesis rather than accumulating support. */
.pr-arc-waypoint{border-style:dashed;border-color:color-mix(in oklab,var(--warn) 45%,var(--hairline))}

/* ── 11b · the RAIL form — a vertical spine instead of a pill row (R2.3, 2026-07-29)
   Aaron asked for this three times, which is itself the finding. The read (Brand
   Identity Director — Corvus): the pill row spent POSITION — the strongest channel
   available — on nothing. Seven bordered pills say "seven objects of equal standing
   in no fixed order"; the content is ONE PATH with seven ORDERED stations, and
   ordinality was carried only by the mono numerals. A vertical list puts the order
   on the axis that already means order.
   Second reason, from the thesis: seven bordered pills are seven floating
   enclosures, where the district's depth idiom is plane value plus a hairline
   (guardrail 1 — nothing floats). The rail drops the enclosure and keeps the
   hairline as a SPINE, which is also what gives the state mark a geometry to sit
   on instead of pure pigment — color from architecture, at mark scale.
   ADDITIVE MODIFIER, not a replacement: the horizontal form stays legal and
   documented (proof-system.html's specimen), and a surface chooses. Converges on
   the site layer's .s-anchor-rail (sticky, ~220px column) with one deliberate
   divergence — the line runs THROUGH the marks, first-centre to last-centre,
   rather than being a container border-right, because the spine is the arc, not
   the column's edge.
   ─────────────────────────────────────────────────────────────────── */
.pr-arc-locator--rail{margin-top:0}
.pr-arc-locator--rail .pr-arc-list{flex-direction:column;flex-wrap:nowrap;gap:0}
/* the enclosure comes off: no border, no pill radius, and the label is allowed to
   wrap now that it owns a column instead of a row. */
/* no `border-radius` reset here on purpose: gate 2 (no-raw-dimension) refuses a raw
   `0`, the radius tier has no zero member, and adding one is a foundation change
   that belongs to the Steward — not a side-effect of a page's nav shape. It is also
   unnecessary: with no border and no background there is nothing for a radius to
   clip, so the inherited --radius-pill has no visual effect. */
/* ── the row (Typography Craft, 2026-07-30) ──────────────────────────
   ONE PRINCIPLE: text aligns itself on a shared baseline; gutter objects hang
   from one declared axis. Each of the four defects this replaces was one half
   of that being violated.

   GRID, NOT FLEX, and `align-items:baseline`. The flex form aligned on
   `flex-start`, so the numeral (17.66px line box) and the label (24.06px) agreed
   at their TOPS and their baselines were 5px apart on every stop — the numeral
   read as superscripted. Baseline is what inline layout computes for free; the
   bug was opting out of it. The bare label text node becomes an ANONYMOUS GRID
   ITEM and participates in baseline alignment (measured: shared baseline exact
   on all 7 stops) — which is what keeps this fix CSS-only, with no markup change.
   Grid also gives the hanging indent for free: a wrapped label stays in column 2
   instead of running back under the numeral, where flex needed a text-indent hack.

   WHY ONE POSITION SATISFIES BOTH FACES — a gift from the pairing, not a
   compromise: the numeral's lining figures at --text-micro have a 7.88px ink
   height, and the label's lowercase at --text-small has a 7.67px x-height. They
   agree within 0.21px, so once the two share a baseline they share an ink BAND —
   the digits land level with the label's x-height and `01 the shared repricing`
   reads as one line of text rather than a tag beside a label. Centre the mark on
   that band and it is 0.06px off the numeral's figure centre AND 0.17px off the
   label's x-height centre. The old setting was correct against the numeral
   (0.55px) and 5.65px out against the label — not because its number was wrong
   but because the two references disagreed by 5px.

   LEADING FROM THE SPACE TIER IS A DECLARED REGISTER SPLIT, not drift
   (substrate-override-declared). Reading blocks take ratio leading from
   --leading-* so it scales with size; this is fixed-size CHROME whose job is even
   vertical rhythm, which is the space tier's stated purpose — so its first line
   box is --space-6 and the pitch is exactly 40px, on the 4px grid (digest #3).
   It was 40.06px, which is invisible but off-grid. Gate 6 corroborates the split
   independently: its running-prose proxy is a reading size AND a --leading-*
   token in one rule, so a space-tier line-height correctly reads as "not prose."
   ─────────────────────────────────────────────────────────────────── */
.pr-arc-locator--rail .pr-arc-stop{
  /* the mark's diameter — also drives the spine's x, so the hairline centres
     itself in the mark whatever the diameter becomes (was a magic 3.5px). */
  --pr-arc-mark:8px;
  /* the first line's box height. Consumed by line-height AND by the axis below,
     so the two cannot disagree. */
  --pr-arc-lh:var(--space-6);
  /* THE ONE VERTICAL AXIS. Every gutter object hangs from this — the mark's top
     and the spine's top AND bottom — replacing three drifting copies of
     `calc(var(--space-2) + 0.5em)`, which is how the spine came to fall 7.5px
     short of the mark below it while the mark itself looked fine.
     The +1px is a NAMED OPTICAL CORRECTION, not a fudge: type sits low in its
     line box, so the ink centre is 1.07px below the box centre. Better written
     visibly than buried in an `em` that only accidentally lands near it.
     NOTE: var(--space-2) appears here AND in `padding` below and they must agree.
     Gate 2b requires spacing to be literally var(--space-*) — a local alias fails
     it, and wrapping padding in calc() would SKIP the gate, which digest #13
     forbids. Two references bound by this comment beat three unbound ones. */
  --pr-arc-line:calc(var(--space-2) + var(--pr-arc-lh)/2 + 1px);
  position:relative;
  display:grid;grid-template-columns:auto minmax(0,1fr);
  align-items:baseline;column-gap:var(--space-3);
  white-space:normal;text-wrap:pretty;border:0;
  line-height:var(--pr-arc-lh);
  padding:var(--space-2) 0 var(--space-2) var(--space-4)}
/* --track-caps (0.1em) exists to open up UPPERCASE letterforms; this is lining
   figures and is no longer set in caps, so caps-tracking was the wrong token for
   the string. --track-mono is the mono tier's own tracking — DS-4's "the numeral
   keeps mono and tracking" is honored, at the correct step. It also narrows the
   numeral 0.89px, which is 15% of the label column's total slack (see § measure).
   The explicit tight leading keeps the numeral's own line box from hanging 1px
   below the label's once baseline alignment shifts it down, which is what made
   the row 41px instead of 40px. */
.pr-arc-locator--rail .pr-arc-stop-no{
  line-height:var(--leading-tight);letter-spacing:var(--track-mono)}
/* the spine: this mark's centre to the next mark's centre. Both ends read
   --pr-arc-line, so the shortfall cannot recur. The last stop draws none — the
   arc ends at the final station, it does not trail off. */
.pr-arc-locator--rail .pr-arc-stop::before{content:"";position:absolute;
  left:calc(var(--pr-arc-mark)/2 - .5px);
  top:var(--pr-arc-line);bottom:calc(var(--pr-arc-line) * -1);
  width:1px;background:var(--hairline)}
/* scoped to the LIST ITEM, not the stop: every .pr-arc-stop is the only child of
   its <li>, so `.pr-arc-stop:last-child` matches all seven and silently erased
   every spine segment (caught on render, 2026-07-29 — invisible in the CSS). */
.pr-arc-locator--rail .pr-arc-list > li:last-child .pr-arc-stop::before{content:none}
/* the mark hangs from the one axis, centred on the shared ink band. box-sizing
   is set here so B10's hollow variant (1px border) stays the same diameter and
   the same distance onto the spine as a filled one. */
.pr-arc-locator--rail .pr-arc-stop-state{position:absolute;left:0;
  width:var(--pr-arc-mark);height:var(--pr-arc-mark);box-sizing:border-box;
  top:var(--pr-arc-line);transform:translateY(-50%)}
/* CURRENT STOP — the ramp tick is DELETED, and the reason is convergence rather
   than collision. It was a treatment imported without its reason: .s-nav-link
   (the HORIZONTAL nav) carries a 2px ramp bar as an UNDERLINE, which works
   because a horizontal row has a free edge below it. The rail rotated that into
   a vertical tick and parked it on the one axis the state mark already owns — so
   it painted OVER the dot (::after follows the mark in DOM order) and protruded
   4px top and bottom, on both axes inside the dot. Its true sibling,
   .s-anchor-link at >=1040px (the site's own VERTICAL rail), cues with the ink
   step and nothing else. Guardrail 1 read straight agrees: the ramp is rationed
   and never fills chrome, and a nav rail is chrome.
   So the cue is the ink step + a WEIGHT step, three properties over two channels
   (accumulation), with no drawn element and no axis to collide on.
   THE WEIGHT STEP CAN ONLY LIVE ON THE NUMERAL, and that is a substrate fact:
   Instrument Sans is loaded at 400 and 500 upright ONLY, so a 600 label would be
   SYNTHETIC bold — muddy at 15px and metrically unreliable, the same failure
   class as faux-italic in mono. Space Mono ships a real 700, and because it is
   monospaced that 700 is METRIC-IDENTICAL to its 400 (measured: 14.84px for `01`
   at both). So this moves nothing — the auto column does not resize, the label
   column does not narrow, and the label's 5.95px of slack is untouched. */
.pr-arc-locator--rail .pr-arc-stop[aria-current="location"]{border:0}
.pr-arc-locator--rail .pr-arc-stop[aria-current="location"]::after{content:none}
.pr-arc-locator--rail .pr-arc-stop[aria-current="location"] .pr-arc-stop-no{font-weight:700}
/* the waypoint loses its dashed pill edge in rail form, so the dash moves to the
   spine segment below it — the same "un-crystallized" register, on the line that
   now carries the walk. */
.pr-arc-locator--rail .pr-arc-waypoint{border:0}
.pr-arc-locator--rail .pr-arc-waypoint::before{background:none;
  border-left:1px dashed color-mix(in oklab,var(--warn) 45%,var(--hairline))}

/* ───────────────────────────────────────────────────────────────────
   12 · pr-orientation — the arrival prose (renamed from pr-masthead-why,
   2026-07-30). Location-neutral by design: it inherits pr-masthead's
   PROHIBITION, not its position. When the line left the sticky header for
   the page's opening block (07-29) the prohibition travelled with it and
   the name did not, so for one day the class misdescribed its own location.
   THE CONTRACT IS THE PROHIBITION: orientation may say what this surface IS
   and what it WILL DO; it may never say how well the argument went. No
   pr-claim, no pr-gauge, no .ring, no band, no verdict vocabulary
   (representation-contract §4.3 — pr-walk-verdict is the SOLE
   authority-bearing element). That is why this is canon and not page
   furniture: furniture would need no rule.
   --measure-prose (66ch), NOT the 72ch it was authored at: 72ch was a
   hand-set literal from before the measure tier existed, and the tier's
   whole point is that a reading cap is a token. Running prose, capped
   (gate 6).
   pr-masthead-agenda was RETIRED with the rename, not renamed alongside —
   it had zero production consumers (the emitter cut it 07-30 as
   triplication of the arc rail plus four downstream hooks) and its only
   use was its own specimen. Its negative top margin went with it: closing
   a gap between two specific siblings is a page's arrangement, and
   .cc-opening's own gap already owns it.
   ─────────────────────────────────────────────────────────────────── */
/* ── pr-reading-key — the surface's reading key, graduated 2026-07-30 ──
   Contract ratified first, form deferred to this pass deliberately; the ledger entry existed so a
   designer arriving here would find the decided semantics instead of inventing against them.

   IT CARRIES ONLY THE TWO WHOLE-APPARATUS INVARIANTS no individual element can state about itself:
   counter-evidence is load-bearing and its absence renders as a hole; a verdict certifies
   examined-ness, never truth. Everything else a reader needs is carried BY THE ELEMENT THAT MEANS
   IT — the gauge names its own noun, pr-prov expands its tier on first use — so this is
   per-notation-primary and key-strictly-secondary. The two invariants are a CEILING, not a starting
   point: the natural pressure on any legend is accretion, and every accretion is meaning parked
   away from the element that means it.

   FORM: a collapsed <details>, reusing pr-provenance's disclosure pattern rather than inventing a
   second one — no new interaction contract, no half-state, and it works with the CSS blocked.
   Collapsed by default is the honest default: per-notation-primary means a reader who never opens
   it has lost nothing the notation did not already say.

   THE RAIL WAS REFUSED ON A CHECKABLE FACT, not on taste. The empty left column is tempting and
   `cc-offer.css` sets `.cc-rail{position:sticky}`, while the ratified contract closes persistence —
   the key may not be sticky, repeated, or always-present. A permanent key is the standing
   invitation to move meaning back into it, which dissolves per-notation-primary one helpful
   addition at a time.

   NO AUTHORITY REGISTER: no .ring, no band, no verdict vocabulary, no outcome summary. It explains
   HOW TO READ the apparatus; it never reports how this argument went — the same prohibition
   pr-orientation inherits, because chrome that summarizes outcome has spent the verdict's
   exclusivity. */
.pr-reading-key{margin-top:var(--space-3)}
.pr-reading-key > summary{font-family:var(--font-mono);font-size:var(--text-micro);letter-spacing:var(--track-mono);
  color:var(--muted);cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:var(--space-2);
  border:1px solid var(--hairline);border-radius:var(--radius-pill);padding:var(--space-1) var(--space-3)}
.pr-reading-key > summary::-webkit-details-marker{display:none}
.pr-reading-key > summary:hover{color:var(--ink-2);border-color:color-mix(in oklab,var(--pr-for) 40%,var(--hairline))}
.pr-reading-key[open] > summary{color:var(--ink-2)}
.pr-reading-key-list{display:flex;flex-direction:column;gap:var(--space-2);margin-top:var(--space-3);
  padding-left:var(--space-1);list-style:none}
.pr-reading-key-item{font-family:var(--font-text);font-size:var(--text-small);color:var(--ink-2);
  line-height:var(--leading-relaxed);border-top:1px solid var(--hairline);padding-top:var(--space-2);
  max-width:var(--measure-prose)}

.pr-orientation{font-family:var(--font-text);font-size:var(--text-small);color:var(--ink-2);
  line-height:var(--leading-relaxed);max-width:var(--measure-prose)}
