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
_redirectsgotcha 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: 2026050403 → 2026050501.
🔵 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¶
🔴 P0 — Stripe legal pages (paid product safety)¶
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=1first-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/*.tomlfiles 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:
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:
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¶
- Don't waste time on
static/_redirectsuntil 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. - Use Hugo
aliases:for any path-redirect need: - 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. - For wildcard / catch-all redirects (which Hugo aliases can't do), would need to revisit
_redirectsdebugging — possibilities to investigate: - Cloudflare Pages dashboard build-output-dir setting (might not be
public/) - Conflict with
functions/directory routing - A
_routes.jsonsomewhere that's overriding - 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¶
- 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.
mind-maps.jsis NOT orphan despite an older v2 existing.layouts/mind-maps/single.htmlloads BOTHmind-maps-v2.jsANDmind-maps.js. First audit was wrong. Always grep for the exact file path before deleting JS/CSS — don't assume "v2 exists ⇒ v1 dead".- Hugo aliases >
_redirectsfor path-level redirects on this site. Until the CF_redirectsmystery is solved, aliases are the proven path. section_nav.tomlis a side-effect when deleting Hugo sections. If you delete a content section that has an entry indata/section_nav.toml, the prev/next nav will create broken links. Always grep section_nav for the section being deleted._default/baseof.htmlbody-class conditional is a side-effect when deleting Hugo sections. Look forhasPrefix .RelPermalink "/old-section/"patterns and remove them.scripts/og-generator/generate_section_og.pyis 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.- Run
pwsh scripts/hugo-safe.ps1 --minifyafter each cleanup batch and cleanpublic/first. Hugo doesn't auto-clean stale output; old paths can linger and confuse verification.
Cross-references¶
- Production Incident Log — see "5 May — Cloudflare
_redirectsnot 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
hugodirectly - 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"