# Validator — Funciones que verifican datos o configuracion contra reglas

Tag: `validator`. Grupo de funciones que **verifican** un dato/config/spec contra una regla y devuelven resultado de validacion (bool / lista de errores / metricas de calidad). NO transforman ni mueven datos — solo dictaminan.

Filtro MCP: `mcp__registry__fn_search query="" tag="validator"`.

## Funciones del grupo

| ID | Lang | Que valida |
|---|---|---|
| [config_validate_go_infra](../../functions/infra/config_validate.md) | go | Estructura de config (campos requeridos, tipos) |
| [file_validate_type_go_infra](../../functions/infra/file_validate_type.md) | go | Tipo MIME / extension de archivo |
| [dag_validate_go_core](../../functions/core/dag_validate.md) | go | DAG topologia (ciclos, deps, schedule) |
| [detect_outliers_py_datascience](../../python/functions/datascience/detect_outliers.md) | py | Outliers numericos (z-score / IQR) |
| [detect_outliers_go_datascience](../../functions/datascience/detect_outliers.md) | go | Outliers numericos |
| [detect_drift_py_datascience](../../python/functions/datascience/detect_drift.md) | py | Drift de distribucion vs baseline |

## Ejemplo canonico

Validar dataset antes de cargarlo a sink productivo.

```python
from datascience import detect_outliers, detect_drift

# 1. Detectar outliers en columna critica
outliers = detect_outliers(df, column="amount", method="zscore", threshold=3.0)
if len(outliers) > len(df) * 0.05:
    raise ValueError(f"too many outliers: {len(outliers)} / {len(df)}")

# 2. Comparar contra distribucion historica
drift_report = detect_drift(df_current=df, df_baseline=df_yesterday, column="amount")
if drift_report["ks_pvalue"] < 0.01:
    print(f"WARNING: distribution drift detected (KS p={drift_report['ks_pvalue']:.4f})")
```

## Fronteras del grupo

NO cubre:
- **Audits** del registry mismo (capability groups, copied code, etc.) -> tag `doctor`.
- **Tests** unitarios (estan en `*_test.go`/`pytest`, no son funciones del registry).
- **Assertions** de runtime de apps (entan en `operations.db.assertions`).
- Validacion de codigo (lint, formato) — fuera del registry.

## Cuando NO usar `validator`

- Si la funcion transforma datos para HACERLOS validos (ej. clip outliers) -> es transformer.
- Si la funcion solo lee y reporta status sin verificar regla -> es extractor.

## Relacion con el bucle reactivo

Validators encajan en **Fase 4 ANALIZAR** del bucle reactivo (`fn_operations`). Una assertion definida en `operations.db.assertions` puede usar una funcion validator del registry como predicado.

## Consumidores

- `data_factory` — futura tab Validators (no v1; v1 solo extractor/transformer/sink/database).
- DAGs de auditoria (ej. `weekly-deep-scan.yaml` invoca audits del grupo `doctor`).
- Pipelines ML que validan datos antes de entrenar (defer v2).
- Pre-flight de sinks: ejecutar validator antes de escribir a destino productivo.

## Notas

- Casi todos los validators son **puros** o casi-puros (solo dependen del input).
- Grupo pequeño (6 funcs) — crecera cuando el registry incorpore validators de schema (JSON Schema, Pandera, etc.).
- DAG step `function: <validator_id>` con `continue_on.failure: false` actua como gate en un pipeline.
