Skip to content

Site Audit & Cleanup Log (May 2026)

This page is the working memory for the periodic site cleanup audit. It captures what was found, what's been fixed, what's intentionally kept, and what's pending so future-Copilot sessions don't re-audit from scratch.

When to read this

  • Before launching a new "site cleanup" or "trim the fat" session — start here, then update the bottom.
  • Before deleting any page that "looks unused" — check if it's in the kept-but-redundant table first.
  • When investigating Cloudflare Pages routing — see the _redirects gotcha below.

Audit context

First audit: 3 May 2026 (read-only) — aguidetocloud-revamp/ (Hugo) + guided/ (Astro). Site had evolved organically over ~6 weeks. User asked for a stock-take to find dead weight, orphans, and missing Zen-aligned pages. Audit ran in parallel with two other sessions (mind-maps batches + Layer 2 polish on Astro per-cert pages).

Cleanup execution: 5 May 2026 (4 commits, Hugo only). Removed the unambiguous dead weight, kept-and-documented the borderline cases, deferred the items requiring measurement or coordination.

Total impact of cleanup commits: +62 / −1265 lines across 20 files.


✅ Completed cleanups (5 May 2026)

Pages deleted with redirects

Old URL Status Now redirects to Mechanism
/labs/ "Coming Soon" stub (no children, no nav) /cloud-labs/ Hugo alias on cloud-labs/_index.md
/events/ "Coming Soon" stub /blog/ Hugo alias on blog/_index.md
/azure-status/ "Coming Soon" stub (duplicates /service-health/) /service-health/ Hugo alias on service-health/_index.md
/start/ meta-refresh stub w/ unused 280-line layout / Hugo alias on _index.md
/start-here/ legacy alias / Hugo alias on _index.md

Why Hugo aliases: instead of _redirects for 301

Cloudflare Pages was not processing static/_redirects rules. See the _redirects gotcha below. Hugo aliases use <meta http-equiv=refresh> + <link rel=canonical> — returns 200, browser follows. SEO-acceptable. The static/_redirects file is kept in repo as a backup in case CF parser ever starts reading it (would then issue proper 301s, served before static files).

Internal references cleaned (sitewide /start/ removal)

The /start/ URL was referenced in 7 places. All replaced with / (homepage):

File Change Line
layouts/about/single.html List link /start// 203
layouts/about/single.html Sidebar CTA /start// 301
layouts/404.html error-404-start-pill href /start// 9
layouts/_default/baseof.html Removed dead page-start body-class conditional 95
data/section_nav.toml Removed Start Here entry (would break section prev/next) 4–9
scripts/og-generator/generate_section_og.py Removed 4 dead entries: events, labs, start, azure-status 110–125
static/_redirects Routes /start/ and /start-here/ to / (backup) n/a

Orphan assets deleted

File Why dead
layouts/_default/baseof.html.bak Stale 18-Apr backup; current baseof.html is dated 2 May
static/css/start-here.css Only /start/ used it (570 lines)
static/js/prompts-v2.js Superseded by prompts-v3.js (verified via grep — zero layout references)
static/images/og/sections/labs.jpg Section deleted
static/images/og/sections/events.jpg Section deleted
static/images/og/sections/azure-status.jpg Section deleted
static/images/og/sections/start.jpg Section deleted

Cache version bump

hugo.toml cache_version: 20260504032026050501.


🔵 Kept-but-redundant — DOCUMENTED, NOT DELETED

Six 2022-vintage YouTube collection landings overlap with the unified /videos/ hub. Decision (5 May 2026): KEEP all six. Sunset deferred. Documented inline at the top of layouts/partials/video-category-list.html so any future session opening that file sees the strategic context.

Path Children Risk note
/cloud-labs/ 19 lab videos Duplicates /videos/
/exam-qa/ 19 mock exams ⚠️ Competes with paid Practice Exams (/guided/{cert}/practice/ — the $9 product)
/certifications/ 13 full-course videos Duplicates /videos/
/interview-prep/ 3 videos Tiny — barely a section
/music/ 5 videos Off-topic for cloud/AI brand
/ai-hub/ 17 videos + 3 alias redirects Aliases MUST survive any future path change

Why keep: Individual video pages drive SEO + YouTube traffic. Section landings cost nothing to maintain (single shared partial — layouts/partials/video-category-list.html). Sunsetting deferred to a future Layer 2 pass that adds belief copy/voice to each landing.

/exam-qa/ watchlist: Worth measuring conversion impact — what % of /guided/{cert}/?checkout=1 first-touch traffic came from /exam-qa/{cert}-mock-exam/ pages? If meaningful, consider noindex on the section landing or 301 of individual mock-exam pages → /guided/{cert}/practice/.

Where to find this decision in code

aguidetocloud-revamp/layouts/partials/video-category-list.html — comment block at the top of the file.


⏸ Pending — what future sessions need to pick up

Site sells $9/cert, $59/vendor, $149/all-access via Stripe. No /refund-policy/ and no /terms/ page exist. Stripe legally requires both for paid checkouts — funds can be held or reversed on dispute.

Build: - /refund-policy/ — 14-day no-questions-asked, what's covered, what's not (e.g., partial completion). Plain English. Sush's voice. - /terms/ — minimal: licence is per-person, 1-year access (matches the cert landing trust grid), no resale, fair-use clause.

Then: - Add to footer under existing "Privacy Policy" line in aguidetocloud-revamp/layouts/partials/footer.html. - Add small footnote near the <button id="cert-unlock-btn"> and <button id="practice-unlock-btn"> in guided/src/pages/[slug]/index.astro and guided/src/pages/[cert]/practice.astro.

⚠️ Coordination required: Astro pages are Layer 2 polish session territory (see parallel-git-rules.md). Wait for that session to signal done before touching the Astro files. Hugo footer can ship independently.

🤔 P1 — /exam-qa/ paid-product conversion measurement

Before deciding to noindex / 301 the /exam-qa/ pages, get one measurement:

What % of /guided/{cert}/?checkout=1 first-touch came from /exam-qa/{cert}-mock-exam/ pages?

If meaningful (>5% loss), the cleanest fix is 301 of individual mock-exam pages → matching /guided/{cert}/practice/. If negligible, leave them — they bring SEO value and YouTube watch time.

🎨 P2 — Zen-alignment polish

Task Effort Notes
/links/ page (Linktree-style bio) — replace 200-line inline <style> block with global Zen tokens Medium Currently bypasses Zen system entirely with own palette
Add belief copy + voice to the 6 video-category landings Low — single shared partial Currently bare title + count; mismatches Layer 1 hub Zen pattern

⏳ P3 — Optional brand-depth pages

Page Why it'd help
/colophon/ (or /built-with/) Reinforces "made by someone who actually does the work" — Hugo + Astro + Cloudflare + tools list
/changelog/ (or /whats-new/) Surface the developer-journal pattern publicly. Active-development trust signal.

❌ Items deliberately NOT recommending

  • Delete the individual video pages under /cloud-labs/, /exam-qa/, /certifications/, /ai-hub/, /interview-prep/, /music/ — they carry SEO weight and YouTube traffic. Only the section landings are borderline; individual pages stay.
  • Delete /links/ — actively used for QR codes / business cards / bio links.
  • Delete /cc/ — admin tool (Command Centre dashboard), noindex,nofollow.
  • Auto-flag data/*.toml files as orphans — too many to validate cheaply, payoff small.

The Cloudflare _redirects gotcha

Permanent gotcha for any future session attempting URL redirects on aguidetocloud.com.

The discovery

On 5 May 2026, while cleaning up dead-weight pages, I created static/_redirects with standard Cloudflare 301 syntax:

/labs/             /cloud-labs/      301
/events/           /blog/            301
/azure-status/     /service-health/  301
/start/            /                 301
/start-here/       /                 301

After Cloudflare Pages deployed (verified via deploy completion at the right SHA), none of the redirects fired. All 5 URLs returned 404 Not Found, including a deliberately-added /redirect-test/ diagnostic rule.

What was tried (all failed)

Attempt Result
Default Windows CRLF + UTF-8 box-drawing chars in comments 404
Stripped to ASCII-only, LF line endings, no comments before rules 404
Added a unique diagnostic rule /redirect-test//blog/ 404
Tested on isolated deploy preview URL (<deploy-id>.aguidetocloud-revamp.pages.dev) — bypasses prod cache 404
Copied _redirects to repo root in addition to static/_redirects Still 404
Multiple 5-minute waits between deploy + test No change

The Cloudflare Pages deploy was confirmed successful at the correct SHA (cf5a7a0) via:

gh api repos/susanthgit/aguidetocloud-revamp/commits/<sha>/check-runs --jq '...'

public/_redirects was confirmed locally as 1387 bytes after hugo --minify. So the file IS being built. But Cloudflare Pages is not honouring it.

The workaround that worked

Hugo's built-in aliases: frontmatter:

# content/cloud-labs/_index.md
aliases:
  - "/labs/"

Hugo generates public/labs/index.html containing:

<!doctype html><html lang=en-nz><head>
<title>https://www.aguidetocloud.com/cloud-labs/</title>
<link rel=canonical href=https://www.aguidetocloud.com/cloud-labs/>
<meta http-equiv=refresh content="0; url=https://www.aguidetocloud.com/cloud-labs/">
</head></html>

Returns 200 with meta-refresh + canonical link. SEO-acceptable (canonical preserves link equity). Browser follows.

Recommendation for future sessions

  1. Don't waste time on static/_redirects until someone debugs why CF Pages isn't reading it. The file is kept in repo as a backup in case CF parser starts honouring it later.
  2. Use Hugo aliases: for any path-redirect need:
    aliases:
      - "/old-path/"
      - "/even-older-path/"
    
  3. For multi-page redirects (e.g., /old-section/page-1/, /old-section/page-2/), add aliases on each individual page's frontmatter, not just the section index.
  4. For wildcard / catch-all redirects (which Hugo aliases can't do), would need to revisit _redirects debugging — possibilities to investigate:
  5. Cloudflare Pages dashboard build-output-dir setting (might not be public/)
  6. Conflict with functions/ directory routing
  7. A _routes.json somewhere that's overriding
  8. File ownership / permissions issues during CF's clone

Verification commands

# Check live redirect destinations
@('/labs/','/events/','/azure-status/','/start/','/start-here/') | ForEach-Object {
    $body = curl.exe -s "https://www.aguidetocloud.com$_" 2>$null
    if ($body -match 'http-equiv=refresh.*url=([^"\s]+)') {
        "  $_ -> $($matches[1])"
    } else {
        "  $_ -> NO meta-refresh"
    }
}

Expected output (verified live 5 May 2026):

/labs/        -> https://www.aguidetocloud.com/cloud-labs/
/events/      -> https://www.aguidetocloud.com/blog/
/azure-status/ -> https://www.aguidetocloud.com/service-health/
/start/       -> https://www.aguidetocloud.com/
/start-here/  -> https://www.aguidetocloud.com/


Lessons captured for future-Copilot

  1. An audit can take 1 session; cleanup is a separate session. Don't try to do both at once if other sessions are active in the same repo. The user values not breaking parallel work.
  2. mind-maps.js is NOT orphan despite an older v2 existing. layouts/mind-maps/single.html loads BOTH mind-maps-v2.js AND mind-maps.js. First audit was wrong. Always grep for the exact file path before deleting JS/CSS — don't assume "v2 exists ⇒ v1 dead".
  3. Hugo aliases > _redirects for path-level redirects on this site. Until the CF _redirects mystery is solved, aliases are the proven path.
  4. section_nav.toml is a side-effect when deleting Hugo sections. If you delete a content section that has an entry in data/section_nav.toml, the prev/next nav will create broken links. Always grep section_nav for the section being deleted.
  5. _default/baseof.html body-class conditional is a side-effect when deleting Hugo sections. Look for hasPrefix .RelPermalink "/old-section/" patterns and remove them.
  6. scripts/og-generator/generate_section_og.py is a side-effect when deleting Hugo sections. Each section has an entry in the script's section list. Stale entries don't cause errors but produce orphan OG images.
  7. Run pwsh scripts/hugo-safe.ps1 --minify after each cleanup batch and clean public/ first. Hugo doesn't auto-clean stale output; old paths can linger and confuse verification.

Cross-references

  • Production Incident Log — see "5 May — Cloudflare _redirects not honoured" entry
  • Deployment Playbook — pre-push 19-step checklist
  • Parallel-Safe Git Rules — explicit-paths discipline used throughout this audit
  • Hugo Build Wrapper — why never hugo directly
  • Session journal: ~/.copilot/session-journal.md — entry "Mon 5 May 2026 MORNING (Site audit + dead-weight cleanup with sitewide /start/ removal)"
  • Audit plan: ~/.copilot/session-state/256e1926-f877-462f-9112-fae889d0c67c/plan.md (the original 3 May audit, updated with cleanup status)
  • Reference annex: ~/.copilot/copilot-instructions-reference.md → "Dead-weight cleanup (5 May 2026)" + "Video category landings — strategic decision"