From acd79a78cc0807517e06d0c347b65f7895ca5c0f Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Tue, 27 Oct 2026 15:45:59 +0100 Subject: [PATCH] Release block 2026-10-27: hub 0.173.0, agent 0.167.0, controller 0.346.0 released; R-1250 fixed the same day and proven; ten rows closed, R-1312 opened MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - audits/linetest-2026-10-27/: the hold failed four times as built (qBittorrent drains ~14 s), the fix 710ceac, the test through the hold on 0.346.0-rc.1 (94.5 Mbit/s, the limit back exactly), teardown. - audits/release-2026-10-27/: builds, agent release + signed updates, per-box and global floors, box walk. - 09 §3 decisions 269 (R-1250 fix the same day) and 270 (R-1218 live proof waived); D55's window result in 268. - 08 §: the drain-wait design line. STATUS, CONTEXT, register (223 -> 214). --- CONTEXT.md | 14 + STATUS.md | 10 +- documentation/architecture/08-alarm-ladder.md | 5 + .../architecture/09-update-architecture.md | 19 ++ .../audits/linetest-2026-10-27/README.md | 53 ++++ .../linetest-2026-10-27/agent-demohp-day.txt | 34 +++ .../linetest-2026-10-27/agent-linetest.txt | 14 + .../controller-upwatch-0345-refusals.txt | 19 ++ .../controller-upwatch-day.txt | 8 + .../controller-upwatch.txt | 0 .../linetest-2026-10-27/dooplex-add.txt | 6 + .../audits/linetest-2026-10-27/gsetup.txt | 6 + .../audits/linetest-2026-10-27/install.txt | 6 + .../audits/linetest-2026-10-27/limitprobe.txt | 64 +++++ .../audits/linetest-2026-10-27/pre-0925.txt | 4 + .../linetest-2026-10-27/qbsec-2-clean.txt | 35 +++ .../linetest-2026-10-27/rc1-hold-proof.txt | 19 ++ .../redproof-r1250-drain.txt | 52 ++++ .../audits/linetest-2026-10-27/samples.txt | 255 ++++++++++++++++++ .../linetest-2026-10-27/sec1-guest-2.txt | 45 ++++ .../audits/linetest-2026-10-27/sec1-guest.txt | 150 +++++++++++ .../audits/linetest-2026-10-27/sec1-host.txt | 150 +++++++++++ .../linetest-2026-10-27/socket-queues.txt | 15 ++ .../audits/linetest-2026-10-27/teardown.txt | 21 ++ .../linetest-2026-10-27/tools/dooplex_qb.sh | 25 ++ .../audits/linetest-2026-10-27/tools/fwd.py | 36 +++ .../linetest-2026-10-27/tools/gsample.sh | 16 ++ .../linetest-2026-10-27/tools/gsetup.sh | 19 ++ .../linetest-2026-10-27/tools/install_qb.py | 12 + .../linetest-2026-10-27/tools/limitprobe.sh | 13 + .../audits/linetest-2026-10-27/tools/qbg.sh | 10 + .../audits/linetest-2026-10-27/tools/qbsec.sh | 8 + .../linetest-2026-10-27/tools/remove_qb.py | 12 + .../audits/linetest-2026-10-27/tools/sec1.sh | 8 + .../audits/linetest-2026-10-27/tools/ssq.sh | 12 + .../audits/linetest-2026-10-27/tools/watch.sh | 15 ++ .../audits/linetest-2026-10-27/udp-queues.txt | 17 ++ .../upwatch-settings-after.txt | 30 +++ .../agent-0167-tester1-demofelhom.txt | 18 ++ .../release-2026-10-27/agent-rel-0167.txt | 29 ++ .../boxes-0.346.0/demo-felhom-controller.log | 70 +++++ .../boxes-0.346.0/demo-hp-controller.log | 87 ++++++ .../boxes-0.346.0/held-apps-boxes.txt | 6 + .../boxes-0.346.0/https-only.txt | 34 +++ .../boxes-0.346.0/tester-1-controller.log | 71 +++++ .../release-2026-10-27/global-floor-set.txt | 5 + .../release-2026-10-27/hub-build-0173.txt | 176 ++++++++++++ .../release-2026-10-27/perbox-floors-set.txt | 9 + documentation/backlog/CLOSED-ITEMS.md | 15 ++ documentation/backlog/OPEN-ITEMS.md | 24 +- documentation/backlog/STATUS-HISTORY.md | 8 + 51 files changed, 1767 insertions(+), 22 deletions(-) create mode 100644 documentation/audits/linetest-2026-10-27/README.md create mode 100644 documentation/audits/linetest-2026-10-27/agent-demohp-day.txt create mode 100644 documentation/audits/linetest-2026-10-27/agent-linetest.txt create mode 100644 documentation/audits/linetest-2026-10-27/controller-upwatch-0345-refusals.txt create mode 100644 documentation/audits/linetest-2026-10-27/controller-upwatch-day.txt create mode 100644 documentation/audits/linetest-2026-10-27/controller-upwatch.txt create mode 100644 documentation/audits/linetest-2026-10-27/dooplex-add.txt create mode 100644 documentation/audits/linetest-2026-10-27/gsetup.txt create mode 100644 documentation/audits/linetest-2026-10-27/install.txt create mode 100644 documentation/audits/linetest-2026-10-27/limitprobe.txt create mode 100644 documentation/audits/linetest-2026-10-27/pre-0925.txt create mode 100644 documentation/audits/linetest-2026-10-27/qbsec-2-clean.txt create mode 100644 documentation/audits/linetest-2026-10-27/rc1-hold-proof.txt create mode 100644 documentation/audits/linetest-2026-10-27/redproof-r1250-drain.txt create mode 100644 documentation/audits/linetest-2026-10-27/samples.txt create mode 100644 documentation/audits/linetest-2026-10-27/sec1-guest-2.txt create mode 100644 documentation/audits/linetest-2026-10-27/sec1-guest.txt create mode 100644 documentation/audits/linetest-2026-10-27/sec1-host.txt create mode 100644 documentation/audits/linetest-2026-10-27/socket-queues.txt create mode 100644 documentation/audits/linetest-2026-10-27/teardown.txt create mode 100755 documentation/audits/linetest-2026-10-27/tools/dooplex_qb.sh create mode 100644 documentation/audits/linetest-2026-10-27/tools/fwd.py create mode 100755 documentation/audits/linetest-2026-10-27/tools/gsample.sh create mode 100755 documentation/audits/linetest-2026-10-27/tools/gsetup.sh create mode 100644 documentation/audits/linetest-2026-10-27/tools/install_qb.py create mode 100644 documentation/audits/linetest-2026-10-27/tools/limitprobe.sh create mode 100755 documentation/audits/linetest-2026-10-27/tools/qbg.sh create mode 100644 documentation/audits/linetest-2026-10-27/tools/qbsec.sh create mode 100644 documentation/audits/linetest-2026-10-27/tools/remove_qb.py create mode 100644 documentation/audits/linetest-2026-10-27/tools/sec1.sh create mode 100644 documentation/audits/linetest-2026-10-27/tools/ssq.sh create mode 100755 documentation/audits/linetest-2026-10-27/tools/watch.sh create mode 100644 documentation/audits/linetest-2026-10-27/udp-queues.txt create mode 100644 documentation/audits/linetest-2026-10-27/upwatch-settings-after.txt create mode 100644 documentation/audits/release-2026-10-27/agent-0167-tester1-demofelhom.txt create mode 100644 documentation/audits/release-2026-10-27/agent-rel-0167.txt create mode 100644 documentation/audits/release-2026-10-27/boxes-0.346.0/demo-felhom-controller.log create mode 100644 documentation/audits/release-2026-10-27/boxes-0.346.0/demo-hp-controller.log create mode 100644 documentation/audits/release-2026-10-27/boxes-0.346.0/held-apps-boxes.txt create mode 100644 documentation/audits/release-2026-10-27/boxes-0.346.0/https-only.txt create mode 100644 documentation/audits/release-2026-10-27/boxes-0.346.0/tester-1-controller.log create mode 100644 documentation/audits/release-2026-10-27/global-floor-set.txt create mode 100644 documentation/audits/release-2026-10-27/hub-build-0173.txt create mode 100644 documentation/audits/release-2026-10-27/perbox-floors-set.txt diff --git a/CONTEXT.md b/CONTEXT.md index 1e7138d8..20d7f537 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -16,6 +16,20 @@ > and holds nothing of its own; this file does hold its own content, namely the standing rulings below. +> **2026-10-27 (attended release block) — RELEASED: hub v0.173.0, agent v0.167.0, controller v0.346.0.** Hub 0.173.0 +> deployed 09:35 CET (image `sha256:458bfb03…`, from `29134c52`, ArgoCD sync of Deployment/hub only, 30-min watch clean). +> Agent 0.167.0 by `release-agent.sh` from a clean clone (agent `28bdd282…`, bundle `9d034416…`; tag `v0.167.0`), signed +> `agent_update` to the three test boxes (configs/ unchanged → no bundle job); **NOT vouched yet** — after the vouch set +> `pinned.day0_agent` in `felhom-agent/scripts/retention-policy.json` (D50). Controller 0.346.0 from `b1b9be3` (image +> `sha256:3d910b03…`, CI 2423): per-box floors 15:09 CET, box walk green, held-apps lists match (0 = 0), global floor +> 15:37 CET (MinAgent 0.158.1). **R-1250 fixed the same day (`09` §3 decision 269):** the hold failed four times +> („not quiet" — qBittorrent sends ~14 s after its limit falls; the agent reads 5–15 s after the call); `710ceac` +> `upwatch.waitDrained` asks only after the held app reports its own upload near zero; live on `0.346.0-rc.1` on 9201: +> 94.5 Mbit/s, the limit back exactly (`audits/linetest-2026-10-27/`). **R-1218's live proof waived (decision 270):** the +> hub page's off-site switch did not reach Tester 1's saved target (R-1312). demo-hp's slot is minute 95 (11:35 CET), +> Tester 1's 213, demo-felhom's 20 — each host's own. D55's window ran 03:18Z: 223 removed, 373 → 150. R-1174 closed +> (the status gate refuses since today). Closed 11 rows; opened R-1312. + > **2026-10-26 night (alone) — the data-safety fixes, on `main`, NOT released.** Controller: R-1220 `7e15a37` > (`liveDriveBinds(drives)`: an unreadable app.yaml = installed), R-1218/R-1219 `1170b48` (stage when the password FILE > exists; no ceremony during a recovery offer), R-1187 `dfd0f8e`…`90a2530` (.fab: links as links, FIFO refused, `os.Root` diff --git a/STATUS.md b/STATUS.md index 34acd5bb..b47a858a 100644 --- a/STATUS.md +++ b/STATUS.md @@ -2,7 +2,7 @@ **Ready for Tester 2? Yes — tell the friend go (hand-over list: `documentation/pilot/TESTER2-handover.md`).** -**Updated 2026-10-26 (night).** Saved and proven tonight, not released: kept data never offers a live app's folder; a reinstalled box backs up off-site at once; app-file import keeps links and owners and works again for MariaDB apps; Go 1.27.3. D55's window runs tonight. +**Updated 2026-10-27 (afternoon).** Released on your yes: hub 0.173.0, agent 0.167.0 (not vouched yet), controller 0.346.0 (floor 15:37 CET). The line test on a seeding box failed first (qBittorrent keeps sending 14 s after the hold) and works since the same-day fix: 94.5 Mbit/s, the limit put back exactly. demo-hp's clean-up window removed 223 old copies, no alarm. ## What works - **The Plex attack (10-17 → 10-23) did not reach Felhom's secrets** (R-1241). @@ -23,8 +23,8 @@ - DooPlex: something sets the shared checkout to „bare" (R-935). ## What we work on -- Built, not released (Tuesday's block, each on your yes): R-1291, R-1220, R-1232, R-1187, R-1219, R-1298, R-972, R-1285. R-1218 needs you: off-site off on Tester 1 for minutes (hub customer page), or it leaves the release. -- Dated checks, run by CC. 2026-10-27: the line test on a seeding box, DooPlex's qBittorrent as the peer (R-1250, your yes). 2026-10-30: D35, website and installer to Cloudflare, starts (R-1228, ruled yes). +- Released 2026-10-27: held apps reach you; safer kept data, ceremony and app import; reinstalled boxes back up off-site at once; the line test works while seeding; Go 1.27.3. Open: R-1285 (needs a BYO box on an old agent), R-1312 (what the hub's off-site switch does on the box). +- Dated checks, run by CC. 2026-10-30: D35, website and installer to Cloudflare, starts (R-1228, ruled yes). ## Waiting on you — decide @@ -48,7 +48,7 @@ Newest first. CC's pick is in the „Pick" column. Each row also has its full te 6. BIOS: on the N100, read „After Power Loss"; on the HP, set „Bypass F1 Prompt on Configuration Changes" to Enable. (since 10-14) 7. Pin the first Facebook post (R-917), and look at the new cover in the Facebook phone app (R-919). (since 10-12) -**2026-10-26.** On the hub's Hosts page, delete `Tester4-b5dbbd` (CC's test VM of tonight, uninstalled and destroyed; you already deleted `Tester4-b5ec39`). If not: the hub alarms that the box went silent. After demo-hp's window has run (CC says when, Tuesday morning), revoke the token `cc-d55-window` (R-1294). New: a nightly security watch mails you (R-1303). +**2026-10-27.** 1. Vouch agent 0.167.0 (hub → Configs → Day-0; both sha256 in the release report). If not: new installs start on 0.166.0. 2. Revoke the token `cc-d55-window`; the window ran (R-1294). 3. Delete hub host `Tester4-b5dbbd`; if not, it keeps alarming. New: a nightly security watch mails you (R-1303). **2026-10-23 do list.** 1. Print the break-glass sheet (`documentation/runbooks/break-glass-sheet.md`, the part from „The sheet”, one A4), fill it by hand, keep it outside the home (D32; R-923, R-924). If not: after a DooPlex loss no off-site copy opens. 2. On the hub's Hosts page: Discard appliance 49. If not: a dead entry alarms. @@ -58,4 +58,4 @@ Newest first. CC's pick is in the „Pick" column. Each row also has its full te - Rotate the reused homelab logins and decide the Gitea repo's visibility (R-925, P1). (since 10-09) - Two DooPlex leftovers: `leftovers/2026-10-14/first-post/` (keep or delete); the `deny`-list edit in homelab-manifests' `.claude/settings.json` (commit or drop). (since 10-14) - Before the first paying customer: Tandoor's permission (R-789); a lawyer for the licence list and the terms (R-802, R-813); SparkyFitness by e-mail (R-784). -- Later (yours, not urgent): R-1250 (a seeding qBittorrent is never tested), R-1248 (a hard upload cap per app), R-1229 (ArgoCD's sync settings into git), R-862 (Tester 2's bootstrap, when it is back), R-504, R-1071, R-1073, R-1077, R-1042, R-132, R-908, R-779, R-904, R-232, R-433, R-933, R-213, R-832, R-388, R-882, R-883, R-814, R-1056, R-1164, R-930, R-920, R-902. +- Later (yours, not urgent): R-1248 (a hard upload cap per app), R-1229 (ArgoCD's sync settings into git), R-862 (Tester 2's bootstrap, when it is back), R-504, R-1071, R-1073, R-1077, R-1042, R-132, R-908, R-779, R-904, R-232, R-433, R-933, R-213, R-832, R-388, R-882, R-883, R-814, R-1056, R-1164, R-930, R-920, R-902. diff --git a/documentation/architecture/08-alarm-ladder.md b/documentation/architecture/08-alarm-ladder.md index 42371747..50b63855 100644 --- a/documentation/architecture/08-alarm-ladder.md +++ b/documentation/architecture/08-alarm-ladder.md @@ -591,6 +591,11 @@ normal use; work it does not explain is the sign of a hacked app. Numbers and me start-up check puts it back; the 50 % rule waits while a record exists. Measured on demo-hp with a real seed (10 Mbit/s to DooPlex's qBittorrent): refused `not-quiet` without the hold; with it the uplink fell to 0.02–0.16 Mbit/s, 94.2 Mbit/s measured, the app held 56.8 s and back to 1 249 280 B/s exactly (`audits/dooplex-alarms-2026-10-24/`). + **[DESIGN — R-1250 drain wait, 2026-10-27; controller `710ceac`, released v0.346.0]:** between the hold and the call + the controller waits until every held app REPORTS its own upload ≤ 16 KiB/s on two readings 2 s apart (at most 90 s; + an unreadable speed waits 20 s) — qBittorrent 5.2.4 kept sending at full speed ~14 s after its limit fell, inside the + agent's 5–15 s quiet read, and four tries in an hour were refused; with the wait the test ran (94.5 Mbit/s, the limit + back exactly; `audits/linetest-2026-10-27/`; `09` §3 decision 269). **[DESIGN — R-1261, 2026-10-25 night; controller `a79a292`, unreleased]:** EVERY running seeder is held (qBittorrent and Transmission — one left seeding kept the test refused `not-quiet` every time); all records first (`upwatch.line_test_holds`), then the apps; a record whose app was removed while held is dropped (it used to stop the diff --git a/documentation/architecture/09-update-architecture.md b/documentation/architecture/09-update-architecture.md index c9ab23c3..9d63cd59 100644 --- a/documentation/architecture/09-update-architecture.md +++ b/documentation/architecture/09-update-architecture.md @@ -1107,6 +1107,25 @@ its length, and both fixes cost something the household would notice — operato the plan grows ~14 a night (209 on 2026-10-26, ~223 at the next run), so it is refused again. Why A: the cap must sit above the honest plan on the night it is used. CC's token lacks `offsite:write`, so the operator made a one-purpose token `cc-d55-window` (Off-site write only); CC used it once, 2026-10-26 19:10:31Z (`max:260` stored, read back). + **The window ran** 2026-10-27 03:18:15–03:18:41Z (window 17): 223 of 223 planned removed, 373 → 150, closed by the + box, no alarm (hub row + the box's own log agree). The operator revokes the token. + +### 2026-10-27 (attended release block) — the line-test hold is fixed the same day; R-1218's live proof is waived + +269. **The line-test hold waits until the held app has really slowed down — fixed in the controller the same day.** + *Operator, 2026-10-27 12:30 CET.* Options: A) fix in the controller now, prove it on an rc on demo-hp's 9201 while the + seed runs, ride today's 0.346.0 — cost: ~1.5 h, the release later in the afternoon; B) file it and fix later — cost: + a box that seeds all day keeps getting no weekly test. Why A: measured four refusals in an hour (qBittorrent sends + ~14 s after its limit falls; the agent reads 5–15 s after the call). Built `710ceac`; live on `0.346.0-rc.1`: 94.5 + Mbit/s, the limit back exactly (`audits/linetest-2026-10-27/`). + +270. **R-1218 is released without its live proof (rule 2 waived for this row).** *Operator, 2026-10-27 15:15 CET.* + Options: A) keep both halves, waive the live proof — cost: released key code proven by red tests only; a box that + lost its key file entirely now gets a 409 on its ceremony instead of a silent demotion; B) revert both halves — cost: + a hub 0.173.1 and a second deploy, and the demotion bug stays. Why A: no product path makes the box's saved off-site + target „off" on a hub box (the hub page's switch did not reach Tester 1's target; the household's clear is refused on + a hub tier), so no live run can tell the old code from the new; the change only widens a safety step and adds a + refusal. R-1312 asks what the hub switch does on the box. ### 2026-10-26 (evening brief) — D53: held apps reach the operator; D54: demo-hp's stuck clean-up; R-1297 (B): a second CI runner diff --git a/documentation/audits/linetest-2026-10-27/README.md b/documentation/audits/linetest-2026-10-27/README.md new file mode 100644 index 00000000..92f087fc --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/README.md @@ -0,0 +1,53 @@ +# Line test on a seeding box, 2026-10-27 (R-1250, R-1261) — the hold failed as built, was fixed, and then held + +Venue: demo-hp guest 9201 (controller 0.345.1, then `0.346.0-rc.1`; agent 0.166.0), a THROWAWAY qBittorrent ("qbline", +installed and removed through the product), seeding a private 3 GiB sparse file to DooPlex's qBittorrent (download +only, capped 3–4 Mbit/s, operator yes 2026-10-25). DooPlex's qBittorrent is reachable only inside the cluster, so it +dialled the seed through a small forwarder on 9201 (`tools/fwd.py`, LAN :6881 → the container). Method: reads of the +controller log, the agent journal, qBittorrent's own API and the interface counters. Nothing forced the line test. + +## What the agent's slot is + +demo-hp's slot is NOT 10:00: `slot_minute=95` (the agent's start line), so its test may start from 11:35 CET. Tester 1's +is 213 (13:33), demo-felhom's 20 (10:20). The seed was paused on DooPlex from 10:20 to 11:15 so it ran across 11:35 +(`dooplex-add.txt`). + +## Before the fix — four holds, four refusals (controller 0.345.1) + +11:36, 11:51, 12:06, 12:21 CET: the controller held qBittorrent at 1 KiB/s, asked the agent, put the limit back +exactly (5898240 B/s), and the agent refused „not quiet" — 4.2, 4.2, 4.0, 4.0 Mbit/s while held +(`controller-upwatch-0345-refusals.txt`, `agent-demohp-day.txt`). **The 0.345.1 container's log was dropped when the rc +replaced it**; the refusal lines were recovered from this session's reads of the watcher's copies (said in that file's +header). The agent's journal holds the same four refusals independently. + +Why, measured three ways: + +1. `sec1-guest.txt` / `sec1-host.txt` (12:05:40–12:08 CET, one sample per second at the container, the guest and the + host NIC): during the 12:06:17–12:06:32 hold the CONTAINER itself kept sending 2–11 Mbit/s each second — the + forwarder was not the cause. +2. `udp-queues.txt`: the transfer is uTP (no TCP socket); every UDP queue was 0 — no buffering outside qBittorrent. +3. `qbsec-2-clean.txt` (the 12:21 hold) and `limitprobe.txt` (12:27, the controller's own 1 KiB/s value set by hand for + 60 s on the throwaway, then the exact value back; no test started): qBittorrent reports its limit as 1024 within a + second, yet sends at full speed for **~14 s**, then 0. The agent reads the uplink 5–15 s after the call + (`RequestSettle` 5 s + `RequestQuietWindow` 10 s), inside that drain — so every test on request was refused. + +## The fix (operator's choice 2026-10-27: fix in the controller now) — felhom-controller `710ceac` + +After the hold, `upwatch.waitDrained` polls each held app's OWN upload (`up_info_speed` / Transmission `uploadSpeed`) +until ≤ 16 KiB/s twice, 2 s apart (at most 90 s; an unreadable speed waits 20 s), and only then asks the agent. Five +tests, red-proved by four mutations (`redproof-r1250-drain.txt`). + +## After the fix — the test ran through the hold (`0.346.0-rc.1` on 9201 from 13:24 CET) + +`rc1-hold-proof.txt`: 13:39:56 held → 13:40:20 „the held app(s) slowed down after 22s — asking the agent" → three runs +94.5 / 93.4 / 94.4 Mbit/s → **94.5 Mbit/s** stored (`last_ok_at` 12:40:35Z) → 13:41:17 the limit back as it was +(5898240). The 50 % rule then KEPT the normal limit: the line moved 0.15 %, inside its 20 % band +(`qblimit.go` „kept"); no household flag; the alternative slot untouched (`upwatch-settings-after.txt`). + +## Teardown (`teardown.txt`) + +DooPlex: the torrent and its data removed, `/tmp/r1250` removed, 326 torrents as before, no category left. 9201: the +app removed through the product with `remove_hdd_data` and `remove_backups` FALSE — its download folder is the shared +library `media/torrents` (holding `movies`, `tv`, `.temp` from 14–15 October), and it made no backup today; its own +volume went with it. The forwarder stopped; the hand-made seed folder `r1250` and `/root/r1250` removed. Hub: nothing +provisioned. 9201 stayed on the rc until the per-box floor moved it to 0.346.0 (15:10 CET). diff --git a/documentation/audits/linetest-2026-10-27/agent-demohp-day.txt b/documentation/audits/linetest-2026-10-27/agent-demohp-day.txt new file mode 100644 index 00000000..5910958a --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/agent-demohp-day.txt @@ -0,0 +1,34 @@ +Oct 27 11:36:32 demo-hp felhom-agent[1156735]: time=2026-10-27T11:36:32.542+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.2 +Oct 27 11:51:32 demo-hp felhom-agent[1156735]: time=2026-10-27T11:51:32.488+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.2 +Oct 27 12:06:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:06:32.519+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.0 +Oct 27 12:21:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:21:32.698+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.0 +Oct 27 12:36:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:36:32.503+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.8 +Oct 27 12:51:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:51:32.497+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.3 +Oct 27 13:06:32 demo-hp felhom-agent[1156735]: time=2026-10-27T13:06:32.477+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.8 +Oct 27 13:21:32 demo-hp felhom-agent[1156735]: time=2026-10-27T13:21:32.507+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.1 +Oct 27 13:40:35 demo-hp felhom-agent[1156735]: time=2026-10-27T13:40:35.610+01:00 level=INFO msg="linetest: test on request (a held torrent app, R-1250)" server=10.77.0.1:5201 +Oct 27 13:40:45 demo-hp felhom-agent[1156735]: time=2026-10-27T13:40:45.982+01:00 level=INFO msg="linetest: run 1: 94.5 Mbit/s" server=10.77.0.1:5201 server_bytes=118751232 server_seconds=10.050698 +Oct 27 13:41:01 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:01.335+01:00 level=INFO msg="linetest: run 2: 93.4 Mbit/s" server=10.77.0.1:5201 server_bytes=117440512 server_seconds=10.053919 +Oct 27 13:41:16 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:16.678+01:00 level=INFO msg="linetest: run 3: 94.4 Mbit/s" server=10.77.0.1:5201 server_bytes=118620160 server_seconds=10.053608 +Oct 27 13:41:16 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:16.678+01:00 level=INFO msg="linetest: upload line measured: 94.5 Mbit/s (best of 3)" server=10.77.0.1:5201 runs=3 duration_s=41.067967365 +Oct 27 13:48:23 demo-hp felhom-agent[1156735]: time=2026-10-27T13:48:23.735+01:00 level=WARN msg="signedjobs: AUTHORIZED signed op — executing" job=454a8763e3e8adf9 op=agent_update key_id=felhom-op-1 nonce=656f0799bd7c791166bea35f4503caef +Oct 27 13:48:24 demo-hp felhom-agent[1156735]: time=2026-10-27T13:48:24.016+01:00 level=WARN msg="agent_update: handing the signed job to the root wrapper (felhom-os-apply agent_update)" staged=/var/lib/felhom-agent/selfupdate/felhom-agent-0.167.0 version=0.167.0 +Oct 27 13:48:24 demo-hp felhom-agent[1156735]: time=2026-10-27T13:48:24.619+01:00 level=WARN msg="agent_update: signed update verified as root and handed off; restart scheduled" version=0.167.0 report="{\"agent_update\": {\"sha256\": \"28bdd2826f45f3767880fcff4d3105afb7247c09c0ced99d78b3a978d8d826f0\", \"version\": \"0.167.0\", \"wrapper\": \"Running timer as unit: run-p3482367-i20260742.timer\\nWill run service as unit: run-p3482367-i20260742.service\\nfelhom-selfupdate-guarded: applied 0.167.0 (prev 0.166.0, sha 28bdd2826f45f3767880fcff4d3105afb7247c09c0ced99d78b3a978d8d826f0); detached restart scheduled\", \"…" +Oct 27 13:48:24 demo-hp felhom-agent[1156735]: time=2026-10-27T13:48:24.620+01:00 level=WARN msg="signedjobs: signed op COMPLETED" job=454a8763e3e8adf9 op=agent_update +Oct 27 13:48:28 demo-hp felhom-agent[3482565]: time=2026-10-27T13:48:28.849+01:00 level=INFO msg="linetest: weekly upload line test starting" schedule="weekly, due Tuesday from 10:00 host-local time; starts 10:00-15:59 after 10 quiet minutes; never beside a backup, restore-test or update" slot_minute=95 +Oct 27 13:48:28 demo-hp felhom-agent[3482565]: time=2026-10-27T13:48:28.850+01:00 level=WARN msg="selfupdate: new version running — dwelling before commit" version=0.167.0 prev=0.166.0 dwell=1m0s +Oct 27 13:49:28 demo-hp sudo[3486943]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/local/sbin/felhom-selfupdate-guarded commit +Oct 27 13:49:28 demo-hp felhom-agent[3482565]: time=2026-10-27T13:49:28.876+01:00 level=WARN msg="selfupdate: update committed" version=0.167.0 wrapper="" +{ + "last_ok_at": "2026-10-27T12:40:35.610771254Z", + "mbps": 94.5217790843979, + "runs_mbps": [ + 94.5217790843979, + 93.44854439348477, + 94.39012143700053 + ], + "server": "10.77.0.1:5201", + "last_attempt_at": "2026-10-27T12:40:35.610771254Z", + "tries_day": "2026-10-27", + "tries_today": 1 +} \ No newline at end of file diff --git a/documentation/audits/linetest-2026-10-27/agent-linetest.txt b/documentation/audits/linetest-2026-10-27/agent-linetest.txt new file mode 100644 index 00000000..a387c359 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/agent-linetest.txt @@ -0,0 +1,14 @@ +Oct 27 11:36:32 demo-hp felhom-agent[1156735]: time=2026-10-27T11:36:32.542+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.2 +Oct 27 11:51:32 demo-hp felhom-agent[1156735]: time=2026-10-27T11:51:32.488+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.2 +Oct 27 12:06:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:06:32.519+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.0 +Oct 27 12:21:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:21:32.698+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.0 +Oct 27 12:36:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:36:32.503+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.8 +Oct 27 12:51:32 demo-hp felhom-agent[1156735]: time=2026-10-27T12:51:32.497+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.3 +Oct 27 13:06:32 demo-hp felhom-agent[1156735]: time=2026-10-27T13:06:32.477+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.8 +Oct 27 13:21:32 demo-hp felhom-agent[1156735]: time=2026-10-27T13:21:32.507+01:00 level=INFO msg="linetest: test on request refused — the uplink is not quiet" mbps=4.1 +Oct 27 13:40:35 demo-hp felhom-agent[1156735]: time=2026-10-27T13:40:35.610+01:00 level=INFO msg="linetest: test on request (a held torrent app, R-1250)" server=10.77.0.1:5201 +Oct 27 13:40:45 demo-hp felhom-agent[1156735]: time=2026-10-27T13:40:45.982+01:00 level=INFO msg="linetest: run 1: 94.5 Mbit/s" server=10.77.0.1:5201 server_bytes=118751232 server_seconds=10.050698 +Oct 27 13:41:01 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:01.335+01:00 level=INFO msg="linetest: run 2: 93.4 Mbit/s" server=10.77.0.1:5201 server_bytes=117440512 server_seconds=10.053919 +Oct 27 13:41:16 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:16.678+01:00 level=INFO msg="linetest: run 3: 94.4 Mbit/s" server=10.77.0.1:5201 server_bytes=118620160 server_seconds=10.053608 +Oct 27 13:41:16 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:16.678+01:00 level=INFO msg="linetest: upload line measured: 94.5 Mbit/s (best of 3)" server=10.77.0.1:5201 runs=3 duration_s=41.067967365 +Oct 27 13:48:28 demo-hp felhom-agent[3482565]: time=2026-10-27T13:48:28.849+01:00 level=INFO msg="linetest: weekly upload line test starting" schedule="weekly, due Tuesday from 10:00 host-local time; starts 10:00-15:59 after 10 quiet minutes; never beside a backup, restore-test or update" slot_minute=95 diff --git a/documentation/audits/linetest-2026-10-27/controller-upwatch-0345-refusals.txt b/documentation/audits/linetest-2026-10-27/controller-upwatch-0345-refusals.txt new file mode 100644 index 00000000..8cea92ea --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/controller-upwatch-0345-refusals.txt @@ -0,0 +1,19 @@ +# demo-hp guest 9201, controller 0.345.1 — the four holds before the fix. SOURCE: the watcher's copies read into the +# CC session at 11:55 and 12:22 CET (the container was replaced by the rc at 13:24 CET, which dropped its log; the +# watcher rewrote its file each minute from the current container). The agent's own journal (agent-demohp-day.txt) +# holds the matching four refusals independently. +2026/10/27 10:36:17 linehold.go:252: [INFO] [upwatch] line test: qbittorrent held at {Bytes:1024 Alt:false Enabled:false KBps:0} (was {Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 10:36:17 linehold.go:254: [INFO] [upwatch] line test: 1 app(s) held — asking the agent for a test +2026/10/27 10:36:32 linehold.go:187: [INFO] [upwatch] qbittorrent's upload limit is back as it was ({Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 10:36:32 linehold.go:267: [INFO] [upwatch] line test on request refused by the agent: not-quiet (the uplink sent 4.2 Mbit/s while held) +2026/10/27 10:51:17 linehold.go:252: [INFO] [upwatch] line test: qbittorrent held at {Bytes:1024 Alt:false Enabled:false KBps:0} (was {Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 10:51:17 linehold.go:254: [INFO] [upwatch] line test: 1 app(s) held — asking the agent for a test +2026/10/27 10:51:32 linehold.go:187: [INFO] [upwatch] qbittorrent's upload limit is back as it was ({Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 10:51:32 linehold.go:267: [INFO] [upwatch] line test on request refused by the agent: not-quiet (the uplink sent 4.2 Mbit/s while held) +2026/10/27 11:06:17 linehold.go:252: [INFO] [upwatch] line test: qbittorrent held at {Bytes:1024 Alt:false Enabled:false KBps:0} (was {Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 11:06:17 linehold.go:254: [INFO] [upwatch] line test: 1 app(s) held — asking the agent for a test +2026/10/27 11:06:32 linehold.go:187: [INFO] [upwatch] qbittorrent's upload limit is back as it was ({Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 11:06:32 linehold.go:267: [INFO] [upwatch] line test on request refused by the agent: not-quiet (the uplink sent 4.0 Mbit/s while held) +2026/10/27 11:21:17 linehold.go:254: [INFO] [upwatch] line test: 1 app(s) held — asking the agent for a test +2026/10/27 11:21:33 linehold.go:187: [INFO] [upwatch] qbittorrent's upload limit is back as it was ({Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 11:21:33 linehold.go:267: [INFO] [upwatch] line test on request refused by the agent: not-quiet (the uplink sent 4.0 Mbit/s while held) diff --git a/documentation/audits/linetest-2026-10-27/controller-upwatch-day.txt b/documentation/audits/linetest-2026-10-27/controller-upwatch-day.txt new file mode 100644 index 00000000..7c616eaf --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/controller-upwatch-day.txt @@ -0,0 +1,8 @@ +2026/10/27 12:24:55 service.go:83: [INFO] [upwatch] the host's weekly line test: 94.4 Mbit/s (measured 2026-10-24T08:00:33Z) +2026/10/27 12:24:55 upwatch_wiring.go:154: [INFO] [upwatch] upload and CPU watch started (line 97 Mbit/s, qBittorrent share 50 %) +2026/10/27 12:39:56 linehold.go:327: [INFO] [upwatch] line test: qbittorrent held at {Bytes:1024 Alt:false Enabled:false KBps:0} (was {Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 12:39:56 linehold.go:329: [INFO] [upwatch] line test: 1 app(s) held — asking the agent for a test +2026/10/27 12:40:20 linehold.go:261: [INFO] [upwatch] line test: the held app(s) slowed down after 22s — asking the agent +2026/10/27 12:41:17 linehold.go:192: [INFO] [upwatch] qbittorrent's upload limit is back as it was ({Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 12:41:17 linehold.go:340: [INFO] [upwatch] line test on request: 94.5 Mbit/s +2026/10/27 12:41:17 service.go:83: [INFO] [upwatch] the host's weekly line test: 94.5 Mbit/s (measured 2026-10-27T12:40:35Z) diff --git a/documentation/audits/linetest-2026-10-27/controller-upwatch.txt b/documentation/audits/linetest-2026-10-27/controller-upwatch.txt new file mode 100644 index 00000000..e69de29b diff --git a/documentation/audits/linetest-2026-10-27/dooplex-add.txt b/documentation/audits/linetest-2026-10-27/dooplex-add.txt new file mode 100644 index 00000000..e27a0cf2 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/dooplex-add.txt @@ -0,0 +1,6 @@ +{"added_torrent_ids":["8828f12fe7899fa6a8a1c4994c26f11ae19eb6fa"],"failure_count":0,"pending_count":0,"success_count":1} +{"8828f12fe7899fa6a8a1c4994c26f11ae19eb6fa":{"added":1,"failed":0}} +cap 500000 B/s at 08:26:26 +paused 09:21:08 — demo-hp's slot_minute=95 (11:35 CET); resume 10:15Z +resumed 10:15:22 +re-added 11:09:31 for the buffer measurement diff --git a/documentation/audits/linetest-2026-10-27/gsetup.txt b/documentation/audits/linetest-2026-10-27/gsetup.txt new file mode 100644 index 00000000..b8e08ae8 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/gsetup.txt @@ -0,0 +1,6 @@ +total 0 +0 -rw-r--r-- 1 1000 1000 3221225472 Oct 27 06:53 r1250-seed.bin +addTask: {"taskID":"0a6c300e-631b-4b47-8df3-f74e5b74a6f1"} +creator: "pieceSize":1048576 "status":"Finished" +torrent r1250-seed.bin 8828f12fe7899fa6a8a1c4994c26f11ae19eb6fa checkingResumeData size 3221225472 private True +172.18.0.17 diff --git a/documentation/audits/linetest-2026-10-27/install.txt b/documentation/audits/linetest-2026-10-27/install.txt new file mode 100644 index 00000000..4ba43dc3 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/install.txt @@ -0,0 +1,6 @@ +deploy-fields: 200 [('DOMAIN', 'domain', True), ('SUBDOMAIN', 'subdomain', True), ('HDD_PATH', 'path', True), ('QBT_ADMIN_PASSWORD', 'password', True)] +07:52:19 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH', 'QBT_ADMIN_PASSWORD'] +07:52:19 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'} +07:52:35 [1] deployed, controller state=running, pinned={'qbittorrent': 'qbittorrentofficial/qbittorrent-nox:5.2.4-1'} +deployed: True +answers: True diff --git a/documentation/audits/linetest-2026-10-27/limitprobe.txt b/documentation/audits/linetest-2026-10-27/limitprobe.txt new file mode 100644 index 00000000..8d8f20f5 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/limitprobe.txt @@ -0,0 +1,64 @@ +previous up_limit=5898240 +11:27:32 set up_limit=1024: ok +11:27:33 t=1s ctr=4929kbit limit=1024 speed=3.01 +11:27:34 t=2s ctr=0kbit limit=1024 speed=3.01 +11:27:35 t=3s ctr=11082kbit limit=1024 speed=5.50 +11:27:36 t=4s ctr=6573kbit limit=1024 speed=1.83 +11:27:38 t=5s ctr=2870kbit limit=1024 speed=6.03 +11:27:39 t=6s ctr=8351kbit limit=1024 speed=5.33 +11:27:40 t=7s ctr=2865kbit limit=1024 speed=5.33 +11:27:41 t=8s ctr=0kbit limit=1024 speed=1.83 +11:27:42 t=9s ctr=8765kbit limit=1024 speed=5.59 +11:27:44 t=10s ctr=5462kbit limit=1024 speed=3.49 +11:27:45 t=11s ctr=4937kbit limit=1024 speed=3.15 +11:27:46 t=12s ctr=5882kbit limit=1024 speed=3.15 +11:27:47 t=13s ctr=2455kbit limit=1024 speed=3.76 +11:27:49 t=14s ctr=0kbit limit=1024 speed=1.56 +11:27:50 t=15s ctr=0kbit limit=1024 speed=0.00 +11:27:51 t=16s ctr=0kbit limit=1024 speed=0.00 +11:27:52 t=17s ctr=0kbit limit=1024 speed=0.00 +11:27:53 t=18s ctr=0kbit limit=1024 speed=0.00 +11:27:55 t=19s ctr=0kbit limit=1024 speed=0.00 +11:27:56 t=20s ctr=107kbit limit=1024 speed=0.07 +11:27:57 t=21s ctr=0kbit limit=1024 speed=0.00 +11:27:58 t=22s ctr=0kbit limit=1024 speed=0.00 +11:28:00 t=23s ctr=0kbit limit=1024 speed=0.00 +11:28:01 t=24s ctr=0kbit limit=1024 speed=0.00 +11:28:02 t=25s ctr=0kbit limit=1024 speed=0.00 +11:28:03 t=26s ctr=0kbit limit=1024 speed=0.00 +11:28:04 t=27s ctr=0kbit limit=1024 speed=0.00 +11:28:06 t=28s ctr=85kbit limit=1024 speed=0.05 +11:28:07 t=29s ctr=0kbit limit=1024 speed=0.05 +11:28:08 t=30s ctr=0kbit limit=1024 speed=0.00 +11:28:09 t=31s ctr=0kbit limit=1024 speed=0.00 +11:28:11 t=32s ctr=0kbit limit=1024 speed=0.00 +11:28:12 t=33s ctr=0kbit limit=1024 speed=0.00 +11:28:13 t=34s ctr=0kbit limit=1024 speed=0.00 +11:28:14 t=35s ctr=0kbit limit=1024 speed=0.00 +11:28:15 t=36s ctr=85kbit limit=1024 speed=0.00 +11:28:17 t=37s ctr=13kbit limit=1024 speed=0.05 +11:28:18 t=38s ctr=0kbit limit=1024 speed=0.00 +11:28:19 t=39s ctr=0kbit limit=1024 speed=0.00 +11:28:20 t=40s ctr=0kbit limit=1024 speed=0.00 +11:28:22 t=41s ctr=0kbit limit=1024 speed=0.00 +11:28:23 t=42s ctr=0kbit limit=1024 speed=0.00 +11:28:24 t=43s ctr=0kbit limit=1024 speed=0.00 +11:28:25 t=44s ctr=1kbit limit=1024 speed=0.05 +11:28:26 t=45s ctr=85kbit limit=1024 speed=0.05 +11:28:28 t=46s ctr=0kbit limit=1024 speed=0.00 +11:28:29 t=47s ctr=0kbit limit=1024 speed=0.00 +11:28:30 t=48s ctr=0kbit limit=1024 speed=0.00 +11:28:31 t=49s ctr=0kbit limit=1024 speed=0.00 +11:28:33 t=50s ctr=0kbit limit=1024 speed=0.00 +11:28:34 t=51s ctr=0kbit limit=1024 speed=0.00 +11:28:35 t=52s ctr=0kbit limit=1024 speed=0.00 +11:28:36 t=53s ctr=85kbit limit=1024 speed=0.05 +11:28:37 t=54s ctr=0kbit limit=1024 speed=0.00 +11:28:39 t=55s ctr=0kbit limit=1024 speed=0.00 +11:28:40 t=56s ctr=0kbit limit=1024 speed=0.00 +11:28:41 t=57s ctr=0kbit limit=1024 speed=0.00 +11:28:42 t=58s ctr=0kbit limit=1024 speed=0.00 +11:28:44 t=59s ctr=0kbit limit=1024 speed=0.00 +11:28:45 t=60s ctr=0kbit limit=1024 speed=0.00 +11:28:45 put back up_limit=5898240: ok +after: limit=5898240 speed=0.55 diff --git a/documentation/audits/linetest-2026-10-27/pre-0925.txt b/documentation/audits/linetest-2026-10-27/pre-0925.txt new file mode 100644 index 00000000..4a585845 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/pre-0925.txt @@ -0,0 +1,4 @@ +08:25:21 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +{ + "last_ok_at": "2026-10-24T08:00:33.132515698Z", + "mbps": 94.38232008767471, diff --git a/documentation/audits/linetest-2026-10-27/qbsec-2-clean.txt b/documentation/audits/linetest-2026-10-27/qbsec-2-clean.txt new file mode 100644 index 00000000..f91e413d --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/qbsec-2-clean.txt @@ -0,0 +1,35 @@ +11:21:08 rate_limit=5898240 up_speed=4.98Mbit +11:21:09 rate_limit=5898240 up_speed=4.98Mbit +11:21:09 rate_limit=5898240 up_speed=4.98Mbit +11:21:09 rate_limit=5898240 up_speed=3.59Mbit +11:21:10 rate_limit=5898240 up_speed=3.59Mbit +11:21:10 rate_limit=5898240 up_speed=3.59Mbit +11:21:11 rate_limit=5898240 up_speed=3.05Mbit +11:21:11 rate_limit=5898240 up_speed=3.05Mbit +11:21:12 rate_limit=5898240 up_speed=3.05Mbit +11:21:12 rate_limit=5898240 up_speed=2.69Mbit +11:21:13 rate_limit=5898240 up_speed=2.69Mbit +11:21:13 rate_limit=5898240 up_speed=2.69Mbit +11:21:14 rate_limit=5898240 up_speed=4.38Mbit +11:21:14 rate_limit=5898240 up_speed=4.38Mbit +11:21:15 rate_limit=5898240 up_speed=4.38Mbit +11:21:15 rate_limit=5898240 up_speed=5.68Mbit +11:21:16 rate_limit=5898240 up_speed=5.68Mbit +11:21:16 rate_limit=5898240 up_speed=5.68Mbit +11:21:17 rate_limit=5898240 up_speed=5.30Mbit +11:21:17 rate_limit=1024 up_speed=5.30Mbit +11:21:18 rate_limit=1024 up_speed=5.30Mbit +11:21:18 rate_limit=1024 up_speed=1.80Mbit +11:21:19 rate_limit=1024 up_speed=1.80Mbit +11:21:19 rate_limit=1024 up_speed=1.80Mbit +11:21:20 rate_limit=1024 up_speed=5.58Mbit +11:21:20 rate_limit=1024 up_speed=5.58Mbit +11:21:21 rate_limit=1024 up_speed=5.58Mbit +11:21:21 rate_limit=1024 up_speed=3.58Mbit +11:21:22 rate_limit=1024 up_speed=3.58Mbit +11:21:22 rate_limit=1024 up_speed=3.58Mbit +11:21:23 rate_limit=1024 up_speed=3.06Mbit +11:21:23 rate_limit=1024 up_speed=3.06Mbit +11:21:24 rate_limit=1024 up_speed=3.06Mbit +11:21:24 rate_limit=1024 up_speed=5.32Mbit +11:21:25 rate_limit=1024 up_speed=5.32Mbit diff --git a/documentation/audits/linetest-2026-10-27/rc1-hold-proof.txt b/documentation/audits/linetest-2026-10-27/rc1-hold-proof.txt new file mode 100644 index 00000000..29dda6e1 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/rc1-hold-proof.txt @@ -0,0 +1,19 @@ +2026/10/27 12:24:55 service.go:83: [INFO] [upwatch] the host's weekly line test: 94.4 Mbit/s (measured 2026-10-24T08:00:33Z) +2026/10/27 12:24:55 upwatch_wiring.go:154: [INFO] [upwatch] upload and CPU watch started (line 97 Mbit/s, qBittorrent share 50 %) +2026/10/27 12:39:56 linehold.go:327: [INFO] [upwatch] line test: qbittorrent held at {Bytes:1024 Alt:false Enabled:false KBps:0} (was {Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 12:39:56 linehold.go:329: [INFO] [upwatch] line test: 1 app(s) held — asking the agent for a test +2026/10/27 12:40:20 linehold.go:261: [INFO] [upwatch] line test: the held app(s) slowed down after 22s — asking the agent +2026/10/27 12:41:17 linehold.go:192: [INFO] [upwatch] qbittorrent's upload limit is back as it was ({Bytes:5898240 Alt:false Enabled:false KBps:0}) +2026/10/27 12:41:17 linehold.go:340: [INFO] [upwatch] line test on request: 94.5 Mbit/s +2026/10/27 12:41:17 service.go:83: [INFO] [upwatch] the host's weekly line test: 94.5 Mbit/s (measured 2026-10-27T12:40:35Z) +Oct 27 13:40:35 demo-hp felhom-agent[1156735]: time=2026-10-27T13:40:35.610+01:00 level=INFO msg="linetest: test on request (a held torrent app, R-1250)" server=10.77.0.1:5201 +Oct 27 13:40:45 demo-hp felhom-agent[1156735]: time=2026-10-27T13:40:45.982+01:00 level=INFO msg="linetest: run 1: 94.5 Mbit/s" server=10.77.0.1:5201 server_bytes=118751232 server_seconds=10.050698 +Oct 27 13:41:01 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:01.335+01:00 level=INFO msg="linetest: run 2: 93.4 Mbit/s" server=10.77.0.1:5201 server_bytes=117440512 server_seconds=10.053919 +Oct 27 13:41:16 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:16.678+01:00 level=INFO msg="linetest: run 3: 94.4 Mbit/s" server=10.77.0.1:5201 server_bytes=118620160 server_seconds=10.053608 +Oct 27 13:41:16 demo-hp felhom-agent[1156735]: time=2026-10-27T13:41:16.678+01:00 level=INFO msg="linetest: upload line measured: 94.5 Mbit/s (best of 3)" server=10.77.0.1:5201 runs=3 duration_s=41.067967365 +{ + "last_ok_at": "2026-10-27T12:40:35.610771254Z", + "mbps": 94.5217790843979, + "runs_mbps": [ + +[exited with code 0] diff --git a/documentation/audits/linetest-2026-10-27/redproof-r1250-drain.txt b/documentation/audits/linetest-2026-10-27/redproof-r1250-drain.txt new file mode 100644 index 00000000..fb291f1d --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/redproof-r1250-drain.txt @@ -0,0 +1,52 @@ +### 1: no waitDrained call +=== RUN TestR1250_TheAgentIsAskedOnlyAfterTheHeldAppSlowedDown + linehold_r1250_drain_test.go:40: the agent was asked after 0 speed readings, want 7 — only after two quiet readings in a row +--- FAIL: TestR1250_TheAgentIsAskedOnlyAfterTheHeldAppSlowedDown (0.00s) +=== RUN TestR1250_EveryHeldAppMustSlowDown + linehold_r1250_drain_test.go:66: asked 1 time(s) with 0 transmission reading(s), want once and after its two quiet readings (5) +--- FAIL: TestR1250_EveryHeldAppMustSlowDown (0.00s) +=== RUN TestR1250_AnAppThatNeverSlowsIsAskedAboutAfterTheMaximum + linehold_r1250_drain_test.go:78: asked 1 time(s) after 0s, want once after 1m30s +--- FAIL: TestR1250_AnAppThatNeverSlowsIsAskedAboutAfterTheMaximum (0.00s) +=== RUN TestR1250_AnUnreadableSpeedGetsTheFallbackWait + linehold_r1250_drain_test.go:93: asked 1 time(s) after 0s, want once after 20s +--- FAIL: TestR1250_AnUnreadableSpeedGetsTheFallbackWait (0.00s) +=== RUN TestR1250_UploadRateReadsTheAppsOwnSpeed +--- PASS: TestR1250_UploadRateReadsTheAppsOwnSpeed (0.00s) +FAIL +FAIL gitea.dooplex.hu/admin/felhom-controller/internal/upwatch 0.010s +FAIL +### 2: only the first app read +=== RUN TestR1250_TheAgentIsAskedOnlyAfterTheHeldAppSlowedDown +--- PASS: TestR1250_TheAgentIsAskedOnlyAfterTheHeldAppSlowedDown (0.00s) +=== RUN TestR1250_EveryHeldAppMustSlowDown + linehold_r1250_drain_test.go:66: asked 1 time(s) with 0 transmission reading(s), want once and after its two quiet readings (5) +--- FAIL: TestR1250_EveryHeldAppMustSlowDown (0.00s) +=== RUN TestR1250_AnAppThatNeverSlowsIsAskedAboutAfterTheMaximum +--- PASS: TestR1250_AnAppThatNeverSlowsIsAskedAboutAfterTheMaximum (0.00s) +=== RUN TestR1250_AnUnreadableSpeedGetsTheFallbackWait +--- PASS: TestR1250_AnUnreadableSpeedGetsTheFallbackWait (0.00s) +=== RUN TestR1250_UploadRateReadsTheAppsOwnSpeed +--- PASS: TestR1250_UploadRateReadsTheAppsOwnSpeed (0.00s) +FAIL +FAIL gitea.dooplex.hu/admin/felhom-controller/internal/upwatch 0.008s +FAIL +### 3: no fallback wait on a read error +=== RUN TestR1250_TheAgentIsAskedOnlyAfterTheHeldAppSlowedDown +--- PASS: TestR1250_TheAgentIsAskedOnlyAfterTheHeldAppSlowedDown (0.00s) +=== RUN TestR1250_EveryHeldAppMustSlowDown +--- PASS: TestR1250_EveryHeldAppMustSlowDown (0.00s) +=== RUN TestR1250_AnAppThatNeverSlowsIsAskedAboutAfterTheMaximum +--- PASS: TestR1250_AnAppThatNeverSlowsIsAskedAboutAfterTheMaximum (0.00s) +=== RUN TestR1250_AnUnreadableSpeedGetsTheFallbackWait + linehold_r1250_drain_test.go:93: asked 1 time(s) after 0s, want once after 20s +--- FAIL: TestR1250_AnUnreadableSpeedGetsTheFallbackWait (0.00s) +=== RUN TestR1250_UploadRateReadsTheAppsOwnSpeed +--- PASS: TestR1250_UploadRateReadsTheAppsOwnSpeed (0.00s) +FAIL +FAIL gitea.dooplex.hu/admin/felhom-controller/internal/upwatch 0.010s +FAIL +### 4: no drainMax (expect a hang → timeout) +panic: test timed out after 10s +FAIL gitea.dooplex.hu/admin/felhom-controller/internal/upwatch 10.012s +FAIL diff --git a/documentation/audits/linetest-2026-10-27/samples.txt b/documentation/audits/linetest-2026-10-27/samples.txt new file mode 100644 index 00000000..ffafd9c6 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/samples.txt @@ -0,0 +1,255 @@ +08:27:16 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.49Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:28:20 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.76Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:29:24 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.97Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:30:28 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.33Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:31:32 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.03Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:32:36 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=8.65Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:33:40 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.49Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:34:44 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.24Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:35:48 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.13Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:36:51 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.31Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:37:55 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.72Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:38:59 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:40:03 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.76Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:41:07 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.20Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:42:11 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.17Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:43:15 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.24Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:44:19 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.58Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:45:23 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.14Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:46:27 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.83Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:47:31 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.92Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:48:35 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.23Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:49:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.88Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:50:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.99Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:51:47 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.20Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:52:51 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.89Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:53:55 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.59Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:54:59 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:56:03 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.70Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:57:07 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.17Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:58:11 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.81Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +08:59:15 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.83Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:00:19 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:01:24 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:02:28 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.59Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:03:32 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.43Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:04:36 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.93Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:05:40 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.97Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:06:44 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.89Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:07:48 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:08:52 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.32Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:09:56 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:11:00 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.75Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:12:04 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.11Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:13:08 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.83Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:14:12 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.93Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:15:16 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.23Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:16:20 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=8.21Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:17:25 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.50Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:18:29 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.98Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:19:33 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.24Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:20:36 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:21:40 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:22:44 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:23:48 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:24:52 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:25:57 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:27:01 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:28:05 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:29:09 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:30:13 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:31:17 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:32:21 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:33:26 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:34:30 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:35:34 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:36:38 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:37:42 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:38:46 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:39:50 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:40:54 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:41:59 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:43:03 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:44:07 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:45:11 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:46:15 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:47:19 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:48:24 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:49:28 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:50:32 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:51:36 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:52:40 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:53:45 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:54:49 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:55:53 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:56:57 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:58:01 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +09:59:05 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:00:09 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:01:14 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:02:18 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:03:22 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:04:26 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:05:31 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:06:35 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:07:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:08:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:09:47 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:10:52 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:11:56 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:13:00 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:14:04 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:15:09 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:16:13 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.02Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:17:17 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.25Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:18:21 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.96Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:19:26 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.59Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:20:30 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.15Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:21:34 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.71Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:22:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.02Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:23:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.40Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:24:47 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.94Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:25:51 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.95Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:26:56 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:28:00 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.76Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:29:04 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.98Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:30:08 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.93Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:31:13 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.13Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:32:17 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:33:21 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.87Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:34:26 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:35:30 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.75Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:36:34 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:37:38 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.96Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:38:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:39:47 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.15Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:40:51 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.49Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:41:56 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.98Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:43:00 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.62Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:44:04 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.27Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:45:08 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.69Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:46:13 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.97Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:47:17 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.12Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:48:21 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.06Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:49:26 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.66Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:50:30 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.94Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:51:34 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.68Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:52:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.58Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:53:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.89Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:54:47 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.79Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:55:52 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.66Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:56:56 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.73Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:58:01 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.33Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +10:59:05 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.72Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:00:09 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.88Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:01:14 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.33Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:02:18 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.11Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:03:23 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.49Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:04:27 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.17Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:05:31 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.02Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:06:35 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.51Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:07:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:08:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:09:48 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.45Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:10:52 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:11:57 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.06Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:13:01 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.73Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:14:05 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:15:09 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.81Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:16:14 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.24Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:17:18 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:18:23 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.58Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:19:28 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.33Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:20:32 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.06Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:21:36 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.91Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:22:41 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=8.91Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:23:45 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.08Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:24:50 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:25:54 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.02Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:26:59 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.76Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:28:03 seeder: up_limit=1024 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:29:07 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.72Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:30:12 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.15Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:31:16 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.46Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:32:21 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.92Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:33:25 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.50Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:34:30 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.85Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:35:35 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.41Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:36:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.75Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:37:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.11Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:38:48 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.58Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:39:52 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:40:56 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.12Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:42:01 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.86Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:43:05 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.74Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:44:10 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.32Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:45:14 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:46:19 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.19Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:47:23 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.50Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:48:28 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:49:33 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.34Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:50:37 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.23Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:51:42 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.81Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:52:46 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.52Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:53:51 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.67Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:54:55 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.33Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:55:59 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.93Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:57:04 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.76Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:58:08 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.02Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +11:59:12 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.19Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:00:17 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.75Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:01:21 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.76Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:02:26 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.41Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:03:30 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.85Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:04:35 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.33Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:05:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.94Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:06:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.50Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:07:48 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=8.31Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:08:52 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:09:56 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.28Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:11:01 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.15Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:12:05 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.97Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:13:10 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.24Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:14:14 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.50Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:15:18 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.02Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:16:23 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.57Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:17:27 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.15Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:18:32 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.68Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:19:37 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.16Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:20:41 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.41Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:21:45 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.65Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:22:50 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.87Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:23:54 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.93Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:24:58 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.10Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:26:02 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.71Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:27:06 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.94Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:28:10 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.41Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:29:15 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.33Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:30:19 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.37Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:31:23 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.08Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:32:27 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.12Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:33:31 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.50Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:34:35 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.80Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:35:39 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.68Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:36:43 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.89Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:37:47 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.58Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:38:51 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.59Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:39:55 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.93Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:41:00 seeder: up_limit=1024 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:42:04 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=7.06Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:42:06 TEST DONE — 20 more minutes for the 50 % rule's tick +12:43:08 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=1.42Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:44:12 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.92Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:45:16 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.89Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:46:20 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.62Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:47:24 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.91Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:48:28 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.34Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:49:34 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=6.82Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:50:38 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.11Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:51:42 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=4.98Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:52:46 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=8.21Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:53:50 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.80Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:54:54 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=5.07Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:55:59 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=2.98Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:57:03 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=0.00Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ +12:58:07 seeder: up_limit=5898240 alt_up_limit=10240 alt_mode=0 up_speed=3.59Mbit | ctl: upwatch={"line": [{"at": "2026-10-25T03:17:47Z", "peak10_mbps": 7.54, "bytes": 18588326, "seconds": 46, "counts": false}, {"at": "2026-10-26T03:17:56Z", "peak10_mbps": 5.99, "bytes": 17694322, "seconds": 55, "counts": false}, {"at": "2026-10-27T03:18:41Z", "peak10_mbps": 97.21, "bytes": 169114983, "seconds": 82, "counts": true}], "qb_limit": {"box_set_bytes": 5898240, "line_mbps": 94.38232008767471, "set_ diff --git a/documentation/audits/linetest-2026-10-27/sec1-guest-2.txt b/documentation/audits/linetest-2026-10-27/sec1-guest-2.txt new file mode 100644 index 00000000..c4d686d6 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/sec1-guest-2.txt @@ -0,0 +1,45 @@ +11:21:08 ctr_tx=3720430734 guest_tx=4191329811 +11:21:09 ctr_tx=3721161419 guest_tx=4192048156 +11:21:10 ctr_tx=3721803031 guest_tx=4192678300 +11:21:11 ctr_tx=3721803031 guest_tx=4192678639 +11:21:12 ctr_tx=3722329245 guest_tx=4193201516 +11:21:13 ctr_tx=3723186755 guest_tx=4194078439 +11:21:14 ctr_tx=3724033016 guest_tx=4194917738 +11:21:15 ctr_tx=3724376145 guest_tx=4195269350 +11:21:16 ctr_tx=3724376145 guest_tx=4195269699 +11:21:17 ctr_tx=3725419455 guest_tx=4196340083 +11:21:18 ctr_tx=3725771666 guest_tx=4196690340 +11:21:19 ctr_tx=3725771666 guest_tx=4196704446 +11:21:20 ctr_tx=3726885998 guest_tx=4197824018 +11:21:21 ctr_tx=3727569177 guest_tx=4198522946 +11:21:22 ctr_tx=3728167648 guest_tx=4199135443 +11:21:23 ctr_tx=3728167648 guest_tx=4199135692 +11:21:24 ctr_tx=3729251591 guest_tx=4200237966 +11:21:25 ctr_tx=3729577628 guest_tx=4200571609 +11:21:26 ctr_tx=3730433281 guest_tx=4201446511 +11:21:27 ctr_tx=3730757142 guest_tx=4201777963 +11:21:28 ctr_tx=3730757142 guest_tx=4201778402 +11:21:29 ctr_tx=3731854062 guest_tx=4202899979 +11:21:30 ctr_tx=3732403419 guest_tx=4203462274 +11:21:31 ctr_tx=3733079530 guest_tx=4204127706 +11:21:32 ctr_tx=3733079530 guest_tx=4204128145 +11:21:33 ctr_tx=3734045673 guest_tx=4205107863 +11:21:34 ctr_tx=3734049230 guest_tx=4205108131 +11:21:35 ctr_tx=3734620537 guest_tx=4205692808 +11:21:36 ctr_tx=3735383082 guest_tx=4206472874 +11:21:37 ctr_tx=3735383082 guest_tx=4206473301 +11:21:38 ctr_tx=3736361579 guest_tx=4207452416 +11:21:39 ctr_tx=3737096572 guest_tx=4208204190 +11:21:40 ctr_tx=3737787526 guest_tx=4208887884 +11:21:41 ctr_tx=3737787658 guest_tx=4208888394 +11:21:42 ctr_tx=3738495267 guest_tx=4209587505 +11:21:43 ctr_tx=3739333599 guest_tx=4210445029 +11:21:44 ctr_tx=3739333599 guest_tx=4210445463 +11:21:45 ctr_tx=3740103138 guest_tx=4211232933 +11:21:46 ctr_tx=3740694338 guest_tx=4211828555 +11:21:47 ctr_tx=3740694338 guest_tx=4211828899 +11:21:48 ctr_tx=3741686134 guest_tx=4212843181 +11:21:49 ctr_tx=3742405075 guest_tx=4213578722 +11:21:50 ctr_tx=3743067504 guest_tx=4214244964 +11:21:51 ctr_tx=3743067504 guest_tx=4214245396 +11:21:52 ctr_tx=3743768303 guest_tx=4214962364 diff --git a/documentation/audits/linetest-2026-10-27/sec1-guest.txt b/documentation/audits/linetest-2026-10-27/sec1-guest.txt new file mode 100644 index 00000000..aa477bf1 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/sec1-guest.txt @@ -0,0 +1,150 @@ +11:05:45 ctr_tx=3313871257 guest_tx=3777840176 +11:05:46 ctr_tx=3314487726 guest_tx=3778471133 +11:05:47 ctr_tx=3314487726 guest_tx=3778471477 +11:05:48 ctr_tx=3315497309 guest_tx=3779504388 +11:05:49 ctr_tx=3316198893 guest_tx=3780222432 +11:05:50 ctr_tx=3316198893 guest_tx=3780222851 +11:05:51 ctr_tx=3316884725 guest_tx=3780924993 +11:05:52 ctr_tx=3317569183 guest_tx=3781625913 +11:05:53 ctr_tx=3318390305 guest_tx=3782466273 +11:05:54 ctr_tx=3318390305 guest_tx=3782467595 +11:05:55 ctr_tx=3319178173 guest_tx=3783273791 +11:05:56 ctr_tx=3319743674 guest_tx=3783852666 +11:05:57 ctr_tx=3319743674 guest_tx=3783853052 +11:05:58 ctr_tx=3320754016 guest_tx=3784886756 +11:05:59 ctr_tx=3321113058 guest_tx=3785254370 +11:06:00 ctr_tx=3321113100 guest_tx=3785254780 +11:06:01 ctr_tx=3322192604 guest_tx=3786359369 +11:06:02 ctr_tx=3322859502 guest_tx=3787041987 +11:06:03 ctr_tx=3323476191 guest_tx=3787673254 +11:06:04 ctr_tx=3323476191 guest_tx=3787673508 +11:06:05 ctr_tx=3324845825 guest_tx=3789075323 +11:06:06 ctr_tx=3324845825 guest_tx=3789075577 +11:06:07 ctr_tx=3325685101 guest_tx=3789934597 +11:06:08 ctr_tx=3326010790 guest_tx=3790267978 +11:06:09 ctr_tx=3326010790 guest_tx=3790268496 +11:06:10 ctr_tx=3327071817 guest_tx=3791354051 +11:06:11 ctr_tx=3327619583 guest_tx=3791914797 +11:06:12 ctr_tx=3328252881 guest_tx=3792562901 +11:06:13 ctr_tx=3328252881 guest_tx=3792563335 +11:06:14 ctr_tx=3329193887 guest_tx=3793525981 +11:06:15 ctr_tx=3329827027 guest_tx=3794174197 +11:06:16 ctr_tx=3330495271 guest_tx=3794857995 +11:06:17 ctr_tx=3330501276 guest_tx=3794862021 +11:06:18 ctr_tx=3331446550 guest_tx=3795824910 +11:06:19 ctr_tx=3332166653 guest_tx=3796575731 +11:06:20 ctr_tx=3332166653 guest_tx=3796576217 +11:06:21 ctr_tx=3332816688 guest_tx=3797241500 +11:06:22 ctr_tx=3333826412 guest_tx=3798274582 +11:06:23 ctr_tx=3334220153 guest_tx=3798677723 +11:06:24 ctr_tx=3334220153 guest_tx=3798678273 +11:06:25 ctr_tx=3335333658 guest_tx=3799817334 +11:06:26 ctr_tx=3335333658 guest_tx=3799817666 +11:06:27 ctr_tx=3336019176 guest_tx=3800519282 +11:06:28 ctr_tx=3336668809 guest_tx=3801184139 +11:06:29 ctr_tx=3337387905 guest_tx=3801919994 +11:06:30 ctr_tx=3337387905 guest_tx=3801920392 +11:06:31 ctr_tx=3338175741 guest_tx=3802726848 +11:06:32 ctr_tx=3338644552 guest_tx=3803206672 +11:06:33 ctr_tx=3338727332 guest_tx=3803279803 +11:06:34 ctr_tx=3339539697 guest_tx=3804111085 +11:06:35 ctr_tx=3340550257 guest_tx=3805145250 +11:06:36 ctr_tx=3340550257 guest_tx=3805145945 +11:06:37 ctr_tx=3341252097 guest_tx=3805864252 +11:06:38 ctr_tx=3341902119 guest_tx=3806529666 +11:06:39 ctr_tx=3342588273 guest_tx=3807232481 +11:06:40 ctr_tx=3342588273 guest_tx=3807232730 +11:06:41 ctr_tx=3343391916 guest_tx=3808055025 +11:06:42 ctr_tx=3344163034 guest_tx=3808844151 +11:06:43 ctr_tx=3344727879 guest_tx=3809422306 +11:06:44 ctr_tx=3344727879 guest_tx=3809422638 +11:06:45 ctr_tx=3345703537 guest_tx=3810420988 +11:06:46 ctr_tx=3345703537 guest_tx=3810421386 +11:06:47 ctr_tx=3346422666 guest_tx=3811157452 +11:06:48 ctr_tx=3347039295 guest_tx=3811788649 +11:06:49 ctr_tx=3347740853 guest_tx=3812506865 +11:06:50 ctr_tx=3347740853 guest_tx=3812507376 +11:06:51 ctr_tx=3348510332 guest_tx=3813294852 +11:06:52 ctr_tx=3349281337 guest_tx=3814083738 +11:06:53 ctr_tx=3349829152 guest_tx=3814644484 +11:06:54 ctr_tx=3349829152 guest_tx=3814644887 +11:06:55 ctr_tx=3350787682 guest_tx=3815625808 +11:06:56 ctr_tx=3351490003 guest_tx=3816344392 +11:06:57 ctr_tx=3352106613 guest_tx=3816975651 +11:06:58 ctr_tx=3352106613 guest_tx=3816975942 +11:06:59 ctr_tx=3353116754 guest_tx=3818009581 +11:07:00 ctr_tx=3353116796 guest_tx=3818009918 +11:07:01 ctr_tx=3353817760 guest_tx=3818727406 +11:07:02 ctr_tx=3354502861 guest_tx=3819428484 +11:07:03 ctr_tx=3355188640 guest_tx=3820130356 +11:07:04 ctr_tx=3355188640 guest_tx=3820131009 +11:07:05 ctr_tx=3356009234 guest_tx=3820970756 +11:07:06 ctr_tx=3356796965 guest_tx=3821776742 +11:07:07 ctr_tx=3356796965 guest_tx=3821777159 +11:07:08 ctr_tx=3357362583 guest_tx=3822356060 +11:07:09 ctr_tx=3358373252 guest_tx=3823389926 +11:07:10 ctr_tx=3358732029 guest_tx=3823757310 +11:07:11 ctr_tx=3358732029 guest_tx=3823757661 +11:07:12 ctr_tx=3359810599 guest_tx=3824861218 +11:07:13 ctr_tx=3360478431 guest_tx=3825544735 +11:07:14 ctr_tx=3360478431 guest_tx=3825545970 +11:07:15 ctr_tx=3361095665 guest_tx=3826177788 +11:07:16 ctr_tx=3361095665 guest_tx=3826178120 +11:07:17 ctr_tx=3362466441 guest_tx=3827579026 +11:07:18 ctr_tx=3362466441 guest_tx=3827579358 +11:07:19 ctr_tx=3363305362 guest_tx=3828437977 +11:07:20 ctr_tx=3363630069 guest_tx=3828770462 +11:07:21 ctr_tx=3363630069 guest_tx=3828770884 +11:07:22 ctr_tx=3364692510 guest_tx=3829857745 +11:07:23 ctr_tx=3365239269 guest_tx=3830417406 +11:07:24 ctr_tx=3365873417 guest_tx=3831066529 +11:07:25 ctr_tx=3365873549 guest_tx=3831066885 +11:07:26 ctr_tx=3366815697 guest_tx=3832030595 +11:07:27 ctr_tx=3367448221 guest_tx=3832678035 +11:07:28 ctr_tx=3368050637 guest_tx=3833294485 +11:07:29 ctr_tx=3368050637 guest_tx=3833294907 +11:07:30 ctr_tx=3368050699 guest_tx=3833295301 +11:07:31 ctr_tx=3368050741 guest_tx=3833295699 +11:07:32 ctr_tx=3368050741 guest_tx=3833296097 +11:07:33 ctr_tx=3368050741 guest_tx=3833296453 +11:07:34 ctr_tx=3368050741 guest_tx=3833297173 +11:07:35 ctr_tx=3368050741 guest_tx=3833297529 +11:07:36 ctr_tx=3368050741 guest_tx=3833297861 +11:07:37 ctr_tx=3368052169 guest_tx=3833298217 +11:07:38 ctr_tx=3368052169 guest_tx=3833298712 +11:07:39 ctr_tx=3368052169 guest_tx=3833299134 +11:07:40 ctr_tx=3368052169 guest_tx=3833299466 +11:07:41 ctr_tx=3368052169 guest_tx=3833299906 +11:07:42 ctr_tx=3368052169 guest_tx=3833300238 +11:07:43 ctr_tx=3368052169 guest_tx=3833300594 +11:07:44 ctr_tx=3368052169 guest_tx=3833300992 +11:07:45 ctr_tx=3368052301 guest_tx=3833301348 +11:07:46 ctr_tx=3368052301 guest_tx=3833301680 +11:07:47 ctr_tx=3368052301 guest_tx=3833302102 +11:07:48 ctr_tx=3368052301 guest_tx=3833302434 +11:07:49 ctr_tx=3368052301 guest_tx=3833303522 +11:07:50 ctr_tx=3368052301 guest_tx=3833303942 +11:07:51 ctr_tx=3368052301 guest_tx=3833304381 +11:07:52 ctr_tx=3368052301 guest_tx=3833304801 +11:07:53 ctr_tx=3368052301 guest_tx=3833305240 +11:07:54 ctr_tx=3368052301 guest_tx=3833305726 +11:07:55 ctr_tx=3368052301 guest_tx=3833306249 +11:07:56 ctr_tx=3368052301 guest_tx=3833306669 +11:07:57 ctr_tx=3368052301 guest_tx=3833307174 +11:07:58 ctr_tx=3368052301 guest_tx=3833307506 +11:07:59 ctr_tx=3368052301 guest_tx=3833307948 +11:08:01 ctr_tx=3368052301 guest_tx=3833308285 +11:08:02 ctr_tx=3368052301 guest_tx=3833308636 +11:08:03 ctr_tx=3368052301 guest_tx=3833309181 +11:08:04 ctr_tx=3368052301 guest_tx=3833309532 +11:08:05 ctr_tx=3368052301 guest_tx=3833309935 +11:08:06 ctr_tx=3368052301 guest_tx=3833310286 +11:08:07 ctr_tx=3368052301 guest_tx=3833310789 +11:08:08 ctr_tx=3368052301 guest_tx=3833311140 +11:08:09 ctr_tx=3368052301 guest_tx=3833311477 +11:08:10 ctr_tx=3368052301 guest_tx=3833311904 +11:08:11 ctr_tx=3368052301 guest_tx=3833312325 +11:08:12 ctr_tx=3368052301 guest_tx=3833312718 +11:08:13 ctr_tx=3368052301 guest_tx=3833313121 +11:08:14 ctr_tx=3368052301 guest_tx=3833313472 +11:08:15 ctr_tx=3368052301 guest_tx=3833313875 diff --git a/documentation/audits/linetest-2026-10-27/sec1-host.txt b/documentation/audits/linetest-2026-10-27/sec1-host.txt new file mode 100644 index 00000000..17d0b967 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/sec1-host.txt @@ -0,0 +1,150 @@ +11:05:44 nic0_tx=10835385824 +11:05:45 nic0_tx=10836105439 +11:05:46 nic0_tx=10836737019 +11:05:47 nic0_tx=10836745529 +11:05:48 nic0_tx=10837779155 +11:05:49 nic0_tx=10838505203 +11:05:50 nic0_tx=10838513817 +11:05:51 nic0_tx=10839230759 +11:05:52 nic0_tx=10839947446 +11:05:53 nic0_tx=10840795720 +11:05:54 nic0_tx=10840798099 +11:05:55 nic0_tx=10841604925 +11:05:56 nic0_tx=10842186544 +11:05:57 nic0_tx=10842304662 +11:05:58 nic0_tx=10843594238 +11:05:59 nic0_tx=10843595212 +11:06:00 nic0_tx=10844052562 +11:06:01 nic0_tx=10845391161 +11:06:02 nic0_tx=10845392559 +11:06:03 nic0_tx=10846024611 +11:06:04 nic0_tx=10846025675 +11:06:05 nic0_tx=10847428113 +11:06:06 nic0_tx=10847429897 +11:06:07 nic0_tx=10848297292 +11:06:08 nic0_tx=10848631435 +11:06:09 nic0_tx=10848633002 +11:06:10 nic0_tx=10849719277 +11:06:11 nic0_tx=10850295044 +11:06:12 nic0_tx=10850943827 +11:06:13 nic0_tx=10850952184 +11:06:14 nic0_tx=10851915467 +11:06:15 nic0_tx=10852564306 +11:06:16 nic0_tx=10853248741 +11:06:17 nic0_tx=10853270223 +11:06:18 nic0_tx=10854260861 +11:06:19 nic0_tx=10855034035 +11:06:20 nic0_tx=10855057090 +11:06:21 nic0_tx=10855736582 +11:06:22 nic0_tx=10856777847 +11:06:23 nic0_tx=10857181701 +11:06:24 nic0_tx=10857183134 +11:06:25 nic0_tx=10858322825 +11:06:26 nic0_tx=10858329509 +11:06:27 nic0_tx=10859033359 +11:06:28 nic0_tx=10859698846 +11:06:29 nic0_tx=10860435373 +11:06:30 nic0_tx=10860436658 +11:06:31 nic0_tx=10861257686 +11:06:32 nic0_tx=10861738289 +11:06:33 nic0_tx=10861819440 +11:06:34 nic0_tx=10862657149 +11:06:35 nic0_tx=10863691944 +11:06:36 nic0_tx=10863701375 +11:06:37 nic0_tx=10864433012 +11:06:38 nic0_tx=10865101373 +11:06:39 nic0_tx=10865804901 +11:06:40 nic0_tx=10865805870 +11:06:41 nic0_tx=10866636034 +11:06:42 nic0_tx=10867425888 +11:06:43 nic0_tx=10868004758 +11:06:44 nic0_tx=10868005720 +11:06:45 nic0_tx=10869004700 +11:06:46 nic0_tx=10869005770 +11:06:47 nic0_tx=10869749766 +11:06:48 nic0_tx=10870381593 +11:06:49 nic0_tx=10871107676 +11:06:50 nic0_tx=10871121953 +11:06:51 nic0_tx=10871925790 +11:06:52 nic0_tx=10872725592 +11:06:53 nic0_tx=10873291138 +11:06:54 nic0_tx=10873292171 +11:06:55 nic0_tx=10874273722 +11:06:56 nic0_tx=10874996430 +11:06:57 nic0_tx=10875632329 +11:06:58 nic0_tx=10875633142 +11:06:59 nic0_tx=10876667411 +11:07:00 nic0_tx=10876668378 +11:07:01 nic0_tx=10877393504 +11:07:02 nic0_tx=10878095254 +11:07:03 nic0_tx=10878797756 +11:07:04 nic0_tx=10878799375 +11:07:05 nic0_tx=10879639752 +11:07:06 nic0_tx=10880446510 +11:07:07 nic0_tx=10880454848 +11:07:08 nic0_tx=10881034372 +11:07:09 nic0_tx=10882068875 +11:07:10 nic0_tx=10882447678 +11:07:11 nic0_tx=10882452162 +11:07:12 nic0_tx=10883563780 +11:07:13 nic0_tx=10884247934 +11:07:14 nic0_tx=10884249792 +11:07:15 nic0_tx=10884882583 +11:07:16 nic0_tx=10884883704 +11:07:17 nic0_tx=10886299805 +11:07:18 nic0_tx=10886306269 +11:07:19 nic0_tx=10887172783 +11:07:20 nic0_tx=10887521315 +11:07:21 nic0_tx=10887536486 +11:07:22 nic0_tx=10888631558 +11:07:23 nic0_tx=10889191676 +11:07:24 nic0_tx=10889841618 +11:07:25 nic0_tx=10889842781 +11:07:26 nic0_tx=10890814590 +11:07:27 nic0_tx=10891462667 +11:07:28 nic0_tx=10892079740 +11:07:29 nic0_tx=10892080799 +11:07:30 nic0_tx=10892094408 +11:07:31 nic0_tx=10892096933 +11:07:32 nic0_tx=10892105254 +11:07:33 nic0_tx=10892106247 +11:07:34 nic0_tx=10892107756 +11:07:35 nic0_tx=10892108881 +11:07:36 nic0_tx=10892109878 +11:07:37 nic0_tx=10892118479 +11:07:38 nic0_tx=10892124860 +11:07:39 nic0_tx=10892126179 +11:07:40 nic0_tx=10892139696 +11:07:41 nic0_tx=10892147979 +11:07:42 nic0_tx=10892151258 +11:07:43 nic0_tx=10892152251 +11:07:44 nic0_tx=10892153272 +11:07:45 nic0_tx=10892154265 +11:07:46 nic0_tx=10892162050 +11:07:47 nic0_tx=10892163629 +11:07:48 nic0_tx=10892164750 +11:07:49 nic0_tx=10892176424 +11:07:50 nic0_tx=10892196445 +11:07:51 nic0_tx=10892206601 +11:07:52 nic0_tx=10892219726 +11:07:53 nic0_tx=10892220802 +11:07:54 nic0_tx=10892221995 +11:07:55 nic0_tx=10892223491 +11:07:56 nic0_tx=10892231746 +11:07:57 nic0_tx=10892232888 +11:07:58 nic0_tx=10892233843 +11:07:59 nic0_tx=10892234922 +11:08:00 nic0_tx=10892242370 +11:08:02 nic0_tx=10892243878 +11:08:03 nic0_tx=10892245046 +11:08:04 nic0_tx=10892246034 +11:08:05 nic0_tx=10892247060 +11:08:06 nic0_tx=10892248048 +11:08:07 nic0_tx=10892249174 +11:08:08 nic0_tx=10892257726 +11:08:09 nic0_tx=10892258686 +11:08:10 nic0_tx=10892259841 +11:08:11 nic0_tx=10892275237 +11:08:12 nic0_tx=10892276333 +11:08:13 nic0_tx=10892284797 +11:08:14 nic0_tx=10892285785 diff --git a/documentation/audits/linetest-2026-10-27/socket-queues.txt b/documentation/audits/linetest-2026-10-27/socket-queues.txt new file mode 100644 index 00000000..88e6acbb --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/socket-queues.txt @@ -0,0 +1,15 @@ +== 11:13:47 +-- qbittorrent (container netns), established, port 6881: +-- forwarder (guest netns), established, port 6881: +== 11:13:50 +-- qbittorrent (container netns), established, port 6881: +-- forwarder (guest netns), established, port 6881: +== 11:13:53 +-- qbittorrent (container netns), established, port 6881: +-- forwarder (guest netns), established, port 6881: +== 11:13:56 +-- qbittorrent (container netns), established, port 6881: +-- forwarder (guest netns), established, port 6881: +== 11:13:59 +-- qbittorrent (container netns), established, port 6881: +-- forwarder (guest netns), established, port 6881: diff --git a/documentation/audits/linetest-2026-10-27/teardown.txt b/documentation/audits/linetest-2026-10-27/teardown.txt new file mode 100644 index 00000000..e4b380ec --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/teardown.txt @@ -0,0 +1,21 @@ +== 1. DooPlex qBittorrent: torrent + data removed +left in the list: [] +left on disk: total 8 +drwxr-xr-x 2 abc users 4096 Oct 27 13:59 . +drwxrwxrwt 1 root root 4096 Oct 27 12:09 .. +categories: {"prowlarr":{"download_path":null,"inactive_seeding_time_limit":-2,"name":"prowlarr","ratio_limit":-2,"savePath":"","seeding_time_limit":-2,"share_limit_action":"Default","share_limits_mode":"Default" +== 2. forwarder stopped, my seed folder removed (made by hand, not by the product) +0 +movies +tv +== 3. app removed through the product +stop: 200 +remove: 200 {'ok': True, 'data': {'removed': 'qbittorrent', 'volumes_removed': ['qbittorrent_qbittorrent_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'user +== 4. verify: no container, no app.yaml, no volume +0 +ls: cannot access '/opt/docker/stacks/qbittorrent/app.yaml': No such file or directory +0 +0 +/tmp/r1250 removed +0 +326 torrents diff --git a/documentation/audits/linetest-2026-10-27/tools/dooplex_qb.sh b/documentation/audits/linetest-2026-10-27/tools/dooplex_qb.sh new file mode 100755 index 00000000..4a4cd3a5 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/dooplex_qb.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# dooplex_qb.sh add|status|remove — R-1250 live test (2026-10-27) only: DooPlex's qBittorrent as the DOWNLOAD-ONLY peer. +# add: the torrent saved to the pod's /tmp/r1250 (never a media folder), its download capped at 375000 B/s (3 Mbit/s, +# above the agent's 2 Mbit/s quiet line), the seed's address given as its peer. remove: the torrent AND its data. +set -u +H=8828f12fe7899fa6a8a1c4994c26f11ae19eb6fa; TOR=$(dirname "$0")/../p8ev/r1250.torrent +P=$(sudo kubectl -n servarr-system get pod -l app=qbittorrent -o name | head -1); P=${P#pod/} +x(){ sudo kubectl -n servarr-system exec "$P" -- "$@"; } +B=http://127.0.0.1:8080/api/v2 +case "$1" in +add) + sudo kubectl -n servarr-system cp "$TOR" "$P:/tmp/r1250.torrent" >/dev/null + x curl -s -F torrents=@/tmp/r1250.torrent -F savepath=/tmp/r1250 -F dlLimit=375000 -F category=cc-r1250 $B/torrents/add; echo + sleep 3 + x curl -s --data "hashes=$H&limit=375000" $B/torrents/setDownloadLimit; x curl -s --data "hashes=$H&value=0" $B/torrents/setShareLimits >/dev/null 2>&1 + x curl -s --data "hashes=$H&peers=192.168.0.155:6881" $B/torrents/addPeers; echo + x rm -f /tmp/r1250.torrent ;; +status) + x curl -s "$B/torrents/info?hashes=$H" | python3 -c 'import json,sys +for t in json.load(sys.stdin): print(t["name"], t["state"], "%.1f%%" % (t["progress"]*100), "dl %.2f Mbit/s" % (t["dlspeed"]*8/1e6), "limit", t["dl_limit"], "seeds", t["num_seeds"], "save", t["save_path"])' ;; +remove) + x curl -s --data "hashes=$H&deleteFiles=true" $B/torrents/delete; sleep 3 + echo "left in the list: $(x curl -s "$B/torrents/info?hashes=$H")"; echo "left on disk: $(x sh -c 'ls -la /tmp/r1250 2>&1 | head -3')" + x curl -s "$B/torrents/categories" | grep -q cc-r1250 && x curl -s --data "categories=cc-r1250" $B/torrents/removeCategories; echo "categories: $(x curl -s $B/torrents/categories | head -c 200)" ;; +esac diff --git a/documentation/audits/linetest-2026-10-27/tools/fwd.py b/documentation/audits/linetest-2026-10-27/tools/fwd.py new file mode 100644 index 00000000..ab20f782 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/fwd.py @@ -0,0 +1,36 @@ +# R-1250 live test only (2026-10-27): forward guest 9201's LAN :6881 (TCP and UDP) to its throwaway qBittorrent +# container, so DooPlex's qBittorrent can reach the seed. Started by hand, killed at teardown. +import socket, sys, threading +LAN, DST = sys.argv[1], (sys.argv[2], 6881) +def pipe(a, b): + try: + while True: + d = a.recv(65536) + if not d: break + b.sendall(d) + except OSError: pass + finally: + for s in (a, b): + try: s.shutdown(socket.SHUT_RDWR) + except OSError: pass +def udp(): + us = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); us.bind((LAN, 6881)); peers = {} + def back(client, s): + while True: + try: d, _ = s.recvfrom(65536) + except OSError: return + us.sendto(d, client) + while True: + d, client = us.recvfrom(65536) + s = peers.get(client) + if s is None: + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.connect(DST); peers[client] = s + threading.Thread(target=back, args=(client, s), daemon=True).start() + s.send(d) +threading.Thread(target=udp, daemon=True).start() +ls = socket.socket(); ls.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); ls.bind((LAN, 6881)); ls.listen(16) +while True: + c, _ = ls.accept() + u = socket.create_connection(DST) + threading.Thread(target=pipe, args=(c, u), daemon=True).start() + threading.Thread(target=pipe, args=(u, c), daemon=True).start() diff --git a/documentation/audits/linetest-2026-10-27/tools/gsample.sh b/documentation/audits/linetest-2026-10-27/tools/gsample.sh new file mode 100755 index 00000000..a1ab7fbc --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/gsample.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# gsample.sh — INSIDE guest 9201: one sample of the seeder (its limits, speed) and the controller's line-test records. +Q=/root/r1250/qbg.sh +P=$(sh $Q app/preferences | python3 -c 'import json,sys +try: + d=json.load(sys.stdin); print("up_limit=%s alt_up_limit=%s" % (d.get("up_limit"), d.get("alt_up_limit"))) +except Exception as e: print("prefs unreadable")') +M=$(sh $Q transfer/speedLimitsMode) +T=$(sh $Q transfer/info | python3 -c 'import json,sys +try: + d=json.load(sys.stdin); print("up_speed=%.2fMbit" % (d.get("up_info_speed",0)*8/1e6)) +except Exception: print("transfer unreadable")') +R=$(python3 -c 'import json +d=json.load(open("/var/lib/docker/volumes/felhom-controller-data/_data/data/settings.json")); u=d.get("upwatch") or {} +print("upwatch=%s" % json.dumps(u)[:400])' 2>&1) +echo "$(date -u +%H:%M:%S) seeder: $P alt_mode=$M $T | ctl: $R" diff --git a/documentation/audits/linetest-2026-10-27/tools/gsetup.sh b/documentation/audits/linetest-2026-10-27/tools/gsetup.sh new file mode 100755 index 00000000..f322d5e0 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/gsetup.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# gsetup.sh — INSIDE guest 9201 (R-1250 live test, 2026-10-27): a SPARSE 3 GiB seed file in the throwaway qBittorrent's +# downloads folder, a private torrent of it made by qBittorrent's own creator, its peer settings (fixed port 6881, no +# DHT/PeX/LSD so it talks to the one LAN peer only). Prints the container IP and the torrent's hash. No secret printed. +set -eu +Q=/root/r1250/qbg.sh +D=/mnt/felhom-drives/hdd_1/userdata/media/torrents/r1250 +mkdir -p $D; [ -f $D/r1250-seed.bin ] || truncate -s 3G $D/r1250-seed.bin +chown -R 1000:1000 $D 2>/dev/null || true +ls -ls $D +sh $Q app/setPreferences 'json={"listen_port":6881,"upnp":false,"dht":false,"pex":false,"lsd":false,"queueing_enabled":false,"max_connec_per_torrent":20}' +T=$(sh $Q torrentcreator/addTask 'sourcePath=/downloads/r1250/r1250-seed.bin&private=true&startSeeding=true&comment=R-1250 live proof, LAN only') +echo "addTask: $T"; ID=$(echo "$T" | grep -oE '"taskID":"[^"]+"' | cut -d'"' -f4) +i=0; while [ $i -lt 120 ]; do S=$(sh $Q "torrentcreator/status?taskID=$ID"); echo "$S" | grep -q '"Finished"' && break; i=$((i+1)); sleep 2; done +echo "creator: $(echo "$S" | grep -oE '"(status|errorMessage|pieceSize)":[^,]*' | paste -sd' ')" +docker exec qbittorrent sh -c 'ls /config/qBittorrent/BT_backup 2>/dev/null | head' || true +sh $Q torrents/info | python3 -c 'import json,sys +for t in json.load(sys.stdin): print("torrent", t["name"], t["hash"], t["state"], "size", t["size"], "private", t.get("private"))' +docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' qbittorrent diff --git a/documentation/audits/linetest-2026-10-27/tools/install_qb.py b/documentation/audits/linetest-2026-10-27/tools/install_qb.py new file mode 100644 index 00000000..09ecbc08 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/install_qb.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +"""install_qb.py — Part 8 (R-1250): install a THROWAWAY qBittorrent on demo-hp guest 9201 through the endpoints the UI +invokes (box_walk). usage: SC= TARGET=9201 DRIVE_ROOT=/mnt/felhom-drives/hdd_1 python3 -u install_qb.py""" +import os, sys +sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/catalog-sweep-2026-10-24/tools") +import box_walk as w +w.login() +code, d = w.ctl("GET", "/api/stacks/qbittorrent/deploy-fields") +print("deploy-fields:", code, [(f.get("env_var"), f.get("type"), f.get("required")) for f in ((((d.get("data") or {}).get("metadata") or {}).get("deploy_fields")) or [])]) +ok = w.deploy("qbittorrent", "qbline") +print("deployed:", ok) +print("answers:", ok and w.wait_app("qbline", "/", tries=60, delay=5)) diff --git a/documentation/audits/linetest-2026-10-27/tools/limitprobe.sh b/documentation/audits/linetest-2026-10-27/tools/limitprobe.sh new file mode 100644 index 00000000..fc1fba26 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/limitprobe.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# limitprobe.sh — INSIDE guest 9201, R-1250 diagnosis on the THROWAWAY qBittorrent only (no line test is started): the +# controller's own hold value (up_limit 1024 B/s, the same app/preferences call) for 60 s, then the exact previous +# value back. Each second: qBittorrent's reported limit + speed and the bytes its container sent. +Q=/root/r1250/qbg.sh; PID=$(docker inspect -f '{{.State.Pid}}' qbittorrent) +rd(){ sh $Q transfer/info | python3 -c 'import json,sys;d=json.load(sys.stdin);print("limit=%s speed=%.2f" % (d.get("up_rate_limit"), d.get("up_info_speed",0)*8/1e6))'; } +PREV=$(sh $Q app/preferences | python3 -c 'import json,sys;print(json.loads(sys.stdin.read().replace("\\\\","/")).get("up_limit"))' 2>/dev/null) +echo "previous up_limit=$PREV"; [ -n "$PREV" ] || { echo "cannot read the previous limit — no probe"; exit 1; } +c0=$(awk '/eth0:/{print $10}' /proc/$PID/net/dev) +echo "$(date -u +%T) set up_limit=1024: $(sh $Q app/setPreferences 'json={"up_limit":1024}'; echo ok)" +i=0; while [ $i -lt 60 ]; do sleep 1; c=$(awk '/eth0:/{print $10}' /proc/$PID/net/dev); echo "$(date -u +%T) t=$((i+1))s ctr=$(( (c-c0)*8/1000 ))kbit $(rd)"; c0=$c; i=$((i+1)); done +echo "$(date -u +%T) put back up_limit=$PREV: $(sh $Q app/setPreferences "json={\"up_limit\":$PREV}"; echo ok)" +sleep 2; echo "after: $(rd)" diff --git a/documentation/audits/linetest-2026-10-27/tools/qbg.sh b/documentation/audits/linetest-2026-10-27/tools/qbg.sh new file mode 100755 index 00000000..3aa75cf3 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/qbg.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# qbg.sh [form data] [-F] — INSIDE guest 9201: one call to the throwaway qBittorrent's API from inside its +# container. The admin password is read from the container's own env inside the container — never an argument, never printed. +P="$1"; D="${2:-}" +docker exec -i -e AP="$P" -e AD="$D" qbittorrent sh -s <<'IN' +c=/tmp/r1250.c; B=http://localhost:8080 +printf 'username=admin&password=%s' "$QBT_ADMIN_PASSWORD" | curl -s -o /dev/null -c $c -H "Referer: $B" --data-binary @- $B/api/v2/auth/login +if [ -n "$AD" ]; then curl -s -b $c -H "Referer: $B" --data "$AD" "$B/api/v2/$AP"; else curl -s -b $c -H "Referer: $B" "$B/api/v2/$AP"; fi +rm -f $c +IN diff --git a/documentation/audits/linetest-2026-10-27/tools/qbsec.sh b/documentation/audits/linetest-2026-10-27/tools/qbsec.sh new file mode 100644 index 00000000..7ad10970 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/qbsec.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# qbsec.sh — INSIDE guest 9201 (R-1250 diagnosis, read only): each second, qBittorrent's own view of the global +# upload limit (transfer/info up_rate_limit and preferences up_limit) and its upload speed. +i=0; while [ $i -lt $1 ]; do + T=$(sh /root/r1250/qbg.sh transfer/info); P=$(sh /root/r1250/qbg.sh app/preferences) + printf '%s %s %s\n' "$(date -u +%H:%M:%S)" "$(echo "$T" | python3 -c 'import json,sys;d=json.load(sys.stdin);print("rate_limit=%s up_speed=%.2fMbit" % (d.get("up_rate_limit"), d.get("up_info_speed",0)*8/1e6))' 2>&1)" "$(echo "$P" | python3 -c 'import json,sys;d=json.load(sys.stdin);print("pref_up_limit=%s" % d.get("up_limit"))' 2>&1)" + i=$((i+1)) +done diff --git a/documentation/audits/linetest-2026-10-27/tools/remove_qb.py b/documentation/audits/linetest-2026-10-27/tools/remove_qb.py new file mode 100644 index 00000000..46a4b9e8 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/remove_qb.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +"""remove_qb.py — Part 8 teardown: the throwaway qBittorrent on 9201 removed THROUGH THE PRODUCT (stop, then remove). The +shared library folder media/torrents (older than this test) and the app's older backups stay: remove_hdd_data and +remove_backups are false. usage: SC= TARGET=9201 python3 remove_qb.py""" +import sys, time +sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/catalog-sweep-2026-10-24/tools") +import box_walk as w +w.login() +print("stop:", w.ctl("POST", "/api/stacks/qbittorrent/stop")[0]) +time.sleep(5) +c, d = w.ctl("POST", "/api/stacks/qbittorrent/remove", {"remove_hdd_data": False, "remove_backups": False}) +print("remove:", c, str(d)[:160]) diff --git a/documentation/audits/linetest-2026-10-27/tools/sec1.sh b/documentation/audits/linetest-2026-10-27/tools/sec1.sh new file mode 100644 index 00000000..2d44ece5 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/sec1.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# sec1.sh — INSIDE guest 9201 (R-1250 diagnosis, read only): every second, the bytes the throwaway qBittorrent +# container sent (its own eth0, inside its netns) and the bytes the guest sent on its LAN eth0 (after the forwarder). +N=$1; PID=$(docker inspect -f '{{.State.Pid}}' qbittorrent) +i=0; while [ $i -lt $N ]; do + c=$(awk '/eth0:/{print $10}' /proc/$PID/net/dev); g=$(cat /sys/class/net/eth0/statistics/tx_bytes) + echo "$(date -u +%H:%M:%S) ctr_tx=$c guest_tx=$g"; i=$((i+1)); sleep 1 +done diff --git a/documentation/audits/linetest-2026-10-27/tools/ssq.sh b/documentation/audits/linetest-2026-10-27/tools/ssq.sh new file mode 100644 index 00000000..b468e312 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/ssq.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# ssq.sh — INSIDE guest 9201 (R-1250 diagnosis, read only): the queued bytes on the seed's TCP sockets — qBittorrent's own +# (in its container's netns) and the forwarder's two (guest netns) — five readings 3 s apart. +PID=$(docker inspect -f '{{.State.Pid}}' qbittorrent) +for i in 1 2 3 4 5; do + echo "== $(date -u +%T)" + echo "-- qbittorrent (container netns), established, port 6881:" + nsenter -t $PID -n ss -tni state established '( sport = :6881 or dport = :6881 )' | grep -v '^Recv' | awk 'NR%2==1{printf "%s ",$0; next}{print}' | awk '{print "Recv-Q="$1, "Send-Q="$2, $3, $4}' + echo "-- forwarder (guest netns), established, port 6881:" + ss -tni state established '( sport = :6881 or dport = :6881 )' | grep -v '^Recv' | awk 'NR%2==1{printf "%s ",$0; next}{print}' | awk '{print "Recv-Q="$1, "Send-Q="$2, $3, $4}' + sleep 3 +done diff --git a/documentation/audits/linetest-2026-10-27/tools/watch.sh b/documentation/audits/linetest-2026-10-27/tools/watch.sh new file mode 100755 index 00000000..a2b9e7cd --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/tools/watch.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# watch.sh — on DooPlex, 2026-10-27 from ~09:45 CET: sample every 60 s; stop 20 min after the agent's +# measurement AND the controller's „limit is back" line, or at 16:05 CET. Reads only; forces nothing. +E=$1; since=$(date -u +%Y-%m-%dT%H:%M:%SZ); done_at="" +while true; do + ssh -o ConnectTimeout=20 demo-hp "pct exec 9201 -- sh /root/r1250/gsample.sh" >> $E/samples.txt 2>&1 + ssh -o ConnectTimeout=20 demo-hp "journalctl -u felhom-agent --since '$since' --no-pager | grep -iE 'linetest'" > $E/agent-linetest.txt 2>&1 + ssh -o ConnectTimeout=20 demo-hp "pct exec 9201 -- sh -c 'docker logs --since $since felhom-controller 2>&1 | grep -iE \"upwatch|line test|qbittorrent.*limit\" | grep -v DEBUG'" > $E/controller-upwatch.txt 2>&1 + if [ -z "$done_at" ] && grep -q "upload line measured" $E/agent-linetest.txt && grep -q "limit is back" $E/controller-upwatch.txt; then + done_at=$(date +%s); echo "$(date -u +%T) TEST DONE — 20 more minutes for the 50 % rule's tick" >> $E/samples.txt + fi + [ -n "$done_at" ] && [ $(( $(date +%s) - done_at )) -ge 1200 ] && { echo "$(date -u +%T) watch end (done)" >> $E/samples.txt; exit 0; } + [ "$(TZ=Europe/Budapest date +%H%M)" -ge 1605 ] && { echo "$(date -u +%T) watch end (16:05 CET)" >> $E/samples.txt; exit 0; } + sleep 60 +done diff --git a/documentation/audits/linetest-2026-10-27/udp-queues.txt b/documentation/audits/linetest-2026-10-27/udp-queues.txt new file mode 100644 index 00000000..4350d0a7 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/udp-queues.txt @@ -0,0 +1,17 @@ +11:14:23 +container: UNCONN 0 0 172.18.0.17%eth0:6881 0.0.0.0:* UNCONN 0 0 127.0.0.1%lo:6881 0.0.0.0:* UNCONN 0 0 [::1]%lo:6881 [::]:* +guest: UNCONN 0 0 192.168.0.155:6881 0.0.0.0:* ESTAB 0 0 172.18.0.1:57134 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:58337 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:45298 172.18.0.17:6881 +11:14:25 +container: UNCONN 0 0 172.18.0.17%eth0:6881 0.0.0.0:* UNCONN 0 0 127.0.0.1%lo:6881 0.0.0.0:* UNCONN 0 0 [::1]%lo:6881 [::]:* +guest: UNCONN 0 0 192.168.0.155:6881 0.0.0.0:* ESTAB 0 0 172.18.0.1:57134 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:58337 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:45298 172.18.0.17:6881 +11:14:27 +container: UNCONN 0 0 172.18.0.17%eth0:6881 0.0.0.0:* UNCONN 0 0 127.0.0.1%lo:6881 0.0.0.0:* UNCONN 0 0 [::1]%lo:6881 [::]:* +guest: UNCONN 0 0 192.168.0.155:6881 0.0.0.0:* ESTAB 0 0 172.18.0.1:57134 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:58337 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:45298 172.18.0.17:6881 +11:14:29 +container: UNCONN 0 0 172.18.0.17%eth0:6881 0.0.0.0:* UNCONN 0 0 127.0.0.1%lo:6881 0.0.0.0:* UNCONN 0 0 [::1]%lo:6881 [::]:* +guest: UNCONN 0 0 192.168.0.155:6881 0.0.0.0:* ESTAB 0 0 172.18.0.1:57134 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:58337 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:45298 172.18.0.17:6881 +11:14:31 +container: UNCONN 0 0 172.18.0.17%eth0:6881 0.0.0.0:* UNCONN 0 0 127.0.0.1%lo:6881 0.0.0.0:* UNCONN 0 0 [::1]%lo:6881 [::]:* +guest: UNCONN 0 0 192.168.0.155:6881 0.0.0.0:* ESTAB 0 0 172.18.0.1:57134 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:58337 172.18.0.17:6881 ESTAB 0 0 172.18.0.1:45298 172.18.0.17:6881 +net.core.rmem_default = 212992 +net.core.wmem_default = 212992 diff --git a/documentation/audits/linetest-2026-10-27/upwatch-settings-after.txt b/documentation/audits/linetest-2026-10-27/upwatch-settings-after.txt new file mode 100644 index 00000000..419bc7f1 --- /dev/null +++ b/documentation/audits/linetest-2026-10-27/upwatch-settings-after.txt @@ -0,0 +1,30 @@ +{ + "line": [ + { + "at": "2026-10-25T03:17:47Z", + "peak10_mbps": 7.54, + "bytes": 18588326, + "seconds": 46, + "counts": false + }, + { + "at": "2026-10-26T03:17:56Z", + "peak10_mbps": 5.99, + "bytes": 17694322, + "seconds": 55, + "counts": false + }, + { + "at": "2026-10-27T03:18:41Z", + "peak10_mbps": 97.21, + "bytes": 169114983, + "seconds": 82, + "counts": true + } + ], + "qb_limit": { + "box_set_bytes": 5898240, + "line_mbps": 94.38232008767471, + "set_at": "2026-10-27T07:06:17Z" + } +} diff --git a/documentation/audits/release-2026-10-27/agent-0167-tester1-demofelhom.txt b/documentation/audits/release-2026-10-27/agent-0167-tester1-demofelhom.txt new file mode 100644 index 00000000..5ad8c12a --- /dev/null +++ b/documentation/audits/release-2026-10-27/agent-0167-tester1-demofelhom.txt @@ -0,0 +1,18 @@ +demo-felhom +felhom-agent 0.167.0 +Oct 27 10:25:25 demo-felhom felhom-agent[1634408]: time=2026-10-27T10:25:25.584+01:00 level=WARN msg="selfupdate: new version running — dwelling before commit" version=0.167.0 prev=0.166.0 dwell=1m0 +Oct 27 10:26:25 demo-felhom sudo[1636399]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/local/sbin/felhom-selfupdate-guarded commit +Oct 27 10:26:25 demo-felhom felhom-agent[1634408]: time=2026-10-27T10:26:25.627+01:00 level=WARN msg="selfupdate: update committed" version=0.167.0 wrapper="" +Oct 27 10:26:25 demo-felhom felhom-agent[1634408]: time=2026-10-27T10:26:25.627+01:00 level=INFO msg="osupdate: running the bundle policy pass after the self-update commit (R-1285)" agent_version=0.16 +Oct 27 10:26:25 demo-felhom felhom-agent[1634408]: time=2026-10-27T10:26:25.745+01:00 level=INFO msg="osupdate: wrapper" line="os-apply: BUNDLE POLICY DONE install_mode=appliance removed=0" +Oct 27 10:26:25 demo-felhom felhom-agent[1634408]: time=2026-10-27T10:26:25.745+01:00 level=INFO msg="osupdate: bundle policy pass done" bundle_policy="{\"install_mode\": \"appliance\", \"removed\": [ +felhom +felhom-agent 0.167.0 +Oct 27 10:32:30 felhom sudo[963380]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/local/sbin/felhom-selfupdate-guarded commit +Oct 27 10:32:30 felhom felhom-agent[961489]: time=2026-10-27T10:32:30.608+01:00 level=WARN msg="selfupdate: update committed" version=0.167.0 wrapper="" +Oct 27 10:32:30 felhom felhom-agent[961489]: time=2026-10-27T10:32:30.609+01:00 level=INFO msg="osupdate: running the bundle policy pass after the self-update commit (R-1285)" agent_version=0.167.0 +Oct 27 10:32:30 felhom felhom-os-apply[963416]: os-apply: BUNDLE POLICY DONE install_mode=appliance removed=0 +Oct 27 10:32:30 felhom felhom-agent[961489]: time=2026-10-27T10:32:30.744+01:00 level=INFO msg="osupdate: wrapper" line="os-apply: BUNDLE POLICY DONE install_mode=appliance removed=0" +Oct 27 10:32:30 felhom felhom-agent[961489]: time=2026-10-27T10:32:30.744+01:00 level=INFO msg="osupdate: bundle policy pass done" bundle_policy="{\"install_mode\": \"appliance\", \"removed\": []}" + +[exited with code 0] diff --git a/documentation/audits/release-2026-10-27/agent-rel-0167.txt b/documentation/audits/release-2026-10-27/agent-rel-0167.txt new file mode 100644 index 00000000..3ad88fa1 --- /dev/null +++ b/documentation/audits/release-2026-10-27/agent-rel-0167.txt @@ -0,0 +1,29 @@ +[release-agent] building 0.167.0 … +[release-agent] built ok: sha256 28bdd2826f45f3767880fcff4d3105afb7247c09c0ced99d78b3a978d8d826f0 +[release-agent] config bundle built: sha256 9d0344164b22634159984bfbcdaf77c53e6d2423812973ed8b4f2135a7ed1268 +[release-agent] tagging v0.167.0 at 54d3a10 … +[release-agent] publishing … +[publish-agent] publishing /tmp/felhom-agent-RAFefZ (16296021 bytes, sha256 28bdd2826f45f376…) → https://gitea.dooplex.hu/api/packages/admin/generic/felhom-agent/0.167.0/felhom-agent +[publish-agent] pre-delete existing artifact: HTTP 404 (404/204 expected) +[publish-agent] upload OK (HTTP 201) +[publish-agent] round-trip GET verified (sha256 matches) +[publish-agent] DONE. Record in the hub operator UI (Configs → Day-0 artifacts): agent 0.167.0 / 28bdd2826f45f3767880fcff4d3105afb7247c09c0ced99d78b3a978d8d826f0 +[release-agent] config bundle published (HTTP 201) +[release-agent] pushing v0.167.0 … +remote: . Processing 1 references +remote: Processed 1 references in total +To https://gitea.dooplex.huAGENT_VERSION=0.167.0 +AGENT_SHA256=28bdd2826f45f3767880fcff4d3105afb7247c09c0ced99d78b3a978d8d826f0 + + RELEASED — and installable, verified by download, not by this script's own say-so. + + version : 0.167.0 + tag : v0.167.0 + sha256 : 28bdd2826f45f3767880fcff4d3105afb7247c09c0ced99d78b3a978d8d826f0 + bundle : 9d0344164b22634159984bfbcdaf77c53e6d2423812973ed8b4f2135a7ed1268 (felhom-config-bundle.json — vouch it with the agent) + + NOT VOUCHED. Vouching is what points machines at this version and stays your deliberate act: + hub operator UI → Configs → Day-0 artifacts. Until then boxes keep installing the previous one. +/admin/felhom-agent.git + * [new tag] v0.167.0 -> v0.167.0 +[release-agent] verifying by independent download … diff --git a/documentation/audits/release-2026-10-27/boxes-0.346.0/demo-felhom-controller.log b/documentation/audits/release-2026-10-27/boxes-0.346.0/demo-felhom-controller.log new file mode 100644 index 00000000..05ea4828 --- /dev/null +++ b/documentation/audits/release-2026-10-27/boxes-0.346.0/demo-felhom-controller.log @@ -0,0 +1,70 @@ +grep: write error: Broken pipe +2026/10/27 14:09:43 [INFO] felhom-controller 0.346.0 starting (customer: demo-felhom, domain: demo-felhom.eu) +2026/10/27 14:09:43 [INFO] [selfupdate] Post-update startup: update successful (0.345.1 → 0.346.0) +apps: +opengist Up 10 hours (healthy) +prowlarr Up 10 hours (healthy) +qbittorrent Up 10 hours (healthy) +radarr Up 10 hours (healthy) +sonarr Up 10 hours (healthy) +unhealthy: 0 +2026/10/27 14:09:43 [INFO] local-api: channel up (agent 169.254.253.1:8443) — guest 9201, 3 mount(s) visible +2026/10/27 14:09:43 [INFO] local-api: mount mp0 → /var/lib/felhom (storage=local-lvm, class=, backup=true) +2026/10/27 14:09:43 [INFO] local-api: mount mp9 → /etc/felhom-bootstrap (storage=/var/lib/felhom-agent/guests/9201/bootstrap, class=, backup=false) +2026/10/27 14:09:43 [INFO] local-api: mount mp8 → /mnt/felhom-drives (storage=/mnt/felhom-drives, class=, backup=false) +2026/10/27 14:09:43 [INFO] felhom-controller 0.346.0 starting (customer: demo-felhom, domain: demo-felhom.eu) +2026/10/27 14:09:43 [INFO] [settings] Loaded settings from /opt/docker/felhom-controller/data/settings.json +2026/10/27 14:09:43 [INFO] Encryption key loaded from /opt/docker/felhom-controller/data/encryption.key +2026/10/27 14:09:43 [INFO] [stacks] Using compose command: docker compose +2026/10/27 14:09:43 [INFO] [stacks] ScanStacks complete: 68 stacks found (5 deployed, 63 available) +2026/10/27 14:09:43 [INFO] [stacks] Status refresh: 8 containers across 68 stacks +2026/10/27 14:09:43 [INFO] [stacks] InjectMissingFields: processed 5 stacks +2026/10/27 14:09:43 [INFO] [stacks] Encryption migration: no stacks needed migration +2026/10/27 14:09:43 [INFO] [quiesce] loop started (poll 5m0s, max-quiesce 30m0s) +2026/10/27 14:09:43 [INFO] [stacks] desired-state backfill: 0 app(s) recorded as running, 0 left unrecorded (state ambiguous — legacy boot behaviour retained) +2026/10/27 14:09:43 [INFO] [stacks] installed-images backfill: 0 app(s) recorded, 5 already had a record, 0 left unrecorded (could not be observed completely — unknown, which renders nothing) +2026/10/27 14:09:43 [INFO] [stacks] pin adoption: 0 pinned, 5 already pinned, 0 left unpinned (0 not completely observed, 0 running something the template no longer offers) +2026/10/27 14:09:43 [INFO] [stacks] applied-meta backfill (R-646): recorded 0 []; skipped 0 [] — not current with the catalog, their pinned version's .felhom.yml is no longer on the box +2026/10/27 14:09:43 [INFO] [sync] Starting catalog sync (repo: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git, interval: 15m0s) +2026/10/27 14:09:43 [INFO] [sync] Starting catalog sync +2026/10/27 14:09:43 [INFO] Metrics store opened at /opt/docker/felhom-controller/data/metrics.db +2026/10/27 14:09:43 [INFO] Metrics collector started (60s interval) +2026/10/27 14:09:43 [INFO] [sync] Pulling latest from https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (branch: main) +2026/10/27 14:09:43 [INFO] [tier2] start-up: no leftover second-drive copy container +2026/10/27 14:09:43 [INFO] [backup] restore record wired: /opt/docker/felhom-controller/data/restore-status.json (interrupted at startup: false) +2026/10/27 14:09:43 [INFO] [backup] app-data run record wired: /opt/docker/felhom-controller/data/appdata-run.json (an earlier cut still shown: false) +2026/10/27 14:09:43 [INFO] Notifier enabled (hub: https://hub.felhom.eu) +2026/10/27 14:09:43 [INFO] [upwatch] the host's weekly line test: 94.0 Mbit/s (measured 2026-10-27T09:20:13Z) +2026/10/27 14:09:43 [INFO] [upwatch] upload and CPU watch started (line 94 Mbit/s, qBittorrent share 50 %) +2026/10/27 14:09:43 [INFO] [selfupdate] Post-update startup: update successful (0.345.1 → 0.346.0) +2026/10/27 14:09:43 [INFO] Self-update enabled (check every 6h, auto-update: false, auto-update time: 04:30) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: status-refresh (every 10s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: stack-scan (every 2m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: docker-socket-watch (every 15s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: docker-socket-users (every 5m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: health-probes (every 10s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: system-health (every 5m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: after-unclean-boot (every 30s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: hold-report (every 1m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: deadapp-check (every 30s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: ring-spill (every 30s) +2026/10/27 14:09:43 [INFO] [offsite-apply] settle-gate: awaiting floor knowledge (first report ACK) before offsite apply +2026/10/27 14:09:43 [INFO] [scheduler] Daily job db-dump scheduled for 2026-10-28 02:30 CET +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: offsite-credential-retry (every 5m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: backup-cache (every 5m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: conversion-copy-release (every 1h0m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Daily job tier2-backup scheduled for 2026-10-28 03:30 CET +2026/10/27 14:09:43 [INFO] [scheduler] Daily job offbox-backup scheduled for 2026-10-28 04:15 CET +2026/10/27 14:09:43 [INFO] [catch-up] controller start: no backup leg missed its last scheduled time — nothing to make up +2026/10/27 14:09:43 [INFO] [scheduler] Daily job offsite-abandon-sweep scheduled for 2026-10-28 05:10 CET +2026/10/27 14:09:43 [INFO] [scheduler] Daily job offsite-integrity scheduled for 2026-10-28 06:00 CET +2026/10/27 14:09:43 [INFO] [scheduler] Daily job offsite-proof scheduled for 2026-10-28 05:30 CET +2026/10/27 14:09:43 [INFO] [scheduler] Daily job metrics-prune scheduled for 2026-10-28 04:00 CET +2026/10/27 14:09:43 [INFO] [scheduler] Daily job fill-watch scheduled for 2026-10-28 03:30 CET +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: fill-watch-interval (every 10m0s) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: hub-report (every 15m0s) +2026/10/27 14:09:43 [INFO] Hub reporting enabled (every 15m0s to https://hub.felhom.eu) +2026/10/27 14:09:43 [INFO] [scheduler] Registered periodic job: selfupdate-check (every 6h0m0s) +2026/10/27 14:09:43 [INFO] ========== Startup Self-Test ========== +2026/10/27 14:09:43 [INFO] [PASS] Docker socket: reachable (v29.9.2) +2026/10/27 14:09:43 [INFO] [PASS] Stacks directory: /opt/docker/stacks diff --git a/documentation/audits/release-2026-10-27/boxes-0.346.0/demo-hp-controller.log b/documentation/audits/release-2026-10-27/boxes-0.346.0/demo-hp-controller.log new file mode 100644 index 00000000..4139748a --- /dev/null +++ b/documentation/audits/release-2026-10-27/boxes-0.346.0/demo-hp-controller.log @@ -0,0 +1,87 @@ +grep: write error: Broken pipe +2026/10/27 14:10:02 main.go:356: [INFO] felhom-controller 0.346.0 starting (customer: demo-hp, domain: enkisfelhom.hu) +2026/10/27 14:10:02 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.346.0-rc.1 → 0.346.0) +apps: +adventurelog Up 11 hours (healthy) +adventurelog-frontend Up 11 hours (healthy) +adventurelog-postgres Up 11 hours (healthy) +bentopdf Up 11 hours (healthy) +bookstack Up 11 hours (healthy) +bookstack-db Up 11 hours (healthy) +calibre-web Up 11 hours (healthy) +docmost Up 11 hours (healthy) +docmost-postgres Up 11 hours (healthy) +docmost-redis Up 11 hours (healthy) +home-assistant Up 11 hours (healthy) +kimai Up 11 hours (healthy) +kimai-db Up 11 hours (healthy) +opengist Up 11 hours (healthy) +paperless-postgres Up 11 hours (healthy) +paperless-redis Up 11 hours (healthy) +paperless-webserver Up 11 hours (healthy) +plex Up 11 hours (healthy) +privatebin Up 11 hours (healthy) +romm Up 11 hours (healthy) +romm-db Up 11 hours (healthy) +romm-redis Up 11 hours (healthy) +unhealthy: 0 +2026/10/27 14:10:02 main.go:4010: [INFO] local-api: channel up (agent 169.254.253.1:8443) — guest 9201, 3 mount(s) visible +2026/10/27 14:10:02 main.go:4013: [INFO] local-api: mount mp0 → /var/lib/felhom (storage=local-lvm, class=, backup=true) +2026/10/27 14:10:02 main.go:4013: [INFO] local-api: mount mp8 → /mnt/felhom-drives (storage=/mnt/felhom-drives, class=, backup=false) +2026/10/27 14:10:02 main.go:4013: [INFO] local-api: mount mp9 → /etc/felhom-bootstrap (storage=/var/lib/felhom-agent/guests/9201/bootstrap, class=, backup=false) +2026/10/27 14:10:02 main.go:356: [INFO] felhom-controller 0.346.0 starting (customer: demo-hp, domain: enkisfelhom.hu) +2026/10/27 14:10:02 settings.go:821: [INFO] [settings] Loaded settings from /opt/docker/felhom-controller/data/settings.json +2026/10/27 14:10:02 main.go:382: [INFO] Encryption key loaded from /opt/docker/felhom-controller/data/encryption.key +2026/10/27 14:10:02 manager.go:400: [INFO] [stacks] Using compose command: docker compose +2026/10/27 14:10:02 manager.go:792: [INFO] [stacks] ScanStacks complete: 69 stacks found (12 deployed, 57 available) +2026/10/27 14:10:02 manager.go:843: [INFO] [stacks] Status refresh: 25 containers across 69 stacks +2026/10/27 14:10:02 deploy.go:1470: [WARN] [stacks] Stack plex: new field PLEX_CLAIM (type=text) requires manual configuration +2026/10/27 14:10:02 deploy.go:1470: [WARN] [stacks] Stack bookstack: new field ADMIN_PASSWORD (type=password) requires manual configuration +2026/10/27 14:10:02 deploy.go:1470: [WARN] [stacks] Stack calibre-web: new field ADMIN_PASSWORD (type=password) requires manual configuration +2026/10/27 14:10:02 deploy.go:1482: [INFO] [stacks] InjectMissingFields: processed 12 stacks +2026/10/27 14:10:02 manager.go:583: [INFO] [stacks] Encryption migration: no stacks needed migration +2026/10/27 14:10:02 quiesce.go:192: [INFO] [quiesce] loop started (poll 5m0s, max-quiesce 30m0s) +2026/10/27 14:10:02 desiredstate.go:137: [INFO] [stacks] desired-state backfill: 0 app(s) recorded as running, 0 left unrecorded (state ambiguous — legacy boot behaviour retained) +2026/10/27 14:10:02 installed.go:537: [INFO] [stacks] installed-images backfill: 0 app(s) recorded, 12 already had a record, 0 left unrecorded (could not be observed completely — unknown, which renders nothing) +2026/10/27 14:10:02 pin.go:290: [INFO] [stacks] pin adoption: 0 pinned, 12 already pinned, 0 left unpinned (0 not completely observed, 0 running something the template no longer offers) +2026/10/27 14:10:02 undo.go:676: [INFO] [stacks] applied-meta backfill (R-646): recorded 0 []; skipped 0 [] — not current with the catalog, their pinned version's .felhom.yml is no longer on the box +2026/10/27 14:10:02 sync.go:137: [INFO] [sync] Starting catalog sync (repo: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git, interval: 15m0s) +2026/10/27 14:10:02 sync.go:228: [INFO] [sync] Starting catalog sync +2026/10/27 14:10:02 sync.go:358: [INFO] [sync] Pulling latest from https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (branch: main) +2026/10/27 14:10:02 main.go:571: [INFO] Metrics store opened at /opt/docker/felhom-controller/data/metrics.db +2026/10/27 14:10:02 main.go:580: [INFO] Metrics collector started (60s interval) +2026/10/27 14:10:02 [INFO] [tier2] start-up: no leftover second-drive copy container +2026/10/27 14:10:02 restore_record_wiring.go:37: [INFO] [backup] restore record wired: /opt/docker/felhom-controller/data/restore-status.json (interrupted at startup: false) +2026/10/27 14:10:02 run_record_wiring.go:29: [INFO] [backup] app-data run record wired: /opt/docker/felhom-controller/data/appdata-run.json (an earlier cut still shown: false) +2026/10/27 14:10:02 notifier.go:81: [INFO] Notifier enabled (hub: https://hub.felhom.eu) +2026/10/27 14:10:02 service.go:83: [INFO] [upwatch] the host's weekly line test: 94.5 Mbit/s (measured 2026-10-27T12:40:35Z) +2026/10/27 14:10:02 upwatch_wiring.go:154: [INFO] [upwatch] upload and CPU watch started (line 97 Mbit/s, qBittorrent share 50 %) +2026/10/27 14:10:02 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.346.0-rc.1 → 0.346.0) +2026/10/27 14:10:02 main.go:865: [INFO] Self-update enabled (check every 6h, auto-update: false, auto-update time: 04:30) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: status-refresh (every 10s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: stack-scan (every 2m0s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: docker-socket-watch (every 15s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: docker-socket-users (every 5m0s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: health-probes (every 10s) +2026/10/27 14:10:02 offsiteapply.go:148: [INFO] [offsite-apply] settle-gate: awaiting floor knowledge (first report ACK) before offsite apply +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: system-health (every 5m0s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: after-unclean-boot (every 30s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: hold-report (every 1m0s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: deadapp-check (every 30s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: ring-spill (every 30s) +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job db-dump scheduled for 2026-10-28 02:30 CET +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: offsite-credential-retry (every 5m0s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: backup-cache (every 5m0s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: conversion-copy-release (every 1h0m0s) +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job tier2-backup scheduled for 2026-10-28 03:30 CET +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job offbox-backup scheduled for 2026-10-28 04:15 CET +2026/10/27 14:10:02 nightchain.go:284: [INFO] [catch-up] controller start: no backup leg missed its last scheduled time — nothing to make up +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job offsite-abandon-sweep scheduled for 2026-10-28 05:10 CET +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job offsite-integrity scheduled for 2026-10-28 06:00 CET +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job offsite-proof scheduled for 2026-10-28 05:30 CET +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job metrics-prune scheduled for 2026-10-28 04:00 CET +2026/10/27 14:10:02 scheduler.go:150: [INFO] [scheduler] Daily job fill-watch scheduled for 2026-10-28 03:30 CET +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: fill-watch-interval (every 10m0s) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: hub-report (every 15m0s) +2026/10/27 14:10:02 main.go:1838: [INFO] Hub reporting enabled (every 15m0s to https://hub.felhom.eu) +2026/10/27 14:10:02 scheduler.go:120: [INFO] [scheduler] Registered periodic job: selfupdate-check (every 6h0m0s) diff --git a/documentation/audits/release-2026-10-27/boxes-0.346.0/held-apps-boxes.txt b/documentation/audits/release-2026-10-27/boxes-0.346.0/held-apps-boxes.txt new file mode 100644 index 00000000..14debde6 --- /dev/null +++ b/documentation/audits/release-2026-10-27/boxes-0.346.0/held-apps-boxes.txt @@ -0,0 +1,6 @@ +== demo-hp: holds: [] | reported: None | log: 2026/10/27 14:28:02 scheduler.go:450: [INFO] [scheduler] Running job: hold-report +2026/10/27 14:28:02 scheduler.go:467: [INFO] [scheduler] Job hold-report completed (took 0s) +== tester-1: holds: [] | reported: None | log: 2026/10/27 14:28:00 [INFO] [scheduler] Running job: hold-report +2026/10/27 14:28:00 [INFO] [scheduler] Job hold-report completed (took 0s) +== demo-felhom: holds: [] | reported: None | log: 2026/10/27 14:27:43 [INFO] [scheduler] Running job: hold-report +2026/10/27 14:27:43 [INFO] [scheduler] Job hold-report completed (took 0s) diff --git a/documentation/audits/release-2026-10-27/boxes-0.346.0/https-only.txt b/documentation/audits/release-2026-10-27/boxes-0.346.0/https-only.txt new file mode 100644 index 00000000..dcd31fd2 --- /dev/null +++ b/documentation/audits/release-2026-10-27/boxes-0.346.0/https-only.txt @@ -0,0 +1,34 @@ +control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -) +== tester-1 (enkicsifelhom.hu): 6 public name(s) + OK control POSITIVE http://felhom.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkicsifelhom.hu/r1033-check?q=1 + OK http://files.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://files.enkicsifelhom.hu/r1033-check?q=1 + OK http://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 + OK http://paperless.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paperless.enkicsifelhom.hu/r1033-check?q=1 + OK http://paste.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paste.enkicsifelhom.hu/r1033-check?q=1 + OK http://wiki.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkicsifelhom.hu/r1033-check?q=1 +== demo-hp (enkisfelhom.hu): 15 public name(s) + OK http://arcade.enkisfelhom.hu/r1033-check?q=1 -> 301 https://arcade.enkisfelhom.hu/r1033-check?q=1 + OK http://books.enkisfelhom.hu/r1033-check?q=1 -> 301 https://books.enkisfelhom.hu/r1033-check?q=1 + OK http://docs.enkisfelhom.hu/r1033-check?q=1 -> 301 https://docs.enkisfelhom.hu/r1033-check?q=1 + OK http://felhom.enkisfelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkisfelhom.hu/r1033-check?q=1 + OK http://files.enkisfelhom.hu/r1033-check?q=1 -> 301 https://files.enkisfelhom.hu/r1033-check?q=1 + OK http://gist.enkisfelhom.hu/r1033-check?q=1 -> 301 https://gist.enkisfelhom.hu/r1033-check?q=1 + OK http://ha.enkisfelhom.hu/r1033-check?q=1 -> 301 https://ha.enkisfelhom.hu/r1033-check?q=1 + OK http://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 + OK http://papir.enkisfelhom.hu/r1033-check?q=1 -> 301 https://papir.enkisfelhom.hu/r1033-check?q=1 + OK http://paste.enkisfelhom.hu/r1033-check?q=1 -> 301 https://paste.enkisfelhom.hu/r1033-check?q=1 + OK http://pdf.enkisfelhom.hu/r1033-check?q=1 -> 301 https://pdf.enkisfelhom.hu/r1033-check?q=1 + OK http://plex.enkisfelhom.hu/r1033-check?q=1 -> 301 https://plex.enkisfelhom.hu/r1033-check?q=1 + OK http://time.enkisfelhom.hu/r1033-check?q=1 -> 301 https://time.enkisfelhom.hu/r1033-check?q=1 + OK http://travel.enkisfelhom.hu/r1033-check?q=1 -> 301 https://travel.enkisfelhom.hu/r1033-check?q=1 + OK http://wiki.enkisfelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkisfelhom.hu/r1033-check?q=1 +== demo-felhom (demo-felhom.eu): 8 public name(s) + OK http://felhom.demo-felhom.eu/r1033-check?q=1 -> 301 https://felhom.demo-felhom.eu/r1033-check?q=1 + OK http://files.demo-felhom.eu/r1033-check?q=1 -> 301 https://files.demo-felhom.eu/r1033-check?q=1 + OK http://gist.demo-felhom.eu/r1033-check?q=1 -> 301 https://gist.demo-felhom.eu/r1033-check?q=1 + OK http://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 -> 301 https://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 + OK http://prowlarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://prowlarr.demo-felhom.eu/r1033-check?q=1 + OK http://radarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://radarr.demo-felhom.eu/r1033-check?q=1 + OK http://sonarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://sonarr.demo-felhom.eu/r1033-check?q=1 + OK http://torrent.demo-felhom.eu/r1033-check?q=1 -> 301 https://torrent.demo-felhom.eu/r1033-check?q=1 +== every public name redirects http -> https diff --git a/documentation/audits/release-2026-10-27/boxes-0.346.0/tester-1-controller.log b/documentation/audits/release-2026-10-27/boxes-0.346.0/tester-1-controller.log new file mode 100644 index 00000000..097ea4fe --- /dev/null +++ b/documentation/audits/release-2026-10-27/boxes-0.346.0/tester-1-controller.log @@ -0,0 +1,71 @@ +grep: write error: Broken pipe +2026/10/27 14:09:59 [INFO] felhom-controller 0.346.0 starting (customer: tester-1, domain: enkicsifelhom.hu) +2026/10/27 14:10:00 [INFO] [selfupdate] Post-update startup: update successful (0.346.0-rc.1 → 0.346.0) +apps: +bookstack Up 11 hours (healthy) +bookstack-db Up 11 hours (healthy) +paperless-postgres Up 11 hours (healthy) +paperless-redis Up 11 hours (healthy) +paperless-webserver Up 11 hours (healthy) +privatebin Up 11 hours (healthy) +unhealthy: 0 +2026/10/27 14:09:59 [INFO] local-api: channel up (agent 169.254.253.1:8443) — guest 9201, 3 mount(s) visible +2026/10/27 14:09:59 [INFO] local-api: mount mp8 → /mnt/felhom-drives (storage=/mnt/felhom-drives, class=, backup=false) +2026/10/27 14:09:59 [INFO] local-api: mount mp0 → /var/lib/felhom (storage=local-lvm, class=, backup=true) +2026/10/27 14:09:59 [INFO] local-api: mount mp9 → /etc/felhom-bootstrap (storage=/var/lib/felhom-agent/guests/9201/bootstrap, class=, backup=false) +2026/10/27 14:09:59 [INFO] felhom-controller 0.346.0 starting (customer: tester-1, domain: enkicsifelhom.hu) +2026/10/27 14:09:59 [INFO] [settings] Loaded settings from /opt/docker/felhom-controller/data/settings.json +2026/10/27 14:09:59 [INFO] Encryption key loaded from /opt/docker/felhom-controller/data/encryption.key +2026/10/27 14:09:59 [INFO] [stacks] Using compose command: docker compose +2026/10/27 14:09:59 [INFO] [stacks] ScanStacks complete: 68 stacks found (3 deployed, 65 available) +2026/10/27 14:10:00 [INFO] [stacks] Status refresh: 9 containers across 68 stacks +2026/10/27 14:10:00 [INFO] [stacks] InjectMissingFields: processed 3 stacks +2026/10/27 14:10:00 [INFO] [stacks] Encryption migration: no stacks needed migration +2026/10/27 14:10:00 [INFO] [quiesce] loop started (poll 5m0s, max-quiesce 30m0s) +2026/10/27 14:10:00 [INFO] [stacks] desired-state backfill: 0 app(s) recorded as running, 0 left unrecorded (state ambiguous — legacy boot behaviour retained) +2026/10/27 14:10:00 [INFO] [stacks] installed-images backfill: 0 app(s) recorded, 3 already had a record, 0 left unrecorded (could not be observed completely — unknown, which renders nothing) +2026/10/27 14:10:00 [INFO] [stacks] pin adoption: 0 pinned, 3 already pinned, 0 left unpinned (0 not completely observed, 0 running something the template no longer offers) +2026/10/27 14:10:00 [INFO] [stacks] applied-meta backfill (R-646): recorded 0 []; skipped 0 [] — not current with the catalog, their pinned version's .felhom.yml is no longer on the box +2026/10/27 14:10:00 [INFO] [sync] Starting catalog sync (repo: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git, interval: 15m0s) +2026/10/27 14:10:00 [INFO] [sync] Starting catalog sync +2026/10/27 14:10:00 [INFO] Metrics store opened at /opt/docker/felhom-controller/data/metrics.db +2026/10/27 14:10:00 [INFO] Metrics collector started (60s interval) +2026/10/27 14:10:00 [INFO] [sync] Pulling latest from https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (branch: main) +2026/10/27 14:10:00 [INFO] [tier2] start-up: no leftover second-drive copy container +2026/10/27 14:10:00 [INFO] [backup] restore record wired: /opt/docker/felhom-controller/data/restore-status.json (interrupted at startup: false) +2026/10/27 14:10:00 [INFO] [backup] app-data run record wired: /opt/docker/felhom-controller/data/appdata-run.json (an earlier cut still shown: false) +2026/10/27 14:10:00 [INFO] Notifier enabled (hub: https://hub.felhom.eu) +2026/10/27 14:10:00 [INFO] [upwatch] the host's weekly line test: 94.0 Mbit/s (measured 2026-10-27T12:33:30Z) +2026/10/27 14:10:00 [INFO] [upwatch] upload and CPU watch started (line 94 Mbit/s, qBittorrent share 50 %) +2026/10/27 14:10:00 [INFO] [selfupdate] Post-update startup: update successful (0.346.0-rc.1 → 0.346.0) +2026/10/27 14:10:00 [INFO] Self-update enabled (check every 6h, auto-update: false, auto-update time: 04:30) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: status-refresh (every 10s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: stack-scan (every 2m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: docker-socket-watch (every 15s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: docker-socket-users (every 5m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: health-probes (every 10s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: system-health (every 5m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: after-unclean-boot (every 30s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: hold-report (every 1m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: deadapp-check (every 30s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: ring-spill (every 30s) +2026/10/27 14:10:00 [INFO] [offsite-apply] settle-gate: awaiting floor knowledge (first report ACK) before offsite apply +2026/10/27 14:10:00 [INFO] [scheduler] Daily job db-dump scheduled for 2026-10-28 02:30 CET +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: offsite-credential-retry (every 5m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: backup-cache (every 5m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: conversion-copy-release (every 1h0m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Daily job tier2-backup scheduled for 2026-10-28 03:30 CET +2026/10/27 14:10:00 [INFO] [scheduler] Daily job offbox-backup scheduled for 2026-10-28 04:15 CET +2026/10/27 14:10:00 [INFO] [catch-up] controller start: no backup leg missed its last scheduled time — nothing to make up +2026/10/27 14:10:00 [INFO] [scheduler] Daily job offsite-abandon-sweep scheduled for 2026-10-28 05:10 CET +2026/10/27 14:10:00 [INFO] [scheduler] Daily job offsite-integrity scheduled for 2026-10-28 06:00 CET +2026/10/27 14:10:00 [INFO] [scheduler] Daily job offsite-proof scheduled for 2026-10-28 05:30 CET +2026/10/27 14:10:00 [INFO] [scheduler] Daily job metrics-prune scheduled for 2026-10-28 04:00 CET +2026/10/27 14:10:00 [INFO] [scheduler] Daily job fill-watch scheduled for 2026-10-28 03:30 CET +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: fill-watch-interval (every 10m0s) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: hub-report (every 15m0s) +2026/10/27 14:10:00 [INFO] Hub reporting enabled (every 15m0s to https://hub.felhom.eu) +2026/10/27 14:10:00 [INFO] [scheduler] Registered periodic job: selfupdate-check (every 6h0m0s) +2026/10/27 14:10:00 [INFO] ========== Startup Self-Test ========== +2026/10/27 14:10:00 [INFO] Event pushed: controller_updated (info) [hu-only] — Controller frissítve: 0.346.0-rc.1 → 0.346.0 +2026/10/27 14:10:00 [INFO] [PASS] Docker socket: reachable (v29.8.2) diff --git a/documentation/audits/release-2026-10-27/global-floor-set.txt b/documentation/audits/release-2026-10-27/global-floor-set.txt new file mode 100644 index 00000000..c4d258f5 --- /dev/null +++ b/documentation/audits/release-2026-10-27/global-floor-set.txt @@ -0,0 +1,5 @@ +14:37:27 +HTTP/1.1 303 See Other +Location: /configuration?flash=floor_set +min_controller_version|0.346.0 +min_controller_version_declared_min_agent|0.346.0=0.158.1 diff --git a/documentation/audits/release-2026-10-27/hub-build-0173.txt b/documentation/audits/release-2026-10-27/hub-build-0173.txt new file mode 100644 index 00000000..7d2a6f32 --- /dev/null +++ b/documentation/audits/release-2026-10-27/hub-build-0173.txt @@ -0,0 +1,176 @@ +[STEP] 0/3 — Checking the registry: is 0.173.0 already published? +[INFO] 0.173.0 is not present in the registry — proceeding. +[STEP] 1/3 — Pulling latest code (the tree must be clean and at origin/main)... + +[INFO] ╔══════════════════════════════════════╗ +[INFO] ║ felhom-hub build ║ +[INFO] ╚══════════════════════════════════════╝ +[INFO] Version: 0.173.0 (build-hub.sh v1.25.0) +[INFO] Commit: 29134c52 +[INFO] Source: /mnt/5_hdd/felhom.eu/git/felhom.eu/hub +[INFO] Build: /mnt/5_hdd/felhom.eu/build/felhom-hub/workspace +[INFO] Image: gitea.dooplex.hu/admin/felhom-hub:0.173.0 + +[STEP] 2/3 — Syncing source to workspace... +[INFO] Source synced to /mnt/5_hdd/felhom.eu/build/felhom-hub/workspace +[INFO] App assets synced (263 files) +[INFO] Package structure verified ✓ +[INFO] Running go mod tidy... +[STEP] 3/3 — Building Docker image... +[INFO] Building for current platform + pushing... +#0 building with "default" instance using docker driver + +#1 [internal] load build definition from Dockerfile +#1 transferring dockerfile: 1.46kB done +#1 DONE 0.0s + +#2 [internal] load metadata for docker.io/library/golang:1.27.3-alpine3.24@sha256:b8c9b82affbbb82a020bbcf998dad2ba9516944ac7e883524642a481a9505e9c +#2 ... + +#3 [auth] library/alpine:pull token for registry-1.docker.io +#3 DONE 0.0s + +#4 [auth] library/golang:pull token for registry-1.docker.io +#4 DONE 0.0s + +#5 [internal] load metadata for docker.io/library/alpine:3.24.2@sha256:294b683cb724975bec92580e1e685676bd4b50bda910ddb8c51d4cabeaec77e6 +#5 DONE 1.0s + +#2 [internal] load metadata for docker.io/library/golang:1.27.3-alpine3.24@sha256:b8c9b82affbbb82a020bbcf998dad2ba9516944ac7e883524642a481a9505e9c +#2 DONE 1.7s + +#6 [internal] load .dockerignore +#6 transferring context: 2B done +#6 DONE 0.0s + +#7 [stage-1 1/5] FROM docker.io/library/alpine:3.24.2@sha256:294b683cb724975bec92580e1e685676bd4b50bda910ddb8c51d4cabeaec77e6 +#7 resolve docker.io/library/alpine:3.24.2@sha256:294b683cb724975bec92580e1e685676bd4b50bda910ddb8c51d4cabeaec77e6 0.0s done +#7 DONE 0.0s + +#8 [builder 1/6] FROM docker.io/library/golang:1.27.3-alpine3.24@sha256:b8c9b82affbbb82a020bbcf998dad2ba9516944ac7e883524642a481a9505e9c +#8 resolve docker.io/library/golang:1.27.3-alpine3.24@sha256:b8c9b82affbbb82a020bbcf998dad2ba9516944ac7e883524642a481a9505e9c 0.0s done +#8 extracting sha256:7b229517ed222597277036d94892173207d01a731ab3a88eeb1de2e963a2c788 +#8 ... + +#9 [internal] load build context +#9 transferring context: 22.57MB 0.3s done +#9 DONE 0.3s + +#8 [builder 1/6] FROM docker.io/library/golang:1.27.3-alpine3.24@sha256:b8c9b82affbbb82a020bbcf998dad2ba9516944ac7e883524642a481a9505e9c +#8 sha256:c8e3100880d834be60a9562375f4c5018b2cb26d64591bd0060aa3a80b935f43 0B / 126B 0.2s +#8 extracting sha256:7b229517ed222597277036d94892173207d01a731ab3a88eeb1de2e963a2c788 0.2s done +#8 sha256:c8e3100880d834be60a9562375f4c5018b2cb26d64591bd0060aa3a80b935f43 126B / 126B 0.2s done +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 0B / 71.15MB 0.3s +#8 sha256:c012d78a862fe59ae6789c91f982ea68a882c9c44bbde97013914458dcdd9c4c 0B / 244.47kB 0.2s +#8 sha256:c012d78a862fe59ae6789c91f982ea68a882c9c44bbde97013914458dcdd9c4c 244.47kB / 244.47kB 0.6s done +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 15.73MB / 71.15MB 0.8s +#8 extracting sha256:c012d78a862fe59ae6789c91f982ea68a882c9c44bbde97013914458dcdd9c4c 0.1s done +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 26.21MB / 71.15MB 0.9s +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 34.60MB / 71.15MB 1.1s +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 45.09MB / 71.15MB 1.2s +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 56.62MB / 71.15MB 1.4s +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 69.21MB / 71.15MB 1.5s +#8 sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 71.15MB / 71.15MB 1.7s done +#8 extracting sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b +#8 extracting sha256:82e0bb27ae78502103ed383ed33346f88a83943fb7bd93977850d5890ee8fb3b 5.6s done +#8 DONE 7.5s + +#8 [builder 1/6] FROM docker.io/library/golang:1.27.3-alpine3.24@sha256:b8c9b82affbbb82a020bbcf998dad2ba9516944ac7e883524642a481a9505e9c +#8 extracting sha256:c8e3100880d834be60a9562375f4c5018b2cb26d64591bd0060aa3a80b935f43 0.0s done +#8 extracting sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 0.0s done +#8 DONE 7.6s + +#10 [builder 2/6] WORKDIR /app +#10 DONE 1.0s + +#11 [builder 3/6] COPY go.mod go.sum* ./ +#11 DONE 0.0s + +#12 [builder 4/6] RUN go mod download || true +#12 DONE 8.8s + +#13 [builder 5/6] COPY . . +#13 DONE 0.8s + +#14 [builder 6/6] RUN go mod tidy && CGO_ENABLED=0 go build -ldflags "-s -w -X main.Version=0.173.0 -X main.BuildTime=2026-10-27T08:30:47Z" -o /felhom-hub ./cmd/hub/ +#14 0.706 go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 +#14 0.745 go: downloading modernc.org/fileutil v1.3.40 +#14 0.746 go: downloading github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e +#14 0.764 go: downloading golang.org/x/term v0.47.0 +#14 0.916 go: downloading modernc.org/ccgo/v4 v4.30.1 +#14 0.916 go: downloading modernc.org/goabi0 v0.2.0 +#14 0.916 go: downloading golang.org/x/tools v0.38.0 +#14 0.916 go: downloading modernc.org/cc/v4 v4.27.1 +#14 1.357 go: downloading modernc.org/token v1.1.0 +#14 1.357 go: downloading modernc.org/opt v0.1.4 +#14 1.357 go: downloading modernc.org/strutil v1.2.1 +#14 1.357 go: downloading modernc.org/sortutil v1.2.1 +#14 1.458 go: downloading modernc.org/gc/v2 v2.6.5 +#14 1.458 go: downloading golang.org/x/mod v0.29.0 +#14 1.458 go: downloading modernc.org/gc/v3 v3.1.1 +#14 1.647 go: downloading github.com/hashicorp/golang-lru/v2 v2.0.7 +#14 1.987 go: downloading golang.org/x/sync v0.17.0 +#14 DONE 23.0s + +#15 [stage-1 2/5] RUN apk add --no-cache ca-certificates tzdata +#15 CACHED + +#16 [stage-1 3/5] COPY --from=builder /felhom-hub /usr/local/bin/felhom-hub +#16 DONE 0.1s + +#17 [stage-1 4/5] RUN mkdir -p /data /etc/felhom-hub +#17 DONE 0.3s + +#18 [stage-1 5/5] COPY assets/ /usr/share/felhom/assets-seed/ +#18 DONE 0.2s + +#19 exporting to image +#19 exporting layers +#19 exporting layers 1.7s done +#19 exporting manifest sha256:4bb29461bedd838aa9d1acfcd37af056498a1a57ca1f8b1c6b4191951c06ac5b 0.0s done +#19 exporting config sha256:b9818cbb36163c3fa20d3c88d331763eb75b855c79447f4256db9b5c9c3f3660 done +#19 exporting attestation manifest sha256:f20f1ff514f2c68b9300f1996540d8d8195e67e2c39f852a7333d8b12ef1d88a 0.0s done +#19 exporting manifest list sha256:458bfb03e614db4b7abd6442e6af15c652ba4b9b4509fe2b0efe00ac979b8f52 done +#19 naming to gitea.dooplex.hu/admin/felhom-hub:0.173.0 done +#19 unpacking to gitea.dooplex.hu/admin/felhom-hub:0.173.0 +#19 unpacking to gitea.dooplex.hu/admin/felhom-hub:0.173.0 0.4s done +#19 DONE 2.2s +[INFO] Pushing... +The push refers to repository [gitea.dooplex.hu/admin/felhom-hub] +44136fa355b3: Waiting +93c1eb832da7: Waiting +b128e85bfc6d: Waiting +e2de96513ba9: Waiting +44136fa355b3: Waiting +93c1eb832da7: Waiting +b128e85bfc6d: Waiting +e2de96513ba9: Waiting +9d2a0c58fd60: Waiting +6b29cdaa98fc: Waiting +44136fa355b3: Already exists +93c1eb832da7: Layer already exists +e2de96513ba9: Layer already exists +b128e85bfc6d: Pushed +9d2a0c58fd60: Pushed +99c9eb131832: Pushed +6b29cdaa98fc: Pushed +0.173.0: digest: sha256:458bfb03e614db4b7abd6442e6af15c652ba4b9b4509fe2b0efe00ac979b8f52 size: 856 + +[INFO] ╔══════════════════════════════════════╗ +[INFO] ║ Build complete ✓ ║ +[INFO] ╚══════════════════════════════════════╝ +[INFO] Image: gitea.dooplex.hu/admin/felhom-hub:0.173.0 +[INFO] Size: 73M + +[INFO] Image pushed to registry. + +[INFO] Deploy to k3s — GitOps ONLY. The manifest in git is the source of truth: +[INFO] 1. bump the image tag in /mnt/5_hdd/felhom.eu/git/felhom.eu/manifests/hub.yaml to 0.173.0, commit, push +[INFO] 2. hard-refresh + sync the ArgoCD app (auto-sync is OFF — the sync is deliberate): +[INFO] sudo kubectl -n argocd annotate application felhom argocd.argoproj.io/refresh=hard --overwrite +[INFO] sudo kubectl -n argocd patch application felhom --type merge \ +[INFO] -p '"{"operation":"initiatedBy":{"username":"cc"}}"' -p '"{"operation":"sync":{"syncStrategy":{"apply":{}}}}"' +[INFO] +[INFO] NEVER `kubectl set image` or `kubectl apply` by hand — ArgoCD reverts it on the next +[INFO] sync, so the change looks applied, works for a while, and then silently disappears. + diff --git a/documentation/audits/release-2026-10-27/perbox-floors-set.txt b/documentation/audits/release-2026-10-27/perbox-floors-set.txt new file mode 100644 index 00000000..2d9319c7 --- /dev/null +++ b/documentation/audits/release-2026-10-27/perbox-floors-set.txt @@ -0,0 +1,9 @@ +== tester-1 +HTTP/1.1 303 See Other +Location: /customers/tester-1?flash=floor_set +== demo-hp +HTTP/1.1 303 See Other +Location: /customers/demo-hp?flash=floor_set +== demo-felhom +HTTP/1.1 303 See Other +Location: /customers/demo-felhom?flash=floor_set diff --git a/documentation/backlog/CLOSED-ITEMS.md b/documentation/backlog/CLOSED-ITEMS.md index 4cfa2c64..f230e05a 100644 --- a/documentation/backlog/CLOSED-ITEMS.md +++ b/documentation/backlog/CLOSED-ITEMS.md @@ -26,6 +26,21 @@ --- +## 2026-10-27 (attended release block) — ten rows released and closed (full text of the rows: `git show 708a3451:documentation/backlog/OPEN-ITEMS.md`) + +| Row | What | Closed | Evidence | +|---|---|---|---| +| **R-1250** | **A qBittorrent that seeds all day is never line-tested, so it never gets the limit that exists for it.** (P3) | CLOSED 2026-10-27 — the hold FAILED as built (four holds 11:36–12:21 CET on demo-hp, each refused „not quiet” 4.0–4.2 Mbit/s: qBittorrent 5.2.4 sends at full speed ~14 s after its limit falls, the agent reads 5–15 s after the call); fixed in controller `710ceac` (`waitDrained`: ask only after the held app reports its own upload near zero; red-proved by four mutations), RELEASED in v0.346.0 (global floor 15:37 CET). Live on the rc: 13:39:56 held → slowed after 22 s → **94.5 Mbit/s** → the limit back exactly (5898240) → the 50 % rule kept the normal slot (0.15 % move, inside its 20 % band). Operator's choice 2026-10-27: fix in the controller the same day. | `audits/linetest-2026-10-27/` (README, `rc1-hold-proof.txt`, `limitprobe.txt`, `sec1-*.txt`, `redproof-r1250-drain.txt`) | +| **R-1261** | **The R-1250 line hold (committed, NOT released): three edges before it ships (review round 2, HUNT-4 H4–H6).** (P3) | CLOSED 2026-10-27 — released in v0.344.0; live 2026-10-27 on demo-hp: every hold put the limit back exactly in the slot it held (five holds), and the 50 % rule did not read the put-back value as the household's (no household flag). | `audits/linetest-2026-10-27/` (`controller-upwatch-0345-refusals.txt`, `upwatch-settings-after.txt`) | +| **R-1218** | **A recovery ceremony done while off-site is switched off (or cleared) seals no off-site repository password, and the hub then demotes the GOOD older package to operator-only custody: the household's own recovery code no longer opens its off-site copy.** (P2) | CLOSED 2026-10-27 — both halves RELEASED (hub v0.173.0 09:35 CET; controller v0.346.0, global floor 15:37 CET). **Live proof WAIVED by the operator** (2026-10-27, attended): no product path makes the box's saved off-site target „off” on a hub box — the hub customer page's switch did not reach Tester 1's target or its controller.yaml (unchanged since 2026-10-04), and the household's clear is refused on a hub tier — so a live run could not tell old code from new. Red-proofs stand for both halves. Follow-up: R-1312. | `audits/night-fixes-2026-10-26/`; `audits/release-2026-10-27/` | +| **R-1219** | **During a recovery offer the backups page hides the „create your recovery code” ceremony (it would replace the key that opens the old off-site copy), but the global top bar still links to it and the start handler does not refuse.** (P2) | CLOSED 2026-10-27 — RELEASED in controller v0.346.0 (global floor 15:37 CET). Proof: the handler tests (the brief's allowance — a recovery offer cannot be staged safely), red-proved. | controller `1170b48` tests | +| **R-1220** | **„Megőrzött adatok” (kept data) can list an INSTALLED app's live folder as kept — and offer to delete it — when that app's app.yaml cannot be read.** (P2) | CLOSED 2026-10-27 — RELEASED in controller v0.346.0 (global floor 15:37 CET); live 2026-10-26 night on 9202 (`audits/night-fixes-2026-10-26/`). | `audits/night-fixes-2026-10-26/` | +| **R-1232** | **A reinstalled box may take its first whole-box copy to ep0 up to a week late: the old box's copy in the same household space seems to count as its last one.** (P2) | CLOSED 2026-10-27 — RELEASED in agent v0.167.0 (published + tagged 2026-10-27; signed updates committed on demo-felhom 10:26, Tester 1 10:32, demo-hp 13:49 CET); live 2026-10-26 night on a fresh BYO Tester4 box. The Day-0 vouch of 0.167.0 is the operator's (STATUS). | `audits/night-fixes-2026-10-26/r1232/`; `audits/release-2026-10-27/agent-*` | +| **R-1187** | **A `.fab` export or import can lose or mix household data — code-confirmed paths from the data-loss hunt:** (P2) | CLOSED 2026-10-27 — (a)(b)(d)(f)(g) + the two import defects RELEASED in controller v0.346.0 (global floor 15:37 CET); live 2026-10-26 night on 9202 for (a)(b)(g), unit tests for (d)(f) (`audits/night-fixes-2026-10-26/`). | `audits/night-fixes-2026-10-26/` | +| **R-1298** | **Scratch guest 9202 carries leftovers made outside the product, and D53 would remind about them every week once released: four crash-loop holds since 2026-09-24 for apps that are not installed (`chaoscrash`, `chaosoom`, `chaosoomb`, `gokapi`), and a PrivateBin `app.yaml` (2026-10-25) with no container that the product reads as „installed".** (P3) | CLOSED 2026-10-27 — RELEASED in controller v0.346.0; live 2026-10-26 night on 9202 (four orphan holds cleared, PrivateBin removed through the product). The three test boxes report 0 holds and the hub lists 0 (15:30 CET). | `audits/night-fixes-2026-10-26/r1298/`; `audits/release-2026-10-27/boxes-0.346.0/held-apps-boxes.txt` | +| **R-972** | **The shipped controller and hub programs are built with Go 1.24.13 and golang.org/x/crypto v0.31.0, and the agent with Go 1.26.0, so dozens of fixed Go security bugs (including html/template escaping fixes) are still in what runs on boxes and the hub.** (P2) | CLOSED 2026-10-27 — Go 1.27.3 RELEASED in all three: hub v0.173.0, agent v0.167.0, controller v0.346.0 (govulncheck 1 → 0 called each, `audits/r972-*`). | `audits/r972-*` | +| **R-1291** | **A held app gives the operator no lasting signal: one event at the stop, then nothing — demo-hp's Kimai sat held 11 days unseen.** (P3) | CLOSED 2026-10-27 — RELEASED: hub v0.173.0 (09:35 CET, the Hosts page shows „Held apps”, 30-min watch clean) + controller v0.346.0 (global floor 15:37 CET); the three test boxes' hold report runs every minute and the hub list matches each box (0 = 0). | `audits/d53-held-apps-2026-10-26/`; `audits/release-2026-10-27/` | + ## 2026-10-27 (night) — R-1174 measured and closed (full text of the row: `git show 3c8c1ded:documentation/backlog/OPEN-ITEMS.md`) | Row | What | Closed | Evidence | diff --git a/documentation/backlog/OPEN-ITEMS.md b/documentation/backlog/OPEN-ITEMS.md index 4c5fc6b1..a16fdea2 100644 --- a/documentation/backlog/OPEN-ITEMS.md +++ b/documentation/backlog/OPEN-ITEMS.md @@ -159,7 +159,7 @@ stopping line that lies. | **R-683** | App updates | P3 | **[P3-LOW] Watch: after a power cut during an update's health check, the hold named an HOUR-OLD second-drive copy, not the one the update's own backup should have just made.** 2026-09-24 chaos round 3 (nextcloud, `backup_max_age: 1m`): no `backing-up` phase was seen and the hold named Tier 2 at 13:04 for an update pressed at 14:04; the pre-cut controller log was lost with the container (the runner now saves it at arm time — R-320). Round 11, the same action without a power cut, named a fresh 14:34 copy and logged the Tier-2 copy. The sentence was TRUE (it named the copy it offered); the question is why the update did not back up first. Not reproduced; watch the next power-cut drill. `audits/night-2026-09-24/E/round-03*.json`, `E/round-11-controller-pre.log` | **OPEN — P3; owner: CC (watch)** | — | — | CC | | **R-785** | App updates | P3 | **[P3-LOW] SparkyFitness is pinned 11 releases and a major behind upstream (v0.17.3; upstream v1.7.3, v1.6.0 dated 2026-07-24).** READ 2026-10-01 (`audits/visitors-2026-10-01/C/bench/C1-previous-tag.txt`). **Needs:** an update walk 0.17 → 1.x through the ladder (bench + box), after R-784 is decided. | **OPEN — rank P3-LOW; owner: CC (after R-784)** | — | — | CC | -## Backup & restore — 51 rows (P2 9, P3 24, P4 18) +## Backup & restore — 46 rows (P2 4, P3 24, P4 18) | ID | Category | Sev | What | State | Blocked on | Next action | Owner | |---|---|---|---|---|---|---|---| @@ -195,7 +195,6 @@ stopping line that lies. | **R-1184** | Backup & restore | P3 | **A cut-off shared-folder restore can be „placed" and reported restored while files are missing; the download is then deleted.** Readiness is only „the scratch folder is not empty" (`internal/backup/shares_restore.go:131-140`) — the R-358 class fixed for apps, not for shares; 30-min download window (`web/offbox_handlers.go:716`); fixed 2 GiB free-space gate that fails open (`:107`). CONFIRMED in code. Data-loss hunt 2026-10-20 (C1 reviewer 1, R3). | OPEN | — | Fix: a completion marker after restic succeeds, as for apps | CC | | **R-1185** | Backup & restore | P3 | **A database dump that fails its own content check has already replaced last night's good dump, and the second drive copies it an hour later.** `appbackup/dbdump.go:388-422`: size check, rename over the good file (`:399`), then `ValidateDump` (`:419`). Volume tars are promoted with no content check either (`backup.go:902`). Tier 1 is one point per app by design (07 §6.1); the ORDER is the defect. PROVEN against production code (`audits/dataloss-hunt-2026-10-20/C3-D5-dump-replaced/`, a docker stub prints a header-only dump): `ValidateDump` says invalid („dump file too small"), `DumpOneTo` returns no error, and last night's good dump (with its `CREATE TABLE`) is gone from disk. Data-loss hunt 2026-10-20 (D5). | OPEN | — | Fix: validate the temp file before the rename; keep the last good dump on a failed check | CC | | **R-1186** | Backup & restore | P3 | **The nightly off-site copy is skipped silently when another backup holds the flag, and the catch-up never re-runs it.** `offbox.go:981-996` returns nil with an INFO line on the nightly path; `withLeg` marks the leg ended anyway (`cmd/controller/main.go:1246`). The 05:30 proof and 06:00 integrity check take the same flag, so a backup time near them collides every night. Only the hub's 48 h `offsite_stale` notices. CONFIRMED in code. Data-loss hunt 2026-10-20 (T5). | OPEN | — | Fix: mark the leg NOT ended on a busy skip so the catch-up retries; say it on the backups page | CC | -| **R-1187** | Backup & restore | P2 | **A `.fab` export or import can lose or mix household data — code-confirmed paths from the data-loss hunt:** (a) an export silently drops a whole drive folder that holds a symlink and still ends „done” (`appexport/fabplan.go:292-310`, `export.go:712`; a FIFO also hangs the export on `os.Open`); (b) the import handles only folders and regular files: no owners set, symlinks dropped (`restore.go:1138-1183`); (c) **FIXED in controller main `d5f88a2`, unreleased (rides 0.340.0):** an import over an installed app that is not running merged the old data with the bundle's (`docker cp` never deletes) — reproduced on 9202 before the fix (stopped: a marker written after the export SURVIVED the import; running control: replaced), now refused with a Hungarian sentence and the app untouched; red-proved (`r1187c_test.go`), proven on 9202 rc.2 (`audits/night-2026-10-22/P3-candidates/r1187c-9202.txt`); (d) PLAUSIBLE: no restore-busy check in `StartImport`, no undo, no record (`restore.go:181-186`); (f) the bundle's HDD_PATH is trusted, an empty one gives a relative path (`restore.go:589-631`); (g) the DB import misses postgis images (adventurelog, dawarich: `classifyDBImage`) and runs psql without ON_ERROR_STOP (`restore.go:1047-1056, 933-943`; the dump is `--clean --if-exists`, so ON_ERROR_STOP is safe). (e) was R-1191. Research `audits/night-2026-10-22/P3-candidates/analysis.md`; first list `audits/dataloss-hunt-2026-10-20/C1-restore-rollback-candidates.md`. | **VERIFY — fixed on `main`: (a), (b), (d), (f), (g) + two import defects found by the live proof; waits for the controller release** — 2026-10-26 night: controller `dfd0f8e`, `106325d`, `f24233c`, `cccb9ae` (three rounds of the automated security review on the link handling: writes only through `os.Root`, links only downward), `a3ed63e` (the import's compose runs get the controller's path variables; a warning is never the container id), `90a2530` (the database loads through `appbackup.ImportDump` — every MariaDB 11+ import had timed out on `mysqladmin`). Live on 9202 (Grimmory: FIFO refused naming the path, owner/mode/inside link back, outside link refused; the import now succeeds and the app answers; AdventureLog: a postgis user back after the import) — `audits/night-fixes-2026-10-26/`. (d), (f): unit tests. Still open from the row: C2's two merge paths of an import over an existing app. **Earlier:** OPEN — **2026-10-23: (c) and the C3/N9 refusal texts released in controller 0.340.0;** (a), (b), (f), (g) and the two import paths of C2 stay open. OPEN — **2026-10-22 night: re-ranked P3→P2** ((a) and (b) lose household files on a move to a new box with no error). (c) fixed in code; (a), (b), (f), (g) read in code, not live-proven. **2026-10-23 night — fresh review (`REPORT-night-2026-10-23.md`, C2, C3):** two more import paths still merge — a running app whose `RemoveStackVolumes` fails falls back to `StopStack` and goes on (`appexport/restore.go:375-380`), and `restoreHDDData` extracts drive-folder tars over the existing folder without clearing it (`restore.go:602-655`) for running and stopped apps alike. Both exist in 0.339.0 — not a hold for 0.340.0. The (c) refusal also catches an unhealthy or restarting app (`IsStackRunning`: running/degraded only); its text now says so and names removal (controller `943c517`). Recovery code: fix only with a red-proof + a 9202 proof. | — | Fix (a)+(b) with a red-proof and a 9202 proof (capture code — the night rule); (g) small fix with a 9202 postgis app; (d) after (a) | CC | | **R-1188** | Backup & restore | P4 | **Restore-path candidates from the data-loss hunt — what is left is unlikely or a sentence:** (b) a failed `volume rm` is ignored before the untar, which then lands in the old volume (`backup/restore.go:218`; `StopStack` is `compose down`, so the rm rarely fails); (d) the full off-site download stops at 30 min per press and the household is not told to press again (`web/offbox_handlers.go:455`; the scratch is kept, so a second press probably continues — not measured); (e) place and full restore re-read the LATEST snapshot, not the downloaded one (`offbox_restore.go:675-679`, `_ = id`). Closed parts: (a) with R-1195 (controller 0.338.0), (c) in controller 0.337.0 (`TestR1188c_ALeftoverTempDoesNotBlockTheRetry`). Evidence `audits/dataloss-hunt-2026-10-20/C1-restore-rollback-candidates.md`, `audits/night-2026-10-22/P3-candidates/analysis.md`. | OPEN — **2026-10-22 night: re-ranked P3→P4**: (a) and (c) are shipped; the rest is low-chance or a sentence. | — | (d): measure a second press on a large download on 9202, then write the sentence; (b), (e): unit tests when the file is next touched | CC | | **R-1189** | Backup & restore | P3 | **Time and concurrency candidates from the data-loss hunt — what is left:** (a) a host clock ahead during one whole-guest backup silences that tier until real time passes it: the agent turns a future archive time into a negative age (`localapi/server.go:1179-1192`); half-live 2026-10-21 (B6 #8, `s8-wrong-clock/README.md`: a local archive dated 2028-10-21); agent code, so it rides an agent release and the operator's vouch; (c) the whole-guest quiesce waits for the catch-up and the update leg, not for a restore (`quiesce.go:213-275, 565`); (f) the OS leg and kernel reboot follow a daytime valve backup (agent `server.go:982-986`, `kernel.go:101-114`) — a design question; (g) spring forward 2027-03-28 moves 02:30 onto the 03:30 second copy; (h) self-update busy check before the pull only (`updater.go:532-545, 764`; not re-read); (i) a double-clicked restore shows failed while it runs (check and begin not atomic, `web/handlers.go:1860, 1881`). **Moved out 2026-10-22 night:** (b) the skipped nights after an off-cycle run were FIXED by R-899 (controller 0.304.0; demo-hp's journal shows a night run after each of three off-cycle runs since), the creep → R-1221; (d) **FIXED in controller main `d5f88a2`, unreleased (rides 0.340.0):** the catch-up now runs the off-site proof and the integrity check once after its legs, the false comment corrected; red-proved (`nightchain/r1189d_test.go`, `cmd/controller/r1189d_wiring_test.go`); (e) → R-1222 (hub). Evidence `audits/dataloss-hunt-2026-10-20/C1-time-concurrency-candidates.md`, `audits/night-2026-10-22/P3-candidates/analysis.md`. | OPEN — **2026-10-23: (d) released in controller 0.340.0;** (a), (c), (f), (g) stay as written. OPEN — 2026-10-22 night: (b) half closed, (d) fixed in code, (e) split out. | — | (a) with the next agent release (a unit test with a future archive); (c) a 9202 recipe; (g) a unit test with the 2027 clock; (f) to the operator at the next design review | CC | | **R-1190** | Backup & restore | P3 | **Key and retention candidates from the data-loss hunt — what is left:** (c) PLAUSIBLE: after a reuse-path reinstall the new PBS key K is never escrowed and nothing compares fingerprints (`felhom-pbs-apply:99`, `escrow_confirm.go:182-205`); (d) whole-guest off-site copies run before any escrow exists — a design question against `07` §6.1's Tier-3 gate (the operator's); (e) the escrow PUT is two statements; (f) the operator's off-site re-issue resets the provider password before saving it (hub `offsite.go:217-245`); (h) a unit restore can point an app back at an old drive and F5 then prunes the current drive's unit (`backup.go:1517-1574`) — (e), (f), (h) not re-read. **Moved out 2026-10-22 night:** (a) → R-1218, (b) → R-1219, (g) → R-1220. Evidence `audits/dataloss-hunt-2026-10-20/C1-keys-candidates.md`, `C1-delete-retention-candidates.md`, `audits/night-2026-10-22/P3-candidates/analysis.md`. | OPEN | — | (c) a read-only fingerprint compare on a reinstalled test box; (e), (f), (h) re-read, then unit tests; (d) to the operator at the next design review | CC | @@ -203,14 +202,10 @@ stopping line that lies. | **R-1200** | Backup & restore | P3 | **A box installed in the afternoon gets no whole-box backup on its first night: the install's own backup starts the 24 h clock, so the family's whole first day reaches a whole-box copy only on the SECOND night (~38 h after install).** Rehearsal 2026-10-20 B5 (`audits/rehearsal-2026-10-20/B5-night/README.md`): Tester4's install backup at 12:09Z; at the 02:30–06:30Z window the agent answered „within cadence window" (`felhom-agent internal/localapi/server.go:1187`, `age >= tier.Cadence`, default 24 h). R-899 (closed) fixed the same shape for a daytime PRESS only. The other tiers did run that night (database copy, second drive, off-site — all PASS), so app data was covered; the whole-box (DR) tier was not. | **OPEN** — a design question: should the first scheduled night always run (like a press), or is one tier enough on night one? | — | decide; if „always run": treat the install backup like a press in the due rule, with a test on the first night | CC | | **R-1206** | Backup & restore | P3 | **Backups written while the box's clock ran ahead stay „the latest" after the clock is fixed.** The rehearsal's scenario #10 (clock set to 2026-10-28) left off-site snapshots dated 2026-10-28; on 2026-10-21 the rebuilt box's recovery page listed every app's „Legutóbbi mentés: 2026. 10. 28. 07:39", and the full restore said „mentés: 2026. 10. 28. 07:37" — a date in the future (`audits/fixes-2026-10-21/P1-live/07-unlock-right.txt`, `11-nextcloud-full-restore.txt`). restic orders snapshots by their own time, so the future ones are „newest" to every retention rule for a week. NOT measured: whether the box's keep-daily prune then drops a real snapshot. Related R-1202, R-1204 (clock). | NARROWED — the NAS tier only. **2026-10-22 night (read, `backup/offbox_window.go:22-24, 130-137`):** on the Felhom off-site tier no real snapshot is lost — the guard refuses a prune while any snapshot is future-dated (R-822, by design). The NAS tier prunes without that guard: open. **2026-10-25:** the kept-data choice no longer takes such a future-dated copy as the newest (R-1271, controller `bd9f4f7`); retention is unchanged — this row. | — | A pure unit test with the policy simulator on the NAS tier and one future-dated snapshot; if a real one is dropped, give the NAS tier the same guard | CC | | **R-1212** | Backup & restore | P4 | **Two household texts on the backup path do not follow the box's language:** the share-restore summary (`SharesRestoreResult.FlashMessage`, `controller/internal/backup/shares_restore.go`) is built from Hungarian Go literals, and the off-site `LastError` for an interrupted run is the Hungarian literal „megszakadt futás (a vezérlő újraindult futás közben)" (`controller/internal/backup/backup.go`). An English household reads Hungarian there. Found by the night helper 2026-10-21. | OPEN | — | Bundle keys for both (rendered in the box language when written, R-557), with parity fixtures | CC | -| **R-1218** | Backup & restore | P2 | **A recovery ceremony done while off-site is switched off (or cleared) seals no off-site repository password, and the hub then demotes the GOOD older package to operator-only custody: the household's own recovery code no longer opens its off-site copy.** REAL in code (night 2026-10-22, read; split from R-1190 (a)): `web/escrow_handlers.go:217-224` stages the password only if `OffboxConfigured()` (`backup/offbox.go:695-710`), false when the target is cleared or disabled — although `ClearOffboxTarget` keeps the password file on purpose (`offbox_clear.go` header); the agent then seals no password (`cmd/felhom-agent/main.go:2981-3003`) and uploads sha ""; hub `SaveHostEscrow` sees `curSHA != ""` and moves the good package to retained custody; `OffsiteRecoveryOffer` reads "" as „covers no key” (`offbox.go:1855-1873`) and says nothing. Evidence `audits/night-2026-10-22/P3-candidates/analysis.md` §R-1190(a). | **OPEN — fixed on `main` (both halves), red-proved; LIVE PROOF PENDING** — controller `1170b48` (stage when the password FILE exists) + hub `09b5f02f` (a keyed package is never replaced by a key-less one: 409). The live shape needs off-site switched OFF on a hub box: the household cannot switch a hub tier off (only per-app switches; a clear is refused by design), so it needs the operator's customer-page change on Tester 1 during Tuesday's attended block — otherwise both halves are REVERTED before the release (rule 2). **Earlier:** OPEN — proposed fix, not built (key-handling code: a fix needs a red-proof AND a live proof, and 9202 has no hub to prove it with) | — | Fix (~6 lines): stage when the password FILE exists (`PushOffboxPasswordForEscrow`, `offbox.go:800`, reads only the file). Red-proof: a web test that the stage runs with off-site cleared; a hub store test pinning „abc”→"" ⇒ superseded (and refuse that demotion). Live proof on a test box with a hub (demo-hp 9201) | CC | -| **R-1219** | Backup & restore | P2 | **During a recovery offer the backups page hides the „create your recovery code” ceremony (it would replace the key that opens the old off-site copy), but the global top bar still links to it and the start handler does not refuse.** REAL in code (night 2026-10-22, read; split from R-1190 (b)): `web/escrow_banner.go:23-35` ignores `recoveryOffer()`; `templates/backups_remote.html:144-160` hides it and its own comment names the harm (R-199); `escrow_handlers.go:180-245` starts anyway; reachable in offer shape (c), `offbox.go:1866-1870`. Evidence `audits/night-2026-10-22/P3-candidates/analysis.md`. | **VERIFY — fixed on `main`, waits for the controller release** — controller `1170b48` (the top bar hides the ceremony during a recovery offer; the start handler answers 409 `api.escrow.recovery_offer_open`), red-proved with a real session and a no-offer control. The offer state cannot be staged without hand-set state, so the handler test is the proof (the brief's allowance). **Earlier:** OPEN — proposed fix, not built (key-handling code) | — | Fix: the bar hides its link during an offer, and the start handler answers 409 with a Hungarian sentence; red-proof with a handler test; live proof with an offer state on a test box with a hub | CC | -| **R-1220** | Backup & restore | P2 | **„Megőrzött adatok” (kept data) can list an INSTALLED app's live folder as kept — and offer to delete it — when that app's app.yaml cannot be read.** REAL in code (night 2026-10-22, read; split from R-1190 (g)): a nil AppConfig drops the app from `liveDriveBinds` (`stacks/kept.go:220-235, 336-360, 372-389`); a parse error gives nil (`deploy.go:1113-1125`). Evidence `audits/night-2026-10-22/P3-candidates/analysis.md`. | **VERIFY — fixed on `main`, waits for the controller release** — 2026-10-26 night: controller `7e15a37` (an app whose `app.yaml` exists but does not parse counts as installed; its folders are never kept data), red-proved; live on 9202 (the kept-data page did not list the folder) — `audits/night-fixes-2026-10-26/`. **Earlier:** OPEN — proposed fix, not built (delete-path code) | — | Fix: an app whose app.yaml is unreadable counts as live (fail closed); its folders are never listed as kept. Red-proof: a unit test with a broken app.yaml; 9202 proof with a throwaway app | CC | | **R-1221** | Backup & restore | P4 | **The nightly whole-box backup starts ~1.5–5 min later each night, until one night is skipped (after ~70–80 nights with no press between).** REAL, low harm (night 2026-10-22; split from R-1189 (b)): agent `localapi/server.go:1184` is `age >= Cadence` with the age counted from the archive START; the controller polls every 5 min (`quiesce.go:150`) and the archive starts after the apps stop. Measured on demo-hp: 04:31:07 → 04:33:18 → 04:36:47 → 04:38:14, and 04:33:37 → 04:38:44 → 04:42:40. At W+6h one night is skipped (44 h is below the 48 h valve, `quiesce.go:807-818`); the hub's 26 h line (`deadline.go:29`) mails the operator. Any manual or off-cycle run resets the drift. Evidence `audits/night-2026-10-22/P3-candidates/demohp-whole-box-completions.txt`. | OPEN | — | Fix: inside the night window a tier is due at `age >= cadence - 4h`; the agent answers due-ness, so it is agent code (a unit test with an injected clock) and rides an agent release | CC | | **R-1228** | Backup & restore | P3 | **The website, the installer script and the hub are all served from the home line — a DooPlex loss stops new installs and the public site.** DooPlex survey 2026-10-23 night (`audits/dooplex-survival-2026-10-22/PLAN.md`, G8): `felhom.eu`, `hub.felhom.eu` and `gitea.dooplex.hu` resolve to the home address; the installer fetches `felhom.eu/scripts/felhom-host-install.sh`; only the ISO (Cloudflare R2) survives. | OPEN — **2026-10-23 — D35 ruled YES, after the release week (operator):** serve the website and the installer from Cloudflare like the ISO. Dated: start on or after 2026-10-30 (DUE-CHECKS). OPEN | the operator's yes | Operator decides (STATUS): A) accept — Gitea and the hub first, the site after; B) the static site + the installer tag on Cloudflare like the ISO — CC's pick, after the release week | CC (ruled yes 2026-10-23, D35) | | **R-1229** | Backup & restore | P4 | **ArgoCD's per-app auto-sync settings live only on the cluster, not in git.** DooPlex survey 2026-10-23 night (`audits/dooplex-survival-2026-10-22/PLAN.md`, G9): the Applications differ (`enabled` true/false, prune, selfHeal); a rebuilt cluster from `homelab-manifests` would not have them. | OPEN | — | Write each Application's sync policy into `homelab-manifests` (a homelab change, the operator's yes for the commit that changes live behaviour) | operator | | **R-1231** | Backup & restore | P4 | **The recovery page says the box's host service is „older” when the controller only cannot tell.** Test night 2026-10-23 (`P4-testnight/07a-unlock-refused-fixture-version.txt`): with the agent's capability `unknown` (a version string it could not compare), the page read „…a hozzá tartozó házon belüli szolgáltatás régebbi… A gép magától frissül”. The same page is reached by a merely-down agent, for which „older” and „updates itself” are not true. | OPEN | — | A separate sentence for `unknown` („a gép most nem éri el a házon belüli szolgáltatást — próbáld újra pár perc múlva”); a render test per state; rides a controller release | CC | -| **R-1232** | Backup & restore | P2 | **A reinstalled box may take its first whole-box copy to ep0 up to a week late: the old box's copy in the same household space seems to count as its last one.** Test night 2026-10-23 (`audits/night-2026-10-23/P4-testnight/`): the new Tester4 box (guest 9201) had its PBS tier applied at 19:28 UTC, but no whole-box run to ep0 came all night; the only archive in the household's ep0 space is the rehearsal box's `ct/9201` of 2026-10-20 (same guest number), and the tier's cadence is 168 h. The agent's due-check reads the newest archive for that vmid on the tier's storage (`localapi/server.go` `newestArchiveOn`) — so the old box's copy reads as „2.6 days old, not due”. If so, the ep0 copy is the OLD box's for up to a week. PLAUSIBLE — read from the code and the night's silence, not proven by a log line (the controller logs the due-check only at debug). | **VERIFY — fixed on `main`, waits for the agent release (the operator's vouch)** — 2026-10-26 night: agent `3911cc6` (the due-check counts only archives with this storage's key, the R-727 discriminator), red-proved; live on a fresh BYO Tester4 box (VM 9375): the released agent said `due: false` (the old box's archive, 6.3 days), the fixed one `due: true / absent`, and the first whole-box copy ran 4 minutes later — `audits/night-fixes-2026-10-26/`. Hub host `Tester4-b5dbbd` to delete (operator). **Earlier:** OPEN | — | Prove: read `GET /backup/tiers` for the box (the agent's answer per tier) on the next reinstall; fix: a tier's „last backup” counts only archives this host wrote (or after the host's enrollment); an agent test with a foreign archive in the namespace | CC | | **R-1235** | Backup & restore | P3 | **The release copy on ep0 (D33) is proven to load, not yet to restore a registry — and it follows the newest versions, not the ones the fleet needs.** Built 2026-10-23 (`scripts/release-copy/`, `audits/day-2026-10-23/08-release-copy-D33.txt`). (a) `total-loss-of-dooplex.md` „Restore the release copy” steps 2 (skopeo push back, same digest) and 3 (agent packages back) were never walked into a real new registry — only a `docker load` on 9202. (b) The copy keeps the newest 3 image tags and 5 agent versions; it does not ask the hub for the floor and the vouched agent and always include them — a vouch more than 5 releases behind would fall out. (c) The golden (`felhom-golden`, 637 MB for 0.331.0) is not copied: a new install after a DooPlex loss needs it (the brief named images + agent packages only; one golden fits under the 3 GB cap). | OPEN | — | (a) a throwaway registry on demo-hp, push one tag back, compare digests; (b) read `/configuration`'s floor + vouched agent; (c) the operator says whether the golden goes in | CC | | **R-1263** | Backup & restore | P4 | **Small items from review round 2:** a LOCAL restore's put-back mails the operator „its off-site restore FAILED” (`felhom-controller/controller/cmd/controller/main.go:1514-1518`, shared via `restore_unit.go:517-518`); Remove — even „keep my data” — deletes undeclared volumes labelled with the app's project, which no tier holds (`internal/stacks/delete.go:763-764`, R-1117); the capped copy's `--delete` reads the source in the daemon's mount view, the emptiness check in the controller's (`tier2.go:834` vs `:464`); stale comments — `felhom-agent/internal/localapi/backup_cap.go:15` („keep-last”) and `restore_crash_putback.go:32` (names a test file that does not exist); the qBittorrent password goes to whatever answers the DNS name `qbittorrent` (`upwatch/explain.go:94,108-113`); kept-copy Remove has a check-to-remove gap (`tier2_kept.go:92-111`); the release-copy restore check trusts hashes stored on ep0 (`runbooks/total-loss-of-dooplex.md`); rrsync without `-munge`/`-wo` (`audits/day-2026-10-23/08-release-copy-D33.txt:6`). | OPEN | — | fix in each repo's next attended pass | CC | | **R-1294** | Backup & restore | P3 | **demo-hp's weekly off-site clean-up was refused by its own guard on 2026-10-26 (window 16): the plan would remove 209 of 359 snapshots, above the week's cap (179) — nothing was deleted, and each refused week adds to the next plan.** Seen in the operator mailbox during the 2026-10-26 release run (03:17Z, `offsite_prune_guard_refused`, error; details `count_before 359, count_after 359, outcome guard-refused`). The cap refusal is kept on purpose (R-824, R-867 closed the false ones); the open question is whether a store that once exceeds the cap can ever prune again by itself, or refuses every week while it grows. demo-hp is the Tier-0 box with many hand-made backups (sweeps, probes). Earlier cap refusals: demo-hp 2026-10-03 (window 1), demo-felhom 2026-10-05 (window 3). | **OPEN — the grant is SET (D55 = 260, `09` §3 decision 268)**: 2026-10-26 19:10:31Z through the operator's one-purpose token `cc-d55-window`, read back `max:260`; it is used at demo-hp's next window request (after its nightly off-site run, ~03:15Z). Close when that window prunes; then the operator revokes the token. **Earlier:** WAITING-ON-OPERATOR — 2026-10-26 evening: CC could NOT set the D54 grant — `POST /offsite/window-grant/demo-hp` (`max_remove=220`) with CC's hub token answered **403 „missing scope offsite:write"** (the hub log shows the refusal; nothing granted). The plan also grows: restic's dry-run 2026-10-26 18:56Z still 359 copies / plan 209 / default cap 179 (before tonight's run); a simulation of the keep rule adds ~14 per night (14 of 18 groups back up nightly), so ~223 at the night of 10-27 and ~237 at 10-28 — a cap of 220 would be refused again. STATUS D55: the operator grants it, with the cap. The grant opens the box's NEXT window request, which comes after its next nightly off-site run. Ruled D54 = prune once (`09` §3 decision 266). **Earlier:** WAITING-ON-OPERATOR — 2026-10-26 (read only, `audits/r1294-offsite-cap-2026-10-26/`): the plan is HONEST (restic's own dry-run: keep 150, remove 209; every removal 7–30 days old; every app keeps ≥ 9 or its last copies; the bulk is one test day, 2026-10-16, 152 snapshots). It can NOT recover by itself: the cap is half the store and grows ~49/week while the plan grows ~84/week. Only demo-hp has this shape (demo-felhom and Tester 1 pruned normally 10-26). The pick is STATUS D54. **Earlier:** OPEN | — | read the guard's cap rule (controller off-site prune) against demo-hp's snapshot list: is the plan honest (old, superseded) or not; if honest, say how such a store gets back under the cap (an attended one-time prune, or a cap that follows the store) — a design question for the operator if it changes what a box may delete | CC | @@ -233,7 +228,7 @@ stopping line that lies. | **R-1275** | Storage & devices | P4 | **An English household sees the drive names in Hungarian** on the install page (and wherever a storage label shows): „Belső tárhely — 52.0 GB free (default)”, „Külső tárhely (hdd_1)” (catalog sweep 2026-10-24, `audits/catalog-sweep-2026-10-24/navidrome/page-install-en.txt`). The label is stored once, in Hungarian, when the drive is found (`felhom-controller/controller/internal/settings/settings.go` `InferStorageLabel`); a household may rename it. | OPEN | — | Render a label that still equals the inferred default in the reader's language; a test per language | CC | | **R-1276** | Storage & devices | P4 | **„Remove with data” leaves the app's empty parent folder** (`/appdata/`) when the template binds a subfolder: Grimmory, RomM, Paperless-ngx (catalog sweep 2026-10-24; 4 KB each; the bound folders were removed). Harmless (empty, not counted as old data), untidy for a household that browses the drive. | OPEN | — | Remove the parent when it is empty after the bound folders go; a test | CC | -## Security & access — 30 rows (P1 2, P2 5, P3 16, P4 7) +## Security & access — 31 rows (P1 2, P2 5, P3 17, P4 7) | ID | Category | Sev | What | State | Blocked on | Next action | Owner | |---|---|---|---|---|---|---|---| @@ -267,8 +262,9 @@ stopping line that lies. | **R-1237** | Security & access | P3 | **The nightly CC-secrets sweep found stored one-time codes in a session record dated 2026-10-23: 14 names in one file (bind tokens and setup codes of test boxes — NIGHT_2026_10_23_*, FIXES_2026_10_21_*, NIGHT_2026_10_21_*, REHEARSAL_2026_10_20_* — and R_DEMO_FELHOM in a file of 2026-10-20).** Mail „[DooPlex CC secrets] 2 secret name(s) found in old session records", 2026-10-23 01:57 UTC, read in the day session (names only). One file holding all of them suggests one command printed many stored values at once (a listing or a dump) in the night session. All but R_DEMO_FELHOM are one-time install codes of test boxes; NIGHT_2026_10_23_* die when Tester4-16fdef is deleted (the operator's do list). | OPEN | — | CC: find the file and the command by the sweep's own report (names only), add a hook shape for that command if it is not one; R_DEMO_FELHOM (demo-felhom's recovery code) — the operator decides whether to rotate it | CC | | **R-1248** | Security & access | P3 | **An app's own numbers can lie: an attacker with code inside an app's container can answer the app's API with whatever matches its flood, and the upload watch (R-1244) would then call it explained.** Measured remedy, not built: a per-container upload ceiling with `tc` from a helper container in the app's network namespace — on scratch 9202 (unprivileged) a flood was held at 19.9–20.1 Mbit/s and the app kept answering (`audits/SPIKE-upload-watch-2026-10-23.md` §5). Costs: a helper image with `tc` (a new external image, or `tc` in the controller image), `NET_ADMIN` for that helper, re-applied after each app restart. | OPEN | an operator decision (the new image / capability) | Decide; if yes, CC builds the ceiling for the download and media apps first | operator | | **R-1309** | Security & access | P4 | **What no automated source shows: a fix announced only by mail, forum or a blog we do not read; a security fix nobody calls one (cloudflared 2026.10.2's „bump distroless image"); closed-source apps (Plex, Emby).** The watch (R-1303) shows these only as BEHIND (weekly). The vendor mails the operator receives stay a source. `audits/security-watch-2026-10-26/SPIKE.md` | OPEN — filed 2026-10-26 (a stated limit) | — | none until a vendor offers a feed; add a vendor's feed to `security_watch.FEEDS` when one exists | CC | +| **R-1312** | Backup & restore | P3 | **The hub customer page's off-site switch did not reach the box: on Tester 1 (2026-10-27, operator-attended, ~14:00–14:12 UTC) the box's saved off-site target stayed `enabled` and its `controller.yaml` `offsite.enabled: true` (unchanged since 2026-10-04) while the hub showed off-site OFF.** So what the switch stops on the box side is not known: the controller reads `cfg.Offsite.Enabled` only at start (`cmd/controller/main.go:890`), and nothing rewrote the file. Either the switch is hub-side only by design (then the page must say so), or a box keeps pushing off-site while the operator believes it is off. Found by the R-1218 live attempt (R-1218 closed 2026-10-27 with its live proof waived by the operator). | OPEN | — | Read the hub handler behind the switch and what it changes (config, tenancy, storage access); then one attended run: switch off, watch the box's next off-site push (does it run, does it fail at the storage) | CC | -## Box system & updates — 14 rows (P2 1, P3 8, P4 5) +## Box system & updates — 13 rows (P3 8, P4 5) | ID | Category | Sev | What | State | Blocked on | Next action | Owner | |---|---|---|---|---|---|---|---| @@ -277,7 +273,6 @@ stopping line that lies. | **R-984** | Box system & updates | P4 | **Host and agent hardening, low risk each: the backup-target route has no role check; the unsigned guest spec has no size bounds; signed ops have no maximum validity; the guarded mkfs does not refuse LVs, zvols or RAID devices; the local API is reachable from the LAN by a static route; a sudoers inspect pattern is wider than needed; install passes secrets on the command line; guest settings files are world-readable; the host offers rpcbind and DNS on the LAN.** Fix each in its own small change. Security review 2026-10-12 (`audits/security-review-2026-10-12/`); detail held off-git for the operator (`/mnt/5_hdd/felhom.eu/evidence/security-review-2026-10-12-PRIVATE/`). | OPEN | — | Batch into hardening work | CC | | **R-979** | Box system & updates | P3 | **Controller updates are trusted by registry tag alone (no digest, no signature), and the Update button offers any newer tag, even an unvouched one; the built-in traefik, cloudflared and FileBrowser images are also pinned by tag only.** Whoever can push to the registry decides what runs. Fix: pin by digest from the hub's vouched list; offer only vouched versions. Security review 2026-10-12 (`audits/security-review-2026-10-12/`); detail held off-git for the operator (`/mnt/5_hdd/felhom.eu/evidence/security-review-2026-10-12-PRIVATE/`). | OPEN — design-proposal | — | Design note, then build | CC | | **R-974** | Box system & updates | P3 | **A compromised host agent can likely become root on the host through the root wrapper that applies PBS settings: the wrapper accepts a folder path inside the agent's own writable tree and then acts on it as root.** Static (the symlink behaviour was reasoned, not run). Same class as R-861. Fix: a fixed root-owned folder, and refuse symlinks before any root action. Security review 2026-10-12 (`audits/security-review-2026-10-12/`); detail held off-git for the operator (`/mnt/5_hdd/felhom.eu/evidence/security-review-2026-10-12-PRIVATE/`). | OPEN | — | Fix the wrapper with a test on a throwaway box | CC | -| **R-972** | Box system & updates | P2 | **The shipped controller and hub programs are built with Go 1.24.13 and golang.org/x/crypto v0.31.0, and the agent with Go 1.26.0, so dozens of fixed Go security bugs (including html/template escaping fixes) are still in what runs on boxes and the hub.** Go 1.24 has had no security fixes since Go 1.26 was released (Go supports the two newest major releases: https://go.dev/doc/devel/release#policy); the scanners name fixes in Go 1.26.9 and 1.27.2. Also: the controller image's Debian 12 base has 12 fixable critical packages, and the Samba image has 48 fixable high ones. Fix: build all three on a supported, patched Go; update x/crypto; rebuild the base images. Scanner output: `audits/security-review-2026-10-12/scanners/`. | **NARROWED — Go 1.27.3 committed in all three, waits for the releases** — 2026-10-26 night: agent `fbbb168`, controller `2560cf1` (+ builder `golang:1.27.3-trixie`), hub `d625a143` (+ `golang:1.27.3-alpine3.24`); govulncheck 1 → 0 called vulnerabilities each (GO-2026-6809, `crypto/x509`); x/crypto v0.58.0 already newest; full tests green — `audits/r972-go1273-2026-10-26/`. **Earlier:** **NARROWED** 2026-10-16 (burndown 2): **controller v0.322.0 released** on Go 1.27.2 + x/crypto v0.58.0, runtime debian:12.13-slim + `apt-get upgrade` (Debian 13 deliberately not: restic 0.18, R-1105) — scanner: critical 16 → 4, fixable criticals and highs in the OS 0; govulncheck 62 → 1 (module-level, `openpgp` not linked). **Hub v0.156.0 deployed** 2026-10-16 19:26 on the operator's yes (Go 1.27.2, alpine 3.24.2: 0 critical, 0 high); Synced/Healthy, reports from all three boxes after the start, the floor reads 0.322.0. **Agent: Go 1.27.2 committed (`37b99d7`), tested, NOT released** — the next vouched agent release carries it. Open: the Samba image (48 fixable high, not rebuilt); docker-compose plugin's own Go (4 high, upstream). Evidence `audits/burndown2-2026-10-16/P4/` **2026-10-16 (evening): the Samba part is DONE in controller v0.323.0** — felhom-samba 1.2.0 on Alpine 3.24.2 (0 critical / 0 high, was 48 fixable high), proven on demo-hp with the same household password (smbclient, nmbd, mDNS, WS-Discovery); on the three test boxes now, on every box with the global floor (R-1105's night check). The controller's Debian 13 OS part: 1 critical / 70 high, none fixable. Left: docker-compose plugin's own Go (4 high, upstream); the agent release; restic's binary is R-1107. **2026-10-17 (evening): agent v0.159.1 (Go 1.27.2) RELEASED and running on demo-hp, Tester 1 and demo-felhom** (signed jobs on the operator's yes); waiting for the operator's vouch — then only the upstream compose plugin is left (close then, recorded). | the next vouched agent release | Close when the global floor carries v0.323.0 and the next vouched agent release carries Go 1.27.2 (compose plugin: upstream, recorded) | CC | | **R-1214** | Box system & updates | P3 | **On the 8 GB box with the swap fix, the night's second-drive backup still pushes memory „full" pressure above 20 % for about 3 minutes; the box keeps answering.** Night soak 2026-10-21→22 (`audits/night-2026-10-21/P1-soak/03-rec.jsonl`, 10-s samples; fresh box from the public ISO, agent with swap = RAM, 8 apps, the rehearsal uploads for 2 h): at 01:30–01:34 UTC (the 03:30 tier2 job) host 39 % / guest 45 % over 10 s, over 60 s at most 20 % / 25 %; IO „full" 66 %; guest swap 1.35 → 2.1 GB; `/api/health` answered every probe (slowest 4.1 s, largest interval 16 s); 0 OOM kills. Once more in the upload window (Immich loading its models, 31 % / 35 % for one sample). The brief's soak pass line was „full" < 20 %, so the soak missed that one line; the freeze itself (96 % for an hour, R-1192) did not come back. Not diagnosed: which part of the tier2 job (the copy's page cache, the volume dumps) causes it. | WATCHING — **2026-10-24 02:4xZ dated check read (weekend-night session, read only):** Tester 1 (8 GB host, guest 4 GB, controller 0.341.0) ran its 03:30 copy at 01:30:00–01:30:13Z (3 apps, 157 MB + 86 MB + 16 KB; no „capped copy container did not start" WARN, no leftover `felhom-tier2-copy-*`); the guest cgroup's memory „full" stall counter on the host (`/sys/fs/cgroup/lxc/9201/memory.pressure`) read **total 444 µs** over the whole 11.1 h since the host started (15:32Z), so „full" stayed far under 20 % (20 % of 10 s = 2 s); 0 OOM kills. **Not shown:** that the copy ran in the capped container (the INFO log does not name it; Docker keeps only ~200 events, from 02:36Z). **Weak load:** 0.24 GB, not the soak's large copy — so the row stays WATCHING; close after a night whose copy moves ≥ 1 GB, read from the same counter. WATCHING — **RELEASED 2026-10-23 in controller 0.340.0** (floor 06:41 UTC; on all three test boxes, start-up „no leftover”, 0 copy containers; Tester 1's manual second-drive run: 3 apps, 0 containers left). **Open only for the consequence:** dated check 2026-10-24 — Tester 1's first night copy ran in the capped container and memory „full” pressure stayed under 20 % (the box's own night log). READY — rides controller 0.340.0. READY — waits for the controller 0.340.0 release. **2026-10-22 night — cause measured, fix built and proven on 9202, waits for the controller release.** Cause: the copy's page cache is charged to the guest and evicts the apps' working set. On 9202 (4 GB RAM, 1.8 GB held by a hog, a 6 GB copy): plain rsync full stall 5 702 / 2 464 ms, peak „full” 16.8 / 6.9 %; the same copy in a 512 MB memory-capped container 374 / 320 ms, 0.9 / 1.0 %. Controller main `03c0a69` + `ae39467` (unreleased, rides 0.340.0): the copy runs capped only for clean `/mnt/` paths with no symlink (security review); a docker error (exit 125) falls back to plain rsync. A real `POST /api/backup/tier2` on rc.4: 6 capped containers, each exit 0; Immich's copy equals its source (dry-run 0 differences, 44 = 44 files). Evidence `audits/night-2026-10-22/P4-R1214/`. **2026-10-23 night (stray-copy fix, night brief Part 1).** The capped copy's container outlived the copy (a timeout or a controller restart killed only the `docker` CLI; `--delete` went on outside the R-1180 guard). Controller main `66a69d4` + `912e592` (unreleased, rides 0.340.0): a fixed name + label per copy, removed by name on any error, every leftover removed at start before the scheduler and the web server, a restore refused while a copy runs or may run; `--mount` (a path the daemon does not see is refused, not created empty) and the image ID with `--pull never` (review C4, C7). Proven on 9202 with rc.5 (`audits/night-2026-10-23/P1-straycopy/`): a restart in the middle of a 16 GB copy → the new controller removed `felhom-tier2-copy-immich-948f2280` at start, the restore probe was refused during the copy, the redone copy equals the source; a 15 s test build → the timed-out copy's container removed, the partial copy stopped growing. A second review of that code (N2–N5) and the commit's own security review (two races) → `9d9e404`, `1babfe9`: a stray clears when a later removal works, the start-up check never removes this process's own copy and holds the destination's lock, one copy per destination at a time, `RunTier2` refuses during a restore for every caller and records itself in one step with that check, every leg asks again. Re-proven on 9202 with rc.8 (`audits/night-2026-10-23/P1-straycopy/1*`). 9202 back on 0.339.0. | — | Release 0.340.0; then re-measure the 03:30 job on the 8 GB soak box and close if „full” stays low | CC | | **R-862** | Box system & updates | P3 | **Tester 2 cannot take the config bundle until one by-hand bootstrap is done: its `felhom-os-apply` (agent 0.142.0) predates the bundle mode, and no signed job can write a root file on it.** FOUND 2026-10-04 (R-840 build, Part C): the route reaches every box installed from installer 1.31.0 on, and the demo boxes (bootstrapped by CC); Tester 2 has every root file of agent 0.142.0 (installer 1.30.0) and lacks only the R-858 wrapper fix, which matters only for a Docker step it gets solely from a signed job. CC has no route to Tester 2 (its door admits only the operator's WireGuard peer; `felhom-op` cannot become root). The steps: `runbooks/config-bundle.md` "Tester 2". Then CC signs the bundle and reads it back. | **WAITING-ON-OPERATOR** — the operator said (2026-10-04 ~19:05) he will try through his tunnel **2026-10-07 07:58 (`09` §3 decision 170): the operator believes Tester 2 never set up the off-site backup (no escrow); the laptop may stay off for days; the tester plans to add an HDD.** **2026-10-07 (Part H, read only):** in Tester 2's last 10 notifications (2026-10-05 09:16 → 2026-10-07 06:58) the household got 0 mails, the operator 10 (host_down ×9, expected_dbdump_missed ×1); control: the household channel shows on the other three customers. So the household is not mailed daily while the box is off; no row (`audits/day-2026-10-07/H/`). **2026-10-22: closes when Tester 2 is reinstalled (operator ruling 2026-10-22 14:11 — a new install from the public download replaces the bootstrap and the off-site check; `pilot/TESTER2-handover.md`).** | the operator's WireGuard tunnel | the operator runs the three bootstrap commands; CC sends the bundle | operator | | **R-78** | Box system & updates | P3 | **`local_api` authority ruling — auto-reconcile vs detect-only** **MIGRATED FROM `ROADMAP.md` 2026-08-22 (R-369) — originally filed 2026-07-25, size M, roadmap state `idea (deferred OUT of R-77 on purpose)`.** Moved verbatim; nothing added or reinterpreted. The roadmap keeps its copy as history, marked moved. **An OWED OPERATOR DECISION, not a defect — moved because an owed ruling hidden among feature ideas is the shape this session exists to remove.** | **OPEN — migrated from ROADMAP 2026-08-22, rank unchanged** | — | R-77 ships detection because the fix is genuinely undecided, and **both directions can lose customer-visible function**. **Direction 1 (today):** `controller.yaml` wins and drift is silent → the 2026-07-25 island migration blinded the whole fleet's control plane for 17.5 h (drive gate, guest-reboot recovery, quiesce/backup all degrade). R-77 makes that loud but does not stop it recurring. **Direction 2 (`bootstrap.json` wins, auto-reconcile on boot):** a guest whose `controller.yaml` is CORRECT and whose `bootstrap.json` is stale — a half-completed re-provision, a hand-repaired guest, a setup-wizard box — gets a **working channel clobbered on the next restart**, fleet-wide and silently, during a routine deploy. That is not obviously better than the bug. Needs a spike: which writer is authoritative per field (endpoint vs fingerprint vs token — `mergeLocalAPI` replaces the whole block, so they cannot be reconciled independently today), whether the agent side should stamp a generation/mtime so 'newer wins' is even expressible, and whether reconcile should require an operator ack. Until then the drift alert plus a manual edit is the supported path. | CC | @@ -285,19 +280,17 @@ stopping line that lies. | **R-1004** | Box system & updates | P4 | **After an unclean stop every guest ext4 volume waits ~43 s in multi-mount protection before it mounts, so each restart after a power cut takes ~1.5 min longer.** Kernel: „EXT4-fs warning (device dm-6): ext4_multi_mount_protect: MMP interval 42 higher than expected, please wait" on dm-6/dm-7 and loop0/loop1, demo-hp and Tester 1, every round of `audits/night-power-2026-10-13/` (R1 `repairs.txt`). | **READY** — filed 2026-10-14 | — | CC: find where MMP is switched on for the guest volumes (Proxmox `pct` create, or our own mkfs), whether it protects anything on a one-host disk, and measure the restart without it on a scratch guest | CC | | **R-1013** | Box system & updates | P4 | **After a power cut the agent's start-up stale-lock pass logs an ERROR „pct unlock failed … no lock found" when Proxmox's own start-all removed the lock in the same second.** The outcome is the goal (no lock), so the line is a false alarm in the log. Seen on demo-hp 2026-10-14 12:07:44–45 UTC (`audits/power-cut-fixes-2026-10-14/E/after-boot.txt`; Proxmox: „removed left over backup lock from '9201'!"). Small, but the agent's release for this session is spent (v0.156.1). | **OPEN** — filed 2026-10-14 | — | CC: treat „no lock found" from `pct unlock` as already clear (INFO), with a test; ride the next agent release | CC | | **R-1061** | Box system & updates | P4 | **A per-customer floor reached Tester 1 only at its next 15-minute report, not in seconds.** Set 2026-10-15 12:55:51 UTC for tester-1, demo-hp and demo-felhom together (hub 0.153.0, CC's token): demo-hp and demo-felhom ran 0.314.0 within 13 s (the hub's wake); Tester 1 moved at 13:09:35, its regular report (`audits/gate-restore-2026-10-15/release/03-boxes-move.txt`). It had restarted at 12:54:29 onto rc.1 and logged „hub wait channel active". Why the wake did not reach it is not read (the wake line is DEBUG). No harm: the floor arrived. | **OPEN** — filed 2026-10-15 | — | Read Tester 1's DEBUG ring at the next floor change; compare with the hub's bump log | CC | -| **R-1285** | Box system & updates | P4 | **D43's removal of our SSH drop-in from a BYO host happens one bundle LATE: the bundle run that delivers agent 0.165.0 is planned by the box's OLD (0.164.0) wrapper, which writes the drop-in as before („same"), and only then replaces itself.** Measured 2026-10-25 on the BYO test host (VM 9371 on demo-hp, `Tester4-f967d4`; attended release run): 0.164.0 day-0 → signed `agent_update` + `agent_config_update` 0.165.0 → the planted drop-in still there; a second `agent_config_update` (same bundle) → `BUNDLE REMOVED … (ours, on a BYO host — D43)`, nothing written, `sshd -T` the owner's own `permitrootlogin yes` (`audits/release-2026-10-26/byo/byo-proof.txt`). No box is affected today (the fleet's only BYO host is this test host); a fresh BYO install on ≥ 0.165.0 runs the new wrapper from the start. | **VERIFY** — 2026-10-26: agent `b1bc63d` (unreleased) — the new agent runs the bundle-policy pass once right after its self-update commits (`selfupdate.SetOnCommitted`); test in the real order (commit, then one pass), red-proved. **Not live:** only a box coming FROM 0.164.0 discriminates (0.165.0's wrapper already applies D43), which needs a signed downgrade chain on a BYO box — the live proof rides the next agent release. **Earlier:** **OPEN** — 2026-10-26 (agent 0.166.0 released, attended run): the policy pass is wired, but in the normal delivery it does NOT run: the box gets `agent_update` and `agent_config_update` in ONE pass, and the bundle job runs in the OLD process (demo-hp: pid 1966780, agent 0.165.0, bundle 09:03:07–09:03:09 CET; the restart into 0.166.0 at 09:03:10) — no `bundle policy pass` line on any of the three boxes. So a BYO host coming from 0.164.0 still loses our drop-in one release late. The night proof (`audits/night-2026-10-25/rig/r1285-live.txt`) ran a bundle under an agent that was ALREADY 0.166.0-code, so it did not cover this order. No BYO host is in the fleet today. Fix options: the agent runs the pass once at start-up after `update committed`; or the release procedure sends the bundle job only after the commit. **Earlier state:** **VERIFY** — fixed on main 2026-10-25 night (agent `abcc1e6`), waits for the agent release + the vouch: the agent runs the wrapper's `bundle-policy` pass after every install (red-proved, `redproof-r1285.txt`). **Live on the rig in ONE signed run** (BYO host, staged as upgraded from 0.164.0: the new agent by hand, the old 0.164.0 wrapper on disk, our drop-in planted; one `agent_config_update` of a test bundle): the old wrapper installed the bundle and replaced itself, then „BUNDLE POLICY REMOVED … (ours, on a BYO host)", `sshd -T` the owner's own `permitrootlogin yes` (`rig/r1285-live.txt`); the test package deleted from the registry after. **Earlier state:** OPEN | — | either the wrapper plans again after it replaced itself (one agent change + a test that a 0.164.0→0.165.0 bundle on a BYO record removes our copy in ONE run, red first), or the release procedure sends a BYO box's config bundle twice; until then a BYO box upgraded from ≤ 0.164.0 keeps our drop-in until its next bundle | CC | +| **R-1285** | Box system & updates | P4 | **D43's removal of our SSH drop-in from a BYO host happens one bundle LATE: the bundle run that delivers agent 0.165.0 is planned by the box's OLD (0.164.0) wrapper, which writes the drop-in as before („same"), and only then replaces itself.** Measured 2026-10-25 on the BYO test host (VM 9371 on demo-hp, `Tester4-f967d4`; attended release run): 0.164.0 day-0 → signed `agent_update` + `agent_config_update` 0.165.0 → the planted drop-in still there; a second `agent_config_update` (same bundle) → `BUNDLE REMOVED … (ours, on a BYO host — D43)`, nothing written, `sshd -T` the owner's own `permitrootlogin yes` (`audits/release-2026-10-26/byo/byo-proof.txt`). No box is affected today (the fleet's only BYO host is this test host); a fresh BYO install on ≥ 0.165.0 runs the new wrapper from the start. | **VERIFY** — 2026-10-27: agent v0.167.0 RELEASED; in the NORMAL signed delivery the pass now runs right after the commit on all three boxes („running the bundle policy pass after the self-update commit (R-1285)” → `BUNDLE POLICY DONE install_mode=appliance removed=0`; `audits/release-2026-10-27/agent-0167-tester1-demofelhom.txt`). Not live: a BYO box coming FROM 0.164.0 (none in the fleet). **Earlier:** **VERIFY** — 2026-10-26: agent `b1bc63d` (unreleased) — the new agent runs the bundle-policy pass once right after its self-update commits (`selfupdate.SetOnCommitted`); test in the real order (commit, then one pass), red-proved. **Not live:** only a box coming FROM 0.164.0 discriminates (0.165.0's wrapper already applies D43), which needs a signed downgrade chain on a BYO box — the live proof rides the next agent release. **Earlier:** **OPEN** — 2026-10-26 (agent 0.166.0 released, attended run): the policy pass is wired, but in the normal delivery it does NOT run: the box gets `agent_update` and `agent_config_update` in ONE pass, and the bundle job runs in the OLD process (demo-hp: pid 1966780, agent 0.165.0, bundle 09:03:07–09:03:09 CET; the restart into 0.166.0 at 09:03:10) — no `bundle policy pass` line on any of the three boxes. So a BYO host coming from 0.164.0 still loses our drop-in one release late. The night proof (`audits/night-2026-10-25/rig/r1285-live.txt`) ran a bundle under an agent that was ALREADY 0.166.0-code, so it did not cover this order. No BYO host is in the fleet today. Fix options: the agent runs the pass once at start-up after `update committed`; or the release procedure sends the bundle job only after the commit. **Earlier state:** **VERIFY** — fixed on main 2026-10-25 night (agent `abcc1e6`), waits for the agent release + the vouch: the agent runs the wrapper's `bundle-policy` pass after every install (red-proved, `redproof-r1285.txt`). **Live on the rig in ONE signed run** (BYO host, staged as upgraded from 0.164.0: the new agent by hand, the old 0.164.0 wrapper on disk, our drop-in planted; one `agent_config_update` of a test bundle): the old wrapper installed the bundle and replaced itself, then „BUNDLE POLICY REMOVED … (ours, on a BYO host)", `sshd -T` the owner's own `permitrootlogin yes` (`rig/r1285-live.txt`); the test package deleted from the registry after. **Earlier state:** OPEN | — | either the wrapper plans again after it replaced itself (one agent change + a test that a 0.164.0→0.165.0 bundle on a BYO record removes our copy in ONE run, red first), or the release procedure sends a BYO box's config bundle twice; until then a BYO box upgraded from ≤ 0.164.0 keeps our drop-in until its next bundle | CC | -## Monitoring & notifications — 25 rows (P2 1, P3 17, P4 7) +## Monitoring & notifications — 21 rows (P2 1, P3 13, P4 7) | ID | Category | Sev | What | State | Blocked on | Next action | Owner | |---|---|---|---|---|---|---|---| -| **R-1261** | Monitoring & notifications | P3 | **The R-1250 line hold (committed, NOT released): three edges before it ships (review round 2, HUNT-4 H4–H6).** Two seeders behind one uplink: the hold takes only the first, so the test is refused „not quiet” every 15 min in the Tuesday window and never counted (`felhom-controller/controller/internal/upwatch/linehold.go:155-160`; agent `internal/linetest/linetest.go:379-381`); a hold record of an app removed while held is never cleared and the 50 % rule never runs again (`linehold.go:106-108`; `upwatch/service.go:149`); a qBittorrent alt-speed flip during the hold leaves 1 KiB/s stored (`explain.go:175`; `linehold.go:127-128`). | **VERIFY** — RELEASED in controller v0.344.0 (global floor 2026-10-26 09:07:47Z, every live box on 0.344.0); the live test with a seeding box is Tuesday 10:00–16:00 (R-1250's dated check). **Earlier:** **VERIFY** — fixed on main 2026-10-25 night (controller `a79a292`), waits for the controller release (before any household gets agent 0.165.0 by signed update): every running seeder held, a removed app's record dropped, qBittorrent's slot named (`up_limit`/`alt_up_limit`). Red-proofs `audits/night-2026-10-25/redproof-r1261.txt`. **Live on the night's rig** (BYO VM, agent 0.165.0, rc.1, two seeders): both held, 94.8 Mbit/s, both limits back; a speed-mode switch mid-test left no 1 KiB/s (`rig/hold-watch*.txt`); the removed-app case by test only. **Earlier state:** OPEN — **now in controller 0.343.0 (released 2026-10-25); the three edges act only on a box whose agent is ≥ 0.165.0 (it alone reports `waiting_for_quiet`) — fix before any household gets agent 0.165.0 by signed update** | — | before the next controller and agent release: hold every running seeder; clear a record whose app is gone; read the mode | CC | | **R-1262** | Monitoring & notifications | P3 | **The upload watch treats ANY viewer as an explanation for any amount of upload, so a hacked Plex can send freely while one family member watches.** Found 2026-10-24 (SEC-1 X1): `felhom-controller/controller/internal/upwatch/watch.go:275,299`; `08` §9 states the rule, its limits list did not name this case. | OPEN | — | propose a cap (viewers × a bitrate ceiling) for the operator's R-1244 design; `08`'s limits list names the case meanwhile | CC | | **R-1310** | Monitoring & notifications | P3 | **The security watch (R-1303) flags notices that do not apply and misses fixes that do — measured by reading all 38 flagged pins by hand on 2026-10-27.** False: advisories of ecosystem `actions` (Home Assistant's CI), of another package in the repo (Gitea's runner), with a hostname or ≤-old range (cal.com 2023/2024, Grafana 2022), for the desktop/Electron client (Termix), for the rootless image only (Uptime Kuma); a release hit on a word (Dawarich „no longer receives security fixes", Rallly v4.16.0). Wrong „no fix": Vikunja's six (range `<= 2.6.0`, fixed in 2.7.0), karakeep-chrome (154/156 exist). Missed: Tandoor 2.7.0 names 8 GHSA ids (1 matched), Dawarich 1.16.0 (2FA, export deletion), Wishlist v0.69.0 (critical, no GHSA). BEHIND reads linuxserver `26.09.20260929` as newer than 26.09.2; Seerr follows the renamed-away `fallenbagel/jellyseerr`. `audits/security-app-updates-2026-10-27/TRIAGE.md` NOT-A-FINDING list and `triage-notes/` | OPEN — filed 2026-10-27; **two shapes FIXED the same day** (ecosystem `actions` not listed; an empty fix with a closed range reads „after X"; test W9, red first) | — | teach `security_watch.py`: skip a package that is not the pinned one; match every GHSA id a release body names; ignore `YY.MM.YYYYMMDD` tags; repoint seerr to `seerr-team/seerr`; each with a test seen failing | CC | | **R-1020** | Monitoring & notifications | P4 | **`app_repaired_after_crash` reports a duration of 0 s, and the controller log says „in 0s".** `RunAfterUncleanBoot` sets `res.Duration` in a deferred func after the result is already returned (no named result), so the caller sees 0; the `app.yaml` record is right (10,172 ms on demo-hp 2026-10-14, `audits/immich-repair-2026-10-14/D/`). Small, but the controller release for this session is spent (v0.311.0). | **OPEN** — filed 2026-10-14 | — | CC: a named result (or set the duration before return), with a test on the returned value; ride the next controller release | CC | | **R-528** | Monitoring & notifications | P2 | **[P2-MEDIUM] Docker does not report an OOM kill inside a Felhom LXC guest: `OOMKilled` stays false and no `oom` event fires, so the v0.243.0 OOM line is not proven live.** MEASURED 2026-09-15 on scratch 9202 (Docker 29.8.0): Paperless capped at 128M restarted 11 times with `OOMKilled=false` and zero `docker events --filter event=oom`; a memory hog inside the running container was killed (rc 137) with the same silence (`E2-oom-signal-measure-9202.txt`). BIGNIGHT VM 333 did read `oomkilled=true`, so the shape differs by case. **Fix shape:** the agent reads the guest container cgroups' `memory.events oom_kill` counters (host-side, reliable), or the controller alarms on a restart-count trend **RE-MEASURED 2026-09-16 on the DRILL box (fresh install, nested VM 334, Docker in an LXC guest, controller 0.243.0), so the finding is not a property of one machine:** the Paperless webserver was capped at 128 M with `docker update --memory`; it restarted 9-10 times, and all three signals stayed silent - `OOMKilled=false` on every inspect, `docker events --filter event=oom` EMPTY for the whole window, the container's cgroup not visible from inside the guest, and `dmesg` unreadable there. Identical to scratch 9202. So the v0.243.0 OOM line cannot fire on ANY Felhom box as shipped, on either host. Evidence: `audits/evidence-drill-0243-2026-09-16/phase2-m1-oom.txt`. | **WATCHING — DESIGN WRITTEN 2026-10-26 night (the brief's Part 7: build only if time is left; it was not built — the line test and the attended release came first).** The host-side counter EXISTS and is readable (read on demo-hp 2026-10-26): `/sys/fs/cgroup/lxc//ns/system.slice/docker-<64-hex id>.scope/memory.events`, line `oom_kill N`. **Design:** (1) agent: a read-only collector (no root CLI — a sysfs read under the agent's own rights; if not readable, the existing sudoers fence gets one read-only `Cmnd_Alias`) that, for each guest in the `felhom` pool, globs those scopes and keeps `{container_id: oom_kill}`; served on the guest's own local API as `GET /guest/oom-kills` (`withGuest`, the guest's containers only). (2) controller: the 30-s dead-app scan asks once per pass; a RISE of a container's counter = an OOM kill whatever Docker's `OOMKilled` says → the existing `app_oom` line (R-636's per-run grain), `source: cgroup` in the details. An agent without the route = today's behaviour. (3) Tests: a fake cgroup tree (agent), a rising counter → one `app_oom` (controller, red-first). (4) Live: 9202, a throwaway app capped at 64M with a memory hog: the counter rises, `app_oom` names the container while `OOMKilled` reads false. ~1 day, two repos, one agent release. **Earlier:** WATCHING — **2026-10-12: the built part is released** (agent v0.150.0 carries the Docker-approval memory-kill check; the boxes run 0.154.0; hub 0.140.0+ requires a passing `oom_check` before a Docker set is approved). Per decision 157 nothing else is built; the row watches for a box whose Docker reports a false OOM flag. Dated look: 2026-11-12. **READY — rank P2-MEDIUM; owner: CC** **2026-09-17 (chaos night): an OOM WAS detected on a fresh box, and named precisely.** On `tester-1-022354` (controller 0.245.0, guest 9201, 6 GB RAM) immich’s Postgres was killed by the memory limit during its reverse-geocoding import, and the controller pushed `app_oom` (warning, operator-only): „Alkalmazás memóriája elfogyott: immich (immich-postgres) — egy folyamatát a memóriakorlát leállította” — naming the app AND the exact container. The visible consequence was `write CONNECTION_CLOSED immich-postgres:5432` and twelve restarts of immich-server. So on THIS box the OOM scan works and was the fastest route to the diagnosis; recorded here rather than filed as a new row. Evidence: `audits/evidence-chaos-night-2026-09-17/round-2.txt`. **2026-10-05 (burn-down night): a one-page design proposal (no code) is in `audits/night-burndown-2026-10-05/design-R-528.md`** — for the operator. **2026-10-06: STOPPED BEFORE ANY CODE — the measurement contradicted the design** (decision 155 said A then C). On scratch 9202, Docker 29.8.2, the `OOMKilled` flag was TRUE in all four shapes tried: a child process killed while the container kept running (`oom_kill` 0 → 3, flag true) and three main-process kills (exit 137, flag true); an `oom` event each time. The false flags of 2026-09-15 were on Docker 29.8.0. Cost read for the record: one exec read of 21 containers on demo-hp = 1.6 s. `audits/design-build-2026-10-06/`C/. **2026-10-06 18:24: operator ruling, option A (decision 157):** nothing is built; the row stays open as a WATCH for a box whose Docker reports a false flag. **Added:** a Docker engine set may not be approved until it reports a memory kill correctly on the boxes that ran it (built in this row's next session). **2026-10-06 (night): the Docker-approval memory-kill check is BUILT** — hub v0.140.0 (LIVE: the approval waits for a passing `oom_check` on every ring-0 box; a failed, errored or missing one blocks) and the agent's wrapper (`felhom-agent` `acccb66`, unreleased — ships as v0.150.0 after the 2026-10-07 read-back). Proven by hand on demo-hp's guest: `OOMKilled=true`, exit 137, the `oom` event — seen only with an events window ending after the run (the wrapper waits 2 s). `audits/readback-2026-10-07/`F/. | — | 2026-11-12: read the hub for any failed `oom_check` or an `app_oom` with no restart reason since 2026-10-12; none → close | CC | -| **R-1250** | Monitoring & notifications | P3 | **A qBittorrent that seeds all day is never line-tested, so it never gets the limit that exists for it.** The weekly test (R-1247) starts only after 10 minutes in which the host's uplink sent < 2 Mbit/s each minute; a seed at the line's speed keeps it busy through every window, so no test, no tested line, and no qBittorrent limit (D41 uses the tested line only). Found 2026-10-24 by reading the rule against the case it serves; not yet seen on a box (no test box seeds). **Due check moved 2026-10-27 → 2026-10-28 (2026-10-27 04:20Z, CC):** the measurement runs TODAY in the host's window (from 10:00 CET); on 2026-10-27 the gate would refuse every push until then. The result is recorded here today, and the line leaves the block. | **VERIFY — released 2026-10-25, the live proof is a dated check:** controller 0.343.0 (global floor 17:53Z) + agent 0.165.0 (vouched 18:38 CET) carry it; the real proof cannot run before the next due window — the agent starts a test only on its due Tuesday 10:00–15:59 local, and every box measured on 2026-10-24. **DUE 2026-10-27:** a throwaway qBittorrent on demo-hp seeding to DooPlex's qBittorrent (operator's yes 2026-10-25, about 30 minutes), from before the host's slot; read the agent's line value and the limit back. **Earlier: NARROWED 2026-10-24 — FIXED on main, not released** (brief 2026-10-24 Part 4, commit only): agent `29bcf44`+`1e087bb` (`waiting_for_quiet`, `POST /host/line-test/run`), controller `046b808` (`internal/upwatch/linehold.go`: record first, hold at 1 KiB/s, test, the exact old limit back; the start-up check after a kill; the 50 % rule waits). Red-proofs in both CHANGELOGs. **Live on demo-hp with a real seed** (10 Mbit/s to DooPlex's qBittorrent): refused `not-quiet` without the hold; held: uplink 0.02–0.16 Mbit/s, 94.2 Mbit/s, 56.8 s, back to 1 249 280 B/s exactly; a kill -9 mid-test left the record and the start-up check put the limit back (`audits/dooplex-alarms-2026-10-24/part4-r1250-live-proof.txt`). The live run used probes over plain HTTP (the pinned agent client is unit-tested, not live). | the next release train (agent ≥ 0.165.0 needs the operator's vouch) | Release agent + controller in the next normal train; on a seeding box read one Tuesday's `line test on request` line; then close | CC | | **R-1193** | Monitoring & notifications | P3 | **When the box froze (R-1192), the operator heard only „no report for 45 m" — 28 minutes in — and the household heard nothing at all.** Measured 2026-10-20 against the operator mailbox (the second channel): the freeze began ~13:05 UTC; the hub page read ONLINE / OK at 13:22 (correct inside the 45-minute threshold, R-549); `host_stale` at 13:33, `app_oom` at 13:34 (immich-machine-learning killed by its memory limit), `host_crash_restart` at 14:26 and 16:29 (the two plug pulls), `node_stale` 15:59 / `node_recovered` 16:03. No mail or banner tells the household that its box is not answering, and no operator mail says „the box answers ping but not its dashboard". CORRECTED the same day: the first version of this row said the hub showed OK „throughout" and „nobody was told" — that read only the hub page, not the mailbox. Evidence `audits/rehearsal-2026-10-20/journal.md`. | OPEN | — | Design note (2026-10-21, after R-1192's diagnosis): the freeze's signature is cheap to see from the HOST side — the guest cgroup's memory PSI „full" above ~50 % for a minute, or its `memory.events max` climbing, while the host still reports; the agent could raise `guest_memory_thrash` (operator mail in its own words, not „no report for 45 m") and the household banner „A dobozod most nagyon lassú…". With the swap fix (R-1192) the measured thrash ends within a minute, so this alarm should be built only if a freeze is seen again after the agent release; until then it stays a design. Decide whether a dashboard that does not answer for N minutes while the host still reports should alarm sooner and in its own words (guest-side liveness), and whether the household is told | CC | | **R-1202** | Monitoring & notifications | P3 | **A box whose clock is behind blames the hub and stops an app without telling anyone.** Rehearsal 2026-10-20 B6 #8: RTC set 2 years back (the OS raised it to 2026-04-13): the dashboard shows only „Hub nem elérhető" while the log says „x509: certificate … not yet valid: current time 2026-04-13…"; Paperless crash-looped and the box stopped it with a restore hold; the `app_stopped_unhealthy` event failed (hub unreachable), so neither the household nor the operator heard. After the real time came back the app stayed stopped until a Start (clear sentence, 1 min). | **OPEN** | — | say „the box's clock is wrong (it says )" when TLS fails with not-yet-valid/expired against a hub that answers; keep the stop event queued until the hub is reachable | CC | | **R-340** | Monitoring & notifications | P3 | **The new reachability check does not touch the surface that actually failed.** R-339 reports when the hub cannot READ ep0 — but the read it performs is the `usage` op, which is `proxmox-backup-manager` plus `df` over SSH, and therefore rides the **local API daemon**. The 2026-08-18 incident explicitly CLEARED that daemon: `proxmox-backup.service` was healthy throughout, and it was the **HTTPS proxy on 8007** that was wedged with a full accept queue. **So R-339's check would have returned green for all 9 h 37 m of that outage.** It closes the case where ep0 is unreachable *as a host*; it does not close the case that actually happened. This is not a defect in R-339 — it is the honest boundary of what it watches, recorded so a future reader does not mistake a green box gauge for a working off-site tier | **READY (M) — NEW 2026-08-18** | a tenantsync endpoint-script version bump (the op is added on ep0, so it needs the same version-gated rollout `ErrUsageUnsupported` already models) | Add a **health op** to `scripts/felhom-tenantsync.sh` that probes `https://127.0.0.1:8007/` on ep0 and reports the proxy's fd count and listen-queue depth, then surface it as a third signal. **Overlaps the connections spike (R-336's remaining half): both want the same observations from ep0, so whichever runs SECOND must reuse the first's evidence rather than re-measuring a protected machine twice** **REUSE, per this row's own instruction — the connections spike ran FIRST (2026-08-20) and already produced most of what the health op wants; do not re-measure a protected machine a third time.** Available in `audits/evidence-ep0-established-connections-2026-08-20/`: the proxy **fd count** and its type breakdown (`lsof` + `/proc//fd`), the **listen-queue depth** (`ss -lnt` — `Recv-Q 0`, `Send-Q 1024`), the **ESTAB/CLOSE-WAIT split**, the **per-peer** connection histogram, a **31-minute persistence diff** of full 4-tuples, and a **46.18 h** slope with Poisson bounds. What the health op would still add beyond these: a loopback `GET https://127.0.0.1:8007/` probe — the observation that distinguished "process problem" from "network problem" on 2026-08-18 and the one thing this spike did NOT take, because it is the surface R-339 cannot see. **And this spike sharpens what the op should report:** a rising **ESTAB** count is the live signal (CLOSE-WAIT was **0**, not merely flat), and per **R-344** the fd ceiling that matters may be the **agent's**, not only ep0's. | CC | @@ -314,7 +307,6 @@ stopping line that lies. | **R-1223** | Monitoring & notifications | P3 | **After a reboot, a box whose tunnel ep0 refuses is invisible: the future stamp is gone, so neither the D30 re-key nor the hub's alarm sees it.** Fresh review 2026-10-23 night (`REPORT-night-2026-10-23.md`, A8 + H1): the kernel forgets `latest-handshake` when the interface restarts (0 = never); the agent then sends neither `last_handshake_age_s` nor `handshake_future_s`, and `checkWGTunnel` (`hub/internal/api/host_tunnel.go`) does not judge a registered, active tunnel with no handshake at all. Shape: the clock ran ahead, was corrected, the box rebooted (some households switch off at night), ep0 still holds the future stamp and starts nothing. | OPEN | — | Agent: report `tunnel_up_s` (how long the unit has been active) with no handshake; hub: a registered, active tunnel with no handshake for > 30 min while reporting → `wg_tunnel_stale`; the agent re-keys the same way after 30 min with no handshake. Tests both sides; rides an agent release + a hub deploy | CC | | **R-1224** | Monitoring & notifications | P4 | **The operator's 1-hour mail cooldown for `wg_tunnel_stale` is per customer, not per host, and `wg_tunnel_ok` does not end it.** Fresh review 2026-10-23 night (`REPORT-night-2026-10-23.md`, H3): `notify/dispatcher.go:620` keys the cooldown `customerID:eventType`. Two hosts of one household going stale within an hour, or stale → ok → stale, store a second event row but mail once (the suppression is in `notification_log`). | OPEN | — | Key the cooldown by `host_id` from the details for host-scoped operator events, and let the matching ok event end it; a dispatcher test with two hosts; rides a hub deploy | CC | | **R-1233** | Monitoring & notifications | P4 | **`[ERROR] [stacks] execCommand failed: exit status 1` names no command.** Seen once a night (2026-10-21 00:30:49 and 2026-10-23 02:17:14 UTC, each right after an app stopped for its dump); the command and stderr go only into the returned error, which the caller may drop (`internal/stacks/manager.go:1757`). An ERROR nobody can judge. | OPEN | — | Log the command's first two words (`docker inspect`, never the arguments — `docker exec … psql` can carry a password) and the stderr's first line; find the caller of the nightly one | CC | -| **R-1291** | Monitoring & notifications | P3 | **A held app gives the operator no lasting signal: one event at the stop, then nothing — demo-hp's Kimai sat held 11 days unseen.** Found 2026-10-25 night (R-1286). No held-app state reaches the hub (the report carries none; the hub shows none); the crash-loop stop sends `app_stopped_unhealthy` once. On a household box an app held after a crash loop, a failed update or a failed restore stays stopped until someone opens its page. | **OPEN — BUILT, commit only, NOT released** — 2026-10-26 evening: controller `5bd03ad` (`internal/holdreport`) + hub `7e57e824` (`held_apps`, `HeldAppsChecker`, the „Held apps" list on the host page and the Hosts page); red-proved; live on 9202 against a test hub with a 3-min grace (listed, one operator mail, Start cleared it, the row went, household leg `skipped operator_only`) — `audits/d53-held-apps-2026-10-26/`. Closes when both release. Ruled D53 = operator-only reminders first (`09` §3 decision 265). **Earlier:** WAITING-ON-OPERATOR — 2026-10-26: the design is written (`08` §10 [DESIGN — proposed]: `app_held` / `app_hold_cleared` events + a daily re-send, a „Held apps" list on the host page, an operator reminder after a grace per reason, the hub never clears a hold; ~½ day controller + ~1 day hub). The pick is STATUS D53. **Earlier:** OPEN | — | a two-repo design: the controller reports its holds (stack, reason, since), the hub shows them on the host and mails a reminder after N days (the D-level of the reason); one row's worth of design first | CC | | **R-1296** | Monitoring & notifications | P4 | **When ep0's tenancy script refuses, the hub log shows only its one-line error — PBS's own reason (the 403 `missing Datastore.Audit|Datastore.Backup on …`) stays in the script's stderr, which the hub drops on a refusal.** Found 2026-10-26 diagnosing R-1295: the cause was visible only by reading ep0's proxy journal over root SSH. `hub/internal/tenantsync/client.go` `parseResponse` returns the JSON error and ignores stderr; the script keeps secrets off stderr by design (its header), so the tail is safe to log. | OPEN | — | append the last ~3 stderr lines to the refusal error (bounded, never stdout); a test that a secret on stdout never appears | CC | ## Hub & operator — 12 rows (P3 3, P4 9) @@ -353,7 +345,7 @@ stopping line that lies. | **R-990** | Business & legal | P4 | **Operator: read `documentation/audits/forum-research-2026-10-12/FELHOM.md` §5 and rule on each recommendation.** READ-ONLY research 2026-10-12: three years (#7943–#11092, 2,908 posts, 195 people, 82 beginner threads) of the public PROHARDVER! topic „Home server / házi szerver építése”, tagged and counted by person (`FINDINGS.md`, method and spot-check in `METHOD.md`; no username or post text in git). Ten ranked recommendations, none acted on; the top three: a „which machine works” page (8 of 33 beginners who name their hardware own only a Synology, a router disk or a Raspberry Pi — the installer cannot run there; the same gap is R-989's first recommendation from a different source, and the shipped-page half is R-991), „you do not choose an operating system — we do” (the biggest beginner question, 20 of 82 threads), and „bring your old office PC” as the cheap entry. Catalog gap (≥ 3 people): a DLNA server (7), an ad/DNS blocker (5), a camera recorder (5). | **WAITING-ON-OPERATOR** — filed 2026-10-12 | the operator's reading | Operator: rule on each of the ten (yes / no / later). If nothing is done: nothing changes; the research ages | operator | | **R-1035** | Business & legal | P4 | **Did the „felhő tárhely” page earn anything? Two dated checks.** **Baseline (reported by the operator from Search Console, 2026-10-14, last 3 months):** 1 click, 48 impressions, CTR 2.1 %, average position **73.6**; „felhő tárhely” 19 impressions, „felhőtárhely” 5, „felhő alapú tárhely” 3. CC measured separately that the phrase „felhő tárhely” appeared **0 times** on the home, FAQ and backup pages — Google was showing the home page for those queries by accident. `/sajat-felho-tarhely` + `/en/own-cloud-storage` published **2026-10-14**; full baseline, price sources and the power provenance in `audits/seo-2026-10-14/BASELINE.md`. **What to measure, both times:** impressions and average position for „felhő tárhely” and „saját felhő tárhely”, plus the new page's own impressions, clicks and position. **A null result at +4 weeks means nothing on its own** — a new page on a site at position 73.6 takes weeks to months to move, and „felhő tárhely” alone is held by Microsoft, Google and the big list sites; the page aims at the two longer phrases. That is why there are two checks and not one, and why neither should be read as a verdict on the copy. **There is no Search Console connector in this project, so CC cannot read these numbers** — the operator reads them, CC records and compares. **Blocked until the operator asks for indexing** (Search Console → URL-ellenőrzés → the URL → „Indexelés kérése”): until that happens, or Google finds the page itself, both checks read zero for a reason that is not the page. **This is a slow channel and does not replace talking to people.** | **WATCHING** | operator: request indexing, then supply the Search Console read | 2026-11-11: first read (+4 weeks); 2026-12-09: second (+8 weeks), compared with the first | operator + CC | -## Process & tooling — 33 rows (P3 8, P4 25) +## Process & tooling — 34 rows (P3 8, P4 26) | ID | Category | Sev | What | State | Blocked on | Next action | Owner | |---|---|---|---|---|---|---|---| @@ -397,7 +389,6 @@ stopping line that lies. the R-row. Duplicating them here would create the second source this design avoids. --> | item | due (UTC) | what to measure | |---|---|---| -| R-1250 | 2026-10-28 | the released line hold, live: a seeding qBittorrent on demo-hp (peer DooPlex's, operator yes 2026-10-25) through the host's due window; the line value and the limit back; detail in the R-1250 row | | R-1293 | 2027-03-29 | the spring clock change: the hub's 02:00 snapshot and the 02:30 push on 2027-03-28 (02:00–03:00 does not exist) — which file each push took; detail in the R-1293 row | | R-1228 | 2026-10-30 | D35 (yes, after the release week): start moving the website + installer to Cloudflare; detail in the R-1228 row | | R-1050 | 2026-11-15 | HSTS one year if no https trouble since 2026-10-15; detail in the R-1050 row | @@ -406,6 +397,5 @@ stopping line that lies. | R-1035 | 2026-12-09 | the same three numbers 8 weeks after publishing, compared with the 4-week read; a null at 4 weeks is not a verdict, both reads are needed; detail in the R-1035 row | | **R-1297** | Process & tooling | P3 | **CI waits dominate a working day: felhom.eu's CI run takes ~13 min and the ONE runner makes every repo's job wait behind it (up to 10–17 min queued).** Measured 2026-10-26 (operator: „these CI waiting times are getting out of hand"): since 10-25 felhom.eu runs median 793 s, the controller/agent/catalog 57–102 s; queue median 5 s, max 548–1023 s. In run 2366, ~10 of 13 minutes are four suites — `test_gate_decoys.py` 232 s, `test_due_checks_gate.py` 133 s, `test_repo_gates.py` 132 s (it runs the whole gate set a SECOND time), `dooplex-offsite/test_dooplex_offsite.py` 69 s — plus `hub-gofmt` ~110 s (a cold Go cache per run). **Ruled 2026-10-26 by the operator: BOTH** — (A) trim felhom.eu CI: the heavy suites only when their own files change, no duplicate full run, a Go cache for hub-gofmt; (B) a second CI runner on DooPlex. | **OPEN — (A) BUILT 2026-10-26 evening, closes after the first nightly run (2026-10-27 03:20 UTC) is read.** Both runners proven at once (jobs 2374 + 2375 on `felhom-gates-runner` / `-2`, 17:11:41Z). felhom.eu CI, one push each: **(a) docs only** 810 s (old runner) → 351 s (2 CPUs) → see the close-out; **(b) a gate script** 351 → 203 s (`ecd82aba`, job 2376); **(c) a hub change** 351 → 118 s (`7e57e824`, job 2378). Heavy suites by path + tag + nightly; `test_repo_gates.py` and due-checks group G test the wiring (130 s each → under 3 s). Decoys through CI's entry point with the filter ON: a docs-only register break → red; an inert gate → GREEN at first (a decoy hole, fixed in `e33ec821`) → red. No Go cache: CI has no Go (the 110 s was security-scan, now 27 s). `audits/r1297-ci-trim-2026-10-26/`. (B) DONE by the operator (`09` §3 decision 267). | — | (A) CC, a run of its own (a CI scope change, ruled); (B) a DooPlex change — a brief or the homelab session; and CC waits on CI only before a release or at the end of a run | CC | -| **R-1298** | Monitoring & notifications | P3 | **Scratch guest 9202 carries leftovers made outside the product, and D53 would remind about them every week once released: four crash-loop holds since 2026-09-24 for apps that are not installed (`chaoscrash`, `chaosoom`, `chaosoomb`, `gokapi`), and a PrivateBin `app.yaml` (2026-10-25) with no container that the product reads as „installed".** Found 2026-10-26 evening in the D53 live proof: the new reporter sent the four holds at its first tick and the test hub mailed four reminders („held 32 days"). The product's removal clears an install's hold (R-704); these apps were removed by hand in a chaos drill. On a household box the same shape would mail the operator weekly about an app that does not exist. | **VERIFY — fixed on `main`, waits for the controller release** — controller `b156e45` (an install's hold of an app that is not installed is not reported; a restore hold always is), red-proved; live on 9202 (the four orphans skipped by name). 9202's four holds cleared with `-clear-restore-hold` and the PrivateBin leftover removed through the product — `audits/night-fixes-2026-10-26/`. Close at the release. **Earlier:** OPEN | — | decide whether the reporter (or the hub) skips an `unhealthy_stop` / `update_failed` / `putback_pending` hold whose app is not installed (a restore hold stays reported — operator-cleared by design, R-379); then clear 9202's four holds with `-clear-restore-hold` and remove PrivateBin through the product | CC | | **R-1299** | Process & tooling | P4 | **The operator's one-shot clean-up grant (`POST /offsite/window-grant/`, optional `max_remove`) has no button on any hub page** — the operator could not find it on 2026-10-26 (D55) and had to make a one-purpose access token so CC could call the route. The route, its scope (`offsite:write`) and its event exist (R-833); only the form is missing. | OPEN | — | a small form on the Off-site page (customer, optional cap ≤ 500), with a render test for both branches | CC | | **R-1302** | Monitoring & notifications | P4 | **A fresh install's agent logs ERROR „store-grant: GRANT WAS MISSING AND HAS BEEN SELF-REPAIRED — investigate the loss (R-190)" and „capability DEGRADED" for `felhom-pbs` at its FIRST start, although the grant was simply never made yet** — the whole-guest tier is armed (21:00:45) before the PBS storage exists (created 21:00:57 on the hub's descriptor). Seen 2026-10-26 night on the R-1232 BYO box (VM 9375, `audits/night-fixes-2026-10-26/r1232/3-first-run.txt`) and on 2026-10-25's BYO box (`degraded=pve:store-grant:felhom-pbs`). An ERROR that says „investigate the loss" on every new box teaches the reader to skip it. | OPEN | — | on the first grant of a tier whose storage did not exist before, log INFO „granted" instead of the loss ERROR; keep the ERROR for a grant that existed and vanished; a test for both | CC | diff --git a/documentation/backlog/STATUS-HISTORY.md b/documentation/backlog/STATUS-HISTORY.md index 548a079f..2719be1f 100644 --- a/documentation/backlog/STATUS-HISTORY.md +++ b/documentation/backlog/STATUS-HISTORY.md @@ -5,6 +5,14 @@ Moved here byte for byte on 2026-10-14 (night session), newest first, so that `S **Updated 2026-10-13 (night): demo-hp, demo-felhom and Tester 1 run agent 0.155.0; demo-felhom runs controller 0.310.0, the other two 0.309.0 until the floor is raised. The open-items list is at 127. Reports: `REPORT-poweroff.md`, `REPORT-plugmeter.md`, `REPORT-usenet-2026-10-12.md`, `REPORT-newapps-2026-10-12.md`, `REPORT-disk-evening-2026-10-12.md`, `REPORT-answers-2026-10-12.md`, `REPORT-m3-2026-10-11.md`, `REPORT-redesign-2026-10-10.md`, `REPORT-testers-2026-10-10.md`, `REPORT-register-shrink-2026-10-10.md`, `REPORT-new-apps-2026-10-10.md`, `REPORT-release-2026-10-10.md`, `REPORT-break-the-circle-2026-10-09.md`, `REPORT-dooplex-survival-2026-10-09.md`, `REPORT-day4-2026-10-09.md`.** +## Moved from STATUS on 2026-10-27 (afternoon) + +**Updated 2026-10-26 (night).** Saved and proven tonight, not released: kept data never offers a live app's folder; a reinstalled box backs up off-site at once; app-file import keeps links and owners and works again for MariaDB apps; Go 1.27.3. D55's window runs tonight. + +- Built, not released (Tuesday's block, each on your yes): R-1291, R-1220, R-1232, R-1187, R-1219, R-1298, R-972, R-1285. R-1218 needs you: off-site off on Tester 1 for minutes (hub customer page), or it leaves the release. + +**2026-10-26.** On the hub's Hosts page, delete `Tester4-b5dbbd` (CC's test VM of tonight, uninstalled and destroyed; you already deleted `Tester4-b5ec39`). If not: the hub alarms that the box went silent. After demo-hp's window has run (CC says when, Tuesday morning), revoke the token `cc-d55-window` (R-1294). New: a nightly security watch mails you (R-1303). + ## Moved from STATUS on 2026-10-26 (night) **Updated 2026-10-26 (evening).** CI is faster: two runners work at once, and a hub or document push now takes about 2 minutes instead of 6–13. Held apps now reach you (built, not released): a „Held apps" list on the host page and the Hosts page, and one mail after a waiting time. One pick for you: D55.