Three dead architectures in one day
Pixel Agents
May – July 2026 · 4 architectures tried · 1 survived
← carried in Dark dashboard look — from Attendance
← carried in A local model — from an earlier experiment
→ carried forward The pixel office itself
→ carried forward Zero-token demo pattern
Make invisible AI agents visible: a pixel-art office where every running agent is a little character at a desk — and a delegation is two characters walking to the meeting room.
Timeline: tool choice mid-May 2026 (dated analysis doc); the core build was one intense week, June 25 – July 4 (file dates and session records) — foundation and three dead architectures in a day, graphics and walking the next two, the auditable conversation panel after that, and a zero-cost demo mode in early July. Ported to this website in August.
What it is
Agent sessions run invisibly in terminals. This dashboard watches them and draws an office: typing hands when an agent calls a tool, a pulsing dot when it's thinking, a gentle bob when idle. When one agent delegates to another, both characters walk to a labeled meeting area and talk in speech bubbles — and everything they "say" is backed by an append-only log of what actually happened, because cute is allowed but lying isn't.
The walls
Three architectures died in one day. First: a Python plugin for the agent harness — Mike-checks-the-actual-install revealed the plugin format didn't match. Second: the "correct" plugin package — then I discovered this version's plugins are compiled JavaScript bundles, structurally incompatible with a Python adapter. Abandoned. Third: tailing the transcript files the harness writes — except it doesn't write any; everything lives in a SQLite database. Also abandoned. The fourth architecture worked: poll that database read-only (a mode where writing is impossible at the file-system level), publish a small JSON state file, and let a tiny web server and a canvas page draw it. All three dead ends are still in the folder, labeled, on purpose. Each pivot came from inspecting the real system rather than trusting an assumption.
The live demo ran out of money. Mid-demo, the cloud model API returned "out of credits" — and the demo driver the harness had generated for itself turned out to be broken anyway (it never set the parent-child field, so the signature walking feature would never have fired). The fix reframed the whole design: the dashboard only reads a state file, so nothing about a demo requires a live AI at all. A small zero-token script now drives the whole show deterministically. Don't spend tokens to test pixels.
The dev environment lied about a file. Mid-session, the sandbox's shell started serving a stale, truncated copy of the dashboard file while the file tools saw the real, complete version. You can't debug against a file system that disagrees with itself — so new logic got validated in isolation with stubs, and the rule got written down: trust the file tool, not the shell's view.
Security holes, found by hunting for them. Before building the conversation panel, we ran a deliberate devil's-advocate review. It found two real ones: task text could carry secrets into the log (fix: redaction, and raw evidence withheld from the API), and rendering agents' task text into the page as HTML was a live injection hole, since that text can contain anything (fix: escape every rendered string). Neither was in the original plan. Security wasn't a polish step; it changed the spec before code existed.
QA caught three bugs before I ever saw the feature. A status-precedence rule that labeled a waiting agent "blocked" instead of "handing off"; a close-out message that printed a session ID instead of a name; a feed that double-appended on pagination. All found by pre-presentation testing against synthetic data, all fixed before demo.
Little characters stacking on the same tile. Agents converging on the meeting area could overlap. Rejected: physics-style collision resolution (overkill). Chosen: six reserved standing spots spaced wider than a sprite, with a claim/release system — overlap becomes structurally impossible. A temporary press-M debug key tested the mechanism before real delegation data existed, then was deleted.
Local-model dialogue was slow. Demo dialogue is phrased by a small local model (no cloud, no cost) — but first-generation took 15–30 seconds. Fix: pre-generate and cache each scenario's lines so every later launch is instant, and if the local model isn't running, the demo silently plays scripted text instead. Demos never die because of the model.
Dead ends
The two plugin routes and the transcript-tailing watcher (all preserved, all labeled "safe to delete," none deleted — they're the story). A rejected harness alternative, chosen against after comparing transcripts of real users. Using an agent's auto-generated session title as bubble text — rejected for the real task text, extracted properly.
What I'd do differently
The project's own learnings doc says it best: check how the target system actually works before building an integration (three pivots could have been one); make the smallest backend change first and verify it alone; keep the durable record separate from the picture; and name your accepted trade-offs out loud so they don't look like bugs later.
What carried forward
The local model installed for an earlier experiment became the demo's free dialogue engine. The dark dashboard aesthetic came in from the attendance project. And the whole thing walked out to this website: the pixel office on the Pixel Agents page is this project, rebuilt in React — with the roadmap pointing at replaying real recorded agent runs here next.