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

  1. Fix the upstream computation producing NaN/Inf (check for div-by-zero on empty data).
  2. Validate/replace non-finite floats before serialization: if not math.isfinite(v): raise or substitute.
  3. Dump JSON with allow_nan=False so corruption is caught at write time instead of validation time.
  4. 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

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


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)