From b2c4da429b74243462ff134eec044d36e34fcdca Mon Sep 17 00:00:00 2001 From: "Charles C. Figueiredo" Date: Thu, 16 Apr 2026 07:39:33 -0400 Subject: [PATCH 1/3] feat(seo): internal linking + sitemap focus for Google indexing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Google Search Console shows 17 pages "Discovered - currently not indexed." The main accelerator is internal linking — the homepage previously linked only to /docs/ with no deep links to individual doc pages. - Homepage chapters now link to relevant docs (Server, FinOps, Hooks) via inline "Read: ..." links below bullet points - Footer adds Hooks & Capture and FinOps links alongside existing Install and Architecture links - Sitemap excludes /blog/ pages to focus crawl budget on docs (blog content predates the harness pivot and isn't maintained) - Hook System description updated to mention PreCompact hooks Co-Authored-By: Claude Opus 4.6 (1M context) --- website/astro.config.mjs | 1 + website/src/components/Footer.astro | 2 ++ website/src/pages/docs/hooks.mdx | 2 +- website/src/pages/index.astro | 22 ++++++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/website/astro.config.mjs b/website/astro.config.mjs index 3d7957af..33348a55 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -15,6 +15,7 @@ export default defineConfig({ changefreq: "weekly", priority: 0.7, lastmod: new Date(), + filter: (page) => !page.includes("/blog"), }), inline(), ], diff --git a/website/src/components/Footer.astro b/website/src/components/Footer.astro index 1a5315a5..3ef3702e 100644 --- a/website/src/components/Footer.astro +++ b/website/src/components/Footer.astro @@ -10,6 +10,8 @@ const columns = [ { href: `${base}docs/`, label: "Field guide" }, { href: `${base}docs/installation/`, label: "Install" }, { href: `${base}docs/server/`, label: "Architecture" }, + { href: `${base}docs/hooks/`, label: "Hooks & Capture" }, + { href: `${base}docs/finops/`, label: "FinOps" }, ], }, { diff --git a/website/src/pages/docs/hooks.mdx b/website/src/pages/docs/hooks.mdx index 18485a03..fc181617 100644 --- a/website/src/pages/docs/hooks.mdx +++ b/website/src/pages/docs/hooks.mdx @@ -2,7 +2,7 @@ layout: ../../layouts/DocsPage.astro title: "Hook System" section: "Architecture" -description: "How the SessionEnd hook captures data from AI coding tools." +description: "How SessionEnd and PreCompact hooks capture session data from AI coding tools for harness intelligence." --- import Callout from '../../components/docs/Callout.astro'; diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index 4394204b..3a7b87a3 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -18,6 +18,7 @@ const chapters = [ plate: "screenshots/readme-quality-dark.png", caption: "Plate I. Quality clustered by harness pattern.", layout: "right", + docLink: { href: `${base}docs/server/`, label: "Read: Server & Intelligence Model" }, }, { num: "Chapter III", @@ -31,6 +32,7 @@ const chapters = [ plate: "screenshots/readme-finops-dark.png", caption: "Plate II. Spend grouped by harness pattern, not by model.", layout: "left", + docLink: { href: `${base}docs/finops/`, label: "Read: FinOps & Cost Management" }, }, { num: "Chapter IV", @@ -44,6 +46,7 @@ const chapters = [ plate: "screenshots/readme-growth-dark.png", caption: "Plate III. An effective pattern promoted into a standard.", layout: "right", + docLink: { href: `${base}docs/hooks/`, label: "Read: Hooks & Capture" }, }, ]; @@ -178,6 +181,9 @@ const structuredData = [ + {chapter.docLink && ( + {chapter.docLink.label} → + )}
@@ -454,6 +460,22 @@ const structuredData = [ color: var(--color-accent); } + .chapter-doc-link { + display: inline-block; + margin-top: 16px; + font-family: var(--font-body); + font-size: 13px; + color: var(--color-ink-muted); + text-decoration: none; + border-bottom: 1px solid var(--color-rule); + padding-bottom: 2px; + transition: color 0.2s, border-color 0.2s; + } + .chapter-doc-link:hover { + color: var(--color-accent); + border-color: var(--color-accent); + } + .chapter-plate { margin: 0; } .chapter-plate-frame { border: 1px solid var(--color-rule); From 82f418eefe6d27871b6c596ce820c793e307f84c Mon Sep 17 00:00:00 2001 From: "Charles C. Figueiredo" Date: Thu, 16 Apr 2026 07:48:36 -0400 Subject: [PATCH 2/3] feat(seo): add dateModified + author to TechArticle docs JSON-LD Co-Authored-By: Claude Opus 4.6 (1M context) --- website/src/layouts/DocsPage.astro | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/src/layouts/DocsPage.astro b/website/src/layouts/DocsPage.astro index 37fed7bd..90aa246f 100644 --- a/website/src/layouts/DocsPage.astro +++ b/website/src/layouts/DocsPage.astro @@ -48,6 +48,8 @@ const structuredData = [ headline: title, description, inLanguage: "en", + dateModified: new Date().toISOString().split("T")[0], + author: { "@type": "Organization", name: "Primer", url: siteOrigin }, isPartOf: { "@type": "WebSite", name: "Primer Documentation", url: `${siteOrigin}/docs/` }, mainEntityOfPage: { "@type": "WebPage", "@id": pageUrl }, publisher: { From a60d0a06eae8507b40c78d4878a1d4131bb02236 Mon Sep 17 00:00:00 2001 From: "Charles C. Figueiredo" Date: Thu, 16 Apr 2026 08:12:27 -0400 Subject: [PATCH 3/3] fix(seo): remove artificial dateModified from TechArticle JSON-LD Build-time dateModified claims every doc was modified on every deploy, which Google penalizes as artificial freshness inflation. Remove it until we can derive actual last-modified dates per file from git. Co-Authored-By: Claude Opus 4.6 (1M context) --- website/src/layouts/DocsPage.astro | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/website/src/layouts/DocsPage.astro b/website/src/layouts/DocsPage.astro index 90aa246f..0755b9a7 100644 --- a/website/src/layouts/DocsPage.astro +++ b/website/src/layouts/DocsPage.astro @@ -48,7 +48,9 @@ const structuredData = [ headline: title, description, inLanguage: "en", - dateModified: new Date().toISOString().split("T")[0], + // Omit dateModified — using build date would claim every page was modified + // on every deploy, which Google penalizes as artificial freshness inflation. + // TODO: derive from git last-commit date per file when Astro supports it. author: { "@type": "Organization", name: "Primer", url: siteOrigin }, isPartOf: { "@type": "WebSite", name: "Primer Documentation", url: `${siteOrigin}/docs/` }, mainEntityOfPage: { "@type": "WebPage", "@id": pageUrl },