diff --git a/personal/projects/virfield.md b/personal/projects/virfield.md index d1d80557..e51a60f4 100755 --- a/personal/projects/virfield.md +++ b/personal/projects/virfield.md @@ -1,15 +1,15 @@ --- title: Virfield namespace: personal -updated: '2026-10-01' +updated: '2026-10-02' status: candidate-not-production-accepted tags: [virfield, macos, vm, go, infrastructure] --- # Virfield — текущий статус и продолжение -**Следующее действие:** согласовать новый уникальный GHCR tag для повторной clean publication. Защита от неполного manifest установлена; старый tag не использовать. +**Следующее действие:** проверить доступность точного Xcode 13.4.1 / 13F100 archive и диагностировать шифрование Monterey System/Data перед новым live-прогоном. -**Кандидат ещё не production-ready.** Чистая публикация прошла, но опубликованный OCI manifest оказался неполным; pull-back не загрузился. Неудачный импорт удалён с разрешения пользователя. Повторная публикация требует нового tag и отдельного подтверждения внешней записи. +**Кандидат ещё не production-ready.** Sequoia 15.2 прошла clean portable publish → GHCR pull-back → два обычных clone workload → cleanup. Monterey и реальный Xcode workflow ещё не приняты; release gates ниже остаются. Эта заметка содержит только актуальное состояние, оставшийся план и действующие pitfalls. История изменений — в Git; API/команды/runbook — в документации репозитория. @@ -18,19 +18,19 @@ tags: [virfield, macos, vm, go, infrastructure] | Что | Значение | |---|---| | Репозиторий | `/Users/admin/Developer/virfield`, [mallexxx/virfield](https://github.com/mallexxx/virfield) | -| Рабочая ветка / HEAD | `codex/versioned-images` / `165cef8` | -| Рабочее дерево / публикация | Чистое; локально 18 коммитов поверх `origin/codex/versioned-images` (`58c56db`). Новые изменения не пушились, не сливались в main и не выпускались | +| Рабочая ветка / HEAD | `codex/versioned-images` / `3188adb` | +| Рабочее дерево / публикация | Чистое; 22 локальных коммита поверх `origin/codex/versioned-images` (`58c56db`). Новые изменения не пушились, не сливались в main и не выпускались | | Опубликованная база | `main` / `v2.0.0`, commit `ee3aa1d`; это не текущий установленный кандидат | -| Установленный runtime | `165cef8`, `registry_candidate_pending_live_acceptance`, SQLite schema 6; backup `backup-4a1d13a7122c1db46d636bf5e0e85262` проверен | +| Установленный 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 нет. Другие задачи могут занять пул позднее — проверять заново | -**Последняя проверка:** после удаления неудачного import `used: 0`, `available: 2`, активных jobs нет, inventory fresh. `vf-ghcr-sequoia152` остаётся `image_ready` и остановлен. Старый `backend_unavailable` не наблюдается. Lume API service не перезапускался во время активной VM. +**Последняя проверка:** после 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 обновлён из `165cef8` вместе со встроенной Verification (активный MCP-клиент может требовать переподключения). Resolver установленного API отклоняет неполный личный tag с `registry_invalid` и принимает полный публичный `trycua` 15.2. Snapshot прежнего runtime: `upgrades/registry-integrity-165cef8-20261001`. Системный Lume API service остался на предыдущем бинарнике; registry subprocess использует новый проверенный CLI из `image_tools.lume`. +Фактическую версию сервиса проверять по `/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` из предыдущего чата. @@ -49,18 +49,18 @@ Virfield v2 — Go control plane для golden images и одноразовых | 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` | +| 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/доступ | -Sequoia golden получен с диагностикой и operator recovery, **не полностью чистым end-to-end прогоном финального кода**. Чистый новый import/portable round-trip остаётся обязательным перед release acceptance. Два worker-клона после исправлений прошли без ручной починки. +Первый `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`. -- Удалённые E2E-клоны: `lease-54c01094abd7c71b4bde58c715ce0095`, `lease-568d0c97a002f56a81fadeea55c2373b`. +- Удалённые 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; повторить их для финального релиза. @@ -69,7 +69,7 @@ Sequoia golden получен с диагностикой и operator recovery, Настроены `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; видимость пакета инструмент не меняет. +Принят `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 не поддерживается. @@ -77,31 +77,25 @@ Virfield MCP в Codex и Claude Code ещё не зарегистрирован; ## 3. Полный оставшийся план -### 1. Закрыть GHCR round-trip и чистую сборку +### 1. Закрыть Monterey и реальный Xcode workflow -Пул сейчас healthy idle. Из сохранённого `vf-ghcr-sequoia152` повторить clean portable publish только после согласования нового уникального tag и временной VM cleanup. Патч Lume передаёт ошибки дочерних upload-задач и не допускает публикацию 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, документировать доказанный предел, а не выдавать его за поддержку. +Найти и воспроизвести подготовку 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» без проверенной совместимости. -### 3. Завершить production audit +### 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. -### 4. Подключить Codex и Claude, принять агентский workflow +### 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 через их собственную актуальную документацию и реальную сквозную приёмку. -### 5. Зафиксировать и выпустить принятый результат +### 4. Зафиксировать и выпустить принятый результат Перед push ещё раз сравнить local HEAD, установленный runtime и фактические evidence; удалить из acceptance claims всё неподтверждённое. Закоммитить итог, запушить только нужные refs, дождаться CI точного commit, слить в main только v2, собрать и проверить portable release archive/checksums, выпустить новую версию. Номер релиза выбрать после финального scope; существующий `v2.0.0` не переписывать.