dashboard: say where each bot came from, and unblock the research budgets - #175
Merged
50thycal merged 1 commit intoAug 9, 2026
Conversation
…gets Two operator-visibility gaps, found by trying to read the live roster. 1. Lineage was unreadable. The row showed `Name · Surname · G1 · CODE` and nothing else, so four materially different things looked identical: an original founder running for weeks, a survivor carried over from the previous generation, a clone of last generation's winner, and a bot born minutes ago. All six live bots read "G1", which looks like reproduction is broken — and it was (children=0 at the last boundary, reported separately), but the roster could not show that either way. `origin` alone does not resolve it: grow_to_target creates its agents as origin='wildcard' too, so an operator-driven fleet expansion is indistinguishable from the scheduled diversity slot. The birth slot_key does separate them (`wildcard:N` vs `growth:<cohort>:N`), so _lineage reads that. Each row now carries a plain-language label — "founder — original fleet", "child of Leif Blackwood · inherits the Blackwood line", "wildcard — fresh line, no parent", "new — added to grow the fleet" — plus a `new` badge for a bot born into the current generation. 2. The research ceilings were not settable without a deploy. EVO_WEEKLY_SANDBOX_RUNS, EVO_WEEKLY_DATA_READS and EVO_WEEKLY_MARKET_SCANS are now on the ops env allowlist (EVO_MAX_GROWTH_PER_BOUNDARY too). These bound how much EVIDENCE an agent can gather, and unlike the LLM budgets they cost CPU against our own DB rather than dollars. They need to be live-settable because exhausting them is invisible from outside: the fleet's backtest counters simply stop moving and read as "the agents lost interest" when they are in fact blocked. Observed: all three agents pinned at sandbox_runs 50/50 for days while one filed a ticket saying its evidence base had been invalidated by a fix we shipped and it had no budget left to rebuild it. ensure_budgets already tops up in-cohort agents on a raise, so this reaches the running cohort. Full evo+dashboard suites green, ruff clean. Each new test was written first. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ChuFsLsUSANNzhC42fp4hW
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two operator-visibility gaps, both found by trying to read the live roster and failing.
1. You can't tell what kind of bot you're looking at
The row showed
Name · Surname · G1 · CODEand nothing else, so four materially different things were indistinguishable:All six live bots read "G1", which looks like reproduction is broken. It was (
children: 0at the last boundary — see below), but the roster couldn't show that either way.originalone doesn't resolve it either:grow_to_targetcreates its agents asorigin='wildcard', so an operator-driven fleet expansion is indistinguishable from the scheduled diversity slot. The birthslot_keydoes separate them (wildcard:Nvsgrowth:<cohort>:N), so_lineagereads that.Each row now carries a plain-language label:
founder — original fleetchild of Leif Blackwood · inherits the Blackwood linewildcard — fresh line, no parentnew — added to grow the fleetPlus a
newbadge when the bot was born into the current generation.2. The research ceilings weren't settable without a deploy
EVO_WEEKLY_SANDBOX_RUNS,EVO_WEEKLY_DATA_READS,EVO_WEEKLY_MARKET_SCANS(andEVO_MAX_GROWTH_PER_BOUNDARY) added to the ops env allowlist.These bound how much evidence an agent can gather, and unlike the LLM budgets they cost CPU against our own DB rather than dollars. They need to be live-settable because exhausting them is invisible from outside — the fleet's backtest counters just stop moving and read as "the agents lost interest" when they're actually blocked.
Observed: all three agents pinned at
sandbox_runs50/50 for days while one filed a ticket saying its evidence base had been invalidated by a fix we shipped and it had no budget left to rebuild it.ensure_budgetsalready tops up in-cohort agents on a raise, so this reaches the running cohort rather than waiting for the next one.Related finding, not fixed here
The 00:06Z boundary produced
children: 0. At a 3-agent fleettop_fraction=0.30gives exactly one reproduction slot, and the wildcard logic displaces it (skipped_parent = parents[-1]removes the only parent). So the winner did not reproduce at all — the wildcard replaced its child rather than adding to it. Self-corrects at 6 agents (2 top slots), but the small-fleet behaviour looks wrong and is worth a separate decision.Verification
Full evo + dashboard suites green,
ruff checkclean. 6 new tests, written first.🤖 Generated with Claude Code
https://claude.ai/code/session_01ChuFsLsUSANNzhC42fp4hW
Generated by Claude Code