WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-685 · Задача · Чат · web

Изоляция инструментов ИИ-агентов в отдельном процессе — структурное закрытие остатка WEB-670 (in-process недоверенный код)

Закрыт P2 ведёт: —
Суть
# Изоляция инструментов ИИ-агентов в отдельном процессе (граница доверия для кода внутри процесса)

## Откуда
WEB-670 («мёртвые защиты инструментов»): после починки 4 неподключённых охранников восемь независимых ревью подряд (4714, 4723, 4730, 4740, 4748, 4757, 4764 + раунды 4708–4772) находили обход, доступный коду, который уже исполняется ВНУТРИ того же Node-процесса (preload/loader до bootstrap, прямой импорт внутренних модулей, подделка контекста). Вывод ревью 4764: seal/hash/сторожи импортов не создают границу против in-process кода; структурное закрытие — отдельный процесс/worker или capability-модуль, где эффектные функции и состояние реестра недоступны импортам.

## Модель угроз (владелец 23.09 17:06: «как чужой код попадает внутрь?»)
Снаружи через API/UI — нет: входы = данные. Внутрь процесса чужой код попадает: (1) заражённая npm-зависимость (supply chain), (2) доступ к серверу/сборке (взлом или инсайдер), (3) будущие сторонние плагины in-process. Сегодня in-process плагинов нет → реального риска «с улицы» нет; тикет — страховка на (1)–(3).

## Чего ждём
1. Инструменты (создание/запись/отправка/автономия) исполняются в отдельном процессе или worker с узким IPC-протоколом: вход — брендированный контекст из аутентифицированной сессии, выход — результат; реестр и эффектные функции недоступны из основного процесса иначе как через IPC.
2. Главный процесс не имеет прямых импортов эффектных модулей инструментов (сторож импортов становится тривиальным: модулей просто нет в бандле).
3. Capability-токен на вызов, проверяемый воркером; политика роли применяется в воркере по контексту из сессии.
4. Тесты: все репродукторы раундов WEB-670 (4723…4764) остаются красными для «обхода изнутри главного процесса» — т.е. в главном процессе обхода не существует по построению.
5. Оценка: дни работы; после беты, по решению владельца.

## Связь
WEB-670 (закрывается с оговоркой о границе), WEB-439 (рантайм egress-gate — аналогичный переход «статика → рантайм»), WEB-99 (роли-агенты).
Лента
2026-09-23T17:14:43.547Z · coordinator
[23.09 17:14Z координатор] ## Связь: WEB-670 закрыт 23.09 (4772 GO, 16 патчей в all7) с оговоркой о границе — этот тикет держит остаток (изоляция инструментов в отдельном процессе). Threat-model: `m1:~/waves/4772WEB670ROUND8CLOSURESTATETRUSTEDIDENTITYEFFECTEXPORTS-evidence/threat-model.md`.
2026-09-23T18:02:14.448Z · coordinator
[23.09 18:02Z координатор] ## 4777 (Neo, Claude Opus 5.5 + субагенты Sonnet×3/Haiku×2) — GO, фаза 1: инструменты исполняются в ОТДЕЛЬНОМ процессе за флагом `TOOLS_ISOLATION=worker|inproc` (умолчание `inproc` — посадка безопасна), главный бандл без модулей инструментов (сторож import-графа: 0), identity в IPC — подписанный токен с TTL, fail-closed при недоступном worker, все 15 репродукторов раундов WEB-670 в режиме worker невоспроизводимы (15/15), изолированный typecheck 0, область 1675/1744 (разбор красных — в tests.md). Патчи (3, поверх all6 c440e2a6) наложены на A2 `l115s-web685-tool-worker`; `design.md`/`migration.md`/`threat-model.md` в доказательствах. Статус → в ревью; независимое ревью 4793 (Codex, M1). Включение `worker` на бою — отдельным решением после ревью и стендового прогона.
2026-09-23T18:53:41.473Z · coordinator
[23.09 18:53Z координатор] ## 4799 (M1, независимое ревью WEB-685 фаза 1, Codex против Opus) — NO-GO, 6 находок (1 крит.): (1) КРИТ. рантайм-граница импорта держится на `module.registerHooks` (Node ≥ 22.15), а CI (`.github/workflows/test.yml:15`) — Node 20: там главный процесс МОЖЕТ импортировать модули worker-а в worker-режиме, 6 репродукторов WEB-670 падают; при отсутствии hook надо ОТКАЗЫВАТЬ worker-режим, а не писать `unavailable` и продолжать; (2) ключ подписи identity-токенов принадлежит главному процессу (`executeToolRemote.ts:78-85`) — граница «нет реестра в главном», но не «нет authority» (ожидаемо для фазы 1, должно быть сказано прямо; фаза 2 переносит authority в отдельный юнит); (3) канонизация JSON: `__proto__`/`constructor` ломают подписанное представление (`protocol.ts:151-163`); (4) replay-кэш jti живёт в процессе worker-а и сбрасывается при его перезапуске при том же ключе главного — повтор токена; (5) сторож import-графа обходит только `src`, литеральные строки, не видит `scripts/**`/`ops/**`; (6) typecheck 2 ошибки, нет сырых списков красных до/после для проверки «69 = 69». Условия включения на стенде — 8 пунктов в `review.md`. Раунд 2 — Нео/Opus 5.5 (4804).
2026-09-23T19:33:31.403Z · coordinator
[23.09 19:33Z координатор] ## 4804 (Нео, Opus 5.5, WEB-685 фаза 1 раунд 2) — GO: все 6 находок ревью 4799 закрыты — отсутствие `module.registerHooks` = отказ старта worker-режима (CI поднят на Node 22, бой v22.23); ключ на поколение worker-а (перезапуск = все токены недействительны) + jti-кэш вторым барьером; канонизация JSON безопасна к `__proto__`/`constructor`; сторож import-графа покрывает `scripts/**`/`ops/**` и нелитеральные импорты; typecheck 0; сырые списки красных до/после совпадают; 15/15 репродукторов WEB-670 в worker-режиме; репродукторы ревью 4/4. Принадлежность ключа главному процессу зафиксирована как граница фазы 1 (authority — фаза 2). 8 условий включения на стенде — статус в `conditions.md`. 9 новых патчей (0004–0012) наложены на A2 `l115s-web685-tool-worker`. Дальше: независимое ревью р2 (Codex, M1).
2026-09-23T20:03:32.968Z · coordinator
[23.09 20:03Z координатор] ## СОСТОЯНИЕ НА 23.09 20:2xZ (для нулевого агента)
- Что это: инструменты ИИ-агентов вынесены в отдельный процесс (tool-worker) за флагом `TOOLS_ISOLATION=worker|inproc` (умолчание inproc = как сейчас). Это архитектурная замена восьми раундам заплаток WEB-670 (закрыт). Фаз ДВЕ: фаза 1 = worker + IPC + сторожа (сделана, ждёт ревью р2); фаза 2 = убрать inproc, отдельный systemd-юнит/пользователь/секреты, authority токенов вне главного процесса, перенос раннеров задач — после включения worker на стенде.
- Где код: A2 ветка `l115s-web685-tool-worker` = 48c40cb269 (12 коммитов над all6 c440e2a6; worktree `wt-l115s-web685`). Исходные 3 коммита — в all8 (с разрешением 14 конфликтов с WEB-670); р2 (9) — в all9. Исполнитель — Opus 5.5 на Нео с субагентами (решение владельца 17:15).
- Раунды: ф1 (4777 GO), ревью 4799 (Codex) NO-GO 6 находок (registerHooks нет в CI Node 20, ключ у главного, `__proto__`, replay после рестарта worker, сторож только src, typecheck 2); р2 (4804 GO, все 6 закрыты; ключ у главного — зафиксированная граница фазы 1). Бой = Node v22.23.2 (registerHooks есть).
- Сейчас: независимое ревью р2 — волна 4809 на M1 (`~/wt-l115s-c`), 19:34Z. Условия включения worker на стенде — `conditions.md` в сдаче 4804 (`neo:~/waves/4804…-evidence/`).
2026-09-23T20:09:45.251Z · coordinator
[23.09 20:09Z координатор] ## 4809 (M1, независимое ревью WEB-685 ф1 р2, Codex) — NO-GO, 4 находки, 0 крит.; 5/6 прошлых закрыты; ПОДТВЕРЖДЕНО: главный процесс не может дотянуться до реализации инструмента в worker-режиме; отказ старта без registerHooks работает даже при нейтрализованном `process.exit`. Находки: (1) high — дыры разреженных массивов канонизируются как `[,]`, а не `null` (`protocol.ts:181-183`); (2) high — AST-сторож импорта не отказывает `new Function`/`process.mainModule`/`module.constructor._load`/`require.resolve`+`vm`/`worker_threads` eval/`import.meta.resolve`; (3) medium — сырых списков красных до/после в сдаче нет; (4) medium — `toolWorker.process.test.ts:220-234` отменился после crash-loop-теста (гонка порядка). СОСТОЯНИЕ: раунд 3 — волна 4813 на Нео (Opus 5.5), затем ревью р3.
2026-09-23T20:51:34.720Z · coordinator
[23.09 20:51Z координатор] ## 4813 (Нео, Opus 5.5, WEB-685 фаза 1 раунд 3) — GO: все 4 находки ревью 4809 закрыты — канонизация JSON строго эквивалентна `JSON.stringify` (дыры/undefined → null), AST-сторож отказывает всем 6 динамическим загрузчикам (`new Function`, `process.mainModule`, `module.constructor._load`, `require.resolve`+`vm`, `worker_threads` eval, `import.meta.resolve`), сырые списки красных до/после в `raw/` совпадают построчно, 3 полных прогона без отмен, typecheck 0; репродукторы ревью 2/2. 17 коммитов над all6 → A2 `l115s-web685-tool-worker`. СОСТОЯНИЕ: фаза 1 → независимое ревью р3 (4820, M1); ФАЗА 2 (4815) стартует на Нео сейчас по цепочке.
2026-09-23T21:16:26.397Z · coordinator
[23.09 21:16Z координатор] ## 4820 (M1, независимое ревью WEB-685 ф1 р3) — NO-GO, 3 medium, 0 крит.; 3/4 прошлых закрыты; граница подтверждена снова (главный не дотягивается до инструментов): (1) на Node 22.23 `require.resolve(TOOL)` возвращает путь вместо `ERR_TOOL_BOUNDARY` (сам require через vm блокируется); (2) AST-сторож пропускает `AsyncFunction` и `child_process` с `node -e` (потомок не наследует hooks) — репродуктор в evidence; (3) `raw/` до/после в материале ревью не было — упущение координатора при передаче (в сдаче 4813 они есть). СОСТОЯНИЕ: находки войдут в раунд 4 после ФАЗЫ 2 (4815 идёт на Нео на той же ветке — параллельные правки конфликтовали бы).
2026-09-23T21:44:41.958Z · coordinator
[23.09 21:44Z координатор] ## 4823/prebuild (сборка all8) — гейт ROPA: новый корень `src/lib/reminders` (reminderTime вынесен из `ai/tools` в фазе 1) не был в `docs/privacy/ropa.json` → добавлен в `libRoots`; коммит на all8 и cherry-pick в `l115s-web685-tool-worker` на A2. Фаза 2 на Нео ветку не видит — при приёме фазы 2 применить тот же коммит. Правило: новый корень src/lib/** = запись в ROPA-реестре.
2026-09-23T21:55:07.418Z · coordinator
[23.09 21:55Z координатор] ## 4815 (Нео, Opus 5.5, WEB-685 ФАЗА 2) — GO с честным списком недоделок (17): сделано — authority (подпись identity) вынесен из главного процесса в отдельный процесс/сокет, главный НЕ может подписать (тест); `worker` — режим по умолчанию, `inproc` только под двойным флагом-люком; хук границы ставится первым в `instrumentation.ts`; сторож графа — 0 разрешённых рёбер; юнит `tool-worker@.service/.socket` с User=toolworker и сокетом 0660 (на systemd не прогонялся — ND5); worker не видит `DATABASE_URL` главного; перенесён 1 из 9 cron-раннеров (`video_report`); 15/15 WEB-670; typecheck 0; 10 коммитов. НЕ сделано (см. `not-done.md`): ND1–ND3 бессессионные пути/аттестация/`AUTH_SECRET` остаётся в главном; ND6–ND9 `ReadWritePaths`, разделение секретов (186 имён env), роль БД `nc_tools`, worker всё ещё получает `AUTH_SECRET`; ND10 сборка бандлов в цепочке релиза — только патч-предложение; ND11–ND12 раннеры 1/9, храповик 12→11; ND13–ND14 скоуп/AC5; ND15 маркеры хука в собранном бандле; ND16 fork-режим = ребёнок того же пользователя ОС (P1 в главном читает его память) — настоящая граница только с юнитом; ND17 не гонялось на Node 22/Linux. Патчи 0018–0027 → A2 `l115s-web685-tool-worker`. СОСТОЯНИЕ: фаза 1 раунд 4 (4831, Нео/Opus) идёт; независимое ревью фазы 2 — 4832 (M1); включение worker на стенде — после all9 + юнита на Linux.
2026-09-23T22:24:08.296Z · coordinator
[23.09 22:24Z координатор] ## 4832 (M1, независимое ревью WEB-685 ФАЗЫ 2, Codex) — NO-GO, 9 находок (4 крит.), `not-done.md` честен 17/17, главный подписать НЕ может (подтверждено), но: (1) fork-режим = родитель/ребёнок одного UID — не граница против кода в главном (память/`/proc` потомка читаемы); (2) аттестация без сессии по умолчанию = все capability — веб-вызов может запросить любую; (3) `AUTH_SECRET` и у веб, и у worker/authority; (4) `--require` может импортировать модуль инструмента ДО `instrumentation.ts`; (5) вне Next-пути код может выставить два env-флага люка до первого вызова (люк не только env на старте); (6) цепочка бандлов не подключена — релиз без worker-бандла; (7) набор не зелёный: 170/172 на Node v22.23; …; 10 блокеров включения на стенде (список в review.md: сузить аттестацию, убрать AUTH_SECRET у worker, юнит вместо fork, подключить сборку бандлов, systemd-прогон на Linux, ReadWritePaths, инвентарь секретов + роль БД, порядок preload/standalone, люк неизменяем после старта, зелёный Node-диапазон). СОСТОЯНИЕ: фаза 1 р4 идёт на Нео (4831); следующий раунд фазы 2 — после него, по списку 10 блокеров.
2026-09-23T23:00:32.438Z · coordinator
[23.09 23:00Z координатор] Волна 4831 (WEB-685 фаза 1 раунд 4, Neo/Opus): GO. require.resolve, семейство AsyncFunction и Node-потомки отказаны; набор 187/187 на Node 22.23.2 и 26.4.0; WEB-670 15/15; сырые списки до=после. 4 коммита → A2 `l115s-web685-tool-worker` (01fd207a27, 32 над all6). Независимое ревью — волна 4842.
Ревью фазы 2 (4832): NO-GO, 10 блокеров включения на стенде (fork-режим не граница ОС, AUTH_SECRET у worker, порядок --require, люк inproc переключается в рантайме, цепочка бандлов не применена и др.). Фаза 2 — после р4 фазы 1.
2026-09-23T23:31:28.192Z · coordinator
[23.09 23:31Z координатор] СОСТОЯНИЕ НА 23.09 23:35Z — ревью 4842 (фаза 1 раунд 4, независимое, M1): NO-GO, 3 medium, 0 крит. Прежняя находка require.resolve закрыта. Новое: (1) анализатор пропускает деструктурированный `const { eval: e } = globalThis` (и process.binding / Module._load); (2) сырые списки до/после 27 против 26 падений (разница loaderEscape.runtime 7/9→9/9); (3) Node 22.21: 109/187, не гейт. Раунд 5 → 4846 (Neo, Opus 5.5), отдаётся после завершения 4843 (фаза 2 раунд 2, то же дерево).
2026-09-23T23:48:26.895Z · coordinator
[23.09 23:48Z координатор] СОСТОЯНИЕ НА 23.09 23:49Z — 4843 (фаза 2 раунд 2, Neo, Astra): VERDICT=GO. Блокеры ревью 4832: 7/10 закрыты кодом, 3 подготовлены без запуска (B3 граница ОС через отдельный uid systemd, B5 verify-linux.sh, B7 SQL-роль nc-tools). Главный не может подписать чужой токен, секрета сессии в worker нет, тесты Node 22 и 26 — 198/198, WEB-670 15/15, typecheck 0. 10 патчей наложены на A2 `l115s-web685-tool-worker` (HEAD ae6e56f4d3, 42 коммита над all6; дерево совпадает с Neo, кроме строки ROPA из all8). Независимое ревью → 4847 (M1, дерево e). Раунд 5 фазы 1 → 4846 (Neo, в работе).
2026-09-24T00:11:30.987Z · coordinator
[24.09 00:11Z координатор] Волна 4847 (независимое ревью фазы 2, раунд 2): NO-GO. 7 из 7 закрытых блокеров подтверждены, тесты 198/198 на Node 22, WEB-670 15/15, главный процесс сам подписать не может. Но F-001 — обход авторизации: authority подписывает токен с командой из присланного главным процессом btid, если у сессии нет команды (членство не проверяется). F-002 — предложенная роль БД не покрывает реальные записи (User, SystemSetting, embeddings/messages) и содержит DDL. Раунд 3 — волна 4850 на Neo (Astra), после 4846.
2026-09-24T00:42:55.417Z · coordinator
[24.09 00:42Z координатор] Волна 4852 (фикс старта all8): GO. Причина падения стенда 4844 («b is not a function»): WEB-685 фаза 1 убрала assertBuiltinRegistryBootstrap из фасада toolRegistry, а instrumentation (WEB-670) его вызывает. Экспорт возвращён (inproc — проверка через runtime-реестр, process — без загрузки модулей инструментов), плюс тест на все деструктурированные экспорты instrumentation (падает на 5bb221f2). 71/71, WEB-670 15/15, сторож WEB-685 OK, новых ошибок typecheck 0. Патчи → A2 l115s-all8 (6b64d314a4); пересборка all8 — 4855.
2026-09-24T01:16:27.586Z · coordinator
[24.09 01:16Z координатор] 4846 (Neo, Opus, фаза 1 раунд 5): VERDICT=GO. Деструктурированные глобальные алиасы (eval/process.binding/Module._load) и рефлексия на глобалах — отказ; сырые списки до/после повторяемы (before = before-rerun побайтно, разница построчно объяснена); B10 — минимум Node 22.23.2, на 22.21.1 worker-режим отказывает по замыслу (exit 78, 113/133); WEB-670 15/15; typecheck 0; 44 коммита над all6. Патчи на A2: ветка l115s-web685-tool-worker-r5 = dd56e8d8d0. Независимое ревью — 4861 (M1).
2026-09-24T01:36:53.844Z · coordinator
[24.09 01:36Z координатор] 4850 (фаза 2 р3, Astra) NO-GO честный: F-001 закрыт (btid только по членству из БД authority), F-002 закрыт (роль БД на PG17: 181/181 записей, 20/20 запретов, DDL/GRANT раздельно). Не закрыто: authority не проверяет cap, tool и scope (ch) по сессии — пробник подписал cap=facetime-admin и контекст с чужими источниками; legacy opt-in копирует поля без сессии; срок токена не ограничен сессией. 68 падений области совпадают с базой. → 4865 (Astra, Neo): проверка права (scope/cap/tool) до подписи, legacy закрыт в process-режиме, exp ≤ срока сессии, условие — 0 новых падений относительно c440e2a6. Worker-режим на стенде не включаем.
2026-09-24T01:49:53.980Z · coordinator
[24.09 01:49Z координатор] 4861 (M1, Luna, независимая приёмка фазы 1 р5) GO: 44 патча без конфликтов поверх c440e2a6, 198/198 на Node 22, WEB-670 15/15, состязательных 44/44, прежние находки 3/3 закрыты, новых 0. Фаза 1 (изоляция инструментов в отдельном процессе, по умолчанию выкл.) принята к сборке. Фаза 2 (authority) — раунд 4 в работе (4865).
2026-09-24T02:14:35.105Z · coordinator
[24.09 02:14Z координатор] 4865 (Neo, Astra, фаза 2 раунд 4) NO-GO честный, но с главным результатом: authority теперь проверяет ПРАВО, а не только личность — cap выводится из проверенной сессии, ch (scope) вычисляется и сверяется самой authority, legacy-mint без доказательства удалён; пробник mint-fields красный до / зелёный после, MINT_FIELDS_UNCHECKED=0, репродукторы 4847 5/5, typecheck 0 на двух Node, манифест 703 OK. HEAD add6fb0a72 (54 над all6). Не GO из-за тестов: 32 новых падения области, целевые 217/260, WEB-670 11/15 — старые тесты зовут worker без доказательства сессии, и authority отказывает раньше worker-а. → 4872 (Astra, Neo): тестовый помощник с настоящим доказательством сессии, R10/R12/R13/R14 должны доходить до worker-а и получать отказ ОТ него; ослаблять authority и утверждения запрещено.
2026-09-24T02:42:28.908Z · coordinator
[24.09 02:42Z координатор] 4872 (фаза 2 р5, Astra, Нео) NO-GO, но близко: 63 из 75 падений закрыты на настоящих подписанных сессиях, продуктовый код не менялся (HEAD 0aa3324184, 58 над all6), пробник зелёный, 4847 5/5, typecheck 0, Node 22 и 26 — 254/260. Оставшиеся 6: authority правильно отказывает раньше, и до worker-а вызов не доходит — вторая линия так не проверяется; 2 теста противоречат новой политике. → 4878 р6 (Astra, Нео): прямой стенд «к worker-у в обход authority» для R10/R12/R14 + отдельные тесты первой линии; 2 политические миграции.
2026-09-24T03:05:45.698Z · coordinator
[24.09 03:05Z координатор] 4878 (фаза 2 р6, Astra, Нео) GO: стенд «прямо к worker-у» в обход authority. R10/R12/R14 и «worker enforces policy» — 6/6 отказов ОТ worker-а при прямом подписанном IPC и 6/6 отказов ОТ authority через штатный путь; 269/269 на Node 22 и 26; WEB-670 15/15; новых падений области 0; продуктовый код не менялся (только 2 списка typecheck); хука в продукте не понадобилось. HEAD 3a460d3b4e (59 над all6) → A2 l115s-web685-tool-worker-p2r6. Независимое ревью → 4880 (M1).
2026-09-24T03:31:09.723Z · coordinator
[24.09 03:31Z координатор] 4880 (независимое ревью ф2 р6, M1) NO-GO без P0/P1: 17 атак, обхода нет — authority отказала на подмене cap/тенанта/источника/ch, worker отказал на неподписанном, чужом ключе, повторе, подмене тела, просрочке, чужом тенанте; пробник GREEN, 4847 5/5, без базы fail-closed. Гейт не выполнен: F-001 P2 фикстуры с абсолютными путями Нео → в другом каталоге 266/269 и typecheck красный; F-002 P2 тестовый хук TOOL_AUTHORITY_TEST_HOOKS в продуктовом entry.ts + fork наследует всё окружение; F-003 P3 общий PROTOCOL_ERROR вместо категории. Раунд 7 → 4881 (Нео, Astra).
2026-09-24T04:10:37.793Z · coordinator
[24.09 04:10Z координатор] 4881 (фаза 2 раунд 7, Astra на Нео) GO: закрыты находки ревью 4880 — абсолютных путей в тестах 0, перенесённые тесты 560/560, 280/280 на Node 22 и 26, typecheck 0 (основной и перенесённый), тестовых хуков в продукте 0, env форка authority по разрешающему списку (F-002), F-003 → CONTEXT_INVALID; WEB-670 15/15, репродукторы 4847 5/5, новых падений в области 0. A2: l115s-web685-tool-worker-p2r7 = 0d6c21d1bd (63 над all6). Независимое ревью → 4885 (M1).
2026-09-24T04:36:57.226Z · coordinator
[24.09 04:36Z координатор] Волна 4885 (M1, независимая состязательная приёмка 685 фаза 2 раунд 7, Luna): VERDICT=GO. HEAD 1b30adb3, тесты 280/280, репродукторы 4847 5/5, проба зелёная, находок 0 (P0–P3), атак 17, тестовых крючков в продукте 0, манифест 16/16 OK. Фаза 2 (изоляция) принята — идёт в all9. Замечание: свежий прогон на Node 26 не делался (на M1 нет Node 26); прогон Node 22+26 был в 4878 на Нео.
2026-09-24T07:29:18.528Z · coordinator
[24.09 07:29Z координатор] Статус 24.09 07:30Z: фаза 1 (GO 4861, ревью принято) и фаза 2 р7 (Astra 4881 GO, независимое ревью 4885 GO: 280/280, 17 атак без обхода, находок 0) — обе сданы и приняты в all9. Статус review = ждёт посадки с all9.
2026-09-25T00:09:11.084Z · coordinator
[25.09 00:09Z координатор] Волна 4958 (M1, Codex Luna) — GO. Сборка all9 4957 прошла саму сборку Next, но упаковка отказала: в standalone попал dev-пакет @types/node.
Причина: copyPnpmBucketClosure шёл по pnpm-ссылкам замыкания внешних пакетов воркера инструментов (WEB-685 tool-worker → @opentelemetry/sdk-node → otlp-grpc → @grpc/grpc-js → proto-loader → protobufjs → @types/node) и материализовал @types/node до гейта; fs.cp оставлял абсолютную ссылку в рабочее дерево.
Фикс: 2 коммита (репро-тест 3d85e2d9 + исключение type-бакетов 673fc939), гейт упаковки не ослаблен. Тесты 14/14, WEB-685 55/55, typecheck новых 0.
Далее: 4960 — сборка all9 r5 на A2 с HEAD 673fc939.
2026-09-25T08:42:25.852Z · coordinator
[25.09 08:42Z координатор] VERDICT=CLOSE — WEB-685.

AI tools вынесены в worker/authority boundary с узким IPC; capability/session/identity policy проверяются worker-side, main не хранит рабочий ключ; standalone исключает `@types` dev buckets и держит portable links. All9 commits `3d85e2d9e`, `673fc9396`, `879094713e`; ключи `src/lib/ai/toolAuthority/capabilities.ts:27-34`, `src/lib/ai/toolAuthority/workerSupervisor.ts:167-265,384-399`, `src/lib/ai/toolIsolation/protocol.ts:367-401`, `scripts/prepare-standalone.cjs:552`. Packaging 1/1 pass; board 4881/4885/4958 GO (WEB-670 15/15, packaging 14/14/55/55 on supported Node).

Что ломалось: раунды находили import/loader escapes, sparse canonical JSON, authority scope/cap mismatch, test hooks/env leakage и `@types/node` в standalone; всё закрыто указанными раундами. Локальный Node20.9 не имеет `module.registerHooks`, поэтому 20 worker cases unsupported — не ослаблять gate. Остаток: включение и наблюдение worker после посадки.

Старт: Node22.23.2+, `TOOLS_ISOLATION=worker`, phase2 tests, packaging test; не печатать ключи. Доска: http://127.0.0.1:8787/api/web/issues/WEB-685.


Проверка координатора (09:5xZ, all9 879094713e, M1): 4981 гонял на Node 20.9 — неподдерживаемо. Перезапуск на Node 22.23.2 (минимум по check:web685-runtime): test:web685-tool-worker 263/263 зелёные, check:web685-runtime и check:web685-tool-worker-boundary RC 0. CLOSE подтверждён. На посадке: Node на A1 ≥ 22.23.2 — обязательное условие.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-685","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-25T08:42:39.508Z