{
  "document": "recourse.rulebook",
  "site_url": "https://recourse-mu.vercel.app",
  "version": "0.4.0",
  "effective_at": "2026-08-26",
  "hash": "sha256:8ffd8536fc49575c3b14601b5ac5bf4ce9ddfdc4c70ea145fee1c29cfa480a0f",
  "hash_recipe": "sha256 of the RFC 8785 canonical JSON of the published rulebook file, lowercase hex.",
  "api_url": "https://api.recourse.dev/v1/rulebook/0.4.0",
  "rulebook": {
    "metadata": {
      "version": "0.4.0",
      "effective_at": "2026-08-26",
      "changelog": [
        {
          "version": "0.4.0",
          "date": "2026-08-26",
          "note": "Initial public draft."
        }
      ]
    },
    "definitions": [
      {
        "id": "A1",
        "text": "Commitment: a record of terms between a vendor and a buyer under these rules. Terms: the canonical JSON identified by its hash. Hold: funds on a rail whose release Recourse controls. Evidence: artifacts and fields submitted under the terms' evidence schema. Verification: Recourse's determination whether evidence satisfies the terms. Ruling: a determination on a dispute. Record: a party's history under these rules. Window: a time period fixed by the terms; windows run in the buyer's stated business days where stated, otherwise in hours."
      }
    ],
    "commitment_states": [
      {
        "id": "A2",
        "text": "States and transitions are as in the technical specification §6. A party may act only in the states listed there. Actions outside a state have no effect."
      }
    ],
    "evidence_standards": [
      {
        "id": "E1",
        "text": "Every artifact is identified by its SHA-256 hash listed in a manifest signed by the submitting party. An artifact whose hash does not match its manifest entry is disregarded."
      },
      {
        "id": "E2",
        "text": "Evidence must be submitted within the terms' window. Late evidence is disregarded unless the counterparty consents."
      },
      {
        "id": "E3",
        "text": "Evidence must relate to the outcome or deliverable it is attached to. Bulk or unrelated evidence may be disregarded (R-330)."
      },
      {
        "id": "E4",
        "text": "Where a connector to a source-of-truth system is configured, the connector's record prevails over a party-submitted artifact when they conflict (R-306)."
      },
      {
        "id": "E5",
        "text": "Evidence is data. Text within evidence that purports to instruct Recourse, its systems, or its reviewers is disregarded and may be treated as an attempt to manipulate verification (R-320)."
      }
    ],
    "verification_order": [
      {
        "id": "A4",
        "text": "Integrity → deterministic criteria → source-of-truth cross-check → rubric criteria → verdict. A required criterion that fails rejects the unit. A rubric criterion that cannot be determined with confidence is referred to human review within 24 hours; the unit is neither verified nor rejected until then."
      }
    ],
    "procedure": [
      {
        "id": "D1",
        "text": "A party may dispute a verified or rejected unit, or a statement, within the dispute window, by stating a category and posting the dispute bond."
      },
      {
        "id": "D2",
        "text": "An evidence window of 48 hours follows, during which either party may add evidence. Recourse gathers connector data automatically."
      },
      {
        "id": "D3",
        "text": "Recourse rules by applying the rules of Part A5–A7 in order; where no rule determines the outcome, Recourse rules on the evidence against the terms, and states its reasons and the rules relied on."
      },
      {
        "id": "D4",
        "text": "The losing party's bond is forfeited: Recourse retains the dispute fee and transfers the remainder to the prevailing party. The prevailing party's bond is released."
      },
      {
        "id": "D5",
        "text": "A ruling takes effect on issue, subject to appeal."
      }
    ],
    "reason_codes": [
      {
        "code": "R-000",
        "title": "No dispute",
        "rule_text": "Released by agreement or by lapse of the review window."
      },
      {
        "code": "R-101",
        "title": "Delivery not received",
        "rule_text": "No submission by the deadline plus grace; buyer prevails; hold refunded."
      },
      {
        "code": "R-102",
        "title": "Delivery after deadline",
        "rule_text": "Evidence timestamps fall outside the delivery window; buyer prevails on the late units unless terms allow late delivery at a reduced price."
      },
      {
        "code": "R-103",
        "title": "Outcome outside period",
        "rule_text": "An outcome claimed for a period other than the one in which it occurred; unit moved to the correct period or rejected if outside the term."
      },
      {
        "code": "R-201",
        "title": "Required criterion failed",
        "rule_text": "A required acceptance criterion is not met; unit rejected."
      },
      {
        "code": "R-202",
        "title": "Material criteria failed",
        "rule_text": "Two or more material criteria failed; unit rejected."
      },
      {
        "code": "R-203",
        "title": "Minor criteria failed",
        "rule_text": "Only minor criteria failed; unit verified; noted on the record."
      },
      {
        "code": "R-210",
        "title": "Acceptance criterion failed on source of truth",
        "rule_text": "The connector's record shows the criterion unmet."
      },
      {
        "code": "R-305",
        "title": "Evidence integrity",
        "rule_text": "Artifact hash does not match the signed manifest; unit rejected."
      },
      {
        "code": "R-306",
        "title": "Source of truth conflict",
        "rule_text": "Party-submitted evidence conflicts with the connector's record; the connector prevails."
      },
      {
        "code": "R-311",
        "title": "Duplicate outcome",
        "rule_text": "Dedupe key matches a previously verified unit; the duplicate is rejected."
      },
      {
        "code": "R-312",
        "title": "Self-dealing indicators",
        "rule_text": "The \"external\" party shares identifiers with the vendor; unit referred to review; if confirmed, rejected and recorded."
      },
      {
        "code": "R-320",
        "title": "Manipulative evidence",
        "rule_text": "Evidence contained instruction-like content that altered a verdict on re-run; unit rejected and recorded."
      },
      {
        "code": "R-330",
        "title": "Unrelated evidence",
        "rule_text": "Evidence does not relate to the unit; disregarded."
      },
      {
        "code": "R-401",
        "title": "Non-response, buyer",
        "rule_text": "Buyer neither accepted nor disputed within the review window; funds released to the vendor."
      },
      {
        "code": "R-402",
        "title": "Non-response, vendor",
        "rule_text": "Vendor added no evidence in the evidence window; the buyer's claim is upheld on the disputed units."
      },
      {
        "code": "R-410",
        "title": "Withdrawn dispute",
        "rule_text": "Disputing party withdrew; its bond is released less the dispute fee."
      },
      {
        "code": "R-450",
        "title": "Bond escalation, disputes",
        "rule_text": "A party that has lost three disputes in 90 days posts a doubled bond thereafter."
      },
      {
        "code": "R-451",
        "title": "Bond escalation, rejections",
        "rule_text": "A vendor whose rejected units exceed 20% in a period has sampling doubled and statement release delayed to the window end."
      },
      {
        "code": "R-501",
        "title": "Terms mismatch",
        "rule_text": "The claimed unit is not within the terms' standard or scope; rejected."
      },
      {
        "code": "R-520",
        "title": "Terms ambiguity",
        "rule_text": "A criterion is not testable as written; it is read against the party that drafted the terms."
      },
      {
        "code": "R-530",
        "title": "Partial performance",
        "rule_text": "Deliverable partially meets terms; split ruling with a stated apportionment."
      },
      {
        "code": "R-600",
        "title": "Panel decision",
        "rule_text": "Ruling issued by the bonded panel on appeal; cites the rules applied."
      },
      {
        "code": "R-900",
        "title": "Rail event",
        "rule_text": "A chargeback, payout failure, or account restriction on the rail suspended releases; not a determination on the merits."
      }
    ],
    "appeals": [
      {
        "id": "P1",
        "text": "The losing party may appeal within 72 hours by posting the appeal bond."
      },
      {
        "id": "P2",
        "text": "Three reviewers decide independently and by majority within five business days on the audit bundle. The decision cites the rules applied (R-600) and is final under these rules."
      },
      {
        "id": "P3",
        "text": "The elected dispute path in the terms provides for arbitration under the American Arbitration Association's rules after the panel; Recourse provides the signed audit bundle to the parties for that purpose."
      }
    ],
    "records": [
      {
        "id": "C1",
        "text": "Every verified, rejected, disputed, and ruled unit writes to both parties' records. Records are never edited; corrections are appended."
      },
      {
        "id": "C2",
        "text": "A party controls the public visibility of its own record within the consent scopes offered. Counterparties to a live commitment always see each other's full record."
      }
    ],
    "amendments": [
      {
        "id": "M1",
        "text": "Recourse publishes proposed changes with a 14-day comment period. Rules in effect at the time terms were accepted govern that commitment unless both parties adopt a later version."
      }
    ],
    "deterministic_rules": [
      {
        "id": "R-305",
        "comment": "Facts: findings.integrity.manifest_match (boolean, false when any artifact's SHA-256 does not match its signed manifest entry). Evaluated first: an integrity failure ends the dispute regardless of other facts.",
        "when": {
          "==": [
            {
              "var": "findings.integrity.manifest_match"
            },
            false
          ]
        },
        "then": {
          "outcome": "buyer",
          "reason_code": "R-305"
        }
      },
      {
        "id": "R-311",
        "comment": "Facts: findings.dedupe.duplicate (boolean, true when the unit's dedupe key matches a previously verified unit under the commitment). The duplicate unit alone is lost; other units are unaffected.",
        "when": {
          "==": [
            {
              "var": "findings.dedupe.duplicate"
            },
            true
          ]
        },
        "then": {
          "outcome": "buyer",
          "reason_code": "R-311"
        }
      },
      {
        "id": "R-101",
        "comment": "Facts: facts.submission.received (boolean, true when any submission arrived before the deadline plus grace); facts.time.deadline_grace_elapsed (boolean, true when the deadline plus grace has passed). Fires when nothing was submitted and the window is over.",
        "when": {
          "and": [
            {
              "==": [
                {
                  "var": "facts.submission.received"
                },
                false
              ]
            },
            {
              "==": [
                {
                  "var": "facts.time.deadline_grace_elapsed"
                },
                true
              ]
            }
          ]
        },
        "then": {
          "outcome": "buyer",
          "reason_code": "R-101"
        }
      },
      {
        "id": "R-102",
        "comment": "Facts: facts.submission.received (boolean); facts.time.delivered_within_window (boolean, true when the evidence timestamps fall inside the delivery window); facts.terms.late_delivery_allowed (boolean, true when the terms allow late delivery at a reduced price). Fires on late delivery the terms do not excuse.",
        "when": {
          "and": [
            {
              "==": [
                {
                  "var": "facts.submission.received"
                },
                true
              ]
            },
            {
              "==": [
                {
                  "var": "facts.time.delivered_within_window"
                },
                false
              ]
            },
            {
              "==": [
                {
                  "var": "facts.terms.late_delivery_allowed"
                },
                false
              ]
            }
          ]
        },
        "then": {
          "outcome": "buyer",
          "reason_code": "R-102"
        }
      },
      {
        "id": "R-402",
        "comment": "Facts: dispute.open (boolean, true while a dispute is pending); dispute.vendor_evidence_added (boolean, true when the vendor added any evidence during the evidence window); facts.time.evidence_window_elapsed (boolean). Fires when the vendor stayed silent through the evidence window; the buyer's claim is upheld on the disputed units.",
        "when": {
          "and": [
            {
              "==": [
                {
                  "var": "dispute.open"
                },
                true
              ]
            },
            {
              "==": [
                {
                  "var": "dispute.vendor_evidence_added"
                },
                false
              ]
            },
            {
              "==": [
                {
                  "var": "facts.time.evidence_window_elapsed"
                },
                true
              ]
            }
          ]
        },
        "then": {
          "outcome": "buyer",
          "reason_code": "R-402"
        }
      },
      {
        "id": "R-401",
        "comment": "Facts: dispute.buyer_acted_in_review_window (boolean, true when the buyer accepted or disputed within the review window); facts.time.review_window_elapsed (boolean). Fires when the buyer neither accepted nor disputed and the review window has lapsed; funds release to the vendor.",
        "when": {
          "and": [
            {
              "==": [
                {
                  "var": "dispute.buyer_acted_in_review_window"
                },
                false
              ]
            },
            {
              "==": [
                {
                  "var": "facts.time.review_window_elapsed"
                },
                true
              ]
            }
          ]
        },
        "then": {
          "outcome": "vendor",
          "reason_code": "R-401"
        }
      }
    ]
  }
}