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]JaviMontano/jm-adk-beta
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.