[object Object]

← back to Lawyer Directory Builder

Iter 29: /methodology page — closes the Rule 7.1 substantiation gap

c9f2fae4a9112327e3ec9628249e3639d21c0f37 · 2026-05-04 02:53:16 -0700 · SteveStudio2

Two prior iterations (iter 26 audit, iter 28 directory) referenced
"methodology v1.0" without a real document to point at. Both critiques
flagged this as the largest substantiation gap. This iter ships the
canonical document.

NEW: public/methodology.html — full editorial substantiation document:

1. Twelve signals enumerated, each with:
   - Italic Roman numeral (i. through xii.)
   - Plain-English description
   - Inline <code> with the actual technical name (HTTPS, og:image,
     application/ld+json, etc.) so the criteria can be verified by
     anyone with browser devtools
   - Point weight (15+10+10+10+10+10+10+5+5+5+5+5 = 100)
   The twelve match exactly what src/enrich/site_audit.ts measures.

2. Tier thresholds table — High 90+, Mid 70-89, Low 50-69, Weak <50.
   Each tier in its own champagne shade matching the audit cards.

3. "What this score is NOT" disclosure block — explicit boundaries:
   - Not a measure of legal skill, courtroom outcomes, expertise
   - Not a measure of client satisfaction, retention, reputation
   - Not a measure of bar standing, malpractice, or discipline
   - Not an endorsement
   - Audit independent of any commercial offering; purchasing
     EZ Upgrade does not adjust the score.

4. Refresh cadence (90-day rolling, on-demand re-audit available)

5. Corrections & removal — audit@agentabrams.com, 5-business-day SLA
   for re-audit. Directory listing draws on State Bar public roll;
   removal must be requested at the State Bar directly.

6. Versionbar at the bottom — Version v1.0 / Last reviewed 2026-05-04
   / Next scheduled review 2026-08-01.

Wired up:
- public/audit.html keystrip — "Methodology v1.0 · 12 signals · how
  we score →" now links to /methodology.html (was bare label)
- public/audit.html per-card stamp — "Audited [date] · methodology
  v1.0" now linked
- src/server/directory.ts score panel — "Site signals · methodology
  v1.0 →" now linked

Brand: Volume strip, italic-metal display, monogram, hairline-rule
sections matching the rest of the site. No Rule 7.1 fabricated stats.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit c9f2fae4a9112327e3ec9628249e3639d21c0f37
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Mon May 4 02:53:16 2026 -0700

    Iter 29: /methodology page — closes the Rule 7.1 substantiation gap
    
    Two prior iterations (iter 26 audit, iter 28 directory) referenced
    "methodology v1.0" without a real document to point at. Both critiques
    flagged this as the largest substantiation gap. This iter ships the
    canonical document.
    
    NEW: public/methodology.html — full editorial substantiation document:
    
    1. Twelve signals enumerated, each with:
       - Italic Roman numeral (i. through xii.)
       - Plain-English description
       - Inline <code> with the actual technical name (HTTPS, og:image,
         application/ld+json, etc.) so the criteria can be verified by
         anyone with browser devtools
       - Point weight (15+10+10+10+10+10+10+5+5+5+5+5 = 100)
       The twelve match exactly what src/enrich/site_audit.ts measures.
    
    2. Tier thresholds table — High 90+, Mid 70-89, Low 50-69, Weak <50.
       Each tier in its own champagne shade matching the audit cards.
    
    3. "What this score is NOT" disclosure block — explicit boundaries:
       - Not a measure of legal skill, courtroom outcomes, expertise
       - Not a measure of client satisfaction, retention, reputation
       - Not a measure of bar standing, malpractice, or discipline
       - Not an endorsement
       - Audit independent of any commercial offering; purchasing
         EZ Upgrade does not adjust the score.
    
    4. Refresh cadence (90-day rolling, on-demand re-audit available)
    
    5. Corrections & removal — audit@agentabrams.com, 5-business-day SLA
       for re-audit. Directory listing draws on State Bar public roll;
       removal must be requested at the State Bar directly.
    
    6. Versionbar at the bottom — Version v1.0 / Last reviewed 2026-05-04
       / Next scheduled review 2026-08-01.
    
    Wired up:
    - public/audit.html keystrip — "Methodology v1.0 · 12 signals · how
      we score →" now links to /methodology.html (was bare label)
    - public/audit.html per-card stamp — "Audited [date] · methodology
      v1.0" now linked
    - src/server/directory.ts score panel — "Site signals · methodology
      v1.0 →" now linked
    
    Brand: Volume strip, italic-metal display, monogram, hairline-rule
    sections matching the rest of the site. No Rule 7.1 fabricated stats.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 public/audit.html       |   4 +-
 public/methodology.html | 280 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/server/directory.ts |   2 +-
 3 files changed, 283 insertions(+), 3 deletions(-)

diff --git a/public/audit.html b/public/audit.html
index e6ec4e8..2f399a4 100644
--- a/public/audit.html
+++ b/public/audit.html
@@ -120,7 +120,7 @@
     <span class="ks-pair">70–89 <span>Mid</span></span>
     <span class="ks-pair">50–69 <span>Low</span></span>
     <span class="ks-pair">&lt;50 <span>Weak</span></span>
-    <span class="ks-label" style="margin-left:auto">Methodology v1.0 · 8 signals · refreshed weekly</span>
+    <a href="/methodology.html" class="ks-label" style="margin-left:auto;color:var(--ink-mute);text-decoration:none;border-bottom:1px dotted var(--rule);padding-bottom:1px">Methodology v1.0 · 12 signals · how we score →</a>
   </div>
 
   <div class="grid" id="grid"></div>
@@ -213,7 +213,7 @@ function render() {
         <span><b>${r.font_count ?? '–'}</b> fonts</span>
         <span><b>${r.image_count ?? '–'}</b> images</span>
       </div>
-      ${r.audited_at ? `<div class="audit-stamp">Audited ${new Date(r.audited_at).toLocaleDateString('en-US',{month:'short',day:'numeric',year:'numeric'})} · methodology v1.0</div>` : ''}
+      ${r.audited_at ? `<div class="audit-stamp">Audited ${new Date(r.audited_at).toLocaleDateString('en-US',{month:'short',day:'numeric',year:'numeric'})} · <a href="/methodology.html" style="color:var(--ink-mute);border-bottom:1px dotted var(--rule);padding-bottom:1px">methodology v1.0</a></div>` : ''}
       ${sugList ? `<div class="sugg"><b>Suggestions</b><ul>${sugList}</ul></div>` : ''}
     `;
     grid.appendChild(card);
diff --git a/public/methodology.html b/public/methodology.html
new file mode 100644
index 0000000..b51fe07
--- /dev/null
+++ b/public/methodology.html
@@ -0,0 +1,280 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<title>Audit methodology · Counsel &amp; Bar</title>
+<meta name="description" content="The twelve published signals Counsel &amp; Bar uses to score California-licensed attorney websites. Methodology v1.0 — open, technical, decoupled from any commercial offering.">
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
+<style>
+:root{
+  --noir:#0a0a0c;--noir-rise:#131316;--noir-deep:#050507;
+  --rule:#2a2724;--rule-faint:#1a1815;
+  --ink:#f4f1ea;--ink-soft:#d8d2c5;--ink-mute:#8b857a;
+  --metal:#b89968;--metal-glow:#d4b683;--metal-deep:#8a7044;
+  --serif:"Cormorant Garamond","Cormorant","Georgia",serif;
+  --sans:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
+}
+*{box-sizing:border-box}
+html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scroll-behavior:smooth}
+body{margin:0;background:var(--noir);color:var(--ink);font-family:var(--sans);font-weight:300;font-size:15px;line-height:1.6}
+::selection{background:var(--metal);color:var(--noir)}
+a{color:var(--metal);text-decoration:none;transition:color 180ms ease}
+a:hover{color:var(--metal-glow)}
+
+header.brand{padding:22px 48px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rule);background:var(--noir-deep)}
+header.brand .brand-mono{display:inline-flex;align-items:center;gap:14px;text-decoration:none}
+header.brand h1{margin:0;font-family:var(--serif);font-size:22px;font-weight:400}
+header.brand h1 a{color:var(--ink)}
+header.brand .amp{color:var(--metal);font-style:italic;padding:0 4px}
+.topnav{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);display:flex;gap:24px;align-items:center}
+.topnav a{color:var(--ink-mute)}
+.topnav a:hover{color:var(--ink)}
+
+main{max-width:880px;margin:0 auto;padding:64px 48px 96px}
+
+.method-vol{display:flex;align-items:center;gap:18px;margin:0 0 26px;color:var(--metal)}
+.method-vol .v-rule{flex:0 0 56px;height:1px;background:linear-gradient(90deg,transparent,var(--metal) 50%,transparent)}
+.method-vol .v-text{font-family:var(--serif);font-style:italic;font-weight:400;font-size:14px;letter-spacing:.02em}
+.method-vol .v-meta{font-size:10px;letter-spacing:.28em;text-transform:uppercase;color:var(--ink-mute);font-weight:500}
+
+h1.display{font-family:var(--serif);font-weight:300;font-size:clamp(40px,6vw,68px);line-height:1.04;letter-spacing:-.02em;margin:0 0 18px;color:var(--ink);max-width:18ch}
+h1.display em{font-style:italic;color:var(--metal);font-weight:400}
+
+.lede{font-size:17px;color:var(--ink-soft);max-width:62ch;margin:0 0 56px;font-weight:300;line-height:1.65}
+.lede strong{color:var(--ink);font-weight:500}
+
+h2.section{font-family:var(--serif);font-weight:400;font-size:28px;line-height:1.2;color:var(--ink);margin:64px 0 18px;letter-spacing:-.005em;padding-top:32px;border-top:1px solid var(--rule)}
+h2.section em{font-style:italic;color:var(--metal);font-weight:400}
+h2.section:first-of-type{margin-top:0;padding-top:0;border-top:none}
+
+p.body{font-size:15px;color:var(--ink-soft);line-height:1.7;margin:0 0 18px;max-width:60ch}
+p.body strong{color:var(--ink);font-weight:500}
+
+.signal-grid{display:grid;grid-template-columns:1fr;gap:0;border-top:1px solid var(--rule);margin:24px 0 36px}
+.signal-row{display:grid;grid-template-columns:60px 1fr 80px;gap:24px;padding:24px 0;border-bottom:1px solid var(--rule);align-items:start}
+@media (max-width:680px){.signal-row{grid-template-columns:48px 1fr;gap:16px}.signal-row .pts{grid-column:1/-1;margin-top:8px;text-align:left}}
+.signal-num{font-family:var(--serif);font-style:italic;font-weight:300;color:transparent;-webkit-text-stroke:1px var(--metal);font-size:32px;line-height:1;letter-spacing:-.02em}
+.signal-body h3{font-family:var(--serif);font-weight:400;font-size:18px;line-height:1.3;color:var(--ink);margin:0 0 4px;letter-spacing:-.005em}
+.signal-body p{font-size:13px;line-height:1.65;color:var(--ink-mute);margin:0;max-width:54ch}
+.signal-body code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;color:var(--metal);background:rgba(184,153,104,.06);padding:1px 6px;border:1px solid var(--rule);letter-spacing:0}
+.pts{font-family:var(--serif);font-style:italic;font-weight:400;color:var(--metal);font-size:18px;text-align:right;letter-spacing:.02em;font-variant-numeric:tabular-nums;white-space:nowrap}
+.pts span{font-size:10px;color:var(--ink-mute);font-family:var(--sans);font-style:normal;letter-spacing:.2em;text-transform:uppercase;margin-left:4px;font-weight:500;display:inline-block}
+
+.tier-table{margin:24px 0 36px;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule)}
+.tier-row{display:grid;grid-template-columns:80px 80px 1fr;gap:24px;padding:18px 0;border-bottom:1px solid var(--rule-faint);align-items:baseline}
+.tier-row:last-child{border-bottom:none}
+.tier-name{font-family:var(--serif);font-weight:400;font-size:18px;letter-spacing:.02em}
+.tier-name.a{color:var(--metal-glow);font-style:italic}
+.tier-name.b{color:var(--metal)}
+.tier-name.c{color:#a07a40}
+.tier-name.d{color:#5a4220}
+.tier-range{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;color:var(--ink-mute);letter-spacing:0;font-variant-numeric:tabular-nums}
+.tier-meaning{font-size:13px;color:var(--ink-soft);line-height:1.6}
+
+.disclosure{margin-top:48px;padding:28px 32px;border:1px solid var(--rule);background:linear-gradient(180deg,rgba(184,153,104,.018),transparent)}
+.disclosure .eyebrow{font-size:9px;letter-spacing:.32em;text-transform:uppercase;color:var(--metal);font-weight:500;margin:0 0 14px}
+.disclosure p{font-size:13px;line-height:1.75;color:var(--ink-soft);margin:0 0 14px}
+.disclosure p:last-child{margin-bottom:0}
+.disclosure p strong{color:var(--ink);font-weight:500}
+
+.versionbar{display:flex;flex-wrap:wrap;gap:24px;margin:48px 0 0;padding:18px 24px;border-top:1px solid var(--rule);font-size:11px;color:var(--ink-mute);letter-spacing:.18em;text-transform:uppercase;font-weight:500}
+.versionbar span strong{color:var(--metal);font-family:var(--serif);font-style:italic;font-weight:400;letter-spacing:.04em;text-transform:none;font-size:14px;margin-left:6px}
+
+footer{padding:48px;border-top:1px solid var(--rule);background:var(--noir);color:var(--ink-mute);font-size:12px;text-align:center;letter-spacing:.04em}
+footer a{color:var(--metal)}
+
+*:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(184,153,104,.45);border-radius:1px}
+*:focus:not(:focus-visible){outline:none}
+</style>
+</head>
+<body>
+
+<header class="brand">
+  <a class="brand-mono" href="/">
+    <svg viewBox="0 0 28 28" width="28" height="28" aria-hidden="true" style="flex:0 0 28px">
+      <defs><linearGradient id="cb-meth" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#d4b683"/><stop offset="50%" stop-color="#b89968"/><stop offset="100%" stop-color="#8a7044"/></linearGradient></defs>
+      <circle cx="14" cy="14" r="13" fill="none" stroke="url(#cb-meth)" stroke-width="1"/>
+      <path fill="url(#cb-meth)" d="M9.6 9.5c-1.6 0-2.7 1.2-2.7 3v3c0 1.8 1.1 3 2.7 3 1.4 0 2.4-.8 2.6-2.1h-1.3c-.1.6-.6 1-1.3 1-.9 0-1.4-.6-1.4-1.7v-2.4c0-1.1.5-1.7 1.4-1.7.7 0 1.2.4 1.3 1h1.3c-.2-1.3-1.2-2.1-2.6-2.1zm5.5.1v8.7h2.7c1.6 0 2.6-.9 2.6-2.4 0-1-.5-1.7-1.3-2 .7-.3 1.1-1 1.1-1.8 0-1.5-1-2.5-2.5-2.5h-2.6zm1.3 1.1h1.2c.8 0 1.4.5 1.4 1.4 0 .9-.5 1.4-1.4 1.4h-1.2v-2.8zm0 3.9h1.4c.9 0 1.4.6 1.4 1.5s-.5 1.5-1.4 1.5h-1.4V14.6z"/>
+    </svg>
+    <h1 style="margin:0"><span style="color:var(--ink)">Counsel</span> <span class="amp">&amp;</span> <span style="color:var(--ink)">Bar</span></h1>
+  </a>
+  <nav class="topnav">
+    <a href="/find-a-lawyer">Find counsel</a>
+    <a href="/directory">Directory</a>
+    <a href="/audit.html">Audit</a>
+  </nav>
+</header>
+
+<main>
+  <div class="method-vol">
+    <span class="v-rule"></span>
+    <span class="v-text">Volume I</span>
+    <span class="v-meta">Edition 2026 · Audit Methodology v1.0</span>
+  </div>
+  <h1 class="display">How <em>site signals</em> are scored.</h1>
+  <p class="lede">Counsel &amp; Bar publishes an independent audit of California-licensed attorney websites against twelve technical and presentation signals. The score is <strong>a measure of web presentation, not legal skill</strong>. The full methodology is documented below; the criteria are fixed, public, and applied identically to every audited firm.</p>
+
+  <h2 class="section">The <em>twelve</em> signals.</h2>
+  <p class="body">Each signal is a binary or thresholded check against the firm's homepage as fetched by an automated audit at one moment in time. Maximum total score is 100. We do not weight by traffic, jurisdiction, or paying status.</p>
+
+  <div class="signal-grid">
+    <div class="signal-row">
+      <span class="signal-num">i.</span>
+      <div class="signal-body">
+        <h3>HTTPS</h3>
+        <p>Site reachable over <code>https://</code> with a valid certificate. Browser security indicators and search rankings depend on it.</p>
+      </div>
+      <div class="pts">15<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">ii.</span>
+      <div class="signal-body">
+        <h3>Mobile viewport</h3>
+        <p>Page declares <code>&lt;meta name="viewport"&gt;</code> so the layout adapts on phones. Without it, mobile users see a desktop layout zoomed out.</p>
+      </div>
+      <div class="pts">10<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">iii.</span>
+      <div class="signal-body">
+        <h3>Open Graph image</h3>
+        <p>Page declares <code>og:image</code> so links shared on LinkedIn, Twitter/X, or Facebook render with a preview rather than a bare URL.</p>
+      </div>
+      <div class="pts">10<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">iv.</span>
+      <div class="signal-body">
+        <h3>Web analytics</h3>
+        <p>Site loads a recognized analytics script (Google Analytics 4, Plausible, Fathom, etc.). Improvement requires measurement.</p>
+      </div>
+      <div class="pts">10<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">v.</span>
+      <div class="signal-body">
+        <h3>Schema.org markup</h3>
+        <p>Page contains <code>application/ld+json</code> structured data — <code>LegalService</code>, <code>Attorney</code>, or <code>Organization</code> types qualify the firm for Google rich results.</p>
+      </div>
+      <div class="pts">10<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">vi.</span>
+      <div class="signal-body">
+        <h3>Page weight under 2 MB</h3>
+        <p>Total response size of the homepage on first load. Pages over 2 MB are slower to load on mobile and rural connections.</p>
+      </div>
+      <div class="pts">10<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">vii.</span>
+      <div class="signal-body">
+        <h3>Load time under 3 seconds</h3>
+        <p>Time to <code>networkidle</code> as measured by a Playwright headless browser at 1280×800. Visitor abandonment rises sharply past 3 s.</p>
+      </div>
+      <div class="pts">10<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">viii.</span>
+      <div class="signal-body">
+        <h3>Favicon present</h3>
+        <p>Site declares a favicon. A bare browser tab is small but reads as unfinished — it is the first thing every returning visitor sees.</p>
+      </div>
+      <div class="pts">5<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">ix.</span>
+      <div class="signal-body">
+        <h3>H1 heading</h3>
+        <p>Page contains exactly one top-level heading. Search engines and screen readers both rely on it for document structure.</p>
+      </div>
+      <div class="pts">5<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">x.</span>
+      <div class="signal-body">
+        <h3>Phone number visible</h3>
+        <p>Firm telephone number rendered in the page body or header. Call-driven conversion needs the number above the fold.</p>
+      </div>
+      <div class="pts">5<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">xi.</span>
+      <div class="signal-body">
+        <h3>Font count between two and four</h3>
+        <p>Number of distinct font families loaded by the page. One font reads as cheap; five-plus fonts reads as inconsistent and slows rendering.</p>
+      </div>
+      <div class="pts">5<span>pts</span></div>
+    </div>
+    <div class="signal-row">
+      <span class="signal-num">xii.</span>
+      <div class="signal-body">
+        <h3>At least three images</h3>
+        <p>Page renders a minimum of three images. Pages with one or no images read as placeholder content; this is the lowest-bar visual-substance check.</p>
+      </div>
+      <div class="pts">5<span>pts</span></div>
+    </div>
+  </div>
+
+  <h2 class="section">Tier <em>thresholds.</em></h2>
+  <p class="body">Numeric scores roll up to four named tiers in the audit and directory views. The boundaries are fixed at version pin v1.0; future revisions to weights or thresholds will be documented as v1.1, v2.0, and so on, with prior versions retained for reference.</p>
+  <div class="tier-table">
+    <div class="tier-row">
+      <span class="tier-name a">High</span>
+      <span class="tier-range">90 – 100</span>
+      <span class="tier-meaning">All major signals present. Site is current with web standards and visitor expectations.</span>
+    </div>
+    <div class="tier-row">
+      <span class="tier-name b">Mid</span>
+      <span class="tier-range">70 – 89</span>
+      <span class="tier-meaning">Most signals present. Likely missing one structured-data, performance, or social-card signal.</span>
+    </div>
+    <div class="tier-row">
+      <span class="tier-name c">Low</span>
+      <span class="tier-range">50 – 69</span>
+      <span class="tier-meaning">Several major signals missing. Site reads as built five-plus years ago and not maintained.</span>
+    </div>
+    <div class="tier-row">
+      <span class="tier-name d">Weak</span>
+      <span class="tier-range">below 50</span>
+      <span class="tier-meaning">Foundational gaps (no HTTPS, no mobile viewport, or both). Site is unlikely to convert mobile visitors.</span>
+    </div>
+  </div>
+
+  <h2 class="section">What this score is <em>not.</em></h2>
+  <div class="disclosure">
+    <p class="eyebrow">— Boundaries of the audit —</p>
+    <p>The site-signals score measures <strong>twelve technical and presentation attributes of the firm's website</strong>. It is not, and is not intended to be:</p>
+    <p>· A measure of legal skill, courtroom outcomes, or substantive expertise.<br>
+       · A measure of client satisfaction, retention, or professional reputation.<br>
+       · A measure of bar standing, malpractice history, or disciplinary record.<br>
+       · An endorsement or non-endorsement of the firm by Counsel &amp; Bar.</p>
+    <p>The audit is published <strong>independently of any commercial offering</strong>. Purchasing the EZ Upgrade — or any other Counsel &amp; Bar service — is not required to receive, view, or correct your score, and does not adjust the score. Signals are checked against the same criteria for every audited firm, paying or not.</p>
+  </div>
+
+  <h2 class="section">Refresh <em>cadence.</em></h2>
+  <p class="body">Audited firms are re-checked on a rolling basis. We aim for a refresh interval of no longer than ninety days per firm, and we re-audit on demand when a firm reports a site change. The most recent audit date for a given firm appears on its audit card under "Audited [date] · methodology v1.0".</p>
+
+  <h2 class="section">Corrections &amp; <em>removal.</em></h2>
+  <p class="body">If your firm is shown with an incorrect score, an outdated screenshot, or you believe a signal was misread, send a note to <a href="mailto:audit@agentabrams.com">audit@agentabrams.com</a> and we will re-audit and update within five business days. Listed firms may also request removal of their audit card; the directory listing itself draws on the State Bar's public roll and is not removable here — request removal from the State Bar registry directly for that.</p>
+
+  <h2 class="section">Changes to this <em>document.</em></h2>
+  <p class="body">Material changes to signal weights or tier thresholds advance the version number. A changelog will be appended to the bottom of this page beginning with v1.1. The current version is fixed at v1.0 (Edition 2026, May 2026).</p>
+
+  <div class="versionbar">
+    <span>Version <strong>v1.0</strong></span>
+    <span>Last reviewed <strong>2026-05-04</strong></span>
+    <span>Next scheduled review <strong>2026-08-01</strong></span>
+  </div>
+</main>
+
+<footer>
+  Counsel &amp; Bar is a directory of California-licensed attorneys, not a lawyer referral service under California Business &amp; Professions Code §6155.
+  · <a href="/privacy.html">Privacy</a> · <a href="/terms.html">Terms</a> · <a href="/audit.html">Audit</a>
+</footer>
+
+</body>
+</html>
diff --git a/src/server/directory.ts b/src/server/directory.ts
index ba297f5..49935ae 100644
--- a/src/server/directory.ts
+++ b/src/server/directory.ts
@@ -263,7 +263,7 @@ footer{padding:48px;border-top:1px solid var(--rule);background:var(--noir);colo
       <h3>Site audit</h3>
       <div id="r-audit-loading" class="no-audit">Loading audit…</div>
       <div id="r-audit" style="display:none">
-        <div class="score-label">Site signals · methodology v1.0</div>
+        <div class="score-label">Site signals · <a href="/methodology.html" style="color:var(--ink-mute);border-bottom:1px dotted var(--rule);padding-bottom:1px">methodology v1.0 →</a></div>
         <div class="score-display"><div class="num" id="r-score">—</div><div class="of">/ 100</div></div>
         <div class="score-label" style="margin-top:18px">Top fixes the EZ Upgrade addresses</div>
         <ul class="suggestions" id="r-suggestions"></ul>

← afcb5d7 Iter 28: /directory — champagne tiers + monogram + Volume st  ·  back to Lawyer Directory Builder  ·  Iter 30: /signup + /login submit-disable + loading state 370aff1 →