Prowlarr linked on 9201 (live catalog): R-1048 closed, R-1058 filed; the session report
gates / gates (push) Successful in 6m47s

- audits/prowlarr-2026-10-15/box9201: Sonarr then Prowlarr — no link until „Bekötés most"; Radarr after Prowlarr —
  linked by itself ~60 s later; Prowlarr's connection test 200 for both, its sync command completed; all removed
  keeping data. The first run's key-quoting defect in the tool is recorded and fixed.
- R-1058 (Apps & catalog, P3): the wiring does not start when Prowlarr itself comes up.
- R-1048 closed (CLOSED-ITEMS). STATUS, CONTEXT. REPORT-release-rule-prowlarr-2026-10-15.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-15 13:14:32 +02:00
1 parent 5d78569bac
commit 02be5006bb
13 files changed
+282 -5

No files matched your search

@@ -29,5 +29,7 @@ e917a58 restored the file; run 3 repeated the step. Run 1's checks before the bu
it redirects to the login (measured; FIRST-ADMIN row).
- No lock-out after wrong passwords → a stranger cannot lock the household out (the property `09` §3 decisions 57–60
protect); no row.
- The box links Prowlarr only when Sonarr/Radarr come up, or on „Bekötés most" → the copy says so; the register row is
in `OPEN-ITEMS.md` (filed in this session, see `box9201/`).
- The box links Prowlarr only when Sonarr/Radarr come up, or on „Bekötés most" → measured on 9201 (`box9201/`); the copy
and the website card say so; R-1058.
- A restore of a removed gated app comes back without the gate, even from a backup made before the setup → measured
on 9202 run 3 (a stranger's `/ping` 200 after the restore, 401 before); R-1057.
@@ -0,0 +1,14 @@
2026/10/15 11:01:52 sync.go:283: [INFO] [sync] Catalog sync complete
2026/10/15 11:01:52 sync.go:126: [INFO] [sync] Initial sync: Sablonok frissítve — frissítve: immich, prowlarr
26: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
27: sync_interval: 15m
-rw------- 1 root root 1944 Oct 12 20:52 /var/lib/docker/volumes/felhom-controller-data/_data/controller.yaml.pre-prowlarr1015
mirror main ebf3668f DRILL prowlarr: the step -> lscr.io/linuxserver/prowlarr:version-2.6.5.5623 (R-1048, checklist 2.5)
cache HEAD 73b45a6 Prowlarr into the live catalog, with its complete onboarding record (R-1048)
https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
ls: cannot access '/var/lib/docker/volumes/felhom-controller-data/_data/drill-catalog.git': No such file or directory
repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
0
e129d58b0b4f1ad551c92aeb876d52a3 /opt/docker/stacks/prowlarr/.felhom.yml
@@ -0,0 +1,20 @@
# demo-hp 9201, LIVE catalog 73b45a6, controller 0.313.0 — the Prowlarr link read-back (2026-10-15)
`link.txt` is the record; the two consoles are the raw output. Pressed only what a person presses: the sync, the deploy
wizard's call, „Bekötés most" (`POST /api/storage/media/wire`), stop + remove keeping data.
- **[B] Sonarr first, Prowlarr after:** the box's wiring ran when Sonarr came up; in the 150 s after Prowlarr came up no
wiring ran at all. „Bekötés most" then answered `prowlarr: done, wrote application Sonarr` — the wirer writes only a
link that is missing (`mediawire.go` `prowlarr()`), so the link was not there before the press.
- **[A] Radarr after Prowlarr:** the wiring ran ~60 s after Radarr came up (`radarr=done(3) prowlarr=done(1)`) and
Prowlarr's Apps listed Radarr and Sonarr, both `fullSync`, by container name.
- **[D]** Prowlarr's own connection test for each link: 200. Its sync command `ApplicationIndexerSync`: completed.
Prowlarr holds no indexer yet, so Sonarr's and Radarr's indexer lists are empty, as expected.
- **[X]** All three removed keeping data: each config volume removed (that is what remove does to a volume), the
drive's media folder kept (4.9 MB, Sonarr's and Radarr's), 0 containers and 0 volumes left.
**One tool defect, recorded:** the first run read Prowlarr's API key in the guest shell instead of inside the container
(double quotes), so its own reads in [B3] and [C2] show 401. The box-side facts above do not depend on them. The
script was fixed (`shlex.quote`) and re-entered with `CONTINUE=1` from [A] on; the installs stood.
The install-order gap is register row R-1058; the copy and the website card already tell the household about the button.
@@ -0,0 +1,18 @@
13:02:21 [0] controller: gitea.dooplex.hu/admin/felhom-controller:0.313.0
13:03:40 [sync] the badge NEVER caught up to lscr.io/linuxserver/prowlarr:version-2.6.5.5623 in 79.2s — catalog_images = None
13:03:44 [0] live catalog on the box: 73b45a6 Prowlarr into the live catalog, with its complete onboarding record (R-1048) | https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
13:03:47 [0] prowlarr template on the box: 4949 /opt/docker/stacks/prowlarr/.felhom.yml | image: lscr.io/linuxserver/prowlarr:version-2.6.5.5623@sha256:f9151e5bc1025c6d0a630d503210cdcb6bb55a7cc098562609d96a408d838902 | setup_gate: true
13:03:47 deploy sonarr {"DOMAIN": "enkisfelhom.hu", "SUBDOMAIN": "sonarr", "HDD_PATH": "/mnt/felhom-drives/hdd_1"} -> 202 {"ok": true, "message": "The install has started – the card shows how it is going"}
13:04:17 sonarr: deployed, running, pinned={'sonarr': 'lscr.io/linuxserver/sonarr:4.0.20'}
13:05:40 [B1] wiring after Sonarr came up:
2026/10/15 11:04:55 media_events.go:69: [INFO] [media] wiring the drives into the media apps (a media app came up: sonarr)
2026/10/15 11:04:56 mediawire.go:138: [INFO] [mediawire] 1 drive(s) wired in 1.046s: folders=done(0) sonarr=done(3) plex=household(0)
13:05:40 deploy prowlarr {"DOMAIN": "enkisfelhom.hu", "SUBDOMAIN": "prowlarr"} -> 202 {"ok": true, "message": "The install has started – the card shows how it is going"}
13:06:05 prowlarr: deployed, running, pinned={'prowlarr': 'lscr.io/linuxserver/prowlarr:version-2.6.5.5623'}
13:06:12 [B2] prowlarr first-start line: [felhom] first start - AuthenticationRequired=Enabled, AnalyticsEnabled=False seeded
13:08:48 [B3] 150 s after Prowlarr came up (Sonarr was there first): Prowlarr's Apps = 401
13:08:48 [B3] wiring runs since Prowlarr's install: (none)
13:08:50 [C1] „Bekötés most” (POST /api/storage/media/wire) -> 200; prowlarr result: [{"app": "prowlarr", "state": "done", "wrote": ["application Sonarr"]}]
13:08:53 [C2] Prowlarr's Apps after the press: 401
13:08:53 deploy radarr {"DOMAIN": "enkisfelhom.hu", "SUBDOMAIN": "radarr", "HDD_PATH": "/mnt/felhom-drives/hdd_1"} -> 202 {"ok": true, "message": "The install has started – the card shows how it is going"}
13:09:14 radarr: deployed, running, pinned={'radarr': 'lscr.io/linuxserver/radarr:6.4.4'}
@@ -0,0 +1,17 @@
13:09:45 [CONTINUE] re-entered after the key fix; Radarr started 2026-10-15T11:09:01Z; Sonarr, Prowlarr, Radarr installed by run 1 of this script
13:09:48 [CONTINUE] Prowlarr's Apps read now with the right key: [('Sonarr', 'fullSync', 'http://sonarr:8989')]
13:10:15 [A1] Radarr appeared in Prowlarr's Apps by itself, ~20 s after Radarr ran
13:10:15 [A2] Prowlarr's Apps: [('Radarr', 'fullSync', 'http://radarr:7878'), ('Sonarr', 'fullSync', 'http://sonarr:8989')]
13:10:18 [A2] wiring runs since Radarr's install:
2026/10/15 11:10:02 media_events.go:69: [INFO] [media] wiring the drives into the media apps (a media app came up: radarr)
2026/10/15 11:10:03 mediawire.go:138: [INFO] [mediawire] 1 drive(s) wired in 1.849s: folders=done(0) sonarr=unchanged(0) radarr=done(3) prowlarr=done(1) plex=household(0)
13:10:25 [D1] Prowlarr's connection test for Radarr (Radarr, syncLevel fullSync) -> 200
13:10:28 [D1] Prowlarr's connection test for Sonarr (Sonarr, syncLevel fullSync) -> 200
13:10:31 [D2] sync command ApplicationIndexerSync -> 201 id=1
13:10:37 [D2] sync command status: completed
13:10:40 [D3] Prowlarr's own log of the sync:
13:10:43 [D4] Sonarr's and Radarr's indexer lists (Prowlarr has no indexer yet, so both empty is the expected answer): [] <- sonarr | [] <- radarr
13:11:19 [X] radarr: stop 200, remove keeping data -> 200 {"ok": true, "data": {"removed": "radarr", "volumes_removed": ["radarr_radarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/hdd_1/userdata/media (4.9M)"], "verified": true}, "message": "Stack radarr removed
13:11:54 [X] prowlarr: stop 200, remove keeping data -> 200 {"ok": true, "data": {"removed": "prowlarr", "volumes_removed": ["prowlarr_prowlarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": [], "verified": true}, "message": "Stack prowlarr removed"}
13:12:30 [X] sonarr: stop 200, remove keeping data -> 200 {"ok": true, "data": {"removed": "sonarr", "volumes_removed": ["sonarr_sonarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/hdd_1/userdata/media (4.9M)"], "verified": true}, "message": "Stack sonarr removed
13:12:39 [X] left: containers=0 volumes=0
@@ -0,0 +1,17 @@
{
"order_A_apps": [
[
"Radarr",
"fullSync",
"http://radarr:7878"
],
[
"Sonarr",
"fullSync",
"http://sonarr:8989"
]
],
"test_Radarr": "200",
"test_Sonarr": "200",
"sync_status": "completed"
}
@@ -0,0 +1,35 @@
[0] controller: gitea.dooplex.hu/admin/felhom-controller:0.313.0
[sync] the badge NEVER caught up to lscr.io/linuxserver/prowlarr:version-2.6.5.5623 in 79.2s — catalog_images = None
[0] live catalog on the box: 73b45a6 Prowlarr into the live catalog, with its complete onboarding record (R-1048) | https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
[0] prowlarr template on the box: 4949 /opt/docker/stacks/prowlarr/.felhom.yml | image: lscr.io/linuxserver/prowlarr:version-2.6.5.5623@sha256:f9151e5bc1025c6d0a630d503210cdcb6bb55a7cc098562609d96a408d838902 | setup_gate: true
deploy sonarr {"DOMAIN": "enkisfelhom.hu", "SUBDOMAIN": "sonarr", "HDD_PATH": "/mnt/felhom-drives/hdd_1"} -> 202 {"ok": true, "message": "The install has started – the card shows how it is going"}
sonarr: deployed, running, pinned={'sonarr': 'lscr.io/linuxserver/sonarr:4.0.20'}
[B1] wiring after Sonarr came up:
2026/10/15 11:04:55 media_events.go:69: [INFO] [media] wiring the drives into the media apps (a media app came up: sonarr)
2026/10/15 11:04:56 mediawire.go:138: [INFO] [mediawire] 1 drive(s) wired in 1.046s: folders=done(0) sonarr=done(3) plex=household(0)
deploy prowlarr {"DOMAIN": "enkisfelhom.hu", "SUBDOMAIN": "prowlarr"} -> 202 {"ok": true, "message": "The install has started – the card shows how it is going"}
prowlarr: deployed, running, pinned={'prowlarr': 'lscr.io/linuxserver/prowlarr:version-2.6.5.5623'}
[B2] prowlarr first-start line: [felhom] first start - AuthenticationRequired=Enabled, AnalyticsEnabled=False seeded
[B3] 150 s after Prowlarr came up (Sonarr was there first): Prowlarr's Apps = 401
[B3] wiring runs since Prowlarr's install: (none)
[C1] „Bekötés most” (POST /api/storage/media/wire) -> 200; prowlarr result: [{"app": "prowlarr", "state": "done", "wrote": ["application Sonarr"]}]
[C2] Prowlarr's Apps after the press: 401
deploy radarr {"DOMAIN": "enkisfelhom.hu", "SUBDOMAIN": "radarr", "HDD_PATH": "/mnt/felhom-drives/hdd_1"} -> 202 {"ok": true, "message": "The install has started – the card shows how it is going"}
radarr: deployed, running, pinned={'radarr': 'lscr.io/linuxserver/radarr:6.4.4'}
[CONTINUE] re-entered after the key fix; Radarr started 2026-10-15T11:09:01Z; Sonarr, Prowlarr, Radarr installed by run 1 of this script
[CONTINUE] Prowlarr's Apps read now with the right key: [('Sonarr', 'fullSync', 'http://sonarr:8989')]
[A1] Radarr appeared in Prowlarr's Apps by itself, ~20 s after Radarr ran
[A2] Prowlarr's Apps: [('Radarr', 'fullSync', 'http://radarr:7878'), ('Sonarr', 'fullSync', 'http://sonarr:8989')]
[A2] wiring runs since Radarr's install:
2026/10/15 11:10:02 media_events.go:69: [INFO] [media] wiring the drives into the media apps (a media app came up: radarr)
2026/10/15 11:10:03 mediawire.go:138: [INFO] [mediawire] 1 drive(s) wired in 1.849s: folders=done(0) sonarr=unchanged(0) radarr=done(3) prowlarr=done(1) plex=household(0)
[D1] Prowlarr's connection test for Radarr (Radarr, syncLevel fullSync) -> 200
[D1] Prowlarr's connection test for Sonarr (Sonarr, syncLevel fullSync) -> 200
[D2] sync command ApplicationIndexerSync -> 201 id=1
[D2] sync command status: completed
[D3] Prowlarr's own log of the sync:
[D4] Sonarr's and Radarr's indexer lists (Prowlarr has no indexer yet, so both empty is the expected answer): [] <- sonarr | [] <- radarr
[X] radarr: stop 200, remove keeping data -> 200 {"ok": true, "data": {"removed": "radarr", "volumes_removed": ["radarr_radarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/hdd_1/userdata/media (4.9M)"], "verified": true}, "message": "Stack radarr removed
[X] prowlarr: stop 200, remove keeping data -> 200 {"ok": true, "data": {"removed": "prowlarr", "volumes_removed": ["prowlarr_prowlarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": [], "verified": true}, "message": "Stack prowlarr removed"}
[X] sonarr: stop 200, remove keeping data -> 200 {"ok": true, "data": {"removed": "sonarr", "volumes_removed": ["sonarr_sonarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/hdd_1/userdata/media (4.9M)"], "verified": true}, "message": "Stack sonarr removed
[X] left: containers=0 volumes=0
@@ -14,6 +14,7 @@ Then: Prowlarr's own connection test for each link, and its sync command to comp
import json
import os
import re
import shlex
import sys
import time
@@ -38,13 +39,15 @@ w.say = say
def papi(path, body=None, method=None):
# FIXED 2026-10-15 after the first run: json.dumps() quoted this with DOUBLE quotes, so the guest shell expanded
# $(sed …) and $K before docker exec — empty key, every call 401 (link.txt [B3]/[C2]). shlex.quote keeps it literal.
"""Prowlarr's own API from inside its container (the key read from its config.xml at use, never printed)."""
m = method or ("POST" if body is not None else "GET")
data = json.dumps(body) if body is not None else ""
script = ("K=$(sed -n 's:.*<ApiKey>\\(.*\\)</ApiKey>.*:\\1:p' /config/config.xml); "
f"curl -s -o /tmp/pb.json -w '%{{http_code}}' -X {m} -H \"X-Api-Key: $K\" -H 'Content-Type: application/json' "
f"--data-binary @- http://127.0.0.1:9696/api/v1{path}; echo; cat /tmp/pb.json")
out = w.guest(f"docker exec -i prowlarr sh -c {json.dumps(script)} <<'EOF'\n{data}\nEOF")
out = w.guest(f"docker exec -i prowlarr sh -c {shlex.quote(script)} <<'EOF'\n{data}\nEOF")
code, _, body_ = out.partition("\n")
try:
return code.strip(), json.loads(body_) if body_.strip() else None
@@ -87,6 +90,8 @@ def wait_healthy(c, tries=60):
def main():
w.login()
if os.environ.get("CONTINUE") == "1":
return part2()
t0 = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
for a in ("prowlarr", "sonarr", "radarr"):
if w.stack(a).get("deployed"):
@@ -125,6 +130,15 @@ def main():
tR = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
install("radarr", {"DOMAIN": w.DOMAIN, "SUBDOMAIN": "radarr", "HDD_PATH": HDD})
wait_healthy("radarr")
part2(tR)
def part2(tR=None):
"""From order A's check on (CONTINUE=1 re-enters here after the first run's key bug; the installs stand)."""
if tR is None:
tR = w.guest("docker inspect radarr -f '{{.State.StartedAt}}'").strip()[:19] + "Z"
say(f"[CONTINUE] re-entered after the key fix; Radarr started {tR}; Sonarr, Prowlarr, Radarr installed by run 1 of this script")
say(f"[CONTINUE] Prowlarr's Apps read now with the right key: {apps()}")
a_apps = None
for i in range(30):
time.sleep(10)