memory: snapshot for context clear — the arc mid-flight, and the one thing that blocks
In-flight rewritten to what is actually live: design-dev's blur merge is HELD
at 5ded5ff awaiting his explicit 'merge it' ping (both panels dispatched 17:53,
unfolded), the redesign and thumbnails and dates are shipped, and the browser
suite is flaky under load and NOT fixed.
Two detail files added. The dates one is the reusable lesson: three plausible
proxies for a creation date were considered and one was nearly built, and the
real answer was a syscall away — the system already recorded what looked
unavailable. One of the rejected proxies was write-on-read, a shape this repo
had finished paying for hours earlier.
The flake entry is written as OPEN with its limits stated: three tests, two
real defects fixed, neither proven causal, and n=3 cannot show an improvement.
Recent decisions and Tried and abandoned preserved intact (49->51 by addition,
7 unchanged); the index is back under the soft cap at 141 lines from 285, all
of the reduction from settled history leaving the volatile section.
This commit is contained in:
@@ -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.
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user