A continuation of Janady13/crawler-signal-reference / framework-html-meta-author.md. The complete source identity, every recorded occurrence, and linked equations are on its first page.
Source transcript · continued
Download complete source text ↓1,920 lines · 68.4 KB
4. [ ] No conflicting `<meta name="author">` tags on a single page (typically one per page).
### Editorial content
5. [ ] Blog posts attributed to individual person.
6. [ ] Case studies attributed to individual person.
7. [ ] Tutorials attributed to individual person.
8. [ ] News articles attributed to individual person.
### Marketing content
9. [ ] Service pages attributed to organization (or no author).
10. [ ] Pricing pages attributed to organization.
11. [ ] Contact pages attributed to organization or omitted.
12. [ ] Landing pages attributed to organization.
### YMYL content (mental health, financial, legal)
13. [ ] YMYL pages attributed to credentialed individuals.
14. [ ] Credentials accurately represented (not overstated).
15. [ ] **Handled Tax content uses PTIN credentialed terminology, NEVER CPA or EA.**
16. [ ] Counseling content includes therapist license info.
### Schema.org alignment
17. [ ] Schema.org Article.author or BlogPosting.author matches meta author.
18. [ ] Schema.org includes Person.url where appropriate.
19. [ ] Schema.org includes Person.jobTitle for editorial bylines.
20. [ ] Schema.org includes EducationalOccupationalCredential for YMYL.
21. [ ] Schema.org includes Organization.publisher.
### Visible byline alignment
22. [ ] Visible byline present on editorial content.
23. [ ] Byline text matches meta author and Schema.org author.
24. [ ] Byline includes link to author page.
25. [ ] Byline shows credentials for YMYL content.
### Open Graph alignment
26. [ ] og:type set to "article" for editorial content.
27. [ ] article:author set with author page URL.
28. [ ] article:published_time set with ISO 8601 date.
### Twitter Card alignment
29. [ ] twitter:creator set to author's Twitter/X handle.
30. [ ] twitter:site set to organization's Twitter/X handle.
### Wikidata verification
31. [ ] Where author has Wikidata entry, Schema.org sameAs includes Wikidata URL.
32. [ ] Joseph Anady attribution includes sameAs to Q138610626 where appropriate.
33. [ ] sameAs URLs are valid and verifiable.
### Privacy and safety
34. [ ] No employee attribution without consent.
35. [ ] No personal info beyond what author approved.
36. [ ] Pseudonym option offered to contributors when appropriate.
### Consistency across the site
37. [ ] Author name consistent across all attributed pages (no "Joseph" vs "Joseph Anady" vs "Joseph W. Anady" fragments).
38. [ ] Author URL points to a real about page.
39. [ ] About page has substantive author bio.
### Cross cutting
40. [ ] `meta charset="utf-8"` precedes meta author (per framework-html-meta-charset.md).
41. [ ] Author attribution doesn't appear on noindex pages (unnecessary).
### Multiple authors
42. [ ] Multi author content uses Schema.org array.
43. [ ] Multi author content lists primary author first in array.
44. [ ] Multiple `<meta name="author">` tags avoided where possible.
### Tooling and process
45. [ ] AUTHORS registry maintained per client site.
46. [ ] Template macro emits aligned author signals across all layers.
47. [ ] Pre deploy alignment check runs.
48. [ ] `author-audit.sh` script in `/usr/local/bin/`.
### Documentation
49. [ ] Author strategy documented per client.
50. [ ] Privacy considerations documented.
A site that passes all 50 has correctly configured author attribution for E-E-A-T signals, social media link previews, and editorial credibility.
---
## 17. COMMON PITFALLS
Fifteen patterns to recognize and avoid.
**Pitfall 1: Marketing pages with personal author attribution.**
Symptom: every page on the site attributes to "Joseph Anady" including service pages and pricing.
Why it breaks: dilutes the editorial vs marketing signal; less effective.
Fix: organization attribution for marketing content; individual attribution only for editorial.
**Pitfall 2: Credentialed overstatement on YMYL content.**
Symptom: tax preparer described as "CPA" or "Enrolled Agent" without actually being credentialed.
Why it breaks: SDVOSB protective concern; legal risk; FTC compliance.
Fix: use accurate credentials only. PTIN ≠ CPA/EA. Use the exact credential terminology.
**Pitfall 3: Conflicting author signals across layers.**
Symptom: meta author says "Joseph", Schema.org says "Joseph Anady", byline says "J. Anady".
Why it breaks: fragmented author identity; Google confidence drops.
Fix: pick one canonical name; use it everywhere.
**Pitfall 4: Missing author on editorial content.**
Symptom: blog posts have no author attribution anywhere.
Why it breaks: weak E-E-A-T signal; lower content quality assessment.
Fix: add meta author, Schema.org author, and visible byline.
**Pitfall 5: Schema.org author without supporting layers.**
Symptom: rich Schema.org Person but no meta author tag or visible byline.
Why it breaks: missed reinforcement; less robust signal.
Fix: add meta author and visible byline.
**Pitfall 6: Author tag on noindex pages.**
Symptom: login page has `<meta name="author" content="Editorial Team">`.
Why it breaks: wasted metadata; noindex page won't be displayed in search.
Fix: omit author on noindex pages.
**Pitfall 7: Author URL pointing to homepage.**
Symptom: author Person.url is "https://thatdeveloperguy.com/" not "/about/".
Why it breaks: homepage is not a specific author page; weak identity signal.
Fix: link to a dedicated author/about page.
**Pitfall 8: No about page for attributed author.**
Symptom: author attribution exists but no /about/ page describes the author.
Why it breaks: incomplete identity signal; users can't verify the author.
Fix: build a substantive about page including bio, credentials, contact.
**Pitfall 9: Pseudonym attribution on YMYL content.**
Symptom: medical advice attributed to "Editorial Team".
Why it breaks: weak E-E-A-T for YMYL; rankings suffer.
Fix: real, credentialed author for YMYL content.
**Pitfall 10: Including author identity without consent.**
Symptom: employee's real name attributed to a controversial article they wrote on behalf of the company.
Why it breaks: privacy violation; potential harm to author.
Fix: get explicit consent; offer pseudonym option.
**Pitfall 11: Multiple competing meta author tags.**
Symptom: page has both `<meta name="author" content="A">` and `<meta name="author" content="B">`.
Why it breaks: behavior is inconsistent across consumers.
Fix: single meta author tag; use Schema.org array for multiple authors.
**Pitfall 12: Schema.org author as a string instead of Person object.**
Symptom: `"author": "Joseph Anady"` instead of `"author": {"@type": "Person", "name": "Joseph Anady"}`.
Why it breaks: less structured information; can't add credentials, sameAs, etc.
Fix: use the full Person object syntax.
**Pitfall 13: Inconsistent author across the same client's pages.**
Symptom: blog post 1 attributed to "Jane Doe", blog post 2 to "J. Doe", blog post 3 to "Jane".
Why it breaks: search engines can't aggregate author authority.
Fix: standardize the canonical name; use it on every page.
**Pitfall 14: Privacy violation via Schema.org sameAs.**
Symptom: author's personal Facebook, Instagram, Twitter all linked via sameAs.
Why it breaks: more personal info exposed than necessary.
Fix: only include public, verifiable, professional identity links (Wikidata, LinkedIn, professional site).
**Pitfall 15: Federal subcontract page attributed to staff but credentials misrepresented.**
Symptom: page attributes to "Engineer" without engineering credential, or "Project Manager" with overstated role.
Why it breaks: federal compliance concern; potential audit issue.
Fix: accurate role and credential attribution.
---
## 18. DIAGNOSTIC COMMANDS
Reference of commands useful for author attribution investigation.
### Inspect a single URL
```bash
# Extract meta author
curl -s https://example.com/article/ | grep -oE 'meta name="author"[^>]+' | head -1
# Extract Schema.org author (requires parsing JSON-LD)
curl -s https://example.com/article/ | python3 -c "
import sys, json, re
text = sys.stdin.read()
for match in re.findall(r'<script type=\"application/ld\+json\">(.*?)</script>', text, re.DOTALL):
try:
data = json.loads(match)
if isinstance(data, dict) and 'author' in data:
print(json.dumps(data['author'], indent=2))
except:
pass
"
# Extract visible byline
curl -s https://example.com/article/ | grep -oE 'class="byline"[^<]*<[^>]+>[^<]+'
```
### Check alignment
```bash
URL=$1
author-alignment-check.sh "$URL"
```
### Bulk audit
```bash
# Audit all editorial URLs (assumes /blog/ contains editorial content)
for url in $(curl -s https://example.com/sitemap.xml | grep -oE "<loc>[^<]+</loc>" | sed 's/<[^>]*>//g' | grep "/blog/"); do
META=$(curl -s "$url" 2>/dev/null | grep -oE 'meta name="author"[^>]+' | head -1 | sed 's/.*content="\([^"]*\)".*/\1/')
echo "$url -> $META"
done
```
### Find missing author on editorial pages
```bash
# Pages in /blog/ that lack meta author
for url in $(curl -s https://example.com/sitemap.xml | grep -oE "<loc>[^<]+</loc>" | sed 's/<[^>]*>//g' | grep "/blog/"); do
HAS=$(curl -s "$url" 2>/dev/null | grep -c 'meta name="author"')
if [ "$HAS" = "0" ]; then
echo "MISSING AUTHOR: $url"
fi
done
```
### Verify Wikidata sameAs
```bash
# For Joseph's content, verify Wikidata link is present
URL=$1
HAS_WIKIDATA=$(curl -s "$URL" | grep -c "wikidata.org/wiki/Q138610626")
[ "$HAS_WIKIDATA" -gt 0 ] && echo "OK: Wikidata sameAs present" || echo "MISSING: Wikidata sameAs"
```
### Find inconsistent author names
```bash
# Look for name variations on a client's editorial content
curl -s https://example.com/sitemap.xml | grep -oE "<loc>[^<]+</loc>" | sed 's/<[^>]*>//g' | grep "/blog/" | while read url; do
META=$(curl -s "$url" 2>/dev/null | grep -oE 'meta name="author"[^>]+' | head -1 | sed 's/.*content="\([^"]*\)".*/\1/')
echo "$META"
done | sort | uniq -c | sort -rn
# Should show one author with consistent count, not multiple variations
```
### Check credential mentions for YMYL clients (Handled Tax guardrail)
```bash
# For Handled Tax site: ensure CPA/EA never appears in attribution
URL=https://handledtax.com
for u in $(curl -s "$URL/sitemap.xml" | grep -oE "<loc>[^<]+</loc>" | sed 's/<[^>]*>//g'); do
HAS_CPA=$(curl -s "$u" 2>/dev/null | grep -c -iE "amanda.*(cpa|enrolled.*agent|ea\b)")
if [ "$HAS_CPA" -gt 0 ]; then
echo "VIOLATION: $u contains credential overstatement"
fi
done
```
### Browser verification
In Chrome DevTools:
1. Open editorial page.
2. View page source (Cmd/Ctrl + U).
3. Find `<meta name="author">`.
4. Find Schema.org `<script type="application/ld+json">`.
5. Find visible byline element.
6. Confirm all three say the same author.
Use Google's Rich Results Test:
- https://search.google.com/test/rich-results
- Paste URL.
- Verify Schema.org author parses correctly.
### After template changes
```bash
# Restart FastAPI sidecar
systemctl restart fastapi-sidecar
# Verify on sample page
author-alignment-check.sh https://example.com/blog/sample-post/
# Run audit
author-audit.sh https://example.com/
```
---
## 19. CROSS-REFERENCES
* [framework-html-meta-description.md](framework-html-meta-description.md): meta description and meta author both belong in `<head>`; align them with the same editorial voice.
* [framework-html-meta-charset.md](framework-html-meta-charset.md): author names with international characters require UTF-8 (e.g., Dr. Kristy Burton works fine; Marshallese authors with diacritics need full UTF-8 chain).
* [framework-html-meta-robots.md](framework-html-meta-robots.md): author attribution unnecessary on noindex pages.
* [framework-html-meta-keywords.md](framework-html-meta-keywords.md): like keywords, author is exposed in page source; privacy considerations apply.
* [framework-http-seo-headers.md](framework-http-seo-headers.md): no author HTTP header exists; meta tag is the only HTML mechanism.
* [UNIVERSAL-RANKING-FRAMEWORK.md](UNIVERSAL-RANKING-FRAMEWORK.md): the master ranking reference. E-E-A-T is the framework where author signals matter most.
* [SEO-BUILD-REFERENCE.md](SEO-BUILD-REFERENCE.md) v2.4: the build playbook including author strategy per client.
* Google's E-E-A-T documentation: https://developers.google.com/search/docs/fundamentals/creating-helpful-content
* Google's Search Quality Rater Guidelines: https://services.google.com/fh/files/misc/hsw-sqrg.pdf
* Schema.org Person type: https://schema.org/Person
* Schema.org Article.author: https://schema.org/Article
* Schema.org EducationalOccupationalCredential: https://schema.org/EducationalOccupationalCredential
* MDN meta name=author: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name
* Dublin Core Metadata Initiative: https://www.dublincore.org/specifications/dublin-core/
* Wikidata: https://www.wikidata.org/
* Wikidata Q138610626 (Joseph Anady): https://www.wikidata.org/wiki/Q138610626
---
## APPENDIX A: ONE PAGE QUICK REFERENCE
For the person who just wants the answer.
### The Bubbles rule
**Editorial content**: individual author with Schema.org Person.
**Marketing content**: organization attribution or none.
**YMYL content**: credentialed individual author with EducationalOccupationalCredential.
### The canonical pattern (editorial with verified identity)
```html
<head>
<meta name="author" content="Joseph Anady">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"author": {
"@type": "Person",
"name": "Joseph Anady",
"url": "https://thatdeveloperguy.com/about/",
"sameAs": ["https://www.wikidata.org/wiki/Q138610626"]
},
"publisher": {
"@type": "Organization",
"name": "ThatDeveloperGuy.com"
}
}
</script>
</head>
<body>
<article>
<p class="byline">By <a href="/about/" rel="author">Joseph Anady</a></p>
</article>
</body>
```
### Five rules to memorize
1. **Editorial: individual. Marketing: organization. YMYL: credentialed individual.**
2. **All author signals must align: meta, Schema.org, byline, Open Graph, Twitter.**
3. **For YMYL Bubbles clients: Handled Tax = PTIN ONLY, not CPA/EA. Counseling = LPC.**
4. **Use Wikidata sameAs for verified identity (Joseph Q138610626).**
5. **Privacy: get author consent. Pseudonym option when appropriate.**
### Five commands every operator should know
```bash
# 1. Check meta author for a URL
curl -s URL | grep -oE 'meta name="author"[^>]+' | head -1
# 2. Verify alignment across layers
author-alignment-check.sh URL
# 3. Find missing author on editorial pages
for url in $(curl -s URL/sitemap.xml | grep -oE "<loc>[^<]+</loc>" | sed 's/<[^>]*>//g' | grep "/blog/"); do
HAS=$(curl -s "$url" | grep -c 'meta name="author"')
[ "$HAS" = "0" ] && echo "MISSING: $url"
done
# 4. Verify credential guardrails (Handled Tax)
curl -s URL | grep -c -iE "amanda.*(cpa|enrolled.*agent|ea\b)"
# Expected: 0
# 5. Apply changes
systemctl restart fastapi-sidecar
```
### Three end to end tests
```bash
# 1. Editorial page has all three layers (meta + schema + byline)
URL=https://thatdeveloperguy.com/blog/sample/
META=$(curl -s "$URL" | grep -c 'meta name="author"')
SCHEMA=$(curl -s "$URL" | grep -c '"author"')
BYLINE=$(curl -s "$URL" | grep -c 'class="byline"')
[ "$META" -ge 1 ] && [ "$SCHEMA" -ge 1 ] && [ "$BYLINE" -ge 1 ] && echo "OK: all three layers" || echo "FAIL"
# 2. Marketing page has organization or no attribution
URL=https://thatdeveloperguy.com/services/
META=$(curl -s "$URL" | grep -oE 'meta name="author" content="[^"]+"' | sed 's/.*content="\([^"]*\)".*/\1/')
if [ -z "$META" ] || [ "$META" = "ThatDeveloperGuy" ]; then
echo "OK: organization or omitted"
else
echo "FAIL: $META on marketing page"
fi
# 3. YMYL credential guardrail respected (Handled Tax)
URL=https://handledtax.com
VIOLATIONS=$(curl -s "$URL/sitemap.xml" | grep -oE "<loc>[^<]+</loc>" | sed 's/<[^>]*>//g' | while read u; do
curl -s "$u" 2>/dev/null | grep -iE "amanda.*(cpa|enrolled.*agent|ea\b)" > /dev/null && echo "$u"
done | wc -l)
[ "$VIOLATIONS" = "0" ] && echo "OK: no credential overstatement" || echo "FAIL: $VIOLATIONS violations"
```
If all three pass, the author attribution layer is correctly wired across the meta, structured data, and visible byline signals with privacy and credential guardrails respected.
---
End of framework-html-meta-author.md.