diff --git a/personal/projects/virfield.md b/personal/projects/virfield.md index 054ce7a6..fd445363 100755 --- a/personal/projects/virfield.md +++ b/personal/projects/virfield.md @@ -2,7 +2,7 @@ title: Virfield namespace: personal updated: '2026-10-03' -status: candidate-live-virtiofs-monterey-unsupported +status: candidate-not-release-ready-monterey-plan-recorded tags: - virfield - macos @@ -10,149 +10,43 @@ tags: - go - infrastructure --- -# Virfield — live update 2026-10-03 +# Virfield — актуальный статус 2026-10-03 -**Следующее действие:** не ретраить Monterey/Xcode как transient. Текущий live result для `job-057b0898f3746df8b12fb8b5c4c34c1c`: `virtiofs_unsupported`; VM `macos-12.6-xcode-13.4.1` stopped; host-side `cp`/`ditto`/`tar`/`scp`/`rsync` процессов нет. +**Следующее действие:** остановить разработку в этой сессии после commit/push. Не объявлять релиз готовым. -**Что реально выяснено:** Lume `run --shared-dir` поднимает Monterey 12.6, но guest не получает `/Volumes/My Shared Files`; внутри guest нет `/sbin/mount_virtiofs` или `/usr/sbin/mount_virtiofs`, `kextstat` показывает только VirtIO block/network. Apple Virtualization automount contract работает для macOS 13+ guests, не для Monterey 12.x. +## Текущий ответ по релизу -**Что теперь в кандидате:** +- Репозиторий: рабочая ветка `codex/versioned-images` должна быть запушена после финального cleanup/commit этой сессии. +- Release-ready: нет. `make check` прошел, live runtime обновлялся, но Monterey + Xcode acceptance не закрыта. +- Monterey 12.6 + Xcode 13.4.1: не верифицировано как `image_ready`. +- Default Xcode install: код мигрирован на VirtioFS для macOS 13+ guests, но Monterey 12.x не поддерживает Apple VZ shared directories. -- Developer provisioning использует native `lume run --shared-dir `; daemon сам владеет long-running child process, без Lume `--detach`. -- Guest copy идет только из `/Volumes/My Shared Files` через `ditto`; SSH streaming/tar/scp/rsync fallback не возвращен. -- Для macOS < 13 добавлен fail-fast `virtiofs_unsupported` после Xcode cache validation и до VM mutation. -- Старый `virtiofs-transfer` cleanup оставлен как миграционная уборка stale папок от предыдущих builds. -- Repo docs обновлены: `docs/IMAGE-PIPELINE.md`, `docs/VERIFICATION.md`. +## Факты по Monterey -**Проверено:** focused Go tests для `internal/images` и `internal/lume` green; `make build` green; live binaries установлены в `/Users/admin/.virfield-v2/bin`; live retry дал `virtiofs_unsupported` и не стартовал VM. +- Lume VM стартует. +- SSH в Monterey guest работает. +- `lume run --shared-dir` на Monterey 12.6 не дает `/Volumes/My Shared Files`. +- В guest нет `/sbin/mount_virtiofs` и `/usr/sbin/mount_virtiofs`. +- Live retry для `job-057b0898f3746df8b12fb8b5c4c34c1c` теперь завершается `virtiofs_unsupported`, VM остается stopped, host-side `cp`/`ditto`/`tar`/`scp`/`rsync` процессов нет. ---- +## Что уже сделано в кандидате -# Virfield — live update 2026-10-03 +- Legacy identity mode: `legacy_uuid`, один активный worker на UUID, registry publish для legacy запрещен. +- Xcode download/cache: Apple auth/browser path, XIP SHA/signature/cache validation, host `codesign --deep` убран из cached/downloaded hot path. +- Lume service: stable `virfield-lume -config`, patched Lume `0.5.3-virfield6` required. +- Developer provisioning: macOS 13+ uses native `lume run --shared-dir ` and guest-side `ditto` from `/Volumes/My Shared Files`. +- Monterey guard: macOS < 13 fails fast with `virtiofs_unsupported` before VM mutation. -**Следующее действие:** дождаться текущего retry `job-057b0898f3746df8b12fb8b5c4c34c1c` после VirtioFS transfer. Сейчас live binary уже установлен без host-side `codesign --deep` для cached/downloaded Xcode; host deep check убит вручную и больше не должен запускаться на retry. VM `macos-12.6-xcode-13.4.1` поднялась с IP `192.168.64.205`; текущая стадия — host staging `Xcode.app` в per-lease `virtiofs-transfer`. +## Monterey plan -**Что изменено в кандидате:** +1. Add a separate Monterey transport path; do not weaken the macOS 13+ VirtioFS path. +2. First probe NFS live on the existing Monterey VM: host export, guest `mount_nfs`, small file roundtrip, cleanup. +3. If NFS passes, implement bounded host export lifecycle: create private export dir, mount in guest, copy Xcode with `ditto`, unmount, remove export. +4. If NFS fails, implement explicit SSH-copy fallback as a separate Monterey-only contract with progress, cancellation, logs, and cleanup. +5. Run full Monterey 12.6 + Xcode 13.4.1 image build to `image_ready`, then ordinary clone/workload/artifact/cleanup before claiming support. -- Legacy Monterey/APFS encrypted disk поддерживается отдельным контрактом: `legacy_uuid`, один активный instance на UUID, registry publish для legacy запрещён. -- Developer provisioning переведён на per-lease VirtioFS transfer folder: host stages Xcode туда, guest должен читать из `/Volumes/My Shared Files`, cleanup удаляет staging dir. -- Lume run request теперь отправляет оба JSON-контракта: camelCase (`sharedDirectories`, `noDisplay`) и Vapor/snake_case (`shared_directories`, `no_display`), потому installed Lume 0.5.3 фактически парсил snake_case. -- Host-side `codesign --verify --deep` по cached/downloaded `Xcode.app` удалён из hot path. Trust source для downloaded Xcode: SHA1 archive + Apple `xip --expand`; cached bundle проверяется metadata marker. Shallow host codesign оставлен только для operator-provided `image_tools.xcode`. -- Generated Lume plist переведён на stable wrapper path `virfield-lume -config`; текущий live root LaunchDaemon всё ещё может ссылаться на versioned Lume binary до следующего root reinstall. +## Verification now -**Проверено:** `go test ./internal/lume`, `go test ./internal/images`, ранее полный `make check`; live binaries установлены в `/Users/admin/.virfield-v2/bin`, `virfieldd` перезапущен. Obsidian заметка была устаревшей по состоянию 2026-10-02; с этого блока она снова отражает текущую live работу. - ---- -# Virfield — текущий статус и продолжение - -**Следующее действие:** закрывать release scope вокруг Monterey/Xcode: не ретраить `job-057b0898f3746df8b12fb8b5c4c34c1c` как будто это transient. Зафиксировать, что macOS 12.6 / 21G115 на этом host заблокирована default disk gate (`disk_encrypted`) даже при FileVault Off. Дальше выбрать один из двух путей: найти supported setup с реально unencrypted System/Data **или** реализовать отдельный Monterey legacy mode — full VM identity bundle copy, golden stopped, max one running worker, cleanup deletes copied bundle, registry publish disabled until separate contract. Heartbeat `virfield-xcode` удалён как устаревший. - -**Текущий результат (2026-10-02 13:40 UTC):** Apple Developer sign-in через native `VirfieldAppleBrowser` прошёл; Xcode 13.4.1 archive скачан, SHA-1 совпал, host-side `xip`/Apple signature path исправлен и прошёл дальше. Setup Assistant Monterey завершился, но disk policy остановил publication: `FileVault=false`, `Encryption=true`, `Locked=false` на System и Data. Image `image-aca7f16a2a59918c661f8c470f3d1b58` quarantined, VM `macos-12.6-xcode-13.4.1` stopped, ordinary clone не выполнялся. Sequoia 15.2 ранее прошла clean GHCR publish → pull-back → два обычных клона/workload → cleanup. - -**Статус выпуска:** кандидат не production-ready. Текущий checkout `codex/versioned-images` / `340c6f9` содержит незакоммиченные изменения по аудиту, Apple auth, Balda watches и disk-policy документации; они ещё не опубликованы. Установлен локальный кандидат с native browser и Broker plugin, live image-job notification route доставлял фазу и ошибки в Mattermost. `release.json` указывает фактические бинарники и hashes. Установленный Lume service/CLI обновлялся до patched `0.5.3-virfield6` для headless audio на image setup; проверять фактический runtime по manifest перед claims. Хранение завершённой истории jobs/events — 30 дней в текущем кандидате. - -| Что | Где проверить | -|---|---| -| Репозиторий | `/Users/admin/Developer/virfield`, [mallexxx/virfield](https://github.com/mallexxx/virfield) | -| Runtime / storage | `/Users/admin/.virfield-v2` / `/Users/admin/.lume`; API `127.0.0.1:7780`, Lume `127.0.0.1:7777` | -| Точный статус job | `virfield -url http://127.0.0.1:7780 -token-file /Users/admin/.virfield-v2/token job job-057b0898f3746df8b12fb8b5c4c34c1c` | -| Текущая приёмка и открытые риски | `docs/VERIFICATION.md` и аудит `1-virfield-v2-audit-2026-10-02.md` | -| Выпущенная база | `main` / `v2.0.0` — не текущий кандидат | - -Фактическую версию сервиса проверять по `release.json` и hashes. Checkout сам по себе сервис не обновляет. Не повторять одноразовые скрипты из `/private/tmp`. Старые SQLite binaries нельзя возвращать поверх новой схемы без процедуры backup/restore из Operations. - -## 1. Подтверждённое состояние - -Virfield v2 — Go control plane для golden images и одноразовых macOS VM: durable jobs/events, leases, лимит 2 VM, SSH isolation/tunnels, expiry/cleanup, CLI, аутентифицированные HTTP/stdio MCP и встроенная web console. Четыре бинарника: `virfieldd`, `virfield`, `virfield-mcp`, `virfield-lume`. В текущем коде нет v1; архивная реализация хранится только в Git-ветке `v1`. - -Кандидат добавляет каталог версий macOS/Xcode, GHCR resolve/pull/portable publish, security profiles и 18 MCP tools. Это реализованные возможности, а не утверждение о проверке каждой версии macOS/Xcode. MCP содержит `virfield_help` и четыре документационных ресурса; агентский workflow не должен требовать чтения исходников или Obsidian. - -### Образы и приёмка - -| Объект | Текущий результат | -|---|---| -| `vf-ghcr-sequoia152` | `image_ready`, штатно выключен и сохранён. macOS 15.2 / 24C101, security `automation`, Xcode не выбран | -| GHCR source | `ghcr.io/trycua/macos-sequoia-vanilla:15.2`; digest `sha256:781469ea44dd687f5cfbb130131ea2efee799e34b0fe2a297a0ecab013427266`; 17,818,752,054 compressed bytes | -| Golden proof | System/Data: FileVault=false, Encryption=false, Locked=false. Ротация пароля, Secure Token, key-only SSH, автологин, Finder, SIP disabled, Gatekeeper/AMFI/TCC и System Events после reboot подтверждены | -| Два обычных Sequoia-клона | `TestLiveLeaseSSH`: PASS, 55.36 s. Точная OS/build, незашифрованные тома, Finder/SIP/Gatekeeper/AMFI, отдельные host keys, отказ image/cross-lease keys, SSH tunnel, idempotency, отказ третьей VM при 2/2, реальный SCP artifact export | -| Cleanup этих клонов | Оба удалены через API; private identities и tunnels удалены. Пул освободился, golden сохранён | -| Portable GHCR export | Новый clean job `job-4a0f22bf6531f77de5669742ae476442` опубликовал r2; digest `sha256:d9a22e89fef5c73f9ed3241b48e1b40b4ff9eb383a152cce7684b6a4d7b41e72`. Все 160 частей по 512 МиБ покрывают 80 ГиБ; временная VM удалена. Старый tag с 7/80 ГиБ не использовать | -| Pull-back | Clean job `job-5c0bf72ab62c50355e7eaf94184013b3` закрепил r2 digest и создал `vf-e2e-sequoia152-r2-20261002`, `image_ready`; System/Data unencrypted/unlocked, SIP/SSH/Finder после reboot прошли | -| `macos-27-golden` | Сохранён. Ранее принят полный `uitest-27-v1` с Xcode 27.2 beta / 27B5019j на macOS 27 / 26A428; результаты относятся к указанному в Verification кандидату, не заменяют новые versioned/GHCR проверки | -| Monterey 12.6 / 21G115 | Принятого golden нет. При FileVault=false оба тома оставались Encryption=true, обычные клоны не доходили до SSH. Неудачный encrypted golden и его два клона удалены | -| Xcode 13.4.1 / 13F100 | Authenticated Apple archive downloaded, SHA-1/signature path passed, host-side cache usable. Guest install blocked before Xcode copy by Monterey APFS `disk_encrypted`; установка и clone не приняты | - -Первый `vf-ghcr-sequoia152` был получен с operator recovery. Новый r2 golden прошёл полностью clean round-trip без ручного восстановления. Два его обычных клона прошли `TestLiveLeaseSSH` за 67.27 s; оба удалены через API, источник и новый golden сохранены. - -Идентификаторы для поиска доказательств: - -- Golden: image `image-d99fdbe7a626a10f84a265ab297b38b5`, job `job-6706c89cabe70b931d162903b6f89ff1`; `verified_at: 2026-10-01T08:21:19Z`. -- Удалённые r2 E2E-клоны: `lease-a4a01025e370187507229df4996e4460`, `lease-af2861ac848aca915a42aaa1ff21f7e4`. Ранние клоны: `lease-54c01094abd7c71b4bde58c715ce0095`, `lease-568d0c97a002f56a81fadeea55c2373b`. -- Приватные доказательства: `/Users/admin/.virfield-v2/images/image-d99fdbe7a626a10f84a265ab297b38b5/verification.json` и `/Users/admin/.virfield-v2/acceptance-sequoia-clones-20261001.log`. Не копировать credential files в заметки/репозиторий. - -`make check` (race/vet, 23 Python regression checks, deployment checks, docs), build, staticcheck, `go mod verify` прошли. После `04c9f13` повторно прошли `make check`, Go build, Swift registry-integrity test, clean pinned Lume build/checksums/signature и live public GHCR metadata test. Установленный HTTP/stdio MCP: 18 tools/help/status работают, anonymous доступ отклоняется. Gitleaks текущих исходников — без находок. Govulncheck: нет уязвимостей в используемом коде и импортируемых пакетах; одна advisory относится к неиспользуемому пакету требуемого модуля. Ранее были проверки release archive/full Git history/пустого HOME; повторить их для финального релиза. - -### GHCR и клиенты - -Настроены `public-cua` (organization `trycua`, read-only) и `personal-ghcr` (organization/user `mallexxx`, authenticated, `allow_push: true`). GitHub согласие на packages уже получено. Существующий приватный token file: `/Users/admin/.virfield-v2/registry-credentials/ghcr-mallexxx.token`, mode 0600; содержимое не печатать и не переносить в Obsidian/MCP-конфиги. Проверка доступа GHCR прошла; действительность credentials проверять перед новым запуском. - -Принят `ghcr.io/mallexxx/virfield-e2e-sequoia152:e2e-20261001-165cef8-r2`, digest `sha256:d9a22e89fef5c73f9ed3241b48e1b40b4ff9eb383a152cce7684b6a4d7b41e72`. Прямое чтение GHCR подтвердило 160 последовательных частей и 80 ГиБ. Старый tag `e2e-20261001-1200-a6cc966` неполон (7/80 ГиБ): не использовать и не перезаписывать. Видимость пакета инструмент не меняет. - -`image_publish` **пересобирает закреплённый recipe в новой portable VM**, а не выгружает текущий диск golden. Ручные изменения/рабочие файлы исходного golden не экспортируются. Portable build использует публичный bootstrap `lume/lume`, очищает гостевые SSH identities/history, проверяет диск, штатно останавливается, публикует и удаляет собственную временную VM. Import снова изолирует credentials. Публикация текущего приватного managed disk не поддерживается. - -Virfield MCP зарегистрирован и включён в Codex CLI; полный workflow там ещё не принят. Регистрацию Claude Code и его workflow проверить отдельно после приёмки образа. Balda/Broker могут использовать тот же пул: их состояние и задачи проверять отдельно, чужие VM не останавливать. - -## 3. Хэндоф: Apple Developer → Xcode download (обновлено 2026-10-02) - -- `image_create` создаёт durable job с точными macOS/Xcode build и security profile; каталог и `image_apple_auth` доступны через MCP. Для неавторизованной загрузки daemon выдаёт одноразовый 15-минутный `deep_link` приложения и HTTP fallback. Balda plugin rc.15 должен показывать прямую кликабельную ссылку и ссылку fallback. -- Native `VirfieldAppleBrowser` сразу открывает Apple Developer в WebKit. Вход и 2FA проходят на сайте Apple, без локальной формы пароля. Приложение передаёт daemon только ограниченные download cookies, автоматически закрывает окно после успеха и завершает процесс после закрытия последнего окна. Окно ограничено экраном, меню Edit содержит Cmd+V. -- Реальный вход 2026-10-02 возобновил существующий Xcode job. Он прошёл загрузку и host-side XIP/signature после фикса temp-dir, но остановился на `disk_encrypted` после Monterey Setup Assistant. Не пересоздавать ВМ ради того же результата без новой гипотезы подготовки диска. Если Monterey остаётся в scope, следующий прогон должен проверять именно supported path к `Encryption=false`, а не обход disk gate. -- Из аудита остаются release gates: Monterey clone при APFS Encryption=true, отдельные source hardening пункты (Recovery VNC password/port, кеш registry layers, crash recovery длительных мутаций), чистый release artifact и acceptance в Codex/Claude/Balda. Подробный статус — `docs/VERIFICATION.md`. Не ослаблять disk gate и не объявлять любое сочетание macOS/Xcode проверенным только по каталогу. - -## 4. Полный оставшийся план - -### 1. Закрыть Monterey и реальный Xcode workflow - -Найти и воспроизвести подготовку Monterey с **реально незашифрованными System и Data**, а не только FileVault Off. [Apple описывает](https://support.apple.com/en-nz/guide/security/sec4c6dc1b6e/web) шифрование APFS на Apple silicon даже при FileVault Off; это согласуется с измеренным Monterey-гостем, но не доказывает, что другой поддерживаемый способ подготовки невозможен. Затем выполнить нормальное клонирование с новой VM identity, SSH/Finder/reboot и security `automation`. Нельзя снимать disk gate, игнорировать black-screen или возвращать отклонённый пользователем workaround сохранения machineIdentifier. Если сочетание неосуществимо в поддерживаемом VZ/Lume, документировать доказанный предел, а не выдавать его за поддержку. - -Дождаться текущей авторизованной загрузки Apple-signed Xcode 13.4.1 / 13F100, проверить digest/signature, установку, first launch/license и реальную сборку Swift/Xcode на совместимой macOS. Провести полный versioned OS + Xcode + security → clone → workload → artifact → cleanup. Для других объявляемых поколений macOS расширять evidence matrix реальными прогонами; наличие версии в каталоге не равно E2E-приёмке. Не обещать «любая macOS/любой Xcode» без проверенной совместимости. - -### 2. Завершить production audit - -Провести финальное review модулей, конфигурации, guest bootstrap/recovery, registry boundary, ошибок/idempotency и документации. Проверить все новые автоматические пути на отсутствие локально зашитых HOME/checkout/credentials. Сборка и установка должны проходить из чистого checkout с другой конфигурацией путей/портов; локальные image tool paths допустимы только как operator config. - -Закрыть либо явно ограничить в release scope оставшиеся VM-mutation crash points, продолжительный soak и VM-disk disaster recovery; SQLite snapshot не заменяет backup/restore VM-дисков. Проверить live rollback/обновление с учётом текущей SQLite schema. Повторить race/vet/staticcheck/build/dependencies/vulnerability scans, gitleaks всей Git history и чистого release archive. Второй физический Mac ещё не принят. Container routing/TLS/per-principal auth и Broker/Runner/Balda integration — отдельные границы; не приписывать им результаты локального Virfield E2E. - -### 3. Подключить Codex и Claude, принять агентский workflow - -После приёмки VM/registry кандидата зарегистрировать установленный `virfield-mcp` у Codex и Claude Code по Operations; CLI читает token file, токен не вставляется в prompt/config. Обновить установленные embedded docs. В каждом клиенте проверить discovery/help/status и самостоятельный workflow image/create или acquire → ready → pinned SSH workload → artifact export → release. Проверить общий лимит 2 VM, same-key retry и понятные ошибки. - -Agent guide должен содержать все 18 tools, inputs, job polling, security/version selection, GHCR contract, operator recovery boundary, SSH/SCP и cleanup — так, чтобы агенту не приходилось читать исходники или Obsidian. Проверить взаимодействие с Balda/Broker через их собственную актуальную документацию и реальную сквозную приёмку. - -### 4. Зафиксировать и выпустить принятый результат - -Перед push ещё раз сравнить local HEAD, установленный runtime и фактические evidence; удалить из acceptance claims всё неподтверждённое. Закоммитить итог, запушить только нужные refs, дождаться CI точного commit, слить в main только v2, собрать и проверить portable release archive/checksums, выпустить новую версию. Номер релиза выбрать после финального scope; существующий `v2.0.0` не переписывать. - -Установить именно выпущенный artifact, проверить hashes/runtime manifest/schema, MCP и короткий smoke. Обновить README/Operations/Image pipeline/Agent guide/Verification и эту заметку так, чтобы published release, checkout и deployment были различимы. Production-ready объявлять только с перечислением реально прошедшей матрицы и оставшихся ограничений. - -## 5. Действующие pitfalls и правила продолжения - -- Golden/import/export требует эксклюзивного свободного пула. Другие задачи активно используют Virfield. `capacity_exhausted` при 2/2 — ожидаемый отказ; очередь принадлежит Broker. Не останавливать чужие VM и не редактировать SQLite ради освобождения слота. -- Импортированный native account нельзя перезаписывать offline setup: это ломало credential rotation/Secure Token. Registry imports должны уже иметь SSH и native `lume/lume`; готовятся через SSH. Чужой registry config из HOME не должен менять source/storage: настройки Lume изолированы на job. -- Recovery должен удерживать курсор на распознанном control до mouse-up; немедленный перенос переключал меню. SIP подтверждается подписанной операцией Recovery и canonical status после нормальной загрузки; одних screenshots недостаточно. -- `sysadminctl -autologin` может вернуть error:22 с exit code 0 и оставить старый пароль. Текущий код записывает guest `kcpassword` root:wheel/0600 и loginwindow preference, затем проверяет decoded password по pinned SSH без вывода секрета. Реальный reboot/Finder обязателен; проверка одного exit code не годится. -- Неизвестный исход мутации — `needs_attention` и inspection exact VM/job. Не повторять clone/start/delete/upload вслепую. Работать только после lease `ready`, выгружать артефакты до `release`. Приватные logs могут содержать чувствительный контекст; не копировать их целиком. `/private/tmp/virfield-lume-source` содержит отклонённые экспериментальные изменения: не собирать оттуда зависимость, использовать pinned recipe репозитория. - -## 6. Где читать дальше - -Каноническая текущая документация находится в локальном checkout (текущие изменения ещё не закоммичены и не запушены): - -| Источник | Назначение | -|---|---| -| `/Users/admin/Developer/virfield/docs/AGENT-GUIDE.md` | Полный workflow агента и контракты 18 MCP tools; также `virfield_help` после установки актуальной сборки | -| `/Users/admin/Developer/virfield/docs/VERIFICATION.md` | Доказательства текущей приёмки, live test commands и release gates | -| `/Users/admin/Developer/virfield/docs/OPERATIONS.md` | Deployment, конфигурация, services/MCP, backup, leases/SSH | -| `/Users/admin/Developer/virfield/docs/IMAGE-PIPELINE.md` | Catalog/Xcode, golden/security, recovery и зависимости | -| `/Users/admin/Developer/virfield/README.md` и `docs/ARCHITECTURE.md` | Сборка, структура модулей и архитектурные инварианты | - -Связи: [[personal/plans/balda-callee-prism-plan]] — общий стек; [[work/wiki/apple-browsers/vm-ui-testing]] — применение VM для UI-тестов. Границы: Virfield владеет VM/SSH leases, Broker — очередью/run lifecycle, Runner/Callee — командами внутри гостя. Provider credentials принадлежат issuer Broker, не golden image. +- `make check` passed on 2026-10-03 after the VirtioFS guard and docs updates. +- Repo docs updated: `docs/IMAGE-PIPELINE.md`, `docs/VERIFICATION.md`. +- This note is intentionally current-only; historical details live in Git/docs, not here.