TEXT_FIELDS = ("claim_id", "owner", "task", "baseline", "resources", "reproduction",
               "counterevidence", "declared_decision", "cutoff", "review_due")
def valid_iso(value):
    parts = value.split("-") if type(value) is str else []
    return len(parts) == 3 and [len(part) for part in parts] == [4, 2, 2] and all(part.isdigit() for part in parts)
def audit(dossier, as_of):
    errors = [name for name in TEXT_FIELDS if type(dossier.get(name)) is not str or not dossier.get(name)]
    sources = dossier.get("sources", {})
    if type(sources) is not dict or not sources:
        errors.append("sources")
    claim_sources = dossier.get("claim_source_ids", [])
    if type(claim_sources) is not list or not claim_sources or any(source_id not in sources for source_id in claim_sources):
        errors.append("orphan_claim_source")
    result, reversal = dossier.get("result", {}), dossier.get("reversal", {})
    for name, item in (("result", result), ("reversal", reversal)):
        if type(item.get("value")) not in (int, float) or item.get("unit") != "cost-fraction improvement":
            errors.append(name + "_schema")
    cutoff, review_due = dossier.get("cutoff", ""), dossier.get("review_due", "")
    if not valid_iso(cutoff) or not valid_iso(review_due):
        errors.append("date_schema")
    elif cutoff > as_of or review_due < as_of:
        errors.append("freshness")
    derived = "retest" if not errors and result["value"] >= reversal["value"] else "avoid-now"
    if not errors and dossier.get("declared_decision") != derived:
        errors.append("decision_trace")
    return {"status": "incomplete" if errors else "complete", "errors": sorted(set(errors)),
            "derived_decision": "invalid" if errors else derived, "observed_improvement": result.get("value")}
dossier = {"scenario": "held-out optimization evidence dossier", "claim_id": "QAPP-17",
           "owner": "operations research lead", "task": "20 frozen routing instances",
           "baseline": "tuned classical heuristic", "resources": "all tuning and sampling minutes",
           "reproduction": "fixture run R-07", "counterevidence": "infeasible candidate on instance 12",
           "declared_decision": "avoid-now", "cutoff": "2026-08-14", "review_due": "2026-11-14",
           "sources": {"E-04": "scenario:baseline-run", "E-07": "scenario:reproduction-run",
                       "E-11": "scenario:adverse-instance"}, "claim_source_ids": ["E-04", "E-07", "E-11"],
           "result": {"value": 0.00, "unit": "cost-fraction improvement"},
           "reversal": {"value": 0.02, "unit": "cost-fraction improvement"}}
base_result = audit(dossier, "2026-08-14")
bad = {key: value for key, value in dossier.items() if key != "baseline"}
bad_result = audit(bad, "2026-08-14")
no_counterevidence = {key: value for key, value in dossier.items() if key != "counterevidence"}
counterevidence_result = audit(no_counterevidence, "2026-08-14")
retest = {**dossier, "result": {"value": 0.03, "unit": "cost-fraction improvement"},
          "declared_decision": "retest"}
retest_result = audit(retest, "2026-08-14")
assert base_result["status"] == "complete" and base_result["derived_decision"] == "avoid-now"
assert bad_result["status"] == "incomplete" and "baseline" in bad_result["errors"]
assert counterevidence_result["status"] == "incomplete" and "counterevidence" in counterevidence_result["errors"]
assert retest_result["derived_decision"] == "retest" and retest_result["observed_improvement"] == 0.03
print(f"PASS: 85 application dossier status={base_result['status']} decision={base_result['derived_decision']} invalid={bad_result['errors'] + counterevidence_result['errors']} sensitivity={retest_result['derived_decision']}")
