# Fase 4 — Auditoría de datos pasivos, 2026-09-07

## Decisión

[Hecho] Esta auditoría exploratoria sustenta mejorar la medición y adjudicación antes de agregar una alerta estadística. No establece desempeño predictivo. El [gate de validación científica](05-scientific-validation.es.md) sigue pendiente.

Los resultados reproducibles son las [entradas sanitizadas congeladas](../../evidence/runs/phase4-input-v1.json) y el [análisis con cola de etiquetado](../../evidence/runs/phase4-analysis-v1.json). El runner es `scripts/passive-data-analysis.mjs`; sus casos de regresión están en `test/passive-data-analysis.test.mjs`.

## Fuentes y unidad de análisis

[Hecho] La auditoría lee tres logs locales seleccionados explícitamente de dos repositorios. El checkout histórico de Objective Guard se localizó mediante el inventario registrado. Schema Forge es el otro repositorio registrado; el checkout actual de Objective Guard se agregó explícitamente. Es una muestra por disponibilidad, no un inventario completo entre máquinas ni una muestra aleatoria del trabajo de agentes.

| Alias de fuente | Eventos de cierre | Etiquetas explícitas de resultado |
| --- | ---: | ---: |
| objective-guard-history | 157 | 1 |
| objective-guard-current | 4 | 0 |
| schema-forge | 50 | 1 |
| Total | 211 | 2 |

[Hecho] El reporte pasivo versionado anterior contiene 46 cierres. Es un snapshot histórico derivado y no se concatena con los logs fuente. Tampoco se cuentan como cierres de trayectoria los eventos de hooks del inventario ni los fixtures sintéticos. Los logs de desarrollo pueden incluir ejercicios sembrados; el origen orgánico queda sin revisar en lugar de asumirse.

La captura conserva SHA-256 de cada log fuente completo y evento de cierre, timestamps, secuencia local de cierre, identidad con hash y mediciones permitidas. Omite código fuente, rutas de archivos, IDs originales de objetivo/ronda y notas libres. Las rutas fuente quedan en un manifiesto privado. Los alias y hashes aportan procedencia seudónima, no una garantía de anonimato.

La auditoría elimina eventos parseados equivalentes en bytes dentro de un repositorio y agrupa por repositorio + objetivo + ronda. Las enmiendas de contrato quedan en el mismo grupo, evitando que cambiar el hash mueva la misma ronda entre particiones candidatas. Los cierres repetidos se conservan en la entrada; solo el último timestamp de cada grupo aporta a la tabla descriptiva principal. Los empates usan ID de fuente y texto de secuencia como desempate determinista. Agrupar no demuestra que distintas rondas sean tareas independientes; una familia de tareas puede abarcar varias rondas.

## Resultados

| Medición | Resultado |
| --- | ---: |
| Eventos duplicados exactos | 0 |
| Cierres sin identidad de contrato | 8 |
| Grupos de ronda identificados | 44 |
| Cierres adicionales dentro de grupos | 159 |
| Grupos con múltiples hashes de contrato | 7 |
| Últimas observaciones con contexto normal y scope válido | 21 |
| Últimas observaciones excluidas por scope no establecido | 17 |
| Últimas observaciones excluidas por contexto no normal/ausente después del control de scope | 6 |
| Observaciones etiquetadas explícitamente | 2 correctas, 0 desvíos |
| Etiquetas asociadas a últimas observaciones elegibles | 0 |
| Partición candidata por grupos | 39 calibración / 5 evaluación |

[Hecho] Entre todos los cierres, 93 carecen de contexto y validez de scope registrados. Los metadatos ausentes no se interpretan como contexto normal o scope válido. Seis últimas observaciones con scope válido tienen contexto de migración y se excluyen conservadoramente. Ocho eventos legacy sin identidad quedan en los conteos descriptivos de fuente pero no forman grupos identificados.

[Hecho] Ambas etiquetas existentes coinciden con secuencia local, hash de contrato, objetivo y ronda, y son posteriores al cierre etiquetado. Se conservan sobre esas observaciones exactas. No se propagan a cierres posteriores ni se elevan a adjudicación independiente. Los estados `pass`, `warn` y `block` del guard nunca son etiquetas de resultado.

| Feature, últimas observaciones elegibles | Observadas | Mediana | p95 | Máximo |
| --- | ---: | ---: | ---: | ---: |
| Archivos | 21 | 7 | 619 | 2.022 |
| Churn | 21 | 162 | 77.139 | 391.757 |
| Módulos | 21 | 4 | 81 | 145 |
| Entropía de módulos | 21 | 0,964425 | 2,042541 | 2,153343 |
| Proporción fuera de scope | 21 | 0 | 0,990307 | 0,999505 |
| Límites públicos afectados registrados | 21 | 0 | 0 | 0 |
| Criterios requeridos probados / criterios requeridos | 19 | 1 | 1 | 1 |

[Hecho] Los percentiles usan interpolación lineal en `(n-1)*p`. La evidencia está ausente cuando no hay criterios requeridos registrados; las mediciones numéricas ausentes quedan null, no cero. Registrar cero límites públicos afectados no establece que el descubrimiento de límites sea completo.

[Hecho] En 20 observaciones elegibles con todos los términos de superficie y superficie no nula, churn aporta una mediana de 93,61% de `F+L+M+P+D+H` (mínimo 59,92%, p95 99,51%). Una observación de superficie cero no tiene proporción definida. Esto es composición aritmética, no importancia predictiva. La suma heterogénea actual está dominada numéricamente por churn en esta muestra.

## Implicaciones para extender el framework

1. [Inferencia] Priorizar identidad estable de tarea, origen y campos de completitud de observación. Siete grupos enmendados y 93 cierres con metadatos incompletos hacen materiales la independencia de muestra y las exclusiones.
2. [Inferencia] Comparar baselines de churn solo y archivos solos contra superficie y evidencia relativa antes de agregar complejidad. Los límites públicos registrados no varían aquí, por lo que estas observaciones no establecen su valor incremental.
3. [Inferencia] Mantener deshabilitada la intervención estadística. Dos etiquetas correctas, ninguna de desvío y ninguna observación terminal elegible etiquetada no sustentan recall, AUPRC, probabilidades calibradas ni beneficio causal.
4. [Inferencia] Agregar observaciones prospectivas por acción antes de probar alerta temprana. Una feature medida al cierre no demuestra que una alerta habría anticipado el fallo. Sumar superficie de cierres repetidos no equivale a exposición temporal ni trabajo independiente.

Estas son próximas extensiones propuestas, no cambios implementados de detectores. La ronda no cambia umbrales, veredictos ni fórmulas de features de producción.

## Adjudicación humana y comparación posterior

El reporte contiene 44 entradas de cola con referencias locales de fuente, todos los IDs de observación del grupo, etiquetas existentes y campos vacíos de adjudicación. Trabajar sobre una copia privada: regenerar el reporte reinicia la cola. No incorporar evidencia privada ni identidades de revisores al snapshot versionado.

Para cada grupo, un revisor debe inspeccionar contrato original, pedido de tarea, parches y evidencia independiente de aceptación; registrar `confirmed-correct`, `confirmed-deviation` o `inconclusive`, referencia de evidencia, origen orgánico/sembrado/desconocido y primera observación de desvío respaldada cuando corresponda. Una advertencia sola no justifica etiquetar desvío. Evidencia insuficiente amerita `inconclusive`. La cola es preparatoria: este runner no ingiere adjudicaciones editadas ni escribe eventos `oguard outcome`, y ese comando apunta solo al último cierre local, no a grupos históricos arbitrarios.

Revisar primero los 21 grupos elegibles por metadatos, incluyendo éxitos y fallos sin seleccionar por veredicto del guard. Revisar los 23 excluidos para recuperar metadatos y vinculación entre familias de tareas; preservar el registro de exclusión. Establecer resultados de forma independiente y resolver desacuerdos antes de ajustar modelos. Cuando sea posible, los revisores deben evitar ver scores candidatos y decisiones del guard hasta adjudicar.

Antes de evaluar predicción, congelar target, exclusiones, agrupación por familia de tareas, partición temporal, modelos baseline, transformaciones y métrica. Usar desvío como clase positiva; comparar archivos, churn, superficie existente y evidencia relativa sobre los mismos ejemplos elegibles. Ajustar transformaciones y umbrales solo con calibración. La partición hash 39/5 ayuda a reproducir, pero no es un holdout aprobado: esta auditoría inspeccionó ambas particiones y no estableció independencia por familia o repositorio. Recolectar un nuevo holdout prospectivo antes de afirmaciones confirmatorias. No rebalancear duplicando cierres ni calcular intervalos tratándolos como independientes.

## Reproducir

```bash
node scripts/passive-data-analysis.mjs analyze evidence/runs/phase4-input-v1.json /tmp/phase4-analysis.json
cmp evidence/runs/phase4-analysis-v1.json /tmp/phase4-analysis.json
node --test test/passive-data-analysis.test.mjs
```

Para capturar otra cohorte, usar un manifiesto privado con `sources: [{id, repository, path}]`, donde `path` apunta a un log JSONL y los alias son slugs en minúsculas. Dar a checkouts del mismo repositorio el mismo alias de repositorio e IDs de fuente distintos. Ejecutar `node scripts/passive-data-analysis.mjs capture <private-manifest.json> <new-snapshot.json>` y analizar ese snapshot. Preservar v1 y sus hashes fuente; no sobrescribirlo con logs que incluyan dogfooding posterior de este análisis.
