Una respuesta IA depende de tres ingredientes mutables:
Si cualquiera cambia y no lo trazamos, una respuesta histórica se vuelve no reproducible y no auditable. AI Act art. 12 requiere trazabilidad → versionamos los tres.
Los system prompts (PICO + síntesis RAG) se hashean en functions/src/evidencia/promptRegistry.ts:
export const PROMPT_VERSIONS = {
pico: hashPrompt(PICO_SYSTEM_PROMPT), // sha256 truncado a 12 chars
synth: hashPrompt(SYNTH_SYSTEM_PROMPT),
};
Cada respuesta del modelo loguea prompt_version_pico y prompt_version_synth en evidencia_consultas. Si modificamos un prompt, el hash cambia automáticamente.
La cadena de fallback en routing.ts devuelve el provider y model concreto de la respuesta exitosa. Se loguea como sintesis_provider (ej. deepseek) y sintesis_model (ej. deepseek-v4-flash).
Los cambios de prompt quedan en git history (git log functions/src/evidencia/picoExtractor.ts functions/src/evidencia/ragSynthesizer.ts). Cada commit con cambio de prompt usa convención:
chore(prompt): bump synth v[hash] — motivo del cambio
- Cambio concreto (líneas añadidas/quitadas).
- Justificación clínica/regulatoria.
- Tests afectados.
| Tipo de cambio | Aprobación requerida | Validación previa |
|---|---|---|
| Cambio mínimo (typo, claridad) | Auto-approve responsable | Tests existentes verdes |
| Cambio menor (refinar instrucción, añadir constraint) | Responsable + post-mortem rápido | Tests + bias audit harness verde |
| Cambio mayor (nueva sección, cambio de estructura) | Responsable + entrada en CHANGELOG | Tests + bias audit + revisión manual de 10 escenarios |
| Cambio crítico (nueva safeguard, refactor estructural) | Responsable + actualización risk assessment | Tests + bias audit + revisión clínica externa (residente senior) |
| Cambio | Aprobación |
|---|---|
| Promoción de fallback a primario (ej. Gemini → DeepSeek) | Responsable + bias audit verde |
| Nuevo modelo añadido a la cadena | Responsable + tests + bias audit |
| Eliminación de modelo de la cadena | Responsable + comprobar que la cadena restante cubre todos los type |
| Cambio de proveedor (ej. OpenRouter → Vertex AI directo) | Responsable + actualizar 03-data-governance.md (transferencias internacionales) |
Los safeguards (safeguards.ts) son crítica de seguridad. Cambios:
02-risk-assessment.md.| Componente | Versión |
|---|---|
| EvidenciaIA módulo | Tag git asociado al PR #144 |
pico system prompt |
hash pendiente de calcular tras este pack |
synth system prompt |
hash pendiente de calcular tras este pack |
| Modelos IA primarios | DeepSeek V4 Flash (educational) · Qwen2.5-VL-72B (clinical_case/vision) |
| Fallback chain | Gemini 2.5 Flash-Lite EU → Mistral Small → OpenRouter |
| Safeguards version | Ver safeguards.ts head (incluye 6 patrones diagnósticos + 5 terapéuticos + 4 PII) |
| Reranker version | gradeEvidence A/B/C/D + preprint penalty −2 |
| Cache TTL | 24h |
| Frontend SW | v152 |
Para reproducir una respuesta histórica:
evidencia_consultas por consultaId.prompt_version_pico y prompt_version_synth.for c in $(git log --pretty=%H -- functions/src/evidencia/ragSynthesizer.ts); do
git show $c:functions/src/evidencia/ragSynthesizer.ts \
| node -e 'process.stdout.write(require("crypto").createHash("sha256").update(require("fs").readFileSync(0,"utf8").match(/SYNTH_SYSTEM_PROMPT = \[[\s\S]*?\]\.join/)[0]).digest("hex").slice(0,12))'
done
Los proveedores actualizan modelos sin previo aviso. Mitigación:
model exacto en cada respuesta.routing.ts antes de la fecha + bias audit + entrada en CHANGELOG.deepseek-chat → deepseek-v4-flash), el log lo capta automáticamente.