Add synchronized music-video production planning

Add measured-audio, timed-lyrics, H3 lane planning, identity relay, upload-song routing, model-specific camera contracts, LTX long-horizon planning, workflow migrations, the validated V6 example, regression coverage, and an Unreleased changelog.
This commit is contained in:
danrh
2026-08-23 08:03:39 -05:00
parent 07f3dc254f
commit 8f23c95546
49 changed files with 44289 additions and 188 deletions
+17 -15
View File
@@ -212,7 +212,7 @@ def test_minimax_h3_contract_and_splitter_compatibility():
"continuity ledger",
"generic real animals",
"prior shot's resulting position and state",
"shot size, angle, or the word handheld alone is not a camera path",
"an incoming cut, shot size, angle, subject framing",
"event-specific sound immediately beside its visible cause",
"the final frame holds on",
):
@@ -559,13 +559,9 @@ def test_minimax_h3_ref2va_contract():
default_t2va_prompt,
{"minimax_h3_ref_sections_invalid"},
),
(
ref_prompt.replace("<Audio 1>", "the soundtrack"),
{"minimax_h3_ref_missing_asset_tag"},
),
(
ref_prompt.replace("<Video 1>", "<Video 2>"),
{"minimax_h3_ref_missing_asset_tag", "minimax_h3_ref_undefined_tag"},
{"minimax_h3_ref_undefined_tag"},
),
(
ref_prompt.replace(
@@ -575,23 +571,29 @@ def test_minimax_h3_ref2va_contract():
),
{"minimax_h3_ref_subject_definition_invalid"},
),
(
invalid_subject_usage_prompt,
{"minimax_h3_ref_subject_usage_invalid"},
),
(
ref_prompt.replace("fully_preserved", "preserved", 1),
{"minimax_h3_ref_retention_invalid"},
),
)
for invalid_prompt, expected_reasons in invalid_prompts:
invalid_packet = _packet("", {"ready_for_generation": True, "blocked_reasons": []}, segments=[])
invalid_packet["minimax_h3_prompt"] = invalid_prompt
invalid_result = _split(invalid_packet, context=context, target=target)
invalid_metadata = _metadata(invalid_result)
assert invalid_result[13] == "", invalid_metadata
assert invalid_result[13] == "", (expected_reasons, invalid_metadata)
assert expected_reasons.issubset(set(invalid_metadata["blocked_reasons"])), invalid_metadata
repairable_prompts = (
invalid_subject_usage_prompt,
ref_prompt.replace("fully_preserved", "preserved", 1),
ref_prompt.replace("<Audio 1>", "the soundtrack"),
)
for repairable_prompt in repairable_prompts:
repairable_packet = _packet("", {"ready_for_generation": True, "blocked_reasons": []}, segments=[])
repairable_packet["minimax_h3_prompt"] = repairable_prompt
repairable_result = _split(repairable_packet, context=context, target=target)
repairable_metadata = _metadata(repairable_result)
assert repairable_result[13], repairable_metadata
assert repairable_result[12] is True, repairable_metadata
assert repairable_metadata["blocked_reasons"] == [], repairable_metadata
def test_minimax_h3_ref2va_structure_repair_and_generation_gate():
manifest = (