diff --git a/Plugin/unraid/api/partnership_lists.php b/Plugin/unraid/api/partnership_lists.php
index aa3ecd5..2e2fc03 100644
--- a/Plugin/unraid/api/partnership_lists.php
+++ b/Plugin/unraid/api/partnership_lists.php
@@ -109,11 +109,31 @@ if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
// ── Write ────────────────────────────────────────────────────────────────────────────────────
$action = $_POST['action'] ?? '';
+// Containers this host runs, PLUS whatever the lists already name. The conf legitimately holds
+// entries for containers that are not here right now — one removed since it was added, one
+// living on a partner, one simply stopped. Validating only against the running set would refuse
+// to save a list the operator had not touched: FALLBACK_HOST1_TIER4 still carries "LidaTube",
+// which no longer exists here, so opening the card and pressing Save would fail on a line
+// nobody had edited.
+//
+// New names still have to be real. The guard is against inventing containers, not against
+// keeping ones already recorded.
$known = [];
foreach (vv_docker_containers() as $c) {
$n = is_array($c) ? ($c['name'] ?? '') : (string)$c;
if ($n !== '') $known[strtolower($n)] = $n;
}
+$existingRaw = vv_read_conf_raw($myConf);
+foreach ($TIERS as $t) {
+ foreach (vv_parse_conf_list($existingRaw, $tierVar($t)) as $n) {
+ $n = trim($n);
+ if ($n !== '' && !isset($known[strtolower($n)])) $known[strtolower($n)] = $n;
+ }
+}
+foreach (vv_parse_conf_list($existingRaw, $svcVar) as $x) {
+ $n = $fromXml($x);
+ if ($n !== '' && !isset($known[strtolower($n)])) $known[strtolower($n)] = $n;
+}
// Rewrites one `NAME=(` … `)` block in place, preserving the leading indent the conf uses.
$rewrite = function (string $cur, string $var, array $items): ?string {
diff --git a/Plugin/unraid/pages/partnership.php b/Plugin/unraid/pages/partnership.php
index 92b916d..a0c4895 100644
--- a/Plugin/unraid/pages/partnership.php
+++ b/Plugin/unraid/pages/partnership.php
@@ -778,6 +778,157 @@ function _renderXfer(x) {
`;
}
+// ── Failover coverage + shared services ───────────────────────────────────────
+// Both cards read one endpoint and edit real conf arrays: the tiers fallback.sh consults during
+// an outage, and the services stack onboard pushes. Loaded once — they are conf, not telemetry,
+// and re-fetching them on the 10s poll would fight whatever the operator is mid-way through
+// selecting.
+let _vvLists = null, _vvListsLoaded = false;
+
+function vvPtLoadLists() {
+ if (_vvListsLoaded) return;
+ _vvListsLoaded = true;
+ fetch('/plugins/varaverk/api/partnership_lists.php?_=' + Date.now())
+ .then(r => r.json())
+ .then(d => { if (d.ok) { _vvLists = d; _renderCover(); _renderSvc(); } })
+ .catch(() => {});
+}
+
+function _vvListRow(name, present, right) {
+ return `