Skip to content

AGI IS HERE 1.2.4

Choose a tag to compare

@joakimriedel joakimriedel released this 15 Oct 21:14
· 3 commits to main since this release
01fcce5

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-full passes 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-wipe could 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:217 and :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:291 and :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, :222 and :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:86 and :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, :3795 and
    :3812. The scripted Applies in the existing late-collision tests now pass the comparison they
    saw: :2951 (four variants), :3587 and :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 finish tool takes testReasons and no longer takes notes; 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, :339 and :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 action reads "From the beginning", its accessible name
    and tooltip "Restart from the beginning", and with pending changes "Update and restart · From the
    beginning". app/test/launch-action.test.ts:33 and :82, app/e2e/run-followups.spec.ts:79,
    app/e2e/workspace-launch.spec.ts:147.

  • Deleting the room the game is in restarts from the beginning, and the update says so, instead of
    refusing. app/test/worker-project-restart.test.ts:794, app/e2e/qa-room-recording.spec.ts:54.

  • The return note names the room: "Home started fresh with your changes." rather than "Room 1
    started fresh …". app/e2e/run-owner.spec.ts:286, app/e2e/studio-edit.spec.ts:485,
    app/e2e/workspace-agent.spec.ts:706.

  • A Create opened before the game's first cycle keeps no return point, so a room visit from it
    offers no Back, instead of "Back to Room 0" (a timing race since 1.2.0, seen once in CI).
    app/test/ worker test and app/e2e/workspace-frame.spec.ts:193.

Rewind

  • A game paused the moment Play starts it, before its first cycle, is kept for Undo rewind as the
    game's start, as often as the player rewinds; before, the rewind was refused with "…while a game
    prompt is open." and Undo was missing (a timing race seen once in CI).
    app/test/worker-history-view.test.ts:385, app/test/worker-room-show.test.ts:439,
    app/e2e/rewind-admission.spec.ts:80.
  • A game paused after it started but before its first room draws, or during a room re-entry, says
    "The game is still starting. Play a moment, then rewind." app/test/worker-history-view.test.ts:448
    and :508, app/test/worker-room-show.test.ts:427.
  • A restored checkpoint paused before its first cycle keeps its position through Undo rewind.
    app/test/worker-history-view.test.ts:480.

Progress checkpoints

  • A checkpoint is stored while only documents are saving: chat, notes and a rejected document
    write no longer delay it, with zero retries, and an already failed document write still permits
    its matching checkpoint. app/test/project-session.test.ts:1289 (reversed from "not ready"),
    app/test/checkpoint-readiness.test.ts:46, app/e2e/checkpoint-close.spec.ts:32.
  • A document-only edit owes no capture during an optional restart, and a notes-only edit requests
    no checkpoint; one committed code change requests exactly one.
    app/test/checkpoint-readiness.test.ts:322, app/e2e/parts-delete.spec.ts:245.

Parts and the Agent

  • Closing the Agent restores the saved Parts setting at any width; naming a room with
    the Agent closed leaves Parts as it was. app/test/create-workspace.test.ts:216,
    app/e2e/ux-polish.spec.ts:265 and :286.

Checked and not decisions

  • notes → testReasons in finish calls across app/test, test, app/e2e and evals:
    mechanical, no expectation changes beyond those listed.
  • @webkit-desktop tags on the three GPU-loss tests (gpu-presentation.spec.ts,
    guided-visual.spec.ts): where a test runs, not what it expects.
  • waitForRoom(…, { coldBoot: true }) and the first-load budget in agent-captured-provenance,
    agent-conversation: timeouts only.
  • test/launches.test.ts, test/project-removal-fixture.test.ts: the unused tests input field
    removed; same assertions.
  • app/e2e/workspace-renumber.spec.ts:84: renamed, with every earlier assertion kept and more
    added.

Browser suites: each rule runs once

The browser suites now run each rule once, in the engine and at the width it depends on. Chromium runs every test; @webkit-desktop adds Linux WebKit for engine-dependent rules and @phone adds phone WebKit for touch and phone layout. Node replays every walkthrough tape under the shipped settings, and full browser replays (@walkthrough-full) run once per release candidate. docs/testing.md holds the policy.

Before After
Local gate, wall time about 29.5 min 11.9 min
CI, wall time 20.6 min 8.4 min
CI, runner time 178 min 90 min

Slimming the suites surfaced the GPU, AI-settings, notes and rename bugs listed above; each fix has a test that was seen failing first.

Decisions to confirm: browser suites

  1. Width policy:
    • Chromium runs 1063 and 390 px, plus 1440 only for wide-layout rules.
    • WebKit desktop runs 1440 at scale factor 2.
    • Phone WebKit runs 390.
  2. Dropped runs:
    • The phone replay tapes go: the worker path is the same as desktop's. The phone opening test
      with real key presses and touch stays.
    • The android-chromium project goes.
  3. Walkthroughs:
    • Node replays tapes under the shipped settings only.
    • Full browser replays run once per release candidate, hotfixes included (docs/hosting.md).
    • Browser openings run 15 000 ticks.
  4. Trace snapshots: off by default; rerun with --trace=on for the DOM.
  5. Motion and the GPU stage:
    • Reduced motion in Chromium and desktop WebKit, with opt-outs for motion rules.
    • The GPU stage only for opt-in tests outside phone WebKit.
  6. AI settings during the Agent opening: they stay available, and Save waits for the opening
    to finish. Before, the row was briefly disabled and a click did nothing. A turn that is
    actually running still disables them.
  7. Changed expectations and timeouts:
    • The authoring-controller tests now expect "The Agent closed before the settings applied. Save
      again." for a closed or reopened Agent, in place of "The game changed…".
    • Two raised waits:
      • kq1's input wait goes to 20 s. It was not reproduced; it failed under load.
      • The first Agent code diff and a page's first open of a lazily loaded editor get the 30 s
        first-load budget, because a cold dev server serves hundreds of modules for them.

🤖 Generated with Claude Code

https://claude.ai/code/session_011oMJZaRGYfxBZ4LEnu9hPD