Field report · six weeks · AI-driven, not AI-unsupervised
Node wall-clock and agent wall-clock are decoupled with tools everyone already has: detached systemd, event-driven wakeups. What actually threatened a six-week, AI-driven Ethereum client benchmark was the one clock nobody budgets for — the orchestrating agent's own context window.
eth2quickstart.com · companion to the bake-off deck · 2026-06-22 → 2026-08-04 (last measurement 08-03; final installer fix merged 08-04)
The rig
Final synced disk footprint and cold-sync duration. Seven execution clients vs. a fixed Prysm (three never finished), then a five-way consensus sweep vs. a fixed execution client.
systemd services, no Docker, one candidate at a time on a shared 12-core / ~62 GB host. Each run capped at 72 hours.
A 23-day initial campaign (Jun 22 → Jul 14, 2026), then steady-state and restart-resume follow-ons through Aug 4.
Claude Opus orchestrating, fresh Sonnet subagents building, a standing delegate lane for cheap and sandboxed work — a human operator holding the few levers that genuinely need one.
The three clocks
The context bar has no fixed duration to plot — it's short by construction, not measurement. That's the point of the next eleven slides.
The spine
Node time and agent time are both solvable with infrastructure that already exists. Agent context only scales if conclusions get pushed down into small durable files instead of carried across a growing conversation — that single design choice is what the agent hierarchy, the durable-state control loop, and the governance rails all exist to serve.
The timeline
Seven execution clients, then the five-way consensus sweep. Triage, installer fixes, first full syncs.
Footprints re-read once compaction settled, plus a third CL sweep against a nethermind anchor.
Bisected restart gaps from 12 minutes to ~35 hours, found no cliff, and tuned nethermind's minimal-history installer default.
Who ran it
Outside the hierarchy — not dispatched, not reviewed as a child
Governance
One candidate at a time, no batching, ever. A 72-hour cap per candidate — footprint is the last sample before teardown, at sync for a finisher and at the cap for a capped run, never the peak. Conventional Commits only, never a force-push to master.
Every destructive data-clean is gated behind an explicit human go-ahead, never assumed. And no pull request merges without an explicit human go-ahead — the operator holds that lever, the agent never takes it.
The near-miss
reth's out-of-the-box default is an archive node. Nothing would have flagged that as wrong — until the config-optimality gate started stamping every footprint config_optimal=yes|no. It caught the misconfiguration before a number shipped.
Fixed 2026-06-25, before a single reth result was recorded — the rerun then hit the 72h cap at ~0.98 TiB partial, so the pruned figure stays a projection. We nearly published our own misconfiguration.
Four incidents, all caught & documented
Head frozen at block 4,651, 0 peers — everything else looked healthy. P2P bind pinned to loopback; fixed by advertising the real external IP.
Downloader thread died; the process stayed alive and kept answering RPC. A stale pinned CL aged the sync pivot out of its servable window.
Gaps through 23 min resumed; a 26-min gap stalled. Longer measured gaps discarded state and re-synced from scratch (~2h). Inherent to the current design.
OtterSync + a checkpoint-synced CL never issued the forkchoice update that would close the gap. Terminated per operator decision, recorded as a no-sync.
Bugs in our own measurement machinery
A detached tmux install step piped a version check through head -1. Outside the foreground process group, that raised SIGTTIN against a tty it didn't own — which stops, not kills, the whole subtree. Fixed by redirecting stdin from /dev/null.
A slow client hitting the 72-hour cap fell through to teardown — which wiped the datadir — before any snapshot was taken. One footprint survived only because it could be reconstructed from raw samples.
The cap path is the one you forget, and it's the one a slow client actually takes.
The durable control loop
Not because the session doesn't die — it did, more than once, once to an out-of-memory event. Because what carries the campaign forward is durable state, not context.
If you're building the next one of these
Bottom line
None of this made the agent smarter about Ethereum clients. It made the campaign survive session deaths, context clears, and its own mistakes — the config gate's six bug-fixes, the SIGTTIN and cap-path landmines — without losing the measurements that mattered.
Read it, reproduce it
eth2quickstart.com/blog
One-line install → hardened Ethereum node, 12 clients, MEV integration. github.com/chimera-defi/eth2-quickstart
Speaker notes