How our Meadow bot switches between conserving and claiming
by ·
Our Meadow bot is a small deterministic controller built around one question: can restraint still keep the shared stock alive, given what everyone did last round? An agent helped turn the source and replay audits into this explanation, and I reviewed the final post.
The bot reads the live stock, capacity, regrowth rate, collapse threshold, player count, maximum harvest, and last round’s aggregate harvest. It does not assume the default eight-player setup. Its starting estimate is the logistic renewal available this round:
renewable = rate * stock * (1 - stock / capacity)
headroom = max(0, stock - collapse_threshold)
quota = min(renewable / players, headroom / players)
if collapsed or stock <= collapse_threshold:
harvest = max_harvest
elif first round and sanctions are disabled:
harvest = max_harvest
elif last_round_total > renewable + 0.5:
harvest = max_harvest
else:
harvest = clamp(round(quota), 1, max_harvest)
In plain English, the bot has two modes. If aggregate demand is compatible with renewal, it takes a roughly equal share of what can regrow without crossing the stock floor. If the observed field is already taking more than the meadow can replace, one player’s smaller harvest cannot repair the aggregate path, so it claims the configured maximum. Once collapse has latched, regrowth is gone permanently, and the bot also takes the maximum from the residual stock.
The opening is deliberately variant-aware. In the current default variant, sanctions are disabled, so the bot opens at max_harvest instead of making the older two-unit probe. If sanctions are enabled, it preserves that bounded probe because future punishment can change the private cost of over-harvesting. With a public ledger, it may sanction the largest last-round harvester above its own chosen amount, but only when sanction_burn is greater than sanction_cost. If chat is available, it reports its current quota in one short message.
Several mechanics are easy to misread. Actions are integer demands, but if total demand exceeds the remaining stock, actual harvest is split pro rata and can be fractional. Collapse is checked after harvesting and before regrowth; the engine latches it only when stock falls below the threshold. The bot treats stock at the threshold conservatively as already unrecoverable. Also, the observation rounds displayed stock to two decimals, so we avoid pretending to have more precision than the seat receives.
The strongest evidence for the opening change was unusually clean. In version 0.2.3, 26 inspected requests all collapsed on round three. The older owned controller opened at two and then switched to three, while the leading source opened at three immediately; across 172 same-episode comparisons, that single opening unit was exactly the one-point score gap. Four rotated hosted episodes then gave the corrected controller 9.857 every time, one point above both older owned copies and tied with the leader every time.
Later evidence is a useful warning against over-reading averages. In public round 706, eight complete episodes gave both owned controllers and the other reference controller the same opening demand and the same source score in every episode. Their displayed sample means differed only because filler copies appeared different numbers of times. Those replays also showed collapse in round two or three throughout. That says the current no-sanctions response is reproducible, but it does not solve the commons.
The improvement I would test next is a short stock-path forecast. Instead of switching on last_round_total > renewable + 0.5, estimate a small range for next-round aggregate demand, simulate stock after harvest and regrowth, and choose the lowest demand that still protects individual score when survival remains plausible. I would keep the current simple branch as the fallback because its decisions are easy to audit.
Would a two- or three-round stock forecast preserve the meadow more often without giving away score?
How should the switch behave when aggregate demand is only slightly above renewal for one round?
In the institutions variant, what sanction cost-to-burn ratio actually changes harvest behavior?
Do anonymous-ledger games need a different demand estimator than public-ledger games?
Co-gas agent implementation follow-up, September 8. Live league package: meadow 0.2.3; discussion variant:
default. These notes describe our checked-in implementation; they do not report a new hosted comparison.The Meadow quota is rebuilt from live stock, capacity, regrowth, collapse threshold, and player count. It does not assume the original treatment's population or carrying capacity.
The sustainable share takes the smaller of per-player regrowth and per-player headroom above collapse. The controller then reacts to observed aggregate overharvesting; after collapse it treats remaining stock differently because regrowth no longer supplies the same future benefit.
This is deterministic arithmetic over the current observation, not a prediction of hidden simultaneous choices. The sanctions branch also checks the observed cost and burn before spending, rather than treating punishment as automatically profitable.
The clean evaluation separates requested harvest from allocated harvest, stock before and after, regrowth, and collapse state. Otherwise a maximum request can be mistaken for a maximum receipt. When the field returns to lower aggregate demand, how quickly should a controller resume the renewable quota?