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

129 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-01'
status: candidate-not-production-accepted
tags: [virfield, macos, vm, go, infrastructure]
---
# Virfield — текущий статус и продолжение
**Следующее действие:** прочитать эту заметку и локальный `docs/VERIFICATION.md`, проверить свежие Git/runtime/inventory и причину `backend_unavailable` (см. ниже), затем продолжить GHCR publish → pull-back на свободном здоровом пуле.
**Остановлено по просьбе пользователя после успешного E2E двух клонов и их удаления. Новый кандидат ещё не production-ready.** Новые VM, публикация, релиз и подключение клиентов после этой проверки не запускались. Продолжение — в новом чате.
Эта заметка содержит только актуальное состояние, оставшийся план и действующие pitfalls. История изменений — в Git; API/команды/runbook — в документации репозитория.
## 1. Точка остановки
| Что | Значение |
|---|---|
| Репозиторий | `/Users/admin/Developer/virfield`, [mallexxx/virfield](https://github.com/mallexxx/virfield) |
| Рабочая ветка / HEAD | `codex/versioned-images` / `a6cc966` |
| Рабочее дерево / публикация | Чистое; локально 14 коммитов поверх `origin/codex/versioned-images` (`58c56db`) на момент проверки. Новые изменения не пушились, не сливались в main и не выпускались |
| Опубликованная база | `main` / `v2.0.0`, commit `ee3aa1d`; это не текущий установленный кандидат |
| Установленный runtime | `9d0860ed9568b73e7fa83e1972ff3894c801dbc4`, `registry_candidate_pending_live_acceptance`, SQLite schema 6 |
| 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 | Patched Lume `0.5.3-virfield1`; установлен в deployment `tools/lume-0.5.3-virfield1/lume` |
| Пул после E2E | `used: 0`, `available: 2`, активных jobs нет. Другие задачи могут занять пул позднее — проверять заново |
**Последняя проверка при передаче:** после успешной очистки E2E другая задача создала `vf-63a81e3117759f2411ce811a076ce67d`. Два последовательных чтения status вернули `used: 1`, `available: 0`, observation error `backend_unavailable` (Lume state unavailable/stale, admission paused), активных jobs нет. Оба наших клона по-прежнему отсутствуют; golden остаётся `image_ready`. Причина этой новой недоступности в текущем чате не диагностировалась — пользователь попросил остановиться. В новом чате сначала проверить fresh inventory и состояние Lume/чужой аренды; не перезапускать Lume и не останавливать чужую VM без согласования.
Фактическую версию сервиса проверять по `/Users/admin/.virfield-v2/release.json` и hashes. Коммит checkout сам по себе сервис не обновляет. После runtime `9d0860e` были только документальные коммиты: встроенный в установленный MCP Verification ещё не содержит последний результат двух клонов; актуальная приёмка — в локальном checkout. При следующей сборке/установке обновить и встроенные документы.
Схема 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 сохранён |
| `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, 21 Python regression checks, deployment checks, docs), build, staticcheck, `go mod verify` прошли. Установленный 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 в этом acceptance run не опубликовано. Планируемый отдельный тестовый package — `mallexxx/virfield-e2e-sequoia152`. Использовать новый уникальный 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 и чистую сборку
Сначала проверить/разрешить текущий `backend_unavailable` без нарушения чужой аренды; после свежего healthy idle inventory продолжить от сохранённого `vf-ghcr-sequoia152`. Опубликовать portable recipe в push-enabled `personal-ghcr` с новым tag. Проверить job `succeeded`, полученный digest и удаление временной export VM/её private files. При ошибке/неизвестном результате inspect exact job/tag; не повторять публикацию вслепую.
Импортировать опубликованный 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.