Skip to content

Upgrade Atomic to the 0.9.41-alpha.1 pre-release - #720

Merged
lavaman131 merged 1 commit into
mainfrom
atomic-0.9.41-alpha.1
Oct 21, 2026
Merged

lavaman131 merged 1 commit into
mainfrom
atomic-0.9.41-alpha.1

Conversation

@lavaman131

Copy link
Copy Markdown
Collaborator

Moves the Atomic harness to the 0.9.41-alpha.1 pre-release (npm next) and adapts it to what that release changes.

Versions

catalog:harness pins @bastani/atomic 0.9.41-alpha.1. The lockfile resolves these at 0.9.41-alpha.1, with no older @bastani package left:

  • @bastani/atomic
  • @bastani/atomic-natives and all eight of its platform packages
  • @bastani/pi-ai

No other dependency moves with them.

What in the release reaches Chopin

  • steer() and followUp() now start a turn on an idle session that already has messages (breaking). A Planner session between Chopin's turns is exactly that kind of session. So a message an extension or workflow queues there now starts a turn of its own. The adapter already stops any turn it did not start before the turn reaches the model. I checked this against real Atomic sessions:

    • triggered notices, queued steer and followUp custom messages, and queued user messages were each stopped;
    • the Planner's next turn still ran normally after each one.

    The existing guard test now also covers a queued follow-up. Both cases fail when the guard is disabled.

  • session.workflows.waitForSettled(runId) (fix for a run left running in the journal). Chopin lets a Planner session go as soon as its last run ends. That is the case Atomic fixed. Before disposing the session, the adapter now waits, for at most 10 seconds, until each run that finished, failed or was stopped has its ending journaled.

    • Live, paused and blocked runs are not waited on; disposing stops them.
    • A run whose ending could not be recorded is logged by its ID, and the session still goes.
    • The new unit test failed before the change. A real Atomic run showed that the call returns once the run's final status is in the journal.
  • Structured output now names failing paths, and decisions have a total timeoutMs. This does not reach Chopin. Chopin uses its own result tool, not Atomic's structured_output.

The OAuth refresh, model routing and default-Copilot-model changes do not reach Chopin either. Its Atomic sessions keep credentials in memory and always name their model.

Docs

  • docs/self-hosting.md names the new version.
  • docs/hosted-agent.md describes both adapter behaviours.

Verification

  • bun test: 6713 pass, 22 skip, 0 fail.
  • bun run types and bun run ci pass.
  • The server Docker image builds. A container with HARNESS=atomic started healthy and imports Atomic 0.9.41-alpha.1. It holds only 0.9.41-alpha.1 @bastani packages.
  • Targeted bun run e2e (run cards, Planner attachment, harness, smoke): 34 passed, no retries.

The connector (apps/connector) does not change.

The harness catalog now pins @bastani/atomic 0.9.41-alpha.1, Atomic's next
pre-release, and the lockfile resolves @bastani/atomic, @bastani/atomic-natives
with its platform packages, and @bastani/pi-ai at 0.9.41-alpha.1, with no older
@Bastani package left. No other dependency moves with them.

Atomic's one breaking change makes steer() and followUp() start a turn when the
session is idle and already has messages. A Planner session between Chopin's
turns is exactly that, so a message an extension or workflow queues there now
starts a turn of its own. The adapter already stops any turn it did not start
before it reaches the model, and the Planner's next turn still runs; the test
of that guard now covers a queued follow-up as well as a self-started notice.

Atomic now records a workflow run's ending in its journal after reporting the
run ended, and offers session.workflows.waitForSettled(runId) to wait for that.
Chopin lets a Planner session go as soon as its last run ends, so before
disposing the session the adapter now waits, for at most 10 seconds, until each
run that finished, failed or was stopped has its ending journaled. Live, paused
and blocked runs are not waited on, and a run whose ending could not be
recorded is logged by its ID before the session still goes.

The structured-output changes (failing paths in rejections, a total timeoutMs)
do not reach Chopin, which uses its own result tool rather than Atomic's
structured_output. The self-hosting guide names the new version and the
hosted-agent guide describes both changes.

Assistant-model: Claude Opus 5.5 (fast)
Assistant-workflow: inline (fast subagents)
Assistant-verification: bun test (6713 pass, 22 skip, 0 fail), bun run types, bun run ci
Assistant-verification: red-first unit test for settling ended runs; real Atomic run confirms its ending is journaled before the session is disposed
Assistant-verification: real Atomic sessions stop self-started and queued turns before the model, checked against a disabled guard
Assistant-verification: docker build of the server image; container started healthy with HARNESS=atomic and imports Atomic 0.9.41-alpha.1
Assistant-verification: targeted bun run e2e (34 passed)
User-preference: Adopt Atomic's fixes from the 0.9.41-alpha.1 pre-release now
Co-authored-by: Alex Lavaee <alexlavaee@microsoft.com>
@lavaman131 lavaman131 self-assigned this Oct 21, 2026
@lavaman131
lavaman131 merged commit 9f6016d into main Oct 21, 2026
24 checks passed
@lavaman131
lavaman131 deleted the atomic-0.9.41-alpha.1 branch October 21, 2026 22:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant