We read design-dev's '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 — which genuinely differs: flag #15 then #07 and today's panel lists #15, #07 while his tray lists #07, #15. His rule is also cleaner than the one we proposed. The flag set sorted by its target's position in sorted(rel) is a total order needing no tie-break at all, because rels are unique. The memory row now says so explicitly and tells the next session not to re-raise the point. Round 1's booth is kept; he releases it once the flow ask is ruled.
243 lines
24 KiB
Markdown
243 lines
24 KiB
Markdown
# Persistent memory — booth
|
|
|
|
_Last updated: 2026-09-22_
|
|
|
|
> **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
|
|
> 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.** `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.
|
|
- 🔶 **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.
|
|
|
|
⚠ **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 <ref>`.
|
|
- 🔶 **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 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`
|
|
- `[2026-09-22]` ✅ **v1.0.0b1 — the v1 target staged as a beta, and a version that was two copies** — READ BEFORE DERIVING A VERSION FROM `importlib.metadata` HERE; it reports a different artifact, and `booth/__init__.py` turns out to be stdlib-only → `persistent-memory.d/2026-09-22-v1-staged-as-a-beta-and-a-second-copy-of-the-version.md`
|
|
- `[2026-09-22]` ✅ **U7 landed — and the number that justified it did not reproduce** — all seven v1 units are in; READ BEFORE TRUSTING A MEASUREMENT INSIDE A CONTRACT, and before assuming a degeneracy guard covers the degeneracy you actually have → `persistent-memory.d/2026-09-22-u7-landed-and-a-table-that-did-not-reproduce.md`
|
|
- `[2026-09-22]` ⚠ **A mutation harness certified a broken test, twice, for two reasons** — no green baseline, and the pyc cache silently reverting same-size mutations; READ BEFORE WRITING ONE → `persistent-memory.d/2026-09-22-a-mutation-harness-that-certified-a-broken-test.md`
|
|
- `[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 at `docs/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 at `docs/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_fragments` lost 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 as `v0.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-row `resolve_booth` that 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 at `42ea67f`), 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 TOUCHING `playwright` IN 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 `.forever` diagnosis 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 answer` got 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/booth` went 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.json` wiped 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.json` per 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-finalists` is 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 `.forever` diagnosis 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 from `eshpfi` into 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 `.forever` is 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`
|