# Good

> Kinbarrow modding reference — content tree `b2f73c2ab65ff925`, version `0.2.0+main.a22009f4c`.

`goods/<id>.ron` — OURS (`source: Original`), one material/tool per file.

**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 |
| --- | --- | --- | --- |
| `acquisition` | `string` | optional | A non-crafting source (future loot/quest goods); absent everywhere today. |
| `cargo_cap` | `integer` | optional | Additional cargo capacity in units of twenty pounds. Absent = this good adds no carrying capacity. |
| `demand_target` | `integer` | optional | Authored scarcity `DEMAND_TARGET`; absent = the engine default. World tail passes may still re-derive it (demand IS the eaters). |
| `fuel_nights` | `integer` | optional | Nights one unit lights a venue; absent = not fuel. Genesis stamps this on the concept (`FUEL_NIGHTS`) for graph-only light reads. |
| `furnishing` | `FurnishingInfo` | optional | Furnishings dress owned venues at genesis and, when bulky, stand as board cover. Absent = not a furnishing. |
| `id` | `string` | required | Authored id. |
| `maker_mark` | `boolean` | default `false` | Each produced unit is an intact object bearing its maker's physical mark. Defaults to false (loose goods). A recipe is required; consuming or cutting the object destroys its recognition. A mark records its maker, never stolen status or the identity of an offender. |
| `material` | `MaterialInfo` | optional | Per-material deviations, present only on constructive materials; absent = not a material. |
| `name` | `string` | required | Authored name. |
| `quality_class` | `string` | optional | A `tables/quality_profiles.ron` class override where structure can't derive it; absent = derive. |
| `quality_overrides` | `TierEffects[]` | optional | Deviations from the item's class profile; empty by default. |
| `recipes` | `Recipe[]` | required | The good's recipes — craftable IS having recipes (there is no craftable flag). |
| `sacred` | `boolean` | default `false` | The shrine's flag (`SACRED`): the piety weight prefers pew over pint by prop, never by name match. |
| `satisfies` | `string` | optional | The need this good satisfies: `"hunger"` or `"recreation"`; the validator rejects other values. This mapping belongs to the good across campaigns. |
| `source` | `Source` | required | Authored source. |
| `spoilage_days` | `integer` | optional | Days before it rots (raw hide, fish, bread); absent = imperishable. |
| `weight_lb` | `double` | required | Weight in pounds — feeds cart loads. |

## Nested shapes

<a id="ability"></a>

### Ability

An open, validated Ability id interned from authored data.

<a id="craft-tier"></a>

### CraftTier

The tool-proficiency ladder — one ladder, two homes (this IS the engine's `TradeTier`).

<a id="craft-tier--apprentice"></a>

#### CraftTier::Apprentice

Select the apprentice behavior.

<a id="craft-tier--journeyman"></a>

#### CraftTier::Journeyman

Select the journeyman behavior.

<a id="craft-tier--master"></a>

#### CraftTier::Master

Select the master behavior.

<a id="furnishing-anchor"></a>

### FurnishingAnchor

Where a bulky furnishing stands: hugging a wall, or free in the room's middle.

<a id="furnishing-anchor--wall"></a>

#### FurnishingAnchor::Wall

Against a wall — the bench, the rack, the bin.

<a id="furnishing-anchor--center"></a>

#### FurnishingAnchor::Center

Free-standing mid-room — the millstone, the great table.

<a id="furnishing-info"></a>

### FurnishingInfo

A furnishing's light, room roles, anchor, and physical cells. Worth stays the good's own derivation (never duplicated); weight stays `weight_lb`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `anchor` | `FurnishingAnchor` | optional | How a bulky piece stands in its room; a closed set. |
| `art` | `string` | required | The picture the board draws for this piece: a path inside an `art/` directory, e.g. `"furniture/trestle-table.webp"`. Drawn facing north, `width_cells` across and `length_cells` down, with the back edge at the top; the board rotates it for the other facings. A mod's `art/` is searched before `data/art/`, so shipping the same path replaces the base picture. A path that resolves nowhere fails the load. |
| `footprint` | `GridFootprint` | optional | The piece's mechanical rectangle. Orientation is chosen cardinally when the deterministic board dressing places the individual piece. |
| `rooms` | `string[]` | default `[]` | Room ROLES this piece dresses, validated against building programs. Empty = a trinket that casts no shadow. |
| `sheds_light` | `boolean` | default `false` | Does the piece LIGHT its room? The lamp does; the mug does not. |

<a id="grid-footprint"></a>

### GridFootprint

A furnishing's rectangular physical space in integer 5-foot cells. The default is one cell; both dimensions must be at least one.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `length_cells` | `uint8` | required | Length from the furnishing's front to its back. |
| `width_cells` | `uint8` | required | Width across the furnishing's front. |

<a id="material-info"></a>

### MaterialInfo

Present only on CONSTRUCTIVE materials (iron/mithral ingot, timber, leather, wool cloth). Family baselines live on the material-class registry; these are the per-material deviations.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `class` | `string` | required | A `tables/material_classes.ron` id (metal/wood/leather/cloth), boot-resolved. |
| `integrity_factor` | `double` | required | Object-hp multiplier (mithral 4.0). |
| `min_tier` | `CraftTier` | required | The CraftTier floor to work it at all (mithral: Expert). |
| `quality_bias` | `int32` | required | Lifts the craft check that ROLLS the tier (mithral +4): better stock, better odds. |
| `rarity` | `Rarity` | required | Worldgen rarity hint for the material. |
| `strength_note` | `string` | required | Durability/strength as prose; a later engine consumer reads it. |
| `toughness_bonus` | `int32` | required | Bonus over the class hardness (mithral +3). |
| `value_factor` | `double` | required | Value multiplier on constructed items (mithral 10.0). |
| `weight_factor` | `double` | required | Weight vs the class baseline (mithral 0.5). |
| `work_difficulty` | `int32` | required | Extra labour, pairs with `min_tier` gating (mithral +5); never touches the quality roll. |

<a id="quality-tier"></a>

### QualityTier

The seven quality tiers (semantic — engine code branches on it).

<a id="quality-tier--trash"></a>

#### QualityTier::Trash

Select the trash behavior.

<a id="quality-tier--poor"></a>

#### QualityTier::Poor

Select the poor behavior.

<a id="quality-tier--normal"></a>

#### QualityTier::Normal

Select the normal behavior.

<a id="quality-tier--good"></a>

#### QualityTier::Good

Select the good behavior.

<a id="quality-tier--excellent"></a>

#### QualityTier::Excellent

Select the excellent behavior.

<a id="quality-tier--masterwork"></a>

#### QualityTier::Masterwork

Select the masterwork behavior.

<a id="quality-tier--legendary"></a>

#### QualityTier::Legendary

Select the legendary behavior.

<a id="rarity"></a>

### Rarity

Worldgen rarity hint.

<a id="rarity--common"></a>

#### Rarity::Common

Select the common behavior.

<a id="rarity--uncommon"></a>

#### Rarity::Uncommon

Select the uncommon behavior.

<a id="rarity--rare-regional"></a>

#### Rarity::RareRegional

Select the rare regional behavior.

<a id="recipe"></a>

### Recipe

A recipe embedded on a good/weapon/armor. Craftable IS having recipes — there is no craftable flag (`data/README.md`).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ability` | `Ability` | optional | The ability whose mod feeds output; absent = untrained extraction. |
| `building` | `string` | required | The building TYPE that produces this good (a `data/buildings/` id, boot-resolved): a recipe names its building directly, and the build-time derivation mints one `Produces` edge at every venue of that type. Producing vs merely crafting is NOT authored: every recipe is a candidate `Produces` edge and the opportunity-cost engine (`best_row`) decides what a shift makes. The only recipes that do not derive an edge are those the 2-input edge model cannot hold (3+ distinct inputs) — a substrate limit, ledgered, not a producibility flag. |
| `forbids_terrain` | `string[]` | default `[]` | The exclusion half of the terrain GATE (see `requires_terrain`): the recipe is skipped at any venue whose town bears one of these tags. |
| `hours` | `uint32` | required | Worked hours committed before reconsidering the chosen recipe. |
| `inputs` | `[RecipeInput, uint32][]` | required | The (input, qty) pairs consumed per batch — boot-resolved. EMPTY = raw extraction (nature's own yield): such a recipe names WHERE and HOW FAST a raw is won, carries no `CRAFTED` flag, and keeps the extraction lottery. A recipe WITH inputs is a craft (sets `CRAFTED`). |
| `rate` | `double` | required | Units per worked hour, before the work multiplier. The recipe carries it, so production truth lives in one place. |
| `requires_terrain` | `string[]` | default `[]` | Terrain GATE: this recipe is wired only at venues whose town bears every `requires_terrain` tag and NONE of `forbids_terrain`. Lets a good be made two ways by place — coast/vale bread bakes `flour` where an `arable` mill stands; the mountain bakes `grain` direct where it does not. Empty gates = wire wherever the building stands. |
| `strike` | `Strike` | optional | The face's RARE find: each produced unit has `odds` chance of striking this good instead of the bulk yield — the mithral vein in the stone. Absent on ordinary recipes. |
| `terrain_mods` | `[string, double][]` | default `[]` | Terrain-tag rate MODIFIERS: the effective production rate at a venue is `rate × Π(multiplier for each town terrain tag present)`. Regional divergence emerges from the GROUND, not hand-wired per venue — grain grows richer on `arable`, an ore seam runs faster in `mountains`. Empty = the base rate stands everywhere the recipe is wired. |
| `tier` | `CraftTier` | required | The tool-proficiency floor to run this recipe. |
| `tool` | `string` | optional | A goods/ id (e.g. "smiths_tools"); absent = bare hands. |
| `yield` | `uint32` | required | Units one run of `inputs` yields. Production consumes those inputs once and spends any open units before starting another run. The worth derivation divides materials by this yield; labour is already per unit through `rate`. Explicit in EVERY recipe — the RON key is `yield`; the no-serde-default contract's one exception is `quality_overrides`, and this is not it (`1` for a single-unit craft). |

<a id="recipe-input"></a>

### RecipeInput

A recipe input: a SPECIFIC good (process inputs) or ANY material of a class (constructive inputs — the family wall).

<a id="recipe-input--good"></a>

#### RecipeInput::Good

A SPECIFIC good by id — the exact material a process consumes.

Carries `string`.

<a id="recipe-input--class"></a>

#### RecipeInput::Class

ANY good of a material CLASS by id — the constructive input (the family wall): whichever member of the class is on hand.

Carries `string`.

<a id="source"></a>

### Source

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

<a id="source--srd51"></a>

#### Source::Srd51

SRD 5.1 — retained nonconflicting catalogue material.

<a id="source--srd52"></a>

#### Source::Srd52

SRD 5.2.1 — the 2024-revision System Reference Document, the same CC-BY-4.0 grant as 5.1 and the current rules chassis. Its files carry the `.srd52.ron` suffix so provenance reads off the path; see `data/README.md` for which document rules a given value.

<a id="source--original"></a>

#### Source::Original

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

<a id="source--phb2024"></a>

#### Source::Phb2024

Material transcribed from the 2024 Player's Handbook. This source is not redistributable by this project and belongs in a `phb2024` mod.

<a id="source--dmg2024"></a>

#### Source::Dmg2024

Material transcribed from the 2024 Dungeon Master's Guide. This source is not redistributable by this project and belongs in a `dmg2024` mod.

<a id="source--mm2024"></a>

#### Source::Mm2024

Material transcribed from the 2024 Monster Manual. This source is not redistributable by this project and belongs in an `mm2024` mod.

<a id="source--tce"></a>

#### Source::Tce

Material transcribed from Tasha's Cauldron of Everything. This source is not redistributable by this project and belongs in a `tce` mod.

<a id="source--xge"></a>

#### Source::Xge

Material transcribed from Xanathar's Guide to Everything. This source is not redistributable by this project and belongs in an `xge` mod.

<a id="strike"></a>

### Strike

A strike table entry: the rare good and its per-unit odds.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `good` | `string` | required | The rare good struck — a goods/ id, boot-resolved. |
| `mods` | `[string, double][]` | default `[]` | Terrain-tag odds MODIFIERS, the `terrain_mods` rule applied to the strike: the effective chance at a venue is `odds × Π(multiplier for each town terrain tag present)`, clamped to a probability. A richer vein is GROUND, not a hand-wired deposit — the same seam runs fatter where the rock says so. Empty = `odds` stands everywhere the recipe is wired. |
| `odds` | `double` | required | Per-unit chance (0..1) of striking `good` instead of the bulk yield. |

<a id="tier-effects"></a>

### TierEffects

One rung of the seven-tier quality ladder: what an item of this tier is worth and how it performs, as deltas off the Normal baseline. A class-wide row in a `QualityProfile`, or a single item's override of one.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ac_delta` | `integer` | optional | AC delta at this tier (armor); absent = n/a. |
| `attack_delta` | `integer` | optional | Attack-roll delta at this tier (weapons); absent = n/a. |
| `damage_delta` | `integer` | optional | Damage delta at this tier (weapons); absent = n/a. |
| `dc_delta` | `integer` | optional | Lock DC delta vs the Normal DC 10 base at this tier (locks); absent = n/a. |
| `integrity_factor` | `number` | optional | Max-integrity multiplier (the `structure` class) — defaulted so the arms/tool/lock profiles never spell it. |
| `tier` | `QualityTier` | required | The quality tier this row describes. |
| `value_factor` | `double` | required | Worth multiplier at this tier (every class). |
| `work_factor` | `number` | optional | Work-output multiplier at this tier (tools); absent = n/a. |


