SCENARIOS = ("backend_substitution", "partner_exit", "standardization")
FIELDS = {"asset": str, "rights_basis": str, "adoption": dict, "survives": list, "source_id": str}
def falsify(dossier, minimum_deployments):
    errors = []
    coverage = {scenario: [] for scenario in SCENARIOS}
    for row in dossier.get("assets", []):
        missing = [name for name, kind in FIELDS.items()
                   if name not in row or type(row[name]) is not kind]
        missing += [name for name in ("asset", "rights_basis", "source_id") if not row.get(name)]
        adoption = row.get("adoption", {})
        if type(adoption.get("value")) is not int or adoption.get("unit") != "deployments":
            missing.append("adoption_schema")
        unknown = set(row.get("survives", [])) - set(SCENARIOS)
        if unknown:
            missing.append("unknown_scenario")
        if missing:
            errors.append(row.get("asset", "asset") + ":" + ",".join(sorted(set(missing))))
            continue
        if adoption["value"] >= minimum_deployments:
            for scenario in row["survives"]:
                coverage[scenario].append(row["asset"])
    uncovered = sorted(name for name, assets in coverage.items() if not assets)
    decision = "invalid" if errors else ("renewable-execution-lead" if not uncovered else "unproven")
    return {"decision": decision, "errors": errors, "uncovered": uncovered,
            "survivors": {name: sorted(assets) for name, assets in coverage.items()}}
dossier = {"scenario": "platform moat red-team", "assets": [
    {"asset": "owned integration playbook", "rights_basis": "company copyright",
     "adoption": {"value": 6, "unit": "deployments"},
     "survives": ["partner_exit", "standardization", "backend_substitution"],
     "source_id": "scenario:deployment-ledger"},
    {"asset": "preferred backend access", "rights_basis": "revocable agreement",
     "adoption": {"value": 3, "unit": "deployments"}, "survives": [],
     "source_id": "scenario:partner-contract"}]}
base_result = falsify(dossier, 2)
bad_assets = [{**dossier["assets"][0], "adoption": {"value": 6, "unit": ""}}, dossier["assets"][1]]
bad_result = falsify({**dossier, "assets": bad_assets}, 2)
low_adoption = [{**dossier["assets"][0], "adoption": {"value": 1, "unit": "deployments"}}, dossier["assets"][1]]
sensitive_result = falsify({**dossier, "assets": low_adoption}, 2)
assert base_result["decision"] == "renewable-execution-lead" and base_result["uncovered"] == []
assert bad_result["decision"] == "invalid" and "adoption_schema" in bad_result["errors"][0]
assert sensitive_result["decision"] == "unproven" and sensitive_result["uncovered"] == sorted(SCENARIOS)
print(f"PASS: 80 moat dossier base={base_result['decision']} survivors={base_result['survivors']} invalid={bad_result['errors']} low_adoption={sensitive_result['decision']}")
