15 KiB
15 KiB
Persistent memory — booth
Last updated: 2026-09-22
Always check for
/tmp/booth-dev-handoff.md— if it exists and itsWritten:stamp is under 8 hours old, read it (it carries the in-flight handoff from the previous session), then delete it. Older than 8 hours: stale — delete it unread.
Repo purpose
The Booth is the fleet's operator-review surface: agents post work by
making a folder under ~/booth-data, the operator looks at it and judges it in
the browser, and the judgment gets back to the agent that posted it. It was
built as a file-shuttle and is being converged, unit by unit, onto the review
loop it turned out to actually be.
Current state / in-flight
As of 2026-09-22:
- U6 SHIPPED (
v0.6.0) with a late fix (v0.6.1). PUSHED.mainand both tags are onoriginas of 2026-09-22 — the tree is no longer single-copy. →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 THE ONLY WORK LEFT, AND IT IS NOW UNBLOCKED. The three ratified
components (rail, filters, grid keyboard) are landed at
a306e2d. The fourth — filename-prefix groups replacing subfolder sections — is APPROVED and NOT yet built. That is the next session's first job. →persistent-memory.d/2026-09-22-u7-three-quarters-and-one-ruling.md - ⚠
tests/test_navigation.py::test_no_group_rail_is_shipped_yetIS NOW A STALE GUARD. It exists to stop an UNAPPROVED group rail; the rail is approved, so whoever builds it must DELETE that test in the same commit. It will otherwise read as a real invariant and block correct work. - 623 tests green. Tree clean and pushed. Deployed; 19/19 booths 200.
- 🛑 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-handlebooth linknote is consequently REASSIGNED, not blocked. The full draft + recipient list stays atdocs/pending/fleet-note-booth-link-refusal.mdas 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'skeep-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.jsondoes 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
keepstopped meaning "waiting on an answer" — and the note above does not tell them either; it is aboutbooth link. This CHANGES HOW THE 2026-10-06 RE-COUNT READS: a flat.foreverrate does NOT falsify the diagnosis. - Two dated predictions pending, not to be run early. U5's adoption
re-measure 2026-09-29; the
.foreverre-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-22]🛑 STANDING: no announcements out of this repo until the arc is done, and he sends that one himself — verbatim "no announcements until the entire arc is done, and even then i'll do it myself." Stricter than the house broadcast gate: the send is not the agent's to make, so asking is also out of scope. The drafted 17-handle note is REASSIGNED to him, not blocked — see the in-flight row above; do not raise it again.[2026-09-22]The operator ruled on all five open items at once — four executed incl. the first push; the broadcast was blocked by the permission layer and is drafted atdocs/pending/→persistent-memory.d/2026-09-22-operator-ruled-on-the-open-five.md[2026-09-22]U7 is three-quarters built and blocked on one word — the ratified three landed; the sections-vs-groups departure is NOT built and is the operator's call, tracked atdocs/contracts/u7_navigation.contract.md→persistent-memory.d/2026-09-22-u7-three-quarters-and-one-ruling.md[2026-09-22]An approved directive misrouted because pane_find addresses by a rolling pane title — resolved; the MECHANISM is the durable part, reported to infra-ops, untracked by booth-dev →persistent-memory.d/2026-09-22-a-directive-misrouted-by-pane-title.md[2026-09-22]U7 re-measured before scoping — sections are dead, filename prefixes are not — PRE-WORK ONLY, no unit started; read before writing U7's contract →persistent-memory.d/2026-09-22-u7-remeasured-before-scoping.md[2026-09-22]The last open defect closed, and building its falsifier found another — the wrong-shaped answer fixed at_hydrate;_safe_fragmentslost its natural trigger and its handler could not survive the failure it handled →persistent-memory.d/2026-09-22-a-wrong-shaped-answer-500s-the-gallery.md[2026-09-22]U6 released asv0.6.0— benches, and the number that was two defects — six of seven v1 units landed, NOT PUSHED →persistent-memory.d/2026-09-22-u6-benches-released.md[2026-09-22]Three cold panels on one unit, and what each lens could only see alone — READ BEFORE DECIDING TO SKIP A GATE; all five passes found something the others structurally could not →persistent-memory.d/2026-09-22-three-cold-panels-on-one-unit.md[2026-09-22]U6 landed — three surfaces, three jobs, one predicate — the seam review caught three real contract defects incl. a per-rowresolve_booththat would have 404'd the board →persistent-memory.d/2026-09-22-u6-benches-landed.md[2026-09-22]The 69% link-board rot was two defects wearing one number — READ BEFORE SCOPING ANY LINK-BOARD WORK; U5 closed the larger half and full-URL-vs-origin identity is a measured call →persistent-memory.d/2026-09-22-one-number-was-two-defects.md[2026-09-22]U3 landed — the page declares the seam, the Booth mounts into it — ten regexes against author HTML replaced by a substring test and a+→persistent-memory.d/2026-09-22-u3-declared-embed-seam-landed.md[2026-09-22]A wrong-shaped answer 500s the gallery and the marks page — PRE-EXISTING (measured at42ea67f), NOT U3; the v0.2.2 lesson is only half-implemented →persistent-memory.d/2026-09-22-a-wrong-shaped-answer-500s-the-gallery.md[2026-09-22]The browser became a test surface — READ BEFORE TOUCHINGplaywrightIN pyproject; the pinned upper bound is the foot-gun, and these tests SKIP rather than fail →persistent-memory.d/2026-09-22-the-browser-became-a-test-surface.md[2026-09-22]A vacuity pass that tries the contract's own mutation agrees with itself — U3 ran one, reported 7/7, and a cold panel then showed one of the seven was vacuous; READ BEFORE WRITING A Falsifiable: LINE →persistent-memory.d/2026-09-22-seven-of-seven-falsifiers.md[2026-09-22]U4 landed — lifetime is derived, not declared — three states, viewing is activity, and no new arithmetic anywhere →persistent-memory.d/2026-09-22-u4-derived-lifetime-landed.md[2026-09-22]The.foreverdiagnosis got a live positive control — 3 of the 4 booths awaiting an answer were ALSO hand-pinned — RE-COUNT 2026-10-06 →persistent-memory.d/2026-09-22-forever-had-a-live-positive-control.md[2026-09-22]No fleetwide notice for U4, and what that does to the prediction — READ BEFORE THE 2026-10-06 RE-COUNT; a flat rate does not falsify the diagnosis →persistent-memory.d/2026-09-22-no-notice-and-what-it-does-to-the-prediction.md[2026-09-22]Four independent paths to one fail-open delete — the bug-hunt panel's class, and the zsh word-splitting trap that shipped an empty bundle →persistent-memory.d/2026-09-22-four-paths-to-one-fail-open-delete.md[2026-09-22]Two reads of one file are not one read of one state — a TOCTOU seam that composes two correct readers into a fail-open delete →persistent-memory.d/2026-09-22-two-reads-are-not-one-state.md[2026-09-22]Five of seven INV falsifiers did not falsify anything — read before writing a Falsifiable: line; a green test cited one rather than being one →persistent-memory.d/2026-09-22-vacuous-falsifiers.md[2026-09-22]The third one-branch template miss — this repo's recurring blind spot; read before adding a fact to any template →persistent-memory.d/2026-09-22-third-one-branch-template-miss.md[2026-09-22]The size cap opened a service-wide hang — a FIFO has st_size 0; a bound that trusts it inherits what it does not mean →persistent-memory.d/2026-09-22-size-cap-opened-a-hang.md[2026-09-22]An existing test stopped me retiring documented behaviour — the clean fix for the mtime race would have silently changed TTL doctrine →persistent-memory.d/2026-09-22-doctrine-not-defect.md[2026-09-22]Two U5 panels, and prose reached a released outage — read the detail before assuming a conformance finding stops at its own module →persistent-memory.d/2026-09-22-u5-panels-reached-a-released-bug.md[2026-09-22]U5's adoption prediction split in two — the handle rides for free, the why must be learned — RE-MEASURE 2026-09-29 →persistent-memory.d/2026-09-22-u5-adoption-split-in-two.md[2026-09-22]The U2 bug-hunt panel was not ceremony — the lock-unlink race and the TTL guard that was failing at its own job →persistent-memory.d/2026-09-22-u2-bug-hunt-panel.md[2026-09-22]The lenient reader's blast radius was the whole service — marks_for runs per booth per index load; a raise there is an outage →persistent-memory.d/2026-09-22-lenient-reader-blast-radius.md[2026-09-22]booth marks/booth answergot real exit codes — read it before changing anything the 17 consuming handles call →persistent-memory.d/2026-09-22-cli-exit-codes.md[2026-09-22]scripts/boothwent from zero tests to five — they run the real script under system python3, so they also check INV-1 →persistent-memory.d/2026-09-22-scripts-booth-got-tests.md[2026-09-21]v0.2.0 was tagged while a gate was in flight — the sequencing lesson: if a gate is outstanding, the tag waits →persistent-memory.d/2026-09-21-v020-tagged-with-a-gate-in-flight.md[2026-09-21]A write over a damaged.marks.jsonwiped the booth — the reads-lenient / writes-strict asymmetry, and why it exists →persistent-memory.d/2026-09-21-marks-write-wiped-judgment.md[2026-09-21]Seam review and cold panel had zero overlap, twice — evidence for running both; neither substitutes for the other →persistent-memory.d/2026-09-21-two-gates-are-complementary.md[2026-09-21]Every code-changing finding came from the AMBIGUITY pass — a finding about the /heid-contract-review skill, not about this repo →persistent-memory.d/2026-09-21-ambiguity-pass-did-the-work.md[2026-09-21]Deterministic order is a cross-cutting v1 invariant — operator directive; read before adding ANY ordered surface →persistent-memory.d/2026-09-21-deterministic-order-invariant.md[2026-09-21]U2 (marks) landed — one primitive for three mechanisms — what moved where, and the HTTP mirror remote sessions poll →persistent-memory.d/2026-09-21-u2-marks-landed.md[2026-09-21]A partially-answered pick counts as OPEN — declared, not smuggled; it is the reading that makes U4 correct →persistent-memory.d/2026-09-21-partial-answer-counts-as-open.md[2026-09-21]The U2 seam review earned its place, and how — inline.place indexes by subscript — the miss a cold panel cannot see →persistent-memory.d/2026-09-21-u2-seam-review-earned-it.md[2026-09-21]Marks are one.marks.jsonper booth — operator decision with two rejected alternatives; read before restructuring →persistent-memory.d/2026-09-21-marks-storage-decision.md[2026-09-21]U7's section premise is half wrong — every booth that needs navigation is FLAT — read before starting U7 →persistent-memory.d/2026-09-21-u7-section-premise-half-wrong.md[2026-09-21]sindra-finalistsis U2's flag motivation, caught live — evidence, not argument →persistent-memory.d/2026-09-21-sindra-finalists-is-the-motivation.md[2026-09-21]The information architecture and the v1 gate landed — the single defect the seven units decompose →persistent-memory.d/2026-09-21-ia-and-v1-gate-landed.md[2026-09-21]The.foreverdiagnosis is a falsifiable prediction — U4's success criterion — re-count a fortnight AFTER U4 lands →persistent-memory.d/2026-09-21-forever-diagnosis-is-a-prediction.md[2026-09-21]Extracted fromeshpfiinto its own repo — test_booth.py is the regression net the v1 rewrite is checked against →persistent-memory.d/2026-09-21-extracted-from-eshpfi.md
Tried and abandoned
[2026-09-21]Tagging a release while a review gate was in flight — cost a same-hour v0.2.1 and a correction to 15 handles →persistent-memory.d/2026-09-21-tagging-with-a-gate-in-flight.md[2026-09-21]Letting the write path share the read path's leniency — a tolerant reader and a tolerant writer are not the same decision →persistent-memory.d/2026-09-21-tolerant-writer-over-tolerant-reader.md[2026-09-21]Letting Jinja hot-reload templates in the deployment root — caused a live outage: 19 of 25 booths at 500. Why auto_reload=False →persistent-memory.d/2026-09-21-jinja-hot-reload-outage.md[2026-09-21]Five mechanisms to get one question beside one artifact — the accretion signature this whole v1 rewrite is undoing →persistent-memory.d/2026-09-21-five-mechanisms-one-job.md[2026-09-21]Regex-injecting chrome into arbitrary author HTML — the defect U3 exists to close →persistent-memory.d/2026-09-21-regex-injecting-chrome.md[2026-09-21]A boolean escape hatch as the lifetime mechanism — why.foreveris a symptom; the defect U4 exists to close →persistent-memory.d/2026-09-21-boolean-escape-hatch-as-lifetime.md[2026-09-21]Letting the link board absorb the announce job — 69% rot; U5 gave the job a home, which is what unblocks U6 →persistent-memory.d/2026-09-21-link-board-absorbing-announce.md