affaan-m/ECC · error · ContractError
contains a non-finite numeric value
Error message
{label} contains a non-finite numeric value What it means
_validate_numeric_evidence requires all numbers (including nested ones inside dicts and lists) to be finite. NaN and Infinity are invalid JSON concepts and indicate corrupt or fabricated numeric evidence, so the validator raises this ContractError when math.isfinite fails.
Solutions
- Fix the upstream computation producing NaN/Inf (check for div-by-zero on empty data).
- Validate/replace non-finite floats before serialization: if not math.isfinite(v): raise or substitute.
- Dump JSON with allow_nan=False so corruption is caught at write time instead of validation time.
- Re-run the probe to regenerate clean numeric evidence.
Example fix
// before json.dump(doc, f) # silently writes NaN // after json.dump(doc, f, allow_nan=False)
Defensive patterns
Strategy: validation
Validate before calling
import math
def all_finite(node) -> bool:
if isinstance(node, bool): return True
if isinstance(node, (int, float)): return math.isfinite(node)
if isinstance(node, dict): return all(all_finite(v) for v in node.values())
if isinstance(node, list): return all(all_finite(v) for v in node)
return True Type guard
def is_finite_number(v) -> bool:
return (isinstance(v, (int, float)) and not isinstance(v, bool)
and math.isfinite(v)) Try / catch
try:
validate_artifact_receipt(receipt)
except ContractError as e:
if 'non-finite numeric value' in str(e):
regenerate_probe(receipt['artifact']) # NaN/Inf: corrupt evidence
else:
raise Prevention
- Dump JSON with allow_nan=False to catch NaN at write time
- Guard division denominators in numeric pipelines
- Replace failed computations with explicit sentinel errors, not NaN
- Sanitize ffprobe/external tool output for NaN/Infinity before storing
When it happens
Trigger: Probe or genre-spec evidence containing NaN, Infinity, or -Infinity — typically from float('nan') leakage, division by zero upstream, or Python's json.dump default allow_nan=True writing bare NaN/Infinity tokens.
Common situations: Numeric pipelines that divide by zero,ffprobe parse failures mapped to NaN, JSON files hand-edited with Infinity, or computations on empty arrays returning NaN.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- Geometry, fps and duration must be finite and positive
- has an invalid finite source duration
- is outside its source duration
- application bundle differs from its bound evidence
- application request must be a JSON object
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/34a076ae00eacdff.
Report an issue: GitHub.
Appendix: source
Thrown at skills/taste-application/scripts/tasteforge/contract.py:42
def _validate_media_time(value: Any, source_duration: Any, *, label: str) -> None:
if not _is_finite_real(source_duration):
raise ContractError(f"{label} has an invalid finite source duration")
source_duration = cast(float, source_duration)
if float(source_duration) <= 0:
raise ContractError(f"{label} has an invalid finite source duration")
if (not _is_finite_real(value) or float(value) < 0
or float(value) > float(source_duration)):
raise ContractError(f"{label} is outside its source duration")
def _validate_numeric_evidence(value: Any, *, label: str) -> None:
if isinstance(value, bool):
raise ContractError(f"{label} contains a boolean numeric value")
if isinstance(value, (int, float)):
if not math.isfinite(value):
raise ContractError(f"{label} contains a non-finite numeric value")
elif isinstance(value, dict):
for nested in value.values():
_validate_numeric_evidence(nested, label=label)
elif isinstance(value, list):
for nested in value:
_validate_numeric_evidence(nested, label=label)
def _validate_probe_evidence(probe: Any, source_duration: float, *, label: str) -> None:
if not isinstance(probe, dict):
raise ContractError(f"{label} lacks probe evidence")
_validate_numeric_evidence(probe, label=label)
if probe.get("duration") != source_duration:
raise ContractError(f"{label} probe duration is not bound to source duration")
for field in ("sample_times", "scene_changes"):
values = probe.get(field, [])
if not isinstance(values, list):
raise ContractError(f"{label} has invalid {field}")View on GitHub (pinned to 8321021c54)