Saltar a contenido

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-playbook y 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-playbook borra cambios del humano.
  • Drift detection convierte la UI de HA en un staging area y el repo en producción. Mismo modelo que git stash vs commit.

Relaciones

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).