Skip to content

Upgrade pi-* dependencies to v0.84.0 and port upstream coding-agent changes into the Atomic fork #2221

Description

@flora131

Upstream: pi v0.84.0 · v0.83.0...v0.84.0
Precedent: #2101 (v0.83.0 sync), #1995 (v0.82.1 port matrix)
Blocks on: #2204 (see §3.3)

1. Summary

Atomic declares @earendil-works/pi-{agent-core,ai,tui} at ^0.83.0 across six workspace packages. Upstream has shipped v0.84.0. This issue covers both halves of a sync: bumping the consumed artifacts and porting the upstream packages/coding-agent source changes into the Atomic fork, which maintains its own copy of that tree.

Measured scope (from a clone of earendil-works/pi at the tags):

Measure v0.82.1..v0.83.0 (#2101) v0.83.0..v0.84.0
Commits in range 63 341
Commits touching packages/coding-agent 107 (76 in src)
Commits touching packages/agent (v4 session rewrite) 128
Distinct coding-agent/src files changed 78
…of those, present in Atomic at the same path 55 (70%)
…absent from Atomic 23 (30%)
Release-note bullets 119 (5 features, 12 breaking, 26 added, 2 changed, 74 fixed)

The last sync classified 63 commits and ported 8. This one is 5.4× larger. Note that 119 bullets is a user-visible projection of 341 commits: a bullet-complete matrix is necessary but not sufficient, and plan step 4 (upstream evidence capture) remains the authority for commit-level completeness.


2. Decisions required before any porting begins

These three gate the work. Making them first collapses most of the ambiguity below.

2.1 pi-client / pi-protocol adoption — gates 14 of 23 absent files

Upstream's packages/coding-agent now takes both as direct dependencies:

// packages/coding-agent/package.json @ v0.84.0 — added since v0.83.0
"@earendil-works/pi-client": "^0.84.0",
"@earendil-works/pi-protocol": "^0.84.0",

Because we fork that tree, deferral is not free — any ported source importing them drags them in. The decision is binary and resolves 14 absent files at once (§6.2, Group 1):

  • Adopt — add both dependencies, create all 14 files.
  • Defer — exclude the importing source paths, mark all 14 not applicable, and record the exclusion as an intentional divergence.

2.2 RemoteSession versus Atomic's isolated interactive engine

v0.84.0's pi-client/pi-protocol RemoteSession is upstream solving out-of-process session control — a problem Atomic already solved with src/modes/interactive-engine/** (create-isolated-runtime.ts, engine-dialog-host.ts, remote-component.ts, engine-diagnostic-view.ts).

v0.83.0 already forced an intentionally adapted classification for cefa40ed, because upstream's unconditional await this.session.abort() in teardown would hang every session replacement on a dead engine (our facade's abort is the unbounded abortAndRecover()).

Decide deliberately: adopt upstream's, keep ours, or bridge. A bulk port must not silently reintroduce upstream's blocking teardown.

2.3 Atomic's AI_AGENT value

Upstream adds AI_AGENT=pi to CLI and RPC child environments. AI_AGENT is currently unset anywhere in this repo (verified). Choose Atomic's value, and propagate it to subagent and workflow child processes, not only CLI/RPC.


3. Porting rules

3.1 Clean break — no compatibility shims unless pi ships one

Atomic does not keep a back-compat path unless pi keeps one. If upstream removed or re-shaped an API, the fork takes the break at the call site. No adapters, type aliases, overloads, defaulted parameters, or re-exports. Review-blocking. These seven are where a shim tends to appear on its own:

Break Shim to not write
ModelsStreamTransformsModelsRequestTransforms No export type ModelsStreamTransforms = … alias. Rename every reference.
message_update delta-only No cumulative message reconstruction in rpc-output-buffer/rpc-event-buffer to keep old consumers alive.
getApiKeyAndHeaders()ProviderHeaders with string | null No null-stripping normalization. null is a deletion marker and must reach pi-ai intact — stripping it re-opens #7030.
ModelRegistry.refresh()ModelsRefreshResult No overload retaining the old call. Callers handle provider errors and cancellation.
ModelRuntime.setRuntimeApiKey() auth-cancellation options No wrapper that still accepts catalog-refresh options and quietly refreshes.
v4 Session/SessionStorage/SessionRepo No re-export or reimplementation of the deleted JSONL / in-memory repo APIs.
FileSystem.renameFile() required No default or mixin implementation. Implement real same-filesystem replacement.

Where pi does ship a compatibility path — createProvider({ fetchModels }) needing no migration, scrollbarThumb falling back to selectedBg, opt-in compat.supportsFinishReason — mirror it exactly, no more and no less.

3.2 Divergence is not an exemption

A legitimate upstream fix is taken. If our architecture differs, the fix is reworked into our shape and classified intentionally adapted. Owning the module is what obliges us to carry the fix, not what excuses us from it.

Where we diverge deliberately (§5), we keep the divergence and still absorb the fix.

3.3 Matrix classification — five categories, with an evidence bar

Use the five categories already established by research/pi-0.83.0-port-matrix.md:27-31. Do not collapse them to three: intentionally adapted is where architecture divergence gets stated, and equivalent is where Atomic already had the behaviour. Both vanish under a port/inherit/N-A split, and a hidden intentionally adapted row is indistinguishable from the shim §3.1 forbids.

Category Bar
ported Upstream behaviour present in Atomic-owned source.
intentionally adapted Behaviour present, mechanism differs because our architecture differs. The difference must be stated.
inherited dependency Lives in packages/{ai,tui,agent}, consumed as exact-resolved 0.84.0.
equivalent Atomic already had the behaviour. Requires a named passing test. A plausible filename is not evidence.
not applicable No behavioural analogue exists here — never merely "ours looks different".

4. Dependency and artifact state

4.1 Declared pins to move

packages/coding-agent/package.json:83-85   pi-agent-core ^0.83.0, pi-ai ^0.83.0, pi-tui ^0.83.0
packages/subagents/package.json:41-43      pi-agent-core ^0.83.0, pi-ai ^0.83.0, pi-tui ^0.83.0
packages/mcp/package.json:35-36            pi-ai ^0.83.0, pi-tui ^0.83.0
packages/intercom/package.json:47          pi-tui ^0.83.0
packages/web-access/package.json:34        pi-tui ^0.83.0
packages/workflows/package.json:86         pi-tui ^0.83.0

Each companion package carries a matching peerDependencies/peerDependenciesMeta block that must move in lockstep.

4.2 Upstream package inventory — eight published, three new

Package dir Published name New in range
agent / ai / tui / coding-agent / server pi-agent-core, pi-ai, pi-tui, pi-coding-agent, pi-server
client @earendil-works/pi-client new
protocol @earendil-works/pi-protocol new
telemetry @earendil-works/pi-telemetry new
session-backends/sqlite-node — (subdir, no root manifest) new
evals private

pi-telemetry is not an adoption decision. Both pi-agent-core and pi-ai depend on @earendil-works/pi-telemetry@^0.84.0, so it lands in package-lock.json and the published shrinkwrap regardless. Four @earendil-works/pi-* packages must resolve at 0.84.0, single instance each — not three.

4.3 New third-party dependencies

+ grok-mermaid   0.2.2      (new — backs Mermaid rendering)
~ undici         8.5.0 → 8.9.0

grok-mermaid@0.2.2 is a new third-party package, so the committed .npmrc gate applies: min-release-age=2 can block the install outright if the version is fresh, and save-exact=true governs the pin. It must also land in the published shrinkwrap.

Apply the #2101 reconciliation rule unchanged: on conflict, pi's transitive pin wins, downgrades included. Reconcile the open Dependabot queue against pi's pins before landing any bump.

4.4 Committed artifacts carrying stale pins

Artifact Stale 0.83.0 refs Action
package-lock.json 18 npm install --package-lock-only --ignore-scripts
packages/coding-agent/npm-shrinkwrap.json 10 (incl. its own dep block, lines 14-16) npm run shrinkwrap:coding-agent

npm run check:shrinkwrap only validates; it does not regenerate. The shrinkwrap ships inside @bastani/atomic, and scripts/cut-release.ts:170 regenerates it again at release time.

4.5 Binary build — the Haswell fix is half-solved, and not where it looks

The compile lives in packages/coding-agent/package.json:68 (build:binary), not in publish.yml:

bun build --compile --bytecode --format=cjs --external mupdf \
  --no-compile-autoload-dotenv --no-compile-autoload-bunfig \
  ./dist/bun/split-loader.js --outfile dist/atomic

There is no --target on the compile step (the earlier --target=bun calls are bundling). Meanwhile publish.yml:150-153 sets RUSTFLAGS=-C target-cpu=x86-64-v2, which constrains only the Rust native addons.

Artifact Baseline today Classification
Rust native addons x86-64-v2 via RUSTFLAGS equivalent — already solved independently
Bun-compiled dist/atomic none (default target) port#7390

--bytecode is target-specific, so the baseline target and bytecode generation must agree per platform.


5. Atomic divergences to preserve

A 341-commit port is exactly where an unstated divergence gets "fixed" by someone acting in good faith. Both prior matrices encode this intent:

compatibility_context: Preserve Atomic public SDK, branding, CLI, paths, legacy PI_*/.pi aliases, providers, isolated runtime, Verbatim Compaction, and versionless manifests.
breaking_changes_allowed: false

Divergence Where Why it must survive
Isolated interactive engine src/modes/interactive-engine/** See §2.2. Upstream's teardown abort() would hang on a dead engine.
Verbatim Compaction src/core/compaction/** (16 files vs upstream's 4), agent-session-{,auto-,post-tool-}compaction.ts See §5.1.
Copilot subsystem 7 Atomic-only files See §5.2.
Legacy PI_*/.pi aliases, .atomic config root config + tool resolution Permanent branding/path divergence.
Versionless release bases packages/*/package.json at 0.0.0, scripts/cut-release.ts Upstream release-stamp commits are permanently not applicable — a large N/A class in this range.
Raw-TypeScript companion packages packages/{workflows,subagents,mcp,web-access,intercom} No build step, ever. Upstream tsconfig/build commits are N/A.
CI topology .github/workflows/** (9 contexts, full Windows, Blacksmith, per-job timeouts) AGENTS.md explicitly declines pi's single-job shape. 16 file touches in range, all N/A unless shipped behaviour changes.
Hashline edit engine src/core/tools/hashline-engine/** Atomic-only; upstream edit-tool changes do not map.
Five bundled builtin extensions packages/{workflows,subagents,mcp,web-access,intercom} Every extension-API change lands on five consumers here versus one upstream. The recurring reason a row is intentionally adapted.

5.1 Compaction: 16 Atomic modules against 4 upstream, sharing 4 filenames

Upstream v0.84.0 Atomic
src/core/compaction/ compaction.ts, branch-summarization.ts, utils.ts, index.ts 16 files, adding range-planner.ts, fallback-planner.ts, region-trimming.ts, truncated-range-recovery.ts, compaction-boundary.ts, compaction-runner.ts, deleted-ranges.ts, transcript-serialization.ts, …
src/core/ plus agent-session-compaction.ts, agent-session-auto-compaction.ts, agent-session-post-tool-compaction.ts
Strategy upstream default VERBATIM_COMPACTION_STRATEGY, runVerbatimCompaction, VERBATIM_COMPACTION_PROMPT_VERSION

Four filenames collide by name inside a module graph four times larger. A file-wise application of the upstream compaction diff will either overwrite Verbatim Compaction or leave two competing implementations. Every upstream compaction commit needs a hand-placed intentionally adapted row.

5.2 The Copilot subsystem has no upstream counterpart

Checked against git ls-tree v0.84.0 packages/coding-agent/src — all absent upstream:

core/copilot-env-routing.ts · core/openai-responses-payload-sanitizer.ts · core/agent-session-retry.ts · core/model-runtime-restoration.ts · core/model-runtime-providers.ts · core/model-resolver-defaults.ts · core/provider-display-names.ts

Atomic reached endpoint routing, provider display naming, model restoration, and retry classification independently. Per §3.2, the four v0.84.0 Copilot bullets are re-decided against our modules and reworked in, not skipped:

Upstream bullet Requirement
Copilot compaction/branch summaries using the Individual rather than credential-resolved Business/Enterprise endpoint (#6768) Prove by test that our calls already resolve Business/Enterprise. If any path resolves Individual, rework the fix into copilot-env-routing.ts.
Extension model calls dropping credential-resolved endpoints (#7579) Verify all five builtin extensions, not one representative call site.
Copilot Grok 4.5 via the Responses API (#7560) Gated on #2204 — see §5.3. Sequencing, not a decline.
Copilot models restored via account-specific policy responses (#7672) Diff against model-runtime-restoration.ts; port if absent.

5.3 Sequencing hazard: #7560 widens the blast radius of open bug #2204

#2204 is open and lives in our own openai-responses-payload-sanitizer.ts. On the github-copilot + openai-responses path, across a model-identity mismatch, the sanitizer synthesizes a 64-character function_call.id that the server rejects with 400 invalid_request_body. It is deterministic, nothing auto-retries it (agent-session-retry.ts does not classify HTTP 400), and the session cannot progress.

#7560 moves Copilot Grok 4.5 onto that exact API surface. #2204 must land before or with the #7560 port.


6. Work inventory

6.1 Breaking changes to absorb

Upstream break Atomic surface
ModelsStreamTransformsModelsRequestTransforms src/core/model-runtime-streaming.ts. Header transforms now apply to all authenticated requests, not just streams.
getApiKeyAndHeaders()ProviderHeaders (string | null) src/core/model-runtime.ts, packages/web-access/{summary-review,web-search-summary}.ts
message_update emits only assistantMessageEvent deltas src/core/agent-session-events.ts, src/core/extensions/{api-types,agent-events}.ts, src/modes/interactive/**, src/modes/rpc/rpc-{output,event}-buffer.ts, examples/sdk/*. Upstream's modes/json-event.ts does not exist here — placement decision required (§6.2).
ModelRegistry.refresh()ModelsRefreshOptions/ModelsRefreshResult registry call sites + ~15 registry test suites
ModelRuntime.setRuntimeApiKey() auth-cancellation options src/core/runtime-credentials.ts, src/core/model-runtime.ts
Provider refresh: context.store → read-only context.stored + generation-checked context.publish() handwritten Provider.refreshModels(); createProvider({ fetchModels }) users unaffected
Config-form extension OAuth refreshToken(credentials, signal) src/core/provider-composer-internal.ts, src/core/extensions/{provider-types,api-types}.ts. The fork owns this surface — a port, not inherit. No companion package registers a provider (N/A for those).
v4 lane-based Session/SessionStorage/SessionRepo; v2 session + AgentHarness promoted out of experimental src/core/index.ts, src/index.ts, test/experimental.test.ts
Legacy JSONL and in-memory repo APIs removed move to JsonlSessionRepo / InMemorySessionRepo
FileSystem.renameFile() required custom harness filesystem impls
RemoteSession.sessions returns durable SessionMetadata remote-session consumers (see §2.1)

6.2 Path portability of the 107 commits

55 of 78 changed files (70%) exist in Atomic at the same path — diffs are path-aligned and the fork has not drifted structurally on them. The 23 absent files resolve to three decisions, not 23:

Group 1 — remote-session stack: 14 files, one decision (§2.1).

cli/experimental/{auth,auth-options,cli,command,command-options,endpoint,options,transport-address}.ts
cli/experimental/commands/{client,pi,server}.ts
client/{index,remote-session,transcript}.ts

Group 2 — features to build, not merge: 5 files.

File Feature
modes/interactive/interactive-tui.ts Fullscreen TUI. Atomic has zero tui-mode/fullscreen code — from-scratch port.
modes/interactive/components/mermaid.ts Mermaid rendering; pairs with the new grok-mermaid dependency.
modes/interactive/components/markdown-transform.ts registerMarkdownTransformer(); lands on five builtin extensions.
utils/tool-result-images.ts Oversized image resizing (#7330). A new module, distinct from our src/utils/image-resize-worker.ts.
cli/thinking-level.ts Check against Atomic's existing thinking handling.

Group 3 — new utility modules other fixes depend on: 4 files.

File Carries
modes/json-event.ts The message_update delta-only break. No path-aligned home here — placement decision required.
utils/management-http.ts Transient version-check/catalog/managed-tool/package-management retries (#7632)
utils/abort.ts Shared abort helper underpinning several cancellation fixes
core/pi-manifest.ts Package-manifest handling; relates to #7187

6.3 Known gaps where Atomic is behind upstream

Verified, not assumed. Each is real work behind an architectural divergence:

Upstream fix Atomic state
Manual /compact racing threshold auto-compaction (#7370) Strictly worse than upstream. agent-session-compaction.ts:231 refuses the operation: "Automatic compaction is already in progress; wait for it to finish before compacting manually." Upstream fixed the race so it proceeds.
Messages queued during manual /compact failing No analogue. agent-session-compaction.ts contains no queue handling at all.
Truncated responses compacting and retrying once (#7540) Not covered by truncated-range-recovery.ts, which parses compaction planner deletion records on a length stop — a different layer. Port as a behavioural diff against the length-stop handling at agent-session-auto-compaction.ts:179,256.

6.4 Features to pick up

  • Fullscreen TUI mode — sticky editor/footer dock, independently scrollable transcript, draggable scrollbar (auto/always/hidden), page-scroll and marked-message shortcuts, stacked transient notifications, runtime mode switching, optional scrollbarThumb theme color, mouse wheel step reduced 3 → 1 lines. Audit every Atomic theme and how our workflow/subagent widgets behave in the sticky dock.
  • Mermaid + LaTeX rendering, with optional render-while-streaming.
  • pi.registerMarkdownTransformer() — chainable display-only Markdown transforms; useful to our workflow/intercom renderers.
  • Per-directory AGENTS.override.md context files.
  • Arbitrary OpenAI-compatible samplingParams in models.json, model overrides, extension providers, and stream options; opt-in vLLM thinking_token_budget.
  • Baseten provider (BASETEN_API_KEY, default zai-org/GLM-5.2).
  • CredentialSynchronizationError — credential changes that commit but fail to sync local model state. Handle explicitly, do not fold into the generic path.
  • AgentHarness v2 scaffold — unfinished operation paths reject with HarnessNotImplemented at runtime, not compile time. Enumerate which operations we reach.
  • AgentOptions.shouldStopAfterTurn, deferred provider request contracts, vendor-neutral telemetry contracts, compat.supportsFinishReason, structured Bedrock failure diagnostics, v4 JsonlSessionRepo, bounded branch-entry and indexed open-operation recovery queries.
  • Optional cancellation on pi-ai ModelsStore reads/writes/deletes — audit that our store calls pass the signal on cancellable paths.
  • Opt-in Ctrl+P/Ctrl+N prompt history — see keybinding collisions in §6.5.

6.5 Fixes landing on real Atomic surface

Upstream fix Atomic surface
anyOf/oneOf union arm preserved before coercion (#7328) Highest-value inherited fix in the release. packages/subagents tool schemas (skill, reads, output are anyOf of string | boolean | string[]), packages/workflows inputs. Add regression coverage rather than assuming green.
setToolsExpanded(false) no-op when already collapsed (#7292) We are the reported symptom: subagents/src/extension/index.ts:295, subagents/src/slash/slash-commands.ts:271, workflows/src/extension/wiring.ts:397
Extension model calls dispatch through the coding-agent model runtime (#7325) web-access/summary-review.ts, web-access/web-search-summary.ts. One coherent change with the ProviderHeaders break and #7579.
Oversized images from extension/built-in tools resized (#7330) web-access/{content-tools,github-api,video-extract,youtube-extract}.ts emit base64 payloads; new module required (§6.2).
Ctrl-modified Home/End/PageUp/PageDown editor bindings (#7574) We already bind raw pageUp/pageDown: workflows/src/tui/stage-chat-view-input.ts:171-175, prompt-card-select.ts:83-86, keybindings-adapter.ts:53-54. Check precedence in both TUI modes, together with Ctrl+P/Ctrl+N.
Windows harness path handling: basenames, recursive skill loading, prompt template names 28 SKILL.md files across four packages (coding-agent 17, subagents 5, workflows 5, intercom 1), nested more than one level deep.
Bare exact --model IDs shared by multiple providers (#7327) workflow({ action: "models" }), stage model/fallbackModels pinning, docs/models/model-selection.md
Footer (sub) for generic OAuth/OpenID; isSubscription opt-in provider-composer-internal.ts, extensions/{provider-types,api-types}.ts — the fork owns this.
Custom editors inherit autocomplete dropdown limit (#7333) packages/workflows/src/tui/**
pi-tui package no longer omits native-addon build scripts build:binary, publish.yml, published shrinkwrap. Build-surface, not cosmetic.
Project-level nested provider retry settings (#7572) .atomic/ project config merge
Git package updates when git clean cannot remove an ignored dir (#7570) package install/update path
Session discovery through symlinked directories (#7552) worktree-heavy flows, which our workflow runs create by design
JsonlSessionRepo IDs unique per working directory constrains the v4 migration — worktrees can now reuse an ID
find: path-containing globs on Windows (#6817); POSIX/Windows root segments (#7569); Git Bash/MSYS/Cygwin/WSL drive resolution (#7064, #7547) find tool, file tools. Three distinct fixes.
/scoped-models and /model <name> using cached models (#7153, #7443) pairs with the refresh() break — verify no blocking wait returns
Malformed resource arrays crashing startup (#7187) package manifests
Extension event-bus listeners surviving reloads/disposal (#7656) five builtin extensions
Credential/catalog lock convoys, stalled-refresh deadlocks, stale-publication races, cancellation while waiting for locks runtime-credentials.ts, model store paths
Fullscreen: shutdown capability-query leak; Kitty previews overlapping the dock; image-heavy double-render; nested stack child minimum sizes; Ctrl+X transient marker; phantom selection our widgets and images in the new dock
Inherited TUI: batched color-scheme reports, complete OSC 9;4 progress, iTerm2 image size metadata, OSC 8 hyperlink termination, Indic conjunct width our renderers emit hyperlinks, progress, and images — verify our output
/settings multi-word search; interactive errors respecting output padding; /copy on Wayland; increased connect timeout inherited; verify with our added settings
undici → 8.9.0, packaged brace-expansion → 5.0.9 GHSA-8xcm-r25x-g524, GHSA-4cwx-7wf7-3272, GHSA-m8rv-5g2x-5cg5, GHSA-jr45-8vmc-qm54, GHSA-v3r7-h72x-cjcm, GHSA-rgw5-rvv9-x895, GHSA-mh99-v99m-4gvg

6.6 Inherit-only (arrive with the bump; evidence is a green suite)

  • pi-ai provider fixes: Fireworks GLM 5.2 prompt_cache_retention + session affinity (#7676); provider error normalization preserving arrays and class instances (#7205); Anthropic streams retaining initial content-block text/thinking (#7358); Google history conversion preserving signed empty blocks (#7362); Gemini 3 tool call ids preserved (#7494); OpenAI Codex WebSocket sessions no longer shared across credentials (#7364); transient Google GenAI/Vertex retries (#7471); OAuth refreshes releasing the credential-store lock (#7508); OpenCode Go display name.
  • Model catalog updates — cross-check docs/models/model-selection.md and any pinned stage models: GPT-5.6 Terra/Luna pricing; Fireworks Kimi K3 on the OpenAI-compatible API; Groq Qwen override for qwen/qwen3.6-27b; retired qwen3.8-max-previewqwen3.8-max (#7670).
  • Windows: Shift+Enter detection, truecolor detection, input render latency.
  • N/A to this fork: DOOM overlay example WAD URL.

6.7 Documentation targets

The release links seven upstream doc anchors; our fork maintains its own copies:

Upstream anchor Atomic counterpart
settings.md#ui--display, #markdown, #terminal--images packages/coding-agent/docs/settings.md
models.md#sampling-parameters, #openai-compatibility packages/coding-agent/docs/models.md
providers.md#api-keys (Baseten) packages/coding-agent/docs/providers.md
usage.md#context-files (AGENTS.override.md) packages/coding-agent/docs/usage.md
extensions.md#piregistermarkdowntransformertransformer packages/coding-agent/docs/extensions.md
README.md#environment-variables (AI_AGENT) packages/coding-agent/README.md
new scrollbarThumb theme color docs/themes.md plus src/modes/interactive/theme/theme-schema.json and theme-schema.ts

The theme row carries a schema change: both schema files must learn scrollbarThumb or the optional color fails validation in user themes.


7. Plan

  1. Make the three §2 decisions. Client/protocol adoption gates 14 files and the dependency set.
  2. Capture upstream evidence for v0.83.0..v0.84.0 under research/ — commit list, --name-status, per-commit paths, and the packages/coding-agent diff — matching the Pi v0.83.0 sync + Dependabot queue convergence (pi-authoritative version reconciliation) #2101 layout.
  3. Build the commit-by-commit port matrix (§3.3) over 107 forked-tree commits, stating expected size so truncation is visible.
  4. Bump the three pi packages to ^0.84.0 in all six packages including peer blocks; refresh package-lock.json; regenerate the shrinkwrap; reconcile grok-mermaid and undici against the Dependabot queue.
  5. Port packages/coding-agent/src, absorbing every §6.1 break and the §6.3 gaps.
  6. Land Atomic synthesizes a 64-character fc_* function_call.id that the GitHub Copilot Responses endpoint rejects with HTTP 400 #2204, then port #7560.
  7. npm run check, npm run test:all, npm run test --workspace=@bastani/atomic, npm run test:scripts; verify the Bun-compiled binary on macOS/Linux/Windows including the baseline x64 target.
  8. Update packages/coding-agent/docs (§6.7) via the release-docs workflow; add packages/*/CHANGELOG.md entries under [Unreleased] for user-visible surface only.

8. Acceptance criteria

Decisions

  • Client/protocol adoption decided before matrix work; all 14 Group 1 files resolved by it.
  • RemoteSession ↔ isolated-engine overlap resolved by an explicit written decision, not by default.
  • Atomic's AI_AGENT value chosen and propagated to subagent and workflow children.

Dependencies and artifacts

  • No ^0.83.0 pi reference in any package.json, dependency or peer block.
  • package-lock.json (18 stale refs) and packages/coding-agent/npm-shrinkwrap.json (10) regenerated; four @earendil-works/pi-* packages resolve at 0.84.0, single instance each, pi-telemetry included.
  • grok-mermaid@0.2.2 reconciled against .npmrc min-release-age/save-exact and present in the shrinkwrap.
  • build:binary compiles against Bun's baseline x64 runtime; RUSTFLAGS=-C target-cpu=x86-64-v2 retained for the natives; both verified on x64 legs.

Matrix integrity

  • A row for all 119 upstream bullets and all 107 forked-tree commits; expected sizes stated.
  • Five categories used; every equivalent row cites a named passing test; no row is equivalent or N/A on the grounds that Atomic owns the module.
  • No compatibility shim, alias, overload, or re-export added for any §3.1 break.

Divergences intact

  • All seven Atomic-only Copilot modules present and behaviourally unchanged; none replaced by an upstream file unaware of them.
  • No upstream compaction file applied wholesale; Verbatim Compaction still default, VERBATIM_COMPACTION_PROMPT_VERSION unchanged unless deliberately bumped.
  • Isolated-engine teardown still non-blocking; upstream's unconditional abort() not reintroduced.

Gaps closed

  • Atomic synthesizes a 64-character fc_* function_call.id that the GitHub Copilot Responses endpoint rejects with HTTP 400 #2204 resolved before or with #7560; regression test covers absent function_call.id on the Copilot Responses path.
  • Manual /compact succeeds during threshold auto-compaction; the agent-session-compaction.ts:231 rejection removed or justified in writing.
  • Messages queued during manual compaction are delivered afterward, with a regression test.
  • #7540 ported as a behavioural diff against agent-session-auto-compaction.ts:179,256; truncated-range-recovery.ts recorded as unrelated.
  • #6768 proven by test or reworked into copilot-env-routing.ts; #7579 verified across all five builtin extensions.
  • anyOf/oneOf coercion regression coverage for the subagent tool's union-typed parameters.
  • setToolsExpanded(false) emits no redundant startup notices from the three known call sites.
  • web-access summarizers dispatch through the coding-agent model runtime and pass ProviderHeaders through unchanged, null markers included.
  • CredentialSynchronizationError handled explicitly; HarnessNotImplemented surfaces enumerated and unreachable at runtime.

Verification

  • npm run check and all four suites pass on Linux, macOS, and Windows.
  • Fullscreen mode, Mermaid/LaTeX rendering, and AGENTS.override.md verified in an Atomic session.
  • Atomic themes carry scrollbarThumb or fall back cleanly to selectedBg; both theme schema files updated.
  • Keybinding precedence checked for Ctrl+P/Ctrl+N and Ctrl-modified Home/End/PageUp/PageDown in both TUI modes.
  • Recursive skill loading and prompt-template resolution verified on Windows across all 28 shipped skills.
  • Docs (§6.7) and changelogs updated.

Metadata

Metadata

Assignees

Labels

dependenciesPull requests that update a dependency fileenhancementNew feature or requesttech-debtTechnical debt that needs cleanup

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions