Backfill de la clave de importacion (contact_import_key del registry) de los
contactos existentes + enriquecimiento aditivo desde un .vcf de Google
(telefonos/emails faltantes en contacts, direcciones en la persona enlazada).
Match por import_key con fallback por telefono. No destructivo: solo INSERT/UPDATE,
con assert de conteo intacto. Recupero los campos que el import original descarto.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
12 checks: auth requerida (401 sin/con credencial mala), TLS Let's Encrypt + no-cleartext,
recepción de los 1065 contactos via PROPFIND+REPORT, integridad TEL/EMAIL de un contacto
conocido. Lee la credencial de pass en runtime (sin secretos hardcodeados). Validado en
emulador Pixel_API34 con DAVx5 4.5.14: recibió los 1065 contactos.
- sync_dav_to_osint.py (NUEVO): reverse sync Xandikos->vault. Trae contactos
nuevos del movil (contexto: movil, dedup por tel/email) y ediciones de agenda
(nombre/tel/email/aliases) PRESERVANDO la capa OSINT (relaciones/dni/contexto/
fuente/tags). Estado persistente .sync_state.json (UID->etag/vault_mtime).
Reconciliacion por etag; --dry-run (default) / --apply.
- sync_osint_to_dav.py: anade --check (audit read-only vault<->Xandikos: fichas
sin vCard, vCards huerfanos, agendas divergentes) y optimiza build_existing_index
con dav_get_collection (1 REPORT, ~9s->~0.5s) en vez del patron N+1.
Usa las funciones del registry: dav_get_collection, dav_delete_resource,
carddav_put_vcard, obsidian CRUD, pass_get_secret.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>