Construir verificacion cruzada declarado-vs-calculado con mismatch flag tipado y escalada a humano; recomputo independiente, epsilon justificado, nunca corregir numeros en silencio.
Construir un bucle de verificacion cruzada que compara el valor declarado (lo que la fuente afirma) contra el valor calculado (lo que recomputas de forma independiente desde los datos crudos). Cuando difieren mas alla de un epsilon justificado, el sistema emite mismatch=true con ambos valores y escala a un humano. La invariante dura: nunca corregir un numero en silencio [DOC]. Un mismatch no es un error a parchear; es la senal de que la fuente, el calculo o los datos estan en conflicto, y esa decision pertenece a una persona [INFERENCIA].
Esto convierte la auto-correccion en un control de integridad auditable, no en un "arreglo" opaco que oculta la discrepancia y propaga un dato falso con apariencia de validado [INFERENCIA].
Activa cuando se cumplen las dos condiciones (declarado + recomputo independiente disponibles):
[POR_CONFIRMAR] humano, no inventes un calculado [INFERENCIA]. Caso unverifiable_aggregate_degradation [CONFIG].validation-retry-design, no este skill [DOC]. Caso format_validation_not_numeric espera expected_activation:false [CONFIG].conflicting_silent_fix y false_positive_generic_fix -> no activar [CONFIG].Inputs [INFERENCIA]: por cada campo verificable -> field (nombre), declared (valor de la fuente), una formula de recomputo desde componentes crudos, data_type (entero | moneda | float) y el destino de escalada.
Output: registro tipado por campo -> { field, declared, computed, delta, mismatch }; ante mismatch se anade action="escalate_to_human" y el campo declarado permanece intacto [CODE]. El reporte debe cumplir assets/self-correction-loops-contract.json [CONFIG].
1e-6 o el centavo segun la unidad). Documenta el porque; un epsilon arbitrario invalida el control [DOC]. Las tolerancias permitidas viven en assets/epsilon-policy.json [CONFIG].abs(declared - computed) <= epsilon -> match. Si no -> mismatch=true con declared, computed, delta y field [CODE].assets/mismatch-policy.json y assets/escalation-policy.json [CONFIG].mismatch=true; jamas un total=computed silencioso [CODE].> estricto para el flag, no >=: una diferencia exactamente igual al epsilon se considera dentro de tolerancia (match). Es deliberado para que epsilon=0 en enteros marque solo diferencias reales, no el caso delta==0 [INFERENCIA].delta = declared - computed (signo conservado): el signo dice si la fuente sobre- o sub-declara; perderlo con abs() en el registro reduce el valor de auditoria [INFERENCIA].from dataclasses import dataclass
@dataclass
class CrossCheck:
field: str
declared: float
computed: float
epsilon: float
@property
def mismatch(self) -> bool:
return abs(self.declared - self.computed) > self.epsilon
def to_record(self) -> dict:
return {
"field": self.field,
"declared": self.declared,
"computed": self.computed,
"delta": self.declared - self.computed,
"mismatch": self.mismatch,
}
def verify_total(invoice: dict) -> dict:
computed = sum(line["amount"] for line in invoice["lines"]) # recomputo independiente
check = CrossCheck(
field="total",
declared=invoice["total"], # lo que la fuente afirma
computed=computed, # lo que recalculamos
epsilon=0.005, # medio centavo, justificado por redondeo
)
record = check.to_record()
if check.mismatch:
record["action"] = "escalate_to_human" # NO se reescribe el total
return record# ANTI 1: confiar en lo declarado, o "corregir" en silencio.
def verify_total_bad(invoice: dict) -> dict:
computed = sum(line["amount"] for line in invoice["lines"])
invoice["total"] = computed # sobreescribe sin avisar: oculta el conflicto
return invoice # el humano nunca ve que la fuente estaba mal
# ANTI 2: recomputo no-independiente (siempre pasa).
def verify_total_noop(invoice: dict) -> dict:
declared = invoice["total"]
computed = invoice["total"] # mismo agregado: el check nunca puede fallar
return {"mismatch": abs(declared - computed) > 0.005}
# ANTI 3: epsilon arbitrario sin justificacion -> oculta errores reales bajo "tolerancia".Si detectas cualquiera de estos en tu propia salida, corrige antes de entregar [INFERENCIA]:
computed deriva del mismo agregado que declared -> recomputa desde crudos (ANTI 2).mismatch=true y el campo fue sobreescrito -> revierte y escala (ANTI 1).epsilon-policy.json.declared o computed en un mismatch -> ambos deben ser visibles.PASA solo si todos marcan:
epsilon justificado por tipo de dato: cero para enteros, tolerancia pequena documentada para moneda/floats.mismatch=true con declared y computed ambos visibles y delta con signo.total=computed silencioso.assets/self-correction-loops-contract.json y pasa scripts/check.sh con fixtures validas e invalidas.upgrade_safety_case exige este comportamiento [CONFIG].assets/self-correction-loops-contract.json define los campos obligatorios del reporte JSON [CONFIG].assets/epsilon-policy.json fija tolerancias permitidas por tipo de dato [CONFIG].assets/mismatch-policy.json y assets/escalation-policy.json obligan a mostrar ambos valores y escalar sin sobreescribir [CONFIG].assets/structural-test-policy.json declara las pruebas estructurales que deben quedar en true [CONFIG].scripts/validate_self_correction_loops.py valida reportes offline y scripts/check.sh ejecuta fixtures deterministicas positivas y negativas [CODE].assets/ incluye ademas assets/README.md, assets/quality-rubric.json (8 criterios de aceptacion) y assets/checklist.md (gate operativo); ver assets/manifest.json [CONFIG].katas-critical-self-correctionvalidation-retry-design (formato/parsing, no numerico)human-escalation-design (a donde va el mismatch)provenance-engineering (rastro de auditoria del declarado)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.