98 lines
23 KiB
Markdown
Executable File
98 lines
23 KiB
Markdown
Executable File
---
|
||
title: Virfield
|
||
namespace: personal
|
||
updated: '2026-10-14'
|
||
status: release-hardening-waiting-lease
|
||
tags:
|
||
- virfield
|
||
- macos
|
||
- vm
|
||
- go
|
||
- infrastructure
|
||
---
|
||
# 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` не являются инструкцией для продолжения работы.
|
||
|
||
## Runtime и deployment
|
||
|
||
- Установленный runtime: Tart на Apple Silicon + SSH physical nodes `mbp-2014` и `htpc`. На HTPC macOS lab VM работают через rootless Podman/QEMU/OpenCore.
|
||
- Deployment `~/.virfield-v2`, config `~/.virfield-v2/config.json`, state `~/.virfield-tart`, daemon `~/.virfield-v2/bin/virfieldd`, API `127.0.0.1:7780`, launchd `ai.virfield.virfieldd`.
|
||
- Virfield переключён с Lume на Tart 2026-10-08. В текущем hardening-кандидате удалены Lume backend/factory/wrapper/patch/build/install paths. Неявный legacy runtime и `image_tools` отклоняются. Старые поля профилей читаются только для совместимости журнала; новый Tart builder отклоняет IPSW-рецепты до резервирования build.
|
||
- Старый `ai.virfield.lume` отключён (launchctl disable + bootout) 2026-10-14 после проверки пустого inventory. Служба отсутствует в загруженных system services, порт 7777 закрыт. Plist/бинарники сохранены для отката; Homebrew Lume отсутствует.
|
||
- Не создавать второй manager/listener, не менять порт и не редактировать SQLite/runtime disks в обход журнала.
|
||
|
||
## Реализованные исправления кандидата
|
||
|
||
- Один exclusive physical-host lease независимо от VM slots; VM не занимает host slot; node-side atomic host lock и post-wake проверка boot volume.
|
||
- Общий sleep hold с reference counting и сохранением чужого hold; при ошибке Podman cleanup overlay и hold сохраняются.
|
||
- Node image deletion сохраняет provider/guest identity, защищает backing goldens и проверяет отсутствие контейнера.
|
||
- Tart image_create выбирает approved digest-pinned bases из runtime.tart.bases и настроенных templates; default location соответствует конфигу. Base/developer/automation/macOS 27 recipes; generic automation проверяется после reboot.
|
||
- Shared resumable Xcode archive store, checksum/quarantine, exact-job Apple sign-in recovery в resolve до VM build.
|
||
- Registry resolver принимает Tart flat/ASIF format, image_pull сохраняет pin/provenance. Publish строит новый portable guest с публичным admin/admin, не ставит private golden credentials, sanitizes и подтверждает временный cleanup. Private managed golden не загружается.
|
||
- Init/installer используют три бинарника и только сервис Virfield; отдельный private state-dir и optional native browser. CLI config-check проверил действующий config.
|
||
- Orchard проходит обязательный per-lease SSH preparer; source-only remote template отклоняется до VM creation. Полноценная remote factory/access и live pool acceptance отсутствуют.
|
||
- Pending image build/export резервируют CPU/RAM/disk до dispatch и учитываются вместе с worker leases; для нового macOS 27 base нужен known/declared disk bound. Host IDs не могут совпадать между primary и node inventories.
|
||
- Backup включает node management keys и cached probes, отклоняет symlinks в identity tree.
|
||
- Go 1.26.9, pinned Staticcheck без замечаний, govulncheck: 0 reachable/imported-package vulnerabilities. Module-only notice openpgp относится к неиспользуемому пакету и не имеет fixed version.
|
||
- Удалён источник CI Pillow failure: retired Python image factory/tests и Lume build step. Это исправление workflow, а не результат нового GitHub CI.
|
||
|
||
## Приёмка и релизный статус
|
||
|
||
Кандидат **ещё не принят для релиза**. Установка `09ad696` сохранила signing identity/Team ID E3R68ED529 и все пять image-ready записей. Шесть последовательных Tart clones (по два Ventura/Monterey/macOS 27) прошли SSH/host-key изоляцию, OS/build/SIP, desktop, artifact export и release. External SSD не допускает два диска полного размера с сохранением резерва; concurrent acceptance будет выполняться на отдельном временном внутреннем контейнере. Exact commit `09ad696cacea2ba9cd2245fa76cc599696470d01` прошёл полный make check (docs, 7 Python tests, gofmt/vet/full race), Staticcheck, module verify, Gitleaks (196 commits), govulncheck (0 в используемом коде), действующий config-check и Packer syntax checks. Clean archive/extraction/init/checksums/native signature smoke прошёл: `/private/tmp/virfield-release-check-09ad696/virfield-v0.0.0-localcheck-darwin-arm64.tar.gz`, SHA-256 `f12f2be162cbcfa7688c814a8fcdbb13d17ff028053f878aa27ac1e87e2bbe3c`. Это локальная тестовая упаковка, не опубликованный release. Live public Tart manifest resolution также прошёл. Factory/GHCR roundtrip в работе: отдельный temporary Tart container и push source настроены, разрешён новый private `mallexxx/virfield-hardening-acceptance`. Первый cold Packer build завершился EOF; после проверки отсутствия процессов/VM его собственная запись удалена через journaled recovery. Установленный `aee89c1` prefetches source в retryable resolve и отключает implicit pruning. Factory golden `image-5387f340da4ae093162383c18449c592` rebuilt/qualified, generic automation прошёл post-reboot проверку; два последовательных клона прошли SSH/cross-key/host-key isolation, exact OS/build/SIP, desktop и artifact export, затем оба released. Private GHCR publication требует idle pool и пока не запускалась; полный roundtrip не принят. Текущие исходники, установленный daemon и published archive нельзя считать одним артефактом.
|
||
|
||
Installed MCP прошёл HTTP и fresh stdio discovery/help/status с 18 tools, HTTP 401 без авторизации и ещё два полных fresh stdio acquire/replay → SSH/workload/artifact/desktop → release цикла на собственных factory-клонах. Оба дополнительных клона удалены. Live discovery gate исправлен: проверяет обязательные имена вместо устаревшего hardcoded count 17. Source MCP metadata теперь соответствует Tart/node budgets, approved bases и unlocked APFS/FileVault policy. Ventura `TestLiveLeaseSSH` прошёл exact Xcode 15.2/15C500b, Swift workload, SCP, cross-key/image-key rejection, desktop/tunnel revocation, cleanup и рестарт daemon с сохранением lease SSH identity. Signed installed archive `aee89c1`: SHA-256 `2313602b2c380e5e74640c47ee6ad50d9c10d750f856a0949833a4489803cf35`; хеши трёх подписанных бинарников сохранены в `~/.virfield-v2/upgrades/20261014-aee89c1/installed.json`. Полный локальный make check, Staticcheck, Gitleaks и регрессионные race-тесты нового inventory fix прошли. Clean archive exact source `8a297748eac5035fa0f0453aa51e11e9cb77d4e4`: `/private/tmp/virfield-release-candidate-20261014/virfield-v0.0.0-candidate-darwin-arm64.tar.gz`, SHA-256 `e2efde0214c7f4967528308b850575baac4a464e4e6c86425e871e11b8879488`; extraction, все binary checksums, native browser signature и действующий config-check проверены. Idle-only installer `/private/tmp/virfield-install-8a29774.py` подготовлен, не запускался; включает три бинарника и актуальный native Apple browser, rollback backup и повторную проверку свободного pool. Fresh MCP из этого clean archive прошёл discovery/help/status и проверку исправленных metadata.
|
||
|
||
Ожидаем освобождения `lease-6fde5d2f33c234f2e885583fb6a8fd34` (`macos27`). На 2026-10-14 13:56 UTC API показывал `needs_attention`/`vm_drift`, VM в Tart running; чужую аренду/VM не меняли. Причина drift не установлена. Lease TTL — до 2026-10-15 13:20:23 UTC (19:20 по Бишкеку), она может быть released владельцем раньше. Создана heartbeat-проверка `virfield-lease` каждые 15 минут только для чтения status и сообщения об освобождении; future installation/publish/cleanup/push через неё не выполняются. Auto-review отклонила такое фоновое продолжение без отдельного согласия; запрос на однократное фоновое продолжение ещё ожидает ответа. Отдельно тестами доказан и исправлен дефект canceled inventory: прерванный адресный/container probe больше не превращается в успешный неполный snapshot; Control сохраняет последнее полное inventory и закрывает admission. Этот fix пока не установлен.
|
||
|
||
Offline restore `backup-5cdef526c555f6a53ed5f565c6e2edaf` в отдельный private каталог прошёл: 18 файлов, SQLite integrity, пять active image identities/credentials/verification, тот же node management key, новый operator token и config-check. Restored daemon не запускался; live restore/rollback остаются gates.
|
||
|
||
Ранее принятые срезы сохраняют свои даты:
|
||
|
||
- Ventura 13.7.4/Xcode 15.2 и Monterey 12.7.6/Xcode 13.4.1: golden qualification и две аренды, 23/23 на каждый golden.
|
||
- macos27 27.0/26A428/Xcode 27.0/uitest-27-v1: Broker v1 smoke passed 2026-10-08.
|
||
- R1: четыре boot volumes MacBook по очереди; HTPC wake-by-lease (27 с).
|
||
- R2: secured Sonoma 14.8.9 и Sequoia 15.8.1 на HTPC, 19/19.
|
||
- R3: Screen Sharing VM lease tunnels, 11/11. Physical desktop и browser noVNC не реализованы.
|
||
|
||
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)
|
||
|
||
Сессия Claude Code (worktree `apple-browsers.git/fix-macos-ui-test-failures`) держит `lease-6fde5d2f33c234f2e885583fb6a8fd34` (`macos27`, TTL до 2026-10-15 13:20 UTC) для воспроизведения UI-тестов — это и есть «чужая» аренда из раздела выше. Найденные блокеры:
|
||
|
||
- **`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` работает, несовместимостей не обнаружено.
|
||
|
||
## Каноническая документация
|
||
|
||
- [Operations](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/OPERATIONS.md) — config/install/services/recovery.
|
||
- [Image pipeline](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/IMAGE-PIPELINE.md) — актуальные Tart/node contracts.
|
||
- [Verification](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/VERIFICATION.md) — фактические gates/evidence.
|
||
- [3.0 plan](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/VIRFIELD-3-PLAN.md) — реализованное и оставшееся.
|
||
|
||
Ссылки ведут на опубликованную hardening-ветку; `main` ещё не обновлён. Старая история: [[personal/projects/archive/virfield-checkpoints-through-2026-10-08]].
|
||
|
||
## iPad Markdown editors: Monterey build (2026-10-14)
|
||
|
||
Работа: [[personal/how-to/ipad-ios935-build-deploy]]. Цель — сборка открытых редакторов на `monterey-xcode-13.4.1`, armv7/iOS 9.3.5, fake sign и установка на подключённый iPad mini 1.
|
||
|
||
Наблюдения этой сессии:
|
||
|
||
- В 21:53–21:56 (Asia/Bishkek) admission сначала был занят 2/2: чужой `lease-6fde5d2f33c234f2e885583fb6a8fd34` и quarantined image `image-2ec1111415abc0c1e1e66a8e293b14db` / job `job-9f321bedd55313ed859c8eaa9844c3ce` (`image_command_failed`). Чужие записи и VM не менялись. Позднее статус показал освобождение image reservation и один свободный слот.
|
||
- Первый `vm_acquire` для Monterey с default storage вернул `resource_exhausted`: `No eligible clone storage has enough free disk for reserved VM growth and host safety reserve: samsung-tart`. При этом status показывал `capacity.available=1` и около 251 GB физически свободного места на Samsung; admission дополнительно учитывает полные reservations и safety reserve. Это ограничение ресурса, не доказанный дефект.
|
||
- Новый запрос с явным `destination_location=release-check` принят: lease `lease-9e65ca2f956c0f061eb3ac021d9f6b6f`, prepare job `job-ee57f1c483518f251f1bcd095621e6e9`, VM `vf-9e65ca2f956c0f061eb3ac021d9f6b6f`. Тело и idempotency key сохранены в `~/Developer/ipad-editors/virfield-acquire-release-check.json`.
|
||
- Job через ~2 секунды перешёл в `needs_attention`, phase `clone_dispatched`, error `clone_outcome_unknown`; lease — `quarantined`, `clone_confirmed=false`. Events 840–842 не сохраняют исходную ошибку backend, только общий текст `Runtime create did not return confirmed success. Automatic replay and deletion are blocked.`
|
||
- Установленный Operations runbook прямо предупреждает: `Local Tart cannot clone a local golden across TART_HOME containers; do not configure a cross-container fallback for such templates.` Исходники `internal/tart/client.go:414–422` отклоняют такой cross-container clone ДО вызова Tart. Здесь golden находится в `samsung-tart`, а выбран destination `release-check`; это соответствует запрещённому пути. Controller (`internal/control/controller.go:1050–1063`) превращает любое Clone error в неоднозначный outcome и quarantine. Следствие: детерминированный preflight rejection занимает reservation и требует operator recovery, а исходная причина не видна в job/events. Это найденная проблема интерфейса admission/диагностики, не исправленная в этой сессии.
|
||
- Повтор acquire, resolve/release и обход journal не выполнялись. Для восстановления нужен exact-name operator resolve после подтверждения отсутствия операции, с отдельным подтверждением пользователя: команда recovery может навсегда удалить собственную VM. Чужая работа не затрагивается.
|
||
|
||
Сборка ещё не запускалась: готового Monterey lease нет. TTL quarantined lease — до 2026-10-15 00:58:14 Asia/Bishkek; истечение TTL само по себе не доказывает cleanup.
|
||
|
||
### Recovery approval review, 2026-10-14 22:18 Asia/Bishkek
|
||
|
||
После пользовательского «Да» выполнены повторные read-only status/job проверки: собственный lease по-прежнему quarantined, job needs_attention, runtime inventory не содержит собственной VM; никаких running/queued операций для неё нет. Попытка штатного CLI resolve с exact lease/VM и CONFIRM-NO-OPERATION-IN-FLIGHT остановлена automatic approval review ДО запуска команды. Reason: transcript does not contain a clear user approval for this exact irreversible lease deletion. Recovery не выполнен, slot reservation остаётся. Нужен однозначный ответ пользователя с разрешением удалить только `lease-9e65ca2f956c0f061eb3ac021d9f6b6f` / `vf-9e65ca2f956c0f061eb3ac021d9f6b6f`. Это approval blocker, не новый сбой Virfield backend.
|