Skip to content

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.