# E-E-A-T audit: anonymity policy caps Authority at 5/10

> E-E-A-T audit, 197 skills + 20 blog posts on anonymous wiki. Authority caps at ~5/10 by policy. Experience-on-display is the real defect — three fixes shipped.

**Canonical URL**: https://agentcookbooks.com/blog/eeat-audit-anonymity-policy-as-authority-ceiling/

**Published**: 2026-05-17

**Tags**: claude-code, audit, seo

---

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](/skills/), two flagship skill pages, and a representative blog post. Sourced against committed source files (no DataForSEO, no live-URL tooling). Frameworks: [`/seo-content`](/skills/seo-content/) for E-E-A-T scoring, [`/seo-geo`](/skills/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:**

| 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](/blog/cloudflare-pages-csp-pagefind/)); a 6-line helper verbatim plus a Node verification one-liner ([meta-description-sprawl](/blog/meta-description-sprawl-one-helper-fixes-142-pages/)); a JSON config + Node script + two named failure modes ([claude-code-hooks-cookbook](/blog/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](/blog/three-seo-skills-pre-launch-audit/) (one URL, no live tooling, scored from Astro source) and the [four-skill homepage audit](/blog/four-seo-skills-only-sweep-4-found-the-gap/) (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.