SEO Sweep Phase 2 — Starter Prompt + Reference¶
Phase 2 SHIPPED: Mon 11 May 2026 (~11:00 NZST). All Tier 1 + Tier 2 surfaces complete. Result: 845 failing → 50 failing (94% reduction). 564 critical → 7 critical. 232 → 1,027 compliant.
✅ Phase 2 results (final)¶
| Surface | Pages | Before | After | Commit |
|---|---|---|---|---|
| mind-maps | 67 | 58 failing | 2 | d91d7df0 |
| YouTube videos (ai-hub + exam-qa + cloud-labs + certifications) | 71 | 67 failing | 6 | af5122b2 |
| ai-mapper | 27 | 28 failing | 1 | 0ab4a10d |
tool _index.md (57 surfaces) |
57 | 50 failing | 4 | 0e39fe95 |
| cert-compass | 41 | 36 failing | 1 | bfc9121a |
| prompts (cards) | 500 | 500 failing | 5 | 54ddcec3 |
| Remaining (prompt-guide, licensing, m365-roadmap, interview-prep) | ~88 | 51 failing | ~10 | 22d21213 |
| TOTAL | ~850 | ~795 | ~30 | 7 commits |
~818 page rewrites shipped. Per-surface SLA smoke 3/3 green throughout.
Tools built (all in scripts/)¶
| Script | Surface |
|---|---|
rewrite-mind-map-metas.ps1 |
mind-maps/ |
rewrite-youtube-metas.ps1 |
ai-hub + exam-qa + cloud-labs + certifications + interview-prep |
rewrite-ai-mapper-metas.ps1 |
ai-mapper/ |
rewrite-tool-index-metas.ps1 |
All single-page tool surfaces (auto-detected) |
rewrite-cert-compass-metas.ps1 |
cert-compass/ |
rewrite-prompt-metas.ps1 |
prompts/ |
rewrite-remaining-metas.ps1 |
prompt-guide, licensing, m365-roadmap, prompts category indexes |
seo-surface-breakdown.ps1 |
Progress helper — per-surface failing count |
All scripts share the same LF/CRLF safe FM rewrite pattern from rewrite-cert-metas.ps1. Each produces a review file (<SURFACE>-META-REVIEW.md) committed for posterity.
Tier 3 (deferred — not in scope)¶
ai-news/(13 failing) — news has short shelf-lifemusic/(6 failing) — niche- A handful of utility-tool single-page surfaces (color-palette, password-generator — no natural Microsoft brand) — accept as flagged, hand-touch via cc dashboard if needed
What changed (verbatim, for posterity)¶
TL;DR for next session¶
Paste this into a fresh Copilot CLI session:
Please continue the SEO meta sweep we started yesterday/today. Read
learning-docs/docs/reference/seo-sweep-phase2-prompt.mdfirst (this file) — it has the audit findings, the L4/L2 tools you'll use, and the exact surfaces to fix in priority order. We're doing a FULL SWEEP — all Tier 1 + Tier 2 surfaces (~200 pages). Don't ask me to choose options — execute. Save the rest for niche/low-value surfaces (Tier 3). Apply the same parallel-safe rules and SLA protocols I've been using. Update the session journal at the end.
What Phase 1 already accomplished (don't re-do)¶
| Surface | Commits | What changed |
|---|---|---|
Hugo cert-tracker/* (151 pages) |
de43de11, 67c84544, b190172a |
125 cert page metas rewritten + 1 broken AB- pattern fix + LF/CRLF fix |
Astro guided/[slug]/index.astro |
32d61f4 |
Template change: short title + capped 155-char desc |
Astro guided/[cert]/practice.astro |
32d61f4 |
Same fix for practice quiz pages |
| Astro displayCode helper | f226246 |
Strip vendor prefix from slug-style codes (AWS/GCP) |
| Hugo cc dashboard L1 | fa5b0ec4 |
📋 prompt buttons in SEO tab + L2 quality scoring + L4 batch rewriter |
End state of Phase 1: 232 of 1,077 pages compliant. 845 still need work.
The audit findings (verbatim from Phase 1 closing scan)¶
By content surface (failure rates):
| Surface | Pages | Failing | % | Critical | Notes |
|---|---|---|---|---|---|
ai-hub/ |
19 | 18 | 95% | 14 | YouTube video pages — same template disease |
exam-qa/ |
21 | 18 | 86% | 9 | YouTube video pages — same template disease |
cloud-labs/ |
20 | 16 | 80% | 5 | YouTube video pages — same template disease |
mind-maps/ |
67 | 47 | 70% | 7 | Titles fine, descriptions too long (170-210 chars) |
cert-compass/ |
41 | 35 | 85% | 4 | Cert comparison pages — investigate pattern |
licensing/ |
51 | 18 | 35% | 3 | Licensing docs — mix of issues |
certifications/ |
15 | 12 | 80% | 2 | Cert cluster pages (NOT single certs — those done) |
ai-news/ |
14 | 13 | 93% | 0 | News entries (Tier 3 — lower priority) |
Tool _index.md (~11) |
11 | 11 | 100% | 0-1 | One-pagers per tool, hand-craft each |
interview-prep/ |
4 | 4 | 100% | 2 | Small, easy |
music/ |
6 | 5 | 83% | 0 | Tier 3 |
Phase 2 execution plan — Tier 1 + Tier 2 (~200 pages)¶
Tier 1 — biggest ROI¶
A) YouTube video pages (54 pages) — ai-hub/ + exam-qa/ + cloud-labs/
The pattern (ALL have this):
title: "Watch [80-char YouTube video title] | Master AI Writing & Editing with Microsoft 365"
description: "Watch [same title] - free hands-on tutorial by Susanth Sutheesh on A Guide to Cloud & AI."
Two failure modes: 1. Titles are 84-98 chars (way over 60 char Google limit) 2. Descriptions are identical boilerplate across pages → Google sees duplicate content
Investigation needed first:
- Are these driven by a Hugo template that pulls from data/videos.json / data/videos-full.json?
- Or hand-written .md files per video?
- Check: Get-ChildItem content\ai-hub -Filter "*.md" | Select-Object -First 1 → see if frontmatter has unique data or templated
- Check: layouts/ai-hub/, layouts/exam-qa/, layouts/cloud-labs/ for Hugo template logic
- Check: data/videos.json for video metadata
Likely fix:
- If template-driven: change the layout to use a seo_title / seo_description field if present, else generate a smarter default (truncate title to ~55 chars, derive unique description from video tags/category)
- If hand-written: extend L4 with a youtube-video template that detects "Watch ... - free hands-on tutorial by Susanth Sutheesh" pattern and replaces
Expected lift: 54 pages × ~30 imps/month = significant CTR opportunity, plus removes duplicate-content penalty
B) Mind maps (47 failing of 67)
Simpler — just descriptions over 155 chars. Titles already good.
Template approach:
Or trim existing description at word boundary to ≤155 chars + add "Free mind map." suffix.
Sample current state:
- File: mind-maps/agent-365.md
- Current desc (210 chars): "Visual map of Microsoft Agent 365 — three control planes (Entra Agent ID, Purview for Agents, Defender for Agents) plus the M365 Admin Center, the four things every agent needs, and..."
- Target desc (≤155 chars): "Visual map of Microsoft Agent 365 — Entra Agent ID, Purview, and Defender for Agents. Free interactive mind map for the four control planes."
Extend scripts/rewrite-cert-metas.ps1 with a New-Meta-MindMap function or write a separate scripts/rewrite-mind-map-metas.ps1.
Tier 2 — solid wins¶
C) Cert Compass (35 failing of 41) — investigate pattern, probably similar to cert-tracker but with different field structure
D) Certifications hub pages (12 failing of 15) — these are CLUSTER pages (e.g., /certifications/azure/) NOT single certs. Different template needed.
E) Licensing docs (18 failing of 51) — high-value reference content. Hand-craft or template per type.
F) Tool _index.md pages (~11) — hand-craft each via the cc dashboard 📋 button workflow:
- ai-showdown/_index.md
- copilot-frontier-map/_index.md
- copilot-model-map/_index.md
- typing-test/_index.md
- phishing-test/_index.md
- prompt-tester/_index.md
- feature-roulette/_index.md
- ps-builder/_index.md
- incident-comms/_index.md
- admin-comms/_index.md
- cli-quiz/_index.md
These are public-facing tool landing pages — worth hand-crafting for voice.
Tier 3 — defer unless time permits¶
ai-news/(13 failing) — news has short shelf lifeinterview-prep/(4) — smallmusic/(5) — niche- Misc 1-file surfaces
The tools you'll use¶
All already built and live on main:
| Tool | File | What it does |
|---|---|---|
| L1: cc dashboard prompts | static/js/command-centre.js |
Live at /cc/ → press S → click 📋 prompt buttons. Use these for hand-craft work. |
| L2: SEO quality scorer | scripts/check-seo-quality.ps1 |
Run with -Scope all for full audit, -Scope cert-tracker etc. for specific. Warn-only in CI. |
| L4: Batch rewriter | scripts/rewrite-cert-metas.ps1 |
Already handles 13 cert vendors. Extend this with new surface templates (or write a sibling script). |
Quality rules (must satisfy ≥80 score for auto-rewrite, else flag for human):
- Title 35-60 chars
- Description 120-155 chars
- Brand word in title (Microsoft/Azure/AWS/GCP/etc.) — see BrandWords array in scripts
- Hook word in title (Free/New/Replaces/Complete/Beginner/Updated/2026)
- Code/key term in description first 80 chars
- CTA word in description (Free/Practice/Guide/Tips)
- Page has OG image
- No hype words (ultimate, comprehensive, robust, frontier, agentic, etc. — see HypeWords array)
Critical safety rules (DO NOT SKIP)¶
🚨 Practice Exam SLA¶
Don't touch any file in this list without SLA protocol:
- PracticeQuiz.tsx
- src/pages/[cert]/practice.astro
- src/pages/[slug]/index.astro
- src/pages/embed/[cert]/practice.astro
- src/data/questions/*.json
- scripts/build-question-data.mjs
- package.json build scripts
- Astro config / build config
- Cloudflare Pages env vars / bindings
Phase 2 work shouldn't need to touch these (already done in Phase 1). If you find yourself needing to, follow the protocol in learning-docs/docs/reference/incident-log.md.
Mandatory SLA smoke test at session end:
$r1 = Invoke-WebRequest -Uri "https://www.aguidetocloud.com/guided/data/questions/az-900.json" -UseBasicParsing
$body = '{"productType":"cert","certCode":"az-900","vendorSlug":"microsoft"}'
$r2 = Invoke-WebRequest -Uri "https://www.aguidetocloud.com/guided/api/checkout" -Method POST -Body $body -ContentType "application/json" -UseBasicParsing
$r3 = Invoke-WebRequest -Uri "https://www.aguidetocloud.com/guided/az-900/practice/" -UseBasicParsing
# All must return 200
🔒 Parallel-safe git¶
A different session is doing Tools work simultaneously. Their work touches data/toolkit_nav.toml, static/css/*.css, layouts/<tool>/list.html. You must:
- Never
git add -A/git add ./git commit -a - Always explicit paths:
git add scripts/foo.ps1 content/mind-maps/*.md - Read
git status -sbefore staging — if you seeM(uppercase M with leading space) on files you didn't modify, those are theirs — leave them git pull --rebasebefore every push- One logical change per commit (don't bundle mind-maps + cert-compass into one commit)
🔴 LF/CRLF bug (already fixed in scripts/rewrite-cert-metas.ps1 but be aware)¶
Some content files have LF line endings (Linux contributors). The L4 script's prefix detection now handles this dynamically. If you write a new sibling script (e.g., for mind-maps), copy the same pattern:
$prefixEnd = 3
if ($c.Length -gt 4 -and $c[3] -eq [char]"`r" -and $c[4] -eq [char]"`n") { $prefixEnd = 5 }
elseif ($c.Length -gt 3 -and $c[3] -eq [char]"`n") { $prefixEnd = 4 }
$end = $c.IndexOf("`n---", $prefixEnd)
$fm = $c.Substring($prefixEnd, $end - $prefixEnd)
# When writing back, always emit `---\r\n` and TrimStart `\r`/`\n` from $newFM:
$newContent = "---`r`n" + $newFM.TrimStart("`r","`n") + $body
After every batch run, integrity-check:
Get-ChildItem <path> -Filter '*.md' | ForEach-Object {
$bytes = [System.IO.File]::ReadAllBytes($_.FullName)
if ($bytes.Length -ge 4 -and $bytes[3] -eq 0x74) { Write-Host "BROKEN: $($_.Name)" }
}
Suggested phase 2 workflow¶
- Read this doc + session journal (
~/.copilot/session-journal.mdtop entries) - Run
pwsh scripts\check-seo-quality.ps1 -Scope allto confirm baseline - Phase 2A — YouTube video pages
- Investigate template vs hand-written (~5 min)
- Build appropriate fix (template change OR L4 extension)
- Dry-run → review → write → smoke-test → commit per-surface
- Phase 2B — Mind maps
- Extend L4 OR write
rewrite-mind-map-metas.ps1 - Dry-run → review → write → commit
- Phase 2C — Cert Compass + Certifications + Licensing
- Investigate each pattern
- Extend L4 templates
- Dry-run → review → write → commit per-surface
- Phase 2D — Tool
_index.mdpages (hand-craft via cc dashboard📋buttons) - Open
/cc/→ SEO tab → click📋 promptfor each - Or: just write them directly knowing the voice/format
- Final audit —
pwsh scripts\check-seo-quality.ps1 -Scope all— confirm progress - SLA smoke test — 3 curls
- Update session journal — what was done, decisions, pick-up-here
- Update this doc — mark Tier 1/2 surfaces as done, list remaining
Sush's voice & style cues for hand-craft (from voice-and-tone.md)¶
- Plain English — "for people like us"
- Honest — no hype, no fluff, no "ultimate" / "comprehensive" / "robust"
- Concrete numbers — "27 modules" > "many modules"
- Brand-allergy — don't lead with self-stats; use real value props
- Hook first — what makes a searcher actually click?
Title formula that works (from cert-tracker sweep):
[CODE or KEY]: [Specific Topic] — Free [Resource Type]
Examples:
- AI-200 Microsoft Exam (Replaces AZ-204) — Free Study Guide ✓
- AZ-900: Microsoft Azure Fundamentals — Free Study Guide ✓
Description formula:
[CODE]: the [Brand] [Topic] [level] exam. Free [resource] covering [3 specific topics], with [credibility signals].
Files to read first when picking up¶
- This file (you're reading it)
~/.copilot/session-journal.md— pinned WIP branches + recent sessionslearning-docs/docs/reference/voice-and-tone.md— Sush's voice ruleslearning-docs/docs/reference/deployment-playbook.md— 20-step pre-push checklistlearning-docs/docs/reference/parallel-git-rules.md— parallel-safe git protocol~/.copilot/copilot-instructions.md§ Practice Exam SLA — non-negotiable rulescripts/rewrite-cert-metas.ps1— the L4 tool, your main weapon
Files you'll likely edit¶
Confirmed/likely:
- scripts/rewrite-cert-metas.ps1 — extend with new surface templates
- scripts/check-seo-quality.ps1 — maybe extend brand/hook words for non-cert content
- Maybe new: scripts/rewrite-mind-map-metas.ps1 if too different to share L4
- Hugo template files in layouts/ai-hub/, layouts/exam-qa/, layouts/cloud-labs/ if video pages are template-driven
- ~100-200 .md files across the surfaces above
- content/<tool>/_index.md files (hand-craft)
- MICROSOFT-CERT-META-REVIEW.md etc. — review files for posterity
Files you must NOT touch (other session is using them)¶
data/toolkit_nav.tomlstatic/css/<tool>.css(per-tool CSS)layouts/<tool>/list.html(most tool layouts)- Anything in
brainbar/qa/orqa/qa-review/
Always read git status -s first.
Done criteria for Phase 2¶
- L2 audit on
-Scope all: <100 pages below threshold (down from 845) - 0 critical (<50 score)
- 0 broken frontmatter
- Hugo build clean (
pwsh scripts\hugo-safe.ps1) - SLA smoke test 3/3 green
- Session journal updated with summary + pick-up-here
- This file updated marking Tier 1/2 as complete
- One commit per logical surface (parallel-safe)
If you get stuck¶
- The L4 script's existing patterns (Microsoft, AWS, GCP, etc.) are the gold standard. Copy-modify for new surfaces.
- If a new surface has unusual fields (no
exam_code, etc.), use whatever unique key is available (slug, file name). - If a page can't be auto-rewritten to score ≥80, FLAG IT for human attention — don't ship a degradation.
- The
📋 promptbuttons on/cc/SEO tab generate Copilot CLI prompts for individual page hand-craft.