You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maka.apache.org by as...@apache.org on 2026/08/20 10:09:36 UTC

(maka) 01/01: refactor: stop letting callers choose a session backend

This is an automated email from the ASF dual-hosted git repository.

Astro-Han pushed a commit to branch refactor/3211-retire-fake-backend-kind
in repository https://gitbox.apache.org/repos/asf/maka.git

commit 629535977c8dfea856931a3ad80a115a2f289e49
Author: AstroHan <le...@outlook.com>
AuthorDate: Thu Aug 20 02:40:19 2026 +0800

    refactor: stop letting callers choose a session backend
    
    `CreateSessionInput.backend` was the last live path that could write the
    retired `'fake'` into a new session. Narrowing it to `BackendKind` would only
    move the question: four derivation sites in `session-manager.ts` plus the
    conversation copy in `session-revision-coordinator.ts` inherit the source
    header's backend, so each would need an answer for what deriving from a legacy
    row means.
    
    Deleting the field dissolves that question. A live build has exactly one
    backend, so the field carried no choice — the store stamps `'ai-sdk'` on every
    new header and no caller names a backend at all. A session derived from a
    legacy row is now a real session whose connection slug resolves to nothing,
    which is what the readiness projection already says about that row.
    
    Two backend-kind guards go with it, for separate reasons:
    
    - `runtimeToolBoundaryProtocol` withheld the T1 durable tool boundary from
      non-`ai-sdk` headers. The branch was reachable: nothing checks the backend
      kind between `sendMessage` and the kernel, and `AgentRun.begin()` persists the
      run record, user message, turn state and the `connectionLocked` flip before
      the refusal fires inside `reserveRun`. What the gate withheld was only the
      protocol marker on the initial event of a run that dies before tool dispatch,
      and every marker consumer treats a marked run with zero tool operations the
      same as an unmarked one. The marker stays truthful; the gate bought nothing.
    - `sessions:create` rejected a non-`ai-sdk` backend arriving over IPC. That
      one really is unrepresentable now: the field is gone from the request type.
    
    Tests that dispatched through a `'fake'` registry key now register the live
    one, which is how they would be written today. The activation-refusal
    regression test seeded its legacy row through `createSession({backend:
    'fake'})` — the very write this removes — and now seeds it under the writer,
    which is the only way such a row was ever produced.
    
    Generated-by: Claude Code
---
 apps/desktop/e2e/fixtures.ts                       |   2 -
 .../main/runtime-host-session-catalog-ipc-main.ts  |   3 -
 .../src/__tests__/runtime-host-run-command.test.ts |  12 -
 .../__tests__/runtime-host-session-driver.test.ts  |   5 -
 packages/cli/src/activation-command.ts             |   1 -
 packages/cli/src/run-command-core.ts               |   1 -
 packages/core/src/runtime-inputs.ts                |  10 +-
 .../src/__tests__/artifact-two-client-uds.test.ts  |   2 -
 .../__tests__/deep-research-two-client-uds.test.ts |   1 -
 .../src/__tests__/execution-composition.test.ts    |  65 ++-
 .../src/__tests__/execution-inspect-uds.test.ts    |   1 -
 .../__tests__/execution-model-composition.test.ts  |   6 -
 .../__tests__/external-session-coordinator.test.ts |   4 -
 .../src/__tests__/fixtures/execution-host-suite.ts |   3 -
 .../src/__tests__/goal-coordinator.test.ts         |   4 -
 .../src/__tests__/goal-root-authority.test.ts      |   3 +-
 .../src/__tests__/interaction-coordinator.test.ts  |   4 -
 .../src/__tests__/plan-two-client-uds.test.ts      |   1 -
 .../src/__tests__/root-turn-coordinator.test.ts    | 140 +++---
 .../__tests__/runtime-policy-coordinator.test.ts   |   3 -
 .../session-catalog-two-client-uds.test.ts         |   5 -
 .../session-retirement-coordinator.test.ts         |   1 -
 .../session-revision-two-client-uds.test.ts        |   8 -
 .../__tests__/session-transcript-reader.test.ts    |   1 -
 .../src/server/session-catalog-coordinator.ts      |   2 -
 .../src/server/session-revision-coordinator.ts     |   1 -
 .../__tests__/agent-run-steering-recovery.test.ts  |   8 -
 .../src/__tests__/execution-inspect.test.ts        |   1 -
 .../src/__tests__/latest-context-commit.test.ts    |   3 +-
 .../__tests__/runtime-continuation-crash.test.ts   |   5 +-
 .../__tests__/runtime-kernel-interaction.test.ts   |  16 +-
 .../src/__tests__/runtime-ledger-repair.test.ts    |   1 -
 .../sandbox-boundary-restart-recovery.test.ts      |   1 -
 .../session-manager-terminal-ledger.test.ts        |  21 +-
 .../runtime/src/__tests__/session-manager.test.ts  | 523 +++++++++------------
 .../src/__tests__/shell-run-tool-result.test.ts    |   1 -
 .../src/__tests__/stream-graph-coordinator.test.ts |   6 +-
 packages/runtime/src/runtime-kernel.ts             |  23 +-
 packages/runtime/src/session-manager.ts            |   4 -
 .../__tests__/external-session-importer.test.ts    |   1 -
 .../storage/src/__tests__/goal-authority.test.ts   |   1 -
 .../src/__tests__/operational-state-backup.test.ts |   1 -
 .../src/__tests__/session-bundle-policy.test.ts    |   1 -
 .../storage/src/__tests__/session-store.test.ts    |   1 -
 .../src/__tests__/settings-store-usage.test.ts     |   2 -
 packages/storage/src/session-store.ts              |   2 +-
 46 files changed, 384 insertions(+), 527 deletions(-)

diff --git a/apps/desktop/e2e/fixtures.ts b/apps/desktop/e2e/fixtures.ts
index 885c83d7e..0c0e85a38 100644
--- a/apps/desktop/e2e/fixtures.ts
+++ b/apps/desktop/e2e/fixtures.ts
@@ -135,7 +135,6 @@ async function seedParentRemovalSessions(userDataDir: string): Promise<void> {
   try {
     const parent = await store.create({
       cwd: path.join(userDataDir, 'project'),
-      backend: 'fake',
       llmConnectionSlug: 'e2e',
       model: 'claude-sonnet-4-5-20250929',
       permissionMode: 'ask',
@@ -144,7 +143,6 @@ async function seedParentRemovalSessions(userDataDir: string): Promise<void> {
     });
     await store.createSubagent({
       cwd: path.join(userDataDir, 'project'),
-      backend: 'fake',
       llmConnectionSlug: 'e2e',
       model: 'claude-sonnet-4-5-20250929',
       permissionMode: 'execute',
diff --git a/apps/desktop/src/main/runtime-host-session-catalog-ipc-main.ts b/apps/desktop/src/main/runtime-host-session-catalog-ipc-main.ts
index 96f216925..7ba474b50 100644
--- a/apps/desktop/src/main/runtime-host-session-catalog-ipc-main.ts
+++ b/apps/desktop/src/main/runtime-host-session-catalog-ipc-main.ts
@@ -96,9 +96,6 @@ export function registerRuntimeHostSessionCatalogIpc(
     pendingCleanup.add(sessionId);
   });
   ipcMain.handle('sessions:create', async (_event, input?: CreateSessionRequestInput) => {
-    if (input?.backend !== undefined && input.backend !== 'ai-sdk') {
-      throw new Error('Unsupported Runtime Host Session backend');
-    }
     const request = resolveCreateSessionRequest(input);
     const workspace = await deps.resolveCreateProject({
       ...(input?.cwd === undefined ? {} : { cwd: input.cwd }),
diff --git a/packages/cli/src/__tests__/runtime-host-run-command.test.ts b/packages/cli/src/__tests__/runtime-host-run-command.test.ts
index 99f636cda..298e820ad 100644
--- a/packages/cli/src/__tests__/runtime-host-run-command.test.ts
+++ b/packages/cli/src/__tests__/runtime-host-run-command.test.ts
@@ -205,7 +205,6 @@ describe('Runtime Host maka run adapter', () => {
     const fixture = runFixture({ observed, graph: true, graphProjectionRace: true });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -229,7 +228,6 @@ describe('Runtime Host maka run adapter', () => {
     const fixture = runFixture({ observed, graph: true });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -253,7 +251,6 @@ describe('Runtime Host maka run adapter', () => {
     const fixture = runFixture({ observed, graph: true, graphMultiWakeRace: true });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -282,7 +279,6 @@ describe('Runtime Host maka run adapter', () => {
     const context = fixture.context;
     const session = await context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -315,7 +311,6 @@ describe('Runtime Host maka run adapter', () => {
     });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -338,7 +333,6 @@ describe('Runtime Host maka run adapter', () => {
     const fixture = runFixture({ maxSteps: 3 });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -390,7 +384,6 @@ describe('Runtime Host maka run adapter', () => {
     const fixture = runFixture({ graph: true });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -412,7 +405,6 @@ describe('Runtime Host maka run adapter', () => {
     });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -444,7 +436,6 @@ describe('Runtime Host maka run adapter', () => {
     });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -471,7 +462,6 @@ describe('Runtime Host maka run adapter', () => {
     });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -499,7 +489,6 @@ describe('Runtime Host maka run adapter', () => {
     });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -545,7 +534,6 @@ describe('Runtime Host maka run adapter', () => {
     });
     const session = await fixture.context.runtime.createSession({
       cwd: '/workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
diff --git a/packages/cli/src/__tests__/runtime-host-session-driver.test.ts b/packages/cli/src/__tests__/runtime-host-session-driver.test.ts
index 7dda7d111..4671af76c 100644
--- a/packages/cli/src/__tests__/runtime-host-session-driver.test.ts
+++ b/packages/cli/src/__tests__/runtime-host-session-driver.test.ts
@@ -60,7 +60,6 @@ describe('Runtime Host Maka Session driver', () => {
         cwd: '/client/workspace',
         llmConnectionSlug: 'openai-main',
         model: 'gpt-5',
-        backend: 'ai-sdk',
         permissionMode: 'ask',
       }),
       /requires an explicit Project/,
@@ -92,7 +91,6 @@ describe('Runtime Host Maka Session driver', () => {
 
     await driver.createSession({
       cwd: '/repo',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -174,7 +172,6 @@ describe('Runtime Host Maka Session driver', () => {
 
     await driver.createSession({
       cwd: '/repo',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
       permissionMode: 'ask',
@@ -304,7 +301,6 @@ describe('Runtime Host Maka Session driver', () => {
       await driver.createSession({
         cwd: candidate.cwd,
         ...('projectId' in candidate ? { projectId: candidate.projectId } : {}),
-        backend: 'ai-sdk',
         llmConnectionSlug: 'openai-main',
         model: 'gpt-5',
         permissionMode: 'ask',
@@ -364,7 +360,6 @@ describe('Runtime Host Maka Session driver', () => {
       cwd: '/repo',
       llmConnectionSlug: 'openai-main',
       model: 'gpt-5',
-      backend: 'ai-sdk',
       permissionMode: 'ask',
     });
     connection.executionBoundary = { kind: 'bypass', revision: 2 };
diff --git a/packages/cli/src/activation-command.ts b/packages/cli/src/activation-command.ts
index cfa5f194b..fbdb10f24 100644
--- a/packages/cli/src/activation-command.ts
+++ b/packages/cli/src/activation-command.ts
@@ -449,7 +449,6 @@ export async function runMakaActivationCli(
       session = await context.runtime.createSession({
         cwd: roots.workspaceRoot,
         name: `Cloud activation ${request.activationId}`.slice(0, 80),
-        backend: 'ai-sdk',
         llmConnectionSlug: context.target.connection.slug,
         model: context.target.model,
         permissionMode: options.permissionMode ?? 'explore',
diff --git a/packages/cli/src/run-command-core.ts b/packages/cli/src/run-command-core.ts
index a47d2881c..e46a5c924 100644
--- a/packages/cli/src/run-command-core.ts
+++ b/packages/cli/src/run-command-core.ts
@@ -314,7 +314,6 @@ export async function runMakaTextCliCore(
         : await context.runtime.createSession({
             cwd: selection.cwd,
             name: makaRunSessionName(prompt),
-            backend: 'ai-sdk',
             llmConnectionSlug: context.target.connection.slug,
             model: context.target.model,
             permissionMode: parsed.options.yolo ? 'bypass' : 'ask',
diff --git a/packages/core/src/runtime-inputs.ts b/packages/core/src/runtime-inputs.ts
index 06c249fd6..e7e3281d1 100644
--- a/packages/core/src/runtime-inputs.ts
+++ b/packages/core/src/runtime-inputs.ts
@@ -4,7 +4,6 @@
 
 import type { MessageContent } from './events.js';
 import type {
-  PersistedBackendKind,
   SessionBlockedReason,
   SessionStatus,
   SessionToolProfile,
@@ -35,7 +34,14 @@ export interface CreateSessionInput {
   projectId?: string | null;
   /** If omitted, runtime auto-derives a placeholder; users may rename later. */
   name?: string;
-  backend: PersistedBackendKind;
+  /**
+   * No `backend`: a live build has exactly one, so the field carried no choice
+   * — only the chance of writing the retired `'fake'` into a new row (#3211).
+   * The store stamps every new header instead. Sessions derived from an older
+   * one (branch, revision, subagent) no longer inherit its backend; a copy of a
+   * legacy row is a real session whose connection slug resolves to nothing,
+   * which is what the readiness projection already says about it.
+   */
   llmConnectionSlug: string;
   /** Falls back to the connection's defaultModel if omitted. */
   model?: string;
diff --git a/packages/runtime-host/src/__tests__/artifact-two-client-uds.test.ts b/packages/runtime-host/src/__tests__/artifact-two-client-uds.test.ts
index 2269a2cca..135cfb4bc 100644
--- a/packages/runtime-host/src/__tests__/artifact-two-client-uds.test.ts
+++ b/packages/runtime-host/src/__tests__/artifact-two-client-uds.test.ts
@@ -273,14 +273,12 @@ async function seedExecutionRoot(
     stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await stores.sessionStore.create({
       cwd: root,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
     });
     const otherSession = await stores.sessionStore.create({
       cwd: root,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/deep-research-two-client-uds.test.ts b/packages/runtime-host/src/__tests__/deep-research-two-client-uds.test.ts
index 8dbd7b3fb..a85f50ae8 100644
--- a/packages/runtime-host/src/__tests__/deep-research-two-client-uds.test.ts
+++ b/packages/runtime-host/src/__tests__/deep-research-two-client-uds.test.ts
@@ -36,7 +36,6 @@ test('two Clients and a restarted production Host share one Deep Research projec
     const deepResearch = await openInteractiveDeepResearchStoreForWrite(owner.lease);
     const session = await setupStores.sessionStore.create({
       cwd: root,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'explore',
diff --git a/packages/runtime-host/src/__tests__/execution-composition.test.ts b/packages/runtime-host/src/__tests__/execution-composition.test.ts
index cab65c95d..ad6ca2bb1 100644
--- a/packages/runtime-host/src/__tests__/execution-composition.test.ts
+++ b/packages/runtime-host/src/__tests__/execution-composition.test.ts
@@ -4,6 +4,7 @@ import { createRequire } from 'node:module';
 import { mkdir, mkdtemp, rm, stat, writeFile } from 'node:fs/promises';
 import { tmpdir } from 'node:os';
 import { join } from 'node:path';
+import { DatabaseSync } from 'node:sqlite';
 import { test } from 'node:test';
 import type {
   AgentGraphIntentClaim,
@@ -81,7 +82,6 @@ test('production composition closes long-term memory after a later startup failu
     const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -121,14 +121,12 @@ test('production recovery preserves legacy Automation history and closes an orph
     const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const historical = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
     });
     const pending = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -349,7 +347,6 @@ test('production composition commits automatic titles through Host-owned Session
     try {
       const session = await manager.createSession({
         cwd: root,
-        backend: 'ai-sdk',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
@@ -381,20 +378,16 @@ test('production composition commits automatic titles through Host-owned Session
 
 test('a legacy fake-backend session is refused with the product reason, not a registry error', async () => {
   await withCompositionRoot(async ({ root, owner }) => {
-    const { composition, manager } = await createCapturedExecutionComposition(owner);
+    // Written by an older build: no creation path here can produce `fake`, so
+    // the row is seeded under the writer — which is the only way it was ever
+    // produced — and then read back by a Host that starts up against it, since
+    // activation dispatches straight off the durable header.
+    const legacyId = await seedLegacyFakeBackendSession(root, owner);
+    const { composition } = await createCapturedExecutionComposition(owner);
     try {
-      // Written by an older build: this one never produces `fake`, but the
-      // durable header survives and activation dispatches straight off it.
-      const legacy = await manager.createSession({
-        cwd: root,
-        backend: 'fake',
-        llmConnectionSlug: 'fake',
-        model: 'fake-model',
-        permissionMode: 'ask',
-      });
       const failure = await composition.handlers['turn.start'](
         {
-          sessionId: legacy.id,
+          sessionId: legacyId,
           turnId: 'turn-legacy-fake',
           content: { text: 'resume a retired local simulation' },
         },
@@ -423,7 +416,6 @@ test('production composition orphans ownerless ShellRuns before serving Resource
     const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -471,7 +463,6 @@ test('production Skill catalog resolves a Graph child durable tool surface', asy
     const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const parent = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -639,7 +630,6 @@ test('Skill capability previews omit unavailable Tavily search surfaces', async
     const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: connection.slug,
       model: 'fake-model',
       permissionMode: 'bypass',
@@ -696,7 +686,6 @@ test('production composition validates graph stop before aborting a claimed chil
     const claims = createAgentGraphControlStore(root);
     const parent = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -900,6 +889,43 @@ function shellRunRecord(
   };
 }
 
+/**
+ * Writes one session whose durable header says `backend: 'fake'`.
+ *
+ * Nothing in this build can write that value, so the row goes in underneath the
+ * session writer: create a normal row through the real store, then rewrite the
+ * persisted backend the way an older build left it on disk. The database
+ * filename is `OPERATIONAL_STATE_DATABASE_NAME` in `@maka/storage`, which the
+ * package does not export.
+ */
+async function seedLegacyFakeBackendSession(
+  root: string,
+  owner: InteractiveRootOwner,
+): Promise<string> {
+  const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
+  const { id: sessionId } = await stores.sessionStore.create({
+    cwd: root,
+    llmConnectionSlug: 'fake',
+    model: 'fake-model',
+    permissionMode: 'ask',
+  });
+
+  const legacy = new DatabaseSync(join(root, 'runtime.sqlite'));
+  try {
+    const row = legacy
+      .prepare(`SELECT payload_json FROM session_metadata WHERE session_id = ?`)
+      .get(sessionId) as { payload_json: string };
+    const payload = JSON.parse(row.payload_json) as Record<string, unknown>;
+    payload.backend = 'fake';
+    legacy
+      .prepare(`UPDATE session_metadata SET payload_json = ?, backend = ? WHERE session_id = ?`)
+      .run(JSON.stringify(payload), 'fake', sessionId);
+  } finally {
+    legacy.close();
+  }
+  return sessionId;
+}
+
 async function createCapturedExecutionComposition(owner: InteractiveRootOwner): Promise<{
   composition: Awaited<ReturnType<typeof createExecutionRuntimeHostComposition>>;
   manager: SessionManager;
@@ -939,7 +965,6 @@ async function createClaimedGraphChild(input: {
   const child = await input.stores.sessionStore.createSubagent({
     cwd: input.root,
     name: `Graph operator ${input.suffix}`,
-    backend: 'ai-sdk',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'explore',
diff --git a/packages/runtime-host/src/__tests__/execution-inspect-uds.test.ts b/packages/runtime-host/src/__tests__/execution-inspect-uds.test.ts
index 633dcbad8..b9af046ec 100644
--- a/packages/runtime-host/src/__tests__/execution-inspect-uds.test.ts
+++ b/packages/runtime-host/src/__tests__/execution-inspect-uds.test.ts
@@ -31,7 +31,6 @@ test('a live Host serves Interactive inspection over its real endpoint while ret
   const session = await stores.sessionStore.create({
     cwd: root,
     name: 'Live inspection',
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/execution-model-composition.test.ts b/packages/runtime-host/src/__tests__/execution-model-composition.test.ts
index 450792082..2f6695fcf 100644
--- a/packages/runtime-host/src/__tests__/execution-model-composition.test.ts
+++ b/packages/runtime-host/src/__tests__/execution-model-composition.test.ts
@@ -1059,7 +1059,6 @@ test('production Host executes a canonical ai-sdk Session against a real provide
     const execution = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await execution.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'hosted-real-provider',
       model: MODEL_ID,
       permissionMode: 'ask',
@@ -1375,7 +1374,6 @@ test('production Host executes and durably supervises an Agent Graph over a real
     const execution = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await execution.sessionStore.create({
       cwd: project,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'hosted-graph-provider',
       model: MODEL_ID,
       permissionMode: 'bypass',
@@ -1576,7 +1574,6 @@ test('production Host executes a durable runnable child with an exact tool ceili
     const execution = await openInteractiveExecutionStoresForWrite(owner.lease);
     const parent = await execution.sessionStore.create({
       cwd: project,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'hosted-child-provider',
       model: MODEL_ID,
       permissionMode: 'bypass',
@@ -1774,7 +1771,6 @@ test('production Host publishes and retires an implementation child patch', asyn
     const execution = await openInteractiveExecutionStoresForWrite(owner.lease);
     const parent = await execution.sessionStore.create({
       cwd: project,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'hosted-child-provider',
       model: MODEL_ID,
       permissionMode: 'bypass',
@@ -2018,7 +2014,6 @@ test('Host auxiliary calls preserve resolved DeepSeek reasoning settings', async
     await publishConnectionModel(policy, connection.connectionId, 'deepseek-v4-flash');
     const session = await execution.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'deepseek-auxiliary',
       model: 'deepseek-v4-flash',
       thinkingLevel: 'high',
@@ -2097,7 +2092,6 @@ test('Host auxiliary models meter provider usage and abort physical requests', {
     await publishConnectionModel(policy, connection.connectionId, MODEL_ID);
     const session = await execution.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'goal-evaluator-provider',
       model: MODEL_ID,
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/external-session-coordinator.test.ts b/packages/runtime-host/src/__tests__/external-session-coordinator.test.ts
index 1c0d8d2ba..7848588f2 100644
--- a/packages/runtime-host/src/__tests__/external-session-coordinator.test.ts
+++ b/packages/runtime-host/src/__tests__/external-session-coordinator.test.ts
@@ -240,7 +240,6 @@ test('imports through the generic importer and treats repeats as independent cop
     fixture.creates.map(({ input, messages, externalOrigin }) => ({
       cwd: input.cwd,
       name: input.name,
-      backend: input.backend,
       messageTypes: messages.map(({ type }) => type),
       externalOrigin,
     })),
@@ -248,14 +247,12 @@ test('imports through the generic importer and treats repeats as independent cop
       {
         cwd: '/external',
         name: 'Source 0',
-        backend: 'ai-sdk',
         messageTypes: ['user'],
         externalOrigin: { adapterId: 'codex', sourceSessionId: 'source-0' },
       },
       {
         cwd: '/external',
         name: 'Source 0',
-        backend: 'ai-sdk',
         messageTypes: ['user'],
         externalOrigin: { adapterId: 'codex', sourceSessionId: 'source-0' },
       },
@@ -567,7 +564,6 @@ function coordinatorFixture(
       defaultCreate(
         {
           cwd: '/external',
-          backend: 'ai-sdk',
           llmConnectionSlug: 'default',
           model: 'gpt-5',
           permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/fixtures/execution-host-suite.ts b/packages/runtime-host/src/__tests__/fixtures/execution-host-suite.ts
index c22b242dc..ca60aaca7 100644
--- a/packages/runtime-host/src/__tests__/fixtures/execution-host-suite.ts
+++ b/packages/runtime-host/src/__tests__/fixtures/execution-host-suite.ts
@@ -125,7 +125,6 @@ export class ExecutionFixture {
       stores = await openInteractiveExecutionStoresForWrite(owner.lease);
       const session = await stores.sessionStore.create({
         cwd: this.root,
-        backend: 'ai-sdk',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
@@ -475,7 +474,6 @@ export class ExecutionFixture {
       const child = await stores.sessionStore.createSubagent({
         cwd: this.root,
         name: `${agentName} ${kind}`,
-        backend: 'ai-sdk',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'explore',
@@ -1025,7 +1023,6 @@ export async function withExecutionRoot(
     stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await stores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/goal-coordinator.test.ts b/packages/runtime-host/src/__tests__/goal-coordinator.test.ts
index 648d4d633..09bf58ef8 100644
--- a/packages/runtime-host/src/__tests__/goal-coordinator.test.ts
+++ b/packages/runtime-host/src/__tests__/goal-coordinator.test.ts
@@ -27,7 +27,6 @@ test('one Host Goal is shared across clients with CAS control and crash-clear re
     const goalStore = await openInteractiveGoalAuthorityForWrite(owner.lease);
     const session = await stores.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -225,7 +224,6 @@ test('session retirement forgets a terminal Goal without recreating deleted auth
   try {
     const session = await stores.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -308,7 +306,6 @@ test('restart settles the durable current Goal execution through Hosted Executio
   try {
     const session = await stores.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -425,7 +422,6 @@ test('restart replaces a stale current execution with the current durable Goal i
   try {
     const session = await stores.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/goal-root-authority.test.ts b/packages/runtime-host/src/__tests__/goal-root-authority.test.ts
index 8ca97aafb..3f52a6f91 100644
--- a/packages/runtime-host/src/__tests__/goal-root-authority.test.ts
+++ b/packages/runtime-host/src/__tests__/goal-root-authority.test.ts
@@ -521,7 +521,6 @@ async function createFixture(options: { recoverAdmissions?: boolean } = {}): Pro
   const goalStore = await openInteractiveGoalAuthorityForWrite(owner.lease);
   const session = await stores.sessionStore.create({
     cwd: capability.canonicalPath,
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask',
@@ -599,7 +598,7 @@ async function createFixture(options: { recoverAdmissions?: boolean } = {}): Pro
     onSandboxBoundarySettled: async () => {},
   });
   const backends = new BackendRegistry();
-  backends.register('fake', (context) => new FakeBackend(context));
+  backends.register('ai-sdk', (context) => new FakeBackend(context));
   const authority: RuntimeHostedRootAuthority = {
     bindRun: (identity) => messages.bindRun(identity),
     executeRoot: (input) =>
diff --git a/packages/runtime-host/src/__tests__/interaction-coordinator.test.ts b/packages/runtime-host/src/__tests__/interaction-coordinator.test.ts
index 5169d1786..d30ba09b8 100644
--- a/packages/runtime-host/src/__tests__/interaction-coordinator.test.ts
+++ b/packages/runtime-host/src/__tests__/interaction-coordinator.test.ts
@@ -105,7 +105,6 @@ describe('HostInteractionCoordinator', () => {
       await mkdir(workspace);
       const session = await stores.sessionStore.create({
         cwd: workspace,
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
@@ -237,7 +236,6 @@ describe('HostInteractionCoordinator', () => {
       await mkdir(workspace);
       const session = await stores.sessionStore.create({
         cwd: workspace,
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
@@ -309,7 +307,6 @@ describe('HostInteractionCoordinator', () => {
       await mkdir(workspace);
       const session = await stores.sessionStore.create({
         cwd: workspace,
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
@@ -485,7 +482,6 @@ describe('HostInteractionCoordinator', () => {
       await mkdir(workspace);
       const session = await stores.sessionStore.create({
         cwd: workspace,
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/plan-two-client-uds.test.ts b/packages/runtime-host/src/__tests__/plan-two-client-uds.test.ts
index 00e8f0930..eb28f54f2 100644
--- a/packages/runtime-host/src/__tests__/plan-two-client-uds.test.ts
+++ b/packages/runtime-host/src/__tests__/plan-two-client-uds.test.ts
@@ -37,7 +37,6 @@ test('two Clients and a restarted production Host share one retry-safe Plan auth
     const planStore = await openInteractivePlanStoreForWrite(owner.lease);
     const session = await setupStores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'explore',
diff --git a/packages/runtime-host/src/__tests__/root-turn-coordinator.test.ts b/packages/runtime-host/src/__tests__/root-turn-coordinator.test.ts
index 739f60973..91c707937 100644
--- a/packages/runtime-host/src/__tests__/root-turn-coordinator.test.ts
+++ b/packages/runtime-host/src/__tests__/root-turn-coordinator.test.ts
@@ -100,7 +100,8 @@ test('prepares a fresh Agent Graph epoch before durable external Turn admission'
   let fixture!: FailureFixture;
   let cutovers = 0;
   fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     agentGraphEpochs: {
       currentGraphId: async (rootSessionId) => agentGraphIdForRootSession(rootSessionId),
       beginNextGraphEpoch: async (rootSessionId) => {
@@ -137,7 +138,8 @@ test('prepares a fresh Agent Graph epoch before durable external Turn admission'
 test('does not advance a finished graph for an ordinary default Turn', async () => {
   let cutovers = 0;
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     agentGraphEpochs: {
       currentGraphId: async (rootSessionId) => agentGraphIdForRootSession(rootSessionId),
       beginNextGraphEpoch: async (rootSessionId) => {
@@ -168,7 +170,8 @@ test('does not advance a finished graph for an ordinary default Turn', async ()
 test('startup recovery replays one admitted safe-boundary continuation without a UserMessage', async () => {
   const workspaceIdentity = 'workspace-safe-boundary-recovery';
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     continuationSafety: { workspaceIdentity, availableToolNames: [] },
   });
   let observer: ReturnType<SessionContinuityCoordinator['attachConnection']> | undefined;
@@ -254,7 +257,8 @@ test('a failed exact Capability retry does not poison the parked continuation bi
         }
       },
     },
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
   });
   const seedConnection = capabilities.attachConnection(
     clientCapabilityConnectionIdentity('provider-seed'),
@@ -395,7 +399,8 @@ test('resume query preserves Session-before-activation lock ordering', async ()
         }
       },
     },
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
   });
   const connection = capabilities.attachConnection(
     clientCapabilityConnectionIdentity('provider-lock-order'),
@@ -455,7 +460,8 @@ test('resume query preserves Session-before-activation lock ordering', async ()
 
 test('turn.start durably applies one exact per-Turn orchestration override', async () => {
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
   });
   const input = {
     sessionId: fixture.sessionId,
@@ -518,7 +524,8 @@ test('turn.start resolves explicit Skills once before durable admission and repl
     { send: async () => {} },
   );
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     clientCapabilities: capabilities,
     prepareSkillInvocation: async ({ sessionId }): Promise<PreparedSkillInvocationMessage> => {
       preparationCount += 1;
@@ -635,7 +642,8 @@ test('turn.start durably replays an all-failed invocation without creating a Tur
     ],
   };
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     prepareSkillInvocation: async (): Promise<PreparedSkillInvocationMessage> => {
       preparationCount += 1;
       return { disposition: 'blocked', skillInvocation };
@@ -669,7 +677,8 @@ test('turn.start durably replays an all-failed invocation without creating a Tur
 test('idle turn.message.submit applies hosted Skill preparation before durable admission', async () => {
   let preparationCount = 0;
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     prepareSkillInvocation: async (): Promise<PreparedSkillInvocationMessage> => {
       preparationCount += 1;
       return {
@@ -734,7 +743,8 @@ test('turn.start rejects oversized preparation before admission and preserves no
   let preparationCount = 0;
   let preparation: 'blocked' | 'oversized_content' | 'oversized_feedback' = 'blocked';
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     prepareSkillInvocation: async () => {
       preparationCount += 1;
       if (preparation === 'blocked') {
@@ -859,7 +869,8 @@ test('turn.start rejects oversized preparation before admission and preserves no
 
 test('turn.start admits only canonical live Session Artifact attachments', async () => {
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
     withArtifacts: true,
   });
   try {
@@ -989,13 +1000,13 @@ test('safe-boundary continuation safety identity uses the exact canonical tool c
 test('linked child Sessions reject public safe-boundary continuation', async () => {
   let recoveryCoordinator: RootTurnCoordinator | undefined;
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
   });
   try {
     const parent = await fixture.stores.sessionStore.readHeaderSnapshot(fixture.sessionId);
     const { header: child } = await fixture.stores.sessionStore.createSubagent({
       cwd: parent.cwd,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'execute',
@@ -1121,7 +1132,7 @@ test('worktree child Sessions reject roots outside managed child execution', asy
   let recoveryCoordinator: RootTurnCoordinator | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       }),
@@ -1139,7 +1150,6 @@ test('worktree child Sessions reject roots outside managed child execution', asy
   try {
     const { header: child } = await fixture.stores.sessionStore.createSubagent({
       cwd: binding.worktreePath,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'execute',
@@ -1304,7 +1314,7 @@ test('Agent Graph supervisor stop owns only graph-capable root Turns', async ()
   let backend: LinkedChildAuthorityBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       }),
@@ -1367,7 +1377,7 @@ test('Agent Graph supervisor stop rejects a stale graph identity inside session
   let currentGraphId = 'graph-before-rollover';
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       }),
@@ -1419,7 +1429,7 @@ test('Agent Graph supervisor stop owns a graph safe-boundary continuation', asyn
   const fixture = await createFailureFixture({
     continuationSafety: { workspaceIdentity, availableToolNames: [] },
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new BlockingRootBackend(context.sessionId);
         return backend;
       }),
@@ -1457,7 +1467,7 @@ test('Agent Graph supervisor wake waits for root idle and binds one durable exec
   let backend: LinkedChildAuthorityBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       }),
@@ -1551,7 +1561,7 @@ test('Agent Graph supervisor wake waits for root idle and binds one durable exec
 test('Agent Graph supervisor wake preserves structured context-overflow outcomes', async () => {
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => new ContextFailureBackend(context.sessionId)),
+      backends.register('ai-sdk', (context) => new ContextFailureBackend(context.sessionId)),
   });
   const graphId = agentGraphIdForRootSession(fixture.sessionId);
   try {
@@ -1595,7 +1605,7 @@ test('Agent Graph context recovery fences competing root turns while compaction
   let backend: BlockingContextRecoveryBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new BlockingContextRecoveryBackend(context.sessionId);
         return backend;
       }),
@@ -1654,7 +1664,7 @@ test('manual context compact uses durable root query, stop, and exact retry auth
   let backend: BlockingContextRecoveryBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new BlockingContextRecoveryBackend(context.sessionId);
         return backend;
       }),
@@ -1727,7 +1737,7 @@ test('startup recovery replays an admitted context compact with its exact Run id
   let backend: BlockingContextRecoveryBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new BlockingContextRecoveryBackend(context.sessionId);
         return backend;
       }),
@@ -1785,7 +1795,7 @@ test('Agent Graph context recovery abort stops compaction and releases Host clos
   let backend: BlockingContextRecoveryBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new BlockingContextRecoveryBackend(context.sessionId);
         return backend;
       }),
@@ -1823,7 +1833,7 @@ test('Agent Graph context recovery waits for a confirmed follow-up root', async
   let backend: GraphFollowupRecoveryBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) =>
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new GraphFollowupRecoveryBackend(context.sessionId);
         return backend;
       }),
@@ -1894,7 +1904,8 @@ test('Agent Graph context recovery waits for a confirmed follow-up root', async
 
 test('Agent Graph supervisor wake revalidates freshness before durable root admission', async () => {
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
   });
   const graphId = agentGraphIdForRootSession(fixture.sessionId);
   const turnId = 'turn-stale-graph-supervisor-wake';
@@ -1937,7 +1948,8 @@ test('Agent Graph supervisor wake revalidates freshness before durable root admi
 
 test('Agent Graph supervisor recovery closes a durable admission that has no Run', async () => {
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
   });
   const graphId = agentGraphIdForRootSession(fixture.sessionId);
   const wakeId = `${graphId}:snapshot-recovery`;
@@ -2007,7 +2019,8 @@ test('Agent Graph supervisor recovery closes a durable admission that has no Run
 
 test('hosted root target unavailability is retryable without poisoning the Host', async () => {
   const fixture = await createFailureFixture({
-    registerBackend: (backends) => backends.register('fake', (context) => new FakeBackend(context)),
+    registerBackend: (backends) =>
+      backends.register('ai-sdk', (context) => new FakeBackend(context)),
   });
   try {
     await assert.rejects(
@@ -2047,7 +2060,6 @@ test('hosted linked child roots share admission, message, terminal, and stop aut
     const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const parent = await stores.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -2147,7 +2159,7 @@ test('hosted linked child roots share admission, message, terminal, and stop aut
     };
     const backends = new BackendRegistry();
     const linkedBackends = new Map<string, LinkedChildAuthorityBackend>();
-    backends.register('fake', (context) => {
+    backends.register('ai-sdk', (context) => {
       if (!context.header.subagentRuntime) {
         return new QuestionWaitingBackend(context.sessionId);
       }
@@ -2653,7 +2665,7 @@ test('pre-bind startup failure fail-stops without orphaning an admitted queued M
   const releaseBackendFactory = deferred<void>();
   const fixture = await createFailureFixture({
     registerBackend: (backends) => {
-      backends.register('fake', async () => {
+      backends.register('ai-sdk', async () => {
         backendFactoryEntered.resolve();
         await releaseBackendFactory.promise;
         throw new Error('injected backend startup failure');
@@ -2751,7 +2763,7 @@ test('successor admission failure retains the terminal transition and its confir
   let backend: LinkedChildAuthorityBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       });
@@ -2878,7 +2890,7 @@ test('shutdown contains a successor backend start rejected by Interaction drain'
         store.listRootTurnAdmissionsForRecovery(sessionId),
     }),
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       });
@@ -2968,7 +2980,7 @@ test('Client Capability ambiguity fails before durable root admission', async ()
   const fixture = await createFailureFixture({
     clientCapabilities,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => new FakeBackend(context));
+      backends.register('ai-sdk', (context) => new FakeBackend(context));
     },
   });
   const first = clientCapabilities.attachConnection(
@@ -3048,7 +3060,7 @@ test('an exact active retry preserves the Client Capability admission binding',
   const fixture = await createFailureFixture({
     clientCapabilities,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       });
@@ -3143,7 +3155,7 @@ test('mixed-Client queued follow-ups preserve each submitting connection through
   const fixture = await createFailureFixture({
     clientCapabilities,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       });
@@ -3288,7 +3300,7 @@ async function assertFollowupCapabilityRebinding(affinity: 'call' | 'turn'): Pro
   const fixture = await createFailureFixture({
     clientCapabilities,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       });
@@ -3479,7 +3491,7 @@ test('an exact terminal retry does not require a live Client Capability binding'
   const fixture = await createFailureFixture({
     clientCapabilities,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => new FakeBackend(context));
+      backends.register('ai-sdk', (context) => new FakeBackend(context));
     },
   });
   const provider = clientCapabilities.attachConnection(
@@ -3571,7 +3583,7 @@ test('turn.start returns a published fast terminal before backend iterator clean
   let backend: TerminalThenCleanupBackend | undefined;
   const fixture = await createFailureFixture({
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new TerminalThenCleanupBackend(context.sessionId);
         return backend;
       });
@@ -3629,7 +3641,7 @@ test('public turn.stop rejects an admission queued behind its exact-Run closure
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new QueuedAdmissionBackend(context.sessionId);
         return backend;
       });
@@ -3704,7 +3716,7 @@ test('public turn.interrupt contains a question admission rejected by its own st
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new StopReleasedAdmissionBackend(context.sessionId);
         return backend;
       });
@@ -3759,7 +3771,7 @@ test('public turn.interrupt releases the Session lane while a queried Run is sti
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', async (context) => {
+      backends.register('ai-sdk', async (context) => {
         backendFactoryEntered.resolve();
         return await new Promise<never>((_resolve, reject) => {
           const abort = () => {
@@ -3849,7 +3861,7 @@ test('Runtime stop lets a running admission publish before its exact-Run closure
       await releasePreflight.promise;
     },
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new RunningAdmissionBackend(context.sessionId);
         return backend;
       });
@@ -3904,7 +3916,7 @@ test('post-start backend failure closes its owner without draining an unrelated
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         if (context.sessionId !== failingSessionId) {
           unrelatedBackend = new LinkedChildAuthorityBackend(context.sessionId);
           return unrelatedBackend;
@@ -3920,7 +3932,6 @@ test('post-start backend failure closes its owner without draining an unrelated
   try {
     const unrelatedSession = await fixture.stores.sessionStore.create({
       cwd: '/tmp/unrelated-active-root',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -4012,7 +4023,7 @@ test('claimed graph backend failure is contained after its failed terminal trans
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new AdmissionThenFailureBackend(context.sessionId);
         backendReady.resolve(backend);
         return backend;
@@ -4070,7 +4081,7 @@ test('failed claimed graph Run identity mismatch drains instead of being contain
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new AdmissionThenFailureBackend(context.sessionId);
         return backend;
       });
@@ -4119,7 +4130,7 @@ test('post-start backend AggregateError is contained after its failed terminal t
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new AdmissionThenFailureBackend(context.sessionId, aggregateFailure);
         return backend;
       });
@@ -4192,7 +4203,7 @@ test('post-start message owner cleanup failure drains after its failed terminal
   const cleanupFailure = new Error('message owner release failed');
   const fixture = await createFailureFixture({
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new LinkedChildAuthorityBackend(context.sessionId);
         return backend;
       });
@@ -4257,7 +4268,7 @@ test('public turn.stop wins the Session lane before a wire answer for the same R
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new PendingQuestionBackend(context.sessionId);
         return backend;
       });
@@ -4337,7 +4348,7 @@ test('public turn.stop takes over an earlier closure claim queued behind its lea
   const fixture = await createFailureFixture({
     withInteractions: true,
     registerBackend: (backends) => {
-      backends.register('fake', (context) => {
+      backends.register('ai-sdk', (context) => {
         backend = new TakeoverClosureBackend(context.sessionId);
         return backend;
       });
@@ -4656,7 +4667,6 @@ async function createFailureFixture(options: {
   await artifacts?.recover();
   const session = await stores.sessionStore.create({
     cwd: capability.canonicalPath,
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask',
@@ -4957,7 +4967,7 @@ async function waitUntil(
 }
 
 class LinkedChildAuthorityBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly externalHoldStarted = deferred<void>();
   readonly questionStarted = deferred<void>();
   sendCount = 0;
@@ -5052,7 +5062,7 @@ class LinkedChildAuthorityBackend implements AgentBackend {
 }
 
 class BlockingRootBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly started = deferred<void>();
   readonly #released = deferred<void>();
   stopCount = 0;
@@ -5088,7 +5098,7 @@ class BlockingRootBackend implements AgentBackend {
 }
 
 class ContextFailureBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
 
   constructor(readonly sessionId: string) {}
 
@@ -5128,7 +5138,7 @@ class ContextFailureBackend implements AgentBackend {
 }
 
 class BlockingContextRecoveryBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly compactStarted = deferred<void>();
   readonly #compactReleased = deferred<void>();
   compactInput: BackendCompactHistoryInput | undefined;
@@ -5168,7 +5178,7 @@ class BlockingContextRecoveryBackend implements AgentBackend {
 }
 
 class GraphFollowupRecoveryBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly graphTurnStarted = deferred<void>();
   readonly followupStarted = deferred<void>();
   readonly compactStarted = deferred<void>();
@@ -5246,7 +5256,7 @@ class GraphFollowupRecoveryBackend implements AgentBackend {
 }
 
 class QueuedAdmissionBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly readyForAdmission = deferred<void>();
   readonly admissionQueued = deferred<void>();
   readonly admissionFailure = deferred<unknown>();
@@ -5328,7 +5338,7 @@ class QueuedAdmissionBackend implements AgentBackend {
 }
 
 class StopReleasedAdmissionBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly ready = deferred<void>();
   private readonly stopped = deferred<void>();
 
@@ -5383,7 +5393,7 @@ class StopReleasedAdmissionBackend implements AgentBackend {
 }
 
 class RunningAdmissionBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly admitted = deferred<void>();
   readonly stopRequested = deferred<void>();
   readonly closureReasons: string[] = [];
@@ -5456,7 +5466,7 @@ class RunningAdmissionBackend implements AgentBackend {
 }
 
 class AdmissionThenFailureBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly admitted = deferred<void>();
   readonly closureReasons: string[] = [];
   private readonly fail = deferred<void>();
@@ -5512,7 +5522,7 @@ class AdmissionThenFailureBackend implements AgentBackend {
 }
 
 class TerminalThenCleanupBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   cleanupReleased = false;
   private readonly cleanup = deferred<void>();
 
@@ -5544,7 +5554,7 @@ class TerminalThenCleanupBackend implements AgentBackend {
 }
 
 class PendingQuestionBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly pendingRequest = deferred<string>();
   readonly closureReasons: string[] = [];
   answerApplications = 0;
@@ -5615,7 +5625,7 @@ class PendingQuestionBackend implements AgentBackend {
 }
 
 class TakeoverClosureBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sendStarted = deferred<void>();
   readonly stopStarted = deferred<void>();
   private readonly sendReleased = deferred<void>();
@@ -5665,7 +5675,7 @@ class TakeoverClosureBackend implements AgentBackend {
 }
 
 class QuestionWaitingBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   private stopped = false;
   private resolveAnswer: ((answers: readonly (string | null)[] | null) => void) | undefined;
   private releaseAfterAnswer: (() => void) | undefined;
diff --git a/packages/runtime-host/src/__tests__/runtime-policy-coordinator.test.ts b/packages/runtime-host/src/__tests__/runtime-policy-coordinator.test.ts
index 5f01fe125..3f67ec5cb 100644
--- a/packages/runtime-host/src/__tests__/runtime-policy-coordinator.test.ts
+++ b/packages/runtime-host/src/__tests__/runtime-policy-coordinator.test.ts
@@ -105,7 +105,6 @@ test('production composition shares one gate across mutation and backend activat
     const setupStores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await setupStores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -209,7 +208,6 @@ test('production mutation releases the gate before active-turn backend disposal
     const setupStores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await setupStores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -310,7 +308,6 @@ test('production policy mutation drains and poisons activation when cached backe
     const setupStores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await setupStores.sessionStore.create({
       cwd: root,
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/session-catalog-two-client-uds.test.ts b/packages/runtime-host/src/__tests__/session-catalog-two-client-uds.test.ts
index 414df2ca4..12dd3d53b 100644
--- a/packages/runtime-host/src/__tests__/session-catalog-two-client-uds.test.ts
+++ b/packages/runtime-host/src/__tests__/session-catalog-two-client-uds.test.ts
@@ -714,7 +714,6 @@ async function seedAuthority(
     const execution = await openInteractiveExecutionStoresForWrite(owner.lease);
     const unread = await execution.sessionStore.create({
       cwd: root,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -751,7 +750,6 @@ async function seedAuthority(
         'visible',
         ...Array.from({ length: 700 }, (_, index) => `label-${index}`),
       ],
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -759,7 +757,6 @@ async function seedAuthority(
     const oversized = await execution.sessionStore.create({
       cwd: root,
       projectId: 'p'.repeat(257),
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -767,7 +764,6 @@ async function seedAuthority(
     const retirement = await execution.sessionStore.create({
       cwd: root,
       name: 'Retirement sidecars',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -775,7 +771,6 @@ async function seedAuthority(
     const recovery = await execution.sessionStore.create({
       cwd: root,
       name: 'Retirement recovery',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/session-retirement-coordinator.test.ts b/packages/runtime-host/src/__tests__/session-retirement-coordinator.test.ts
index 471eed495..08ded21cf 100644
--- a/packages/runtime-host/src/__tests__/session-retirement-coordinator.test.ts
+++ b/packages/runtime-host/src/__tests__/session-retirement-coordinator.test.ts
@@ -1237,7 +1237,6 @@ function sessionInput(
 ): CreateSessionInput {
   return {
     cwd: '/workspace',
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/session-revision-two-client-uds.test.ts b/packages/runtime-host/src/__tests__/session-revision-two-client-uds.test.ts
index 68021f80b..7fcc8ee97 100644
--- a/packages/runtime-host/src/__tests__/session-revision-two-client-uds.test.ts
+++ b/packages/runtime-host/src/__tests__/session-revision-two-client-uds.test.ts
@@ -584,7 +584,6 @@ async function seedSource(
     const source = await execution.sessionStore.create({
       cwd: root,
       name: 'Source Session',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -592,7 +591,6 @@ async function seedSource(
     const busy = await execution.sessionStore.create({
       cwd: root,
       name: 'Busy Session',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -600,7 +598,6 @@ async function seedSource(
     const linkedChildSource = await execution.sessionStore.create({
       cwd: root,
       name: 'Linked Child Source Session',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -608,7 +605,6 @@ async function seedSource(
     const metadataLinkedSource = await execution.sessionStore.create({
       cwd: root,
       name: 'Metadata-linked Source Session',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -616,7 +612,6 @@ async function seedSource(
     const archivedOwnedSource = await execution.sessionStore.create({
       cwd: root,
       name: 'Archived-owned Source Session',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -624,7 +619,6 @@ async function seedSource(
     const continuationSource = await execution.sessionStore.create({
       cwd: root,
       name: 'Continuation Source Session',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -894,7 +888,6 @@ async function seedSource(
       {
         cwd: root,
         name: 'Graph Worker',
-        backend: 'ai-sdk',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
@@ -1132,7 +1125,6 @@ async function seedSource(
     const ordinaryLinkedChild = await execution.sessionStore.createSubagent({
       cwd: root,
       name: 'Metadata-linked Child Session',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/__tests__/session-transcript-reader.test.ts b/packages/runtime-host/src/__tests__/session-transcript-reader.test.ts
index c5f9a79fc..d4ee4998b 100644
--- a/packages/runtime-host/src/__tests__/session-transcript-reader.test.ts
+++ b/packages/runtime-host/src/__tests__/session-transcript-reader.test.ts
@@ -25,7 +25,6 @@ test('keeps durable history separate from the canonical active overlay', async (
     const stores = await openInteractiveExecutionStoresForWrite(owner.lease);
     const session = await stores.sessionStore.create({
       cwd: capability.canonicalPath,
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime-host/src/server/session-catalog-coordinator.ts b/packages/runtime-host/src/server/session-catalog-coordinator.ts
index 7c1383d99..fe3cc1b43 100644
--- a/packages/runtime-host/src/server/session-catalog-coordinator.ts
+++ b/packages/runtime-host/src/server/session-catalog-coordinator.ts
@@ -161,7 +161,6 @@ export class HostSessionCatalogCoordinator {
       this.#readRuntimePolicy(),
     ]);
     return {
-      backend: 'ai-sdk',
       llmConnectionSlug: model.connectionSlug,
       model: model.model,
       permissionMode: policy.policy.chatDefaults.permissionMode,
@@ -346,7 +345,6 @@ export class HostSessionCatalogCoordinator {
               ...(workspace.projectId === null ? {} : { projectId: workspace.projectId }),
               name: prepared.name,
               labels: [...prepared.labels],
-              backend: 'ai-sdk',
               llmConnectionSlug: model.connectionSlug,
               model: model.model,
               ...(input.thinkingLevel === undefined ? {} : { thinkingLevel: input.thinkingLevel }),
diff --git a/packages/runtime-host/src/server/session-revision-coordinator.ts b/packages/runtime-host/src/server/session-revision-coordinator.ts
index e9282ea7f..280915a6c 100644
--- a/packages/runtime-host/src/server/session-revision-coordinator.ts
+++ b/packages/runtime-host/src/server/session-revision-coordinator.ts
@@ -552,7 +552,6 @@ export class HostSessionRevisionCoordinator {
     const common: ConversationCopyCreateInput = {
       cwd: source.cwd,
       ...(source.projectId !== undefined ? { projectId: source.projectId } : {}),
-      backend: source.backend,
       llmConnectionSlug: source.llmConnectionSlug,
       model: source.model,
       ...(source.thinkingLevel !== undefined ? { thinkingLevel: source.thinkingLevel } : {}),
diff --git a/packages/runtime/src/__tests__/agent-run-steering-recovery.test.ts b/packages/runtime/src/__tests__/agent-run-steering-recovery.test.ts
index 06bc6812d..0da6eaff2 100644
--- a/packages/runtime/src/__tests__/agent-run-steering-recovery.test.ts
+++ b/packages/runtime/src/__tests__/agent-run-steering-recovery.test.ts
@@ -21,7 +21,6 @@ test('rejects an invalid tool mode before a durable AgentRun can be created', as
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -65,7 +64,6 @@ test('does not re-append atomically committed tool facts through the generic eve
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -140,7 +138,6 @@ test('acks a steering event whose canonical append preceded proof publication fa
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -218,7 +215,6 @@ test('materializes a durable steering event into the transcript exactly once', a
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -298,7 +294,6 @@ test('recovers a steering transcript message from the committed RuntimeEvent led
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -387,7 +382,6 @@ test('awaits canonical Run status persistence before accepting an interaction re
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -490,7 +484,6 @@ test('required interaction resume recovers a failed best-effort Run Store latch
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
@@ -605,7 +598,6 @@ test('required interaction resume stays fail-closed until a later required write
     const store = createSessionStore(root);
     const session = await store.create({
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/runtime/src/__tests__/execution-inspect.test.ts b/packages/runtime/src/__tests__/execution-inspect.test.ts
index 61e12bb2c..cf4e4b310 100644
--- a/packages/runtime/src/__tests__/execution-inspect.test.ts
+++ b/packages/runtime/src/__tests__/execution-inspect.test.ts
@@ -22,7 +22,6 @@ describe('versioned execution inspect documents', () => {
       const runtimeStore = createWorkspaceRuntimeStore(root);
       const session = await sessionStore.create({
         cwd: '/tmp/workspace',
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
diff --git a/packages/runtime/src/__tests__/latest-context-commit.test.ts b/packages/runtime/src/__tests__/latest-context-commit.test.ts
index ecff35ce0..96c41bcdb 100644
--- a/packages/runtime/src/__tests__/latest-context-commit.test.ts
+++ b/packages/runtime/src/__tests__/latest-context-commit.test.ts
@@ -44,7 +44,7 @@ test('a real send seals its row all the way into SQLite, with nothing injected',
     let clock = 1_000;
     const now = () => (clock += 1);
 
-    backends.register('fake', (ctx) =>
+    backends.register('ai-sdk', (ctx) =>
       createTestAiSdkBackend({
         sessionId: ctx.sessionId,
         header: ctx.header,
@@ -79,7 +79,6 @@ test('a real send seals its row all the way into SQLite, with nothing injected',
     });
     const session = await manager.createSession({
       cwd: root,
-      backend: 'fake',
       llmConnectionSlug: 'mock-main',
       permissionMode: 'bypass',
     });
diff --git a/packages/runtime/src/__tests__/runtime-continuation-crash.test.ts b/packages/runtime/src/__tests__/runtime-continuation-crash.test.ts
index 013f97437..0a6975708 100644
--- a/packages/runtime/src/__tests__/runtime-continuation-crash.test.ts
+++ b/packages/runtime/src/__tests__/runtime-continuation-crash.test.ts
@@ -135,7 +135,7 @@ async function runCrashChild(): Promise<void> {
   const runtimeEventStore = createCrashRuntimeStore(workspaceRoot);
   const backends = new BackendRegistry();
   backends.register(
-    'fake',
+    'ai-sdk',
     (ctx) =>
       new FakeBackend({
         sessionId: ctx.sessionId,
@@ -173,7 +173,6 @@ async function runCrashChild(): Promise<void> {
   });
   const session = await manager.createSession({
     cwd: workspaceRoot,
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'execute',
@@ -229,7 +228,7 @@ function createManager(workspaceRoot: string): {
   const runtimeEventStore = createCrashRuntimeStore(workspaceRoot);
   const backends = new BackendRegistry();
   backends.register(
-    'fake',
+    'ai-sdk',
     (ctx) =>
       new FakeBackend({
         sessionId: ctx.sessionId,
diff --git a/packages/runtime/src/__tests__/runtime-kernel-interaction.test.ts b/packages/runtime/src/__tests__/runtime-kernel-interaction.test.ts
index c8dbbabcd..b1461b342 100644
--- a/packages/runtime/src/__tests__/runtime-kernel-interaction.test.ts
+++ b/packages/runtime/src/__tests__/runtime-kernel-interaction.test.ts
@@ -25,7 +25,7 @@ describe('RuntimeKernel Interaction close cleanup', () => {
     const updateHeader = store.updateHeader;
     const backends = new BackendRegistry();
     const backend = new BlockingBackend(SESSION_ID, {});
-    backends.register('fake', () => backend);
+    backends.register('ai-sdk', () => backend);
     const startupFailure = new Error('mark running rejected after reservation');
     let stoppedFailure: Promise<unknown> | undefined;
     let kernel!: RuntimeKernel;
@@ -63,7 +63,7 @@ describe('RuntimeKernel Interaction close cleanup', () => {
     const store = memoryStore();
     const backends = new BackendRegistry();
     const backend = new BlockingBackend(SESSION_ID, {});
-    backends.register('fake', () => backend);
+    backends.register('ai-sdk', () => backend);
     const closeFailure = new Error('bind-race close rejected');
     const closeStarted = deferred<void>();
     const releaseClose = deferred<void>();
@@ -261,7 +261,7 @@ describe('RuntimeKernel Interaction close cleanup', () => {
       releaseSendOnStop: false,
       releaseSendOnDispose: false,
     });
-    backends.register('fake', () => backend);
+    backends.register('ai-sdk', () => backend);
     const secondReserved = deferred<void>();
     const releaseSecond = deferred<void>();
     let reservations = 0;
@@ -311,7 +311,7 @@ describe('RuntimeKernel Interaction close cleanup', () => {
     const store = memoryStore();
     const backends = new BackendRegistry();
     const built: BlockingBackend[] = [];
-    backends.register('fake', () => {
+    backends.register('ai-sdk', () => {
       const backend = new BlockingBackend(
         SESSION_ID,
         built.length === 0
@@ -380,7 +380,7 @@ describe('RuntimeKernel Interaction close cleanup', () => {
     const built: BlockingBackend[] = [];
     const stopFailure = new Error('backend stop failed');
     const disposeFailure = new Error('backend disposal failed');
-    backends.register('fake', () => {
+    backends.register('ai-sdk', () => {
       const backend = new BlockingBackend(SESSION_ID, {
         stopFailure,
         disposeFailure,
@@ -447,7 +447,7 @@ function runtimeFixture(options: RuntimeFixtureOptions = {}): {
   const store = memoryStore();
   const backends = new BackendRegistry();
   const backend = new BlockingBackend(SESSION_ID, options);
-  backends.register('fake', () => backend);
+  backends.register('ai-sdk', () => backend);
   const closeFailure = new Error('durable close rejected');
   let markCloseStarted!: () => void;
   const closeStarted = new Promise<void>((resolve) => {
@@ -510,7 +510,7 @@ function runtimeFixture(options: RuntimeFixtureOptions = {}): {
 }
 
 class BlockingBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly stopCalls: Array<{
     reason: 'user_stop' | 'redirect';
     mode: BackendStopMode | undefined;
@@ -610,7 +610,7 @@ function memoryStore(): SessionStore {
     status: 'active',
     statusUpdatedAt: 1,
     hasUnread: false,
-    backend: 'fake',
+    backend: 'ai-sdk',
     llmConnectionSlug: 'test',
     connectionLocked: true,
     model: 'test',
diff --git a/packages/runtime/src/__tests__/runtime-ledger-repair.test.ts b/packages/runtime/src/__tests__/runtime-ledger-repair.test.ts
index 8f5d0312a..d3903ed1f 100644
--- a/packages/runtime/src/__tests__/runtime-ledger-repair.test.ts
+++ b/packages/runtime/src/__tests__/runtime-ledger-repair.test.ts
@@ -70,7 +70,6 @@ test('repairs imported transcript turns into provider-neutral canonical history'
     const session = await sessions.createImportedSession(
       {
         cwd: '/repo',
-        backend: 'fake',
         llmConnectionSlug: 'deepseek',
         model: 'deepseek-v4-flash',
         permissionMode: 'ask',
diff --git a/packages/runtime/src/__tests__/sandbox-boundary-restart-recovery.test.ts b/packages/runtime/src/__tests__/sandbox-boundary-restart-recovery.test.ts
index 77eff8a38..69357e17b 100644
--- a/packages/runtime/src/__tests__/sandbox-boundary-restart-recovery.test.ts
+++ b/packages/runtime/src/__tests__/sandbox-boundary-restart-recovery.test.ts
@@ -232,7 +232,6 @@ function runEvent(sessionId: string): EmittedAgentRunEvent {
 function sessionInput(cwd: string): CreateSessionInput {
   return {
     cwd,
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask',
diff --git a/packages/runtime/src/__tests__/session-manager-terminal-ledger.test.ts b/packages/runtime/src/__tests__/session-manager-terminal-ledger.test.ts
index ea88125ed..bf484a033 100644
--- a/packages/runtime/src/__tests__/session-manager-terminal-ledger.test.ts
+++ b/packages/runtime/src/__tests__/session-manager-terminal-ledger.test.ts
@@ -220,7 +220,7 @@ describe('SessionManager terminal ledger invariants', () => {
     const runStore = new TinyAgentRunStore();
     const backends = new BackendRegistry();
     let backend: StopDuringSendBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new StopDuringSendBackend(ctx);
       return backend;
     });
@@ -264,7 +264,7 @@ describe('SessionManager terminal ledger invariants', () => {
     const store = new TinySessionStore();
     const runStore = new TinyAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new NeverEndingBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new NeverEndingBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -305,7 +305,7 @@ describe('SessionManager terminal ledger invariants', () => {
       },
     });
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new NeverEndingBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new NeverEndingBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -338,7 +338,7 @@ describe('SessionManager terminal ledger invariants', () => {
     const store = new TinySessionStore();
     const runStore = new TinyAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new NeverEndingBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new NeverEndingBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -378,7 +378,7 @@ describe('SessionManager terminal ledger invariants', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new ScriptBackend(ctx, [{ type: 'complete', stopReason: 'step_limit' }]),
     );
     const manager = new SessionManager({
@@ -2137,7 +2137,7 @@ async function makeHarness(
   const store = options.store ?? new TinySessionStore();
   const runStore = new TinyAgentRunStore();
   const backends = new BackendRegistry();
-  backends.register('fake', (ctx) => new ScriptBackend(ctx, events));
+  backends.register('ai-sdk', (ctx) => new ScriptBackend(ctx, events));
   const manager = new SessionManager({
     store,
     runStore,
@@ -2152,7 +2152,7 @@ async function makeHarness(
 }
 
 class ScriptBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -2181,7 +2181,7 @@ class ScriptBackend implements AgentBackend {
 }
 
 class StopDuringSendBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
   private readonly stopStarted = deferred<void>();
   private readonly stopReturned = deferred<void>();
@@ -2228,7 +2228,7 @@ class StopDuringSendBackend implements AgentBackend {
  * can finalize the run.
  */
 class NeverEndingBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(ctx: BackendFactoryContext) {
@@ -2282,7 +2282,7 @@ class TinySessionStore implements SessionStore {
       ...(input.parentSessionId ? { parentSessionId: input.parentSessionId } : {}),
       ...(input.branchOfTurnId ? { branchOfTurnId: input.branchOfTurnId } : {}),
       hasUnread: false,
-      backend: input.backend,
+      backend: 'ai-sdk',
       llmConnectionSlug: input.llmConnectionSlug,
       connectionLocked: false,
       model: input.model ?? 'fake-model',
@@ -2565,7 +2565,6 @@ class BatchingRuntimeEventStore implements RuntimeEventStore {
 function makeInput(overrides: Partial<CreateSessionInput> = {}): CreateSessionInput {
   return {
     cwd: '/tmp/cwd',
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask',
diff --git a/packages/runtime/src/__tests__/session-manager.test.ts b/packages/runtime/src/__tests__/session-manager.test.ts
index 2835b575b..be00dd12f 100644
--- a/packages/runtime/src/__tests__/session-manager.test.ts
+++ b/packages/runtime/src/__tests__/session-manager.test.ts
@@ -446,7 +446,7 @@ describe('SessionManager graph operator provisioning', () => {
     const runStore = new MemoryAgentRunStore();
     const parentGate = makeGate();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx, parentGate));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx, parentGate));
     const manager = new SessionManager({
       store,
       runStore,
@@ -1106,7 +1106,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backendBuilds = 0;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backendBuilds += 1;
       return new TestBackend(ctx);
     });
@@ -1138,7 +1138,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const executions: Parameters<RuntimeHostedRootAuthority['executeRoot']>[0][] = [];
     const authority = hostedRootAuthority();
     authority.executeRoot = async (input) => {
@@ -1232,7 +1232,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backendBuilds = 0;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backendBuilds += 1;
       return new TestBackend(ctx);
     });
@@ -1311,7 +1311,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const parent = await store.create(makeInput({ name: 'Supervisor' }));
     const child = await createGraphOperatorSession(store, parent.id);
     const claim = graphIntentClaim(
@@ -1383,7 +1383,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backendBuilds = 0;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backendBuilds += 1;
       return new TestBackend(ctx);
     });
@@ -1446,7 +1446,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const backends = new BackendRegistry();
     const backendGate = makeGate();
     const ready = makeGate();
-    backends.register('fake', (ctx) => new TestBackend(ctx, backendGate));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx, backendGate));
     const stoppedRoots: RuntimeMessageRunIdentity[] = [];
     let stoppedSessions = 0;
     const authority = hostedRootAuthority();
@@ -1562,7 +1562,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const backendsBySession = new Map<string, TestBackend>();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       backendsBySession.set(ctx.sessionId, backend);
       return backend;
@@ -1659,7 +1659,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const childGate = makeGate();
     const started = makeGate();
     let childBackend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       childBackend = new TestBackend(ctx, childGate);
       return childBackend;
     });
@@ -1743,7 +1743,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const firstGate = makeGate();
     const firstReady = makeGate();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx, firstGate);
       return backend;
     });
@@ -1801,7 +1801,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const admissionStarted = makeGate();
     const releaseAdmission = makeGate();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -1913,7 +1913,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backendBuilds = 0;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backendBuilds += 1;
       return new TestBackend(ctx);
     });
@@ -1967,7 +1967,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -2018,7 +2018,7 @@ describe('SessionManager claimed graph intent execution', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backendBuilds = 0;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backendBuilds += 1;
       return new TestBackend(ctx);
     });
@@ -2133,7 +2133,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const contexts: BackendFactoryContext[] = [];
     const backendActivationSessions: string[] = [];
     const backendsBySession = new Map<string, TestBackend>();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       contexts.push(ctx);
       const backend = new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate);
       backendsBySession.set(ctx.sessionId, backend);
@@ -2191,7 +2191,6 @@ describe('SessionManager child-session runtime primitive', () => {
     expect(childHeader.cwd).toBe('/tmp/project');
     expect(childHeader.projectId).toBe('project-1');
     expect(childHeader.workspaceRoot).toBe((await store.readHeader(parent.id)).workspaceRoot);
-    expect(childHeader.backend).toBe('fake');
     expect(childHeader.llmConnectionSlug).toBe('connection-1');
     expect(childHeader.model).toBe('model-1');
     expect(childHeader.thinkingLevel).toBe('medium');
@@ -2306,7 +2305,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate),
     );
     const manager = new SessionManager({
@@ -2391,7 +2390,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate),
     );
     const manager = new SessionManager({
@@ -2433,7 +2432,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     const backendsBySession = new Map<string, TestBackend>();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate);
       backendsBySession.set(ctx.sessionId, backend);
       return backend;
@@ -2504,7 +2503,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate),
     );
     const manager = new SessionManager({
@@ -2556,7 +2555,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const childInputs: BackendSendInput[] = [];
     let childAttempts = 0;
     let failClaimOnce = true;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       if (!ctx.header.subagentRuntime) return new TestBackend(ctx, parentGate);
       return {
         kind: 'fake' as const,
@@ -2815,7 +2814,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     const childInputs: BackendSendInput[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       if (!ctx.header.subagentRuntime) return new TestBackend(ctx, parentGate);
       return {
         kind: 'fake' as const,
@@ -2933,7 +2932,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const parentGate = makeGate();
     const childGate = makeGate();
     const backendsBySession = new Map<string, TestBackend>();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx, ctx.header.subagentRuntime ? childGate : parentGate);
       backendsBySession.set(ctx.sessionId, backend);
       return backend;
@@ -3011,7 +3010,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate),
     );
     const manager = new SessionManager({
@@ -3088,7 +3087,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate),
     );
     const manager = new SessionManager({
@@ -3227,7 +3226,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const backends = new BackendRegistry();
     const parentGate = makeGate();
     const contexts: BackendFactoryContext[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       contexts.push(ctx);
       return new TestBackend(ctx, ctx.header.subagentRuntime ? undefined : parentGate);
     });
@@ -3321,7 +3320,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const parentGate = makeGate();
     const compactCalls: Array<{ turnId: string; runtimeContextCount: number }> = [];
     const childBackends: LifecycleChildBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       if (!ctx.header.subagentRuntime) return new TestBackend(ctx, parentGate);
       const backend = new LifecycleChildBackend(ctx, compactCalls);
       childBackends.push(backend);
@@ -3418,7 +3417,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const parentGate = makeGate();
-    backends.register('fake', (ctx) => new TestBackend(ctx, parentGate));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx, parentGate));
     const manager = new SessionManager({
       store,
       runStore,
@@ -3533,7 +3532,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -3569,7 +3568,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     let externalParent:
       | {
           sessionId: string;
@@ -3623,7 +3622,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const childGates = [makeGate(), makeGate()];
     let childGateIndex = 0;
     const backendsBySession = new Map<string, TestBackend>();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const gate = ctx.header.subagentRuntime ? childGates[childGateIndex++] : parentGate;
       const backend = new TestBackend(ctx, gate);
       backendsBySession.set(ctx.sessionId, backend);
@@ -3709,7 +3708,7 @@ describe('SessionManager child-session runtime primitive', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -3815,7 +3814,7 @@ describe('SessionManager automatic titles', () => {
   test('falls back once on generation failure', async () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const changed = makeGate();
     let calls = 0;
     const manager = new SessionManager({
@@ -3844,7 +3843,7 @@ describe('SessionManager automatic titles', () => {
   test('does not overwrite or notify after a racing manual rename', async () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const release = makeGate();
     const attempted = makeGate();
     store.generatedTitleAttempted = attempted;
@@ -3880,7 +3879,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const runStore = new OrderingAgentRunStore();
     const backends = new BackendRegistry();
     const compactCalls: Array<{ turnId: string; runtimeContextCount: number }> = [];
-    backends.register('fake', (ctx) => new CompactingTestBackend(ctx, compactCalls));
+    backends.register('ai-sdk', (ctx) => new CompactingTestBackend(ctx, compactCalls));
     const manager = new SessionManager({
       store,
       runStore,
@@ -3889,9 +3888,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(10_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     await drain(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'hello' }));
     runStore.operations = [];
@@ -3964,7 +3961,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
         warnings: [],
       },
     });
-    backends.register('fake', (ctx) =>
+    backends.register('ai-sdk', (ctx) =>
       createTestAiSdkBackend({
         sessionId: ctx.sessionId,
         header: ctx.header,
@@ -4025,9 +4022,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(13_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     await drain(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'first '.repeat(400) }));
     await drain(manager.sendMessage(session.id, { turnId: 'turn-2', text: 'second' }));
@@ -4056,7 +4051,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FailOpenCompactingBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FailOpenCompactingBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -4065,9 +4060,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(12_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     await drain(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'hello' }));
     await drain(manager.compactSession(session.id, { turnId: 'turn-compact' }));
@@ -4095,7 +4088,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     });
     const backends = new BackendRegistry();
     const compactCalls: Array<{ turnId: string; runtimeContextCount: number }> = [];
-    backends.register('fake', (ctx) => new CompactingTestBackend(ctx, compactCalls));
+    backends.register('ai-sdk', (ctx) => new CompactingTestBackend(ctx, compactCalls));
     const manager = new SessionManager({
       store,
       runStore,
@@ -4104,9 +4097,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(15_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
     await drain(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'hello' }));
 
     blockPriorRead = true;
@@ -4141,7 +4132,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const backends = new BackendRegistry();
     const factoryStarts = new Map<string, ReturnType<typeof makeGate>>();
     const factoryModes = new Map<string, 'execution_cancellation' | 'abort_error'>();
-    backends.register('fake', async (ctx) => {
+    backends.register('ai-sdk', async (ctx) => {
       const started = factoryStarts.get(ctx.sessionId);
       const mode = factoryModes.get(ctx.sessionId);
       if (!started || !mode) throw new Error('cold compact factory was not configured');
@@ -4168,12 +4159,8 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(15_500),
     });
-    const cancelledSession = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
-    const abortErrorSession = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const cancelledSession = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
+    const abortErrorSession = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
     const cancelledStart = makeGate();
     const abortErrorStart = makeGate();
     factoryStarts.set(cancelledSession.id, cancelledStart);
@@ -4212,7 +4199,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const compactCalls: Array<{ turnId: string; runtimeContextCount: number }> = [];
-    backends.register('fake', (ctx) => new CompactingTestBackend(ctx, compactCalls));
+    backends.register('ai-sdk', (ctx) => new CompactingTestBackend(ctx, compactCalls));
     const manager = new SessionManager({
       store,
       runStore,
@@ -4221,9 +4208,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(17_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
     const readStarted = makeGate();
     const releaseRead = makeGate();
     store.nextReadHeaderGate = { started: readStarted, release: releaseRead };
@@ -4260,7 +4245,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     let compactingBackend: BlockingCompactBackend | undefined;
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new BlockingCompactBackend(ctx, {
           compactGate,
@@ -4278,9 +4263,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(20_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
     await drain(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'hello' }));
 
     const compactPromise = collectSessionEvents(
@@ -4307,7 +4290,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const compactCalls: Array<{ turnId: string; runtimeContextCount: number }> = [];
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new ActiveTurnBackend(ctx, { turnStarted, sendGate, compactCalls }),
     );
     const manager = new SessionManager({
@@ -4318,9 +4301,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
       newId: nextId(),
       now: nextNow(25_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     const sendPromise = (async () => {
       for await (const _event of manager.sendMessage(session.id, {
@@ -4486,7 +4467,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const readStarted = makeGate();
     const releaseRead = makeGate();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       backends,
@@ -4533,7 +4514,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const releaseUpdate = makeGate();
     const activatedModels: string[] = [];
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       activatedModels.push(ctx.header.model);
       return new TestBackend(ctx);
     });
@@ -4583,7 +4564,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const turnStarted = makeGate();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new (class extends ActiveTurnBackend {
           override async dispose(): Promise<void> {
@@ -4620,7 +4601,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     let disposeCalls = 0;
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new (class extends TestBackend {
           override async dispose(): Promise<void> {
@@ -4674,7 +4655,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     let disposeCalls = 0;
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new (class extends TestBackend {
           constructor() {
@@ -4752,7 +4733,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     let builds = 0;
     const disposed: number[] = [];
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const generation = ++builds;
       return new (class extends TestBackend {
         override async dispose(): Promise<void> {
@@ -4828,7 +4809,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     let builds = 0;
     const disposed: number[] = [];
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const generation = ++builds;
       return new (class extends TestBackend {
         override async dispose(): Promise<void> {
@@ -4898,7 +4879,7 @@ describe('SessionManager manual compaction and quiescent session changes', () =>
     const disposed: string[] = [];
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new (class extends TestBackend {
           override async dispose(): Promise<void> {
@@ -4964,7 +4945,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new AtomicBoundaryMemorySessionStore();
     const calls: string[] = [];
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       backends,
@@ -5078,7 +5059,7 @@ describe('SessionManager permission mode updates', () => {
     const firstGate = makeGate();
     const secondGate = makeGate();
     const gates = [firstGate, secondGate];
-    backends.register('fake', (ctx) => new TestBackend(ctx, gates.shift()));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx, gates.shift()));
     const manager = new SessionManager({
       store,
       runStore,
@@ -5129,7 +5110,7 @@ describe('SessionManager permission mode updates', () => {
   test('leaving explore clears the deep research label so visible read-only copy stays truthful', async () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({ store, backends, newId: nextId(), now: nextNow(6_000) });
     const session = await manager.createSession(
       makeInput({
@@ -5156,7 +5137,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FinalTextTestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FinalTextTestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -5189,7 +5170,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let inspectionCalls = 0;
-    backends.register('fake', (ctx) => new FinalTextTestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FinalTextTestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -5221,39 +5202,6 @@ describe('SessionManager permission mode updates', () => {
     expect(run?.workspaceIdentity).toBeUndefined();
   });
 
-  test('does not declare the T1 protocol for a backend without the durable tool boundary', async () => {
-    const store = new MemorySessionStore();
-    const runStore = new MemoryAgentRunStore();
-    const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new CountingFinalTextBackend(ctx, () => {}));
-    const runtimeEventStore = Object.assign(runStore, {
-      toolBoundaryProtocol: 't1_after_preflight_v1' as const,
-    });
-    const manager = new SessionManager({
-      store,
-      runStore,
-      runtimeEventStore,
-      toolBoundaryProtocol: 't1_after_preflight_v1',
-      backends,
-      newId: nextId(),
-      now: nextNow(6_050),
-      runtimeSource: 'test',
-    });
-    const session = await manager.createSession(makeInput());
-
-    await collectSessionEvents(
-      manager.sendMessage(session.id, {
-        turnId: 'turn-no-tool-boundary',
-        text: 'hello',
-      }),
-    );
-
-    const [run] = await runStore.listSessionRuns(session.id);
-    if (!run) throw new Error('expected run');
-    const events = await runStore.readRuntimeEvents(session.id, run.runId);
-    expect(events[0]?.actions?.runtimeProtocol).toBeUndefined();
-  });
-
   test('declares the T1 protocol for an AiSdk run when the host wires the durable boundary', async () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
@@ -5269,7 +5217,7 @@ describe('SessionManager permission mode updates', () => {
       now: nextNow(6_060),
       runtimeSource: 'test',
     });
-    const session = await manager.createSession(makeInput({ backend: 'ai-sdk' }));
+    const session = await manager.createSession(makeInput());
 
     await collectSessionEvents(
       manager.sendMessage(session.id, {
@@ -5501,7 +5449,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     const observed: InvocationResult[] = [];
     let backend: FinalTextTestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new FinalTextTestBackend(ctx);
       return backend;
     });
@@ -5591,7 +5539,7 @@ describe('SessionManager permission mode updates', () => {
       now: nextNow(6_550),
       runtimeSource: 'test',
     });
-    const session = await manager.createSession(makeInput({ backend: 'ai-sdk' }));
+    const session = await manager.createSession(makeInput());
     const header = await store.readHeader(session.id);
     const sourceRunId = 'source-run';
     const sourceTurnId = 'source-turn';
@@ -5731,7 +5679,7 @@ describe('SessionManager permission mode updates', () => {
     const sendGate = makeGate();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new ActiveTurnBackend(ctx, {
           turnStarted,
@@ -5839,7 +5787,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FinalTextTestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FinalTextTestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -5984,7 +5932,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FinalTextTestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FinalTextTestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -6098,7 +6046,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     let backendCalls = 0;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6185,7 +6133,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     let backendCalls = 0;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6280,7 +6228,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     let backendCalls = 0;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6391,7 +6339,7 @@ describe('SessionManager permission mode updates', () => {
     const releaseContinuationCommit = makeGate();
     let backendCalls = 0;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6489,7 +6437,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     let backendCalls = 0;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6571,7 +6519,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     let backendCalls = 0;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6659,7 +6607,7 @@ describe('SessionManager permission mode updates', () => {
     let backendCalls = 0;
     let failOnce = true;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6803,7 +6751,7 @@ describe('SessionManager permission mode updates', () => {
     let workspaceIdentity = 'workspace-1';
     const lifecycleEvents: Array<{ type: string; errorClass?: string }> = [];
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -6907,7 +6855,7 @@ describe('SessionManager permission mode updates', () => {
       let backendCalls = 0;
       let availableToolNames: readonly string[] = scenario.planned;
       backends.register(
-        'fake',
+        'ai-sdk',
         (ctx) =>
           new CountingFinalTextBackend(ctx, () => {
             backendCalls += 1;
@@ -6995,7 +6943,7 @@ describe('SessionManager permission mode updates', () => {
     let backendCalls = 0;
     let availableToolNames: readonly string[] = ['Write'];
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -7103,7 +7051,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     let backendCalls = 0;
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CountingFinalTextBackend(ctx, () => {
           backendCalls += 1;
@@ -7181,7 +7129,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -7291,7 +7239,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore({ failRuntimeEventAppendAfter: 3 });
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -7418,7 +7366,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -7444,7 +7392,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -7537,7 +7485,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -9026,7 +8974,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'end_turn' }]),
     );
     const manager = new SessionManager({
@@ -9076,7 +9024,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -9132,7 +9080,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'end_turn' }]),
     );
     const manager = new SessionManager({
@@ -9245,7 +9193,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const backendInstances: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       backendInstances.push(backend);
       return backend;
@@ -9370,7 +9318,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const backendInstances: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       backendInstances.push(backend);
       return backend;
@@ -9540,7 +9488,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const backendInstances: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       backendInstances.push(backend);
       return backend;
@@ -9623,7 +9571,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore({ failUpdateRunStatusOnce: 'failed' });
     const backends = new BackendRegistry();
     let backend: TurnScriptBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TurnScriptBackend(ctx, [
         [{ type: 'complete', stopReason: 'error' }],
         [
@@ -9677,7 +9625,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const backendInstances: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       backendInstances.push(backend);
       return backend;
@@ -9766,7 +9714,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const backendInstances: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       backendInstances.push(backend);
       return backend;
@@ -9812,7 +9760,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const childBackends: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       if (ctx.systemPrompt) childBackends.push(backend);
       return backend;
@@ -9890,7 +9838,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -10006,7 +9954,7 @@ describe('SessionManager permission mode updates', () => {
       async respondToSandboxBoundary(): Promise<void> {},
       async dispose(): Promise<void> {},
     });
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       contexts.push(ctx);
       return createBackend(ctx);
     });
@@ -10179,7 +10127,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let providerDispatches = 0;
-    backends.register('fake', (ctx) => ({
+    backends.register('ai-sdk', (ctx) => ({
       kind: 'fake' as const,
       sessionId: ctx.sessionId,
       async *send(input: BackendSendInput): AsyncIterable<SessionEvent> {
@@ -10321,7 +10269,7 @@ describe('SessionManager permission mode updates', () => {
         yield* super.send(input);
       }
     }
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       contexts.push(ctx);
       return new SeamProbeBackend(ctx);
     });
@@ -10371,7 +10319,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const contexts: BackendFactoryContext[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       contexts.push(ctx);
       return new TestBackend(ctx);
     });
@@ -10414,7 +10362,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const contexts: BackendFactoryContext[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       contexts.push(ctx);
       return new TestBackend(ctx);
     });
@@ -10478,7 +10426,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore({ failUpdateRunStatusOnce: 'completed' });
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -10533,7 +10481,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'step_limit' }]),
     );
     const manager = new SessionManager({
@@ -10561,7 +10509,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new HighVolumeDeltaBackend(ctx, 512));
+    backends.register('ai-sdk', (ctx) => new HighVolumeDeltaBackend(ctx, 512));
     const manager = new SessionManager({
       store,
       runStore,
@@ -10603,7 +10551,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     const childGate = makeGate();
     const backendInstances: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(
         ctx,
         ctx.header.permissionMode === 'explore' ? childGate : undefined,
@@ -10658,7 +10606,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let childBackend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       childBackend = new TestBackend(ctx);
       return childBackend;
     });
@@ -10711,7 +10659,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     const activeGate = makeGate();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx, activeGate);
       return backend;
     });
@@ -10766,7 +10714,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -10819,7 +10767,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     const buildStarted = makeGate();
     const releaseBuild = makeGate();
-    backends.register('fake', async () => {
+    backends.register('ai-sdk', async () => {
       buildStarted.release();
       await releaseBuild.promise;
       const error = new Error('backend activation timed out');
@@ -10871,7 +10819,7 @@ describe('SessionManager permission mode updates', () => {
     const buildStarted = makeGate();
     let factorySignal: AbortSignal | undefined;
     let dispatches = 0;
-    backends.register('fake', async (ctx) => {
+    backends.register('ai-sdk', async (ctx) => {
       factorySignal = ctx.abortSignal;
       if (!factorySignal) throw new Error('backend factory did not receive an abort signal');
       buildStarted.release();
@@ -10916,7 +10864,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const buildStarted = makeGate();
-    backends.register('fake', async (ctx) => {
+    backends.register('ai-sdk', async (ctx) => {
       if (!ctx.abortSignal) throw new Error('backend factory did not receive an abort signal');
       buildStarted.release();
       await timerDelay(60_000, undefined, { signal: ctx.abortSignal });
@@ -10958,7 +10906,7 @@ describe('SessionManager permission mode updates', () => {
     let builds = 0;
     let firstDisposeCalls = 0;
     let firstDispatches = 0;
-    backends.register('fake', async (ctx) => {
+    backends.register('ai-sdk', async (ctx) => {
       builds += 1;
       if (builds === 1) {
         buildStarted.release();
@@ -11025,7 +10973,7 @@ describe('SessionManager permission mode updates', () => {
     const releaseBuild = makeGate();
     let builds = 0;
     let disposeCalls = 0;
-    backends.register('fake', async (ctx) => {
+    backends.register('ai-sdk', async (ctx) => {
       builds += 1;
       buildStarted.release();
       await releaseBuild.promise;
@@ -11099,7 +11047,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     const childGate = makeGate();
     let childBackend: RetryStopBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       if (ctx.header.permissionMode !== 'explore') return new TestBackend(ctx);
       childBackend = new RetryStopBackend(ctx, childGate);
       return childBackend;
@@ -11152,7 +11100,7 @@ describe('SessionManager permission mode updates', () => {
     const stopStarted = makeGate();
     const releaseStop = makeGate();
     let backend: ConcurrentStopBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new ConcurrentStopBackend(ctx, stopStarted, releaseStop);
       return backend;
     });
@@ -11204,7 +11152,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -11262,7 +11210,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: TestBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new TestBackend(ctx);
       return backend;
     });
@@ -11312,7 +11260,7 @@ describe('SessionManager permission mode updates', () => {
     const releaseSend = makeGate();
     let builds = 0;
     let backend: PermissionBroadcastBackend | undefined;
-    backends.register('fake', async (ctx) => {
+    backends.register('ai-sdk', async (ctx) => {
       builds += 1;
       buildStarted.release();
       await releaseBuild.promise;
@@ -11368,7 +11316,7 @@ describe('SessionManager permission mode updates', () => {
     const childGate = makeGate();
     let parentBackend: SandboxBoundaryWaitBackend | undefined;
     let childBackend: PermissionBroadcastBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       if (ctx.header.permissionMode === 'explore') {
         childBackend = new PermissionBroadcastBackend(ctx, childGate);
         return childBackend;
@@ -11422,7 +11370,7 @@ describe('SessionManager permission mode updates', () => {
     const childGate = makeGate();
     let parentBackend: CountingStopBackend | undefined;
     let childBackend: RetryStopBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       if (ctx.header.permissionMode === 'explore') {
         childBackend = new RetryStopBackend(ctx, childGate);
         return childBackend;
@@ -11480,7 +11428,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     const sendGate = makeGate();
     let backend: CountingStopBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new CountingStopBackend(ctx, sendGate);
       return backend;
     });
@@ -11530,7 +11478,7 @@ describe('SessionManager permission mode updates', () => {
     const backends = new BackendRegistry();
     const sendGate = makeGate();
     let backend: CountingStopBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new CountingStopBackend(ctx, sendGate);
       return backend;
     });
@@ -11580,7 +11528,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const backendInstances: TestBackend[] = [];
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       const backend = new TestBackend(ctx);
       backendInstances.push(backend);
       return backend;
@@ -11642,7 +11590,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -11844,7 +11792,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -11932,7 +11880,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12019,7 +11967,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12096,7 +12044,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', () => {
+    backends.register('ai-sdk', () => {
       throw new Error('backend init failed');
     });
     const manager = new SessionManager({
@@ -12145,7 +12093,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: SandboxBoundaryWaitBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new SandboxBoundaryWaitBackend(ctx);
       return backend;
     });
@@ -12192,7 +12140,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FakeBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FakeBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12201,7 +12149,7 @@ describe('SessionManager permission mode updates', () => {
       newId: nextId(),
       now: nextNow(9_000),
     });
-    const session = await manager.createSession(makeInput({ backend: 'fake' }));
+    const session = await manager.createSession(makeInput());
 
     const iterator = manager
       .sendMessage(session.id, { turnId: 'turn-1', text: FAKE_ASK_USER_QUESTION_PROMPT })
@@ -12248,7 +12196,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FakeBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FakeBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12257,7 +12205,7 @@ describe('SessionManager permission mode updates', () => {
       newId: nextId(),
       now: nextNow(9_000),
     });
-    const session = await manager.createSession(makeInput({ backend: 'fake' }));
+    const session = await manager.createSession(makeInput());
 
     const iterator = manager
       .sendMessage(session.id, { turnId: 'turn-1', text: FAKE_ASK_USER_QUESTION_PROMPT })
@@ -12282,7 +12230,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new SandboxBoundaryWaitBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new SandboxBoundaryWaitBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12317,7 +12265,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new UnmappedSessionEventBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new UnmappedSessionEventBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12359,7 +12307,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new UnmappedSessionEventBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new UnmappedSessionEventBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12410,7 +12358,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'error' }]),
     );
     const manager = new SessionManager({
@@ -12437,7 +12385,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'step_limit' }]),
     );
     const manager = new SessionManager({
@@ -12473,7 +12421,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new EventBackend(ctx, [
           { type: 'error', recoverable: false, reason: 'tool_failed', message: 'Tool failed' },
@@ -12501,7 +12449,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
     const gate = makeGate();
-    backends.register('fake', (ctx) => new TestBackend(ctx, gate));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx, gate));
     const manager = new SessionManager({ store, backends, newId: nextId(), now: nextNow(12_500) });
     const session = await manager.createSession(makeInput());
 
@@ -12527,7 +12475,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: StopControlledAbortBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new StopControlledAbortBackend(ctx);
       return backend;
     });
@@ -12579,7 +12527,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new EventBackend(ctx, [
           { type: 'text_delta', messageId: 'm1', text: 'before' },
@@ -12632,7 +12580,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new ThrowAfterTerminalBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new ThrowAfterTerminalBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12675,7 +12623,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     const gate = makeGate();
-    backends.register('fake', (ctx) => new LateErrorBackend(ctx, gate));
+    backends.register('ai-sdk', (ctx) => new LateErrorBackend(ctx, gate));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12713,7 +12661,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TraceBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TraceBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12727,7 +12675,7 @@ describe('SessionManager permission mode updates', () => {
     await drain(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'hello' }));
 
     const [run] = await runStore.listSessionRuns(session.id);
-    expect(run?.backendKind).toBe('fake');
+    expect(run?.backendKind).toBe('ai-sdk');
     expect(run?.llmConnectionSlug).toBe('fake');
     expect(run?.modelId).toBe('fake-model');
     expect(run?.permissionMode).toBe('ask');
@@ -12755,7 +12703,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new ProviderCaptureAfterAttemptFailureBackend(
           ctx,
@@ -12806,7 +12754,7 @@ describe('SessionManager permission mode updates', () => {
       },
     });
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new ProviderRequestTraceBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new ProviderRequestTraceBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -12842,7 +12790,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new ProviderCaptureGateBackend(ctx, () => (providerDispatches += 1)),
     );
     const manager = new SessionManager({
@@ -12871,7 +12819,7 @@ describe('SessionManager permission mode updates', () => {
     const cleanupCalled = makeGate();
     let observedEventIds: string[] = [];
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new HistoryCompactCheckpointBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new HistoryCompactCheckpointBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -13008,7 +12956,7 @@ describe('SessionManager permission mode updates', () => {
     const observedCheckpointIds: Array<string | undefined> = [];
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new HistoryCompactCheckpointCacheProbeBackend(ctx, observedCheckpointIds),
     );
     const manager = new SessionManager({
@@ -13054,7 +13002,7 @@ describe('SessionManager permission mode updates', () => {
     const observedCoverage: Array<number | undefined> = [];
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new HistoryCompactCheckpointMonotonicProbeBackend(ctx, observedCoverage),
     );
     const manager = new SessionManager({
@@ -13109,7 +13057,7 @@ describe('SessionManager permission mode updates', () => {
     const writeOutcomes: string[] = [];
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new SameCoverageCheckpointReplacementProbeBackend(ctx, writeOutcomes),
     );
     const manager = new SessionManager({
@@ -13166,7 +13114,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new SerializedCheckpointProbeBackend(ctx, childRecorderCalled, recorderReturnedPromises),
     );
@@ -13234,7 +13182,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new RecoveringCheckpointWriteProbeBackend(
           ctx,
@@ -13307,7 +13255,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CheckpointRecorderContractProbeBackend(
           ctx,
@@ -13350,7 +13298,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new CheckpointRecorderContractProbeBackend(
           ctx,
@@ -13418,7 +13366,7 @@ describe('SessionManager permission mode updates', () => {
     });
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) =>
         new InitialCheckpointLoadRaceProbeBackend(
           ctx,
@@ -13522,7 +13470,7 @@ describe('SessionManager permission mode updates', () => {
     const writeOutcomes: string[] = [];
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new CheckpointRecorderContractProbeBackend(ctx, async () => {}, writeOutcomes),
     );
     const manager = new SessionManager({
@@ -13598,7 +13546,7 @@ describe('SessionManager permission mode updates', () => {
   test('startup recovery marks persisted running turns as failed instead of leaving them stuck', async () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({ store, backends, newId: nextId(), now: nextNow(12_800) });
     const running = await manager.createSession(makeInput({ status: 'running' }));
     const waiting = await manager.createSession(makeInput({ status: 'waiting_for_user' }));
@@ -13729,7 +13677,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     let sessionId = '';
     let outcomeCommitFailuresRemaining = 3;
     let outcomeCommitAttempts = 0;
@@ -13862,7 +13810,7 @@ describe('SessionManager permission mode updates', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new TestBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -13982,7 +13930,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'end_turn' }]),
     );
     const manager = new SessionManager({
@@ -14015,7 +13963,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'end_turn' }]),
     );
     const manager = new SessionManager({
@@ -14561,7 +14509,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'end_turn' }]),
     );
     const manager = new SessionManager({
@@ -14634,7 +14582,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'end_turn' }]),
     );
     const manager = new SessionManager({
@@ -14673,7 +14621,7 @@ describe('SessionManager permission mode updates', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     backends.register(
-      'fake',
+      'ai-sdk',
       (ctx) => new EventBackend(ctx, [{ type: 'complete', stopReason: 'end_turn' }]),
     );
     const manager = new SessionManager({
@@ -14704,7 +14652,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FakeBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FakeBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -14741,7 +14689,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FakeBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FakeBackend(ctx));
     const identities: RuntimeMessageRunIdentity[] = [];
     const acked: string[] = [];
     const nacked: string[] = [];
@@ -14779,9 +14727,7 @@ describe('SessionManager steering and followup queues', () => {
         },
       },
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     const events = await drainAll(
       manager.sendMessage(session.id, { turnId: 'turn-host-message', text: 'start' }),
@@ -14822,7 +14768,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FakeBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FakeBackend(ctx));
     const identities: RuntimeInteractionRunIdentity[] = [];
     const lifecycle: string[] = [];
     const manager = new SessionManager({
@@ -14848,9 +14794,7 @@ describe('SessionManager steering and followup queues', () => {
       },
       canonicalPermissionOutcomes: noCanonicalPermissionOutcomes,
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     await drainAll(
       manager.sendMessage(session.id, { turnId: 'turn-host-interaction', text: 'go' }),
@@ -14866,7 +14810,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new FakeBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new FakeBackend(ctx));
     const lifecycle: string[] = [];
     let question: RuntimeUserQuestionContinuation | undefined;
     const manager = new SessionManager({
@@ -14893,9 +14837,7 @@ describe('SessionManager steering and followup queues', () => {
       },
       canonicalPermissionOutcomes: noCanonicalPermissionOutcomes,
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'ask' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'ask' }));
     const iterator = manager
       .sendMessage(session.id, {
         turnId: 'turn-host-question-abandoned',
@@ -14920,7 +14862,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new UnadmittedQuestionBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new UnadmittedQuestionBackend(ctx));
     let releases = 0;
     const manager = new SessionManager({
       store,
@@ -14942,9 +14884,7 @@ describe('SessionManager steering and followup queues', () => {
       },
       canonicalPermissionOutcomes: noCanonicalPermissionOutcomes,
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'ask' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'ask' }));
 
     let failure: unknown;
     try {
@@ -14960,7 +14900,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new ThrowBeforeTerminalBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new ThrowBeforeTerminalBackend(ctx));
     let releases = 0;
     const manager = new SessionManager({
       store,
@@ -14981,9 +14921,7 @@ describe('SessionManager steering and followup queues', () => {
         }),
       },
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     let failure: unknown;
     try {
@@ -15002,7 +14940,7 @@ describe('SessionManager steering and followup queues', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let failBuilds = 1;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       if (failBuilds > 0) {
         failBuilds -= 1;
         throw new Error('backend build failed');
@@ -15017,9 +14955,7 @@ describe('SessionManager steering and followup queues', () => {
       newId: nextId(),
       now: nextNow(1_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     let failed: unknown;
     try {
@@ -15057,7 +14993,7 @@ describe('SessionManager steering and followup queues', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: GatedSteeringBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new GatedSteeringBackend(ctx);
       return backend;
     });
@@ -15069,9 +15005,7 @@ describe('SessionManager steering and followup queues', () => {
       newId: nextId(),
       now: nextNow(1_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     const first = drainAll(manager.sendMessage(session.id, { turnId: 'turn-a', text: 'first' }));
     await waitUntil(() => backend?.gates.has('turn-a') === true);
@@ -15306,7 +15240,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const backends = new BackendRegistry();
     let backend: GatedSteeringBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new GatedSteeringBackend(ctx);
       return backend;
     });
@@ -15316,9 +15250,7 @@ describe('SessionManager steering and followup queues', () => {
       newId: nextId(),
       now: nextNow(1_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     const turn = drainAll(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'go' }));
     await waitUntil(() => backend?.gates.has('turn-1') === true);
@@ -15468,7 +15400,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new ForgingQueueBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new ForgingQueueBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -15477,9 +15409,7 @@ describe('SessionManager steering and followup queues', () => {
       newId: nextId(),
       now: nextNow(1_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     const events = await drainAll(
       manager.sendMessage(session.id, { turnId: 'turn-1', text: 'go' }),
@@ -15504,7 +15434,7 @@ describe('SessionManager steering and followup queues', () => {
     const store = new MemorySessionStore();
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
-    backends.register('fake', (ctx) => new ProviderRetryProgressBackend(ctx));
+    backends.register('ai-sdk', (ctx) => new ProviderRetryProgressBackend(ctx));
     const manager = new SessionManager({
       store,
       runStore,
@@ -15513,9 +15443,7 @@ describe('SessionManager steering and followup queues', () => {
       newId: nextId(),
       now: nextNow(1_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     const events = await drainAll(
       manager.sendMessage(session.id, { turnId: 'turn-1', text: 'go' }),
@@ -15601,7 +15529,7 @@ describe('SessionManager steering and followup queues', () => {
     const runStore = new MemoryAgentRunStore();
     const backends = new BackendRegistry();
     let backend: GatedSteeringBackend | undefined;
-    backends.register('fake', (ctx) => {
+    backends.register('ai-sdk', (ctx) => {
       backend = new GatedSteeringBackend(ctx);
       return backend;
     });
@@ -15613,9 +15541,7 @@ describe('SessionManager steering and followup queues', () => {
       newId: nextId(),
       now: nextNow(1_000),
     });
-    const session = await manager.createSession(
-      makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-    );
+    const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
 
     const turn = drainAll(manager.sendMessage(session.id, { turnId: 'turn-1', text: 'go' }));
     await waitUntil(() => backend?.gates.has('turn-1') === true);
@@ -15704,7 +15630,7 @@ async function steeringDeliverySession(
   const backends = new BackendRegistry();
   let manager!: SessionManager;
   let sessionId = '';
-  backends.register('fake', (ctx) =>
+  backends.register('ai-sdk', (ctx) =>
     createTestAiSdkBackend({
       sessionId: ctx.sessionId,
       header: ctx.header,
@@ -15743,9 +15669,7 @@ async function steeringDeliverySession(
     now: nextNow(1_000),
   };
   manager = new SessionManager(managerDeps);
-  const session = await manager.createSession(
-    makeInput({ backend: 'fake', permissionMode: 'bypass' }),
-  );
+  const session = await manager.createSession(makeInput({ permissionMode: 'bypass' }));
   sessionId = session.id;
   return { manager, session, store };
 }
@@ -15757,7 +15681,7 @@ async function steeringDeliverySession(
  * land after the final step boundary (stranded steering).
  */
 class GatedSteeringBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
   readonly gates = new Map<string, Gate>();
   readonly pullDone = new Map<string, Gate>();
@@ -15955,7 +15879,7 @@ class DelegatingRuntimeKernel implements RuntimeKernelLike {
 }
 
 class UnadmittedQuestionBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(ctx: BackendFactoryContext) {
@@ -15987,7 +15911,7 @@ class UnadmittedQuestionBackend implements AgentBackend {
 }
 
 class TestBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
   readonly sendInputs: BackendSendInput[] = [];
   stopCalls = 0;
@@ -16279,7 +16203,7 @@ function compactHistoryFailOpenResult() {
 }
 
 class HighVolumeDeltaBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -16316,7 +16240,7 @@ class HighVolumeDeltaBackend implements AgentBackend {
 }
 
 class LateErrorBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -16357,7 +16281,7 @@ class LateErrorBackend implements AgentBackend {
 }
 
 class StopControlledAbortBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
   private releaseAbort: () => void = () => {};
   private releaseStop: () => void = () => {};
@@ -16419,7 +16343,7 @@ type PartialEvent =
   | Omit<Extract<SessionEvent, { type: 'abort' }>, 'id' | 'turnId' | 'ts'>;
 
 class TurnScriptBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
   readonly sendInputs: BackendSendInput[] = [];
 
@@ -16454,7 +16378,7 @@ class TurnScriptBackend implements AgentBackend {
 }
 
 class EventBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -16483,7 +16407,7 @@ class EventBackend implements AgentBackend {
 }
 
 class SandboxBoundaryWaitBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
   readonly responses: SandboxBoundaryResponse[] = [];
   private readonly responseGate = makeGate();
@@ -16548,7 +16472,7 @@ class SandboxBoundaryWaitBackend implements AgentBackend {
  * it into a control-only RuntimeEvent, and the ledger keeps it.
  */
 class UnmappedSessionEventBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(ctx: BackendFactoryContext) {
@@ -16587,7 +16511,7 @@ class UnmappedSessionEventBackend implements AgentBackend {
 }
 
 class ThrowAfterTerminalBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(ctx: BackendFactoryContext) {
@@ -16619,7 +16543,7 @@ class ThrowAfterTerminalBackend implements AgentBackend {
 }
 
 class ThrowBeforeTerminalBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(ctx: BackendFactoryContext) {
@@ -16644,7 +16568,7 @@ class ThrowBeforeTerminalBackend implements AgentBackend {
 }
 
 class TraceBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(private readonly ctx: BackendFactoryContext) {
@@ -16698,7 +16622,7 @@ class TraceBackend implements AgentBackend {
 }
 
 class ProviderRequestTraceBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(private readonly ctx: BackendFactoryContext) {
@@ -16760,7 +16684,7 @@ class ProviderRequestTraceBackend implements AgentBackend {
 }
 
 class ProviderCaptureGateBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -16801,7 +16725,7 @@ class ProviderCaptureGateBackend implements AgentBackend {
 }
 
 class ProviderCaptureAfterAttemptFailureBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -16884,7 +16808,7 @@ class ProviderCaptureAfterAttemptFailureBackend implements AgentBackend {
 }
 
 class HistoryCompactCheckpointBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(private readonly ctx: BackendFactoryContext) {
@@ -16930,7 +16854,7 @@ class HistoryCompactCheckpointBackend implements AgentBackend {
 }
 
 class HistoryCompactCheckpointCacheProbeBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -16983,7 +16907,7 @@ class HistoryCompactCheckpointCacheProbeBackend implements AgentBackend {
 }
 
 class HistoryCompactCheckpointMonotonicProbeBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -17041,7 +16965,7 @@ class HistoryCompactCheckpointMonotonicProbeBackend implements AgentBackend {
 }
 
 class SameCoverageCheckpointReplacementProbeBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -17097,7 +17021,7 @@ class SameCoverageCheckpointReplacementProbeBackend implements AgentBackend {
 }
 
 class SerializedCheckpointProbeBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -17156,7 +17080,7 @@ class SerializedCheckpointProbeBackend implements AgentBackend {
 }
 
 class RecoveringCheckpointWriteProbeBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -17220,7 +17144,7 @@ class RecoveringCheckpointWriteProbeBackend implements AgentBackend {
 }
 
 class CheckpointRecorderContractProbeBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -17278,7 +17202,7 @@ class CheckpointRecorderContractProbeBackend implements AgentBackend {
 }
 
 class InitialCheckpointLoadRaceProbeBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(
@@ -17448,7 +17372,7 @@ class MemorySessionStore implements SessionStore {
       ...(input.revisionIndex !== undefined ? { revisionIndex: input.revisionIndex } : {}),
       ...(input.revisionState ? { revisionState: input.revisionState } : {}),
       hasUnread: false,
-      backend: input.backend,
+      backend: 'ai-sdk',
       llmConnectionSlug: input.llmConnectionSlug,
       connectionLocked: false,
       model: input.model ?? 'fake-model',
@@ -18134,7 +18058,7 @@ class ContinuationClaimBarrierRunStore extends MemoryAgentRunStore {
 
 /** Yields a forged queue_update before completing — round-6 R3's attacker. */
 class ForgingQueueBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(ctx: BackendFactoryContext) {
@@ -18175,7 +18099,7 @@ class ForgingQueueBackend implements AgentBackend {
 }
 
 class ProviderRetryProgressBackend implements AgentBackend {
-  readonly kind = 'fake' as const;
+  readonly kind = 'ai-sdk' as const;
   readonly sessionId: string;
 
   constructor(ctx: BackendFactoryContext) {
@@ -18396,7 +18320,6 @@ function hostedRootAuthority(): RuntimeHostedRootAuthority {
 function makeInput(overrides: Partial<CreateSessionInput> = {}): CreateSessionInput {
   return {
     cwd: '/tmp/cwd',
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask',
@@ -18520,7 +18443,7 @@ async function createQueuedGraphScenario(firstAbortSignal?: AbortSignal) {
   const firstReady = makeGate();
   const stopStarted = makeGate();
   let backend!: TestBackend;
-  backends.register('fake', (ctx) => {
+  backends.register('ai-sdk', (ctx) => {
     backend = new (class extends TestBackend {
       override async stop(
         reason: 'user_stop' | 'redirect',
@@ -18615,7 +18538,7 @@ function makeRunHeader(overrides: Partial<AgentRunHeader> = {}): AgentRunHeader
     sessionId: 'session-1',
     turnId: 'turn-1',
     status: 'running',
-    backendKind: 'fake',
+    backendKind: 'ai-sdk',
     llmConnectionSlug: 'fake',
     modelId: 'fake-model',
     cwd: '/tmp/cwd',
@@ -18643,7 +18566,7 @@ function makeManagerForReadCutover(
   runStore: AgentRunStore & RuntimeEventStore,
 ): SessionManager {
   const backends = new BackendRegistry();
-  backends.register('fake', (ctx) => new TestBackend(ctx));
+  backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
   return new SessionManager({
     store,
     runStore,
@@ -19029,7 +18952,7 @@ async function seedBoundaryRestartSession(input: {
   const store = new MemorySessionStore();
   const runStore = new MemoryAgentRunStore();
   const backends = new BackendRegistry();
-  backends.register('fake', (ctx) => new TestBackend(ctx));
+  backends.register('ai-sdk', (ctx) => new TestBackend(ctx));
   const managerDeps = {
     store,
     runStore,
diff --git a/packages/runtime/src/__tests__/shell-run-tool-result.test.ts b/packages/runtime/src/__tests__/shell-run-tool-result.test.ts
index 4084c1917..7578b6642 100644
--- a/packages/runtime/src/__tests__/shell-run-tool-result.test.ts
+++ b/packages/runtime/src/__tests__/shell-run-tool-result.test.ts
@@ -116,7 +116,6 @@ describe('shell run sandbox denial projection', () => {
       const store = createSessionStore(root);
       const session = await store.create({
         cwd: '/workspace',
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         model: 'fake-model',
         permissionMode: 'ask',
diff --git a/packages/runtime/src/__tests__/stream-graph-coordinator.test.ts b/packages/runtime/src/__tests__/stream-graph-coordinator.test.ts
index aab0a61fa..208336dab 100644
--- a/packages/runtime/src/__tests__/stream-graph-coordinator.test.ts
+++ b/packages/runtime/src/__tests__/stream-graph-coordinator.test.ts
@@ -258,7 +258,7 @@ describe('host-managed agent graph coordinator', () => {
       },
     });
     const backends = new BackendRegistry();
-    backends.register('fake', (context) => new FakeBackend(context));
+    backends.register('ai-sdk', (context) => new FakeBackend(context));
     const manager = new SessionManager({
       store: sessionStore,
       runStore,
@@ -279,7 +279,6 @@ describe('host-managed agent graph coordinator', () => {
     try {
       const rootSession = await manager.createSession({
         cwd: root,
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         permissionMode: 'ask',
         name: 'Graph supervisor',
@@ -1075,7 +1074,7 @@ describe('host-managed agent graph coordinator', () => {
       join(root, OPERATIONAL_STATE_DATABASE_NAME),
     );
     const backends = new BackendRegistry();
-    backends.register('fake', (context) => new FakeBackend(context));
+    backends.register('ai-sdk', (context) => new FakeBackend(context));
     const manager = new SessionManager({
       store: sessionStore,
       runStore,
@@ -1090,7 +1089,6 @@ describe('host-managed agent graph coordinator', () => {
     try {
       const rootSession = await manager.createSession({
         cwd: root,
-        backend: 'fake',
         llmConnectionSlug: 'fake',
         permissionMode: 'ask',
         orchestrationMode: 'swarm',
diff --git a/packages/runtime/src/runtime-kernel.ts b/packages/runtime/src/runtime-kernel.ts
index 23b612ffe..18ea7e108 100644
--- a/packages/runtime/src/runtime-kernel.ts
+++ b/packages/runtime/src/runtime-kernel.ts
@@ -692,8 +692,8 @@ export class RuntimeKernel implements RuntimeKernelLike {
         store: this.deps.store,
         runStore: this.deps.runStore,
         runtimeEventStore: this.deps.runtimeEventStore,
-        ...(runtimeToolBoundaryProtocol(this.deps, header)
-          ? { toolBoundaryProtocol: runtimeToolBoundaryProtocol(this.deps, header) }
+        ...(this.deps.toolBoundaryProtocol
+          ? { toolBoundaryProtocol: this.deps.toolBoundaryProtocol }
           : {}),
         repairRunRuntimeLedger: this.deps.repairRunRuntimeLedger,
         newId: this.deps.newId,
@@ -835,7 +835,7 @@ export class RuntimeKernel implements RuntimeKernelLike {
       );
     }
 
-    const continuationToolBoundaryProtocol = runtimeToolBoundaryProtocol(this.deps, header);
+    const continuationToolBoundaryProtocol = this.deps.toolBoundaryProtocol;
     const run = new AgentRun({
       sessionId: continuation.sessionId,
       header,
@@ -1003,8 +1003,8 @@ export class RuntimeKernel implements RuntimeKernelLike {
       store: this.deps.store,
       runStore: this.deps.runStore,
       runtimeEventStore: this.deps.runtimeEventStore,
-      ...(runtimeToolBoundaryProtocol(this.deps, header)
-        ? { toolBoundaryProtocol: runtimeToolBoundaryProtocol(this.deps, header) }
+      ...(this.deps.toolBoundaryProtocol
+        ? { toolBoundaryProtocol: this.deps.toolBoundaryProtocol }
         : {}),
       repairRunRuntimeLedger: this.deps.repairRunRuntimeLedger,
       newId: this.deps.newId,
@@ -1182,8 +1182,8 @@ export class RuntimeKernel implements RuntimeKernelLike {
       store: this.deps.store,
       runStore: this.deps.runStore,
       runtimeEventStore: this.deps.runtimeEventStore,
-      ...(runtimeToolBoundaryProtocol(this.deps, childHeader)
-        ? { toolBoundaryProtocol: runtimeToolBoundaryProtocol(this.deps, childHeader) }
+      ...(this.deps.toolBoundaryProtocol
+        ? { toolBoundaryProtocol: this.deps.toolBoundaryProtocol }
         : {}),
       repairRunRuntimeLedger: this.deps.repairRunRuntimeLedger,
       newId: this.deps.newId,
@@ -1329,7 +1329,7 @@ export class RuntimeKernel implements RuntimeKernelLike {
       );
     }
     await this.deps.continuationFailpoint?.('after_continuation_claim_committed');
-    const continuationToolBoundaryProtocol = runtimeToolBoundaryProtocol(this.deps, childHeader);
+    const continuationToolBoundaryProtocol = this.deps.toolBoundaryProtocol;
     const durableAdmission: {
       claimedRunHeader: AgentRunHeader;
       commitContinuationStart: (
@@ -3752,13 +3752,6 @@ function childActiveKey(sessionId: string, turnId: string): string {
   return `${sessionId}:${turnId}`;
 }
 
-function runtimeToolBoundaryProtocol(
-  deps: Pick<RuntimeKernelDeps, 'toolBoundaryProtocol'>,
-  header: Pick<SessionHeader, 'backend'>,
-): ToolBoundaryProtocol | undefined {
-  return header.backend === 'ai-sdk' ? deps.toolBoundaryProtocol : undefined;
-}
-
 function effectiveOrchestrationForRun(
   run: AgentRunHeader,
   session: SessionHeader,
diff --git a/packages/runtime/src/session-manager.ts b/packages/runtime/src/session-manager.ts
index cd6f9d701..fa04e7fa0 100644
--- a/packages/runtime/src/session-manager.ts
+++ b/packages/runtime/src/session-manager.ts
@@ -2550,7 +2550,6 @@ export class SessionManager {
         cwd: workspace?.worktreePath ?? parentHeader.cwd,
         ...(parentHeader.projectId !== undefined ? { projectId: parentHeader.projectId } : {}),
         name: resolvedPreset?.name ?? definition.name,
-        backend: parentHeader.backend,
         llmConnectionSlug: resolvedPreset?.connectionSlug ?? parentHeader.llmConnectionSlug,
         model: resolvedPreset?.model ?? parentHeader.model,
         ...(resolvedPreset
@@ -3089,7 +3088,6 @@ export class SessionManager {
         cwd: workspace?.worktreePath ?? parentHeader.cwd,
         ...(parentHeader.projectId !== undefined ? { projectId: parentHeader.projectId } : {}),
         name: input.name ?? input.resolvedPreset?.name ?? definition.name,
-        backend: parentHeader.backend,
         llmConnectionSlug: input.resolvedPreset?.connectionSlug ?? parentHeader.llmConnectionSlug,
         model: input.resolvedPreset?.model ?? parentHeader.model,
         ...(input.resolvedPreset
@@ -4953,7 +4951,6 @@ export class SessionManager {
       {
         cwd: header.cwd,
         ...(header.projectId !== undefined ? { projectId: header.projectId } : {}),
-        backend: header.backend,
         llmConnectionSlug: header.llmConnectionSlug,
         model: header.model,
         thinkingLevel: header.thinkingLevel,
@@ -5016,7 +5013,6 @@ export class SessionManager {
       {
         cwd: header.cwd,
         ...(header.projectId !== undefined ? { projectId: header.projectId } : {}),
-        backend: header.backend,
         llmConnectionSlug: header.llmConnectionSlug,
         model: header.model,
         thinkingLevel: header.thinkingLevel,
diff --git a/packages/storage/src/__tests__/external-session-importer.test.ts b/packages/storage/src/__tests__/external-session-importer.test.ts
index dc849c084..565368057 100644
--- a/packages/storage/src/__tests__/external-session-importer.test.ts
+++ b/packages/storage/src/__tests__/external-session-importer.test.ts
@@ -150,7 +150,6 @@ describe('ExternalSessionImporter', () => {
 
 function target(overrides: Partial<ExternalSessionImportTarget> = {}): ExternalSessionImportTarget {
   return {
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'maka-model',
     permissionMode: 'ask',
diff --git a/packages/storage/src/__tests__/goal-authority.test.ts b/packages/storage/src/__tests__/goal-authority.test.ts
index 662e31a62..1be86d895 100644
--- a/packages/storage/src/__tests__/goal-authority.test.ts
+++ b/packages/storage/src/__tests__/goal-authority.test.ts
@@ -117,7 +117,6 @@ test('Session retirement atomically removes its Goal authority', async () => {
       ['archive', 'remove'].map((name) =>
         stores.sessionStore.create({
           cwd: capability.canonicalPath,
-          backend: 'fake',
           llmConnectionSlug: 'fake',
           model: 'fake-model',
           permissionMode: 'ask',
diff --git a/packages/storage/src/__tests__/operational-state-backup.test.ts b/packages/storage/src/__tests__/operational-state-backup.test.ts
index 3502fb2f0..3c88be967 100644
--- a/packages/storage/src/__tests__/operational-state-backup.test.ts
+++ b/packages/storage/src/__tests__/operational-state-backup.test.ts
@@ -36,7 +36,6 @@ test('backs up and restores runtime.sqlite plus artifact bytes', async () => {
     const session = await sessions.create({
       projectId: project.id,
       cwd: '/tmp/cwd',
-      backend: 'fake',
       llmConnectionSlug: 'fake',
       model: 'fake-model',
       permissionMode: 'ask',
diff --git a/packages/storage/src/__tests__/session-bundle-policy.test.ts b/packages/storage/src/__tests__/session-bundle-policy.test.ts
index 206eddb94..9e833dfcb 100644
--- a/packages/storage/src/__tests__/session-bundle-policy.test.ts
+++ b/packages/storage/src/__tests__/session-bundle-policy.test.ts
@@ -141,7 +141,6 @@ test('retains only the selected Session partial stream segments', async () => {
 function input(name: string): CreateSessionInput {
   return {
     cwd: '/tmp/cwd',
-    backend: 'fake',
     llmConnectionSlug: 'fake',
     model: 'fake-model',
     permissionMode: 'ask' as const,
diff --git a/packages/storage/src/__tests__/session-store.test.ts b/packages/storage/src/__tests__/session-store.test.ts
index 883a06f53..87d853d0d 100644
--- a/packages/storage/src/__tests__/session-store.test.ts
+++ b/packages/storage/src/__tests__/session-store.test.ts
@@ -1079,7 +1079,6 @@ describe('SQLite SessionStore', () => {
 function makeInput(overrides: Partial<CreateSessionInput> = {}): CreateSessionInput {
   return {
     cwd: '/tmp/cwd',
-    backend: 'ai-sdk',
     llmConnectionSlug: 'test-connection',
     model: 'test-model',
     permissionMode: 'ask',
diff --git a/packages/storage/src/__tests__/settings-store-usage.test.ts b/packages/storage/src/__tests__/settings-store-usage.test.ts
index d1cfc9024..7f88b83ce 100644
--- a/packages/storage/src/__tests__/settings-store-usage.test.ts
+++ b/packages/storage/src/__tests__/settings-store-usage.test.ts
@@ -13,7 +13,6 @@ async function seedSession(workspaceRoot: string, messages: StoredMessage[]): Pr
   try {
     const header = await sessions.create({
       cwd: '/tmp/maka-workspace',
-      backend: 'ai-sdk',
       llmConnectionSlug: 'anthropic',
       model: 'claude-sonnet-4',
       permissionMode: 'ask',
@@ -77,7 +76,6 @@ describe('SettingsStore.usageStats request logs', () => {
     try {
       const header = await sessions.create({
         cwd: '/tmp/maka-workspace',
-        backend: 'ai-sdk',
         llmConnectionSlug: 'sqlite-provider',
         model: 'sqlite-default-model',
         permissionMode: 'ask',
diff --git a/packages/storage/src/session-store.ts b/packages/storage/src/session-store.ts
index a8370c1ad..4dc5e36d5 100644
--- a/packages/storage/src/session-store.ts
+++ b/packages/storage/src/session-store.ts
@@ -1036,7 +1036,7 @@ function buildSessionHeader(
     ...(input.revisionIndex !== undefined ? { revisionIndex: input.revisionIndex } : {}),
     ...(input.revisionState ? { revisionState: input.revisionState } : {}),
     hasUnread: false,
-    backend: input.backend,
+    backend: 'ai-sdk',
     llmConnectionSlug: input.llmConnectionSlug,
     connectionLocked: false,
     model: input.model ?? 'default',


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@maka.apache.org
For additional commands, e-mail: commits-help@maka.apache.org