Disenar evaluacion con confidence calibrada contra labeled set, stratified sampling y criterios categoricos por severidad para reducir falsos positivos sin ocultar sesgo en metricas agregadas.
Diseñar el sistema de evaluación de un agente o pipeline de clasificación para que aceptar/rechazar un hallazgo dependa de un umbral calibrado contra un labeled set, no de la confidence cruda del modelo. Incluye: muestreo estratificado por document_type (u otra dimensión de riesgo) con mínimo por estrato, criterios categóricos con ejemplos +/- por severidad, disable temporal de categorías con FP rate alto, y reporte de accuracy + FP desglosado por estrato y categoría en vez de una métrica agregada que oculta el sesgo. [DOC]
confidence cruda como umbral. [DOC]No la uses (anti-scope) para entrenar/re-entrenar el modelo, etiquetar documentos crudos desde cero, ni para tunear prompts del agente productor. Esta skill evalúa salidas etiquetadas; no genera ground truth ni modifica el clasificador. [INFERENCIA]
Inputs: labeled set humano (positivo/negativo) etiquetado además por document_type y por category; raw_confidence por hallazgo; dimensión de estratificación. [DOC]
Outputs: calibration map (raw→precisión observada), umbral sobre confidence calibrada, criterios categóricos +/- por severidad, FP rate por categoría, lista de disabled_categories, y reporte desglosado por estrato+categoría. [DOC]
Vacío crítico: sin ground truth etiquetado no hay calibración posible — detén y pide el labeled set, no inventes umbrales. [SUPUESTO]
document_type y category. [DOC]document_type con mínimo por estrato; los estratos raros no deben desaparecer de la métrica. [DOC]raw_confidence a precisión observada en el labeled set. El corte se elige sobre la calibrada. [DOC]# GOOD: corte sobre confidence CALIBRADA + muestreo estratificado + FP por categoria
from collections import defaultdict
def calibrate(raw_conf: float, calibration_map: list[tuple[float, float]]) -> float:
# calibration_map: bins (raw_upper, observed_precision) fit on labeled set
for upper, observed in calibration_map:
if raw_conf <= upper:
return observed
return calibration_map[-1][1]
def stratified_sample(labeled: list[dict], per_stratum: int) -> list[dict]:
buckets: dict[str, list[dict]] = defaultdict(list)
for row in labeled:
buckets[row["document_type"]].append(row)
sample = []
for doc_type, rows in buckets.items():
sample.extend(rows[:per_stratum]) # guarantee min per stratum
return sample
def evaluate(findings, calibration_map, threshold, disabled_categories):
fp_by_category: dict[str, list[bool]] = defaultdict(list)
accepted = []
for f in findings:
if f["category"] in disabled_categories:
continue # temporal disable for high-FP category
if calibrate(f["raw_confidence"], calibration_map) >= threshold:
accepted.append(f)
fp_by_category[f["category"]].append(f["label"] == "negative")
fp_rate = {c: sum(v) / len(v) for c, v in fp_by_category.items()}
return accepted, fp_rate # report FP per category, not aggregate accuracy# ANTI: confidence cruda como umbral, muestra global, accuracy agregada
def evaluate_bad(findings, raw_threshold=0.7):
accepted = [f for f in findings if f["raw_confidence"] >= raw_threshold]
# criterio vago: "be conservative" sin ejemplos +/-
# sin estratificacion: estratos raros invisibles
accuracy = sum(f["label"] == "positive" for f in accepted) / len(accepted)
return accepted, accuracy # metrica agregada oculta el sesgo por categoriaper_stratum mayor que el bucket → reporta cobertura insuficiente y marca el estrato como no-calibrado, no rellenes con otro estrato. [INFERENCIA]disabled_categories: su FP rate no entra al reporte; lístala aparte como "suspendida", no como 0% FP (sería un falso verde). [INFERENCIA]calibration_map vacío o no monótono: rechaza; un mapa no monótono indica fit defectuoso, no lo apliques. [SUPUESTO]fp_rate por categoría queda indefinido — repórtalo como "sin aceptados", nunca como precisión perfecta. [INFERENCIA]Si te descubres haciendo cualquiera de esto, deténte y reencuadra: comparar confidences crudas entre versiones; reportar una sola accuracy agregada como métrica primaria; muestrear aleatorio global; redactar un criterio sin ejemplos +/-; presentar una categoría disabled como sana; o fijar umbrales sin labeled set. [INFERENCIA]
document_type con mínimo por estrato? [DOC]scripts/qa/run-confidence-fp-tests.py y pasa como gate? [SUPUESTO]assets/evaluation-schema.json y assets/confidence-policy.json declaran el evaluador antes de fijar umbrales o disabled categories. [SUPUESTO]scripts/compile-evaluation-confidence.py <evaluacion.json> --output <reporte.md> genera un reporte reproducible (labeled set, muestreo, calibration map, criterios, métricas, riesgos). [SUPUESTO]bash skills/evaluation-confidence-design/scripts/check.sh antes de marcar lista. [SUPUESTO]Los assets/scripts anteriores son contratos objetivo, aún no presentes en repo; créalos al materializar la skill. Hasta entonces son
[SUPUESTO], no[CÓDIGO]. [INFERENCIA]
.local/ y tienen prioridad sobre la versión versionada; no edites el canónico para experimentar. [SUPUESTO]version y last_updated al cambiar el contrato; no rompas triggers ni el name (rompe el catálogo y los cross-links). [DOC]katas-confidence-stratified-sampling, katas-false-positive-criteria. [DOC]fdad39c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.