Patrón: drift detection (config fuera de git)¶
Cron periódico que detecta cuando el estado real del sistema diverge del estado declarado en git. La gente humana mete cambios via UI de HA con buenas intenciones; sin drift detection, esos cambios desaparecen en el próximo
ansible-playbooky nadie sabe por qué. Con drift detection, el agente alerta o auto-reconciliá según política.
Contexto¶
Es el complemento operativo de ../concepts/everything-is-code. "Everything is code" es la norma; drift detection es el enforcement. Sin enforcement, "all is code" colapsa en semanas — porque el flujo "edito rápido en UI" es muy seductor.
Contenido¶
Modelo¶
periodicamente (cada N horas):
1. download HA config actual via bellackn role
2. git diff vs HEAD
3. si hay diff:
- si trivial (timestamp updates, .storage binary): ignorar
- si meaningful (automation added/modified): alerta / PR
- si conflicting (UI edit vs repo): pide approval humano
Implementation cron¶
#!/bin/bash
# /etc/cron.daily/ha-drift-check.sh
set -euo pipefail
cd /home/user/homelab
git fetch origin
# Download current state from HA via bellackn role
ansible-playbook playbooks/download-ha-state.yml
# Diff
if [-n $(git status --porcelain home-assistant/)](<../../-n $(git status --porcelain home-assistant/).md>); then
# Hay drift
DRIFT=$(git diff --stat home-assistant/)
# Notificar al agente / humano
curl -X POST $TELEGRAM_WEBHOOK -d "Drift detectado en HA:\n$DRIFT"
# Reset (no auto-merge — pide approval humano)
git checkout home-assistant/
fi
O usando el agente AI:
# Cron call al agente cada 6h
claude --skills ha-drift-check \
--prompt "revisá si hay drift entre repo y HA; si hay,
decidí: trivial → ignorar, meaningful → abrir PR,
conflicting → alertar humano"
Política de respuesta¶
| Tipo de drift | Acción default |
|---|---|
Timestamp en .storage/* |
Ignorar (HA actualiza estos solo) |
| Automation nueva (UI created) | Abrir PR "Promote UI automation X to repo" |
| Automation modificada (UI edit) | Abrir PR "Adopt UI edit of automation X" |
| Automation borrada (UI delete) | Alertar humano "¿confirmás delete?" |
| Entity registry renamed | Abrir PR "Rename entity X to Y" |
| Custom integration installed via HACS | Alertar humano "nueva dependencia" |
El agente decide qué hacer¶
Mes 1-2: agente solo reporta el drift, no actúa. Mes 3-6: agente abre PRs automáticos para drift trivial / additive. Mes 6+: agente puede auto-merge PRs trivial tras validación.
El conflicting drift (UI edit y repo edit divergen) siempre pide approval humano. No auto-resolve.
Frecuencia¶
- Cada 6 horas suficiente para captar drift antes que se pierda.
- Inmediato post-apply de Ansible: validar que el upload terminó como esperado.
- Pre-upgrade de HA Core: validar que no hay drift no-tracked que se va a perder en el upgrade.
Por qué importa especialmente¶
- Sin drift detection, "edito en UI" se vuelve hábito → repo dejá de ser source of truth → cualquier
ansible-playbookborra cambios del humano. - Drift detection convierte la UI de HA en un staging area y el repo en producción. Mismo modelo que
git stashvscommit.
Relaciones¶
- Apoyo crítico de: ../concepts/everything-is-code.
- Implementación con: ../sources/bellack-hass-ansible (download mode).
- Conectado con: ai-as-operator (el agente decide qué hacer con cada drift).
- Conectado con: ../analysis/q3-iac-strategy-v1 (capa de enforcement).
- Conectado con: ../analysis/q10-ai-tooling-strategy-v1 (el agente puede ser el ejecutor).
Abierto / gaps¶
- Cómo el agente decide "trivial vs meaningful" — prompt template a definir.
- Patrón para drift en archivos binarios (
.storage/JSON) que cambian timestamps sin cambio real. - Cómo se maneja drift cuando el repo tiene cambios no aplicados todavía (humano editó repo + UI simultáneamente).