ADR 0199: Dual-agent isolation (client workspace primary)¶
Статус: Accepted · Implemented
Дата: 2026-07-27
Tags: #cdp #isolation #roots #witdb #adr #cascade-ide
Связанные ADR¶
| ADR | Роль |
|---|---|
| 0182 | Dual-instance deploy (cdp / cdp-debug) |
| 0197 | Wire gap (ортогонально) |
| 0198 | Toolchain; state-scoped recipes |
| 0166 | Habitat comfort |
Резюме¶
- Два агента в разных пространствах не делят WitDB / seats / pressure thrash.
- Primary: MCP client roots (
RequestRootsAsync) → state under%LocalAppData%/cdp-mcp/ws/<hash>/. - Fallback: session
scm_root/ProjectRootпослеcdp_open(тот жеws/<hash>/). - Override:
CDP_PROFILEenv (явный process profile) — когда roots недоступны или нужен ручной split. - Один
mcp.jsonentry достаточен, если клиент отдаёт разные roots на разные окна/workspaces.
Контекст¶
v0 думал только про CDP_PROFILE + второй MCP entry. Это работает, но неуклюже при одном mcp.json. Изящнее брать workspace у клиента (MCP Roots).
Решение¶
Приоритет ключа изоляции¶
CDP_PROFILE≠default→%LocalAppData%/cdp-mcp/profiles/{name}/- иначе MCP client roots (sorted, hashed) →
…/cdp-mcp/ws/{hash12}/ - иначе session project/scm → тот же
ws/{hash}/ - иначе legacy flat
…/cdp-mcp/(kind=default)
Под StateRoot: intent-workspace.witdb, pressure-stash.json, ide-settings.json.
Поведение¶
CdpClientWorkspace.Wire(server): notificationroots/list_changed+ boot refresh.- CallTool: throttled refresh (~20s) + session fallback.
- Смена StateRoot → invalidate settings cache + reopen WitDB на новом пути.
cdp_health.isolation— диагностика (kind,state_root,client_roots, last error).
Dual-instance¶
0182 остаётся для live vs dogfood. Isolation — для двух рабочих пространств.
Не делать¶
- Требовать второй
mcp.jsonкак норму. - Считать peel DataBus заменой изоляции.
Последствия¶
- Dogfood: два Cursor window с разными folder roots → разные
ws/*без правки mcp.json. - Если Cursor не advertises roots: session fallback после
cdp_open; иначеCDP_PROFILE. - cdp-mcp 0.5.251+.