Files
felhom.eu/documentation/tests/golden-0.230.0-2026-08-31/README.md
T
admin 2263245cf2
gates / gates (push) Successful in 17s
golden 0.230.0 baked, vouched, floor raised - demo-felhom moved itself off the R-403 build (R-410 filed)
GOLDEN_SHA256 9287f7cef5f13166276e8406005e3f28004004510c5184f1c1c7377f7aafad2e,
657 873 700 B. Evidence documentation/tests/golden-0.230.0-2026-08-31/.

WHY IT WAS OWED: the newest golden was 0.229.0, which IS the build R-403 says deletes a
good copy. Every fresh install and the whole fleet floor still carried it.
golden_currency_gate.py had been red across dddcc80, 6e550ae, 130f7a6 and 32a4c35.

THREE INDEPENDENT READERS agreed before anything was vouched: the bake's own print, the
round trip of the PUBLISHED bytes (HTTP 200, 657873700 B, same sha), and the hub's Day-0
dropdown reading Gitea on a different code path. And the delivered artifact names the
controller it will start - ./etc/felhom-controller-image read OUT of the downloaded
archive says felhom-controller:0.230.0, with 19382 entries under var/lib/felhom/docker/.

BOTH PRE-GATES were shown able to see something before their zeroes were believed: the
404 pre-gate, and the token-leak grep which returns 0 on the committed log and 1 on a
seeded throwaway copy. The transient unit's own properties were grepped for the token
too - 0, with the same seeded positive control returning 1. Acceptance markers counted on
the COMMITTED log: 1/1/1/1 present, 0/0 absent, and the zeroes are believable because the
same including-mount-point pattern returns two real lines on that file.

THE VOUCH IS A THREE-FIELD CHANGE and only one field moved, which is stated rather than
left to look careless: golden_version 0.229.0 -> 0.230.0; agent_version 0.130.0 and
min_agent 0.129.0 UNCHANGED because v0.230.0's CHANGELOG header says MinAgent 0.129.0 and
0.129.0 <= 0.130.0, so this is not the R-216 shape. The 303 flash was not treated as
proof - the page was re-read and golden_behind_fleet confirmed absent.

THE FLOOR is a separate setting and was raised on the operator's explicit answer:
min_controller_version 0.229.0 -> 0.230.0. THE POSITIVE OBSERVABLE, from the agent's own
journal on demo-felhom, which was still running the defective 0.229.0:
  16:21:30 controller-swap: image file written, restarting bootstrap  target=...0.230.0
  16:21:40 controller-swap: new controller healthy                    target=...0.230.0
Both boxes now 0.230.0 healthy. Honest note: the polling loop's first read already said
0.230.0, so the transition was not seen by the loop - the journal is the evidence.

R-410 FILED, found while the gate went green: golden_currency_gate.py is satisfied by a
DIRECTORY NAME (EVIDENCE_RE against os.listdir, :89,:123). I created the evidence
directory before the bake finished and the gate would have passed at that moment. It
already declares that it does not check the vouch; it does not declare that the bake
check is a filename check. Fix: read the GOLDEN_SHA256= line out of the directory's
bake.log, with a red-proof on an empty directory.

R-242 updated - seventh debt, paid the same day, twice in one day.

Teardown: pct destroy 9100 --purge, shred -u AFTER the log was copied out, poweroff,
qemu confirmed exited with ps -eo comm (not pgrep -f, which self-matches), disk reverted
to virgin.

All 13 gates green - the first push this session that needed no --no-verify.

Ceiling R-409 -> R-410.
2026-08-31 16:25:35 +02:00

141 lines
7.5 KiB
Markdown

# Golden bake 0.230.0 — 2026-08-31
Baked, published, round-trip verified, **vouched**, and the fleet floor raised. `demo-felhom` picked
up the new controller **by itself, unattended** — the agent's own journal is the proof, not an absent
error.
**Why it was owed:** v0.230.0 is the build that stops a poorer copy deleting a richer one (R-403).
Until this bake the newest golden was **0.229.0 — the build that has the defect** — so every fresh
install and the whole fleet floor still carried it. `golden_currency_gate.py` had been RED since the
v0.230.0 release and was red at `dddcc80`, `6e550ae`, `130f7a6` and `32a4c35`.
## What was produced
| | |
|---|---|
| `GOLDEN_VERSION` | **0.230.0** |
| `GOLDEN_SHA256` | `9287f7cef5f13166276e8406005e3f28004004510c5184f1c1c7377f7aafad2e` |
| size | **657 873 700 B** |
| package URL | `…/api/packages/admin/generic/felhom-golden/0.230.0/golden.tar.zst` |
| baked controller | `gitea.dooplex.hu/admin/felhom-controller:0.230.0` |
| `MinAgent` | **0.129.0** — read from the controller `CHANGELOG.md` header, not assumed |
| script | `build-golden.sh v3.0.0`, sha256 `7b0fb5cf…73b6a1` on DooPlex |
| venue | the drill VM on DooPlex, reverted to `virgin` and **cold-booted** first (`pve-manager/9.2.2`) |
| template | `debian-13-standard_13.6-1_amd64.tar.zst`, after `pveam update` — the virgin snapshot's INDEX is stale too, and that failure reads as a bogus `400 no such template` |
| archive volid | `local:backup/vzdump-lxc-9100-2026_08_31-16_15_14.tar.zst` |
| bake wall clock | ~16:11 → 16:15 CEST, `vzdump` leg 00:00:41 |
**One thing the 0.229.0 bake did that this one did not**, said plainly rather than left as an
implied equivalence: the script's sha256 was **not** compared across the hop. It was `scp`'d
file→file and its DooPlex-side sha is recorded above; a corrupted copy would have failed the bake
rather than produced a wrong golden, but that is an argument, not a measurement.
## Acceptance markers — counted on the COMMITTED log, not eyeballed
```
docker OK (overlay2 : 1
including mount point rootfs : 1 (line 317)
including mount point mp0 : 1 (line 318) <- there is no mp1 since v3.0.0 (R-165/R-233)
upload OK (HTTP 201) : 1 (line 324)
--- must be ZERO ---
excluding : 0
FATAL : 0
```
**The zeroes are believable because the greps are shown to work on this file:** the same
`including mount point` pattern that returns 0 for `excluding` returns 2 real lines. An instrument
that can silently drop results is not a measurement.
## Three independent readers agreed before anything was vouched
1. **The bake itself** printed `GOLDEN_SHA256=9287f7ce…ad2e`.
2. **The round trip** — the published bytes downloaded back: `HTTP 200`, `657 873 700 B`,
sha256 `9287f7ce…ad2e`. The hash is of the **downloaded** bytes, never the local file.
3. **The hub's Day-0 dropdown**, a different code path, read `data-sha="9287f7cef5f13166276e…"`
straight from Gitea.
**And the delivered artifact names the controller it will start**, read out of the downloaded
archive itself:
```
$ tar --zstd -xOf golden.tar.zst ./etc/felhom-controller-image
gitea.dooplex.hu/admin/felhom-controller:0.230.0
```
with **19 382** entries under `var/lib/felhom/docker/` — the baked image store is in the archive, not
a promise that it will be pulled later.
## Both pre-gates were proven able to see something first
| gate | negative result | the positive control that makes it believable |
|---|---|---|
| 404 pre-gate on the package URL | `HTTP 404` for 0.230.0 before the bake | the same URL shape returns `HTTP 200` for the controller image manifest, and the bake's own pre-delete logged `HTTP 404 (404/204 expected)` |
| token-leak grep on the committed log | **0** in `06-bake.log` and `06-bake-clean.log` | the token appended to a throwaway copy of the same log greps **1**; the copy was then `shred -u`'d |
The token was also kept off every command line: the transient unit's own properties were grepped for
it — `systemctl show golden-bake -p Environment -p ExecStart` → **0**, with the same seeded positive
control returning **1**.
## The vouch — a THREE-field change, checked rather than assumed
| field | before | after | why |
|---|---|---|---|
| `golden_version` | 0.229.0 | **0.230.0** | the new bake |
| `agent_version` | 0.130.0 | 0.130.0 | **unchanged** — already ≥ MinAgent |
| `min_agent` | 0.129.0 | 0.129.0 | **unchanged** — v0.230.0's CHANGELOG header says `MinAgent: 0.129.0` |
`min_agent` (0.129.0) ≤ `agent_version` (0.130.0), so this is **not** the R-216 shape the hub holds
against. Only one field actually moved, and that is stated rather than left to look like a one-field
vouch performed carelessly.
`POST /configuration/artifacts` → `303 Location: /configuration?flash=artifacts_set`. **The flash was
not treated as proof:** the page was re-read and the selected options confirmed
(`golden_version` selected 0.230.0, sha `9287f7ce…`), and the R-120 refusal banner
(`golden_behind_fleet`) confirmed **absent**.
## The fleet floor, and the unattended proof that it worked
`POST /configuration/global-floor` `min_controller_version` **0.229.0 → 0.230.0**, re-read from the
page afterwards. This is a **separate setting from the Day-0 artifacts** — the page says so itself —
and it is the one that moves the existing fleet rather than fresh installs.
**`demo-felhom` was on controller 0.229.0 — the R-403 build — and moved itself.** From the agent's
journal on that host, which is a POSITIVE observable and not a missing error:
```
16:21:30 controller-swap: image file written, restarting bootstrap target=…felhom-controller:0.230.0
16:21:40 controller-swap: new controller healthy target=…felhom-controller:0.230.0
```
**Honest note on the watch:** the polling loop's *first* read already said 0.230.0, so the transition
was not observed by the loop. The evidence is the journal above plus the container reading
`Up 8 seconds (healthy)` at that first read. Both boxes now:
```
demo-felhom gitea.dooplex.hu/admin/felhom-controller:0.230.0 Up (healthy)
demo-hp gitea.dooplex.hu/admin/felhom-controller:0.230.0 Up (healthy)
```
## Teardown — all of it, and it is not "nothing was created"
`pct destroy 9100 --purge` (both logical volumes removed), then `shred -u` of the token, the runner
script, `build-golden.sh` and `bake.log` **after** the log was copied out for evidence — `ls | grep`
in `/root` returns nothing. Then `poweroff`, waited for the qemu process to actually exit (checked
with `ps -eo comm`, **not** `pgrep -f`, which self-matches), and `qemu-img snapshot -a virgin`. The
disk carries the single `virgin` snapshot and nothing else.
## Files here
| file | what |
|---|---|
| `01-preconditions.txt` | disk headroom, image present, MinAgent, hub state before |
| `02-pveam.txt`, `03-template.txt` | the index refresh and the template download |
| `04-staged.txt`, `05-bake-launch.txt` | staging + the token-leak check on the unit properties |
| `06-bake.log`, `06-bake-clean.log` | the bake, raw and with the locale noise stripped |
| `07-teardown-vm.txt` | destroy, shred, revert to virgin |
| `08-roundtrip.txt`, `16-archive-content-proof.txt` | the published bytes, and what is inside them |
| `00-`, `10-`, `13-hub-*.html` | the hub configuration page before, after the vouch, after the floor |
| `09-vouch-post.txt`, `11-vouch-verified.txt`, `14-floor-raise.txt` | the two POSTs and their re-reads |
| `12-golden-currency-gate.txt` | the gate that was red, now green |
| `15-demo-felhom-selfupdate.txt` | the unattended pickup |