Zero / Durable Zero · карта реальных подключений

Снимок main: 7ef44a26815d26e9446dd709de5d814d68a95259 · 2026-11-06 · source trace, не приёмка runtime

Схемы текущей реализации ниже — не будущий дизайн. Сначала процессы, затем все механизмы замены по уровню доступности. Зелёный — существующий параметр и реальный потребитель, не сертификат полной работоспособности. Выбор LLM и файлов настроек показан отдельно от DI.

Направление развития · планируемое разделение

Zero — основа. Durable Zero — одна из сборок.

Zero — headless/backendless harness: нейтральные контракты и независимо используемые модули без обязательной модели, оболочки или инфраструктуры поставщика. Backendless не означает отсутствие процессов, вычислений или хранения.

Zero

Общие порты, координация и компоненты с чистым API. Их можно использовать отдельно и связывать внешними инструментами композиции, без обязательного DI-контейнера в каждом модуле.

Durable Zero

Конкретная референсная сборка: Pi Durable, native execution/storage и выбранные реализации модулей. Использует публичные контракты Zero; не становится обязательной начинкой всех других harness.

Терминал опционален и не является частью ядра. CLI, TUI, web и другие клиенты — внешние оболочки headless/backendless harness. Их отключение не должно останавливать runtime. Текущий native terminal — клиент Durable Zero, не требование к Zero.

Это целевое направление, не заявление о выполненном разделении репозиториев или проверенной совместимости всех альтернативных сборок. Название пакета само по себе не определяет границу extraction.

Архитектурный ориентир для разработки

Лучше всего руководствоваться репозиторием arch-rules и его полным скоупом AP-правил. Выбирайте применимые правила по границам изменения и риску; правила про БД, UI или распределённое исполнение применяйте там, где есть соответствующая ответственность.

Скиллы не обязательны. Способ работы и инструменты остаются на выбор контрибьютора. Важны архитектурные ограничения, реальные доказательства поведения и объяснение неприменимых правил, а не установка набора скиллов.

Что важно сохранять

Нейтральное ядро AP-020 / AP-025

Core зависит от общих портов, не от Pi Durable, TUI, BB или конкретной БД. Native DTO не становятся общими простым переименованием. Необязательные адаптеры могут поставляться отдельными пакетами.

Композиция снаружи AP-073 / AP-074

Конкретные реализации и defaults выбирает recipe/composition root. Независимым компонентам не нужен обязательный DI-SDK. Нет скрытого global container, monkey-patching или регистрации с побочными эффектами импорта.

Явное владение и lifecycle AP-023 / AP-059

Один владелец исполнения на открытую сессию; в Durable Zero это native Harness. Отключение клиента не равно shutdown. Определены creation, readiness, cancellation, cleanup и поведение reload при активной работе.

Совместимые публичные контракты AP-026 / AP-046

Фиксируйте версии и capabilities. Используйте публичные package exports, не соседний ../src и не приватные поля SDK. Unsupported — явная ошибка, а не фиктивный успех. Breaking changes требуют миграционного решения.

Доказанная заменяемость AP-075 / AP-076

Сначала сквозной рабочий путь. Add, replace и remove — разные операции; конфигурация модели не равна замене движка. Переданная зависимость реально вызывается, стандартная замещённая реализация не исполняется. Admission receipt не является завершённым результатом.

Как понять, что можно расширять

Ниже — карта текущего main 7ef44a2. Целевые принципы выше и фактическая зрелость API ниже — разные слои. Цвет обозначает способ подключения, не сертификат полной работоспособности.

Пять уровней готовности точки расширения

Публичный вход есть

Реализуйте указанный контракт и подключите его через entry. Проверьте реального consumer и ограничения. Доступный параметр ещё не сертифицирует вашу комбинацию.

Только нижний API

Нижний native seam существует, но публичный recipe его не пропускает. Сначала нужен явный путь конфигурации либо отдельная сборка.

Точки замены пока нет

Обоснуйте необходимость нового контракта или используйте свой host/recipe. Не обходите границу копированием внутренних файлов.

Намеренный native owner

Это внутренняя ответственность конкретной Pi-backed сборки. Не требуется превращать каждый конструктор SDK в универсальный DI-слот.

Контракт не подключён

Сначала подключите production-путь и покажите реальное исполнение. Наличие интерфейса или standalone helper не делает функцию готовой.

Что приложить к расширению или изменению контракта
  1. Назначение модуля, публичный entry и контракт; выбранный слот или коллекция, различия add/replace/remove.
  2. Пример отдельного consumer-пакета без приватных импортов; требования к capabilities и версии.
  3. Владение ресурсами: кто создаёт, отменяет и закрывает; поведение при ошибке, reload и отключении клиента.
  4. Проверка фактического исполнения: вход → consumer → содержательный результат, abort/reopen и ошибки для затронутого сценария.
  5. Документация ограничений и честный статус проверки: source trace, component test, native acceptance — не одно и то же.

Для замены движка смотрите IAgentEngine, для окружения — Core execution environment / native factory, для добавления модулей — extensions. Новый слот сначала обсуждается как контракт, а не прячется в обходном пути.

01 · Реальный runtime и сообщения

01 · Кто запускает и кто исполняетФактические процессы и сообщения · prompt возвращает admission, результат приходит событиями · не graph imports G: явная передача Y: нижний API R: выбор зашит D: не подключено N: native owner Цвет = способ подключения, не итог тестов. Низкий уровень API не равен assembleDurableZero(). Клиентский процесс Процесс runtime / session owner local-terminal (опционально) ZeroTerminalClient + terminal-ui local-runtime Unix socket JSON-RPC; admission / reload queue runner assembleDurableZero(); одна готовая сборка core SessionCoordinator → IAgentEngine adapter-pi-durable PiDurableEngine → openDurable() SDK Harness + Chord Единственный model/tool/session execution owner ModelRuntime + Registry LLM providers, builtin / extension tools ExecutionEnvs + SQLite IO фабрика; native session storage RPC создаёт prompt engine.submit native submit env/storage Harness: models / registry tools Native state/events → local-runtime notifications → ZeroTerminalClient → UI Альтернативный вход: cli → runner/main.ts → assembleDurableZero(); тот же backend через stdio local-runtime требует native view/controller; custom IAgentEngine сам по себе их не даёт.

02 · Где DI / внешнее подключение уже есть

02 · Где DI / внешнее подключение уже естьТекущий main 7ef44a2 · слева направо: вход → реализация → потребитель · ограничения и evidence в atlas.html G: Явная DI / подключение уже есть Y: Только нижний native API R: Выбор зашит / нет слота D: Есть код/контракт, не включён N: Намеренный native owner Цвет = способ подключения, не итог тестов. Нижний API не равен публичной сборке. 1. Где передаётся / где выбор зашит 2. Что выбрано сейчас 3. Реальный потребитель G · Движок агентаassembleDurableZero({ engine }) IAgentEngine → PiDurableEngine по умолчанию SessionCoordinator.engine.start / submit / abort / close Generic engine получает stdio/Core, но сборка не возвращает ему native view/controller; terminal host требует эти порты. packages/runner/src/composition.ts:83 G · Native execution environmentassembleDurableZero({ nativeExecutionEnvFactory }) SDK NodeExecutionEnv по умолчанию ExecutionEnvs → Harness.env → filesystem / exec tools Нельзя одновременно передать Core factory. Полный SDK-контракт обязателен; CLI/socket-host не выставляют этот параметр. packages/runner/src/composition.ts:121 G · Core execution environmentassembleDurableZero({ executionEnvFactory }) IExecutionEnvironment → CoreExecutionEnvAdapter ExecutionEnvs → native Harness.env Core SPI уже native SDK; неподдержанные расширенные операции дают typed unsupported, это не полная замена любого native backend. packages/runner/src/composition.ts:65 G · Обычные Pi-расширения и toolsassembleDurableZero({ extensions, skills, noGlobalExtensions }) DefaultResourceLoader + ExtensionRunner installExtensionTools → native Registry; pending providers → ModelRuntime Это работающий путь добавления, но не API удаления/замены стандартных builtins или интегратора MCP. packages/runner/src/composition.ts:89 G · Вход / выход RPCassembleDurableZero({ stdin, stdout, onNotification }) Readable/Writable + callback StdioJsonRpcServer и coordinator.events Заменяются IO/наблюдатель, не сама transport strategy; socket-host использует именно этот путь. packages/runner/src/composition.ts:161 G · Данные, команды и settings UIrunDurableTui(source, controller, settings, ...) TerminalViewSource / TerminalController / TerminalSettings terminal-ui/vendor/experimental/durable/tui.js Это локальная DI на UI-границе. Native DurableView — намеренная concrete UI-зависимость, не утечка в Core. packages/terminal-ui/src/index.d.ts:50 G · UI команды MCP — опциональная границаDurableController.executeMcpCommand(args, ui) Native MCP handler + предоставленный ExtensionUIContext local-runtime MCP UI bridge → terminal RPC events Это native Durable controller boundary, не универсальная замена MCP-интегратора и не обязательный UI ядра. Один активный manager принадлежит конкретному соединению. packages/adapter-pi-durable/src/engine/runtime-types.ts:112

03 · Частично: нижний API есть, верхний recipe не пропускает

03 · Частично: нижний API есть, верхний recipe не пропускаетТекущий main 7ef44a2 · слева направо: вход → реализация → потребитель · ограничения и evidence в atlas.html G: Явная DI / подключение уже есть Y: Только нижний native API R: Выбор зашит / нет слота D: Есть код/контракт, не включён N: Намеренный native owner Цвет = способ подключения, не итог тестов. Нижний API не равен публичной сборке. 1. Где передаётся / где выбор зашит 2. Что выбрано сейчас 3. Реальный потребитель Y · Реализация runtime моделейPiDurableEngine.dependencies.modelRuntime Pi ModelRuntime; fallback ModelRuntime.create() Harness.open({ models: modelRuntime }); controller.setModel assembleDurableZero не принимает этот слот. Требуется native ModelRuntime contract, не Core IModelProvider. packages/adapter-pi-durable/src/engine/runtime-types.ts:37 Y · Native provider implementationsPiDurableEngine.dependencies.nativeProviders SDK Provider[] modelRuntime.registerNativeProvider(provider) provider/model строки выбирают модель, но не заменяют ModelRuntime. Прямой список providers не открыт верхним recipe. packages/adapter-pi-durable/src/engine/runtime-types.ts:38 Y · Settings/config providerPiDurableEngine.dependencies.settingsManager Native SettingsManager createHarnessSettings; model defaults; resource loading Верхний runner всегда создаёт SettingsManager.create(cwd). Это native тип, не произвольный zero-neutral config provider. packages/runner/src/composition.ts:92 Y · Ресурсы: AGENTS / skills / extensionsPiDurableEngine.dependencies.resourceLoader DefaultResourceLoader; extension-pi-resource оборачивает его reload/getExtensions/getSkills → prompt и ExtensionRunner Основная фабрика всегда создаёт DefaultResourceLoader. extension-pi-resource — data/wiring wrapper, а не отдельный универсальный resource backend. packages/runner/src/composition.ts:94 Y · Список дополнительных builtinsdependencies.builtins / openDurable.builtins или plugins BuiltinExtension[] (контракт в adapter-pi-durable) createCodingRegistry → builtinRegistry.initAll(ctx) Верхний runner передаёт только штатный codemode. На нижнем уровне список добавляется к coding-tools/subagents, не заменяет их. packages/adapter-pi-durable/src/engine/runtime-loader.ts:129 Y · Codemode как целый builtindependencies.builtins: [свой codemode] adapter-codemode → createCodemodeExtension BuiltinExtension.register → registry.install(ext) Основной runner жёстко вызывает createCodemodeBuiltinExtension(); добавлять второй codemode поверх его списка нельзя. packages/runner/src/composition.ts:86 Y · Файлы/содержимое system promptdependencies.prompt / openDurable.prompt PromptOptions: systemPromptPath/contextFiles/... createPiPrompt → buildSections Сам renderer createPiPrompt обязателен. resourceLoader/dynamicSections в итоговых options подставляются runtime-loader сверху. packages/adapter-pi-durable/src/engine/runtime-loader.ts:132 Y · Динамические prompt sectionsdependencies.dynamicSections DynamicPromptSections по умолчанию ExtensionRunner и createPiPrompt читают/обновляют sections Верхний assembleDurableZero не выставляет этот параметр. packages/adapter-pi-durable/src/engine/runtime-loader.ts:116

04 · Где выбор зашит; отдельно намеренные native owners

04 · Где выбор зашит; отдельно намеренные native ownersТекущий main 7ef44a2 · слева направо: вход → реализация → потребитель · ограничения и evidence в atlas.html G: Явная DI / подключение уже есть Y: Только нижний native API R: Выбор зашит / нет слота D: Есть код/контракт, не включён N: Намеренный native owner Цвет = способ подключения, не итог тестов. Нижний API не равен публичной сборке. 1. Где передаётся / где выбор зашит 2. Что выбрано сейчас 3. Реальный потребитель R · Sandbox внутри adapter-codemodeНет factory/constructor option new CodemodeSandbox() внутри register createCodemodeExtension({ sandbox }) Нельзя передать другой sandbox основному codemode адаптеру снаружи. packages/adapter-codemode/src/codemode.ts:24 R · Штатный coding-tools builtinВсегда добавляется в createCodingRegistry coding-tools.ts → SDK CodingTools/createCodingTools native Registry → read/write/edit/bash tools customBuiltins с тем же id отклоняется. Это не утверждение, что Pi extensions вообще не могут переопределить отдельное имя tool. packages/adapter-pi-durable/src/engine/harness-setup.ts:86 R · Штатный subagents builtinВсегда добавляется в createCodingRegistry builtin-extensions/subagents.ts native Registry → SDK subagent extension Настройка policy — другое: меняет данные политики, не реализацию builtin. packages/adapter-pi-durable/src/engine/harness-setup.ts:87 R · Интегратор MCPrunner extensionFactories: createMcpExtension() Native Pi MCP ExtensionFactory ResourceLoader → ExtensionRunner → adapted tools Отдельного upper-level mcpFactory нет. В текущем main MCP status больше не является startup readiness barrier; readiness вызывается перед native tool snapshots, cleanup — через session_shutdown. Это не слот замены интегратора. packages/runner/src/composition.ts:98 R · Tool discovery / namespacesСоздаются/устанавливаются внутри Pi bootstrap createToolSearchExtension + DynamicCodemodeNamespaces native registry / extension tool sync Это internal Pi integration, не готовый generic Zero slot. packages/adapter-pi-durable/src/engine/harness-setup.ts:104 R · Сам renderer promptВсегда registry.install(createPiPrompt(...)) adapter-pi-durable/engine/prompt.ts native registry sections PromptOptions позволяют менять данные, не выбирать другой renderer. packages/adapter-pi-durable/src/engine/harness-setup.ts:105 R · RPC transport implementationrunner: new StdioJsonRpcServer(...) protocol/StdioJsonRpcServer implements ITransportStrategy Inline handler → SessionCoordinator Socket-host оборачивает stdio через PassThrough; это реальный другой host, а не injected transport strategy. packages/runner/src/composition.ts:160 R · Выбор готового терминального UIlocal-terminal/main.ts: fixed dynamic import @local-durable/terminal-ui.runDurableTui ZeroTerminalClient через Native view/controller contract Терминал опционален и не является частью ядра headless/backendless Zero. В готовом terminal entrypoint выбор UI фиксирован; другой frontend использует свой entrypoint/клиент. packages/local-terminal/src/main.ts:21 N · Native session storageruntime-loader: openNodeSqliteStorage(location.database) SDK SQLite storage Harness.open → native sessions/tasks/documents Это намеренно конкретный Pi-backed backend, не требование заменить SQLite сейчас. Core ISessionStore не управляет этим запуском. packages/adapter-pi-durable/src/engine/runtime-loader.ts:192 N · Native execution ownerPiDurableEngine → openDurable → Harness.open @earendil-works/pi-durable + Chord Model/tool/session execution; view/controller создаёт adapter Отдельный HarnessFactory не выставлен. Не требуется инъектировать каждую SDK-внутренность или создавать второй execution loop. packages/adapter-pi-durable/src/engine/runtime-loader.ts:191 R · Каталог метаданных сессий хостаlocal-runtime attachAssembly → openSessionCatalog(...) Filesystem SessionCatalog: list / describe / rename / create session/list, session/describe, session/rename, session/create Это только host metadata: имена, cwd и набор extensions. Native entries/models/tasks/locks остаются у Harness; каталог не является вторым владельцем исполнения или session store. packages/local-runtime/src/index.ts:85

05 · Контракты и модули, не включённые в штатный startup

05 · Контракты и модули, не включённые в штатный startupТекущий main 7ef44a2 · слева направо: вход → реализация → потребитель · ограничения и evidence в atlas.html G: Явная DI / подключение уже есть Y: Только нижний native API R: Выбор зашит / нет слота D: Есть код/контракт, не включён N: Намеренный native owner Цвет = способ подключения, не итог тестов. Нижний API не равен публичной сборке. 1. Где передаётся / где выбор зашит 2. Что выбрано сейчас 3. Реальный потребитель D · Core IModelProvider / adapter-pi-aiЕсть в пакетах; в standard recipe не подключён PiAiModelProvider; setupRunnerModels Самостоятельный model-setup helper, не native runtime-loader Не нужно механически заставлять native Harness работать через этот unused generic port. packages/core/src/models/provider.ts:6 × D · Core ISessionStore / PiDurableSessionStoreЕсть standalone adapter; coordinator принимает только engine/sessionDir PiDurableSessionStore implements ISessionStore Не mounted в native reference startup Не вводить параллельного владельца native session ради использования существующего интерфейса. packages/core/src/session/store.ts:8 × D · Host tool / interaction bridgerunner HostBridge(requester), Core IHostBridge; Pi dependencies.hostBridge — placeholder HostBridge и legacy HostRpcManager существуют отдельно Сборщик не создаёт HostBridge; dependencies.hostBridge в execution path не читается Core bridge и пустой Pi IHostBridge — разные типы. Legacy module globals не являются приемлемым DI решением. packages/runner/src/host/host-bridge.ts:24 × D · Core ISandboxExtensionCodemodeExtension implements ISandboxExtension Lifecycle metadata id/name/version/teardown Нет метода create/execute sandbox в этом Core SPI Не принимать implements интерфейса за возможность подменить конкретный CodemodeSandbox. packages/core/src/tools/sandbox.ts:6 × D · Полный session dispatchercreateSessionDispatcher(options) существует runner/dispatch/session-dispatcher.ts В reference composition свой ограниченный inline handler Замена resolver/container не реализует отсутствующие tools/register, binding/fork capabilities. packages/runner/src/dispatch/session-dispatcher.ts:20 × D · Пакет execution в default recipeМожно явно использовать его NodeExecutionEnv в Core factory @durable-zero/execution vs native SDK NodeExecutionEnv По умолчанию runner импортирует SDK env/node, не execution package Наличие workspace dependency в manifest не значит, что она включена в production recipe. packages/runner/src/composition.ts:10 ×

06 · Все workspace package dependencies

06 · Все зависимости workspace-пакетовСтрока зависит от колонки · S: source · T: только type · M: только manifest · tests/dist исключены core contracts execution adapter-pi-durable adapter-pi-ai adapter-codemode extension-pi-resource runner protocol local-runtime cli terminal-ui local-terminal core — T · · · · · · · · · · · contracts · — · · · · · · · · · · · execution T · — · · · · · · · · · · adapter-pi-durable S S · — · · · · · · · · · adapter-pi-ai T T · · — · · · · · · · · adapter-codemode T · · T · — · · · · · · · extension-pi-resource M · · M · · — · · · · · · runner S S M S M S S — S · · · · protocol · · · · · · · · — · · · · local-runtime · · · S · · · S S — · · · cli M M · · · · · S · · — · · terminal-ui · · · T · · · · · · · — · local-terminal · S · T · · · · · S · S — Важно: это не runtime-flowSource import не доказывает исполнение. Type-only import не является runtime-call. Manifest-only не означает подключённый модуль. Точки расширения — нижеПубличный параметр, нижний native API и неподключённый контракт — разные уровни готовности. Проверяйте entry, consumer и ограничения.

07 · Прямые SDK / library imports

07 · Прямые зависимости на SDK и другие библиотекиSource imports / exports / resolve, не транзитивный npm graph. Node built-ins сгруппированы, это не npm packages. pi-durable chord pi-ai pi-coding-agent pi-codemode pi-tui Node built-ins @sinclair/typebox zod @silvia-odwyer/photon-node proper-lockfile chalk highlight.js core · · · · · · · · S · · · · contracts · · · · · · · · S · · · · execution · · · · · · S · · · · · · adapter-pi-durable S S S S · · S S · · S · · adapter-pi-ai · · T S · · · · · · · · · adapter-codemode S · · · S · · · · · · · · extension-pi-resource S · · S · · · · · · · · · runner S · · S · · S · · · · · · protocol · · · · · · S · S · · · · local-runtime · · · S · S S · S · · · · cli · · · · · · S · · · · · · terminal-ui · · · · · S S · · S · S S local-terminal · · · · · · S · S · · · ·

Все точки замены: что именно можно сделать

G · Явная DI / подключение уже есть · Движок агента

Вход: assembleDurableZero({ engine })

Сейчас: IAgentEngine → PiDurableEngine по умолчанию → SessionCoordinator.engine.start / submit / abort / close

Как заменить: Передать другую реализацию IAgentEngine в основной API сборки.

Ограничение: Generic engine получает stdio/Core, но сборка не возвращает ему native view/controller; terminal host требует эти порты.

Проверка: Есть fast-path mock-engine тест; это не доказательство совместимости любого engine с native terminal.

G · Явная DI / подключение уже есть · Native execution environment

Вход: assembleDurableZero({ nativeExecutionEnvFactory })

Сейчас: SDK NodeExecutionEnv по умолчанию → ExecutionEnvs → Harness.env → filesystem / exec tools

Как заменить: Передать factory(target, chordContext), возвращающую SDK ExecutionEnv.

Ограничение: Нельзя одновременно передать Core factory. Полный SDK-контракт обязателен; CLI/socket-host не выставляют этот параметр.

Проверка: В native-env-seam.test.ts есть реальные startup/file-effect проверки. В этом разборе не перезапускались.

G · Явная DI / подключение уже есть · Core execution environment

Вход: assembleDurableZero({ executionEnvFactory })

Сейчас: IExecutionEnvironment → CoreExecutionEnvAdapter → ExecutionEnvs → native Harness.env

Как заменить: Передать свою Core factory; можно использовать adapter из пакета execution.

Ограничение: Core SPI уже native SDK; неподдержанные расширенные операции дают typed unsupported, это не полная замена любого native backend.

Проверка: В native-env-seam.test.ts есть native startup + effect через custom Core factory; здесь не перезапускались.

G · Явная DI / подключение уже есть · Обычные Pi-расширения и tools

Вход: assembleDurableZero({ extensions, skills, noGlobalExtensions })

Сейчас: DefaultResourceLoader + ExtensionRunner → installExtensionTools → native Registry; pending providers → ModelRuntime

Как заменить: Передать пути extensions/skills; расширение регистрирует tools/providers через Pi API.

Ограничение: Это работающий путь добавления, но не API удаления/замены стандартных builtins или интегратора MCP.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

G · Явная DI / подключение уже есть · Вход / выход RPC

Вход: assembleDurableZero({ stdin, stdout, onNotification })

Сейчас: Readable/Writable + callback → StdioJsonRpcServer и coordinator.events

Как заменить: Передать свои streams и слушатель уведомлений.

Ограничение: Заменяются IO/наблюдатель, не сама transport strategy; socket-host использует именно этот путь.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

G · Явная DI / подключение уже есть · Данные, команды и settings UI

Вход: runDurableTui(source, controller, settings, ...)

Сейчас: TerminalViewSource / TerminalController / TerminalSettings → terminal-ui/vendor/experimental/durable/tui.js

Как заменить: Своя оболочка может передать реализации трёх UI-контрактов в библиотечную функцию.

Ограничение: Это локальная DI на UI-границе. Native DurableView — намеренная concrete UI-зависимость, не утечка в Core.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Реализация runtime моделей

Вход: PiDurableEngine.dependencies.modelRuntime

Сейчас: Pi ModelRuntime; fallback ModelRuntime.create() → Harness.open({ models: modelRuntime }); controller.setModel

Как заменить: Собрать PiDurableEngine/openDurable с dependencies.modelRuntime; верхний recipe придётся адаптировать.

Ограничение: assembleDurableZero не принимает этот слот. Требуется native ModelRuntime contract, не Core IModelProvider.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Native provider implementations

Вход: PiDurableEngine.dependencies.nativeProviders

Сейчас: SDK Provider[] → modelRuntime.registerNativeProvider(provider)

Как заменить: Передать nativeProviders на нижнем уровне; через Pi extensions также есть registerProvider/native-provider путь.

Ограничение: provider/model строки выбирают модель, но не заменяют ModelRuntime. Прямой список providers не открыт верхним recipe.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Settings/config provider

Вход: PiDurableEngine.dependencies.settingsManager

Сейчас: Native SettingsManager → createHarnessSettings; model defaults; resource loading

Как заменить: Передать совместимый native SettingsManager на нижнем уровне.

Ограничение: Верхний runner всегда создаёт SettingsManager.create(cwd). Это native тип, не произвольный zero-neutral config provider.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Ресурсы: AGENTS / skills / extensions

Вход: PiDurableEngine.dependencies.resourceLoader

Сейчас: DefaultResourceLoader; extension-pi-resource оборачивает его → reload/getExtensions/getSkills → prompt и ExtensionRunner

Как заменить: Передать native-compatible loader при ручной сборке PiDurableEngine/openDurable.

Ограничение: Основная фабрика всегда создаёт DefaultResourceLoader. extension-pi-resource — data/wiring wrapper, а не отдельный универсальный resource backend.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Список дополнительных builtins

Вход: dependencies.builtins / openDurable.builtins или plugins

Сейчас: BuiltinExtension[] (контракт в adapter-pi-durable) → createCodingRegistry → builtinRegistry.initAll(ctx)

Как заменить: Нижний API принимает дополнительные BuiltinExtension. Сам контракт содержит native Registry/SettingsManager.

Ограничение: Верхний runner передаёт только штатный codemode. На нижнем уровне список добавляется к coding-tools/subagents, не заменяет их.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Codemode как целый builtin

Вход: dependencies.builtins: [свой codemode]

Сейчас: adapter-codemode → createCodemodeExtension → BuiltinExtension.register → registry.install(ext)

Как заменить: Через ручную нижнюю сборку выбрать другой codemode-builtin вместо пакета adapter-codemode.

Ограничение: Основной runner жёстко вызывает createCodemodeBuiltinExtension(); добавлять второй codemode поверх его списка нельзя.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Файлы/содержимое system prompt

Вход: dependencies.prompt / openDurable.prompt

Сейчас: PromptOptions: systemPromptPath/contextFiles/... → createPiPrompt → buildSections

Как заменить: Нижний API принимает PromptOptions; paths/sections меняют содержимое.

Ограничение: Сам renderer createPiPrompt обязателен. resourceLoader/dynamicSections в итоговых options подставляются runtime-loader сверху.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

Y · Только нижний native API · Динамические prompt sections

Вход: dependencies.dynamicSections

Сейчас: DynamicPromptSections по умолчанию → ExtensionRunner и createPiPrompt читают/обновляют sections

Как заменить: Передать совместимый объект на нижнем уровне.

Ограничение: Верхний assembleDurableZero не выставляет этот параметр.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

R · Выбор зашит / нет слота · Sandbox внутри adapter-codemode

Вход: Нет factory/constructor option

Сейчас: new CodemodeSandbox() внутри register → createCodemodeExtension({ sandbox })

Как заменить: Сейчас — заменить весь codemode builtin нижним API либо менять adapter-codemode; независимого sandboxFactory нет.

Ограничение: Нельзя передать другой sandbox основному codemode адаптеру снаружи.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

R · Выбор зашит / нет слота · Штатный coding-tools builtin

Вход: Всегда добавляется в createCodingRegistry

Сейчас: coding-tools.ts → SDK CodingTools/createCodingTools → native Registry → read/write/edit/bash tools

Как заменить: Для полной замены builtin нужен иной recipe/изменение bootstrap: выбрать финальный список до регистрации.

Ограничение: customBuiltins с тем же id отклоняется. Это не утверждение, что Pi extensions вообще не могут переопределить отдельное имя tool.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

R · Выбор зашит / нет слота · Штатный subagents builtin

Вход: Всегда добавляется в createCodingRegistry

Сейчас: builtin-extensions/subagents.ts → native Registry → SDK subagent extension

Как заменить: Для замены/исключения целого builtin изменить конфигурационный bootstrap, не снимать защиту от неявных дублей.

Ограничение: Настройка policy — другое: меняет данные политики, не реализацию builtin.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

R · Выбор зашит / нет слота · Интегратор MCP

Вход: runner extensionFactories: createMcpExtension()

Сейчас: Native Pi MCP ExtensionFactory → ResourceLoader → ExtensionRunner → adapted tools

Как заменить: Конфигурация серверов — Pi config; замена самого интегратора требует собственного resource loader/recipe.

Ограничение: Отдельного upper-level mcpFactory нет. В текущем main MCP status больше не является startup readiness barrier; readiness вызывается перед native tool snapshots, cleanup — через session_shutdown. Это не слот замены интегратора.

Проверка: Изменённый startup/tool path прослежен по исходникам main; runtime/MCP тесты при обновлении атласа не запускались.

R · Выбор зашит / нет слота · Сам renderer prompt

Вход: Всегда registry.install(createPiPrompt(...))

Сейчас: adapter-pi-durable/engine/prompt.ts → native registry sections

Как заменить: Для другой реализации renderer нужен иной конфигурационный bootstrap.

Ограничение: PromptOptions позволяют менять данные, не выбирать другой renderer.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

R · Выбор зашит / нет слота · RPC transport implementation

Вход: runner: new StdioJsonRpcServer(...)

Сейчас: protocol/StdioJsonRpcServer implements ITransportStrategy → Inline handler → SessionCoordinator

Как заменить: Streams доступны сверху, но transportFactory/ITransportStrategy в assemble options отсутствует. Для иной стратегии — собственный host/bootstrap.

Ограничение: Socket-host оборачивает stdio через PassThrough; это реальный другой host, а не injected transport strategy.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

R · Выбор зашит / нет слота · Выбор готового терминального UI

Вход: local-terminal/main.ts: fixed dynamic import

Сейчас: @local-durable/terminal-ui.runDurableTui → ZeroTerminalClient через Native view/controller contract

Как заменить: Другой frontend может использовать RPC client и свои widgets, но main не принимает render/UI factory.

Ограничение: Терминал опционален и не является частью ядра headless/backendless Zero. В готовом terminal entrypoint выбор UI фиксирован; другой frontend использует свой entrypoint/клиент.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

N · Намеренный native owner · Native session storage

Вход: runtime-loader: openNodeSqliteStorage(location.database)

Сейчас: SDK SQLite storage → Harness.open → native sessions/tasks/documents

Как заменить: Никакого storageFactory в текущем Pi recipe нет. Для другого native storage нужен отдельный обоснованный adapter seam; другой backend возможен через engine SPI.

Ограничение: Это намеренно конкретный Pi-backed backend, не требование заменить SQLite сейчас. Core ISessionStore не управляет этим запуском.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

N · Намеренный native owner · Native execution owner

Вход: PiDurableEngine → openDurable → Harness.open

Сейчас: @earendil-works/pi-durable + Chord → Model/tool/session execution; view/controller создаёт adapter

Как заменить: В Durable реализации сохраняется один native Harness. Для другого engine есть внешний IAgentEngine слот.

Ограничение: Отдельный HarnessFactory не выставлен. Не требуется инъектировать каждую SDK-внутренность или создавать второй execution loop.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

D · Есть код/контракт, не включён · Core IModelProvider / adapter-pi-ai

Вход: Есть в пакетах; в standard recipe не подключён

Сейчас: PiAiModelProvider; setupRunnerModels → Самостоятельный model-setup helper, не native runtime-loader

Как заменить: Не считать наличие Core порта рабочим способом смены моделей в штатном Harness; реальный нижний слот — native modelRuntime.

Ограничение: Не нужно механически заставлять native Harness работать через этот unused generic port.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

D · Есть код/контракт, не включён · Core ISessionStore / PiDurableSessionStore

Вход: Есть standalone adapter; coordinator принимает только engine/sessionDir

Сейчас: PiDurableSessionStore implements ISessionStore → Не mounted в native reference startup

Как заменить: В этой сборке заменить store через Core нельзя: native SQLite открывается отдельно.

Ограничение: Не вводить параллельного владельца native session ради использования существующего интерфейса.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

D · Есть код/контракт, не включён · Host tool / interaction bridge

Вход: runner HostBridge(requester), Core IHostBridge; Pi dependencies.hostBridge — placeholder

Сейчас: HostBridge и legacy HostRpcManager существуют отдельно → Сборщик не создаёт HostBridge; dependencies.hostBridge в execution path не читается

Как заменить: Для рабочего BB integration нужен реальный mount native host tools и request/response routing; DI поле само ничего не подключает.

Ограничение: Core bridge и пустой Pi IHostBridge — разные типы. Legacy module globals не являются приемлемым DI решением.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

D · Есть код/контракт, не включён · Core ISandboxExtension

Вход: CodemodeExtension implements ISandboxExtension

Сейчас: Lifecycle metadata id/name/version/teardown → Нет метода create/execute sandbox в этом Core SPI

Как заменить: Это не sandbox injection point; реальная замена sandbox требует factory в codemode adapter либо другого builtin.

Ограничение: Не принимать implements интерфейса за возможность подменить конкретный CodemodeSandbox.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

D · Есть код/контракт, не включён · Полный session dispatcher

Вход: createSessionDispatcher(options) существует

Сейчас: runner/dispatch/session-dispatcher.ts → В reference composition свой ограниченный inline handler

Как заменить: Не считать методы helper/schema автоматически mounted; production routing нужно подключать и проверять отдельно.

Ограничение: Замена resolver/container не реализует отсутствующие tools/register, binding/fork capabilities.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

D · Есть код/контракт, не включён · Пакет execution в default recipe

Вход: Можно явно использовать его NodeExecutionEnv в Core factory

Сейчас: @durable-zero/execution vs native SDK NodeExecutionEnv → По умолчанию runner импортирует SDK env/node, не execution package

Как заменить: Пакет можно выбрать в своём executionEnvFactory; он не является default native execution backend.

Ограничение: Наличие workspace dependency в manifest не значит, что она включена в production recipe.

Проверка: Не запускался новый runtime-тест; оценка по исходникам.

G · Явная DI / подключение уже есть · UI команды MCP — опциональная граница

Вход: DurableController.executeMcpCommand(args, ui)

Сейчас: Native MCP handler + предоставленный ExtensionUIContext → local-runtime MCP UI bridge → terminal RPC events

Как заменить: Передать custom/select/input/notify/theme через UI-контекст команды или использовать session/mcpCommand. Headless context всего runtime не заменяется.

Ограничение: Это native Durable controller boundary, не универсальная замена MCP-интегратора и не обязательный UI ядра. Один активный manager принадлежит конкретному соединению.

Проверка: Публичная сигнатура и реальный handler/consumer проверены по исходникам; native UI тесты не перезапускались.

R · Выбор зашит / нет слота · Каталог метаданных сессий хоста

Вход: local-runtime attachAssembly → openSessionCatalog(...)

Сейчас: Filesystem SessionCatalog: list / describe / rename / create → session/list, session/describe, session/rename, session/create

Как заменить: Сейчас выбрать иной metadata catalog можно только своим host recipe / изменением bootstrap; catalogFactory не передаётся.

Ограничение: Это только host metadata: имена, cwd и набор extensions. Native entries/models/tasks/locks остаются у Harness; каталог не является вторым владельцем исполнения или session store.

Проверка: Конструктор, metadata-only граница и реальные RPC consumers прослежены по main; runtime тесты не запускались.

Что является настройкой, а не заменой реализации

Почему здесь несколько схем

По C4/arc42: статические зависимости, сборочная конфигурация и runtime-сообщения — разные виды. Нельзя читать стрелку импорта как поток исполнения. Type-only и manifest-only зависимости не рисуются как активное runtime-подключение.

Область охвата: Все workspace packages + публичные assembly options, PiRuntimeDependencies, builtin/resource/model/storage/host/transport/UI seams. Не все транзитивные npm packages и не каждый private helper SDK.