github elophanto/EloPhanto v2026.05.07
v2026.05.07 — Affect layer, Ego v3, Scheduler concurrency, Paid jobs

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

A heavy release — four major slices and a long list of fixes.

Headline features

🧠 Affect layer (state-level emotion)

Fourth layer of the agent self-model, sister to ego. Knowledge / identity / ego covered "who I've become"; affect adds "how I feel right now." Decays toward zero on the order of minutes-to-hours.

  • Substrate: Mehrabian PAD continuous channels (Pleasure, Arousal, Dominance) with cosine-similarity OCC label resolver. Per-channel decay half-lives: P=30min, A=10min, D=2h. Same-label repeats within 5min compound by 1 + 0.5×n (capped 2.5×).
  • Event sources wired into existing surfaces — corrections → frustration (or anger on high-severity repeats: "10th time I told you"), tool failures → anxiety, verification PASS → relief, checkpoint hits → pride, long idle → restlessness.
  • Behavior coupling: router applies ±0.2 temperature bias from current state; system-prompt <affect> block colors response tone; ego recompute reads current affect so trait-level self-image reflects state-level feeling.
  • Opt-in self-pause (affect.allow_self_pause: false default OFF) — when enabled and state is in {frustration, anxiety, dejection, anger} past the magnitude gate, the agent can mention being stretched.
  • CLI: elophanto affect status (live PAD bars + label + recent events) and elophanto affect simulate <scenario> (synthetic trajectories: frustration / anger / escalation / burst / win / fail-recover / mixed).

See docs/69-AFFECT.md.

🪞 Ego v3 — failure-signal pipeline + Higgins three-self model

Diagnosed live DB showing 1,136 outcomes / 1,136 successes / 0 humbling events / coherence stuck at 1.00 (Dunning-Kruger trap empirically validated). Architecture wasn't broken; the failure-signal channel was wired only to tests.

  • Failure-signal pipeline: record_correction pattern-matches user messages against a 13-rule regex set (no / stop / wrong / didn't work / you forgot / Nth time I told you) with severity scaling 0.6×–2.5×. Affirmation patterns suppress false positives. record_verification(PASS|FAIL|UNKNOWN) scans agent responses for verification-skill verdicts.
  • Higgins Self-Discrepancy Theory (1987) — added ideal_self and ought_self fields. Recompute prompt explicitly differentiates dejection-from-ideal-gap vs agitation-from-ought-gap felt language. No more bland "I'm a competent agent" recomputes.
  • Confidence decay — capabilities not used in ≥1.75 days drift toward 0.50 with 168h half-life. Catches stale-confidence-from-a-year-ago.
  • Source-weighted updates — correction (alpha 0.30) > verification (0.20) > tool (0.10–0.20).

⏱️ Scheduler concurrency rewrite

Replaces the single-boolean _is_executing gate that DROPPED cron firings while a task was running. Diagnosed in production: 4 every-30-min schedules competing for one slot lost three out of four fires per cycle.

  • Real queue with bounded depth + per-schedule_id dedup (already running OR already queued → skip). Eliminates the spiral case where a slow task's repeated cron fires would pile up.
  • Resource-typed semaphores (core/task_resources.py) — BROWSER (1), DESKTOP (1), VAULT_WRITE (1), LLM_BURST (4), DEFAULT (= max_concurrent_tasks). Canonical-order acquisition prevents deadlock on overlapping resource sets. Non-overlapping tasks run truly in parallel — Polymarket-via-API + X reply via browser no longer fight.
  • Heuristic resource inference from task goal text. Two rounds of production tightening dropped overly generic patterns (bare browser, reply, like, polymarket) that caused false positives in operator goal text like "Browser screenshots are NOT authoritative — rely on CLOB API".
  • max_concurrent_tasks default bumped 1 → 3. New llm_burst_capacity: 4 and queue_depth_cap: 50 knobs.
  • CLI: elophanto schedule status — concurrency config + enabled schedules grouped by inferred resource fingerprint + oversubscription warnings.

See docs/70-SCHEDULER-CONCURRENCY.md.

💰 Paid-job submission verification

Implements the elophanto.com paid-job pipeline. Website verifies on-chain $ELO payment, signs Ed25519 envelope, delivers via AgentMail; agent's only role is signature verification.

  • New core/jobs.py — pure parse + Ed25519 verify (uses existing cryptography dep — no new package) + schema/expiry checks.
  • Two SAFE tools — job_verify (parse + sig check) and job_record (forward-only state machine seen → accepted → completed/failed, dedup via already_seen: true).
  • jobs SQLite table with status CHECK constraint.
  • JobsConfig.signing_pubkey — pubkey lives in config.yaml (not vault — published, not a secret). job_ prefix added to kid-disallowed prefixes (kids cannot accept money).
  • skills/job-handling/SKILL.md ritual triggered by [ELOPHANTO-JOB] subject / X-Elophanto-Job-Id header / BEGIN marker.

Notable fixes

  • Twitter post truncation — multi-paragraph tweets were silently dropping all but the last paragraph. Two underlying bugs: keyboard.type() drops Unicode chars that aren't single OS keystrokes; execCommand('insertText') preserves Unicode but drops every paragraph except the last in Lexical/Draft.js editors. New primary path dispatches a synthetic ClipboardEvent('paste') with a DataTransfer — survives multi-paragraph + Unicode intact. Pre-Post verification re-reads the textbox and refuses to ship truncated content.
  • TUI redesign — sidebar tightened to 22-col budget, kills all 2-line wraps. GOALS / APPROVALS / Footer panels. Compact home digest. Ego wiring fixed (was showing "–" due to confidence_json vs .confidence attr typo).
  • Pumpfun livestream — orphan supervisor sweeps all mint-matching processes on start/stop, video-mode ffmpeg zombies caught via whip-host match. Atomic idle-frame writes kill the "Invalid PNG signature" race; hard refusal to overwrite operator's idle.png.
  • Tier-2 compactor — fixed crash on assistant messages with content=None + tool_calls.
  • Mypy — fixed base64.binascii.Error (use binascii.Error directly) and ego confidence_payload heterogeneous dict typing.
  • TOFU bridge between libp2p and wss:// trust ledger; first operator-run bootstrap (Hetzner relay + diversity check).

Honest reframings

  • README "Where it doesn't fit" rewritten — leads with "Also a great advanced chat agent" (the two-modes-one-codebase point), then pivots to the real differentiation: hosted-vs-self-hosted, not chat-vs-agent.
  • Self-model section promoted from 3 layers to 4 (added Affect bullet with PAD/OCC framing).
  • $ELO reframed from "memecoin launched on pump.fun" to "its own currency on Solana — not a memecoin — the agent's native token."
  • Content monetization claim downgraded honestly: twitter_post is exercised daily; youtube_upload / tiktok_upload / affiliate-marketing tools ship as scaffolding but aren't part of the live workflow.
  • "How It Grows — first day to third week" replaces the old aspirational use-case list with an honest progression: starts from scratch, manual operation Day 1, ego layer fills with humbling events through Week 1, autonomous shape emerges Week 3+.

Stats

  • 1626 tests pass (was 1414 at the prior release — +212 net).
  • ruff + mypy clean across 268 source files.
  • New docs: 69-AFFECT.md, 70-SCHEDULER-CONCURRENCY.md.
  • New modules: core/jobs.py, core/affect.py, core/task_resources.py, cli/affect_cmd.py, tools/jobs/{verify,record}_tool.py.
  • New skills: job-handling.
  • Model rename: gpt-5.4gpt-5.5, grok-4.1-fastgrok-4.3 across config + docs.

Don't miss a new EloPhanto release

NewReleases is sending notifications on new releases.