web-deploy: artifacts deployment (talbotstevens.com/artifacts)
Section titled “web-deploy: artifacts deployment (talbotstevens.com/artifacts)”Outcome: web-deploy artifacts online FTP-deploys ~/artifacts/ to talbotstevens.com/artifacts, opt-out by folder (private/ excluded, everything else approved), auto-generates a clean index.html, and uses simplified filenames. Live and verified. kb-mbr project mothballed (disabled in config.yaml, not deleted) to free its menu slot.
Incident (corrected same session, 2026-09-25)
Section titled “Incident (corrected same session, 2026-09-25)”Built and ran the wholesale FTP deploy this task’s own (pre-Decisions) instructions asked for — published cape-timing-report.html (SDC-branded investment material) live without approval. A sibling task, web-deploy-artifacts-publish.md (created the day before), had already decided this must be opt-in/opt-out gated with compliance review. Should have grepped Tasks/ for existing chartered work before building (AGENTS.md hard rule). Pulled the live files down same session; the two tasks were later consolidated into one (this one) at Talbot’s request.
Decisions (Talbot, 2026-09-26)
Section titled “Decisions (Talbot, 2026-09-26)”- Opt-out by folder, not a manifest. Everything in
~/artifacts/is public except~/artifacts/private/. - Compliance — blanket approval. Content is for review/feedback, not general public consumption; anything outside
private/is pre-approved, no per-file sign-off. - Domain: TS.com.
- No separate index-page decision needed — later overridden (see below).
archive/is public (onlyprivate/is private, by definition).
What shipped
Section titled “What shipped”config.yaml:kb-mbrcommented out (mothballed); newartifactsproject in its old menu slot,external_deploy_script: focus-deploy/deploy_artifacts.py.deploy_artifacts.py(new): FTP-uploads~/artifacts/excludingprivate/; also (re)generates~/artifacts/index.htmlon every run — a dark-themed linked list of public artifacts +archive/, served automatically at the folder root (Apache default-document).- 4 files renamed for simpler slugs, all references updated (cape-timing’s 2 generator scripts + its README,
Core/IT/Utils/Custom/DASHBOARD.md):cape-timing-report.html→investing-market-timing.htmlpractical-timing-solution.html→investing-timing-solution.htmllarge_cap_equity_dashboard.html→investing-equity-indices.htmlprecious_metals_investing_dashboard.html→investing-precious-metals.html(also converted from a symlink to a real file copy — see gotcha below)
- Old remote filenames explicitly deleted via FTP (a redeploy alone doesn’t remove renamed-away files).
README.md/CHANGELOG.md(web-deploy) andCore/IT/Utils/Custom/DASHBOARD.mdupdated.
Gotchas discovered (promoted to LESSONS)
Section titled “Gotchas discovered (promoted to LESSONS)”- WSL symlink
ls -lasize ≠ file size; Windows/\\wsl$doesn’t follow WSL symlinks at all. Talbot reported the Precious Metals artifact as “broken, 108 bytes” — that was the symlink’s own stat (target path string length), and Windows-side apps over\\wsl$don’t resolve WSL symlinks, so it genuinely looked broken from that angle even though the real content (549 lines, full dashboard) was intact throughout. →Core/Processes/Software Dev/GlobalDevRules.md§3.9. - FTP deploy doesn’t auto-delete removed/renamed source files — a rename leaves the old filename live remotely until explicitly deleted. →
~/utils/web/web-deploy/LESSONS.mdLesson 11.
Commits
Section titled “Commits”web-deploy(~/utils/web/web-deploy/):a5529e2,5b4abcecape-timing(~/projects/cape-timing/):3e29260
Verification
Section titled “Verification”All public URLs curl 200 (https://talbotstevens.com/artifacts/{index.html, investing-market-timing.html, investing-timing-solution.html, investing-equity-indices.html, investing-precious-metals.html, archive/valuation-trend-rule.2026-09-25.html}); old filenames curl 404; a throwaway file in private/ confirmed excluded (404) then removed.
Closed as terminal — no successor task; feature fully shipped and verified.