github elophanto/EloPhanto v2026.05.31.3
v2026.05.31.3 — mind visibility + arbiter starvation fix + strategy registry awareness

latest release: v2026.06.20
2 months ago

Substantive patch on top of v2026.05.31.2 — seven coordinated fixes around the autonomous mind's visibility and decision-making.

Dashboard: see what the mind is actually doing

Three layered improvements turn the TUI's empty whitespace into a real narrative:

  • Chat-shaped mind feed in the center area. Each tool call renders as a verb-first line (Wrote …/research/brief.md, Searched memory for: recent X reply lessons, Switched to role sales) with the artifact preview quoted underneath — first paragraph or headline of whatever the agent wrote. Operators can see BOTH process and outcome without leaving the dashboard.

  • Cycle banner shows intent. Was: mind cycle #6 — waking to think. Now: cycle #6 · advancing goal with the action_spec the arbiter ranked top: "Map X conversation landscape — checkpoint 2/12 of 'Make X the primary brand-voice proving ground…'". Verb-first source labels (advancing goal, switching role, building capability, productizing company, etc.) so the operator parses at a glance.

  • Sidebar hydrates immediately. The MIND panel used to read ? unknown for the first 4 minutes after restart even when autonomous mode was on. Now hydrates from the connect-time dashboard snapshot AND from a new MIND_RESUMED broadcast on start — covers both auto-start and runtime enable paths.

Arbiter: stop role-rotation starvation

Production log review showed 9.5h of autonomous mode producing zero artifacts — every cycle picked "switch to SUPPORT role" (meta-action) over real work like "build the missing tool that unblocks 10 strategy tactics." Two compounding bugs in from_role_neglect:

  • expected_value=4.5 treated a pure role-switch as real work. Dropped to 2.5 — role rotation stays in the menu but below candidates with concrete output.
  • kpi_gap=1.0 for never-activated roles inflated their score by +4. Actuals were 0 because the role hadn't RUN, not because it was failing targets. Pinned to 0 for never-active roles; gap becomes meaningful only after the role accumulates real ledger data.

Net effect: never-active SUPPORT scores ~3.97 (was 9.71). Real work (buildable_blocker ~7.4, unproductized_company ~8.3) wins.

Bonus: file_write + file_read added to the role-gate exemption — every role needs to write its own scratchpad.

Strategy: stop hallucinating tool names

The autonomous mind kept trying to self_create_plugin(goal='build x_post_and_reply') when twitter_post + twitter_reply already shipped. Root cause: the strategy LLM (company_plan) was called with NO awareness of the live tool registry — the prompt literally said "list tool_requirements; for each, propose self_create_plugin." So it invented capability names that "sounded right."

Two-layer fix:

  • Registry injection into the strategy prompt. CompanyPlanTool now passes the live [(name, description), ...] list to build_system_prompt, which renders a "TOOLS ALREADY AVAILABLE (use these EXACT names)" block. Instruction tightened: "ONLY list tools NOT in the registry. Use snake_case matching the registry's naming convention (twitter_post not x_post_and_reply)."

  • Alias map for legacy blockers (core/strategy._TOOL_ALIASES). Pre-existing blockers.yaml files already contain hallucinated names. auto_resolve_blockers now consults an alias map after exact-match miss — a blocker requiring x_post_and_reply resolves when BOTH twitter_post AND twitter_reply are registered.

ABE: skip the agent's own meta-company

The mind picked "Company elophanto-self is productized but has no active strategy" as cycle #1's top candidate, beating the real ABE (alphascala) with 22 actual blockers. elophanto-self is the agent's identity row, not a business to autonomously drive. New _is_self_company() helper in core/mind_candidates.py skips it in all 5 ABE-work generators (from_unproductized_companies, from_voiceless_companies, from_unplanned_companies, from_blocked_strategy_days, from_buildable_blockers).

Upgrading

./update.sh
./start.sh --web      # restart so all the dashboard hydration + arbiter changes take effect

After restart:

  • MIND sidebar shows running from the first frame (not after 4 min)
  • Cycle banner shows cycle #N · <intent> with the arbiter's top action_spec
  • Tool calls show Wrote …/path.md + the file's first paragraph quoted
  • Mind stops picking SUPPORT role-switches over real work
  • elophanto-self never appears in ABE-work candidates
  • New company_plan runs (re-run for existing companies if you want fresh strategies) won't hallucinate tool names
  • Existing x_post_and_reply-style blockers auto-resolve on the next sweep

Everything in v2026.05.31 + v2026.05.31.1 + v2026.05.31.2 is included.

Full diff: v2026.05.31.2...v2026.05.31.3

Don't miss a new EloPhanto release

NewReleases is sending notifications on new releases.