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

121 lines
23 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-02'
status: candidate-not-production-accepted
tags: [virfield, macos, vm, go, infrastructure]
---
# 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.