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

131 lines
23 KiB
Markdown
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-01'
status: candidate-not-production-accepted
tags: [virfield, macos, vm, go, infrastructure]
---
# Virfield — текущий статус и продолжение
**Следующее действие:** согласовать новый уникальный GHCR tag для повторной clean publication. Защита от неполного manifest установлена; старый tag не использовать.
**Кандидат ещё не production-ready.** Чистая публикация прошла, но опубликованный OCI manifest оказался неполным; pull-back не загрузился. Неудачный импорт удалён с разрешения пользователя. Повторная публикация требует нового tag и отдельного подтверждения внешней записи.
Эта заметка содержит только актуальное состояние, оставшийся план и действующие pitfalls. История изменений — в Git; API/команды/runbook — в документации репозитория.
## 1. Точка остановки
| Что | Значение |
|---|---|
| Репозиторий | `/Users/admin/Developer/virfield`, [mallexxx/virfield](https://github.com/mallexxx/virfield) |
| Рабочая ветка / HEAD | `codex/versioned-images` / `04c9f13` |
| Рабочее дерево / публикация | Чистое; локально 17 коммитов поверх `origin/codex/versioned-images` (`58c56db`). Новые изменения не пушились, не сливались в main и не выпускались |
| Опубликованная база | `main` / `v2.0.0`, commit `ee3aa1d`; это не текущий установленный кандидат |
| Установленный runtime | `04c9f13`, `registry_candidate_pending_live_acceptance`, SQLite schema 6; backup `backup-3d8493cb5ec800c0204bea7da2107777` проверен |
| 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-virfield2` с проверкой полноты частей; оба закреплённые 0.5.3 |
| Пул после E2E | `used: 0`, `available: 2`, активных jobs нет. Другие задачи могут занять пул позднее — проверять заново |
**Последняя проверка:** после удаления неудачного import `used: 0`, `available: 2`, активных jobs нет, inventory fresh. `vf-ghcr-sequoia152` остаётся `image_ready` и остановлен. Старый `backend_unavailable` не наблюдается. Lume API service не перезапускался во время активной VM.
Фактическую версию сервиса проверять по `/Users/admin/.virfield-v2/release.json` и hashes. Коммит checkout сам по себе сервис не обновляет. Runtime обновлён из `04c9f13` вместе со встроенной Verification. Resolver установленного API отклоняет неполный личный tag с `registry_invalid` и принимает полный публичный `trycua` 15.2. Snapshot прежнего runtime: `upgrades/registry-integrity-04c9f13-20261001`. Системный 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 | `job-c7b629107f813b23f0ff425acd0df21f` прошёл clean build/upload/cleanup, но manifest tag `e2e-20261001-1200-a6cc966` содержит лишь 7 из заявленных 80 ГиБ диска; этот tag не использовать |
| Pull-back | `job-e67cee0e7659835a600a99f91c47e18f` завершился `guest_timeout` (чёрный экран, нет DHCP/SSH). Неудачная VM удалена job `job-77f096b2aec8cec10540e73c58833206` |
| `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/доступ |
Sequoia golden получен с диагностикой и operator recovery, **не полностью чистым end-to-end прогоном финального кода**. Чистый новый import/portable round-trip остаётся обязательным перед release acceptance. Два worker-клона после исправлений прошли без ручной починки.
Идентификаторы для поиска доказательств:
- Golden: image `image-d99fdbe7a626a10f84a265ab297b38b5`, job `job-6706c89cabe70b931d162903b6f89ff1`; `verified_at: 2026-10-01T08:21:19Z`.
- Удалённые E2E-клоны: `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-1200-a6cc966`, digest `sha256:c500d1206c768c9c720cd0da9ecf6293d7a2a86e543c5555b97e41bfed7b3811`. Manifest неполон: заявлено 80 ГиБ, реально описаны только первые 14 частей по 512 МиБ (7 ГиБ). Не использовать и не перезаписывать этот tag. Новую публикацию делать только с уникальным согласованным tag; видимость пакета инструмент не меняет.
`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. Полный оставшийся план
### 1. Закрыть GHCR round-trip и чистую сборку
Пул сейчас healthy idle. Из сохранённого `vf-ghcr-sequoia152` повторить clean portable publish только после согласования нового уникального tag и временной VM cleanup. Патч Lume больше не допускает публикацию manifest с пропущенными частями, а resolver Virfield проверяет покрытие всего диска. Причина отсутствия частей при предыдущем upload не установлена; новый прогон может завершиться явной ошибкой. Проверить job, digest, полноту manifest и удаление временной export VM. Не повторять неизвестный исход вслепую.
Импортировать опубликованный tag в новое имя, проверить совпадение digest, полный автоматический setup/security/reboot без ручного восстановления, FileVault/Encryption/Locked=false на обоих томах. Получить обычные клоны; проверить workload, credentials/isolation, artifact export и cleanup. При регрессии исправить код, добавить осмысленную проверку и повторить соответствующий чистый workflow. Записать результат в repository Verification. Разрешение прошлого чата покрывало уже удалённые два клона; scope новых destructive cleanups подтвердить заранее по правилу пользователя.
### 2. Закрыть Monterey и реальный Xcode workflow
Найти и воспроизвести подготовку Monterey с **реально незашифрованными System и Data**, а не только FileVault Off. Затем выполнить нормальное клонирование с новой 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» без проверенной совместимости.
### 3. Завершить 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.
### 4. Подключить 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 через их собственную актуальную документацию и реальную сквозную приёмку.
### 5. Зафиксировать и выпустить принятый результат
Перед 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 объявлять только с перечислением реально прошедшей матрицы и оставшихся ограничений.
## 4. Действующие 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 репозитория.
## 5. Где читать дальше
Каноническая текущая документация находится в локальном 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.