BX FOUNDRY Project notes · Apple II Agent

Project notes

Apple II Agent

An Apple IIe that asks Claude for software, watches it get written and tested, then runs it. Benj Edwards architected it, and Claude Code wrote most of the code. This is how the project came together, from January to October 2026, how it works, and what broke along the way.

Written by Opus 5.5 · October 26, 2026
Design Guidance by Benj Edwards, BX Foundry

Experimental. Apple II Agent has run on one real machine (an enhanced Apple IIe with 128K, a Uthernet II Ethernet card and a Floppy Emu) and in the Bobbin emulator. It has rough edges, listed near the end. It is an independent project, not made or endorsed by Apple or Anthropic. Problems and questions go to the issue tracker on GitHub.
An Apple IIe with its monitor showing the Apple II Agent screen: Claude's description of TriPeaks Solitaire and the line '*** TRIPEAKS SOLITAIRE IS READY! *** RETURN = RUN IT'. A Floppy Emu disk emulator sits to the right of the keyboard.
Real hardwareTriPeaks Solitaire, built by Claude, waiting on an Apple IIe for the RETURN key. The small board on the right is a Floppy Emu holding the boot disk.

What it is

Claude Code, typed on an Apple IIe

You boot the Apple II from a floppy image. The agent finds a small proxy program on the local network by itself and shows a prompt. You type what you want:

AGENT> make tripeaks solitaire

From there, Claude (Opus 5.5 by default) writes the program in Applesoft BASIC or 6502 assembly language. It runs the program in an emulated Apple IIe set up exactly the way the real one will be, types keys at it, looks at screenshots, reads the screen, fixes what's wrong and tests again. All of this streams to the Apple II while it happens: Claude's notes, each tool step, the code as it's written, and hi-res screenshots as live previews. When the program works, the proxy sends it over Ethernet into the Apple II's memory, and the screen says:

*** TRIPEAKS SOLITAIRE IS READY! *** RETURN = RUN IT (OR TYPE TO CHAT)

RETURN runs it. ESC, Ctrl-Reset or a crash brings you back to AGENT> with the conversation intact. If the program crashed or hit a BASIC error, the next request is already filled in as FIX: ..., with what went wrong.

Why build it

The old machine is where you watch it happen

The working name in the first notes was "Claude Code for Apple II": an agentic coding loop like the one Claude Code runs in a terminal, except the terminal is the Apple II itself. You talk to the computer in plain English, and it gets new software, written for it, tested for it and loaded into it while you watch.

Five design decisions shape everything that follows:

Behind it all is a plain question: can an AI model write real software for a 40-year-old 8-bit computer, with its odd memory map, its 280×192 hi-res screen and its 1 MHz 6502, and get it right without a person fixing the code? Getting there meant the model had to see the program run, so the project grew a test emulator, screenshots and a harness. It also meant the Apple II had to do more than display text. In the end it runs a TCP/IP client, a custom packet protocol, an 80-column screen driver, and a launcher that swaps 24K of memory between main and auxiliary RAM to make room for your program.

How it works

Three machines and a contract

Architecture The Apple IIe talks to the proxy over TCP on port 6502. The proxy calls the Claude API and drives its own test copy of the Bobbin emulator through a control socket. Apple IIe, 128K AGENT> make breakout * WRITING BREAKOUT.S * PLAYING 0M42S AGENT.SYSTEM (6502) UI · A2P · deploy & launch IP65 TCP/IP Uthernet II (W5100) Floppy Emu ProDOS 1.9 boot disk A2P / TCP port 6502 UDP A2AGENT? Proxy (Python) on the local network unified_proxy.py sessions, packets, discovery agentic_claude.py the agent loop, tools, streaming deploy.py builds programs, memory layout emulator_bridge.py launches, types, observes Claude API Opus 5.5 streaming, adaptive thinking Test Bobbin enhanced //e real 1 MHz, control socket
The Apple II never talks to Claude directly. The proxy holds the conversation, runs the tools and drives its own emulator. The same deploy.py lays out memory for the test runs and for the real deploys.

Booting and finding the proxy

The boot disk is a ProDOS 1.9 disk with AGENT.SYSTEM as its first system file, so ProDOS runs it straight away; there is no BASIC.SYSTEM and no BRUN. A small loader at $2000 copies the agent up to $6000, from the top down, so AGENT.SYSTEM (16,712 bytes) can be bigger than 16K. The agent brings up the Uthernet II in slot 3, gets an address by DHCP and broadcasts A2AGENT? to UDP port 6502. The proxy answers with its TCP port, and the reply's source address tells the agent where the proxy is. That address is saved to a 10-byte CLAUDECONF file on the boot disk, which also holds the stall watchdog's timeout. Then the agent connects and sends an INIT packet listing what this machine can do: 80 columns, auxiliary RAM, deploys.

The IIe's monitor at boot: 'APPLE II AGENT V2.0', '40-COLUMN UPPERCASE', network initialization through DHCP, 'THIS APPLE II IS' followed by a blurred address, 'LOOKING FOR THE PROXY', 'FOUND IT:' with a blurred address and port 6502, 'CONNECTED TO PROXY', and 'ASK FOR ANY PROGRAM. ESC OR CTRL-RESET BRINGS YOU BACK HERE FROM IT.'
BootDHCP, the broadcast, connected. The network addresses are blurred in this photo. (The banner still says V2.0.)

The wire protocol

A2P is a small binary packet format over the TCP connection. Each packet starts with the bytes A2, then a type, a 2-byte length and a sequence number, and ends with an XOR checksum. ACK and NACK packets confirm a packet or ask for it again. That checksum is also how the agent knows a deploy arrived damaged.

TypeNameCarries
$00INITCapabilities (80-column, aux RAM, deploy), model, display mode, protocol version
$01CHATWhat you typed
$02RESPText for the log; a flag marks the final message
$04STATUSThe status line; DONE ends a response
$05ACKAcknowledgment
$06NACKAsks for a packet again
$07LOADA 2-byte address and up to 126 bytes of program
$08DEPLOYStart of a program or a preview, to main or aux memory
$09RUNThe launch descriptor: kind, start, end, LOMEM, HIMEM, mode, page range, name
$0ASHOWFlip to the log or to a hi-res preview

One request, start to finish

  1. You type a request. The input line holds 239 characters, and on a mixed-case screen your text goes as typed. The proxy echoes it at the top of the log, word-wrapped.
  2. Claude plans and writes. The agent loop calls Claude Opus 5.5 with streaming and adaptive thinking; /MODEL S or /MODEL H switches it to Sonnet 5.5 or Haiku 5.5, and /MODEL O switches back. Claude's tools are write_file, edit_file, read_file, run_in_emulator, emulator_input, emulator_memory, deploy_to_apple and web search. Summaries of its thinking stream to the Apple II as short - paragraphs, and the code scrolls by line by line as it's written.
  3. It builds and launches a test. deploy.py tokenizes Applesoft (with its own tokenizer) or assembles 6502 code with ca65 and ld65. The harness builds a launch state with the program's bytes, the same page-3 hooks the real agent installs, BASIC's pointers and guard patterns. It fills main and aux memory from $0800 to $BEFF with junk first, because a real Apple II's memory is never clean. Then it loads all of that into a fresh Bobbin running at a real 1 MHz. Nothing boots: each test starts from that snapshot with the program already in memory, so there's no boot to wait for, and Claude chooses how many seconds to let each run play before it looks. The emulator used to run about 40 times faster than a real Apple II, by accident. It's held to 1 MHz now because Claude judges a game's speed from these runs (more under What went wrong).
  4. It plays the program. Keys arrive as the //e's own key codes, at a typist's pace. Each observation reports whether the program is running, ended at ], hit a BASIC error, crashed into BRK or exited to the agent. It includes the text screen, a color PNG screenshot that Claude looks at, and any memory-safety problems: writes into the agent's memory, its page-3 hooks or ProDOS's global page. Hi-res screenshots go to the Apple II as previews; any key flips back to the log.
  5. It fixes and retests until the program does what was asked. For big programs, the prompt tells Claude to get a first playable version working, test it, and then grow it.
  6. It deploys. DEPLOY, a run of LOAD packets and a RUN descriptor stream the program in. The closing message is shown again on a clean page right above the READY banner, so the program's controls are on screen when you press RETURN.

Making room: the launch modes

The agent itself lives at $6000 and up, right where a big program wants to be. On a 128K IIe the answer is to swap it out.

EXCHANGE launch mode Before launch, the agent is in main memory from $6000 to $BEFF and the downloaded program is staged in auxiliary memory. During the run, the program occupies main memory from $0800 to $BEFF, and the agent waits in auxiliary memory. AT AGENT> (download) WHILE THE PROGRAM RUNS MAIN AUX $C000+ ROM, I/O AGENT$6000–$BEFF previews,last run $0000–$07FF program,upper part program,lower part $BEFF $6000 $0800 RETURN MAIN AUX $C000+ ROM, I/O PROGRAM$0800–$BEFF46,848 bytes page 3 hooks AGENTwaiting untouchedcopy $BEFF $6000 $0800
EXCHANGE mode. The download is staged in auxiliary memory. At launch, a short routine in the stack page copies the lower part of the program into main memory and swaps $6000–$BEFF between main and aux. Coming back swaps it again, and /RUN plays the program again from the untouched copy.

On a 64K machine, RESIDENT mode keeps the agent in place and gives the program $0800–$5FFF (22,528 bytes). Applesoft programs are placed around whichever hi-res pages they use, and their variables get the biggest block that's left. Machine code above $6000 can change itself as it runs, and the swap brings that changed copy back, so /RUN of such a program asks the proxy for a fresh copy instead (/RERUN). The biggest program run so far is a 28,480-byte Applesoft test. The largest one Claude wrote for a request is The Haunted Castle, a text adventure of 13,611 bytes.

The way back

Every program has to be able to return. The agent keeps the top of page 3 ($03C7–$03FF) for itself; programs get $0300–$03C6. There's a crash mark, a BRK stub, a return entry at $03D0, a keyboard hook at $03D3 and the reset and BRK vectors. That gives six ways back to AGENT>:

In EXCHANGE mode, the return entry flips to auxiliary memory, where the agent is waiting, before it does anything else.

80 columns, without the firmware

The 80-column display interleaves its characters: even columns live in auxiliary memory, odd columns in main. The agent's own screen code writes, clears and scrolls across both banks and blinks its own cursor, without the 80-column firmware. Programs still start in plain 40-column text, and the agent comes back in 80.

Staying connected

The October 2026 hardware work added four layers, each from a real failure:

The emulator underneath

The control socket speaks JSON over a Unix socket to up to 16 clients at once: memory, CPU, breakpoints and watchpoints, disks, graphics capture, 128K state snapshots, soft switches, keys and mouse. Its emulated Uthernet II now behaves like a real host on a real network. It sends 536-byte segments, respects the Apple's receive window, resends from the last ACK and drops duplicates. Switches can garble every nth TCP segment, or misreport every nth frame length in the receive ring, to reproduce the faults seen on the real machine.

Tests

One script runs every test that needs no API calls, one after another, in about 15 minutes: 62 unit tests; 35 screen checks in 40 and 80 columns, including the watchdog; 7 first-run setup checks; 30 end-to-end checks three times (normal, in 80 columns, and with every 5th segment garbled and every 7th frame length misreported); and a 25-cycle soak of deploy, run and return. Each test gets its own discovery port, so a test's emulated Apple II can't find a real proxy by mistake.

The Apple II client

Everything AGENT.SYSTEM does

The client is about 5,900 lines of 6502 assembly, plus the IP65 network stack, in one 16,712-byte file that ProDOS starts at boot.

Booting and setup

The screen

Typing

Working with Claude

Running programs

Getting back

Staying connected

Commands

CommandWhat it doesHandled by
/RUNRun the last program againApple II
/EXITDrop to a plain ] prompt (also /SUSPEND, /QUIT); ESC, & or Ctrl-Y come backApple II
/SETIP addressSet the proxy's address; checked before it's usedApple II
/PORT nSet the proxy's portApple II
/IPShow the proxy's address and portApple II
/SAVESave the settings to the boot diskApple II
/LISTList the BASIC program in memoryApple II
/CLEARClear the screenApple II
/MORETurn [MORE] paging on or offApple II
/DISPLAY 40|40L|80Switch display modeBoth
/MODEL O|S|HUse Opus, Sonnet or Haiku 5.5Both
/RESETStart a new session; the proxy forgets the conversationBoth
/CODE requestA quick BASIC program from a single request, without the agent loopBoth
/HELPList the commandsProxy
/UNDOBring back the previous programProxy
/VERSIONSList the programs sent this sessionProxy
/SEND fileSend a program from the proxy's workspace as it is, without ClaudeProxy
/EFFORT levelHow hard Claude thinks: LOW, MEDIUM, HIGH, XHIGH or MAXProxy
/LIMIT nThe most tool steps Claude may take per request (1–200)Proxy
/PROMPT textStanding orders added to every request; empty clears themProxy
/AGENTTurn the agent loop on or offProxy
/CHAT messageTalk to Claude without toolsProxy
/HISTORYRemember the conversation, or treat each message freshProxy

The client also sends three commands of its own: /STOP when you press ESC while waiting, /RERUN when /RUN needs a fresh copy, and /RESYNC, with its stall report, when the watchdog reconnects.

The history

Ten months, two bursts

Apple II Agent started when Benj thought it would be fun to write a version of Claude Code for the Apple IIe. He happened to have a Uthernet II Ethernet card, so he pulled it out of his Apple IIgs, put it in the IIe, plugged in a BMOW Floppy Emu and got to work.

The open question was how it should work. A ChatGPT-style chat on a green screen wouldn't have been satisfying. It had to be interactive and agentic: you ask, Claude builds and tests, you try what it made, and the two of you refine it back and forth until it's right.

The work came in two bursts. The first ran about five weeks, from early January to February 10, 2026. By the end of it, a basic version was working on the real Apple IIe hardware, and the code went up on GitHub. The second, a week in late October 2026, rebuilt the agent around ready-to-run programs and made it hold up on the real machine. Dates come from the commit history, the changelog and the project's notes.

  1. January 3–11, 2026 The emulator learns to show its screen

    It starts with Bobbin, Micah Cowan's terminal-based Apple II emulator. A fork adds screen export for hi-res, lo-res and the double-resolution modes, as ASCII art and as images, then "AI agent support", so that a model can read what an Apple II is showing.

  2. January 22–25, 2026 apple2agent becomes its own project

    The proxy, an MCP server for Claude Code, the 6502 client, the IP65 network library and the disk tools are pulled out of a larger umbrella project. The first commit, on January 25, 2026, is a remote shell: the Apple II can send and receive text, nothing more. That night an "ampersand hook" version appears, where typing & at BASIC's ] prompt calls the agent.

  3. January 26, 2026 The day it became an agent

    Ten commits in about an hour: the A2P packet protocol, model selection, /PROMPT, agentic mode with tool use, conversation compaction and the first "Claude Code experience" with BASIC and assembly support. The changelog calls this 1.0.

  4. January 27, 2026 Memory wars

    The agent's receive and screen-save buffers turned out to sit on top of IP65's Ethernet buffers, so sending a packet corrupted them. Display bugs fell the same day: a clobbered Y register, an uninitialized row counter, a cursor column that never reset.

  5. January 28, 2026 The control socket

    Driving Bobbin through a pseudo-terminal and Unix signals was fragile: race conditions, lost output, a debugger that sometimes didn't come back. The fix was a Unix socket built into Bobbin's main loop, taking JSON commands to peek, poke, read the screen, type keys, step the CPU, set breakpoints, swap disks and capture graphics. Everything after this depends on it.

  6. January 29–31, 2026 An emulator of its own, and a usable screen

    The proxy got its own test emulator (the "emulator bridge"), with 128K state snapshots and instant BASIC, ProDOS and DOS 3.3 environments. On January 31, 2026, the project was renamed from "Claude Code" to Apple II Agent. The client got a fixed status line and input line, a persistent TCP connection, [MORE] paging, /EXIT to BASIC, and web search for Claude.

  7. February 1–8, 2026 Features, fast

    A STARTUP file that boots straight into the agent; sessions that survive a reconnect; a W5100 buffer-size mismatch behind dead connections; saved versions with /UNDO; Dungeon of Doom, a text RPG used as a test case; 40-column, 40-column lowercase and 80-column modes; prompt caching. The most unusual feature: anything typed at the ] prompt that BASIC couldn't parse went to Claude. That worked by copying the Applesoft ROM into Language Card RAM and patching its error handler.

  8. February 9–10, 2026 Ready for others

    Tools that keep large data out of the conversation to save tokens, 16-color double hi-res capture, a 6502/Apple II reference library, and screenshots scaled 3× so a vision model can read them. By then a basic version was working on the real Apple IIe hardware, and the repository went public on GitHub on February 10, 2026.

  9. February – June 2026 On GitHub, unannounced

    The code was public, but it hadn't been announced anywhere.

  10. June 18, 2026 A low-key announcement

    Since a planned article about the project never came to pass, Benj decided to announce it in a low-key way on Bluesky, with a link to the repository:

    Way back in another lifetime (February) I was working on a “Claude Code” for the Apple II. Through an Ethernet card for the machine and this client, AI can write AppleSoft and assembly software for you interactively

    Kinda fell through the cracks, but it works!

  11. June – October 2026 Quiet again

    The project sat until October 2026.

  12. October 20, 2026 2.0: "Make it magical"

    Benj revived the project in October 2026 and set the goal for 2.0: make it magical. The core was rebuilt. Any program, BASIC or machine code, is streamed into the Apple II and shown as READY to run. A launch mode swaps memory so a program gets almost all of a 128K IIe. There are six ways back to the agent. A new agent loop runs on Opus 5.5 with adaptive thinking. A test harness launches programs exactly as the real machine will, and Claude's hi-res screenshots show up as previews on the Apple II. AGENT.SYSTEM boots straight from ProDOS.

  13. October 22, 2026 2.1: getting ready for real hardware

    Automatic discovery of the proxy, saved settings, ESC to stop Claude, a diagnostic disk, SD card tools and a full test suite. Bobbin got a much more realistic emulated network, which turned up a long list of real bugs. The agent also learned to draw 80 columns itself, because 80 columns had never actually worked.

  14. October 23, 2026 Version 2 boots on the real IIe

    On Benj's IIe, every new boot disk crashed at 2002- until the cause was found: the ProDOS 2.4 kernel. Rebuilt on the January 2026 ProDOS 1.9 disk that the earlier version had booted from, the new agent booted, found the proxy and talked to Claude.

  15. October 26, 2026 TriPeaks on the real IIe

    The first program the new version sent to the real machine stalled, then ran with ?SYNTAX ERROR IN 100. The network stack had never checked TCP checksums, and a garbled byte got through. With checksums checked, two more stalls during the next build were caught and recovered by a new watchdog, which led to a check on the network chip's receive ring. Benj then played TriPeaks on the IIe, and everything went to GitHub as 2.1 that night.

The Apple II Agent log on the IIe's monitor: '* PLAYING', the emulator's TriPeaks screen indented under it, then Claude's note 'I'M TRACING THROUGH THE CARD SEQUENCE STEP BY STEP, CHECKING WHAT HAPPENS TO THE CURSOR POSITION AFTER EACH...' and the status line 'PLAYING 3M13S'.
While it worksClaude has been play-testing TriPeaks in its emulator for 3 minutes 13 seconds. The emulator's screen is mirrored into the log, followed by Claude's own note on what it's checking.

Versions

From a chat window to a launcher

VersionDateWhat it added
1.0Jan 26, 2026The first client: A2P protocol over TCP, a full-screen chat UI, slash commands, saved IP settings, BASIC injected into memory at $0801, the & hook back from BASIC.
1.xJan 27 – Feb 10, 2026Never tagged. The agentic loop with tools, Bobbin's control socket, the emulator bridge, snapshots, sessions that survive reconnects, natural language at the ] prompt, /UNDO, display modes, prompt caching, the reference library.
2.0Oct 20, 2026"Make it magical": READY-to-run deploys of BASIC and machine code, the memory-swapping launch mode, six ways back to the agent, a new agent loop on Opus 5.5, a test harness that matches the real machine, live hi-res previews, AGENT.SYSTEM, port 6502.
2.1Oct 22–26, 2026Real hardware: proxy discovery, saved settings, ESC to stop, a ProDOS 1.9 boot disk, SD card tools, 80 columns drawn by the agent, TCP checksums, a receive-ring check, a stall watchdog with reports, re-fetching a damaged deploy, and the test suite.

Some features didn't survive. The February 2026 trick of sending unparseable BASIC lines to Claude needed a patched copy of the Applesoft ROM in Language Card RAM, and in 2.1 that copy turned out to wipe out ProDOS, which lives in the same memory. Leaving the agent now drops you at a plain ] prompt, and ESC, & or Ctrl-Y bring you back. A web interface from January 26, 2026, was dropped once the Apple II client could do everything itself.

On GitHub

Two repositories

apple2agent holds the Apple II client, the proxy, the MCP server, the disk tools, the tests and the programs Claude has made. It was created on February 10, 2026, and the first push that day carried 107 commits, January 25 to February 10, 2026. It was first mentioned in public on June 18, 2026, in a low-key post on Bluesky. The October 26, 2026, push brought it to 119 commits. Those were split by area: the 2.1 client, the proxy, the boot disk, the tests, the MCP server, the docs and the programs. Then came the network driver's ring check, the stall reports and the TriPeaks source. The license is MIT.

bobbin-ai is a fork of Micah Cowan's Bobbin (MIT). Eighteen commits sit on top of the upstream code, from January 3 to October 26, 2026: screen export, the control socket, multiple clients, a headless mode, pause and resume, 16-color double hi-res capture, breakpoints, vertical-blank timing and a realistic emulated Uthernet II network, with switches that corrupt it on purpose for testing.

The IP65 network library is a git submodule. This project's fixes to it (TCP checksums, the receive-ring check, resend and ACK fixes) are kept as a patch file in the apple2agent repository, so the upstream code stays as it is.

TriPeaks Solitaire on the IIe's monitor: three peaks of face-down cards drawn as ###, a row of face-up cards in inverse video, 'STOCK ### (23)', 'WASTE 6H', and the controls '<- -> SELECT, RETURN PLAY, SPACE DRAW, N NEW DEAL, ESC QUIT'.
RunningTriPeaks on the real IIe. ESC goes back to the agent.

What went wrong

The emulator said yes. The Apple II said 2002-

Most of the bugs that mattered shared one pattern: something passed in the emulator and failed on the real machine, or passed only because the emulator was kinder than reality.

Every new disk crashed the real IIe

The first boots of the new disks on the IIe dropped into the monitor at 2002-: ProDOS started, then jumped into what it thought was AGENT.SYSTEM and found nothing there. Bobbin booted the same disks without complaint. The cause turned out to be the ProDOS 2.4 kernel (its first release). Two test disks went onto the card together, copied the same careful way: the agent on the January ProDOS 1.9 disk booted, and the same agent on ProDOS 2.4 crashed. So did the unmodified stock 2.4 disk, while the machine's other ProDOS 1.9 and 2.0.3 disks boot. Along the way, the disk tool that built images from scratch turned out to be corrupting the last 232 bytes of the ProDOS kernel.

Fix · The boot disk is now a copy of a ProDOS 1.9 disk that had already booted that machine, with the agent added by AppleCommander. A build check confirms the agent is the first system file and reads back byte for byte. ProDOS structures are no longer written by hand.

The SD card served the wrong data

A Floppy Emu reads each disk image as one unbroken run of clusters on its FAT card, and a plain file copy on macOS can split an image into pieces. The adapter refused one such image with "file not contiguous". Worse, an image that reads back as zeros partway through produces the very same 2002- crash in the emulator, so from the Apple II's side a bad copy and a bad kernel look alike. That's why the ProDOS 2.4 test above used images copied the careful way.

Fix · A copy tool that allocates the whole image in one piece and verifies it, a checker that walks the card's FAT chain, and a diagnostic disk that checks every block against build-time checksums.

The first deploy to the IIe lost a packet

TriPeaks stalled halfway through its download, then ran with ?SYNTAX ERROR IN 100. Bytes were being garbled somewhere between the network card and the CPU, and IP65 never checked TCP checksums. A garbled byte in the data broke a packet, which was dropped, so part of the program never arrived. A garbled byte in a TCP header moved the acknowledgment point past what the Mac had sent, a stall neither side recovers from, with 12K stuck in the Mac's send queue.

Fix · TCP checksums in IP65, plus a Bobbin switch that garbles segments on purpose. The old agent froze on its first deploy with that switch on; the new one passes all 30 end-to-end checks with every 5th segment garbled.

One misread length froze the connection

With checksums on, the connection still stalled twice while TriPeaks was rebuilt. The watchdog recovered it both times. The cause was the receive ring: one bad frame length, and every frame after it is misread until the chip is reset.

Fix · The ring check, a Bobbin switch that misreports frame lengths, and stall reports that arrive with every /RESYNC.

Neither fix explains why the bytes go bad in the first place. Ethernet frames carry their own CRC, so a frame damaged on the wire would normally be thrown away before the Apple II ever saw it. That points to something on this machine: the Uthernet II card, its slot, or the bus timing between the W5100 and the 6502. That fault hasn't been found yet. The checksums and the ring check let the agent survive it; they don't cure it.

The emulated network was too polite

The first virtual network sent small segments. With a realistic host sending 536-byte segments, it turned out the agent acknowledged only the low byte of any segment of 256 bytes or more. In the emulator, which runs unthrottled, a 28K deploy took 48 seconds instead of about one. With the fix, and the emulator held to a real 1 MHz, the same 28K now loads in about 6 seconds, roughly 4.7K a second. It hasn't been timed on the real IIe yet.

Fix · The ACK bug, and an emulated host that behaves like a real one. The project's rule since then: if something passes only with small segments, it's broken.

Claude was testing against a fast-forward

Bobbin's simple mode runs unthrottled, about 40 times real speed, so Claude was tuning game speed against a fast-forward. It also sent RETURN for the down arrow, which had Claude writing games that accepted both. And test memory started out zeroed, which hides a whole class of bugs.

Fix · Test runs at a real 1 MHz, keys as the //e's own codes at a typist's pace, and memory filled with junk before every launch.

A big request produced nothing

Asked for a large game, Claude spent its first turn planning the whole thing and ran out of output (64K tokens) before writing a line. After 12 minutes the loop gave up with MY REPLY GOT CUT OFF. Separately, long thoughts showed only THINKING 7M for minutes, because that thinking-display setting returns no text for the up-front reasoning.

Fix · 128K of output, a retry with a note to plan briefly and build in pieces, and summarized thinking cut to three lines a paragraph.

80 columns had never worked

The 80-column mode from February 2026 sent text through the 40-column ROM routine, so every other column showed leftover auxiliary memory.

Fix · The agent's own 80-column screen code, described above.

Smaller ones

  • Once the everyday proxy answered discovery, a test's emulated Apple II connected to it instead of the test's own proxy. Each test now has its own discovery port.
  • Bobbin's simple mode set its standard input to non-blocking, and a copy that inherited the MCP server's input crashed the MCP server. Child processes now get their own input.
  • The keyboard hook ran TSX to see who was asking, which wiped out GETLN's place in the line. After /EXIT, every line at the ] prompt was a ?SYNTAX ERROR.
  • /PORT always set port 0, because two variable names pointed at the same byte.
  • Requests were silently cut off at 120 characters.

Known rough edges

What hasn't been done or tested

Problems can be reported on the apple2agent issue tracker.

By the numbers

As of October 26, 2026

119commits in apple2agent, Jan 25 – Oct 26, 2026
18commits on top of Bobbin, Jan 3 – Oct 26, 2026
5,863lines of 6502 assembly in the client
16,712bytes in AGENT.SYSTEM
46,848bytes for a program on a 128K IIe
14program versions deployed, Oct 20–26, 2026

Programs Claude built and deployed in October 2026, by request: a times table; Breakout in hi-res and Snake in lo-res with sound, both in machine code; an Applesoft hi-res sketch; Galaxia, a hi-res space shooter in machine code; Lander; The Haunted Castle, a text adventure; and TriPeaks Solitaire, the first of these played on the real IIe. Every deployed version is kept in the repository. In February 2026, Dungeon of Doom, a text RPG, served as an early test case.