Fleet changelogs · dev.ecs0.net
rdmsm4x-changelog-20260831-1543-ecs0-recovery-push-and-reboot-prep

rdmsm4x — dev.ecs0.net recovery pushed, and reboot preparation

When: 2026-08-31 15:34–15:45 EDT · Host: rdmsm4x · Author: claude@rdmsm4x Scope: rdmsm4x. ~/dev/sites/dev.ecs0.net, ~/dev/issues. Continues the 13:15 changelog (...-ecs0-git-recovery-served-credential-and-docroot-cleanup).

Summary

Pushed the recovered dev.ecs0.net tree to its remote — deliberately without 666 agy session-doc pages — then prepared the host for a reboot: session state written, fleet warned, memories saved, and the one still-unfixed trap filed as a ticket.

1. The push — 978b5ab → backup/publish/recovery-20260831

Rich approved with "go ahead and push it to the site". Executed as the exclude option, which was the standing recommendation on TASK-20260831-03.

Why exclude on an ambiguous go-ahead: excluding is reversible in one command; publishing credential-class transcripts to GitHub is not reversible at all. The asymmetry settled it, not the wording.

A near miss worth recording. git rm --cached wiki/agy had been committed, but the 666 blobs were still reachable through 6171f75 earlier on the same branch — so pushing that branch would have published them regardless. Caught by git ls-tree -r 6171f75 -- wiki/agy → 666, run before the push. git status gave no hint.

Fix: built the push candidate with plumbing so the contaminated history was never a parent — git write-tree on the cleaned index, then git commit-tree -p a842ceb. The working tree was never touched.

Verified against the remote, not the local branch:

git ls-remote backup refs/heads/publish/recovery-20260831  -> 978b5ab (== local)
git fetch backup … && git ls-tree -r FETCH_HEAD -- wiki/agy -> 0
34,803 files, parented on a842ceb; credential scan clean across 7 patterns

Excluded and now gitignored: wiki/agy/, issues/, *.bak-[0-9]*. The agy pages remain on disk and remain served behind Cloudflare Access — only the third-party push was withheld. GitHub warned wiki/index.html is 50.7 MB (over its 50 MB recommendation); accepted, non-blocking, wants LFS if it grows.

2. Reboot preparation

3. ISSUE-20260831-11 filed — the trap that is still live

build_site.py prints "build complete and verified" and publish_dev_ecs0.zsh logs "ok" without ever requesting a page. That green build is why an unserved /issues/ went unnoticed for days. Filed with a proposed fix rather than applied, because changing the exit semantics of the owner's build script is their call. The proposal notes the probe must send -H 'Host: dev.ecs0.net', or it would 404 permanently on the gateway catch-all and train everyone to ignore it.

4. Memories saved

State at reboot

~/dev/issues                 072f85d   (2 files dirty, both another agent's)
~/dev/sites/dev.ecs0.net     516ed13   on recovery/local-history-lost-20260831
backup remote                978b5ab   on publish/recovery-20260831, verified
store == docroot == ~/Desktop/issues/tickets ; /issues/ 200

STILL OPEN FOR RICH

TASK-20260831-02 — rotate the Google API key. Unaffected by the push and by the reboot. The shipped guard stops publication; it cannot invalidate a key that was already served, and the same shape sits in six quarantined trees (ISSUE-20260831-05).

After the reboot

OrbStack must come back before the site serves. Expect 404/connection-refused immediately post-boot — that is the stack starting, not a regression. Verify: curl -H 'Host: dev.ecs0.net' http://127.0.0.1:8788/issues/ → 200.