{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://docs.demiton.io/registers/contract_terms/v2.json",
  "title": "contract_terms contract v2",
  "type": "object",
  "required": [
    "contract_sum",
    "payment_timing_days",
    "practical_completion_date",
    "retention_pct",
    "security"
  ],
  "properties": {
    "ld_cap": {
      "type": "number",
      "description": "Liquidated damages ceiling for the whole contract (a per-milestone cap is `ld_milestones[].cap_amount`).",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "in `currency`"
    },
    "ld_rate": {
      "type": "number",
      "description": "Liquidated damages rate per calendar day.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "in `currency`, per day"
    },
    "currency": {
      "type": "currency",
      "description": "The currency every amount on this record is in (contract_sum, ld_rate, ld_cap, ld_milestones, public_liability, professional_indemnity). As the document states it; where it states only a symbol such as `$`, the currency of the country whose law governs the contract (`jurisdiction`). A record with no currency has no usable amount.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "ISO 4217 alpha-3 code (e.g. `AUD`, `NZD`)",
      "pattern": "^[A-Z]{3}$"
    },
    "security": {
      "type": "string",
      "description": "Form/amount of security, e.g. two unconditional undertakings totalling 5%.",
      "x-demiton-requiredness": "required",
      "x-demiton-unit": "n/a (form and/or amount)"
    },
    "eot_grounds": {
      "type": "array",
      "description": "Pre-classified grounds on which this contract allows an extension of time to be claimed, so an event fact (e.g. a rain day) can be matched against its clause without free-text parsing at dispatch time.",
      "items": {
        "type": "string",
        "enum": [
          "weather",
          "latent_conditions",
          "variation",
          "suspension",
          "access",
          "other"
        ]
      },
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "n/a (closed enum)"
    },
    "contract_sum": {
      "type": "number",
      "description": "Total contract/subcontract price or lump sum, excluding GST. A sum the document states GST-inclusive is stored with the GST taken out: the document's own GST figure when it states one, otherwise the governing country's rate (AU 10%, NZ 15%); with neither, no sum is stored. Parser rejects <1000 as a clause-number artefact.",
      "x-demiton-requiredness": "required",
      "x-demiton-unit": "in `currency`, ex GST, plain (no symbol/commas)"
    },
    "jurisdiction": {
      "type": "jurisdiction",
      "description": "The jurisdiction whose law governs the contract (its governing-law clause or security of payment Act), e.g. `AU-QLD`, `NZ`.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "ISO 3166-1 or 3166-2 code"
    },
    "contract_date": {
      "type": "string",
      "description": "The date the contract was entered into. Where the obligation library has a duty whose rule changed on a date for contracts entered into on or after it, this is the date that picks the version. As the document states it (a signed copy's date of agreement, else the date on the letter of acceptance); a draft's date is a reading, not a fact. Never defaulted: a record with no contract date says so, and a rule that turns on it cannot be measured.",
      "format": "date",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "ISO 8601 date"
    },
    "contract_form": {
      "type": "string",
      "description": "The standard conditions of contract the document is based on (amended or not), so an evidence standard can fall back to the form's own notice windows when the contract states none.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "n/a (closed vocabulary, enforced by the parser: `GC21`, `TFNSW_GC21` (Transport for NSW's amended GC21, C2-GC21), `TMR_TIC`, `MRWA_MAJOR`, `MRWA_MINOR`, `AS4000_1997`, `AS4000_2025`, `AS2124`, `AS4902`, `NZS3910_2013`, `NZS3910_2023`, `other`)"
    },
    "ld_milestones": {
      "type": "array",
      "description": "Damages stated per milestone or separable portion (sectional completion), one entry per clause. A single contract-wide LD stays in `ld_rate`/`ld_cap`.",
      "items": {
        "type": "object",
        "properties": {
          "cap_amount": {
            "type": [
              "number",
              "null"
            ]
          },
          "penalty_type": {
            "type": "string",
            "enum": [
              "liquidated_damages",
              "delay_damages",
              "bonus",
              "other"
            ]
          },
          "rate_per_day": {
            "type": [
              "number",
              "null"
            ]
          },
          "milestone_name": {
            "type": "string"
          },
          "clause_reference": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "milestone_name",
          "penalty_type"
        ]
      },
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "n/a (object list; rate_per_day and cap_amount in `currency`)"
    },
    "retention_pct": {
      "type": "number",
      "description": "Retention/security percentage of the contract price.",
      "x-demiton-requiredness": "required",
      "x-demiton-unit": "percent, 0–100 exclusive of 0"
    },
    "time_bar_days": {
      "type": "integer",
      "description": "Window after the notice above within which the substantiated claim itself must be submitted, or it is time-barred (NEC-style two-stage notice/substantiation).",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "days"
    },
    "indemnity_scope": {
      "type": "string",
      "description": "The indemnity clause's scope and any cap or carve-outs, recorded verbatim.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "free text as written"
    },
    "notice_eot_days": {
      "type": "integer",
      "description": "Contractual notice window to raise a delay / extension-of-time claim after the delaying event.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "days"
    },
    "security_expiry": {
      "type": "string",
      "description": "Date the security (bank guarantee / undertaking) is returnable.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "ISO 8601 date"
    },
    "escalation_basis": {
      "type": "string",
      "description": "Whether the contract lets the price move with input costs, and on what. `none`: the contract carries no rise-and-fall or price-adjustment clause. `index`: the clause adjusts on published indices, named in `escalation_basket`. `invoice`: the clause adjusts on supplier invoices. Absent means the clause has not been captured, which is not the same as `none`.",
      "enum": [
        "none",
        "index",
        "invoice"
      ],
      "x-demiton-requiredness": "optional"
    },
    "public_liability": {
      "type": "number",
      "description": "Public liability insurance cover amount.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "in `currency`"
    },
    "escalation_basket": {
      "type": "array",
      "description": "The indices the clause adjusts on, one entry per line, with the weight of each over the adjustable share. The weights sum to 100. `index_name` is the index as the clause names it; `series_key` is the `platform_rate` series that publishes exactly that index, absent when no such series is held. A line is never mapped to a different index.",
      "items": {
        "type": "object",
        "properties": {
          "index_name": {
            "type": "string",
            "description": "the index as the clause names it"
          },
          "series_key": {
            "type": [
              "string",
              "null"
            ],
            "description": "the platform_rate series that publishes this index"
          },
          "weight_pct": {
            "type": "number",
            "description": "this line's weight over the adjustable share, 0 to 100"
          }
        },
        "required": [
          "index_name",
          "weight_pct"
        ]
      },
      "x-demiton-requiredness": "optional"
    },
    "escalation_cap_pct": {
      "type": "number",
      "description": "The largest adjustment the clause allows, as a percent; `escalation_cap_scope` says of what.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "percent"
    },
    "payment_timing_days": {
      "type": "integer",
      "description": "Contract time for payment of a payment claim.",
      "x-demiton-requiredness": "required",
      "x-demiton-unit": "days"
    },
    "service_for_notices": {
      "type": "array",
      "description": "The contract's notices clause as a per-party service profile - who may be served, at what address, by which permitted methods, and the deemed-service rule - one entry per party the clause names. This is what the contract SAYS about serving notices; a notice actually served is a separate contract_notice record.",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "methods": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "party_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "party_role": {
            "type": "string",
            "enum": [
              "superintendent",
              "principal",
              "contractor",
              "other"
            ]
          },
          "email_basis": {
            "type": "string",
            "enum": [
              "declared_permitted",
              "declared_excluded",
              "inferred_from_silence"
            ]
          },
          "email_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "source_clause": {
            "type": [
              "string",
              "null"
            ]
          },
          "email_permitted": {
            "type": "boolean"
          },
          "deemed_service_days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "deemed_service_basis": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "business",
              "calendar",
              "working",
              null
            ]
          },
          "deemed_service_method": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "party_role",
          "methods",
          "email_permitted",
          "email_basis"
        ]
      },
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "n/a (object list)"
    },
    "escalation_cap_scope": {
      "type": "string",
      "description": "What the cap limits. `per_claim`: each claim's adjusted move. `cumulative`: the running total of adjustments, as a share of `contract_sum`.",
      "enum": [
        "per_claim",
        "cumulative"
      ],
      "x-demiton-requiredness": "optional"
    },
    "escalation_fixed_pct": {
      "type": "number",
      "description": "The share of the price the clause holds fixed (the non-adjustable portion), from 0 to 100. Absent when the clause states none.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "percent"
    },
    "escalation_clause_ref": {
      "type": "string",
      "description": "The clause that provides the adjustment, as the contract numbers and names it.",
      "x-demiton-requiredness": "optional"
    },
    "notice_variation_days": {
      "type": "integer",
      "description": "Contractual notice window after a variation-triggering event, before which a variation claim must be raised or is time-barred.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "days"
    },
    "escalation_base_period": {
      "type": "string",
      "description": "The index period the contract's rates are priced at, as the clause states it, written `YYYY-Qn` for a quarterly index or `YYYY-MM` for a monthly one.",
      "x-demiton-requiredness": "optional"
    },
    "escalation_notice_days": {
      "type": "integer",
      "description": "The window, from the progress claim, inside which the adjustment must be claimed.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "days"
    },
    "escalation_notice_unit": {
      "type": "string",
      "description": "Whether `escalation_notice_days` counts business or calendar days, as the clause states it.",
      "enum": [
        "business_days",
        "calendar_days"
      ],
      "x-demiton-requiredness": "optional"
    },
    "insurance_requirements": {
      "type": "array",
      "description": "Insurance types and minimum cover the contract requires - each entry an object with insurance_type, min_limit and endorsements - for cross-joining against insurance_certificate.expires_on.",
      "items": {
        "type": "object"
      },
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "n/a (object list)"
    },
    "notice_suspension_days": {
      "type": "integer",
      "description": "Contractual notice window before a right to suspend work may be exercised.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "days"
    },
    "professional_indemnity": {
      "type": "number",
      "description": "Professional indemnity cover amount.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "in `currency`"
    },
    "variation_overhead_pct": {
      "type": "number",
      "description": "Overheads-and-profit percentage applied to variations.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "percent, 0–100"
    },
    "dispute_resolution_path": {
      "type": "array",
      "description": "The contract's dispute escalation ladder, in order (e.g. negotiation, mediation, expert determination, arbitration, litigation).",
      "items": {
        "type": "string"
      },
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "ordered list of step names, as written"
    },
    "defects_liability_months": {
      "type": "integer",
      "description": "Defects liability/correction period.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "months, converted from weeks/years"
    },
    "escalation_threshold_pct": {
      "type": "number",
      "description": "The move, as a percent of the price, below which the clause makes no adjustment. Absent when the clause states no threshold.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "percent"
    },
    "practical_completion_date": {
      "type": "string",
      "description": "Date for Practical Completion / Date for Completion, verbatim.",
      "x-demiton-requiredness": "required",
      "x-demiton-unit": "free text as written (e.g. \"11 January 2027\", \"26 weeks after Date of Contract\")"
    },
    "security_release_milestones": {
      "type": "array",
      "description": "Milestones at which security is reduced or released - each entry an object naming the trigger and the amount or percentage released.",
      "items": {
        "type": "object"
      },
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "n/a (object list)"
    },
    "retention_release_milestones": {
      "type": "array",
      "description": "Milestones at which retention is reduced or released - each entry an object naming the trigger (e.g. practical completion, end of defects liability) and the amount or percentage released.",
      "items": {
        "type": "object"
      },
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "n/a (object list)"
    },
    "escalation_index_lag_quarters": {
      "type": "integer",
      "description": "How many quarters before a claim's work quarter the clause takes its index from. 0 when the clause uses the work quarter itself.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "count"
    },
    "notice_latent_conditions_days": {
      "type": "integer",
      "description": "Contractual notice window to notify latent or differing site conditions after they are encountered.",
      "x-demiton-requiredness": "optional",
      "x-demiton-unit": "days"
    }
  },
  "x-demiton-register-type": "contract_terms",
  "x-demiton-contract-version": "2.1.0",
  "x-demiton-store": "tenant",
  "x-demiton-axes": [],
  "x-demiton-measures": [],
  "x-demiton-provenance": {
    "standards": [
      {
        "code": "AS 2124-1992",
        "title": "General Conditions of Contract (superseded)",
        "access": "paywalled_secondary",
        "clause": "Annexure Part A",
        "region": "Australia",
        "edition": "1992",
        "checked_on": "2026-09-14"
      },
      {
        "code": "AS 4000-1997",
        "title": "General Conditions of Contract (superseded edition, still in use)",
        "access": "paywalled_secondary",
        "clause": "cl 37.1/37.2 (per commentary)",
        "region": "Australia",
        "edition": "1997",
        "checked_on": "2026-09-14"
      },
      {
        "code": "AS 4000:2025",
        "title": "General Conditions of Contract (construct only)",
        "access": "paywalled_secondary",
        "clause": "Annexure Part A; cl 37.2; cl 42 (per commentary)",
        "region": "Australia",
        "edition": "2025",
        "checked_on": "2026-09-14"
      },
      {
        "code": "AS 4902-2000",
        "title": "General Conditions of Contract for Design and Construct",
        "access": "paywalled_secondary",
        "region": "Australia",
        "edition": "2000",
        "checked_on": "2026-09-14"
      },
      {
        "code": "AU SoP Acts",
        "title": "Australian state and territory Security of Payment Acts (NSW 1999, QLD 2017, VIC 2002, WA 2021, SA 2009, TAS 2009, ACT 2009, NT 2004)",
        "access": "public_summary",
        "region": "Australia",
        "edition": "various",
        "checked_on": "2026-09-14"
      },
      {
        "code": "VIC BCISP Act 2002",
        "title": "Building and Construction Industry Security of Payment Act 2002 (Vic), as amended from 15 Apr 2026",
        "access": "public_summary",
        "clause": "ss 17A-17H (per commentary)",
        "region": "Australia",
        "edition": "2002 as amended 15 Apr 2026",
        "checked_on": "2026-09-14"
      },
      {
        "code": "WA BCISP Act 2021",
        "title": "Building and Construction Industry (Security of Payment) Act 2021 (WA)",
        "access": "full_text_verified",
        "clause": "ss 59, 71-77",
        "region": "Australia",
        "edition": "2021",
        "checked_on": "2026-09-14"
      },
      {
        "code": "NZ CCA 2002",
        "title": "Construction Contracts Act 2002 (NZ), 2002 No 46, as amended 2015 and 2023",
        "access": "full_text_verified",
        "clause": "ss 18B, 18FD, 20, 22",
        "region": "New Zealand",
        "edition": "as at 5 Oct 2023",
        "checked_on": "2026-09-14"
      },
      {
        "code": "HGCRA 1996 Part II",
        "title": "Housing Grants, Construction and Regeneration Act 1996, Part II (as amended by LDEDCA 2009)",
        "access": "full_text_verified",
        "clause": "s 110(1)",
        "region": "United Kingdom",
        "edition": "1996 c. 53 as amended",
        "checked_on": "2026-09-14"
      },
      {
        "code": "SI 1998/649",
        "title": "Scheme for Construction Contracts (England and Wales) Regulations 1998",
        "access": "full_text_verified",
        "clause": "Part II para 8",
        "region": "United Kingdom",
        "edition": "1998 as amended 2011",
        "checked_on": "2026-09-14"
      },
      {
        "code": "AIA G702-1992 / G703-1992",
        "title": "Application and Certificate for Payment; Continuation Sheet",
        "access": "public_summary",
        "region": "United States",
        "edition": "1992 (current base editions)",
        "checked_on": "2026-09-14"
      }
    ]
  },
  "description": "Commercial terms extracted from each contract document: payment terms, retention, notice windows, and liquidated damages (contract-wide and per milestone).",
  "x-demiton-contract-url": "https://docs.demiton.io/registers/contract_terms/",
  "x-demiton-register-catalog": "https://docs.demiton.io/concepts/register-catalog"
}