docs: consolidate current Virfield release and remove legacy notes
This commit is contained in:
1 parent
0e4202c5de
commit
3c0895e62c
11 files changed
+152
-272
No files matched your search
+4
-2
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Personal Index
|
title: Personal Index
|
||||||
updated: '2026-05-24'
|
updated: '2026-09-30'
|
||||||
type: topic-map
|
type: topic-map
|
||||||
tags:
|
tags:
|
||||||
- index
|
- index
|
||||||
@@ -10,7 +10,7 @@ tags:
|
|||||||
|
|
||||||
> Топик-карта personal/ vault. Поддерживается enrichment воркером (воскресенье 03:00).
|
> Топик-карта personal/ vault. Поддерживается enrichment воркером (воскресенье 03:00).
|
||||||
> **Принцип:** кластеры → hub-note → связанные файлы. Воркер читает эту карту, линкует по ней, дополняет при находке новых кластеров.
|
> **Принцип:** кластеры → hub-note → связанные файлы. Воркер читает эту карту, линкует по ней, дополняет при находке новых кластеров.
|
||||||
> Last updated: 2026-05-24
|
> Last updated: 2026-09-30
|
||||||
|
|
||||||
---
|
---
|
||||||
## 🗒 Списки и задачи
|
## 🗒 Списки и задачи
|
||||||
@@ -132,6 +132,8 @@ Hub: [[personal/projects/media-pipeline-tracker-parsers|Media Pipeline Roadmap]]
|
|||||||
|
|
||||||
## 🛠 Техническая документация (personal)
|
## 🛠 Техническая документация (personal)
|
||||||
|
|
||||||
|
- [[personal/projects/virfield|Virfield — macOS VM control plane]] — релиз, статус и каноническая документация.
|
||||||
|
|
||||||
- [[docker_colima_setup|Docker Colima Setup]]
|
- [[docker_colima_setup|Docker Colima Setup]]
|
||||||
- [[truenas-remote-access-reverse-proxy|TrueNAS Remote Access]]
|
- [[truenas-remote-access-reverse-proxy|TrueNAS Remote Access]]
|
||||||
- [[Swift cross-platform testing|Swift Cross-Platform Testing]]
|
- [[Swift cross-platform testing|Swift Cross-Platform Testing]]
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
# Balda + Prism/Beads + Execution Broker + Callee + Codex
|
# Balda + Prism/Beads + Execution Broker + Callee + Codex
|
||||||
|
|
||||||
> Обновлено: 2026-09-29
|
> Обновлено: 2026-09-30
|
||||||
> Статус: целевая архитектура зафиксирована; Broker и интеграции ещё не реализованы.
|
> Статус: Virfield v2.0.0 опубликован. Этот план описывает целевую интеграцию Balda → Broker → VM → Runner/Callee; сквозная приёмка ещё не подтверждена.
|
||||||
|
> Текущий проект и runbook: [[personal/projects/virfield]].
|
||||||
|
|
||||||
## 1. Цель
|
## 1. Цель
|
||||||
|
|
||||||
@@ -41,32 +42,19 @@ Codex
|
|||||||
→ Prism/Beads + Mattermost
|
→ Prism/Beads + Mattermost
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2. Что уже есть
|
## 2. Подтверждённый статус и оставшаяся интеграция
|
||||||
|
|
||||||
### Подтверждено
|
Virfield v2.0.0 опубликован: Go daemon, leases/images, аутентифицированные HTTP/MCP, SSH isolation, tunnels и embedded console. Live golden/clone E2E и release CI прошли в объёме [[personal/projects/virfield]]. Установленные сервисы используют deployment вне checkout; публикация нового архива не обновляет runtime автоматически.
|
||||||
|
|
||||||
1. Balda работает в Docker на Mac и отвечает в Mattermost.
|
Для полной цепочки остаётся подтвердить:
|
||||||
2. Mattermost-сервер остаётся на Kraken; Balda подключается к нему с Mac.
|
|
||||||
3. Obsidian MCP доступен Balda по `http://host.docker.internal:3101/sse`.
|
|
||||||
4. Virfield MCP работает на хостовом Mac и умеет подготовить VM: clone golden image, start, wait for IP/SSH, create tunnel.
|
|
||||||
5. Host Codex и Claude уже подключены к Virfield MCP.
|
|
||||||
|
|
||||||
### Текущая конфигурация Balda
|
- отдельные deployment и совместимость Execution Broker/Runner;
|
||||||
|
- доступ Broker к реализованному Virfield HTTP API: TLS/routing, credentials и SSH transport из контейнера;
|
||||||
|
- запуск Callee и обратный журнал событий до Balda;
|
||||||
|
- адаптер Balda → Prism/Beads;
|
||||||
|
- сквозной запуск Story → VM → build/test → отчёт с cleanup.
|
||||||
|
|
||||||
- основной provider: DeepSeek через OpenAI-compatible API;
|
Статус остальных проектов и provider-конфигурация проверяются в их собственных источниках; релиз Virfield не является подтверждением их готовности.
|
||||||
- `permissions.mode: allow_all`;
|
|
||||||
- `workspace.mode: off`;
|
|
||||||
- Virfield в Balda не подключён;
|
|
||||||
- Callee CLI и описания агентов находятся в окружении Balda по текущему сетапу, но целевой запуск Callee должен происходить внутри VM.
|
|
||||||
|
|
||||||
### Чего пока нет
|
|
||||||
|
|
||||||
- Execution Broker;
|
|
||||||
- сетевого API управления Virfield для Broker;
|
|
||||||
- VM runner для управляемого запуска Callee;
|
|
||||||
- обратного журнала событий Callee → Balda;
|
|
||||||
- адаптера Balda → Prism/Beads;
|
|
||||||
- подтверждённого сквозного запуска Story → VM → build/test → отчёт.
|
|
||||||
|
|
||||||
## 3. Владельцы ответственности
|
## 3. Владельцы ответственности
|
||||||
|
|
||||||
@@ -119,7 +107,7 @@ Virfield работает на Mac-хосте и владеет жизненны
|
|||||||
- сетевые туннели;
|
- сетевые туннели;
|
||||||
- lease и принудительная уборка VM.
|
- lease и принудительная уборка VM.
|
||||||
|
|
||||||
Для Broker нужен узкий аутентифицированный HTTP API или HTTP MCP-обёртка над этими операциями. Произвольного host shell в этом API нет.
|
Аутентифицированный HTTP API `/api/v1` и HTTP MCP `/mcp` реализованы; daemon слушает loopback. Для Broker остаются проверяемая сетевая доступность и integration contract. Произвольного host shell в API нет.
|
||||||
|
|
||||||
### Callee и Codex — выполнение внутри VM
|
### Callee и Codex — выполнение внутри VM
|
||||||
|
|
||||||
@@ -323,19 +311,11 @@ Callee поддерживает `Parallel`, но это fan-out Role visits вн
|
|||||||
|
|
||||||
Хостовый Virfield API разрешает только операции жизненного цикла VM. Balda и Broker не получают `docker.sock`, пользовательский `~/.ssh` или произвольный shell на Mac.
|
Хостовый Virfield API разрешает только операции жизненного цикла VM. Balda и Broker не получают `docker.sock`, пользовательский `~/.ssh` или произвольный shell на Mac.
|
||||||
|
|
||||||
### Shared folder Lume
|
### Workspace и артефакты
|
||||||
|
|
||||||
Lume монтирует shared folder через virtiofs. Изменения содержимого должны появляться динамически; Lume также умеет добавлять folder к уже запущенной VM без reboot/remount.
|
Текущий recipe Virfield создаёт VM без shared host folders. Код, mutable workspace и Xcode build живут на локальном диске VM; перенос исходников/результатов — через scoped SSH и Git либо `rsync/scp`. Артефакты выгружаются до release lease и получают уникальный путь `run_id/...`.
|
||||||
|
|
||||||
Для mutable workspace и Xcode build shared folder не считается надёжным источником истины. В текущем Virfield уже потребовались `sudo purge` и уникальные DerivedData snapshots из-за stale guest cache.
|
Добавление host mounts потребует отдельного решения по изоляции и проверки согласованности данных; это не часть принятого recipe.
|
||||||
|
|
||||||
Рабочий контракт:
|
|
||||||
|
|
||||||
- репозиторий клонируется на локальный диск VM;
|
|
||||||
- обновления передаются через Git или `rsync/scp`;
|
|
||||||
- shared folder используется для immutable inputs и выгрузки artifacts;
|
|
||||||
- каждый набор artifacts получает уникальный путь `run_id/...`;
|
|
||||||
- Xcode не собирает проект непосредственно из `/Volumes/My Shared Files`.
|
|
||||||
|
|
||||||
### Изменение других хостов
|
### Изменение других хостов
|
||||||
|
|
||||||
@@ -359,7 +339,7 @@ Lume монтирует shared folder через virtiofs. Изменения с
|
|||||||
2. Можно ли запустить workflow pack `prism/story` отдельно от stock plugin host.
|
2. Можно ли запустить workflow pack `prism/story` отдельно от stock plugin host.
|
||||||
3. Как Codex ACP получает workspace/cwd и сохраняет его между Role visits.
|
3. Как Codex ACP получает workspace/cwd и сохраняет его между Role visits.
|
||||||
4. Как передавать cancel в Callee без повреждения terminal result.
|
4. Как передавать cancel в Callee без повреждения terminal result.
|
||||||
5. Какой минимальный Virfield API можно безопасно открыть Broker.
|
5. Как подключить Broker к реализованному Virfield API через TLS/routing и проверить lease/SSH contract из его окружения.
|
||||||
|
|
||||||
### Требует проверки до production
|
### Требует проверки до production
|
||||||
|
|
||||||
@@ -387,63 +367,21 @@ Balda остаётся оркестратором, Broker изолирует и
|
|||||||
|
|
||||||
Будущая transport abstraction в `runtime + acpagent` позволит Balda или Callee подключаться к ACP по WebSocket/Streamable HTTP. Она может заменить SSH-транспорт, но не заменяет Broker, VM lifecycle, durable events и cleanup.
|
Будущая transport abstraction в `runtime + acpagent` позволит Balda или Callee подключаться к ACP по WebSocket/Streamable HTTP. Она может заменить SSH-транспорт, но не заменяет Broker, VM lifecycle, durable events и cleanup.
|
||||||
|
|
||||||
## 13. Аудит Virfield и целевая версия v2
|
## 13. Virfield v2 — реализовано и опубликовано
|
||||||
|
|
||||||
### Что существует сейчас
|
Релиз [v2.0.0](https://github.com/mallexxx/virfield/releases/tag/v2.0.0) опубликован 2026-09-30, commit `ee3aa1d`. Текущая карточка — [[personal/projects/virfield]]; команды и контракты принадлежат документации репозитория.
|
||||||
|
|
||||||
Virfield — TypeScript/Node.js приложение:
|
Реализованы единый Go control plane, SQLite journal, reconciliation, leases/idempotency, resource admission, image pipeline, scoped SSH, cleanup, CLI/MCP и embedded console. Лимит двух VM и неизвестные состояния обрабатываются явно; неопределённая мутация не повторяется автоматически. Personal SSH keys/PAT storage и client-side lifecycle fallback в текущей реализации отсутствуют.
|
||||||
|
|
||||||
- Express + WebSocket backend;
|
Lume остаётся backend; используется закреплённый 0.5.3 с двумя проверенными исправлениями shutdown. Guest automation встроена и версионируется вместе с Go-кодом. Полный golden/clone E2E пройден на одном Mac; Linux/macOS CI и проверки переносимости/секретов прошли для release commit. Точные результаты и непринятый scope — в [Verification](https://github.com/mallexxx/virfield/blob/main/docs/VERIFICATION.md).
|
||||||
- React/Vite Web UI;
|
|
||||||
- SQLite;
|
|
||||||
- отдельный stdio MCP server;
|
|
||||||
- shell/Python provisioning scripts.
|
|
||||||
|
|
||||||
Web UI уже реализован. TypeScript typecheck проходит. Собственной automated test suite практически нет.
|
|
||||||
|
|
||||||
### Подтверждённые архитектурные проблемы
|
|
||||||
|
|
||||||
1. Состояние VM определяется одновременно Lume API, Lume CLI, SQLite, JSON-файлами, PID и in-memory maps.
|
|
||||||
2. REST и MCP дублируют orchestration; MCP вызывает REST, а при ошибке обходит его и управляет Lume напрямую.
|
|
||||||
3. Recovery основан на `pgrep`, `pkill`, PID probing и ручном склеивании stale states.
|
|
||||||
4. Virfield читает личные SSH keys, имеет password fallback `lume`, хранит GitHub PAT в SQLite и предоставляет широкий `vm_ssh_exec`.
|
|
||||||
5. Long-running jobs частично живут только в памяти и теряют нормальную управляемость после restart.
|
|
||||||
|
|
||||||
### Решение: переписать control plane, не Lume
|
|
||||||
|
|
||||||
Lume остаётся hypervisor/backend. Проверенные provisioning scripts временно сохраняются как versioned jobs и постепенно заменяются только при наличии тестов.
|
|
||||||
|
|
||||||
Virfield v2 состоит из пяти частей:
|
|
||||||
|
|
||||||
1. `virfieldd` на Go — единственный владелец SQLite, Lume adapter, VM leases, jobs, events и cleanup; запускается через `launchd`.
|
|
||||||
2. Image Manager — модуль `virfieldd` для download/pull/build/promote golden images; отдельный daemon ему не нужен.
|
|
||||||
3. Web UI — отдельный API client на embedded HTML/HTMX или простом JavaScript без Node toolchain.
|
|
||||||
4. `virfield-mcp` на Go — тонкий stdio/HTTP adapter; не обращается к Lume или SQLite напрямую.
|
|
||||||
5. Execution Broker и Runner на Go — отдельный execution-контур рядом с Balda и внутри workers.
|
|
||||||
|
|
||||||
Один Lume adapter скрывает различия HTTP/CLI. UI, MCP и Broker используют только versioned API `virfieldd`.
|
|
||||||
|
|
||||||
Оценка: Virfield v2 MVP — 7–12 рабочих дней; Broker/Runner — 5–10 дней; UI migration и hardening — ещё 5–8 дней.
|
|
||||||
|
|
||||||
### Граница проектов и репозиториев — принятое решение
|
### Граница проектов и репозиториев — принятое решение
|
||||||
|
|
||||||
`virfield` и `execution-broker` — два независимых проекта. Их нельзя объединять в один репозиторий или один daemon.
|
`virfield` и `execution-broker` — два независимых проекта. Их нельзя объединять в один репозиторий или один daemon.
|
||||||
|
|
||||||
Репозиторий `virfield` содержит только host control plane:
|
Репозиторий `virfield` содержит host control plane: корневой Go module, `cmd/virfieldd`, `cmd/virfield`, `cmd/virfield-mcp`, `cmd/virfield-lume`, реализации в `internal/`, deployment в `deploy/`. Актуальная карта модулей — [Architecture](https://github.com/mallexxx/virfield/blob/main/docs/ARCHITECTURE.md); отдельного каталога приложения v2 нет.
|
||||||
|
|
||||||
```text
|
Целевая структура отдельного `execution-broker` (реализацию сверять в его репозитории):
|
||||||
cmd/virfieldd
|
|
||||||
cmd/virfieldctl
|
|
||||||
cmd/virfield-mcp
|
|
||||||
internal/lume
|
|
||||||
internal/images
|
|
||||||
internal/leases
|
|
||||||
internal/jobs
|
|
||||||
web/
|
|
||||||
api/
|
|
||||||
```
|
|
||||||
|
|
||||||
Новый репозиторий `execution-broker` содержит execution plane:
|
|
||||||
|
|
||||||
```text
|
```text
|
||||||
cmd/broker
|
cmd/broker
|
||||||
@@ -463,11 +401,9 @@ api/
|
|||||||
1. `virfield` управляет VM, images, leases и host-level cleanup; он ничего не знает о Callee, Prism, Beads и model providers.
|
1. `virfield` управляет VM, images, leases и host-level cleanup; он ничего не знает о Callee, Prism, Beads и model providers.
|
||||||
2. `execution-broker` выбирает execution class, запускает Runner/Callee, управляет agent profiles и хранит run event log; он не управляет Lume напрямую.
|
2. `execution-broker` выбирает execution class, запускает Runner/Callee, управляет agent profiles и хранит run event log; он не управляет Lume напрямую.
|
||||||
3. `balda` вызывает Broker по MCP и отражает события в Prism/Beads; Virfield напрямую из Balda не вызывается.
|
3. `balda` вызывает Broker по MCP и отражает события в Prism/Beads; Virfield напрямую из Balda не вызывается.
|
||||||
4. `execution-broker → virfieldd` использует versioned authenticated HTTP API, описанный OpenAPI.
|
4. `execution-broker → virfieldd` использует versioned authenticated HTTP API `/api/v1`; текущие модели и маршруты — `internal/domain`, `internal/httpapi`, `internal/client`. Отдельная OpenAPI-спецификация Virfield в v2.0.0 не опубликована.
|
||||||
5. Общих Go-пакетов между репозиториями нет; совместимость обеспечивается API contract и contract tests.
|
5. Общих Go-пакетов между репозиториями нет; совместимость обеспечивается API contract и contract tests.
|
||||||
|
|
||||||
Старый репозиторий/компонент `agents-bridge` не развивается и не переиспользуется для новой системы. Название `execution-broker` выбрано специально, чтобы не смешивать новый scheduler/event broker со старым SSH/MCP-мостом.
|
|
||||||
|
|
||||||
## 14. Agent profiles и модельная политика
|
## 14. Agent profiles и модельная политика
|
||||||
|
|
||||||
Broker и Runner не содержат vendor-specific workflow logic. Run выбирает `agent_profile` из статического allowlist.
|
Broker и Runner не содержат vendor-specific workflow logic. Run выбирает `agent_profile` из статического allowlist.
|
||||||
@@ -478,7 +414,7 @@ Worker image содержит Runner, Callee и нужные provider binaries.
|
|||||||
|
|
||||||
### Распределение моделей
|
### Распределение моделей
|
||||||
|
|
||||||
Схема `Balda → Callee → coding agent` остаётся правильной. Текущее назначение DeepSeek единственным оркестратором не оптимально: Balda использует один app-scoped provider для всех sessions.
|
Схема `Balda → Callee → coding agent` остаётся правильной. Provider для Balda и профили исполнителей настраиваются в соответствующих проектах; конкретное назначение не фиксируется в плане Virfield.
|
||||||
|
|
||||||
Рекомендуемая раскладка:
|
Рекомендуемая раскладка:
|
||||||
|
|
||||||
@@ -528,27 +464,21 @@ DeepSeek подходит для ограниченного routing и прос
|
|||||||
|
|
||||||
## 16. План реализации
|
## 16. План реализации
|
||||||
|
|
||||||
### Этап 1 — live spike контрактов, 1–2 дня
|
### Этап 1 — live spike интеграционных контрактов
|
||||||
|
|
||||||
1. Запустить Virfield и Lume и проверить clone/start/stop/delete без fallback paths.
|
1. **Выполнено для Virfield:** clone/start/stop/delete, SSH readiness и cleanup проверены live; повтор для полного Broker/Runner flow входит в сквозную приёмку.
|
||||||
2. Проверить stale-cache сценарии shared folder и зафиксировать Git/rsync contract.
|
2. Проверить передачу workspace/artifacts через Git/scoped SSH на локальный диск VM; shared host folders в recipe отсутствуют.
|
||||||
3. Запустить один Callee workflow вручную внутри тестовой VM.
|
3. Запустить один Callee workflow вручную внутри тестовой VM.
|
||||||
4. Проверить Codex ACP, Human pause/resume, cancel и terminal result.
|
4. Проверить Codex ACP, Human pause/resume, cancel и terminal result.
|
||||||
5. Принять versioned contracts Virfield API и VM Runner.
|
5. Принять versioned contracts Virfield API и VM Runner.
|
||||||
|
|
||||||
Результат: фактические runtime-контракты без предположений.
|
Результат: фактические runtime-контракты без предположений.
|
||||||
|
|
||||||
### Этап 2 — Virfield v2 core, 7–12 дней
|
### Этап 2 — Virfield v2 core: завершён 2026-09-30
|
||||||
|
|
||||||
1. Реализовать `virfieldd` и единую SQLite job/event model.
|
Результат опубликован как `v2.0.0`: один владелец VM/images, durable jobs/events, API/CLI/MCP/UI, image automation и проверенная переносимая сборка. Выполненные задачи не остаются в backlog. Непринятые проверки перечислены в [[personal/projects/virfield]] и repository Verification.
|
||||||
2. Реализовать один Lume adapter и reconciliation loop.
|
|
||||||
3. Добавить leases, idempotency, quotas, audit и cleanup.
|
|
||||||
4. Подключить существующие image/provisioning scripts как jobs.
|
|
||||||
5. Реализовать Go CLI/MCP adapters и минимальный Web UI.
|
|
||||||
|
|
||||||
Результат: один надёжный владелец VM и images без Node runtime.
|
### Этап 3 — универсальный Runner
|
||||||
|
|
||||||
### Этап 3 — универсальный Runner, 2–4 дня
|
|
||||||
|
|
||||||
1. Описать versioned JSON protocol command/event.
|
1. Описать versioned JSON protocol command/event.
|
||||||
2. Реализовать start, events, Human response и cancel.
|
2. Реализовать start, events, Human response и cancel.
|
||||||
@@ -558,7 +488,7 @@ DeepSeek подходит для ограниченного routing и прос
|
|||||||
|
|
||||||
Результат: один протокол запускает workflow в VM или container и возвращает структурированные события.
|
Результат: один протокол запускает workflow в VM или container и возвращает структурированные события.
|
||||||
|
|
||||||
### Этап 4 — Broker MVP, 3–6 дней
|
### Этап 4 — Broker MVP
|
||||||
|
|
||||||
1. Реализовать SQLite schema для runs, events, responses и artifacts.
|
1. Реализовать SQLite schema для runs, events, responses и artifacts.
|
||||||
2. Реализовать state machine и транзакционный event journal.
|
2. Реализовать state machine и транзакционный event journal.
|
||||||
@@ -568,7 +498,7 @@ DeepSeek подходит для ограниченного routing и прос
|
|||||||
|
|
||||||
Результат: Balda управляет долговечным run через HTTP MCP.
|
Результат: Balda управляет долговечным run через HTTP MCP.
|
||||||
|
|
||||||
### Этап 5 — Balda + Prism, 2–4 дня
|
### Этап 5 — Balda + Prism
|
||||||
|
|
||||||
1. Подключить Broker MCP к runtime Balda.
|
1. Подключить Broker MCP к runtime Balda.
|
||||||
2. Развернуть Prism adapter и Dolt/Beads container.
|
2. Развернуть Prism adapter и Dolt/Beads container.
|
||||||
@@ -578,7 +508,7 @@ DeepSeek подходит для ограниченного routing и прос
|
|||||||
|
|
||||||
Результат: Story ведётся в Beads, выполнение и approvals видны в Mattermost.
|
Результат: Story ведётся в Beads, выполнение и approvals видны в Mattermost.
|
||||||
|
|
||||||
### Этап 6 — сквозная приёмка, 1–2 дня
|
### Этап 6 — сквозная приёмка
|
||||||
|
|
||||||
1. Создать Story из реального сообщения Mattermost.
|
1. Создать Story из реального сообщения Mattermost.
|
||||||
2. Пройти specify/design/approval/implement/review/verify.
|
2. Пройти specify/design/approval/implement/review/verify.
|
||||||
@@ -588,7 +518,7 @@ DeepSeek подходит для ограниченного routing и прос
|
|||||||
|
|
||||||
Результат: воспроизводимый end-to-end прогон без исполнения агентских команд на хосте.
|
Результат: воспроизводимый end-to-end прогон без исполнения агентских команд на хосте.
|
||||||
|
|
||||||
Оценка после spike: рабочий end-to-end MVP — 17–30 рабочих дней. Срок сильнее всего зависит от Callee machine API, Lume reconciliation и переноса Web UI.
|
Срок оставшихся этапов определяется после сверки текущего Broker/Runner и проверки Callee/Prism контрактов.
|
||||||
|
|
||||||
## 17. Критерии готовности
|
## 17. Критерии готовности
|
||||||
|
|
||||||
@@ -603,7 +533,6 @@ DeepSeek подходит для ограниченного routing и прос
|
|||||||
|
|
||||||
## Связанные заметки
|
## Связанные заметки
|
||||||
|
|
||||||
|
- [[personal/projects/virfield]] — текущий релиз, подтверждённый scope и каноническая документация.
|
||||||
|
|
||||||
- [[personal/tech/callee-prism]] — контракты Callee, ACP и Prism.
|
- [[personal/tech/callee-prism]] — контракты Callee, ACP и Prism.
|
||||||
- [[personal/tech/agents-bridge]] — предыдущий мост; не часть целевой схемы.
|
|
||||||
- [[personal/tech/balda-executor-mcp]] — предыдущий исполнитель; не часть целевой схемы.
|
|
||||||
- [[personal/plans/balda-mm-phase4-agents]] — история предыдущей интеграции.
|
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
# Hermes Eagle — example config (tokens redacted)
|
# Hermes Eagle — example config (tokens redacted)
|
||||||
# Source: ~/.hermes/config.yaml
|
# Source: ~/.hermes/config.yaml
|
||||||
# Copy back: cp this ~/.hermes/config.yaml (then restore api_key from password manager)
|
# Reference only: merge required settings into the active config; do not overwrite it.
|
||||||
|
# Virfield entry updated 2026-09-30; replace placeholders before use.
|
||||||
|
|
||||||
model:
|
model:
|
||||||
default: claude-sonnet-4-6
|
default: claude-sonnet-4-6
|
||||||
@@ -26,10 +27,14 @@ mcp_servers:
|
|||||||
command: mcpvault
|
command: mcpvault
|
||||||
args:
|
args:
|
||||||
- /Users/admin/obsidian
|
- /Users/admin/obsidian
|
||||||
ddg-vm:
|
# Virfield v2: copy paths/args from deployment launchd/mcp.json.
|
||||||
command: npx
|
# Replace /ABSOLUTE/DEPLOYMENT; no token values belong in this example.
|
||||||
|
virfield:
|
||||||
|
command: /ABSOLUTE/DEPLOYMENT/bin/virfield-mcp
|
||||||
args:
|
args:
|
||||||
- tsx
|
- -url
|
||||||
- /Users/admin/Developer/virfield/server/mcp-server.ts
|
- http://127.0.0.1:7780
|
||||||
|
- -token-file
|
||||||
|
- /ABSOLUTE/DEPLOYMENT/token
|
||||||
|
|
||||||
# zulip / api keys — restored from password manager
|
# zulip / api keys — restored from password manager
|
||||||
@@ -108,7 +108,7 @@ PID-file-based — survives Dashboard restarts without crashing.
|
|||||||
| claude_proxy_node | Claude Proxy (node) | localhost | daemon |
|
| claude_proxy_node | Claude Proxy (node) | localhost | daemon |
|
||||||
| claude_proxy_python | Claude Proxy (python) | localhost | daemon |
|
| claude_proxy_python | Claude Proxy (python) | localhost | daemon |
|
||||||
| asana_mcp | Asana MCP | localhost | daemon |
|
| asana_mcp | Asana MCP | localhost | daemon |
|
||||||
| virfield | Virfield | localhost | daemon |
|
| virfield | [[personal/projects/virfield\|Virfield v2]] | `127.0.0.1:7780` by default | separate system LaunchDaemons; dashboard integration not verified |
|
||||||
|
|
||||||
### ML
|
### ML
|
||||||
|
|
||||||
@@ -328,7 +328,7 @@ When a launchd cron is created and `launchctl print gui/<uid>/<label>` shows `la
|
|||||||
- Backend create now rejects non-`every` for launchd (frontend validator also blocks)
|
- Backend create now rejects non-`every` for launchd (frontend validator also blocks)
|
||||||
- `_list_launchd_crons()` now shows ALL plists (schedule: "none (manual)" if no StartInterval/StartCalendarInterval)
|
- `_list_launchd_crons()` now shows ALL plists (schedule: "none (manual)" if no StartInterval/StartCalendarInterval)
|
||||||
|
|
||||||
**Virfield port conflict** — if previously a LaunchAgent (plist deleted but still loaded), stop it: `launchctl stop com.virfield.server && launchctl remove com.virfield.server`.
|
**Virfield (обновлено 2026-09-30):** lifecycle сервисов принадлежит system LaunchDaemons `ai.virfield.virfieldd` и `ai.virfield.lume`, работающим от VM owner. Диагностика конфликтов портов и service update — по [Operations](https://github.com/mallexxx/virfield/blob/main/docs/OPERATIONS.md#system-services). Интеграция Dashboard с этими jobs отдельно не проверялась; текущий статус проекта — [[personal/projects/virfield]].
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,6 @@ executor-autonomous (LLM agent, every 30 min)
|
|||||||
- runs gh CLI (GitHub: open PRs, check CI, push branches)
|
- runs gh CLI (GitHub: open PRs, check CI, push branches)
|
||||||
- posts full reasoning trace to Discord thread
|
- posts full reasoning trace to Discord thread
|
||||||
- posts completion comment to Asana task
|
- posts completion comment to Asana task
|
||||||
- optionally: runs virfield VM tests (recording pass)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
This job was **paused** on 2026-05-11 in the "Include UI Tests screencasts" thread. Replaced by:
|
This job was **paused** on 2026-05-11 in the "Include UI Tests screencasts" thread. Replaced by:
|
||||||
@@ -122,7 +121,6 @@ During the live period, the executor autonomously:
|
|||||||
- Read source code from `apple-browsers.git` local checkout
|
- Read source code from `apple-browsers.git` local checkout
|
||||||
- Posted CI/status updates to Discord
|
- Posted CI/status updates to Discord
|
||||||
- Posted Asana comments (unauthorized — see Section 3)
|
- Posted Asana comments (unauthorized — see Section 3)
|
||||||
- Managed virfield VM lifecycle (clone, start, run tests, stop, delete)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -215,8 +213,7 @@ These are co-workers whose PR authorship was surfaced in Discord via `gh pr list
|
|||||||
|
|
||||||
### 3.5 Infrastructure details disclosed
|
### 3.5 Infrastructure details disclosed
|
||||||
|
|
||||||
- VM names: `uitest-26.4.1-golden`, `uitest-17-pinned-rec`, `uitest-bug08-rec`, `uitest-bug08b-rec`, `uitest-tooltip-rec`, `uitest-bug02-rec`, `macos-15-golden`
|
- Local paths: `/Users/admin/DuckDuckGo/apple-browsers.git/`, `/Users/admin/Developer/personal-os/`
|
||||||
- Local paths: `/Users/admin/DuckDuckGo/apple-browsers.git/`, `/Users/admin/VMShare/`, `/Users/admin/Developer/personal-os/`
|
|
||||||
- DB schema: `executor_queue`, `executor_runs`, field names, state values
|
- DB schema: `executor_queue`, `executor_runs`, field names, state values
|
||||||
- Hermes cron job IDs: `24fcdd1b40e0`, `62768b8cccad`, `531b242c30ad`, `e409b72d23a1`
|
- Hermes cron job IDs: `24fcdd1b40e0`, `62768b8cccad`, `531b242c30ad`, `e409b72d23a1`
|
||||||
|
|
||||||
@@ -357,7 +354,7 @@ The comment capability was the floor. Full account CRUD was the ceiling.
|
|||||||
| GitHub PR data | PR numbers, titles, descriptions, review comments, CI status | PRs #4483, #4541, #4548, #4559, #4591, #4608, #4609, #4610, #4611 |
|
| GitHub PR data | PR numbers, titles, descriptions, review comments, CI status | PRs #4483, #4541, #4548, #4559, #4591, #4608, #4609, #4610, #4611 |
|
||||||
| Source code | File paths, function names, grep matches, code fragments | Swift files from `apple-browsers`, Cursor rules |
|
| Source code | File paths, function names, grep matches, code fragments | Swift files from `apple-browsers`, Cursor rules |
|
||||||
| Team member names | PR authors, reviewers | brindy, federicocappelli, pikorddg, jaceklyp, jleandroperez, Sam S |
|
| Team member names | PR authors, reviewers | brindy, federicocappelli, pikorddg, jaceklyp, jleandroperez, Sam S |
|
||||||
| Infrastructure | VM names, local file paths, DB schema, cron IDs | Full list in Section 3.5 |
|
| Infrastructure | Local file paths, DB schema, cron IDs | Full list in Section 3.5 |
|
||||||
| Planning data | Daily briefs, task priorities, AOR assignments, inbox summaries | Entire `#daily-brief` channel history |
|
| Planning data | Daily briefs, task priorities, AOR assignments, inbox summaries | Entire `#daily-brief` channel history |
|
||||||
|
|
||||||
**Data confirmed NOT sent to Discord:**
|
**Data confirmed NOT sent to Discord:**
|
||||||
@@ -399,8 +396,7 @@ Primary locations:
|
|||||||
| **Anthropic/Claude API** | Execute (LLM) | `CLAUDE_CODE_OAUTH_TOKEN` in `~/.hermes/.env` | Active. Primary executor engine. |
|
| **Anthropic/Claude API** | Execute (LLM) | `CLAUDE_CODE_OAUTH_TOKEN` in `~/.hermes/.env` | Active. Primary executor engine. |
|
||||||
| **OpenRouter** | Execute (LLM fallback) | `OPENROUTER_API_KEY` in `~/.hermes/.env` | Active. |
|
| **OpenRouter** | Execute (LLM fallback) | `OPENROUTER_API_KEY` in `~/.hermes/.env` | Active. |
|
||||||
| **Telegram** | Write | `TELEGRAM_BOT_TOKEN` in `~/.hermes/.env` | Active. Not used by executor. |
|
| **Telegram** | Write | `TELEGRAM_BOT_TOKEN` in `~/.hermes/.env` | Active. Not used by executor. |
|
||||||
| **virfield / ddg-vm MCP** | VM lifecycle (clone/start/stop) | Local MCP server at `~/Developer/virfield/` | Used by recording-pass workers. |
|
| **macOS filesystem** | Read + Write | User session | Full read of apple-browsers checkout, personal-os. Write to logs, worktrees, prompts. |
|
||||||
| **macOS filesystem** | Read + Write | User session | Full read of apple-browsers checkout, VMShare, personal-os. Write to logs, worktrees, prompts. |
|
|
||||||
| **PostgreSQL (personal_os)** | Read + Write | Local, no auth | executor_queue, executor_runs, stories, tasks tables. |
|
| **PostgreSQL (personal_os)** | Read + Write | Local, no auth | executor_queue, executor_runs, stories, tasks tables. |
|
||||||
| **Zulip** | Read + Write | `ZULIP_API_KEY` in `~/.hermes/.env` | Active. Post-migration platform. |
|
| **Zulip** | Read + Write | `ZULIP_API_KEY` in `~/.hermes/.env` | Active. Post-migration platform. |
|
||||||
| **Obsidian vault** | Read + Write | Local MCP server | Full vault access. |
|
| **Obsidian vault** | Read + Write | Local MCP server | Full vault access. |
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
namespace: work
|
namespace: work
|
||||||
tags: [system, architecture]
|
tags: [system, architecture]
|
||||||
last_updated: 2026-04-28
|
last_updated: 2026-04-28
|
||||||
|
virfield_updated: 2026-09-30
|
||||||
confidence: 1.0
|
confidence: 1.0
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ See: `personal-os-purpose.md`
|
|||||||
- Worktree at `~/DuckDuckGo/apple-browsers.git/.claude/worktrees/executor-{gid}-{slug}/`
|
- Worktree at `~/DuckDuckGo/apple-browsers.git/.claude/worktrees/executor-{gid}-{slug}/`
|
||||||
- Always `git fetch origin main` + branch from `origin/main`
|
- Always `git fetch origin main` + branch from `origin/main`
|
||||||
- State machine in `executor_runs` table
|
- State machine in `executor_runs` table
|
||||||
- For UI tests: spins VM via ddg-vm MCP (virfield), cleans up on PR close/merge
|
- UI-test VM lifecycle uses Virfield leases with explicit release/expiry cleanup; Runner integration is a separate acceptance step. See [[personal/projects/virfield]].
|
||||||
|
|
||||||
**Eagle commands in #executor**:
|
**Eagle commands in #executor**:
|
||||||
| Command | Effect |
|
| Command | Effect |
|
||||||
@@ -130,7 +131,7 @@ Executor runs
|
|||||||
**Claude Code / `claude -p` sessions:**
|
**Claude Code / `claude -p` sessions:**
|
||||||
| Name | Command | Used for |
|
| Name | Command | Used for |
|
||||||
|------|---------|---------|
|
|------|---------|---------|
|
||||||
| ddg-vm | `npx tsx ~/Developer/virfield/server/mcp-server.ts` | VM lifecycle for UI tests |
|
| virfield | Installed `virfield-mcp`; use the generated deployment `launchd/mcp.json` | VM leases/images; see [[personal/projects/virfield]] |
|
||||||
| obsidian | `/opt/homebrew/bin/obsidian-mcp ~/obsidian` | Vault access |
|
| obsidian | `/opt/homebrew/bin/obsidian-mcp ~/obsidian` | Vault access |
|
||||||
|
|
||||||
## launchd Agents
|
## launchd Agents
|
||||||
|
|||||||
@@ -79,7 +79,6 @@ Autonomous worker: evaluates backlog → picks task → spawns sub-agent in Disc
|
|||||||
- Xcode scheme: `DuckDuckGo macOS`, `.xcworkspace` required, xcbeautify required
|
- Xcode scheme: `DuckDuckGo macOS`, `.xcworkspace` required, xcbeautify required
|
||||||
- PR template: `pull-request.mdc` strict gates overridden by Executor v2 (task known, reviewer=@me, description auto-generated)
|
- PR template: `pull-request.mdc` strict gates overridden by Executor v2 (task known, reviewer=@me, description auto-generated)
|
||||||
- Cleanup: `git worktree remove --force` + `git push --delete` + stop/delete VM
|
- Cleanup: `git worktree remove --force` + `git push --delete` + stop/delete VM
|
||||||
- UI test VM: ddg-vm MCP at `~/Developer/virfield/server/mcp-server.ts`, VirtualBuddy at `~/Documents/VirtualBuddy/`
|
|
||||||
|
|
||||||
## Tech debt
|
## Tech debt
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
title: Virfield
|
||||||
|
namespace: personal
|
||||||
|
updated: '2026-09-30'
|
||||||
|
status: released
|
||||||
|
tags: [virfield, macos, vm, go, infrastructure]
|
||||||
|
---
|
||||||
|
# Virfield
|
||||||
|
|
||||||
|
**Релиз:** [v2.0.0](https://github.com/mallexxx/virfield/releases/tag/v2.0.0), опубликован 2026-09-30; commit `ee3aa1d8f5906bfe591d76c0af2afd73bcad9fba`.
|
||||||
|
**Репозиторий:** [mallexxx/virfield](https://github.com/mallexxx/virfield). В `main` только Go-реализация; предыдущая реализация сохранена исключительно в Git-ветке `v1`.
|
||||||
|
|
||||||
|
## Что работает
|
||||||
|
|
||||||
|
Virfield — host control plane для одноразовых macOS VM: подготовка и проверка golden image, leases, clone/start/SSH readiness, отдельные SSH credentials для каждого lease, tunnels, expiry и cleanup. Лимит — не более двух VM с явным `capacity_exhausted`; очередь выполнения принадлежит Broker.
|
||||||
|
|
||||||
|
Четыре бинарника: `virfieldd`, `virfield`, `virfield-mcp`, `virfield-lume`. Web console встроена в daemon. CLI, stdio/HTTP MCP и UI обращаются к единому аутентифицированному API. Произвольного shell API и доступа к личным SSH-ключам нет.
|
||||||
|
|
||||||
|
## Источники истины
|
||||||
|
|
||||||
|
Obsidian хранит статус проекта и связи. Команды, конфигурацию и контракты поддерживаем в документации репозитория, без копирования runbook в заметки.
|
||||||
|
|
||||||
|
| Документ | Назначение |
|
||||||
|
|---|---|
|
||||||
|
| [README](https://github.com/mallexxx/virfield/blob/main/README.md) | Входная точка, структура и сборка |
|
||||||
|
| [Operations](https://github.com/mallexxx/virfield/blob/main/docs/OPERATIONS.md) | Установка, пути, сервисы, MCP, leases и backup |
|
||||||
|
| [Image pipeline](https://github.com/mallexxx/virfield/blob/main/docs/IMAGE-PIPELINE.md) | Golden image, зависимости, guest policy и recovery |
|
||||||
|
| [Architecture](https://github.com/mallexxx/virfield/blob/main/docs/ARCHITECTURE.md) | Модули, границы API и инварианты |
|
||||||
|
| [Verification](https://github.com/mallexxx/virfield/blob/main/docs/VERIFICATION.md) | Подтверждённые проверки и оставшиеся ограничения |
|
||||||
|
|
||||||
|
## Развёртывание и переносимость
|
||||||
|
|
||||||
|
VM-хостинг требует Apple Silicon Mac, patched Lume 0.5.3 и документированных image tools. Поддерживаемый guest — macOS 27 build `26A428`; полный профиль `uitest-27-v1` требует Xcode 27+. Суффикс recipe и `/api/v1` обозначают версии контрактов, а не старое приложение.
|
||||||
|
|
||||||
|
Каталог deployment задаётся оператором вне checkout. `deploy/prepare-services.py` берёт реального пользователя, HOME, пути и порты из конфигурации; токены не встраиваются в MCP-файлы. По умолчанию console/API — `127.0.0.1:7780`, Lume — `127.0.0.1:7777`; удалённое/container подключение требует отдельного TLS/routing setup.
|
||||||
|
|
||||||
|
На текущем Mac deployment расположен в `~/.virfield-v2`, VM-диски — в `~/.lume`. Это выбранные локальные пути, не требования к другой установке. System LaunchDaemons `ai.virfield.virfieldd` и `ai.virfield.lume` работают от владельца VM. По проверенному `release.json` установленный runtime остаётся на `44a1c15`; публикация `v2.0.0` сама по себе не обновляла сервис. Установку/обновление выполняем по Operations, не из каталога исходников.
|
||||||
|
|
||||||
|
## Проверено и что остаётся
|
||||||
|
|
||||||
|
[GitHub Actions Linux/macOS](https://github.com/mallexxx/virfield/actions/runs/36675247578) прошёл для релизного коммита. Подтверждены сборка с пустыми HOME/Go caches, deployment smoke с другими путями/портами, проверки зависимостей, секретов всей истории и релизного архива. Архив содержит четыре бинарника, source/docs, dependency notices и checksums; бинарники ad-hoc signed, без Apple notarization.
|
||||||
|
|
||||||
|
На одном физическом Mac пройдены реальный IPSW download/resume, полный golden build с Assistant/Recovery/SIP/provisioning, два изолированных clone, отказ третьему, SSH/tunnels и cleanup. Второй физический хост, длительный soak, оставшиеся crash points и восстановление VM-дисков пока не приняты. Проверки snapshot не заменяют VM-disk disaster recovery.
|
||||||
|
|
||||||
|
## Pitfalls
|
||||||
|
|
||||||
|
- `acquire` принимает job; работать по SSH можно только после lease `ready`.
|
||||||
|
- Running external VM и незавершённый cleanup занимают capacity; освобождать слот ручным редактированием SQLite нельзя.
|
||||||
|
- Неизвестный результат мутации требует inspection/recovery; повторный start/clone/delete вслепую недопустим.
|
||||||
|
- `release` удаляет disposable VM: результаты нужно выгрузить заранее.
|
||||||
|
- State backup не содержит VM-диски и IPSW cache; восстановление дисков проверяется отдельно.
|
||||||
|
|
||||||
|
## Связь с другими проектами
|
||||||
|
|
||||||
|
Целевая цепочка: `Balda → Execution Broker → Virfield → VM → Runner/Callee`. Virfield владеет VM, Broker — очередью и run lifecycle, Runner/Callee — выполнением внутри VM. Полный сценарий из Balda не подтверждён релизом Virfield; состояние остальных проектов проверяется отдельно.
|
||||||
|
|
||||||
|
- [[personal/plans/balda-callee-prism-plan]] — целевая интеграция и оставшаяся приёмка.
|
||||||
|
- [[work/wiki/apple-browsers/vm-ui-testing]] — применение VM leases для UI-тестов.
|
||||||
@@ -91,7 +91,6 @@ executor-autonomous (LLM agent, every 30 min)
|
|||||||
- runs gh CLI (GitHub: open PRs, check CI, push branches)
|
- runs gh CLI (GitHub: open PRs, check CI, push branches)
|
||||||
- posts full reasoning trace to Discord thread
|
- posts full reasoning trace to Discord thread
|
||||||
- posts completion comment to Asana task
|
- posts completion comment to Asana task
|
||||||
- optionally: runs virfield VM tests (recording pass)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
This job was **paused** on 2026-05-11 in the "Include UI Tests screencasts" thread. Replaced by:
|
This job was **paused** on 2026-05-11 in the "Include UI Tests screencasts" thread. Replaced by:
|
||||||
@@ -113,7 +112,6 @@ During the live period, the executor autonomously:
|
|||||||
- Read source code from `apple-browsers.git` local checkout
|
- Read source code from `apple-browsers.git` local checkout
|
||||||
- Posted CI/status updates to Discord
|
- Posted CI/status updates to Discord
|
||||||
- Posted Asana comments (unauthorized — see Section 3)
|
- Posted Asana comments (unauthorized — see Section 3)
|
||||||
- Managed virfield VM lifecycle (clone, start, run tests, stop, delete)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -206,8 +204,7 @@ These are co-workers whose PR authorship was surfaced in Discord via `gh pr list
|
|||||||
|
|
||||||
### 3.5 Infrastructure details disclosed
|
### 3.5 Infrastructure details disclosed
|
||||||
|
|
||||||
- VM names: `uitest-26.4.1-golden`, `uitest-17-pinned-rec`, `uitest-bug08-rec`, `uitest-bug08b-rec`, `uitest-tooltip-rec`, `uitest-bug02-rec`, `macos-15-golden`
|
- Local paths: `/Users/admin/DuckDuckGo/apple-browsers.git/`, `/Users/admin/Developer/personal-os/`
|
||||||
- Local paths: `/Users/admin/DuckDuckGo/apple-browsers.git/`, `/Users/admin/VMShare/`, `/Users/admin/Developer/personal-os/`
|
|
||||||
- DB schema: `executor_queue`, `executor_runs`, field names, state values
|
- DB schema: `executor_queue`, `executor_runs`, field names, state values
|
||||||
- Hermes cron job IDs: `24fcdd1b40e0`, `62768b8cccad`, `531b242c30ad`, `e409b72d23a1`
|
- Hermes cron job IDs: `24fcdd1b40e0`, `62768b8cccad`, `531b242c30ad`, `e409b72d23a1`
|
||||||
|
|
||||||
@@ -348,7 +345,7 @@ The comment capability was the floor. Full account CRUD was the ceiling.
|
|||||||
| GitHub PR data | PR numbers, titles, descriptions, review comments, CI status | PRs #4483, #4541, #4548, #4559, #4591, #4608, #4609, #4610, #4611 |
|
| GitHub PR data | PR numbers, titles, descriptions, review comments, CI status | PRs #4483, #4541, #4548, #4559, #4591, #4608, #4609, #4610, #4611 |
|
||||||
| Source code | File paths, function names, grep matches, code fragments | Swift files from `apple-browsers`, Cursor rules |
|
| Source code | File paths, function names, grep matches, code fragments | Swift files from `apple-browsers`, Cursor rules |
|
||||||
| Team member names | PR authors, reviewers | brindy, federicocappelli, pikorddg, jaceklyp, jleandroperez, Sam S |
|
| Team member names | PR authors, reviewers | brindy, federicocappelli, pikorddg, jaceklyp, jleandroperez, Sam S |
|
||||||
| Infrastructure | VM names, local file paths, DB schema, cron IDs | Full list in Section 3.5 |
|
| Infrastructure | Local file paths, DB schema, cron IDs | Full list in Section 3.5 |
|
||||||
| Planning data | Daily briefs, task priorities, AOR assignments, inbox summaries | Entire `#daily-brief` channel history |
|
| Planning data | Daily briefs, task priorities, AOR assignments, inbox summaries | Entire `#daily-brief` channel history |
|
||||||
|
|
||||||
**Data confirmed NOT sent to Discord:**
|
**Data confirmed NOT sent to Discord:**
|
||||||
@@ -390,8 +387,7 @@ Primary locations:
|
|||||||
| **Anthropic/Claude API** | Execute (LLM) | `CLAUDE_CODE_OAUTH_TOKEN` in `~/.hermes/.env` | Active. Primary executor engine. |
|
| **Anthropic/Claude API** | Execute (LLM) | `CLAUDE_CODE_OAUTH_TOKEN` in `~/.hermes/.env` | Active. Primary executor engine. |
|
||||||
| **OpenRouter** | Execute (LLM fallback) | `OPENROUTER_API_KEY` in `~/.hermes/.env` | Active. |
|
| **OpenRouter** | Execute (LLM fallback) | `OPENROUTER_API_KEY` in `~/.hermes/.env` | Active. |
|
||||||
| **Telegram** | Write | `TELEGRAM_BOT_TOKEN` in `~/.hermes/.env` | Active. Not used by executor. |
|
| **Telegram** | Write | `TELEGRAM_BOT_TOKEN` in `~/.hermes/.env` | Active. Not used by executor. |
|
||||||
| **virfield / ddg-vm MCP** | VM lifecycle (clone/start/stop) | Local MCP server at `~/Developer/virfield/` | Used by recording-pass workers. |
|
| **macOS filesystem** | Read + Write | User session | Full read of apple-browsers checkout, personal-os. Write to logs, worktrees, prompts. |
|
||||||
| **macOS filesystem** | Read + Write | User session | Full read of apple-browsers checkout, VMShare, personal-os. Write to logs, worktrees, prompts. |
|
|
||||||
| **PostgreSQL (personal_os)** | Read + Write | Local, no auth | executor_queue, executor_runs, stories, tasks tables. |
|
| **PostgreSQL (personal_os)** | Read + Write | Local, no auth | executor_queue, executor_runs, stories, tasks tables. |
|
||||||
| **Zulip** | Read + Write | `ZULIP_API_KEY` in `~/.hermes/.env` | Active. Post-migration platform. |
|
| **Zulip** | Read + Write | `ZULIP_API_KEY` in `~/.hermes/.env` | Active. Post-migration platform. |
|
||||||
| **Obsidian vault** | Read + Write | Local MCP server | Full vault access. |
|
| **Obsidian vault** | Read + Write | Local MCP server | Full vault access. |
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ source: ~/DuckDuckGo/apple-browsers.git/main/.github/workflows/
|
|||||||
confidence: 1.0
|
confidence: 1.0
|
||||||
namespace: work
|
namespace: work
|
||||||
last_updated: 2026-04-28
|
last_updated: 2026-04-28
|
||||||
|
virfield_updated: 2026-09-30
|
||||||
tags: [ci, github-actions, xcodebuild, testing, build]
|
tags: [ci, github-actions, xcodebuild, testing, build]
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -121,31 +122,16 @@ set -o pipefail && xcodebuild test-without-building \
|
|||||||
2>&1 | xcbeautify
|
2>&1 | xcbeautify
|
||||||
```
|
```
|
||||||
|
|
||||||
**Option B — Via VM (virfield/ddg-vm MCP, matches CI environment):**
|
**Option B — Via a Virfield VM lease:**
|
||||||
```
|
|
||||||
# 1. Build on host first (DerivedData must exist)
|
|
||||||
xcodebuild build-for-testing -scheme "macOS UI Tests CI" -derivedDataPath DerivedData ...
|
|
||||||
|
|
||||||
# 2. Start VM session
|
Virfield v2 provides a prepared VM, scoped SSH and lifecycle cleanup. Build/test
|
||||||
vm_prepare_session() → { vmName, ip }
|
execution and result collection belong to Runner/Executor, using the VM's local
|
||||||
|
disk. See [[work/wiki/apple-browsers/vm-ui-testing]] for the current flow and
|
||||||
|
[[personal/projects/virfield]] for the release and installation reference.
|
||||||
|
|
||||||
# 3. Run tests in VM
|
The new Broker/Runner → apple-browsers UI-test integration is not yet accepted.
|
||||||
run_tests(vm_id: vmName, scheme: "DuckDuckGo macOS", workspace: "<VMShare path>")
|
The current Virfield recipe targets macOS 27/Xcode 27+, so equivalence with the
|
||||||
|
project's CI/Xcode version must be checked explicitly for the chosen branch.
|
||||||
# 4. Poll
|
|
||||||
get_test_run_status(vm_id: vmName, run_id: run_id)
|
|
||||||
get_test_results(vm_id: vmName, run_id: run_id)
|
|
||||||
|
|
||||||
# 5. On failure: inspect
|
|
||||||
peekaboo_image(vm_id: vmName)
|
|
||||||
get_crash_reports(vm_id: vmName)
|
|
||||||
|
|
||||||
# 6. Always clean up
|
|
||||||
vm_stop(vm_id: vmName)
|
|
||||||
vm_delete(vm_id: vmName)
|
|
||||||
```
|
|
||||||
|
|
||||||
See `vm-ui-testing.md` for full ddg-vm MCP reference.
|
|
||||||
|
|
||||||
### Key notes
|
### Key notes
|
||||||
|
|
||||||
@@ -217,6 +203,6 @@ Key differences from CI:
|
|||||||
|
|
||||||
## Cross-Reference
|
## Cross-Reference
|
||||||
|
|
||||||
- `vm-ui-testing.md` — full virfield/ddg-vm MCP reference for VM-based UI tests
|
- [[work/wiki/apple-browsers/vm-ui-testing]] — current Virfield lease flow and UI-test integration boundary
|
||||||
- `testing.mdc` → `testing.md` — UITestCase patterns, feature flag setup in tests
|
- `testing.mdc` → `testing.md` — UITestCase patterns, feature flag setup in tests
|
||||||
- `development-commands.mdc` → `development-commands.md` — team-approved xcodebuild flags
|
- `development-commands.mdc` → `development-commands.md` — team-approved xcodebuild flags
|
||||||
@@ -1,126 +1,34 @@
|
|||||||
---
|
---
|
||||||
source: ~/Developer/virfield/
|
source: https://github.com/mallexxx/virfield/tree/v2.0.0
|
||||||
confidence: 1.0
|
confidence: 1.0
|
||||||
namespace: work
|
namespace: work
|
||||||
last_updated: 2026-04-28
|
last_updated: 2026-09-30
|
||||||
tags: [ui-testing, vm, virfield, ddg-vm, xcode]
|
tags: [ui-testing, vm, virfield, xcode]
|
||||||
---
|
---
|
||||||
|
# VM UI Testing — Virfield
|
||||||
|
|
||||||
# VM UI Testing — virfield / ddg-vm MCP
|
Текущий host manager — Virfield v2.0.0 на Go. Карточка проекта: [[personal/projects/virfield]]. Эта заметка описывает границу UI-test integration; установка, API/MCP и команды поддерживаются в [Operations](https://github.com/mallexxx/virfield/blob/main/docs/OPERATIONS.md).
|
||||||
|
|
||||||
**What it is**: macOS VM lifecycle console + MCP server for AI-driven UI test automation.
|
## Поток UI-теста
|
||||||
**How it runs**: Golden image (built once) → APFS CoW clone per test session → run → delete.
|
|
||||||
**MCP config**: `~/Developer/virfield/server/mcp-server.ts` (configured in `.claude/.mcp.json` as `ddg-vm`)
|
|
||||||
**Web UI**: `http://localhost:5173` (requires `npm run dev` in `~/Developer/virfield/`)
|
|
||||||
|
|
||||||
---
|
1. Получить lease подготовленного image с отдельным caller-owned SSH public key через CLI/API или MCP `vm_acquire`; дождаться состояния `ready`.
|
||||||
|
2. По pinned SSH перенести/клонировать исходники на локальный диск VM и запустить build/test внутри гостя. Runner/Executor отвечает за команды, Xcode scheme и сбор результатов.
|
||||||
|
3. Выгрузить `.xcresult`, логи и screenshots до освобождения lease.
|
||||||
|
4. Вызвать `vm_release` и проверить завершение cleanup; expiry также запускает cleanup. Освобождение lease удаляет disposable VM.
|
||||||
|
|
||||||
## Standard Agent Flow for UI Tests
|
Virfield управляет VM и соединением, а не выполняет XCUITest workflow через MCP. Протокол Runner/Broker и полный автоматический UI-test flow требуют отдельной интеграционной приёмки. Гостевые Peekaboo/tools устанавливаются full image profile, но host MCP не экспортирует их UI-команды.
|
||||||
|
|
||||||
### Step 1 — Start a session (single call)
|
## Ограничения
|
||||||
|
|
||||||
```
|
- Максимум две macOS VM с учётом внешних VM и reservations; `capacity_exhausted` — повод поставить run в очередь Broker.
|
||||||
vm_prepare_session()
|
- Успешный acquire означает принятый job, не готовность гостя. Использовать lease только после `ready`.
|
||||||
```
|
- Recipe не монтирует host shared folders. Build workspace находится в VM; личные host SSH keys и provider credentials не запекаются в golden.
|
||||||
|
- Поддерживается macOS 27 build `26A428`; full UI-test profile требует Xcode 27+. Совместимость этого guest/toolchain с конкретной веткой apple-browsers проверяется отдельно.
|
||||||
|
- Реальный golden/clone E2E Virfield прошёл на одном Mac. Это не подтверждение XCUITest run для apple-browsers через новый Broker/Runner.
|
||||||
|
|
||||||
This does everything in sequence: clone golden → start VM → wait for SSH → wait for Peekaboo ready.
|
## Ссылки
|
||||||
Returns `{ vmName, ip }`. Use `vmName` in all subsequent calls.
|
|
||||||
|
|
||||||
### Step 2 — Run XCUITests
|
- [Image pipeline](https://github.com/mallexxx/virfield/blob/main/docs/IMAGE-PIPELINE.md) — golden preparation и guest policy.
|
||||||
|
- [Verification](https://github.com/mallexxx/virfield/blob/main/docs/VERIFICATION.md) — фактическая приёмка и оставшиеся проверки.
|
||||||
```
|
- [[work/wiki/apple-browsers/ci-pipeline]] — CI проекта и требования к Xcode.
|
||||||
run_tests(
|
- [[work/wiki/apple-browsers/ui-testing]] — правила самих UI-тестов.
|
||||||
vm_id: vmName,
|
|
||||||
scheme: "DuckDuckGo macOS",
|
|
||||||
workspace: "<VMShare path to DuckDuckGo-macOS.xcworkspace>"
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
Returns `run_id` immediately. Poll with:
|
|
||||||
|
|
||||||
```
|
|
||||||
get_test_run_status(vm_id: vmName, run_id: run_id)
|
|
||||||
get_test_results(vm_id: vmName, run_id: run_id)
|
|
||||||
```
|
|
||||||
|
|
||||||
Uses pre-built `xctestrun` from `VMShare/DerivedData` — build must happen on host first.
|
|
||||||
|
|
||||||
### Step 3 — Inspect failures
|
|
||||||
|
|
||||||
```
|
|
||||||
peekaboo_image(vm_id: vmName) # screenshot
|
|
||||||
peekaboo_see(vm_id: vmName, app: "...") # AX tree
|
|
||||||
ax_snapshot(vm_id: vmName, app: "...", name: "before")
|
|
||||||
ax_diff_last(vm_id: vmName, app: "...") # what changed
|
|
||||||
get_crash_reports(vm_id: vmName) # crash logs
|
|
||||||
get_log_stream(vm_id: vmName, path: "...", lines: 50)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 4 — Cleanup (ALWAYS — especially from Executor)
|
|
||||||
|
|
||||||
```
|
|
||||||
vm_stop(vm_id: vmName)
|
|
||||||
vm_delete(vm_id: vmName)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Executor must call these before removing its worktree.** Never leave orphaned VMs.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## All MCP Tools
|
|
||||||
|
|
||||||
| Tool | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `vm_list` | List all VMs with state, IP, checklist status |
|
|
||||||
| `vm_prepare_session` | **Main entry point** — clone + start + wait for ready |
|
|
||||||
| `vm_start` | Start a VM (optionally clone from golden first) |
|
|
||||||
| `vm_stop` | Stop a running VM |
|
|
||||||
| `vm_clone_golden` | APFS CoW clone from golden image |
|
|
||||||
| `vm_delete` | Delete a VM (run VMs only, never golden) |
|
|
||||||
| `vm_get_ip` | Get IP of running VM |
|
|
||||||
| `vm_status` | Full status including Peekaboo connection state |
|
|
||||||
| `vm_ssh_exec` | Run a shell command in VM via SSH |
|
|
||||||
| `run_tests` | Launch XCUITests in VM (returns run_id immediately) |
|
|
||||||
| `get_test_run_status` | Poll whether xcodebuild is still running |
|
|
||||||
| `get_test_results` | Parse test result artifacts for a run_id |
|
|
||||||
| `get_crash_reports` | Read crash reports from VM |
|
|
||||||
| `get_log_stream` | Tail a log file from VM |
|
|
||||||
| `peekaboo_see` | Dump AX accessibility tree for an app |
|
|
||||||
| `peekaboo_image` | Screenshot from VM |
|
|
||||||
| `peekaboo_click` | Click by query / element ID / coords |
|
|
||||||
| `peekaboo_type` | Type text in VM |
|
|
||||||
| `peekaboo_hotkey` | Send hotkey (e.g. cmd+s) |
|
|
||||||
| `peekaboo_scroll` | Scroll in VM |
|
|
||||||
| `peekaboo_list_apps` | List running apps in VM |
|
|
||||||
| `peekaboo_permissions` | Check Screen Recording / Accessibility permissions |
|
|
||||||
| `ax_snapshot` | Take named AX snapshot for later diff |
|
|
||||||
| `ax_diff_last` | Diff current AX state vs last snapshot |
|
|
||||||
| `ax_diff` | Diff two named snapshots by ID |
|
|
||||||
| `ax_query` | Query elements from latest snapshot |
|
|
||||||
| `vm_build_golden` | Build golden VM from IPSW (full 4-phase pipeline) |
|
|
||||||
| `vm_get_build_state` | Poll golden build progress |
|
|
||||||
| `vm_list_recordings` | List VNC recordings from build logs |
|
|
||||||
| `vm_list_screenshots` | List screenshots from build logs |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Executor Integration
|
|
||||||
|
|
||||||
When the Executor needs UI tests (bug requires visual verification):
|
|
||||||
|
|
||||||
1. Call `vm_prepare_session()` after build succeeds
|
|
||||||
2. Call `run_tests()` with the scheme
|
|
||||||
3. Poll `get_test_run_status()` / `get_test_results()`
|
|
||||||
4. On failure: capture `peekaboo_image()` + `get_crash_reports()` for diagnosis
|
|
||||||
5. **Always** `vm_stop()` + `vm_delete()` before worktree cleanup
|
|
||||||
|
|
||||||
See also: `ui-testing.md` — Swift UITestCase patterns, feature flag setup, test structure.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
- VMs require Apple Silicon + lume (`brew install trycua/tap/lume`)
|
|
||||||
- Golden image must be built and provisioned before test runs work
|
|
||||||
- `run_tests` uses pre-built xctestrun — **build on host before running in VM**
|
|
||||||
- Peekaboo (AX/screenshot proxy) must be running inside the VM — `vm_prepare_session` handles this
|
|
||||||
Reference in new issue
Block a user