← back to Lawyer Directory Builder

public/methodology.html

345 lines

<!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="canonical" href="https://lawyers.agentabrams.com/methodology.html">
<meta name="robots" content="index, follow">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="apple-touch-icon" href="/favicon-32.png">
<meta name="theme-color" content="#0a0a0c">

<meta property="og:type" content="article">
<meta property="og:site_name" content="Counsel &amp; Bar">
<meta property="og:title" content="Audit methodology v1.0 · Counsel &amp; Bar">
<meta property="og:description" content="Twelve technical and presentation signals, weighted, bounded, refresh-cadence published. What this score is and isn't, in writing.">
<meta property="og:url" content="https://lawyers.agentabrams.com/methodology.html">
<meta property="og:image" content="https://lawyers.agentabrams.com/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Counsel &amp; Bar — audit methodology v1.0">

<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Audit methodology v1.0 · Counsel &amp; Bar">
<meta name="twitter:description" content="Twelve published signals. Bounded scope. Independent of any commercial offering.">
<meta name="twitter:image" content="https://lawyers.agentabrams.com/og.png">

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "@id": "https://lawyers.agentabrams.com/methodology.html#article",
  "headline": "Audit methodology v1.0",
  "description": "The twelve technical and presentation signals Counsel & Bar uses to score California-licensed attorney websites. Defines tier thresholds, refresh cadence, corrections process, and explicit boundaries (not legal skill, not outcomes, not endorsement).",
  "url": "https://lawyers.agentabrams.com/methodology.html",
  "inLanguage": "en-US",
  "datePublished": "2026-05-04",
  "dateModified": "2026-05-04",
  "version": "1.0",
  "author": {
    "@type": "Organization",
    "name": "Counsel & Bar",
    "url": "https://lawyers.agentabrams.com/"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Counsel & Bar",
    "url": "https://lawyers.agentabrams.com/"
  },
  "mainEntityOfPage": "https://lawyers.agentabrams.com/methodology.html"
}
</script>

<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">Acceptable <em>exceptions.</em></h2>
  <div class="disclosure">
    <p class="eyebrow">— Where a signal does not apply —</p>
    <p>A small number of sites legitimately omit certain signals because their business model does not call for them. The audit treats these omissions as <strong>not-applicable</strong> rather than as failures, provided the site discloses the reason. Examples:</p>
    <p>· <strong>Phone number.</strong> Sites whose stated purpose is research, indexing, or data publishing (and which do not solicit client matters) may legitimately omit a published phone number, where doing so would mislead consumers into expecting case intake or legal advice. The site must clearly disclaim phone-contact intent.<br>
       · <strong>Practice-area schema.</strong> Non-firm directory and reference sites are not penalized for omitting <code>LegalService</code>-style schema, since they are not legal-service providers.<br>
       · <strong>Contact form.</strong> Read-only reference sites that publish no inbound channel beyond a moderated email address are scored on the email signal alone.</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">Self-audit <em>disclosure.</em></h2>
  <div class="disclosure">
    <p class="eyebrow">— Counsel &amp; Bar, audited by its own rule —</p>
    <p>To make the methodology testable in public, we run it against this site too. Counsel &amp; Bar is a directory and software platform, not a law firm; under the rule above, its phone signal is recorded as <strong>not-applicable</strong> rather than missing. We publish the resulting score as we would any audited firm, and we do not adjust the score upward to account for our role as the auditor.</p>
    <p>The self-audit is rerun on the same ninety-day cadence as audited firms, and any change to its tier appears here.</p>
  </div>

  <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="/audit.html">Audit</a> · <a href="/style.html">Visual standard</a> · <a href="/privacy.html">Privacy</a> · <a href="/terms.html">Terms</a>
</footer>

</body>
</html>