Skip to content

feat(seo): migrate to Tier C identity (real name + bylines + ProfilePage schema) #388

Description

@julianken

Context

Source: docs/seo-strategy/phase-4/analysis-report.md, Gate 1 — Unblock the entity graph (the Tier C identity bundle).

Author entity migration: change site author identity from pseudonym "detached-node" to dual identity "Julian (detached-node)". Brand "detached-node" stays as the site name and pseudonym; bylines and schema use real name. Unlocks recruiter-AI surfacing and AI citation entity-graph resolution.

⚠️ Blocked on user decisions

This issue cannot start until the user confirms:

  • D1 — Tier C identity migration (visible byline "Julian (detached-node)", real name in schema)
  • D3 — Surname "Kennon" (inferred from email julian.kennon.d@gmail.com; correct if wrong)

Status label will be flipped from status:blockedstatus:todo after confirmation.

Acceptance criteria

  • src/lib/schema/config.ts — replace AUTHOR_CONFIG with Tier C shape (full JSON in analysis report Gate 1.3): name: "Julian Kennon", expanded description, jobTitle, knowsAbout array (deliberately broad: include "Distributed systems", "TypeScript", "Full-stack software engineering" alongside agentic terms — R12 mitigation against niche-pigeonholing)
  • sameAs array becomes ["https://github.com/julianken", "https://www.linkedin.com/in/julian-kennon"] (LinkedIn URL is a placeholder; updated in a follow-up PR after profile is created — flag this in PR body)
  • src/lib/schema/types.ts — extend PersonSchema interface with optional jobTitle?: string and knowsAbout?: string[]
  • src/lib/schema/person.ts — spread new fields into generated Person object
  • New file src/lib/schema/profile-page.tsgenerateProfilePageSchema() per analysis report Gate 1.4 (full code provided there); embeds Person as mainEntity
  • src/lib/schema/index.ts — export generateProfilePageSchema, ProfilePageSchema
  • src/app/(frontend)/about/page.tsx:41,70 — replace generatePersonSchema() with generateProfilePageSchema() in SchemaScript schema={[...]} (both branches); update import
  • src/app/(frontend)/layout.tsx:44 — replace authors: [{ name: siteName }] with authors: [{ name: "Julian Kennon" }]
  • src/app/(frontend)/posts/[slug]/page.tsx:125-131 — add visible byline below the post title:
    <p className="text-sm text-text-tertiary">
      by{" "}
      <Link href="/about" rel="author" className="hover:text-accent">
        Julian (detached-node)
      </Link>
    </p>
  • src/components/agentic-patterns/PatternHeader.tsx — add small byline footer (smaller, less prominent than posts)
  • Unit test: tests/unit/lib/schema/profile-page.test.ts covers the new generator
  • Schema.org validator clean on /, /about, one post, one pattern (paste rendered JSON-LD into validator.schema.org; expect zero errors). Include validator screenshot or paste in PR body
  • Local verification: pnpm lint && pnpm test:unit && pnpm typecheck pass
  • PR body includes Closes #<this-issue> + screenshots of view-source: showing new JSON-LD + note that Julian must manually update the About page Payload DB record post-merge (the DB record currently blocks the hardcoded fallback)
  • julianken-bot review posted with APPROVE verdict

Out of scope

  • Updating the About page body via Payload DB — that is Julian's manual step (the subagent does NOT touch Payload data)
  • Creating the LinkedIn profile — Julian's manual step (separate flow)
  • All other categories (B, D, E, F, J have separate issues)

Reference files

  • Plan: ~/.claude/plans/make-a-plan-to-peppy-swan.md — Category C
  • Analysis report: docs/seo-strategy/phase-4/analysis-report.md — Gate 1.3 (AUTHOR_CONFIG), Gate 1.4 (ProfilePage schema), Gate 1.5 (layout.tsx), Gate 1.6 (bylines)
  • Identity decision matrix: docs/seo-strategy/phase-1/area-3-identity-eeat.md
  • Tier C × content cross-cut: docs/seo-strategy/phase-2/iterator-5-identity-content-crosscut.md

Workflow

  • Branch: feat/seo-tier-c-identity
  • Worktree: ../wt-{this-issue}-seo-tier-c-identity
  • Conventional commit: feat(seo): Tier C identity migration + ProfilePage schema
  • PR title: same as commit
  • Subagent type: general-purpose

Metadata

Metadata

Assignees

Labels

area:seoSEO + AI-discovery strategy workstatus:in-reviewPR open, waiting for review

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions