{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://landlordatlas.com/schema/state-record.schema.json",
  "title": "State Landlord-Tenant Law Record",
  "description": "One record per US state covering the four v1 topics plus eviction_process (v2 — required since 2026-07-26, when all 50 verified records landed and the pages shipped). Every substantive field must be backed by a citation in its topic's citations array, or be null with an explanatory note.",
  "type": "object",
  "required": [
    "state",
    "state_code",
    "last_verified",
    "verified_by_method",
    "security_deposits",
    "rent_increase_notice",
    "late_fees",
    "entry_notice",
    "eviction_process"
  ],
  "properties": {
    "state": {
      "type": "string",
      "description": "Full state name, e.g. 'Michigan'"
    },
    "state_code": {
      "type": "string",
      "pattern": "^[A-Z]{2}$"
    },
    "last_verified": {
      "type": "string",
      "format": "date",
      "description": "Date of last verification pass against official sources. Only set by an actual verification, never by editing."
    },
    "verified_by_method": {
      "type": "string",
      "description": "How verification was performed, e.g. 'Direct read of statute text on official legislature site'"
    },
    "pending_legislation": {
      "type": "array",
      "description": "Bills that would change any field if enacted. Flag, do not incorporate.",
      "items": {
        "$ref": "#/$defs/pendingItem"
      }
    },
    "security_deposits": {
      "type": "object",
      "required": [
        "max_deposit",
        "return_deadline_days",
        "itemization_required",
        "citations",
        "summary_plain"
      ],
      "properties": {
        "max_deposit": {
          "type": [
            "object",
            "null"
          ],
          "description": "null means no statutory cap — say so in notes",
          "properties": {
            "months_rent": {
              "type": [
                "number",
                "null"
              ]
            },
            "conditions": {
              "type": [
                "string",
                "null"
              ],
              "description": "e.g. cap differs for furnished units or senior tenants"
            }
          }
        },
        "return_deadline_days": {
          "type": [
            "integer",
            "null"
          ]
        },
        "return_deadline_conditions": {
          "type": [
            "string",
            "null"
          ],
          "description": "e.g. clock starts at move-out vs. receipt of forwarding address"
        },
        "itemization_required": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "itemization_rules": {
          "type": [
            "string",
            "null"
          ]
        },
        "separate_account_required": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "interest_required": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "interest_rules": {
          "type": [
            "string",
            "null"
          ]
        },
        "pet_deposit_rules": {
          "type": [
            "string",
            "null"
          ]
        },
        "nonrefundable_fees_allowed": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "penalty_for_violation": {
          "type": [
            "string",
            "null"
          ],
          "description": "e.g. 'double the amount wrongfully withheld'"
        },
        "tenant_forwarding_address_duty": {
          "type": [
            "string",
            "null"
          ]
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "oneOf": [
            {
              "type": [
                "string",
                "null"
              ]
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "label",
                  "text"
                ],
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string"
                  }
                }
              }
            }
          ],
          "description": "PUBLIC page copy (renders under Notes and caveats). Preferred: array of {label, text} bullets, label bolded on-page. Legacy: single string. Operator bookkeeping goes in CHANGELOG-DATA.md, never here."
        }
      }
    },
    "rent_increase_notice": {
      "type": "object",
      "required": [
        "notice_days_month_to_month",
        "rent_control_state",
        "rent_regulation_preemption",
        "citations",
        "summary_plain"
      ],
      "properties": {
        "notice_days_month_to_month": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Days of notice required for m2m tenancy. null = no statutory requirement beyond termination notice"
        },
        "notice_varies_by_increase_size": {
          "type": [
            "string",
            "null"
          ],
          "description": "e.g. longer notice for increases over 10%"
        },
        "fixed_term_rules": {
          "type": [
            "string",
            "null"
          ]
        },
        "rent_control_state": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "true if statewide rent control/stabilization exists"
        },
        "rent_control_details": {
          "type": [
            "string",
            "null"
          ]
        },
        "local_control_preempted": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Simplified yes/no view of rent_regulation_preemption.posture, kept for continuity: preempted = true, not_preempted = false, no_express_statute = null. The rent_regulation_preemption object is authoritative — its posture_qualifier carries the nuance a boolean cannot (e.g. Texas's disaster-only authorization)."
        },
        "rent_regulation_preemption": {
          "type": "object",
          "description": "Whether state law preempts local rent regulation (rent control/stabilization) — the statewide posture behind local_control_preempted, stated with a pinpoint citation and its own verification date. Postures: preempted = a statute expressly bars local rent regulation; not_preempted = local regulation is permitted, expressly authorized, or available through a statutory pathway; no_express_statute = no statute addresses the question and no ban is inferred from silence.",
          "required": [
            "topic_verified",
            "posture",
            "posture_qualifier",
            "citations",
            "summary_plain"
          ],
          "properties": {
            "topic_verified": {
              "type": "string",
              "format": "date",
              "description": "Date this posture was verified against official sources. Only set by an actual verification."
            },
            "posture": {
              "enum": [
                "preempted",
                "not_preempted",
                "no_express_statute"
              ]
            },
            "posture_qualifier": {
              "enum": [
                "conditional_authorization",
                "field_preemption",
                "voter_approval_exception",
                "legislative_approval_exception",
                "statewide_rent_cap",
                "savings_clause_only",
                null
              ],
              "description": "The wrinkle a bare posture would flatten: conditional_authorization = rent control allowed only through an extraordinary statutory pathway (TX: disaster + governor approval); field_preemption = no rent-specific bar, but a statute supersedes all local landlord-tenant ordinances (VA); voter_approval_exception = barred unless voters approve it (MN); legislative_approval_exception = barred unless the legislature approves (IN, MS, UT); statewide_rent_cap = a statewide cap coexists with the posture (WA, OR, CA); savings_clause_only = nothing bars local regulation and no county exercises it; the powers on point are a general county delegation over rental conditions plus a clause preserving emergency rent control ordinances (HI)."
            },
            "citations": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/citations/items"
              },
              "description": "Empty only when posture is no_express_statute (there is no statute to cite; the search basis lives in verified_by_method territory, not the record)."
            },
            "summary_plain": {
              "$ref": "#/$defs/summary_plain"
            },
            "notes": {
              "oneOf": [
                {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "label",
                      "text"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "label": {
                        "type": "string",
                        "maxLength": 80
                      },
                      "text": {
                        "type": "string"
                      }
                    }
                  }
                }
              ],
              "description": "PUBLIC page copy. Same shape as topic notes."
            }
          },
          "if": {
            "properties": {
              "posture": {
                "enum": [
                  "preempted",
                  "not_preempted"
                ]
              }
            }
          },
          "then": {
            "properties": {
              "citations": {
                "minItems": 1
              }
            }
          }
        },
        "frequency_limits": {
          "type": [
            "string",
            "null"
          ]
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "oneOf": [
            {
              "type": [
                "string",
                "null"
              ]
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "label",
                  "text"
                ],
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string"
                  }
                }
              }
            }
          ],
          "description": "PUBLIC page copy (renders under Notes and caveats). Preferred: array of {label, text} bullets, label bolded on-page. Legacy: single string. Operator bookkeeping goes in CHANGELOG-DATA.md, never here."
        }
      }
    },
    "late_fees": {
      "type": "object",
      "required": [
        "statutory_cap",
        "grace_period_days",
        "citations",
        "summary_plain"
      ],
      "properties": {
        "statutory_cap": {
          "type": [
            "string",
            "null"
          ],
          "description": "e.g. '5% of monthly rent' or null = no statutory cap (reasonableness standard may apply — use notes)"
        },
        "grace_period_days": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Statutorily mandated grace period. null = none mandated"
        },
        "must_be_in_lease": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "daily_fees_allowed": {
          "type": [
            "string",
            "null"
          ]
        },
        "reasonableness_standard": {
          "type": [
            "string",
            "null"
          ],
          "description": "Case law or statutory reasonableness language where no hard cap exists"
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "oneOf": [
            {
              "type": [
                "string",
                "null"
              ]
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "label",
                  "text"
                ],
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string"
                  }
                }
              }
            }
          ],
          "description": "PUBLIC page copy (renders under Notes and caveats). Preferred: array of {label, text} bullets, label bolded on-page. Legacy: single string. Operator bookkeeping goes in CHANGELOG-DATA.md, never here."
        }
      }
    },
    "entry_notice": {
      "type": "object",
      "required": [
        "notice_hours",
        "citations",
        "summary_plain"
      ],
      "properties": {
        "notice_hours": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Required advance notice in hours. null = no statutory requirement ('reasonable notice' states use notes)"
        },
        "notice_standard": {
          "type": [
            "string",
            "null"
          ],
          "description": "e.g. 'reasonable notice' where no fixed period"
        },
        "permitted_reasons": {
          "type": [
            "string",
            "null"
          ]
        },
        "emergency_exception": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "time_of_day_restrictions": {
          "type": [
            "string",
            "null"
          ]
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "oneOf": [
            {
              "type": [
                "string",
                "null"
              ]
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "label",
                  "text"
                ],
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string"
                  }
                }
              }
            }
          ],
          "description": "PUBLIC page copy (renders under Notes and caveats). Preferred: array of {label, text} bullets, label bolded on-page. Legacy: single string. Operator bookkeeping goes in CHANGELOG-DATA.md, never here."
        }
      }
    },
    "eviction_process": {
      "type": "object",
      "required": [
        "notice_nonpayment_days",
        "self_help_prohibited",
        "citations",
        "summary_plain",
        "topic_verified"
      ],
      "properties": {
        "topic_verified": {
          "type": "string",
          "format": "date",
          "description": "Date this topic was verified against official sources. Exists because eviction_process is added to records whose record-level last_verified covers only the v1 topics. Only set by an actual verification."
        },
        "notice_nonpayment_days": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Days in the pay-or-quit notice for nonpayment of rent. null = no pre-filing notice statutorily required (explain in notes)"
        },
        "notice_nonpayment_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "Counting rules (calendar vs judicial days), cure rights and how late the tenant can cure, delivery/service methods"
        },
        "notice_lease_violation_days": {
          "type": [
            "integer",
            "null"
          ],
          "description": "The statutory pre-filing notice period for a lease violation, curable or not (e.g. WY's single notice to quit carries no cure right) — expressed as the notice's TERMINATION DATE (the day the landlord may first file) in most states, or as the notice period itself where the instrument is expressly non-terminating (e.g. ND's notice of intention to evict). Where a statute sets both a cure deadline and a termination date, encode the termination date and put both figures in the rules field. null is reserved for NO statutory period existing at all — never for filing mechanics (batch 5+7 convention; see the batch-7 METHOD.md)"
        },
        "notice_lease_violation_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "Cure vs quit split, what counts as material noncompliance, repeat-violation escalation"
        },
        "unconditional_quit_grounds": {
          "type": [
            "string",
            "null"
          ],
          "description": "Grounds allowing immediate/unconditional termination (illegal activity, irreparable breach, repeat violations) and the notice period attached"
        },
        "court_and_action": {
          "type": [
            "string",
            "null"
          ],
          "description": "Court that hears evictions, the action's statutory name (unlawful/forcible detainer, summary process, dispossessory), governing procedural rules"
        },
        "filing_to_hearing": {
          "type": [
            "string",
            "null"
          ],
          "description": "Statutory window between filing/service and the hearing or answer deadline"
        },
        "writ_and_lockout": {
          "type": [
            "string",
            "null"
          ],
          "description": "Name of the possession writ, earliest issuance after judgment, execution/lockout timing"
        },
        "appeal_window_days": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Days after judgment to appeal. null = standard civil appeal window applies (use notes)"
        },
        "timeline_uncontested": {
          "type": [
            "string",
            "null"
          ],
          "description": "Best-case notice-to-lockout span DERIVED from the statutory minimums cited in this record — present as a derivation, never as a promise; contested cases run longer"
        },
        "self_help_prohibited": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "true if landlord self-help (lockout, utility shutoff) is statutorily barred"
        },
        "self_help_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "The self-help statute's scope and tenant remedies/penalties"
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "oneOf": [
            {
              "type": [
                "string",
                "null"
              ]
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "label",
                  "text"
                ],
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string"
                  }
                }
              }
            }
          ],
          "description": "PUBLIC page copy (renders under Notes and caveats). Preferred: array of {label, text} bullets, label bolded on-page. Legacy: single string. Operator bookkeeping goes in CHANGELOG-DATA.md, never here."
        }
      }
    },
    "application_screening_fees": {
      "type": "object",
      "description": "Seventh topic (D-059 topic #7, build started 2026-08-25): rental application and tenant-screening fees — what a landlord may charge an applicant, and the receipt, refund, disclosure, adverse-action, reusable-report, holding-deposit, fee-transparency, and penalty rules that ride with the charge. OPTIONAL while the 50-state build is in progress (mobile_home_parks precedent); flips to required at 50/50. Simple topic shape (late_fees pattern): a null field is a verified statutory absence whose meaning renders via the field's nullLabel in src/lib/topics.js, with the basis carried in notes where reader-relevant. A rule enacted but not yet in force is stated in the field's text with its date AND flagged as a typed pending_legislation entry (lifecycle signed + effective_on) so incorporation is machine-scheduled. Citations are official sources only; the validator rejects official=false in this topic.",
      "required": [
        "topic_verified",
        "verified_by_method",
        "application_fee_cap",
        "fee_limited_to_actual_cost",
        "screening_fee_rules",
        "receipt_required",
        "refund_required",
        "refund_rules",
        "disclosure_rules",
        "adverse_action_rules",
        "reusable_report_rules",
        "holding_deposit_rules",
        "junk_fee_limits",
        "penalty_for_violation",
        "citations",
        "summary_plain",
        "notes"
      ],
      "additionalProperties": false,
      "properties": {
        "topic_verified": {
          "type": "string",
          "format": "date",
          "description": "Date this topic was verified against official sources. Only set by an actual verification."
        },
        "verified_by_method": {
          "type": "string",
          "description": "How verification was performed for this topic (sources read). The one field in the topic allowed to carry method register."
        },
        "application_fee_cap": {
          "$ref": "#/$defs/asfString",
          "description": "The headline instrument, never a bare yes/no: flat dollar cap, greater-of formula, actual-cost limit, indexed cap (with the current published figure, where published, and its as-of date), or a ban / enumerated-charges regime. null = no statutory cap on application fees."
        },
        "fee_limited_to_actual_cost": {
          "$ref": "#/$defs/asfBool",
          "description": "true only where a statute ties the fee to the actual cost of screening/reports. null = no such statute."
        },
        "screening_fee_rules": {
          "$ref": "#/$defs/asfString",
          "description": "Conditions on screening charges beyond a bare cap: who may charge, one-per-applicant rules, must-use-the-report rules, notice or agreement prerequisites, vacancy prerequisites. null = no statute governs screening charges separately."
        },
        "receipt_required": {
          "$ref": "#/$defs/asfBool",
          "description": "Statutory receipt duty for application/screening money. null = none."
        },
        "refund_required": {
          "$ref": "#/$defs/asfBool",
          "description": "true if at least one statutory circumstance forces return of some or all of the fee. null = none."
        },
        "refund_rules": {
          "$ref": "#/$defs/asfString",
          "description": "When and how much must come back: not screened, unit unavailable, excess over actual cost, applicant withdraws; deadlines and mechanics. null = no statutory refund duty."
        },
        "disclosure_rules": {
          "$ref": "#/$defs/asfString",
          "description": "What must be told the applicant BEFORE collecting: criteria, fee basis, applicant rights. null = no statutory disclosure duty."
        },
        "adverse_action_rules": {
          "$ref": "#/$defs/asfString",
          "description": "STATE-level denial-notice duties only; federal fair-credit duties are context, never the value. null = no state statute."
        },
        "reusable_report_rules": {
          "$ref": "#/$defs/asfString",
          "description": "Portable/reusable screening-report regime: must accept? no fee when used? validity window. null = no statute on reusable screening reports."
        },
        "holding_deposit_rules": {
          "$ref": "#/$defs/asfString",
          "description": "Fees/deposits to hold a unit pending the lease: caps, written-statement duties, disposition on each outcome. null = no statute on holding deposits."
        },
        "junk_fee_limits": {
          "$ref": "#/$defs/asfString",
          "description": "Rental fee-transparency rules as they reach residential rental advertising and application-stage fees (all-in advertised price, mandatory-fee itemization, hidden-fee bans) — statutes or duly adopted state regulations. null = no rental fee-transparency rule."
        },
        "penalty_for_violation": {
          "$ref": "#/$defs/asfString",
          "description": "Statutory damages/penalties for violating any of the above, named duty by duty. null = no specific statutory penalty."
        },
        "pending_legislation": {
          "type": "array",
          "description": "Bills that would change any field if enacted, plus signed acts with future effective dates. Flag, do not incorporate.",
          "items": {
            "$ref": "#/$defs/pendingItem"
          }
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "label",
              "text"
            ],
            "additionalProperties": false,
            "properties": {
              "label": {
                "type": "string",
                "maxLength": 80
              },
              "text": {
                "type": "string"
              }
            }
          },
          "description": "PUBLIC page copy (renders under Notes and caveats). Array of {label, text} bullets; carries the reader-relevant basis for every null field."
        }
      }
    },
    "deposit_interest": {
      "type": "object",
      "description": "Eighth topic (D-046.5, encode 2026-08-29): interest on residential security deposits — whether the tenant is owed interest, at what rate and under which mechanism, and the deposit-custody rules that ride with it. OPTIONAL while unreleased (mobile_home_parks precedent); pages, exports and the calculator ship at the release session. Three duties that secondary sources chronically conflate are encoded as SEPARATE fields and must never be merged: segregation_required (must the money be held apart), interest_bearing_account_required (must the account bear interest), and interest_required (is the tenant owed interest). A negative value in any of the three ships only on a primary read of the official text; the interest_required enum glosses are binding: yes = a statute requires interest to be paid or credited to the tenant; conditional = a statutory duty exists but switches on facts stated in coverage_conditions (deposit size, lease length, unit count, the landlord's account election); no_silent = no statute addresses deposit interest — a verified statutory silence, stated as such; no_express_negative = statutory text expressly denies the tenant interest or allocates it to the landlord, including a waivable default stated as a default, or names deposit interest only to leave it unrequired at the state level (Vermont's local-option delegation); formerly_required = a repealed or superseded duty once existed and the current answer is no. Citations are official sources only; the validator rejects official=false in this topic.",
      "required": [
        "topic_verified",
        "verified_by_method",
        "interest_required",
        "rate_mechanism",
        "current_rate_plain",
        "rate_rules",
        "accrual_payment_rules",
        "coverage_conditions",
        "segregation_required",
        "interest_bearing_account_required",
        "custody_rules",
        "penalty_for_violation",
        "local_rules",
        "rate_tables",
        "citations",
        "summary_plain",
        "notes"
      ],
      "additionalProperties": false,
      "properties": {
        "topic_verified": {
          "type": "string",
          "format": "date",
          "description": "Date this topic was verified against official sources. Only set by an actual verification."
        },
        "verified_by_method": {
          "type": "string",
          "description": "How verification was performed for this topic (sources read). The one field in the topic allowed to carry method register."
        },
        "interest_required": {
          "enum": [
            "yes",
            "conditional",
            "no_silent",
            "no_express_negative",
            "formerly_required"
          ],
          "description": "The headline answer, per the glosses in this topic's description. no_silent vs no_express_negative is a real, publishable distinction — never collapse them."
        },
        "rate_mechanism": {
          "enum": [
            "fixed",
            "formula_floor",
            "indexed_published",
            "actual_earnings",
            "prevailing_rate",
            "lesser_of_cap",
            "landlord_election",
            "rate_indeterminate",
            null
          ],
          "description": "How the rate is set, non-null only when interest_required is yes or conditional: fixed = a percentage written in the statute; formula_floor = computed from a stated formula with a floor (e.g. greater of a Treasury rate or 1.5%); indexed_published = an agency announces the figure on a cycle (rate_tables required, current year enforced); actual_earnings = whatever the account actually earns (no statewide figure exists); prevailing_rate = the statute names a market benchmark — the prevailing rate for similar deposits in the area — rather than the account's own earnings (New York; no statewide figure exists); lesser_of_cap = actual earnings capped at a stated ceiling; landlord_election = the statute lets the landlord choose between stated options; rate_indeterminate = the statute names a rate source that no longer exists, so no lawful figure can be computed (current_rate_plain stays null and rate_rules states the problem)."
        },
        "current_rate_plain": {
          "type": [
            "string",
            "null"
          ],
          "description": "The operative figure with the period it applies to and who published it, e.g. '0.49% for calendar year 2026, announced by the Banking Commissioner'. null where no statewide figure exists (actual-earnings states, rate_indeterminate, and every no/formerly state)."
        },
        "rate_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "The full rate mechanism in plain language: formula, index, floors, admin allowances, compounding, and the history a reader needs. For formerly_required: the former mechanism and the repeal. null for both no flavors — the express words or the verified silence are stated in the summary and notes."
        },
        "accrual_payment_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "When interest starts accruing, when and how it must be paid or credited (annually, at termination, on request), thresholds, de-minimis rules, and forfeiture rules. null for states with no duty."
        },
        "coverage_conditions": {
          "type": [
            "string",
            "null"
          ],
          "description": "Who and what the duty reaches: unit-count triggers, deposit-size and lease-length conditions, exemptions. null where no duty exists or it reaches all residential deposits (say which in rate_rules or notes)."
        },
        "segregation_required": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "true = a statute imposes some duty to hold the deposit apart or in a named kind of institution (detail in custody_rules — the duty ranges from strict escrow to a location duty with a bond escape); false = statutory text expressly negates the duty or expressly tolerates commingling; null = the statute is silent on custody."
        },
        "interest_bearing_account_required": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "true = a statute requires the deposit to sit in an interest-bearing account or names the investment vehicle; false = statutory text expressly says the account need not bear interest; null = no statute addresses the account's interest-bearing character. Distinct from both segregation and the duty to pay the tenant — the three-way conflation is the most common aggregator error in this topic."
        },
        "custody_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "The custody duty in plain language: account type, institution, disclosure duties, bond alternatives, commingling rules. null only when both account fields are null."
        },
        "penalty_for_violation": {
          "type": [
            "string",
            "null"
          ],
          "description": "Statutory damages/penalties as they reach interest violations specifically — where a general deposit penalty's reach to interest is unresolved in the sources read, say neither direction and state what is resolved. null = no penalty reaches interest."
        },
        "local_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "How local law interacts with the state rule: city/county interest ordinances that exist (or expressly may or may not exist — preemption, authorization), stated plainly. null = no local wrinkle worth a reader's attention."
        },
        "rate_tables": {
          "$ref": "#/$defs/diRateTables"
        },
        "pending_legislation": {
          "type": "array",
          "description": "Bills that would change any field if enacted, plus signed acts with future effective dates. Flag, do not incorporate.",
          "items": {
            "$ref": "#/$defs/pendingItem"
          }
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "label",
              "text"
            ],
            "additionalProperties": false,
            "properties": {
              "label": {
                "type": "string",
                "maxLength": 80
              },
              "text": {
                "type": "string"
              }
            }
          },
          "description": "PUBLIC page copy (renders under Notes and caveats). Array of {label, text} bullets; carries the reader-relevant basis for every null field and every verified silence."
        }
      }
    },
    "habitability": {
      "type": "object",
      "description": "Ninth topic (D-059 block 3, encode 2026-08-30): the landlord's duty to keep a rented dwelling fit and habitable, and what a tenant may lawfully do when it is not — where the duty comes from, the standards it enforces, notice and repair windows, the repair-and-deduct / withholding-or-escrow / termination / essential-services remedies, retaliation protection for using those remedies, and how far the duty can be waived or shifted. OPTIONAL while unreleased (deposit_interest precedent): pages, exports and comparison tables ship at the release session. Topic boundaries (binding): entry to MAKE repairs belongs to entry_notice; lockouts and utility shutoffs to eviction_process; deductions for tenant-caused damage to security_deposits; community-owner duties on a rented manufactured-home lot to mobile_home_parks; disclosure-only duties (lead or mold disclosure forms) and new-construction builder warranties are out of scope entirely. Statute and regulation citations are official sources only (state legislature / agency / session law); the validator rejects official=false. Court decisions are cited through leading_cases, and a decision appears there only after its full text has been read in the official reporter version; every negative posture in this topic — a remedy the state does not provide, a retaliation statute that does not exist — rests on a documented primary-source reading of the official text, never on secondary reporting.",
      "required": [
        "topic_verified",
        "verified_by_method",
        "duty_source",
        "duty_source_plain",
        "applicability",
        "standards_source",
        "standards_plain",
        "heat_duty_type",
        "heat_plain",
        "waivability",
        "waivability_plain",
        "notice_cure_days",
        "notice_cure_plain",
        "repair_deduct",
        "withholding_escrow",
        "termination",
        "essential_services",
        "retaliation",
        "damages_defenses_plain",
        "leading_cases",
        "local_rules",
        "citations",
        "summary_plain",
        "notes"
      ],
      "additionalProperties": false,
      "properties": {
        "topic_verified": {
          "type": "string",
          "format": "date",
          "description": "Date this topic was verified against official sources. Only set by an actual verification."
        },
        "verified_by_method": {
          "type": "string",
          "description": "How verification was performed for this topic (sources read). The one field in the topic allowed to carry method register."
        },
        "duty_source": {
          "enum": [
            "statutory_only",
            "statutory_and_case_law",
            "case_law_only",
            "split"
          ],
          "description": "Where the habitability duty comes from. Glosses are binding: statutory_only = the duty rests on statute; courts may construe and enforce that statute, but no independent judicially created implied warranty operates (Texas belongs here even though its statute expressly displaces the older common-law warranty — the displacement is stated in duty_source_plain); statutory_and_case_law = a statutory duty and a judicially recognized implied warranty of habitability operate side by side, each doing independent work (a state whose courts merely construe the statute does NOT qualify); case_law_only = no statewide habitability statute exists — the duty is a court-created implied warranty; split = the answer genuinely differs by place inside the state (local adoption of the uniform act, or a population threshold), applicability is required non-null, and no field in this topic may be read as statewide without it."
        },
        "duty_source_plain": {
          "type": "string",
          "minLength": 40,
          "description": "Plain-language statement naming the operative statute(s) and, where case law does independent work, the leading decision(s) by name."
        },
        "applicability": {
          "description": "Required non-null exactly when duty_source is split: which places the statutory regime covers and what flips the switch. Never flatten a split state to one statewide answer.",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "required": [
                "coverage_plain",
                "switch_plain"
              ],
              "additionalProperties": false,
              "properties": {
                "coverage_plain": {
                  "type": "string",
                  "description": "Who is covered and who is not, in plain language, including what governs outside the covered area."
                },
                "switch_plain": {
                  "type": "string",
                  "description": "The mechanism that decides coverage (local adoption of the act; a population threshold and which census it uses) and how a reader finds out which side of it they are on."
                }
              }
            }
          ]
        },
        "standards_source": {
          "enum": [
            "statutory_enumeration",
            "statutory_general",
            "administrative_code",
            "case_law_defined",
            "mixed"
          ],
          "description": "Where the operative repair standards live — a separate question from duty_source, because a statutory duty can point at standards written elsewhere. statutory_enumeration = the statute itself lists specific standards (heat, water, vermin, appliances); statutory_general = the statute states only a general fit-and-habitable (or similar) standard with no list; administrative_code = the operative standards sit in an administrative, sanitary, or health code adopted under separate authority; case_law_defined = courts define what the duty covers; mixed = more than one of these does real work, with standards_plain saying which."
        },
        "standards_plain": {
          "type": "string",
          "minLength": 60,
          "description": "What the landlord must keep in repair, in plain language: the enumerated items or general standard, any building-code incorporation, and any notable inclusions or exclusions."
        },
        "heat_duty_type": {
          "description": "Discriminator for how a heat-specific standard operates, when one exists: supply = the duty is framed as supplying or maintaining heat (a stated temperature, season, or a general duty to furnish heat) while the unit is occupied; capability = the duty is framed as providing or maintaining heating EQUIPMENT (working facilities, equipment able to reach a temperature), with no duty framed as maintaining conditions. Figures and seasons, where any exist, live in the paired plain field. Null when the state states no heat-specific standard beyond the general duty.",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "enum": [
                "supply",
                "capability"
              ]
            }
          ]
        },
        "heat_plain": {
          "type": [
            "string",
            "null"
          ],
          "description": "The heat standard's figures and any seasonal window, in plain language. Non-null exactly when heat_duty_type is non-null."
        },
        "waivability": {
          "enum": [
            "not_waivable",
            "waivable_in_part",
            "reallocable_by_agreement",
            "delegation_carve_out_limited",
            "delegation_carve_out_broad",
            "not_addressed"
          ],
          "description": "Whether and how far the duty can be waived or shifted to the tenant. not_waivable = waiver barred outright (a qualified bar is stated in waivability_plain); waivable_in_part = the law permits waiver of some of the duty, with a stated floor or subject-matter limit; reallocable_by_agreement = duties may be reassigned to the tenant by written agreement as a general matter; delegation_carve_out_limited = repairs may be delegated only within uniform-act-style limits (typically single-family dwellings, writing, separate consideration, good faith); delegation_carve_out_broad = a delegation provision exists WITHOUT the single-family limit or with materially wider reach; not_addressed = the law says nothing either way."
        },
        "waivability_plain": {
          "type": "string",
          "minLength": 40,
          "description": "The waiver and delegation rules in plain language, including any conditions the agreement must meet and any floor that survives waiver."
        },
        "notice_cure_days": {
          "type": [
            "integer",
            "null"
          ],
          "description": "The headline statutory day count a reader would put on a calendar for the general repair track, when the statute states one. The number is meaningless without notice_cure_plain, which must say exactly what the count does (deadline to complete, window to commence, a rebuttable presumption of reasonableness, or a whichever-comes-sooner rule) — comparison surfaces must always render the two together. Null when the law states no number (reasonable-time and no-clock states). Never derive a number the statute does not state."
        },
        "notice_cure_plain": {
          "type": "string",
          "minLength": 60,
          "description": "The notice and cure mechanics in plain language: how notice must be given (writing, certified mail, oral allowances), what clock starts, whether the count is to commence or to complete the repair, mailing extensions, and any preconditions such as being current on rent."
        },
        "repair_deduct": {
          "type": "object",
          "required": [
            "posture",
            "cap_plain",
            "rules_plain"
          ],
          "additionalProperties": false,
          "description": "The tenant's repair-and-deduct remedy. Posture glosses are binding: statutory = a statute authorizes repair and deduction from rent; case_law = the remedy exists by court decision only; essential_services_only = a deduct-style remedy exists only for essential-service failures (heat, water, utilities), not general repairs; expressly_barred = statutory text forbids it; none_no_authority = no statute or decision authorizes it — a verified absence stated as such.",
          "properties": {
            "posture": {
              "enum": [
                "statutory",
                "case_law",
                "essential_services_only",
                "expressly_barred",
                "none_no_authority"
              ]
            },
            "cap_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The deduction limit in plain language (including greater-of and lesser-of structures, per-period limits, and aggregate limits), or an express statement that no dollar cap exists. Non-null whenever the remedy exists in any form; null when posture is expressly_barred or none_no_authority."
            },
            "rules_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Procedure and preconditions in plain language: notices, waiting periods, who may do the work, frequency limits, and anything that forfeits the remedy."
            }
          }
        },
        "withholding_escrow": {
          "type": "object",
          "required": [
            "posture",
            "mechanisms",
            "rules_plain"
          ],
          "additionalProperties": false,
          "description": "Rent withholding and escrow. These come in structurally different shapes that must never be flattened to one yes/no: mechanisms lists every shape that operates in the state. Posture glosses: available = at least one lawful withholding or escrow path exists; conditional = a path exists but only on stated preconditions that commonly defeat it (court-approved escrow, municipal certification, paying rent into a registry); expressly_barred = statutory text forbids withholding; none_no_authority = no statute or decision provides any path — a verified absence.",
          "properties": {
            "posture": {
              "enum": [
                "available",
                "conditional",
                "expressly_barred",
                "none_no_authority"
              ]
            },
            "mechanisms": {
              "description": "Non-empty exactly when posture is available or conditional. Shape glosses: self_executing_withholding = the tenant may withhold or abate on their own on statutory conditions, no court filing first; court_or_agency_escrow = a court or agency program receives the rent and disburses it; defensive_withholding = withholding is lawful only as a defense once the landlord sues, possibly with court-ordered deposit; rent_into_court_to_defend = the tenant must pay rent into court or a registry as the price of raising the condition defense at all.",
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "enum": [
                      "self_executing_withholding",
                      "court_or_agency_escrow",
                      "defensive_withholding",
                      "rent_into_court_to_defend"
                    ]
                  }
                }
              ]
            },
            "rules_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "How each listed mechanism actually works in plain language, including the preconditions, and — where posture is a bar or absence — what happens to a tenant who withholds anyway."
            }
          }
        },
        "termination": {
          "type": "object",
          "required": [
            "posture",
            "rules_plain"
          ],
          "additionalProperties": false,
          "description": "The tenant's right to end the tenancy over habitability failures. statutory = a statute states the right; case_law = decisions supply it (constructive eviction or warranty rescission); conditional = the right exists only on stated conditions materially narrower than the general repair duty; none_stated = no habitability-specific termination right is stated (the general law of leases is not restated here).",
          "properties": {
            "posture": {
              "enum": [
                "statutory",
                "case_law",
                "conditional",
                "none_stated"
              ]
            },
            "rules_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Notice sequence, timing, move-out requirements, and what the tenant recovers (prepaid rent, deposit) in plain language."
            }
          }
        },
        "essential_services": {
          "type": "object",
          "required": [
            "posture",
            "rules_plain"
          ],
          "additionalProperties": false,
          "description": "Remedies specific to essential-service failures (heat, water, hot water, electricity): substitute housing, substitute service procurement, per-diem recovery, or accelerated clocks. statutory / case_law as elsewhere; none_stated = the state gives essential services no distinct treatment beyond the general duty.",
          "properties": {
            "posture": {
              "enum": [
                "statutory",
                "case_law",
                "none_stated"
              ]
            },
            "rules_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The essential-services rules in plain language, including any faster clocks and oral-notice allowances."
            }
          }
        },
        "retaliation": {
          "type": "object",
          "required": [
            "posture",
            "window_days",
            "window_plain",
            "mechanism_plain",
            "protected_acts_plain"
          ],
          "additionalProperties": false,
          "description": "Protection against retaliation for exercising habitability remedies. Posture glosses are binding: statute_general = a general retaliation statute protects tenants across repair complaints and remedy use; statute_narrow_only = the only statutory protection is a narrow special-subject clause (for example domestic-violence-related) — never describe such a state as either having or lacking retaliation protection without the qualifier; case_law_only = no statute, but a judicial doctrine supplies a defense or claim; none = no statute and no judicial doctrine — a verified absence stated as such.",
          "properties": {
            "posture": {
              "enum": [
                "statute_general",
                "statute_narrow_only",
                "case_law_only",
                "none"
              ]
            },
            "window_days": {
              "type": [
                "integer",
                "null"
              ],
              "description": "The presumption or protection window in days when the law states one (180 for six months stated as months is stated as the statute counts it — see window_plain). Null when no window exists, including statutes with no time element."
            },
            "window_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "What the window does — a rebuttable presumption, an outer limit on claims, or a landlord safe-harbor boundary — and when it starts. Null only when window_days is null and no window concept exists."
            },
            "mechanism_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "How the protection operates: presumption, affirmative defense, independent claim, burden shift; who bears the burden. Required non-null for statute_general and case_law_only."
            },
            "protected_acts_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Which tenant acts are protected, in plain language. Required non-null for statute_general and statute_narrow_only (for narrow statutes: exactly the narrow class covered)."
            }
          }
        },
        "damages_defenses_plain": {
          "type": [
            "string",
            "null"
          ],
          "description": "Damages measures, statutory penalties, fee-shifting, and the landlord's stated defenses, in plain language."
        },
        "leading_cases": {
          "description": "Court decisions this record relies on: name, official reporter citation, court, year, and a one-to-three-sentence holding statement. A decision is listed only after its full text has been read in the official reporter version — never from a secondary description. Required non-empty when duty_source is statutory_and_case_law, case_law_only, or split; optional elsewhere (a statutory_only state may cite decisions that do interpretive work).",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "case_name",
                  "reporter_cite",
                  "court",
                  "year",
                  "holding_plain"
                ],
                "additionalProperties": false,
                "properties": {
                  "case_name": {
                    "type": "string"
                  },
                  "reporter_cite": {
                    "type": "string",
                    "description": "Official reporter citation, e.g. '363 Mass. 184 (1973)'. Parallel cites allowed after the official one."
                  },
                  "court": {
                    "type": "string"
                  },
                  "year": {
                    "type": "integer",
                    "minimum": 1800,
                    "maximum": 2100
                  },
                  "holding_plain": {
                    "type": "string",
                    "minLength": 40,
                    "description": "What the decision held, in plain language scoped to this topic — no broader than the opinion supports."
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "A stable public source for the opinion text (an official court site or a public case-law archive), when one exists."
                  }
                }
              }
            }
          ]
        },
        "local_rules": {
          "type": [
            "string",
            "null"
          ],
          "description": "Whether cities and counties in this state add their own habitability rules, including any statewide preemption of local landlord-tenant regulation, in plain language."
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "pending_legislation": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/pendingItem"
          },
          "description": "Habitability-specific measures moving in the legislature, with the same typed lifecycle discipline as record-level entries."
        },
        "notes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "label",
              "text"
            ],
            "additionalProperties": false,
            "properties": {
              "label": {
                "type": "string",
                "maxLength": 80
              },
              "text": {
                "type": "string"
              }
            }
          },
          "description": "PUBLIC page copy (renders under Notes and caveats). Array of {label, text} bullets; carries the reader-relevant basis for every null field and every verified silence."
        }
      }
    },
    "lease_termination": {
      "type": "object",
      "description": "Tenth topic (D-066, encode 2026-09-04): how a residential tenancy lawfully ends other than by a for-cause eviction — the notice each side gives to end a periodic tenancy, whether a ground is required, what happens when a fixed term ends, holdover, the landlord's duty to mitigate after an early departure, early-termination fees, the tenant's statutory rights to leave early (domestic violence and related grounds, military service beyond the federal act, death, and other grounds), abandonment as a termination event, how termination notices are served, and the federal overlay a state's own law adds to. OPTIONAL while unreleased (the deposit-interest and habitability precedent): pages, exports and comparison tables ship at the release session. Topic boundaries (binding): for-cause notices and the court process belong to eviction_process; rent-increase notice to rent_increase_notice; termination for uninhabitable conditions and retaliation to habitability; city just-cause ordinances to the locality layer (this record carries only the state's authorization or preemption posture); manufactured-home lots to mobile_home_parks; disposal of property left behind to the abandoned-property topic. Every figure is read from the official text; every negative posture rests on the named readings recorded in negative_basis; a court decision appears in leading_cases only after its full text was read. Composed blocks render as one row each so a posture never appears without its limits.",
      "required": [
        "topic_verified",
        "verified_by_method",
        "governing_law_plain",
        "applicability",
        "periodic_notice",
        "just_cause",
        "fixed_term",
        "holdover",
        "mitigation",
        "early_termination_fees",
        "tenant_early_termination",
        "abandonment",
        "notice_service",
        "federal_overlay",
        "provenance",
        "future_versions",
        "pending_legislation",
        "negative_basis",
        "leading_cases",
        "citations",
        "summary_plain",
        "notes"
      ],
      "additionalProperties": false,
      "properties": {
        "topic_verified": {
          "type": "string",
          "format": "date",
          "description": "Date this topic was verified against official sources. Only set by an actual verification."
        },
        "verified_by_method": {
          "type": "string",
          "minLength": 80,
          "description": "How verification was performed for this topic: the chapters and titles read, the currency of the text, the enactment sweep that established it, and the court decisions read. The one prose field in the topic allowed to carry method register."
        },
        "governing_law_plain": {
          "type": "string",
          "minLength": 60,
          "description": "Which body or bodies of law carry the residential termination rules (the residential act, an older general landlord-tenant chapter, a real-property or estates chapter, a judicial-remedies chapter) and the applicability clause that makes each the residential rule. Several states keep a general chapter's procedures alive beside the residential act; this field names them so no figure below is read against the wrong body."
        },
        "applicability": {
          "description": "Non-null when at least one block's answer genuinely differs by place, lease vintage, or the body of law that governs inside the state (local adoption of the uniform act; a population or census threshold; a lease-date cutoff; a wildfire or emergency suspension). Never flatten such a state to one statewide answer.",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "required": [
                "coverage_plain",
                "switch_plain",
                "affects"
              ],
              "additionalProperties": false,
              "properties": {
                "coverage_plain": {
                  "type": "string",
                  "minLength": 40,
                  "description": "Who is covered and who is not, in plain language, including what governs outside the covered set."
                },
                "switch_plain": {
                  "type": "string",
                  "minLength": 40,
                  "description": "The mechanism that decides coverage (local adoption; a population threshold and which census it uses; a lease-execution date) and how a reader finds out which side of it they are on."
                },
                "affects": {
                  "type": "array",
                  "minItems": 1,
                  "uniqueItems": true,
                  "items": {
                    "enum": [
                      "whole_topic",
                      "periodic_notice",
                      "just_cause",
                      "fixed_term",
                      "holdover",
                      "mitigation",
                      "early_termination_fees",
                      "tenant_early_termination",
                      "abandonment",
                      "notice_service"
                    ]
                  },
                  "description": "Which blocks the coverage switch changes. whole_topic when the whole regime turns on it; otherwise the specific blocks."
                }
              }
            }
          ]
        },
        "periodic_notice": {
          "type": "object",
          "description": "Notice to end a periodic (month-to-month or similar) tenancy without cause. Day integers never ship alone: the anchor and the rules travel with them, and comparison surfaces render them together. Glosses are binding.",
          "required": [
            "landlord_days",
            "landlord_days_null_reason",
            "tenant_days",
            "tenant_days_null_reason",
            "counting_anchor",
            "anchor_plain",
            "alignment_required",
            "notice_ceiling_plain",
            "tiers_plain",
            "tier_conditions",
            "waivable",
            "waivable_plain",
            "mechanism",
            "common_law_fill_plain",
            "symmetry_mandate",
            "rules_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "landlord_days": {
              "type": [
                "integer",
                "null"
              ],
              "minimum": 0,
              "maximum": 1100,
              "description": "The headline statutory notice a landlord gives to end a month-to-month tenancy on the default track, as the statute states it (a statute that says one month is encoded as its calendar-month anchor with 30 here; the anchor says what the figure means). Null when no single figure exists — landlord_days_null_reason says why, and tiers_plain or rules_plain carries the tier table or the ground-keyed periods."
            },
            "landlord_days_null_reason": {
              "description": "Required non-null exactly when landlord_days is null. no_statute = no statute states any period (the common law fills the gap); ground_keyed = the period depends on the ground for termination; tiered_no_default = a tier table with no default track; cause_required = a no-cause termination is barred for the covered tenancy so no no-cause period exists; multiple_routes = two statutory routes with different periods and no single default.",
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "enum": [
                    "no_statute",
                    "ground_keyed",
                    "tiered_no_default",
                    "cause_required",
                    "multiple_routes"
                  ]
                }
              ]
            },
            "tenant_days": {
              "type": [
                "integer",
                "null"
              ],
              "minimum": 0,
              "maximum": 1100,
              "description": "The headline statutory notice a tenant gives to end a month-to-month tenancy on the default track. Null when the statute states none for the tenant — tenant_days_null_reason says why. Asymmetry is a finding, never smoothed over."
            },
            "tenant_days_null_reason": {
              "description": "Required non-null exactly when tenant_days is null. no_statute = the statute states no tenant period; common_law_only = only the common law supplies one; ground_keyed = keyed to a ground; tiered_no_default = tiers with no default; varies_by_tenancy_type = the statute states periods only for some tenancy types (the rules say which); geographic_split = the statute states a tenant period only for part of the state (the rules say where).",
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "enum": [
                    "no_statute",
                    "common_law_only",
                    "ground_keyed",
                    "tiered_no_default",
                    "varies_by_tenancy_type",
                    "multiple_routes",
                    "geographic_split"
                  ]
                }
              ]
            },
            "counting_anchor": {
              "type": "array",
              "uniqueItems": true,
              "items": {
                "enum": [
                  "from_service",
                  "from_receipt",
                  "before_period_end",
                  "before_rent_due_date",
                  "later_of",
                  "full_rental_period",
                  "first_of_following_month",
                  "calendar_month",
                  "not_before_rent_paid_through",
                  "effective_date_named_in_notice"
                ]
              },
              "description": "Every counting anchor the statute uses for the periods above, one entry per anchor (several states use different anchors for different tenancy types or stack two on one tier — anchor_plain says which applies where). from_service = N days run forward from delivery and the tenancy may end on any day; from_receipt = the count starts on receipt rather than sending; before_period_end = N days before the end of a rental period, ending at a period boundary; before_rent_due_date = N days before the next rent-due date; later_of = effective on the later of the date named or N days after service; full_rental_period = at least one full rental period must elapse; first_of_following_month = the period starts only on the first of the next month; calendar_month = one calendar month, not 30 days; not_before_rent_paid_through = the tenancy cannot end before the date rent is paid through; effective_date_named_in_notice = the notice itself names the effective date and the count is a minimum lead time. Empty only when mechanism is no_statute."
            },
            "anchor_plain": {
              "type": "string",
              "minLength": 40,
              "description": "How the anchors apply: which anchor governs which tenancy type or tier, whether two stack on one period, and what the figure means on a calendar (with an example where the statute's structure makes the practical period longer than the figure)."
            },
            "alignment_required": {
              "enum": [
                "required",
                "not_required",
                "unstated"
              ],
              "description": "Whether the termination date must fall on a rental-period boundary. required = the statute (or the anchor's structure) makes the tenancy end at a period boundary or a rent-due date; not_required = the statute's text or its structure lets the termination date fall on any day (a count from delivery or receipt with a party-named effective date, and no period-boundary rule); unstated = the tracks differ or the statute states no anchor that settles it (anchor_plain says which)."
            },
            "notice_ceiling_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Any statutory maximum on the notice a lease may require (for example three months), in plain language; null when none exists."
            },
            "tiers_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The tier table in plain language when the period depends on a condition: every tier with its figure and the condition that selects it. Null when the state has one period for all periodic tenancies of the same type."
            },
            "tier_conditions": {
              "type": "array",
              "uniqueItems": true,
              "items": {
                "enum": [
                  "tenure",
                  "tenancy_length",
                  "tenancy_type",
                  "building_type",
                  "landlord_portfolio_action",
                  "landlord_portfolio_size",
                  "tenancy_history",
                  "geography",
                  "tenant_status",
                  "tenant_age_or_facility",
                  "successor_owner",
                  "agreement_form",
                  "regime"
                ]
              },
              "description": "What selects the tier: tenure (how long the tenant has lived there), tenancy_length (the period's own length — week, month, year), tenancy_type (at will, periodic, oral), building_type, landlord_portfolio_action (sale, conversion, demolition, owner move-in), landlord_portfolio_size (units owned), tenancy_history (a prior violation or notice), geography (a county or city inside the state), tenant_status (military household, protected class), tenant_age_or_facility, successor_owner (a purchaser after a sale or foreclosure), agreement_form (written vs oral), regime (which body of law governs). Empty when tiers_plain is null."
            },
            "waivable": {
              "enum": [
                "no",
                "different_period",
                "longer_only",
                "including_zero",
                "with_evidentiary_standard",
                "unstated"
              ],
              "description": "Whether the parties may agree to a different notice period. no = waiver barred (a chapter-wide anti-waiver clause counts); different_period = the parties may agree another period; longer_only = only a longer period may be agreed, possibly with a formality; including_zero = the parties may agree to no notice at all; with_evidentiary_standard = an alternative period is honored only on a heightened evidentiary showing; unstated = the statute says nothing."
            },
            "waivable_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Direction and source of the waiver rule: which side may waive, whether the rule is chapter-wide or section-specific, any formality (writing, initialing), and the source clause. Required non-null for every value other than unstated."
            },
            "mechanism": {
              "enum": [
                "standalone_statute",
                "notice_to_quit_only",
                "ground_keyed",
                "multiple_statutory_routes",
                "no_statute"
              ],
              "description": "How the state's law supplies the period. standalone_statute = a termination-notice section states it; notice_to_quit_only = only the eviction notice to quit exists and it doubles as the termination notice; ground_keyed = the period depends on the ground; multiple_statutory_routes = two statutory routes with different periods coexist for residential tenancies (rules_plain reconciles them); no_statute = no statute states any period and the common law governs (common_law_fill_plain required)."
            },
            "common_law_fill_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "What the common law supplies where no statute states a period, with the decision it rests on (read in full and listed in leading_cases). Required non-null when mechanism is no_statute; null otherwise."
            },
            "symmetry_mandate": {
              "type": "boolean",
              "description": "True only where a statute requires the landlord's and tenant's notice periods to be equal or bars a lease from imposing a longer period on one side than the other."
            },
            "rules_plain": {
              "type": "string",
              "minLength": 80,
              "description": "The periodic-notice rules in plain language: form (writing), what the notice must state, how the days are counted, tenancy types and their periods, any second statutory route and how it fits, and anything that forfeits or extends the period."
            }
          }
        },
        "just_cause": {
          "type": "object",
          "description": "Whether a ground is required to end or not renew a tenancy, and the state's posture on local just-cause ordinances. City ordinances themselves belong to the locality layer.",
          "required": [
            "posture",
            "coverage_route",
            "coverage_plain",
            "no_fault_grounds_plain",
            "relocation_payment_plain",
            "local_preemption",
            "local_preemption_plain",
            "sunset_date",
            "rules_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "posture": {
              "enum": [
                "statewide",
                "conditional",
                "local_option_only",
                "none"
              ],
              "description": "statewide = a statute bars no-cause termination or non-renewal for covered tenancies across the state once coverage conditions are met; conditional = a statewide statute reaches only a defined subset (tenancy length, building age, subsidized or assisted housing, protected tenants, opt-in localities, a housing-authority tenancy); local_option_only = no statewide rule but the state expressly authorizes local ordinances; none = no statewide rule and no express authorization, on the readings named in negative_basis (preemption goes in local_preemption)."
            },
            "coverage_route": {
              "description": "Required non-null exactly when posture is statewide or conditional: what brings a tenancy inside the rule. statutory = the landlord-tenant statute itself defines coverage; assistance_condition = coverage attaches as a condition of a subsidy, tax credit or loan program; housing_authority_statute = the state's housing-authority law imposes the ground requirement on authority tenancies; property_type = coverage turns on the building or property type; tenancy_length = coverage turns on how long the tenant has been there; locality_opt_in = the statute applies where a locality opts in; multiple = more than one route (coverage_plain says which).",
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "enum": [
                    "statutory",
                    "assistance_condition",
                    "housing_authority_statute",
                    "property_type",
                    "tenancy_length",
                    "locality_opt_in",
                    "multiple"
                  ]
                }
              ]
            },
            "coverage_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Who is covered and who is exempt, in plain language. Required non-null when posture is statewide or conditional; null when posture is none or local_option_only."
            },
            "no_fault_grounds_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The no-fault grounds the statute allows (owner move-in, withdrawal, demolition, substantial rehabilitation, sale) and their conditions. Null when no ground requirement exists."
            },
            "relocation_payment_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Any statutory relocation payment tied to a no-fault termination, with its amount or measure, who pays, and exemptions; when it differs by route, say so. Null when none exists."
            },
            "local_preemption": {
              "enum": [
                "express_preemption",
                "field_occupation",
                "narrow_inconsistency_bar",
                "local_option_authorized",
                "case_law",
                "silent",
                "rental_bar_scope_open"
              ],
              "description": "The state's posture on local just-cause or eviction-control ordinances (the just-cause axis only — the rent-control axis is carried by rent_increase_notice.rent_regulation_preemption and must never be contradicted here). express_preemption = a statute names local eviction or just-cause measures as preempted; field_occupation = the chapter occupies the field of landlord-tenant regulation; narrow_inconsistency_bar = only ordinances inconsistent with the chapter are barred; local_option_authorized = a statute expressly permits local just-cause rules; case_law = an appellate decision settles the question with no statute on point (leading_cases carries it); silent = no statute or decision addresses it; rental_bar_scope_open = a statute bars municipalities from limiting the rental of property but names no eviction or just-cause measure, and whether it reaches one is an open question (local_preemption_plain quotes the clause and states the scope)."
            },
            "local_preemption_plain": {
              "type": "string",
              "minLength": 40,
              "description": "The preemption posture in plain language with its source, including any scope qualifier (which ordinances it reaches) and a pointer to the rent-regulation posture where the two axes differ."
            },
            "sunset_date": {
              "type": [
                "string",
                "null"
              ],
              "format": "date",
              "description": "The date a statewide or conditional just-cause statute expires by its own terms, where one exists; null otherwise."
            },
            "rules_plain": {
              "type": "string",
              "minLength": 60,
              "description": "The just-cause rules in plain language: the grounds, the notice they require, how they interact with the periodic-notice periods, exemptions, and — for a none posture — a plain statement that no ground is required to end a periodic tenancy or let a term expire, with any narrow statutory bars (for example a bar on ending a tenancy because of victim status)."
            }
          }
        },
        "fixed_term": {
          "type": "object",
          "description": "What happens when a fixed-term lease reaches its end date.",
          "required": [
            "expiry_default",
            "notice_days",
            "notice_plain",
            "conversion_mechanism",
            "conversion_plain",
            "auto_renewal_reminder",
            "rules_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "expiry_default": {
              "enum": [
                "ends_without_notice",
                "notice_required",
                "converts_to_periodic",
                "no_implied_renewal_statutory"
              ],
              "description": "ends_without_notice = the term ends on its date with no statutory notice from either side; notice_required = a statute requires notice before a fixed term ends or of non-renewal (notice_days carries the figure); converts_to_periodic = a statute converts the tenancy to a periodic one after the term, on the trigger conversion_mechanism states; no_implied_renewal_statutory = a statute abolishes implied renewal, so the term ends and no periodic tenancy arises by implication."
            },
            "notice_days": {
              "type": [
                "integer",
                "null"
              ],
              "minimum": 0,
              "maximum": 400,
              "description": "The statutory notice before the end of a fixed term, when a statute requires one. Null otherwise. Never ships without notice_plain."
            },
            "notice_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Who must give the end-of-term notice, when, what it must say, and the conditions that trigger it (a minimum lease length, a landlord class, a tenancy length). Required non-null when notice_days is non-null or expiry_default is notice_required."
            },
            "conversion_mechanism": {
              "enum": [
                "automatic_statutory",
                "landlord_election",
                "presumption_on_rent_acceptance",
                "common_law",
                "none"
              ],
              "description": "How a holdover after a fixed term becomes a new tenancy. automatic_statutory = the statute converts it (usually to month-to-month) by operation of law; landlord_election = the landlord chooses, typically by accepting rent; presumption_on_rent_acceptance = the statute presumes renewal or a periodic tenancy when rent is accepted; common_law = no statute, the common-law rule governs; none = no conversion — the holdover creates no new tenancy (a no-implied-renewal statute)."
            },
            "conversion_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The conversion rule's conditions: what term the new tenancy takes (month-to-month, year-to-year, the same term), any minimum original term, and what a landlord must do to avoid it. Null only when conversion_mechanism is none and nothing more needs saying."
            },
            "auto_renewal_reminder": {
              "description": "A statute requiring the landlord to remind the tenant before an automatic-renewal clause takes effect. Null when none exists.",
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "type": "object",
                  "required": [
                    "days_before",
                    "rules_plain"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "days_before": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "minimum": 1,
                      "maximum": 400,
                      "description": "How many days before the renewal deadline the reminder must be given, when the statute states a figure."
                    },
                    "rules_plain": {
                      "type": "string",
                      "minLength": 40,
                      "description": "Who must send it, how, the window, and the consequence of not sending it (the clause is unenforceable, the tenant may leave)."
                    }
                  }
                }
              ]
            },
            "rules_plain": {
              "type": "string",
              "minLength": 60,
              "description": "The fixed-term rules in plain language, including any statutory reminder or non-renewal duty and its coverage."
            }
          }
        },
        "holdover": {
          "type": "object",
          "description": "The tenant who stays past the end of the tenancy: what the tenancy becomes and what the landlord may recover.",
          "required": [
            "status_plain",
            "damages_measure",
            "damages_qualifiers",
            "damages_plain",
            "converts_to_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "status_plain": {
              "type": "string",
              "minLength": 40,
              "description": "What a holdover is in this state (a tenancy at sufferance, a month-to-month tenancy on consent, no tenancy at all) and whether the landlord may proceed without further notice."
            },
            "damages_measure": {
              "enum": [
                "none",
                "double_rent",
                "treble_damages",
                "liquidated_cap_percentage",
                "enhanced_on_bad_faith",
                "actual_damages_with_rent_floor",
                "other"
              ],
              "description": "The statutory holdover damages measure. none = no statutory enhancement (ordinary rent or use-and-occupancy only); double_rent = twice the rent for the holdover period; treble_damages = three times; liquidated_cap_percentage = a lease may set holdover rent up to a stated percentage; enhanced_on_bad_faith = an enhanced measure that attaches only to a wilful or bad-faith holdover; actual_damages_with_rent_floor = actual damages with the rent as a floor; other (damages_plain describes)."
            },
            "damages_qualifiers": {
              "type": "array",
              "uniqueItems": true,
              "items": {
                "enum": [
                  "ceiling_not_fixed_sum",
                  "floor_not_ceiling",
                  "wilfulness_or_bad_faith_trigger",
                  "deemed_wilful_by_statute",
                  "greater_of_structure",
                  "prorated_daily",
                  "separate_proceeding",
                  "attorney_fees_added",
                  "lease_may_set",
                  "definite_term_after_notice_only",
                  "lease_may_exclude"
                ]
              },
              "description": "Qualifiers on the measure, each of which changes what the figure means: ceiling_not_fixed_sum = the multiple is a maximum, not the award; floor_not_ceiling = the multiple is a minimum; wilfulness_or_bad_faith_trigger = the enhancement requires a wilful or bad-faith holdover; deemed_wilful_by_statute = the statute deems the holdover wilful on stated facts; greater_of_structure = the award is the greater of two measures; prorated_daily = the enhanced rent is prorated by the day; separate_proceeding = the enhanced damages are recovered in a separate action; attorney_fees_added = fees are added by statute; lease_may_set = the lease may fix the holdover rent within a limit; definite_term_after_notice_only = the measure applies only to a lease with a definite term, only after a notice to vacate, and only from the date that notice names; lease_may_exclude = the lease may take the statutory measure away. Empty when damages_measure is none and nothing qualifies it."
            },
            "damages_plain": {
              "type": "string",
              "minLength": 40,
              "description": "The holdover damages rule in plain language with its trigger, measure, ceiling or floor, and source; for a none measure, a statement that no statutory enhancement exists and what the landlord recovers instead."
            },
            "converts_to_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "What tenancy a consented holdover converts to (month-to-month; year-to-year on a year lease; the same term) where that differs from or adds to the fixed-term block's conversion rule; null when the fixed-term block already says it all."
            }
          }
        },
        "mitigation": {
          "type": "object",
          "description": "The landlord's duty to mitigate damages (re-let) after a tenant leaves early. Glosses are binding; a no_duty or unsettled posture must say what it rests on.",
          "required": [
            "posture",
            "posture_basis",
            "trigger",
            "duty_attaches_on_plain",
            "burden",
            "standard_plain",
            "displaced_by_fee",
            "acceleration",
            "waivable_by_lease",
            "rules_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "posture": {
              "enum": [
                "statutory",
                "case_law",
                "statutory_and_case_law",
                "no_duty",
                "unsettled"
              ],
              "description": "statutory = a statute imposes the duty; case_law = an appellate decision imposes it with no statute (name it in leading_cases); statutory_and_case_law = both a statute and an independent appellate doctrine operate; no_duty = the state's highest or intermediate appellate court holds there is none, or a statute lets the landlord elect to hold the tenant liable without re-letting; unsettled = no controlling authority after the readings named in negative_basis."
            },
            "posture_basis": {
              "description": "Required non-null when posture is no_duty or unsettled; null otherwise, with two exceptions: a statutory posture may carry damages_offset_only (the statute imposes no duty to re-let but reduces the landlord's recovery by what the tenant proves could reasonably have been avoided), and a case_law posture may carry commercial_authority_only. appellate_holding = a residential appellate holding; statutory_election = a statute's landlord election displaces the duty; court_expressly_reserved = the appellate court has expressly left the question open; no_authority_found = no statute and no appellate decision on the point; commercial_authority_only = the only appellate authority arises from commercial leases; conflicting_authority = appellate decisions conflict.",
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "enum": [
                    "appellate_holding",
                    "statutory_election",
                    "court_expressly_reserved",
                    "no_authority_found",
                    "commercial_authority_only",
                    "conflicting_authority",
                    "damages_offset_only"
                  ]
                }
              ]
            },
            "trigger": {
              "description": "When the duty attaches. general = any tenant breach or departure; abandonment_only = only on statutory abandonment; election = only if the landlord elects a remedy that carries it; accepted_surrender_only = only once the landlord accepts a surrender or the tenancy is otherwise terminated. Null when posture is unsettled or no_duty with no statutory election.",
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "enum": [
                    "general",
                    "abandonment_only",
                    "election",
                    "accepted_surrender_only"
                  ]
                }
              ]
            },
            "duty_attaches_on_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The moment or condition on which the duty attaches, in plain language, where the statute or decision states one (a landlord's election of remedies, acceptance of surrender, notice of abandonment). Null when nothing more than the trigger needs saying."
            },
            "burden": {
              "enum": [
                "landlord",
                "tenant",
                "split",
                "conflicting",
                "unstated"
              ],
              "description": "Who bears the burden of proving mitigation or its failure. split = the authorities allocate different elements to each side; conflicting = decisions disagree; unstated = no authority allocates it (never inferred)."
            },
            "standard_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The standard the landlord must meet (reasonable efforts; treat the unit like any vacant unit; the same means used for other units) and any statutory measure of damages that follows. Null when no duty exists."
            },
            "displaced_by_fee": {
              "type": "boolean",
              "description": "True where a statutory early-termination fee or liquidated-damages election displaces the mitigation duty for a landlord who takes the fee."
            },
            "acceleration": {
              "enum": [
                "barred",
                "permitted_with_limits",
                "permitted",
                "unstated"
              ],
              "description": "Whether a lease clause accelerating all remaining rent on default is enforceable. barred = a statute or appellate decision voids it; permitted_with_limits = enforceable only with an offset for re-letting or another limit; permitted = enforceable; unstated = no authority."
            },
            "waivable_by_lease": {
              "enum": [
                "no",
                "yes",
                "unstated"
              ],
              "description": "Whether the lease may waive the mitigation duty. no = a statute or decision bars waiver; yes = waiver is expressly allowed; unstated."
            },
            "rules_plain": {
              "type": "string",
              "minLength": 60,
              "description": "The mitigation rule in plain language: source, standard, burden, what the landlord may recover, any statutory liability measure for the departing tenant, and for a no_duty or unsettled posture what the state's authority actually says."
            }
          }
        },
        "early_termination_fees": {
          "type": "object",
          "description": "Statutory rules on a fee or liquidated sum a tenant pays to leave early, and any statutory cap on damages after an early departure.",
          "required": [
            "posture",
            "statutory_cap_plain",
            "damages_cap_plain",
            "rules_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "posture": {
              "enum": [
                "capped_by_statute",
                "authorized_without_cap",
                "barred_or_void",
                "no_statute"
              ],
              "description": "capped_by_statute = a statute authorizes an early-termination fee and caps it; authorized_without_cap = a statute authorizes such a fee or election without a cap; barred_or_void = a statute or appellate decision voids early-termination fees or liquidated damages in a dwelling lease; no_statute = no statute addresses such fees (the general damages rules govern), on the readings in negative_basis including the administrative code."
            },
            "statutory_cap_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The fee cap in plain language (a multiple of rent, a fixed sum, a formula), the conditions on it (lease disclosure, a notice period, the fee's effect on mitigation), and its source. Null when no cap exists."
            },
            "damages_cap_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Any statutory cap on the damages a landlord may recover after an early departure (a stated number of months' rent), in plain language. Null when none exists."
            },
            "rules_plain": {
              "type": "string",
              "minLength": 40,
              "description": "The fee rules in plain language: what a lease may charge, what it may not, the anti-waiver and good-faith backstops, and — for a no_statute posture — that the general damages and mitigation rules govern instead."
            }
          }
        },
        "tenant_early_termination": {
          "type": "object",
          "description": "Statutory rights of a tenant to end the lease early: domestic violence and related grounds, military service beyond the federal act, death of the tenant, and other grounds. Each sub-block renders as one composed row.",
          "required": [
            "dv",
            "military",
            "tenant_death",
            "other_grounds_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "dv": {
              "type": "object",
              "required": [
                "mechanism",
                "qualifying_plain",
                "separate_regimes_plain",
                "documentation_plain",
                "documentation_is_cumulative",
                "recency_window_days",
                "recency_window_kind",
                "recency_window_plain",
                "notice_days",
                "notice_days_kind",
                "notice_days_plain",
                "rent_liability_plain",
                "tenant_cost_plain",
                "cotenant_effect",
                "cotenant_plain",
                "lock_change",
                "lock_change_plain",
                "screening_shield",
                "adverse_action_bar_plain",
                "confidentiality_duty",
                "quit_deadline_plain",
                "revocability_plain",
                "landlord_side_rights_plain",
                "statutory_lease_disclosure_plain",
                "rules_plain"
              ],
              "additionalProperties": false,
              "properties": {
                "mechanism": {
                  "enum": [
                    "right_to_terminate",
                    "affirmative_defense_to_rent",
                    "rent_release_only",
                    "none"
                  ],
                  "description": "right_to_terminate = a victim may end the lease on notice and the rent obligation is discharged after a stated window; affirmative_defense_to_rent = no right to quit, but victim status is a defense or release when the landlord sues for rent; rent_release_only = a release from rent without a termination mechanism; none = no statute, on the readings named in negative_basis (the domestic-violence or crime-victim title read in full)."
                },
                "qualifying_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Who qualifies: the grounds covered (domestic violence, sexual assault, stalking, human trafficking, dating violence, elder abuse), who may invoke it (the victim, a parent of a victim, a household member), any relationship or on-premises condition. Null when mechanism is none."
                },
                "separate_regimes_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Where the state runs two or more separate statutory schemes (one for family violence, one for sexual assault or stalking; one with a protective order, one without), how they differ. Null when there is one scheme."
                },
                "documentation_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The documentation the victim must supply (protective order, police report, qualified third-party statement, self-certification), whether the list is closed, and what the landlord may keep. Null when mechanism is none."
                },
                "documentation_is_cumulative": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "True where the statute requires more than one document together (for example a written notice and a protective order); false where any listed document suffices; null when mechanism is none or the statute states no documentation rule."
                },
                "recency_window_days": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 0,
                  "maximum": 1100,
                  "description": "The statutory window tied to the incident or documentation, in days. Null when the statute states none — recency_window_kind then says none_stated — or when mechanism is none."
                },
                "recency_window_kind": {
                  "description": "What the window does. look_back = the incident or documentation must fall within N days before the notice; deadline_to_act = the tenant must give notice within N days after the incident; deadline_to_act_waivable = a deadline the landlord may waive; none_stated = the statute states no window. Null only when mechanism is none.",
                  "oneOf": [
                    {
                      "type": "null"
                    },
                    {
                      "enum": [
                        "look_back",
                        "deadline_to_act",
                        "deadline_to_act_waivable",
                        "none_stated"
                      ]
                    }
                  ]
                },
                "recency_window_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The window rule in plain language, including a second window where the statute has two (a different window per ground or per document type) and any tolling. Null when mechanism is none."
                },
                "notice_days": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 0,
                  "maximum": 400,
                  "description": "The notice the victim gives, in days, where the statute states a figure. Null when the statute states none (notice_days_kind then says none_stated) or when mechanism is none. Never import the general periodic-notice figure."
                },
                "notice_days_kind": {
                  "description": "What the figure does. lead_time = the termination takes effect N days after notice; effective_date_with_right_to_remain = the tenant names an effective date within a window and may stay until it; floor = at least N days; ceiling = no more than N days; band = between two figures (notice_days carries the lower); none_stated = the statute states no period. Null only when mechanism is none.",
                  "oneOf": [
                    {
                      "type": "null"
                    },
                    {
                      "enum": [
                        "lead_time",
                        "effective_date_with_right_to_remain",
                        "floor",
                        "ceiling",
                        "band",
                        "none_stated"
                      ]
                    }
                  ]
                },
                "notice_days_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The notice rule in plain language: form, what it must include, when termination takes effect, and any second period the statute states. Null when mechanism is none."
                },
                "rent_liability_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "What rent the departing tenant owes: through the effective date, a stated number of days or months, nothing beyond the notice period; and what happens to prepaid rent. Null when mechanism is none."
                },
                "tenant_cost_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Any fee, penalty, or forfeiture the statute allows or bars for the termination, and the deposit's treatment. Null when mechanism is none."
                },
                "cotenant_effect": {
                  "type": "array",
                  "uniqueItems": true,
                  "items": {
                    "enum": [
                      "cotenants_remain_bound",
                      "whole_lease_terminates",
                      "perpetrator_removed",
                      "victim_liability_waived_if_cotenant",
                      "not_addressed"
                    ]
                  },
                  "description": "Every effect the statute states for other tenants on the lease; more than one where the statute distinguishes situations. cotenants_remain_bound = the lease continues for the others; whole_lease_terminates = the victim's termination ends the lease for all; perpetrator_removed = the landlord may or must remove the perpetrator and continue the lease; victim_liability_waived_if_cotenant = the victim is released while the lease continues; not_addressed = the statute is silent (distinct from an express rule). Empty when mechanism is none."
                },
                "cotenant_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The co-tenant rule in plain language with any condition (the remaining tenants' ability to pay, a new screening, a new lease). Null when mechanism is none or not_addressed."
                },
                "lock_change": {
                  "enum": [
                    "tenant_may_require",
                    "landlord_consent_required",
                    "tenant_self_help",
                    "not_addressed"
                  ],
                  "description": "tenant_may_require = the victim may require the landlord to change the locks; landlord_consent_required = a lock change needs the landlord's consent; tenant_self_help = the statute lets the tenant change the locks; not_addressed."
                },
                "lock_change_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The lock-change rule's conditions (documentation, cost, a court order excluding the perpetrator, key duties). Null when not_addressed."
                },
                "screening_shield": {
                  "enum": [
                    "none",
                    "characterization_bar",
                    "denial_bar",
                    "mitigating_factor_duty",
                    "multiple"
                  ],
                  "description": "Whether the statute protects the victim in later screening. none = no shield; characterization_bar = a landlord or screening service may not report or characterize the termination adversely; denial_bar = a landlord may not deny, refuse to renew, or terminate because of victim status or a past victim-status termination; mitigating_factor_duty = a landlord must treat the termination or victim status as a mitigating factor; multiple = more than one shape (adverse_action_bar_plain says which)."
                },
                "adverse_action_bar_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Any bar on adverse action because of victim status that sits outside the termination section (a separate anti-discrimination or anti-retaliation section reaching applicants and household members), in plain language. Null when none exists."
                },
                "confidentiality_duty": {
                  "type": "boolean",
                  "description": "True where the statute requires the landlord to keep the victim's documentation or status confidential."
                },
                "quit_deadline_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Any deadline by which the victim must actually vacate after giving notice, and the consequence of missing it. Null when none exists."
                },
                "revocability_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Whether and how a victim may withdraw the termination notice. Null when the statute is silent."
                },
                "landlord_side_rights_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Rights the statute gives the landlord in the process (to require documentation, to verify it, to recover from the perpetrator, to terminate the perpetrator's tenancy) and any duty imposed on the landlord beyond the shields above. Null when mechanism is none."
                },
                "statutory_lease_disclosure_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Any statutory duty to disclose the early-termination right in the lease and the consequence of omitting it. Null when none exists."
                },
                "rules_plain": {
                  "type": "string",
                  "minLength": 60,
                  "description": "The scheme in plain language end to end; for a none mechanism, a plain statement that no statute gives a victim a right to end the lease early and what the general rules mean for that tenant."
                }
              }
            },
            "military": {
              "type": "object",
              "required": [
                "state_extension",
                "extension_limbs",
                "rights_attach_plain",
                "rules_plain"
              ],
              "additionalProperties": false,
              "properties": {
                "state_extension": {
                  "enum": [
                    "none",
                    "state_active_duty",
                    "shorter_threshold",
                    "dependents_independent",
                    "faster_effective_date",
                    "lease_extension_right",
                    "landlord_notice_extension",
                    "other",
                    "multiple"
                  ],
                  "description": "What the state adds beyond the federal Servicemembers Civil Relief Act. none = the federal act alone, on the code-wide readings named in negative_basis; state_active_duty = state orders or National Guard duty covered; shorter_threshold = a deployment or transfer threshold below the federal act's; dependents_independent = a spouse or dependent may terminate in their own right; faster_effective_date = termination takes effect sooner than under the federal act; lease_extension_right = a statutory right to extend or renew the lease on return; landlord_notice_extension = a longer landlord notice period for a military household; other (rules_plain describes); multiple = more than one (extension_limbs lists them)."
                },
                "extension_limbs": {
                  "type": "array",
                  "uniqueItems": true,
                  "items": {
                    "enum": [
                      "state_active_duty",
                      "shorter_threshold",
                      "dependents_independent",
                      "faster_effective_date",
                      "lease_extension_right",
                      "landlord_notice_extension",
                      "other"
                    ]
                  },
                  "description": "Every limb present, listed only when state_extension is multiple; empty otherwise."
                },
                "rights_attach_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Any qualifier on when the state rights attach (only to leases signed after entering service; only on orders of a stated length; frozen to the federal act as it stood on a stated date). Null when none."
                },
                "rules_plain": {
                  "type": "string",
                  "minLength": 40,
                  "description": "The state military rule in plain language with its source, or for none a plain statement that the state adds nothing to the federal act."
                }
              }
            },
            "tenant_death": {
              "type": "object",
              "required": [
                "posture",
                "rules_plain"
              ],
              "additionalProperties": false,
              "properties": {
                "posture": {
                  "enum": [
                    "statutory",
                    "related_duties_only",
                    "none"
                  ],
                  "description": "statutory = a statute lets the estate or a representative end the lease on the tenant's death (or ends it by operation of law); related_duties_only = a statute addresses the deposit, rent, or property after death without a termination right; none = no statute gives a termination right, on the readings in negative_basis (a statute that says expressly that the lease survives death is described in rules_plain)."
                },
                "rules_plain": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Who may terminate, the notice, what rent is owed, the deposit and property, and any cosigner or estate rule. Required non-null when posture is statutory or related_duties_only; null for none."
                }
              }
            },
            "other_grounds_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Other statutory early-termination grounds for the tenant (casualty, unlawful ouster, repeated entry, a disability or care-facility move, a senior-housing move, the landlord's failure to deliver possession) with their mechanics — habitability termination is a pointer only. Null when none exists beyond the blocks above."
            }
          }
        },
        "abandonment": {
          "type": "object",
          "description": "Abandonment as a termination event: when the law treats the tenant as gone and the tenancy as ended. Disposal of property left behind belongs to the abandoned-property topic.",
          "required": [
            "trigger",
            "notice_days",
            "rebuttal_window_plain",
            "rules_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "trigger": {
              "type": "array",
              "minItems": 1,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "bright_line_absence",
                  "notice_and_response",
                  "mitigation_linked",
                  "evidence_of_surrender",
                  "default_plus_conduct",
                  "deemed_notice_on_discovery",
                  "none"
                ]
              },
              "description": "Every statutory shape present. bright_line_absence = absence for N days ends the tenancy by presumption (rules_plain states any rent or notice element); notice_and_response = the landlord serves a notice of belief and the tenant has a rebuttal window; mitigation_linked = abandonment starts the mitigation or re-letting duty rather than a presumption; evidence_of_surrender = the statute keys on facts showing the tenant has surrendered; default_plus_conduct = rent default plus stated conduct (removal of belongings, statements of intent); deemed_notice_on_discovery = the tenancy is treated as terminated when the landlord learns of the abandonment; none = no statute (the common law governs), on the readings in negative_basis."
            },
            "notice_days": {
              "type": [
                "integer",
                "null"
              ],
              "minimum": 0,
              "maximum": 400,
              "description": "The absence or response period the statute states, in days, when it states one. Null otherwise."
            },
            "rebuttal_window_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "How the tenant rebuts the presumption or answers the notice, and the two shapes where the statute has two. Null when no rebuttal mechanism exists."
            },
            "rules_plain": {
              "type": "string",
              "minLength": 60,
              "description": "The abandonment rule in plain language: the trigger facts, the period, the landlord's duties on re-entry, and the pointer to property disposal."
            }
          }
        },
        "notice_service": {
          "type": "object",
          "description": "How a termination notice must be delivered.",
          "required": [
            "methods_plain",
            "documents_plain",
            "electronic_permitted",
            "mail_added_days",
            "mail_rule_is_cap",
            "mail_addon_plain",
            "officer_service_required",
            "content_requirements_plain",
            "language_requirement_plain",
            "alternate_address_rule_plain"
          ],
          "additionalProperties": false,
          "properties": {
            "methods_plain": {
              "type": "string",
              "minLength": 40,
              "description": "The permitted delivery methods and any order of preference or cascade; where the statute states none for termination notices, a plain statement that no method is prescribed and what governs (the lease; the eviction notice rules by cross-reference)."
            },
            "documents_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Where the state requires more than one document to end a tenancy without cause (a termination notice and then a demand for possession), the sequence. Null when one notice suffices."
            },
            "electronic_permitted": {
              "enum": [
                "yes",
                "conditional",
                "no",
                "not_addressed"
              ],
              "description": "yes = the statute authorizes email or portal delivery for termination notices; conditional = only with written consent, a read receipt, or a lease clause; no = the statute lists methods and excludes electronic delivery; not_addressed = the statute is silent on the method or on electronic delivery."
            },
            "mail_added_days": {
              "type": [
                "integer",
                "null"
              ],
              "minimum": 0,
              "maximum": 30,
              "description": "Days added to the notice period when the notice is mailed, where the statute states a figure. Null otherwise."
            },
            "mail_rule_is_cap": {
              "type": [
                "boolean",
                "null"
              ],
              "description": "True where the mailing add-on is the outer limit the tenancy can be extended by mailing rather than an addition; null when mail_added_days is null."
            },
            "mail_addon_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "The scope of the mailing rule (which notices it reaches, which mail classes, whether the notice itself must state the added days). Null when no mailing rule exists."
            },
            "officer_service_required": {
              "type": "boolean",
              "description": "True where a termination notice must be served by a sheriff, constable, marshal, or process server."
            },
            "content_requirements_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "What the notice must contain (the termination date, the ground, statutory advisories, a form drawn from another title) and any signature or form rule. Null when the statute states no content rule."
            },
            "language_requirement_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Any requirement that the notice be given in a language other than English. Null when none."
            },
            "alternate_address_rule_plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Any statutory rule letting the tenant designate an alternate address or requiring the landlord to honor one for notices. Null when none."
            }
          }
        },
        "federal_overlay": {
          "type": "object",
          "description": "What federal law adds in this state and how the state's courts have read the federal 30-day notice rule. The state military extension is carried in tenant_early_termination.military.",
          "required": [
            "federal_overlay_note",
            "cares_30day_notice"
          ],
          "additionalProperties": false,
          "properties": {
            "federal_overlay_note": {
              "type": [
                "string",
                "null"
              ],
              "description": "Where the state's own law references, adopts, or extends a federal termination rule (the Servicemembers Civil Relief Act adopted as state law; a state statute keyed to federally assisted housing), in plain language. Null when the state's law references no federal rule."
            },
            "cares_30day_notice": {
              "type": "object",
              "required": [
                "status",
                "authority_plain",
                "as_of"
              ],
              "additionalProperties": false,
              "properties": {
                "status": {
                  "enum": [
                    "in_force_all_grounds",
                    "in_force_nonpayment_only",
                    "in_force_scope_undecided",
                    "in_force_filing_permitted_within_30d",
                    "held_expired",
                    "codified_narrow_by_statute",
                    "no_state_appellate_authority"
                  ],
                  "description": "How the CARES Act section 4024(c) 30-day notice for covered dwellings stands in this state's courts. in_force_all_grounds = a state appellate court holds it applies to every ground; in_force_nonpayment_only = held to apply to nonpayment only; in_force_scope_undecided = held in force, with the notice to run before the case is filed, in a case about unpaid rent where the court did not decide whether other grounds are reached; in_force_filing_permitted_within_30d = held in force but a filing inside the 30 days is permitted; held_expired = a state appellate court holds it lapsed; codified_narrow_by_statute = the state has written it into its own statute in a narrower form; no_state_appellate_authority = no state appellate decision construes it (the trial-court or administrative picture goes in authority_plain)."
                },
                "authority_plain": {
                  "type": "string",
                  "minLength": 30,
                  "description": "The decision or statute the status rests on (name, citation, court, year, holding in one sentence), or for no_state_appellate_authority a plain statement that no appellate decision construes the provision, naming any standing court order or trial-court practice a reader would meet."
                },
                "as_of": {
                  "type": "string",
                  "format": "date",
                  "description": "The date the appellate picture was last read. This cell goes stale faster than the statutes around it; the validator warns when it is more than 45 days old."
                }
              }
            }
          }
        },
        "provenance": {
          "type": "object",
          "description": "Whether the official code page's text departs from the enacted law, and on what reading. The flag is set only from a session-law read, never from a secondary source.",
          "required": [
            "published_text_differs_from_enacted",
            "kinds",
            "basis",
            "plain"
          ],
          "additionalProperties": false,
          "properties": {
            "published_text_differs_from_enacted": {
              "type": "boolean",
              "description": "True where the official code host's text of a section this record relies on differs from the enacted text (a section printed before its effective date; a section printed that never took effect; a host edition behind the last session; an applicability clause the code omits; a later act not yet reflected; a code page that inverts the act)."
            },
            "kinds": {
              "type": "array",
              "uniqueItems": true,
              "items": {
                "enum": [
                  "printed_early",
                  "never_in_force",
                  "host_lag",
                  "edition_split",
                  "applicability_not_codified",
                  "later_act_not_reflected",
                  "code_page_inverts_act"
                ]
              },
              "description": "Every shape present; empty when the flag is false."
            },
            "basis": {
              "enum": [
                "session_law_read",
                "none"
              ],
              "description": "session_law_read = the departure was established by reading the enrolled act or session-law chapter against the code text; none = no departure is claimed. The flag may be true only on session_law_read."
            },
            "plain": {
              "type": [
                "string",
                "null"
              ],
              "description": "Which section, how the published text differs, which text this record encodes and why. Required non-null when the flag is true; null otherwise."
            }
          }
        },
        "future_versions": {
          "type": "array",
          "description": "Signed acts with a future effective date that will change a value in this record: the text encoded today is the current law; each entry says what changes and when. Empty when none.",
          "items": {
            "type": "object",
            "required": [
              "act",
              "signed_on",
              "effective_on",
              "change_plain",
              "citation"
            ],
            "additionalProperties": false,
            "properties": {
              "act": {
                "type": "string",
                "description": "Act, chapter, or public-law number with the bill number."
              },
              "signed_on": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "effective_on": {
                "type": "string",
                "format": "date"
              },
              "change_plain": {
                "type": "string",
                "minLength": 40,
                "description": "What changes on the effective date, before and after, and which cells it moves."
              },
              "citation": {
                "type": "object",
                "required": [
                  "statute",
                  "url",
                  "official"
                ],
                "additionalProperties": false,
                "properties": {
                  "statute": {
                    "type": "string",
                    "description": "The enrolled act as cited."
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "The enrolled act on the legislature's own host."
                  },
                  "official": {
                    "type": "boolean"
                  },
                  "pinpoint": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              }
            }
          }
        },
        "pending_legislation": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/pendingItem"
          },
          "description": "Measures moving in the legislature that would change a value in this topic, with the same typed lifecycle discipline as record-level entries."
        },
        "notable_failed_legislation_plain": {
          "type": [
            "string",
            "null"
          ],
          "description": "A failed or vetoed measure a reader is likely to have heard of (a widely reported bill that did not become law), stated as failed with its session. Optional; null when nothing needs saying."
        },
        "negative_basis": {
          "type": "object",
          "description": "The named readings every negative posture in this topic rests on. Each field names the chapter, title, or code read and the terms run, so a negative is never a bare assertion. This block, like verified_by_method, is method register and is exempt from the narration gate.",
          "required": [
            "landlord_tenant_chapter",
            "dv_title",
            "military_title",
            "administrative_code"
          ],
          "additionalProperties": false,
          "properties": {
            "landlord_tenant_chapter": {
              "type": "string",
              "minLength": 20,
              "description": "The landlord-tenant chapter(s) read in full, including definitions and trailing sections, and the other chapters of the title opened."
            },
            "dv_title": {
              "type": [
                "string",
                "null"
              ],
              "description": "The domestic-violence, protective-order, or crime-victim title read and the terms run. Required non-null when dv.mechanism is none."
            },
            "military_title": {
              "type": [
                "string",
                "null"
              ],
              "description": "The military-affairs title read and the code-wide search terms run (civil relief, servicemember, National Guard). Required non-null when military.state_extension is none."
            },
            "administrative_code": {
              "type": [
                "string",
                "null"
              ],
              "description": "The administrative code titles read for fee or disclosure rules. Required non-null when early_termination_fees.posture is no_statute; where the administrative code could not be read, the fee posture's rules_plain must say the administrative rules were not consulted."
            }
          }
        },
        "leading_cases": {
          "description": "Court decisions this record relies on. A decision is listed only after its full text has been read in the official reporter or the court's own text. Required non-empty when mitigation.posture is case_law or statutory_and_case_law, when periodic_notice.mechanism is no_statute, when just_cause.local_preemption is case_law, or when cares_30day_notice.status rests on a state decision; optional elsewhere.",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "case_name",
                  "reporter_cite",
                  "court",
                  "year",
                  "holding_plain",
                  "url",
                  "residential_scope",
                  "applies_to"
                ],
                "additionalProperties": false,
                "properties": {
                  "case_name": {
                    "type": "string"
                  },
                  "reporter_cite": {
                    "type": "string",
                    "description": "Official reporter citation first; parallel cites after."
                  },
                  "court": {
                    "type": "string"
                  },
                  "year": {
                    "type": "integer",
                    "minimum": 1800,
                    "maximum": 2100
                  },
                  "holding_plain": {
                    "type": "string",
                    "minLength": 40,
                    "description": "What the decision held, in plain language scoped to this topic, no broader than the opinion supports."
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "A stable public source for the opinion text (the court's own site or a public case-law archive in the registry), when one exists."
                  },
                  "residential_scope": {
                    "enum": [
                      "residential",
                      "commercial",
                      "mixed_or_general",
                      "pre_modern"
                    ],
                    "description": "Whether the decision arose from a residential lease (residential), a commercial lease (commercial — its residential force is then a matter of the rules_plain wording), a general statement of law applied to both (mixed_or_general), or a decision old enough that the modern statutory scheme did not exist (pre_modern)."
                  },
                  "applies_to": {
                    "enum": [
                      "periodic_notice",
                      "just_cause",
                      "fixed_term",
                      "holdover",
                      "mitigation",
                      "early_termination_fees",
                      "tenant_early_termination",
                      "abandonment",
                      "notice_service",
                      "federal_overlay",
                      "general"
                    ],
                    "description": "The block the decision supports."
                  }
                }
              }
            }
          ]
        },
        "citations": {
          "$ref": "#/$defs/citations"
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "label",
              "text"
            ],
            "additionalProperties": false,
            "properties": {
              "label": {
                "type": "string",
                "maxLength": 80
              },
              "text": {
                "type": "string"
              }
            }
          },
          "description": "PUBLIC page copy (renders under Notes and caveats). Array of {label, text} bullets; carries the reader-relevant basis for every null field and every verified silence, and the pointers to the eviction, habitability, rent-increase, and locality pages where a question belongs elsewhere."
        }
      }
    },
    "mobile_home_parks": {
      "type": "object",
      "description": "Sixth topic (D-058, build started 2026-08-18): manufactured-home / mobile-home community lot tenancies — the community owner vs. a resident who owns the home and rents the lot. OPTIONAL while the 50-state build is in progress (eviction_process precedent); flips to required at 50/50. Every field in `fields` is a status cell: regulated (value + citation), not_regulated (a verified absence with the section that would carry it or the act's scope section as its citation), not_researched (build-failing). Field keys and value types are defined in src/lib/mhp.js and enforced by scripts/validate-data.mjs. Citations are official sources only (state legislature / agency / session law); the validator rejects any citation with official=false in this topic.",
      "required": [
        "topic_verified",
        "verified_by_method",
        "tier",
        "act_name",
        "act_citation",
        "fields",
        "fhfa_protections",
        "citations",
        "summary_plain"
      ],
      "additionalProperties": false,
      "properties": {
        "topic_verified": {
          "type": "string",
          "format": "date",
          "description": "Date this topic was verified against official sources. Only set by an actual verification."
        },
        "verified_by_method": {
          "type": "string",
          "description": "How verification was performed for this topic (sources read). The one field in the topic allowed to carry method register."
        },
        "tier": {
          "enum": [
            1,
            2,
            3,
            4
          ],
          "description": "1 = dedicated act + a named agency with a role in the tenancy + active legislation; 2 = free-standing act, thin or no institution; 3 = park rules embedded in general law or a single targeted section; 4 = no manufactured-home tenancy act (general landlord-tenant law, cited as fallback_act, or nothing)."
        },
        "act_name": {
          "type": [
            "string",
            "null"
          ],
          "description": "Popular or official name of the state's manufactured-home tenancy act. null only for tier 4."
        },
        "act_citation": {
          "type": [
            "string",
            "null"
          ],
          "description": "Chapter/article citation of the act, e.g. 'ORS 90.505–90.850'. null only for tier 4."
        },
        "fallback_act": {
          "type": [
            "string",
            "null"
          ],
          "description": "For tier 3–4: the general landlord-tenant act (or nothing) that governs a lot tenancy, stated so that statutory silence is never read as permission."
        },
        "fields": {
          "type": "object",
          "description": "One status cell per key in src/lib/mhp.js MHP_FIELDS (all keys required; the validator enforces the full set).",
          "additionalProperties": {
            "$ref": "#/$defs/mhpCell"
          }
        },
        "fhfa_protections": {
          "type": "object",
          "description": "The state's law mapped onto the eight GSE Tenant Site Lease Protections (FHFA Duty to Serve). meets = true only where a state statute requires the protection of every covered community; 'partial' where the statute grants a weaker or narrower version; false where state law is silent or contrary. basis is the plain sentence stating which rule satisfies or fails the cell.",
          "required": [
            "p1",
            "p2",
            "p3",
            "p4",
            "p5",
            "p6",
            "p7",
            "p8"
          ],
          "additionalProperties": false,
          "properties": {
            "p1": {
              "$ref": "#/$defs/fhfaCell"
            },
            "p2": {
              "$ref": "#/$defs/fhfaCell"
            },
            "p3": {
              "$ref": "#/$defs/fhfaCell"
            },
            "p4": {
              "$ref": "#/$defs/fhfaCell"
            },
            "p5": {
              "$ref": "#/$defs/fhfaCell"
            },
            "p6": {
              "$ref": "#/$defs/fhfaCell"
            },
            "p7": {
              "$ref": "#/$defs/fhfaCell"
            },
            "p8": {
              "$ref": "#/$defs/fhfaCell"
            }
          }
        },
        "pending_legislation": {
          "type": "array",
          "description": "Bills that would change any cell if enacted. Flag, do not incorporate.",
          "items": {
            "$ref": "#/$defs/pendingItem"
          }
        },
        "citations": {
          "$ref": "#/$defs/citations",
          "description": "The act itself (definitions/scope section first) and any agency page cited in the summary."
        },
        "summary_plain": {
          "$ref": "#/$defs/summary_plain"
        },
        "notes": {
          "oneOf": [
            {
              "type": [
                "string",
                "null"
              ]
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "label",
                  "text"
                ],
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string"
                  }
                }
              }
            }
          ],
          "description": "PUBLIC page copy (renders under Notes and caveats). Preferred: array of {label, text} bullets."
        }
      }
    }
  },
  "$defs": {
    "diRateTables": {
      "type": [
        "array",
        "null"
      ],
      "description": "Machine-readable rate series for the deposit-interest calculator. One entry per published series (a jurisdiction can carry more than one — e.g. an applied-rate series and a raw index). null for jurisdictions with no published series. Rows are windows: a null rate_percent is a waived, unpublished, or officially gapped period and MUST carry a note saying which — never interpolate an official gap.",
      "items": {
        "type": "object",
        "required": [
          "label",
          "mechanism_note",
          "source_url",
          "official",
          "series_status",
          "announced_by",
          "next_expected_announcement",
          "rows"
        ],
        "additionalProperties": false,
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 120
          },
          "mechanism_note": {
            "type": "string",
            "description": "How the series works and which periods each figure governs, in plain language."
          },
          "source_url": {
            "type": "string",
            "format": "uri"
          },
          "official": {
            "type": "boolean"
          },
          "series_status": {
            "enum": [
              "current",
              "closed"
            ],
            "description": "current = the publisher still announces new figures (freshness enforced via next_expected_announcement); closed = a historical series that will never grow (repealed duty, superseded series)."
          },
          "announced_by": {
            "type": [
              "string",
              "null"
            ],
            "description": "Who publishes the figure and on what cycle, e.g. 'Banking Commissioner, each December for the following calendar year'. null only for closed series."
          },
          "next_expected_announcement": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "When the next figure is due from the publisher (feeds the freshness gate and the annual rate calendar). null only for closed series."
          },
          "rows": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "period",
                "rate_percent"
              ],
              "additionalProperties": false,
              "properties": {
                "period": {
                  "type": "string",
                  "minLength": 4,
                  "description": "The window the figure governs, with a year, e.g. 'calendar year 2026' or 'March 1, 2026 – February 28, 2027'."
                },
                "from": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date"
                },
                "to": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date",
                  "description": "null = open-ended (the newest window)."
                },
                "rate_percent": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The annual rate as a percentage (0.49 = 0.49%/yr). null = waived, not published, or an official gap — note must say which."
                },
                "note": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "null_reason": {
                  "enum": [
                    "waived",
                    "unpublished",
                    "official_gap",
                    "no_duty"
                  ],
                  "description": "Required when rate_percent is null: waived = the publisher adopted a figure but the ordinance made payment optional or zero for the period; unpublished = a figure was (or may have been) owed but no official figure is published; official_gap = the official series itself skips the period; no_duty = the duty did not yet exist in the period. The note still carries the full story in prose."
                }
              }
            }
          }
        }
      }
    },
    "asfString": {
      "type": [
        "string",
        "null"
      ]
    },
    "asfBool": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "pendingItem": {
      "type": "object",
      "required": [
        "bill",
        "summary",
        "status",
        "checked",
        "lifecycle",
        "signed_on",
        "effective_on"
      ],
      "additionalProperties": false,
      "properties": {
        "bill": {
          "type": "string"
        },
        "summary": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "description": "Plain-language account of where the measure stands, from the official legislative record as of `checked`."
        },
        "checked": {
          "type": "string",
          "format": "date"
        },
        "lifecycle": {
          "enum": [
            "introduced",
            "passed_one_chamber",
            "passed_both_chambers",
            "signed",
            "vetoed",
            "dead",
            "none_pending"
          ],
          "description": "Stage of the measure as of `checked`: introduced (filed or in committee), passed_one_chamber, passed_both_chambers (awaiting executive action), signed (enacted; see effective_on for when the flagged change operates), vetoed, dead (failed, expired with its session, or postponed indefinitely), none_pending (a verified statement that no qualifying measure is pending)."
        },
        "signed_on": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "Date the measure was signed or enacted, where the official record states one; null otherwise."
        },
        "effective_on": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "Date the change this entry flags becomes operative law, where known; null otherwise. When this date arrives, the change is incorporated into the record's answers and the flag is cleared."
        }
      }
    },
    "mhpCell": {
      "type": "object",
      "required": [
        "status",
        "value",
        "citations"
      ],
      "additionalProperties": false,
      "properties": {
        "status": {
          "enum": [
            "regulated",
            "not_regulated",
            "not_researched"
          ]
        },
        "value": {
          "description": "Typed per src/lib/mhp.js; must be null unless status is regulated."
        },
        "detail": {
          "type": [
            "string",
            "null"
          ],
          "description": "Plain sentence qualifying the value: day-counting, thresholds, exemptions, or — for not_regulated — what governs instead (lease terms, general law)."
        },
        "citations": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/citations/items"
          }
        },
        "effective_from": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "Set when the value states a rule enacted but not yet in force on topic_verified; the page shows the current rule in detail and the pending one as dated."
        },
        "sub_state_variation": {
          "type": [
            "string",
            "null"
          ],
          "description": "Set when the rule applies only in part of the state (e.g. counties above a population threshold, jurisdictions that adopted a uniform act)."
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "status": {
                "const": "regulated"
              }
            }
          },
          "then": {
            "properties": {
              "value": {
                "not": {
                  "type": "null"
                }
              },
              "citations": {
                "minItems": 1
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "status": {
                "const": "not_regulated"
              }
            }
          },
          "then": {
            "properties": {
              "value": {
                "type": "null"
              },
              "citations": {
                "minItems": 1
              }
            }
          }
        }
      ]
    },
    "fhfaCell": {
      "type": "object",
      "required": [
        "meets",
        "basis",
        "citations"
      ],
      "additionalProperties": false,
      "properties": {
        "meets": {
          "enum": [
            true,
            false,
            "partial"
          ]
        },
        "basis": {
          "type": "string",
          "minLength": 20
        },
        "citations": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/citations/items"
          }
        }
      },
      "if": {
        "properties": {
          "meets": {
            "enum": [
              true,
              "partial"
            ]
          }
        }
      },
      "then": {
        "properties": {
          "citations": {
            "minItems": 1
          }
        }
      }
    },
    "citations": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "statute",
          "url",
          "official"
        ],
        "properties": {
          "statute": {
            "type": "string",
            "description": "e.g. 'MCL 554.602'"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Link to the statute on the official state legislature site whenever one exists"
          },
          "official": {
            "type": "boolean",
            "description": "true only for state-government sources"
          },
          "pinpoint": {
            "type": [
              "string",
              "null"
            ],
            "description": "Subsection, e.g. '(1)(a)'"
          }
        }
      }
    },
    "summary_plain": {
      "type": "string",
      "minLength": 100,
      "description": "Plain-language summary written specifically for this state. The first sentence must be the quotable answer-box sentence."
    }
  }
}