# Substrate Structure Audit — 2026-05-12

Generated for recalibration session prep. Goal: find orphans, broken links, duplicates, and structural drift before they accumulate.

## TL;DR

- **147 files** total (HTML + MD), distributed across 14 top-level dirs
- **Privacy boundary clean**: 0 links from `/bets/` → `/personal/`. 1 intentional outbound link (calendar → `/bets/` for bus-stop workflow)
- **1 real broken link found and fixed** (`/equipment-service/` → `/guides/`)
- **16 orphan candidates** identified — most are intentional (project-index files, time-stamped snapshots)
- **3 worth wiring up** (see Section A)
- **No duplicate content** beyond conventional `index.html` / `intake.md` / `README.md` patterns

## Section A — Orphan pages (no inbound links)

| File | Category | Recommended action |
|---|---|---|
| `handoff-blocks/aceves-home-fence-2026-04-2026-05-01.md` | Legacy handoff | Link from Aceves customer folder for discoverability |
| `personal/pirates-phillies-3d-print-2026-05/pirates-v3.2-readme.md` | Current operational | Link from print dashboard |
| `personal/sam-home/invisible-fence-2026-05.md` | Active to-do | Link from status tracker pending list |
| `index/active-chats.md` | Internal index | Acceptable — browseable via `/index/` |
| `index/equipment/lt180.md` | Project index | Acceptable — browseable |
| `index/personal-project/*.md` (7 files) | Project index | Acceptable — browseable |
| `personal/2026-04-recovery/broken-chat-extracts.md` | Historical | Acceptable — recovery archive |
| `personal/status-tracker/monday-progress-1pm.md` | Time-stamped snapshot | Acceptable — point-in-time doc |
| `personal/status-tracker/overnight-summary-2026-05-12.md` | One-time read | Acceptable — Sam reads once then archives |
| `personal/status-tracker/tonight-7pm-prep-2026-05-11.md` | Time-stamped | Acceptable — historical |

**Net: 3 orphans actually need linking. The rest are by design.**

## Section B — Broken links

| Source | Broken target | Fix applied |
|---|---|---|
| `index.html` (line 456) | `/equipment-service/` | Changed to `/guides/` ✓ |
| (none other found) | — | — |

**Note**: `/personal/metal-3dp-business-exploration-2026/landscape-overview` (no `.html`) initially flagged but is served correctly via substrate's 308 strip-extension redirect. Not actually broken.

## Section C — Duplicate / near-duplicate content

Filename collisions found:
- `index.html` (15 instances) — convention, one per folder. ✓ OK
- `intake.md` (14 instances) — convention. ✓ OK
- `README.md` (6 instances) — convention. ✓ OK
- `current.html` (3 instances) — calendar + status-tracker + ... ✓ OK
- `2026-05-12.html` (3 instances) — bet analyses, one per team for that date. ✓ OK
- `2026-05-11-v3.html` (3 instances) — snapshot files. ✓ OK

**No problematic duplicates.** All filename collisions are intentional convention.

## Section D — Privacy boundary check

| Check | Result | Notes |
|---|---|---|
| `/bets/` → `/personal/` links | **0** ✓ | Clean — bets pages never reference private substrate |
| `/bets/` → root `/` hub links | **0** ✓ | All `href="/"` removed during privacy separation (commits 7e4e16e, cb90410) |
| Personal hub Bets button | **removed** ✓ | Friends visiting `/bets/` see only bets content |
| `/personal/` → `/bets/` links | **1** ⚠️ | `personal/calendar/current.html` Tue 8:20 bus stop event links to `/bets/` (Sam's workflow — show to Jon). This is fine; friends never see personal calendar. |
| Cloudflare 301 `/personal/bets/*` → `/bets/*` | **active** ✓ | Old shared URLs auto-redirect |

**Verdict: privacy boundary is solid.** Friends sharing `/bets/` URLs cannot reach personal substrate.

## Section E — Top 5 Recommendations

### 1. Maintain the "one project per folder" pattern
Every active project lives in its own folder with `intake.md` + operational docs. Avoid spawning loose top-level files. Right now: clean. Don't drift.

### 2. Use `/index/` browse pages instead of bigger hub
The `/index/` folder is the right answer for "list all personal projects" — don't replicate that in `/index.html` cards. The hub should highlight ACTIVE work, not be a catalog.

### 3. Time-stamped status docs should auto-archive after their day
Files like `monday-progress-1pm.md`, `tonight-7pm-prep-2026-05-11.md`, `overnight-summary-2026-05-12.md` accumulate. Consider moving 7+ day old time-stamped docs to a `personal/status-tracker/archive/YYYY-MM/` folder periodically. Or: prefer in-place edits to `current.html` over creating new dated files for ephemeral updates.

### 4. Wire up the 3 real orphans
- Link `aceves-home-fence-2026-04-2026-05-01.md` from Aceves customer folder intake
- Link `pirates-v3.2-readme.md` from print dashboard
- Link `invisible-fence-2026-05.md` from status tracker pending list

### 5. Bets section discipline
The `/bets/` substrate has grown to 42 files in 4 weeks. Healthy growth, but:
- Per-game analysis pages will accumulate forever
- Consider archiving completed seasons to `/bets/teams/{team}/archive/{season}/` once a series ends
- Keep team root pages (e.g., `/bets/teams/pistons/`) as evergreen entry points

## Quick-win fixes applied this audit

1. ✅ Fixed `/equipment-service/` → `/guides/` in personal hub (was 200 but served wrong page via SPA fallback)
2. ✅ Visual sitemap created at `/personal/sitemap-visual.html`
3. ✅ This audit doc itself

## What's NOT done

- 3 orphan wire-ups deferred to next session (low-risk, but want Sam's sign-off on the link locations)
- Time-stamped doc archival: needs convention decision from Sam
- `/bets/` archival: not urgent, revisit at end of NBA playoffs

## Files referenced

- Visual sitemap: [/personal/sitemap-visual.html](/personal/sitemap-visual.html)
- This audit: [/personal/status-tracker/structure-audit-2026-05-12.md](/personal/status-tracker/structure-audit-2026-05-12.md)

<!-- INBOX BLOCK FOR CC PROCESSING -->
<!-- [INBOX]
- New items below this line:
-
-->
