GENERATED VIEW · PRIVATE ARCHIVE · DO NOT SERVE
RobCo Industries · Archive Museum

record.md



BUGS

bugs/untracked-stowaway/record.md

sha256 7decae93fef91074 · 2991 bytes · original held in the private archive

--- title: The Untracked Stowaway status: SEALED repo: archive observed: 2026-07-20 caught_by: fresh-clone regeneration one_line: The museum walked the disk, not the repo, so a gitignored README.txt got its own published page. guard_location: museum/generate.mjs · walk() · line ~563 verified: fresh clone AND bare-derived clone both regenerate to the identical stamp 80bf9bb · f64fb7397980c9cb exhibited: true lesson: A build's inputs must be the tracked set, or the build is not reproducible from a clone. provenance: - commit 76c1970 (this archive) — "museum: walk git's tracked-file list, not the filesystem" - Claude memory record museum-readme-txt-leak --- ## What happened `museum/generate.mjs`'s `walk()` recursed `fs.readdirSync` over the whole archive root, so **any file on disk — tracked or not — became a published page** and fed the global input-tree stamp. The repo-root `README.txt` was gitignored and explicitly marked *"NOT part of the archive"*, yet it leaked in exactly this way: it got its own doc page (`docs/fe41f879e76a.html`) and contributed to a build stamp that was only reproducible on a machine that happened to have that untracked file sitting on disk. The museum could not be regenerated from a clone, because a clone never materialises an untracked file. ## How it was caught Regenerating from a **fresh clone** and comparing stamps: the input-tree hash differed with nothing visibly wrong on the page. The discrepancy — not any visible defect — was the tell. ## The guard `walk()` now runs `git ls-files -z` scoped to the archive root and returns that list (still excluding the `museum/` subtree). The manifest **is** the tracked-file set — exactly the paths present in any clone of the commit, bare or not. An untracked stray cannot leak, because the museum never consults the disk to decide what exists. This was chosen over an `.gitignore`-respecting walk because it is strictly stronger: it also excludes an untracked-but-not-ignored stray, which a gitignore-only fix would still leak and which still would not survive a clone. ## What the guard costs A file does not exist for the museum until it is **committed**. A scratch note lying in the archive folder is invisible — deliberately — until someone says it belongs by tracking it. ## Containment Verified per this project's hard standard: a **fresh GitHub clone** and a **bare-clone-derived clone** both regenerated to the identical stamp `80bf9bb8b148` · `f64fb7397980c9cb` (704 files, 0 broken links), `git status` clean. A local re-run in the working tree would have hidden the bug (the stray is already present locally) — which is why the standard requires the double-fresh check. ## Provenance Commit `76c1970` in this archive. Full first-person account in the Claude memory record `museum-readme-txt-leak`. This record is the first in-repo canonical statement of the defect; the memory record is external working notes, quoted here rather than re-inlined.
STAMP · generated for RELEASE v2.8.5 commit 06e5180 (06e51801b38a) · archive input-tree hash c07fbfbdd2e1ddeb · 754 files · no wall-clock timestamp (regenerates identically when nothing changed).