///|
fn contract_dispositions(
  basis : Receipt,
  prepared : PreparedPlan,
) -> Array[ContractDisposition] raise {
  let records : Array[ContractDisposition] = []
  for disposition in basis.dispositions {
    let classification = match disposition.classification {
      "BytePreserved" => BytePreservedKind
      "RemovedByPolicy" => RemovedByPolicyKind
      "RegeneratedMetadata" => RegeneratedMetadataKind
      _ =>
        raise Invalid(
          "no accepted semantic preservation handler for this disposition",
        )
    }
    let mut operation : CheckedOperation? = None
    for op in prepared.operations {
      if op.part == disposition.part && operation_writes(op.kind) {
        operation = Some(op)
        break
      }
    }
    if classification != BytePreservedKind {
      guard operation is Some(_) else {
        raise Invalid("changed part has no authorized plan operation")
      }
    }
    records.push({
      part: disposition.part,
      classification,
      before_hash: disposition.before_hash,
      after_hash: disposition.after_hash,
      decision_id: operation.map(fn(op) { op.decision_id }),
      rule_id: operation.map(fn(op) { op.rule_id }),
      reason: match operation {
        Some(op) => op.reason
        None =>
          "Actual output payload SHA-256 equals original; no handler authorizes changing this part."
      },
    })
  }
  records
}

///|
pub fn verify_contract(
  output : Bytes,
  original : Bytes,
  limits? : Limits = Limits::default(),
) -> VerifiedReceipt raise {
  // The compatibility verifier reparses actual serialized output, compares its
  // full graph with independently generated expected changes, and checks every
  // payload. Executor memory and a supplied Receipt cannot produce this result.
  let checked = verify_packages(output, original, limits)
  let basis = legacy_receipt(checked, output, original, limits)
  let before = checked.before
  let after = checked.after
  let prepared = make_prepared_plan(before, limits)
  let assessment = assess_package(after)
  guard assessment.decision.result == Pass &&
    assessment.coverage.parse_complete &&
    assessment.coverage.unchecked_features.length() == 0 &&
    assessment.findings.length() == 0 else {
    raise Invalid("output capability/profile coverage contract not satisfied")
  }
  let checks : Array[VerificationCheck] = []
  for
    (id, detail) in [
      (
        "actual-output-structure", "Reparsed actual output bytes; CRC, OPC targets, content types and plain main type checked.",
      ),
      (
        "actual-output-graph", "Rebuilt source-local relationship/XML index equals the independently regenerated expected graph.",
      ),
      (
        "actual-output-capabilities", "All declared profile rules checked; forbidden declarations absent; unknown features refuse.",
      ),
      (
        "all-part-dispositions", "Every original part has a disposition; no unplanned new/missing part or changed metadata/payload.",
      ),
      (
        "payload-preservation", "BytePreserved payload hashes equal original; metadata equals the exact accepted handler output.",
      ),
      (
        "plan-preconditions", "Input/part hashes, resource configuration, conflicts, closure and decisions recomputed from original.",
      ),
    ] {
    checks.push({ check_id: id, state: Checked, result: Some(Pass), detail, })
  }
  checks.push({
    check_id: "independent-client-schema",
    state: NotChecked,
    result: None,
    detail: "The SDK does not execute independent validators or Office clients; external evidence must bind the actual output hash.",
  })
  {
    schema: "partsieve.receipt.v2-dev",
    tool: "partsieve/0.2.0-spike",
    rules: prepared.rules,
    policy: prepared.policy,
    profile: prepared.profile,
    input_hash: basis.input_hash,
    output_hash: basis.output_hash,
    input_size: original.length(),
    output_size: output.length(),
    input_format: basis.input_format,
    output_format: basis.output_format,
    limits,
    input_coverage: prepared.coverage,
    output_coverage: assessment.coverage,
    findings: prepared.findings,
    output_findings: assessment.findings,
    decisions: prepared.decisions,
    allowed_capabilities: [],
    plan: prepared,
    dispositions: contract_dispositions(basis, prepared),
    checks,
    result: Pass,
    independent_validation: NotChecked,
    independent_tools: [],
    limitations: before.audit.limitations +
    [
      "No accepted source XML rewrite handler: SemanticallyRewritten is not used or certified by this configuration.",
      "Receipt hashes bind bytes; no authenticity signature or general Office safety proof.",
      "Independent schema/client evidence is separate; WPS Word saved-copy ordering failure must not be represented as Pass.",
    ],
  }
}

///|
pub fn rebuild_verified(
  input : Bytes,
  limits? : Limits = Limits::default(),
) -> VerifiedRebuilt raise {
  let bytes = execute(load_package(input, limits), limits)
  { bytes, receipt: verify_contract(bytes, input, limits~), }
}

///|
pub fn rebuild_verified_with_plan(
  input : Bytes,
  supplied : Json,
  limits? : Limits = Limits::default(),
) -> VerifiedRebuilt raise {
  let bytes = execute_supplied_plan(input, supplied, limits)
  { bytes, receipt: verify_contract(bytes, input, limits~), }
}