osrs-codex/schemas/entry.schema.json
Claude 0c2e38c998 Merge origin/main 5ca8324b into issue-3; reconcile validator gates (governor 10637 / owner guidance 2026-08-29)
Magic/Alchemy PR #10 landed on main; this integrates it into the woodcutting
branch and resolves the predicted tools/validate.py conflict:

- union of all validator gates: magic/alchemy (recipe/rate/tier/loadout,
  supply_limit_conflicts, document_error + _end_to_end_bad_mapping),
  mining (pickaxe suite), GE-flip lifecycle (floor-tax + scheduler +
  conservation + slot-phase + buy-capacity + slot-reuse), and the
  woodcutting gates (canonical axe table, per-mode ladders, per-selected-
  row 27/28 dynamic rates, drop-GP-zero, prepare/failed/drop-gate wiring).
- governor 10637: removed the run_flip_selftest alias duplication — the
  combined GE/Woodcutting suite no longer runs twice. Each suite now runs
  exactly once per invocation: run_selftest (cross-field/alchemy),
  run_flip_selftest (GE lifecycle), run_mining_selftest, and the new
  run_woodcutting_selftest. Truthful unique selftest count: 144 PASS.
- tree scan: 6 entries, 0 errors, 0 warnings; git diff --check clean.
2026-08-29 15:44:34 -05:00

586 lines
22 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "OSRS Codex Entry",
"type": "object",
"additionalProperties": false,
"required": [
"id", "title", "domain", "tags", "status", "version", "updated",
"summary", "accounts", "best_practice", "state_machine", "actions",
"run_control", "risk", "sources", "verified"
],
"properties": {
"id": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$", "maxLength": 64 },
"title": { "type": "string", "minLength": 3 },
"domain": {
"enum": ["economy", "training", "combat", "combat-slayers", "quests", "transport", "meta"]
},
"tags": { "type": "array", "items": { "type": "string" }, "minItems": 1 },
"status": { "enum": ["draft", "verified", "stale"] },
"version": { "type": "integer", "minimum": 1 },
"updated": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
"summary": { "type": "string", "minLength": 10 },
"accounts": {
"type": "object",
"required": ["membership", "min_level"],
"additionalProperties": false,
"properties": {
"membership": { "enum": ["f2p", "members", "hybrid"] },
"min_level": { "type": "integer", "minimum": 1, "maximum": 126 },
"requires_quest": { "type": "array", "items": { "type": "string" } },
"requires_other": { "type": "array", "items": { "type": "string" } }
}
},
"economy": {
"type": "object",
"additionalProperties": false,
"properties": {
"item": { "type": "string" },
"item_id": { "type": "integer" },
"cost_per_cycle": { "type": "number" },
"cost_per_cycle_max_fill": { "type": "number" },
"income_per_cycle": { "type": "number" },
"net_per_cycle": { "type": "number" },
"net_per_cycle_max_fill": { "type": "number" },
"gp_per_hour_low": { "type": "number" },
"gp_per_hour_high": { "type": "number" },
"ceiling_gp_per_hour": { "type": "number", "exclusiveMinimum": 0 },
"xp_per_hour": { "type": "number" },
"supplies": {
"type": "array",
"items": {
"type": "object",
"required": ["item", "qty_per_cycle", "source"],
"additionalProperties": false,
"properties": {
"item": { "type": "string" },
"qty_per_cycle": { "type": "number", "exclusiveMinimum": 0 },
"source": { "enum": ["ge", "p2p", "drops", "craft", "bank", "npc-shop"] },
"ge_limit": { "type": "integer", "minimum": 1 }
}
}
},
"profit_drivers": { "type": "array", "items": { "type": "string" } }
}
},
"selection": {
"type": "object",
"required": ["mode", "eligible_rule", "fallback"],
"additionalProperties": false,
"properties": {
"mode": { "enum": ["highest-unlocked"] },
"eligible_rule": { "type": "string", "minLength": 10 },
"fallback": { "type": "string", "minLength": 10 }
}
},
"recipes": {
"type": "object",
"minProperties": 1,
"propertyNames": { "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
"additionalProperties": {
"type": "object",
"required": ["bar", "smithing_level", "target_input", "inputs"],
"additionalProperties": false,
"properties": {
"bar": { "type": "string", "minLength": 2 },
"bar_item_id": { "type": "integer", "minimum": 1 },
"smithing_level": { "type": "integer", "minimum": 1, "maximum": 126 },
"smithing_xp": { "type": "number", "exclusiveMinimum": 0 },
"target_input": { "type": "string", "minLength": 2 },
"inputs": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["item", "qty", "source"],
"additionalProperties": false,
"properties": {
"item": { "type": "string", "minLength": 2 },
"item_id": { "type": "integer", "minimum": 1 },
"qty": { "type": "integer", "minimum": 1 },
"source": { "enum": ["ge", "p2p", "drops", "craft", "bank", "npc-shop"] }
}
}
},
"rates": {
"type": "object",
"required": ["capacity", "casts_per_hour", "magic_xp_per_hour"],
"additionalProperties": false,
"properties": {
"capacity": { "type": "integer", "minimum": 1 },
"casts_per_hour": {
"type": "object",
"required": ["min", "mid", "max"],
"additionalProperties": false,
"properties": {
"min": { "type": "number", "minimum": 0 },
"mid": { "type": "number", "minimum": 0 },
"max": { "type": "number", "minimum": 0 }
}
},
"magic_xp_per_hour": {
"type": "object",
"required": ["min", "mid", "max"],
"additionalProperties": false,
"properties": {
"min": { "type": "number", "minimum": 0 },
"mid": { "type": "number", "minimum": 0 },
"max": { "type": "number", "minimum": 0 }
}
}
}
}
}
}
},
"rate_model": {
"type": "object",
"required": ["anchor_tier", "cast_ticks", "restock_trip_s", "session_horizon_s"],
"additionalProperties": false,
"properties": {
"anchor_tier": { "enum": ["la", "sii", "hla"] },
"anchor_recipe": { "type": "string" },
"cast_ticks": { "type": "integer", "minimum": 1 },
"restock_trip_s": {
"type": "array",
"items": { "type": "number", "minimum": 0 },
"minItems": 2,
"maxItems": 2
},
"session_horizon_s": { "type": "integer", "minimum": 1 },
"startup_s": {
"type": "array",
"items": { "type": "number", "minimum": 0 },
"minItems": 2,
"maxItems": 2
},
"alch_carry_batch": { "type": "integer", "minimum": 1 },
"alch_restock_threshold": { "type": "integer", "minimum": 0 },
"sii_capacity_slots": { "type": "integer", "minimum": 1 }
}
},
"pickaxe_tiers": {
"type": "object",
"minProperties": 1,
"propertyNames": { "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
"additionalProperties": {
"type": "object",
"required": ["mining_level", "attack_level", "roll_ticks", "rank"],
"additionalProperties": false,
"properties": {
"mining_level": { "type": "integer", "minimum": 1, "maximum": 126 },
"attack_level": { "type": "integer", "minimum": 1, "maximum": 126 },
"roll_ticks": { "type": "integer", "minimum": 1 },
"rank": { "type": "integer", "minimum": 1, "maximum": 6 }
}
}
},
"pickaxe_examples": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["account", "attack", "mining", "expected_tier", "expected_equipped", "expected_slots"],
"additionalProperties": false,
"properties": {
"account": { "type": "string", "minLength": 2 },
"attack": { "type": "integer", "minimum": 1, "maximum": 126 },
"mining": { "type": "integer", "minimum": 1, "maximum": 126 },
"expected_tier": { "type": "string", "minLength": 2 },
"expected_equipped": { "type": "boolean" },
"expected_slots": { "type": "integer", "minimum": 1, "maximum": 28 }
}
}
},
"mining_modes": {
"type": "object",
"required": ["fast-xp", "banked-income"],
"additionalProperties": false,
"properties": {
"fast-xp": {
"type": "object",
"required": ["inventory_policy", "ore_policy", "sites"],
"additionalProperties": false,
"properties": {
"inventory_policy": { "const": "drop" },
"ore_policy": { "type": "string", "minLength": 5 },
"sites": { "type": "array", "minItems": 1, "items": { "type": "string" } }
}
},
"banked-income": {
"type": "object",
"required": ["inventory_policy", "targets", "stop"],
"additionalProperties": false,
"properties": {
"inventory_policy": { "const": "bank" },
"targets": { "type": "array", "minItems": 1, "items": { "type": "string" } },
"stop": { "type": "string", "minLength": 5 }
}
}
}
},
"mining_selections": {
"type": "object",
"additionalProperties": false,
"properties": {
"fast_xp": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["level", "expected_site"],
"additionalProperties": false,
"properties": {
"level": { "type": "integer", "minimum": 1, "maximum": 126 },
"expected_site": { "type": "string", "minLength": 2 }
}
}
}
}
},
"mine_sites": {
"type": "object",
"minProperties": 1,
"propertyNames": { "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
"additionalProperties": {
"type": "object",
"required": ["ore", "ore_id", "mining_level", "xp", "rock_count",
"respawn_seconds", "rolls_per_ore", "modeled_ores_per_hour",
"world_hop", "selectable", "inventory_policy", "access",
"safety", "route"],
"additionalProperties": false,
"properties": {
"ore": { "type": "string", "minLength": 2 },
"ore_id": { "type": "integer", "minimum": 1 },
"mining_level": { "type": "integer", "minimum": 1, "maximum": 126 },
"xp": { "type": "number", "exclusiveMinimum": 0 },
"rock_count": { "type": "integer", "minimum": 1 },
"respawn_seconds": { "type": "number", "exclusiveMinimum": 0 },
"rolls_per_ore": { "type": "number", "exclusiveMinimum": 0 },
"modeled_ores_per_hour": { "type": "number", "minimum": 0 },
"world_hop": { "type": "boolean" },
"selectable": { "type": "boolean" },
"inventory_policy": { "enum": ["drop", "bank"] },
"access": { "type": "string", "minLength": 3 },
"safety": { "type": "string", "minLength": 3 },
"route": { "type": "string", "minLength": 5 }
}
}
},
"slot_state_machine": {
"type": "object",
"required": ["sub_states", "slot_transitions", "slot_transition_whens",
"scheduler_iteration", "quote_age_policy", "persisted_state",
"limit_ledger", "conservation", "break_resume"],
"additionalProperties": false,
"properties": {
"sub_states": {
"type": "array",
"minItems": 10,
"items": { "type": "string" }
},
"slot_transitions": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": { "type": "string" }
}
},
"slot_transition_whens": {
"type": "array",
"minItems": 8,
"items": { "type": "string", "minLength": 8 }
},
"scheduler_iteration": { "type": "string", "minLength": 10 },
"quote_age_policy": { "type": "string", "minLength": 10 },
"persisted_state": { "type": "string", "minLength": 10 },
"limit_ledger": { "type": "string", "minLength": 10 },
"conservation": { "type": "string", "minLength": 10 },
"break_resume": { "type": "string", "minLength": 10 }
}
},
"best_practice": {
"type": "object",
"required": ["equipment"],
"additionalProperties": false,
"properties": {
"equipment": {
"type": "array",
"items": {
"type": "object",
"required": ["item", "why", "source"],
"additionalProperties": false,
"properties": {
"item": { "type": "string", "minLength": 2 },
"why": { "type": "string", "minLength": 5 },
"source": { "type": "string", "minLength": 5 }
}
}
},
"techniques": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "why", "source"],
"additionalProperties": false,
"properties": {
"name": { "type": "string", "minLength": 2 },
"why": { "type": "string", "minLength": 5 },
"source": { "type": "string", "minLength": 5 }
}
}
}
}
},
"axe_tiers": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["axe", "woodcutting_level", "attack_level", "members"],
"additionalProperties": false,
"properties": {
"axe": { "type": "string" },
"woodcutting_level": { "type": "integer", "minimum": 1, "maximum": 99 },
"attack_level": { "type": "integer", "minimum": 1, "maximum": 99 },
"members": { "type": "boolean" }
}
}
},
"axe_examples": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["account", "woodcutting_level", "attack_level", "expected_axe", "expected_equipped"],
"additionalProperties": false,
"properties": {
"account": { "type": "string" },
"woodcutting_level": { "type": "integer", "minimum": 1, "maximum": 99 },
"attack_level": { "type": "integer", "minimum": 1, "maximum": 99 },
"expected_axe": { "type": "string" },
"expected_equipped": { "type": "boolean" }
}
}
},
"woodcutting_modes": {
"type": "array",
"minItems": 3,
"maxItems": 3,
"items": {
"type": "object",
"required": ["mode", "intent", "inventory_policy", "ladder", "fallback", "model", "rates"],
"additionalProperties": false,
"properties": {
"mode": { "enum": ["fast-xp", "afk-xp", "banked-income"] },
"intent": { "type": "string", "minLength": 10 },
"inventory_policy": { "enum": ["bank", "drop"] },
"fallback": { "type": "string", "minLength": 3 },
"ladder": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["tree", "min_level", "gate", "spot", "bank",
"chop_seconds_per_log", "walk_seconds_each_way",
"respawn_duty", "log_price"],
"additionalProperties": false,
"properties": {
"tree": { "enum": ["tree", "oak", "willow", "maple", "yew"] },
"min_level": { "type": "integer", "minimum": 1, "maximum": 99 },
"gate": { "enum": ["none", "combat-15-plus", "combat-under-15", "dragon-slayer-i"] },
"spot": { "type": "string", "minLength": 3 },
"bank": { "type": "string", "minLength": 3 },
"chop_seconds_per_log": { "type": "number", "exclusiveMinimum": 0 },
"walk_seconds_each_way": { "type": "number", "minimum": 0 },
"respawn_duty": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 },
"log_price": { "type": "number", "exclusiveMinimum": 0 }
}
}
},
"model": {
"type": "object",
"required": ["drop_seconds_per_log", "deposit_seconds", "break_duty"],
"additionalProperties": false,
"properties": {
"drop_seconds_per_log": { "type": "number", "minimum": 0 },
"deposit_seconds": { "type": "number", "minimum": 0 },
"break_duty": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 }
}
},
"rates": {
"type": "object",
"required": ["logs_per_hour", "xp_per_hour", "gp_per_hour", "log_price", "price_verified"],
"additionalProperties": false,
"properties": {
"logs_per_hour": { "type": "integer", "exclusiveMinimum": 0 },
"xp_per_hour": { "type": "integer", "minimum": 0 },
"gp_per_hour": { "type": "integer", "minimum": 0 },
"log_price": { "type": "number", "exclusiveMinimum": 0 },
"price_verified": { "type": "string" }
}
}
}
}
},
"woodcutting_fixtures": {
"type": "array",
"items": {
"type": "object",
"required": ["account", "mode", "woodcutting_level", "attack_level",
"quest_gate", "combat_level", "expected_tree", "expected_axe",
"expected_equipped", "expected_logs_per_hour",
"expected_xp_per_hour", "expected_gp_per_hour"],
"additionalProperties": false,
"properties": {
"account": { "type": "string", "minLength": 3 },
"mode": { "enum": ["fast-xp", "afk-xp", "banked-income"] },
"woodcutting_level": { "type": "integer", "minimum": 1, "maximum": 99 },
"attack_level": { "type": "integer", "minimum": 1, "maximum": 99 },
"quest_gate": { "type": "boolean" },
"combat_level": { "type": "integer", "minimum": 3 },
"expected_tree": { "enum": ["tree", "oak", "willow", "maple", "yew"] },
"expected_axe": { "type": "string" },
"expected_equipped": { "type": "boolean" },
"expected_logs_per_hour": { "type": "integer", "exclusiveMinimum": 0 },
"expected_xp_per_hour": { "type": "integer", "minimum": 0 },
"expected_gp_per_hour": { "type": "integer", "minimum": 0 }
}
}
},
"state_machine": {
"type": "object",
"required": ["initial", "terminal", "states"],
"additionalProperties": false,
"properties": {
"initial": { "type": "string" },
"terminal": {
"type": "array",
"items": { "type": "string" },
"minItems": 1,
"contains": { "const": "failed" }
},
"states": {
"type": "object",
"minProperties": 2,
"additionalProperties": {
"type": "object",
"required": ["goal"],
"additionalProperties": false,
"properties": {
"goal": { "type": "string", "minLength": 3 },
"next": { "type": "array", "items": { "type": "string" }, "minItems": 1 }
}
}
},
"transitions": {
"type": "array",
"items": {
"type": "object",
"required": ["from", "when", "to"],
"additionalProperties": false,
"properties": {
"from": { "type": "string" },
"when": { "type": "string", "minLength": 3 },
"to": { "type": "string" }
}
}
}
}
},
"actions": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "step", "verb", "on_fail"],
"additionalProperties": false,
"properties": {
"id": { "type": "string", "pattern": "^a[0-9]+$" },
"step": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
"verb": {
"enum": [
"login", "select_world", "hop_world", "is_logged_in",
"move_to", "walk_to", "teleport", "enter_region", "open_door",
"use_item_on", "click_object", "right_click", "talk_to",
"click_button", "menu_option",
"bank_inventory", "deposit_all", "withdraw", "has_item",
"count_item", "move_to_inv", "sort_inventory",
"ge_open", "ge_buy", "ge_sell", "ge_cancel", "ge_offers_done", "ge_collect",
"ge_check_price",
"attack", "prayer", "buff", "eat", "retreat", "is_dead", "respawn",
"is_at", "item_count", "level_is", "xp_is", "hp_is",
"ge_clear", "bank_open", "quest_state", "npc_present",
"log", "alert", "sleep", "human_move", "take_break"
]
},
"target": { "type": "string" },
"params": { "type": "object" },
"on_fail": { "enum": ["retry", "skip", "abort", "alert"] },
"anti_ban": {
"type": "object",
"additionalProperties": false,
"properties": {
"delay": {
"type": "array",
"items": { "type": "number", "minimum": 0 },
"minItems": 2,
"maxItems": 2
},
"mouse": { "type": "string" },
"jitter": { "type": "number", "minimum": 0 }
}
}
}
}
},
"run_control": {
"type": "object",
"required": ["iteration", "stop_conditions"],
"additionalProperties": false,
"properties": {
"iteration": { "type": "string" },
"max_iterations": { "type": ["integer", "null"], "minimum": 1 },
"break": {
"type": "object",
"additionalProperties": false,
"properties": {
"every": { "type": "array", "items": { "type": "number", "minimum": 1 }, "minItems": 2, "maxItems": 2 },
"for": { "type": "array", "items": { "type": "number", "minimum": 1 }, "minItems": 2, "maxItems": 2 }
}
},
"stop_conditions": { "type": "array", "items": { "type": "string" }, "minItems": 1 }
}
},
"risk": {
"type": "object",
"required": ["ban_level"],
"additionalProperties": false,
"properties": {
"ban_level": { "enum": ["low", "medium", "high"] },
"notes": { "type": "array", "items": { "type": "string" } }
}
},
"sources": { "type": "array", "items": { "type": "string" }, "minItems": 1 },
"verified": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
"related": { "type": "array", "items": { "type": "string" } }
}
}