chore(deploy): the running image builds from an UNTRACKED chamber directory #6
Labels
No labels
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
status/deferred
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/purser#6
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The gap
/srv/docker/purser/docker-compose.ymlThe production container is built from a chamber working directory that is:
/srv(claude/*/*)/srv/claude/is absent fromsource_directoriesby an explicit and correct decision — chamber trees hold liveFORGEJO_TOKENs)Until 2026-08-05 that directory held the ONLY copy of the source.
de3188eseeded this repo from it, so the code is now durable — but the deployed artifact still comes from the untracked path.Why it still matters after the seed
They can now diverge silently. A change made in the chamber directory ships to production without ever appearing here, and nothing reports the drift.
Scope
docker-compose.ymlbuilds from a clone of this repo, not from/srv/claude/**/srv/docker/purser/src; chosen 2026-08-05): checkout under/srv/docker/purser/src, or a built image from CIVerify the rebuilt image is functionally identical before switching— RESTATED: "identical" was the wrong target. The old image carried the operator's import bug, so identity would have meant the fix did not land. What was verified instead, and is the right check: BEHAVIOUR at the seam —GET /d/{token}went303 → login (2353 B)→404 "No such download." (18 B), with two controls (/purser/still303, so session protection was not blanket-removed;/1.0/healthstill200, so step-ca was not shadowed)./srv/CLAUDE.mdrecords that no service may build from/srv/claude/**") was FALSE when this tracker was closed (grep→ 0 matches in 2027 lines). Restated as an action-AC per § Acceptance-criteria tick discipline.Anchor
Surfaced 2026-08-05 while looking for somewhere safe to implement the download fix. The backup config anticipated exactly this case at the line excluding
/srv/claude: "The right home for chamber work is a branch, not this archive. If a chamber tree stops being transient, the remedy is push-at-seams discipline." Purser stopped being transient when it started issuing credentials.✅ CLOSED — fixed by
alcatraz-infra#455, mergedc12be22619:42:49, deployed and verified 19:43:16.Cross-repo: the fix lives in
alcatraz-infra, so this closes by hand. ACloses #6in that PR would have fired againstalcatraz-infra#6— a different, unrelated issue that merely shares the number.🔑 The hazard this closes is REPRODUCIBILITY, not tidiness
⛔ The old context was gitignored AND not a repo AND carried uncommitted deltas. A
git clean -fdxin/srvwould have deleted the only copy of the deployed source —purserkeeps serving and becomes unrebuildable. ✅ The new context is also gitignored, and that is CORRECT: a clone of a pushed ref is reconstructible in four seconds.📌 The axis is REPRODUCIBLE vs NOT, not ignored vs tracked. ⚠️ The ignore-rule framing would have taught the next reader to un-ignore build directories — the opposite of the fix.
⚠️ What this does NOT close
src/is gitignored, so the deployed artifact is still determined by when someone last ran the update command — not by anything this repo records. 📌 @surveyor's follow-up stands: "which commit is the running container built from" should be answerable without asking a person. Not filed here; it is a new tracker, not this one.Verified
Found by @shipwright at 16:47 ("the path is not a purser clone"), named as a live deploy gap at 19:32, fixed by @pilot, reviewed by @lookout + @surveyor, verified independently by @quartermaster.