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

121 lines
30 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.
---
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 `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
- Установленный 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 минут. Пользователь 2026-10-14 явно подтвердил однократное продолжение: «Продолжай доделывать до готовности»; automation обновлена и ACTIVE. После освобождения этой lease и остальных чужих VM/jobs она продолжит безопасную установку актуального проверенного кандидата, installed Tart/node/MCP live-приёмку, factory/private GHCR roundtrip, локальные CI, исправления, документацию и push рабочей ветки; после подтверждённого завершения отключится. Пока pool занят, установка и рестарт не выполняются. Прежний отказ 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: проверенные проблемы и исправления (2026-10-14)
Сессия 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`.
- **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.
## Каноническая документация
- [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.
### Recovery и новый образ, 2026-10-14 22:30 Asia/Bishkek
После явного ответа пользователя «Разрешаю 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 не выполнялись.