Audit conventions, the running list
Private deliverable. Enter the hub password to continue.
That's not right. Try again.
Audit conventions, the running list
Read this before producing any client audit. Annette's order, 2026-07-31: corrections she gives on one audit apply to all future audits, of every type. So this file is the accumulated ruleset, not a changelog. When she gives feedback, change the pipeline and add the rule here, rather than fixing one report by hand.
Where audits live
Every audit and client report publishes to verityagentic.ai/clients/<slug>.html in the Verity style. Never on annettethompson.com/hub, never left on the tool that generated it (SEOBeliever, Lighthouse, whatever), never handed to a client as a raw third-party URL.
Client work goes out under the consulting brand. That is the whole point.
The four non-negotiables
These pages carry a client's real revenue, costs, member counts and prospect lists. Every one of them must be:
noindex, nofollowin the head. The builder does this automatically.- Password gated, shared gate.
- Absent from
sitemap.xml. Disallow: /clients/in every robots.txt group, not just*. A crawler that matches a specific group ignores the wildcard entirely, so GPTBot and ClaudeBot each need their own line. There are 14 groups.
Never publish a client report missing any of the four.
Style
White reading surface, Verity chrome. These are long, table-heavy documents a client reads and prints; the site's noir is a marketing surface, not a reading one. Brand carries through the nav, the Oswald headlines, the yellow rules and the black table heads.
The builder lifts the nav, footer, fonts and CSS out of a live Verity article at build time, so the chrome follows the site automatically. Do not hand-copy CSS into these pages, and do not try to extract "just the chrome" by selector prefix: that was tried, it silently dropped .nav-links, and three reports shipped with an unstyled Times New Roman nav.
Every audit gets a table of contents with working in-page anchors. Imported reports get one generated from their <h2>s.
Accumulated corrections
Each of these came from Annette on a specific report and now applies to all of them.
1. Keep em dashes inside verbatim quoted data (2026-07-30)
The no-em-dash rule protects Annette's prose. It does not extend to verbatim quotes of a client's own data, where changing a dash falsifies the record. The womenrise.co audit quotes Laura's <title> tags as evidence, and those titles separate the page name from the brand with an em dash. Rewriting them would tell her the titles use commas.
(This file is Annette's prose, so it contains no em dash of its own. The hook caught exactly that while this rule was being written, which is the behavior you want.)
Implemented as an explicit allowlist at .githooks/em-dash-allow, matching imported audit files. Skipped files are printed on every commit, so an exemption is never silent. Zero tolerance still applies to every other prose file, and to anything Annette writes.
Do not reach for git commit --no-verify.
2. Cut the verdict-methodology boilerplate (2026-07-31)
Delete this paragraph from every imported SEO audit:
Every verdict is derived from a measured value by fixed rules, so the same site always produces the same result and a re-audit is directly comparable. An area with no data reads "Not measured", never "fine".
Implemented as STRIP_PARAGRAPHS in scripts/import_seo_report.py, matched on a distinctive substring. It is removed at import rather than edited out of the markdown, because the markdown is regenerated from the live report on every import and a hand-edit would silently come back. The importer warns if a strip pattern stops matching, so an upstream reword surfaces instead of quietly restoring the text.
Add future cuts to that list, not to the markdown.
Producing one
# 1. Import (any SEOBeliever audit URL)
py -3.13 scripts/import_seo_report.py <report-url> _client-reports/<slug>.md
# 2. Render to a gated Verity page
py -3.13 scripts/build_client_report.py --src _client-reports/<slug>.md --slug <slug> \
--title "acme.com, SEO audit" --client "Prepared for Jane, Acme"
# 3. Verify behind the gate (the site validator only ever reaches the password screen)
py -3.13 scripts/check_client_report.py <slug>
Then commit, push, and deploy from public/. The pre-deploy guard blocks a dirty tree deliberately.
Verify what the conversion actually kept. The importer is checked against the source: every table, every section, and every number in the original must survive. It has been wrong before, promoting a data row into a table header and turning "Performance score | 34" into a column heading.
Published to Annette's hub. Rebuilt from the source markdown, so edit the source and rerun rather than editing this page.