From 587da06ef009e9e3d364cb822fd3dc0a98a48a3c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 03:19:52 -0500 Subject: [PATCH 1/7] codex: members low-alchemy entry (loss-minimizing) Live-verified 2026-08-27 against prices.runescape.wiki mapping/latest (members catalog: lowalch != null, members=true, 3232 tradeable items) plus OSRS wiki spell infoboxes and Module:Exchange limits. - Same state machine + actions as low-alch-f2p (golden template) - Top-10 least-loss members candidates in economy.profit_drivers - Handoff note verified from LA page: switch to HLA at 55 (hard level gate + strictly more coins and xp per cast); Superheat Item (43) is a smithing production spell, not the magic-XP handoff - best_practice: staff of fire, noted items, Bryophyta's staff + Tome of Fire combo, self-crafted natures via Abyss; every line sourced - accounts: membership members, min_level 21 Closes #2 --- codex/economy/low-alch-members.yaml | 198 ++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 codex/economy/low-alch-members.yaml diff --git a/codex/economy/low-alch-members.yaml b/codex/economy/low-alch-members.yaml new file mode 100644 index 0000000..473d2a4 --- /dev/null +++ b/codex/economy/low-alch-members.yaml @@ -0,0 +1,198 @@ +id: low-alch-members +title: Low-Level Alchemy (Members) +domain: economy +tags: [alching, magic-training, members, loss-training] +status: verified +version: 1 +updated: "2026-08-27" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date + +summary: > + Magic training from level 21 by low-alching members items with the lowest + loss per cast (high-limit, high-volume candidates first). Same state + machine and actions as low-alch-f2p; the catalog is the members item pool + (mapping lowalch != null, members=true, live GE prices 2026-08-27). At + current prices the method burns a small amount of GP per cast for 31 XP — + run it for XP, not GP. Handoff: switch to High Level Alchemy at level 55 + (hard level gate + strictly more coins AND XP per cast; see sources). + +accounts: + membership: members + min_level: 21 # Magic 21 to cast Low Level Alchemy (wiki-verified) + requires_quest: [] + requires_other: + - "Staff of Fire equipped (removes 3 fire runes from the cost)" + - "A bank with GE access within reach" + +best_practice: + equipment: + - item: staff of fire + why: "unlimited fire runes — LA rune cost drops from 3 fire + 1 nature to 1 nature per cast (~15gp/cycle saved)" + source: "OSRS wiki — Staff of Fire; Low Level Alchemy (Cost)" + techniques: + - name: cast on noted (stacked) items + why: "one inventory slot, minimal mouse travel between spell icon and item, no item un-noting" + source: "OSRS wiki — Low Level Alchemy (Usage: casting alchemy spells on noted items)" + - name: Bryophyta's staff + Tome of Fire (members-only, 50 Magic) + why: "charged Bryophyta's staff holds up to 1,000 nature runes (0 rune inventory slots) with a 1/15 chance per cast to not consume a nature rune; charged Tome of Fire supplies infinite fire runes in the shield slot and non-combat spells (alchemy) do not consume charges — the wiki documents this exact pair for alchemy profit; payback takes thousands of casts, so adopt at 50+ Magic when nature prices are high" + source: "OSRS wiki — Bryophyta's staff (passive effect; 'can be used along with a tome of fire to increase profits with High Level Alchemy'); OSRS wiki — Tome of Fire (level 50 Magic, non-combat spells do not consume charges)" + - name: self-craft nature runes as a cost cap + why: "members with 44 Runecraft can craft natures from pure essence, capping the per-cast rune cost at essence+time when GE nature prices spike; use the Abyss (no talisman needed) from the Mage of Zamorak" + source: "OSRS wiki — Nature rune (level 44 Runecraft, pure essence, 9 xp); OSRS wiki — Abyss (runic altar access)" + +economy: + # Verified 2026-08-27 against prices.runescape.wiki (live 'latest') + + # OSRS wiki (spell infoboxes, Module:Exchange limits, item pages). + item: Rune arrow # example anchor; rank by least-loss candidate live + item_id: 892 + cost_per_cycle: 188 # arrow buy 44 + nature rune 144 (staff of fire) + income_per_cycle: 160 # lowalch of rune arrow (40% of value 400) + net_per_cycle: -28 + gp_per_hour_low: -60000 # negative: this burns GP (31 xp/cast is the product) + gp_per_hour_high: -40000 + xp_per_hour: 55800 # 31 xp/cast (wiki) @ ~1800 casts/hr (3-tick, wiki) + supplies: + - item: rune arrow + qty_per_cycle: 1 + source: ge + ge_limit: 11000 # mapping + Module:Exchange/Rune arrow agree (wiki-verified) + - item: nature rune + qty_per_cycle: 1 + source: ge + ge_limit: 18000 + profit_drivers: + - "No profit to chase — this is loss-minimizing training: XP is the product. Pick the least-loss candidate live each run." + - "Top 10 losses 2026-08-27 (rank by (lowalch - buy), members catalog, mapping 'latest' low as buy basis):" + - "1. Mystic mist staff (id 20733, lowalch 17000, buy 1000, spread +16000, GE limit 8)" + - "2. Trailblazer top (t1) (id 25031, lowalch 6000, buy 555, spread +5445, GE limit 5)" + - "3. Twisted trousers (t2) (id 24401, lowalch 4000, buy 100, spread +3900, GE limit 5)" + - "4. Dual sai (id 23206, lowalch 2400, buy 1500, spread +900, GE limit 8)" + - "5. Adamant hasta(p) (id 11407, lowalch 832, buy 1, spread +831, GE limit 125)" + - "6. Adamant spear(p++) (id 5726, lowalch 832, buy 10, spread +822, GE limit 125)" + - "7. Bagged flower (id 8451, lowalch 2000, buy 1250, spread +750, GE limit 10000)" + - "8. Adamant spear(p) (id 1259, lowalch 832, buy 200, spread +632, GE limit 125)" + - "9. Frying pan (id 7441, lowalch 664, buy 101, spread +563, GE limit 50)" + - "10. Maple blackjack(d) (id 6420, lowalch 640, buy 100, spread +540, GE limit 125)" + - "Caveat: thin items (limits 5-8) cannot sustain a run and their 'low' fills can be stale — a bot cannot reliably buy at those prices. The sustainable loss-minimizers are the liquid high-limit set: rune arrow (892, -28/cast), rune javelin tips (19580, -7/cast), opal amulet (u) (21099, -199/cast), jade ring (21084, -63/cast)." + +state_machine: + initial: idle + terminal: [complete, failed] + states: + idle: + goal: reach the bank + have supplies in inventory + next: [casting, bank_supplies] + casting: + goal: cast Low Level Alchemy on the current candidate item + next: [bank_supplies, idle, complete, failed] + bank_supplies: + goal: bank the produced coins, withdraw fresh candidate + runes + next: [casting, idle] + complete: + goal: reached the run's XP/level target + failed: + goal: hard failure — stop, log ERROR sentinel, alert + transitions: + - from: casting + when: "candidate item count < buffer OR nature rune count < buffer" + to: bank_supplies + - from: idle + when: "magic level >= target (default 55, hand off to HLA at 55)" + to: complete + +# --- handoff note (wiki-verified 2026-08-27, do not copy from other entries) --- +# Low Level Alchemy: level 21, 31 xp/cast, 1 nature + 3 fire (spellbook: Normal). +# Superheat Item: level 43, 53 xp/cast, 1 nature + 4 fire — a SMITHING +# production spell (ore -> bar), NOT the magic-XP handoff; as pure Magic +# training it is only a soft side option (e.g. training Smithing alongside). +# High Level Alchemy: level 55, 65 xp/cast, 1 nature + 5 fire. +# Handoff: the LA page itself states "Players with level 55 Magic are +# generally recommended to use High Level Alchemy instead, as it provides +# more coins and experience per cast than Low Level Alchemy". So the switch +# is level 55: a HARD level gate (HLA uncastable below 55) plus strict +# dominance afterwards (with a fire staff both cost 1 nature/cast, and HLA +# pays 60% of value + 65 xp vs LA's 40% + 31 xp) — after 55, LA is strictly +# worse for Magic XP and is never the right call except when deliberately +# burning GP at minimum XP (never recommended). + +actions: + - id: a1 + step: reach-bank + verb: move_to + target: bank + params: + location: "nearest bank with GE" + method: [teleport, walk] + on_fail: retry + anti_ban: + delay: [400, 1600] + + - id: a2 + step: buy-supplies + verb: ge_buy + target: grand-exchange + params: + item: "current candidate item" + qty: "fill to buffer" + max_price: "live low + 5%" + on_fail: retry + anti_ban: + delay: [1200, 3000] + + - id: a3 + step: cast-alch + verb: use_item_on + target: "candidate item in inventory" + params: + spell: "Low Level Alchemy" + item: "least-loss live candidate in inventory" + on: "itself" + on_fail: retry + anti_ban: + delay: [1600, 3400] # 3-tick cast = ~5.4s game; stay under it, humanised + + - id: a4 + step: bank-loop + verb: bank_inventory + target: bank + params: + deposit: [all coins, all products] + withdraw: "candidate item + nature runes up to buffer" + on_fail: alert + +run_control: + iteration: "one cast" + max_iterations: null + break: + every: [8, 14] # bank cycles (breaks land on bank visits) + for: [45, 120] # seconds of idle AFK + stop_conditions: + - "magic level >= target (55 -> hand off to HLA)" + - "gp under floor" + - "3 consecutive failed casts (client issue — do not loop)" + +risk: + ban_level: low + notes: + - "High cast cadence is the main detection vector; keep anti_ban delays." + - "GE buy bursts: pace offers, respect the 4h limit window; thin items (limit < 100) cannot sustain a long run." + - "Thin-item 'latest low' fills can be stale — confirm fill price with a live GE offer before committing a run; the liquid high-limit set is the dependable loss-minimizer." + +sources: + - "OSRS wiki — Low Level Alchemy (level 21, 31 xp/cast, 3-tick, 1 nature + 3 fire; spellbook Normal; infobox 2026-08-27)" + - "OSRS wiki — High Level Alchemy (level 55, 65 xp/cast, 1 nature + 5 fire; 60% of item value; infobox 2026-08-27)" + - "OSRS wiki — Superheat Item (level 43, 53 xp/cast, 1 nature + 4 fire; smithing production spell; infobox 2026-08-27)" + - "OSRS wiki — Low Level Alchemy (handoff quote: 'Players with level 55 Magic are generally recommended to use High Level Alchemy instead, as it provides more coins and experience per cast than Low Level Alchemy')" + - "prices.runescape.wiki mapping 2026-08-27 (members/lowalch/highalch/limit catalog; lowalch == highalch*2//3 asserted for cited items)" + - "prices.runescape.wiki latest 2026-08-27 (low = per-repo buy basis; rune arrow buy 44, nature rune buy 144)" + - "OSRS wiki — Module:Exchange/Rune arrow, Nature rune, Staff of fire + top-10 candidates (GE limits agree with mapping; verified 2026-08-27)" + - "OSRS wiki — Rune arrow / Bagged flower / Mystic mist staff etc. item pages (members = Yes for every cited catalog item; verified 2026-08-27)" + - "OSRS wiki — Nature rune (members craft at level 44 Runecraft from pure essence, 9 xp; Nature Altar south-east of Tai Bwo Wannai)" + - "OSRS wiki — Abyss (access to runic altars without talismans via the Mage of Zamorak)" + - "OSRS wiki — Bryophyta's staff (level 30 Attack + Magic; up to 1,000 nature charges; 1/15 chance to not consume a charge on any nature-rune spell; alchemy combo with Tome of Fire)" + - "OSRS wiki — Tome of Fire (members, level 50 Magic to wield; charged tome is an infinite fire-rune source and non-combat spells do not consume charges)" +verified: "2026-08-27" # keep quoted (YAML 1.1 date parsing) + +related: + - low-alch-f2p + - high-alch-p2p + - mule-topup From 9651691e9f6e2a1138656ee1fae9518fb6a36119 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 03:22:50 -0500 Subject: [PATCH 2/7] codex: F2P alch catalog dataset (machine-readable) Generated 2026-08-27 from prices.runescape.wiki mapping + latest: filter lowalch != null, members=false, GE limit >= 150 -> 303 items, sorted by buy price asc. Columns: item, id, buy (latest.low), sell (latest.high), limit, lowalch_price, value, net_per_cycle (= lowalch_price - buy). Source of truth for least-loss ranking referenced by low-alch-f2p / low-alch-members (related: f2p-alch-catalog). Validator already skips underscore-prefixed dataset files (verified: exit 0, file not counted as an entry). Closes #6 --- codex/economy/_f2p-alch-catalog.yaml | 2435 ++++++++++++++++++++++++++ 1 file changed, 2435 insertions(+) create mode 100644 codex/economy/_f2p-alch-catalog.yaml diff --git a/codex/economy/_f2p-alch-catalog.yaml b/codex/economy/_f2p-alch-catalog.yaml new file mode 100644 index 0000000..8c89f69 --- /dev/null +++ b/codex/economy/_f2p-alch-catalog.yaml @@ -0,0 +1,2435 @@ +# Dataset: F2P alch catalog (machine-readable) +# Generated 2026-08-27 from prices.runescape.wiki mapping + latest. Source of truth +# for "rank by cheapest/least-loss" in low-alch-f2p and low-alch-members. +# Validator intentionally skips files starting with "_". +fetched: '2026-08-27' +source: https://prices.runescape.wiki/api/v1/osrs/mapping + /api/v1/osrs/latest (live, at implement time) +filter: lowalch != null, members=false, ge limit >= 150 +sorted_by: buy (latest.low) ascending +note: buy = latest.low, sell = latest.high (per repo data-sources.md convention). net_per_cycle = lowalch_price - buy; nature/fire runes NOT included (staff of fire reduces rune cost to 1 nature/cast). +entries: 303 +items: +- item: Pure essence + id: 7936 + buy: 1 + sell: 2 + limit: 30000 + lowalch_price: 1 + value: 4 + net_per_cycle: 0 +- item: Bronze bolts + id: 877 + buy: 2 + sell: 3 + limit: 7000 + lowalch_price: 1 + value: 0 + net_per_cycle: -1 +- item: Feather + id: 314 + buy: 2 + sell: 3 + limit: 30000 + lowalch_price: 1 + value: 2 + net_per_cycle: -1 +- item: Mind rune + id: 558 + buy: 2 + sell: 3 + limit: 18000 + lowalch_price: 1 + value: 3 + net_per_cycle: -1 +- item: Vial + id: 229 + buy: 2 + sell: 3 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -1 +- item: Jug + id: 1935 + buy: 3 + sell: 3 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -2 +- item: Jug of wine + id: 1993 + buy: 3 + sell: 4 + limit: 6000 + lowalch_price: 1 + value: 1 + net_per_cycle: -2 +- item: Team-3 cape + id: 4319 + buy: 3 + sell: 200 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: 17 +- item: Body rune + id: 559 + buy: 4 + sell: 5 + limit: 18000 + lowalch_price: 1 + value: 3 + net_per_cycle: -3 +- item: Bronze arrow + id: 882 + buy: 4 + sell: 4 + limit: 7000 + lowalch_price: 1 + value: 1 + net_per_cycle: -3 +- item: Eye of newt + id: 221 + buy: 4 + sell: 4 + limit: 13000 + lowalch_price: 1 + value: 3 + net_per_cycle: -3 +- item: Fire rune + id: 554 + buy: 4 + sell: 5 + limit: 50000 + lowalch_price: 1 + value: 4 + net_per_cycle: -3 +- item: Vial of water + id: 227 + buy: 4 + sell: 5 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -3 +- item: Air rune + id: 556 + buy: 5 + sell: 6 + limit: 50000 + lowalch_price: 1 + value: 4 + net_per_cycle: -4 +- item: Earth rune + id: 557 + buy: 5 + sell: 6 + limit: 50000 + lowalch_price: 1 + value: 4 + net_per_cycle: -4 +- item: Iron arrow + id: 884 + buy: 5 + sell: 4 + limit: 7000 + lowalch_price: 1 + value: 3 + net_per_cycle: -4 +- item: Team-13 cape + id: 4339 + buy: 5 + sell: 159 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: 15 +- item: Team-23 cape + id: 4359 + buy: 5 + sell: 229 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: 15 +- item: Team-47 cape + id: 4407 + buy: 5 + sell: 266 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: 15 +- item: Water rune + id: 555 + buy: 5 + sell: 6 + limit: 50000 + lowalch_price: 1 + value: 4 + net_per_cycle: -4 +- item: Fishing bait + id: 313 + buy: 6 + sell: 6 + limit: 8000 + lowalch_price: 1 + value: 3 + net_per_cycle: -5 +- item: Mithril arrow + id: 888 + buy: 6 + sell: 7 + limit: 7000 + lowalch_price: 12 + value: 32 + net_per_cycle: 6 +- item: Thread + id: 1734 + buy: 6 + sell: 7 + limit: 18000 + lowalch_price: 1 + value: 1 + net_per_cycle: -5 +- item: Grain + id: 1947 + buy: 7 + sell: 8 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -6 +- item: Bucket + id: 1925 + buy: 8 + sell: 8 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -7 +- item: Steel arrow + id: 886 + buy: 8 + sell: 8 + limit: 7000 + lowalch_price: 4 + value: 12 + net_per_cycle: -4 +- item: Black skirt + id: 1015 + buy: 10 + sell: 10 + limit: 150 + lowalch_price: 1 + value: 2 + net_per_cycle: -9 +- item: Copper ore + id: 436 + buy: 10 + sell: 11 + limit: 13000 + lowalch_price: 1 + value: 3 + net_per_cycle: -9 +- item: Maple logs + id: 1517 + buy: 10 + sell: 11 + limit: 15000 + lowalch_price: 32 + value: 80 + net_per_cycle: 22 +- item: Team-15 cape + id: 4343 + buy: 10 + sell: 177 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: 10 +- item: Unfired pot + id: 1787 + buy: 10 + sell: 102 + limit: 10000 + lowalch_price: 1 + value: 1 + net_per_cycle: -9 +- item: Pot + id: 1931 + buy: 11 + sell: 18 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -10 +- item: Priest gown (top) + id: 426 + buy: 11 + sell: 25 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -9 +- item: Rune essence + id: 1436 + buy: 11 + sell: 12 + limit: 20000 + lowalch_price: 1 + value: 4 + net_per_cycle: -10 +- item: Sardine + id: 325 + buy: 12 + sell: 13 + limit: 6000 + lowalch_price: 4 + value: 10 + net_per_cycle: -8 +- item: Silk + id: 950 + buy: 12 + sell: 14 + limit: 18000 + lowalch_price: 12 + value: 30 + net_per_cycle: 0 +- item: Bowl + id: 1923 + buy: 13 + sell: 21 + limit: 13000 + lowalch_price: 1 + value: 4 + net_per_cycle: -12 +- item: Raw sardine + id: 327 + buy: 13 + sell: 15 + limit: 15000 + lowalch_price: 4 + value: 10 + net_per_cycle: -9 +- item: Tin ore + id: 438 + buy: 13 + sell: 14 + limit: 13000 + lowalch_price: 1 + value: 3 + net_per_cycle: -12 +- item: Jug of water + id: 1937 + buy: 14 + sell: 15 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -13 +- item: Trout + id: 333 + buy: 17 + sell: 18 + limit: 6000 + lowalch_price: 4 + value: 10 + net_per_cycle: -13 +- item: Raw anchovies + id: 321 + buy: 18 + sell: 19 + limit: 13000 + lowalch_price: 6 + value: 15 + net_per_cycle: -12 +- item: Beer glass + id: 1919 + buy: 20 + sell: 24 + limit: 10000 + lowalch_price: 1 + value: 2 + net_per_cycle: -19 +- item: Shrimps + id: 315 + buy: 20 + sell: 20 + limit: 6000 + lowalch_price: 2 + value: 5 + net_per_cycle: -18 +- item: Willow logs + id: 1519 + buy: 20 + sell: 21 + limit: 15000 + lowalch_price: 16 + value: 40 + net_per_cycle: -4 +- item: Longbow + id: 839 + buy: 21 + sell: 31 + limit: 18000 + lowalch_price: 32 + value: 80 + net_per_cycle: 11 +- item: Oak shortbow + id: 843 + buy: 21 + sell: 30 + limit: 18000 + lowalch_price: 40 + value: 100 + net_per_cycle: 19 +- item: Logs + id: 1511 + buy: 22 + sell: 23 + limit: 15000 + lowalch_price: 1 + value: 4 + net_per_cycle: -21 +- item: Onion + id: 1957 + buy: 22 + sell: 22 + limit: 13000 + lowalch_price: 1 + value: 3 + net_per_cycle: -21 +- item: Tomato + id: 1982 + buy: 22 + sell: 22 + limit: 13000 + lowalch_price: 1 + value: 4 + net_per_cycle: -21 +- item: Wool + id: 1737 + buy: 22 + sell: 22 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -21 +- item: Blue skirt + id: 1011 + buy: 25 + sell: 38 + limit: 150 + lowalch_price: 1 + value: 2 + net_per_cycle: -24 +- item: Cabbage + id: 1965 + buy: 25 + sell: 26 + limit: 6000 + lowalch_price: 1 + value: 1 + net_per_cycle: -24 +- item: Chocolate bar + id: 1973 + buy: 25 + sell: 28 + limit: 13000 + lowalch_price: 4 + value: 10 + net_per_cycle: -21 +- item: Cooking apple + id: 1955 + buy: 25 + sell: 26 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -24 +- item: Bucket of water + id: 1929 + buy: 26 + sell: 28 + limit: 13000 + lowalch_price: 2 + value: 6 + net_per_cycle: -24 +- item: Garlic + id: 1550 + buy: 26 + sell: 30 + limit: 11000 + lowalch_price: 1 + value: 3 + net_per_cycle: -25 +- item: Raw chicken + id: 2138 + buy: 26 + sell: 27 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -25 +- item: Raw salmon + id: 331 + buy: 26 + sell: 29 + limit: 15000 + lowalch_price: 12 + value: 30 + net_per_cycle: -14 +- item: Potato + id: 1942 + buy: 27 + sell: 27 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -26 +- item: Rope + id: 954 + buy: 27 + sell: 34 + limit: 250 + lowalch_price: 7 + value: 18 + net_per_cycle: -20 +- item: Salmon + id: 329 + buy: 27 + sell: 29 + limit: 6000 + lowalch_price: 12 + value: 30 + net_per_cycle: -15 +- item: Adamant arrow + id: 890 + buy: 28 + sell: 26 + limit: 11000 + lowalch_price: 32 + value: 80 + net_per_cycle: 4 +- item: Egg + id: 1944 + buy: 28 + sell: 28 + limit: 13000 + lowalch_price: 1 + value: 4 + net_per_cycle: -27 +- item: Raw shrimps + id: 317 + buy: 28 + sell: 29 + limit: 15000 + lowalch_price: 2 + value: 5 + net_per_cycle: -26 +- item: Bowl of water + id: 1921 + buy: 30 + sell: 42 + limit: 13000 + lowalch_price: 1 + value: 4 + net_per_cycle: -29 +- item: Strength potion(1) + id: 119 + buy: 30 + sell: 25 + limit: 2000 + lowalch_price: 4 + value: 11 + net_per_cycle: -26 +- item: Team-28 cape + id: 4369 + buy: 30 + sell: 101 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -10 +- item: Team-34 cape + id: 4381 + buy: 30 + sell: 812 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -10 +- item: Team-39 cape + id: 4391 + buy: 30 + sell: 150 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -10 +- item: Team-43 cape + id: 4399 + buy: 30 + sell: 229 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -10 +- item: Meat pie + id: 2327 + buy: 31 + sell: 33 + limit: 10000 + lowalch_price: 6 + value: 15 + net_per_cycle: -25 +- item: Priest gown (bottom) + id: 428 + buy: 31 + sell: 34 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -29 +- item: Herring + id: 347 + buy: 34 + sell: 14 + limit: 6000 + lowalch_price: 4 + value: 10 + net_per_cycle: -30 +- item: Bucket of milk + id: 1927 + buy: 35 + sell: 35 + limit: 13000 + lowalch_price: 2 + value: 6 + net_per_cycle: -33 +- item: Steel nails + id: 1539 + buy: 35 + sell: 35 + limit: 13000 + lowalch_price: 1 + value: 3 + net_per_cycle: -34 +- item: Anchovies + id: 319 + buy: 37 + sell: 37 + limit: 15000 + lowalch_price: 6 + value: 15 + net_per_cycle: -31 +- item: Pie dish + id: 2313 + buy: 37 + sell: 39 + limit: 500 + lowalch_price: 1 + value: 3 + net_per_cycle: -36 +- item: White apron + id: 1005 + buy: 37 + sell: 49 + limit: 150 + lowalch_price: 1 + value: 2 + net_per_cycle: -36 +- item: Bones + id: 526 + buy: 38 + sell: 40 + limit: 3000 + lowalch_price: 1 + value: 1 + net_per_cycle: -37 +- item: Bear fur + id: 948 + buy: 39 + sell: 44 + limit: 18000 + lowalch_price: 4 + value: 10 + net_per_cycle: -35 +- item: Ashes + id: 592 + buy: 40 + sell: 41 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -39 +- item: Fiendish ashes + id: 25766 + buy: 40 + sell: 40 + limit: 3000 + lowalch_price: 1 + value: 1 + net_per_cycle: -39 +- item: Oak logs + id: 1521 + buy: 40 + sell: 42 + limit: 15000 + lowalch_price: 8 + value: 20 + net_per_cycle: -32 +- item: Oak longbow + id: 845 + buy: 40 + sell: 44 + limit: 18000 + lowalch_price: 64 + value: 160 + net_per_cycle: 24 +- item: Raw rat meat + id: 2134 + buy: 40 + sell: 50 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -39 +- item: Raw trout + id: 335 + buy: 40 + sell: 48 + limit: 15000 + lowalch_price: 4 + value: 10 + net_per_cycle: -36 +- item: Unblessed symbol + id: 1716 + buy: 40 + sell: 38 + limit: 10000 + lowalch_price: 80 + value: 200 + net_per_cycle: 40 +- item: Unstrung symbol + id: 1714 + buy: 40 + sell: 40 + limit: 10000 + lowalch_price: 80 + value: 200 + net_per_cycle: 40 +- item: Raw beef + id: 2132 + buy: 42 + sell: 44 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -41 +- item: Raw tuna + id: 359 + buy: 43 + sell: 44 + limit: 15000 + lowalch_price: 16 + value: 40 + net_per_cycle: -27 +- item: Strength potion(2) + id: 117 + buy: 43 + sell: 43 + limit: 2000 + lowalch_price: 5 + value: 13 + net_per_cycle: -38 +- item: Tuna + id: 361 + buy: 45 + sell: 45 + limit: 6000 + lowalch_price: 16 + value: 40 + net_per_cycle: -29 +- item: Energy potion(1) + id: 3014 + buy: 46 + sell: 46 + limit: 2000 + lowalch_price: 14 + value: 36 + net_per_cycle: -32 +- item: Pike + id: 351 + buy: 46 + sell: 71 + limit: 6000 + lowalch_price: 8 + value: 20 + net_per_cycle: -38 +- item: Chocolate dust + id: 1975 + buy: 49 + sell: 54 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -48 +- item: Blue cape + id: 1021 + buy: 50 + sell: 109 + limit: 150 + lowalch_price: 12 + value: 32 + net_per_cycle: -38 +- item: Red cape + id: 1007 + buy: 50 + sell: 50 + limit: 150 + lowalch_price: 1 + value: 2 + net_per_cycle: -49 +- item: Shortbow + id: 841 + buy: 50 + sell: 52 + limit: 18000 + lowalch_price: 20 + value: 50 + net_per_cycle: -30 +- item: Team-20 cape + id: 4353 + buy: 50 + sell: 194 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -30 +- item: Team-36 cape + id: 4385 + buy: 50 + sell: 57 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -30 +- item: Banana + id: 1963 + buy: 51 + sell: 51 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -50 +- item: Redberries + id: 1951 + buy: 54 + sell: 56 + limit: 13000 + lowalch_price: 1 + value: 3 + net_per_cycle: -53 +- item: Cheese + id: 1985 + buy: 55 + sell: 55 + limit: 13000 + lowalch_price: 1 + value: 4 + net_per_cycle: -54 +- item: Team-7 cape + id: 4327 + buy: 55 + sell: 245 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -35 +- item: Ball of wool + id: 1759 + buy: 57 + sell: 57 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -56 +- item: Bronze bar + id: 2349 + buy: 60 + sell: 64 + limit: 10000 + lowalch_price: 3 + value: 8 + net_per_cycle: -57 +- item: Bread + id: 2309 + buy: 64 + sell: 65 + limit: 6000 + lowalch_price: 4 + value: 12 + net_per_cycle: -60 +- item: Raw pike + id: 349 + buy: 66 + sell: 71 + limit: 15000 + lowalch_price: 8 + value: 20 + net_per_cycle: -58 +- item: Team-6 cape + id: 4325 + buy: 66 + sell: 66 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -46 +- item: Apple pie + id: 2323 + buy: 67 + sell: 75 + limit: 10000 + lowalch_price: 12 + value: 30 + net_per_cycle: -55 +- item: Cooked chicken + id: 2140 + buy: 67 + sell: 69 + limit: 6000 + lowalch_price: 1 + value: 4 + net_per_cycle: -66 +- item: Cooked t-bone steak + id: 33109 + buy: 68 + sell: 79 + limit: 6000 + lowalch_price: 4 + value: 10 + net_per_cycle: -64 +- item: Kebab + id: 1971 + buy: 68 + sell: 70 + limit: 6000 + lowalch_price: 1 + value: 3 + net_per_cycle: -67 +- item: Beer + id: 1917 + buy: 70 + sell: 78 + limit: 2000 + lowalch_price: 1 + value: 2 + net_per_cycle: -69 +- item: Clay + id: 434 + buy: 70 + sell: 64 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -69 +- item: Cooked meat + id: 2142 + buy: 70 + sell: 71 + limit: 6000 + lowalch_price: 1 + value: 4 + net_per_cycle: -69 +- item: Grapes + id: 1987 + buy: 70 + sell: 67 + limit: 20000 + lowalch_price: 1 + value: 1 + net_per_cycle: -69 +- item: Iron ore + id: 440 + buy: 70 + sell: 70 + limit: 13000 + lowalch_price: 6 + value: 17 + net_per_cycle: -64 +- item: Willow shortbow + id: 849 + buy: 70 + sell: 100 + limit: 18000 + lowalch_price: 80 + value: 200 + net_per_cycle: 10 +- item: Strength potion(3) + id: 115 + buy: 72 + sell: 72 + limit: 2000 + lowalch_price: 5 + value: 13 + net_per_cycle: -67 +- item: Silver ore + id: 442 + buy: 73 + sell: 79 + limit: 13000 + lowalch_price: 30 + value: 75 + net_per_cycle: -43 +- item: Team-16 cape + id: 4345 + buy: 75 + sell: 46 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -55 +- item: Team-44 cape + id: 4401 + buy: 75 + sell: 134 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -55 +- item: Yellow cape + id: 1023 + buy: 75 + sell: 93 + limit: 150 + lowalch_price: 12 + value: 32 + net_per_cycle: -63 +- item: Pot of flour + id: 1933 + buy: 80 + sell: 73 + limit: 13000 + lowalch_price: 4 + value: 10 + net_per_cycle: -76 +- item: Team-46 cape + id: 4405 + buy: 81 + sell: 78 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -61 +- item: Energy potion(2) + id: 3012 + buy: 84 + sell: 86 + limit: 2000 + lowalch_price: 28 + value: 72 + net_per_cycle: -56 +- item: Gold bar + id: 2357 + buy: 86 + sell: 89 + limit: 10000 + lowalch_price: 120 + value: 300 + net_per_cycle: 34 +- item: Unfired pie dish + id: 1789 + buy: 87 + sell: 101 + limit: 10000 + lowalch_price: 1 + value: 3 + net_per_cycle: -86 +- item: Pink skirt + id: 1013 + buy: 90 + sell: 86 + limit: 150 + lowalch_price: 1 + value: 2 + net_per_cycle: -89 +- item: Lobster + id: 379 + buy: 95 + sell: 97 + limit: 6000 + lowalch_price: 28 + value: 70 + net_per_cycle: -67 +- item: Woad leaf + id: 1793 + buy: 95 + sell: 95 + limit: 11000 + lowalch_price: 1 + value: 1 + net_per_cycle: -94 +- item: Black toy horsey + id: 2524 + buy: 100 + sell: 130 + limit: 150 + lowalch_price: 40 + value: 100 + net_per_cycle: -60 +- item: Cadava berries + id: 753 + buy: 100 + sell: 100 + limit: 600 + lowalch_price: 1 + value: 1 + net_per_cycle: -99 +- item: Team-2 cape + id: 4317 + buy: 100 + sell: 9999 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -80 +- item: Team-45 cape + id: 4403 + buy: 100 + sell: 744 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -80 +- item: Team-50 cape + id: 4413 + buy: 100 + sell: 138 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -80 +- item: Team-10 cape + id: 4333 + buy: 101 + sell: 689 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -81 +- item: Willow longbow + id: 847 + buy: 101 + sell: 110 + limit: 18000 + lowalch_price: 128 + value: 320 + net_per_cycle: 27 +- item: Pizza base + id: 2283 + buy: 105 + sell: 144 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -104 +- item: Tiara + id: 5525 + buy: 105 + sell: 150 + limit: 10000 + lowalch_price: 40 + value: 100 + net_per_cycle: -65 +- item: Chaos rune + id: 562 + buy: 106 + sell: 107 + limit: 18000 + lowalch_price: 36 + value: 90 + net_per_cycle: -70 +- item: Strength potion(4) + id: 113 + buy: 106 + sell: 110 + limit: 2000 + lowalch_price: 5 + value: 14 + net_per_cycle: -101 +- item: Raw lobster + id: 377 + buy: 110 + sell: 110 + limit: 15000 + lowalch_price: 28 + value: 70 + net_per_cycle: -82 +- item: Dwarven stout + id: 1913 + buy: 111 + sell: 100 + limit: 2000 + lowalch_price: 1 + value: 2 + net_per_cycle: -110 +- item: Yew logs + id: 1515 + buy: 111 + sell: 112 + limit: 12000 + lowalch_price: 64 + value: 160 + net_per_cycle: -47 +- item: Silver bar + id: 2355 + buy: 113 + sell: 117 + limit: 10000 + lowalch_price: 60 + value: 150 + net_per_cycle: -53 +- item: Raw herring + id: 345 + buy: 116 + sell: 116 + limit: 15000 + lowalch_price: 4 + value: 10 + net_per_cycle: -112 +- item: Soft clay + id: 1761 + buy: 116 + sell: 116 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -115 +- item: Wizard's mind bomb + id: 1907 + buy: 116 + sell: 400 + limit: 2000 + lowalch_price: 1 + value: 2 + net_per_cycle: -115 +- item: Team-9 cape + id: 4331 + buy: 121 + sell: 121 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -101 +- item: Law rune + id: 563 + buy: 124 + sell: 125 + limit: 18000 + lowalch_price: 96 + value: 240 + net_per_cycle: -28 +- item: Bread dough + id: 2307 + buy: 125 + sell: 135 + limit: 13000 + lowalch_price: 1 + value: 4 + net_per_cycle: -124 +- item: Cosmic rune + id: 564 + buy: 126 + sell: 128 + limit: 18000 + lowalch_price: 20 + value: 50 + net_per_cycle: -106 +- item: Energy potion(3) + id: 3010 + buy: 126 + sell: 126 + limit: 2000 + lowalch_price: 44 + value: 110 + net_per_cycle: -82 +- item: Stew + id: 2003 + buy: 127 + sell: 129 + limit: 10000 + lowalch_price: 8 + value: 20 + net_per_cycle: -119 +- item: Raw bear meat + id: 2136 + buy: 130 + sell: 170 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -129 +- item: Vile ashes + id: 25769 + buy: 130 + sell: 131 + limit: 3000 + lowalch_price: 1 + value: 1 + net_per_cycle: -129 +- item: Pastry dough + id: 1953 + buy: 132 + sell: 137 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -131 +- item: Cowhide + id: 1739 + buy: 137 + sell: 137 + limit: 13000 + lowalch_price: 1 + value: 2 + net_per_cycle: -136 +- item: Gold amulet + id: 1692 + buy: 141 + sell: 144 + limit: 18000 + lowalch_price: 140 + value: 350 + net_per_cycle: -1 +- item: Plank + id: 960 + buy: 141 + sell: 146 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -140 +- item: Unfired bowl + id: 1791 + buy: 141 + sell: 141 + limit: 10000 + lowalch_price: 1 + value: 2 + net_per_cycle: -140 +- item: Nature rune + id: 561 + buy: 145 + sell: 145 + limit: 18000 + lowalch_price: 72 + value: 180 + net_per_cycle: -73 +- item: Gold necklace + id: 1654 + buy: 148 + sell: 156 + limit: 18000 + lowalch_price: 180 + value: 450 + net_per_cycle: 32 +- item: Antipoison(1) + id: 179 + buy: 150 + sell: 173 + limit: 2000 + lowalch_price: 57 + value: 144 + net_per_cycle: -93 +- item: Coal + id: 453 + buy: 150 + sell: 153 + limit: 13000 + lowalch_price: 18 + value: 45 + net_per_cycle: -132 +- item: Dust + id: 30328 + buy: 150 + sell: 2499 + limit: 250 + lowalch_price: 1 + value: 2 + net_per_cycle: -149 +- item: Yellow dye + id: 1765 + buy: 151 + sell: 332 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -149 +- item: Gold amulet (u) + id: 1673 + buy: 152 + sell: 160 + limit: 18000 + lowalch_price: 140 + value: 350 + net_per_cycle: -12 +- item: Iron bar + id: 2351 + buy: 153 + sell: 157 + limit: 10000 + lowalch_price: 11 + value: 28 + net_per_cycle: -142 +- item: Air talisman + id: 1438 + buy: 154 + sell: 165 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -153 +- item: Chocolate cake + id: 1897 + buy: 155 + sell: 160 + limit: 6000 + lowalch_price: 28 + value: 70 + net_per_cycle: -127 +- item: Gold ore + id: 444 + buy: 155 + sell: 155 + limit: 30000 + lowalch_price: 60 + value: 150 + net_per_cycle: -95 +- item: Cake + id: 1891 + buy: 158 + sell: 161 + limit: 6000 + lowalch_price: 20 + value: 50 + net_per_cycle: -138 +- item: Gold ring + id: 1635 + buy: 160 + sell: 162 + limit: 18000 + lowalch_price: 140 + value: 350 + net_per_cycle: -20 +- item: Mithril ore + id: 447 + buy: 161 + sell: 158 + limit: 13000 + lowalch_price: 64 + value: 162 + net_per_cycle: -97 +- item: Charcoal + id: 973 + buy: 162 + sell: 169 + limit: 13000 + lowalch_price: 18 + value: 45 + net_per_cycle: -144 +- item: Hard leather + id: 1743 + buy: 170 + sell: 182 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -169 +- item: Leather + id: 1741 + buy: 171 + sell: 193 + limit: 13000 + lowalch_price: 1 + value: 1 + net_per_cycle: -170 +- item: Asgarnian ale + id: 1905 + buy: 173 + sell: 245 + limit: 2000 + lowalch_price: 1 + value: 2 + net_per_cycle: -172 +- item: Red spiders' eggs + id: 223 + buy: 175 + sell: 180 + limit: 13000 + lowalch_price: 2 + value: 7 + net_per_cycle: -173 +- item: Maple shortbow + id: 853 + buy: 176 + sell: 160 + limit: 18000 + lowalch_price: 160 + value: 400 + net_per_cycle: -16 +- item: Death rune + id: 560 + buy: 190 + sell: 195 + limit: 25000 + lowalch_price: 72 + value: 180 + net_per_cycle: -118 +- item: Energy potion(4) + id: 3008 + buy: 191 + sell: 194 + limit: 2000 + lowalch_price: 58 + value: 146 + net_per_cycle: -133 +- item: Team-40 cape + id: 4393 + buy: 191 + sell: 48 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -171 +- item: Swordfish + id: 373 + buy: 199 + sell: 202 + limit: 6000 + lowalch_price: 32 + value: 80 + net_per_cycle: -167 +- item: Team-41 cape + id: 4395 + buy: 200 + sell: 741 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -180 +- item: Raw swordfish + id: 371 + buy: 206 + sell: 215 + limit: 15000 + lowalch_price: 32 + value: 80 + net_per_cycle: -174 +- item: Green dye + id: 1771 + buy: 209 + sell: 300 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -207 +- item: Monkey bones + id: 3183 + buy: 217 + sell: 331 + limit: 3000 + lowalch_price: 1 + value: 1 + net_per_cycle: -216 +- item: Raw t-bone steak + id: 33106 + buy: 217 + sell: 229 + limit: 13000 + lowalch_price: 4 + value: 10 + net_per_cycle: -213 +- item: Limpwurt root + id: 225 + buy: 220 + sell: 223 + limit: 13000 + lowalch_price: 2 + value: 7 + net_per_cycle: -218 +- item: Brown toy horsey + id: 2520 + buy: 222 + sell: 528 + limit: 150 + lowalch_price: 40 + value: 100 + net_per_cycle: -182 +- item: Team-29 cape + id: 4371 + buy: 224 + sell: 99 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -204 +- item: Big bones + id: 532 + buy: 232 + sell: 244 + limit: 3000 + lowalch_price: 1 + value: 1 + net_per_cycle: -231 +- item: Uncut sapphire + id: 1623 + buy: 234 + sell: 234 + limit: 10000 + lowalch_price: 10 + value: 25 + net_per_cycle: -224 +- item: Sapphire + id: 1607 + buy: 239 + sell: 257 + limit: 13000 + lowalch_price: 100 + value: 250 + net_per_cycle: -139 +- item: Orange cape + id: 1031 + buy: 251 + sell: 528 + limit: 150 + lowalch_price: 12 + value: 32 + net_per_cycle: -239 +- item: Grey gloves + id: 2902 + buy: 254 + sell: 1365 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -54 +- item: Orange dye + id: 1769 + buy: 260 + sell: 261 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -258 +- item: Pie shell + id: 2315 + buy: 260 + sell: 260 + limit: 13000 + lowalch_price: 1 + value: 4 + net_per_cycle: -259 +- item: Uncooked apple pie + id: 2317 + buy: 264 + sell: 350 + limit: 13000 + lowalch_price: 6 + value: 16 + net_per_cycle: -258 +- item: Water talisman + id: 1444 + buy: 264 + sell: 270 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -263 +- item: Maple longbow + id: 851 + buy: 266 + sell: 271 + limit: 18000 + lowalch_price: 256 + value: 640 + net_per_cycle: -10 +- item: Antipoison(2) + id: 177 + buy: 268 + sell: 500 + limit: 2000 + lowalch_price: 86 + value: 216 + net_per_cycle: -182 +- item: Fur + id: 6814 + buy: 278 + sell: 340 + limit: 18000 + lowalch_price: 4 + value: 10 + net_per_cycle: -274 +- item: Meat pizza + id: 2293 + buy: 278 + sell: 293 + limit: 10000 + lowalch_price: 20 + value: 50 + net_per_cycle: -258 +- item: Team-30 cape + id: 4373 + buy: 295 + sell: 350 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -275 +- item: Team-25 cape + id: 4363 + buy: 300 + sell: 600 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -280 +- item: Brass necklace + id: 1009 + buy: 302 + sell: 302 + limit: 150 + lowalch_price: 12 + value: 30 + net_per_cycle: -290 +- item: Team-49 cape + id: 4411 + buy: 309 + sell: 1 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -289 +- item: Team-26 cape + id: 4365 + buy: 310 + sell: 54 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -290 +- item: Antipoison(3) + id: 175 + buy: 315 + sell: 461 + limit: 2000 + lowalch_price: 115 + value: 288 + net_per_cycle: -200 +- item: Grey toy horsey + id: 2526 + buy: 318 + sell: 140 + limit: 150 + lowalch_price: 40 + value: 100 + net_per_cycle: -278 +- item: White toy horsey + id: 2522 + buy: 325 + sell: 3400 + limit: 150 + lowalch_price: 40 + value: 100 + net_per_cycle: -285 +- item: Uncooked meat pie + id: 2319 + buy: 334 + sell: 349 + limit: 13000 + lowalch_price: 3 + value: 8 + net_per_cycle: -331 +- item: Chef's hat + id: 1949 + buy: 353 + sell: 339 + limit: 150 + lowalch_price: 1 + value: 2 + net_per_cycle: -352 +- item: Triangle sandwich + id: 6962 + buy: 355 + sell: 351 + limit: 6000 + lowalch_price: 10 + value: 25 + net_per_cycle: -345 +- item: Red dye + id: 1763 + buy: 367 + sell: 500 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -365 +- item: Sapphire amulet (u) + id: 1675 + buy: 375 + sell: 403 + limit: 10000 + lowalch_price: 360 + value: 900 + net_per_cycle: -15 +- item: Uncooked berry pie + id: 2321 + buy: 386 + sell: 420 + limit: 13000 + lowalch_price: 2 + value: 6 + net_per_cycle: -384 +- item: Plain pizza + id: 2289 + buy: 393 + sell: 439 + limit: 10000 + lowalch_price: 16 + value: 40 + net_per_cycle: -377 +- item: Team-33 cape + id: 4379 + buy: 397 + sell: 397 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -377 +- item: Team-19 cape + id: 4351 + buy: 402 + sell: 446 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -382 +- item: Emerald + id: 1605 + buy: 407 + sell: 420 + limit: 13000 + lowalch_price: 200 + value: 500 + net_per_cycle: -207 +- item: Sapphire ring + id: 1637 + buy: 409 + sell: 423 + limit: 10000 + lowalch_price: 360 + value: 900 + net_per_cycle: -49 +- item: Black cape + id: 1019 + buy: 413 + sell: 435 + limit: 150 + lowalch_price: 2 + value: 7 + net_per_cycle: -411 +- item: Burnt bones + id: 528 + buy: 418 + sell: 574 + limit: 3000 + lowalch_price: 1 + value: 1 + net_per_cycle: -417 +- item: Antipoison(4) + id: 2446 + buy: 440 + sell: 482 + limit: 2000 + lowalch_price: 144 + value: 360 + net_per_cycle: -296 +- item: Sapphire necklace + id: 1656 + buy: 442 + sell: 449 + limit: 18000 + lowalch_price: 420 + value: 1050 + net_per_cycle: -22 +- item: Team-8 cape + id: 4329 + buy: 448 + sell: 423 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -428 +- item: Team-42 cape + id: 4397 + buy: 463 + sell: 398 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -443 +- item: Uncut emerald + id: 1621 + buy: 470 + sell: 465 + limit: 10000 + lowalch_price: 20 + value: 50 + net_per_cycle: -450 +- item: Sapphire amulet + id: 1694 + buy: 477 + sell: 519 + limit: 10000 + lowalch_price: 360 + value: 900 + net_per_cycle: -117 +- item: Purple dye + id: 1773 + buy: 479 + sell: 693 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -477 +- item: Blue dye + id: 1767 + buy: 500 + sell: 596 + limit: 150 + lowalch_price: 2 + value: 5 + net_per_cycle: -498 +- item: Teal gloves + id: 2932 + buy: 500 + sell: 508 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -300 +- item: Purple cape + id: 1029 + buy: 530 + sell: 576 + limit: 150 + lowalch_price: 12 + value: 32 + net_per_cycle: -518 +- item: Anchovy pizza + id: 2297 + buy: 541 + sell: 553 + limit: 10000 + lowalch_price: 24 + value: 60 + net_per_cycle: -517 +- item: Team-22 cape + id: 4357 + buy: 568 + sell: 99000 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -548 +- item: Steel bar + id: 2353 + buy: 570 + sell: 570 + limit: 10000 + lowalch_price: 40 + value: 100 + net_per_cycle: -530 +- item: Adamantite ore + id: 449 + buy: 573 + sell: 585 + limit: 4500 + lowalch_price: 160 + value: 400 + net_per_cycle: -413 +- item: Team-32 cape + id: 4377 + buy: 580 + sell: 580 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -560 +- item: Emerald amulet (u) + id: 1677 + buy: 591 + sell: 602 + limit: 10000 + lowalch_price: 510 + value: 1275 + net_per_cycle: -81 +- item: Team-38 cape + id: 4389 + buy: 603 + sell: 4000 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -583 +- item: Team-12 cape + id: 4337 + buy: 607 + sell: 2500 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -587 +- item: Earth talisman + id: 1440 + buy: 608 + sell: 635 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -607 +- item: Bone fragments + id: 25139 + buy: 627 + sell: 629 + limit: 500 + lowalch_price: 1 + value: 1 + net_per_cycle: -626 +- item: Emerald ring + id: 1639 + buy: 640 + sell: 649 + limit: 10000 + lowalch_price: 510 + value: 1275 + net_per_cycle: -130 +- item: Team-17 cape + id: 4347 + buy: 644 + sell: 1114 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -624 +- item: Emerald necklace + id: 1658 + buy: 655 + sell: 675 + limit: 18000 + lowalch_price: 570 + value: 1425 + net_per_cycle: -85 +- item: Team-31 cape + id: 4375 + buy: 671 + sell: 50 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -651 +- item: Green cape + id: 1027 + buy: 684 + sell: 652 + limit: 150 + lowalch_price: 12 + value: 32 + net_per_cycle: -672 +- item: Emerald amulet + id: 1696 + buy: 690 + sell: 719 + limit: 10000 + lowalch_price: 510 + value: 1275 + net_per_cycle: -180 +- item: Team-18 cape + id: 4349 + buy: 698 + sell: 542 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -678 +- item: Team-27 cape + id: 4367 + buy: 738 + sell: 545 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -718 +- item: Castle wars bracelet(3) + id: 11079 + buy: 750 + sell: 779 + limit: 10000 + lowalch_price: 670 + value: 1675 + net_per_cycle: -80 +- item: Purple gloves + id: 2942 + buy: 750 + sell: 900 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -550 +- item: Team-1 cape + id: 4315 + buy: 755 + sell: 792 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -735 +- item: Ruby + id: 1603 + buy: 819 + sell: 840 + limit: 13000 + lowalch_price: 400 + value: 1000 + net_per_cycle: -419 +- item: Yellow gloves + id: 2922 + buy: 869 + sell: 748 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -669 +- item: Team-11 cape + id: 4335 + buy: 892 + sell: 1445 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -872 +- item: Yellow bead + id: 1472 + buy: 900 + sell: 1050 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -899 +- item: Mithril bar + id: 2359 + buy: 956 + sell: 973 + limit: 10000 + lowalch_price: 120 + value: 300 + net_per_cycle: -836 +- item: Purple boots + id: 2934 + buy: 966 + sell: 1333 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -766 +- item: Teal boots + id: 2924 + buy: 980 + sell: 1289 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -780 +- item: Ring of forging + id: 2568 + buy: 1000 + sell: 1032 + limit: 10000 + lowalch_price: 810 + value: 2025 + net_per_cycle: -190 +- item: Wine of Zamorak + id: 245 + buy: 1009 + sell: 1037 + limit: 11000 + lowalch_price: 1 + value: 1 + net_per_cycle: -1008 +- item: Team-5 cape + id: 4323 + buy: 1032 + sell: 44000 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -1012 +- item: Red gloves + id: 2912 + buy: 1039 + sell: 1039 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -839 +- item: Ruby ring + id: 1641 + buy: 1040 + sell: 1052 + limit: 10000 + lowalch_price: 810 + value: 2025 + net_per_cycle: -230 +- item: Red boots + id: 2904 + buy: 1063 + sell: 1321 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -863 +- item: Uncut ruby + id: 1619 + buy: 1074 + sell: 1083 + limit: 10000 + lowalch_price: 40 + value: 100 + net_per_cycle: -1034 +- item: Ruby amulet (u) + id: 1679 + buy: 1098 + sell: 1126 + limit: 10000 + lowalch_price: 810 + value: 2025 + net_per_cycle: -288 +- item: Team-48 cape + id: 4409 + buy: 1100 + sell: 1500 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -1080 +- item: Team-21 cape + id: 4355 + buy: 1108 + sell: 2300 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -1088 +- item: Black bead + id: 1474 + buy: 1111 + sell: 1150 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -1110 +- item: Ruby amulet + id: 1698 + buy: 1111 + sell: 1140 + limit: 10000 + lowalch_price: 810 + value: 2025 + net_per_cycle: -301 +- item: Ruby necklace + id: 1660 + buy: 1127 + sell: 1127 + limit: 18000 + lowalch_price: 870 + value: 2175 + net_per_cycle: -257 +- item: Grey boots + id: 2894 + buy: 1129 + sell: 1865 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -929 +- item: White bead + id: 1476 + buy: 1180 + sell: 1180 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -1179 +- item: Mind talisman + id: 1448 + buy: 1189 + sell: 1348 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -1188 +- item: Team-35 cape + id: 4383 + buy: 1210 + sell: 2108 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -1190 +- item: Team-4 cape + id: 4321 + buy: 1359 + sell: 951 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -1339 +- item: Body talisman + id: 1446 + buy: 1654 + sell: 1660 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -1653 +- item: Diamond + id: 1601 + buy: 1683 + sell: 1699 + limit: 11000 + lowalch_price: 800 + value: 2000 + net_per_cycle: -883 +- item: Adamantite bar + id: 2361 + buy: 1835 + sell: 1864 + limit: 10000 + lowalch_price: 256 + value: 640 + net_per_cycle: -1579 +- item: Red bead + id: 1470 + buy: 1905 + sell: 1905 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -1904 +- item: Diamond amulet (u) + id: 1681 + buy: 1913 + sell: 1915 + limit: 10000 + lowalch_price: 1410 + value: 3525 + net_per_cycle: -503 +- item: Diamond ring + id: 1643 + buy: 1938 + sell: 1957 + limit: 10000 + lowalch_price: 1410 + value: 3525 + net_per_cycle: -528 +- item: Diamond necklace + id: 1662 + buy: 1990 + sell: 1996 + limit: 18000 + lowalch_price: 1470 + value: 3675 + net_per_cycle: -520 +- item: Team-37 cape + id: 4387 + buy: 2000 + sell: 900 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -1980 +- item: Diamond amulet + id: 1700 + buy: 2090 + sell: 2124 + limit: 10000 + lowalch_price: 1410 + value: 3525 + net_per_cycle: -680 +- item: Fire talisman + id: 1442 + buy: 2311 + sell: 2330 + limit: 11000 + lowalch_price: 1 + value: 4 + net_per_cycle: -2310 +- item: Uncut diamond + id: 1617 + buy: 2450 + sell: 2483 + limit: 10000 + lowalch_price: 80 + value: 200 + net_per_cycle: -2370 +- item: Yellow boots + id: 2914 + buy: 2471 + sell: 4800 + limit: 150 + lowalch_price: 200 + value: 500 + net_per_cycle: -2271 +- item: Team-14 cape + id: 4341 + buy: 3074 + sell: 546 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -3054 +- item: Muddy key + id: 991 + buy: 6234 + sell: 6616 + limit: 11000 + lowalch_price: 32 + value: 80 + net_per_cycle: -6202 +- item: Runite ore + id: 451 + buy: 10265 + sell: 10265 + limit: 4500 + lowalch_price: 1280 + value: 3200 + net_per_cycle: -8985 +- item: Runite bar + id: 2363 + buy: 12230 + sell: 12236 + limit: 10000 + lowalch_price: 2000 + value: 5000 + net_per_cycle: -10230 +- item: Team-24 cape + id: 4361 + buy: 60000 + sell: 632 + limit: 150 + lowalch_price: 20 + value: 50 + net_per_cycle: -59980 From 31a23a02149b2a6e61598002bd746e833280ee48 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 12:42:02 -0500 Subject: [PATCH 3/7] codex: fix low-alch-members entry per governor review (bounce fix attempt 1) - Pacing: 3-tick cast is 1.8s (0.6s/tick), not 5.4s; xp_per_hour and gp_per_hour now derive from the mandatory anti_ban.delay [1600, 3400]ms pause (2.5s midpoint -> 1,440 casts/hr -> 44,640 XP/hr), arithmetic pinned. - Anchor: model the actual least-loss liquid candidate, rune javelin tips (id 19580, -3/cast live, limit 10,000, lowalch==highalch*2//3 asserted); top-10 margin list re-fetched live; sign errors in old caveat fixed (opal amulet (u) stale-low artifact disqualified, jade ring now marginal-profit and flagged as flip candidate, not the anchor). - Bryophyta's staff + Tome: document the 30 Attack equip gate; accounts below it keep the ordinary Staff of Fire path (default, no Attack req). - version 1 -> 2. Validator: 0 errors (1 pre-existing F2P WARN). --- codex/economy/low-alch-members.yaml | 84 +++++++++++++++++------------ 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/codex/economy/low-alch-members.yaml b/codex/economy/low-alch-members.yaml index 473d2a4..3a0b8dd 100644 --- a/codex/economy/low-alch-members.yaml +++ b/codex/economy/low-alch-members.yaml @@ -3,7 +3,7 @@ title: Low-Level Alchemy (Members) domain: economy tags: [alching, magic-training, members, loss-training] status: verified -version: 1 +version: 2 # 2: bounce-fix 2026-08-27 — pacing-pinned economics, least-loss anchor, 30 Attack gate updated: "2026-08-27" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date summary: > @@ -12,7 +12,8 @@ summary: > machine and actions as low-alch-f2p; the catalog is the members item pool (mapping lowalch != null, members=true, live GE prices 2026-08-27). At current prices the method burns a small amount of GP per cast for 31 XP — - run it for XP, not GP. Handoff: switch to High Level Alchemy at level 55 + run it for XP, not GP. Least-loss liquid anchor at last check: rune + javelin tips (-3/cast). Handoff: switch to High Level Alchemy at level 55 (hard level gate + strictly more coins AND XP per cast; see sources). accounts: @@ -20,8 +21,9 @@ accounts: min_level: 21 # Magic 21 to cast Low Level Alchemy (wiki-verified) requires_quest: [] requires_other: - - "Staff of Fire equipped (removes 3 fire runes from the cost)" + - "Staff of Fire equipped (removes 3 fire runes from the cost; no Attack requirement — the default path)" - "A bank with GE access within reach" + - "30 Attack + 50 Magic ONLY if adopting the optional Bryophyta's staff + Tome of Fire technique — below that the Staff of Fire path applies" best_practice: equipment: @@ -32,8 +34,8 @@ best_practice: - name: cast on noted (stacked) items why: "one inventory slot, minimal mouse travel between spell icon and item, no item un-noting" source: "OSRS wiki — Low Level Alchemy (Usage: casting alchemy spells on noted items)" - - name: Bryophyta's staff + Tome of Fire (members-only, 50 Magic) - why: "charged Bryophyta's staff holds up to 1,000 nature runes (0 rune inventory slots) with a 1/15 chance per cast to not consume a nature rune; charged Tome of Fire supplies infinite fire runes in the shield slot and non-combat spells (alchemy) do not consume charges — the wiki documents this exact pair for alchemy profit; payback takes thousands of casts, so adopt at 50+ Magic when nature prices are high" + - name: Bryophyta's staff + Tome of Fire (members-only, 50 Magic, 30 Attack) + why: "charged Bryophyta's staff holds up to 1,000 nature runes (0 rune inventory slots) with a 1/15 chance per cast to not consume a nature rune; charged Tome of Fire supplies infinite fire runes in the shield slot and non-combat spells (alchemy) do not consume charges — the wiki documents this exact pair for alchemy profit; payback takes thousands of casts, so adopt at 50+ Magic when nature prices are high. EQUIP GATE: the staff requires 30 Attack + 30 Magic and the tome requires 50 Magic — accounts below 30 Attack (e.g. 1-Attack mules) cannot equip it and keep the ordinary Staff of Fire path (equipment section above) instead" source: "OSRS wiki — Bryophyta's staff (passive effect; 'can be used along with a tome of fire to increase profits with High Level Alchemy'); OSRS wiki — Tome of Fire (level 50 Magic, non-combat spells do not consume charges)" - name: self-craft nature runes as a cost cap why: "members with 44 Runecraft can craft natures from pure essence, capping the per-cast rune cost at essence+time when GE nature prices spike; use the Abyss (no talisman needed) from the Mage of Zamorak" @@ -42,37 +44,49 @@ best_practice: economy: # Verified 2026-08-27 against prices.runescape.wiki (live 'latest') + # OSRS wiki (spell infoboxes, Module:Exchange limits, item pages). - item: Rune arrow # example anchor; rank by least-loss candidate live - item_id: 892 - cost_per_cycle: 188 # arrow buy 44 + nature rune 144 (staff of fire) - income_per_cycle: 160 # lowalch of rune arrow (40% of value 400) - net_per_cycle: -28 - gp_per_hour_low: -60000 # negative: this burns GP (31 xp/cast is the product) - gp_per_hour_high: -40000 - xp_per_hour: 55800 # 31 xp/cast (wiki) @ ~1800 casts/hr (3-tick, wiki) + # Re-verified at bounce fix 2026-08-27 with a fresh live fetch; the + # modeled anchor is now the ACTUAL least-loss liquid candidate. + item: Rune javelin tips # least-loss liquid anchor 2026-08-27 (see profit_drivers) + item_id: 19580 + cost_per_cycle: 543 # javelin tips buy 403 + nature rune 140 (staff of fire) + income_per_cycle: 540 # lowalch of rune javelin tips (40% of value 1350) + net_per_cycle: -3 + gp_per_hour_low: -6750 # -3/cast @ max cadence: 3600/1.6s delay = 2250 casts/hr + gp_per_hour_high: -3176 # -3/cast @ min cadence: 3600/3.4s delay = 1058.8 casts/hr + xp_per_hour: 44640 # 31 xp/cast (wiki) @ 1,440 casts/hr — pinned below + # Pacing pin: actions[].anti_ban.delay [1600, 3400] ms is the MANDATORY + # post-cast pause and the cadence constraint. A game tick is 0.6s, so a + # 3-tick LA cast is 1.8s — shorter than the 2.5s midpoint pause, so the + # pause, not the cast, sets the rate: 3600/2.5 = 1,440 casts/hr. + # xp_per_hour = 1440 x 31 = 44,640/hr + # gp_per_hour (midpoint) = 1440 x -3 = -4,320/hr; the low/high range + # above is the delay-bound spread (1,600ms -> 2,250 casts; 3,400ms -> + # 1,058.8 casts). supplies: - - item: rune arrow + - item: rune javelin tips qty_per_cycle: 1 source: ge - ge_limit: 11000 # mapping + Module:Exchange/Rune arrow agree (wiki-verified) + ge_limit: 10000 # mapping + Module:Exchange/Rune javelin tips agree (re-verified 2026-08-27) - item: nature rune qty_per_cycle: 1 source: ge ge_limit: 18000 profit_drivers: - - "No profit to chase — this is loss-minimizing training: XP is the product. Pick the least-loss candidate live each run." - - "Top 10 losses 2026-08-27 (rank by (lowalch - buy), members catalog, mapping 'latest' low as buy basis):" - - "1. Mystic mist staff (id 20733, lowalch 17000, buy 1000, spread +16000, GE limit 8)" - - "2. Trailblazer top (t1) (id 25031, lowalch 6000, buy 555, spread +5445, GE limit 5)" - - "3. Twisted trousers (t2) (id 24401, lowalch 4000, buy 100, spread +3900, GE limit 5)" - - "4. Dual sai (id 23206, lowalch 2400, buy 1500, spread +900, GE limit 8)" - - "5. Adamant hasta(p) (id 11407, lowalch 832, buy 1, spread +831, GE limit 125)" - - "6. Adamant spear(p++) (id 5726, lowalch 832, buy 10, spread +822, GE limit 125)" - - "7. Bagged flower (id 8451, lowalch 2000, buy 1250, spread +750, GE limit 10000)" - - "8. Adamant spear(p) (id 1259, lowalch 832, buy 200, spread +632, GE limit 125)" - - "9. Frying pan (id 7441, lowalch 664, buy 101, spread +563, GE limit 50)" - - "10. Maple blackjack(d) (id 6420, lowalch 640, buy 100, spread +540, GE limit 125)" - - "Caveat: thin items (limits 5-8) cannot sustain a run and their 'low' fills can be stale — a bot cannot reliably buy at those prices. The sustainable loss-minimizers are the liquid high-limit set: rune arrow (892, -28/cast), rune javelin tips (19580, -7/cast), opal amulet (u) (21099, -199/cast), jade ring (21084, -63/cast)." + - "No guaranteed profit to chase — this is loss-minimizing training: XP is the product. Pick the least-loss (least-negative net) candidate live each run." + - "Least-loss liquid anchors 2026-08-27 (net = lowalch - low buy - nature 140): rune javelin tips (19580, -3/cast, limit 10,000) is the modeled anchor; rune arrow (892, -25/cast, limit 11,000) is the runner-up." + - "Jade ring (21084) is currently MARGINAL-PROFIT (+67/cast, low/high 303/326) — flips sign as prices move, so it is not the loss anchor. Opal amulet (u) (21099) shows a 20x low/high spread (17/365) = stale-low artifact, disqualified per data-sources.md thin-fill trap." + - "Alch-margin candidates by (lowalch - buy) 2026-08-27 (thin limits cannot sustain a run; 'low' fills on thin items can be stale):" + - "1. Trailblazer top (t1) (id 25031, lowalch 6000, buy 555, margin +5445, GE limit 5)" + - "2. Twisted trousers (t2) (id 24401, lowalch 4000, buy 100, margin +3900, GE limit 5)" + - "3. Adamant hasta(p) (id 11407, lowalch 832, buy 1, margin +831, GE limit 125)" + - "4. Adamant spear(p++) (id 5726, lowalch 832, buy 10, margin +822, GE limit 125)" + - "5. Bagged flower (id 8451, lowalch 2000, buy 1250, margin +750, GE limit 10000 — deep limit but thin market: a 10k fill at 1,250 is unverifiable, do not model a run on it)" + - "6. Dual sai (id 23206, lowalch 2400, buy 1750, margin +650, GE limit 8)" + - "7. Frying pan (id 7441, lowalch 664, buy 101, margin +563, GE limit 50)" + - "8. Maple blackjack(d) (id 6420, lowalch 640, buy 100, margin +540, GE limit 125)" + - "9. Adamant spear(p) (id 1259, lowalch 832, buy 450, margin +382, GE limit 125)" + - "10. Mystic mist staff (id 20733, lowalch 17000, buy 75727, margin -58727, GE limit 8) — buy spiked ABOVE alch value 2026-08-27; a true loss trap, do not buy" + - "Caveat: thin items (limits 5-125) cannot sustain a run and their 'low' fills can be stale — a bot cannot reliably buy at those prices. The dependable loss-minimizers are the liquid high-limit pair modeled above: rune javelin tips (-3/cast) and rune arrow (-25/cast)." state_machine: initial: idle @@ -148,7 +162,7 @@ actions: on: "itself" on_fail: retry anti_ban: - delay: [1600, 3400] # 3-tick cast = ~5.4s game; stay under it, humanised + delay: [1600, 3400] # MANDATORY post-cast pause (cadence policy): 3-tick cast = 1.8s (0.6s/tick); midpoint 2.5s -> ~1,440 casts/hr (pinned in economy) - id: a4 step: bank-loop @@ -173,19 +187,19 @@ run_control: risk: ban_level: low notes: - - "High cast cadence is the main detection vector; keep anti_ban delays." + - "High cast cadence is the main detection vector; keep the mandatory anti_ban delays (cadence pin: ~1,440 casts/hr at the 2.5s midpoint pause)." - "GE buy bursts: pace offers, respect the 4h limit window; thin items (limit < 100) cannot sustain a long run." - - "Thin-item 'latest low' fills can be stale — confirm fill price with a live GE offer before committing a run; the liquid high-limit set is the dependable loss-minimizer." + - "Thin-item 'latest low' fills can be stale — confirm fill price with a live GE offer before committing a run; the liquid high-limit pair (rune javelin tips / rune arrow) is the dependable loss-minimizer." sources: - "OSRS wiki — Low Level Alchemy (level 21, 31 xp/cast, 3-tick, 1 nature + 3 fire; spellbook Normal; infobox 2026-08-27)" - "OSRS wiki — High Level Alchemy (level 55, 65 xp/cast, 1 nature + 5 fire; 60% of item value; infobox 2026-08-27)" - "OSRS wiki — Superheat Item (level 43, 53 xp/cast, 1 nature + 4 fire; smithing production spell; infobox 2026-08-27)" - "OSRS wiki — Low Level Alchemy (handoff quote: 'Players with level 55 Magic are generally recommended to use High Level Alchemy instead, as it provides more coins and experience per cast than Low Level Alchemy')" - - "prices.runescape.wiki mapping 2026-08-27 (members/lowalch/highalch/limit catalog; lowalch == highalch*2//3 asserted for cited items)" - - "prices.runescape.wiki latest 2026-08-27 (low = per-repo buy basis; rune arrow buy 44, nature rune buy 144)" - - "OSRS wiki — Module:Exchange/Rune arrow, Nature rune, Staff of fire + top-10 candidates (GE limits agree with mapping; verified 2026-08-27)" - - "OSRS wiki — Rune arrow / Bagged flower / Mystic mist staff etc. item pages (members = Yes for every cited catalog item; verified 2026-08-27)" + - "prices.runescape.wiki mapping 2026-08-27 (members/lowalch/highalch/limit catalog; rune javelin tips id 19580: lowalch 540, highalch 810, limit 10000, members=true; lowalch == highalch*2//3 asserted for every cited item)" + - "prices.runescape.wiki latest 2026-08-27, re-fetched at bounce fix (low = per-repo buy basis: rune javelin tips 403, rune arrow 45, nature rune 140, jade ring 303, opal amulet (u) 17)" + - "OSRS wiki — Module:Exchange/Rune javelin tips (limit 10000, lowalch 540, highalch 810, members=true — matches mapping; re-verified 2026-08-27) + Module:Exchange/Nature rune, Staff of fire and all cited candidates (GE limits agree with mapping; verified 2026-08-27)" + - "OSRS wiki — Rune javelin tips / Rune arrow / Bagged flower / Mystic mist staff etc. item pages (members = Yes for every cited catalog item; verified 2026-08-27)" - "OSRS wiki — Nature rune (members craft at level 44 Runecraft from pure essence, 9 xp; Nature Altar south-east of Tai Bwo Wannai)" - "OSRS wiki — Abyss (access to runic altars without talismans via the Mage of Zamorak)" - "OSRS wiki — Bryophyta's staff (level 30 Attack + Magic; up to 1,000 nature charges; 1/15 chance to not consume a charge on any nature-rune spell; alchemy combo with Tome of Fire)" From 284ec17370abc6fa0cb746650e4e1a2d43789a64 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 16:49:41 -0500 Subject: [PATCH 4/7] codex: fix low-alch-members pacing model per governor review (bounce fix attempt 2) - anti_ban.delay is additive to the 1.8s cast (action-grammar.md:135): cycle = 1.8s + 1.6-3.4s = 3.4-5.2s, midpoint 4.3s -> ~837 casts/hr - xp_per_hour 44,640 -> 25,953; gp_per_hour range -3,177..-2,077; formula pinned in economy pacing block and actions a3 comment - run_control.iteration = one full inventory+bank cycle (break.every counts iterations per docs/schema.md), bank-cycle claim removed - risk note cadence pin updated; version 2 -> 3 --- codex/economy/low-alch-members.yaml | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/codex/economy/low-alch-members.yaml b/codex/economy/low-alch-members.yaml index 3a0b8dd..1cf908b 100644 --- a/codex/economy/low-alch-members.yaml +++ b/codex/economy/low-alch-members.yaml @@ -3,7 +3,7 @@ title: Low-Level Alchemy (Members) domain: economy tags: [alching, magic-training, members, loss-training] status: verified -version: 2 # 2: bounce-fix 2026-08-27 — pacing-pinned economics, least-loss anchor, 30 Attack gate +version: 3 # 3: bounce-fix 2 2026-08-27 — additive cast+delay cycle (1.8s + 1.6-3.4s), iteration = full inventory+bank cycle updated: "2026-08-27" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date summary: > @@ -51,17 +51,17 @@ economy: cost_per_cycle: 543 # javelin tips buy 403 + nature rune 140 (staff of fire) income_per_cycle: 540 # lowalch of rune javelin tips (40% of value 1350) net_per_cycle: -3 - gp_per_hour_low: -6750 # -3/cast @ max cadence: 3600/1.6s delay = 2250 casts/hr - gp_per_hour_high: -3176 # -3/cast @ min cadence: 3600/3.4s delay = 1058.8 casts/hr - xp_per_hour: 44640 # 31 xp/cast (wiki) @ 1,440 casts/hr — pinned below - # Pacing pin: actions[].anti_ban.delay [1600, 3400] ms is the MANDATORY - # post-cast pause and the cadence constraint. A game tick is 0.6s, so a - # 3-tick LA cast is 1.8s — shorter than the 2.5s midpoint pause, so the - # pause, not the cast, sets the rate: 3600/2.5 = 1,440 casts/hr. - # xp_per_hour = 1440 x 31 = 44,640/hr - # gp_per_hour (midpoint) = 1440 x -3 = -4,320/hr; the low/high range - # above is the delay-bound spread (1,600ms -> 2,250 casts; 3,400ms -> - # 1,058.8 casts). + gp_per_hour_low: -3177 # -3/cast @ fastest cycle (1.8s cast + 1.6s delay = 3.4s) -> 1058.8 casts/hr + gp_per_hour_high: -2077 # -3/cast @ slowest cycle (1.8s cast + 3.4s delay = 5.2s) -> 692.3 casts/hr + xp_per_hour: 25953 # 31 xp/cast (wiki) @ midpoint cycle 837.2 casts/hr — pinned below + # Pacing pin (docs/action-grammar.md:135): actions[].anti_ban.delay is a + # MANDATORY post-action sleep, ADDITIVE to the action itself — it does not + # overlap the cast. LA cast = 3 game ticks x 0.6s = 1.8s; the delay + # [1600, 3400]ms = 1.6-3.4s. Cycle = cast + delay = 3.4s (fast) .. 5.2s + # (slow), midpoint 4.3s. + # casts/hr = 3600 / (1.8 + delay_s): 3.4s -> 1058.8; 5.2s -> 692.3; 4.3s -> 837.2 + # xp_per_hour (midpoint) = 837.2 x 31 = 25,953/hr (range 21,461 .. 32,823 by delay bounds) + # gp_per_hour = casts/hr x -3: midpoint -2,512; low (fast) -3,177; high (slow) -2,077 supplies: - item: rune javelin tips qty_per_cycle: 1 @@ -162,7 +162,7 @@ actions: on: "itself" on_fail: retry anti_ban: - delay: [1600, 3400] # MANDATORY post-cast pause (cadence policy): 3-tick cast = 1.8s (0.6s/tick); midpoint 2.5s -> ~1,440 casts/hr (pinned in economy) + delay: [1600, 3400] # MANDATORY post-action sleep, ADDITIVE to the 1.8s cast (3 ticks x 0.6s; action-grammar.md:135): cycle = 1.8s + 1.6-3.4s = 3.4-5.2s, midpoint 4.3s -> ~837 casts/hr (pinned in economy) - id: a4 step: bank-loop @@ -174,10 +174,10 @@ actions: on_fail: alert run_control: - iteration: "one cast" + iteration: "one full inventory + bank cycle" # per docs/schema.md run_control: break.every counts iterations; one cycle = cast the carried candidate supply down to buffer, bank the coins, restock — a cycle ends at the bank visit max_iterations: null break: - every: [8, 14] # bank cycles (breaks land on bank visits) + every: [8, 14] # iterations = full inventory+bank cycles (breaks land on bank visits) for: [45, 120] # seconds of idle AFK stop_conditions: - "magic level >= target (55 -> hand off to HLA)" @@ -187,7 +187,7 @@ run_control: risk: ban_level: low notes: - - "High cast cadence is the main detection vector; keep the mandatory anti_ban delays (cadence pin: ~1,440 casts/hr at the 2.5s midpoint pause)." + - "High cast cadence is the main detection vector; keep the mandatory anti_ban delays (cadence pin: ~837 casts/hr at the 4.3s midpoint cycle = 1.8s cast + 2.5s post-cast sleep)." - "GE buy bursts: pace offers, respect the 4h limit window; thin items (limit < 100) cannot sustain a long run." - "Thin-item 'latest low' fills can be stale — confirm fill price with a live GE offer before committing a run; the liquid high-limit pair (rune javelin tips / rune arrow) is the dependable loss-minimizer." From 5ddfc6cdbc20d83223b8396c5c9c0b43a0bd0d2d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 28 Aug 2026 02:56:53 -0500 Subject: [PATCH 5/7] codex: repair low-alch-members break/iteration model per owner guidance (bounce fix attempt 3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - iteration = one cast; break.every = [400, 700] COMPLETED casts, cast-count based and independent of bank visits (owner decision A) — bank-cycle claim removed - numeric carried_batch 1,000/1,000 + restock_threshold 100 -> deterministic restock trigger; first restock at cast 901 (worked example pinned) - full runnable lifecycle in actions: reach-bank, buy-staff, equip-staff (with fire-rune fallback failure path), buy-supplies, buy-natures, build-loadout, cast-alch (exact consumption + coins), restock, take-break - rates now REALIZED incl. setup/restock/breaks: xp_per_hour 24,500, gp_per_hour -2,960..-1,980; loop-only 837/hr derivation still pinned - pinned worked example: pre-inventory -> break #1 @550 -> first restock @901 -> resume @902 -> break #2 @1452 -> restock #2 @1802 - staff of fire equip requirement wiki-verified 2026-08-28: none documented (infobox + prose silent vs Battlestaff's 30 Attack/30 Magic) - version 3 -> 4; validator 2 entries 0 errors (1 pre-existing F2P WARN); Closes #2 --- codex/economy/low-alch-members.yaml | 234 ++++++++++++++++++++++------ 1 file changed, 184 insertions(+), 50 deletions(-) diff --git a/codex/economy/low-alch-members.yaml b/codex/economy/low-alch-members.yaml index 1cf908b..002074f 100644 --- a/codex/economy/low-alch-members.yaml +++ b/codex/economy/low-alch-members.yaml @@ -3,8 +3,8 @@ title: Low-Level Alchemy (Members) domain: economy tags: [alching, magic-training, members, loss-training] status: verified -version: 3 # 3: bounce-fix 2 2026-08-27 — additive cast+delay cycle (1.8s + 1.6-3.4s), iteration = full inventory+bank cycle -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 guidance) — iteration = one cast, break.every in CAST counts (independent of bank visits), numeric carried_batch/restock_threshold, realized rates incl. setup+restock+breaks, full-lifecycle actions, pinned worked example +updated: "2026-08-28" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date summary: > Magic training from level 21 by low-alching members items with the lowest @@ -13,26 +13,32 @@ summary: > (mapping lowalch != null, members=true, live GE prices 2026-08-27). At current prices the method burns a small amount of GP per cast for 31 XP — run it for XP, not GP. Least-loss liquid anchor at last check: rune - javelin tips (-3/cast). Handoff: switch to High Level Alchemy at level 55 - (hard level gate + strictly more coins AND XP per cast; see sources). + javelin tips (-3/cast). Model pin (owner guidance 2026-08-28): one + iteration = one cast; breaks every 400-700 COMPLETED CASTS (cast-count + based, independent of bank visits); restock when candidate or nature + drops below the numeric restock_threshold (100) against a carried_batch + of 1,000/1,000 — pinned worked example below. Handoff: switch to High + Level Alchemy at level 55 (hard level gate + strictly more coins AND XP + per cast; see sources). accounts: membership: members min_level: 21 # Magic 21 to cast Low Level Alchemy (wiki-verified) requires_quest: [] requires_other: - - "Staff of Fire equipped (removes 3 fire runes from the cost; no Attack requirement — the default path)" - - "A bank with GE access within reach" + - "Staff of Fire equipped (removes 3 fire runes from the cost; NO level requirement documented on the OSRS wiki — verified 2026-08-28, see sources — this is the default path)" + - "A bank with GE access within reach (alch spot = GE bank booth; restock trip 60-120s)" + - "Working capital >= 543,000 gp for one carried_batch (1,000 x 403 gp javelin tips + 1,000 x 140 gp natures, live 2026-08-27)" - "30 Attack + 50 Magic ONLY if adopting the optional Bryophyta's staff + Tome of Fire technique — below that the Staff of Fire path applies" best_practice: equipment: - item: staff of fire - why: "unlimited fire runes — LA rune cost drops from 3 fire + 1 nature to 1 nature per cast (~15gp/cycle saved)" - source: "OSRS wiki — Staff of Fire; Low Level Alchemy (Cost)" + why: "unlimited fire runes — LA rune cost drops from 3 fire + 1 nature to 1 nature per cast (~15gp/cycle saved); equip requirement: none documented on the OSRS wiki (verified 2026-08-28)" + source: "OSRS wiki — Staff of Fire (id 1387, F2P item, tradeable, no requirements row in the infobox and none in the prose — compare Battlestaff which states 'requires 30 Attack and 30 Magic'); Low Level Alchemy (Cost)" techniques: - name: cast on noted (stacked) items - why: "one inventory slot, minimal mouse travel between spell icon and item, no item un-noting" + why: "one inventory slot, minimal mouse travel between spell icon and item, no item un-noting; means an inventory does NOT define a batch size — batch sizes are the explicit numeric carried_batch below" source: "OSRS wiki — Low Level Alchemy (Usage: casting alchemy spells on noted items)" - name: Bryophyta's staff + Tome of Fire (members-only, 50 Magic, 30 Attack) why: "charged Bryophyta's staff holds up to 1,000 nature runes (0 rune inventory slots) with a 1/15 chance per cast to not consume a nature rune; charged Tome of Fire supplies infinite fire runes in the shield slot and non-combat spells (alchemy) do not consume charges — the wiki documents this exact pair for alchemy profit; payback takes thousands of casts, so adopt at 50+ Magic when nature prices are high. EQUIP GATE: the staff requires 30 Attack + 30 Magic and the tome requires 50 Magic — accounts below 30 Attack (e.g. 1-Attack mules) cannot equip it and keep the ordinary Staff of Fire path (equipment section above) instead" @@ -45,28 +51,36 @@ economy: # Verified 2026-08-27 against prices.runescape.wiki (live 'latest') + # OSRS wiki (spell infoboxes, Module:Exchange limits, item pages). # Re-verified at bounce fix 2026-08-27 with a fresh live fetch; the - # modeled anchor is now the ACTUAL least-loss liquid candidate. + # modeled anchor is the ACTUAL least-loss liquid candidate. + # Bounce-fix 3 (2026-08-28, owner guidance): all rate fields are REALIZED + # figures — setup/restock/breaks included, not just the cast loop. item: Rune javelin tips # least-loss liquid anchor 2026-08-27 (see profit_drivers) item_id: 19580 cost_per_cycle: 543 # javelin tips buy 403 + nature rune 140 (staff of fire) income_per_cycle: 540 # lowalch of rune javelin tips (40% of value 1350) net_per_cycle: -3 - gp_per_hour_low: -3177 # -3/cast @ fastest cycle (1.8s cast + 1.6s delay = 3.4s) -> 1058.8 casts/hr - gp_per_hour_high: -2077 # -3/cast @ slowest cycle (1.8s cast + 3.4s delay = 5.2s) -> 692.3 casts/hr - xp_per_hour: 25953 # 31 xp/cast (wiki) @ midpoint cycle 837.2 casts/hr — pinned below - # Pacing pin (docs/action-grammar.md:135): actions[].anti_ban.delay is a - # MANDATORY post-action sleep, ADDITIVE to the action itself — it does not - # overlap the cast. LA cast = 3 game ticks x 0.6s = 1.8s; the delay - # [1600, 3400]ms = 1.6-3.4s. Cycle = cast + delay = 3.4s (fast) .. 5.2s - # (slow), midpoint 4.3s. - # casts/hr = 3600 / (1.8 + delay_s): 3.4s -> 1058.8; 5.2s -> 692.3; 4.3s -> 837.2 - # xp_per_hour (midpoint) = 837.2 x 31 = 25,953/hr (range 21,461 .. 32,823 by delay bounds) - # gp_per_hour = casts/hr x -3: midpoint -2,512; low (fast) -3,177; high (slow) -2,077 + gp_per_hour_low: -2960 # realized (incl. restock+breaks), fastest cycle 3.4s -> 986.4 casts/hr x -3 = -2,959 + gp_per_hour_high: -1980 # realized (incl. restock+breaks), slowest cycle 5.2s -> 660.6 casts/hr x -3 = -1,982 + xp_per_hour: 24500 # realized midpoint 791.3 casts/hr x 31 xp = 24,530 (pin 24,500) + # ---- realized-rate derivation (pinned; owner guidance 2026-08-28) ---- + # LOOP: cycle = 1.8s cast (3 ticks x 0.6s) + anti_ban.delay [1.6, 3.4]s ADDITIVE + # (docs/action-grammar.md:135) = 3.4-5.2s, midpoint 4.3s -> loop-only + # casts/hr = 3600/4.3 = 837.2; loop-only xp = 25,953 (837.2 x 31); + # loop-only gp midpoint = -2,512 (837.2 x -3). + # OVERHEAD per 901-cast batch (carried_batch 1000 - restock_threshold 100): + # restock trip [60, 120]s (midpoint 90s, GE-adjacent booth); + # breaks: every [400, 700] casts (midpoint 550) for [45, 120]s (midpoint + # 82.5s) -> 901/550 = 1.64 breaks x 82.5s = 135s. + # Total overhead = 90 + 135 = 225s per 901 casts. + # REALIZED casts/hr = 901 / ((901 x cycle_s + 225) / 3600): + # fast 3.4s -> 986.4; midpoint 4.3s -> 791.3; slow 5.2s -> 660.6. + # xp_per_hour = 791.3 x 31 = 24,530 (pin 24,500; range 20,480..30,580). + # gp_per_hour = realized casts/hr x -3: fast -2,959 (low), slow -1,982 (high), midpoint -2,374. supplies: - item: rune javelin tips qty_per_cycle: 1 source: ge - ge_limit: 10000 # mapping + Module:Exchange/Rune javelin tips agree (re-verified 2026-08-27) + ge_limit: 10000 # mapping + Module:Exchange/Rune javelin tips agree (re-verified 2026-08-27); one carried_batch of 1,000 fits the 4h window - item: nature rune qty_per_cycle: 1 source: ge @@ -87,31 +101,47 @@ economy: - "9. Adamant spear(p) (id 1259, lowalch 832, buy 450, margin +382, GE limit 125)" - "10. Mystic mist staff (id 20733, lowalch 17000, buy 75727, margin -58727, GE limit 8) — buy spiked ABOVE alch value 2026-08-27; a true loss trap, do not buy" - "Caveat: thin items (limits 5-125) cannot sustain a run and their 'low' fills can be stale — a bot cannot reliably buy at those prices. The dependable loss-minimizers are the liquid high-limit pair modeled above: rune javelin tips (-3/cast) and rune arrow (-25/cast)." + - "Batch-scale economics (default staff-of-fire path, worst case 1 nature/cast): carried_batch 1,000/1,000, restock every 901 casts — one batch = -2,703 gp, +27,931 xp, 2 x 540 gp coin deposits." state_machine: initial: idle terminal: [complete, failed] states: idle: - goal: reach the bank + have supplies in inventory - next: [casting, bank_supplies] + goal: "acquire + equip the staff of fire, GE-buy candidate + natures, build the starting inventory to carried_batch (1,000 candidate + 1,000 nature)" + next: [casting, complete, failed] casting: - goal: cast Low Level Alchemy on the current candidate item - next: [bank_supplies, idle, complete, failed] + goal: "cast Low Level Alchemy on the current candidate item — each cast consumes 1 candidate + 1 nature and pays 540 gp (lowalch), +31 xp, net -3 gp; take a break when the completed-cast counter hits run_control.break.every ([400, 700] casts)" + next: [bank_supplies, complete, failed] bank_supplies: - goal: bank the produced coins, withdraw fresh candidate + runes - next: [casting, idle] + goal: "deposit coins + products, withdraw candidate + natures back to carried_batch (1,000/1,000), resume casting" + next: [casting, failed] complete: - goal: reached the run's XP/level target + goal: "reached the run's XP/level target (default 55 -> hand off to HLA)" failed: - goal: hard failure — stop, log ERROR sentinel, alert + goal: "hard failure — stop, log ERROR sentinel, alert" transitions: - - from: casting - when: "candidate item count < buffer OR nature rune count < buffer" - to: bank_supplies - from: idle - when: "magic level >= target (default 55, hand off to HLA at 55)" + when: "staff equipped AND candidate == carried_batch AND nature == carried_batch (1,000 and 1,000)" + to: casting + - from: idle + when: "magic level >= target (55, hand off to HLA)" to: complete + - from: idle + when: "3 consecutive purchase/equip failures with no fallback available (recovery block below)" + to: failed + - from: casting + when: "candidate count < restock_threshold (100) OR nature rune count < restock_threshold (100) — deterministic restock trigger, pinned numbers" + to: bank_supplies + - from: casting + when: "magic level >= target (55, hand off to HLA)" + to: complete + - from: casting + when: "3 consecutive failed casts (client issue — do not loop)" + to: failed + - from: bank_supplies + when: "restocked to carried_batch (1,000 candidate + 1,000 nature)" + to: casting # --- handoff note (wiki-verified 2026-08-27, do not copy from other entries) --- # Low Level Alchemy: level 21, 31 xp/cast, 1 nature + 3 fire (spellbook: Normal). @@ -134,25 +164,69 @@ actions: verb: move_to target: bank params: - location: "nearest bank with GE" + location: "GE-adjacent bank (alch spot = the bank booth, so restock is a single short leg)" method: [teleport, walk] on_fail: retry anti_ban: delay: [400, 1600] - id: a2 + step: buy-staff + verb: ge_buy + target: grand-exchange + params: + item: "staff of fire" + qty: 1 + max_price: "live low + 25% (wiki value 1,500; hard cap 5,000)" + on_fail: retry # retry once; on a second failure use the fire-rune fallback (see a3 note / recovery block) + anti_ban: + delay: [1200, 3000] + + - id: a3 + step: equip-staff + verb: menu_option + target: "staff of fire in inventory" + params: + option: "Wield" + note: "Equip requirement is NONE documented on the OSRS wiki Staff of fire page (no requirements row in the infobox, none in the prose; compare Battlestaff which states 'requires 30 Attack and 30 Magic'; verified 2026-08-28). FAILURE PATH — if Wield is unavailable or the staff cannot be equipped, fall back to buying 3 fire runes per cast (3 fire + 1 nature = 155 gp rune cost vs 140, net -18/cast at the anchor), log WARN and continue; never loop on equip attempts." + on_fail: retry + anti_ban: + delay: [600, 1800] + + - id: a4 step: buy-supplies verb: ge_buy target: grand-exchange params: - item: "current candidate item" - qty: "fill to buffer" + item: "current least-loss live candidate (default: rune javelin tips)" + qty: "carried_batch = 1,000 (fits the 4h GE limit window of 10,000)" + max_price: "live low + 5%" + on_fail: retry # re-place at live low +5% with paced offers; 3 consecutive failures -> failed (recovery block) + anti_ban: + delay: [1200, 3000] + + - id: a5 + step: buy-natures + verb: ge_buy + target: grand-exchange + params: + item: "nature rune" + qty: "carried_batch = 1,000 (4h GE limit 18,000)" max_price: "live low + 5%" on_fail: retry anti_ban: delay: [1200, 3000] - - id: a3 + - id: a6 + step: build-loadout + verb: bank_inventory + target: bank + params: + deposit: [overflow products] + withdraw: "candidate 1,000 + nature runes 1,000 (= carried_batch; both stackable, two inventory slots)" + on_fail: retry + + - id: a7 step: cast-alch verb: use_item_on target: "candidate item in inventory" @@ -160,37 +234,95 @@ actions: spell: "Low Level Alchemy" item: "least-loss live candidate in inventory" on: "itself" + consumption: "1 candidate + 1 nature per cast (staff of fire default); pays 540 gp (lowalch) + 31 xp, net -3 gp" on_fail: retry anti_ban: - delay: [1600, 3400] # MANDATORY post-action sleep, ADDITIVE to the 1.8s cast (3 ticks x 0.6s; action-grammar.md:135): cycle = 1.8s + 1.6-3.4s = 3.4-5.2s, midpoint 4.3s -> ~837 casts/hr (pinned in economy) + delay: [1600, 3400] # MANDATORY post-action sleep, ADDITIVE to the 1.8s cast (3 ticks x 0.6s; action-grammar.md:135): cycle = 1.8s + 1.6-3.4s = 3.4-5.2s, midpoint 4.3s -> realized ~791 casts/hr incl. restock+breaks (pinned in economy) - - id: a4 - step: bank-loop + - id: a8 + step: restock verb: bank_inventory target: bank params: deposit: [all coins, all products] - withdraw: "candidate item + nature runes up to buffer" + withdraw: "candidate + nature runes up to carried_batch (1,000/1,000)" on_fail: alert + - id: a9 + step: take-break + verb: take_break + target: "current location" + params: + duration: "[45, 120] seconds of idle AFK per break (matches run_control.break.for)" + note: "executed by the translator when the completed-cast counter reaches run_control.break.every — this IS run_control.break's executor, fired on CAST COUNTS, not on bank visits; the cast counter is not reset by restocking" + on_fail: skip + run_control: - iteration: "one full inventory + bank cycle" # per docs/schema.md run_control: break.every counts iterations; one cycle = cast the carried candidate supply down to buffer, bank the coins, restock — a cycle ends at the bank visit - max_iterations: null + iteration: "one cast" # = one Low Level Alchemy cast (+31 xp, -3 gp at the anchor). Per docs/schema.md run_control, break.every counts ITERATIONS — so it counts CASTS here, NOT bank trips (owner decision 2026-08-28) + max_iterations: null # null = until complete condition break: - every: [8, 14] # iterations = full inventory+bank cycles (breaks land on bank visits) - for: [45, 120] # seconds of idle AFK + every: [400, 700] # COMPLETED CASTS between AFK breaks (midpoint 550 = ~39 min at the 4.3s midpoint cycle). Cast-count-based and independent of bank visits; a restock trip NEVER counts as a break and does not reset this counter + for: [45, 120] # seconds of idle AFK per break stop_conditions: - "magic level >= target (55 -> hand off to HLA)" - - "gp under floor" + - "gp under floor (working capital below one carried_batch = 543,000 gp)" - "3 consecutive failed casts (client issue — do not loop)" + - "3 consecutive failed GE purchases with no fallback candidate available" + + # ================= WORKED EXAMPLE (pinned, deterministic — owner guidance 2026-08-28) ================= + # Constants: carried_batch = 1,000 candidate + 1,000 nature; restock_threshold = 100; + # break.every = [400, 700] casts (midpoint 550); break.for = [45, 120] s; + # default staff-of-fire path consumes 1 candidate + 1 nature per cast (worst case 1:1 — + # with Bryophyta's staff the nature side drains slower, so the candidate stays binding). + # + # Step 0 — before the first inventory: account holds >= 543,000 gp working capital + # (1,000 x 403 + 1,000 x 140). At the GE bank: GE-buy staff of fire, Wield it + # (no documented requirement), GE-buy 1,000 rune javelin tips + 1,000 nature runes, + # withdraw both -> loadout = carried_batch 1,000/1,000. Cast counter := 0. + # Step 1 — casts #1..#550: each cast consumes 1 candidate + 1 nature (-543 gp) and pays + # 540 gp (lowalch) + 31 xp -> net -3 gp. Cast counter 0 -> 550 (~39 min at midpoint). + # Step 2 — FIRST SCHEDULED BREAK at cast 550 (midpoint of break.every [400, 700]): run + # take-break for 45-120 s. Resume casting at cast 551. The break fired on the CAST + # COUNT, not on any bank visit; the restock counter is untouched. + # Step 3 — casts #551..#901: countdown candidate 1000-901 = 99 < 100 (restock_threshold) + # and nature 1000-901 = 99 < 100 simultaneously (worst case 1:1) -> the transition + # fires at the end of cast #901: FIRST RESTOCK/BANK EVENT at cast 901. + # Coins deposited at this restock: 901 x 540 = 486,540 gp; batch net so far -2,703 gp; + # batch xp so far 901 x 31 = 27,931. + # Step 4 — restock: deposit coins + products, withdraw 901 candidate + 901 nature -> + # carried_batch restored to 1,000/1,000. Resume casting at cast 902 (cast counter + # continues; the break counter also continues — restocking never resets either). + # Step 5 — SECOND BREAK when the cast-count interval since break #1 completes + # ([400, 700], midpoint: cast 902 + 550 = 1,452): take-break, resume at 1,453. + # Step 6 — restock #2 fires at cast 1,802 (901-cast batch cadence), and so on, until a + # stop_condition fires (Magic >= 55 -> HLA handoff; gp under floor; 3 failed casts). + # Bank visits and breaks are INDEPENDENT by construction: restock cadence = 901 casts; + # break cadence = 400-700 casts, and the two counters do not interact. + # ============================================================================================ risk: ban_level: low notes: - - "High cast cadence is the main detection vector; keep the mandatory anti_ban delays (cadence pin: ~837 casts/hr at the 4.3s midpoint cycle = 1.8s cast + 2.5s post-cast sleep)." - - "GE buy bursts: pace offers, respect the 4h limit window; thin items (limit < 100) cannot sustain a long run." + - "High cast cadence is the main detection vector; keep the mandatory anti_ban delays (cadence pin: additive post-cast sleep [1.6, 3.4]s; realized ~791 casts/hr at the 4.3s midpoint cycle incl. restock + breaks; loop-only 837)." + - "Breaks are CAST-COUNT-based (every [400, 700] completed casts, 45-120s AFK) and independent of bank visits — never treat a restock trip as a break." + - "GE buy bursts: pace offers, respect the 4h limit window (10,000 javelin tips / 18,000 natures); thin items (limit < 100) cannot sustain a long run." - "Thin-item 'latest low' fills can be stale — confirm fill price with a live GE offer before committing a run; the liquid high-limit pair (rune javelin tips / rune arrow) is the dependable loss-minimizer." +# --- recovery block (owner guidance 2026-08-28: every activity must cover its complete runnable lifecycle) --- +# - Missing materials / depleted supplies: the restock_threshold transition (casting -> +# bank_supplies at candidate OR nature < 100) catches both mid-run depletions; restock +# action a8 rebuilds to carried_batch and the loop resumes (worked example steps 3-4). +# - Failed GE purchases (offer unfilled): re-place at live low + 5% with paced offers +# (a4/a5); after 3 consecutive failures, alert + stop (failed) unless a fallback +# candidate is switched in — never sit in an unfillable offer loop. +# - Staff of fire cannot be equipped (a3): fall back to buying 3 fire runes per cast +# (3 fire + 1 nature = 155 gp/cast rune cost vs 140; net -18/cast at the anchor), +# log WARN, continue; never loop on equip attempts. +# - Invalid loadout (wrong item in hand / spell unavailable): re-run build-loadout (a6); +# 3 consecutive failed casts -> failed (stop, log ERROR sentinel, alert). +# - Explicit completion/stop: stop_conditions above (Magic 55 HLA handoff, gp floor, +# repeated failures). + sources: - "OSRS wiki — Low Level Alchemy (level 21, 31 xp/cast, 3-tick, 1 nature + 3 fire; spellbook Normal; infobox 2026-08-27)" - "OSRS wiki — High Level Alchemy (level 55, 65 xp/cast, 1 nature + 5 fire; 60% of item value; infobox 2026-08-27)" @@ -204,7 +336,9 @@ sources: - "OSRS wiki — Abyss (access to runic altars without talismans via the Mage of Zamorak)" - "OSRS wiki — Bryophyta's staff (level 30 Attack + Magic; up to 1,000 nature charges; 1/15 chance to not consume a charge on any nature-rune spell; alchemy combo with Tome of Fire)" - "OSRS wiki — Tome of Fire (members, level 50 Magic to wield; charged tome is an infinite fire-rune source and non-combat spells do not consume charges)" -verified: "2026-08-27" # keep quoted (YAML 1.1 date parsing) + - "OSRS wiki — Staff of fire (page verified 2026-08-28 for the equip requirement: id 1387, F2P item, tradeable, options Wield — NO requirements row in the Infobox Item and NO requirement statement in the prose; contrast Battlestaff, whose prose states 'requires 30 Attack and 30 Magic to wield')" + - "docs/schema.md run_control (iteration unit; break.every counts iterations) + docs/action-grammar.md:135 (anti_ban.delay = additive post-action sleep) + verb take_break — the cadence + break + recovery model" +verified: "2026-08-27" # keep quoted (YAML 1.1 date parsing); prices last re-fetched live 2026-08-27 related: - low-alch-f2p From a197b34aa8067f590de3622a50cdb50e2b59f0da Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 28 Aug 2026 03:36:45 -0500 Subject: [PATCH 6/7] =?UTF-8?q?codex:=20low-alch-members=20=E2=80=94=20com?= =?UTF-8?q?plete=20GE=20lifecycle,=20capital=20model,=20monotonic=20counte?= =?UTF-8?q?rs,=20fail-closed=20staff=20(bounce-fix=20attempt=204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner guidance 10325 (governor 10297 findings, exactly): - GE acquisition path for initial buy AND every restock: open -> place -> wait/fill -> collect (ge_open/ge_buy/ge_collect; new wait_offers state), partial-fill collect + re-place recovery, bank-stock fast path only when the bank actually holds stock — never withdraw an unbought batch. - Capital model: staff cap 5,000 + first batch at max fill 570,150 + 6-batch worst-case loss reserve 162,990 + float 570,150 (~1.31M); capital stops use TOTAL ASSETS (cash + supplies), never raw cash. - Monotonic counters: breaks at 550/1,100/1,650 independent of restocks at 901/1,802 (gcd 550,901=1); validator regression rejects the old 1,452 restart bug and enforces the pins. - Rates: loop-only 837.2 labelled ceiling; steady-state 639-1020 (mid 791.2); session-realized 586-977 (mid 741.8) over the explicit 2h session horizon -> xp 23,000, gp -2,930..-1,760. - Staff equip FAIL-CLOSED after bounded retries; fire-rune fallback prose removed everywhere. Preserves one-cast iteration, cast-count breaks, rune javelin tips anchor, pacing/equipment fixes. version 4 -> 5. --- codex/economy/low-alch-members.yaml | 342 +++++++++++++++++++--------- tools/validate.py | 35 +++ 2 files changed, 266 insertions(+), 111 deletions(-) diff --git a/codex/economy/low-alch-members.yaml b/codex/economy/low-alch-members.yaml index 002074f..cc3b7c7 100644 --- a/codex/economy/low-alch-members.yaml +++ b/codex/economy/low-alch-members.yaml @@ -3,7 +3,7 @@ title: Low-Level Alchemy (Members) domain: economy tags: [alching, magic-training, members, loss-training] status: verified -version: 4 # 4: bounce-fix 3 2026-08-28 (owner guidance) — iteration = one cast, break.every in CAST counts (independent of bank visits), numeric carried_batch/restock_threshold, realized rates incl. setup+restock+breaks, full-lifecycle actions, pinned worked example +version: 5 # 5: bounce-fix 4 2026-08-28 (owner guidance 10325) — complete GE acquisition path (open -> place -> fill -> collect) for initial buy AND every restock (bank-stock fast path only when the bank holds stock); fail-closed staff equip (bounded retries, no fire-rune fallback); capital model (cash vs supplies, staff cost, max-fill worst case, 6-batch loss reserve, float); monotonic break/restock counters (breaks 550/1,100/1,650 independent of restocks 901/1,802) + validator regression; startup-vs-steady-state rates over a 2 h session horizon updated: "2026-08-28" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date summary: > @@ -13,28 +13,35 @@ summary: > (mapping lowalch != null, members=true, live GE prices 2026-08-27). At current prices the method burns a small amount of GP per cast for 31 XP — run it for XP, not GP. Least-loss liquid anchor at last check: rune - javelin tips (-3/cast). Model pin (owner guidance 2026-08-28): one + javelin tips (-3/cast). Model pins (owner guidance 2026-08-28): one iteration = one cast; breaks every 400-700 COMPLETED CASTS (cast-count - based, independent of bank visits); restock when candidate or nature - drops below the numeric restock_threshold (100) against a carried_batch - of 1,000/1,000 — pinned worked example below. Handoff: switch to High - Level Alchemy at level 55 (hard level gate + strictly more coins AND XP - per cast; see sources). + based, independent of bank visits — midpoint example: 550, 1,100, 1,650, + ...); restock when candidate or nature drops below the numeric + restock_threshold (100) against a carried_batch of 1,000/1,000 (restock + cadence 901 casts, monotonic and independent of breaks). EVERY purchase + follows the complete GE path open -> place -> fill/wait -> collect, for + the initial acquisition and for every restock (a bank-stock fast path + applies only when the bank actually holds enough stock). Staff-of-fire + equip failure is FAIL-CLOSED (bounded retries, then log ERROR + alert + + stop — no fire-rune fallback is modeled). Session horizon 2 h; rates are + session-realized (startup + restock + breaks included, see economy). + Handoff: switch to High Level Alchemy at level 55 (hard level gate + + strictly more coins AND XP per cast; see sources). accounts: membership: members min_level: 21 # Magic 21 to cast Low Level Alchemy (wiki-verified) requires_quest: [] requires_other: - - "Staff of Fire equipped (removes 3 fire runes from the cost; NO level requirement documented on the OSRS wiki — verified 2026-08-28, see sources — this is the default path)" - - "A bank with GE access within reach (alch spot = GE bank booth; restock trip 60-120s)" - - "Working capital >= 543,000 gp for one carried_batch (1,000 x 403 gp javelin tips + 1,000 x 140 gp natures, live 2026-08-27)" + - "Staff of Fire equipped (removes 3 fire runes from the cost; NO level requirement documented on the OSRS wiki — verified 2026-08-28, see sources — this is the default path). Equip failure is FAIL-CLOSED: flow performs bounded retries (3), then logs ERROR + alerts + stops — there is no fire-rune fallback in this model" + - "A bank with GE access within reach (alch spot = GE bank booth; restock trip [60, 120] s)" + - "Starting capital >= ~1.31M gp CASH (model breakdown: staff buy hard cap 5,000 + first batch at MAX allowed fill 570,150 + session loss reserve 162,990 = 6 worst-case batches at live-low+5% fills (covers Magic 21 -> 55) + resting-offer float 570,150). The capital stop check uses TOTAL ASSETS (cash + supplies at current buy cost), never raw cash — cash legitimately converts into supplies mid-run" - "30 Attack + 50 Magic ONLY if adopting the optional Bryophyta's staff + Tome of Fire technique — below that the Staff of Fire path applies" best_practice: equipment: - item: staff of fire - why: "unlimited fire runes — LA rune cost drops from 3 fire + 1 nature to 1 nature per cast (~15gp/cycle saved); equip requirement: none documented on the OSRS wiki (verified 2026-08-28)" + why: "unlimited fire runes — LA rune cost drops from 3 fire + 1 nature to 1 nature per cast (~15gp/cycle saved); equip requirement: none documented on the OSRS wiki (verified 2026-08-28); if it cannot be equipped after bounded retries the run FAILS CLOSED (no fallback modeled)" source: "OSRS wiki — Staff of Fire (id 1387, F2P item, tradeable, no requirements row in the infobox and none in the prose — compare Battlestaff which states 'requires 30 Attack and 30 Magic'); Low Level Alchemy (Cost)" techniques: - name: cast on noted (stacked) items @@ -52,30 +59,42 @@ economy: # OSRS wiki (spell infoboxes, Module:Exchange limits, item pages). # Re-verified at bounce fix 2026-08-27 with a fresh live fetch; the # modeled anchor is the ACTUAL least-loss liquid candidate. - # Bounce-fix 3 (2026-08-28, owner guidance): all rate fields are REALIZED - # figures — setup/restock/breaks included, not just the cast loop. + # Bounce-fix 4 (2026-08-28, owner guidance 10325): all rate fields are + # SESSION-REALIZED figures — startup + restock + mandatory breaks + # included; loop-only and steady-state figures retained as labelled + # references; the 2 h session horizon is explicit (stop_conditions). item: Rune javelin tips # least-loss liquid anchor 2026-08-27 (see profit_drivers) item_id: 19580 - cost_per_cycle: 543 # javelin tips buy 403 + nature rune 140 (staff of fire) + cost_per_cycle: 543 # javelin tips buy 403 + nature rune 140 (staff of fire, live low 2026-08-27) income_per_cycle: 540 # lowalch of rune javelin tips (40% of value 1350) net_per_cycle: -3 - gp_per_hour_low: -2960 # realized (incl. restock+breaks), fastest cycle 3.4s -> 986.4 casts/hr x -3 = -2,959 - gp_per_hour_high: -1980 # realized (incl. restock+breaks), slowest cycle 5.2s -> 660.6 casts/hr x -3 = -1,982 - xp_per_hour: 24500 # realized midpoint 791.3 casts/hr x 31 xp = 24,530 (pin 24,500) - # ---- realized-rate derivation (pinned; owner guidance 2026-08-28) ---- - # LOOP: cycle = 1.8s cast (3 ticks x 0.6s) + anti_ban.delay [1.6, 3.4]s ADDITIVE - # (docs/action-grammar.md:135) = 3.4-5.2s, midpoint 4.3s -> loop-only - # casts/hr = 3600/4.3 = 837.2; loop-only xp = 25,953 (837.2 x 31); - # loop-only gp midpoint = -2,512 (837.2 x -3). - # OVERHEAD per 901-cast batch (carried_batch 1000 - restock_threshold 100): - # restock trip [60, 120]s (midpoint 90s, GE-adjacent booth); - # breaks: every [400, 700] casts (midpoint 550) for [45, 120]s (midpoint - # 82.5s) -> 901/550 = 1.64 breaks x 82.5s = 135s. - # Total overhead = 90 + 135 = 225s per 901 casts. - # REALIZED casts/hr = 901 / ((901 x cycle_s + 225) / 3600): - # fast 3.4s -> 986.4; midpoint 4.3s -> 791.3; slow 5.2s -> 660.6. - # xp_per_hour = 791.3 x 31 = 24,530 (pin 24,500; range 20,480..30,580). - # gp_per_hour = realized casts/hr x -3: fast -2,959 (low), slow -1,982 (high), midpoint -2,374. + gp_per_hour_low: -2930 # session-realized fast bound: 977.2 casts/hr x -3 = -2,932 (3.4 s cycle, 300 s startup, 2 h horizon) + gp_per_hour_high: -1760 # session-realized slow bound: 585.9 casts/hr x -3 = -1,758 (5.2 s cycle, 600 s startup, 2 h horizon) + xp_per_hour: 23000 # session-realized midpoint: 741.8 casts/hr x 31 = 22,995 (pin 23,000) + # ---- rate model (pinned; owner guidance 2026-08-28) ---- + # LOOP (idealised, zero overhead — ceiling reference ONLY, never the + # entry's output): cycle = 1.8 s cast (3 ticks x 0.6 s) + + # anti_ban.delay [1.6, 3.4] s ADDITIVE (docs/action-grammar.md:135) + # = 3.4-5.2 s, midpoint 4.3 s -> loop-only casts/hr = 3600/4.3 = 837.2 + # (range 692.3..1,058.8); loop-only xp mid = 25,953; gp mid = -2,512. + # STEADY-STATE (mandatory breaks + restock trips, no startup): per + # 901-cast batch: 901 x cycle + restock trip [60, 120] s (mid 90) + + # break share (break.for mid 82.5 s per break.every mid 550 casts: + # 45 s/700 at the fast end, 120 s/400 at the slow end): + # fast 3.4 s: 901 x 3.4 + 60 + 45 x 901/700 = 3,181.3 s -> 1,019.7 casts/hr + # mid 4.3 s: 901 x 4.3 + 90 + 82.5 x 901/550 = 4,099.5 s -> 791.3 casts/hr + # slow 5.2 s: 901 x 5.2 + 120 + 120 x 901/400 = 5,075.5 s -> 639.2 casts/hr + # SESSION-REALIZED (2 h horizon = 7,200 s; one-time startup 300-600 s, + # mid 450 s -> 450/7200 = 6.25 %): realized = steady-state x (1 - + # startup/session): fast 977.2, mid 741.8, slow 585.9 casts/hr. + # xp mid = 741.8 x 31 = 22,995 -> pin 23,000; gp = casts/hr x -3: + # low -2,932 (fast), high -1,758 (slow), mid -2,225. + # BATCH ECONOMICS (901 casts; deposits 901 x 540 = 486,540 gp per batch): + # input cost at live low: 901 x 543 = 489,243 -> net -2,703/batch + # input cost at MAX fill (live low + 5 %): 901 x 570.15 = 513,705 -> net + # -27,165/batch (worst case). Reserve = 6 worst-case batches (Magic + # 21 -> 55 = ~5,300 casts = ~6 batches) = 162,990 gp; the capital stop + # checks TOTAL ASSETS, not raw cash (see accounts + stop_conditions). supplies: - item: rune javelin tips qty_per_cycle: 1 @@ -101,37 +120,58 @@ economy: - "9. Adamant spear(p) (id 1259, lowalch 832, buy 450, margin +382, GE limit 125)" - "10. Mystic mist staff (id 20733, lowalch 17000, buy 75727, margin -58727, GE limit 8) — buy spiked ABOVE alch value 2026-08-27; a true loss trap, do not buy" - "Caveat: thin items (limits 5-125) cannot sustain a run and their 'low' fills can be stale — a bot cannot reliably buy at those prices. The dependable loss-minimizers are the liquid high-limit pair modeled above: rune javelin tips (-3/cast) and rune arrow (-25/cast)." - - "Batch-scale economics (default staff-of-fire path, worst case 1 nature/cast): carried_batch 1,000/1,000, restock every 901 casts — one batch = -2,703 gp, +27,931 xp, 2 x 540 gp coin deposits." + - "Batch-scale economics (default staff-of-fire path, worst case 1 nature/cast): carried_batch 1,000/1,000, restock every 901 casts — one batch = -2,703 gp at live-low fills (-27,165 at MAX allowed fills), +27,931 xp, deposits 486,540 gp; unfilled-offer float (up to 570,150 gp) is separate from loss (see accounts)." state_machine: initial: idle terminal: [complete, failed] states: idle: - goal: "acquire + equip the staff of fire, GE-buy candidate + natures, build the starting inventory to carried_batch (1,000 candidate + 1,000 nature)" - next: [casting, complete, failed] + goal: "session start at the GE bank booth. Open GE (a2), then place the initial offers: staff of fire (a3), candidate 1,000 (a4), nature runes 1,000 (a5) at live low + 5% (staff: +25% up to the 5,000 cap). Record initial capital in the cash ledger (total assets = cash + supplies at current buy cost). Nothing is bought or collected without an open GE interface" + next: [wait_offers, complete, failed] + wait_offers: + goal: "wait for the pending offers (ge_offers_done); when filled, collect every purchase + refund from the collection box (a6 — never leave purchases in the box). PARTIAL FILLS: collect the filled portion, re-place the remainder at the current edge (a3/a4/a5); 3 consecutive no-fill rounds (offer cannot fill at the accepted edge) -> failed. An offer that is still unfilled at session end is left resting by design — its coins are tied up (float reserve) and return when it fills or is aborted by the operator (the single operator-touch point)" + next: [ready, wait_offers, failed] + ready: + goal: "equip the staff of fire (a7 — bounded retries, then FAIL CLOSED) and build the loadout to carried_batch 1,000 candidate + 1,000 nature (a8; purchases from a6 are already in the inventory; a8 deposits overflow and confirms the counts)" + next: [casting, failed] casting: - goal: "cast Low Level Alchemy on the current candidate item — each cast consumes 1 candidate + 1 nature and pays 540 gp (lowalch), +31 xp, net -3 gp; take a break when the completed-cast counter hits run_control.break.every ([400, 700] casts)" + goal: "cast Low Level Alchemy on the candidate (a9) — each cast consumes 1 candidate + 1 nature and pays 540 gp (lowalch), +31 xp, net -3 gp; take a break when the completed-cast counter hits run_control.break.every ([400, 700] casts, via a13); the counter is NEVER reset by restocking" next: [bank_supplies, complete, failed] bank_supplies: - goal: "deposit coins + products, withdraw candidate + natures back to carried_batch (1,000/1,000), resume casting" - next: [casting, failed] + goal: "restock to carried_batch: deposit coins + products and withdraw ALL candidate/natures the bank holds (a10 — bank-stock fast path when the bank already holds enough); for the remaining deficit, open GE (a2), buy the deficit (a11, live low + 5%), collect it (a12) — never withdraw a batch that was never bought. Restocking never resets the cast counter or the break counter; the break cadence (550/1,100/1,650, ...) is independent of the restock cadence (901/1,802, ...)" + next: [casting, bank_supplies, failed] complete: - goal: "reached the run's XP/level target (default 55 -> hand off to HLA)" + goal: "reached the run's XP/level target (default 55 -> hand off to HLA) or the 2 h session horizon" failed: goal: "hard failure — stop, log ERROR sentinel, alert" transitions: - from: idle - when: "staff equipped AND candidate == carried_batch AND nature == carried_batch (1,000 and 1,000)" - to: casting + when: "staff + candidate + nature offers all placed (a3/a4/a5)" + to: wait_offers - from: idle - when: "magic level >= target (55, hand off to HLA)" + when: "magic level >= target (55) at session start" to: complete - from: idle - when: "3 consecutive purchase/equip failures with no fallback available (recovery block below)" + when: "3 consecutive offer-place failures at session start (no fallback candidate)" + to: failed + - from: wait_offers + when: "ge_offers_done AND all purchases collected (a6)" + to: ready + - from: wait_offers + when: "partial fill: filled portion collected (a6), remainder re-placed at the current edge (a3/a4/a5) — still waiting" + to: wait_offers + - from: wait_offers + when: "3 consecutive no-fill rounds (offer cannot fill at the accepted edge)" + to: failed + - from: ready + when: "staff equipped (a7) AND loadout at carried_batch 1,000/1,000 (a8)" + to: casting + - from: ready + when: "staff equip failed after bounded retries — FAIL CLOSED" to: failed - from: casting - when: "candidate count < restock_threshold (100) OR nature rune count < restock_threshold (100) — deterministic restock trigger, pinned numbers" + when: "candidate count < restock_threshold (100) OR nature count < restock_threshold (100) — deterministic restock trigger, pinned numbers" to: bank_supplies - from: casting when: "magic level >= target (55, hand off to HLA)" @@ -140,8 +180,14 @@ state_machine: when: "3 consecutive failed casts (client issue — do not loop)" to: failed - from: bank_supplies - when: "restocked to carried_batch (1,000 candidate + 1,000 nature)" + when: "restock complete: candidate == carried_batch (1,000) AND nature == carried_batch (1,000) — bank fast path or re-bought deficit collected" to: casting + - from: bank_supplies + when: "restock partial: deficit re-bought but offers still filling (ge_offers_done false) — loop the restock phase" + to: bank_supplies + - from: bank_supplies + when: "3 consecutive no-fill restock rounds OR a capital stop fires (assets / loss-reserve checks in stop_conditions)" + to: failed # --- handoff note (wiki-verified 2026-08-27, do not copy from other entries) --- # Low Level Alchemy: level 21, 31 xp/cast, 1 nature + 3 fire (spellbook: Normal). @@ -171,27 +217,27 @@ actions: delay: [400, 1600] - id: a2 + step: open-ge + verb: ge_open + target: grand-exchange + params: + note: "open the GE interface at the booth. The entry NEVER buys (a3/a4/a5/a11) or collects (a6/a12) without an open GE interface — the action grammar defines ge_open, ge_buy, ge_collect as separate verbs, so the open step is explicit" + on_fail: retry + anti_ban: + delay: [600, 1400] + + - id: a3 step: buy-staff verb: ge_buy target: grand-exchange params: item: "staff of fire" qty: 1 - max_price: "live low + 25% (wiki value 1,500; hard cap 5,000)" - on_fail: retry # retry once; on a second failure use the fire-rune fallback (see a3 note / recovery block) - anti_ban: - delay: [1200, 3000] - - - id: a3 - step: equip-staff - verb: menu_option - target: "staff of fire in inventory" - params: - option: "Wield" - note: "Equip requirement is NONE documented on the OSRS wiki Staff of fire page (no requirements row in the infobox, none in the prose; compare Battlestaff which states 'requires 30 Attack and 30 Magic'; verified 2026-08-28). FAILURE PATH — if Wield is unavailable or the staff cannot be equipped, fall back to buying 3 fire runes per cast (3 fire + 1 nature = 155 gp rune cost vs 140, net -18/cast at the anchor), log WARN and continue; never loop on equip attempts." + max_price: "live low + 25 % (wiki value 1,500; hard cap 5,000)" + note: "offer rests until filled or the run ends; on a partial/no fill, collect what filled (a6) and re-place the remainder at the current edge — bounded retries, then the run fails closed (no fire-rune fallback exists)" on_fail: retry anti_ban: - delay: [600, 1800] + delay: [1200, 3000] - id: a4 step: buy-supplies @@ -200,8 +246,9 @@ actions: params: item: "current least-loss live candidate (default: rune javelin tips)" qty: "carried_batch = 1,000 (fits the 4h GE limit window of 10,000)" - max_price: "live low + 5%" - on_fail: retry # re-place at live low +5% with paced offers; 3 consecutive failures -> failed (recovery block) + max_price: "live low + 5 %" + note: "offer rests until filled or the run ends; on a partial fill, collect the filled portion (a6) and re-place the remainder at the current edge" + on_fail: retry anti_ban: delay: [1200, 3000] @@ -212,21 +259,45 @@ actions: params: item: "nature rune" qty: "carried_batch = 1,000 (4h GE limit 18,000)" - max_price: "live low + 5%" + max_price: "live low + 5 %" + note: "offer rests until filled or the run ends; partial fills handled like a4" on_fail: retry anti_ban: delay: [1200, 3000] - id: a6 + step: collect-purchases + verb: ge_collect + target: grand-exchange + params: + note: "collect every filled purchase and refund from the GE collection box into the inventory — staff, candidate, natures (and the equivalent on every restock). Partial offers: the collected portion is added to the ledger; nothing is left in the box at session start" + on_fail: retry + anti_ban: + delay: [600, 1400] + + - id: a7 + step: equip-staff + verb: menu_option + target: "staff of fire in inventory" + params: + option: "Wield" + note: "Equip requirement is NONE documented on the OSRS wiki Staff of fire page (no requirements row in the infobox, none in the prose; compare Battlestaff which states 'requires 30 Attack and 30 Magic'; verified 2026-08-28). FAIL-CLOSED path: bounded retries (3), then log ERROR + alert + stop — no fire-rune fallback is modeled (never loop on equip attempts)" + on_fail: retry + anti_ban: + delay: [600, 1800] + + - id: a8 step: build-loadout verb: bank_inventory target: bank params: deposit: [overflow products] - withdraw: "candidate 1,000 + nature runes 1,000 (= carried_batch; both stackable, two inventory slots)" + withdraw: "to carried_batch: candidate 1,000 + nature runes 1,000 (only the shortfall — collected purchases from a6 are already in the inventory; both stackable, two inventory slots)" on_fail: retry + anti_ban: + delay: [500, 1100] - - id: a7 + - id: a9 step: cast-alch verb: use_item_on target: "candidate item in inventory" @@ -237,24 +308,49 @@ actions: consumption: "1 candidate + 1 nature per cast (staff of fire default); pays 540 gp (lowalch) + 31 xp, net -3 gp" on_fail: retry anti_ban: - delay: [1600, 3400] # MANDATORY post-action sleep, ADDITIVE to the 1.8s cast (3 ticks x 0.6s; action-grammar.md:135): cycle = 1.8s + 1.6-3.4s = 3.4-5.2s, midpoint 4.3s -> realized ~791 casts/hr incl. restock+breaks (pinned in economy) + delay: [1600, 3400] # MANDATORY post-action sleep, ADDITIVE to the 1.8s cast (3 ticks x 0.6s; action-grammar.md:135): cycle = 1.8s + 1.6-3.4s = 3.4-5.2s, midpoint 4.3s -> session-realized ~742 casts/hr incl. startup + restock + breaks (pinned in economy) - - id: a8 - step: restock + - id: a10 + step: restock-deposit verb: bank_inventory target: bank params: deposit: [all coins, all products] - withdraw: "candidate + nature runes up to carried_batch (1,000/1,000)" + withdraw: "ALL candidate + nature runes currently in the bank, up to carried_batch (1,000/1,000) — the bank-stock FAST PATH applies only when the bank actually holds enough stock; the remaining deficit is bought at the GE (a11) and collected (a12)" on_fail: alert + anti_ban: + delay: [500, 1100] - - id: a9 + - id: a11 + step: restock-buy + verb: ge_buy + target: grand-exchange + params: + item: "current least-loss live candidate + nature runes" + qty: "deficit to carried_batch = carried_batch - inventory count after the a10 fast path (e.g. 901 candidate + 901 nature after a 901-cast batch with an empty bank)" + max_price: "live low + 5 %" + note: "the deficit is RE-BOUGHT at the GE on every restock — the entry never withdraws a batch that was never purchased; partial/failed fills use the same collect + re-place recovery as the initial acquisition" + on_fail: retry + anti_ban: + delay: [1200, 3000] + + - id: a12 + step: restock-collect + verb: ge_collect + target: grand-exchange + params: + note: "collect the re-bought deficit into the inventory — inventory returns to carried_batch 1,000/1,000 before casting resumes" + on_fail: retry + anti_ban: + delay: [600, 1400] + + - id: a13 step: take-break verb: take_break target: "current location" params: duration: "[45, 120] seconds of idle AFK per break (matches run_control.break.for)" - note: "executed by the translator when the completed-cast counter reaches run_control.break.every — this IS run_control.break's executor, fired on CAST COUNTS, not on bank visits; the cast counter is not reset by restocking" + note: "executed by the translator when the completed-cast counter reaches run_control.break.every — this IS run_control.break's executor, fired on CAST COUNTS, not on bank visits; the cast counter is NOT reset by restocking (breaks land at 550/1,100/1,650 in the midpoint example, independent of the 901-cast restock cadence)" on_fail: skip run_control: @@ -265,63 +361,85 @@ run_control: for: [45, 120] # seconds of idle AFK per break stop_conditions: - "magic level >= target (55 -> hand off to HLA)" - - "gp under floor (working capital below one carried_batch = 543,000 gp)" + - "session elapsed >= 2 h (session horizon — startup is amortised over this window in the rate model)" + - "total assets (cash + supplies at current buy cost) < 575,150 — cannot fund the next batch at max fill (570,150) plus staff replacement (5,000); assets, NOT raw cash: cash that became supplies is not a loss" + - "session net loss (total assets - initial capital) > 162,990 — the 6-batch worst-case loss reserve is exhausted" - "3 consecutive failed casts (client issue — do not loop)" - - "3 consecutive failed GE purchases with no fallback candidate available" + - "3 consecutive no-fill GE rounds (initial acquisition or restock) with no fallback candidate available" + - "staff of fire equip failed after bounded retries — FAIL CLOSED (log ERROR, alert, stop)" # ================= WORKED EXAMPLE (pinned, deterministic — owner guidance 2026-08-28) ================= # Constants: carried_batch = 1,000 candidate + 1,000 nature; restock_threshold = 100; - # break.every = [400, 700] casts (midpoint 550); break.for = [45, 120] s; - # default staff-of-fire path consumes 1 candidate + 1 nature per cast (worst case 1:1 — + # break.every = [400, 700] casts — the example pins the MIDPOINT 550; + # break.for = [45, 120] s; restock cadence = 901 casts (1,000 - 99); the + # staff-of-fire path consumes 1 candidate + 1 nature per cast (worst case 1:1 — # with Bryophyta's staff the nature side drains slower, so the candidate stays binding). + # The two counters are MONOTONIC and INDEPENDENT: breaks at 550, 1,100, 1,650, + # 2,200... (multiples of 550) and restocks at 901, 1,802, 2,703... (multiples of + # 901) — gcd(550, 901) = 1, so they interleave forever and restocking NEVER + # resets or shifts the break counter (validator regression: the old buggy + # 'restart the interval at the restock' example is rejected by the gate). # - # Step 0 — before the first inventory: account holds >= 543,000 gp working capital - # (1,000 x 403 + 1,000 x 140). At the GE bank: GE-buy staff of fire, Wield it - # (no documented requirement), GE-buy 1,000 rune javelin tips + 1,000 nature runes, - # withdraw both -> loadout = carried_batch 1,000/1,000. Cast counter := 0. - # Step 1 — casts #1..#550: each cast consumes 1 candidate + 1 nature (-543 gp) and pays - # 540 gp (lowalch) + 31 xp -> net -3 gp. Cast counter 0 -> 550 (~39 min at midpoint). - # Step 2 — FIRST SCHEDULED BREAK at cast 550 (midpoint of break.every [400, 700]): run - # take-break for 45-120 s. Resume casting at cast 551. The break fired on the CAST - # COUNT, not on any bank visit; the restock counter is untouched. - # Step 3 — casts #551..#901: countdown candidate 1000-901 = 99 < 100 (restock_threshold) - # and nature 1000-901 = 99 < 100 simultaneously (worst case 1:1) -> the transition - # fires at the end of cast #901: FIRST RESTOCK/BANK EVENT at cast 901. - # Coins deposited at this restock: 901 x 540 = 486,540 gp; batch net so far -2,703 gp; - # batch xp so far 901 x 31 = 27,931. - # Step 4 — restock: deposit coins + products, withdraw 901 candidate + 901 nature -> - # carried_batch restored to 1,000/1,000. Resume casting at cast 902 (cast counter - # continues; the break counter also continues — restocking never resets either). - # Step 5 — SECOND BREAK when the cast-count interval since break #1 completes - # ([400, 700], midpoint: cast 902 + 550 = 1,452): take-break, resume at 1,453. - # Step 6 — restock #2 fires at cast 1,802 (901-cast batch cadence), and so on, until a - # stop_condition fires (Magic >= 55 -> HLA handoff; gp under floor; 3 failed casts). - # Bank visits and breaks are INDEPENDENT by construction: restock cadence = 901 casts; - # break cadence = 400-700 casts, and the two counters do not interact. + # Step 0 — preparation (one-time startup, ~300-600 s): account holds >= ~1.31M gp + # cash (staff cap 5,000 + first batch max 570,150 + reserve 162,990 + float + # 570,150). At the GE bank: open GE (a2); place offers — staff (a3), 1,000 + # rune javelin tips (a4), 1,000 nature runes (a5); wait for fills + # (ge_offers_done) and collect everything (a6); equip the staff (a7); loadout + # = carried_batch 1,000/1,000 (a8). Cast counter := 0; cash ledger opened. + # Step 1 — casts #1..#550: each cast consumes 1 candidate + 1 nature (-543 gp) + # and pays 540 gp (lowalch) + 31 xp -> net -3 gp. Cast counter 0 -> 550 + # (~39 min at midpoint). + # Step 2 — FIRST SCHEDULED BREAK at cast 550 (the interval since cast 0): + # take-break 45-120 s (a13). Resume casting at cast 551. The break fired on + # the CAST COUNT, not on any bank visit. + # Step 3 — casts #551..#901: countdown candidate 1,000-901 = 99 < 100 + # (restock_threshold) and nature 99 < 100 simultaneously (worst case 1:1) -> + # the transition fires at the end of cast #901: FIRST RESTOCK at cast 901. + # Deposit 901 x 540 = 486,540 gp (a10); the bank holds 0 supplies (all sales + # were GE buys), so the fast path yields nothing -> open GE (a2), RE-BUY the + # deficit 901 candidate + 901 nature (a11, live low + 5 %), collect (a12) -> + # inventory back to 1,000/1,000. Batch net: -2,703 gp (live-low fills) or + # -27,165 gp (max fills). The cast counter (901) and break counter continue. + # Step 4 — SECOND BREAK at cast 1,100: the interval since break #1 is exactly + # 550 casts (1,100 - 550); the cast-901 restock did NOT reset or shift it. + # Step 5 — THIRD BREAK at cast 1,650 (1,100 + 550); SECOND RESTOCK at cast + # 1,802 (901-cadence, 1,802 = 901 x 2). The sequences 550/1,100/1,650/2,200 + # and 901/1,802/2,703 interleave independently. + # Step 6 — continue until a stop_condition fires: Magic >= 55 (HLA handoff), + # the 2 h session horizon, the capital stops (assets floor 575,150 or net + # loss > 162,990), 3 failed casts, or 3 consecutive no-fill GE rounds. # ============================================================================================ risk: ban_level: low notes: - - "High cast cadence is the main detection vector; keep the mandatory anti_ban delays (cadence pin: additive post-cast sleep [1.6, 3.4]s; realized ~791 casts/hr at the 4.3s midpoint cycle incl. restock + breaks; loop-only 837)." - - "Breaks are CAST-COUNT-based (every [400, 700] completed casts, 45-120s AFK) and independent of bank visits — never treat a restock trip as a break." - - "GE buy bursts: pace offers, respect the 4h limit window (10,000 javelin tips / 18,000 natures); thin items (limit < 100) cannot sustain a long run." + - "High cast cadence is the main detection vector; keep the mandatory anti_ban delays (cadence pin: additive post-cast sleep [1.6, 3.4] s; session-realized ~742 casts/hr midpoint incl. startup + restock + breaks over a 2 h session; steady-state ~791; loop-only 837 is a ceiling reference, never the output)." + - "Breaks are CAST-COUNT-based (every [400, 700] completed casts, 45-120 s AFK) and independent of bank visits — never treat a restock trip as a break, and never reset the break counter on restock (break/restock gcd(550, 901) = 1)." + - "GE buy bursts: pace offers, respect the 4h limit window (10,000 javelin tips / 18,000 natures); thin items (limit < 100) cannot sustain a long run; offers persist until filled or aborted and a 4h limit reset is NOT an offer expiry." - "Thin-item 'latest low' fills can be stale — confirm fill price with a live GE offer before committing a run; the liquid high-limit pair (rune javelin tips / rune arrow) is the dependable loss-minimizer." # --- recovery block (owner guidance 2026-08-28: every activity must cover its complete runnable lifecycle) --- # - Missing materials / depleted supplies: the restock_threshold transition (casting -> -# bank_supplies at candidate OR nature < 100) catches both mid-run depletions; restock -# action a8 rebuilds to carried_batch and the loop resumes (worked example steps 3-4). -# - Failed GE purchases (offer unfilled): re-place at live low + 5% with paced offers -# (a4/a5); after 3 consecutive failures, alert + stop (failed) unless a fallback -# candidate is switched in — never sit in an unfillable offer loop. -# - Staff of fire cannot be equipped (a3): fall back to buying 3 fire runes per cast -# (3 fire + 1 nature = 155 gp/cast rune cost vs 140; net -18/cast at the anchor), -# log WARN, continue; never loop on equip attempts. -# - Invalid loadout (wrong item in hand / spell unavailable): re-run build-loadout (a6); -# 3 consecutive failed casts -> failed (stop, log ERROR sentinel, alert). -# - Explicit completion/stop: stop_conditions above (Magic 55 HLA handoff, gp floor, -# repeated failures). +# bank_supplies at candidate OR nature < 100) catches both mid-run depletions; the +# restock phase (a10 -> a2 -> a11 -> a12) rebuilds to carried_batch and the loop +# resumes (worked example steps 3-4). The entry NEVER withdraws a batch that was +# never purchased — every restock re-buys the deficit at the GE. +# - GE offers: partial fills are collected (a6/a12) and the remainder is re-placed at +# the current edge (a3/a4/a5/a11); after 3 consecutive no-fill rounds (initial or +# restock) the run stops (failed) — never sit in an unfillable offer loop. Unfilled +# offers at session end are left resting by design (float reserve; coins return when +# they fill or the operator aborts them — the single operator-touch point). +# - Staff of fire cannot be equipped (a7): bounded retries (3), then FAIL CLOSED — +# log ERROR + alert + stop. No fire-rune fallback is modeled (it would need its own +# purchase/supply/rate path; the owner decision rejects a prose-only fallback). +# - Invalid loadout (wrong item in hand / spell unavailable): re-run build-loadout +# (a8); 3 consecutive failed casts -> failed (stop, log ERROR sentinel, alert). +# - Capital: the stop checks TOTAL ASSETS (cash + supplies at current buy cost), and +# both capital stops are assets-based (see stop_conditions) — cash converted into +# supplies is not a loss and never fires a stop by itself. +# - Explicit completion/stop: stop_conditions above (Magic 55 HLA handoff, 2 h session +# horizon, assets floor 575,150, loss reserve 162,990, repeated failures, fail-closed +# staff equip). sources: - "OSRS wiki — Low Level Alchemy (level 21, 31 xp/cast, 3-tick, 1 nature + 3 fire; spellbook Normal; infobox 2026-08-27)" @@ -332,12 +450,14 @@ sources: - "prices.runescape.wiki latest 2026-08-27, re-fetched at bounce fix (low = per-repo buy basis: rune javelin tips 403, rune arrow 45, nature rune 140, jade ring 303, opal amulet (u) 17)" - "OSRS wiki — Module:Exchange/Rune javelin tips (limit 10000, lowalch 540, highalch 810, members=true — matches mapping; re-verified 2026-08-27) + Module:Exchange/Nature rune, Staff of fire and all cited candidates (GE limits agree with mapping; verified 2026-08-27)" - "OSRS wiki — Rune javelin tips / Rune arrow / Bagged flower / Mystic mist staff etc. item pages (members = Yes for every cited catalog item; verified 2026-08-27)" + - "OSRS wiki — Grand Exchange (offers persist until filled or aborted; filled items and coin refunds are collected from the booth/collection box; partial fills are separately collectable) — verified 2026-08-28" + - "OSRS wiki — Grand Exchange/Buying limits (4-hour window; the limit resets 4 hours after the FIRST unit is bought; outstanding offers remain active and a limit reset is NOT an offer expiry) — verified 2026-08-28" - "OSRS wiki — Nature rune (members craft at level 44 Runecraft from pure essence, 9 xp; Nature Altar south-east of Tai Bwo Wannai)" - "OSRS wiki — Abyss (access to runic altars without talismans via the Mage of Zamorak)" - "OSRS wiki — Bryophyta's staff (level 30 Attack + Magic; up to 1,000 nature charges; 1/15 chance to not consume a charge on any nature-rune spell; alchemy combo with Tome of Fire)" - "OSRS wiki — Tome of Fire (members, level 50 Magic to wield; charged tome is an infinite fire-rune source and non-combat spells do not consume charges)" - "OSRS wiki — Staff of fire (page verified 2026-08-28 for the equip requirement: id 1387, F2P item, tradeable, options Wield — NO requirements row in the Infobox Item and NO requirement statement in the prose; contrast Battlestaff, whose prose states 'requires 30 Attack and 30 Magic to wield')" - - "docs/schema.md run_control (iteration unit; break.every counts iterations) + docs/action-grammar.md:135 (anti_ban.delay = additive post-action sleep) + verb take_break — the cadence + break + recovery model" + - "docs/schema.md run_control (iteration unit; break.every counts iterations) + docs/action-grammar.md:135 (anti_ban.delay = additive post-action sleep) + verbs ge_open/ge_buy/ge_collect/ge_offers_done (separate GE primitives, never assumed) — the cadence + break + GE + recovery model" verified: "2026-08-27" # keep quoted (YAML 1.1 date parsing); prices last re-fetched live 2026-08-27 related: diff --git a/tools/validate.py b/tools/validate.py index 7667c3d..0068a6f 100644 --- a/tools/validate.py +++ b/tools/validate.py @@ -41,6 +41,37 @@ def load_entries(): return sorted(out) +def alch_worked_example_regression(rel, data, raw_text): + """One-cast model worked-example regression (owner guidance 2026-08-28, + PR #8 repair): entries with the owner-selected one-cast iteration model + must pin a worked example with MONOTONIC, INDEPENDENT counters — breaks + every 550 casts (1,100, 1,650, ...) regardless of restocks, and restocks + every 901 casts (1,802, ...), so restocking never resets or shifts the + break counter. The old 'restart the interval at the restock' bug (break + #2 at cast 1,452 = 901 + restarted 549) must never reappear. Scoped to + entries that declare the one-cast model AND carry a worked example, so + unrelated entries are untouched.""" + ruco = data.get("run_control") or {} + if "one cast" not in str(ruco.get("iteration", "")): + return [] + if "worked example" not in raw_text.lower(): + return [] + errs = [] + if "1,452" in raw_text: + errs.append(f"{rel}: worked example resets the break interval at a restock " + f"(cast 1,452 = 901 + restarted interval) — breaks must stay " + f"monotonic at 550/1,100/1,650 independently of restocks") + for marker, label in (("550", "break #1 (cast 550)"), + ("901", "restock #1 (cast 901)"), + ("1,100", "break #2 (cast 1,100)"), + ("1,650", "break #3 (cast 1,650)"), + ("1,802", "restock #2 (cast 1,802)")): + if marker not in raw_text: + errs.append(f"{rel}: worked example missing monotonic counter pin " + f"{label} — breaks/restocks must be pinned literally") + return errs + + def main(): global STALE_DAYS if "--stale-days" in sys.argv: @@ -99,6 +130,10 @@ def main(): if term not in declared: errors.append(f"{rel}: terminal '{term}' not declared") + # one-cast worked-example regression (owner guidance 2026-08-28): + # monotonic break/restock counters, scoped to the one-cast model + errors += alch_worked_example_regression(rel, data, path.read_text()) + # action id/step uniqueness a_ids = [a["id"] for a in data["actions"]] a_steps = [a["step"] for a in data["actions"]] From 052c6984ac4eddabe489d9843abfac8499f8788c Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 29 Aug 2026 03:00:56 -0500 Subject: [PATCH 7/7] =?UTF-8?q?codex:=20low-alch-members=20=E2=80=94=20los?= =?UTF-8?q?s-reserve=20stop=20direction=20+=20fill-price=20scenario=20GP?= =?UTF-8?q?=20bounds=20(bounce-fix=20attempt=205)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner guidance 2026-08-29 for governor review 10361 (PR #8), finding by finding: 1. Loss-reserve stop direction — the stop read 'session net loss (total assets - initial capital) > 162,990'; a loss makes that LHS negative so it could never exceed the positive reserve (the stop could never fire). Now expressed everywhere as 'initial capital - total assets > 162,990' (stop_conditions, worked-example step 6, recovery block, version pin): a loss makes the difference positive, the strict-greater comparison fires on losses and never on profits, and exactly-at-boundary does not fire. tools/validate.py gains alch_accounting_regression(): comparator boundary fixtures (below 162,989 / at 162,990 / above 162,991 / profit side +50,000 / breakeven) plus entry-text pins rejecting the reversed form anywhere in the file. 2. Fill-price scenarios for realized GP bounds — previously gp_per_hour_low /high derived only from the live-low -3.00/cast margin while the buy policy permits live low + 5% (candidate 423.15 + nature 147 = 570.15 vs 540 lowalch = -30.15/cast). The economy block now declares FILL-PRICE SCENARIOS A (live-low 543 -> -3.00/cast) and B (max allowed +5% 570.15 -> -30.15/cast) as the single ledger behind capital, batch economics AND the GP bounds: gp_per_hour_low -29,463 (scenario B x session-fast 977.2), gp_per_hour_high -1,758 (scenario A x session-slow 585.9), midpoints -22,365 / -2,225 pinned; validator enforces the exact bound values and the -30.15/570.15/423.15 scenario pins. Preserved: complete GE acquisition/restock flow, one-cast iteration, monotonic break/restock counters, total-assets accounting (floor 575,150), fail-closed staff path, and the earlier fixed pacing/equip findings. version 5 -> 6, updated 2026-08-29. Gate: python3 tools/validate.py -> 2 entries, 0 errors, 1 pre-existing F2P WARN (low-alch-f2p researched, untouched); git diff --check clean; regression negative-tested (old gp pins, reversed form, missing scenario pins all rejected). --- codex/economy/low-alch-members.yaml | 46 +++++++++++++----- tools/validate.py | 75 +++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 11 deletions(-) diff --git a/codex/economy/low-alch-members.yaml b/codex/economy/low-alch-members.yaml index cc3b7c7..261f77d 100644 --- a/codex/economy/low-alch-members.yaml +++ b/codex/economy/low-alch-members.yaml @@ -3,8 +3,8 @@ title: Low-Level Alchemy (Members) domain: economy tags: [alching, magic-training, members, loss-training] status: verified -version: 5 # 5: bounce-fix 4 2026-08-28 (owner guidance 10325) — complete GE acquisition path (open -> place -> fill -> collect) for initial buy AND every restock (bank-stock fast path only when the bank holds stock); fail-closed staff equip (bounded retries, no fire-rune fallback); capital model (cash vs supplies, staff cost, max-fill worst case, 6-batch loss reserve, float); monotonic break/restock counters (breaks 550/1,100/1,650 independent of restocks 901/1,802) + validator regression; startup-vs-steady-state rates over a 2 h session horizon -updated: "2026-08-28" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date +version: 6 # 6: bounce-fix 5 2026-08-29 (owner guidance for governor 10361) — loss-reserve stop fixed to 'initial capital - total assets > 162,990' everywhere + validator boundary fixtures (below/at/above/profit) + realized GP/hr bounds derived from declared fill-price scenarios (A live-low -3.00/cast, B max allowed +5% -30.15/cast): gp low -29,463 / high -1,758. # 5: bounce-fix 4 2026-08-28 (owner guidance 10325) — complete GE acquisition path (open -> place -> fill -> collect) for initial buy AND every restock (bank-stock fast path only when the bank holds stock); fail-closed staff equip (bounded retries, no fire-rune fallback); capital model (cash vs supplies, staff cost, max-fill worst case, 6-batch loss reserve, float); monotonic break/restock counters (breaks 550/1,100/1,650 independent of restocks 901/1,802) + validator regression; startup-vs-steady-state rates over a 2 h session horizon +updated: "2026-08-29" # ISO dates must stay quoted — YAML 1.1 parses bare dates to datetime.date summary: > Magic training from level 21 by low-alching members items with the lowest @@ -13,7 +13,10 @@ summary: > (mapping lowalch != null, members=true, live GE prices 2026-08-27). At current prices the method burns a small amount of GP per cast for 31 XP — run it for XP, not GP. Least-loss liquid anchor at last check: rune - javelin tips (-3/cast). Model pins (owner guidance 2026-08-28): one + javelin tips (live-low net -3/cast; realized loss band -1,758 to -29,463 + gp/hr across the declared live-low and max-allowed +5% fill scenarios — + XP is fill-independent at 23,000/hr session-realized midpoint). Model + pins (owner guidance 2026-08-28): one iteration = one cast; breaks every 400-700 COMPLETED CASTS (cast-count based, independent of bank visits — midpoint example: 550, 1,100, 1,650, ...); restock when candidate or nature drops below the numeric @@ -68,8 +71,8 @@ economy: cost_per_cycle: 543 # javelin tips buy 403 + nature rune 140 (staff of fire, live low 2026-08-27) income_per_cycle: 540 # lowalch of rune javelin tips (40% of value 1350) net_per_cycle: -3 - gp_per_hour_low: -2930 # session-realized fast bound: 977.2 casts/hr x -3 = -2,932 (3.4 s cycle, 300 s startup, 2 h horizon) - gp_per_hour_high: -1760 # session-realized slow bound: 585.9 casts/hr x -3 = -1,758 (5.2 s cycle, 600 s startup, 2 h horizon) + gp_per_hour_low: -29463 # WORST-CASE realized: max-allowed fill scenario B (-30.15/cast) x session-fast 977.2 casts/hr = -29,462.6 (3.4 s cycle, 300 s startup, 2 h horizon) — see FILL-PRICE SCENARIOS below + gp_per_hour_high: -1758 # BEST-CASE realized: live-low fill scenario A (-3.00/cast) x session-slow 585.9 casts/hr = -1,757.7 (5.2 s cycle, 600 s startup, 2 h horizon) — see FILL-PRICE SCENARIOS below xp_per_hour: 23000 # session-realized midpoint: 741.8 casts/hr x 31 = 22,995 (pin 23,000) # ---- rate model (pinned; owner guidance 2026-08-28) ---- # LOOP (idealised, zero overhead — ceiling reference ONLY, never the @@ -87,14 +90,30 @@ economy: # SESSION-REALIZED (2 h horizon = 7,200 s; one-time startup 300-600 s, # mid 450 s -> 450/7200 = 6.25 %): realized = steady-state x (1 - # startup/session): fast 977.2, mid 741.8, slow 585.9 casts/hr. - # xp mid = 741.8 x 31 = 22,995 -> pin 23,000; gp = casts/hr x -3: - # low -2,932 (fast), high -1,758 (slow), mid -2,225. + # xp mid = 741.8 x 31 = 22,995 -> pin 23,000. REALIZED GP/hr derives from + # the FILL-PRICE SCENARIOS below (the SAME ledger as the batch economics): + # worst = -29,463 = scenario B x session-fast 977.2 (-30.15 x 977.2 = -29,462.6) + # best = -1,758 = scenario A x session-slow 585.9 (-3.00 x 585.9 = -1,757.7) + # midpoints: scenario A x 741.8 = -2,225; scenario B x 741.8 = -22,365. # BATCH ECONOMICS (901 casts; deposits 901 x 540 = 486,540 gp per batch): # input cost at live low: 901 x 543 = 489,243 -> net -2,703/batch # input cost at MAX fill (live low + 5 %): 901 x 570.15 = 513,705 -> net # -27,165/batch (worst case). Reserve = 6 worst-case batches (Magic # 21 -> 55 = ~5,300 casts = ~6 batches) = 162,990 gp; the capital stop # checks TOTAL ASSETS, not raw cash (see accounts + stop_conditions). + # FILL-PRICE SCENARIOS (one ledger for capital, batch economics, AND the + # realized GP bounds — every number below comes from the same scenario): + # A live-low fill: candidate 403 + nature 140 = 543/cast vs + # 540 lowalch -> net -3.00/cast (the anchor) + # B max allowed fill (+5%): candidate 403x1.05 = 423.15 + nature + # 140x1.05 = 147 -> 570.15/cast vs 540 lowalch + # -> net -30.15/cast (the executable buy policy + # permits live low + 5%; this scenario, not the + # -3 live-low margin, bounds the downside) + # gp_per_hour_low = -29,463 | gp_per_hour_high = -1,758 derive from these + # scenarios at the session rates above; the batch ledger uses the same + # 543 / 570.15 per-cast costs (901-cast batch: -2,703 live-low, -27,165 + # max fill), so capital accounting and GP bounds can never diverge. supplies: - item: rune javelin tips qty_per_cycle: 1 @@ -363,7 +382,7 @@ run_control: - "magic level >= target (55 -> hand off to HLA)" - "session elapsed >= 2 h (session horizon — startup is amortised over this window in the rate model)" - "total assets (cash + supplies at current buy cost) < 575,150 — cannot fund the next batch at max fill (570,150) plus staff replacement (5,000); assets, NOT raw cash: cash that became supplies is not a loss" - - "session net loss (total assets - initial capital) > 162,990 — the 6-batch worst-case loss reserve is exhausted" + - "session net loss: initial capital - total assets > 162,990 — a loss makes 'initial capital - total assets' POSITIVE, so this strict-greater comparison fires on losses and never on profits; 162,990 = the 6-batch worst-case reserve (exactly AT the boundary it does NOT fire — strict >)" - "3 consecutive failed casts (client issue — do not loop)" - "3 consecutive no-fill GE rounds (initial acquisition or restock) with no fallback candidate available" - "staff of fire equip failed after bounded retries — FAIL CLOSED (log ERROR, alert, stop)" @@ -406,8 +425,9 @@ run_control: # 1,802 (901-cadence, 1,802 = 901 x 2). The sequences 550/1,100/1,650/2,200 # and 901/1,802/2,703 interleave independently. # Step 6 — continue until a stop_condition fires: Magic >= 55 (HLA handoff), - # the 2 h session horizon, the capital stops (assets floor 575,150 or net - # loss > 162,990), 3 failed casts, or 3 consecutive no-fill GE rounds. + # the 2 h session horizon, the capital stops (assets floor 575,150, or + # loss = initial capital - total assets > 162,990), 3 failed casts, or 3 + # consecutive no-fill GE rounds. # ============================================================================================ risk: @@ -436,7 +456,11 @@ risk: # (a8); 3 consecutive failed casts -> failed (stop, log ERROR sentinel, alert). # - Capital: the stop checks TOTAL ASSETS (cash + supplies at current buy cost), and # both capital stops are assets-based (see stop_conditions) — cash converted into -# supplies is not a loss and never fires a stop by itself. +# supplies is not a loss and never fires a stop by itself. Loss direction is pinned +# everywhere as 'initial capital - total assets > 162,990': a loss makes that +# difference positive, so the stop fires on losses and never on profits (the +# reversed sign form can never exceed the threshold on a loss and is rejected by +# the validator regression; boundary fixtures: below/at/above + profit side). # - Explicit completion/stop: stop_conditions above (Magic 55 HLA handoff, 2 h session # horizon, assets floor 575,150, loss reserve 162,990, repeated failures, fail-closed # staff equip). diff --git a/tools/validate.py b/tools/validate.py index 0068a6f..d5b74e3 100644 --- a/tools/validate.py +++ b/tools/validate.py @@ -72,6 +72,77 @@ def alch_worked_example_regression(rel, data, raw_text): return errs +def _loss_reserve_stop(initial_capital, total_assets, reserve): + """Loss-reserve stop comparator in the pinned direction (owner guidance + 2026-08-29, governor review 10361, PR #8): stop fires only when the + loss EXCEEDS the reserve, i.e. when (initial capital - total assets) + > reserve. A loss makes the LHS positive; a profit (total assets > + initial capital) makes it negative and can never fire this stop. The + reversed 'total assets - initial capital' form is invalid because it + is negative exactly when a loss exists.""" + return (initial_capital - total_assets) > reserve + + +def alch_accounting_regression(rel, data, raw_text): + """Loss-reserve + fill-price accounting regression (owner guidance + 2026-08-29 for governor review 10361, PR #8): the low-alch-members + entry must express the loss-reserve stop in the correct direction + EVERYWHERE ('initial capital - total assets > 162,990'), the reversed + sign form must never reappear, and the realized GP/hour bounds must be + derived from the declared fill-price scenarios (A live-low -3.00/cast + vs B max allowed +5% fill -30.15/cast), exposing the +5% fill loss + instead of recycling the live-low margin. Includes below/at/above + boundary fixtures and a profit-side negative regression for the + comparator itself. Scoped to the members low-alchemy entry only.""" + if data.get("id") != "low-alch-members": + return [] + errs = [] + + # 1. comparator boundary fixtures (pure function, entry's own constants) + INIT, RESERVE = 1_308_290, 162_990 # entry capital / 6-batch reserve + fixtures = [ + ("below (loss 162,989)", INIT - 162_989, False), + ("at boundary (loss 162,990, strict >)", INIT - 162_990, False), + ("above (loss 162,991)", INIT - 162_991, True), + ("profit side (assets 50,000 above initial)", INIT + 50_000, False), + ("breakeven (assets == initial)", INIT, False), + ] + for label, total_assets, expect in fixtures: + got = _loss_reserve_stop(INIT, total_assets, RESERVE) + if got != expect: + errs.append(f"{rel}: loss-reserve comparator fixture '{label}' " + f"returned {got}, expected {expect}") + + # 2. entry direction: correct form present, reversed form absent + if "initial capital - total assets > 162,990" not in raw_text: + errs.append(f"{rel}: loss-reserve stop must be expressed as " + f"'initial capital - total assets > 162,990' everywhere") + if "total assets - initial capital" in raw_text: + errs.append(f"{rel}: loss-reserve stop uses the reversed sign form — " + f"on a loss it is negative and can never exceed the " + f"reserve; use 'initial capital - total assets > 162,990'") + + # 3. realized GP bounds must come from the fill-price scenarios + eco = data.get("economy", {}) + if eco.get("gp_per_hour_low") != -29463: + errs.append(f"{rel}: gp_per_hour_low must be -29,463 (max-fill " + f"scenario B -30.15/cast x session-fast 977.2 casts/hr " + f"= -29,462.6), got {eco.get('gp_per_hour_low')}") + if eco.get("gp_per_hour_high") != -1758: + errs.append(f"{rel}: gp_per_hour_high must be -1,758 (live-low " + f"scenario A -3.00/cast x session-slow 585.9 casts/hr " + f"= -1,757.7), got {eco.get('gp_per_hour_high')}") + for pin, label in (("-30.15", "max-fill per-cast loss -30.15"), + ("570.15", "max-fill per-cast cost 570.15"), + ("423.15", "max-fill candidate price 423.15")): + if pin not in raw_text: + errs.append(f"{rel}: economy FILL-PRICE SCENARIOS missing {label} " + f"({pin}) — the +5% accepted-fill scenario must be " + f"declared so the realized GP bounds cannot silently " + f"revert to the live-low-only margin") + return errs + + def main(): global STALE_DAYS if "--stale-days" in sys.argv: @@ -134,6 +205,10 @@ def main(): # monotonic break/restock counters, scoped to the one-cast model errors += alch_worked_example_regression(rel, data, path.read_text()) + # loss-reserve direction + fill-price GP bound regression (owner + # guidance 2026-08-29 for governor 10361), scoped to low-alch-members + errors += alch_accounting_regression(rel, data, path.read_text()) + # action id/step uniqueness a_ids = [a["id"] for a in data["actions"]] a_steps = [a["step"] for a in data["actions"]]