E-E-A-T audit: anonymity policy caps Authority at 5/10
E-E-A-T audit across 197 committed skills and 20 blog posts on a brand-anonymous, location-anonymous Astro wiki. Authority sub-scores cap at ~3-5/10 on every page by policy — operator name, city, and timezone names are banned from committed files and rendered output. Rubric frameworks treat author bio + named-brand mentions as primary Authority signals; the policy intentionally suppresses both, making the cap structural, not fixable. The real defect was the Experience-on-display axis: 87-word answer block on the homepage with three editorial-bar claims and zero proof artifact (target 134-167 words for the AI-citation extract band), 143 of 197 skills rendering em-dash on the Receipts column because receiptsStatus wasn’t populated, and 8 of 20 blog posts under the 134-word lede floor — the more dramatic the headline finding, the more the lede was trimmed. Three of six top fixes closed the same day.
What I ran
Four parallel investigations against the live site, deliberately separating signal from artifact:
- Thread A — EEAT signal scoring per surface. 1-10 per E/E/A/T axis on homepage, about, skills index, two flagship skill pages, and a representative blog post. Sourced against committed source files (no DataForSEO, no live-URL tooling). Frameworks:
/seo-contentfor E-E-A-T scoring,/seo-geofor Authority/Brand sub-scoring. - Thread B — corpus grep.
receiptsStatusdistribution acrosssrc/content/skills/*.md(197 files). Hero-image coverage acrosssrc/content/blog/*.md(20 files). All counts grep-verified. - Thread C — per-post content sweep. Lede word counts, hero presence, internal-link counts across all 20 blog posts.
- Thread D — verify pending session-log items. Confirm three open items hadn’t been silently closed by a commit elsewhere.
No edits during the audit pass. Three fixes that landed the same day were a deliberate second cycle after the audit completed.
What happened
Corpus state, grep-verified:
| Surface | Count |
|---|---|
Skills (committed, draft:false) | 197 |
→ receiptsStatus: firsthand | 9 |
→ receiptsStatus: todo | 45 |
→ receiptsStatus: generic | 0 |
→ no receiptsStatus field | 143 |
Blog posts (committed, draft:false) | 20 |
→ with hero: frontmatter + file in public/og/ | 17 |
Math checks: 9 + 45 + 0 + 143 = 197 ✓ · 17 + 3 = 20 ✓.
EEAT scorecard, by surface. Scale 1-10. Anonymity-capped Authority marked (cap). Two E’s: Experience-evidence (was the work actually done?) and Experience-on-display (does the page show it?):
| Surface | E-ev | E-disp | A | T | Headline |
|---|---|---|---|---|---|
Homepage / | 4 | 7 | 3 (cap) | 8 | 3 claims, 0 proof; 87-word answer block |
About /about/ | 6 | 7 | 3 (cap) | 6 | No dateModified; no sample-work anchor |
| Post — exemplary firsthand | 9 | 9 | 4 (cap) | 8 | Missing updatedDate only |
| Skill — flagship marketing | 3 | 6 | 5 | 8 | No receiptsStatus; generic Receipts |
| Skill — flagship workflow | 3 | 7 | 5 | 8 | Same shape: no receiptsStatus; generic |
Skills index /skills/ | 4 | 8 | 5 (cap) | 7 | 143 of 197 em-dash; no legend |
The contrarian finding: anonymity caps Authority by policy
The site is brand-anonymous and location-anonymous on purpose. No operator name in any page, no city or timezone name in any schema, no author byline anywhere — Article schema uses Organization: Agent Cookbooks for both author and publisher. Rubric frameworks (seo-content E-E-A-T scoring, seo-geo Authority/Brand sub-score) treat author bio + named-brand mentions as primary Authority signals; the policy intentionally suppresses both.
That puts a structural ceiling around 5/10 on every page’s Authority sub-score, regardless of execution. Worth flagging in audit findings so low scores read as “policy-capped” not “fixable.” Same root cause across both seo-content and seo-geo frameworks, different rubric names. Operator-chosen tradeoff: anonymity > Authority points.
The Experience-on-display axis is the real defect
Three findings that compound:
Homepage answer block: 87 words, no inline proof. Target 134-167 for the AI-citation extract band. The block names three editorial-bar claims (“a working hook, a measured cost, a documented failure mode”) with zero proof artifact colocated. The latest-recipes feed below carries concrete numbers via post titles (“449 visitors”, “142 pages”, “160 files”) — partial mitigation — but the answer block itself, which is what AI engines extract for “what is Agent Cookbooks?” queries, has no inline proof.
Skills index em-dash sprawl. 143 of 197 rows render em-dash on the Receipts column because the receiptsStatus field isn’t populated on those frontmatter blocks. The chip rendering at src/pages/skills/index.astro:163-168 is correct for firsthand/todo/generic/missing — but 72.6% of rows fall through to em-dash and read as half-broken at scale.
Lede length defect on 8 of 20 blog posts. Under the 134-word floor. The more dramatic the headline finding, the shorter the lede — opposite of what AI-citation extraction wants. Bottom five (by approximate lede word count):
| Post topic | Lede w | Hero | Internal links |
|---|---|---|---|
| Cloudflare AI Audit robots.txt trap | ~65 | Y | 3 |
| Parallel-session gitignore trap | ~80 | Y | 1 |
| One dispatch, 160 files | ~85 | N | 2 |
| Cloudflare Pages HTML cache, week one | ~90 | Y | 2 |
| Verification-half-the-audit | ~110 | N | 1 |
Three exemplars (top of corpus) cleared the band easily by leading with real artifacts: a 14-line _headers block inline (cloudflare-pages-csp-pagefind); a 6-line helper verbatim plus a Node verification one-liner (meta-description-sprawl); a JSON config + Node script + two named failure modes (claude-code-hooks-cookbook). Pattern: ledes longer than 134 words happen naturally when the artifact gets stated up front.
Where it drifted
The four-thread structure caught what single-skill rubrics would have missed.
- Thread B (corpus grep) turned 143 individual page defects into one structural finding. A per-page Thread A scoring pass would have flagged each surface as a separate em-dash, not as a corpus-shape pattern. The fix lives at the codemod layer, not the page layer.
- Thread C (per-post lede sweep) turned what looked like one short lede into an 8-post pattern. Thread A is framework-bound — it evaluates one URL at a time. Cross-corpus shape isn’t in its methodology.
- Thread D (verify pending items) caught two session-log items that had been marked open and were still untouched 14 days later. Open items decay quietly when no closing commit lands; verifying against source confirmed the gap.
Three of six top fixes closed the same day after the audit completed. A single-pass codemod populated receiptsStatus: "generic" on 142 skill frontmatter blocks (the 0 → 142 swing left only the explicitly-firsthand and explicitly-todo as non-generic). A receipts paragraph plus a clickable hero figure landed on the homepage, citing three concrete numbers from real posts (142 of 153 meta descriptions, 2,704 vs 966 robots.txt bytes, 5 misplaced rules in 30 min) — closing both the proof-artifact gap and the multi-modal-asset gap in a single insertion. The remaining three (lede sweep on the 8 thin posts, hero regression on 3 missing posts, internal-link sweep on a connector-poor post) deferred to a later cycle.
Authority-cap framing changed how the receipts read. Without the policy callout, a reader sees “Authority 3-5 across the board” and interprets it as weak execution. With the callout, the same numbers read as “operator-chosen tradeoff: anonymity beats Authority points on a static practitioner blog.” Audits that score by rubric without accounting for policy ceilings produce findings that look like defects but aren’t actionable — and that misframes the actual defects (Experience-on-display, in this case) that are.
What I’d change
Two changes to the audit pattern:
-
Add a
receiptsStatuschip legend below the skills index table. Now unblocked since the 143 em-dash rows are chip-rendered after the codemod. Five-minute edit. One-line legend: firsthand = real session notes; TODO = pending firsthand use; generic = plausible-generic. Adds a transparency signal AI engines weight — visible declaration of what was firsthand vs. generic, on the largest page on the site. -
Make corpus-grep a first-class audit pass, not a Thread B side-check. The grep numbers turned three “scattered defects” into one structural finding. Frameworks like
seo-contentandseo-geoare page-bound by design — they evaluate one URL at a time. The corpus-shape view is missing from their methodology and matters most on sites with 100+ pages of the same template. The audit version of “did n=8 miss the defect?” is “did framework-bound n=1 miss the corpus shape?”
The anonymity ceiling stays. Authority sub-score remains capped. Not a defect to fix — a policy to flag so readers don’t read low scores as broken.
Two prior audits in the same thread on the same site: the pre-launch source-files audit (one URL, no live tooling, scored from Astro source) and the four-skill homepage audit (one live URL, four overlapping rubrics, only Sweep 4 caught the claim-vs-proof gap). The corpus-wide pass here is the next-rung application: same Authority ceiling, scored across 197 + 20 surfaces instead of one.