Contratos con propietario actual — 19 octubre 2026¶
Aplicación autorizada de los pendientes de review-next-runtime-20261019.md.
Scope: scripts/service-onboarding, contrato ABS, comprobación de rutas central,
secretos de entorno heredados en hunter/scanner. No se arrancó Onepacerr,
Sablier, Bazzite ni se cambió la política equilibrada de los *arr.
Audiobookshelf: aplicado, propietario CT218¶
Contrato actualizado a /opt/personal/musica/compose.yaml, respetando los binds
existentes; /podcasts y /audiobooks son de sólo lectura y ahora el contrato lo
refleja. Se conserva config/metadata RW y se comprueba lectura de cuatro rutas.
El fleet de VM208 despacha sólo ABS a un endpoint SSH fijo. Clave dedicada sin
secretos compartidos en reportes, from=192.168.0.XXX,restrict,command=... en CT218.
El wrapper sólo acepta check/check-http, carga un manifiesto root-owned fijo y
responde únicamente checks saneados. No permite comandos, URLs, hosts ni paths
arbitrarios. Claves SSH de host pinneadas mediante canales ya autenticados:
CT218 a través de pmx51/pct, CT212 por SSH del Mac. No se usó TOFU.
Runtime, Compose, entorno, mounts, backup nativo y backend HTTP en CT218; las dos afirmaciones del conversor siguen comprobándose en VM208. No se retiró la cobertura al mover el propietario ni se extendieron recibos vencidos.
Resultado real 20:36Z: ABS 0 fallos, 3 sin verificar (imagen mutable, flujo funcional con recibo vencido, login real pendiente). No se afirma reproducción real ni recuperación completa nueva. No se reinició ABS.
Rutas: aplicado, propietario CT212¶
El inspector VM208 importaba el homelab-ctl anterior y el pin rechazaba el código actual, dejando el informe del 18 octubre. Ahora usa un endpoint fijo de sólo lectura del CT212, con la lista root-owned de siete hostnames registrados. El caller coteja exactamente esa lista contra sus contratos, evitando informes parciales que aparenten cubrir productos ausentes.
Se revisó el código central y se mantiene pin SHA256
<REDACTED>.
El adaptador no llama fetch_host ni collect_desired, porque escriben caches;
recoge labels vivos con los comandos forzados existentes y transforma en memoria.
El controlador, sus caches, el túnel y Caddy no se modificaron. La clave existente
del controlador se usa únicamente para lectura de Caddy/labels; comprobación de
hosts estricta. Cloudflare GET, sin peticiones a apps ni renovación de sesiones.
Resultado real 20:36:45Z: siete hostnames, exit_code 0, informe fresco en
/home/monxas/appdata/service-onboarding/routes.json. Se validan origen, túnel,
ambos Caddy y DNS; autenticación privada/login conserva su cobertura declarada.
Despliegue, comprobaciones y recuperación¶
Fuentes y versiones instaladas: VM208 checker/inspector/contrato; CT218 checker,
wrapper y contrato root-owned; CT212 inspector/wrapper/allowlist root-owned.
Jobs y calendarios existentes sin cambios. Backup VM208:
~/backups/service-onboarding-20261019/source.before.
Authorized keys originales preservadas en ambos CT como
/root/.ssh/authorized_keys.pre-contracts-20261019.
No se sustituyeron claves existentes ni se retiraron permisos ajenos.
48 pruebas locales service-onboarding correctas. Nuevas regresiones verifican host/producto fijo, rechazo de resultado malformado, permanencia del conversor local y adaptador central sin escritura de caches. Ambos endpoints rechazan un comando arbitrario con rc2/stdout vacío, comprobado usando la clave dedicada.
Hunter/scanner: deriva real resuelta mediante recreación acotada¶
La comparación en memoria mostró CF_API_TOKEN presente en ambos runtimes del
18 octubre y vacío en Compose actual; las fuentes .env esperadas no lo
contenían. No se imprimió ningún valor. El código de ambas aplicaciones no
referencia ese campo: era entorno heredado sobrante, no una credencial necesaria
que debiera copiarse a Compose para aparentar equivalencia.
Tras coordinación, se comprobó admisión sin trabajo puntual: scanner sin
transferencias, hunter sin cola y cero slots activos en put.io. Se recrearon
sólo plundrio-hunter y plundrio-scanner con --no-deps --no-build --pull never,
sin cambiar imagen ni los binds ni flags previos (HUNTER_ENABLED, mantenimiento,
autocleanup, notificaciones). Ambos volvieron healthy. El token heredado queda
vacío, igual a Compose. Se preservó una huella sin secretos de imagen/mounts/flags
en ~/backups/service-onboarding-20261019/runtime-before.json, modo600.
Los loops automáticos que ya estaban habilitados retoman su operación normal;
no se disparó un bulk/import/search manual ni se alteraron límites del hunter.
Fleet real 20:40:09Z: 11 contratos, 0 fallos, 29 sin verificar. El aumento 26→29 sin verificar es cobertura restaurada de los tres pendientes reales de ABS que el fallo del colector ocultaba; no se ampliaron caducidades ni se registró una restauración o login inexistente. Onepacerr original sigue fuera de esta intervención y de su política aún pendiente; plundrio-onepacerr conserva su contrato separado.