Files
felhom-agent/REPORT.md
T
admin 7f07393623 docs: v0.76.0 CHANGELOG + REPORT + CONTEXT (GL-5b shipped, published)
AGENT_VERSION=0.76.0
AGENT_SHA256=9828c5f75e719fb2e1fc3523f9c322b595a963ec1dcdf37ca42a96bedab7f50b

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-08 09:55:19 +02:00

91 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# REPORT — v0.76.0: restore-test full-fidelity verification (GL-5b / G12) + publish
**Date:** 2026-07-08 · **Class:** risky/supervised implementation + live run + deploy + publish.
**Baseline:** `main` @ `5a72a4b5` (v0.75.0, live) → `b1697874` + docs. Closes GL-5 finding #2's
mirror image (REPORT v0.75.0 observation: the restore-test boot-verified scratch guests WITHOUT
their storage mpN). STOP honored: no 9201 restore target, no `-keep`, no PBS writes, no manifest
change (operator's).
## The operator values (Day-0 manifest — Configs → Day-0 artifacts)
```
AGENT_VERSION=0.76.0
AGENT_SHA256=9828c5f75e719fb2e1fc3523f9c322b595a963ec1dcdf37ca42a96bedab7f50b
GOLDEN_VERSION=0.103.0
GOLDEN_SHA256=8481e8a14e2aa0abe3831cc40e5aea4c32f2017e7561c15dca8a674df6a6026e
```
**0.75.0 was superseded UNPUBLISHED** (deliberate — one manifest bump, straight to 0.76.0). The
golden stays 0.103.0 (it ships the controller, not the agent — no re-bake).
## What shipped
- Restore-test params now derive from the **archive's own embedded config** via
`ExtractArchiveConfig` + `drRestoreOverrides` — the same derivation DR bring-up uses, because the
ARCHIVE is the object under test (the old path read the live source guest's config: wrong object,
and its bind-only overrides tripped PVE's drop-unlisted-mountpoints rule). Unreadable config /
unknown bind topology → refuse up front, no partial-guest "verification".
- **Mount-parity assert** (step 2b, pre-start): restored mpN set vs the archive's — missing,
mispathed, undersized, or extra mpN fails the test naming the delta. `MountParity` +
`MountInventory` added to the result and the hub wire record (additive JSON keys; older hubs
ignore them). Teardown still fires on a parity fail (launch-proven).
- Dead code deleted WITH its tests: `bindMountOverrides`, `archiveVMID`, the two volid regexes —
the restore-test was their only caller (§5's delete-or-justify: deleted; no dead lookalike stays
reachable). `throwawayVolumeOverride`/`rootfsSizeGB`/`mountPathOf` live on under
`drRestoreOverrides`.
- **Scenario D:** `bringup.go` had ZERO line changes — provision/DR behavior byte-identical, all
GL-5 tests green, the §13 DR re-run trigger did not fire.
## Tests
Scenario A (exact 5-param derivation from a 9201-shaped archive config; parity ok; 4-entry
inventory; scratch torn down), B (mp0 deleted from the restored config → FAIL naming `mp0 MISSING`,
guest never started, still torn down), C (extract-failure + unknown-topology refusals with zero
restore attempts), `mountParity` pure-function matrix (parity / missing / mispathed / undersized /
extra / trivially-empty). **Scenario-B red-proof** (run→fail→revert on the committed baseline):
with the 2b parity assert removed, the dropped-mount run PASSES silently — the test caught it
(FAIL), then reverted, all green. Full gate on Windows + 180/Linux: 23 packages ok.
## Live validation (felhom-pve)
Deploy: backup `felhom-agent.bak-0.75.0` → install → restart: active, v0.76.0, zero errors, no
ce9d rebind. First run FAILED honestly — the GL-5-era archive had been rotated out by retention
and `ExtractArchiveConfig` refused up front ("volume does not exist"; exactly the fail-fast the
design wants). Re-run against the current newest archive
(`vzdump-lxc-9201-2026_07_08-09_38_15.tar.zst`, 6.5GB):
- transcript: `full-fidelity restore params derived from the archive config … params=5`;
- pre-teardown `pct config 990000`: `mp0 …,mp=/var/lib/docker,backup=1,size=200G`,
`mp1 …,mp=/mnt/sys_drive,backup=1,size=50G`, `mp8`/`mp9` as 1G throwaways at the structural
paths, `rootfs …,size=32G`, no unusedN;
- record: `pass: true`, `mount_parity: "ok"`, `mount_inventory`: the 4 verified mpN,
`duration_seconds: 184.28`;
- scratch torn down; band clean.
**Runtime, honestly:** 3m4s total on the LOCAL tier — cheaper than the ~7m the GL-5 DR contrast
suggested (that 7m23s included DR bring-up's longer boot/verify chain; the extraction cost itself
for this guest's actual content is ~2 extra minutes over a data-less restore). The PBS tier will
be slower (WAN + decrypt); its generous `RestoreTaskTimeout` already exists spec-side. No fidelity
knob added per §12 — the runtime is the verification.
## Publish (GL-1 pattern)
The exact deployed bytes (`readlink /proc/$(pidof felhom-agent)/exe``/usr/local/bin/felhom-agent`,
`--version` = 0.76.0) published via `publish-agent.sh 0.76.0`: PUT 201, round-trip sha match, then
an ANONYMOUS fetch re-verify — sha identical end-to-end
(`9828c5f7…f50b` on the box, on 180, and via the anonymous customer-path proxy). Creds sourced on
the build server, never echoed.
## Observations
- The pinned-archive rotation (first live run) is a nice property in production: a restore-test
against a pruned volid refuses loudly instead of "verifying" nothing. The daemon's scheduled
restore-test resolves the newest archive itself, so cadence runs are unaffected.
- 9201's local backups ran 3× this morning (08:52/09:07/09:38) — the local cadence is busy; not a
GL-5b concern, worth a glance at retention math someday.
## NOT live-validated
C7-class parity firing on REAL drift (needs a deliberately mangled restore — GL-6 family); the PBS
tier's full-fidelity runtime; hub-side rendering of the new record fields (additive, ignored today).