ERRORES.md — Registro de errores detectados y corregidos
Pack: primitivos-metrologicos-sv
Auditoría: adversarial rigurosa pieza a pieza
Autor: Juan Antonio Lloret Egea | ORCID: 0000-0002-6634-3351
ITVIA — IA eñ™ — La Biblia de la IA™ | ISSN: 2695-6411 | Madrid, 2026
Clasificación de gravedad
| Nivel | Descripción |
|---|---|
| GRAVE | Compromete la ejecución correcta o la validez del resultado |
| MEDIO | Compromete la robustez o la trazabilidad, sin afectar el resultado numérico |
| DOCTRINAL | Inconsistencia conceptual que requiere aclaración formal |
E-01 — Sin gestión de errores en todos los laboratorios
Gravedad: GRAVE
Archivos afectados: lab_01 a lab_07 (todos)
Descripción: Ningún laboratorio incluía try/except, sys.exit() ni import sys. Un runner no-benevolente que examine el código de salida del proceso no recibe señal explícita de éxito o fallo. Ante cualquier excepción en tiempo de ejecución (nombre de variable incorrecto, desbordamiento numérico, error de entorno), Python imprime un traceback crudo a stderr y el proceso termina con exit=1 por comportamiento implícito del intérprete, no por control explícito del laboratorio.
Consecuencia: La diferencia entre un fallo de verificación matemática y un fallo de entorno es indistinguible desde stderr. El runner ve el mismo exit=1 y el mismo flujo de error en ambos casos.
Corrección aplicada: Se añade a todos los laboratorios el patrón:
import sys
def verificar(condicion, mensaje_error):
if not condicion:
print(f"[FALLO DE VERIFICACION] {mensaje_error}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
try:
main()
sys.exit(0)
except SystemExit:
raise
except Exception as e:
print(f"[ERROR NO CONTROLADO] {type(e).__name__}: {e}", file=sys.stderr)
sys.exit(1)Estado: RESUELTO en V2.
E-02 — assert sin captura en lab_01 (vulnerable a python3 -O)
Gravedad: GRAVE
Archivo afectado: lab_01_tiempo_ue_mfc.py (versión V1)
Descripción: El laboratorio usaba sentencias assert nativas de Python para verificar que 9 × N_SAR_POR_UE_MFC == DELTA_NU_CS y que la división es exacta. El flag -O (--optimize) del intérprete CPython desactiva silenciosamente todos los assert nativos. Un runner que invoque python3 -O lab_01_tiempo_ue_mfc.py obtiene exit=0 y ningún error aunque las constantes sean incorrectas.
Consecuencia: La verificación nuclear del laboratorio (exactitud de la división 9 192 631 770 / 9) puede saltarse sin ninguna señal de aviso.
Corrección aplicada: Todos los assert sustituidos por llamadas a la función verificar(condicion, mensaje) que no depende del flag -O.
Estado: RESUELTO en V2.
E-03 — Sin verificaciones numéricas en labs 02–07 (versión V1)
Gravedad: GRAVE
Archivos afectados: lab_02 a lab_07 (versión V1)
Descripción: Los laboratorios 02 a 07 se limitaban a calcular e imprimir resultados sin comprobar en ningún momento que los valores obtenidos estuvieran dentro de los márgenes esperados. Un error silencioso en una constante (p.ej. C_LUZ = 29_792_458 con un dígito omitido) producía salida numericamente incorrecta con exit=0. El runner no-benevolente no tenía forma de detectarlo.
Corrección aplicada: Se añaden llamadas a verificar() en puntos críticos de cada laboratorio: signos positivos de todas las constantes, magnitud aproximada de los resultados clave, consistencias cruzadas (p.ej. E = h*nu == m*c^2).
Estado: RESUELTO en V2.
E-04 — Error matemático en lab_03: frecuencia dividida por 9 al calcular E = h·ν
Gravedad: GRAVE
Archivo afectado: lab_03_masa_ufm.py (versión V1)
Descripción: El laboratorio calculaba la energía del fotón del cesio como:
freq_ue = DELTA_NU_CS / N_CELDA # 1 021 403 530 (en UE_MFC^-1)
E_foton = H_PLANCK * freq_ue # INCORRECTOLa constante de Planck h tiene unidades J·s = kg·m²·s⁻¹; el segundo (s) es la unidad de tiempo del SI. La frecuencia ν debe expresarse en Hz = s⁻¹ para que las unidades se cancelen: [J·s] × [s⁻¹] = [J]. Al dividir DELTA_NU_CS por N_CELDA = 9, el código estaba usando la frecuencia en UE_MFC⁻¹ (unidades SV estructurales, no SI), lo que introduce un factor de error de 1/9.
Valores afectados:
| Magnitud | V1 (incorrecto) | V2 (correcto) | Error relativo |
|---|---|---|---|
| E fotón Cs | 6.768×10⁻²⁵ J | 6.091×10⁻²⁴ J | factor 1/9 |
| m fotón Cs | 7.530×10⁻⁴² UFM | 6.777×10⁻⁴¹ UFM | factor 1/9 |
Corrección aplicada:
# CORRECTO: nu en Hz (s^-1), que cancela con la s en h [J*s]
E_foton = H_PLANCK * DELTA_NU_CS # h [J*s] * nu [s^-1] = E [J]
M_foton = E_foton / c2Nota doctrinal añadida: Para fórmulas físicas que involucran h, k_B, u otras constantes SI cuya unidad de tiempo es el segundo, se debe usar la frecuencia en Hz (unidades SI), no en UE_MFC⁻¹. La conversión 9 UE_MFC = 1 s aplica al recuento estructural del SV, no a los cálculos energéticos donde h es el operador de escala.
Estado: RESUELTO en V2. La verificación detecta el fallo correctamente: con V1 el laboratorio termina con exit=1 y el mensaje [FALLO DE VERIFICACION] m_Cs incorrecto.
E-05 — Ausencia de este archivo (ERRORES.md)
Gravedad: GRAVE
Descripción: El pack no incluía ERRORES.md. El encargo especifica explícitamente que este registro debe estar presente en la carpeta del laboratorio.
Estado: RESUELTO en V2 con el presente archivo.
E-06 — Documento principal sin referencia a ERRORES.md
Gravedad: MEDIO
Archivo afectado: primitivos-metrologicos-sv.md (versión V1)
Descripción: El documento principal no referenciaba el registro de errores, rompiendo la cadena de trazabilidad del pack.
Corrección aplicada: Se añade sección «Registro de errores» al final del documento principal con enlace vivo a este archivo.
Estado: RESUELTO en V2.
Nota sobre ImportError antes del bloque try
Gravedad: INFORMATIVA (no corregible sin dependencias externas)
Descripción: Si un laboratorio usa import modulo_externo y ese módulo no está disponible en el entorno, el ImportError se lanza antes de que el bloque try/except del __main__ pueda capturarlo. En ese caso, Python imprime un traceback crudo a stderr y termina con exit=1. Este comportamiento es inherente al ciclo de importación de Python y no puede evitarse con el patrón try/main/except.
Los laboratorios del pack solo usan módulos de la biblioteca estándar (sys, math, fractions) disponibles en cualquier instalación Python ≥ 3.8. El riesgo de ImportError es por tanto nulo bajo condiciones normales.
Resumen de correcciones V1 → V2
| Error | Archivo(s) | Corrección | Estado |
|---|---|---|---|
| E-01: sin try/except/sys.exit | labs 01–07 | Patrón completo añadido | ✅ V2 |
| E-02: assert vulnerable a -O | lab_01 | Reemplazado por verificar() |
✅ V2 |
| E-03: sin verificaciones numéricas | labs 02–07 | Verificaciones añadidas en puntos críticos | ✅ V2 |
| E-04: frecuencia /9 en E=hν | lab_03 | E = H * DELTA_NU_CS (no /9) |
✅ V2 |
| E-05: ERRORES.md ausente | pack completo | Este archivo | ✅ V2 |
| E-06: .md sin ref. a ERRORES.md | primitivos-metrologicos-sv.md | Sección añadida | ✅ V2 |