docs: localisation slice 2 CLOSED (controller v0.254.0) — R-577, R-578, and a probe rule
gates / gates (push) Successful in 23s

10-localisation.md §10.3: the saved notes follow the box language at write time, with the
one-night consequence stated rather than hidden; the globe, and the table of WHO reads which
page and where its globe posts — getting that wrong makes the button do nothing, which it did
on /recovery until the live probe found it. Decision 6 superseded a second time; decision 8
(a claim carries the visitor's language) recorded. Decision 5 of §11's anonymous-surface line:
changing what a VISITOR reads is within what an anonymous request may do; changing anything the
household owns is not, and POST /lang can do only the first.

R-578 — the deadlock, and why it is a row rather than a fixed bug: UpdateOffboxStatus holds the
settings write lock while running its callback, boxLang() wants the read lock, sync.RWMutex is
not reentrant. On a real box an off-site run would have hung FOREVER holding that lock. The
symptom was a test suite going from 8 minutes to a 25-minute timeout. Fixed and guarded, but the
guard covers one package and three helper names; the class needs a gate.

R-577 — a guest share visitor still has no way to pick a language, and the household's setting
is the wrong default for a stranger. Deliberately left, pinned by a test, and the operator's to
decide because it is a promise the share feature makes.

.claude/rules/live-probes.md, unconditional: never send a deploy request for an app that is not
installed, not even expecting a refusal — the endpoint accepts first and validates later. Two
sessions made that mistake in two days, the second WITH a prompt line forbidding it. A prompt is
read once; a rule file is loaded every session.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-18 14:31:49 +02:00
parent ed0b0f5c92
commit 95c10954ae
10 changed files with 374 additions and 43 deletions
+32 -41
View File
@@ -1,55 +1,46 @@
# STATUS — what works, what's broken, what's next
**Updated 2026-09-18 (evening) — the sentences the program writes now follow the language, error messages included.**
**Updated 2026-09-18 (night) — the language work is finished, and the switch is now a globe.**
> **Ready for a volunteer: yes, unchanged.** A Hungarian household sees exactly what it saw
> yesterday. I did not read the pages to decide that — I compared them, letter by letter.
> **Ready for a volunteer: yes.** A Hungarian household sees what it saw yesterday, apart from one
> deliberate change: the two small "Magyar / English" links at the bottom of the menu are now a globe.
**Decisions I took.** None you have to reverse. One choice you were asked for stayed on its own
stated default: notes saved to disk overnight will be written in the box's language at the time they
are written, so a household that switches sees last night's note in the old language until the next
run. That is what the plan says happens if nobody decides.
**Decisions I took.** One you were asked for, taken on its own stated default: **if someone switches
the claim page to English and then claims the box, the box becomes English.** They chose it, and the
first screen they see should be in it. You can reverse it; nothing else depends on it.
**What I did.** Two releases. The first moved the sentences the program writes into the pages — the
little green line after you press a button, the yellow banners, the country names, the answers the
page fetches in the background. The second did the **error messages**: about 180 sentences that are
written deep inside the program and printed by whatever catches them. All of them now travel with a
short code, so the page that shows them writes them in your language. **None are left in Hungarian
only.**
**What I did today.** Three releases, and the language job is done.
**My mistake, and what I did about it.** My first test of an error message asked the box to install an
app with nothing filled in, expecting a refusal — and it installed the app instead, because that
particular one needs nothing filled in. **This is the same mistake the session before mine made and
wrote down, and I repeated it.** I stopped the app and removed it the way a customer would, with its
data, and checked: no container, no folder, no leftover storage. The 23 apps that should be running
are all running. The real lesson is sharper than "pick a different app": that button accepts first and
checks afterwards, so it cannot be used to test a refusal at all. The tests were rewritten to use
requests that are refused before anything is created.
1. The sentences the program writes into the pages.
2. The error messages — about 180 of them, written deep inside the program.
3. Today's last piece: **the notes the box saves overnight**, and **the globe**.
**How I know Hungarian did not change.** A check freezes every Hungarian sentence as it stood before I
started — 7 467 of them — and refuses any that is not exactly that, down to a comma. Then on the box:
ten Hungarian pages before and after, six identical, the other four differing only in a clock ticking
over, an app unhealthy for a minute, and the "update available" line.
**The globe.** Two text links at the bottom of the menu asked you to recognise two words as links,
and they wrapped. Now there is one globe — the symbol everyone already reads as "language". Click it
and a small list opens: Magyar, English, with the current one ticked. **The sign-in page and the claim
page have it too**, which matters: someone who cannot read Hungarian could not previously find their
way out of Hungarian before signing in. Their choice is kept in their own browser only — it never
changes what the household has chosen, and a signed-in household never picks up a stranger's choice.
**Two things went wrong in my own tools, and I am naming them rather than tidying them away.** My
bulk converter quietly dropped the second half of sentences that were written across two lines — seven
of them — and **the freeze-check did not notice**, because each surviving half really was a real old
sentence. What caught it was two tests that read the sentence a customer would see. And my counting
script ignored capital letters, so it told me "none left" while five were. Both are written down with
a number.
**One thing to expect, and it is the choice you were offered.** The notes saved overnight are written
in the box's language at the moment they are written. If you switch language, last night's note stays
in the old language until the next night rewrites it.
**What is left.** The notes saved to disk overnight — one more release. Plus a handful of small gaps,
each with a number.
**What broke, and what I did about it.** **I introduced a freeze.** The code that writes the overnight
note asked the box "what language are you?" at a moment when that question could not be answered —
and it would have hung there **forever, holding a lock the rest of the box needs**. On a real machine
an overnight cloud backup would have stopped and taken everything else with it. The test run caught it
by taking 25 minutes instead of 8. It is fixed, and there is now a check that names the exact line in
a second instead of hanging. I also found and fixed a second one before it shipped: the recovery
screen's globe would have looked like it worked and done nothing.
**Rows.** One closed, five opened across the day. The register went from **264** to **269** open rows.
**Rows.** One closed (the whole language job), two opened. The register went from **269** to **271**.
**The floor is raised, as you asked.** The fleet minimum went from 0.250.0 to **0.253.0**. The N100
demo box took it by itself in about twenty seconds and is healthy, with its other four apps still
running; the HP demo box already had it. **The two boxes that are switched off did not get it** — Peti's
has been off for 65 days on a much older version, and Tester 1 for a day. They will take it on their own
whenever they come back, which is how a floor always works, and neither has been tried on this version.
**Needs you.** Nothing. If you do nothing: the two sleeping boxes update themselves when they wake.
**Needs you — one decision.** **Raise the floor to 0.254.0?**
- **If you do:** every box gets the globe on its next check-in, and the saved notes start following
the language. The two sleeping boxes take it whenever they wake.
- **If you do nothing:** households keep the two text links. Nothing breaks, and nothing is at risk.
- I would raise it — this release changes what every household sees, and seeing it is the point.
---