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

MUSEUM_MASTER_PLAN.md



RELEASE

planning/2.8.5/plans/MUSEUM_MASTER_PLAN.md

sha256 286221670475b51c · 47828 bytes · original held in the private archive

# THE MUSEUM — master plan **Rewritten 2026-07-20.** Supersedes the previous master plan of the same name and the scope in `MUSEUM_EXHIBITS_DESIGN.md`, which remains the record of how the first round of external reviews was adjudicated. Where any of the three disagree, **this file wins**. --- ## WHY THIS WAS REWRITTEN The previous plan was reviewed by Gemini and GPT, blind to each other. They reached the same verdict by different routes. > **Gemini:** *"You tore down the terminal to build a classroom, but you accidentally built a > chronological museum instead."* > > **GPT:** *"Still primarily an archive organized by artifact type, with an orientation page placed > in front. A newcomer would still have to reconstruct the method themselves."* The old plan organised itself around **artifact classes** (sessions, reviews, mockups, memory) with **releases as the spine**. That is an archive's filing system with a teaching page bolted to the front. A visitor who wants to learn how this was built would still have to do the synthesis themselves — which is the entire job the museum exists to do for them. **The fix, adopted:** organise the teaching layer around **cases and methodology**. Preserve everything; teach selectively. The archive does not shrink — it stops being the spine and becomes the **citation layer** the teaching chapters point at. This document is split into four parts so the three concerns stay separable: | Part | What it covers | | --- | --- | | **I — The teaching layer** | The spine. What a visitor reads, in order, and how it stays true. | | **II — The evidence layer** | The archive. Everything preserved, and how the teaching layer cites it. | | **III — Publication mechanics** | How it goes public without leaking, breaking or lying. | | **IV — Process** | Reviews, sequencing, rejected ideas. | --- # PART I — THE TEACHING LAYER --- ## 1. THE CLAIM — narrowed, and it governs everything The owner's ask was *"showcase the use of AI to create RobCo the best way I possibly can"* and *"a full project history so people can learn the AI usage themselves."* **It cannot teach "the best way to use AI."** The project is weeks old, has two users, and has no comparative evidence — no control group, no alternative method tried side by side, no outcome measured against a baseline. A museum claiming general best practice would be making exactly the "authoritative and quietly wrong" claim this whole system exists to avoid. **⭐ THE CLAIM, STATED AT THE TOP OF THE LOBBY AND BINDING ON EVERY PAGE:** > This is a record of how **one solo owner** used AI to build **this specific project**, under > **these constraints**, with **evidence of what worked and what failed**. Everything downstream inherits that scope. Where a chapter is tempted to generalise, it must either move the claim into the **transfer layer** (§7) and label it as such, or drop it. --- ## 2. THE LEARNER, THE OUTCOMES, AND THE COST A teaching artifact without a defined learner teaches nobody. Stated on the way in: **Who this is for.** Someone who can already use a code editor and git, is working alone or nearly alone, and wants to use AI models to build something larger than they could hold in their head. Not a beginner's programming course; not an enterprise-team process guide. **What they should be able to do afterwards** (the outcomes the museum is judged against): 1. Explain why an orchestrator that never writes code is a different role from a coding assistant. 2. Write an authority contract for their own project — what an agent may do unasked, what "done" means, when it must stop. 3. Set up isolation and a gate so that speed does not translate into breakage. 4. Read a review critically instead of adopting it, and adjudicate two reviews that disagree. 5. Recognise the failure mode this project keeps hitting: something that looks authoritative, passes its checks, and is silently doing nothing. **Prerequisites and costs, stated plainly.** What hardware this ran on (a ROG Ally — modest, and the reason a local model was rejected on measured evidence), roughly what the model usage cost, and how much time the owner actually spent. A method whose costs are hidden is not reproducible, and a reader who discovers the cost after investing a weekend has been misled by omission. **The minimal starter kit.** The smallest version someone could adopt on day one — not the full apparatus. This project has ~50 protocols, a nine-file rulebook and a multi-suite gate; presenting that as the entry point is a wall, and it also misrepresents history, because none of it existed at the start. The kit is: one authority contract, one isolation mechanism, one gate that must pass. Everything else is shown as what it is — accretion in response to specific failures, each with the failure on file. **⭐ NOVICE COMPREHENSION TEST — before scaling the build.** Fable, GPT and Dispatch all know this project too well to judge whether the entry path teaches anything. Before building out chapters beyond the first vertical slice, put the lobby and one full chapter in front of someone who has never seen the project, and ask them to state in their own words what the project is and how the work was organised. If they cannot, the entry path has failed and no amount of additional rooms fixes it. This is a **gate on the build order**, not a nice-to-have at the end. --- ## 3. THE SPINE — six methodology chapters, in this order The visitor's path. Each chapter is frozen narrative with generated evidence injected (§4), and each one **cites** the archive rather than summarising it (§6, §9). ### Chapter 1 — LOBBY: the concept What the app is. Why offline-first vanilla web technology was chosen — no framework, no build step, no backend — and what that bought and cost. The core constraints that shaped everything: phone-first owner, single developer, a modest machine, and a Fallout terminal the app has to remain believable as. Carries the narrowed claim (§1), the learner definition and the outcomes (§2). ### Chapter 2 — THE ENGINE: Dispatch and the triad The orchestrator that **never writes code**. Why that separation exists and what it produces: an orchestrator that holds the specification and the judgement, and sessions that hold the context of one task. The three-model split by role — design and creative, diagnosis and planning, implementation — and the honest account of where the split helps and where it is overhead. Cites: real task packets, and the sessions that ran them. ### Chapter 3 — THE AUTHORITY CONTRACT **⚠ This chapter was materially redirected. Gemini wanted it to be the shorthand glossary — "go", "yo", "resend", "fold that in". GPT's objection is correct and overrides: those are one person's personal vocabulary and transfer to nobody.** What actually transfers is the **authority contract underneath the vocabulary**: - What the orchestrator may do **without asking** — and why permission-asking was pushed down to near zero for a phone-first owner who cannot read terminal output. - What counts as **done** — and why "the session said it was done" is a claim, not evidence. - **When it must stop** — the irreversible steps, the spec lock, the no-concurrent-push rule. - **How corrections are absorbed** — a correction that changes only the current task versus one that becomes a standing rule, and who decides which. The glossary survives as **illustration inside this chapter, not as its point**: a handful of real short instructions mounted **beside the commits they produced**, so the reader sees a three-word message and the diff it caused. That pairing is the teaching content; the words themselves are trivia. Cites: worked case 2 or 3 (§6), and the short-instruction-to-commit pairs. ### Chapter 4 — THE SAFETY NET: git worktrees and the gate How isolation and testing let the work go fast without the speed turning into breakage. Worktree isolation per session; the gate at the commit and push boundaries; the escape-ratchet principle (every failure that escapes a layer adds a check at that layer) and its counterpart, the retirement rule that stops the ruleset growing forever. ⭐ **This chapter must include the failures of the net itself** — the cache guard that was written, hooked, tested and silently doing nothing for weeks, and the tests that asserted code *said* it escaped dangerous input rather than that it did. A safety-net chapter that only shows the net working is the exact overclaim the project keeps catching in itself. Cites: worked case 3 (§6), the bug museum's red-then-green cases (§12). ### Chapter 5 — THE ARCHIVE: case studies The three complete worked cases (§6) in full, plus the entrance to the evidence layer. **The release rooms live here, demoted from spine to citation** — they are the deep evidence for a reader who says "prove it," not the organising principle of the museum. ### Chapter 6 — THE GRAVEYARD Ruled-out ideas, each showing its **original decision record** rather than a later summary. Kept at the end, deliberately: never start the tour in the basement, and a project is not defined by its failures — but a method that shows only its successes has taught nothing about judgement. --- ## 4. ⭐ FROZEN NARRATIVE, GENERATED EVIDENCE — the key mechanism This is the mechanism that makes the whole teaching layer possible. It resolves the standing conflict between "hand-written content rots" and "generated content cannot teach." **A fully generated spine would be an autopsy.** It can report *what* happened — commits, counts, timings — but not why any of it matters, what the mental model is, or what a reader should take away. Generation cannot produce insight it was not given. **A fully hand-written spine rots.** Every specific number, filename and example in it goes stale, and the museum drifts into confidently describing a project that no longer exists — which this project has already done to itself, in its own documentation, off by a factor of forty. **⇒ THE SPLIT:** > **The narrative is FROZEN PROSE** — it teaches philosophy and mechanisms, the things that do not > change weekly. > > **Every specific noun, metric and example inside it is an INJECTION POINT** the generator fills > from the latest pinned release. So the frame is written once, and the proof is always current. Concretely, a frozen sentence reads: > "The gate runs at both the commit and push boundaries; at `{{RELEASE}}` it ran `{{GATE_SUITES}}` > suites, and the push boundary added `{{PUSH_CHECKS}}`." The teaching claim ("the gate is split at two boundaries and why") is stable. The numbers are measured at the pinned release and can never be stale, because nobody hand-copies them. **Rules on injection points:** - An injection point that cannot be resolved renders **as a visible gap with its name**, never as a blank or a silently dropped clause. A sentence that quietly loses its evidence is worse than one that admits it is missing. - Injection points carry **no AI at build time** — they are extraction and measurement only. A hallucinated summary is worse than none and would break determinism. - If a frozen sentence's *claim* stops being true (not just its numbers), that is a **delta for the release review** (§5), not a silent patch. --- ## 5. ⭐ THE ANTI-ROT ANSWER — the methodology tracks the latest SHIPPED RELEASE **The teaching layer is pinned to the latest release tag, never to `dev`.** This is the structural answer to "the workflow changes constantly, so any written description of it rots." It does not rot, because it is **tied to a static point**: > Change the workflow on a Tuesday and the museum does not care. It remains an accurate guide to how > the **published** version was built. The museum is therefore **current by definition between releases**. That sharpens the NOT CURRENT notice into something meaningful — it fires only when *a release shipped and nobody regenerated* — instead of firing permanently and becoming noise. **The release ritual.** At each release, Dispatch drafts a **delta**: what changed in the workflow since the last release, in plain English. The owner approves it. That delta becomes the new frozen manual, and the previous one is retained as the record of how the previous release was built. **⭐ This turns the methodology into a visible evolution rather than a static "how we work" page.** Read in order across releases, someone watches the rulebook go from one 100 KB file to a contract plus scoped notes; watches the trim begin; watches the audit-from-the-diff rule appear after a false "verified" pass got through. **The changes are where the lessons are.** A single always-current page would hide every one of them. --- ## 6. ⭐ THREE COMPLETE WORKED CASES — the primary citations These are the closest thing the museum has to a thesis. Each traces **one episode end to end**, with every link in the chain present: ``` owner request → what Dispatch inferred and what it delegated → the task packet actually sent → what the session reported [LABEL: session-reported] → the resulting diff [LABEL: measured fact] → the blind reviewer's claims → which were accepted or rejected, and why → gate evidence [LABEL: measured fact] → what shipped → any later correction ``` **Build exactly three, chosen to teach different things:** 1. **A clean success.** The method working as intended, start to finish. Establishes the baseline shape so the other two read as deviations from something. 2. **A review that materially changed the work.** The case for running blind reviews and adjudicating rather than averaging — including the reviewer claims that were *rejected*, which is the harder and more useful half. 3. **A confident AI or process result that repository evidence overturned.** The most important of the three. Something that was asserted, sounded right, passed its checks, and was wrong — caught by looking at the real thing. The cache guard and the silent service-worker failure are the obvious candidates. **Wiring the chapters to the cases** — this is what stops the chapters being abstract: - The blind-review material in Chapter 2 links **into the actual adjudication** in case 2, not to a description of adjudication. - The authority contract in Chapter 3 links **into a real short instruction mounted beside the commit it produced**. - The safety net in Chapter 4 links **into case 3**, where the net failed. **⭐ Release rooms survive by being the citations.** They are not deleted, not diminished in content, and not reorganised. They stop being the path and become the destination — the deep evidence a sceptical reader lands in when they follow a chapter's link and say "prove it." --- ## 7. THE TRANSFER LAYER AND CLAIM LABELS **The transfer layer.** Every chapter separates two different kinds of statement, visibly: | | | | --- | --- | | **WHAT HAPPENED HERE** | The record. Specific to this project, this owner, these constraints. Evidenced. | | **WHAT MAY GENERALISE** | The candidate lesson. Explicitly marked as *untested elsewhere*. | Keeping these unseparated is how a single-project record turns into false best-practice advice. The transfer layer is allowed to be speculative **only because it is labelled as speculative**. **⭐ CLAIM LABELS.** Every substantive claim in the museum carries one of four labels, and the label is part of the page, not a footnote: - **MEASURED FACT** — produced by the generator from the repository. Counts, diffs, timings, hashes. - **PARTICIPANT REPORT** — what a session or the owner said happened. Not independently verified. - **CONTEMPORANEOUS RATIONALE** — a reason recorded at the time the decision was made. - **CURATOR INFERENCE** — Dispatch's or the owner's later interpretation. The weakest class, and the one most likely to be flattering. This is the generalised form of the rule that claims must be literal. It also does the single most important honesty job in the museum: it stops the reader from having to guess which sentences are evidence and which are storytelling. **⭐ SESSION REPORTS ARE SELF-REPORTS.** The old plan treated a session's final report as a ready-made exhibit label — *"no summarisation step: the session already writes its own exhibit label."* That is convenient and it is wrong: a session's account of its own work is a **claim, not evidence**, and it is the exact thing the audit-from-the-diff rule exists to distrust. Session reports are preserved verbatim, labelled **PARTICIPANT REPORT**, and **selected ones are connected to the diff, the audit and the gate result** so the reader can see where the self-report was accurate and where it was not. --- # PART II — THE EVIDENCE LAYER --- ## 8. BASELINE — what exists today, measured **⚠ Measured 2026-07-20 against the built output. The figures in the previous plan and in `MUSEUM_EXHIBITS_DESIGN.md` were taken at different commits and are superseded by these.** | Property | Current measured value | Superseded figures | | --- | --- | --- | | Pages | **272** HTML pages | 264 (old plan) | | `search.html` | **7,133 bytes (7 KB)** | 3.9 MB (design doc, pre-fix) | | Internal `href`s | **3,792** | 4,206 (old plan) · 3,509 (design doc) | | `museum/site/` on disk | **18 MB** | 19 MB | | Full images referenced | **429** | — | **The search-size conflict is resolved:** the 3.9 MB figure is the *pre-fix* state recorded in the design doc; the correctness pass sharded it. **7 KB is current.** The link counts differ because they were counted at three different commits against a growing tree; **3,792 is current** and no count should be hand-copied into another document (that is the retired count-sync tax returning through a side door). Rooms as built: four release rooms (2.5.0, 2.6.0, 2.8.0, 2.8.5) · standing tools · graveyard · search · growth chart · paginated galleries with cached thumbnails. Entry point is **`museum/site/index.html`** (never `museum/index.html` — that path has never existed). Correctness pass already landed: literal integrity claims, `<a href>` navigation, sparse-room notices, draft-banner handling, the search shard, growth chart shipped-vs-in-flight, and a currency guard rendering NOT CURRENT when the newest data point disagrees with the pinned commit. The output self-stamps with an input hash and no wall-clock time, so identical inputs regenerate identically. --- ## 9. THE ARCHIVE ROOMS All preserved. All demoted from spine to citation (§6). - **Release rooms** — 2.5.0, 2.6.0, 2.8.0, 2.8.5. The deep evidence per era. - **Standing tools** — cross-release material, library docs, memory. - **Memory** — current memories, plus their git version history (the "what was believed and then corrected" view), plus deleted memories rendered **as deleted, with their reason**, plus the audit and repair log as wall text. This is one of the strongest exhibits in the building: it is a legible record of a system being wrong and being corrected. - **External reviews** — each saved verbatim, with its adjudication. The adjudication is the exhibit; the review alone is just an opinion. - **Sessions** — every session's final report plus metadata (model, task, commit, turns), labelled **PARTICIPANT REPORT** per §7. - **Decisions** — from frozen decision records (§10). - **Graveyard** — ruled-out ideas with their original decision records. - **Search** — full-text over the corpus. The archive's index, not a room. **The workflow material is no longer a per-release room.** It has been promoted into the spine as Chapters 2–4 and made release-pinned (§5), which is what the old "workflow room per release" idea was reaching for. Its source material stands: `planning/_standing/WORKFLOW_REVIEW_PROMPT.md` is a complete, incrementally-maintained written description of the setup, plus the memory files. **⚠ Vocabulary: "seated module" is dropped.** It is a hardware metaphor borrowed from the app's Module Bay, and outside that context — which the museum no longer has, since the theme is dropped (§14) — it stops meaning anything. **The distinction it named survives and is load-bearing:** > **INDIVIDUAL ARTIFACTS** get individual presentation — a thumbnail, metadata, its own space — > because they matter one at a time. > **AGGREGATE MATERIAL** gets a dense manifest, because its meaning exists only in bulk. The distinction stays **structural — density and layout — never decorative.** Layout survives a stylesheet change; badges and accent colours do not. --- ## 10. THE CURATION MECHANISM Each release account carries a **featured-artifact list**: a filename plus one line on why it matters. The generator renders those with real thumbnails, links and metadata. > **The SELECTION is frozen prose. Everything around it is generated.** **If a named artifact is missing, the page says so.** A curator's pick silently pointing at nothing is precisely the "authoritative and quietly wrong" failure. **⭐ A mechanical property must never silently override a human judgement.** The generator reports state; it does not re-curate. The origin case: a curator's pick sitting in a build that fails to boot **stays on its pedestal, showing the panic**. Demoting it would let software rot quietly rewrite the curation and bake survivorship bias into the exhibition — whatever still runs gets elevated, whatever died sinks into a list — and it would happen invisibly, with nobody witnessing the demotion. **Decision records use the same shape** — what was decided, when, why, what was rejected. Dispatch drafts, owner approves, then frozen. **Not** a formal process where every change demands a document; only the calls that would otherwise be lost. The bulk manifest below the featured picks stays **fully exposed, never collapsed**. The scroll is the scale, and the curation only reads as valuable next to the bulk it saved you from. --- ## 11. TL;DRs — EXTRACT, never generate Most summaries already exist: memory files carry a `description:` in frontmatter; planning docs state their purpose in the first line; audits open with a snapshot line. ⇒ The generator **extracts** these. **No AI at build time** — a hallucinated summary is worse than none, and it would break determinism. Where a file has no summary line, the museum says so, and that list becomes a to-do: one line added at the source improves both the file and the exhibit. --- ## 12. THE BUG MUSEUM — curated cases with red-then-green evidence **⚠ GPT's rebuttal stands and changes the design.** The old form was: ``` ANOMALY #42 TEST RECORD: <filename> STATUS: PASSING AT COMMIT <hash> ``` **"Passing at commit X" proves a test passed. It does not prove the test would catch that defect.** An inert test also passes — and this project has produced an inert guard twice. So the old form, which was adopted specifically to strip the authority claim, still smuggles one back in: the reader reasonably infers coverage from a green status, and the museum has no evidence for that inference. **⇒ Each case requires one of two things, and must render whichever it has:** 1. **RED-THEN-GREEN EVIDENCE.** The guard demonstrably fails against the defective code and passes against the fixed code. That is an actual demonstration of coverage. 2. **Or the literal admission:** *"Coverage of this historical defect is not independently demonstrated."* There is no third option and no softer wording. **Scope: five to ten failures with complete evidence chains. NOT comprehensive coverage.** An "every defect" museum was rejected on the grounds that the set is unprovable, and that rejection stands (§20). The obvious candidates are the two the project already understands deeply: **the silent service-worker failure** and **the inert cache guard**. **Why the owner wants it:** it is the only proposed exhibit that would change how he works — every guard shown beside the defect it exists to prevent is the evidence the rulebook trim needs, and that argument currently lives only in scattered audit files and orchestrator memory. --- ## 13. HISTORICAL CAPTURE — kept; the exhibit built on it is CUT **⚠ "Propositions vs Reality" as designed is CUT.** > **GPT:** *"Two unpaired blocks do not create a comparison; 'the visitor's eye does the work' is the > opposite of teaching."* That is correct and it is fatal to the design as written. The exhibit was two lists side by side — that release's mockups facing that release as it rendered — with no pairing, on the theory that the absence of curation *was* the curation. In a teaching artifact, handing the reader two unsorted piles and asking them to find the connection is precisely the synthesis burden the museum exists to lift. **Two acceptable outcomes, no middle:** 1. **A small frozen set of curated real pairs** — hand-picked, few, each with a written line on what changed between proposition and reality. This is frozen prose and cannot rot. 2. **Don't build it.** **Historical screenshot capture itself is still endorsed** — it is genuinely one-off work, not a maintenance tail. Check out a release tag into a temporary git worktree, serve it, boot it with the browser automation the project already depends on, capture, tear down. **A release commit is immutable, so each release is captured exactly once, ever, and cached against its commit hash.** Regenerating next week re-shoots nothing. **Boot the machines EMPTY.** A modern save fixture would fail to load in an old save format and could crash a genuinely healthy build, making the exhibit lie. An empty terminal is also the truthful artifact: the chrome is what was built. **⭐ CAPTURE IDENTITY IS NOT THE COMMIT HASH.** A screenshot is a function of far more than the code. Capture identity **must** include: ``` route · viewport · state contract (empty / seeded / which fixture) · capture-spec version · commit ``` **And the label must be literal:** > ✅ *"Captured from commit `a1b2c3d` at 360×800 with an empty profile."* > ❌ *"How the release actually looked."* The second is a claim the capture cannot support — it looked different on other viewports, other routes, and with real data. **Failure detection reuses the project's existing boot-smoke judgement.** Do not invent a second definition of "working"; two definitions is how the museum ends up disagreeing with the pipeline. - Navigation failed → **environmental** (worktree didn't serve). Not the artifact's fault; say so. - Uncaught error during boot → **genuine boot failure**. - Anchor present but nothing painted → **render failure**. A different fact. - All checks pass but the screen is empty → **NOT a failure.** That is the app's honest empty state, and reporting "no data" as "broken" lies about the artifact. The panic frame's contents are the **verbatim captured error** — never an invented cause. "No longer boots in a modern browser" and "dependencies lost to time" are both almost certainly false for a vanilla app this young, and the real stack trace is the better exhibit anyway: it is the actual last words of a version of the software. **Threshold:** one dead machine is meaningful; all of them dead means the automation is broken. Treat a total-failure result as a generator bug, not a finding. --- ## 14. THE DATE VIEW — cut from the teaching spine **"Archive activity on this date" is CUT from the spine.** It is owner-oriented archaeology: a newcomer does not arrive knowing a date, so it cannot be part of a path that teaches. It has no entry point for the learner defined in §2. **It may survive as an owner tool** — a diary view, generated from git history and release tags, with separate lanes (*shipped* · *first entered the archive* · *planning artifact* · *mockup*) and never conflating a git timestamp with when an idea was had. It is cheap and has no maintenance tail. But it is a utility, not a chapter, and it does not compete for build order with the spine. **The clickable growth chart follows the same logic** — deferred, and only ever navigation. If the date pages exist, the chart's points become links to them. Never a second analytical subsystem. --- # PART III — PUBLICATION MECHANICS --- ## 15. PRESENTATION — the theme is dropped Owner: *"it doesn't have to stay 100% in theme… you can also decide to drop the theme if you want, that's entirely your call."* **Decision: a gallery, not a terminal.** The reasoning: **the exhibits already ARE the RobCo aesthetic** — 429 amber phosphor mockups, 28 terminal prototypes. Framing them in more terminal chrome flattens everything into one texture. Galleries hang paintings on neutral walls for exactly this reason. - Dark and restrained (the images are dark), modern layout, real body text with real spacing. - Monospace retained for **data** — filenames, hashes, counts, stack traces — where it signals machine output. - RobCo becomes an accent, not the substrate. - **Stops inlining the app's 512 KB stylesheet.** The reuse argument was about avoiding drift; a standalone museum stylesheet has nothing to drift *from*, so this is less coupled, not more. - **Unlocks the Gource-like visual language** (§18) — radial layouts and decay-by-opacity are modern data-vis and cannot be expressed in a vocabulary of boxes and slots. - ⭐ **KEEP the theme deliberately in ONE place: failure states.** A dead build printing its real stack trace in a panic frame is where the fiction adds truth rather than decoration. Both reviewers independently called keeping the theme *only* for genuine failure states "unusually coherent." Fully reversible regardless — it is generated. --- ## 16. GENERATION MODEL **Cadence: at RELEASE, not on every sync** (owner). A room is a release; regenerating mid-round means the newest room never settles. **Pin to the RELEASE, not `dev`** — the same pin the teaching layer uses (§5), for the same reason. **Test count IS captured — at release, frozen** (owner). Consistent with retiring the count-sync protocol, which killed the *obligation to hand-sync a live number across eight files* while explicitly keeping frozen counts on released changelog entries as history. Measured by the generator, never hand-copied. **Never hand-copy a generated figure into a planning document.** §8 exists because that happened three times and produced three disagreeing numbers. --- ## 17. PUBLICATION ### 17.1 Owner decisions — LOCKED 2026-07-20 - **Timing: public AFTER the 2.8.5 release and BEFORE the 2.9.0 release.** This is **locked**, not conditional. (The previous plan contradicted itself — §8 locked it, §11 said "IF publishing at that point." It is locked.) - **Then integrated into the filesystem in 2.9.0**, when the OS round builds DIR. The app carries a **pointer** to the public museum; the archive bytes never move into the app. Since it is public by then, a plain link is sufficient. - **New repo name: `Robco-Exhibit`.** Owner's choice — the existing archive repo's history carries his real name and cannot be cleaned. - **The four release accounts are APPROVED AND FROZEN** (`MUSEUM_RELEASE_ACCOUNTS.md`, owner, 2026-07-20). Do not rewrite them. (The previous plan said both "approved and frozen" and "awaiting approval." They are approved.) - **Public, no login** — owner: *"I'm not worried about someone reading the generated data, that's the whole point in the museum."* ### 17.2 ⭐ CLOUDFLARE PAGES, not GitHub Pages GitHub project sites share the `zerckzzyHD.github.io` origin, so a museum there would share **browser origin and localStorage** with the live app — and the archive holds **28 executable HTML prototypes** that could read or overwrite the live campaign. Cloudflare serves from its own domain; the hazard vanishes. *Found by GPT-5.6 Sol. The single most valuable finding of the museum review exercise, and nobody would have found it by looking at the museum.* Because Cloudflare solves the origin problem by host choice, **`Robco-Exhibit` can live on the owner's NORMAL GitHub account.** The earlier "separate account" requirement existed *only* because of the shared GitHub Pages origin. **The existing archive repo can NEVER be made public** — git history retains the memory files regardless of later deletion. Publication is from a **separate repo containing only generated output**, with clean history. ### 17.3 ⚠⚠ THE PUBLISH GUARD MUST FAIL CLOSED — the most important fix in this document **The previous design does not fail closed, and this is the defect that matters most.** It specified: scan the output tree → push → **then** verify against the remote. That verification step was described as catching the case where the guard ran against the wrong directory — which is real, and is exactly the class of mistake this project keeps making (the museum reading whatever was checked out; the backup syncing a memory store that wasn't the real one). **But verifying AFTER a public push is not a guard. Disclosure has already happened.** By the time the remote check runs, the tree is public. Deleting the repo does not retract clones, CDN caches, GitHub's own caches, or scrapers. The prescribed remedy — "delete and recreate, do not patch" — addresses git history and does nothing about the disclosure that already occurred. **Publication is the one irreversible step in this system**, and the guard was placed after it. **⭐ CORRECT SEQUENCE — verify the exact commit privately, then expose that same commit:** ``` 1. GENERATE the public tree. 2. PUSH the exact commit to a PRIVATE remote (or a non-public staging target). 3. VERIFY THAT COMMIT — all checks in §17.5, run against the pushed tree, not local state. 4. Only on a clean pass: EXPOSE THE SAME COMMIT publicly (flip the repo to public / promote the identical commit to the public target). 5. Re-verify after exposure as a confirmation step, not as the gate. ``` The property this buys: **the artifact that was verified and the artifact that becomes public are byte-identical and the same commit** — which was the original point of checking the remote — *and* no disclosure occurs before the check. Step 5 is retained because a deployment can disagree with a repo, but it is now a confirmation, not the only line of defence. **Any failure at step 3 aborts.** No push to public, no partial publish, no "warn and continue." ### 17.4 ⚠ THE OUTPUT IS NOT SELF-CONTAINED — measured, not theorised **Verified 2026-07-20 against the built tree:** > **3,318 references inside `museum/site/` point outside it**, via `../../planning/2.8.0/mockups/…` > and `../../planning/2.8.5/mockups/…`. Two consequences the old plan missed: 1. **Copying `museum/site/` alone ships a broken museum.** Every full-size gallery image breaks. 2. **Validating links inside the private repo proves nothing about the public tree** — inside the archive those `../../` paths resolve, because the sibling directories are right there. In the published tree they will not exist. The current all-links-resolve result is therefore **not evidence about what gets published.** **⇒ REQUIRED VALIDATION — it must be done against the real thing:** - Generate **only the public tree**, into an **empty location**. - Make the private archive **unavailable** (move it, rename it, or generate on a path that cannot reach it) — so a stray `../../` cannot accidentally resolve and pass. - **Serve it and crawl it.** Verify every page, stylesheet, thumbnail, **full image**, prototype and search result loads, **with no path escaping the output root**. **⚠ Size correction.** `museum/site/` is 18 MB, but the 429 referenced full images live in `planning/2.8.0/mockups` (**103 MB**) and `planning/2.8.5/mockups` (**72 MB**). **The real public tree is on the order of 190 MB once the images are copied in, not 19 MB.** That changes hosting assumptions, deploy times and the phone-readability of gallery pages, and must be sized before the publish step is scheduled. ### 17.5 ⚠ THE THREE-STRING SCAN PROVES ONLY THREE STRINGS The previous plan concluded: *"No memory split needed — three strings, then the museum simply reads the memory."* That conclusion was already falsified inside the same document — **the App Check debug token blocker proves credentials are a separate class of exposure entirely**, one that no name-and- email scan would ever detect. **⇒ THE EXACT PUBLIC COMMIT REQUIRES ALL FOUR, at step 3 of §17.3:** 1. **PII-string scanning** — real name and surname in all case variants → `zerckzzy`; **email removed entirely** rather than substituted (a fake address that looks real is worse than absence). Deterministic string replace, not a judgement filter. Must cover **the search corpus**, which holds full document text and would otherwise leak exactly what the visible pages hid. 2. **CREDENTIAL / TOKEN-PATTERN SCANNING** — API keys, tokens, connection strings, private URLs, absolute Windows paths. Pattern-based, not a fixed string list, because the thing you are looking for is by definition one you did not anticipate. 3. **AN APPROVED PUBLICATION DIFF** — what is *newly entering the public set* since the last publish. Not a filter and it decides nothing; a notice, so the boundary is visible at the one moment it matters. This answers the ongoing-classification problem: new memories arrive continuously, and the diff makes each one visible rather than trusting a one-time classification forever. 4. **LINK VALIDATION AFTER SUBSTITUTION** — ⭐ **run last, and this ordering is the point.** Rewriting text can break references: a substituted name inside a path, filename, anchor or href silently breaks the link. Validating before substitution validates a tree that is not the one being published. **⛔ BLOCKER: the App Check debug token must be rotated before publishing.** It bypasses App Check verification. Tracked as a 2.9.0 queue item, cross-referenced from here. **One lobby line** notes that local paths show the handle rather than the account name — so the substitution is disclosed rather than passed off as the original text. ### 17.6 Two things that would defeat the clean repo 1. **COMMIT IDENTITY.** A fresh repo does not stay clean on its own. If the generator's commits use the owner's normal git identity, his real name and email enter the new history on the very first push — exactly what the new repo exists to prevent. **Set a repo-local identity** (`zerckzzy` plus a GitHub `@users.noreply.github.com` address) and **verify `git log --format='%an %ae'` on the first commit before pushing.** 2. **NO HISTORY CARRIED OVER.** Generate fresh into the new repo. Do not copy the existing museum output, its search index, or any prior commits forward — they contain the un-substituted email. ### 17.7 Post-publish order Build `Robco-Exhibit` → verify live and correct on Cloudflare → **then** remove `museum/site/` from the private archive. The generated output is derived and never needed backing up; the only reason it was committed to the archive was so the owner could see it on GitHub, and a live site replaces that. **The GENERATOR stays in the archive** — it is source, and it reads the archive. `Robco-Exhibit` is purely a publish target. **The private archive repo itself is never deleted** — it remains the only off-machine copy of `library/`, `planning/` and memory. **Link rot:** content-hash-only document URLs vanish when content changes. Generate stable aliases or retain old pages. --- # PART IV — PROCESS --- ## 18. THE VISUAL WEB — parked, wanted, reference confirmed Owner confirmed **Gource** is the look: *"yes, that's what caught my eye about gource."* Nodes radiating from a centre, organic branching, pulse-then-settle, inactive branches dimming. **He wants the FEELING, not the tool.** Gource itself is rejected — it is built for many contributors over years; here it renders as one dot orbiting a small tree, and costs two installs plus a large stale video. **Transfers to generated SVG + CSS, no framework:** radial layout · edges between related nodes · opacity by age/activity · pulse on hover/tap · colour by type. **Does not transfer:** animated playback of history. ⇒ Hand to **Fable** as *"make the RobCo-native version of this feeling"*, never *"build this tool."* --- ## 19. THE REVIEWS **⭐ FABLE MOVES EARLIER — it designs the proven vertical slice, not the finished templates.** The previous plan scheduled Fable last-but-one, after the museum was functionally complete. That is backwards: scheduling the design pass after every template already exists means the design either gets ignored or forces a rebuild of everything it touches. Design decisions are cheapest before the templates multiply. **Fable's brief, at the vertical slice:** design **one complete path** — the lobby, one methodology chapter, and one worked case — well enough to prove the teaching layer works. That slice is what the novice comprehension test (§2) is run against, and what the remaining chapters are then built to match. The brief is much stronger than it would have been: **not "style an archive like a terminal" but "design a gallery for a terminal's history,"** plus the Gource reference for the visual web. Fable authored the machine, the tempo dial, the records bay and the approved mockups — it can see the real CSS and the images it drew. This is a design job, not a review. **GPT-5.6 SOL — audit. Runs LAST, unchanged.** Work tab, connected to the repo, and **given the live Cloudflare URL** so it reviews the real thing rather than a description. Structural and interactivity review, with **"no change" explicitly allowed** — GPT is the only one of the three that has been willing to say something should not be built. Its standing warning governs the whole project: > *the eighteen-month failure is not a broken script; it is a museum that still opens, looks > authoritative, and is quietly wrong.* **Opus gets no separate reviewer slot** — that is Dispatch, which adjudicates throughout. Adding it as a reviewer would be marking its own work. **Standing note on the reviewers, recorded because it is reusable:** Gemini's instinct beat GPT's caution on buildability twice (historical-capture cost; the pivot that reframed Propositions vs Reality). GPT's rigour beat Gemini's enthusiasm on facts twice (the growth chart was numerically wrong and Gemini praised it without checking; the same-origin storage hazard). In this round they reached the same structural verdict independently. **Run both, blind, and adjudicate — do not average them.** --- ## 20. SEQUENCING **Build the vertical slice first, and test it on a novice before scaling.** The old sequencing built rooms and left the teaching path to emerge; that is the failure both reviews identified. **Phase 1 — prove the teaching layer works (before 2.8.5 release)** 1. The narrowed claim, learner and outcomes (§1, §2) written into the lobby. 2. The frozen-narrative / injection-point mechanism (§4) built. 3. Release-pinned generation, with the test count captured as a frozen release measurement (§16). 4. **Worked case 3** — the confident result overturned by evidence. Built first because it is the hardest and most valuable; if the evidence chain cannot be assembled for it, the whole worked-case design needs rethinking before three of them exist. 5. **Fable designs the vertical slice** — lobby + one chapter + that case (§19). 6. **⭐ NOVICE COMPREHENSION TEST (§2). This is a gate.** If the entry path does not teach, stop and fix it before building anything else. **Phase 2 — the rest of the spine** 7. Remaining methodology chapters (§3), with claim labels and the transfer layer (§7). 8. Worked cases 1 and 2 (§6); wire every chapter to its citations. 9. Curation mechanism (§10) → this is what turns the release rooms into usable citations. 10. TL;DR extraction (§11). 11. Session reports relabelled as PARTICIPANT REPORT and connected to diffs/audits/gate results (§7). **Phase 3 — publication** 12. Name substitution, credential scanning, publication diff, post-substitution link validation (§17.5). 13. Self-contained output validation against a genuinely isolated tree (§17.4) — and size the real ~190 MB public tree. 14. App Check token rotation (⛔ blocker). 15. **Publish via private-verify-then-expose (§17.3).** Locked: after 2.8.5, before 2.9.0. **Phase 4 — after publication** 16. Bug museum, red-then-green only, 5–10 cases (§12). 17. Historical capture + the small curated-pairs set, or drop it (§13). 18. Date view as an owner tool, if wanted (§14). 19. Clickable growth chart — navigation only, last. 20. **GPT live audit against the deployed URL (§19).** **Do not build another room before the museum is honest.** GPT's judgement, adopted and unchanged. --- ## 21. REJECTED — do not re-propose | Item | Why | | --- | --- | | **Releases or artifact classes as the organising spine** | The finding that produced this rewrite. Cases and methodology are the spine; the archive is the citation layer. | | **"Propositions vs Reality" as two unpaired blocks** | Two unpaired lists are not a comparison, and making the visitor do the synthesis is the opposite of teaching. Curated pairs or nothing (§13). | | **The date view as a teaching chapter** | A newcomer does not arrive knowing a date. Owner tool only (§14). | | **"Every defect" bug museum** | The set is unprovable. 5–10 curated cases with evidence chains (§12). | | **Coverage claimed from a passing test** | An inert test also passes; proved twice on this project. Red-then-green or an explicit admission (§12). | | **Verifying after the public push** | Disclosure has already happened and cannot be retracted (§17.3). | | **The three-string scan as sufficient** | The App Check token proved credentials are a separate class (§17.5). | | **"Seated module" as vocabulary** | A hardware metaphor that stops meaning anything without the Module Bay. The individual-vs-aggregate distinction survives; the term does not (§9). | | **Session reports as neutral exhibit labels** | They are self-reports — claims, not evidence (§7). | | **Graveyard as the front door** | Never start the tour in the basement; also misrepresents the project as defined by its failures, and publicly invites decontextualised screenshots. | | **Semantic mockup→screen mapping** | Permanent human curation obligation, and it does not map 1:1 anyway. | | **A public redaction pipeline** | A filter running every build is a second product. The boundary is drawn once, at the source. | | **Inlining CSS into every page** | Shared stylesheet is correct at 272 pages. | | **Live iframes for all prototypes** | Archived HTML is untrusted active code. | | **Running Gource** | Built for many contributors over years; here it is one dot orbiting a small tree. Take the feeling, not the tool (§18). | | **AI-generated summaries at build time** | Hallucination risk, and it breaks determinism. Extract, never generate (§11). | | **A formal ADR process on every change** | Only the calls that would otherwise be lost get decision records (§10). | | **Claiming the museum teaches "the best way to use AI"** | No comparative evidence exists. The claim is narrowed and binding (§1). |
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).