From 8d444166108a49b188a14e06376f01b5ec8fa09c Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Fri, 16 Oct 2026 10:09:52 +0200 Subject: [PATCH] REPORT + CONTEXT v0.318.0: build B live proof; R-1093/R-1094 filed Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb --- CONTEXT.md | 10 ++++++- REPORT.md | 77 ++++++++++++++++++------------------------------------ 2 files changed, 34 insertions(+), 53 deletions(-) diff --git a/CONTEXT.md b/CONTEXT.md index 56dfee8..fd75f1c 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -7,7 +7,15 @@ > > Ask Claude Code: "Please update CONTEXT.md with what we did today" -Last updated: 2026-10-15 (v0.316.x — the app page in one column; a version number is pushed once) +Last updated: 2026-10-16 (v0.318.0 — storage identity build B: the internal data place, partitions, R-1082, R-1084) + +> **2026-10-16 — v0.318.0 RELEASED; the global floor 0.318.0 / MinAgent 0.158.1 (set by the operator).** The internal data +> place („Belső tárhely", agent ≥ 0.158.1 reports kind `internal`): bound on one drive-gate tick, registered on the next as +> the default drive (web/internal_place.go); eject/decommission/wipe of it refused. Partitions in the format/attach wizards +> (agent `formattable`: only while nothing on the disk is mounted); the whole disk under a registered part refused +> server-side (`deviceBacksRegistered`). R-1084: the whole-box backup offer asks the same-disk question (`offerRelationFor`). +> R-1082: `/mnt/sys_drive` never offered (`withoutSystemVolume`, by device). Live on a fresh one-disk scratch box: felhom.eu +> `audits/storage-identity-buildB-2026-10-15/`. Next: R-1094 (the whole-disk refusal sentence), with the next release. > **2026-10-15 (late evening) — v0.316.0/.1/.2 built and on demo-hp; .3 committed, NOT built.** > **Measured before fixing:** the tabs rendered unstyled through the public address because of a diff --git a/REPORT.md b/REPORT.md index 73aed64..c1b41a4 100644 --- a/REPORT.md +++ b/REPORT.md @@ -1,69 +1,42 @@ -# REPORT — v0.317.0: a second copy counts only on a proven different disk; the no-drive install speaks in words (2026-10-15) +# REPORT — v0.318.0: the internal data place, partitions, an honest whole-box backup offer, sys_drive never offered (2026-10-16) Written in ASD-STE100 Simplified Technical English. Design read first: felhom.eu `architecture/16-storage-physical-identity.md` -(§3, §4, §5 D4, §8, §10, §11), `07-backup-architecture.md` §6, `09-update-architecture.md` (MinAgent), `03-host-agent.md`. -Task: storage identity build A (operator rulings D1–D6, 2026-10-15). Agent counterpart: felhom-agent v0.157.0. +(§4–§6, §9, §13), `07-backup-architecture.md` §6, `09-update-architecture.md` (MinAgent). Task: storage identity build B +(operator rulings D3–D5; sizes ruled 2026-10-16). Agent counterpart: felhom-agent v0.158.1. ## 1. Baselines -| Repo | `main` at start | at commit | -|---|---|---| -| felhom-controller | `9cc7ffcf3b` (brief) → `48d8674876` read | rebased onto `c6a5671` (v0.316.4) | -| felhom-agent | `d2053e7d47` | `52ed52c` (v0.157.0 released) | +controller `123d2d5` (v0.317.0) → `a43d042` + `36da408` = v0.318.0. MinAgent **0.157.0** (no new agent endpoint; the internal +place and the partitions appear only when agent ≥ 0.158.1 reports them). ## 2. What changed -- `internal/backup/backup.go`: `diskRelation` — the one „same disk?" decision; asks the agent through `SetDiskJudge`; an older - agent or an `unmapped` path keeps the st_dev rule (logged once). `offDriveCopyState` / `singleCopyWarning`: the notice by `16` §4, - skips a NAS (R-1075), i18n. -- `internal/backup/tier2.go`, `tier2_shares.go`: target choice — same disk never; unknown made, marked `Unproven`; proven beats unknown; - the guard re-asks right before the run. `settings.CrossDriveBackup.Unproven` records it; `handlers.go` + `backups_apps.html` show it. -- `internal/agentapi`: `FeatureSameDisk` (MinAgent 0.157.0), `Client.SameDisk`, the identity fields on `DiskInfo`. -- `internal/stacks/deploy.go`, `deploy_errors.go`, `internal/api/router.go`, `deploy.html`: D4 — `ErrNeedsDrive`, 400, `code: needs_drive`, - the sentence and a link to the drives page. -- `cmd/controller/main.go`: the judge wired. Locales: four new keys in both files; `scripts/i18n_go_keys.json` lists them. +- `web/internal_place.go`: an agent row of kind `internal` → GuestAttach on one tick, register on the next (kind internal, + default when the household has none, label in the box's language); `refuseInternalLifecycle` on eject/decommission/wipe. +- `web/backup_target_offer.go` (R-1084): `offerRelationFor` — proven different → the promise; unproven → `backup.target.offer_unproven`; + same disk → no offer; older agent → today's offer. The internal place is never offered. +- `web/attach_sources.go` (R-1082): `withoutSystemVolume` hides the system data volume by device. +- `web/agent_disk_handlers.go`, `storage_handlers.go`, templates: partitions in the wizards; a disk with a registered part offers + only its free parts (format only `formattable`, use only filesystem parts); `deviceBacksRegistered` refuses the whole disk (409). +- Locales: `storage.belso_tarhely`, `storage.belso_tarhely_magyarazat`, `storage_wizard.resz_n`, `err.web.belso_tarhely_eletciklus`, + `err.web.meghajto_hasznalatban_formazas`, `backup.target.offer_unproven`. ## 3. Tests and red-proofs -| Test | Red-proof (seen failing) | -|---|---| -| `TestDisk16_ProvenDifferent_CountedNoNotice` | — (positive control for the others) | -| `TestDisk16_SameDisk_NotMadeAndNoticeShown` | the same-disk refusal turned off → fails | -| `TestDisk16_Unknown_MadeNotCountedCannotCheck` | the unproven mark set false → fails | -| `TestDisk16_NetworkShare_NeverHidesTheNotice` | the NAS skip removed → fails (R-1075) | -| `TestDisk16_OldAgent_KeepsTheStDevRule` | fails with the same-disk refusal off | -| `TestDisk16_UnprovenCopyIsRecorded` | — | -| `TestD4_NoDriveRefusalSpeaksInWords` | the D4 branch off → fails with the OMV run's raw sentence | -| `TestD4_NeedsDriveIs400`, `TestD4_FilledPathKeepsItsOwnRefusal` | — | -| `TestDiskJudge_IsWiredAtStartup` | the judge made to never call the agent → fails | - -`go test ./...` green; `controller_gates.py --fast` green except `observations` (this section fixes it). Ten i18n parity pages -refreshed with `-update-i18n-golden` after moving the old ones aside; the diff of each is ONLY the new lines (the stylesheet line -kept as stored). +internal_place_test.go (5), stacks d4 (a media app's HDD_PATH lands on the internal place; the folder is never created so no +compose can run), r1084_offer_identity_test.go (6), r1082_sysdrive_hidden_test.go (3), partitions_test.go (5). Each was seen +failing by a compiling mutation (a non-compiling mutation was once read as „not caught" and redone). Four i18n parity +fixtures refreshed (diff = only the new lines). `go test ./...` and `controller_gates.py --fast`: green. ## 4. Live proof -Method: endpoint level (no browser on DooPlex) — the dashboard pages, the Tier-2 „run now" endpoint the button calls, -the agent's local API with the guest's own token. Evidence: felhom.eu `audits/storage-identity-buildA-2026-10-15/`. -The three boxes reached 0.317.0 by per-customer floors (MinAgent 0.157.0, 303 `floor_set` at 19:27:52 UTC); Tester 1 ran -0.317.0-rc.1 first. - -| Box | Agent verdict | `/backups` after a Tier-2 run | -|---|---|---| -| Tester 1 (VM) | `unknown/vm` | „A Felhom nem tudja ellenőrizni…" shown; 10 apps copied, each marked „nem számolja második másolatnak" | -| demo-hp | different, proven | no notice; 10 apps copied, counted (unchanged) | -| N100 | different, proven | no notice; 5 apps copied, counted (unchanged) | - -ASCII search controls: Tester 1 11 hits (positive); demo-hp 0; N100 1 hit read by eye — a database sentence, not the notice. - -**Not live (unit only, red-proved):** the same-disk skip (no box has two places on one disk); the NAS notice — scratch box -9202 was put on 0.317.0 and back on 0.314.0: its `bootstrap.json` has no `local_api`, so it cannot ask the agent -(R-1083); the no-drive sentence (no one-disk box; a deploy request is never used to probe a refusal). +Method: endpoint level (the dashboard requests) on a fresh one-disk scratch VM (512 GB, installer 1.33.0, golden 0.318.0): +the internal place registered as the default drive by itself; Jellyfin deployed with DOMAIN + SUBDOMAIN only → 202, healthy, +`/media` on the place; partitions: part 1 formatted, part 2 used, the whole disk refused (409); the backup offer on a VM +without the disk-failure promise; the attach list without `/mnt/sys_drive`. Tester 1, demo-hp and the N100 run 0.318.0 by the +floor. Evidence: felhom.eu `audits/storage-identity-buildB-2026-10-15/live/`. ## 11. Observations -1. FILED: R-1082 — the drives page offers `/mnt/sys_drive` for attaching (R-280, the reinstall-restore way out) while `16` §11 rejects - it for household data, and the D4 sentence links to that page. Not changed here: source and design disagree, so it is reported. -2. FILED: R-1083 — scratch box 9202 has no `local_api` in its `bootstrap.json`, so no agent-coupled feature can be shown there. -3. FILED: R-1084 — the whole-box backup offer („…így egy lemezhiba után is vissza tudod állítani a rendszert") does not ask - the agent; on Tester 1 it stands next to the new „cannot check" notice. +1. FILED: R-1094 — the whole-disk refusal sentence says „Csak a szabad részét formázhatod", untrue while another part is mounted. +2. FILED: R-1093 — an empty part asks for the typed confirmation (the agent's probe reads the parent's partition table).