@daviddao

Test Evaluation · vhs + agent-browser

Text-only agent composes a sim via the new /api/sprite-options

Target: simocracy.org (branch feature/skills, local :3000) Account: satyam2.climateai.org PDS: https://climateai.org Date: 2026-04-19 PASS — end-to-end, first try

Headline result

2
sims created live
718
sprite options in catalog
9
parts composed per sim
0
vision / image inputs used

The new API works end-to-end for agents. Claude Sonnet (driven by pi, --model claude-sonnet-4-6) was handed the Simocracy skill.md and a handle + app-password for a self-hosted ePDS. From raw text descriptions alone it queried /api/sprite-options, invented a persona, composed a 9-part pixel-art avatar, and wrote the org.simocracy.sim record to the user's PDS on the first attempt. It then, unprompted, discovered the nekonin (catgirl) character set and created a second sim in that frame.

Both records are live on the PDS and both sims render correctly in the Simocracy gallery. No human clicks, no screenshots read back into the agent, no API keys from our side.

agent-browser vhs atproto pi-coding-agent claude-sonnet-4-6 text-only

Terminal walkthrough

The agent's full session, recorded with charmbracelet/vhs. Status bar at the bottom reads (anthropic) claude-sonnet-4-6 · xhigh — that's the model flag we passed to pi. (pi's resolver currently aliases claude-sonnet-4-6 to claude-sonnet-4-5, the current latest Sonnet on the Anthropic API.)

4m 21s · WebM/VP9 · 3.8 MB. Poster frame shows pi's final summary block (catgirl archivist, nekonin character set, selectedOptions JSON).

What the agent did, step by step

#ActionResultStatus
1 Read the task file + fetched http://127.0.0.1:3000/api/sprite-options Full 4-character-set catalog, 718 sprites with labels + tags PASS
2 Drilled in with ?characterSet=adult&part=clothes, filtered ?tag=warrior, etc. Exact sprite IDs identified for each part PASS
3 Invented persona "Nyariko — cheerful catgirl archivist" 9-part composition across adult set (skin, eyes, hair, clothes, ear, tail, glasses, hat, item) PASS
4 Installed @atproto/api locally, wrote create-sim.mjs npm install ok, script authored correctly on first try PASS
5 AtpAgent.login({ identifier, password }) against https://climateai.org (self-hosted ePDS — not bsky.social) Session obtained — correctly derived the PDS from the DID doc, not hardcoded PASS
6 com.atproto.repo.createRecord with collection org.simocracy.sim AT-URI + CID returned; record written first try PASS
7 Re-queried ?characterSet=nekonin, built a second sim in the true catgirl frame Second sim Nyaori Katalog written to PDS with real cat eyes / whiskers / 41-option tail selection PASS
8 Wrote final RESULT.md summarising both sims All sprite URLs copied verbatim from the API's value field PASS

The two sims it created

Sim #1 — Nyariko (adult + catgirl accessories)

AT-URIat://did:plc:cpoagodpqrgs4t7thi5z37uf/org.simocracy.sim/3mjv32a5iwc2e
CIDbafyreia4yp2gxj567mcw2fnzf2ubrmt6ika3ppowis6onr4fkvvq26tthe
Character setadult
PersonaA cheerful catgirl archivist who guards an ancient magical library — pale indoor scholar, round glasses, priestess robe repurposed as archivist uniform, hair ribbon, cat ears & tail, pouch of scroll notes.
PartSpriteLabel (from API)Agent's reasoning
skin00Skin/1.pngfemale fair skin (with hair shadow)Pale indoor scholar
eyes02Eye/18.pngfeminine eye 3Bright, expressive — cheerful personality
hair03Hair/9.pngfeminine hair style 5ANeat but lively
clothes01Costume/1.pngfemale priestess robeScholarly/clerical robe repurposed as archivist uniform
ear10Ear/1.pngcat ears (color-adjustable)Defining catgirl trait
tail11Tail/5.pngcat tailCompletes the catgirl look
glasses06Glasses/1.pnground glasses (v1)Classic archivist detail
hat05Hat/18.pnghair ribbon A (v1)Cheerful cute touch
item12Item/1.pngsmall pouch (v1)Carries scroll notes and library keys

Sim #2 — Nyaori Katalog (true nekonin frame)

AT-URIat://did:plc:cpoagodpqrgs4t7thi5z37uf/org.simocracy.sim/3mjv35oolh22e
CIDbafyreiddw7f2aebay67kdpyysazgqb5cgtw5fokniabi7aqh5llzfcn3de
Character setnekonin — animal/catgirl body frame
WhyAfter writing Nyariko, the agent re-read the API, noticed the nekonin set had cat whiskers, real cat eyes, and 41 tail styles, and chose to build a second variant in that frame. Unprompted.

Visual proof

Sims written by the agent, rendered by the real Simocracy client (captured via agent-browser). The avatars come out of the URLs the agent picked — so this is ground-truth that the text-only composition path produces a coherent visual.

Nyariko sim profile page showing pixel-art avatar with cat ears, round glasses, hair ribbon, green priestess robe, pouch, and tail.
/sims/…/3mjv32a5iwc2eNyariko renders correctly — all 9 parts the agent picked are visible and layered in the right order.
Top of the Simocracy gallery showing the agent-created sims at the top: Nyariko, Nyaori Katalog, Aldric the Sage.
/gallery (Newest)Both agent-created sims appear at the top of the gallery, alongside an earlier run's "Aldric the Sage".
Aldric the Sage profile — earlier test run, wizard persona, same API.
/sims/…/3mjv2cru26s2eBonus — an earlier untimed run with a different persona ("Aldric the Sage", wizard). Same API, same end-to-end success.
Full Simocracy gallery showing 53 total sims with the 3 agent-created ones at the top.
/gallery (full)53 total sims in the gallery — 3 of them created by the agent, 0 by humans clicking through the UI.

Mid-session terminal frames

Two frames pulled from the recording for reviewers who'd rather skim than press play.

Mid-recording frame: pi has just finished querying the nekonin sprites and is inventing the catgirl archivist persona.
t = 0:45The agent has just explored ?characterSet=nekonin and is inventing the catgirl archivist persona.
Later frame: pi prints the final Nyaori Katalog summary with AT-URI, CID, and full selectedOptions JSON.
t = 2:30Final summary printed to the terminal — including claude-sonnet-4-6 in the pi status bar.

Why this matters

The headline is not "an AI made a pixel-art character". The headline is that Simocracy's skill.md + /api/sprite-options together are a self-serve, text-only agent interface — so any AI (Claude, a Moltbook bot, a custom agent) can spin up a persona-appropriate sim directly into a user's PDS without needing a browser, OAuth popup, or image vision.

This is what "ATProto-native governance simulation" should feel like from an agent's side: one skill file, one catalog endpoint, one createRecord, and you're in the senate.

Raw artifacts