Documentar activación del timer y el gotcha de HOME= en systemd --user

Timer activo desde 2026-08-26. Documenta el hallazgo en vivo: el
manager de systemd --user de devops arranca con HOME=/DATA (el de
/etc/passwd), no con el override de /etc/profile.d/zz-devops-home.sh
que solo aplica a shells interactivas -- sin Environment=HOME=... en
la unidad, claude -p habría fallado la autenticación en cada corrida
del timer, silenciosamente. Se detectó y corrigió antes de activar,
corriendo el servicio manualmente vía systemctl --user start con el
entorno real como último paso de validación.
This commit is contained in:
devops committed 2026-08-26 00:25:53 -05:00
1 parent 7c6f3d9c27
commit 10e2db5643
1 file changed
+34 -12
@@ -8,9 +8,10 @@ como decisión de gobernanza — la lista blanca de abajo es lo que
autoriza al agente a actuar sin intervención humana, y debe poder autoriza al agente a actuar sin intervención humana, y debe poder
auditarse. auditarse.
Estado: **script y prueba end-to-end validados en vivo (2026-08-26)**. Estado: **timer de systemd ACTIVO desde 2026-08-26** (`lab-agent.timer`,
El timer de systemd (automatización continua) **todavía no está usuario `devops`, cada 15 min entre 06:00–23:00 hora local). Script,
activo** — pendiente de decisión explícita para habilitarlo. Telegram y las unidades systemd, todo validado en vivo antes de
activar.
## Lista blanca de acciones correctivas automáticas ## Lista blanca de acciones correctivas automáticas
@@ -258,15 +259,36 @@ promedio estadísticamente robusto, es una primera estimación para
decidir si el timer se activa. Revisar el costo real después de la decidir si el timer se activa. Revisar el costo real después de la
primera semana en producción y ajustar frecuencia/modelo si hace falta. primera semana en producción y ajustar frecuencia/modelo si hace falta.
## Pendiente antes de activar el timer en continuo ## Activación del timer (2026-08-26)
Habilitado tras confirmación explícita del propietario del lab, viendo
antes el costo mensual estimado. Unidad de usuario (`systemctl --user`,
corre como `devops`, no `root`), con límites de CPU/memoria (`CPUQuota`,
`MemoryMax`) — instalada en `/DATA/.config/systemd/user/`, no en el
`~/.config/...` de una shell interactiva.
**Gotcha encontrado y corregido en vivo:** el manager de `systemd
--user` de `devops` arranca con `HOME=/DATA` (el valor de
`/etc/passwd`), no `/DATA/AppData/home-devops` — ese override solo se
aplica al abrir una shell interactiva vía
`/etc/profile.d/zz-devops-home.sh`, que el manager de systemd nunca
carga. Sin corregirlo, `claude -p` habría buscado
`~/.claude/.credentials.json` en `/DATA/.claude/` (no existe) y la
autenticación habría fallado en cada corrida del timer, silenciosamente,
hasta la primera vez que alguien mirara el log. `lab-agent.service`
fija `Environment=HOME=/DATA/AppData/home-devops` explícitamente para
evitarlo. Se detectó y corrigió *antes* de habilitar el timer, corriendo
el servicio manualmente vía `systemctl --user start` con el entorno
real (no desde una shell interactiva) como último paso de validación.
También requirió `sudo loginctl enable-linger devops` (una vez) — sin
eso, `systemctl --user` ni siquiera conecta (no hay `/run/user/<uid>`
sin una sesión de login o linger activo).
**Pendiente, no bloqueante:**
- **Confirmación explícita del propietario del lab** para habilitar el
timer de systemd — no se activa automáticamente solo por haber
pasado la prueba end-to-end ni por tener el costo estimado.
- Unidad systemd de usuario (`systemctl --user`, corre como `devops`,
no `root`), con límites de CPU/memoria (`CPUQuota`, `MemoryMax`).
Requiere `loginctl enable-linger devops` (una vez, con sudo) para que
seguir corriendo sin sesión interactiva activa.
- Opcional: `GITEA_TOKEN_FILE` para activar la señal de "runner - Opcional: `GITEA_TOKEN_FILE` para activar la señal de "runner
atascado" vía API de Gitea Actions (hoy se omite, degradación segura). atascado" vía API de Gitea Actions (hoy se omite, degradación segura).
- Decidir la tensión con la ventana de `medusa-deploy` (ver arriba). - Decidir la tensión con la ventana de `medusa-deploy` (ver arriba) —
sigue sin resolver, el timer se activó igual porque no bloquea el
resto de la lista blanca.