Prowlarr evidence (R-1048) + its apps-page card; the stated app count 62 -> 63; R-1057 filed
gates / gates (push) Successful in 6m34s

- documentation/audits/prowlarr-2026-10-15/: bench (update test proven, C3 failed as it must, soak 7.6 %,
  volume-persistence CLEAN, official-image check), 9202 runs 1-3 (run 1's bump emptied the drill .felhom.yml — a
  test-tool bug, fixed; run 3 re-proved the step and backup -> remove -> restore with the full template), tools.
- website: a Prowlarr card on both apps pages; every stated count 62 -> 63, the media group 19 -> 20; sizing.json +
  sizing-data.json carry Prowlarr (41/44 MB, onboarding), the sizing test and SIZING.md table moved to 63 apps.
- OPEN-ITEMS: R-1057 (a restore of a removed gated app returns without the gate, even from a backup made before the
  setup — measured on 9202); R-1036 notes the count and that wger/plant-it are hidden/abandoned.

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:
2026-10-15 12:58:18 +02:00
parent 994c75c0a8
commit 2f1f6c8052
62 changed files with 2846 additions and 44 deletions
+6 -6
View File
@@ -92,8 +92,8 @@ class SizingWeb(unittest.TestCase):
self.assertEqual(io.open(DATA, encoding="utf-8").read(), B.render(B.build()),
"sizing-data.json differs from a fresh build — run scripts/build_sizing_web.py")
def test_offers_the_62_listed_apps_plus_builtin(self):
self.assertEqual(len(self.all), 62)
def test_offers_the_63_listed_apps_plus_builtin(self):
self.assertEqual(len(self.all), 63) # 62 + Prowlarr (2026-10-15, R-1048)
self.assertEqual([a["slug"] for a in self.d["apps"] if a.get("builtin")], ["filebrowser"])
def test_guest_sizes_follow_the_installer(self):
@@ -109,7 +109,7 @@ class SizingWeb(unittest.TestCase):
"household": (HOUSEHOLD, [N, T, W, W, W, W, W], 16, 12),
"household without immich": ([s for s in HOUSEHOLD if s != "immich"], [T, W, W, W, W, W, W], 12, 8), # 2026-10-14 HP raise: 2,731 x 1.5 = 4,096.5 > 4,096
"immich alone": (["immich"], [T, W, W, W, W, W, W], 12, 8),
"all 62": (self.all, [N, N, N, N, T, W, W], 48, 32), # 24 GB: guest 19,868 < peak 22,333
"all 63": (self.all, [N, N, N, N, T, W, W], 48, 32), # 24 GB: guest 19,868 < peak 22,377 (22,333 before Prowlarr)
"nothing": ([], [W] * 7, 8, None),
}
for name, (sel, want, rec, tight) in cases.items():
@@ -133,7 +133,7 @@ class SizingWeb(unittest.TestCase):
def test_segments_add_up_to_the_bar(self):
for name, sel in {"household": HOUSEHOLD, "household without immich": [x for x in HOUSEHOLD if x != "immich"],
"immich alone": ["immich"], "all 62": self.all, "nothing": []}.items():
"immich alone": ["immich"], "all 63": self.all, "nothing": []}.items():
well, segs = segments(self.d, sel)
self.assertAlmostEqual(sum(mb for _, mb in segs), well * 1024, delta=1, msg=name)
self.assertGreaterEqual(dict(segs)["base"], 0, name + ": base system negative")
@@ -148,7 +148,7 @@ class SizingWeb(unittest.TestCase):
base8 = small * 1024 - guest_mib(self.d, small)
tiny = ["glance"] # 6 MB: its fits-well size is far below 8 GB
self.assertLess(min_box_gb(self.d, (self.d["platform_mb"] + 7) * self.d["headroom"]), small)
for name, sel in {"nothing": [], "tiny": tiny, "household": HOUSEHOLD, "all 62": self.all}.items():
for name, sel in {"nothing": [], "tiny": tiny, "household": HOUSEHOLD, "all 63": self.all}.items():
bar, segs = segments(self.d, sel)
self.assertGreaterEqual(bar, small, name)
self.assertAlmostEqual(sum(mb for _, mb in segs), bar * 1024, delta=1, msg=name)
@@ -217,7 +217,7 @@ class SizingWeb(unittest.TestCase):
elif len(cells) > 2 and not cells[0].startswith("---"):
rows[cells[0]] = cells
sel = {"Household set": HOUSEHOLD, "Household set without Immich": [s for s in HOUSEHOLD if s != "immich"],
"Immich alone": ["immich"], "All 62 apps": self.all}
"Immich alone": ["immich"], "All 63 apps": self.all}
self.assertEqual(set(rows), set(sel))
for name, slugs in sel.items():
peak, verdicts = estimate(self.d, slugs)