github elophanto/EloPhanto v2026.05.18
v2026.05.18 — Name your agent. Dream phase v2. Setup that finishes the job.

latest releases: v2026.08.11, v2026.08.07, v2026.06.20...
3 months ago

Headline: name your agent

EloPhanto was hardcoded everywhere. As of this release, every install picks its own name at first setup — Riley, AlphaScala, your fan's name — and the name propagates end-to-end:

  • Setup wizard asks for it first (default EloPhanto, any string works)
  • Workspace defaults to ~/agents/<name>/workspace
  • Email signs as <name> Agent, hub registers as <name>
  • LLM system prompt <agent_identity> block is templated with the chosen name
  • First-awakening LLM prompt is templated so the LLM doesn't return display_name="EloPhanto" regardless of config
  • Identity DB row auto-reconciles to config.agent_name on every startup
  • The four self-narrative files (knowledge/self/{nature,ego,affect}.md, knowledge/system/identity.md) are swept on startup — EloPhanto → configured name — and re-indexed so knowledge_search returns the corrected text
  • Dashboard top bar, chat persona, digest greeting all read the configured name

Renames take effect on next agent start, no reinstall required. The codebase stays "EloPhanto" everywhere it refers to the project itself (creator, self-dev paths, kid-agent block) — only the agent's name is operator-controlled. Peers, not personas — still one entity per install.

Dream phase v2

The autonomous mind's dream phase was converging on the same class of goals every cycle. Three structural fixes:

  • Amnesia killed. New core/dream_journal.py persists every dream's full candidate list + recommendation. The next cycle sees a PREVIOUSLY PROPOSED block listing the last 10 dreams' candidates with chosen-vs-not-pursued markers.
  • Skill + environment context. The dream tool walks skills/<name>/SKILL.md frontmatter for installed-skills context, pulls affect summary + recent ego self-perception + goals-in-planning as a live ENVIRONMENT block. Dreams react to lived state instead of stateless identity.
  • Seven value lenses, rotated by day. The hard-coded revenue framing is gone. The mind rotates through compounding / capability / research / relational / creation / identity / infrastructure via _dream_focus_for_today() (day-of-year mod 7). Mind prompt passes focus='<lens>' explicitly so the LLM cannot fall back to "balanced".
  • Pre-persist dedup. Candidates are embedded alongside existing goals (active + planning + last 30 completed) in one batch call. Near-duplicates (cosine ≥ 0.85) get dropped before they hit the journal.

Goal-lifecycle hardening

  • Goal-completion → instant wakeup hook. GoalManager.add_completion_hook() lets the autonomous mind subscribe; finishing a goal collapses _next_wakeup_sec to ≤5s and sets the wakeup event. Dream cycles fire seconds after goal completion, not hours.
  • Mechanical FORCE-DREAM gate. _count_workable_goals() returns combined active+planning count; when zero, _build_prompt() prepends a hard [FORCE-DREAM] directive to the state snapshot — the LLM cannot wander off into email or file reads.
  • Planning-stuck retry. Goals stuck in status='planning' with zero checkpoints for >30 min get auto-retried via decompose(). After 2 retries: cancel, so a poisoned [GOAL-PLANNING] doesn't block dream forever.
  • goal_checkpoints UNIQUE-constraint fix. Parser now ignores LLM-emitted order and renumbers sequentially; revise_plan queries MAX(checkpoint_order) WHERE status='completed' and continues past it. Production-observed crash fixed.

Workspace auto-indexing + skill promotion

  • file_write auto-indexes workspace markdown through KnowledgeIndexer.index_file() when the path is .md inside the configured workspace. Agent-produced deliverables become knowledge_search-retrievable next session instead of scattering into orphaned files.
  • New skill_promote tool — distils 2-30 related lesson markdowns from knowledge/learned/lessons/ into one named skills/<slug>/SKILL.md. System prompt explicitly distinguishes "skill (playbook for next time)" from "lesson digest (story of last time)". Refuses to overwrite existing skills, refuses malformed output. MODERATE permission.

Setup that finishes the job

After running ./setup.sh && ./start.sh on a fresh macOS install, the doctor should show no actionable warnings:

  • Codex is the headline routing path everywhere when a ChatGPT subscription is detected. codex/gpt-5.5 covers planning, coding, analysis, simple AND vision (browser screenshots) — no per-call API spend. Wizard prints a green callout so new users understand the subscription covers it all.
  • Auto-install Node.js + ffmpeg via brew on macOS when missing. Falls back to printing the manual command on Linux/Windows.
  • Ed25519 agent identity is generated proactively at end of setup. Closes the doctor's "no key yet" warning.
  • Vault initialisation prompt at end of setup — opt-in, explains the trade-off.
  • Workspace path prompt in the wizard (default ~/agents/<name>/workspace, creates the dir).
  • Container runtime + Tailscale doctor checks now skip when the relevant feature (kids.enabled / peers.enabled) is disabled in config — no warnings about features the operator hasn't opted into.
  • start.sh prepends ~/.local/bin to PATH so uv is discoverable after a fresh shell.
  • Stale google/gemini-2.0-flash-001 defaults purged from core/config.py, core/browser_manager.py, demo config, docs. Modern replacements: codex/gpt-5.5 (default when Codex enabled), openrouter/x-ai/grok-4.3, google/gemini-3.1-flash-lite.

Dashboard polish

  • Light theme forced (App.dark = False) so the cream backgrounds get near-black foreground regardless of terminal default-color synthesis. Plus explicit color: #1c1a16 on Screen / sidebar / chat / events as belt-and-suspenders.
  • GOALS panel two-line layout — title on its own line at near-full 22-char budget, bar + tail indented below. Cap at top 2 visible with +N more footer. Long titles get ellipsis-truncation.
  • Gateway GOALS filter — was unfiltered list_goals(limit=10) (completed goals pushed the active one off-panel). Now fetches active + planning + paused separately. Icon map gained explicit completed / cancelled / failed / planning keys.
  • Chat ▶ GOAL announcement renders the first sentence of the goal (its natural title) instead of an arbitrary 60-char slice.

Test posture

2080+ tests pass on main. Ruff clean. New coverage: dream journal, dream tool helpers, autonomous mind (workable-goals count, wakeup hook, planning-stuck retry), file_write auto-index, skill_promote (validation + refusals + happy path), affect content inference, goal-manager completion hooks.

Commits

71fef14 docs: CHANGELOG + README sync
f263063 knowledge/system/identity.md root cause + unconditional sweep
3163a0f Awakening prompt templated + sweep re-indexes
cc199b4 Identity reconciliation: sweep self-narrative md files
dd2e94b Plumb agent_name into LLM system prompt
6c5e8a9 Dashboard: pre-seed agent_name from config
b955dc4 Honor configured agent name across dashboard + identity
dec3376 Setup wizard: ask for agent name (default EloPhanto)
f8c7e8c Dashboard: force light theme
3988bcd Setup: finish the job (brew installs + identity + vault prompt)
e33c89b Fix Gemini Flash model name -> gemini-3.1-flash-lite
59d302e Setup wizard: Codex/ChatGPT first-class everywhere
21ed7cd Dashboard chat: full goal title (not 60-char slice)
3f9036c Dashboard GOALS panel: filter completed + fix '?' icon
ef4b843 README: sync autonomous-mind + affect + skills state
81af5aa Workspace auto-index + skill_promote + pre-dream dedup
796e5e5 Goal completion -> dream wakeup + FORCE-DREAM gate + planning-stuck retry
b632fba Dashboard GOALS panel: two-line layout
2134e01 Dream phase v2: skills + journal + environment + dedup
72b1638 x-virality skill (xai-org/x-algorithm)
5cf0dea Affect Phase 6 calibration + goal_checkpoints UNIQUE renumber

Don't miss a new EloPhanto release

NewReleases is sending notifications on new releases.