{"record":{"id":"b443f8249de9c755","repo":"affaan-m/ECC","slug":"genre-numbers-must-be-distinct","errorCode":null,"errorMessage":"genre numbers must be distinct","messagePattern":"genre numbers must be distinct","errorType":"validation","errorClass":"ContractError","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/tasteforge/contract.py","lineNumber":123,"sourceCode":"    while pending:\n        directory = pending.pop()\n        with os.scandir(directory) as entries:\n            for entry in entries:\n                if entry.is_symlink():\n                    raise ContractError(f\"output bundle contains a symlink: {entry.path}\")\n                if entry.is_dir(follow_symlinks=False):\n                    pending.append(Path(entry.path))\n                elif not entry.is_file(follow_symlinks=False):\n                    raise ContractError(f\"output bundle contains a special file: {entry.path}\")\n\n\ndef validate_genre_specs(specs: list[dict[str, Any]]) -> None:\n    \"\"\"Require complete, semantically distinct numbered genre specs.\"\"\"\n    if not specs:\n        raise ContractError(\"at least one genre spec is required\")\n    numbers = [spec.get(\"number\") for spec in specs]\n    if len(numbers) != len(set(numbers)):\n        raise ContractError(\"genre numbers must be distinct\")\n\n    fingerprints = [spec.get(\"style_fingerprint\") for spec in specs]\n    signatures = [_semantic_signature(spec) for spec in specs]\n    if len(fingerprints) != len(set(fingerprints)) or len(signatures) != len(set(signatures)):\n        raise ContractError(\"genre references collapsed into a generic style; distinct specs required\")\n\n    for spec in specs:\n        if spec.get(\"dry_run\") is not True:\n            raise ContractError(f\"genre {spec.get('number')} crosses the dry-run boundary\")\n        measured = spec.get(\"measured_features\")\n        if measured is not None:\n            if not isinstance(measured, dict):\n                raise ContractError(f\"genre {spec.get('number')} has invalid measured evidence\")\n            _validate_numeric_evidence(measured, label=f\"genre {spec.get('number')} evidence\")\n            total_duration = measured.get(\"total_duration\")\n            if not _is_finite_real(total_duration):\n                raise ContractError(f\"genre {spec.get('number')} has invalid total duration\")\n            total_duration = cast(float, total_duration)","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/tasteforge/contract.py#L105-L141","documentation":"validate_genre_specs requires each genre spec to have a unique 'number'. Duplicate numbers would make downstream per-genre outputs ambiguous (two specs targeting the same numbered slot), so duplicates are rejected.","triggerScenarios":"Two or more genre specs share the same 'number' value — e.g. copy-pasting a spec block and forgetting to bump its number, or programmatically appending specs that default to the same number.","commonSituations":"Editing a multi-genre config by duplicating an existing entry, template configs where numbers were placeholders (all 1), or merging two spec files without renumbering.","solutions":["Renumber the specs so each has a distinct 'number': 1, 2, 3, ...","Deduplicate specs that are true copies rather than renumbering them","Renumber programmatically: [dict(s, number=i+1) for i, s in enumerate(specs)] before validation","Fix the merging logic that produced duplicate numbers"],"exampleFix":"# before\nspecs = [{\"number\": 1, ...}, {\"number\": 1, ...}]\n# after\nspecs = [{\"number\": 1, ...}, {\"number\": 2, ...}]","handlingStrategy":"validation","validationCode":"numbers = [s.get(\"number\") for s in specs]\nif len(numbers) != len(set(numbers)):\n    raise SystemExit(f'duplicate genre numbers: {[n for n in numbers if numbers.count(n) > 1]}')","typeGuard":"def has_unique_numbers(specs) -> bool:\n    numbers = [s.get(\"number\") for s in specs]\n    return len(numbers) == len(set(numbers))","tryCatchPattern":"try:\n    validate_bundle(root)\nexcept ContractError as e:\n    if 'distinct' in str(e) and 'numbers' in str(e):\n        print('Renumber genre specs so each number is unique')\n    else:\n        raise","preventionTips":["Renumber programmatically after merging spec files: enumerate and reassign","Never copy-paste spec blocks without bumping the number","Run the uniqueness check in config linters before validation"],"tags":["validation","config","duplicate"],"backgroundTag":"invalid-argument-value","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"}