{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "$id": "https://github.com/Bobikobi/GAME/schema/json/params.schema.json",
  "type": "object",
  "required": [
    "format",
    "id",
    "title",
    "creator",
    "type",
    "params"
  ],
  "properties": {
    "$schema": {
      "type": "string"
    },
    "format": {
      "description": "Format version of this file.",
      "const": 1,
      "type": "number"
    },
    "id": {
      "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
      "maxLength": 80,
      "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
      "type": "string"
    },
    "title": {
      "minLength": 1,
      "maxLength": 40,
      "type": "string"
    },
    "creator": {
      "pattern": "^[a-z0-9_-]+$",
      "maxLength": 39,
      "description": "GitHub handle, lowercase.",
      "type": "string"
    },
    "description": {
      "minLength": 1,
      "maxLength": 240,
      "type": "string"
    },
    "ai_tools": {
      "maxItems": 8,
      "description": "AI tools used to make this file or its art. Required when any were used.",
      "type": "array",
      "items": {
        "minLength": 1,
        "maxLength": 60,
        "type": "string"
      }
    },
    "items": {
      "maxItems": 40,
      "type": "array",
      "items": {
        "additionalProperties": false,
        "type": "object",
        "required": [
          "id",
          "name",
          "kind",
          "rarity",
          "sprite",
          "weight"
        ],
        "properties": {
          "id": {
            "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
            "maxLength": 80,
            "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
            "type": "string"
          },
          "name": {
            "minLength": 1,
            "maxLength": 40,
            "type": "string"
          },
          "description": {
            "minLength": 1,
            "maxLength": 240,
            "type": "string"
          },
          "kind": {
            "anyOf": [
              {
                "const": "material",
                "type": "string"
              },
              {
                "const": "food",
                "type": "string"
              },
              {
                "const": "tool",
                "type": "string"
              },
              {
                "const": "fragment",
                "type": "string"
              },
              {
                "const": "treasure",
                "type": "string"
              }
            ]
          },
          "rarity": {
            "description": "Declared rarity. The check compares it with the rarity computed from the data.",
            "anyOf": [
              {
                "const": "common",
                "type": "string"
              },
              {
                "const": "uncommon",
                "type": "string"
              },
              {
                "const": "rare",
                "type": "string"
              },
              {
                "const": "legendary",
                "type": "string"
              }
            ]
          },
          "class": {
            "description": "A base class (plant, wood, fibre, ...) or the id of a class an extension declares under one of them.",
            "anyOf": [
              {
                "const": "plant",
                "type": "string"
              },
              {
                "const": "wood",
                "type": "string"
              },
              {
                "const": "fibre",
                "type": "string"
              },
              {
                "const": "stone",
                "type": "string"
              },
              {
                "const": "clay",
                "type": "string"
              },
              {
                "const": "mineral",
                "type": "string"
              },
              {
                "const": "metal",
                "type": "string"
              },
              {
                "const": "animal",
                "type": "string"
              },
              {
                "const": "meal",
                "type": "string"
              },
              {
                "const": "tool",
                "type": "string"
              },
              {
                "const": "garment",
                "type": "string"
              },
              {
                "const": "jewelry",
                "type": "string"
              },
              {
                "const": "relic",
                "type": "string"
              },
              {
                "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
                "maxLength": 80,
                "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
                "type": "string"
              }
            ]
          },
          "family": {
            "pattern": "^[a-z0-9_-]+$",
            "maxLength": 24,
            "description": "A group inside the class, for example \"berry\" for every berry. Open: any lowercase word.",
            "type": "string"
          },
          "tags": {
            "maxItems": 8,
            "uniqueItems": true,
            "description": "Open words that describe it, for example \"sweet\" or \"night\".",
            "type": "array",
            "items": {
              "pattern": "^[a-z0-9_-]+$",
              "maxLength": 24,
              "description": "A lowercase word.",
              "type": "string"
            }
          },
          "tier": {
            "minimum": 1,
            "maximum": 20,
            "description": "How advanced it is, from 1. The rarity says how often it appears; the tier says how far up the ladder it is. A tool has the tier of its \"tool\".",
            "type": "integer"
          },
          "sprite": {
            "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+:[a-z0-9_/-]+$",
            "maxLength": 120,
            "description": "A frame of an art kit: \"<kit id>:<frame name>\", for example \"core/base-kit:items/berry\".",
            "type": "string"
          },
          "weight": {
            "minimum": 0,
            "maximum": 20,
            "description": "How heavy one unit is (DECISIONS.md, 2026-10-23): 0 for herbs, seeds and coins, 1 for most things, 3 for logs, stone and ore. The load against the weight limit sets the walking pace.",
            "type": "integer"
          },
          "food": {
            "additionalProperties": false,
            "type": "object",
            "required": [
              "satiety"
            ],
            "properties": {
              "satiety": {
                "minimum": 0,
                "maximum": 100,
                "description": "Health points restored when eaten (the meter holds 100 at the start). 0 for a food that only hurts.",
                "type": "integer"
              },
              "hurt": {
                "minimum": 1,
                "maximum": 100,
                "description": "Health points it takes when eaten, at any hour: a bad fruit or a raw herb (G30).",
                "type": "integer"
              }
            }
          },
          "tool": {
            "additionalProperties": false,
            "type": "object",
            "required": [
              "kind",
              "tier"
            ],
            "properties": {
              "kind": {
                "anyOf": [
                  {
                    "const": "basket",
                    "type": "string"
                  },
                  {
                    "const": "trowel",
                    "type": "string"
                  },
                  {
                    "const": "axe",
                    "type": "string"
                  },
                  {
                    "const": "staff",
                    "type": "string"
                  },
                  {
                    "const": "hammer",
                    "type": "string"
                  },
                  {
                    "const": "pick",
                    "type": "string"
                  },
                  {
                    "const": "rod",
                    "type": "string"
                  }
                ]
              },
              "tier": {
                "minimum": 1,
                "maximum": 5,
                "description": "Better tools work faster. The calculator clamps the total.",
                "type": "integer"
              },
              "uses": {
                "minimum": 1,
                "maximum": 1000,
                "description": "The tool wears out after this many uses. Left out, the tool lasts (DECISIONS.md, 2026-10-09: the crafting economy).",
                "type": "integer"
              }
            }
          },
          "fragment": {
            "additionalProperties": false,
            "description": "A found scrap that teaches a recipe.",
            "type": "object",
            "required": [
              "unlocks"
            ],
            "properties": {
              "unlocks": {
                "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
                "maxLength": 80,
                "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
                "type": "string"
              }
            }
          },
          "wear": {
            "additionalProperties": false,
            "description": "Something the character wears (DECISIONS.md, 2026-10-09: the upgrade). A worn item stays in the bag; it takes no place there, but its weight counts (2026-10-23).",
            "type": "object",
            "required": [
              "slot"
            ],
            "properties": {
              "slot": {
                "description": "Where it is worn: head, top, legs (trousers), outfit (takes the top and the legs), feet, jewelry (two places), hand (a tool) or back (one bag or one quiver).",
                "anyOf": [
                  {
                    "const": "head",
                    "type": "string"
                  },
                  {
                    "const": "top",
                    "type": "string"
                  },
                  {
                    "const": "legs",
                    "type": "string"
                  },
                  {
                    "const": "outfit",
                    "type": "string"
                  },
                  {
                    "const": "feet",
                    "type": "string"
                  },
                  {
                    "const": "jewelry",
                    "type": "string"
                  },
                  {
                    "const": "hand",
                    "type": "string"
                  },
                  {
                    "const": "back",
                    "type": "string"
                  }
                ]
              },
              "look": {
                "description": "A look: worn on the look layer over the work clothes. It shows and counts for nothing, so it has no effects and no set.",
                "type": "boolean"
              },
              "effects": {
                "minItems": 1,
                "maxItems": 2,
                "description": "Small bonuses while it is worn on the work layer. Two at most, each effect once.",
                "type": "array",
                "items": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "effect",
                    "value"
                  ],
                  "properties": {
                    "effect": {
                      "description": "What a worn item helps: gathering, digging or crafting speed, the craft chance, or rare finds.",
                      "anyOf": [
                        {
                          "const": "gather_speed_pct",
                          "type": "string"
                        },
                        {
                          "const": "dig_speed_pct",
                          "type": "string"
                        },
                        {
                          "const": "craft_speed_pct",
                          "type": "string"
                        },
                        {
                          "const": "craft_chance_pct",
                          "type": "string"
                        },
                        {
                          "const": "rare_find_pct",
                          "type": "string"
                        }
                      ]
                    },
                    "value": {
                      "minimum": 1,
                      "maximum": 100,
                      "description": "Percent, at most the cap of the item's tier (params.wear_effect_max_pct).",
                      "type": "integer"
                    }
                  }
                }
              },
              "set": {
                "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
                "maxLength": 80,
                "description": "A set of one creator: when every piece of it is worn, their effects grow by params.wear_set_bonus_pct.",
                "type": "string"
              },
              "places": {
                "minimum": 1,
                "maximum": 99,
                "description": "A bag on the back: the places it gives, instead of the hands' `bag_base`. Only a work piece on the back carries it (DECISIONS.md, 2026-10-23).",
                "type": "integer"
              },
              "load_bonus": {
                "minimum": 1,
                "maximum": 100,
                "description": "A bag on the back that moves the load to the hips: what it adds to the weight limit (`load.base` + might). Needs `places`.",
                "type": "integer"
              }
            }
          },
          "grade": {
            "additionalProperties": false,
            "description": "A finer grade of another item: the same good off a better animal. A stack splits by grade the way it splits by tier, so each grade is an item of its own; it keeps the plain item's class, kind, tier and value, and a recipe asks for it with \"min_grade\".",
            "type": "object",
            "required": [
              "of",
              "step"
            ],
            "properties": {
              "of": {
                "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
                "maxLength": 80,
                "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
                "type": "string"
              },
              "step": {
                "minimum": 2,
                "maximum": 3,
                "description": "2 is fine, 3 is true. A grade is read as a pose on the screen, never as a number (HUNTING section 5).",
                "type": "integer"
              }
            }
          },
          "premium_later": {
            "description": "Marks a look that may also be sold for premium currency once stage 6 brings it. Only a look item with no effect may carry it, and it stays obtainable in the game (DECISIONS.md, 2026-10-09).",
            "type": "boolean"
          }
        }
      }
    },
    "classes": {
      "maxItems": 10,
      "description": "Classes of your own, each under one base class.",
      "type": "array",
      "items": {
        "additionalProperties": false,
        "description": "A class of your own, declared under one base class. Every rule written for the base class holds for it.",
        "type": "object",
        "required": [
          "id",
          "name",
          "base"
        ],
        "properties": {
          "id": {
            "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
            "maxLength": 80,
            "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
            "type": "string"
          },
          "name": {
            "minLength": 1,
            "maxLength": 40,
            "type": "string"
          },
          "base": {
            "description": "plant (leaves, herbs, berries, fruit, roots, mushrooms), wood, fibre (reeds, grass, thread, cloth), stone, clay (clay, sand, pottery, brick), mineral (crystals, gems, salt, ore), metal (waits for its discovery), animal (feathers, wool, hide, bone), meal (cooked food), tool, garment (worn clothes), jewelry, relic (old things from the ruins).",
            "anyOf": [
              {
                "const": "plant",
                "type": "string"
              },
              {
                "const": "wood",
                "type": "string"
              },
              {
                "const": "fibre",
                "type": "string"
              },
              {
                "const": "stone",
                "type": "string"
              },
              {
                "const": "clay",
                "type": "string"
              },
              {
                "const": "mineral",
                "type": "string"
              },
              {
                "const": "metal",
                "type": "string"
              },
              {
                "const": "animal",
                "type": "string"
              },
              {
                "const": "meal",
                "type": "string"
              },
              {
                "const": "tool",
                "type": "string"
              },
              {
                "const": "garment",
                "type": "string"
              },
              {
                "const": "jewelry",
                "type": "string"
              },
              {
                "const": "relic",
                "type": "string"
              }
            ]
          },
          "description": {
            "minLength": 1,
            "maxLength": 240,
            "type": "string"
          }
        }
      }
    },
    "type": {
      "const": "params",
      "type": "string"
    },
    "params": {
      "additionalProperties": false,
      "type": "object",
      "required": [
        "k_permille",
        "k_craft_permille",
        "r_mg_per_value_ms",
        "t_min_ms",
        "max_action_ms",
        "effort_permille",
        "power_cap_permille",
        "rarity_budget_permille",
        "open_tiers",
        "tier_min_level",
        "template_max_recipes",
        "craft_chance_bp",
        "craft_level_step_bp",
        "craft_luck_max_permille",
        "craft_miss_keep_pct",
        "wear_effect_max_pct",
        "wear_set_bonus_pct",
        "rarity_bonus_ms",
        "drift_budget_permille",
        "hp_cap",
        "day_length_ms",
        "walk_step_ms",
        "hp_low_pct",
        "fire",
        "hazard",
        "bag_base",
        "place_stack",
        "load",
        "gait",
        "hunt",
        "wild",
        "starting_gold_mg",
        "per_point"
      ],
      "properties": {
        "k_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "light": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "keys"
          ],
          "properties": {
            "keys": {
              "minItems": 2,
              "maxItems": 12,
              "description": "The hours the valley is washed in a colour (ART_SYSTEM section 2, LIGHTING.md section 5): one shade that the scene multiplies in, the dusk and the night alike. Its strength steps evenly between keys, in whole percent; its colour is the next key's, so every minute is a palette colour. The owner's pick of 30.10: 16:30 #eda83a 12%, 17:30 28%, 19:00 #e2533f 40%, the night #172a52 at STYLE 5's 92%.",
              "type": "array",
              "items": {
                "additionalProperties": false,
                "type": "object",
                "required": [
                  "at",
                  "tint",
                  "pct"
                ],
                "properties": {
                  "at": {
                    "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
                    "description": "The hour and minute the wash is at its own strength, for example \"16:30\".",
                    "type": "string"
                  },
                  "tint": {
                    "pattern": "^#[0-9a-f]{6}$",
                    "description": "The colour the scene is multiplied by at that hour.",
                    "type": "string"
                  },
                  "pct": {
                    "minimum": 0,
                    "maximum": 100,
                    "description": "How strong the wash is at that hour, in whole percent. The hours between two keys step evenly.",
                    "type": "integer"
                  }
                }
              }
            },
            "read": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "floor",
                "fog"
              ],
              "properties": {
                "floor": {
                  "minimum": 0,
                  "maximum": 100,
                  "description": "The night kept readable (the owner, 30.10): inside a light's pool and in the ring of three tiles around the player, the meadow's middle green keeps at least this luma, in whole percent.",
                  "type": "integer"
                },
                "fog": {
                  "minimum": 0,
                  "maximum": 100,
                  "description": "The most a fog bank may cover at full night, in whole percent, so fog cannot stack on the night's shade past the floor.",
                  "type": "integer"
                }
              }
            },
            "sun": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "alpha",
                "cap",
                "keys"
              ],
              "properties": {
                "alpha": {
                  "minimum": 0,
                  "maximum": 100,
                  "description": "How dark the cast shadow is, in whole percent (STYLE section 4: 30).",
                  "type": "integer"
                },
                "cap": {
                  "minimum": 0,
                  "maximum": 200,
                  "description": "The longest a shadow may be, in percent of the caster's height (STYLE section 4: 110).",
                  "type": "integer"
                },
                "keys": {
                  "minItems": 2,
                  "maxItems": 12,
                  "description": "The sun's shear by hour (STYLE section 4): the shadow leans right and toward the viewer by these shares of the caster's height, so a negative `down` is the sun in the south and the shadow falling away, up-screen. The hours between two keys step evenly; outside the first and the last the sun is down.",
                  "type": "array",
                  "items": {
                    "additionalProperties": false,
                    "type": "object",
                    "required": [
                      "at",
                      "right",
                      "down"
                    ],
                    "properties": {
                      "at": {
                        "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
                        "description": "The hour and minute the sun is at its own shear, for example \"16:30\".",
                        "type": "string"
                      },
                      "right": {
                        "minimum": -200,
                        "maximum": 200,
                        "description": "How far the shadow leans right, in percent of the caster's height; negative in the morning, positive in the evening.",
                        "type": "integer"
                      },
                      "down": {
                        "minimum": -100,
                        "maximum": 100,
                        "description": "How far the shadow leans toward the viewer, in percent of the caster's height; negative when the sun stands south (STYLE section 4: the shadow falls up-screen, away from the viewer, behind the caster).",
                        "type": "integer"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "k_craft_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "What the trader pays for a made good, an item whose value comes from a recipe, per mille of r * V; k_permille holds for the rest. At least k_permille and always below 1000, so the trader never pays what the shop charges (DECISIONS.md, 2026-10-09: the crafting economy)."
        },
        "r_mg_per_value_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "t_min_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "max_action_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "effort_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "easy",
            "medium",
            "craft",
            "hard"
          ],
          "properties": {
            "easy": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "medium": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "craft": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "hard": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            }
          }
        },
        "power_cap_permille": {
          "minItems": 1,
          "maxItems": 40,
          "description": "P(level): the clamp on any rate multiplier, by character level (1-based).",
          "type": "array",
          "items": {
            "minimum": 1000,
            "maximum": 10000,
            "type": "integer"
          }
        },
        "rarity_budget_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "open_tiers": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The highest item tier the world has opened. A stage or a new town opens the next one."
        },
        "tier_min_level": {
          "minItems": 1,
          "maxItems": 20,
          "description": "The lowest level of each tier, from tier 1. A recipe of tier t needs a level from entry t up to one below entry t + 1 (up to 20 for the last), and a node that gives tier 3 or above needs at least entry t, or a slow respawn. Starts at 1 and rises with every tier; one entry for every open tier at least.",
          "type": "array",
          "items": {
            "minimum": 1,
            "maximum": 20,
            "type": "integer"
          }
        },
        "template_max_recipes": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The most recipes one recipe template may make."
        },
        "craft_chance_bp": {
          "minItems": 1,
          "maxItems": 20,
          "description": "The chance a craft succeeds at exactly its level, in basis points, by the recipe's tier from tier 1; the last entry holds for the tiers above it. Never rises with the tier; 10000 is a sure craft.",
          "type": "array",
          "items": {
            "minimum": 1000,
            "maximum": 10000,
            "type": "integer"
          }
        },
        "craft_level_step_bp": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "What each level of the recipe's profession above the recipe's level adds to the craft chance, in basis points."
        },
        "craft_luck_max_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The largest part of the gap to a sure craft that luck and luck items close, in permille: skill decides, luck tilts (G40)."
        },
        "craft_miss_keep_pct": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Part of each input a missed craft keeps when the recipe names no share, rounded down."
        },
        "wear_effect_max_pct": {
          "minItems": 1,
          "maxItems": 20,
          "description": "The largest value of one effect on a worn item, by the item's tier from tier 1; the last entry holds for the tiers above it. Never falls with the tier.",
          "type": "array",
          "items": {
            "minimum": 0,
            "maximum": 100,
            "type": "integer"
          }
        },
        "wear_set_bonus_pct": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "How much a full set adds to the effects of its pieces, in percent of their sum, rounded down."
        },
        "rarity_bonus_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "common",
            "uncommon",
            "rare",
            "legendary"
          ],
          "properties": {
            "common": {
              "type": "integer"
            },
            "uncommon": {
              "type": "integer"
            },
            "rare": {
              "type": "integer"
            },
            "legendary": {
              "type": "integer"
            }
          }
        },
        "drift_budget_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "hp_cap": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The health bar's base top in whole points; each point of stamina adds per_point.stamina. Nothing drains it by the clock (G28)."
        },
        "day_length_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "walk_step_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Milliseconds the player takes to walk one tile. The client walks at this pace; the kernel checks a position report against it (DECISIONS.md, 2026-10-10: health and hazards)."
        },
        "move_reach_max": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The maximum number of tiles a movement report may cover after the walk-time allowance (G56). Defaults to 32."
        },
        "hp_low_pct": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Work takes half as long again while health is at or below this share of its cap, in percent. 0 slows it only when health is empty (G32)."
        },
        "fire": {
          "additionalProperties": false,
          "description": "A tended fire uses the game tick, which pauses while the player is away.",
          "type": "object",
          "required": [
            "cap",
            "log_ms",
            "warn_min",
            "safe_tiles",
            "burn_pct_per_d"
          ],
          "properties": {
            "cap": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Most logs of burn time a fire may hold ahead of the game tick."
            },
            "log_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game milliseconds one wood item adds to a fire."
            },
            "warn_min": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game minutes before a burning fire goes out when its warning is shown."
            },
            "safe_tiles": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "How far from the player's own fire, in tiles, the ground is safe while it burns: 1 is its tile and the ring around it (G30)."
            },
            "burn_pct_per_d": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "How much faster a log of the player's own fire burns for each step of the area's danger d, in percent (G30, G48)."
            }
          }
        },
        "hazard": {
          "additionalProperties": false,
          "description": "How hard each kind of hazard hits (G30, G34). A hazard is a rule, not a roll.",
          "type": "object",
          "required": [
            "predator",
            "pit",
            "trap",
            "deep_water"
          ],
          "properties": {
            "predator": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "reach",
                "pace_ms",
                "eyes",
                "catch_ms",
                "bite_ms",
                "bite_pct",
                "refill_bp"
              ],
              "properties": {
                "reach": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "Tiles from its footprint within which a predator notices the player, unless the prop says otherwise."
                },
                "pace_ms": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "Game milliseconds a predator on a round takes to walk one tile."
                },
                "eyes": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "Tiles ahead watched by a predator on a round."
                },
                "catch_ms": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "From the start of a chase to the first bite."
                },
                "bite_ms": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "Between one bite and the next."
                },
                "bite_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What one bite takes, in percent of the health cap."
                },
                "refill_bp": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "How high a hunt outrun to a safe place lifts health, in basis points of the health cap: it gives back what its bites took, up to this share. It never lowers health."
                }
              }
            },
            "pit": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "harm_pct"
              ],
              "properties": {
                "harm_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What stepping into a pit takes, in percent of the health cap."
                }
              }
            },
            "trap": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "harm_pct"
              ],
              "properties": {
                "harm_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What stepping on a trap takes, in percent of the health cap."
                }
              }
            },
            "deep_water": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "harm_pct"
              ],
              "properties": {
                "harm_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What stepping into deep water takes, in percent of the health cap."
                }
              }
            }
          }
        },
        "bag_base": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Places with nothing on the back: hands and belt (DECISIONS.md, 2026-10-23). A bag on the back gives its own `wear.places` instead."
        },
        "place_stack": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Things of one kind that share one place: a place holds a stack of up to this many (DECISIONS.md, 2026-10-23). Weight still counts every unit."
        },
        "load": {
          "additionalProperties": false,
          "description": "Weight and pace (DECISIONS.md, 2026-10-23): every item weighs, and the load against a limit from might sets one of three walking paces.",
          "type": "object",
          "required": [
            "base",
            "light_permille",
            "max_permille",
            "light_step_ms",
            "heavy_step_ms",
            "heavy_breath_permille"
          ],
          "properties": {
            "base": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The weight limit before might: the limit is this plus `per_point.might` for each point, plus a frame bag's `load_bonus`."
            },
            "light_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Up to this share of the limit the pace is light; up to the whole limit it is steady; above it, heavy."
            },
            "max_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Beyond this share of the limit nothing more is picked up."
            },
            "light_step_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Milliseconds a tile at the light pace. The steady pace is `walk_step_ms`."
            },
            "heavy_step_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Milliseconds a tile at the heavy pace."
            },
            "heavy_breath_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "How fast breath (stamina) refills in a fight while heavy, against 1000."
            }
          }
        },
        "gait": {
          "additionalProperties": false,
          "description": "The three gaits (docs/design/ANIMATION.md, section 2): walk is the pace the load allows, run is faster and sneak slower, and each is heard at its own radius. The noise table is shared with the hunting rules; the radii only grow from still to run.",
          "type": "object",
          "required": [
            "run_div",
            "sneak_mul",
            "noise_still",
            "noise_sneak",
            "noise_walk",
            "noise_run"
          ],
          "properties": {
            "run_div": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "A run takes the pace the load allows divided by this: 2 is half the time a tile. Every pace divides evenly."
            },
            "sneak_mul": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "A sneak takes the pace the load allows times this: 2 is twice the time a tile."
            },
            "noise_still": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Tiles within which a creature that listens turns its head at a player standing still."
            },
            "noise_sneak": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The same, at a sneak."
            },
            "noise_walk": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The same, at a walk."
            },
            "noise_run": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The same, at a run."
            }
          }
        },
        "hunt": {
          "additionalProperties": false,
          "description": "Dressing a taken animal (docs/design/HUNTING.md sections 5-6): the time a step takes, how long a carcass keeps, and how often an animal is finer than plain. Nothing here prices a hunt: the hunt verb takes the effort weight of its tier like every verb (R6).",
          "type": "object",
          "required": [
            "dress_step_ms",
            "meat_spoil_d",
            "hide_spoil_d",
            "grade2_bp",
            "grade3_bp"
          ],
          "properties": {
            "dress_step_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game milliseconds one dressing step takes: a small animal takes 6 steps, a medium one 12, a large one 24 (HUNTING section 6), six steps to a part and one action a part, so six steps stay inside max_action_ms (the check)."
            },
            "meat_spoil_d": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game days a carcass keeps its meat (its goods of kind \"food\"): dressed later, the meat is gone and the rest remains."
            },
            "hide_spoil_d": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game days a carcass keeps anything: dressed later, nothing is left of it."
            },
            "grade2_bp": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Basis points of animals that appear fine (grade 2)."
            },
            "grade3_bp": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Basis points of animals that appear true (grade 3). With grade2_bp at most 10000; the rest are plain."
            }
          }
        },
        "wild": {
          "additionalProperties": false,
          "description": "The wild (docs/design/HUNTING.md sections 1-4 and 8; CREATURE_BEHAVIOUR sections 1-2 and 5.1; HUNT_FAMILIES section 3.1): the clock an animal thinks on, how far round a player animals are stepped, how long a flight, a den stay and a print last, where a den's bolt hole may lie, and the distances kept from a fire and the town. A kind's own character is its `behaviour`; these are the numbers every kind shares.",
          "type": "object",
          "required": [
            "tick_ms",
            "think_ticks",
            "wake_tiles",
            "awake_max",
            "catchup_max_steps",
            "flee_avoid_steps",
            "refill_clear_tiles",
            "spread_tiles",
            "print_ring",
            "print_fade_ms",
            "den_stay_steps",
            "bolt_min_tiles",
            "bolt_max_tiles",
            "throw_ms",
            "strike_noise",
            "fire_keep_day",
            "fire_keep_night",
            "town_keep_day",
            "town_keep_night"
          ],
          "properties": {
            "tick_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game milliseconds of one world tick (COMBAT section 4.9). Fixed: every duration below is whole ticks or whole think steps."
            },
            "think_ticks": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Ticks between two think steps of one animal, staggered by its id (HUNTING section 1): 8 ticks of 100 ms, a think step of 800 ms."
            },
            "wake_tiles": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "An animal is stepped only while a player is within this many tiles; beyond it its group is kept as an anchor and a count (HUNTING section 1)."
            },
            "awake_max": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The most animals stepped round one player at once (BESTIARY section 1)."
            },
            "catchup_max_steps": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "A gap longer than this many think steps settles each animal to its rest pose at once instead of stepping it, so one action never pays for an hour of the wild."
            },
            "flee_avoid_steps": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Think steps a fled animal keeps away from the tile it fled (HUNTING section 2, FLEE); a flushed burrower comes back to its den after them (HUNT_FAMILIES section 3.1)."
            },
            "refill_clear_tiles": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "A lost member comes back to its anchor only with no player within this many tiles (HUNTING section 8)."
            },
            "spread_tiles": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "ALERT spreads to the group members within this many tiles, and a member that sees one of its group in FLEE this close flees too (HUNTING section 2; CREATURE_BEHAVIOUR section 5.1.3)."
            },
            "print_ring": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Tiles of fresh prints a fleeing animal leaves behind it on ground that holds prints, its last tiles, oldest first out (HUNT_FAMILIES section 3.1, the line home)."
            },
            "print_fade_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game milliseconds a fresh print stays readable (one game hour is day_length_ms / 24)."
            },
            "den_stay_steps": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Think steps a burrower stays in its den after a flight once no player is near the mouth, then WANDER (CREATURE_BEHAVIOUR section 1, flight burrow; HUNT_FAMILIES section 3.1, inside while watched)."
            },
            "bolt_min_tiles": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The nearest a den's bolt hole lies to its mouth, by the squared distance (HUNT_FAMILIES section 3.1: 64 <= d2 <= 100). Far enough that a flusher beside the mouth stands beyond a burrower's sight of the bolt hole (the check)."
            },
            "bolt_max_tiles": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The farthest a den's bolt hole lies from its mouth, by the squared distance."
            },
            "throw_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Game milliseconds a thrown stone takes to leave the hand (HUNTING section 5, T0)."
            },
            "strike_noise": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Tiles within which a strike is heard (HUNTING section 4; COMBAT section 4.9)."
            },
            "fire_keep_day": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Tiles a prey kind keeps from a burning fire on the ground by day (CREATURE_BEHAVIOUR section 2)."
            },
            "fire_keep_night": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The same by night: a lit circle nothing grazes in. At least the fire's safe ring and one tile more (the check)."
            },
            "town_keep_day": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Tiles a wild kind keeps from the town's cobbles by day (CREATURE_BEHAVIOUR section 2)."
            },
            "town_keep_night": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The same at night, when the lamps push the wall out; never under the day's (the check)."
            }
          }
        },
        "starting_gold_mg": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "per_point": {
          "additionalProperties": false,
          "description": "What one point in an attribute adds: weight limit (might), tiles of dig-hint distance (senses), percent wider timing windows in every minigame (agility), permille on rare and legendary finds inside the power cap and on keeping one unit after a missed gather (luck), and fullness (stamina). Spirit is defined and read by no rule yet: its first readers come with the night layer and the tree.",
          "type": "object",
          "required": [
            "might",
            "senses",
            "agility_pct",
            "luck_permille",
            "stamina",
            "spirit"
          ],
          "properties": {
            "might": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "senses": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "agility_pct": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "luck_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "stamina": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "spirit": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            }
          }
        },
        "growth": {
          "additionalProperties": false,
          "description": "The skill tree: what a node costs and when the build's slots open. Left out: the tree is closed.",
          "type": "object",
          "required": [
            "cost",
            "nodes_max",
            "slot_levels"
          ],
          "properties": {
            "cost": {
              "additionalProperties": false,
              "description": "Skill points a node costs, by its size (GROWTH section 3.6): the value is the price, and a node that names its own `cost` stays between min and max.",
              "type": "object",
              "required": [
                "small",
                "major",
                "corner",
                "keystone"
              ],
              "properties": {
                "small": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  }
                },
                "major": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  }
                },
                "corner": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  }
                },
                "keystone": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  }
                }
              }
            },
            "nodes_max": {
              "minimum": 1,
              "maximum": 400,
              "description": "At most this many nodes a player of one race sees in one school: its paths and that race's corner.",
              "type": "integer"
            },
            "slot_levels": {
              "minItems": 1,
              "maxItems": 8,
              "description": "The character level each active slot of the build opens at, from the first slot, never falling (GROWTH section 3.3: two at level 1, then one more at 5, 10 and 15).",
              "type": "array",
              "items": {
                "minimum": 1,
                "maximum": 40,
                "type": "integer"
              }
            }
          }
        },
        "difficulty": {
          "additionalProperties": false,
          "description": "The difficulty reckoning (pnpm map:difficulty): it recommends, never places.",
          "type": "object",
          "required": [
            "ratio_permille",
            "hazard_bp",
            "grind_passes_max",
            "quest_share_pct",
            "quest_minutes_max",
            "quests_max"
          ],
          "properties": {
            "ratio_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Each step of the scale multiplies effort and the health a hazard takes by this, in permille (9.10: 1500). The growth curve of a school uses the same ratio (PROGRESSION 3.2)."
            },
            "hazard_bp": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "How often a hazard shows grows by this per step of d: the chance in a game minute after dark or in the mist is hazard_bp * d basis points (SETTLEMENT 3.5). A spawn model; today hazards are authored."
            },
            "grind_passes_max": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The reckoning: how many times a player is assumed to work each nearer node on the way (each pass waits for the node to grow back)."
            },
            "quest_share_pct": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The reckoning: the share of the next level's active time a place's quests should pay, in percent; the rest is grinding."
            },
            "quest_minutes_max": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The reckoning: the longest active time one recommended quest asks, in real minutes."
            },
            "quests_max": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The reckoning: the most quests it recommends at one place."
            }
          }
        },
        "balance": {
          "additionalProperties": false,
          "description": "The balance model (PROGRESSION 4.7): two red lines, rising ceilings, walls proven both ways. Read by tools only, until the kernel reads it.",
          "type": "object",
          "required": [
            "t1_ms",
            "school_steps",
            "band_size",
            "catalogue_hours_min",
            "mentor_bonus_pct",
            "group_share_max_permille",
            "loop_profit_max_mg",
            "ceilings",
            "raise_step",
            "raisers_max",
            "wall_margin_bp",
            "wall_cheese_gap",
            "top_builds_n",
            "top_over_median_max_permille",
            "proof_enum_max",
            "rarity_effects_max",
            "rarity_band_permille",
            "trait_strength_by_tier",
            "master_step",
            "dish_place_step",
            "dish_slots",
            "grade_walk_permille",
            "grade_drain_pct"
          ],
          "properties": {
            "t1_ms": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "A school's first step, in active milliseconds; step i takes t1 * ratio^(i-1) (PROGRESSION 3.2). The bounds are the owner's range, 25 to 30 seconds."
            },
            "school_steps": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Steps from level 1 to mastery (PROGRESSION 3.2: twenty, so mastery is level 21)."
            },
            "band_size": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Levels in one band (PROGRESSION 3.3)."
            },
            "catalogue_hours_min": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The fewest active hours that master every school of the catalogue (PROGRESSION 3.2: 800)."
            },
            "mentor_bonus_pct": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The one experience source beside the work itself: the mentor's bonus, in percent (PROGRESSION 3.7, red line B)."
            },
            "group_share_max_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The most a newcomer takes from the experience the other members already earned, in permille of the newcomer's own: a split, never new experience (PROGRESSION 3.7, Q7)."
            },
            "loop_profit_max_mg": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The most gold any buy, craft and sell cycle at a vendor may make, in milligold (red line A: 0)."
            },
            "ceilings": {
              "additionalProperties": false,
              "description": "Each category's ceiling by the wearer's band (PROGRESSION 4.7): every source adds and the sum stops here. Never falls with the band.",
              "type": "object",
              "required": [
                "work",
                "move",
                "carry",
                "health",
                "sustain",
                "find",
                "sense",
                "place"
              ],
              "properties": {
                "work": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "Time off a school's work, all sources, in percent.",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 100,
                    "type": "integer"
                  }
                },
                "move": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "Time off a step, a crossing or an oar stroke, in percent.",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 100,
                    "type": "integer"
                  }
                },
                "carry": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "The weight limit above might's and the bag's, in percent.",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 100,
                    "type": "integer"
                  }
                },
                "health": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "The health cap above the attributes' cap, in percent.",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 200,
                    "type": "integer"
                  }
                },
                "sustain": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "Health back a game hour while a place drains, regen and food together, in points of the base cap of 100 (the drain's unit).",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 100,
                    "type": "integer"
                  }
                },
                "find": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "Rare-find points.",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 100,
                    "type": "integer"
                  }
                },
                "sense": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "Tiles of sight in the dark or of a trail.",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 20,
                    "type": "integer"
                  }
                },
                "place": {
                  "minItems": 5,
                  "maxItems": 5,
                  "description": "Answer steps on one condition: garment, master step and dish together.",
                  "type": "array",
                  "items": {
                    "minimum": 0,
                    "maximum": 4,
                    "type": "integer"
                  }
                }
              }
            },
            "raise_step": {
              "additionalProperties": false,
              "description": "What one ceiling raiser adds to its category's top-band ceiling (PROGRESSION 4.7).",
              "type": "object",
              "required": [
                "work",
                "move",
                "carry",
                "health",
                "sustain",
                "find",
                "sense",
                "place"
              ],
              "properties": {
                "work": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                },
                "move": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                },
                "carry": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                },
                "health": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                },
                "sustain": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                },
                "find": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                },
                "sense": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                },
                "place": {
                  "minimum": 0,
                  "maximum": 100,
                  "type": "integer"
                }
              }
            },
            "raisers_max": {
              "additionalProperties": false,
              "description": "How many raisers of each category exist (PROGRESSION 4.7: ten in all today).",
              "type": "object",
              "required": [
                "work",
                "move",
                "carry",
                "health",
                "sustain",
                "find",
                "sense",
                "place"
              ],
              "properties": {
                "work": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                },
                "move": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                },
                "carry": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                },
                "health": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                },
                "sustain": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                },
                "find": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                },
                "sense": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                },
                "place": {
                  "minimum": 0,
                  "maximum": 10,
                  "type": "integer"
                }
              }
            },
            "wall_margin_bp": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "A wall's witness ends with at least this share of the health cap and of the timer to spare, in basis points."
            },
            "wall_cheese_gap": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Nothing from this many bands below a wall's band passes it (PROGRESSION 4.7: 2)."
            },
            "top_builds_n": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "How many strongest builds a band the prover lists (a warning, never a failure)."
            },
            "top_over_median_max_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "The strongest build of a band warns when its score stands more than this above the band's median, in permille."
            },
            "proof_enum_max": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "Combinations walked in full; above it the proof walks each slot's Pareto front."
            },
            "rarity_effects_max": {
              "minItems": 4,
              "maxItems": 4,
              "description": "The most effects a thing carries by rarity, common, uncommon, rare, legendary (PROGRESSION 5.7); a trait and a dish effect count.",
              "type": "array",
              "items": {
                "minimum": 0,
                "maximum": 4,
                "type": "integer"
              }
            },
            "rarity_band_permille": {
              "minItems": 4,
              "maxItems": 4,
              "description": "Each rarity's share of the tier's full strength, low and high, in permille (PROGRESSION 5.7); common is the smallest step, read as 0 here.",
              "type": "array",
              "items": {
                "minItems": 2,
                "maxItems": 2,
                "type": "array",
                "items": {
                  "minimum": 0,
                  "maximum": 1000,
                  "type": "integer"
                }
              }
            },
            "trait_strength_by_tier": {
              "minItems": 1,
              "maxItems": 10,
              "description": "A garment trait's strength by the tier it counts as, from tier 1 (BODY_CLOCKS 6.2).",
              "type": "array",
              "items": {
                "minimum": 0,
                "maximum": 4,
                "type": "integer"
              }
            },
            "master_step": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "What a master piece adds to its trait (BODY_CLOCKS 6.2)."
            },
            "dish_place_step": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "What a dish of the same condition adds; only one dish counts (BODY_CLOCKS 6.2)."
            },
            "dish_slots": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              },
              "description": "How many dishes act at once (BODY_CLOCKS 7)."
            },
            "grade_walk_permille": {
              "minItems": 5,
              "maxItems": 5,
              "description": "The slow of a remaining grade 0 to 4, in permille of a step's time (BODY_CLOCKS 5.2).",
              "type": "array",
              "items": {
                "minimum": 1000,
                "maximum": 5000,
                "type": "integer"
              }
            },
            "grade_drain_pct": {
              "minItems": 5,
              "maxItems": 5,
              "description": "The drain of a remaining grade 0 to 4, in points of the base cap of 100 a game hour, the same for every cap (BODY_CLOCKS 5.2).",
              "type": "array",
              "items": {
                "minimum": 0,
                "maximum": 100,
                "type": "integer"
              }
            }
          }
        }
      }
    }
  }
}
