Skip to content

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.

  1. Opt-out by folder, not a manifest. Everything in ~/artifacts/ is public except ~/artifacts/private/.
  2. Compliance — blanket approval. Content is for review/feedback, not general public consumption; anything outside private/ is pre-approved, no per-file sign-off.
  3. Domain: TS.com.
  4. No separate index-page decision needed — later overridden (see below).
  5. archive/ is public (only private/ is private, by definition).
  • config.yaml: kb-mbr commented out (mothballed); new artifacts project in its old menu slot, external_deploy_script: focus-deploy/deploy_artifacts.py.
  • deploy_artifacts.py (new): FTP-uploads ~/artifacts/ excluding private/; also (re)generates ~/artifacts/index.html on 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.html
    • practical-timing-solution.html → investing-timing-solution.html
    • large_cap_equity_dashboard.html → investing-equity-indices.html
    • precious_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) and Core/IT/Utils/Custom/DASHBOARD.md updated.
  • WSL symlink ls -la size ≠ 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.md Lesson 11.
  • web-deploy (~/utils/web/web-deploy/): a5529e2, 5b4abce
  • cape-timing (~/projects/cape-timing/): 3e29260

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.