# DiseaseDef

> Kinbarrow modding reference — content tree `45d0fe274f851548`, version `0.2.0+main.c05ef2b`.

`diseases/<id>.srd.ron` — one disease per file; stem == id (the OPEN one-file-per-entity collection, the traps/feats/spells precedent). A disease is the SRD "Diseases" substrate: a CONTRACTION save that resists catching it, an INCUBATION delay before it takes hold, an EFFECT while afflicted (composed onto the exhaustion track / the conditions catalog / the ability-check seam), and a RECOVERY save track that throws it off — mirroring the exhaustion track's shape (a stored prop, absent-means-healthy, effects wired into existing seams, a periodic long-rest resolution). The DCs, dice, and save cadences are the SRD's; the primitives (which ability, the effect composition) are authored. A disease that afflicts nothing is refused by the validator. The real exposure VECTORS (a diseased bite, contaminated water/filth, a trap) are DEFERRED — contraction enters via a `disease::contract`/`try_contract` call, so worldgen infects no one and the season soak is byte-identical (sim-neutral by construction).

**Note on syntax:** these files are RON, not JSON. The shapes below are exact,
but punctuation follows RON — read a real `data/*.ron` file alongside.

## Fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `contraction` | `DiseaseSave` | required | The save that RESISTS contracting it (usually Con) — a success shrugs off exposure, a failure catches the disease. |
| `effect` | `DiseaseEffect` | required | The disease's effect while afflicted. |
| `id` | `string` | required |  |
| `incubation_days` | `uint32` | required | Days between exposure and the disease taking hold — its effects and its recovery saves begin only after incubation elapses (`disease::incubated`). |
| `name` | `string` | required |  |
| `recovery` | `DiseaseRecovery` | required | The long-rest recovery save track. |
| `source` | `Source` | required |  |

## Nested shapes

### Ability

The six ability scores (SRD 5.1). The engine's own `stats::Ability` is the runtime type; this is the data-layer mirror, bridged by [`Ability::engine`].

`Str`, `Dex`, `Con`, `Int`, `Wis`, `Cha`

### DiseaseEffect

A disease's EFFECT while afflicted — a BUNDLE of primitives, each composing with an EXISTING seam (the ledger-don't-fake rule): `exhaustion` levels INFLICTED at contraction (composed through the exhaustion track, so the whole penalty ladder — checks, speed, the L4 hit-point-maximum halving, death — lands for free); a `condition` id afflicted while diseased (the conditions catalog — the persistent OUT-OF-COMBAT condition timer's bubble consumption is LEDGERED, so `disease::afflicted_condition` REPORTS it, the trap-condition precedent); and a `check_penalty` folded into `stats::ability_check` (the attack-roll fold is LEDGERED — bubble-locality). A disease that afflicts NOTHING (no exhaustion, no condition, no penalty) has no consumer and is refused by the validator (the substrate-or-refuse rule). Every field serde-defaults, so a disease names only the effects it carries.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `check_penalty` | `int32` | default `0` | A signed modifier folded into ability checks while afflicted (Sight Rot's −1, its −1→−5 escalation LEDGERED). 0 = none. |
| `condition` | `string` | optional | A `conditions/` id afflicted while diseased — Sight Rot's blindness. Reported by `disease::afflicted_condition`; the durable bubble read is LEDGERED (the trap-condition precedent). Absent = none. |
| `exhaustion` | `uint8` | default `0` | Exhaustion levels inflicted at contraction — the Sewer Plague / Cackle Fever "one level of exhaustion." 0 = none. |

### DiseaseRecovery

A disease's RECOVERY rule — the SRD "at the end of each long rest, a DC N Con save; a number of successes ends it" shape: `successes` CONSECUTIVE successful saves of `ability` (usually Con) vs `dc` throw the affliction off (`disease::tick_recovery`, on the long rest — the exhaustion-recovery cadence). A FAILED save resets the success streak (the "M failures worsen it" clause — the escalating-severity worsen, and the herb/magical cures Sight Rot specifically needs, are LEDGERED). `dc` is `u32` (≥ 0 by type); `successes` must be ≥ 1 (0 would never cure) — both validator-checked.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ability` | `Ability` | required | The recovery save ability (usually Con). |
| `dc` | `uint32` | required | The save DC (≥ 0 by type). |
| `successes` | `uint32` | required | Consecutive successful saves that throw the disease off (≥ 1). |

### DiseaseSave

A saving throw a disease demands — the CONTRACTION save that resists catching it: an ability (usually Con) vs a DC. The DC is `u32`, so it is ≥ 0 by type (the trap-DC precedent — the "save DCs ≥ 0" invariant). The real exposure VECTORS (a diseased bite, contaminated water, a trap) are DEFERRED — a `disease::contract`/`try_contract` call is the door tests exercise now (the exhaustion-source ledger precedent).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ability` | `Ability` | required | The saving-throw ability (usually Con). |
| `dc` | `uint32` | required | The save DC (≥ 0 by type). |

### Source

Every file's top-level value carries `source`.

#### Source::Srd51

SRD 5.1 — the System Reference Document, the shipped baseline.

#### Source::Original

Original content authored for this game (not from the SRD).

#### Source::Personal

A player's own transcription or third-party content in a mod tree — provenance stays honest without borrowing the base tree's markers. Never used by shipped files.

