diff --git a/personal/plans/balda-remote-agent.md b/personal/plans/balda-remote-agent.md index 4dc9e92e..57b4ea83 100644 --- a/personal/plans/balda-remote-agent.md +++ b/personal/plans/balda-remote-agent.md @@ -1,34 +1,18 @@ # Balda — удалённый агент по SSH -## Текущее состояние — сверено 2026-10-19 08:06 UTC +## Текущий статус — 2026-10-19 22:19 UTC+6 (Asia/Bishkek) -| Компонент | Проверенное состояние | -| --- | --- | -| SSH Manager | 0.3.2, `a86df58`, 8 MCP-инструментов, `127.0.0.1:17796` | -| Workspace Manager | `0c82b8f`, четыре функции, native SMB3, `127.0.0.1:17795`; root только `developer`, recipient `balda` | -| Balda | `eee69fc5`, `balda-mm-mac`, provider `pool`, permissions `ask`; старт `2026-10-19T08:05:42.795540715Z` | -| Проверка установленного SSH-ключа | Реальный контейнер Balda, `registered`, `client_verified_at=2026-10-19T06:29:15.692883Z`; прежний key id сохранён | -| Исходники / runtime | Все три checkout чистые; build metadata обоих исправленных binaries указывает на эти чистые commits; активные hashes/inode проверены | +SSH Manager **0.4.0**, `d2806ac`, 13 MCP-инструментов, развёрнут и проверен. Есть постоянное изменение профиля и разовое расширение на точный вызов с native owner confirmation и серверной однократностью. Network, файлы, Docker read/manage и sudo разделены. Действующие ключи/маршруты сохранены; initial migration существующего fixed/operator профиля требует отдельного явного подтверждения. -SSH Manager импортирует существующий Mac SSH alias из native config/Include и доверенных known_hosts, проверяя существующую аутентификацию; повторно присылать server key для такого хоста не требуется. Для клиента отдельно проверяется маршрут: без `via` сначала pinned no-auth handshake из настроенного `client_container`; при сетевом отказе выбирается единственный зарегистрированный relay. Неизвестный или неверный pin не вызывает fallback; при нескольких relay нужен явный `via`. Owner-form включает точную замену relay key line с ограниченным permitopen. Хардкода Kraken или mac-relay в выборе маршрута нет. +Balda — чистый upstream `138cc4a7`, start `2026-10-19T16:15:26.785581969Z`, config/env/mounts сохранены, health/login 200 и Mattermost websocket connected. Кэш MCP обновлён перезапуском; все 49 sessions/metadata и пользовательские bindings сохранены. Workspace Manager остаётся `0c82b8f`, только root developer. -Успех `ssh_authorize` теперь требует свежего SSH-вызова из фактического клиента его установленным dedicated key с проверкой случайного маркера. Ошибка сохраняет `installed_unverified` и возвращает tool error; удаление host до отзыва такого ключа запрещено. Существующий принятый доступ можно проверить/исправить без замены целевого ключа и sandbox policy. В operator config указан `client_container: balda-mm-mac`, volume проверяется read-only. +Реальный Balda ACP и SSH установленным fixture-ключом прошли приёмку; после restart production ключи Mac/Kraken также работают. Все изменения прав идут через менеджер, без ручного изменения host config и без хардкода хоста. Произвольный remote model/Prism lifecycle и реальные project Beads DB не объявляются выполненными этой работой. -Inventory сейчас: `mac`, `mac-relay`, `kraken`. Kraken добавлен владельцем через Balda в сессии по ссылке ниже; маршрут исправлен самим менеджером на `mac-relay → kraken`, relay ограничен текущим endpoint. Новый target key при исправлении не устанавливался, прежняя identity и изоляция сохранены. Отдельный независимый SSH-вызов UID 1000 из Balda вернул ожидаемый маркер. +Актуальный contract, 22/10/14 проверки, receipts/backup и ограничения: [[personal/projects/balda/ssh-permissions-2026-10-19]]. Текущий runtime/setup: [[personal/projects/balda/setup]]. -Треды Mattermost DM: `eee69fc5` сохраняет `root_id` пользовательского сообщения в адресе доставки; обычные ответы, progress и вопросы идут в его тред, дальнейшие replies сохраняют этот root. DM/group session IDs остаются прежними. Это поведение транспорта в коде; настройки переключения нет. Отдельный approval-тред не создаётся. `254f3e29` откачен коммитом `3f6a1363`: обработчик обычного числового ответа без треда и изменения хранилища удалены. Узкое сопоставление raw user ID для штатного threaded reply исправлено отдельно в `eee69fc5`. Исправление двойного меню `3e86b995` сохранено. `9018e7a3` исправляет transport routing; `c061e266` исправляет выбор pending-вопроса в общем root вместо уже отвеченного; неоднозначные параллельные pending-вопросы не подтверждаются. `eee69fc5` сохраняет прежнюю классификацию лички в архиве. Приёмка и ограничения: [[personal/projects/balda/mattermost-dm-threads-2026-10-19]]. +## История установки -Balda: меню подтверждения рендерится один раз — permission layer передаёт готовую presentation, questions layer сохраняет structured options для ответа, но не дописывает второе меню. Regression проходит через permission review, session question delivery и decision resolution. Добавление host и установка ключа остаются двумя разными owner confirmations; дополнительные generic MCP approvals у Codex выключены, native изменения доступа подтверждаются владельцем. - -MCP: `obsidian`, `virfield`, `workspace-manager`, `ssh-manager` и встроенный `balda`. Legacy Broker/Prism MCP отсутствуют в runtime, plugin `execution-broker` выключен, оригинальные Prism/Prism Callee 0.7.0 включены. Codex: `workspace-write`, дополнительный writable root только grants получателя, `--mcp-approval-policy=allow`. - -Workspace: `workspace_folders`, `workspace_connect`, `workspace_disconnect`, `workspace_lease`; discovery только папок, выдача конкретной папки RO/RW с TTL. Downloads и общий Developer/home mount не включены. Lease journal пуст. Приняты SMB revoke существующих FD/expiry и shared Beads fixture; runtime Workspace в этом исправлении не менялся. - -Проверено: SSH race/vet/build; 15 native SSH lifecycle checks и 16 checks на случайных aliases в сети реальной Balda, включая alias-only import без via, автоматический relay, pin failure, retry, restart/revoke/remove. Историческая model-проверка после deployment SSH-маршрута 06:28 UTC: `01a152d9-7d04-7f21-9597-91c259813c7c`, ровно одна Owner confirmation существующего key id, без generic MCP approval; client receipt выше. Полный race-прогон Balda: 142 пакета с тестами; golangci-lint и architecture checks — pass; launchd Workspace/SSH/Beads-Dolt running, health/login 200. Внешние тестовые сообщения Mattermost не отправлялись. - -Первичный провал приёмки: [сессия Mattermost](https://mm.qentra.top/qentra/pl/bjb4nhz6o3yoxqg9rs1qcpncjh). Причины и исправление: [[personal/projects/balda/ssh-client-route-2026-10-19]]. Evidence: `~/.local/share/balda-workspace/candidate/client-route/`; backup: `~/.local/share/balda-workspace/backups/client-route-20261019T062059Z`. - -Оставшийся исходный объём: полноценные удалённые Mac model runs с отдельными CLI credentials/OpenCode network решениями, полный модельный Prism lifecycle и реальные project Beads DB. Host Docker/socket/sudo authority не добавлялась: установленный target key по-прежнему ограничен принятой песочницей. Эти пункты не объявляются выполненными этим исправлением. +Датированные записи ниже — предыдущие этапы; текущие версии и границы приёмки приведены выше. ## Исторический журнал изменений и исходный план diff --git a/personal/projects/balda/setup.md b/personal/projects/balda/setup.md index 79b32731..950318eb 100755 --- a/personal/projects/balda/setup.md +++ b/personal/projects/balda/setup.md @@ -1,14 +1,14 @@ # Balda — актуальный локальный запуск -## Текущее состояние — Balda сверена 2026-10-19 20:25 UTC+6 (Asia/Bishkek) +## Текущее состояние — 2026-10-19 22:19 UTC+6 (Asia/Bishkek) | Компонент | Проверенное состояние | | --- | --- | -| SSH Manager | 0.3.2, `a86df58`, 8 MCP-инструментов, `127.0.0.1:17796` | +| SSH Manager | 0.4.0, `d2806ac`, 13 MCP-инструментов; постоянные/разовые права, `127.0.0.1:17796` | | Workspace Manager | `0c82b8f`, четыре функции, native SMB3, `127.0.0.1:17795`; root только `developer`, recipient `balda` | -| Balda | `138cc4a7`, чистый upstream, `balda-mm-mac`, provider `pool`, permissions `ask`; старт `2026-10-19T14:21:56.807163574Z` | -| Проверка установленного SSH-ключа | UID 1000 из обновлённой Balda, случайный маркер получен; принятый ключ и volume сохранены; 2026-10-19 20:25 UTC+6 (Asia/Bishkek) | -| Исходники / runtime | Balda: чистый upstream `138cc4a7`, `vcs.modified=false`; активный `/proc/1/exe` совпадает со сборкой. SSH/Workspace commits прежние | +| Balda | `138cc4a7`, чистый upstream, `balda-mm-mac`, provider `pool`, permissions `ask`; старт `2026-10-19T16:15:26.785581969Z` | +| Проверка установленного SSH-ключа | UID 1000 из Balda после refresh: Mac и Kraken вернули случайные markers; старые keys/route сохранены | +| Исходники / runtime | Balda: чистый upstream `138cc4a7`, `vcs.modified=false`; активный `/proc/1/exe` совпадает со сборкой. SSH Manager `d2806ac`; Workspace `0c82b8f` | SSH Manager импортирует существующий Mac SSH alias из native config/Include и доверенных known_hosts, проверяя существующую аутентификацию; повторно присылать server key для такого хоста не требуется. Для клиента отдельно проверяется маршрут: без `via` сначала pinned no-auth handshake из настроенного `client_container`; при сетевом отказе выбирается единственный зарегистрированный relay. Неизвестный или неверный pin не вызывает fallback; при нескольких relay нужен явный `via`. Owner-form включает точную замену relay key line с ограниченным permitopen. Хардкода Kraken или mac-relay в выборе маршрута нет. @@ -24,13 +24,19 @@ MCP: `obsidian`, `virfield`, `workspace-manager`, `ssh-manager` и встрое Workspace: `workspace_folders`, `workspace_connect`, `workspace_disconnect`, `workspace_lease`; discovery только папок, выдача конкретной папки RO/RW с TTL. Downloads и общий Developer/home mount не включены. Lease journal пуст. Приняты SMB revoke существующих FD/expiry и shared Beads fixture; runtime Workspace в этом исправлении не менялся. -Проверено: SSH race/vet/build; 15 native SSH lifecycle checks и 16 checks на случайных aliases в сети реальной Balda, включая alias-only import без via, автоматический relay, pin failure, retry, restart/revoke/remove. Историческая model-проверка после deployment SSH-маршрута 06:28 UTC: `01a152d9-7d04-7f21-9597-91c259813c7c`, ровно одна Owner confirmation существующего key id, без generic MCP approval; client receipt выше. Полный race-прогон Balda: 142 пакета с тестами; golangci-lint и architecture checks — pass; launchd Workspace/SSH/Beads-Dolt running, health/login 200. Внешние тестовые сообщения Mattermost не отправлялись. +Проверено на этом этапе: SSH race/vet; 22 native macOS, 10 Linux/bubblewrap и 14 прежних lifecycle проверок. Реальный Balda ACP прошёл update/one-call/status/restore; native SSH выполнен установленным временным fixture-ключом из UID 1000. Свежий ACP вызвал production ssh_permissions без approvals. Отдельно проверены прежние production ключи Mac/Kraken после refresh Balda, health/login, Mattermost websocket и OAuth login. Подробности и границы: [[personal/projects/balda/ssh-permissions-2026-10-19]]. Первичный провал приёмки: [сессия Mattermost](https://mm.qentra.top/qentra/pl/bjb4nhz6o3yoxqg9rs1qcpncjh). Причины и исправление: [[personal/projects/balda/ssh-client-route-2026-10-19]]. Evidence: `~/.local/share/balda-workspace/candidate/client-route/`; backup: `~/.local/share/balda-workspace/backups/client-route-20261019T062059Z`. Оставшийся исходный объём: полноценные удалённые Mac model runs с отдельными CLI credentials/OpenCode network решениями, полный модельный Prism lifecycle и реальные project Beads DB. Host Docker/socket/sudo authority не добавлялась: установленный target key по-прежнему ограничен принятой песочницей. Эти пункты не объявляются выполненными этим исправлением. +## Постоянные и разовые SSH-права — 2026-10-19 22:19 UTC+6 (Asia/Bishkek) + +SSH Manager 0.4.0 развёрнут из чистого коммита `d2806ac`, активный inode/SHA проверены. Добавлены `ssh_permissions`, `ssh_permissions_update`, `ssh_call_request`, `ssh_call_status`, `ssh_call_cancel`. Network, read/write paths, Docker read/manage и sudo — отдельные права. Разовый допуск связан с argv, сроками и revision, проверяется и потребляется на целевом хосте; постоянный профиль при этом сохраняется. + +Старые production профили не мигрировали автоматически: первое управляемое изменение подтверждается через MCP. История и все 49 session/metadata сохранены; Balda только штатно перезапущена для обновления кэша MCP, binary остаётся чистым upstream. Полный contract, доказательства и ограничения: [[personal/projects/balda/ssh-permissions-2026-10-19]]. + ## Upstream развёрнут — 2026-10-19 20:25 UTC+6 (Asia/Bishkek) Основной `balda-mm-mac` работает на чистом upstream `138cc4a71d6889de30fe90e368f27f129fd8d792`; PR #77 и #78 смержены и входят в этот commit. Binary SHA256 `31c448af84428f83491d5fb8317549466f814f51c453de11fc8f6c9bd0836672`, `/proc/1/exe` совпадает; build metadata `vcs.modified=false`. Конфигурация, environment, mounts и выбранный Codex account сохранены. Миграция SQLite — 68, integrity/foreign keys — ok; все 49 sessions/metadata, 1952 events, 2 users/bindings и 28 questions из согласованного snapshot сохранены. Mattermost websocket подключён, health/login 200, `codex login status` успешен; SSH UID 1000 установленным ключом из Balda до зарегистрированного target прошёл. Тестовые сообщения в Mattermost и модельные запросы этим deployment не отправлялись. diff --git a/personal/projects/balda/ssh-permissions-2026-10-19.md b/personal/projects/balda/ssh-permissions-2026-10-19.md new file mode 100644 index 00000000..73e422db --- /dev/null +++ b/personal/projects/balda/ssh-permissions-2026-10-19.md @@ -0,0 +1,57 @@ +# SSH Manager — постоянные и разовые права + +Проверено и развёрнуто: 2026-10-19 22:19 UTC+6 (Asia/Bishkek). + +SSH Manager **0.4.0**, implementation commit `d2806ac150363712b8baa9c40dbd37f2946b8c13`. Рабочее дерево чистое при сборке, `vcs.modified=false`. Активный binary SHA256 `536d389a4261e186fce8dfabe4a3adfe605d190d84ef188cdf105c3e8ee079bd`, inode работающего процесса совпадает с установленным файлом. HTTP MCP `127.0.0.1:17796/mcp` отдаёт **13 инструментов**. + +Balda остаётся на чистом upstream `138cc4a71d6889de30fe90e368f27f129fd8d792`, binary SHA256 `31c448af84428f83491d5fb8317549466f814f51c453de11fc8f6c9bd0836672`. Каталог/кэш MCP обновлён штатным перезапуском: `2026-10-19T16:15:26.785581969Z`. Config/env/mounts, OAuth login, SSH inventory и ключи сохранены; health/login 200, Mattermost websocket подключён. Все 49 runtime sessions и metadata, 28 questions, 2 users/bindings и 24 archive sessions из остановленного snapshot сохранены. Workspace Manager не менялся. + +## Что исправлено + +В [разобранном треде](https://mm.qentra.top/qentra/pl/skeyf33mx3f6tcnmx11qukgs5r) штатный ключ уже работал, но bubblewrap закрывал сеть хоста, Docker socket и sudo. Модель попыталась использовать sandbox-доступ Mac как административный и запустить вложенный `ssh kraken`; он завершился DNS-ошибкой. Прав не поменялось. У менеджера тогда отсутствовало API изменения профиля. Сбой произошёл до обновления Balda на upstream. + +Теперь изменения выполняются через SSH Manager существующим операторским bootstrap-доступом, без передачи его ключей агенту и без хардкода хоста. Менеджер не получил инструмент произвольного выполнения команд: он выдаёт разрешение и native SSH-команду, которую запускает клиент своим установленным ключом. + +## Права + +- `network`: сеть хоста вместо отдельного Linux network namespace; на Mac — IP networking через Seatbelt. +- `read_paths` / `write_paths`: конкретные канонические пути. Manager control state, личные SSH credentials, системные корни и каталоги с socket-файлами не выдаются обычным файловым grant. Linux использует проверенные открытые FD для bind mounts. +- `docker`: `none`, `read` или `manage`. Read разрешает просмотр/логи/инспекцию, но не изменения. Docker CLI работает с фиксированным локальным daemon endpoint и закрытым control HOME/config; socket не появляется в sandbox. +- `admin`: прямой `sudo` с уже существующими noninteractive правами оператора. Sudoers не изменяется. Native timeout запускается с теми же привилегиями, чтобы остановить обычную root-команду. + +`docker=manage` и произвольный sudo могут обойти файловые/сетевые ограничения; форма подтверждения сообщает об этом. Это отдельные явно разрешённые исключения. Завершение вызова не откатывает его побочные эффекты и не обещает отозвать намеренно оставленную привилегированную работу. + +## Постоянное изменение + +1. `ssh_permissions` возвращает профиль и revision. +2. `ssh_permissions_update`: полный новый профиль плюс `expected_revision`. +3. Native owner form показывает before/after; затем выполняются реальная приёмка изоляции, CAS только managed key line и SSH-проверка из настроенного клиента. Ключ и маршрут сохраняются. +4. Ошибка активации/проверки восстанавливает и проверяет прежний профиль либо явно сообщает, что rollback не подтверждён. + +Новые вызовы используют новый профиль. Старые запущенные процессы не завершаются; неиспользованные разовые допуски инвалидируются. Действующие production `mac` и `kraken` пока возвращают `managed=false`: их прежние принятые ограничения при deployment не заменялись. Первый переход на управляемый профиль — отдельное явное `ssh_permissions_update` с owner confirmation, выполняемое самой Balda через MCP; ручная настройка JSON/хоста не требуется. + +## Разовый вызов + +`ssh_call_request` принимает хост, точный argv и только временные overrides профиля. Например: command `["docker","ps","-a"]`, permissions `{"docker":"read"}`. + +Одно owner confirmation связывает хост, argv, эффективные права и сроки. Затем Balda запускает возвращённый `ssh_command` своим установленным ключом. Сервер атомарно потребляет id **до запуска**, включая ошибочные вызовы; повтор/гонка второго подключения не дают второго запуска. Argv исполняется буквально, stdin закрыт. Start TTL 1–900 секунд (default 300), runtime 1–600 секунд (default 60). Часы — общесистемные на целевом хосте, включая macOS system Python. + +`ssh_call_status` читает серверную квитанцию; issued не означает выполнение, consumed без result не означает, что процесс ещё работает. Успех — finished и exit_code 0 после реального SSH. `ssh_call_cancel` подтверждённо отменяет неиспользованный допуск, но не останавливает запущенную команду. Изменение профиля и revoke не воскрешают старые разрешения при повторной регистрации. + +Постоянный профиль при разовом вызове не меняется. Штатная политика Balda для запуска локальной SSH-команды остаётся отдельным уровнем; SSH grant не выключает её. Старые диалоги с кэшированной MCP schema обновляются обычной новой сессией / `/reset`; история автоматически не сбрасывалась. + +## Проверено + +- Go race и vet, diff --check — pass. +- Native macOS + MCP + временный sshd: **22 проверки**, включая отказы, stale revision, rollback после сбоя SSH-проверки, буквальный argv, закрытый stdin, race двух соединений, consumption после ошибки, TTL/timeout/cancel, постоянные file/network права и отзыв/re-authorize. +- Linux strict bubblewrap в Colima: **10 проверок**, в том числе Docker read/manage отдельно, отказ управления при read, sudo от **обычного пользователя** с получением host root и остановка root-команды по тайм-ауту. Kernel/AppArmor/proc protection не ослаблялись. Временный Docker volume удалён. +- Прежний native lifecycle произвольных хостов/ProxyJump/pin/restart/revoke/remove: **14 проверок**. +- Реальная модель в работающей Balda: session `01a154e9-5b6a-7a32-ae5b-d5efcdc03ca6`. Постоянный update → one-call → проверка серверной квитанции → восстановление профиля. Ровно 3 native owner forms для этих 3 изменений, без generic MCP approval. Harness выполнил pinned native SSH из реального контейнера UID 1000 установленным **временным fixture-ключом**; успех подтверждён, повтор запрещён, исходная сеть восстановлена. +- После deployment свежий Codex ACP вызвал новый `ssh_permissions` на production Mac/Kraken: session `01a154f0-1bb2-7932-aa2d-cf2907fc4ed0`, **0 подтверждений**. Это read-only проверка установленного API, без миграции профилей. +- После перезапуска Balda прежние production-ключи к Mac и Kraken ещё раз проверены native SSH из настоящего UID 1000 Balda; оба вернули случайный marker. + +Тесты используют случайные aliases/порты, временные ключи и отдельные private пути. Тестовые сообщения в Mattermost не отправлялись. Никакие bootstrap keys/passwords не передавались модели или в agent volume. + +Evidence: `/Users/admin/.local/share/balda-workspace/candidate/ssh-permissions-20261019`. Backup менеджера: `/Users/admin/.local/share/balda-workspace/backups/ssh-permissions-20261019T161039Z`. Согласованный state backup Balda: `/Users/admin/.local/share/balda-workspace/backups/ssh-permissions-balda-20261019T161515Z`. Backup изменённых заметок: `/Users/admin/.local/share/balda-workspace/backups/obsidian-ssh-permissions-20261019T221941+0600`. + +Исходники и contract: `/Users/admin/Developer/ssh-manager/README.md`, `docs/permissions-2026-10-19.md`. Текущий setup: [[personal/projects/balda/setup]]. План: [[personal/plans/balda-remote-agent]]. diff --git a/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md b/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md index 213bf292..fddeb088 100755 --- a/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md +++ b/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md @@ -544,11 +544,14 @@ P4 detection-only method прошёл в обоих успешных ON runs: la На чистом harness `6d04496882` (production `8275bcce36`) первый ON завершился **9 PASS**, OFF — **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**, SHA256 app/test modules совпали. Первый restored-ON (`current-app-restored.xcresult`) завершился **7 PASS / 2 FAIL / 0 SKIP**: `testBackgroundLoadFailureRecoversOriginalDocument` прошёл CPM assertions, но `TestRunHelper.swift:453` не дождался освобождения window views за 5 секунд; следующий `testInstallDuringSessionInitIsDelivered` остановился с **SIGINT**, runner перезапустил host. P2 evidence подтверждает native dashboard + page initResp после recovery для existing tab, new window и new tab; этот run всё равно считается неуспешным. В production DEBUG есть `ensureObjectDeallocated(..., .interrupt)` → `raise(SIGINT)`; связь с конкретным удерживающим reference пока не доказана, retained root cause не установлен. Функциональные ожидания и deallocation checks не отключались. Полные attachments, diagnostics, summary и логи сохранены в `/private/tmp/cpm-pr7379-error6-fix-20261019/current-app-restored-first-*`; начатый полный restored-ON retry на тех же бинарниках (`current-app-restored-retry.xcresult`) затем завершился **9 PASS / 0 FAIL / 0 SKIP**. SHA256 app/test modules совпали; source и assertions между попытками не менялись. Это не отрицательный контроль, failures не исключаются из истории. - ## Проверка отчёта о трёх падениях late-startup app tests — 19 октября 2026 -Исследуется screenshot с failed `testLateStartupIsDetectedWithRecoveryDisabledWithoutReload`, `testOverBudgetInstallRecoversFirstDocumentWithoutExtendingNavigationWait`, `testOverBudgetUpgradeRecoversFirstDocumentWithoutExtendingNavigationWait`; остальные 6 methods зелёные. В screenshot нет assertion/timeout text, поэтому причина конкретного reviewer run пока не установлена и не объявляется infrastructure failure. +Исходный screenshot: failed `testLateStartupIsDetectedWithRecoveryDisabledWithoutReload`, `testOverBudgetInstallRecoversFirstDocumentWithoutExtendingNavigationWait`, `testOverBudgetUpgradeRecoversFirstDocumentWithoutExtendingNavigationWait`; остальные 6 methods зелёные. Assertion text reviewer run не предоставлен, поэтому идентичность конкретных причин его трёх failures не утверждается. -Проверены published production `674bb809f2` и harness `d26a1c55d1`: fixture/оба shared scheme задают flags автоматически; ручной шаг включения late recovery не пропущен. Native normal test configuration: `CPM_APP_INTEGRATION=1`; disabled дополнительно задаёт оба DISABLE overrides=1 и выбирает ровно 6 recovery methods. На host macOS 26.7.1 / Xcode 27.1 отдельный прогон трёх reported methods дал **3 PASS / 0 FAIL / 0 SKIP**. Полный disabled затем дал **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**. Следующий полный normal ещё выполняется; все три reported methods уже PASS. +Проверены published production `674bb809f2` и harness `d26a1c55d1`: оба shared scheme задают flags автоматически; ручной шаг включения late recovery не пропущен. Normal задаёт `CPM_APP_INTEGRATION=1`; disabled дополнительно задаёт оба DISABLE overrides=1 и выбирает ровно 6 recovery methods. На host macOS 26.7.1 / Xcode 27.1 исходный harness дал **3 PASS / 0 FAIL / 0 SKIP** для reported methods, затем полный disabled **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**, затем normal **9 PASS / 0 FAIL / 0 SKIP**. -По запросу пользователя создан чистый Virfield `macos27` lease `lease-671a00b65fc4efdfc9b0df677a0ff51f` (macOS 27.0 26A428, Xcode 27.0 27A266a, arm64), expiry `2026-10-19T17:49:35Z`. Переносится тот же Apple Development signed app/test build и точные `.xctestrun`, сгенерированные из shared schemes; private signing keys в VM не передаются. Первая копия пересеклась с Xcode build output changes, rsync exit 23 сохранён; готовится свежая stable copy. Deep signature verification локального Debug build сообщает missing/invalid sealed resource в вложенном VPN helper `PrivacyConfig.framework`; CPM app tests локально при этом запускаются. Эти setup findings не считаются воспроизведением трёх reported failures. Source/production/tests assertions пока не менялись. Артефакты: `/private/tmp/cpm-pr7379-three-late-failures-20261019/`; final VM/local summaries будут добавлены после завершения. +На чистой Virfield macOS 27.0 (26A428), Xcode 27.0 (27A266a), arm64 исходный harness дал normal **5 PASS / 4 FAIL / 0 SKIP**: edited-document и over-budget install истекали на 6.5-second first-document precondition; следующие P4-detection и over-budget upgrade падали с SIGINT. Disabled дал **0 PASS / 6 FAIL / 0 SKIP**, но часть падений была precondition/host failures, поэтому этот VM run не считается успешным отрицательным контролем. Пример normal install: policy callback 16:05:46.736120Z; fixture timeout 16:05:51.770356Z; didStart 16:05:51.806345Z — fixture бросил ошибку за 36 ms до окончания корректного пятисекундного gate, включив в свой бюджет холодную подготовку окна/WebKit. Unstructured navigation tasks не отменялись и не ожидались на пути ошибки, продолжая работу во время teardown перед SIGINT в следующих методах. + +В отдельной source copy подготовлен harness-only fix: перед late-startup сценарием прогревается реальное окно через ineligible about:blank, production coordinator waiter измеряется отдельно (5-second gate, прежний 1.5-second scheduler tolerance), page completion получает отдельный 15-second fixture budget, причём startup обязан оставаться pending при release gate/редактировании. Навигации используют structured async let для cancellation/join до teardown. Production timeout, flags и recovery-код не меняются. Четыре локальных late-startup/edited regressions после исправления: **4 PASS / 0 FAIL / 0 SKIP**, strict SwiftLint **0 violations**. Финальная VM последовательность normal → disabled → normal выполняется на неизменных подписанных app/test binaries; результат будет записан после завершения. + +Virfield lease `lease-671a00b65fc4efdfc9b0df677a0ff51f`, expiry `2026-10-19T17:49:35Z`; используются Apple Development signed host build и точные generated .xctestrun, private signing keys в VM не передавались. Первая transfer попытка пересеклась с Xcode build и завершилась rsync exit 23; она сохранена и не считается test run. Следующая stable copy успешно запустила baseline VM tests. Deep signature verification локального Debug build сообщает missing/invalid sealed resource в вложенном VPN helper PrivacyConfig.framework, при этом CPM app host запускается локально и на VM. Артефакты всех попыток: `/private/tmp/cpm-pr7379-three-late-failures-20261019/`; baseline VM raw xcresults сохраняются отдельно от финального fixed run. diff --git a/work/projects/cpm-status-2026-10-15.md b/work/projects/cpm-status-2026-10-15.md index 719193cf..31dd95ce 100755 --- a/work/projects/cpm-status-2026-10-15.md +++ b/work/projects/cpm-status-2026-10-15.md @@ -1372,11 +1372,14 @@ P4 detection-only method прошёл в обоих успешных ON runs: la На чистом harness `6d04496882` (production `8275bcce36`) первый ON завершился **9 PASS**, OFF — **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**, SHA256 app/test modules совпали. Первый restored-ON (`current-app-restored.xcresult`) завершился **7 PASS / 2 FAIL / 0 SKIP**: `testBackgroundLoadFailureRecoversOriginalDocument` прошёл CPM assertions, но `TestRunHelper.swift:453` не дождался освобождения window views за 5 секунд; следующий `testInstallDuringSessionInitIsDelivered` остановился с **SIGINT**, runner перезапустил host. P2 evidence подтверждает native dashboard + page initResp после recovery для existing tab, new window и new tab; этот run всё равно считается неуспешным. В production DEBUG есть `ensureObjectDeallocated(..., .interrupt)` → `raise(SIGINT)`; связь с конкретным удерживающим reference пока не доказана, retained root cause не установлен. Функциональные ожидания и deallocation checks не отключались. Полные attachments, diagnostics, summary и логи сохранены в `/private/tmp/cpm-pr7379-error6-fix-20261019/current-app-restored-first-*`; начатый полный restored-ON retry на тех же бинарниках (`current-app-restored-retry.xcresult`) затем завершился **9 PASS / 0 FAIL / 0 SKIP**. SHA256 app/test modules совпали; source и assertions между попытками не менялись. Это не отрицательный контроль, failures не исключаются из истории. - ## Проверка отчёта о трёх падениях late-startup app tests — 19 октября 2026 -Исследуется screenshot с failed `testLateStartupIsDetectedWithRecoveryDisabledWithoutReload`, `testOverBudgetInstallRecoversFirstDocumentWithoutExtendingNavigationWait`, `testOverBudgetUpgradeRecoversFirstDocumentWithoutExtendingNavigationWait`; остальные 6 methods зелёные. В screenshot нет assertion/timeout text, поэтому причина конкретного reviewer run пока не установлена и не объявляется infrastructure failure. +Исходный screenshot: failed `testLateStartupIsDetectedWithRecoveryDisabledWithoutReload`, `testOverBudgetInstallRecoversFirstDocumentWithoutExtendingNavigationWait`, `testOverBudgetUpgradeRecoversFirstDocumentWithoutExtendingNavigationWait`; остальные 6 methods зелёные. Assertion text reviewer run не предоставлен, поэтому идентичность конкретных причин его трёх failures не утверждается. -Проверены published production `674bb809f2` и harness `d26a1c55d1`: fixture/оба shared scheme задают flags автоматически; ручной шаг включения late recovery не пропущен. Native normal test configuration: `CPM_APP_INTEGRATION=1`; disabled дополнительно задаёт оба DISABLE overrides=1 и выбирает ровно 6 recovery methods. На host macOS 26.7.1 / Xcode 27.1 отдельный прогон трёх reported methods дал **3 PASS / 0 FAIL / 0 SKIP**. Полный disabled затем дал **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**. Следующий полный normal ещё выполняется; все три reported methods уже PASS. +Проверены published production `674bb809f2` и harness `d26a1c55d1`: оба shared scheme задают flags автоматически; ручной шаг включения late recovery не пропущен. Normal задаёт `CPM_APP_INTEGRATION=1`; disabled дополнительно задаёт оба DISABLE overrides=1 и выбирает ровно 6 recovery methods. На host macOS 26.7.1 / Xcode 27.1 исходный harness дал **3 PASS / 0 FAIL / 0 SKIP** для reported methods, затем полный disabled **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**, затем normal **9 PASS / 0 FAIL / 0 SKIP**. -По запросу пользователя создан чистый Virfield `macos27` lease `lease-671a00b65fc4efdfc9b0df677a0ff51f` (macOS 27.0 26A428, Xcode 27.0 27A266a, arm64), expiry `2026-10-19T17:49:35Z`. Переносится тот же Apple Development signed app/test build и точные `.xctestrun`, сгенерированные из shared schemes; private signing keys в VM не передаются. Первая копия пересеклась с Xcode build output changes, rsync exit 23 сохранён; готовится свежая stable copy. Deep signature verification локального Debug build сообщает missing/invalid sealed resource в вложенном VPN helper `PrivacyConfig.framework`; CPM app tests локально при этом запускаются. Эти setup findings не считаются воспроизведением трёх reported failures. Source/production/tests assertions пока не менялись. Артефакты: `/private/tmp/cpm-pr7379-three-late-failures-20261019/`; final VM/local summaries будут добавлены после завершения. +На чистой Virfield macOS 27.0 (26A428), Xcode 27.0 (27A266a), arm64 исходный harness дал normal **5 PASS / 4 FAIL / 0 SKIP**: edited-document и over-budget install истекали на 6.5-second first-document precondition; следующие P4-detection и over-budget upgrade падали с SIGINT. Disabled дал **0 PASS / 6 FAIL / 0 SKIP**, но часть падений была precondition/host failures, поэтому этот VM run не считается успешным отрицательным контролем. Пример normal install: policy callback 16:05:46.736120Z; fixture timeout 16:05:51.770356Z; didStart 16:05:51.806345Z — fixture бросил ошибку за 36 ms до окончания корректного пятисекундного gate, включив в свой бюджет холодную подготовку окна/WebKit. Unstructured navigation tasks не отменялись и не ожидались на пути ошибки, продолжая работу во время teardown перед SIGINT в следующих методах. + +В отдельной source copy подготовлен harness-only fix: перед late-startup сценарием прогревается реальное окно через ineligible about:blank, production coordinator waiter измеряется отдельно (5-second gate, прежний 1.5-second scheduler tolerance), page completion получает отдельный 15-second fixture budget, причём startup обязан оставаться pending при release gate/редактировании. Навигации используют structured async let для cancellation/join до teardown. Production timeout, flags и recovery-код не меняются. Четыре локальных late-startup/edited regressions после исправления: **4 PASS / 0 FAIL / 0 SKIP**, strict SwiftLint **0 violations**. Финальная VM последовательность normal → disabled → normal выполняется на неизменных подписанных app/test binaries; результат будет записан после завершения. + +Virfield lease `lease-671a00b65fc4efdfc9b0df677a0ff51f`, expiry `2026-10-19T17:49:35Z`; используются Apple Development signed host build и точные generated .xctestrun, private signing keys в VM не передавались. Первая transfer попытка пересеклась с Xcode build и завершилась rsync exit 23; она сохранена и не считается test run. Следующая stable copy успешно запустила baseline VM tests. Deep signature verification локального Debug build сообщает missing/invalid sealed resource в вложенном VPN helper PrivacyConfig.framework, при этом CPM app host запускается локально и на VM. Артефакты всех попыток: `/private/tmp/cpm-pr7379-three-late-failures-20261019/`; baseline VM raw xcresults сохраняются отдельно от финального fixed run. diff --git a/work/projects/cpm-web-extension-code-guide-2026-10-09.md b/work/projects/cpm-web-extension-code-guide-2026-10-09.md index d0744d24..8d832353 100755 --- a/work/projects/cpm-web-extension-code-guide-2026-10-09.md +++ b/work/projects/cpm-web-extension-code-guide-2026-10-09.md @@ -634,11 +634,14 @@ P4 detection-only method прошёл в обоих успешных ON runs: la На чистом harness `6d04496882` (production `8275bcce36`) первый ON завершился **9 PASS**, OFF — **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**, SHA256 app/test modules совпали. Первый restored-ON (`current-app-restored.xcresult`) завершился **7 PASS / 2 FAIL / 0 SKIP**: `testBackgroundLoadFailureRecoversOriginalDocument` прошёл CPM assertions, но `TestRunHelper.swift:453` не дождался освобождения window views за 5 секунд; следующий `testInstallDuringSessionInitIsDelivered` остановился с **SIGINT**, runner перезапустил host. P2 evidence подтверждает native dashboard + page initResp после recovery для existing tab, new window и new tab; этот run всё равно считается неуспешным. В production DEBUG есть `ensureObjectDeallocated(..., .interrupt)` → `raise(SIGINT)`; связь с конкретным удерживающим reference пока не доказана, retained root cause не установлен. Функциональные ожидания и deallocation checks не отключались. Полные attachments, diagnostics, summary и логи сохранены в `/private/tmp/cpm-pr7379-error6-fix-20261019/current-app-restored-first-*`; начатый полный restored-ON retry на тех же бинарниках (`current-app-restored-retry.xcresult`) затем завершился **9 PASS / 0 FAIL / 0 SKIP**. SHA256 app/test modules совпали; source и assertions между попытками не менялись. Это не отрицательный контроль, failures не исключаются из истории. - ## Проверка отчёта о трёх падениях late-startup app tests — 19 октября 2026 -Исследуется screenshot с failed `testLateStartupIsDetectedWithRecoveryDisabledWithoutReload`, `testOverBudgetInstallRecoversFirstDocumentWithoutExtendingNavigationWait`, `testOverBudgetUpgradeRecoversFirstDocumentWithoutExtendingNavigationWait`; остальные 6 methods зелёные. В screenshot нет assertion/timeout text, поэтому причина конкретного reviewer run пока не установлена и не объявляется infrastructure failure. +Исходный screenshot: failed `testLateStartupIsDetectedWithRecoveryDisabledWithoutReload`, `testOverBudgetInstallRecoversFirstDocumentWithoutExtendingNavigationWait`, `testOverBudgetUpgradeRecoversFirstDocumentWithoutExtendingNavigationWait`; остальные 6 methods зелёные. Assertion text reviewer run не предоставлен, поэтому идентичность конкретных причин его трёх failures не утверждается. -Проверены published production `674bb809f2` и harness `d26a1c55d1`: fixture/оба shared scheme задают flags автоматически; ручной шаг включения late recovery не пропущен. Native normal test configuration: `CPM_APP_INTEGRATION=1`; disabled дополнительно задаёт оба DISABLE overrides=1 и выбирает ровно 6 recovery methods. На host macOS 26.7.1 / Xcode 27.1 отдельный прогон трёх reported methods дал **3 PASS / 0 FAIL / 0 SKIP**. Полный disabled затем дал **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**. Следующий полный normal ещё выполняется; все три reported methods уже PASS. +Проверены published production `674bb809f2` и harness `d26a1c55d1`: оба shared scheme задают flags автоматически; ручной шаг включения late recovery не пропущен. Normal задаёт `CPM_APP_INTEGRATION=1`; disabled дополнительно задаёт оба DISABLE overrides=1 и выбирает ровно 6 recovery methods. На host macOS 26.7.1 / Xcode 27.1 исходный harness дал **3 PASS / 0 FAIL / 0 SKIP** для reported methods, затем полный disabled **0 PASS / 6 ожидаемых functional FAIL / 0 SKIP**, затем normal **9 PASS / 0 FAIL / 0 SKIP**. -По запросу пользователя создан чистый Virfield `macos27` lease `lease-671a00b65fc4efdfc9b0df677a0ff51f` (macOS 27.0 26A428, Xcode 27.0 27A266a, arm64), expiry `2026-10-19T17:49:35Z`. Переносится тот же Apple Development signed app/test build и точные `.xctestrun`, сгенерированные из shared schemes; private signing keys в VM не передаются. Первая копия пересеклась с Xcode build output changes, rsync exit 23 сохранён; готовится свежая stable copy. Deep signature verification локального Debug build сообщает missing/invalid sealed resource в вложенном VPN helper `PrivacyConfig.framework`; CPM app tests локально при этом запускаются. Эти setup findings не считаются воспроизведением трёх reported failures. Source/production/tests assertions пока не менялись. Артефакты: `/private/tmp/cpm-pr7379-three-late-failures-20261019/`; final VM/local summaries будут добавлены после завершения. +На чистой Virfield macOS 27.0 (26A428), Xcode 27.0 (27A266a), arm64 исходный harness дал normal **5 PASS / 4 FAIL / 0 SKIP**: edited-document и over-budget install истекали на 6.5-second first-document precondition; следующие P4-detection и over-budget upgrade падали с SIGINT. Disabled дал **0 PASS / 6 FAIL / 0 SKIP**, но часть падений была precondition/host failures, поэтому этот VM run не считается успешным отрицательным контролем. Пример normal install: policy callback 16:05:46.736120Z; fixture timeout 16:05:51.770356Z; didStart 16:05:51.806345Z — fixture бросил ошибку за 36 ms до окончания корректного пятисекундного gate, включив в свой бюджет холодную подготовку окна/WebKit. Unstructured navigation tasks не отменялись и не ожидались на пути ошибки, продолжая работу во время teardown перед SIGINT в следующих методах. + +В отдельной source copy подготовлен harness-only fix: перед late-startup сценарием прогревается реальное окно через ineligible about:blank, production coordinator waiter измеряется отдельно (5-second gate, прежний 1.5-second scheduler tolerance), page completion получает отдельный 15-second fixture budget, причём startup обязан оставаться pending при release gate/редактировании. Навигации используют structured async let для cancellation/join до teardown. Production timeout, flags и recovery-код не меняются. Четыре локальных late-startup/edited regressions после исправления: **4 PASS / 0 FAIL / 0 SKIP**, strict SwiftLint **0 violations**. Финальная VM последовательность normal → disabled → normal выполняется на неизменных подписанных app/test binaries; результат будет записан после завершения. + +Virfield lease `lease-671a00b65fc4efdfc9b0df677a0ff51f`, expiry `2026-10-19T17:49:35Z`; используются Apple Development signed host build и точные generated .xctestrun, private signing keys в VM не передавались. Первая transfer попытка пересеклась с Xcode build и завершилась rsync exit 23; она сохранена и не считается test run. Следующая stable copy успешно запустила baseline VM tests. Deep signature verification локального Debug build сообщает missing/invalid sealed resource в вложенном VPN helper PrivacyConfig.framework, при этом CPM app host запускается локально и на VM. Артефакты всех попыток: `/private/tmp/cpm-pr7379-three-late-failures-20261019/`; baseline VM raw xcresults сохраняются отдельно от финального fixed run.