Перейти к содержанию

ADR 0148: Agent Execution Environment — verification ladder, task runner и native tooling в standalone CIDE

Поле Значение
Статус Accepted · In progress (W1–W2 в коде; W3–W6 частично)
Дата 2026-05-24
Дополняет 0038 §«Направление» (единый оркестратор); 0141 (warm substrate)

Связанные ADR

ADR Роль
0038 Фасад LLM, автономный JSON-цикл, safety.*; техдолг: нет единого оркестратора — закрывает этот ADR
0008 Контракты MCP, тестируемость, IIdeMcpActions
0002 Паритет человек ↔ агент на общих поверхностях
0019 Git через shared core, не raw shell
0020 Слои видимости: ответ / трасс / сырой лог
0042 Pre-flight и review before apply — ортогонально verify ladder
0052 Контракт агента, снапшот-тесты
0058 TOML-сопряжение агент ↔ Roslyn
0099 DataBus: push-события среды
0102 DAL — внешний I/O, не в VM
0138 CCL/slash — пульт агента и verify
0141 Warm-up при open solution — substrate для AEE
0147 Пример: 20 мин wall-clock на ADR→код; bottleneck = среда

Вне ADR

Документ Роль
MCP-PROTOCOL.md Канон IdeCommands; external MCP — optional tier
debug-human-agent-parity-v1.md Паритет отладки
north-star-cursor-mcp-cascade-workbench-v1.md Standalone CIDE vs Cursor shell
playbook-agent-environment-v1.md Краткий playbook: два такта, W1, анти-паттерны
naming-layers-v1.md Semantic ids: verify rungs, safety, Endsley SA, trace, anchor, CASA
agent-verify-epoch-view-v1.md UX: Verify Epoch block, PFD instrument, green rule

Резюме

  • Проблема: wall-clock агента доминирует latency среды (build, test, shell, lock файлов/БД), а не «скорость рассуждения» модели.
  • Решение: Agent Execution Environment (AEE) — подсистемный контур: native tools (Roslyn in-proc; build/test via supervised host), Verification Ladder, Environment Task Runner, push через DataBus, sandbox.
  • MLP (Minimum Lovable Product): оператор видит живой прогресс, отмену, разложение времени reasoning vs environment; агент по умолчанию не гоняет full suite; Roslyn/build/test — through-runner, не блокирующий shell в чате.
  • Идеал: reasoning и verify пайплайнятся; warm substrate из 0141; batch native API; изолированные dev-сервисы; тот же AEE для человека (CCL) и агента (0002).
  • Enabler: C# / solution verify — library-first open stack (.NET MIT/Apache): Roslyn in-proc, MSBuild/VSTest через supervised host или библиотеки — не форк dotnet.exe (§2.3, §5.2).

Нормативно: shell — escape hatch. External MCP (0008) — polyglot at safety.autonomous; C# / solution — native AEE (§5, §5.2).


Контекст

Эмпирика (2026-05-24)

Реализация 0144 + 0147 «целиком» заняла ~20 минут wall-clock. Большая доля — не проектирование, а:

Фактор Пример
dotnet build / dotnet test 5–30+ с × N итераций
Lock WitDB / dev DB 500 на /auth/me до RecreateDatabaseOnStart
xUnit + shared factory порядок тестов, duplicate PK
Serial round-trip правка → ждём → правка

Вывод: для standalone CIDE UX агента определяется Execution Environment, не только промпт и модель.

Standalone vs Cursor / external agent

Cursor / внешний агент Standalone CIDE (целевое)
Shell как универсальный API Solution model in-process
Каждый MCP — subprocess + JSON Native tools + optional MCP
Build = блокирующий терминал в сессии Runner + push events
Общий workspace, риск lock Sandbox profiles для side effects
Оператор не видит «где время» Time accounting + instrument

North-star: north-star-cursor-mcp-cascade-workbench-v1.md — переход из Cursor в контур, где среда принадлежит IDE.

Когнитивный vs средовой такт

Такт Ограничение Типичный dev tooling
Когнитивный Скорость мышления (оператор; агент ×10–×100) Не учитывается
Среды Build, test, shell, I/O, lock, cold start Единственный bottleneck в UX

Классический tooling (shell, full rebuild, blocking test) оптимизирован под темп человека, не под bandwidth мышления. AEE снимает разрыв не «быстрее токены», а сопоставлением среды с когнитивной скоростью — ladder, runner, push, warm substrate. Playbook: playbook-agent-environment-v1.md.

Открытый .NET stack (стратегический enabler)

Принято: standalone moat AEE опирается на то, что весь C# / solution pipeline — открытый и библиотечный (MIT / Apache 2.0 в исходниках). CLI (dotnet build, dotnet test, dotnet format) — тонкая оболочка над теми же API; Cursor/MCP/shell-first всегда платит subprocess + cold workspace + сериализацию.

Слой Репозиторий (ориентир) Лицензия (исходники) Роль в AEE
Runtime, host (hostfxr) dotnet/runtime MIT Host in-proc tools
SDK / dotnet CLI dotnet/sdk MIT Escape hatch; не primary
Сборка SDK «целиком» (VMR) dotnet/dotnet MIT Дистрибьюторы (Red Hat, Canonical); не цель CIDE как IDE
MSBuild dotnet/msbuild MIT compile.projectbuild.affected
Roslyn (compile, analyze, format) dotnet/roslyn MIT diagnose.files; format in-proc
dotnet format (код) в dotnet/sdk (dotnet/format archived) MIT Референс; не subprocess default
NuGet client NuGet/NuGet.Client Apache 2.0 Restore в runner
VSTest microsoft/vstest MIT test.scoped
Managed debugger Samsung/netcoredbg MIT build.affected+ attach (0002)

Нормативно — три уровня стратегии (не равны по cost):

Уровень Что Для CIDE
A — native AEE (default) Roslyn in-proc; MSBuild/VSTest via supervised worker + open libs MLP; shared warm substrate 0141
B — свой CLI на тех же пакетах cide verify, cide format как thin host над NuGet Опционально; runner всё равно in-proc или supervised child
C — полный форк SDK / dotnet dotnet/dotnet source-build Вне scope продукта IDE; отдельный продукт уровня дистрибьютора

Границы открытости (честно):

Не открыто / ограничено Влияние на AEE
Visual Studio IDE Не нужен — CIDE свой host
NuGet.org (сервис) Клиент открыт; feed — внешний
Часть NuGet-пакетов VSTest (Code Coverage и др.) Repo MIT; бинарники в пакете — .NET Library License; не default L3 path
C# debugger VS Code extension Proprietary «VS family»; netcoredbg — MIT alternative
Prebuilt deps в полном source-build SDK dotnet/source-build; не блокер уровня A
Торговая марка «.NET» / «dotnet» Свой брендинг CLI; библиотеки — по лицензии

Техдолг (2026-05): McpDotnetBuildTestService / IDotnetCommandRunner — subprocess dotnet build|test|format. W2+: L0 in-proc Roslyn; L1–L2 supervised build host (§5.2); shell — E-tier.

Что уже есть (фрагменты)

Компонент ADR / код Пробел
LLM chat, ACP, автономный JSON 0038 Нет единого environment слоя
Roslyn / build / test MCP 0058, host MCP Subprocess + blocking; не runner
Solution warm-up 0141 UX агента не подписан; нет verify
DataBus 0099 Нет каноничных AgentEnvironment* events
Pre-flight / review 0042 Про намерение правок, не build/test ladder
safety.observesafety.autonomous 0038 §5 Про IDE commands, не verify depth

Проблема

# Проблема
1 Shell-first agent loop — каждая проверка = новый процесс + полная сериализация контекста; UX «агент молчит 30 с».
2 Нет лестницы verify — агент (и человек через агента) по умолчанию тянет dotnet test solution вместо Roslyn → affected project → filtered tests.
3 Нет оркестрации среды — build/test/git/process конкурируют; нет cancel/coalesce/queue.
4 Pull вместо push — агент опрашивает shell; IDE уже знает diagnostics/build state, но не публикует в едином контракте.
5 Side effects на operator workspace — lock PDB/DB, .witdb, порты; агент ломает dev-сессию человека.
6 Непрозрачное время — оператор не отличает «модель думает» от «MSBuild жует».
7 Дублирование контуров — chat autonomous, ACP, будущий server-admin agent — разные ad-hoc вызовы shell.

Решение

1. Термины (нормативно)

Термин Значение
AEE (Agent Execution Environment) Подсистема CIDE: native tools + runner + ladder + sandbox + observability. Не LLM-провайдер.
Agent run Одна сессия работы агента (chat turn chain, autonomous task, slash job) с run_id.
Environment task Единица работы среды: roslyn_diagnose, build_project, test_filter, git_status, process_supervise, …
Verification ladder Упорядоченные rungs (diagnose.filestest.full): cheap → expensive; policy какая rung достаточна для «green». Legacy L0…L4 — deprecated alias (naming-layers-v1.md §1).
Native tool In-process API AEE (IAeeTool), без обязательного MCP/stdio.
External tool MCP или shell — tier E (escape).
Sandbox profile Именованный набор правил изоляции side effects (operator, agent_ephemeral, agent_worktree).
Time slice Запись { phase: reasoning \| environment, duration_ms, detail? } в trace run.
Warm substrate Состояние от 0141 + MSBuild/Roslyn workspace, которое AEE переиспользует.
flowchart TB
  subgraph agent_layer ["Agent layer (0038)"]
    Chat["Chat / Autonomous / ACP proxy"]
    Orch["AgentOrchestrator"]
  end
  subgraph aee ["AEE (0148)"]
    Ladder["VerificationLadder"]
    Runner["EnvironmentTaskRunner"]
    Native["NativeToolHost"]
    Sandbox["SandboxProfiles"]
    Obs["Observability / TimeAccounting"]
  end
  subgraph substrate ["Substrate"]
    Warm["SolutionWarmupOrchestrator 0141"]
    Roslyn["Roslyn workspace"]
    MSBuild["MSBuild graph"]
    DAL["DAL adapters"]
  end
  subgraph bus ["IDE DataBus 0099"]
    Ev["AgentEnvironment* events"]
  end
  Chat --> Orch
  Orch --> Ladder
  Orch --> Native
  Ladder --> Runner
  Native --> Runner
  Runner --> Sandbox
  Runner --> DAL
  Runner --> Roslyn
  Runner --> MSBuild
  Warm --> Roslyn
  Runner --> Ev
  Obs --> Ev
  Orch --> Obs

2. Agent Orchestrator (единая точка шага)

Принято (идеал / MLP): реализовать AgentOrchestrator — evolution пункта «Направление» из 0038.

Ответственность Содержание
Step model Один шаг = { plan?, tool_calls[], verify_policy?, sandbox_profile } — общий для chat-autonomous и server-side jobs
Tool routing Native first → DAL → external MCP (safety.autonomous) → shell (E, deny by default)
Verify gate После mutate-tools: автоматический climb ladder до policy-green или явный fail
Epoch contract Не treat green на snapshot S как валидный для правок S′; ждать AgentRunCompleted или stale (§8.2)
Trace Append-only шаги в event log (0045) + optional export
Safety Наследует safety.* 0038; high-risk → 0042

Не цель: заменить AiProviderManager — orchestrator ниже LLM, выше AEE.

2.1. Layer naming (verify vs другие «L»)

Голые L0…L4 в verify-контексте deprecated. Канон — semantic verify_rung; реестр всех «L» в стеке (safety, Endsley SA, trace, Intercom anchor, CASA memory): naming-layers-v1.md. UX verify epoch: agent-verify-epoch-view-v1.md.

verify_rung (канон) Legacy Alias id (миграция)
diagnose.files L0 roslyn_file
compile.project L1 roslyn_project
build.affected L2 build_project
test.scoped L3 test_filtered
test.full L4 test_full, integration

3. Verification Ladder (нормативно)

Принято: каждый agent run задаёт verify_policy; default — standard (см. таблицу).

verify_rung Действие Типичная latency Когда «достаточно»
diagnose.files Diagnostics по затронутым .cs 100 ms – 2 s Syntax/types в edited files
compile.project Compile / semantic model affected projects 2–15 s Локальная правка без cross-project ripple
build.affected dotnet build project(s), не whole solution 5–30 s NuGet/refs изменились
test.scoped dotnet test --filter по trait/namespace/class 10–60 s Behavior change, unit scope
test.full Full suite, multi-project, dockerized deps минуты Release gate, explicit human/agent ask

Policy presets (TOML [agent.environment]):

Policy Max rung без escalate Escalate
minimal diagnose.files Только по явному запросу
standard (default) build.affected test.scoped если build.affected green и были test-touching paths
strict test.scoped test.full перед «done» на main branches
ci_parity test.full

Правила:

  1. Monotonic climb: diagnose.files fail → не запускать test.full «на удачу»; fix или stop.
  2. Coalesce: N правок за T секунд → один compile.project/build.affected, не N.
  3. Verify epoch (одна цепочка): в MLP не более одного активного verify run на workspace scope; новый verify после coalesce_window_msimplicit cancel predecessor (§8.2).
  4. Incremental graph: affected projects из Roslyn/MSBuild — не rebuild whole solution по умолчанию.
  5. Human parity: /agent verify quick|standard|strict (0138) вызывает тот же ladder API.
stateDiagram-v2
  [*] --> DiagnoseFiles
  DiagnoseFiles --> CompileProject: policy allows and (fail or cross-file)
  CompileProject --> BuildAffected: policy allows and compile fail
  BuildAffected --> TestScoped: policy allows and behavior paths
  TestScoped --> TestFull: explicit strict/ci
  DiagnoseFiles --> Green: pass
  CompileProject --> Green: pass
  BuildAffected --> Green: pass
  TestScoped --> Green: pass
  TestFull --> Green: pass
  Green --> [*]

4. Environment Task Runner

Принято: фоновый EnvironmentTaskRunner — единая очередь environment tasks.

Аспект Норма
Concurrency Configurable cap (default 2): build + test не дублировать
Priority Interactive (operator CCL) > agent run foreground > background warm
Cancel CancellationToken per task; cascade cancel run
Dedup Key (kind, target, sandbox_id) — merge pending identical
Verify chains (MLP) Одна активная verify-цепочка на scope; новый run → cancel predecessor + verify_snapshot_id (§8.2)
Progress Streaming: Started, Progress, Completed, Failed, Died на DataBus
Artifacts Structured result DTO (не raw stdout только): { diagnostics[], test_results[], exit_code, log_ref? }
Persistence Last N results in LocalAppData для HUD; full log optional

Task kinds (канон v1):

task_kind Описание
roslyn.diagnose diagnose.files
msbuild.compile compile.project / build.affected (через build host, §5.2)
dotnet.test test.scoped / test.full (через test host или supervised VSTest, §5.2)
git.* через 0019
process.supervise local intercom-service, tools with ports
shell.escape E-tier, audit log + confirm L2+

5. Native Tool Host (IAeeTool)

Принято: AEE экспонирует IAeeTool — native API без stdio MCP. Не всё грузится в AppDomain CIDE: Roslyn/L0 — in-process; L1+ build/test — supervised worker (§5.2), чтобы не тащить MSBuild-таски и утечки в UI-процесс.

Surface MLP Идеал
workspace.read/write batch ✓ zero-copy paths
roslyn.* ✓ in-proc ✓ shared with 0058 limits
msbuild.affected ✓ via build host ✓ cached graph; опц. in-proc MSBuild
test.run_filter ✓ via test host ✓ in-proc VSTest OM
git.* read + status MLP full через shared core
solution.warm_status read subscribe

Batch rule (идеал): ApplyPatchBatch + GetDiagnosticsBatchодин IPC/orchestrator round-trip на «шаг агента».

External MCP остаётся для: polyglot LSP, tinvest, telegram, third-party — tier E или L3 external per 0038.

5.1. Карта ladder → open-stack API (норматив v1)

Rung / task Subprocess (legacy / E-tier) MLP (норма) Идеал / опция
diagnose.files Roslyn MCP stdio In-proc shared workspace
format / cleanup dotnet format In-proc Formatter + code fixes
compile.project cold dotnet build Supervised build host (§5.2) MSBuild in-proc / BuildManager
build.affected graph full solution build build host + incremental closure in-proc graph cache
test.scoped cold dotnet test --filter Supervised test host (§5.2) VSTest OM in-proc
debug attach external DAP netcoredbg / 0002

Правило: для C# / solution сначала библиотечный API (Roslyn, MSBuild, VSTest) — не fork SDK (§2.3). Где MSBuild/VSTest — MLP предпочитает долгоживущий supervised worker (named pipe / gRPC / stdio JSON), а не загрузку MSBuild-тасков в процесс Avalonia: warm graph и structured DTO без cold CLI, но изоляция от крашей/утечек компиляции.

Правило fork: форк dotnet/sdk или VMR не является допустимым решением verify в IDE.

5.2. Supervised build/test host (MLP, W2)

Принято (review 2026-05-25): отдельный долгоживущий worker-процесс (child of CIDE, не «каждый раз новый dotnet build») держит warm MSBuild/VSTest graph; CIDE/AEE общается по IPC.

Аспект Норма
Зачем MSBuild кэширует состояние, грузит таски в ALC — in-proc в UI = утечки, блокировки, риск краша кабины
Не то же, что E-tier Worker переиспользуется; cancel/progress/structured result — как у runner
Протокол MLP: named pipes или line-delimited JSON; идеал: gRPC
Падение worker Runner перезапускает host; CIDE жив; fallback E-tier dotnet build с audit
Roslyn Остаётся in-proc в CIDE (shared с 0141); build host не дублирует Roslyn workspace без необходимости

Открыто (идеал): один host на build+test vs два; общий AssemblyLoadContext policy в worker.

6. Sandbox profiles (side effects)

Принято: agent run выбирает sandbox_profile; default agent_ephemeral.

Profile FS writes Processes / ports Git mutate DB (dev services)
operator Реальный workspace Shared Allowed (L2+) Shared — человек
agent_ephemeral Workspace OK; deny lock-sensitive dirs without copy Ephemeral ports Branch-only Temp data dir
agent_worktree Git worktree path Isolated Commit in worktree Temp
read_only Deny writes Deny spawn Deny Read-only

Пример (0147 lesson): intercom-service dev → runner поднимает instance с Intercom:DataDirectory=%Temp%/cide-agent/{run_id} и RecreateDatabaseOnStart=trueне трогает operator data/intercom.witdb.

Контракт dev-сервиса (норматив для agent_ephemeral): подмена data dir / connection string работает только если приложение читает конфигурацию (env, CLI, IOptions, layered config) — не хардкод единственного пути в appsettings.json без override.

Требование Зачем
Data directory / DB path — через конфиг + env/CLI Runner может задать Intercom:DataDirectory, ConnectionStrings__*, и т.п.
Порты — через конфиг или ephemeral assignment process.supervise не конфликтует с operator
Нет эксклюзивного lock файла БД в operator path без override Иначе агент блокирует человека даже при «ephemeral» профиле

Если контракт не выполнен: не обещать изоляцию только подменой ключей — использовать agent_worktree (W6), отдельный клон, или read_only + без локального dev DB. Идеал: FS-sandbox / symlink data root (отложено).

Playbook: требования к тестируемым сервисам и чеклист перед agent run — playbook-agent-environment-v1.md (§ sandbox, после review).

7. Warm substrate (0141 integration)

Принято: AEE не дублирует warm-up; подписывается на него.

Событие 0141 Действие AEE
SolutionWarmupStateChanged → Running Agent run may start L0 immediately on open docs
→ Ready Promote L1 cache hit rate; defer full solution build
Solution scope cancel Cancel pending environment tasks for old scope

Идеал: warm items agent.msbuild_graph, agent.test_catalog в каталоге 0141 §2 (P2/P3).

8. Observability и Time Accounting

Environment Consistency Matrix (W1–MLP) — единый язык для runner, UI, orchestrator (playbook §«Матрица согласованности»):

Зона риска Норма (W1–MLP) Не в MLP
Stale context verify_snapshot_id (HEAD + dirty set) + coalesce 1.5 s; orchestrator: green на S ≠ green на S′; implicit cancel predecessor Auto-rollback operator tree; worktree на каждый verify
State bleeding Fresh substrate bundle per test.scoped+ task (data dir + ports + temp); recreate/wipe Rollback transaction как единственный механизм
Metrics reasoning | environment | blocked (только при активном env task) idle_user, психометрия фокуса — W3+
Source generators SG-aware diagnose.files; stale SG → compile.project supervised host Дублировать 0141 warm отдельным драйвером

MLP must-have:

Agent run a1b2…
  Reasoning:           4.2s
  Environment:        16.8s
    diagnose.files:    0.8s  ✓
    build.affected:    9.1s  ✓  (IntercomService)
    test.scoped:       6.9s  ✓
  Status: green (standard policy) · max rung: build.affected
Sink Назначение
Chat trace Collapsible block per run (0020)
PFD instrument AgentEnvironmentInstrument — running task, cancel (0021, 0063)
DataBus AgentEnvironmentTaskChanged, AgentRunPhaseChanged
LocalAppData Rolling metrics: p50 build, cache hit — для 0054

Фазы time slice (уточнение): reasoning | environment | idle_user (нет фокуса CIDE / ввода — не считать environment blocked) | blocked только при активном run и ожидании среды.

Playbook: playbook-agent-environment-v1.md §«Слепые зоны».

8.1. Концептуальные риски (review Orion 2026-05-25)

Четыре зоны, не покрытые runner/ladder «в лоб». Детали и чеклисты — playbook §«Слепые зоны»; здесь — норма для ADR.

8.1.1. Stale context (verify epoch)

Принято: каждый environment verify run несёт verify_snapshot_id (git HEAD + hash затронутых путей на старт). Пока run running, правки в пересекающихся файлах помечают snapshot stale (DataBus + chat glyph).

Поведение MLP Идеал
UI: «verify устарел, перезапусти»
Агент autonomous: не assume green без completed run на текущем snapshot
Когнитивный такт в agent_worktree до green W4/W6 default для long agent runs
Auto-rollback operator tree к pre-verify только explicit human

Не заменяет git revert агента: при failed run — новый verify, не откат «40 секунд мысли» без политики.

Implicit cancel predecessor (MLP): если стартует verify epoch E2, а E1 ещё running на L1+ — runner шлёт CancellationToken в supervised host для E1, фиксирует cancelled в time slices, UI показывает одну активную цепочку. Параллельные verify-цепочки в одной session — запрещены (race в glyph / snapshot).

Write → stale (human parity): правка файла из in_verification dirty set мгновенно помечает epoch stale в DataBus (AgentVerifyEpochStale), даже если compile ещё не убит; опционально W3: визуальное «заморожение»/тускнение gutter для файлов epoch (0140 family).

8.1.2. Ephemeral DB idempotency (fresh substrate per jump)

Принято: для L3+ integration каждый новый environment task (или новый climb после failed rung) получает fresh substrate bundle — не только *.witdb, а data dir + выделенные порты + temp/mock scope (recreate / wipe), если предыдущий run писал side effects.

Поведение Норма
agent_ephemeral + L3 Новый {run_id} data dir или explicit recreate перед task
Повтор standard verify подряд Не reuse dirty WitDB без recreate
Test host Может держать rollback fixture внутри одного task; между tasks — fresh

8.1.3. Source generators и L0

Принято: L0 использует Roslyn с GetSourceGeneratedDocumentsAsync (как roslyn-mcp); при проектах с SG — warm path из 0141 или не climb с L0 на L1 без build host, если generated docs stale.

Отклонено для MLP: «прогретый GeneratorDriver в памяти CIDE» без интеграции с 0141 — дублирование; сначала переиспользовать HCI/sidecar и build host incremental.

8.1.4. Metrics dilution (idle_user vs blocked)

Принято: time slices различают ожидание среды (blocked, только при активном environment task) и отсутствие внимания оператора (idle_user: потеря фокуса CIDE / нет ввода ≥ N с — порог в settings, W3+).

Не смешивать idle_user с environment в отчётах эффективности агента; LocalAppData rolling metrics могут фильтровать idle_user отдельно.

8.1.5. Supervised host death (hard environment failure)

Принято: crash/OOM/segfault build или test host — AgentEnvironmentTaskDied (task_id, host_kind, exit_code?, stderr_tail?), не бесконечный wait на timeout.

Действие Владелец
Runner Перезапуск supervised host; task → died
Orchestrator Не assume green; системный alert агенту: среда аварийно завершилась (возможен user code: SG loop, static ctor)
UI Glyph «environment died» + retry verify

Не путать с Failed (тесты красные / compile errors) — Died = инфраструктура хоста.

8.2. Ссылка на матрицу

Сводная таблица W1–MLP — §8 «Environment Consistency Matrix»; детали §8.1; playbook §«Матрица согласованности» и §«Операционные инварианты».

9. UI / CCL (0138)

Команда Действие
/agent status Очередь runner, active run, sandbox
/agent verify [minimal\|standard\|strict] Ladder без нового agent run
/agent cancel Cancel run + runner tasks
/agent last Time accounting последнего run
/agent sandbox [profile] Default profile для session

Паритет: те же команды доступны агенту как native tools (ide_agent.*).

10. DataBus events (sketch)

Namespace: CascadeIDE.Agent.Environment.

Event Payload (orientир)
AgentRunStarted run_id, sandbox_profile, verify_policy
AgentRunPhaseChanged run_id, phase: reasoning | environment
AgentEnvironmentTaskChanged task_id, kind, state, progress?, message?
AgentEnvironmentTaskCompleted task_id, result_summary, duration_ms
AgentEnvironmentTaskDied task_id, host_kind, exit_code?, stderr_tail?
AgentVerifyEpochStale run_id, verify_snapshot_id, reason: write_in_epoch | superseded | cancel
AgentRunCompleted run_id, green, max_rung_reached (semantic verify_rung), time_slices[]

Projections: PFD AgentEnvironmentInstrument, chat Verify Epoch block (agent-verify-epoch-view-v1.md), strip glyph (0140 family).

11. Settings TOML (0028)

[agent.environment]
default_verify_policy = "standard"
default_sandbox_profile = "agent_ephemeral"
runner_max_concurrency = 2
coalesce_window_ms = 1500
shell_escape_tier = "deny"   # deny | tests_only | allow_with_audit

[agent.environment.ladder]
diagnose_files_enabled = true
test_full_require_explicit = true
# legacy aliases (read until removal): l0_enabled, l4_require_explicit

[agent.environment.time_accounting]
show_in_chat = true
pfd_instrument_enabled = true

Roslyn limits — по-прежнему 0058; AEE читает ту же секцию.

12. Human–agent parity (0002, 0008)

Surface Человек Агент
Verify ladder /agent verify, palette orchestrator auto + tool
Cancel /agent cancel, instrument run.cancel
Diagnostics Error list / F8 diagnose.files native
Debug attach Debug strip 0002 debug_attach native (build.affected+)
Verify epoch UI Chat Verify Epoch + PFD instrument Same projection (agent-verify-epoch-view-v1.md)

Правило: если агент может вызвать — человек имеет эквивалентную UI/CCL команду без MCP.


MLP vs идеал

Capability MLP (shippable) Идеал (полный AEE)
Verification ladder through test.scoped test.full + ci_parity
Task runner + cancel + progress Dedup + priority lanes
Time accounting in chat PFD instrument + baselines
Native Roslyn + filtered test Full MSBuild graph cache
Sandbox: ephemeral DB/ports Git worktree profile
AgentOrchestrator v1 minimal step + verify Full plan/review 0042 integration
Batch native tools partial Zero-copy batch
Warm substrate hooks subscribe 0141 Agent-specific warm items
Shell escape audit + deny default Policy per repo
External MCP unchanged Tier registry

MLP — не «урезанный продукт»: оператор любит его, потому что агент перестаёт висеть на build/test без прозрачности. Идеал добавляет изоляцию, batch, CI-parity, cockpit — без смены архитектуры.


Реализация (порядок поставки, не scope cut)

Wave Deliver Зависимости
W1 EnvironmentTaskRunner + DataBus events + time slices 0099
W2 L0 in-proc Roslyn + L1–L2 via supervised build host + ladder policy §5.2; E-tier subprocess только fallback
W3 MLP UI: chat trace + /agent verify\|cancel\|status 0138
W4 Sandbox ephemeral (DB/ports) + intercom pattern 0147 host
W5 PFD instrument + warm hooks 0141 0063
W6 Batch native tools + worktree sandbox 0019

Статус реализации (2026-05-27)

Wave Состояние Артефакты (кратко)
W1 В коде EnvironmentTaskRunner, IEnvironmentJobBackend, DataBus-события, time slices
W2 В коде VerificationLadder, AgentRoslynL0Diagnostics, BuildTestHostFactory (supervised-inproc | supervised-worker-process | supervised-worker-daemon), CascadeIDE.BuildVerifyWorker
W3 Частично AgentEnvironmentService, slash /agent verify\|cancel\|status\|last (ChatSlashAgentActions); PFD instrument + Verify Epoch UI — spec agent-verify-epoch-view-v1.md, не в коде
W4 Частично AgentSandboxManager (ephemeral substrate); dev-service config contract — не полный
W5 Частично L0 warmup paths из solution warm-up (AgentL0WarmupPathCollector, [agent.environment] в TOML)
W6 Частично StartVerifyBatch, AgentWorktreeSandbox; batch native API / политики — не MLP-complete

Дизайн worker/daemon: build-verify-out-of-process-worker-v1.md.

Не ставим Implemented: MLP-контур ещё не стабилен на target hardware; открытые вопросы §Open questions (orchestrator ownership, verify epoch UX, host restart).


Последствия

Плюсы

  • Wall-clock agent tasks падают за счёт ladder + coalesce + warm substrate.
  • UX: оператор видит среду и может отменить.
  • Standalone CIDE получает moat vs Cursor shell-loop.
  • Open .NET stack: in-process verify на MIT/Apache libs — стратегический enabler без форка SDK (§2.3).
  • Закрывает техдолг 0038 §«Направление» #1.

Минусы / риски

Риск Mitigation
Дублирование Roslyn MCP vs native Single library; MCP = thin wrapper over AEE
Сложность sandbox Default agent_ephemeral; dev-service config contract (§6); worktree если контракт не выполнен
Stale verify + parallel edits verify_snapshot_id + stale UI; worktree for long autonomous (§8.1.1)
Parallel verify chains Implicit cancel predecessor; одна цепочка на scope (§8.1.1)
DB / port / temp state bleeding Fresh substrate bundle per L3+ task (§8.1.2)
Metrics mix human idle + environment idle_user W3+; MLP: blocked only on active env task (§8, §8.1.4)
L0 false negatives with SG Generated documents + ladder policy (§8.1.3)
Supervised host crash AgentEnvironmentTaskDied + host restart (§8.1.5)
MSBuild in UI process Supervised build host (§5.2); in-proc MSBuild — идеал, не MLP gate
Runner bugs block agent Escape hatch shell tier E + human takeover
Over-engineering MLP gate чёткий; waves — порядок, не обязательность

Отклонённые альтернативы

Альтернатива Почему нет
Shell-only agent (как Cursor default) Bottleneck среды остаётся; не moat standalone
MCP-only (все tools subprocess) Latency + JSON tax; Roslyn/build suffer most
MSBuild fully in-proc в CIDE (MLP) Риск утечек/крашей UI; supervised host (§5.2) достаточен
Full fork dotnet SDK as IDE requirement Cost дистрибьютора; библиотеки + worker (§2.3, §5) достаточны
Full verify always (L4) 20-min → hours; wrong default
No sandbox («агент осторожен») WitDB lock и подобное — уже воспроизведено
Verify только в CI, не в IDE Поздний feedback; ломает agent loop
Protobuf agent bus 0041 v1 Events DataBus JSON достаточно; protobuf later

Open questions

# Вопрос
1 Orchestrator ownership: один AgentOrchestrator service vs partial в AutonomousAgentService + chat VM?
2 ACP parity: Cursor CLI через ACP — проксировать AEE или оставить external?
3 L3 default filter: auto from [TestClass] touched vs manual trait?
4 CASCOPE: новый analyzer «agent shell in Features/ without runner»?
5 Cross-platform: process.supervise on Linux/macOS — parity windows first?
6 Build/test host IPC: named pipes vs gRPC; один host vs build+test split?
7 Sandbox без config contract: auto-downgrade to agent_worktree vs hard fail?
8 Verify epoch UX: stale glyph — chat W1; PFD/gutter dim W3+
9 idle_user detection: focus API Avalonia vs heuristic only?
10 Host restart policy: auto-restart vs require /agent verify after Died?

ADR0148-history

Дата Изменение
2026-05-25 Orion round 2: Environment Consistency Matrix; implicit cancel predecessor; substrate bundle; TaskDied/EpochStale; §8.1.5 host death
2026-05-25 Orion review: §8.1 stale context (verify epoch), DB fresh substrate, idle_user metrics, L0+SG; playbook §«Слепые зоны»
2026-05-25 Review: §5.2 supervised build/test host (MLP, не MSBuild in UI); §6 dev-service config contract; W2/risks/open Q обновлены
2026-05-24 §2.2–2.3: когнитивный vs средовой такт; открытый .NET stack (enabler, три уровня A/B/C, границы); §5.1 ladder→API; техдолг subprocess
2026-05-27 Accepted · In progress: W1–W2 + частично W3–W6 в Features/Agent/Environment/; статус синхронизирован с README
2026-05-31 Semantic verify_rung ids; naming registry naming-layers-v1.md; Verify Epoch UX spec; legacy L0–L4 deprecated in normative prose
2026-05-24 Proposed: AEE, ladder, runner, MLP vs ideal; мотивация 0144/0147 wall-clock