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: falsedefault 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) andelophanto 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_correctionpattern-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_selfandought_selffields. 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_iddedup (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_tasksdefault bumped 1 → 3. Newllm_burst_capacity: 4andqueue_depth_cap: 50knobs.- 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 existingcryptographydep — no new package) + schema/expiry checks. - Two SAFE tools —
job_verify(parse + sig check) andjob_record(forward-only state machineseen → accepted → completed/failed, dedup viaalready_seen: true). jobsSQLite 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.mdritual triggered by[ELOPHANTO-JOB]subject /X-Elophanto-Job-Idheader / 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 syntheticClipboardEvent('paste')with aDataTransfer— 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_jsonvs.confidenceattr 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(usebinascii.Errordirectly) and egoconfidence_payloadheterogeneous 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).
$ELOreframed 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_postis 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.4→gpt-5.5,grok-4.1-fast→grok-4.3across config + docs.