codex: mining-f2p — fast-xp/banked-income modes, Mining-vs-Attack pickaxe gates, modeled rates (bounce-fix attempt 3)

Owner decision 2026-08-28: expose separate fast-xp (powermine, drop) and
banked-income (deterministic target ore + mine, bank) modes; never select
highest-available rocks. Separate pickaxe gates per tier: Mining level
decides usability (rune 41), Attack only equipping (rune 40) — pinned
1-Attack/41-Mining carry-and-use example. Modeled policy rates recomputed
with cadence, respawn idle, drop/bank legs and breaks (fast-xp ~32,400
XP/hr; banked iron ~56,500 gp/hr); 52,500 kept as labeled external
benchmark only. Worked examples per mode covering preparation -> first
full inventory -> first break -> resume. Validator now proves the gate
distinction and both modes for mining entries.
This commit is contained in:
Claude 2026-08-28 03:15:04 -05:00
parent ba3a8af9f9
commit 126cf7b38a
2 changed files with 309 additions and 108 deletions

View File

@ -3,109 +3,217 @@ title: Mining (F2P)
domain: training
tags: [mining, gathering, f2p, skill-training]
status: verified
version: 3 # 3: bounce-fix 2 2026-08-27 — dynamic inventory/drop model (no hardcoded slot count), conditional equip, wait_rock outcome gate, tier-aware cadence table, Al Kharid hard-gated to combat 29+ (no food in model)
updated: "2026-08-27" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date
version: 4 # 4: bounce-fix 3 2026-08-28 — owner decision: two explicit run modes (fast-xp powermine / banked-income), separate Mining-use vs Attack-equip pickaxe gates per tier with pinned 1-Attack/41-Mining example, modeled policy rates recomputed (cadence + respawn + drop/bank + breaks; 52,500 kept as labeled external benchmark only), worked examples per mode, validator proves gates + modes
updated: "2026-08-28" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date
summary: >
F2P mining: mine the highest available ore tier with the best pickaxe,
banking the ore (money route) or dropping it (powermine XP route). The
wiki's free-to-play training guide is the authoritative progression:
clay/copper/tin from level 1, iron 15 (the fast-XP ore), silver 20, coal
30, gold 40, mithril 55, adamantite 70, runite 85. Mining is a staple
low-risk, low-input method with no respawn mechanics in the loop. The Al
Kharid powermine is hard-gated: its level-14 scorpions attack players at
combat level 28 or below (wiki Aggressiveness), so the mine runs only at
combat 29+; sub-29 accounts use the banked South-east Varrock route,
which has no aggressive NPCs and needs no food.
F2P mining with TWO explicit run modes, chosen at session start; the
entry never silently picks "the highest available rock":
- fast-xp: powermining for XP. Iron (level 15, 35 xp) from level 15
onward, copper/tin (17.5 xp) below 15; every full inventory is DROPPED
(drop route explicit — drop_run). No banking in the loop.
- banked-income: ONE deterministic target ore + mine fixed at session
start and validated (Mining level >= ore level; the location contains
that ore; the inventory policy can hold it — banked mode deposits every
load); every full inventory is BANKED (bank_run) until the GP target.
The wiki's free-to-play training guide is the authoritative progression
for fast-xp (clay/copper/tin 1, iron 15, silver 20, coal 30, gold 40,
mithril 55, adamantite 70, runite 85). Mining is a staple low-risk,
low-input method. The Al Kharid powermine is hard-gated: its level-14
scorpions attack players at combat 28 or below (wiki Aggressiveness), so
that mine runs only at combat 29+; sub-29 accounts use the banked
South-east Varrock route (no aggressive NPCs, no food). Both modes use
one pickaxe policy: choose the best tier by MINING level (usability —
rune is usable at 41 Mining), then equip ONLY when the ATTACK level
permits (rune = 40 Attack), otherwise carry the same selected tool
(mining from the inventory works at any level; a 1-Attack/41-Mining
account carries and uses a rune pickaxe). Worked examples for both modes
live in best_practice.techniques.
accounts:
membership: f2p # whole ore chain verified F2P via the wiki guide
min_level: 1 # clay/copper/tin mineable at level 1
requires_quest: []
requires_other:
- "Best-tier F2P pickaxe the account can wield (bronze: no requirement -> rune: 40 Attack). Equip it ONLY when the Attack requirement is met; otherwise carry it in the inventory — mining from the inventory works at any level (equipped pickaxe = 28 ore slots, carried = 27; slot counts derive dynamically, never hardcoded)"
- "Bank route from the chosen mine (or an inventory-drop spot for powermining)"
- "Pickaxe: select the best tier by MINING level (usability gate: bronze 1, iron 1, steel 6, mithril 21, adamant 31, rune 41); EQUIP only when the ATTACK requirement is met (equip gate: steel 5, mithril 20, adamant 30, rune 40), otherwise CARRY the same selected tool — mining from the inventory works at every level (a 1-Attack/41-Mining account selects, carries, and uses a rune pickaxe; equipped pickaxe frees one slot, carried costs one — slot counts stay dynamic, never hardcoded)"
- "Run mode chosen at session start: fast-xp (powermine, drop every load) or banked-income (deterministic target ore + mine, bank every load)"
- "Bank route from the chosen mine (fast-xp drops instead when no bank leg is wanted)"
- "Al Kharid powermine HARD GATE: combat level >= 29 (a monster attacks players at <= 2x its level; the scorpion is level 14, so its aggro ceiling is combat 28 and 29+ is safe). Sub-combat-29 accounts MUST use the banked South-east Varrock route (no aggressive NPCs, no food required)"
best_practice:
equipment:
- item: highest-tier pickaxe the account can wield (bronze -> rune)
why: "each tier is faster — the roll interval drops from 8 ticks (bronze) to 3 ticks (rune), and the guide recommends always using the highest tier available; equipping it frees an inventory slot. Equip only when the Attack requirement is met (rune = 40 Attack); below that, mine with the pickaxe in the inventory (legal at every level)"
source: "OSRS wiki — Free-to-play Mining training (Pickaxes: tier table with tick intervals)"
- item: "pickaxe: highest tier usable at the account's MINING level (bronze 1, iron 1, steel 6, mithril 21, adamant 31, rune 41)"
why: "each tier is faster — the roll interval drops from 8 ticks (bronze) to 3 ticks (rune), and the guide recommends always using the highest tier available. Two SEPARATE gates: the Mining level decides WHICH pickaxe can be USED, the Attack level decides ONLY whether it can be EQUIPPED (steel 5, mithril 20, adamant 30, rune 40). Equip only when the Attack requirement is met, otherwise carry the same selected tool — a 1-Attack/41-Mining account selects, carries, and uses a rune pickaxe"
source: "OSRS wiki — Free-to-play Mining training (Pickaxes: tier table with tick intervals); OSRS wiki — Rune pickaxe (41 Mining to use, 40 Attack to equip) and Steel/Mithril/Adamant pickaxe pages (use vs equip gates)"
techniques:
- name: start with Doric's Quest for 1,300 xp (level 1 to 10)
- name: "mode contract: fast-xp vs banked-income (chosen at session start, never silently highest-available)"
why: "fast-xp powermines iron 15+ (copper/tin below 15) and DROPS every full inventory; banked-income fixes ONE target ore + mine, validates it (Mining level, location, inventory policy), logs it in activity state, and BANKS every load. The two modes pick different rocks, use different inventory handling, and stop at different targets — the entry never selects a rock for the operator"
source: "owner decision 2026-08-28 (governor guidance channel, PR #11): expose separate fast-xp and banked-income modes; encoded in this entry's state_machine + a2 params"
- name: "start with Doric's Quest for 1,300 xp (level 1 to 10)"
why: "the quest reward alone takes Mining from 1 to 10; the materials (6 clay, 4 copper, 2 iron) mine at level 1 except iron, which can be bought on the GE"
source: "OSRS wiki — Free-to-play Mining training (Level 1-10: Doric's Quest)"
- name: powermine iron at Al Kharid mine for maximum XP (combat 29+ only)
why: "iron (level 15, 35 xp) is the fastest F2P training ore and Al Kharid is the only F2P site with three iron rocks around one tile — zero travel between respawns; ~50,000 xp/hr at 41 Mining with a rune pickaxe, 52,500 at 61+ (3 ores per 12 ticks); drop the ores — banking costs XP. Entry gate: the mine's level-14 scorpions are aggressive to combat 28, so this spot runs at combat 29+"
- name: "powermine iron at Al Kharid mine for maximum XP (fast-xp only, combat 29+ gate)"
why: "iron (level 15, 35 xp) is the fastest F2P training ore and Al Kharid is the only F2P site with three iron rocks around one tile — zero travel between respawns; modeled fast-xp rate ~32,400 XP/hr at 61+ with rune (midpoint policy model, see economy comments); drop the ores, banking costs XP. Entry gate: the mine's level-14 scorpions are aggressive to combat 28, so this spot runs at combat 29+"
source: "OSRS wiki — Free-to-play Mining training (Levels 15-99: Iron ore); OSRS wiki — Aggressiveness"
- name: bank iron at the South-east Varrock mine for smithing/money (sub-29 default)
why: "the guide names this F2P banking location explicitly; the eastern Varrock bank is the closest bank leg, and the ores feed Smithing. This is also the sub-combat-29 route (no aggressive NPCs)"
- name: "bank iron at the South-east Varrock mine (sub-29 default and banked-income anchor)"
why: "the guide names this F2P banking location explicitly; the eastern Varrock bank is the closest bank leg, and the ores feed Smithing. Also the sub-combat-29 route (no aggressive NPCs) and the banked-income anchor: modeled ~56,500 gp/hr with rune (midpoint policy model, see economy comments)"
source: "OSRS wiki — Free-to-play Mining training (Levels 1/10-15 and 15-99: banking locations)"
- name: "coal route: West Lumbridge Swamp mine, or Superheat in place"
why: "coal (level 30, 50 xp) banks reasonably from the Lumbridge Swamp mine; with 43 Magic, Superheat Item converts coal into bars without a furnace, cutting bank trips (staff of fire + nature runes, 26 inventory slots)"
- name: "banked-income example: adamantite at the Al Kharid mine (70 Mining)"
why: "deterministic target ore + location: adamantite (70 Mining, 95 xp, 584 gp low edge) at the Al Kharid south rocks, banked at the adjacent bank; modeled ~490,000 gp/hr with rune (midpoint policy model, see economy comments); the wiki cites adamantite banking as a good F2P money method"
source: "OSRS wiki — Free-to-play Mining training (Levels 30-99 and money-making); prices.runescape.wiki snapshot 2026-08-27"
- name: "superheat coal (optional banked variant): West Lumbridge Swamp mine"
why: "coal (level 30, 50 xp) banks reasonably from the Lumbridge Swamp mine; with 43 Magic, Superheat Item converts coal into bars without a furnace, cutting bank trips (staff of fire + nature runes)"
source: "OSRS wiki — Free-to-play Mining training (Levels 30-99: Superheat Item)"
- name: bank-distance tradeoff
why: "farther mines become viable when bank travel is proportionally small (superheat method) — pick the mine whose bank leg costs the least per trip for the mode being run"
source: "OSRS wiki — Free-to-play Mining training (Levels 30-99: Superheat Item — mines farther from a bank become viable)"
- name: "worked example — fast-xp session (preparation -> first full inventory -> first break -> resume)"
why: "Account: Mining 41, Attack 1, combat 35 (passes the Al Kharid gate). (1) prepare: mode fast-xp; ore policy iron 15+; pickaxe by MINING level -> rune (41 <= 41); equip gate Attack 1 < 40 -> CARRY the same tool (27 ore slots); the rune pickaxe is already owned, so acquire = withdraw from bank; initial inventory = pickaxe + empty ore space. (2) travel: walk to Al Kharid (combat 35 >= 29 OK) and position at the 3-rock cluster. (3) mining rotations: click a fresh iron rock (a2, rune delay [1800, 3600] ms) -> wait_rock: ore gained after the 1.8 s roll -> mine; repeat until the inventory is full. (4) first full-inventory boundary: 27 ores -> drop_run: 27 executions of a6 (right_click Drop, [200, 800] ms each) -> count_item ore == 0 -> mine. (5) first scheduled break: after the 8th-14th rotation the break counter trips -> break_state: take_break 60-180 s (a10). (6) resume: reposition at the cluster (a11) -> mine; the loop repeats until the XP target or session cap -> complete"
source: "derived from this entry's policy model (state_machine prepare/travel/mine/wait_rock/drop_run/break_state/complete + actions a1/a2/a6/a8-a11 + run_control.break), synthesized 2026-08-28"
- name: "worked example — banked-income session (preparation -> first full inventory -> first break -> resume)"
why: "Account: Mining 70, Attack 40, combat 60. Target: 500,000 gp banked or a 2 h session cap. (1) prepare: mode banked-income; target ore = adamantite (ore level 70 <= Mining 70 OK; location = Al Kharid south rocks, which contain adamantite; inventory policy = banked, deposit every load) — target logged in activity state; pickaxe by MINING level -> rune (41 <= 70); equip gate Attack 40 >= 40 -> EQUIP (28 ore slots); tool owned, withdraw from bank. (2) travel: walk to the Al Kharid south adamantite spot. (3) mining rotations: click a fresh adamantite rock (rune roll 1.8 s, delay [1800, 3600] ms) -> wait_rock: ore gained -> mine; repeat. (4) first full-inventory boundary: 28 ores -> bank_run: walk to the adjacent Al Kharid bank (a3), deposit all 28 (a4; load value 28 x 584 = 16,352 gp logged to activity state), walk back (a5) -> mine. (5) first scheduled break: after 8-14 rotations -> break_state: take_break 60-180 s (independent of the bank trips). (6) resume: reposition at the spot (a11) -> mine; complete when the banked value >= 500,000 gp or the session cap hits"
source: "derived from this entry's policy model (state_machine prepare/travel/mine/wait_rock/bank_run/break_state/complete + actions a1-a5/a8-a11 + run_control.break), synthesized 2026-08-28"
economy:
# Snapshot 2026-08-27, prices.runescape.wiki latest (sell = low edge).
# Cycle = one rock mined -> one ore (XP path) or one ore banked (money path).
# XP rates sourced from the wiki guide (iron powermine); gp/h model below is
# derived and labelled (no wiki gp/hr figure exists for banked iron).
# Cadence consistency: the 52,500 xp/hr figure IS the continuous 61+ rotation
# (rune pickaxe): 52,500 / 35 xp = 1,500 ores/hr = one ore per 2.4s, which is
# the rune roll (1.8s) + wait_rock outcome gate + anti_ban delay [1800, 3600]
# midpoint (2.7s) — the modeled a2 cadence brackets the wiki rate.
item: Iron ore # anchor: the F2P training ore
# Anchor: iron ore (the fast-xp training ore). Sell prices are the
# 2026-08-27 snapshot (prices.runescape.wiki latest, low edge).
#
# MODELLED POLICY RATES (midpoint model, derived 2026-08-28) — the
# entry's OWN parameters, not the wiki's zero-overhead ideals:
# per-ore cycle = a2 anti_ban.delay midpoint (rune [1800, 3600] ms ->
# 2.7 s; the governor ceiling check 3600/2.7 x 35 = 46,667 XP/hr is an
# unreachable ideal even before overhead) + 10% respawn/depletion idle
# (wait_rock absorbs the wiki 3-12 s rock respawn) + drop-or-bank leg
# amortised per ore + break amortised per ore (120 s per 11 rotations,
# run_control.break midpoints).
# fast-xp iron, drop, rune 61+ (equipped): 2.7 + 0.3 + 0.5 (28 drops x
# 0.5 s per load / 28 ores) + 0.39 (120/11/28) = 3.89 s/ore -> ~925
# ores/hr -> ~32,400 XP/hr (xp_per_hour below).
# banked-income iron, SE Varrock: 2.7 + 0.3 + 1.07 (bank leg ~30 s per
# 28-ore load) + 0.39 = 4.46 s/ore -> ~807 ores/hr -> ~56,500 gp/hr
# (gp_per_hour_high below).
# banked-income adamantite, Al Kharid south: 2.7 + 0.3 + 0.9 (short
# bank leg ~25 s per load) + 0.39 = 4.29 s/ore -> ~839 ores/hr ->
# ~490,000 gp/hr (profit_drivers). The 2-rock spot respawns tighter
# than the 3-rock spot, so treat modeled rates as upper bounds.
# bronze path (below 15, copper/tin 17.5 xp): cadence midpoint 5.7 s ->
# ~8,800 XP/hr.
# EXTERNAL BENCHMARK (NOT the modeled rate): the wiki's 50,000 XP/hr
# (41+) / 52,500 XP/hr (61+) iron powermine figures assume a continuous
# 3-tick rotation with zero delay/drop/break overhead; the configured
# midpoint cadence alone caps that ideal at ~46,667 XP/hr, so 52,500 is
# cited ONLY as a labeled wiki benchmark and never as this entry's
# expected output.
item: Iron ore # fast-xp anchor; banked-income targets in profit_drivers
item_id: 440
cost_per_cycle: 0 # mining consumes nothing (pickaxe has no fuel; no supply costs)
income_per_cycle: 70 # iron ore sell price (low edge), snapshot 2026-08-27
net_per_cycle: 70 # no per-cycle costs; selling optional (powermine drops -> 0)
gp_per_hour_low: 0 # powermine mode drops ores — XP is the product
gp_per_hour_high: 28000 # MODELLED (dated): ~400 banked iron ores/hr (bank legs reduce the 52.5k-xp/hr powermine rate) x 70 gp
xp_per_hour: 52500 # iron powermine, 61+ (50,000 at 41+ with rune pickaxe) — wiki guide
net_per_cycle: 70 # no per-cycle costs; fast-xp drops ores -> realized income 0
gp_per_hour_low: 0 # fast-xp mode drops every load — XP is the product
gp_per_hour_high: 56500 # MODELLED banked-income rate (iron @ SE Varrock, midpoint model above)
xp_per_hour: 32400 # MODELLED fast-xp policy rate (rune 61+ drop, midpoint model above) — NOT the 52,500 wiki benchmark
supplies:
- item: "pickaxe: highest tier the account can wield (rune needs 40 Attack to equip; below that carried in the inventory)"
- item: "pickaxe — best tier selectable by MINING level (bronze 1, iron 1, steel 6, mithril 21, adamant 31, rune 41); equip ONLY when the ATTACK level permits (steel 5, mithril 20, adamant 30, rune 40), otherwise carry the same selected tool (a 1-Attack/41-Mining account carries and uses a rune pickaxe)"
qty_per_cycle: 1
source: bank
profit_drivers:
- "F2P ore chain (wiki guide): clay 1/5xp, copper 1/17.5, tin 1/17.5, iron 15/35, silver 20/40, coal 30/50, gold 40/65, mithril 55/80, adamantite 70/95, runite 85/125"
- "Sell prices 2026-08-27 (low edge): iron 70, coal 151, silver 73, gold 154, mithril 159, adamantite 584, runite 10,265"
- "Money routes: adamantite banking is a good F2P money method (70 Mining); runite (85 Mining) is cited as one of the fastest F2P money-making methods"
- "For XP, powermining iron beats every banked route — drop the ores (guide-recommended)"
- "fast-xp: powermine iron 15+ and drop every load — XP is the product, realized gp 0"
- "banked-income (midpoint model, derived 2026-08-28): iron @ SE Varrock ~56,500 gp/hr; adamantite @ Al Kharid south ~490,000 gp/hr — deterministic target ore + location, never highest-available"
- "Money routes (wiki): adamantite banking is a good F2P money method (70 Mining); runite (85 Mining) is one of the fastest F2P money-making methods"
state_machine:
initial: idle
initial: prepare
terminal: [complete, failed]
states:
idle:
goal: "be at the chosen mine with the pickaxe ready (equipped only if the account meets its Attack requirement) and the inventory clear; run mode chosen at session start (powermine: drop ores; banked: bank ores)"
next: [mine, complete, failed]
prepare:
goal: >
Session start. 1) Choose the run mode (session param): fast-xp
(powermine, drop) or banked-income (deterministic target ore +
location, bank). 2) fast-xp ore policy: iron 15+ (copper/tin below
15). banked-income: pick ONE target ore and ONE mine now and
validate: level_is Mining >= ore level, the location contains that
ore, and the inventory policy can hold it (banked -> deposit every
load). 3) Pickaxe: select the highest tier whose MINING
requirement the account meets (bronze 1, iron 1, steel 6, mithril
21, adamant 31, rune 41 — rune is usable at 41 Mining and
equipable at 40 Attack; a 1-Attack/41-Mining account selects and
CARRIES a rune pickaxe). 4) Equip ONLY when level_is Attack >=
the tier's equip requirement (steel 5, mithril 20, adamant 30,
rune 40); otherwise carry the same selected tool. 5) Acquire the
tool if missing (a8) and build the initial inventory: pickaxe
(equipped or carried) + empty ore space; no food (both routes are
gate-safe). 6) Record mode + target in activity state — the target
must be visible, never implicit.
next: [travel, complete, failed]
travel:
goal: "walk/teleport to the selected mine (fast-xp: Al Kharid 3-rock powermine at combat 29+, else banked South-east Varrock; banked-income: the session's validated target mine) and position at the target cluster; arrive with the pickaxe equipped or carried per the prepare gate"
next: [mine, recover]
mine:
goal: "mine the current tier's rock until the inventory is full or the target is reached; every click (a2) is followed by the wait_rock outcome wait — never chain clicks on the same rock"
next: [wait_rock, drop_run, bank_run, complete, failed]
goal: >
Mine the session target rock until the inventory is full or the
run target is reached. Rock selection is MODE-DRIVEN and
deterministic: fast-xp mines iron (15+) or copper/tin (<15);
banked-income mines ONLY the session target ore (never the highest
available rock). Every a2 click is followed by the wait_rock
outcome wait — never chain clicks on the same rock.
next: [wait_rock, drop_run, bank_run, recover, survive, complete]
wait_rock:
goal: "after clicking a rock (a2), wait for the mining outcome — ore gained, rock depleted, or roll timeout — before any re-click; never re-click the active rock while its roll is unresolved"
next: [mine, drop_run, bank_run, failed]
bank_run:
goal: "walk to the bank, deposit ores, walk back to the mine"
next: [mine, idle]
goal: "after clicking a rock (a2), wait for the mining outcome — ore gained, rock depleted, or roll timeout (2x the equipped tier's roll) — before any re-click; never re-click the active rock while its roll is unresolved; a fully depleted cluster is a respawn wait, absorbed here (wiki rock respawn 3-12 s)"
next: [mine, drop_run, bank_run, recover]
drop_run:
goal: "drop every occupied ore slot: one right-click Drop per slot (a6), looping until the inventory holds no ore — slot count is DYNAMIC (inventory capacity minus non-ore items: equipped pickaxe = 28 ore slots, carried = 27, survival/gear load = fewer); drive the loop off count_item ore, never hardcode a slot number"
next: [drop_run, mine]
goal: "fast-xp ONLY: drop every occupied ore slot — one right-click Drop per slot (a6 re-executed), looping until count_item ore == 0. Slot count is DYNAMIC: inventory capacity minus non-ore items (equipped pickaxe = 28 ore slots, carried = 27, any session load = fewer) — never a hardcoded loop count"
next: [drop_run, mine, break_state, complete]
bank_run:
goal: "banked-income ONLY: walk to the nearest bank, deposit all ores (activity state: target ore + load value logged), walk back to the mine; the pickaxe stays (equipped or carried) and the inventory is rebuilt as empty ore space for the next load"
next: [mine, break_state, complete]
break_state:
goal: "scheduled break independent of incidental banking: after every run_control.break.every rotations (8-14) take_break (60-180 s AFK, a10), then reposition at the cluster (a11) and resume mining"
next: [mine, complete]
recover:
goal: "diagnose and fix: no fresh rock of the target tier for 2 respawn cycles (rotate cluster / wait respawn); invalid location (is_at fails — wrong mine or wrong ore) -> re-travel to the correct mine; missing tool (has_item pickaxe false) -> acquire (a8) and re-prepare; path failure (move_to on_fail) -> retry travel. Persistent after 3 recoveries -> failed"
next: [prepare, travel, mine, failed]
survive:
goal: "defensive fallback only (the 29+ gate means scorpions never aggro at Al Kharid): if attacked anyway (gate bypassed/griefed), retreat out of the aggro radius and re-enter the cluster when safe; no food loop is modeled"
next: [mine, failed]
complete:
goal: level or GP target reached
goal: "fast-xp: XP/level target reached. banked-income: banked GP target reached (or session cap)."
failed:
goal: hard failure — stop, log ERROR sentinel, alert
goal: "hard failure — stop, log ERROR sentinel, alert"
transitions:
- from: prepare
when: "mode + target set and validated, tool ready, inventory built"
to: travel
- from: prepare
when: "target already reached at session start (fast-xp level target / banked GP target)"
to: complete
- from: prepare
when: "3 consecutive failed tool acquisitions or an unvalidatable target (invalid banked ore/location combination)"
to: failed
- from: travel
when: "is_at the selected mine and positioned at the cluster"
to: mine
- from: travel
when: "path failure (move_to retries exhausted)"
to: recover
- from: mine
when: "a2 rock click issued (the tier roll is now in progress)"
to: wait_rock
- from: mine
when: "inventory full (fast-xp mode)"
to: drop_run
- from: mine
when: "inventory full (banked-income mode)"
to: bank_run
- from: mine
when: "no fresh target-tier rock available for 2 respawn cycles, or has_item pickaxe == false (tool lost/griefed)"
to: recover
- from: mine
when: "HP < 40% (hp_is — defensive only; unexpected aggro despite the gate)"
to: survive
- from: mine
when: "fast-xp: XP/level target reached; banked-income: banked GP target reached (or session cap)"
to: complete
- from: wait_rock
when: "ore gained (count_item ore > count at click) or the clicked rock depleted"
to: mine
@ -113,52 +221,70 @@ state_machine:
when: "roll timeout (no outcome within 2x the equipped tier's roll interval)"
to: mine
- from: wait_rock
when: "inventory full (powermine mode)"
when: "inventory full (fast-xp mode)"
to: drop_run
- from: wait_rock
when: "inventory full (banked mode)"
to: bank_run
- from: mine
when: "inventory full (powermine mode)"
to: drop_run
- from: mine
when: "inventory full (banked mode)"
when: "inventory full (banked-income mode)"
to: bank_run
- from: wait_rock
when: "cluster fully depleted and the respawn wait exceeded (no rock of the target tier in range)"
to: recover
- from: drop_run
when: "inventory still holds ore (count_item ore > 0)"
to: drop_run
- from: drop_run
when: "inventory empty of ore (count_item ore == 0)"
when: "inventory empty of ore (count_item ore == 0) and break counter < break.every"
to: mine
- from: mine
when: "HP < 40% (hp_is — defensive only; unexpected aggro despite the gate)"
to: survive
- from: drop_run
when: "inventory empty of ore (count_item ore == 0) and break counter >= break.every"
to: break_state
- from: drop_run
when: "fast-xp XP target reached (target < inventory capacity)"
to: complete
- from: bank_run
when: "ores deposited and back at the mine, break counter < break.every"
to: mine
- from: bank_run
when: "ores deposited and back at the mine, break counter >= break.every"
to: break_state
- from: bank_run
when: "banked GP target reached on this deposit"
to: complete
- from: break_state
when: "take_break finished (60-180 s)"
to: mine
- from: break_state
when: "session cap reached during the break"
to: complete
- from: recover
when: "tool missing -> re-acquired (a8) or withdrawn from bank"
to: prepare
- from: recover
when: "wrong location -> re-routed to the correct mine"
to: travel
- from: recover
when: "rocks unavailable -> respawned or rotated to a fresh cluster of the target tier"
to: mine
- from: recover
when: "recovery looped 3 times (persistent tool/location/path failure)"
to: failed
- from: survive
when: "out of combat (HP stable, no attacker in range)"
to: mine
- from: survive
when: "is_dead (gate bypassed/griefed)"
to: failed
- from: bank_run
when: "ores deposited and back at the mine"
to: mine
- from: idle
when: "level or GP target reached"
to: complete
- from: mine
when: "level or GP target reached"
to: complete
actions:
- id: a1
step: reach-mine
step: travel-to-mine
verb: move_to
target: "selected F2P mine"
target: "the mode's mine"
params:
location: "Al Kharid Mine (powermine) or South-east Varrock mine (banked)"
location: "fast-xp: Al Kharid Mine powermine (combat 29+ only) or South-east Varrock mine (sub-29 default); banked-income: the session's validated target mine (example: Al Kharid south adamantite rocks)"
method: [walk, teleport]
note: "arrive with the pickaxe equipped ONLY if the account meets its Attack requirement (rune = 40 Attack); otherwise carry it in the inventory"
route_gate: "Al Kharid powermine ONLY at combat level >= 29 (level_is Combat >= 29 — the level-14 scorpion's aggro ceiling is combat 28, wiki Aggressiveness); below combat 29 use the banked South-east Varrock route (no aggressive NPCs, no food required)"
note: "arrive with the pickaxe equipped ONLY if level_is Attack >= the tier's equip requirement (rune = 40 Attack); otherwise carry the same selected tool in the inventory"
route_gate: "Al Kharid powermine ONLY at combat level >= 29 (level_is Combat >= 29 — the level-14 scorpion's aggro ceiling is combat 28, wiki Aggressiveness); below combat 29 use the banked South-east Varrock route (no aggressive NPCs, no food required); the Al Kharid south adamantite spot sits outside the scorpion cluster and is gate-checked the same way"
on_fail: retry
anti_ban:
delay: [400, 1600]
@ -166,42 +292,44 @@ actions:
- id: a2
step: mine-rock
verb: click_object
target: "fresh rock in the cluster — never the rock whose roll is in progress"
target: "fresh rock of the session target tier — never the rock whose roll is in progress"
params:
rock: "iron rock (tier-gated: silver 20, coal 30, gold 40, mithril 55, adamantite 70, runite 85)"
gate: "level_is Mining >= rock level"
rotation: "3-rock cluster (Al Kharid) or nearest cluster of the selected tier; face the respawning rock and click a fresh rock only after the wait_rock outcome wait"
roll_table: "pickaxe roll interval (ticks x 0.6s, wiki table verified 2026-08-27): bronze 8 = 4.8s, iron 7 = 4.2s, steel 6 = 3.6s, mithril 5 = 3.0s, adamant 4 = 2.4s, rune 3 = 1.8s"
cadence: "mandatory pause per click = equipped pickaxe roll interval from roll_table + [0, 1800]ms humanisation (anchor model below: rune pickaxe @ 61+ -> delay [1800, 3600]; bronze users apply [4800, 6600], iron [4200, 6000], steel [3600, 5400], mithril [3000, 4800], adamant [2400, 4200]). The pause must never be shorter than the equipped tier's FULL roll, and the wait_rock outcome wait must elapse before any re-click — clicking before the roll resolves (or before the rock depletes) cannot speed the ore and is the bot tell"
rock: "MODE-DRIVEN: fast-xp -> iron rock (level 15+; copper/tin below 15); banked-income -> ONLY the session target ore validated in prepare (silver 20, coal 30, gold 40, mithril 55, adamantite 70, runite 85) — never highest-available"
gate: "level_is Mining >= rock level (e.g. adamantite = 70), and for banked-income the rock must be at the session's validated location"
mode_visible: "activity state logs mode + target ore (id + name) on every rotation — the target is visible, never implicit"
rotation: "3-rock cluster (Al Kharid) or the nearest cluster of the target tier; face the respawning rock and click a fresh rock only after the wait_rock outcome wait"
roll_table: "pickaxe roll interval (ticks x 0.6 s, wiki table verified 2026-08-27): bronze 8 = 4.8 s, iron 7 = 4.2 s, steel 6 = 3.6 s, mithril 5 = 3.0 s, adamant 4 = 2.4 s, rune 3 = 1.8 s"
cadence: "mandatory pause per click = the equipped tier's full roll interval from roll_table + [0, 1800] ms humanisation: rune [1800, 3600], adamant [2400, 4200], mithril [3000, 4800], steel [3600, 5400], iron [4200, 6000], bronze [4800, 6600]. The pause must never be shorter than the equipped tier's FULL roll, and the wait_rock outcome wait must elapse before any re-click — clicking before the roll resolves cannot speed the ore and is the bot tell"
wait_for: "mining outcome — modeled as the wait_rock state: re-click a fresh rock only when ore was gained, the clicked rock depleted, or the roll timed out (2x roll)"
on_fail: retry
anti_ban:
delay: [1800, 3600] # rune-pickaxe anchor (61+): full 1.8s roll + up to 1.8s humanisation; per-tier floor in params.roll_table — never below the equipped tier's full roll
delay: [1800, 3600] # rune-pickaxe anchor (61+): full 1.8 s roll + up to 1.8 s humanisation; per-tier floor in params.roll_table/cadence — never below the equipped tier's full roll
- id: a3
step: bank-ores
step: bank-approach
verb: move_to
target: bank
params:
location: "nearest bank to the mine (east Varrock for SE Varrock mine, Lumbridge Castle for the Swamp mine)"
location: "nearest bank to the mine (Al Kharid bank for the powermine/adamantite spot, east Varrock bank for SE Varrock mine, Lumbridge Castle for the Swamp mine)"
method: [walk, teleport]
on_fail: retry
anti_ban:
delay: [400, 1200]
- id: a4
step: deposit
step: deposit-ores
verb: bank_inventory
target: bank
params:
deposit: [all ores]
withdraw: "nothing (banked mode)"
withdraw: "nothing (banked-income mode; the pickaxe stays equipped or carried — inventory rebuilt as empty ore space for the next load)"
note: "log the load to activity state: target ore, qty, banked value"
on_fail: alert
anti_ban:
delay: [500, 1100]
- id: a5
step: return-mine
step: return-to-mine
verb: move_to
target: "the mine"
params:
@ -211,13 +339,13 @@ actions:
delay: [400, 1200]
- id: a6
step: drop-ores
step: drop-ore-slot
verb: right_click
target: "ore slot in inventory"
params:
option: "Drop"
iterate: "one occupied ore slot per execution — non-stackable ores need one Drop per slot; the drop_run -> drop_run transition re-executes a6 until count_item ore == 0. Slot count is DYNAMIC (inventory capacity minus non-ore items: equipped pickaxe = 28, carried = 27) — never hardcode a slot number"
mode: "powermine only"
iterate: "one occupied ore slot per execution — non-stackable ores need one Drop per slot; drop_run -> drop_run re-executes a6 until count_item ore == 0. Slot count is DYNAMIC (inventory capacity minus non-ore items: equipped pickaxe = 28 ore slots, carried = 27, any session load = fewer) — never a hardcoded loop count"
mode: "fast-xp only — banked-income never drops ore"
on_fail: skip
anti_ban:
delay: [200, 800] # drop churn on a full inventory is human-normal
@ -233,32 +361,81 @@ actions:
anti_ban:
delay: [600, 1800]
- id: a8
step: acquire-tool
verb: ge_buy
target: grand-exchange
params:
item: "the selected pickaxe tier (Mining-gated: bronze 1, iron 1, steel 6, mithril 21, adamant 31, rune 41)"
qty: 1
max_price: "GE mid + 10% cap"
note: "acquisition route for prepare/recover: when the tool is already owned, withdraw it from the bank instead (bank_inventory withdraw 1x pickaxe); buy only what is missing — never a second pickaxe in the inventory"
on_fail: retry
anti_ban:
delay: [1200, 3000]
- id: a9
step: equip-tool
verb: use_item_on
target: "self"
params:
item: "the selected pickaxe tier"
on: "self (equip)"
gate: "RUN ONLY IF level_is Attack >= the tier's equip requirement (steel 5, mithril 20, adamant 30, rune 40) — otherwise SKIP and carry the same selected tool in the inventory; mining from the inventory works at any level (a 1-Attack/41-Mining account mines with a carried rune pickaxe)"
on_fail: skip
anti_ban:
delay: [600, 1400]
- id: a10
step: take-break
verb: take_break
target: "self"
params:
duration: "run_control.break.for [60, 180] s of idle AFK"
note: "breaks are independent of incidental banking: the counter runs on rotations (run_control.break.every [8, 14]), not on bank visits"
on_fail: retry
anti_ban:
delay: [300, 900]
- id: a11
step: reposition-cluster
verb: walk_to
target: "cluster center / fresh rock of the target tier"
params:
location: "the session's mine, cluster of the target tier"
note: "recovery + post-break reposition: after take_break, respawn waits, or a recover diagnosis, walk to the cluster's centre tile and re-select a fresh rock; never click a rock while walking"
on_fail: retry
anti_ban:
delay: [400, 1200]
run_control:
iteration: "one full mine -> bank (or drop) rotation" # per docs/schema.md: break.every counts iterations
iteration: "one full mine -> drop (fast-xp) or mine -> bank (banked-income) rotation"
max_iterations: null
break:
every: [8, 14] # iterations = full mine->bank/drop rotations
for: [60, 180] # seconds of idle AFK
every: [8, 14] # rotations; the break counter is independent of incidental banking
for: [60, 180] # seconds of idle AFK (take_break, a10)
stop_conditions:
- "level or GP target reached"
- "fast-xp: Mining XP/level target reached (session target); banked-income: banked GP target reached or session cap"
- "3 consecutive failed rock clicks (client issue — do not loop)"
- "death: hard failure — the Al Kharid hard gate (combat 29+) and the survive (retreat) fallback prevent it in normal operation; if is_dead anyway (gate bypassed/griefed) log ERROR + alert and stop, no respawn loop"
- "recover looped 3 times: persistent missing tool, invalid location, or path failure"
- "death: hard failure — the Al Kharid hard gate (combat 29+) and the survive (retreat) fallback prevent it in normal operation; if is_dead anyway (gate bypassed/griefed) log ERROR + alert and stop — no respawn loop"
risk:
ban_level: low
notes:
- "Mining is a staple low-risk method: long, repetitive, low-input behaviour that matches normal player sessions — the guide itself recommends hours of drop-mining."
- "The powermine rotation is the detection vector if executed perfectly for hours — keep the a2 tier-aware cadence (wait_rock outcome wait + roll_table pause; anchor rune 1.8-3.6s, never below the equipped tier's full roll) and take the break schedule."
- "Al Kharid mine has aggressive level-14 scorpions (they attack players at combat level <= 28 — wiki Aggressiveness). The entry HARD-gates Al Kharid to combat 29+; sub-29 accounts run the banked South-east Varrock route (no aggressive NPCs). No food is part of either route; the survive state (retreat) is a defensive fallback only."
- "The powermine rotation is the detection vector if executed perfectly for hours — keep the a2 tier-aware cadence (wait_rock outcome wait + roll_table pause; anchor rune 1.8-3.6 s, never below the equipped tier's full roll) and take the break schedule."
- "Al Kharid mine has aggressive level-14 scorpions (they attack players at combat level <= 28 — wiki Aggressiveness). The entry HARD-gates Al Kharid to combat 29+; sub-29 accounts run the banked South-east Varrock route (no aggressive NPCs). Both modes select the pickaxe by Mining level and equip only when the Attack level permits (rune 41 Mining usable / 40 Attack equip: a 1-Attack/41-Mining account carries and uses a rune pickaxe). No food is part of either route; the survive state (retreat) is a defensive fallback only."
sources:
- "OSRS wiki — Active/passive aggressive monsters: Aggressiveness (a monster attacks players whose combat level is <= 2x its level; a level-14 scorpion is safe from combat level 29) — verified 2026-08-27"
- "OSRS wiki — Scorpion (combat level 14, hitpoints 17; Al Kharid mine) — verified 2026-08-27"
- "OSRS wiki — Free-to-play Mining training (ore level/xp table — all rows F2P; pickaxe tier table with tick intervals (bronze 8 -> rune 3); Doric's Quest 1,300 xp; iron 50,000 xp/hr at 41+ / 52,500 at 61+; Al Kharid 3-rock spot; SE Varrock banking; Superheat coal; adamantite/runite as F2P money methods; scorpions noted — the guide says 'bring food', this entry hard-gates the mine to combat 29+ instead, so food is not modeled) — verified 2026-08-27"
- "OSRS wiki — Free-to-play Mining training (ore level/xp table — all rows F2P; pickaxe tier table with tick intervals (bronze 8 -> rune 3); Doric's Quest 1,300 xp; iron 50,000 xp/hr at 41+ / 52,500 at 61+ cited as zero-overhead external benchmarks only; Al Kharid 3-rock spot; SE Varrock banking; Superheat coal; adamantite/runite as F2P money methods; scorpions noted — this entry hard-gates the mine to combat 29+ instead, so food is not modeled) — verified 2026-08-27"
- "OSRS wiki — Mining (skill overview, members=No)"
- "OSRS wiki — Rune pickaxe (41 Mining to use, 40 Attack to equip) / Adamant pickaxe (31 Mining, 30 Attack) / Mithril pickaxe (21 Mining, 20 Attack) / Steel pickaxe (6 Mining, 5 Attack) — use gate vs equip gate per tier — verified 2026-08-28"
- "prices.runescape.wiki/api/v1/osrs/mapping (ore ids: iron 440, coal 453, silver 442, gold 444, mithril 447, adamantite 449, runite 451 — all members=false; buy limits)"
- "prices.runescape.wiki/api/v1/osrs/latest (ore sell prices, snapshot 2026-08-27)"
verified: "2026-08-27" # keep quoted (YAML 1.1 date parsing)
verified: "2026-08-28" # keep quoted (YAML 1.1 date parsing)
related:
- magic-alch-handoff

View File

@ -125,6 +125,30 @@ def main():
f"{rel}: best_practice '{line.get('item') or line.get('name')}' "
f"carries a 'researched' source — citation TODO, file follow-up")
# 4. pickaxe gate distinction + mining run-mode contract
# (owner guidance 2026-08-28): the Mining level decides WHICH
# pickaxe can be USED; the Attack level decides ONLY whether it
# can be EQUIPPED. Any entry modelling pickaxes must express both
# gates separately; a mining entry must additionally pin the
# 1-Attack/41-Mining carry-and-use example (rune pickaxe usable at
# 41 Mining, equipable only at 40 Attack) and expose BOTH run
# modes (fast-xp powermine / banked-income).
blob = (yaml.safe_dump(data, sort_keys=False) or "").lower()
if "pickaxe" in blob:
if "mining level" not in blob:
errors.append(f"{rel}: pickaxe model misses the USABILITY gate — "
f"Mining level decides which pickaxe can be used")
if "attack" not in blob:
errors.append(f"{rel}: pickaxe model misses the EQUIP gate — "
f"Attack decides only whether the pickaxe can be equipped")
if "mining" in eid:
if "1-attack/41-mining" not in blob:
errors.append(f"{rel}: pickaxe gates lack the pinned 1-Attack/41-Mining "
f"example (a rune pickaxe carried and used at 1 Attack / 41 Mining)")
if "fast-xp" not in blob or "banked-income" not in blob:
errors.append(f"{rel}: mining entry must expose BOTH run modes "
f"(fast-xp powermine and banked-income) — owner decision 2026-08-28")
# report
for w in warnings:
print(f"WARN {w}")