{"record":{"id":"34a076ae00eacdff","repo":"affaan-m/ECC","slug":"label-contains-a-non-finite-numeric-value","errorCode":null,"errorMessage":"{label} contains a non-finite numeric value","messagePattern":"(.+?) contains a non-finite numeric value","errorType":"validation","errorClass":"ContractError","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/tasteforge/contract.py","lineNumber":42,"sourceCode":"\n\ndef _validate_media_time(value: Any, source_duration: Any, *, label: str) -> None:\n    if not _is_finite_real(source_duration):\n        raise ContractError(f\"{label} has an invalid finite source duration\")\n    source_duration = cast(float, source_duration)\n    if float(source_duration) <= 0:\n        raise ContractError(f\"{label} has an invalid finite source duration\")\n    if (not _is_finite_real(value) or float(value) < 0\n            or float(value) > float(source_duration)):\n        raise ContractError(f\"{label} is outside its source duration\")\n\n\ndef _validate_numeric_evidence(value: Any, *, label: str) -> None:\n    if isinstance(value, bool):\n        raise ContractError(f\"{label} contains a boolean numeric value\")\n    if isinstance(value, (int, float)):\n        if not math.isfinite(value):\n            raise ContractError(f\"{label} contains a non-finite numeric value\")\n    elif isinstance(value, dict):\n        for nested in value.values():\n            _validate_numeric_evidence(nested, label=label)\n    elif isinstance(value, list):\n        for nested in value:\n            _validate_numeric_evidence(nested, label=label)\n\n\ndef _validate_probe_evidence(probe: Any, source_duration: float, *, label: str) -> None:\n    if not isinstance(probe, dict):\n        raise ContractError(f\"{label} lacks probe evidence\")\n    _validate_numeric_evidence(probe, label=label)\n    if probe.get(\"duration\") != source_duration:\n        raise ContractError(f\"{label} probe duration is not bound to source duration\")\n    for field in (\"sample_times\", \"scene_changes\"):\n        values = probe.get(field, [])\n        if not isinstance(values, list):\n            raise ContractError(f\"{label} has invalid {field}\")","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/tasteforge/contract.py#L24-L60","documentation":"_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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\njson.dump(doc, f)  # silently writes NaN\n// after\njson.dump(doc, f, allow_nan=False)","handlingStrategy":"validation","validationCode":"import math\ndef all_finite(node) -> bool:\n    if isinstance(node, bool): return True\n    if isinstance(node, (int, float)): return math.isfinite(node)\n    if isinstance(node, dict): return all(all_finite(v) for v in node.values())\n    if isinstance(node, list): return all(all_finite(v) for v in node)\n    return True","typeGuard":"def is_finite_number(v) -> bool:\n    return (isinstance(v, (int, float)) and not isinstance(v, bool)\n            and math.isfinite(v))","tryCatchPattern":"try:\n    validate_artifact_receipt(receipt)\nexcept ContractError as e:\n    if 'non-finite numeric value' in str(e):\n        regenerate_probe(receipt['artifact'])  # NaN/Inf: corrupt evidence\n    else:\n        raise","preventionTips":["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"],"tags":["python","validation","numeric","json"],"backgroundTag":"schema-validation-failed","analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}