Communitygithub.com

StephenSook/attest

El agente telefónico que se niega a adivinar. Una llamada de verificación divulgada por cada entrada del directorio de atención médica: cada respuesta cita el intervalo textual exacto de la transcripción, la conciliación muestra su aritmética y una puerta conforme se abstiene en lugar de adivinar. Hackathon CALL-E, septiembre de 2026.

¿Qué es attest?

Verify By Phone es un skill de flujo de trabajo diseñado para que un agente de IA verifique la veracidad de la información almacenada sobre una organización mediante una llamada telefónica divulgada. Cada registro genera exactamente una llamada CALL-E que se anuncia como automatizada, extrae la respuesta con un soporte textual literal de la transcripción, la concilia con el registro original usando aritmética transparente de pesos de coincidencia y devuelve un nivel de confianza calibrado o una abstención explícita. El skill incluye scripts para calibrar umbrales, realizar llamadas con o sin parámetros de prueba (`--live` o dry run), extraer respuestas con puntuaciones de confianza y conciliar con el dato almacenado. Su objetivo principal es impedir que un agente convierta una respuesta incierta en una escritura de base de datos falsa, absteniéndose cuando el resultado no es concluyente. Soporta llamadas de verificación para directorios de proveedores médicos, registros comerciales y datos cuya fuente de veracidad es telefónica, bajo estrictas reglas de consentimiento y transparencia.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add StephenSook/attest

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Verificar por Teléfono

Utilice este skill cuando un agente deba establecer si la información almacenada sobre una organización sigue siendo cierta y una llamada telefónica al número público de la organización es la forma de averiguarlo.

verify-by-phone es un skill de flujo de trabajo de verificación. Realiza exactamente una llamada CALL-E divulgada por registro, extrae la respuesta de la transcripción con un intervalo textual de soporte literal, la concilia con el registro almacenado mediante una aritmética transparente de pesos de coincidencia y devuelve un nivel de confianza calibrado o una abstención explícita. El objetivo de diseño es un agente que nunca convierta una respuesta telefónica incierta en una escritura de base de datos segura.

Cuándo Usarlo

Utilice este skill para:

  • verificar una entrada de un directorio de proveedores: si este consultorio es real, está accesible, acepta pacientes nuevos y acepta un plan de seguro específico
  • comprobar si un registro comercial almacenado (horarios, servicios, disponibilidad) sigue coincidiendo con la realidad
  • actualizar cualquier conjunto de datos donde el teléfono sea la fuente de verdad y el registro se sospeche obsoleto
  • flujos de trabajo en los que un resultado "desconocido" deba registrarse honestamente en lugar de adivinarse
  • un registro a la vez, con una lista de destinatarios autorizados por humanos

Cuándo No Usarlo

No utilice este skill para:

  • realizar llamadas no divulgadas o engañosas; cada llamada anuncia que es un asistente automatizado y el motivo de la llamada al mismo tiempo
  • llamar a números inalámbricos o personales; los objetivos de verificación son líneas organizacionales publicadas
  • realizar marketing, ventas, generación de clientes potenciales o cualquier difusión promocional
  • marcar en lote una lista sin autorización humana por registro
  • sobrescribir directamente un registro almacenado a partir del resultado de una llamada; el resultado es un veredicto con evidencia y la decisión de escritura queda en manos del operador
  • adivinar una respuesta que el encuestado no dio; si la llamada no arroja una respuesta útil, el resultado es una abstención, y esa es la salida correcta

Reglas de Consentimiento y Divulgación

Estas son fundamentales, no un mero relleno:

  1. La llamada comienza indicando la identidad de IA y el propósito juntos, antes que cualquier otra cosa, y anuncia que la llamada puede ser grabada.
  2. Si el encuestado se opone a hablar con un llamante automatizado, la llamada agradece y finaliza de inmediato. El resultado registra la negativa como un resultado no verificable.
  3. El tiempo de espera está limitado. Si el encuestado pide al llamante que espere, espera brevemente y luego informa en lugar de esperar indefinidamente.
  4. El agente nunca inventa información que no se le haya proporcionado, ni en la llamada ni en el resultado. Concretamente: una clínica a menudo pedirá al llamante un nombre, una fecha de nacimiento, un número de miembro o tarjeta de seguro, o un motivo de la visita. El agente dice claramente que no tiene esa información, porque se trata de una llamada de verificación de directorio y no de una solicitud de cita, y luego repite la pregunta que hizo para responder. Un marcador de posición es una invención.
  5. El buzón de voz no es una respuesta. Al llegar al buzón de voz o a un contestador automático, la llamada finaliza de inmediato sin dejar mensaje: no se puede establecer un hecho del directorio a partir de una grabación y nadie debería encontrar un mensaje de robot en su línea.
  6. Las llamadas son para verificación informativa, nunca promocional. Trate cada llamada como grabada teniendo en cuenta los requisitos de consentimiento de todas las partes.

Flujo de Trabajo de Verificación

  1. Calibre primero el umbral de abstención, con scripts/calibrate.py sobre datos de escenarios etiquetados, de modo que "confianza" signifique algo medible: en el nivel predeterminado, la respuesta verdadera cae dentro del conjunto de predicción al menos el 90 por ciento de las veces en datos no vistos. Imprime un qhat que el paso 6 consume. Esto se ejecuta sin credenciales y sin llamadas, por lo que se puede hacer una vez, antes de cualquier marcado.
  2. Recoja el registro a verificar: nombre de la organización, número de teléfono publicado en E.164 y las afirmaciones que verificar (por ejemplo, si acepta pacientes nuevos, si acepta un plan nombrado).
  3. Confirme que el operador autoriza esta llamada específica a este número específico.
  4. Construya la tarea de llamada con scripts/place_verify_call.py. El script por defecto realiza una ejecución de prueba que imprime la tarea exacta y el destinatario sin marcar; pase --live solo después de que la ejecución de prueba se vea correcta.
  5. Consulte el resultado final con scripts/poll_result.py, que guarda la carga útil completa en un archivo local.
  6. Extraiga la respuesta con scripts/extract_answer.py --qhat del paso 1. Cada campo extraído contiene el intervalo textual literal de la transcripción y los desplazamientos de caracteres que lo respaldan. Las respuestas evasivas ("Creo que sí") mantienen su polaridad con una puntuación de confianza atenuada. Los turnos sin respuesta (número equivocado, negativa, "llame más tarde") nunca cuentan como respuestas. La respuesta se entrega solo cuando el conjunto de predicción calibrado es un solo valor y ese valor no es "desconocido"; de lo contrario, el resultado es una abstención. Omitir --qhat hace que todo se abstenga y etiqueta la salida como sin_calibrar, porque un umbral sin calibración no garantiza nada.
  7. Concilie con el registro almacenado usando scripts/reconcile_record.py: cada campo de acuerdo añade bits documentados de evidencia, cada campo en desacuerdo los resta, y el veredicto es verificado, contradicho o no verificable.

Nota de Mantenimiento

Los scripts en este skill son copias autocontenidas de la implementación de referencia en el backend de Attest (backend/app en el repositorio fuente). Se mantienen pequeños a propósito para que el skill se instale sin dependencias de ese repositorio.

Esa copia se hace cumplir, no se promete. tests/test_skill_parity.py en el repositorio fuente ejecuta el extractor de este skill y el del backend sobre las mismas transcripciones y falla si discrepan en la respuesta, en los desplazamientos de caracteres del intervalo citado o en los propios léxicos de indicio. Una versión anterior de esta nota pedía a un humano que volviera a sincronizar manualmente, y la copia se desvió de todos modos: el backend aprendió a confiar en el último indicio de un turno y a leer "no hay problema" como acuerdo, mientras que este script todavía confiaba en el primero, por lo que un simple "No, no lo estamos" se abstenía aquí y respondía allí.

Inicio Rápido

pip install calle-ai

# 1. Calibre la puerta primero. Imprime el qhat que necesita el paso 5.
python3 scripts/calibrate.py --data references/sample-scenarios.jsonl --alpha 0.1

# 2. Ejecución de prueba: imprime la tarea y el destinatario enmascarado, no marca nada.
python3 scripts/place_verify_call.py \
  --org "Centro de Consejería Ejemplo" \
  --phone "+15550101234" \
  --claim-accepting-new-patients yes \
  --claim-plan "Example Health PPO"

# 3. Realice la llamada real (requiere CALLE_API_KEY).
python3 scripts/place_verify_call.py ... --live

# 4. Espere la carga útil final.
python3 scripts/poll_result.py --call-id call_abc123 --out result.json

# 5. Extraiga la respuesta con soporte textual, limitada por el umbral calibrado.
python3 scripts/extract_answer.py --payload result.json --qhat 0.750

# 6. Concilie con el registro almacenado.
python3 scripts/reconcile_record.py --payload result.json \
  --claim-accepting-new-patients yes --claim-plan-accepted yes

Todos los números de ejemplo en este skill son números ficticios reservados. La ruta de ejecución de prueba y los datos de escenarios incluidos significan que todo, excepto el paso 3, se ejecuta sin credenciales y sin llamadas reales.

Aspecto de la Salida

extract_answer.py emite un objeto JSON por cada afirmación:

{
  "claim": "accepting_new_patients",
  "answer": "yes",
  "trust_score": 0.9,
  "hedged": false,
  "span": {"turn": 6, "text": "Sí.", "char_start": 0, "char_end": 3},
  "abstain": false,
  "gate": "conformal(qhat=0.750)"
}

Una abstención mantiene la misma forma con "abstain": true, ya sea porque el conjunto de predicción calibrado contenía más de una etiqueta o porque el extractor no encontró ninguna respuesta ("answer": "unknown"). El campo gate nombra el umbral que tomó la decisión y aparece como uncalibrated cuando no se proporcionó --qhat, que es el único caso en que toda afirmación se abstiene independientemente de lo que se dijo. reconcile_record.py añade la aritmética de pesos de coincidencia y un veredicto. Ningún campo aparece nunca sin un intervalo de soporte o una abstención explícita.

Efectos Secundarios y Cancelación

  • Efecto secundario: exactamente una llamada telefónica saliente por invocación con --live, al número que el operador proporcionó. No hay repeticiones; no hay programador en este skill.
  • Coste: una llamada CALL-E facturable por ejecución real. Las ejecuciones de prueba son gratuitas.
  • Cancelación: CALL-E no expone la cancelación de llamadas, por lo que el momento de detenerse es antes de --live. La opción de ejecución de prueba predeterminada existe exactamente por esa razón.
  • Datos: las cargas útiles se escriben en archivos locales que nombra el operador. Los números de teléfono se enmascaran en la salida de la consola. Nada en este skill transmite resultados a ningún lugar excepto a la propia API de CALL-E.

Referencias

  • references/api-notes.md: la forma de la carga útil CALL-E observada empíricamente y los comportamientos de la API en los que se basa este skill, incluidos los hechos descubiertos mediante pruebas y no mediante documentación.
  • references/verification-protocol.md: el guion de divulgación completo, la postura legal para las llamadas de verificación salientes y por qué la abstención es la decisión de diseño central.
  • references/sample-scenarios.jsonl: datos de escenarios ficticios etiquetados utilizados por scripts/calibrate.py, para que la calibración se ejecute sin credenciales y sin llamadas.

Skills relacionados