{"record":{"id":"e923acf53a81c03c","repo":"affaan-m/ECC","slug":"nonempty-text-required","errorCode":null,"errorMessage":"nonempty text required","messagePattern":"nonempty text required","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/tasteforge/integration.py","lineNumber":49,"sourceCode":"    except (TypeError, ValueError, RecursionError) as exc:\n        raise ValueError(\"bundle values must be finite JSON data\") from exc\n\n\ndef _digest(value: Any) -> str:\n    return hashlib.sha256(_canonical(value)).hexdigest()\n\n\ndef _object(value: Any, required: set[str], optional: set[str] | None = None) -> dict:\n    if not isinstance(value, dict) or not required <= value.keys():\n        raise ValueError(\"missing required bundle fields\")\n    if value.keys() - required - (optional or set()):\n        raise ValueError(\"unknown bundle fields\")\n    return value\n\n\ndef _text(value: Any) -> str:\n    if not isinstance(value, str) or not value.strip():\n        raise ValueError(\"nonempty text required\")\n    return value\n\n\ndef _integer(value: Any, minimum: int = 0) -> int:\n    if type(value) is not int or value < minimum:\n        raise ValueError(\"frame/count must be an exact integer in range\")\n    return value\n\n\ndef _rate(value: Any) -> tuple[int, int]:\n    _object(value, {\"numerator\", \"denominator\"})\n    n, d = (_integer(value[k], 1) for k in (\"numerator\", \"denominator\"))\n    if math.gcd(n, d) != 1:\n        raise ValueError(\"fps must be a reduced positive rational\")\n    return n, d\n\n\ndef _range(value: Any, bounds: list[int] | None = None) -> list[int]:","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/tasteforge/integration.py#L31-L67","documentation":"_text requires its argument to be a Python str with at least one non-whitespace character, otherwise it raises ValueError('nonempty text required'). Bundle identity/description/name fields must be meaningful strings.","triggerScenarios":"Passing None, an integer, or an empty/whitespace-only string for any validated text field (artifact path, snapshot id, binding description, candidate name, clip name).","commonSituations":"Templated bundle generation where an optional field defaulted to \"\", YAML that parses blank values as None, or numeric ids passed where string ids are required.","solutions":["Provide a non-empty string for the flagged field","Convert non-string identifiers with str(...) before building the bundle","Add a pre-validation pass rejecting empty/blank strings for required text fields"],"exampleFix":"// before\nbinding = {\"description\": \"\", ...}\n// after\nbinding = {\"description\": \"match cut from scene 3\", ...}","handlingStrategy":"type-guard","validationCode":"texts = [v for v in fields.values() if isinstance(v, str)]\nassert all(t.strip() for t in texts), \"blank text field in bundle\"","typeGuard":"def is_nonempty_text(v) -> bool:\n    return isinstance(v, str) and bool(v.strip())","tryCatchPattern":"try:\n    bundle = build_application_bundle(data)\nexcept ValueError as e:\n    if \"nonempty text\" in str(e):\n        print(\"a text field is empty or not a string; check bundle fields\")\n    else:\n        raise","preventionTips":["Default optional text fields to meaningful placeholders, never \"\"","Use is_nonempty_text as a gate in bundle-construction helpers","Watch for YAML/JSON parsers turning blank fields into None"],"tags":["validation","type-mismatch","bundle"],"backgroundTag":"empty-required-field","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"}