Files
obsidian-vault/personal/projects/virfield.md
T

90 lines
27 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Virfield
Проверено: **2026-10-16** (практика UI-тестов — 2026-10-17, см. раздел ниже). Последний опубликованный stable Latest и установленная версия — [v2.1.1](https://github.com/mallexxx/virfield/releases/tag/v2.1.1), source `2c64888abed617722e79d618dd4911efa0c4b126`. Релиз опубликован после явного подтверждения владельца. Архив macOS ARM64 и SHA256SUMS скачаны с публичных URLs без авторизации; содержимое побайтно совпадает с проверенным установленным пакетом. Предыдущая публикация: [[personal/projects/virfield-release-v2.1.0]].
На 2026-10-16 local/GitHub `main` был **`2c64888abed617722e79d618dd4911efa0c4b126`**; актуальный локальный `main` и состояние production указаны в разделе «Текущая работа 2026-10-23» ниже. Изменение исправляет обработку ошибки `launchctl bootstrap` уже зарегистрированного собственного guest Keychain agent: recovery разрешён только после проверки точного launchd job, затем остаются все прежние native readiness gates. Добавлены закрытый bootstrap diagnostic и regression с настоящим shell-блоком; контрфактический тест на старом коде воспроизвёл отказ. Make check/race, Staticcheck, module verify, Govulncheck и make check из распакованного точного кандидата прошли.
## Установленная версия и проверка обновления
Установлен опубликованный **v2.1.1**, source `2c64888`. Перед публикацией этот же пакет прошёл проверку как кандидат; повторная установка не требовалась. Tag `v2.1.1` указывает на проверенный commit. v2.1.0 сохранён для отката в `~/.virfield-v2/upgrades/20261016-v2.1.1-before`. Пакет собран из чистого committed source; установленная копия подписана прежней локальной identity без изменения исходного release archive. Сохранены system LaunchDaemon, Full Disk Access и девять исходных образов.
Stock v2.1.0 дважды не завершил fresh macOS lease preparation: `guest_keychain_failed`, в закрытой диагностике `launchctl bootstrap` exit5. Оба leases released. Это не потерянный source fix: встроенный keychain.sh в прежнем принятом binary и v2.1.0 совпадает побайтно; используется тот же golden `image-f11d9a1ee2991eada08c4f734c33df6d`.
Свежая VM кандидата `lease-52e620c674d514dd8c9c49880e8980f6` прошла native GUI/Keychain add-read-compare-delete, unlocked console без dialogs, 1920×1080 и отдельный pinned caller SSH. VM released, cleanup job succeeded. В этом успешном запуске bootstrap recovery branch не сработал; его прохождение подтверждено regression, а не выдано за наблюдённое на VM. Полный Broker → macOS XCTest post-upgrade run `run-3b679ccc08ae5aafb94643d60f0410dd` завершился успешно: XCTest 1/1, настоящий xcresult, заново скачанные SHA256-проверенные артефакты, Story closed, cleanup=done и lease released. Это scripts-only проверка без provider credentials и сообщений.
Доказательства: `state/main-production-sync-20261016/virfield-candidate-upgrade.json`, `virfield-fix-source-checks.json`, `virfield-exact-candidate-check.log`, `macos-fix-validation/verification.json`, `macos-readiness-diagnostic/finding.json`.
GitHub CI точного `2c64888` [успешен на macOS и Linux](https://github.com/mallexxx/virfield/actions/runs/38899141941): make check/race/build, Staticcheck, module verify, Govulncheck и Linux gitleaks. Свежий установленный MCP сообщает `2.1.1`, 20 tools/4 resources; authenticated status подтверждает девять прежних images и ноль active workers/jobs. Существующие MCP processes других чатов принудительно не переподключались. Receipts: `macos-candidate-production-verification.json`, `virfield-installed-mcp-2.1.1.json`, `virfield-fix-github-ci.json`.
Опубликованный пакет `virfield-v2.1.1-darwin-arm64.tar.gz`: SHA256 `dbafeea705241286622e773c4576baa3a623cbc143398aa7bbdddac63cb782fd`. Release ID `415082470`, published `2026-10-16T14:59:56Z`, stable Latest, draft=false/prerelease=false. Manifest и все binary hashes проверены. Приватные доказательства: `state/main-production-sync-20261016/virfield-v2.1.1-publication-verification.json`, `upstream-heads-after-publication.json`, `post-publication-runtime-verification.json`. Источник, tag, публичный пакет и production согласованы.
## Историческая принятая версия
Исходная приёмка VM/MCP/Broker выполнена на `0.0.0-acceptance-runbooks`, source `8bfff9f59cab918877d060437a1ad190905a5040`, schema10. Следующие результаты относятся к тому датированному контуру; они не заменяют проверку нового релиза.
Пройдены Tart/native GUI и отдельный SSH, реальные перезагрузки, ключевая изоляция, Xcode/Swift, экспорт артефактов, SSH/desktop и подтверждённый release/revocation. HTPC Sonoma/Sequoia прошли полные циклы. Проверены factory/private GHCR roundtrip, sparse golden transfer, revalidation существующей VM, durable diagnostics, admission/wait/resume и однобайтовая граница node image cache. Legacy iOS профиль прошёл свежую factory/worker квалификацию с armv7 compile/link.
Текущий владелец MCP принят: 20 инструментов, четыре точные темы/ресурса, полный рабочий цикл. Полный off-host disk/config/NVRAM DR и signed package rollback/forward приняты; собственные fixture-копии очищены. Огромный speech-dispatcher.log и его резервная копия удалены после исправления конфигурации, финальный soak прошёл.
Production Codex Story `run-12f093299e237f03a7bb9b70327efcc5` принят независимой проверкой: фактический reviewer `os.open` получил EPERM/errno 1 и exit 0; четыре теста, два новых файла, hashes и отсутствие probe подтверждены. Worker штатно released, credential больше никем не удерживается, Prism завершён. Предыдущие неудачные запуски не считаются доказательством этого результата.
Точный receipt с hashes и границами: [[personal/projects/archive/virfield-release-cleanup-2026-10-16/docs/acceptance/2026-10-16]]. Исходный подробный журнал: [[personal/projects/archive/virfield-release-cleanup-2026-10-16/docs/VERIFICATION]]. Прежняя проектная заметка сохранена целиком: [[personal/projects/archive/virfield-release-cleanup-2026-10-16/project-note-before-cleanup]].
## Релизная очистка
Сохранены 31 исходник документации, JSON/patch и прежняя проектная заметка; содержимое каждого проверено обратным чтением. [[personal/projects/archive/virfield-release-cleanup-2026-10-16/index|Индекс архива]]. В репозитории удалены планы, приёмочные receipts, исторические копии, неиспользуемые Broker patches и старый Lume reference.
README и шесть руководств содержат команды, требования и ограничения без истории прогонов и личных deployment-примеров. Убрана персональная signing identity; fixture-узлы, IP и MAC заменены синтетическими данными. Гостевой admin/home, канонический Go module/repository URL, upstream pins и legal notices сохранены как контракты проекта. MCP сохраняет 20 инструментов и четыре прежние темы; `verification` теперь отдаёт инструкции проверки окружения из ENVIRONMENT.md.
Применён anti-slop editing: https://github.com/elithrar/dotfiles/blob/main/.agents/skills/anti-slop/SKILL.md. Прочитаны SKILL.md и references/tells.md; убраны повторения, служебные рассказы о ходе работы и канцелярит, команды и технические ограничения сохранены.
Проверки нашли и исправили две ошибки: Darwin-only statfs попадал в Linux build; дерево лицензий THIRD_PARTY_NOTICES с versioned Go source мешало go vet/list после распаковки. Statfs и реальные mount-тесты разделены по платформам, Linux отказывает local Tart; notices перемещены в _THIRD_PARTY_NOTICES, который Go пропускает. Регрессионный тест воспроизводит старую ошибку и проходит с исправлением. Его фиксированный tar-fixture работает и на Python 3.11; production packaging требует Python 3.12+.
macOS make check/build/Staticcheck прошли; настоящий read-only volume probe двух смонтированных хранилищ прошёл с одним diskutil lookup на серию из 20 capacity refresh. Linux amd64 commands и тесты скомпилированы; полный Linux arm64 CI на Go 1.26.9 прошёл в отдельном локальном Colima-контейнере: make check (race), make build, Staticcheck, module verify и Govulncheck. Финальный архив распакован в чистый каталог; make check, checksum/manifest/binary hashes, подпись native browser и настоящий packaged stdio MCP (20 tools, 4 точные темы/ресурса) прошли. Gitleaks: 253 commits, 0 секретов; Govulncheck: 0 достижимых/импортированных уязвимостей, один неиспользуемый module-only advisory. Собственные Linux-контейнер и cache volume удалены.
Архив: `/private/tmp/virfield-release-clean-package-final/virfield-v0.0.0-release-cleanup-darwin-arm64.tar.gz`, SHA-256 `5522529bfd16246e7ba034dd6055c9d6ef89b00b5f290ff3ff9f64be6a32a204`. Это локальный проверенный пакет; отдельный GitHub Release/tag не создавался. [[personal/projects/virfield-release-cleanup-2026-10-16|Итоговый протокол релизной очистки]].
## Практика: UI-тесты DDG на двух VM (2026-10-17)
Использовали MCP клиент Claude Code, шаблоны `macos27` (macOS 27.0, Xcode 27.0, golden `uitest-27-v1`) и `monterey-xcode-13.4.1` (macOS 12.7.6, Xcode 13.4.1, `developer-v1`). Сборка и подпись на хосте, исполнение по pinned SSH. Подробности про macOS 12 — [[personal/tech/legacy-xctest-runner]].
Вопросы и проблемы:
- **CLI `virfield` на машине клиента нет** (`~/Library/Application Support/Virfield/bin` отсутствует), поэтому `keygen`/`ssh-config` из руководства не выполнить. Ключ создан `ssh-keygen -t ed25519`, pinned `config` и `known_hosts` написаны вручную из `vm_lease`: `ssh.host_key`, `ip`, user `admin`; `StrictHostKeyChecking yes`. Работает, потому что IP Tart VM (192.168.64.x) доступен с хоста напрямую. Удобно, если бы MCP/доки описывали этот путь без CLI.
- **`ssh_key_in_use`**: один публичный ключ на один активный lease. Для второй VM нужен второй ключ.
- **`resource_exhausted` по диску**: хранилище `samsung-tart` ≈214 ГБ, macOS 27 резервирует 140 ГБ, Monterey 120 ГБ, safety reserve 20 ГБ → вместе не помещаются (headroom −87 ГБ). Пришлось сначала освободить macOS 27 (с разрешения владельца) и только потом брать Monterey. Шаблон на другом хранилище (`release-check`) есть, но выбирать его самостоятельно клиент не стал.
- **`virfield_status` ≈112 тыс. символов** — превышает лимит ответа, сохраняется в файл. Разбирать `jq`: `.capacity`, `.leases`, `.template_availability`. В `.templates[]` нет полей `xcode`/`macos` версии; версии и `installed_images` смотреть в `image_catalog` (`inventory.configured_images`).
- Тайминги: prepare до `ready` ≈40 с для обеих VM; release → `released` ≈7 с (job сначала `delete_dispatched`, итоговое состояние читать из `vm_lease`, не ждать только `virfield_job`).
- **Запись экрана**: на `uitest-27-v1` `screencapture -v` работает по обычному SSH; на macOS 12 (`developer-v1`) `capture error`, нет Screen Recording TCC, SIP включён. Если нужна запись на старых VM, нужен golden с заранее выданным разрешением.
- **UI automation**: macOS 12 VM — Developer Mode уже включён, sudo без пароля, но `automationmodetool enable-automationmode-without-authentication` нужно выполнить; `ui_testing` проба помогла бы здесь. Для запуска из SSH нужна консольная GUI-сессия (Terminal `.command`).
- **`ready` не подтверждает готовность UI Automation — повторно 2026-10-21.** Две свежие VM, `monterey-xcode-13.4.1` (Tart, macOS 12.7.6/21H1320, ARM64, Xcode 13.4.1/13F100) и `htpc-sonoma-14-xcode-16.2` (node VM, macOS 14.8.9/23J631, Intel, Xcode 16.2/16C5032a), получили успешный prepare и lease `ready`. При этом `/usr/bin/automationmodetool` на обеих сообщил `Automation Mode is disabled` и `This device requires user authentication to enable Automation Mode`. Developer Mode был включён, `admin` входил в `_developer`, консольная сессия принадлежала `admin`. XCTest runner загрузился, но запуск через Terminal и напрямую через pinned SSH завершился `Timed out while enabling automation mode`, exit 65, **0 выполненных тестов**. `sudo automationmodetool enable-automationmode-without-authentication` затем сообщил успех; повторная проверка уже показывала `DOES NOT REQUIRE user authentication`, однако проверенный повтор по-прежнему завершился timeout до тестовых методов. Контрольные минимальные UI-тесты, собранные локально штатными SDK Xcode 13.4.1 на Monterey и Xcode 16.2 на Sonoma (без нового bundle и без shim), тоже завершились `Timed out while enabling automation mode`, exit 65, до тестового метода. Поэтому проблема ещё не закрыта, а совместимость исполнения нового bundle этим прогоном не доказана. Нужны явная проверка Automation Mode при UI-readiness, подготовка соответствующего UI-профиля и короткий настоящий XCUITest с ненулевым числом выполненных тестов; native GUI/Keychain readiness этого не заменяет. Leases: `lease-9ec9281c953de634a53572e293862901`, `lease-6994a85f7abcefd367dd40d45b08e87b`.
- **Уточнение UI-readiness, 2026-10-22:** последующая проверка через pinned SSH без Screen Sharing на новых leases `lease-202db9fd4686e87363ac66171657ba21` (Sonoma Intel/Xcode 16.2) и `lease-22c0cfb96e3253d3ed1f7d8ebee6ab77` (Monterey ARM/Xcode 13.4.1) выполнила настоящие native XCUITest probes: 1/1 на каждой OS. На Sonoma один и тот же CI test bundle выполнил PrintingTests 7/7 и с упакованным runtime, и со штатным XCTest 16. На Monterey исправленный AddressBarSearchQueryEditingTests прошёл 26/26 с первой попытки; полный сброс состояния подтверждён только перед первым методом (flags 1 + 25×0). Для старого XCTest потребовались завершение своего target app между процессами, подготовка autocomplete fixture через defaults и отключение вложенного синтеза событий из TCC polling timer. Это снимает утверждение, что UI Automation на этих образах вообще невозможно запустить, но не доказывает первопричину прежнего automation-mode timeout и не заменяет readiness probe в Virfield. Отдельный sandbox запуск Monterey завис в системных Keychain вызовах до создания окна; продолжается диагностика. ARM Sonoma crash из CI не воспроизведён на Intel. Доказательства сохранены в `/tmp/prebuilt-ui-fix-results/` (включая `monterey-final-evidence.tar.gz`, `sonoma-native-runtime-evidence.tar.gz`).
- **Дополнительная UI-квалификация 2026-10-22:** Sonoma Intel/Xcode16.2 выполнила также AppStoreSandboxUITests2/2 с изолированным временным keychain; исходные default/search lists восстановлены в GUI и SSH audit sessions. Один лишь SSH unlock не гарантирует доступа GUI app: запуск App Store блокировался в Keychain до native GUI unlock/selection. Native SDK13 контроль Monterey нашёл Customize на новой вкладке (XCUITest assertion1/1); sandbox-класс прошёл NTP после замены element timeout5s на navigation timeout, но затем General Settings перестала отвечать. Sample: `NSPathControlView.updateNSView → NSPathCell.setURL → FileProvider/CloudDocsFileProvider → fp_isInSyncableRootFast → open`; это не доказанный бесконечный SwiftUI layout loop и не failure загрузки XCTest bundle. В VM виден запрос доступа Review к Downloads. Проверка разрешения folder privacy ожидает человеческого согласия: автоматический approval review отклонил выдачу доступа. Cancel/Deny и перезапуск устаревших UI helpers не закрыли квалификационный gap. Monterey смешанный прогон1 выполненный метод+1 OS skip завершился успешно; all-skipped по-прежнему ошибка. Новый Sequoia lease `lease-e22b152c5d0d4c9bc8540b3bdf9a90e7` готов, macOS15.8.1/Xcode26.3, но Automation Mode disabled/requires user authentication; native UI пока не запускался, изменение unattended-политики также ждёт явного разрешения после auto-review отказа. Loader-only631UI+5Perf+5Sync успешен. На GitHub ARM14 и15 точечные классы прошли в обоих режимах на1066967a82; финальные полные UI/Sync/Performance на7cbda2bc49 ещё выполняются. Дополнительные receipts: `/tmp/prebuilt-ui-fix-results/sonoma-appstore-evidence.tar.gz`, `monterey-additional-evidence.tar.gz`.
- Remote shell zsh: нет `timeout`, `$var` не разбивается на слова — при автоматизации писать скрипты файлами.
- Запуск из `xcodebuild test-without-building -xctestrun` по скопированным `Products` (macOS 27) работает; `Scheme`-pre-actions (`clean-app.sh`, `tests-server`) при этом **не** выполняются.
- Повторы `vm_acquire` — с новым idempotency key, если меняется ключ SSH/шаблон; тот же ключ и body только для настоящего retry.
- Клиентская сторона (не virfield): auto-mode classifier заблокировал `vm_acquire` для шаблона, который пользователь не называл; разрешение нужно давать явно.
## Текущая работа 2026-10-23: UI readiness
Локальный `main` содержит коммиты `fd980dd`, `c7d75e7`, `1126997`, `6203177`; рабочее дерево чистое. Полный `go test ./...` прошёл. Для Xcode-образов и новых disposable workers добавлены настройка unattended Automation Mode и настоящий 1/1 XCUITest gate; компактный MCP status и путь pinned SSH без CLI документированы. На действующем Monterey lease native UI fixture прошёл 1/1, а `automationmodetool` сообщил `DOES NOT REQUIRE user authentication`. Это проверка текущей VM, не доказательство работы ещё не установленного нового daemon.
Cold boot двух node VM на htpc выявил дополнительные ошибки старой установленной версии. Sonoma `lease-1e935304d66b68d41c7850a89f79d0ae`: SSH появился примерно через 17 минут, Finder стабилизировался позже двухминутного desktop timeout; job `needs_attention/lease_ssh_failed`. Sequoia `lease-1140ca109abe50cf3c095ae5c24a496b`: раннее чтение модели ошибочно дало `guest_identity_failed`; последующий pinned SSH подтвердил `iMacPro1,1`, macOS 15.8.1/24H32. Исправления увеличивают бюджет только node-lease до 45 минут, ожидание его desktop до пяти минут и повторяют временно неудавшееся read-only чтение модели. На обеих VM прочитанная политика требует аутентификации для Automation Mode. Sequoia lease удалён через journal API после подтверждения владельца: cleanup job `job-e055b9c977d2d35c6d6d7239b82429e9` succeeded, lease `released`, контейнер отсутствует. Sonoma lease сохранён до отдельного подтверждения; повторный прогон нового кода ещё не выполнен.
Production пока v2.1.1: локальные Tart leases заняты, один до 2026-10-24. Установленный daemon подписан Team ID `E3R68ED529`. Доступный личный сертификат `Apple Development: mallexxx@gmail.com (D46EWG5VWN)` после сборки дал тот же Team ID и designated requirement, что у установленного binary; первоначальный вывод об отсутствии identity был ошибочным. Кандидат собран и подписан, но не установлен: online backup старый daemon отклонил с `backup_failed` (требует idle manager и resolved jobs), а два действующих Tart leases заняты, один до 2026-10-24. Для production upgrade нужно дождаться завершения leases, сделать owner-only backup, затем контролируемый restart, проверка фактического Full Disk Access и fresh lease acceptance на Monterey, Sonoma, Sequoia. Screen Recording/Downloads TCC для конкретных приложений остаётся за системным согласием пользователя.
## Ограничения и дальнейший план
Следующие задачи не входят в принятую установленную VM/MCP/Broker-приёмку и не объявляются реализованными:
- Проверить Apple-authorized download свежим входом и реальный VS Code editor / DuckDuckGo application debugging; generic installed LLDB-DAP уже проверен.
- Установить причину прежнего guest-kernel stall: 2002-stackshot diagnostic её не воспроизвёл. Поздние успешные циклы не доказывают причинное исправление.
- Развивать Orchard и другие провайдеры отдельными проверенными сценариями; mixed-primary scheduling, libvirt/Vetu и лицензируемые провайдеры остаются отдельным объёмом.
- Реализовать signed node-agent, WoL relay/power intents, grants/connectors и physical-host/browser desktop при отдельном приоритете.
- Развивать /api/v3 capability selection, Target/EnvironmentProfile/ConnectionGrant, short-lived access, VS Code extension и linked Console/Broker flows.
- Расширить crash/host-loss/partition/full-disk matrix, metrics/alerts, signed promotion/revocation.
Broker reviewer исправление уже входит в запушенный Broker main `13c29ac`. Завершённые локальные и remote ветки Broker удалены после содержательной сверки, reviewer worktree сохранён detached. Архив исходного patch: [[personal/projects/archive/virfield-release-cleanup-2026-10-16/docs/acceptance/broker-reviewer-readonly]].
Детальные прежние планы сохранены в [[personal/projects/archive/virfield-release-cleanup-2026-10-16/docs/VIRFIELD-3-PLAN]] и архиве superpowers. Их старые pending-статусы не заменяют результаты выше. Автоматизация остаётся на паузе по указанию пользователя.