diff --git a/persistent-memory.d/2026-09-23-dates-and-the-guess-wearing-a-facts-clothes.md b/persistent-memory.d/2026-09-23-dates-and-the-guess-wearing-a-facts-clothes.md new file mode 100644 index 0000000..6de4a05 --- /dev/null +++ b/persistent-memory.d/2026-09-23-dates-and-the-guess-wearing-a-facts-clothes.md @@ -0,0 +1,42 @@ +# Creation dates, and three guesses wearing a fact's clothes + +_2026-09-23 · booth_ + +The operator asked for creation and update dates on booths. **Update** was +already there — `landed_at`, the newest mtime among CONTENT excluding our own +machinery. **Creation** had no honest source, and the interesting part is the +three wrong answers. + +## Only 18 of 30 booths could state a creation time + +`.booth.json` carries a declared `created`, but it exists only for booths posted +through the CLI since U5. Twelve live booths had nothing. + +## ⚠ Every convenient substitute was a GUESS PRESENTED AS A FACT + +- **Oldest content mtime** — wrong the moment an agent copies files with + timestamps preserved (`cp -p`, `rsync -a`), which is common. It would report + the SOURCE material's age as the booth's. +- **Directory mtime** — that is "last thing added", i.e. `landed_at` under a + second name. Two fields, one meaning, displayed as if they were different. +- **Stamp a first-seen marker on read** — and this is the one worth flagging, + because it is the same write-on-read shape that had *already* cost this + service an hour that same day when the thumbnail cache aged the booth it + cached ([[2026-09-23-the-cache-that-aged-the-thing-it-cached]]). A fix whose + shape you just finished paying for is not a fix. + +## The answer was a fact the disk already held + +**ext4 records a real birth time.** CPython does not expose `st_birthtime` on +Linux, but `statx(2)` does and glibc has wrapped it since 2.28, so +`booth/birthtime.py` reads it through `ctypes`. Verified against `stat(1)` on +live booths: **6 of 6 exact**, including every booth with no manifest. + +One rule for all thirty, which is what invariant 6 asks of anything statable in +a line. `None` when the filesystem cannot say (tmpfs, NFS, an old kernel), and +**None renders as nothing** — a blank is the honest output when nobody knows, +and better than a plausible number. + +**The generalisable bit:** when a fact seems unavailable, check whether the +system already records it before reaching for a proxy. Three plausible proxies +were considered and one was nearly built; the real answer was a syscall away. diff --git a/persistent-memory.d/2026-09-23-the-browser-suite-is-flaky-under-load.md b/persistent-memory.d/2026-09-23-the-browser-suite-is-flaky-under-load.md new file mode 100644 index 0000000..009e487 --- /dev/null +++ b/persistent-memory.d/2026-09-23-the-browser-suite-is-flaky-under-load.md @@ -0,0 +1,47 @@ +# The browser suite is flaky under load — UNRESOLVED, and owned by design-dev + +_2026-09-23 · booth_ + +⚠ **OPEN. Not fixed. Do not read a green suite as proof of anything without +re-running it.** + +## What is observed, with its limits + +**Three different browser tests** have each failed once under full-suite load +while passing repeatedly in isolation: + +| test | owner | isolation | full suite | +|---|---|---|---| +| `test_the_keyboard_flag_actually_submits` | booth-dev | 5/5 pass | 1 failure | +| `test_a_failed_save_says_so_reloads_and_never_re_posts` | design-dev | 3/3 pass | 1 failure | +| `test_the_review_keys_judge_in_place_and_stay_out_of_the_note` | design-dev | 10/10 + 5/5 pass | 1 in ~9 | + +Three different tests points at **the environment under contention**, not at any +one test. That is a direction, not a finding. + +## Two real defects found chasing it — NEITHER PROVEN TO BE THE CAUSE + +1. **A keypress race.** The flag test fired `ArrowRight` and `f` back to back, + assuming the first had finished — but `focus()` does a `scrollIntoView`, so + under load `f` could arrive with no cursor set. Now waits for + `figure.item.is-cursor`. +2. **A port TOCTOU in BOTH browser fixtures.** Each did `bind → getsockname → + CLOSE → hand uvicorn the port NUMBER`, leaving a window for the kernel to + give that port away — and this suite runs two browser files that each start a + server per test, so the competitor is the other file. The bound socket is now + passed to `server.run(sockets=[sock])`. + +**Since those fixes: one failure in three full runs. n=3 CANNOT distinguish +that from the prior rate, and no claim of improvement is made.** + +## Who owns it and what the method is + +**The operator ruled: "let him diagnose it properly."** design-dev owns it. His +method: a trace hook keeping a Playwright trace (screenshots + DOM snapshots) +for every browser test that fails, captured **from the run that fails**, then +full-suite runs until red and the artefact decides. Test-only infra, on his +branch as its own commit. + +⚠ **The methodological trap, and why the artefact must come from the full +suite:** the failure only reproduces there. A narrowed repro that passes proves +nothing and will be mistaken for a fix. diff --git a/persistent-memory.md b/persistent-memory.md index fed01c0..518732e 100644 --- a/persistent-memory.md +++ b/persistent-memory.md @@ -1,6 +1,6 @@ # Persistent memory — booth -_Last updated: 2026-09-22_ +_Last updated: 2026-09-23_ > **Always check for `/tmp/booth-dev-handoff.md`** — if it exists and its > `Written:` stamp is under 8 hours old, read it (it carries the in-flight @@ -17,213 +17,69 @@ loop it turned out to actually be. ## Current state / in-flight -_As of 2026-09-22:_ +_As of 2026-09-23:_ -- **U6 SHIPPED (`v0.6.0`) with a late fix (`v0.6.1`). PUSHED.** `main` and both - tags are on `origin` as of 2026-09-22 — the tree is no longer single-copy. - ⚠ **That "PUSHED" was already stale when written**: `2f85692` (the - no-announcements ruling) landed after it and sat unpushed until 2026-09-22 - night. **Do not trust a "pushed" row — run `git rev-list --count - origin/main..HEAD`.** A push is a point in time; this file is not. - → `persistent-memory.d/2026-09-22-u6-benches-released.md` -- **THE OPERATOR RULED ON EVERYTHING OUTSTANDING (2026-09-22, "accept all - recs").** Four of five settled and executed; one blocked by the permission - layer. Nothing is waiting on him. → - `persistent-memory.d/2026-09-22-operator-ruled-on-the-open-five.md` -- ✅ **U7 IS LANDED — ALL SEVEN v1 UNITS ARE IN.** The fourth component - (filename-prefix groups) is built; `test_no_group_rail_is_shipped_yet` was - deleted in the same commit, as required. - → `persistent-memory.d/2026-09-22-u7-landed-and-a-table-that-did-not-reproduce.md` -- ✅ **RELEASED `v1.0.0b1` — the first 1.x release, staged as a BETA** (operator, - 2026-09-22: "cut 1.0 beta 1"). Feature-complete, no new features, remaining - work is bugs. `1.0.0` final is cut when the beta survives. - **PUSHED — `main` and the annotated tag are on `origin`; ahead 0, behind 0.** - → `persistent-memory.d/2026-09-22-v1-staged-as-a-beta-and-a-second-copy-of-the-version.md` -- ⚠ **`booth/__init__.py` IS A FOURTH STDLIB-ONLY MODULE** and nothing said so - until now — `scripts/booth` executes it before every one of the documented - three. Now covered by `test_stdlib_only`. Same detail file carries why - `importlib.metadata` is the WRONG version source in this repo. -- 🛑 **ROUND 1 RULED NOT-AS-SHOWN, AND THE SCOPE FENCE WAS OURS** (operator, - 2026-09-23): *"He didn't go far enough, still looks like the booth. I want him - to consider the flow and the requirements — design touches, layout, usability - all belong to him."* **The handoff's "what we are not asking for: layout - changes driven by information architecture" paragraph is VOID** — design-dev's - "class additions only, no reordering" was that constraint honoured, so the - ruling corrects OUR brief, not his round. Flow, layout, usability and the - requirements are his; the IA is no longer fenced off. Two tiers survive: - correctness (deterministic order, autoescape, blur-admits-cosmetic, restart - discipline) and engineering defaults he may now ARGUE with (no-JS gallery, - virtualization parked, compare mode deferred) — tier-2 disputes go to the - operator, not settled between agents. Relayed in full; questions 2 and 3 - (voice, emblem) remain UNANSWERED and were not answered on his behalf. - ⚠ **Calibration for the next round: his bar is "did anything change when I - opened it".** He said the Booth "kind of looks the same" about our own U7 - navigation work, before ever seeing the design round. -- 🔶 **THE DESIGN ARC IS MID-FLIGHT AND design-dev IS BUILDING IN TWO MERGES.** - First: **Reveal all + the booth-blur control** (re-sequenced to first because - the operator said per-booth blur became important). Second: the Desk row - revisions + the theme toggle. Each gets its own bug-hunt; he pings at each - handover and **we merge and restart**. -- ✅ **BOOTH-LEVEL BLUR: STORAGE AND CLI ARE LANDED; ONLY THE UI IS PENDING.** - Marker `/.blurbooth`, `POST /b//blurbooth`, and - **`booth blur ` with NO files fogs the whole booth** (naming files is - still per-item). COMPOSES with `.blurred`, never overrides. All 17 handles can - self-blur at post time, which is the durable fix. -- ⚠ **THE DESK EXPOSES 84 IMAGES ACROSS 22 BOOTHS on the page he opens first** - (measured 2026-09-23). The pre-redesign index showed ONE cover per booth, so - four-up multiplied exposure by four and **nothing posted before the redesign - opted into it.** That is why blur got re-prioritised. +- 🛑 **THE ONE THING BLOCKING: design-dev's blur merge is HELD, awaiting his + ping.** `design-dev/svos-retheme` @ `5ded5ff` (Reveal all + the booth-blur + control) is fetched, merge-tree against `091f4b5` is CLEAN, and his commit + records the contract panel 4/4 folded, 14/14 mutations, 765 passing — + **but the heid code-review and bug-hunt panels were dispatched 17:53 and are + NOT folded.** He said explicitly: *"Hold… I will ping 'merge it' when both + are folded; whoever picks it up after a clear should look for that ping before + merging."* **DO NOT MERGE IT WITHOUT THAT PING.** The operator's "merge + everything" predates this and was not about overriding his gate. +- 🔶 **After that ping: merge, restart, verify 30 booths.** Then his SECOND + merge (Desk row revisions + the dark/light/system theme toggle) follows the + same way. +- ⚠ **THE BROWSER SUITE IS FLAKY UNDER LOAD AND IT IS NOT FIXED.** Three + different tests, one failure each, all passing in isolation. Two real defects + were fixed chasing it and NEITHER is proven to be the cause. **Do not read a + green suite as proof.** Operator ruled design-dev diagnoses it properly. + → `persistent-memory.d/2026-09-23-the-browser-suite-is-flaky-under-load.md` +- ✅ **THE REDESIGN IS LIVE.** R2 (the Desk, the lightbox, the reel) merged and + deployed; release/wipe moved onto the facts line. 30 booths at 200. +- ✅ **BOOTH BLUR: STORAGE, ROUTE AND CLI ARE LANDED — ONLY THE UI IS PENDING** + (it is what `5ded5ff` holds). Marker `/.blurbooth`, `POST + /b//blurbooth`, and **`booth blur ` with NO files fogs the whole + booth**. COMPOSES with `.blurred`, never overrides. All 17 handles can + self-blur at post time. +- ✅ **THUMBNAILS ARE LIVE.** 77.5 MB → 0.78 MB on the biggest gallery; the Desk + ~100 MB → 1.12 MB. Four surfaces (tile, Desk strip, flag tray, filmstrip); the + review stage keeps the original. + → `persistent-memory.d/2026-09-23-the-cache-that-aged-the-thing-it-cached.md` +- ✅ **CREATION + UPDATE DATES ARE ON THE RECORD** for all 30 booths + (`created_at` via `statx`, `landed_at` already existed). design-dev renders + them when his sequencing reaches it; **None must render as nothing.** + → `persistent-memory.d/2026-09-23-dates-and-the-guess-wearing-a-facts-clothes.md` +- ⚠ **THE DESK EXPOSES 84 IMAGES ACROSS 22 BOOTHS on the page he opens first.** + The pre-redesign index showed ONE cover per booth; four-up multiplied exposure + by four and nothing posted before the redesign opted into it. ⚠ **The operator declined to blur the `sindra-nude-*` booths for now** — he - will do it himself once design-dev's control lands. **Do not blur them on his - behalf.** -- ✅ **RULINGS 2026-09-23:** `×` (wipe) **hides** with the other Desk controls - on hover; the theme toggle **reaches** `.bk-ask` chrome inside verbatim pages; - global unblur is **reading A** (per-booth, tab-scoped, nothing persisted); - **no `1.0.0` yet.** - ⚠ The hover ruling looked like it reversed design-dev's "nothing hides behind - hover" argument; he resolved it WITHOUT an overrule via - `@media (hover: hover)` — hidden-until-hover only where hover exists, own line - on touch. Do not re-raise it as a conflict. -- ✅ **ALL FOUR FLOW RULINGS ARE IN — A+B, compare THIS ARC, plain voice, no - emblem** (operator via Miranda D-0016, 2026-09-23 08:07). Every one took - design-dev's recommendation; no notes attached. **booth-dev is the SOLE RELAY - — the operator will not brief design-dev directly.** Verbatim copy at - `docs/rulings/2026-09-23-flow-direction.json`. - → `persistent-memory.d/2026-09-23-the-flow-rulings-and-what-they-cost-the-beta.md` -- ⚠ **ANSWERING A PICK REMOVES THE HOLD THAT PROTECTED THE RECORD.** A booth is - held while a question is OPEN; the moment it is answered it becomes the record - of a decision and stops being held. Both design booths hit this, by different - routes (one withdrawn, one answered). **Capture a ruling into git, not into a - booth.** Raised to design-dev as a flow question rather than patched. -- ⚠ **`v1.0.0b1`'s "no new features" PREMISE IS SUPERSEDED.** The arc now - contains a flow redesign and compare mode. The tag stays as written (it - records what was believed, not a claim about now), an alpha drop-back is - ILLEGAL (`1.0.0a2` < `1.0.0b1`), and no further pre-release is cut until the - arc lands. **Whether `1.0.0` waits for the redesign is UNDECIDED and his.** -- 🔶 **ROUND 2 IS UP AND FOUR RULINGS ARE WITH THE OPERATOR** — booth - `booth-flow-concepts`, ask `flow`: direction / compare / voice / emblem. - Three directions (Desk, Reel, Bench), six screens each in dark+light, plus a - README stating eight requirements measured from the live booths. design-dev - recommends **A+B** (Desk with the Reel as its review mode), **compare in this - arc**, **plain-and-direct copy**, **no emblem**. He withdrew his own round-1 - `svos` ask as superseded — he did NOT answer anything on the operator's - behalf. -- ✅ **`booth-svos-retheme` IS KEPT** — design-dev ran `booth keep` after we - flagged that withdrawing his ask had removed the last hold. Round 1's renders - stay one click away while the operator chooses; he releases it once `flow` is - ruled. -- ✅ **ORDERING REVIEW DONE FOR ROUND 2's SURFACES** (he asked before building). - His **ordinals rule improves invariant 6** — an ordinal that counts across ALL - items makes "#07" stable under every filter, where today "the third one" is - ambiguous the moment a filter is on. + will do it himself once the control lands. **Do not blur them on his behalf.** +- 🛑 **NO `1.0.0` YET** (operator, 2026-09-23). The tag stays `1.0.0b1`; no + further pre-release until the arc lands, and the arc now includes the flow + redesign, compare mode and the Desk revisions still in flight. ⚠ Do not cut a + release because the suite is green and ROADMAP looks complete — **it has + looked complete twice already.** +- 🔶 **COMPARE MODE (r3) is ruled INTO this arc** and unparked; design-dev + starts it after the two merges land. The item-record work it needs is ours, + not deferred — he tells us what a compare view wants from `booth_items`. +- 🛑 **STANDING: NO ANNOUNCEMENTS out of this repo until the whole arc is done, + and the operator sends that one himself.** Do not offer, draft-and-await, or + raise it. +- ⚠ **`booth/__init__.py` IS A FOURTH STDLIB-ONLY MODULE** — `scripts/booth` + executes it before every documented one. Covered by `test_stdlib_only`. +- ⚠ **Read the staged ref, never a SHA written here** — design-dev rebases and + rewrites it in place. `git show-ref | grep svos`, then `git merge-tree`. +- **770 green on a clean run; 49+ falsifiers proved across three mutation + tables (`scripts/mutation_check.py`). Tree clean, pushed, 0 ahead.** - ⚠ **One correction we sent was WRONG, and the record is corrected here rather - than left to be re-asserted.** We read his "SET order" as "the order they were - set in" and told him it was already `(created, id)`. He meant **the SET's - order — by tile number.** Those genuinely differ: flag #15 then #07, and - today's panel lists #15, #07 while his tray lists #07, #15. His rule is also - cleaner than ours — the flag set sorted by its target's position in - `sorted(rel)` is a **total order needing no tie-break, because rels are - unique.** Do not re-raise the tie-break point; it was our misreading. - - The correction that held: **"last activity" must reuse `_newest_mtime`**, - whose `.lock` exclusion is load-bearing — a naive `max(mtime)` lets a no-op - mark POST float a dead booth to the top. Taken, with no second definition of - activity on the Desk. -- 🔶 **SVOS CONCEPT ROUND IS UP AND THREE RULINGS ARE WITH THE OPERATOR** - (booth `booth-svos-retheme`, ask id `svos`: ship / voice / emblem, all three - with design-dev's recommendation attached). **Nothing from us gates it and - the branch must NOT be merged until he pings after the rulings.** - Branch `refs/heads/design-dev/svos-retheme` is fetched into this repo as an - **inert ref** — nothing checked out, `main` clean, merge-tree clean. - ⚠ **DO NOT TRUST A SHA WRITTEN HERE — READ THE REF.** He rebases onto our - `main` and rewrites the ref in place; it has already moved `878ed86` → - `a99b7bb` (rebase onto `1826d19`, plus the scroll-margin fix). Merging a SHA - copied out of this file would merge a pre-rebase branch. Same class as the - stale "PUSHED" row and the stale postbox-mode note: **this file records what - was true when written, and a moving ref is not that.** Run - `git show-ref | grep svos` and `git merge-tree --write-tree HEAD `. -- 🔶 **THE FIXUP HOLD IS PARTIAL, NOT BLANKET.** `booth/templates/booth.html` - is **RELEASED** — design-dev does not touch it, so bug-hunt findings there - land immediately. **HELD** while his branch is out: `base.html`, `view.html`, - `doc.html`, `embed.js`, and `app.py`'s `FAVICON_HREF`. -- ⚠ **A REAL LATENT CSS DEFECT, FOUND BY design-dev, ASSIGNED TO HIS REWRITE.** - `base.html` reads `--line` / `--bg` / `--fg` / `--muted` and **defines none of - them**; 15 of those uses carry no fallback (lines 281-314). `border:1px solid - var(--line)` with the var undefined is invalid at computed-value time, so the - WHOLE border declaration drops — the keep/blur/reveal buttons have had no - border and a transparent background. The U7 rail above them reads the same - names WITH fallbacks, which is why the rail looks deliberate and the buttons - never did. **Do not fix on `main`** — it is the one file he is rewriting. -- ⚠ **A `postbox send` note is a point-in-time snapshot, NOT a durable fact.** - The send said `design-dev: pull-only`; `postbox handles` says `push - reachable`, and he replied in-session. Read the mode from `postbox handles`. -- ⚠ **U7'S CONTRACT CARRIED A MEASUREMENT THAT DID NOT REPRODUCE**, and it was - the number the scope departure rested on. The stated rule gives 24 and 27 - groups where the table claimed 5 and 1; the table was assembled from two - different heuristics. **A cold contract-review panel cannot catch this** — the - artifact is internally plausible. Re-run any measurement a contract's scope - rests on before implementing it. Same detail file. -- ⚠ **A MUTATION HARNESS NEEDS A GREEN BASELINE AND CACHE DEFEAT**, or it - certifies falsifiers without running them. Both defects bit in one session. - → `persistent-memory.d/2026-09-22-a-mutation-harness-that-certified-a-broken-test.md` -- **648 tests green; 12/12 U7 falsifiers mutation-proved. Deployed; 21/21 - booths 200.** ⚠ The set churned again mid-session (19 → 21). -- ✅ **THE MUTATION HARNESS IS NOW `scripts/mutation_check.py`** (operator, - 2026-09-22: "keep the harness"). Tables in `tests/mutations/*.toml`, one per - unit — **add a unit by adding a file, never by editing the script.** It has - its own positive and negative controls in `tests/test_mutation_check.py`, - including a known-vacuous falsifier it must catch. **When you write a - `*Falsifiable:*` line, add its row and run it** — a falsifier nobody has run - is a claim, not a test. -- ✅ **THE BUG-HUNT PANEL LANDED AND IS TRIAGED** (`397ea89`): six defects fixed, - two accepted known risks, one held for design-dev. **660 green, 20/20 - mutation-proved, deployed, 21/21 booths 200.** - → `persistent-memory.d/2026-09-23-the-bug-hunt-panel-and-five-vacuous-falsifiers.md` -- ⚠ **BROWSERS MATCH A URL FRAGMENT RAW FIRST, decoded only second.** So a raw - rel on BOTH the anchor and the id is not "unencoded", it is AMBIGUOUS, and the - jump can land on the WRONG artifact. Encoding one side just moves the - collision — **both sides must use `Item.url`.** Same detail file. -- ⚠ **FIVE VACUOUS FALSIFIERS IN U7 ALONE**, three arms finding the same one - independently. A guard-strength pass is the highest-value part of a panel on a - well-tested diff; the findings sit in the gaps the code comments are most - confident about. -- 🛑 **STANDING RULING — NO ANNOUNCEMENTS OUT OF THIS REPO, AND THE OPERATOR - SENDS THE EVENTUAL ONE HIMSELF** (operator, 2026-09-22). Verbatim: *"no - announcements until the entire arc is done, and even then i'll do it myself."* - Two clauses, both binding: **(a)** no althing announcement of any kind ships - from booth-dev until the v1 arc is COMPLETE — not per-unit, not at the 1.0 - tag, not "just the peers who consume it"; **(b)** when the arc IS done, the - announcement is HIS to send, not a thing to ask permission for. This is - STRICTER than `~/.claude/CLAUDE.md`'s broadcast gate, which merely requires - approval — here the send is not the agent's to make at all, so *asking* is - also out of scope. Do not offer, draft-and-await, or surface it as a pending - decision; it is settled and not a standing question. - **The 17-handle `booth link` note is consequently REASSIGNED, not blocked.** - The full draft + recipient list stays at - `docs/pending/fleet-note-booth-link-refusal.md` as MATERIAL FOR HIM. It is no - longer an open loop, no longer awaiting approval, and no longer a thing to - raise. Same for anything U4's `keep`-semantics change would have warranted - telling peers. -- ⚠ **NOT SEEDED, and this survives the blanket ruling.** "No seeding yet" was a - SPECIFIC prior instruction, not a recommendation of mine, so "accept all recs" - does not override it. `.benches.json` does not exist in `~/booth-data`. -- **A U7 directive (D-0011) misrouted to infra-ops and is SUPERSEDED.** Miranda - confirmed directly. Nothing to act on. - → `persistent-memory.d/2026-09-22-a-directive-misrouted-by-pane-title.md` -- ⚠ **THE 17 CONSUMING HANDLES WERE NEVER TOLD that `keep` stopped meaning - "waiting on an answer"** — and the note above does not tell them either; it is - about `booth link`. **This CHANGES HOW THE 2026-10-06 RE-COUNT READS**: a flat - `.forever` rate does NOT falsify the diagnosis. -- **Two dated predictions pending, not to be run early.** U5's adoption - re-measure **2026-09-29**; the `.forever` re-count **on or after 2026-10-06**. -- **FIVE `/heid*` methodology proposals sit with the operator**, untracked by - his choice. -- The booth set churns hard: 26 → 24 → 25 → 23 → **19**. Re-count rather than - trusting any number here. ## Recent decisions +- `[2026-09-23]` ✅ **The four flow rulings, and what they cost the beta** — all four taking design-dev's recommendation; READ BEFORE CUTTING ANY RELEASE, because `v1.0.0b1`'s "no new features" promise no longer describes the arc and an alpha drop-back is illegal → `persistent-memory.d/2026-09-23-the-flow-rulings-and-what-they-cost-the-beta.md` +- `[2026-09-23]` ✅ **Creation dates came from a syscall, after three guesses wearing a fact's clothes** — READ BEFORE REACHING FOR A PROXY; the system already recorded what looked unavailable, and one of the rejected proxies was a shape we had just finished paying for → `persistent-memory.d/2026-09-23-dates-and-the-guess-wearing-a-facts-clothes.md` +- `[2026-09-23]` ⚠ **The browser suite is flaky under load — OPEN, owned by design-dev** — three tests, two real defects fixed, NEITHER proven causal; do not read a green suite as proof → `persistent-memory.d/2026-09-23-the-browser-suite-is-flaky-under-load.md` - `[2026-09-23]` ⚠ **The cache that aged the thing it cached** — thumbnails 77.5MB→0.78MB; READ BEFORE PARKING ANYTHING ON A MEASUREMENT (we counted images and the cost was in bytes), and BEFORE PUTTING A SERVER-WRITTEN CACHE INSIDE A BOOTH (excluding its contents does not stop it aging the booth) → `persistent-memory.d/2026-09-23-the-cache-that-aged-the-thing-it-cached.md` - `[2026-09-23]` ⚠ **The probe that nearly dismissed a live injection vector** — the link board rendered `javascript:` hrefs; READ BEFORE TRUSTING A NEGATIVE RESULT FROM AN OBVIOUS PROBE, and before assuming an existing scheme check is the guard you are looking for → `persistent-memory.d/2026-09-23-the-probe-that-nearly-dismissed-a-live-vector.md` - `[2026-09-23]` ✅ **The bug-hunt panel found six defects and five vacuous falsifiers** — READ BEFORE BUILDING ANY FRAGMENT ANCHOR (browsers match raw before decoded, so both sides must be encoded), and before trusting a well-commented diff's guards → `persistent-memory.d/2026-09-23-the-bug-hunt-panel-and-five-vacuous-falsifiers.md`