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

146 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-02'
status: candidate-not-production-accepted
tags: [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](https://github.com/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://xcodereleases.com/) ведёт браузер по `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`](https://formulae.brew.sh/formula/xcodes) и [исходный проект](https://github.com/XcodesOrg/xcodes); README описывает Apple ID/пароль, 2FA, хранение пароля в Keychain и сессионную загрузку. [XcodesApp](https://github.com/XcodesOrg/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 описывает](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/обновление с учётом 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.