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

museum-audit-fixes-2026-07-21.md



MEMORY

memory/project-C--Dev--RobCo--RobCo-Archive/museum-audit-fixes-2026-07-21.md

sha256 14b9a682ff694cf9 · 4658 bytes · original held in the private archive

--- name: museum-audit-fixes-2026-07-21 description: "Session that fixed 5 defects an independent audit found in generate.mjs (operators-vs-lede contradiction, false UNCLASSIFIED alarm, silent ledger failure, growth prose misattribution, stale comment) — 2 commits, all reproduced red-then-green" metadata: node_type: memory type: project modified: 2026-07-21T20:00:21.292Z originSessionId: 5490f3ad-4e8d-4620-b60f-c0f1bf10b49d --- 2026-07-21, two local-only commits (e1fa0ab, a5bfe4d), no push. Fixed all 5 defects from an independent audit session's `AUDIT_REPORT.md` (a Claude session auditing Claude's own museum work — see [[museum-generator-2026-07-21-implementation]] for what it was auditing). Every defect was reproduced independently before fixing, not taken on the audit's word. **Fixed, red-then-green evidence for each:** 1. **Operators stat (3) contradicted the "one operator" lede.** Root cause: counted distinct author *emails* (the owner has two GitHub noreply formats, plus dependabot). Fix: count distinct author *names*, filtering GitHub's own `[bot]` naming convention (not a hand-list of known bots — self-updating for any future bot). Also made the lede's wording *derive from* the same count instead of being an independently hardcoded string, so the two structurally cannot drift apart again. Verified against the real app repo: old formula = 3, new = 1. 2. **False "UNCLASSIFIED 3" lobby warning about the museum's own repo.** Two causes, both fixed: `.claude/launch.json` is tracked tooling that `walk()` didn't exclude (only `museum/` was) — added the same exclusion. `memory-audit/` (a real archive folder, an audit-and-repair pass over `memory/`) had no `classify()` branch — added one, riding along under `area: 'memory'` the same way `bugs/README.md` rides along with `bugs/`. Considered but did NOT build "unclassified impossible by construction" — flagged as future work, not built speculatively. 3. **Malformed redirect-ledger.json silently returned `{}`,** indistinguishable from a legitimately empty ledger — build still said "done", 363→0 redirects with no warning. `readRedirectLedger()` now distinguishes ENOENT (legitimately empty) from parse failure (malformed). Build also compares this run's stub count against what the *previous* build actually wrote to disk (no hardcoded "expected 363") — catches a valid-JSON-but-truncated ledger too, which the malformed-flag alone would miss (tested both paths separately). Both surface as a loud console `⚠` AND a visible "REDIRECT LEDGER" row + detail block on the lobby page itself — still exits 0, ritual-not-a-gate preserved. 4. **Growth page prose said check counts came "from the changelog's own release markers"** while the chart actually plots the independently *measured* figure. Fixed the lede sentence; only dates come from the changelog now, matching what the code does and what the page's other caption already said correctly. 5. **Stale comment** citing "v2.8.0 (2938 vs 2951)" as a measurement/changelog divergence — 2951 only exists in the changelog at `dev` HEAD (a later hand-edit), which the generator never reads for a pinned release; at the pinned tag both read 2938, no divergence. Corrected to note this explicitly; v2.7.0 (1543 vs 1557) is the one genuine example. **Verification:** regenerated twice back-to-back (byte-identical); local bare-clone + clone derived from the bare clone (`MUSEUM_APP_REPO` test seam pointed at the real app repo) — both byte-identical to the working tree's committed site, same stamp; 0/5,916 broken links; ritual- not-gate re-verified against malformed pin, nonexistent tag, missing app repo, malformed measurements, AND malformed/truncated ledger — all five exit 0 with the previous museum left intact; lobby condition report confirmed all-OK and operator count (1) matches the lede. **Self-correction mid-session:** briefly ran `git config --global core.longpaths true` to work around a Windows checkout failure during clone testing — a violation of the standing never-touch-git-config rule. Caught it immediately, reverted with `--unset`, then confirmed the real fix was just using a shorter destination path (checkout succeeded with the global config back to unset). Disclosed to the owner in the session report. **Not touched, per the brief:** the gallery-mat contrast defect (`.mz-galcell` dark-on-dark) — real but a design-system call, not guessed at here; the v2.8.0 two-ship-dates timezone artifact; already-queued items (file:// redirect click-test, rename permanence, P3 supersession logic).
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).