Skip to content

fix(seo): immediate EEAT and crawl-surface fixes#393

Merged
mergify[bot] merged 1 commit into
mainfrom
fix/seo-quick-wins
May 17, 2026
Merged

fix(seo): immediate EEAT and crawl-surface fixes#393
mergify[bot] merged 1 commit into
mainfrom
fix/seo-quick-wins

Conversation

@julianken
Copy link
Copy Markdown
Owner

Summary

Six small independent fixes that stop active EEAT damage and remove crawl-surface bugs. Identity-neutral (no Tier C dependencies).

Changes

  1. Fixed broken sameAs URLsrc/lib/schema/config.ts:44: github.com/detached-node (HTTP 404) -> github.com/julianken (HTTP 200). A broken external link in schema is worse than no link — it signals an unverifiable entity to Google's entity graph and LLM citation pipelines.
  2. Removed hardcoded detached-node.com in two OG image footers (opengraph-image.tsx line 109 and [slug]/opengraph-image.tsx line 131). Now derives from process.env.NEXT_PUBLIC_SERVER_URL with .dev fallback.
  3. Lifted overviewLead out of <DisclosureSection> in pattern pages. The first paragraph of pattern body content was inside an expanded <details> element; <details> is in the DOM and Googlebot indexes it, but non-Google AI crawlers (GPTBot, ClaudeBot, PerplexityBot) have inconsistent rendering of collapsed content. Plain <p> eliminates the ambiguity.
  4. Removed priority from sitemap (Google ignores since 2017 per John Mueller, Search Central). Keeps lastModified and changeFrequency.
  5. Added CONTACT_EMAIL to src/lib/site-config.ts — used by Category E's RSS feed upgrade and future schema work.
  6. Surfaced visible dateModified on pattern pages — already in JSON-LD, now rendered as <time> for human freshness signal.

Test plan

  • pnpm lint (including lint:adp)
  • pnpm test:unit
  • pnpm typecheck
  • CI E2E (will run on PR)
  • Visual check via pnpm dev of a representative pattern page (confirmed overviewLead renders as plain <p> outside details)

Coordination

Closes #387

- Fix broken github.com/detached-node sameAs URL -> github.com/julianken (HTTP 404 -> 200)
- Replace hardcoded detached-node.com in OG image footers with runtime SITE_DOMAIN
- Lift overviewLead out of DisclosureSection so AI crawlers index it unconditionally
- Remove priority field from sitemap (Google has ignored it since 2017)
- Add CONTACT_EMAIL to site-config (for RSS upgrade in Category E)
- Surface visible dateModified on pattern pages (freshness signal)

Closes #387
@julianken julianken added status:in-review PR open, waiting for review area:seo SEO + AI-discovery strategy work labels May 17, 2026
Copy link
Copy Markdown
Collaborator

@julianken-bot julianken-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE

Six independent SEO fixes, all narrowly scoped, all consistent with their stated rationale. Diff is 23 additions across 7 files; well below the length threshold for an attention dropoff and easy to audit.

Verification ledger

Check Command Result
HEAD pinned gh pr view 393 --json headRefOid 52ab7396726310baaac04d0e4a59b6497ce101f2
pnpm typecheck tsc --noEmit clean — exit 0, no errors
pnpm test:unit vitest run 31 files / 525 tests passed
pnpm lint:adp typecheck-sketches + validate-references + check-affiliate-links + lint-changelog all OK
pnpm lint (eslint) 1435 errors / 66638 warnings — none in PR-touched files pre-existing baseline (R7)
github.com/julianken HTTP status curl -sI 200 (was 404 for detached-node) — the schema sameAs fix is genuine
Next.js MetadataRoute.Sitemap.priority optionality context7 /vercel/next.js/v16.1.6 docs confirmed optional; removal is type-safe
Hardcoded detached-node.com left at HEAD git grep 0 matches (the one in blog-posting.ts is .dev in a comment)

Findings

  1. SUGGESTIONsrc/app/(frontend)/agentic-design-patterns/opengraph-image.tsx:25-27 / [slug]/opengraph-image.tsx:27-29: duplicate SITE_DOMAIN fallback constant across two files. See inline comment.

Bottom line

  • Sitemap priority removal: type-safe per Next 16 docs.
  • sameAs URL: I verified https://github.com/julianken returns 200 and https://github.com/detached-node returns 404. The fix is real.
  • overviewLead lift: removes the collapsed-by-default rendering ambiguity for non-Google AI crawlers; the <DisclosureSection> was already defaultOpen so visible content is unchanged for human readers; the label "Overview · 1-paragraph mechanism" is now absent which is a deliberate trade.
  • <time dateTime> element: pattern.dateModified is typed string (ISO) in types.ts:143, so the dateTime attribute receives a valid value.
  • CONTACT_EMAIL: currently unused; the PR body frames it as forward groundwork for upcoming PRs. Acceptable.

Same-tier note

I am running as opus. If the implementer ran on opus as well, this review has same-tier perplexity-familiarity exposure (arxiv 2410.21819). I did a mandatory R8 second pass with the "this contains at least one improvement" prior; the duplicate-constant SUGGESTION is what surfaced, and I am holding it at SUGGESTION rather than escalating.

@julianken-bot


const SITE_DOMAIN = process.env.NEXT_PUBLIC_SERVER_URL
? new URL(process.env.NEXT_PUBLIC_SERVER_URL).hostname
: "detached-node.dev";
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both [slug]/opengraph-image.tsx and opengraph-image.tsx now carry an identical SITE_DOMAIN block with the same "detached-node.dev" literal. If the canonical domain ever changes — or a future env-handling refactor lands — both files need to be edited in lockstep, and there is no compile-time link between them.

Low-cost polish: lift the fallback into src/lib/site-config.ts (alongside siteName, siteAuthor, the new CONTACT_EMAIL, etc.) and import it. That avoids the assertRequiredEnv indirection that the file-header comments deliberately avoid — a plain string export does not transitively touch process.env in the bundle graph, so the Satori/edge concern those comments cite stays addressed.

Non-blocking — the duplication is two lines, the convergence cost is small, and you may prefer the file-local readability. Flagging because the rest of this PR is consolidating site-identity constants and this is the same theme.

@julianken
Copy link
Copy Markdown
Owner Author

@Mergifyio queue

@mergify
Copy link
Copy Markdown
Contributor

mergify Bot commented May 17, 2026

Merge Queue Status

  • Entered queue2026-05-17 15:36 UTC · Rule: default
  • Checks skipped · PR is already up-to-date
  • Merged2026-05-17 15:37 UTC · at 52ab7396726310baaac04d0e4a59b6497ce101f2 · squash

This pull request spent 23 seconds in the queue, including 2 seconds running CI.

Required conditions to merge
  • #approved-reviews-by >= 1 [🛡 GitHub branch protection]
  • #changes-requested-reviews-by = 0 [🛡 GitHub branch protection]
  • github-review-decision = APPROVED [🛡 GitHub branch protection]
  • any of [🛡 GitHub branch protection]:
    • check-success = ESLint
    • check-neutral = ESLint
    • check-skipped = ESLint
  • any of [🛡 GitHub branch protection]:
    • check-success = TypeScript
    • check-neutral = TypeScript
    • check-skipped = TypeScript
  • any of [🛡 GitHub branch protection]:
    • check-success = Vitest
    • check-neutral = Vitest
    • check-skipped = Vitest
  • any of [🛡 GitHub branch protection]:
    • check-success = Next.js Build
    • check-neutral = Next.js Build
    • check-skipped = Next.js Build
  • any of [🛡 GitHub branch protection]:
    • check-success = Analyze Bundle
    • check-neutral = Analyze Bundle
    • check-skipped = Analyze Bundle
  • any of [🛡 GitHub branch protection]:
    • check-success = CodeQL Analysis
    • check-neutral = CodeQL Analysis
    • check-skipped = CodeQL Analysis
  • any of [🛡 GitHub branch protection]:
    • check-success = E2E Shard 1/4
    • check-neutral = E2E Shard 1/4
    • check-skipped = E2E Shard 1/4
  • any of [🛡 GitHub branch protection]:
    • check-success = E2E Shard 2/4
    • check-neutral = E2E Shard 2/4
    • check-skipped = E2E Shard 2/4
  • any of [🛡 GitHub branch protection]:
    • check-success = E2E Shard 3/4
    • check-neutral = E2E Shard 3/4
    • check-skipped = E2E Shard 3/4
  • any of [🛡 GitHub branch protection]:
    • check-success = E2E Shard 4/4
    • check-neutral = E2E Shard 4/4
    • check-skipped = E2E Shard 4/4

@mergify mergify Bot added the queued label May 17, 2026
@mergify mergify Bot merged commit 5d73331 into main May 17, 2026
13 checks passed
@mergify mergify Bot deleted the fix/seo-quick-wins branch May 17, 2026 15:37
@mergify mergify Bot removed the queued label May 17, 2026
mergify Bot pushed a commit that referenced this pull request May 18, 2026
* chore(docs): drop seo-strategy folder; align README to renamed post slug

Removes docs/seo-strategy/ — research artifacts from the SEO + AI-
discovery analysis funnel, no longer load-bearing now that the
gate-1/2/3 work has shipped (#393 #394 #395 #396 #397 #400 #402 #404
#406 #408). History preserved in git.

README: align "Recent essays" entry with the renamed post
slug (where-agentic-patterns-actually-live →
agentic-patterns-in-your-coding-workflow). The rename satisfies Bing
Site Scan's 70-char title cap.

No redirect deployed — article is two days old, no significant
external link equity to preserve.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: defer README slug update; gitignore docs/seo-strategy

Address julianken-bot review of PR #409:

BLOCKER (README:75) — New slug URL serves an SSR 404 fallback because
the Payload post slug hasn't been renamed yet (intentionally deferred
until the in-flight Bing Site Scan completes). Reverting the README
link change here; it will land in a follow-up PR after the actual
Payload slug rename, so the link is never broken in main.

Plus: add /docs/seo-strategy/ to .gitignore so future analysis-funnel
artifacts (phase-*, context-packets, STATUS.md, issues/) stay on disk
without polluting the index.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:seo SEO + AI-discovery strategy work status:in-review PR open, waiting for review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(seo): broken sameAs URL + 5 other quick-wins

2 participants