From 34a26a27d83161fbb8cdecb22c550e79f3067b4c Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Wed, 14 Oct 2026 22:51:57 +0600 Subject: [PATCH] [2026-10-14] eagle: personal/projects/balda/balda.md personal/projects/balda/setup.md personal/projects/virfield.md --- personal/projects/balda/balda.md | 2 +- personal/projects/balda/setup.md | 19 +++++++++++++++-- personal/projects/virfield.md | 35 ++++++++++++++++++++++++-------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/personal/projects/balda/balda.md b/personal/projects/balda/balda.md index 7a1bb477..2c32ab63 100755 --- a/personal/projects/balda/balda.md +++ b/personal/projects/balda/balda.md @@ -1,6 +1,6 @@ # Balda — актуальный обзор -Проверено: **2026-10-14**. Balda принимает задачи из чата и связывает provider execution, сессии и интеграции. Текущий локальный запуск — **Mac, Mattermost, Codex ACP**, контейнер `balda-mm-mac`. +Проверено: **2026-10-14**. Balda принимает задачи из чата и связывает provider execution, сессии и интеграции. Текущий локальный запуск — **два инстанса на Mac, Mattermost, Codex ACP**: `balda-mm-mac` и `balda-mm-eagle`. Оба работают на upstream `2eed2ce8`; Eagle имеет те же основные MCP и дополнительный Asana readonly. Точные версии и проверенные границы продолжений — в карточке запуска. ## Источники текущего состояния diff --git a/personal/projects/balda/setup.md b/personal/projects/balda/setup.md index 68d82b28..f82e3945 100755 --- a/personal/projects/balda/setup.md +++ b/personal/projects/balda/setup.md @@ -1,6 +1,6 @@ # Balda — актуальный локальный запуск -Проверено: **2026-10-14** по работающему контейнеру, Compose и конфигурации. +Проверено: **2026-10-14** по обоим работающим контейнерам, Compose, конфигурации и реальным MCP-вызовам. Обзор: [[personal/projects/balda/balda|Balda]]. Broker, готовность кандидата и оставшаяся работа: [[personal/projects/balda/execution-broker|Execution Broker — текущий локальный контур]]. @@ -11,7 +11,8 @@ | Хост / контейнер | Mac / `balda-mm-mac` | | Канал | Mattermost | | Provider | `codex`, type `codex_acp`, reasoning effort `medium` | -| Образ | `balda-balda`, image ID `sha256:56c00100258b1a478484ef20e044981ed0a569ec0ae7d6ba8608e8878a9e1f95` | +| Образ обоих инстансов | `balda-balda:upstream-2eed2ce8`, image ID `sha256:32f76bce909d7688f54cabc194b31ae85718bc958639671ce6147402b650d37d` | +| Balda source | `2eed2ce880591ccc2b9dbe15c1ac3ade7874cf8f`; Linux ARM64 binary SHA256 `f9a420e1bad17bc37f2087736f7530f40cddb6e50db9bccc51764be9bdb5ecc1` | | Compose | `/Users/admin/Docker/balda-mm-mac/docker-compose.yml` | | Активный конфиг | `/Users/admin/Docker/balda-mm-mac/config/config.yaml` | | State / plugins | `/Users/admin/Docker/balda-mm-mac/state` | @@ -20,6 +21,20 @@ Config bind-mounted в `/workspace/.config/balda` read-only для контейнера; state и work доступны ему на запись. Файл `~/Developer/balda/.config/balda/config.yaml` относится к отдельному dev checkout и не управляет этим контейнером. +## Eagle и общие инструменты + +Eagle работает на том же Mac в `balda-mm-eagle`; Compose, config, state и work находятся в `/Users/admin/Docker/balda-mm-eagle/`, service — `eagle`, отдельный home volume — `balda_eagle-home`. Образы обоих инстансов одинаковы. Авторизации Codex раздельные; при обновлении они сохранены. + +У обоих включены одинаковые Obsidian, Execution Broker и Prism MCP, одинаковые права runtime и managed plugin `execution-broker` rc.26. Проверены реальные initialize/tools-list: Obsidian — 15, Broker — 21, Prism — 5 инструментов; списки совпадают. Eagle дополнительно имеет `asana-readonly`, URL `http://asana-readonly:3100/mcp` в приватной Docker-сети. Отдельный контейнер `balda-eagle-asana-readonly` не публикует порт на хост. Реальное чтение Asana прошло; все пять операций изменения и запись заметок в файл отклоняются сервером. + +В обоих конфигурациях provider `codex_acp`, reasoning `medium`, явный model отсутствует. Последние записи Codex подтверждают `gpt-6.1-sol` у обоих. При выравнивании инструментов настройки основной модели не менялись. `balda.nats.max_store` у обоих — `16gb`. + +## Продолжение задач + +В этой версии generic webhooks выполняют изолированные задания. Они не продолжают исходную сессию. Старые `routes.*.path`, `envelope.target`, `key_from_body`, `mode` и `fallback_to` удалены из конфигурации; listener задаётся через `balda.http`. Сейчас он слушает loopback `127.0.0.1:8095`. + +Штатный механизм возврата в исходную сессию — `balda.session.wait`. Миграция Broker observer на него ещё проходит отдельную приёмку; старый callback на `:8090` не работает. Наличие MCP или обновлённого плагина не доказывает автоматическую доставку будущего результата. Состояние Broker и недоставленные cursors сохраняются. + ## Изменения и перезапуск | Изменение | Действие | diff --git a/personal/projects/virfield.md b/personal/projects/virfield.md index a11d80a1..d7aa2370 100755 --- a/personal/projects/virfield.md +++ b/personal/projects/virfield.md @@ -12,7 +12,7 @@ tags: --- # Virfield — текущее состояние -Актуально на 2026-10-14. Поддерживаемый checkout: `/Users/admin/Developer/virfield`. Ветка `codex/retire-lume-release-hardening` опубликована по разрешению пользователя, current source `8a297748eac5035fa0f0453aa51e11e9cb77d4e4`; `main` ещё не обновлён. Установлен `aee89c1`: node resource/cache quotas и source-prefetch. Новый source также содержит HTPC `vms.storage_dir`, строгий Tart clone routing и отказ от неполных inventory snapshots при отмене проверки. Установка последнего кандидата ждёт освобождения чужой lease по решению пользователя. GitHub CI пока отложен пользователем; проверки выполняются локально. Старый worktree `virfield-v3` и ветка `codex/virfield-v3-stage1` не являются инструкцией для продолжения работы. +Актуально на 2026-10-14. Поддерживаемый checkout: `/Users/admin/Developer/virfield`. Ветка `codex/retire-lume-release-hardening` опубликована по разрешению пользователя, current source `624bdfa7a88738809729e6889c679eaf0241eb78`; `main` ещё не обновлён. Установлен `aee89c1`: node resource/cache quotas и source-prefetch. Новый source также содержит HTPC `vms.storage_dir`, строгий Tart clone routing, отказ от неполных inventory snapshots при отмене проверки, native GUI/SSH keychain readiness, постоянный 1920×1080 Tart desktop, SSH banner budget 45 s и macOS 27 ASIF Recovery keep. Установка последнего кандидата ждёт освобождения чужой lease по решению пользователя. GitHub CI пока отложен пользователем; проверки выполняются локально. Старый worktree `virfield-v3` и ветка `codex/virfield-v3-stage1` не являются инструкцией для продолжения работы. ## Runtime и deployment @@ -57,16 +57,23 @@ Offline restore `backup-5cdef526c555f6a53ed5f565c6e2edaf` в отдельный Node VM quotas реализованы и установлены в `aee89c1`: CPU/RAM/full disk reservations, pending image builds, cache cap, qcow2/storage probes и post-wake clone/start/commit checks. Live probe корректно отказал в 100 GiB VM на home NVMe с 99 GiB free и reserve 20 GiB. `d2daf4e` добавляет private storage root для HDD (2.7 TiB free); новые пустые owner-only directories подготовлены, deployment config ещё не переключён. Новый live node suite ещё нужен; права существующих HTPC goldens не менялись без отдельного разрешения. Read-only namei подтвердил 0444 у двух старых secured qcow2/OpenCore файлов и traversable directories; migration к 0400 остаётся permission/release gate. Будущий v3 capability API, grants, node-agent, Access/noVNC, VS Code extension и расширенный fleet/hardening остаются roadmap. Опубликованный v2.0.0 — исторический Lume-релиз 2026-09-30. -## Блокеры: DDG macOS UI tests на macos27 (2026-10-14) +## DDG macOS UI tests: проверенные проблемы и исправления (2026-10-14) -Сессия Claude Code (worktree `apple-browsers.git/fix-macos-ui-test-failures`) держит `lease-6fde5d2f33c234f2e885583fb6a8fd34` (`macos27`, TTL до 2026-10-15 13:20 UTC) для воспроизведения UI-тестов — это и есть «чужая» аренда из раздела выше. Найденные блокеры: +Сессия Claude Code (`apple-browsers.git/fix-macos-ui-test-failures`) держит `lease-6fde5d2f33c234f2e885583fb6a8fd34` (`macos27`, TTL до 2026-10-15 13:20 UTC). Установленный daemon `aee89c1` и эта рабочая VM ещё не обновлялись: пользователь выбрал дождаться освобождения lease. Исправления опубликованы в source `624bdfa7a88738809729e6889c679eaf0241eb78`. -- **`vm_tunnel` (ssh и desktop) → `backend_unavailable` «tart state is unavailable or stale»** сразу после того, как lease стал `ready` (job `prepare` succeeded 13:21). Позже API показал `needs_attention`/`vm_drift`, хотя VM работает и SSH по прямому IP отвечает. -- **SSH сразу после boot:** первые подключения дают «Connection timed out during banner exchange» при живом ping/порте 22; нужен `ConnectTimeout` ≥ 40. -- **Нет общего каталога (VMShare) в Tart lease:** worktree и DerivedData копируются rsync по тому же абсолютному пути (`/Users/admin/...`, гостевой пользователь тоже `admin`), чтобы pre-actions схемы работали без правок. -- **Схема `macOS UI Tests CI` не собирает приложение** (CI скачивает notarized Review app): нужно отдельно собрать `macOS Browser Review` и `macOS tests-server` в ту же DerivedData. -- **Keychain в golden:** login keychain заблокирован в GUI-сессии → `DuckDuckGo Review` падает в `Database.init()` (fatalError при регистрации value transformers — ключ шифрования из keychain). CI-аналог (`fastlane create_keychain_ui_tests`: DefaultKeychain/`default`, default + unlock) через SSH не помогает: разблокировка действует только в audit session SSH, а в GUI SecurityAgent показывает модальный запрос пароля и блокирует запуск. `launchctl asuser` → «Operation not permitted»; `osascript … Terminal do script` → AppleEvent timeout из-за модального окна. Разблокировка через `open /tmp/unlock-kc.command` (GUI-сессия) недостаточна: каждое SSH-подключение — новая audit session, и `xcodebuild`, запущенный по SSH, видит keychain заблокированным. Рабочий вариант: `security unlock-keychain` в том же скрипте/сессии, что запускает `xcodebuild` (как CI-раннер). Побочный эффект: брошенный модальный запрос SecurityAgent остаётся на экране (SIGTERM игнорирует, нужен `kill -9`) и перекрывает окно браузера — тесты падают с «Not hittable» (так испорчен первый прогон). Предложение: рецепт `uitest-27-v1` должен готовить default keychain без пароля/разблокированный для любых сессий, либо Virfield должен давать способ выполнять команды в GUI-сессии. -- **Разрешение дисплея гостя 1024×768 pt (2048×1536 px)**, CI выставляет 1920×1080 (`screenresolution set 1920x1080x32@60`). В низком окне Settings пункт сайдбара General обрезан снизу, клик промахивается → `DownloadsUITests` (и все тесты, настраивающие General через `disableWarnBeforeQuitting`) падают только в VM. В госте нет `screenresolution`/`displayplacer`. Режимы виртуального дисплея заканчиваются на 2048×1536 (4:3), 1920×1080 недоступен; обход: свой Swift-скрипт (`CGBeginDisplayConfiguration` + `CGConfigureDisplayWithDisplayMode` + `CGCompleteDisplayConfiguration(.permanently)`) ставит 1920×1440 1x — `CGDisplaySetDisplayMode` без транзакции действует только на процесс и не сохраняется. Предложение: задавать размер дисплея в шаблоне/lease (Tart `--display`) не меньше 1920×1080 (лучше 16:9) для uitest-профиля, либо ставить такой режим в рецепте `uitest-27-v1`.- Хост собирает Xcode 27.1, в госте Xcode 27.0 — `test-without-building` работает, несовместимостей не обнаружено. +- **Locked keychain — исправлен и live-проверен в source.** DDG CI вызывает `create_keychain_ui_tests` в `macOS/fastlane/Fastfile`: DefaultKeychain/`default`, default + unlock, timeout 54000, без lock on sleep. DDG EncryptionKeyStore хранит encryption key через native generic-password SecItemAdd с WhenUnlocked. GUI и каждое SSH-подключение имеют отдельную Security audit session, поэтому разблокировка только одного контекста недостаточна. Кандидат готовит private per-image/lease default keychain через Aqua LaunchAgent и разблокирует его непосредственно перед каждой исходной SSH-командой через VM-only ForceCommand. Native запись/чтение/сравнение данных/удаление проверяются в обоих контекстах, после reboot — с новым boot UUID и nonce. Публичный/пустой пароль не используется. +- **Старый login keychain и ScopedBookmarkAgent — тоже закрыты.** Одной смены default keychain оказалось мало: OS service продолжает обращаться к login и оставляет модальный password dialog над браузером. Новый preparer сохраняет его items, меняет пароль на текущий private VM password, проверяет native доступ после lock/unlock новым паролем и сохраняет login в search list. Старый image password не остаётся в worker identity. Ручное убийство SecurityAgent не является частью нового readiness. +- **Дисплей — исправлен в source.** Старый установленный golden отдаёт 1024×768 pt / 2048×1536 px и список преимущественно 4:3 режимов; workaround владельца на нём — 1920×1440 1x. Новые Tart recipes/clones задают 1920×1080 logical и запрещают refit окна. Host-side hint сам по себе недостаточен: Aqua agent выбирает native режим через CGBeginDisplayConfiguration → CGConfigureDisplayWithDisplayMode → CGCompleteDisplayConfiguration(permanently). Временный CGDisplaySetDisplayMode откатывается при выходе процесса. Новые isolated factory и worker подтвердили actual GUI frame 1920×1080 после reboot. +- **SSH banner после boot — исправлен в source:** 45 секунд в daemon handshake и generated CLI config; timeout до выполнения команд классифицируется как retryable connection failure. Host pin/auth failures не повторяются. Regression test прошёл. +- **macOS 27 factory / ASIF — дополнительно найден и исправлен:** отсутствие recovery_partition выбирало Packer default deletion, оставляя открытый/заблокированный ASIF file и вызывая Virtualization.framework startup failure. Все macOS 27 recipes теперь явно keep Recovery. Полный новый source resolve → Packer build → qualify/reboot → stop прошёл. +- **vm_tunnel backend_unavailable / vm_drift — installation gate остаётся.** Прямой SSH рабочей lease отвечает, API считает её needs_attention. Canceled inventory regression исправлен в source и проверен тестами; это не доказывает единственную причину drift этой конкретной чужой lease. Повтор live tunnel acceptance нужен после безопасной установки. +- **VMShare отсутствует по текущему контракту:** checkout и DerivedData копируются pinned SSH/SCP/rsync с сохранением путей, нужных pre-actions. Общий host каталог автоматически не монтируется. +- **macOS UI Tests CI ожидает prebuilt products.** CI скачивает notarized Review app; для локального запуска нужны отдельно собранные macOS Browser Review и macOS tests-server. Сам VM manager не угадывает build scheme. +- **Xcode 27.1 products → guest Xcode 27.0:** два реальных запуска DownloadsUITests.testDownloadFinishesThenPopupIsShown прошли (1 test / 0 failures каждый), включая browser startup и Settings/General clicks. Второй запуск выполнен после source guest agent/reboot без ручного unlock. Это single-test smoke, а не приёмка всей UI-suite или всех minor version сочетаний. + +Дополнительная приёмка: Ventura native GUI key I/O/reboot; macOS 27 native GUI и SSH key I/O/reboot; source macOS 27 factory; два source Prepare-клона нового factory golden с SSH identity isolation, login rekey и real worker reboot — PASS. SCP upload/download с SSH bridge — PASS. Все четыре isolated VM этой проверки подтверждённо удалены; две неудачные old-daemon factory записи удалены через exact-name journaled recovery после проверки отсутствия процессов/VM. Production goldens и чужие leases не менялись. + +Private evidence: `/private/tmp/virfield-keychain-macos27-standalone-20261014`, factory image `image-3ded21740aa5ee237b85aac1fc8bbe52`, source recipe SHA-256 `38a47b46c05c906e3b104d7c6a9d83479047213deaf3002b93f2e2af6debd6ae`. Exported DDG xcresult archive `ddg-final-xcresult.zip`, SHA-256 `cfe8100c567effaed5271f8b32f819b372ea2a22f65c7794e2013a0351555b76`. Local make check (docs, Python, vet, full race), Staticcheck и Gitleaks прошли. GitHub CI не использовался как acceptance. ## Каноническая документация @@ -101,3 +108,13 @@ Node VM quotas реализованы и установлены в `aee89c1`: CP После явного ответа пользователя «Разрешаю recovery и удаление указанной VM» повторно проверен остановленный prepare job, затем выполнен штатный exact-target CLI `resolve`. Cleanup `job-1fe239f3064566b2a4b3f75ebce13813` завершился `succeeded` в 16:29:45 UTC. Предыдущий approval blocker снят; освобождена только собственная аренда Monterey. Работающая macOS 27 VM `vf-6fde5d2f33c234f2e885583fb6a8fd34` не менялась. Чтобы избежать cross-container clone, запущен новый `image_create` непосредственно в `release-check`: template/VM `ipad-editors-monterey-xcode-1341-20261014`, image `image-f8c888fcafbd1a2df2a3b9a02821685d`, job `job-076452fa609adc3e6d4093a8e047a693`. Exact profile: macOS 12.7.6/21H1320, Xcode 13.4.1/13F100, SIP enabled, тот же approved digest-pinned Tart upstream. Образ пока строится; это не подтверждение готовности worker или успешной сборки приложения. + +### Cross-container admission fix: source versus installed (2026-10-14) + +Monterey rejection выше относится к установленному `aee89c1`. В опубликованном source `624bdfa` проверка `Controller.cloneLocationCandidates` возвращает `invalid_request` при explicit wrong container для local Tart golden ДО reservation/job; `TestLocalTartGoldenRejectsWrongStorageBeforeReservation` проверяет отсутствие записанной lease. Без явного destination несовместимые default/fallback locations также отфильтровываются. Это уже исправлено в source, установка ещё ждёт освобождения рабочей macOS 27 lease. Cross-container golden copy не реализован; новый image в нужном container — допустимый отдельный workflow. Чужая iPad-сессия и её journal не менялись этой проверкой. + +### Новый clean candidate: keychain/UI readiness (2026-10-14 16:49 UTC) + +Published source `624bdfa7a88738809729e6889c679eaf0241eb78`, branch `codex/retire-lume-release-hardening`; clean worktree и remote branch совпадают. Актуальный package `/private/tmp/virfield-release-keychain-624bdfa-20261014/virfield-v0.0.0-keychain-candidate-darwin-arm64.tar.gz`, SHA-256 `be29654ef02f4ab6cd747b1815c2a72532717aaf2d423a2a4d8a93e4013634bb`. Проверены extraction, все manifest binary hashes, native browser signature и deployment config-check. Idle-only installer `/private/tmp/virfield-install-624bdfa.py` подготовлен, не запускался; прежний installer/archive `8a29774` — исторический срез. Установлен по-прежнему `aee89c1`. На 16:49 UTC рабочая macOS 27 VM всё ещё running, её lease needs_attention; также работает отдельный image build `job-076452fa609adc3e6d4093a8e047a693` чужой iPad-сессии. Установка требует idle pool и ждёт выбранного пользователем освобождения рабочей lease. Полный GHCR roundtrip/node acceptance/live restore остаются release gates. + +Fresh stdio MCP из clean package `624bdfa` также прошёл initialize/discovery (18 tools), актуальный embedded runbook, read-only status и проверку новых native GUI/SSH keychain + 1920×1080 descriptions. Во время smoke VM/lease mutations не выполнялись.