{"record":{"id":"d5657d614ed54610","repo":"calesthio/OpenMontage","slug":"conflicting-sound-end-time-values-between-top-leve","errorCode":null,"errorMessage":"Conflicting sound_end_time values between top-level input and face_choose[0]","messagePattern":"Conflicting sound_end_time values between top-level input and face_choose\\[0\\]","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"tools/avatar/kling_lip_sync.py","lineNumber":555,"sourceCode":"            nested = face_item.get(key)\n            top_level = inputs.get(key)\n            if nested is not None and top_level is not None and int(nested) != int(top_level):\n                raise ValueError(\n                    f\"Conflicting {key} values between top-level input and face_choose[0]\"\n                )\n            value = nested if nested is not None else top_level\n            if value is None:\n                value = default\n            face_item[key] = int(value)\n\n        nested_end = face_item.get(\"sound_end_time\")\n        top_level_end = inputs.get(\"sound_end_time\")\n        if (\n            nested_end is not None\n            and top_level_end is not None\n            and int(nested_end) != int(top_level_end)\n        ):\n            raise ValueError(\n                \"Conflicting sound_end_time values between top-level input and face_choose[0]\"\n            )\n        sound_end = nested_end if nested_end is not None else top_level_end\n        if sound_end is None:\n            raise ValueError(\"advanced_lip_sync requires sound_end_time\")\n        face_item[\"sound_end_time\"] = int(sound_end)\n        if face_item[\"sound_end_time\"] - face_item[\"sound_start_time\"] < 2000:\n            raise ValueError(\"advanced_lip_sync requires at least 2000ms of cropped audio\")\n\n        for key in (\"sound_volume\", \"original_audio_volume\"):\n            nested = face_item.get(key)\n            top_level = inputs.get(key)\n            if nested is not None and top_level is not None and float(nested) != float(top_level):\n                raise ValueError(\n                    f\"Conflicting {key} values between top-level input and face_choose[0]\"\n                )\n            value = nested if nested is not None else top_level\n            if value is not None:","sourceCodeStart":537,"sourceCodeEnd":573,"githubUrl":"https://github.com/calesthio/OpenMontage/blob/95e1c3d0ab93482159818560f6a8c8e866b9139f/tools/avatar/kling_lip_sync.py#L537-L573","documentation":"Raised by KlingLipSyncTool._copy_timing_fields when sound_end_time is provided both at the top level and in face_choose[0] with different int values. Same fail-fast contract as the other timing fields: the tool will not arbitrate between two conflicting crop-end values.","triggerScenarios":"advanced_lip_sync with inputs['sound_end_time']=6000 and face_choose=[{'face_id': 'f1', 'sound_end_time': 5000}].","commonSituations":"Face-specific end times were tuned while an old top-level sound_end_time remained in the payload; defaults injected by a wrapper at the top level colliding with per-face values authored later.","solutions":["Delete the top-level sound_end_time and keep it only in face_choose[0] (per-face is more precise)","Or align both values to the same number of milliseconds","Grep your payload builder for double-injection of sound_end_time"],"exampleFix":"# before\ninputs = {\"sound_end_time\": 6000, \"face_choose\": [{\"face_id\": \"f1\", \"sound_end_time\": 5000}]}\n\n# after\ninputs = {\"face_choose\": [{\"face_id\": \"f1\", \"sound_end_time\": 5000}]}","handlingStrategy":"validation","validationCode":"face_item = (inputs.get(\"face_choose\") or [{}])[0]\nfor key in (\"sound_end_time\",):\n    nested, top = face_item.get(key), inputs.get(key)\n    if nested is not None and top is not None and int(nested) != int(top):\n        raise ValueError(f\"conflicting {key}: pick one scope\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set sound_end_time only in face_choose for multi-face jobs","Remove stale top-level timing fields when adding per-face overrides","Validate both scopes for equality before calling"],"tags":["kling","lip-sync","timing","conflicting-inputs"],"backgroundTag":null,"analyzedSha":"95e1c3d0ab93482159818560f6a8c8e866b9139f","analyzedAt":"2026-08-15T06:31:20.014Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}