Docs-site restructure — vault mirror (2026-10-14)
Docs-site restructure — vault mirror (2026-10-14)
Young: "rebuild just to have Docs and Pulse similar to Vault structure. Cleanup and remove the rest." Executed end-to-end; all routes verified live.
The new site = two sections, exact vault mirror
| Route | Source (LAB vault → GitHub → prod clone) | Files | Live |
|---|---|---|---|
/docs … /docs/solosv3/** | vault/Docs/SolOSV3/** (minus reference-tree) + migrated investing/properties | 195 | ✅ |
/pulse/** | vault/Pulse/{brief,research,podcast,product-spec,weekly-study} + landings | 284 | ✅ |
/now redirects to/pulse(the flight-desk redirect is retired).nuxt.config.ts.bak-…restructure+ old content archived atcontent.pre-restructure-20261014/+content.port-era-final/(rollback = swap dirs + restore bak config).- Follow-ups captured for their lanes (not executed): path-romanization for future polish (02-architecture → architecture), M365/domain pricing variables in Mira's model — no; that's Mira's domain. Nav labels in LAB vault landings (Docs/index.md, Pulse/index.md) drive the site nav; vault edits automatically propagate next rebuild.
Mechanics (registered for the fleet)
- Forge:
build_site.pyruns on LAB (near sources), converts vault md+mdx →/tmp/site_build/{Docs,Pulse}(479 files: Docs 195, Pulse 284 + 63 dir landings = 537 installed), resolves wikilinks/admonitions/MDX via the convert() from the old port, emitssite-map.json, tars, then installs at prod. - port.py is retired — neutralized at the top (SystemExit(0) guard;
port.py.bak-20261014-porterapreserved) becausesync-docus.shcalls it and it stomped my first install (log timestamped the stomp: it re-ported the then-live old-tree sources). Root cause of first-attempt rollback. - Migration note: investing/property mdx now canonical at
LAB vault/Docs/{investing,properties}/— pulled from the old prod tree, pushed through the LAB vault, committed with the vault sync chain (root landingsDocs/index.md,Pulse/index.mdincluded). - Skip rule:
05-archive/reference-tree(1,461 files, legacy) excluded; 66 non-ref archive .md files kept under SolOSV3. - nitro build ~30–35 min for 537 files on the Oracle ARM node — background-job discipline (tracked process, wait for completion, don't parallelise).
Post-state
- Old-era content dirs kept (not deleted):
content.pre-restructure-20261014/,content.port-era-final/— rollback-ready. - Scripts saved: LAB
/tmp/build_site.py, prod/tmp/site_build.tgz— persist to the template repo (next lane item: version the forge + onboarding script). - Future content flow: write in LAB vault →
build_site.py→ tar → prod install →sync-docus.sh(build only, port is retired) → verify routes → commit docs-site repo.
2026-10-21 — the delivery end was never built (Sol, card t_e27193cc)
The flow described above still ended at "tar → prod install". When the prod vault
was retired on 2026-10-18, the delivery end was removed and never replaced:
prod-vault-removal.md recorded the intended replacement ("LAB vault → git push
(solos-docs repo) → prod git pull → sync-docus.sh build → nginx") but only
the design was written. The prod crontab entry was commented out and no timer
was installed.
Consequence measured 2026-10-20: docs.youngle.au served content from
2026-10-18 13:31 while the vault had moved on — 2,316 files never reached
the site, including the Marketing/Social add-on pricing ruling and the EVE
customer-service design.
What was actually broken (both halves):
| Half | State found | Fix |
|---|---|---|
| LAB generator | /tmp/build_site.py read Docs/SolOSV3 — a path that no longer exists after the vault restructure — so it crashed. It was also in /tmp (not durable) and superseded by "forge v5" | forge v5 promoted to /home/lab/.solos/operation/ops/build_site.py (durable, committed) |
| LAB delivery | none — nothing committed the vault mirror to the solos-docs repo | docs-publish.sh: forge → rsync --delete → commit → push, every 10 min via solos-docs-publish.timer |
| PROD delivery | none — cron commented out, no timer, no git pull | docs-pull.sh + solos-docs-pull.{service,timer}: fetch → reset --hard origin/main → nuxi build → restart, every 10 min as a user unit |
Findings worth keeping:
- The
solos-docsrepo is public, so prod needs no GitHub credentials togit pull—git fetchworks as the plainubuntuuser. (An earlier read of the empty~/.git-credentialssuggested the git lane was impossible; the live probe showed otherwise. The git lane is the right choice and needs no new secrets.) git reset --hard origin/main, notgit pull. The Nuxt build mutates a tracked file (.data/content/contents.sqlitechanges on every build), so the prod working tree is never clean and a plain pull conflicts. A reset gives an exact mirror of what LAB published.- A commit failure must abort the publish. The first version of
docs-publish.shrangit commitwithout checking its exit status. With no git identity configured in the clone the commit silently did nothing and the script went on to log "pushed" — a false success. It now aborts on commit failure and verifies origin/mainactually moved to the new commit. Docs/Kanban/*.kanbanare excluded from the publish. The board projector rewrites them every minute (they change on every cycle), and Nuxt Content cannot parse them anyway (".kanbanfiles are not supported" at build time;/docs/kanban/docker-vhost404s). Publishing them would rebuild the site ~96×/day for content the site never renders.fleet-board.mdis a real.mddoc and is published.- The 2026-10-20 delivery attempt left a live regression: it deleted
content/Pulse/on prod (318 files) and rebuilt from it, so/pulse404'd while the site was otherwise up. Restored from HEAD and re-verified 200. - Proof of a working lane is a live URL, not a file on disk. A probe file
written into the vault was live at
/docs/projects/vhost/implementation/publish-lane-probe-2026-10-21with no human in the loop, and a different agent's new doc (resend-notification-provider-2026-10-20) was published and served 200 by the same unattended run.
Reconciliation check (which vault files have not reached the site):
/home/lab/.solos/operation/ops/reconcile_publish.py → 0 vault Docs files
unpublished.
Related: [prod-vault-removal](prod-vault-removal), [HANDOFF-nova-docs-nav](handoff-nova-docs-nav).
Docs-site nav v3 — state of play + Nova handoff (2026-10-16)
Young's screenshots (16 Oct): menu items unclickable / wrong section shown / mobile drawer empty / Pulse content "missing" (was refresh-cache; now live at 200).
Fleet SSH tunnels — canonical reference (2026-10-14, Tam)
Verified live 2026-10-14 (probes both ends + Min's cross-check + reboot-state review). Rule for every unit: reach agents through these loopback ports only. Tailscale is decommissioned — 100.x IPs are dead; never reference them.

