"""Validate this authored dialogue contract, not audio files or voice rights."""
from pathlib import Path
import json,copy,hashlib,sys
def validate(d):
    turns=d["turns"]
    if len(turns)!=6 or [t["order"] for t in turns]!=list(range(1,7)):raise ValueError("six ordered turns required")
    if len({t["turn_id"] for t in turns})!=6:raise ValueError("duplicate turn ID")
    for t in turns:
        if t["role"] not in d["fictional_roles"]:raise ValueError("unknown role")
        if t["text_version"]!=d["script_version"]:raise ValueError("stale text version")
        if hashlib.sha256(t["text"].encode()).hexdigest()!=t["text_sha256"]:raise ValueError("text hash mismatch")
        a=t["audio"]
        if a["status"]!="planned_not_generated" or a["duration_seconds"] is not None or a["sha256"] is not None:raise ValueError("this fixture is a plan, not delivered audio")
    return True
if __name__=="__main__":
    p=Path(sys.argv[1]) if len(sys.argv)>1 else Path(__file__).with_name("multi-voice-six-turn-script-manifest.json")
    d=json.loads(p.read_text(encoding="utf-8"));assert validate(d)
    rejected=0
    for kind in ["reorder","missing_role","stale_version"]:
        bad=copy.deepcopy(d)
        if kind=="reorder":bad["turns"]=list(reversed(bad["turns"]))
        elif kind=="missing_role":bad["turns"][0]["role"]="unknown"
        else:bad["turns"][0]["text_version"]="old"
        try:validate(bad)
        except ValueError:rejected+=1
    assert rejected==3
    print(json.dumps({"turns_validated":6,"deliberate_invalid_mutations_rejected":rejected,"audio_files_created":0,"voice_assignments_confirmed":0},indent=2))
