Repository navigation
Releases: monotio/agi
Release list
AGI IS HERE 1.2.5
AGI IS HERE 1.2.5
Fidelity to the original interpreters on PC, Amiga and Apple IIgs, in both look and behavior: palettes, fonts, menus, dialogs, pointer, sound and timing per platform. The CHANGELOG has the player-facing list. docs/fidelity.md records each finding with build, binary hash and addresses, and its coverage table records the evidence for each aspect on each platform.
Changes from the owner's review
- Upgrades (F1–F3). Opening an older project makes one History step, "Updated for 1.2.5": room memory, unknown-word replies and the VIEW rebuild together. A conventions stamp in the project records which rules it was examined under, so History labels no longer decide. Imports and copies keep it. Word feedback gets a static hint to count words from 0.
- VIEW mirror (F4, F5). Cel orientation reverses once, at the blit.
show.objno longer inherits a shared actor's mirror, and VIEW authoring follows the selected profile's alias capabilities. - Sound state (F6). Released 2.001 booter-sound checkpoints restore through a migration at the restore boundary. Released replay fingerprints stay byte-identical outside booter playback.
- Input owner (F7, F8, gamepad focus). One owner per right-button gesture, settled at the press. A gamepad follows keyboard focus, and a fire button held across the handoff stays stale. The PAL Amiga label reads "Original proportions".
- Polish (F9, F10). The format table and the fidelity ledger are corrected, and the MAME guard compares against the repository root.
- Pre-existing debt. SetLoop/SetCel no longer mutate orientation; the guided ghost uses the game palette; the message preview follows the running game's picture row; the admission preflight has a candidate test; the gamepad follows host focus.
- Pending-edit recovery. A failed recovery opens the last saved game, and the edits stay available as "Download pending edits".
- Whole-change review fixes. A VIEW repair survives reopening with a broken room draft; no automatic write lands over pending edits; copies and exports keep the update pending.
- Terminology. One word per concept: VIEW editor, PICTURE editor, actor, ego and hero, Priority. A glossary in
src/vocabulary.tsis checked by tests and by the Terminology table in CONTRIBUTING.md.
Changes from the second review
- R1, import preview. An older busy-opening game, public or private, stamped or not, now passes the import check and plays; the preview worker receives only the resource files, words, profile and the room-memory flag. Test:
app/test/script-size-migration-session.test.ts:597(also:535),app/test/game-preview.test.ts:13,app/e2e/legacy-import.spec.ts:13. - R2, stale VIEW source. A VIEW rebuild runs only when the stored source still matches what 1.2.4 would have built; otherwise the creator's picture stays and the source waits, inactive with its notice, until the creator chooses it. Test:
app/test/script-size-migration-session.test.ts:688,app/test/view-migration-session.test.ts:43. - R3, edition identity. Importing an archive no longer merges games with different room-memory behavior, in either order; equivalent contracts still merge, and a raw reimport keeps the stored game and its progress. If the matched edition is deleted between preview and import, nothing is written and the check repeats. Test:
app/test/game-library.test.ts:1197,:1297,app/e2e/legacy-import.spec.ts:67. - R4, automatic writes. The pending-edit check now runs inside the storage write queue, just before the durable write, so an automatic update cannot land over another page's journal. Creator writes are unchanged, and the update runs once on a later open. Test:
app/test/script-size-migration-session.test.ts:1133,app/test/project-commit.test.ts:228,app/e2e/project-journal-ownership.spec.ts:229. - R5, stale gamepad fire. A fire button held across the focus handoff stays quiet on late release and on return, with a fresh press working, on Amiga, PC and IIgs. Test:
app/test/worker-joystick.test.ts:337. - R6, delayed room menu. A Create right press whose context menu arrives after Play begins is consumed without a room action, also when the player returns to Create first. Test:
app/test/play-right-button.test.ts:55,app/e2e/create-play-right-button.spec.ts:341. - CHANGELOG. It now says only the released unknown-word fallback is upgraded; customized feedback gets a reminder.
Decisions to confirm
Each of these changes an existing test's expected behavior or a product rule. The first group is new since the owner's review.
Orientation and recovery
- Mirrored orientation (
test/priority.test.ts:234,[1,2]to[2,1]).- Before: selecting shared loops 1 then 2 in one LOGIC pass reversed the row at each selection, giving
[1,2]. - After: the row reverses once, at the blit, giving
[2,1]. - Evidence: F-VIEWS-01 in
docs/fidelity.md(2.936 InsertObj calls MirrorCell; SetCel does not). - Compatibility: a recording that selects loops twice in one pass may draw a different facing.
- Test:
test/priority.test.ts:234,test/view-mirror-boundary.test.ts:124.
- Before: selecting shared loops 1 then 2 in one LOGIC pass reversed the row at each selection, giving
- Failed pending-edit recovery.
- Before: a journal that failed to replay blocked the open.
- After: the last saved game opens and the edits are offered as "Download pending edits". Only failures that repeat leave a lasting marker; temporary ones (storage errors, a failed module load after a deploy) retry on the next open.
- Evidence:
workspace-save-recoverybrowser spec checks the notice, the download bytes and one project-update entry. - Also: while unrecovered edits for a project are pending after a temporary failure, the app makes no automatic writes to that project, including the "Updated for 1.2.5" step. The check runs inside the storage write queue, just before the durable write, not in the session; a skipped update leaves the project unchanged and runs once on a later open. The creator's own edits still save, and if they conflict with the pending edits, those stay downloadable.
- Compatibility: the journal bytes are kept unchanged.
- Test:
app/e2e/workspace-save-recovery.spec.ts:758,app/test/script-size-migration-session.test.ts:1000,:1133,app/e2e/project-journal-ownership.spec.ts:229,app/test/project-save-journal.test.ts.
- Unsaved 1.2.4 edits with a mirrored JSON VIEW source.
- Before: they replayed after an upgrade.
- After: they are download-only (the owner's lean-migration decision; a release-notes line).
- Evidence: the VIEW rebuild rewrites the source those edits were made against.
- Compatibility: nothing is lost; the edits download as a ZIP.
- Test:
app/test/script-size-migration-session.test.ts,app/e2e/workspace-save-recovery.spec.ts.
app/test/project-save-journal.test.ts, "commit lands, then the callback throws".- Before: the case rejected.
- After: it replays, because the open must not block.
- Evidence: fail-first run with the six recovery cases red before the change.
- Compatibility: the committed write is never applied twice.
- Test: the same case.
- Unstamped re-exports (
app/test/archive-formats.test.ts:97,app/test/project-formats.test.ts:55).- Before: re-exporting a released Game or Project backup that carries no conventions stamp wrote no conventions, and an earlier draft expected an inferred version 1.
- After: both write the optional authoring-conventions field at the same version, as pending version 0, so the one-time "Updated for 1.2.5" step still runs after a copy, export or reimport. A file that already has a stamp keeps it.
- Evidence: the released archives in
app/test/formats/read unchanged; the tests assert every released field is preserved. A copy of an unstamped remix with a mirrored JSON VIEW reopens with one VIEW update and its original boot unchanged. - Compatibility: additive; older files parse by omission. Released bytes and fixtures are unchanged.
- Test: the two tests above,
app/test/script-size-migration-session.test.ts:1067.
- Customized boots and undeclared checkpoint capacity (
test/script-size-migration.test.ts, around line 253).- Before: the comment and string cases still inserted
script.sizeinto a partly customized LOGIC 0 boot, and a checkpoint with no declared buffer on an unmigrated boot resumed at 200. - After: only a boot that exactly matches a released template is upgraded; a customized boot is left unchanged and gets a static hint in Game updates about counting words from 0, with no automatic edit. A checkpoint with no declared buffer resumes at its saved capacity, 50, unless the host adopts a declared size. Projects marked as legacy keep their released 200 from boot.
- Evidence: the owner's decision to upgrade exact templates and show a notice for the rest. Actual released boots still upgrade despite layout or comment differences;
test/fixtures/released-templates/holds verbatim tagged blobs. - Compatibility: a player with an old project that customized its boot sees the notice and the project is not edited; that project keeps the 50-pair buffer until the creator adds the call. Saves keep the capacity they recorded.
- Test:
test/script-size-migration.test.ts,test/legacy-room-memory.test.ts,test/project-conventions.test.ts.
- Before: the comment and string cases still inserted
- Mirrored loops in VIEW preparation (
test/view-preparation.test.ts, around line 613).- Before: a mirror of a mirror, or a mirror beyond the selected profile's alias range (loop index 4 on 2.230, loop 8 on the 8-loop mask), was refused with "pixel-flipped independent copy".
- After: the preparation writes a pixel-flipped copy of the cels for the requested facing, so the loop is made instead of refused. Successive reversals are exact, and the test checks 2.001, 2.411, 2.230 and 2.936. The 15-cel limit of packed profiles still errors.
- Evidence: F-VIEWS-01 in
docs/fidelity.md: MirrorCell rewrites th...
AGI IS HERE 1.2.4
1.2.4
Game tests become documents the creator owns, like unit tests: you can record and keep them without an AI key, and they never block a game edit. The release also fixes room re-entry and the compact Create layout, and makes the browser suites run each rule once. The CHANGELOG entry is the player-facing summary.
Not in this release: a Tests panel for running tests and seeing results without the Agent. There are no opcode-fidelity changes. Host-side room re-entry, an editing operation, does change (see Re-entry below).
Player-visible changes
- Game tests as project documents:
- Recording a test needs no AI session. Saving tests doesn't run them, and a test may name rooms and words the game doesn't have yet, so you can write the test first.
- Tests never block an edit. Deleting a room offers "Also delete tests that use this room", checked by default; the dialog names the room and counts its tests.
- Agent writes and hand saves merge by test name. Review shows what Apply will change: the creator's current test as Before and the merged result as After. If a reviewed test changes before Apply, review refreshes and asks again.
- Agent finish:
- The Agent may finish with red tests only when it gives a reason for each failing test, and for each existing test it changed or deleted.
- The reply opens with "N tests fail: …" or "All N tests pass." and lists
test: reason. Review shows the same lines. - A test edit the creator asks for is proposed for review, with the old and new room, steps and checks, and needs Apply.
- A turn that hands nothing over runs no check. Stop notices name their cause.
- Re-entry:
- Returning to Play checks changed art, and Show Room covers pictures and views used by other rooms.
- Deleting the room the game is in restarts from the beginning instead of offering a restart into the deleted room.
- "From the beginning" names no room.
- Pausing the moment Play starts a game keeps it for Undo rewind; a game still starting says so.
- Layout and notices:
- With the Agent open, Create is compact: Parts folds beside the Agent and comes back when it closes, at any width.
- Notices hold while the pointer or focus rests on them. Loading notes show while a part or the project opens. A dialog the app reopens stays open.
- Progress: a checkpoint is stored at once while only chat, notes or tests are saving, so closing the tab keeps the player's position. A pending game edit still waits for its commit.
- Browser and GPU fixes:
- A page keeps one GPU stage however many games it opens; before, every game load leaked a WebGL context.
- After a lost GPU context, or with no GPU, Play and the message preview show the flat picture instead of black.
- AI settings and Connect AI work while the Agent opens. Notes typed while a catalog game opens are kept. The rename box takes focus, so typed keys rename the symbol.
Gates for this head
- Full local gate at 4a8da39, the same product code before the release commits:
npm run check, build, bundle and production; Chromium (1126 tests); Linux WebKit desktop and phone (452 tests); perf; and the changed browser specs ×10 beside the full suite. - Walkthroughs:
npm --prefix app run e2e:walkthrough-fullpasses 11 of 11 whole tapes with local fixtures at 4a8da39. - Since then (test review, rewind before the first cycle, comments, changelog): typechecks, lint, Prettier and the affected unit files pass, including the engine suite (3412) and the worker and history tests (458). Every browser spec that exercises Agent review (155 tests) and every history-timeline spec (32 tests) pass in Chromium; the new review spec passed 5 of 5 repeats and the rewind spec 30 of 30.
- Full local gate on this head:
npm run check, build, bundle and production; Chromium (1127 tests); Linux WebKit desktop and phone (452 tests); and perf pass. The changed specs ×10 beside the full suite passed 379 of 380. In the one failure, the browser page for "saved reviews reopen with previews and detect a changed base" stopped responding during reopen, before the Agent panel mounted. Its trace points at a stalled browser process, not at the app. The failure did not recur in about 820 runs of that test and of the gate's stress combination, including runs under added CPU load. In the first pass,split-wipecould not launch because the local Chromium build was missing. It passes after reinstalling Chromium.
Decisions to confirm
Each line changes or adds an expectation the player sees, followed by the test that now protects it.
Game tests are documents
-
Tests never block a game edit: deleting a room keeps the tests that enter, expect or
wait for it, and unreadable tests, instead of refusing.test/project-edit.test.ts:94,
test/project-removal.test.ts:217and:250,app/test/project-removal.test.ts:290. -
Deleting a room offers "Also delete tests that use this room", checked by default.
app/e2e/parts-delete.spec.ts:183. -
The delete dialog asks "Delete Room 1?" and shows the test count, instead of "Delete room 1."
app/e2e/parts-delete.spec.ts:181. -
A reviewed room move no longer refuses a recorded test whose saved resource stays behind; the
recorded setup is kept byte for byte.test/project-renumber.test.ts:478. -
Write tests first: a test may name rooms, words and commands the game does not know yet; the
real parser checks commands when the test runs, not when it is saved.
test/game-tests.test.ts:291and:398. -
Saving tests does not run them; the first explicit run produces the first verdict.
test/game-tests.test.ts:528. -
A write whose affected-test rerun fails reports failure to the Agent while the write still
applies.test/game-tests.test.ts:488,test/game-test-reruns.test.ts:191,:222and:343. -
Saving a recorded test is a project document save: it needs no AI session, works while the Agent
is open or busy, and leaves the running game and an active recording untouched; the running game
holds no copy of TESTS.JSON.app/test/worker-recorded-test.test.ts:307,
app/test/test-recorder.test.ts:251. -
A recorded test refused because another tab saved first says "Changed in another tab" instead of
the Agent-turn wording.app/test/worker-recorded-test.test.ts:294. -
Hand test saves are accepted while a room answer is being delivered or a loader waits.
app/test/authoring-controller.test.ts:970. -
The history entry for a test save is labelled "Tests" rather than "Recorded test".
app/test/workspace-agent.test.ts:1512. -
The recorder's save note reads "8 game tests saved" instead of "8 game tests stored", and the
interpreter clock variables are suggested unchecked.app/e2e/game-test-recorder.spec.ts:164
and:176,app/test/test-recorder.test.ts:305. -
Apply accepts an Agent edit that makes a recorded test fail; the status reads "2 tests fail:
paint the mural, recorded mural repair" where it used to read "Handover rejected".
app/e2e/game-test-recorder.spec.ts:86and:189. -
Review of an Agent test change shows what Apply will do: Before is the creator's current tests
and After is the merged result, so a creator test saved under the same name after the proposal
shows as a change, not an addition.app/test/workspace-agent.test.ts:3731,
app/e2e/workspace-agent.spec.ts:1109. -
Apply commits only the test comparison the creator saw. If a test the review touches changed
since, Apply refuses with "A test in this review changed. Check the Tests comparison again, then
choose Apply." and opens the comparison; a name the merge leaves as it is passes, and an
unrelated test never refuses.app/test/workspace-agent.test.ts:3749,:3772,:3795and
:3812. The scripted Applies in the existing late-collision tests now pass the comparison they
saw::2951(four variants),:3587and:4096.
Agent finish
- The Agent may finish with red tests when it names each one with a reason; a finish
without reasons is refused, and unimplemented exits still block.
app/test/workspace-agent.test.ts:37(six cases),app/e2e/workspace-agent.spec.ts:66,
evals/fixtures/bad-cases/project-agent-failed-finish-tests.json:57. - A changed or deleted creator test also needs a reason, and review shows the old and
new expectation.app/e2e/workspace-agent.spec.ts:1111,test/game-tests.test.ts:1343. - A turn that hands nothing over runs no test check; the Agent just answers.
app/test/workspace-agent.test.ts:4002. - The
finishtool takestestReasonsand no longer takesnotes; a reason given in prose alone
is refused. Mechanical in every fixture; the rule in
evals/fixtures/bad-cases/project-agent-test-reason-in-prose.json. - A refused handover is shown in the chat as a reply with the cause; it no longer rejects the
creator's conversation.evals/tests/project-agent-replay.test.ts:30,
evals/fixtures/bad-cases/project-agent-failed-finish-exit.json. - Auto-approve applies game edits and new tests; existing test edits need review. Title copy at
app/e2e/workspace-agent.spec.ts:247. - Stop notices name the cause: "The agent ended its turn without a reply or a change. Ask again,
or describe the change differently."; "The agent ended its turn without an answer. Ask again.";
"The agent finished without changing anything. …"; "The agent stopped after this error: … Ask
again, …"; "The agent declined this request."; the Ask length limit ends with "Ask a shorter
question."app/test/workspace-agent.test.ts:328,:339and:378,
app/e2e/workspace-agent.spec.ts:459,evals/fixtures/bad-cases/project-agent-empty-reply.json:20. - While the Agent opens and the game does not answer, the notice reads "The game did not answer.
Reopen the Agent to try again." instead of the raw worker error.
app/test/authoring-controller.test.ts:2751.
Launches and restart
- "From the beginning" names no room: the...
AGI IS HERE 1.2.3
1.2.3: applied changes show at once
Since 1.2.1, an Agent change in Create reported Applied but nothing changed on screen. Returning to
Play showed the old room. This patch brings back the 1.1 behavior for the unified conversation and
extends it to Play. It also adds a check that fails any browser test leaving the page and the game
disagreeing about the pause.
What changes for players
- A change shows at once. When an applied change touches what the current room uses (its LOGIC,
a loaded LOGIC or VIEW, the picture on screen, or a VIEW stamped into that picture), the room
starts fresh so its entry code runs the new version. Score, inventory, flags and variables carry
over as on any room entry; the room's own entry code runs again and may change them. The hero
keeps walking in the same direction, as in the original interpreters. Changes to anything else
apply when the game next uses them. - Quick edits all land. Undo and Redo can send several edits before the game runs a cycle. A
picture or VIEW edit the screen cannot take while a room restart is still to run waits for it,
and the page retries it; each edit then reaches the running game. - A change that entering the room cannot show asks for a restart. A room can keep the previous
room's picture, draw only once under a flag or on a later cycle, or lose its drawing code to an
edit. When a change needs a room entry to show, a detached copy of the game enters the room on
the new files first; the change is admitted only if that entry draws a whole picture. Otherwise
it asks for a restart and the game keeps its bytes, instead of reporting Applied over the old
screen. - Play catches up. Returning from Create starts Play's room fresh when Create changed what that
room uses, with a note: "Room 1 started fresh with your changes." This holds when the old picture
cannot be rebuilt on the edited files, such as a stamped VIEW that lost the frame it showed: Play
keeps the player's progress instead of asking for a restart from the beginning. - Play saves the edited game. Play saves its progress as soon as the edited game has drawn. A
periodic save no longer waits behind the cycle report when a busy browser runs the timer late. - The page owns the pause. Play, Back, From my game, Restart, a project restart and Take control
follow the pause the page shows. The worker keeps the page's last pause message across run
replacements; a replay keeps its recorded pause separately. - The Agent pauses Play, never Create. An Agent panel opened in Create and kept open into Play
now pauses the game, as opening it in Play does. In 1.2.2 the game ran on while the panel held its
keyboard: Play looked frozen, the switch still said "Keys go to the game", and clicking the game
did nothing. Back in Create the game runs beside the panel again, so applied changes show. - A fresh room runs under a pause. A room that starts fresh for a change does so even while
the game is paused, then waits. The change shows, and Play's progress is saved, with the Agent
still open. - The play bar tells the truth with the Agent open. While the Agent holds Play, the bar offers
Resume, which closes the Agent and plays on, instead of a Pause that did nothing. However the
Agent closes, the game takes the keyboard back. - Reviews show only what changed. An Agent edit to an imported game's LOGIC was diffed against
an empty file, so every line looked new; both sides now read as the LOGIC editor shows them. - One action, not one button per item. In a VIEW review a cel opens itself in the editor;
each changed part has one Open icon; a suggested command is itself the button that types it;
named checkpoints and figure rows use icon buttons named for their item. - Notices close by themselves. "Saved as your own copy" and "Room N started fresh" close after six
seconds, and stay up while the pointer or focus rests on them. - The Agent sits beside the game in Create. The drawer floated over the workspace's right side,
hiding about a third of the game and the editor at 1063 to 1920 px wide. The workspace now keeps
the drawer's width free; on a phone the drawer still covers the sheet. - Show Room N. An applied change to another room's LOGIC gets a button on the result card that
takes the hero there. Back now sits beside the room name, out from under the drawer. A Show that
finishes saving after the player left Create, or after another run took over, does nothing. - Plain mode name. The Agent tells players to switch to Create to apply a change.
- Release names. An installed older release of a catalog game is named by its release, such as
"Adventure Department 1.0", and keeps its own card. Older releases are never folded into the
current one. - Less repetition. The SOUND and Launches editors no longer repeat their tab's name as a heading.
Decisions to confirm
These change what existing tests expected or how the app behaves (AGENTS.md, Tests and evals). The
owner approved all eight.
- An applied change the running room cannot take in place (a loaded VIEW's new loop layout, a VIEW
stamped into the picture) re-enters the room at once, instead of offering Re-enter room
(worker-project-restart,project-restart.spec.ts). - The checkpoint after an applied change that re-enters the room is taken at the first boundary
after its entry pass, not in the same call (worker-project-session,worker-project-restart). - Play, Back, From my game and Restart follow the page's pause, not the pause captured when Create
opened (worker-create-return). - Returning to Play after a change to its room shows that room's entry message again, as entering
a room does (agent-game.spec.ts). - Approving an Agent change shows the room's new entry message before the player types anything.
The room restarts as on any normal room entry, and the message comes from the room's own entry
code; the engine adds nothing. The export test now closes that message, then checks thatlook
answers from the changed room (game-zip.spec.ts). - An open Agent pauses Play, never Create, however it opened. A panel opened in Play and kept open
into Create no longer keeps Create paused, which held back an applied change's room restart.
With the Agent still open, Play's restarted room enters and saves, then waits paused until the
Agent closes (agent-conversation.spec.ts,workspace-agent.spec.ts). - In Create, the Agent drawer takes its own width beside the workspace instead of floating over it.
This replaces a deliberate overlay meant to keep the editor's width, which hid the editor's right
side as well as the game (agent-drawer.spec.ts,workspace-layout.spec.ts,
workspace-agent.spec.ts). - Returning to Play after Create changed the room's own LOGIC, which had resumed from
scan.start,
starts the room fresh on the new code and keeps the player's place. Before, Play refused and
offered Restart from the beginning (run-owner.spec.ts). A LOGIC changed while a message waited
still refuses (run-integrity.spec.ts).
Holistic review (Fable lane)
A separate reviewer on another model read the whole change and drove Chrome journeys as a beginner
and an expert, with real Agent turns ($0.59): tutorial edits, Agent changes in Create and Play, the
King's Quest I alligator, Show Room and Back, quick Undo/Redo, compact and wide windows. Verdict:
merge-ready. It found the interpreter still takes its own new.room path for every re-entry and the
trial engine detached, and asked for one fix (the play bar while the Agent holds Play, done above)
plus plain restart copy and a stale "Updated · … restarted" note, also done. Its code-shape
suggestions (one re-entry path, a reactive mode for the Agent hold) are 1.2.4 follow-ups.
What was wrong before this candidate
An outside review of the first candidate and a browser trace found the causes of its three browser
failures:
workspace.spec.ts(two tests). Three quick redos each restarted the room. An edit that
arrived before the previous restart's entry pass found no drawing record for the screen, so the
engine refused the picture or VIEW change. The game stayed on the older version, Play resumed on
it, and the page correctly refused to save it as the edited project. The engine now accepts a
swap while a host room entry is pending, because that entry draws the room from the new files,
and a pending entry is not restarted again.game-zip.spec.ts. The change now shows at once, so "Remixed room one." was already on screen
when the test typedlook; Enter closed that message, andlookwas never sent. The extra pause
report after each run replacement only changed the timing. It is removed: the pause check now
asks the worker in its state query instead.
The first CI run of this candidate failed two browser tests:
agent-game.spec.ts, in-game ZIP export. Returning to Play restarted room 2, whose entry
message parks the game. Play saved at that cycle, and no later cycle came. The test helper
savePlayProgresswaited for a save after the frame's cycle, which it read after the Play reply;
on CI the entry pass had already run. The helper now waits for any save stored after Play
resumes. A one-second delay before the frame read reproduced the CI failure with the old helper
and passes with the new one.ai-settings.spec.tson WebKit. The trace shows the page making no requests for four seconds
while WebKit parsed the 3D renderer module on a cold dev server, so room 1 missed the 5-second
poll; the game kept running and the pause check agreed. The 30 catalog boots that polled for room
1 now use the existing cold-boot wait,waitForRoom(page, 1, { coldBoot: true }).
A third outside review, of head 95966a50, found that R1 and R3 were only partly fixed a...
AGI IS HERE 1.2.2
Original Sierra games can now be edited, MIDI exports sound like the game, and errors say what happened in plain words. Dependencies are refreshed to their latest releases.
Editing original games
Edits to King's Quest I and IV, Manhunter 1 and 2 (DOS and Amiga), Space Quest II (DOS, Amiga and IIgs) and Space Quest I for the Amiga were refused with messages such as "Candidate source claims do not reproduce the candidate's native bytes". Each game ships records nothing ever loads: directory entries past the end of a volume, entries pointing into other records, filler entries, and logics that load or enter logics the release never shipped. None of these is a misreading on our side; docs/testing.md "Fixture notes" records the evidence.
Authoring now records what the base game already had and refuses only damage an edit introduces. Pre-existing defects carry forward byte for byte, a no-op yields zero changes, and the Agent names them calmly ("Two sounds in this game (215 and 216) cannot be read, so they stay as they are."). A room exit to a missing room that a game already had now warns in Problems instead of blocking every edit; a new one is still refused while room generation is off. Refusals name the cause and the next step.
Authentic MIDI export
MIDI export rounded each note to the nearest A440 semitone. King's Quest I's theme sits about 48 cents off A440, so 53 of its 233 notes landed a semitone off their neighbours. Export now keeps each sound's own tuning: note names share one offset, a pitch bend per note plays each chip divisor's exact frequency (within 1 cent), and our files re-import to identical divisors. Sounds with raw events export with those events silent and a notice instead of being refused.
Plain words, no silent endings
- Provider failures (key, permission, credit, rate limit, unavailable, model, request too large, offline, timeout) map from the SDKs' error classes and status codes to one plain sentence with a next step, in the agent panel, Create with AI, room building and image Generate. Raw text stays in Activity.
- When a tool batch ends in
finishafter an earlier call failed, the finish is refused and the model reads the failure first, in the workspace agent, remix, room building and genesis. A turn that ends with no change and no reply says so; the spend label reads "Usage not reported" instead of staying on "Usage pending". - The recovery notice now reads "Some edits were not saved because this game changed in another tab or window. Download them to keep a copy, or discard them."
Saving
- Conversations in installed games are journaled before the IndexedDB write, so an answer survives a tab closing before the save commits. The journal reuses the project journal's Web Lock ownership; diverged chats from two tabs are both kept.
- Attaching reference art saves through the open project session. Before, it raised the stored generation behind the session, which paused editing and disabled the Agent composer.
Reliability
- LOGIC completion resumed with a command that does nothing while the previous list is on screen; it now calls the suggest controller directly.
- An automatic code-action refresh could cancel an explicit Quick Fix request in Monaco 0.57; a guard lets the explicit request answer first.
- ROOMS rows briefly lost analysed entries after each commit, so a click could start and end on different rows; rows keep the last complete analysis until the new one answers.
reserve_namebatches and disk-image import reservations are all-or-nothing.- The deploy check asserts every security header configured in
staticwebapp.config.json; the live site sends all six exactly. - Test helpers escape every occurrence (CodeQL
js/incomplete-sanitization,js/bad-tag-filter).
Models, dependencies and CI
- Claude Haiku 5.5 joins the Anthropic models. Prices describe a long-context rate card, and Haiku requests leave out
fallbacks, which it does not support. - Dependabot #77–#80 are folded in, and every dependency is at its latest release except TypeScript (7.0 has no JS API yet for typescript-eslint, vue-tsc or dependency-cruiser) and vue-tsc 3.3.11 (3.3.12 types non-reactive template
letbindings asnever, vuejs/language-tools#6237; Dependabot skips it).actions/setup-node7.1.0, and the composite setup's cache restore now matchesactions/cache6.1.0.@ast-grep/cli0.50.0's postinstall is allowed under npm 12. - Startup JavaScript and worker budgets rise to 1.2.1's measured size with about 2% headroom.
Documentation
README is an overview; the editor tour moves to docs/create.md and the AI co-author to docs/ai.md. AGENTS.md and CLAUDE.md follow current Anthropic and OpenAI guidance for instruction files: one statement per rule with its reason, a definition of done, and pointers to the documents that own procedures. docs/hosting.md describes patch releases without a back-merge and rollback as a forward deploy. Two screenshots shrink from 516 KB and 511 KB to 5 KB and 3 KB with identical pixels.
Validation
npm run check: 3,357 engine, 2,599 app and 104 replay tests pass with zero skips; production build and bundle boundaries pass; timing budgets 11/11.- Linux WebKit in the CI container: desktop 434 passed, phone 788 passed (fixture-gated skips only), after the one regression below was fixed and its spec rerun (12 desktop, 24 phone).
- Chromium: 1,189 passed under a heavily loaded parallel run. Five failures passed alone at two workers; the room-generation spec expected the old raw error text and is fixed (
b33675b2). Twotutorial-continuitytests fail the same way onmainon a machine with local game fixtures, which add extra tutorial cards; CI has no fixtures. - Every new test, eval case and spec was seen failing before its fix. New fixture-gated tests cover editing and MIDI export across every local game fixture.
Playtest
Open King's Quest I in Create and ask the Agent to change a room's description; the notice lists the sounds it carries forward. Export SOUND 0 to MIDI and play it. Attach a reference image in Create and keep editing. With an invalid API key, ask the Agent something.
🤖 Generated with Claude Code
AGI IS HERE 1.2.1
Play questions could fail edit validation, and Play and Create used separate conversation surfaces. They now share one controller, conversation and composer. Play keeps read-only game authority; Create can answer or propose coordinated edits. Conversation saving persists chat independently of resource changes.
Native picture, VIEW, audio, LOGIC and command widgets keep results compact. Each captured resource retains the bytes and rendering dependencies from its own native or draft read, including vocabulary, so mixed inspections remain faithful after serialization and reload. Native inspections also produce widgets in ordinary Create requests. Captured versions open separately from the current-resource action.
Captured previews retain only dependencies needed by the inspected resource. LOGIC reads omit unrelated image attachments; traced pictures keep their own image assets. New captures omit the redundant aggregate snapshot, while older saved conversations remain readable. Provider/model handoffs project conversational text, resource identifiers and semantic tool outcomes, excluding preview workspaces, images and binary read windows, including migrated conversations. Undo, Restore, approval and interruption records keep their chronological meaning and associated answer identities. In the real 512×512 image fixture, five unrelated LOGIC reads retain zero attachment copies (1,751 result characters); switching models after a legacy save/reload sends 1,027 characters.
An accepted edit advances only its task-owned runtime revision; live inspection continues after auto-approval while foreign revisions, replaced workers and project changes remain rejected. AI settings wait for an already requested authoring load and reject changed ownership before publishing. Home settings remain immediate. Closing Agent releases its pause during initialization and retires delayed completions without cancelling a running task. Close/reopen and lazy-load failures recover cleanly. Help → Remix preserves an already-open conversation and unfinished draft.
LOGIC completion resumes after typing supersedes a pending language request, using the current cursor and replacement range. Escape, cursor movement and retired editor ownership prevent reopening.
Recovery retains answers, drafts and saved projects. Follow-ups join at completed tool-batch boundaries, opening restores composer focus while respecting a newer control, and blank-project first-room handoffs retain stage ownership. Installed-game conversations have no crash journal; abrupt termination before IndexedDB commit remains outside the recovery guarantee.
WebKit reliability and CI cost:
- Pin Playwright 1.64 and libsoup 3.6.6, with a native-library guard that rejects the vulnerable bundle. The failed trace recorded a WebKit network-process crash and Vite reload, matching the upstream fixed use-after-free; no native stack was captured, so its exact crash site remains unproven. WebKit failures block deployment.
- Give browser jobs measured headroom, refresh shard weights and start slow groups first. Individual test deadlines and zero retries remain unchanged.
- Run each applicable PR suite once. Remove automatic five-pass changed-spec burn-in and nightly triple runs; manual Browser diagnostics defaults to one pass.
- Use formatting/consistency checks for root Markdown and docs prose/media, and helper tests/formatting for explicitly covered CI helpers and weights. Runtime, dependencies, workflows, tests, mixed and unknown paths keep full checks. Classification covers the whole PR diff and preserves renamed code deletions. Required aggregate contexts stay unchanged.
- Restore F5 Launch and 1.1 progress-migration browser coverage. The migration test waits for completed exit before reloading, eliminating the demonstrated autosave/navigation race. Preserve the requested tutorial edition in fixture and walkthrough loading despite shared vocabulary. Compare thumbnail pixels rather than Node/zlib-dependent compressed bytes.
Validation:
- Complete local fixtures: 3,319 engine, 2,549 app, 98 replay, 438 Linux desktop WebKit, 398 Linux phone WebKit and 11 timing tests pass with zero skips. Production build and bundle boundaries pass. Released archives remain unchanged.
- The migration race fails with a controlled 750ms worker-flush delay before the fix and passes under the same delay afterward; the clean scenario passes both Linux browser engines. Restored scenarios also pass three targeted repetitions in Chromium and Linux WebKit. Broader existing Chromium validation covers 1,186 cases; affected payload/settings/completion suites pass 13 Chromium and 10 Linux WebKit cases.
- All 26 CI-helper tests, repository formatting and actionlint pass. Library-version, thumbnail, released-fixture and check-selection regressions were observed failing before their fixes.
- Failure-path coverage includes replaced workers, rejected writes, second-page access, closing before commit, interrupted initialization, serialized mixed-source reads and Help Remix with an unfinished draft. Installed-game chat still has no crash journal before IndexedDB commit.
- Native model playtesting covered parser, walkability, picture, sound, story edits, Create LOGIC capture/reload and live inspection after auto-approved edits. The final seven requests reported $0.56; the all-trial ledger stayed below $2 of the authorized $10.
- Final single-pass CI: all 26 jobs pass on
7f0b816; GitHub reports the PR clean and mergeable.
Playtest: ask in Play, switch to Create with an unfinished draft, inspect and apply a picture or sound change, then reload its result. Try Auto-approve with an inspection before and after an edit. Close and reopen Agent during loading. From an open Play conversation, use Help → Creating → Switch to Create.
AGI IS HERE 1.2.0
AGI IS HERE 1.2: make your own Sierra-style adventure with the game running beside you.
Create
- One Create workspace for every part: the parts list, the running game and editor tabs side by side, one agent drawer that is always there, and one Undo across drafts and updates.
- Start from Starter, Boilerplate or Blank, or describe a game and Create with AI. A blank game opens straight into the full workspace.
- Rooms first: + adds a named room; Add ▾ puts a hero, a door, a sentence answer or a sound into the room you are editing.
- Every PICTURE, VIEW, SOUND and LOGIC is listed by type, with Rename, Change number…, Find references and Delete… in its ⋯ menu. Deleting never rewrites your code: what still refers to it shows in Problems until you change it.
LOGIC
- Named flags and variables everywhere, including the interpreter's own (
current_room,ego_in_water, …), usable directly in code. - Completion offers what each parameter takes:
sound(lists your SOUNDs,load.pic(your pictures. An unknown flag or variable offers to create it in Game state. - Format document (⇧⌥F), indentation as you type, and the final
return;written for you. - Every problem is marked where it is; Find references lists where a name is Read and Changed.
Play and debug
- One run control for the room you are editing, with Launches: named starting setups (where the hero came from, flags, variables, items, hero spot, random seed) to replay a moment, a death or a puzzle.
- Breakpoints always work; while paused, hover any flag or variable to see and change its value, with faint values beside the paused line.
- Create never changes your game in Play: leaving Create returns exactly where you were.
AI
- Bring your own OpenAI or Anthropic key. The agent edits real AGI resources and shows each change for review, or applies them as they come with Auto-approve.
- With AI rooms switched on, walking into a room that does not exist yet builds it on screen.
- A task budget counts actual reported spend and pauses after a reply crosses it.
Faithful to Sierra
- Plain AGI 2.936 output, authentic interpreter behaviour across PC, PCjr/Tandy, Amiga and more, and a fresh random start for every new game, like the original.
- Progress from 1.1 loads automatically.
Full details: CHANGELOG.md.
🤖 Generated with Claude Code
AGI IS HERE 1.1.0: Room Studio
AGI IS HERE 1.1: Room Studio. Edit every room and character by hand, with the AI beside you, in real AGI resources. Live at https://agi.monotio.com.
Room Studio
- Three lenses on one picture. Art is what the player sees, Depth is what stands in front, and Walk is where the hero can go. Every item is a few real AGI drawing steps, and a scrubber replays the picture step by step.
- Selecting and editing works the way vector editors do. A drag draws a box, a drag on the selection moves it, Shift adds, and Group (⌘G) and Ungroup (⇧⌘G) join and split items. Points are edited with the Point tool.
- Moves behave predictably. They stop at the picture's edge, and whole items move with their depth and walk lines. Edits may re-pour other items' fills; the effect is reported, not refused.
- The Walk view. Test walks run in the real engine, doors can be wired, and Play here drops you into the game. A walk can be cleared with Clear or Esc.
- Ask about this selection. The connected AI proposes a change you see before and after, with any spill-over outlined, and you accept or reject it. It works under your lens locks.
- Watch it paint itself. Share turns a picture into a clip of it drawing, or a still.
Sprite Studio
Edit characters' loops and cels with a live preview at game speed, a drawing backdrop, onion skin and mirrored loops.
Studio for everyone
- ⓘ explainers name every control in a word or two.
- A first-run tour and Help topics cover the essentials.
- Lock chips say what they hold, e.g. "Depth & walk lines".
Reference art and the AI
- Uploads reach the AI as handles. It opens the ones it needs with
view_reference, at the working size by default. You can attach art in Studio Ask. - The assistant can't propose a change that draws nothing, and it can withdraw a proposal it would tell you to reject.
- Claude Sonnet 5.5 is added beside Opus 5.5 and Fable 5.1.
- The prompt cache stays warm. Transcripts are append-only, and the tool catalog and system prompt keep a 1-hour cache entry.
- Paid evals need both
--liveand--budget-usd.
Play and history
- The World map is readable. It has an Expand view and room details in place, and the selection follows the room you're in.
- Seeking keeps what you were doing: playing stays playing, and paused stays paused.
- Start over is marked and undoable while the new run is young. It refuses rather than lose unsaved timeline.
- Exit during a game window keeps the last save point.
Trust and craft
- Saved, installed and current mean what they say (
projectTransaction.ts). Cross-tab edits and removals are handled. - Home loads no authoring code. The bundle budget measures what Home really loads: 556.9 kB of 575 kB gzip.
- The deploy check proves the live site serves this run's build: its commit and asset digests.
- Plain, short copy throughout, enforced by lint rules.
Compatibility
Released 1.0 saves, exports and history stay readable. The frozen archives in app/test/formats/ are unchanged, unknown versions are refused without rewriting, and resource and profile identities are pinned.
Release PRs into release/1.1
- rc.1–rc.7: #42, #43, #44, #45, #46, #47, #48.
- 1.1.0 QA and fixes: #49, #50, #51, #52, #53, #54, #55, #57.
Release PR into main: #56, plus the test-only hotfix #60.
Checks
The deploy is verified by build identity: the live index.html carries commit 7951f29 and every entry asset matches the CI artifact's SHA-256. The browser suite then ran against the live site. CI is green on every PR above, including four Chromium shards, the phone and desktop WebKit lanes, and the production-artifact lanes. The full local suite with private game fixtures also passes.
🤖 Generated with Claude Code
AGI IS HERE 1.0.0
AGI IS HERE 1.0 is out at agi.monotio.com: Sierra's Adventure Game Interpreter, rebuilt from scratch for the browser, with an AI co-author that writes real AGI games while you play them.
What 1.0 means
1.0 is the first public archive baseline. Saves, game exports and recorded tests written by 1.0 stay readable by every later release; the archive formats are pinned by committed fixtures that are never regenerated.
What's changed since rc.17
- Models. Claude Opus 5.5 (the default, at medium effort) and Fable 5.1; GPT-6 Astra (the default), Sol and Luna. Opus and Fable stream a summary of their thinking into the agent panel.
- Sprites as text. Agents write views as a small source language: draw a cel once, copy it and change rows, mirror loops explicitly. A malformed source fails with the line and the fix, the compiler validates every pixel, and two warnings catch a walk that never moves and a side view drawn facing front. Under the old pixel-array format, one Sol run in eight ran away; none has since.
- Limits that mean something. Every harness limit now traces to the AGI format, a provider, your budget or a runaway guard: no wall-clock verdicts or automatic pauses, retries for transient provider errors, unbounded stored tests, and reference images fitted to provider limits instead of rejected.
- Ports and profiles. Amiga and Apple IIgs copies import with their interpreters and the IIgs wavetable, and the interpreter you choose holds everywhere the game runs: play, authoring, save import and archives.
- Display. An Original 4:3 display mode, and CP437 box drawing and accented letters in the font.
- README. A new front door, with five models' castles and the story of how the engine stays faithful.
Genesis benchmark
Five model lanes built the openings of two briefs through the production authoring session: evals/benchmarks/genesis/1.0.0.
- All ten runs passed their playtests, for $10.11 together, from $0.03 (Luna) to $1.92 (Opus at high effort) per opening.
- Best sprites: Opus and Astra, with profile side views and four-frame strides. Best value: Sol, at $0.25 and $0.30: a stride in every direction, and 13 of 14 and 12 of 12 brief checks. Luna builds complete, playable openings, but thin ones.
- One run per lane and brief gives no variance; read small differences as noise. Every game is in the snapshot and can be played with Add game.
Validation
Released from main commit 05317fb (PR #39).
Main CI passed the repository gate, build, Chromium and WebKit suites, production-browser checks, deployment and deployed-app verification, each on the first attempt. CodeQL passed all three language analyses.
Locally, against the maintainer's own original game files, 1,586 engine tests, 496 app tests and 27 offline eval tests passed with none skipped: every fixture test ran, including the thirteen full-game walkthroughs replayed keystroke by keystroke.
Known limits
- Original saves: the engine writes its own save format. Reading or writing an original interpreter's
.SAVfiles is not claimed. - Font: characters outside ASCII, CP437 box drawing and accented letters show blank and are reported once in the browser console.
- Hardware fidelity: interpreter behaviour is checked against original machine code across PC, Amiga and Apple IIgs builds, not against running hardware. Pixel-exact rendering on real displays and physical clock timing are unproven, and sound is synthesized in the browser rather than measured from the chips; docs/fidelity.md lists what remains open.
- The agent: quality varies by model and by run. Agent calls run on your own API key; each task stops at its budget, $5 by default.
- Games: 1.0 ships no Sierra games. Play the classics from your own copies.
AGI IS HERE 1.0.0-rc.17
The seventeenth release candidate for AGI IS HERE 1.0 is available at agi.monotio.com.
What’s changed
- Typing on a phone keeps the game in view. The on-screen keyboard no longer shrinks the game screen. The game keeps its full size, opening the keyboard scrolls it to the top of what stays visible, and a tall keyboard no longer flips a portrait phone into the landscape layout.
- Help guide. A short guide to playing, creating and managing your games, reachable from every screen. Each topic can open the control it describes: the game's controls, the map, a hint, Remix, AI settings, Create or Add game.
- Polish. A one-row header on phones in play, Add game above the library, compact library rows on phones, one tagline everywhere, and no duplicate LIVE on the timeline.
Validation
Released from main commit d5462a8 (PR #38).
Main CI passed the repository gate, build, Chromium and WebKit suites, production-browser checks, deployment and deployed-app verification. The first attempt cancelled the production WebKit job during dependency setup, and the first deploy verification hit a CDN propagation race on an asset request. Both were re-run on the same commit without changing the gate. CodeQL passed all three language analyses.
Additional QA passed 1,567 engine tests (1 skipped), 458 app tests and 30 offline eval tests. The full Playwright suite passed after one navigation-spec fix for the new phone header. Each new test fails against a mutation of the rule it covers.
Known limits
- User imports: they drop Amiga and IIgs interpreter executables and the IIgs wavetable, so imported port copies fall back to catalog detection and the approximate IIgs sound.
- Interpreter choice: a manually chosen profile reaches playback, but not authoring tools, save import or archives.
- Display: the screen uses square pixels, and the text font is a project-designed 8×8 face covering ASCII.
The first two are fixed in rc.18, ahead of 1.0.
AGI IS HERE 1.0.0-rc.16
The sixteenth release candidate for AGI IS HERE 1.0 is available at agi.monotio.com.
What’s changed
- Amiga and Apple IIgs editions play. The Amiga editions load from their lowercase split files or
dirsdirectory: Space Quest I–II, King's Quest II, Police Quest, Gold Rush! and Manhunter 2. The Apple IIgs Space Quest II loads beside itsSQ2.SYS16. Each runs under its own interpreter profile, identified from its executable: six Amiga builds (2.082 through 2.333) and IIgs 1.014. Every profile field is read off the original handlers rather than inherited from a PC build. Shipped Amiga saves decode and re-encode byte for byte. - Click to walk. On the Amiga and IIgs editions, a mouse click walks the hero there, as the original starters do. It is gated on player control, cancelled by the keyboard or a room change, and the edge of the screen does not stop it. The 2.31x builds also latch the click for
mouse.posn, set f19 and apply theadj.ego.move.to.x.ynudge. Clicks are recorded in history and test tapes. - Sound through each platform's hardware. The Amiga plays through a model of its Paula driver, including KQ2's attack table and SQ1's older driver. The IIgs plays through its own Ensoniq instruments. The app rebuilds the DOC wave RAM from
SIERRASTANDARDand reads the 28-instrument Note Synthesizer bank from the player's ownSQ2.SYS16, so each note uses its key-split waves and logarithmic envelope. IIgs music now plays at the original tempo. Sampled notes end where the chip halts them, and looping ambience plays until the game stops it. - Handler fidelity.
- Amiga and IIgs wander and follow counters count in signed words.
- 2.082's
restart.gamealways prompts, and Amiga timed prints clear v21. - KQ2's
move.objsteers at once and its inventory selects. - The Amiga and IIgs brushes keep the 320-pixel limit; KQ2 and SQ2 Amiga reproduce Sierra's short radius-1 brush table.
- The IIgs
discard.sound, and itsdistancesaturating at 255.
- Interpreter-profile choice. An unidentified import, such as a fan-made game, asks which profile to run. Game → Interpreter profile shows the current profile and changes it, and the choice holds through replay and history.
- Docs and polish. Fresh README, contributing, testing and interpreter-fidelity docs:
docs/fidelity.mdis now a behaviour guide with per-platform evidence appendices. The library links two ad-free archives of free fan-made AGI games. Opening a game no longer flashes a stray "Untitled adventure" splash.
Validation
Released from main commit 19e2971c (PR #37).
Main CI passed the repository gate, build, Chromium and WebKit suites, production-browser checks, deployment and deployed-app verification. CodeQL passed all three language analyses.
Additional fixture-enabled QA passed:
- 1,567 engine tests (1 skipped), 455 app tests and 30 offline eval tests;
- the full Playwright suite, whose one timing failure under full-suite load passes in isolation;
- browser boots of all seven Amiga and IIgs editions on their own executables.
Every behaviour correction has a test that fails when its rule is broken. Fixture-dependent tests explicitly skip unavailable inputs.
Known limits
- IIgs sound approximations:
- Swap-mode oscillator pairs loop instead of handing off, and the note-volume curve is inferred.
- Semitone pitch assumes equal temperament; the Note Synthesizer's own table is in the IIgs ROM.
- The fade actions keep their schedule without stepping the system volume.
- Unmodelled input: the Amiga right-button double click and the IIgs's undecoded input-state bytes.
- Walkthroughs: recorded on the PC editions only.
- Manhunter 2: the warehouse crossing still plans against a port of the room's charge rules.
- What the checks cover: automated and stub-provider checks do not establish model quality or physical-device performance.
