Skip to main content

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-content for E-E-A-T scoring, /seo-geo for Authority/Brand sub-scoring.
  • Thread B — corpus grep. receiptsStatus distribution across src/content/skills/*.md (197 files). Hero-image coverage across src/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:

SurfaceCount
Skills (committed, draft:false)197
receiptsStatus: firsthand9
receiptsStatus: todo45
receiptsStatus: generic0
→ no receiptsStatus field143
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?):

SurfaceE-evE-dispATHeadline
Homepage /473 (cap)83 claims, 0 proof; 87-word answer block
About /about/673 (cap)6No dateModified; no sample-work anchor
Post — exemplary firsthand994 (cap)8Missing updatedDate only
Skill — flagship marketing3658No receiptsStatus; generic Receipts
Skill — flagship workflow3758Same shape: no receiptsStatus; generic
Skills index /skills/485 (cap)7143 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 topicLede wHeroInternal links
Cloudflare AI Audit robots.txt trap~65Y3
Parallel-session gitignore trap~80Y1
One dispatch, 160 files~85N2
Cloudflare Pages HTML cache, week one~90Y2
Verification-half-the-audit~110N1

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:

  1. Add a receiptsStatus chip 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.

  2. 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-content and seo-geo are 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.