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

30 KiB
Executable File
Raw Blame History

title, namespace, updated, status, tags
title namespace updated status tags
Virfield personal 2026-10-02 candidate-not-production-accepted
virfield
macos
vm
go
infrastructure

Virfield — текущий статус и продолжение

Следующее действие: изучить реализацию авторизации и загрузки в исходниках XcodesOrg/xcodes и XcodesOrg/XcodesApp; затем реализовать в Virfield вход через ссылку для пользователя и автоматическую загрузку Xcode 13.4.1 без ожидания файла в папке хоста.

Кандидат ещё не production-ready. Sequoia 15.2 прошла clean portable publish → GHCR pull-back → два обычных clone workload → cleanup. Monterey и реальный Xcode workflow ещё не приняты; release gates ниже остаются.

Эта заметка содержит только актуальное состояние, оставшийся план и действующие pitfalls. История изменений — в Git; API/команды/runbook — в документации репозитория.

1. Точка остановки

Что Значение
Репозиторий /Users/admin/Developer/virfield, mallexxx/virfield
Рабочая ветка / HEAD codex/versioned-images / 340c6f9
Рабочее дерево / публикация Чистое; 23 локальных коммита поверх origin/codex/versioned-images (58c56db). Новые изменения не пушились, не сливались в main и не выпускались
Опубликованная база main / v2.0.0, commit ee3aa1d; это не текущий установленный кандидат
Установленный runtime 689904e, SQLite schema 6; backup backup-367abb275292f5367c332f3683714e5a проверен
Deployment / VM storage /Users/admin/.virfield-v2 / /Users/admin/.lume; локальный выбор оператора, не встроенные требования проекта
API / Lume 127.0.0.1:7780 / 127.0.0.1:7777
Сервисы ai.virfield.virfieldd, ai.virfield.lume; запущены от владельца VM
Hypervisor Lume API service: 0.5.3-virfield1; registry CLI: 0.5.3-virfield3 с проверкой ошибок upload и полноты частей; оба закреплённые 0.5.3
Пул после E2E used: 0, available: 2, активных jobs нет. Другие задачи могут занять пул позднее — проверять заново

Последняя проверка: после clean GHCR round-trip и удаления двух временных клонов used: 0, available: 2, активных jobs нет. vf-ghcr-sequoia152 и vf-e2e-sequoia152-r2-20261002 — image_ready, остановлены. Lume API service не перезапускался во время активной VM.

Фактическую версию сервиса проверять по /Users/admin/.virfield-v2/release.json и hashes. Коммит checkout сам по себе сервис не обновляет. Runtime обновлён из 689904e (активный MCP-клиент может требовать переподключения). Resolver установленного API отклоняет неполный старый tag с registry_invalid и принимает полный r2. Последний snapshot: upgrades/recovery-continue-689904e-20261002. Системный Lume API service остался на предыдущем бинарнике; registry subprocess использует новый проверенный CLI из image_tools.lume.

Схема 5 → 6 уже обновлена с разрешения пользователя и проверенным backup. Старый бинарник со schema 5 нельзя просто вернуть поверх schema 6. Предшествующий snapshot: backup-ff4570a85e703b595b92a9c2606cf3f3; снимки каждой замены runtime — в deployment upgrades/registry-*. Процедуру backup/restore брать из Operations. Не повторять одноразовые /private/tmp/virfield-install-*.py из предыдущего чата.

2. Подтверждённое состояние

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 и 17 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 Каталог/совместимость разрешаются; реальная установка ещё не принята. В Downloads и deployment imports точного .xip при последней проверке нет; требуется авторизованный Apple archive/доступ

Первый 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: 17 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 и Claude Code ещё не зарегистрирован; это отложено до приёмки кандидата. Balda/Broker могут использовать тот же пул: их состояние и задачи проверять отдельно, чужие VM не останавливать.

3. Хэндоф: авторизация Xcode через ссылку (остановка 2026-10-02)

Последнее требование пользователя: Balda через Mattermost запускает создание Monterey golden с Xcode 13.4.1, присылает ссылку для входа Apple; после прохождения ссылки Virfield должен сам скачать Xcode и продолжить установку. Пользователь отклонил предложенное ожидание XIP в папке загрузок хоста. Перед реализацией требуется смотреть код существующих загрузчиков xcodes/XcodesApp и добиваться поведения, похожего на OAuth. На этом сессия остановлена по просьбе пользователя; Xcode auth flow не реализован, полный Monterey прогон не готов. Не выдавать архивный импорт или cookie file за исполнение этого требования.

Что выяснено и что уже работает

  • Каталог Xcode уже подключён в internal/catalog/catalog.go через https://xcodereleases.com/data.json; macOS IPSW берутся из IPSW.me. image_catalog MCP выдаёт доступные версии/совместимость, image_create принимает macos, точный xcode, security, location, idempotency key и создаёт durable job. Но каталог пока не сообщает отдельно состояние локальной загрузки/установки и ссылку/состояние авторизации. Это нужно добавить и описать для агента.
  • Для 13.4.1 / 13F100 каталог даёт Apple XIP https://download.developer.apple.com/Developer_Tools/Xcode_13.4.1/Xcode_13.4.1.xip, SHA-1 40e8628555b6231b361471183f3ce17b378036fd, минимум macOS 12.0. Xcode Releases ведёт браузер по https://developer.apple.com/services-account/download?path=%2FDeveloper_Tools%2FXcode_13.4.1%2FXcode_13.4.1.xip; неавторизованного пользователя Apple перенаправляет на idmsa.apple.com, затем браузер начинает загрузку. Прямой запрос XIP без Apple-сессии ранее возвращал 302 на /unauthorized/.
  • internal/images/xcode.go уже умеет резюмируемую прямую загрузку с операторским Netscape cookie file, импорт точного XIP из image_tools.xcode_archives, SHA-1, XIP signature, codesign/version/build проверку, распаковку и установку в гостя по SSH (provision.go). Если Apple отклоняет прямой запрос, выходит apple_auth_required; job требует ручного recovery. Ссылки, callback и автоматического продолжения после входа нет. VirtioFS в Monterey 12 не служит готовым решением.
  • Найден Homebrew xcodes и исходный проект; README описывает Apple ID/пароль, 2FA, хранение пароля в Keychain и сессионную загрузку. XcodesApp — второй источник для анализа. Это пока только обзор README, исходный код auth/download не разобран. Не утверждать, что у Apple есть стандартный OAuth grant для Developer Downloads: официальные Sign in with Apple документы описывают identity, не такой download grant. Нужно проверить точный механизм/ограничения до архитектурного решения, в том числе доступность browser/passkey flow. Не передавать пароль/2FA коды Балде, MCP-агенту, в job/event/log или в URL.
  • Локальный API Virfield на 127.0.0.1:7780 защищён bearer token, cookies/query tokens не использует; установленный runtime 689904e старее checkout. Mattermost-ссылка должна работать на машине пользователя и безопасно передавать результат авторизации Virfield; пока не доказано, как отдать браузерную сессию загрузчику без секрета/ручного импорта. Нельзя считать обычный Apple download URL достаточным: он запускает скачивание в браузере, а не в daemon.

План следующей сессии

  1. Открыть и прочитать исходники XcodesOrg/xcodes и XcodesOrg/XcodesApp: auth/session, 2FA, cookies, запросы Apple download, redirect и возобновление загрузки. Сравнить с официальным браузерным services-account/download flow; документировать подтверждённые возможности и ограничения, не называть его OAuth без реального grant/callback.
  2. Спроектировать и реализовать авторизованную ссылку с возвратом управления Virfield и последующей прямой загрузкой демоном; одноразовое ограниченное состояние, защита от утечки Apple credentials/session, отказ при истечении и restart-safe job. Если Apple не поддерживает такой обмен без ввода Apple ID в сторонний клиент, доказать это исходниками/протоколом и предложить честный эквивалент на согласование до реализации. Не возвращаться самовольно к watcher папки хоста.
  3. Вывести через MCP/HTTP каталог macOS/Xcode с состояниями «доступно / локально загружено / установлено», совместимостью и параметрами image_create; выдать Балде понятные auth actions/link и job progress. Обновить docs/AGENT-GUIDE.md, docs/IMAGE-PIPELINE.md, docs/OPERATIONS.md, embedded virfield_help и проверки безопасности/интеграции.
  4. Прогнать auth/download/install Xcode 13.4.1 на совместимом госте, затем Mattermost → Balda → MCP → ссылка → Apple вход → daemon download → Xcode install. Отдельный блокер Monterey: native 12.6 до сих пор даёт Encryption=true на System/Data при FileVault Off; clone gate это отвергает. Не ослаблять disk policy и не объявлять полный Monterey golden готовым, пока этот блокер не устранён и не пройдён live E2E.

Попытка текущей сессии добавить browser_downloads/watcher и поля catalog status отменена после явного отказа пользователя; по завершении git status --short должен быть пустым, HEAD остаётся 340c6f9. Новых коммитов, push, deployment и live-прогонов в этой сессии не было. Два заданных уточняющих вопроса (про приемлемость upload и где открывается ссылка) ответа не получили; последний запрет на watcher имеет приоритет. Записи о Xcode в дальнейших разделах этой заметки относятся к старому ручному пути и не означают готовности нового flow.

4. Полный оставшийся план

1. Закрыть Monterey и реальный Xcode workflow

Найти и воспроизвести подготовку Monterey с реально незашифрованными System и Data, а не только FileVault Off. Apple описывает шифрование 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/обновление с учётом schema 6. Повторить 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 должен содержать все 17 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 агента и контракты 17 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.