/* ==========================================================================
   exp35 . p35-pubproof.css
   Owned by the /public-proof builder. Styles exactly one page:

     public-proof.html   PLAN-35-IA §8.4  "Evidence you can inspect.
                                            Misses included."

   THE PAGE'S GOVERNING RULE (plan §8.4): do not turn this into a vanity
   metrics page; lead with inspectability. That rule is enforced here in CSS
   as well as in copy: the largest typographic objects on the page are the
   DOORS (things a visitor can open) and the RECORDS (things a visitor can
   read). The three campaign counts get one quiet mono line, smaller than the
   body copy around them, and no cell, band or divider of their own.

   Contract with the shell
     - colour comes ONLY from tokens, so all seven themes follow
       (--paper --card --ink --ink-rgb --ink-60 --ink-40 --muted --hair
        --hair-strong --signal --pass --fail --stale --unknown --radius
        --sans --mono --prose).
     - typography obeys the two-layer rule: var(--prose) for every sentence a
       visitor reads, var(--mono) for IDs, record labels, artifact paths and
       status chips.
     - motion reuses the shell's arrival system: site.js adds .in to
       [data-reveal]; strokes are pathLength="1" + .dr, text is .fx. No script
       of its own.

   SEMANTIC COLOUR (exp33/exp35 contract) — state is never carried by the
   accent:
     verified / fixed / covered      var(--pass)
     violated / escaped / uncovered  var(--fail)
     unproven, unnamed, structural   var(--unknown, var(--muted))
     hairlines and rules             var(--hair) / var(--hair-strong)
     var(--signal)                   affordance only. On this page it appears
                                     on the doors, the quiet links and the CTA,
                                     and it never paints a state.

   Every class is prefixed .pp- so nothing can collide with site.css,
   graph-sections.css, agent-sections.css or any s35-*.css.
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. ADDITIVE TOKEN DEFAULTS
   --stale and --unknown are part of the exp35 token contract but are only
   defined in theme-verified.css, which this page does not load (it is an
   index-only stylesheet). The two values below are copied from that file's
   §0 defaults verbatim, including the terminal re-key, so the contract holds
   here without pulling an index-only sheet onto this page. Both are mid-tone
   on purpose: 3.7:1 on the paper ground, 4.2:1 on the night ground.
   -------------------------------------------------------------------------- */
:root{
  --stale:#AF7317;
  --unknown:#7E7E79;
}
html[data-theme="terminal"]{--unknown:#6FAE86;}

/* ==========================================================================
   1. HERO . the doors
   The first object under the H1 is not a number. It is six things a visitor
   can open, in a grid, each one a real artifact on a public host.
   ========================================================================== */
.pp-hero{padding-bottom:clamp(2.4rem,4vw,3.4rem);}
.pp-hero .hero-copy h1{max-width:22ch;}
/* (old 62ch sub cap removed 2026-08-27 — it never beat the terminal fork's
   equal-value cap, and the sitewide --measure-hero token carries the sub now) */

.pp-open{
  list-style:none;margin:clamp(2.2rem,4vw,3.2rem) 0 0;padding:0;
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(.8rem,1.4vw,1.1rem);
}
.pp-door{display:flex;min-width:0;}
.pp-door > a{
  display:flex;flex-direction:column;gap:.3rem;flex:1;min-width:0;
  padding:1.05rem 1.15rem 1.15rem;
  background:var(--card);
  border:1px solid var(--hair-strong);border-radius:var(--radius);
  text-decoration:none;
  transition:border-color .28s ease,transform .28s ease,box-shadow .28s ease;
}
@media (hover:hover){
  .pp-door > a:hover{
    border-color:var(--signal);transform:translateY(-2px);
    box-shadow:0 22px 44px -32px rgba(var(--ink-rgb),.45);
  }
  .pp-door > a:hover .pp-door-t{color:var(--signal);}
}
@media (prefers-reduced-motion:reduce){
  .pp-door > a,.pp-door > a:hover{transition:none;transform:none;}
}
.pp-door-k{
  font-family:var(--mono);font-size:.63rem;font-weight:500;
  letter-spacing:.14em;text-transform:uppercase;color:var(--unknown,var(--muted));
}
.pp-door-t{
  font-family:var(--mono);font-size:.92rem;font-weight:600;letter-spacing:0;
  color:var(--ink);overflow-wrap:anywhere;transition:color .28s ease;
}
.pp-door-t::after{content:" \2197";color:var(--signal);}
.pp-door-s{
  font-family:var(--prose,var(--sans));font-size:.94rem;line-height:1.5;
  color:var(--ink-60);text-wrap:pretty;
}
.pp-hero-fine{margin:1.4rem 0 0;text-align:center;}

/* ==========================================================================
   2. SHARED PARTS
   ========================================================================== */

/* the counts. Deliberately small: an index to the artifacts, never a headline.
   One mono line, no cells, no dividers, no band. */
.pp-index{
  display:flex;flex-wrap:wrap;gap:.2rem 1.6rem;margin:1.6rem 0 .4rem;max-width:none;
  font-family:var(--mono);font-size:.78rem;line-height:1.7;letter-spacing:.02em;
  color:var(--muted);
}
.pp-index b{
  color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums;
  padding-right:.35em;
}

/* a label/value stack used for the portal surfaces and the ledger's link kinds */
.pp-rows{
  margin:clamp(1.4rem,2.4vw,2rem) 0 0;
  border-top:1px solid var(--hair);
}
.pp-rows > div{
  display:grid;grid-template-columns:minmax(0,15rem) minmax(0,1fr);gap:.2rem 1.6rem;
  padding:.85rem 0 .9rem;border-bottom:1px solid var(--hair);
}
.pp-rows dt{
  font-family:var(--mono);font-size:.74rem;font-weight:500;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink);
}
.pp-rows dd{
  margin:0;font-size:1rem;line-height:1.55;color:var(--ink-60);max-width:60ch;
}

/* the standing rule, set as a rule and not as a poster */
.pp-rule{
  margin:clamp(1.8rem,3vw,2.4rem) 0 0;padding:1.1rem 0 0;
  border-top:1px solid var(--hair-strong);max-width:none;
  font-family:var(--mono);font-size:1.06rem;font-weight:600;letter-spacing:.02em;
  color:var(--ink);
}
.pp-rule-s{margin:.35rem 0 0;font-size:1rem;line-height:1.55;color:var(--ink-60);max-width:56ch;}

.pp-after{margin:clamp(1.4rem,2.4vw,1.9rem) 0 0;max-width:60ch;font-size:1.05rem;line-height:1.6;}
.pp-links{display:flex;flex-wrap:wrap;gap:.7rem 1.6rem;margin:clamp(1.4rem,2.4vw,1.9rem) 0 0;}

/* ==========================================================================
   3. SECTION 01 . the dashboard
   ========================================================================== */
.pp-shot{margin:0;}
.pp-shot .frame-cap{max-width:66ch;}
/* Section 02 mounts a second real capture above the chain. It needs the
   breathing room the dashboard figure gets from its section-head, and the
   bolded counts in both captions must read as ink, not as muted caption
   grey, because they are the numbers the reader is asked to check. */
#chain .pp-shot{margin:0 0 2.2rem;}
.pp-shot .frame-cap b{color:var(--ink);font-weight:600;}

/* ==========================================================================
   4. SECTION 02 . the chain
   Seven steps down one rail. Every step names the artifact it is, and the
   artifact is a link, because that is the whole argument of the section.
   ========================================================================== */
.pp-chain{margin:0;padding:0;list-style:none;position:relative;max-width:880px;}
.pp-chain::before{
  content:"";position:absolute;left:15px;top:.6rem;bottom:.6rem;width:1px;
  background:var(--hair-strong);
}
.pp-step{
  position:relative;display:grid;
  grid-template-columns:32px minmax(0,1fr);gap:0 1.3rem;
  padding:0 0 1.05rem;
}
.pp-step:last-child{padding-bottom:0;}
.pp-step > .pp-dot{
  grid-row:1 / span 2;align-self:start;
  width:31px;height:31px;display:grid;place-items:center;
  background:var(--paper);border:1px solid var(--hair-strong);border-radius:50%;
  font-family:var(--mono);font-size:.7rem;font-weight:600;color:var(--ink-60);
  font-variant-numeric:tabular-nums;
}
.pp-step.is-ok > .pp-dot{border-color:var(--pass);color:var(--pass);}
.pp-step.is-bad > .pp-dot{border-color:var(--fail);color:var(--fail);}

.pp-rec{
  min-width:0;background:var(--card);
  border:1px solid var(--hair);border-radius:var(--radius);
  padding:.85rem 1.1rem .95rem;
}
.pp-stage{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:.3rem .8rem;margin:0 0 .4rem;max-width:none;
  font-family:var(--mono);font-size:.63rem;font-weight:500;
  letter-spacing:.14em;text-transform:uppercase;color:var(--unknown,var(--muted));
}
.pp-id{
  font-family:var(--mono);font-size:.8rem;font-weight:600;letter-spacing:.03em;
  text-transform:none;color:var(--ink);overflow-wrap:anywhere;
}
/* The unmodified chip is the CANDIDATE state (a requirement still at
   status: review). It carries no state colour of its own: it inherits from
   .pp-stage, its parent, so the per-theme text-contrast corrections in
   s35-a11y.css that land on .pp-stage reach the chip too. .is-ok / .is-bad
   below are the two verification states that claim a colour; .is-seeded /
   .is-real (§12) are the two PROVENANCE states, and they are the badge system
   the three-surfaces section runs on. */
.pp-chip{
  display:inline-flex;align-items:center;gap:.4em;
  padding:.14rem .42rem;border-radius:calc(var(--radius) - 3px);
  font-size:.6rem;font-weight:600;letter-spacing:.14em;
  color:inherit;border:1px solid currentColor;
}
.pp-chip.is-ok{color:var(--pass);}
.pp-chip.is-bad{color:var(--fail);}
.pp-say{
  margin:0;max-width:52ch;
  font-family:var(--prose,var(--sans));font-weight:500;letter-spacing:-.015em;
  font-size:1.06rem;line-height:1.4;color:var(--ink);text-wrap:pretty;
}
.pp-note{margin:.4rem 0 0;max-width:58ch;font-size:.98rem;line-height:1.55;color:var(--ink-60);}
.pp-art{
  display:block;margin:.5rem 0 0;max-width:none;
  font-family:var(--mono);font-size:.76rem;line-height:1.6;color:var(--muted);
  overflow-wrap:anywhere;
}
.pp-art a{color:var(--signal);text-decoration:none;border-bottom:1px solid rgba(var(--signal-rgb),.35);}
.pp-art a:hover{border-bottom-color:var(--signal);}

/* ==========================================================================
   5. SECTION 03 . the defect record
   Same chassis as the change records on the landing page: identity row, then
   a stack of mono label/value fields. A record is a document, so it is set
   like one.
   ========================================================================== */
.pp-card{
  max-width:820px;background:var(--card);
  border:1px solid var(--hair-strong);border-radius:var(--radius);overflow:hidden;
  box-shadow:0 1px 0 rgba(var(--ink-rgb),.04),0 22px 48px -30px rgba(var(--ink-rgb),.42);
}
.pp-card-h{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.6rem .9rem;
  padding:.8rem 1.25rem;background:var(--paper);border-bottom:1px solid var(--hair);
}
.pp-card-id{
  font-family:var(--mono);font-size:.86rem;font-weight:600;letter-spacing:.03em;
  color:var(--ink);overflow-wrap:anywhere;
}
.pp-ok{
  display:inline-flex;align-items:center;gap:.45em;flex:0 0 auto;
  font-family:var(--mono);font-size:.63rem;font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;
  padding:.24rem .5rem;border-radius:calc(var(--radius) - 3px);
  color:var(--pass);border:1px solid var(--pass);
}
.pp-ok svg{display:block;width:11px;height:11px;flex:0 0 auto;}
.pp-ok svg path{fill:none;stroke:var(--pass);stroke-width:2.1;stroke-linecap:round;stroke-linejoin:round;}
.pp-f{padding:.8rem 1.25rem .85rem;border-bottom:1px solid var(--hair);min-width:0;}
.pp-f:last-child{border-bottom:0;}
.pp-flab{
  display:flex;align-items:center;gap:.55em;margin:0 0 .4rem;max-width:none;
  font-family:var(--mono);font-size:.63rem;font-weight:500;
  letter-spacing:.13em;text-transform:uppercase;color:var(--unknown,var(--muted));
}
.pp-flab::before{content:"";flex:0 0 auto;width:6px;height:6px;background:var(--hair-strong);}
.pp-f.is-ok .pp-flab{color:var(--pass);}
.pp-f.is-ok .pp-flab::before{background:var(--pass);}
.pp-f.is-bad .pp-flab{color:var(--fail);}
.pp-f.is-bad .pp-flab::before{background:var(--fail);}
.pp-fval{
  margin:0;max-width:none;font-family:var(--mono);font-size:.84rem;line-height:1.55;
  color:var(--ink);overflow-wrap:anywhere;
}
.pp-fval + .pp-fval{margin-top:.45rem;color:var(--ink-60);}
.pp-fval code{font-family:inherit;font-size:1em;color:var(--ink-60);}
.pp-fval a{color:var(--signal);text-decoration:none;border-bottom:1px solid rgba(var(--signal-rgb),.35);}
.pp-fval .pp-dim{color:var(--unknown,var(--muted));}

/* ==========================================================================
   6. SECTION 05 . the postmortem
   The most important section on the page, so it is the plainest. A dated
   document: labelled rows, one quotation, one diagram, no ornament.
   ========================================================================== */
.pp-pm{
  max-width:900px;margin:0;padding:clamp(1.3rem,2.4vw,1.9rem) clamp(1.2rem,2.4vw,1.9rem);
  background:var(--card);border:1px solid var(--hair-strong);border-radius:var(--radius);
}
.pp-pm-meta{
  display:flex;flex-wrap:wrap;gap:.3rem 1.4rem;margin:0 0 1.2rem;padding-bottom:1rem;
  max-width:none;border-bottom:1px solid var(--hair);
  font-family:var(--mono);font-size:.68rem;letter-spacing:.12em;text-transform:uppercase;
  color:var(--unknown,var(--muted));
}
.pp-pm-meta b{color:var(--ink);font-weight:600;}
.pp-pm-row{display:grid;grid-template-columns:minmax(0,13rem) minmax(0,1fr);gap:.3rem 1.8rem;padding:0 0 1.15rem;}
.pp-pm-row:last-of-type{padding-bottom:0;}
.pp-pm-lab{
  margin:0;max-width:none;
  font-family:var(--mono);font-size:.66rem;font-weight:500;
  letter-spacing:.13em;text-transform:uppercase;color:var(--unknown,var(--muted));
}
.pp-pm-row.is-bad .pp-pm-lab{color:var(--fail);}
.pp-pm-row.is-ok .pp-pm-lab{color:var(--pass);}
.pp-pm-txt{margin:0;max-width:62ch;font-size:1.05rem;line-height:1.6;}
.pp-pm-txt + .pp-pm-txt{margin-top:.7rem;}
.pp-pm-txt code{font-family:var(--mono);font-size:.9em;}
.pp-quote{
  margin:0;padding-left:1.1rem;border-left:2px solid var(--fail);max-width:60ch;
  font-family:var(--mono);font-size:.92rem;line-height:1.65;color:var(--ink);
}
.pp-quote p{margin:0;max-width:none;font-family:inherit;font-size:inherit;line-height:inherit;}
.pp-quote p + p{margin-top:.5rem;}
.pp-quote cite{
  display:block;margin-top:.55rem;font-style:normal;
  font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;color:var(--unknown,var(--muted));
}
.pp-hard{
  margin:clamp(1.6rem,2.6vw,2.2rem) 0 0;max-width:44ch;
  font-family:var(--prose,var(--sans));font-size:clamp(1.25rem,2vw,1.6rem);
  font-weight:600;letter-spacing:-.02em;line-height:1.25;color:var(--ink);text-wrap:balance;
}

/* the denominator diagram */
.pp-fig{margin:clamp(1.6rem,2.6vw,2.2rem) 0 0;}
.pp-fig svg{display:block;width:100%;height:auto;overflow:visible;}
.pp-fig .st{fill:none;stroke:var(--hair-strong);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;}
.pp-fig .thin{stroke-width:1.1;}
.pp-fig .dash{stroke-dasharray:5 4;}
.pp-fig .ok{stroke:var(--pass);}
.pp-fig .bad{stroke:var(--fail);}
.pp-fig .t{font-family:var(--mono);font-size:13px;fill:var(--ink);}
.pp-fig .tl{font-family:var(--mono);font-size:11.5px;letter-spacing:.08em;fill:var(--unknown,var(--muted));}
.pp-fig .tok{fill:var(--pass);}
.pp-fig .tbad{fill:var(--fail);}
.pp-fig figcaption{
  margin:.7rem 0 0;max-width:64ch;
  font-family:var(--mono);font-size:.7rem;line-height:1.65;color:var(--muted);
}
/* the phone form of the same statement: two labelled bands cannot be read at
   340px, so the diagram becomes a list */
.pp-fig-m{display:none;margin:0 0 .6rem;padding:0;list-style:none;}
.pp-fig-m li{
  padding:.6rem 0 .65rem;border-bottom:1px solid var(--hair);
  font-family:var(--mono);font-size:.78rem;line-height:1.55;color:var(--ink-60);
}
.pp-fig-m li b{display:block;color:var(--ink);font-weight:600;}
.pp-fig-m li.is-ok b{color:var(--pass);}
.pp-fig-m li.is-bad b{color:var(--fail);}

/* ==========================================================================
   7. SECTION 06 . the limitations
   No cards, no icons, no colour. A numbered list of plain sentences, because
   dressing up a limitation is a way of hiding it.
   ========================================================================== */
.pp-lim{margin:0;padding:0;list-style:none;counter-reset:pplim;border-top:1px solid var(--hair);}
.pp-lim li{
  counter-increment:pplim;
  display:grid;grid-template-columns:3.2rem minmax(0,1fr);gap:.2rem 1.2rem;
  padding:1.15rem 0 1.2rem;border-bottom:1px solid var(--hair);
}
.pp-lim li::before{
  content:counter(pplim,decimal-leading-zero);grid-row:1 / span 2;
  font-family:var(--mono);font-size:.78rem;font-weight:600;letter-spacing:.06em;
  color:var(--unknown,var(--muted));padding-top:.15rem;
}
.pp-lim h3{margin:0;font-size:1.08rem;line-height:1.35;letter-spacing:-.015em;}
.pp-lim p{margin:.35rem 0 0;max-width:64ch;font-size:1.02rem;line-height:1.6;color:var(--ink-60);}
/* the display themes restyle h3 into a headline; hold these at list scale */
html[data-theme="terminal"] .pp-lim h3{font-size:1rem;line-height:1.4;text-shadow:none;}
html[data-theme="riso"] .pp-lim h3,
html[data-theme="acid"] .pp-lim h3{font-size:1.1rem;letter-spacing:0;color:var(--ink);text-shadow:none;}
html[data-theme="brutal"] .pp-lim h3{font-size:1.1rem;letter-spacing:0;}

/* ==========================================================================
   8. SECTION 07 . the methodology links
   ========================================================================== */
.pp-meth{
  list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(.9rem,1.6vw,1.3rem);
}
.pp-meth li{
  min-width:0;padding:1.15rem 1.2rem 1.25rem;
  background:var(--card);border:1px solid var(--hair);border-radius:var(--radius);
}
.pp-meth h3{margin:0 0 .4rem;font-size:1.02rem;line-height:1.35;}
.pp-meth h3 a{text-decoration:none;color:var(--ink);border-bottom:1px solid var(--hair-strong);}
.pp-meth h3 a:hover{color:var(--signal);border-bottom-color:var(--signal);}
.pp-meth p{margin:0;max-width:44ch;font-size:.98rem;line-height:1.55;color:var(--ink-60);}
html[data-theme="terminal"] .pp-meth h3{font-size:.94rem;line-height:1.4;text-shadow:none;}
html[data-theme="riso"] .pp-meth h3,
html[data-theme="acid"] .pp-meth h3{font-size:1.04rem;letter-spacing:0;color:var(--ink);text-shadow:none;}
html[data-theme="brutal"] .pp-meth h3{font-size:1.04rem;letter-spacing:0;}

/* ==========================================================================
   9. SECTION 08 . the standing offer
   ========================================================================== */
.pp-offer{
  max-width:820px;margin:0;padding:clamp(1.2rem,2.2vw,1.6rem) clamp(1.2rem,2.2vw,1.6rem) clamp(1.3rem,2.4vw,1.7rem);
  background:var(--card);border:1px solid var(--hair);border-radius:var(--radius);
}
.pp-offer p{margin:0;max-width:64ch;font-size:1.04rem;line-height:1.6;}
.pp-offer p + p{margin-top:.85rem;}
.pp-back{list-style:none;margin:clamp(1.4rem,2.4vw,2rem) 0 0;padding:0;display:grid;gap:.75rem;}
.pp-back li{
  display:grid;grid-template-columns:1.6rem minmax(0,1fr);gap:0 .6rem;
  max-width:62ch;font-size:1.02rem;line-height:1.6;color:var(--ink-60);
}
.pp-back li::before{
  content:"\2713";font-family:var(--mono);font-size:.9rem;color:var(--pass);line-height:1.7;
}
.pp-offer-fine{margin:1.5rem 0 0;}

/* ==========================================================================
   10. RESPONSIVE
   ========================================================================== */
@media (max-width:1000px){
  .pp-open{grid-template-columns:repeat(2,minmax(0,1fr));}
  .pp-meth{grid-template-columns:repeat(2,minmax(0,1fr));}
  .pp-rows > div{grid-template-columns:minmax(0,12rem) minmax(0,1fr);}
  .pp-pm-row{grid-template-columns:minmax(0,10rem) minmax(0,1fr);gap:.3rem 1.2rem;}
}
@media (max-width:720px){
  .pp-open{grid-template-columns:1fr;}
  .pp-meth{grid-template-columns:1fr;}
  .pp-rows > div{grid-template-columns:1fr;gap:.3rem;}
  .pp-pm-row{grid-template-columns:1fr;gap:.35rem;}
  .pp-lim li{grid-template-columns:2.4rem minmax(0,1fr);gap:.2rem .8rem;}
}
@media (max-width:640px){
  .pp-fig svg,.pp-fig figcaption{display:none;}
  .pp-fig-m{display:block;}
  .pp-step{grid-template-columns:26px minmax(0,1fr);gap:0 .9rem;}
  .pp-step > .pp-dot{width:25px;height:25px;font-size:.62rem;}
  .pp-chain::before{left:12px;}
  .pp-card-h,.pp-f{padding-left:1rem;padding-right:1rem;}
}

/* ==========================================================================
   11. THE PUBLIC ROSTER (#roster) — scalable repo-card grid + click-to-expand
   Rendered at runtime from assets/findings-roster.json. Each project is a card
   (neutral mono monogram + language, linked repo name, "N flagged · M fixed",
   a fixed-proportion bar); clicking a card opens ONE shared modal listing that
   project's shown findings + their public evidence links. Scales by data append
   (a "show all" affordance appears only once the grid runs long).

   SAFETY + COLOUR LAW: the roster shows ONLY resolved/public rows (fixed, fix-
   in-review, withdrawn) — no unpatched/awaiting rows, ever. Green (--pass) is
   worn ONLY by fixed marks: the bar fill, the fixed count, the FIXED badge tick.
   in-review = --unknown, withdrawn = --muted; severity is neutral metadata
   (hairline + ink, no state hue); --signal is affordance only (links, buttons).
   Responsive: cards stack to one column at 375 and the page never scrolls
   sideways; the modal fits the small viewport and traps focus.
   ========================================================================== */
.rst{margin:clamp(1.6rem,3vw,2.4rem) 0 0;}
.rst-fallback p{max-width:62ch;font-size:1.05rem;line-height:1.6;color:var(--ink-60);}

/* ---- the grid ---- */
.rst-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,272px),1fr));
  gap:clamp(.9rem,1.6vw,1.2rem);margin:0;
}
.rst-card{
  position:relative;display:flex;flex-direction:column;gap:.72rem;min-width:0;
  padding:1.15rem 1.2rem 1.25rem;background:var(--card);
  border:1px solid var(--hair-strong);border-radius:var(--radius);cursor:pointer;
  text-align:left;text-decoration:none;color:inherit;-webkit-tap-highlight-color:transparent;
  transition:border-color .24s ease,transform .24s ease,box-shadow .24s ease;
}
@media (hover:hover){
  .rst-card:hover{border-color:var(--signal);transform:translateY(-2px);
    box-shadow:0 22px 44px -32px rgba(var(--ink-rgb),.5);}
  .rst-card:hover .rst-card-name{color:var(--signal);}
  .rst-card:hover .rst-card-cta{border-bottom-color:var(--signal);}
}
@media (prefers-reduced-motion:reduce){ .rst-card,.rst-card:hover{transition:none;transform:none;} }

.rst-card-top{display:flex;align-items:center;gap:.6rem;}
.rst-mark{
  flex:0 0 auto;width:34px;height:34px;display:grid;place-items:center;
  border:1px solid var(--hair-strong);border-radius:calc(var(--radius) - 2px);
  background:rgba(var(--ink-rgb),.05);
  font-family:var(--mono);font-size:.82rem;font-weight:600;color:var(--ink);letter-spacing:.02em;
}
.rst-card-lang{
  font-family:var(--mono);font-size:.66rem;font-weight:500;letter-spacing:.13em;
  text-transform:uppercase;color:var(--unknown,var(--muted));
}
.rst-card-name{
  font-family:var(--mono);font-size:1rem;font-weight:600;letter-spacing:-.01em;
  color:var(--ink);overflow-wrap:anywhere;transition:color .24s ease;
}
html[data-theme="terminal"] .rst-card-name{text-shadow:none;}

.rst-count{
  font-family:var(--mono);font-size:.78rem;letter-spacing:.02em;color:var(--muted);
  font-variant-numeric:tabular-nums;
}
.rst-count b{color:var(--ink);font-weight:600;}
.rst-count .rst-count-fx{color:var(--pass);}

/* the fixed-proportion bar: green fill only, neutral track for the rest */
.rst-bar{position:relative;height:6px;border-radius:999px;background:var(--hair);overflow:hidden;}
.rst-bar-fill{position:absolute;inset:0 auto 0 0;height:100%;background:var(--pass);border-radius:999px;}

.rst-card-cta{
  margin-top:auto;align-self:flex-start;
  font-family:var(--mono);font-size:.72rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  color:var(--signal);padding:.12rem 0;
  border-bottom:1px solid rgba(var(--signal-rgb),.35);
}
.rst-card:focus-visible{outline:2px solid var(--signal);outline-offset:3px;}

.rst-more{margin:1.3rem 0 0;}
.rst-more button{
  font-family:var(--mono);font-size:.74rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink);background:none;border:0;border-bottom:1px solid var(--hair-strong);
  padding:.15rem 0;cursor:pointer;
}
.rst-more button:hover{color:var(--signal);border-bottom-color:var(--signal);}

.rst-honesty{max-width:66ch;}

/* ---- the shared modal ---- */
html.rst-lock,html.rst-lock body{overflow:hidden;}
.rst-modal-bd{
  position:fixed;inset:0;z-index:1000;display:none;
  background:rgba(0,0,0,.62);
  padding:clamp(1rem,5vh,3rem) 1rem;overflow-y:auto;overscroll-behavior:contain;
}
@supports ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
  .rst-modal-bd{-webkit-backdrop-filter:saturate(120%) blur(2px);backdrop-filter:saturate(120%) blur(2px);}
}
.rst-modal-bd.is-open{display:grid;place-items:start center;}
.rst-modal{
  width:min(680px,100%);background:var(--card);
  border:1px solid var(--hair-strong);border-radius:var(--radius);
  box-shadow:0 32px 70px -24px rgba(0,0,0,.72);
  max-height:calc(100vh - clamp(2rem,10vh,6rem));display:flex;flex-direction:column;min-height:0;
}
.rst-modal-head{
  display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;
  padding:1.1rem 1.25rem;border-bottom:1px solid var(--hair);
}
.rst-modal-title{margin:0;font-family:var(--mono);font-size:1.02rem;font-weight:600;color:var(--ink);overflow-wrap:anywhere;}
html[data-theme="terminal"] .rst-modal-title{text-shadow:none;}
.rst-modal-headmeta{min-width:0;}
.rst-modal-sub{margin:.3rem 0 0;font-family:var(--mono);font-size:.72rem;letter-spacing:.02em;line-height:1.6;color:var(--muted);}
.rst-modal-gh{
  display:inline-block;margin:.55rem 0 0;padding:.2rem 0;
  font-family:var(--mono);font-size:.72rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--signal);text-decoration:none;overflow-wrap:anywhere;
  border-bottom:1px solid rgba(var(--signal-rgb),.35);
}
.rst-modal-gh:hover{border-bottom-color:var(--signal);}
.rst-modal-gh:focus-visible{outline:2px solid var(--signal);outline-offset:2px;}
.rst-modal-gh[hidden]{display:none;}
.rst-close{
  flex:0 0 auto;width:44px;height:44px;display:grid;place-items:center;cursor:pointer;
  background:none;border:1px solid var(--hair-strong);border-radius:calc(var(--radius) - 2px);color:var(--ink);
}
.rst-close svg{width:14px;height:14px;display:block;}
.rst-close:hover{border-color:var(--signal);color:var(--signal);}
.rst-close:focus-visible{outline:2px solid var(--signal);outline-offset:2px;}
.rst-modal-body{padding:.3rem 1.25rem 1.25rem;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;}

.rst-find{padding:.85rem 0;border-bottom:1px solid var(--hair);}
.rst-find:last-child{border-bottom:0;}
.rst-find-class{
  display:block;font-family:var(--prose,var(--sans));font-size:1rem;line-height:1.45;
  color:var(--ink);text-wrap:pretty;
}
.rst-find-meta{
  display:flex;flex-wrap:wrap;align-items:center;gap:.4rem .9rem;margin:.45rem 0 0;
  font-family:var(--mono);font-size:.7rem;letter-spacing:.02em;color:var(--muted);
}
.rst-badge{display:inline-flex;align-items:center;gap:.4em;font-family:var(--mono);
  font-size:.66rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;}
.rst-badge.is-fixed{color:var(--pass);}
.rst-badge.is-review{color:var(--unknown,var(--muted));}
.rst-badge.is-wontfix{color:var(--muted);}
/* .is-miss is the register legend's fifth state (findings.html#how-to-read):
   a defect that escaped the declared evidence. It is the only state word the
   register colours, and it is the one that goes against us. */
.rst-badge.is-miss{color:var(--fail);}
.rst-tick{display:inline-flex;}
.rst-ck{width:12px;height:12px;display:block;}
.rst-ck path{fill:none;stroke:var(--pass);stroke-width:2.1;stroke-linecap:round;stroke-linejoin:round;}
.rst-sev{display:inline-block;padding:.05rem .4rem;border:1px solid var(--hair-strong);
  border-radius:calc(var(--radius) - 3px);color:var(--ink);font-weight:600;}
.rst-repm{font-variant-numeric:tabular-nums;}
.rst-evlink{
  margin-left:auto;font-family:var(--mono);font-size:.7rem;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--signal);text-decoration:none;white-space:nowrap;
  border-bottom:1px solid rgba(var(--signal-rgb),.35);
}
.rst-evlink:hover{border-bottom-color:var(--signal);}
.rst-modal-summary{margin:.5rem 0 0;font-size:.95rem;line-height:1.6;color:var(--ink-60);max-width:60ch;}
.rst-modal-summary.has-rows{padding-bottom:.9rem;margin-bottom:.2rem;border-bottom:1px solid var(--hair);}
.rst-detail-link{
  display:inline-block;margin-top:.7rem;font-family:var(--mono);font-size:.74rem;font-weight:600;
  letter-spacing:.06em;text-transform:uppercase;color:var(--signal);text-decoration:none;
  border-bottom:1px solid rgba(var(--signal-rgb),.35);
}

@media (max-width:640px){
  .rst-grid{grid-template-columns:1fr;}
  .rst-modal-bd{padding:1rem .55rem;}
  .rst-modal{max-height:calc(100vh - 2rem);max-height:calc(100dvh - 2rem);}
}

/* ==========================================================================
   12. THE PROVENANCE BADGE (#limits · "Three public surfaces")
   Two more modifiers on the EXISTING .pp-chip component, so the badge system
   is one component with four states rather than a second chip vocabulary:

     .is-ok      verified            var(--pass)   } verification state
     .is-bad     violated            var(--fail)   }
     .is-seeded  demonstration data  var(--stale)  } provenance state
     .is-real    public audit evidence var(--ink)  }

   --stale is the token for evidence that must not be read as current, which
   is exactly what a seeded showcase entry is. It is NOT --fail: seeded data
   is not a failure, and the colour law on this page reserves --fail for a
   violated promise. --ink is the goal's "white badge" for real evidence:
   plain, bright, no hue, because real evidence makes no claim beyond being
   the record.

   SPECIFICITY NOTE. s35-a11y.css carries retained per-theme
   `html[data-theme="x"] .pp-chip{color:… !important}` contrast corrections at
   (0,2,1). Terminal is the shipped theme and has no such rule, so the two
   plain modifiers below are what actually renders. The html[data-theme]
   duplicates at (0,3,1) keep the provenance states intact if any of the
   retained theme forks is ever re-enabled.

   Contrast, terminal (the shipped theme): --stale #AF7317 on --card #0A100C
   = 4.9:1; --ink #D2FFE2 on the same = 15.6:1. Both clear AA at the 12px
   metadata floor s35-craft.css enforces.

   The chip is a flex child of the door's column <a>, so it would stretch the
   full card width without the align-self below.
   ========================================================================== */
/* Provenance states, one treatment site-wide.

   The label is --stale (orange) for seeded and --ink for real. Measured on the
   shipped ground: --stale on the terminal card is 4.84:1 and --ink is 17.5:1,
   both clearing the 4.5:1 floor s35-a11y.css holds small labels to.

   Every page that renders this badge -- public-proof, product, jsonparser,
   audit, graph -- ships data-theme="terminal". The only non-terminal page is
   prove.html, which carries no badge. If a seeded badge is ever placed on a
   light ground, --stale lands near 3.8:1 there: move the colour to the border
   and keep the label --ink, which is non-text and clears the 3:1 bar.

   Colouring the label, not just the border, is what makes seeded readable at a
   glance rather than a detail you have to look for. */
/* Shared signature with .pc-chip.is-seeded on product.html: dashed --stale
   border plus a 6px --stale dot, so the two read as one badge family. */
.pp-chip.is-seeded{color:var(--stale,var(--muted));border-color:var(--stale,var(--muted));border-style:dashed;}
.pp-chip.is-seeded::before{content:"";flex:0 0 auto;width:6px;height:6px;background:var(--stale,var(--muted));border-radius:50%;}
.pp-chip.is-real{color:var(--ink);}
html[data-theme] .pp-chip.is-seeded{color:var(--stale,var(--muted)) !important;border-color:var(--stale,var(--muted)) !important;}
html[data-theme] .pp-chip.is-real{color:var(--ink) !important;}
.pp-door > a > .pp-chip{align-self:flex-start;margin-top:.35rem;}

/* --------------------------------------------------------------------------
   12b. THE OTHER TWO PROVENANCE STATES (site v10).
   The badge vocabulary is four terms and no synonyms:

     PUBLIC AUDIT EVIDENCE  .is-real          --ink       solid   no glyph
     SEEDED PRODUCT DEMO    .is-seeded        --stale     dashed  filled dot
     PRIVATE / ANONYMIZED   .is-private       --unknown   solid   filled square
     ILLUSTRATIVE EXAMPLE   .is-illustrative  --unknown   dotted  hollow ring

   The two new states share --unknown on purpose: neither is a verification
   result and neither is a failure, so neither may reach for --pass or --fail.
   They are told apart by three signals, not one -- border style, glyph shape,
   and the tinted ground under .is-private, which reads as "boxed off".

   Contrast on the shipped theme (terminal): --unknown #6FAE86 on --card
   #0A100C is 7.4:1, and higher again on --paper #050807. Both clear the
   4.5:1 floor s35-a11y.css holds 12px metadata labels to. The .is-private
   ground is a 7%-alpha --ink wash, which moves the ratio by under a tenth.

   No state here is green in the --pass sense. Green on this site means a
   check that ran and passed; provenance is not a machine state, so a
   provenance badge never takes the verification hue.
   -------------------------------------------------------------------------- */
.pp-chip.is-private{
  color:var(--unknown,var(--muted));border-color:var(--unknown,var(--muted));
  background:rgba(var(--ink-rgb),.07);
}
.pp-chip.is-private::before{content:"";flex:0 0 auto;width:6px;height:6px;background:var(--unknown,var(--muted));}
.pp-chip.is-illustrative{
  color:var(--unknown,var(--muted));border-color:var(--unknown,var(--muted));border-style:dotted;
}
.pp-chip.is-illustrative::before{
  content:"";flex:0 0 auto;width:6px;height:6px;border-radius:50%;
  border:1px solid var(--unknown,var(--muted));
}
html[data-theme] .pp-chip.is-private,
html[data-theme] .pp-chip.is-illustrative{color:var(--unknown,var(--muted)) !important;border-color:var(--unknown,var(--muted)) !important;}

/* A provenance badge that labels a block of links rather than one door. It
   sits on its own line above the block, so the label is persistent chrome and
   not a sentence a reader has to find. */
.pp-prov{
  display:flex;flex-wrap:wrap;align-items:center;gap:.45rem .7rem;
  margin:clamp(1.4rem,2.4vw,1.9rem) 0 .9rem;max-width:none;
  font-family:var(--mono);font-size:.72rem;line-height:1.55;color:var(--muted);
}
/* the badge takes its own line and the note sits under it at the mono measure
   (s35-craft §7c). Deliberate: the badge is chrome for the whole block below
   it, not a prefix to one sentence, and at 390px a side-by-side row would
   crush the note into a two-word column. */
.pp-prov .pp-prov-say{flex:1 1 100%;max-width:var(--measure-mono,58ch);}
.pp-prov code{font-size:.95em;}

/* Two of the three surface doors are pages on this site. The \2197 baked into
   .pp-door-t promises an external destination, so the internal doors take the
   in-site arrow instead. */
.pp-door.is-internal > a .pp-door-t::after{content:" \2192";}

/* ==========================================================================
   13. THE CREDIT RULE (site v10)
   Every row on the roster was reported by Proof, from a dated report that
   predates the fix. This label says only what a reader can confirm from the
   upstream public record — never how strong the report is. The rule is stated
   once above the roster and applied row by row from the `attribution` field in
   findings-roster.json.

   COLOUR LAW. None of the three labels is a machine verdict, so none of them
   may take --pass: green on this site means a check that ran and passed.
   .rst-badge.is-fixed above is the only green in a roster row, and it stays
   the state of the FIX, never the state of the CREDIT. The three credit
   labels ride the recessive tokens instead:

     is-credited       --ink      the record names the report, or is our filing
     is-uncredited     --unknown  public fix, dated report first, no mention of us
     is-other-reporter --stale    an upstream advisory names someone else

   Contrast on the shipped terminal ground: --ink 15.6:1, --unknown 7.4:1,
   --stale 4.9:1 — all clear the 4.5:1 floor s35-a11y.css holds this row's
   11.2px metadata to.
   ========================================================================== */
.rst-attr{
  display:inline-flex;align-items:center;gap:.4em;
  font-family:var(--mono);font-size:.66rem;font-weight:600;
  letter-spacing:.09em;text-transform:uppercase;
}
.rst-attr::before{content:"";flex:0 0 auto;width:5px;height:5px;background:currentColor;}
.rst-attr.is-credited{color:var(--ink);}
.rst-attr.is-uncredited{color:var(--unknown,var(--muted));}
.rst-attr.is-other-reporter{color:var(--stale,var(--muted));}
.rst-attr.is-other-reporter::before{border-radius:50%;}
.rst-attr.is-uncredited::before{background:none;border:1px solid currentColor;}

/* the rule itself, stated above the card grid */
.pp-credit{
  margin:0 0 clamp(1.4rem,2.6vw,2rem);
  padding:clamp(1.1rem,2vw,1.5rem) clamp(1.2rem,2.2vw,1.6rem);
  background:var(--card);border:1px solid var(--hair);
  border-radius:calc(var(--radius) + 4px);
}
.pp-credit p{
  margin:0;max-width:70ch;
  font-family:var(--prose);font-size:1rem;line-height:1.6;color:var(--ink-60);
  text-wrap:pretty;
}
.pp-credit p + p{margin-top:.8rem;}
.pp-credit b{color:var(--ink);font-weight:600;}
/* two class steps so the kicker beats `.pp-credit p` on every property it
   overrides — font-family included, which an !important on colour alone
   would have missed */
.pp-credit .pp-credit-k{
  display:flex;align-items:center;gap:.55em;margin:0 0 .75rem;max-width:none;
  font-family:var(--mono);font-size:.72rem;font-weight:500;line-height:1.4;
  letter-spacing:.17em;text-transform:uppercase;color:var(--unknown,var(--muted));
}
.pp-credit .pp-credit-k::before{content:"";flex:0 0 auto;width:6px;height:6px;background:var(--hair-strong);}
