diff --git a/family/documents/movies-watchlist.md b/family/documents/movies-watchlist.md index 26a56448..5cb2ed05 100755 --- a/family/documents/movies-watchlist.md +++ b/family/documents/movies-watchlist.md @@ -18,6 +18,7 @@ related: - "[[family/documents/karaoke-songs]]" --- ## Новинки - 👍/👎 + - [ ] 🗓️ [Фьорд](https://www.kinopoisk.ru/film/7029820/) (2026) IMDb 7.6 KP 7.2 - [ ] [Человек-паук: Новый день](https://www.kinopoisk.ru/film/5494049/) (2026) IMDb 8.1 KP 8.0 - [ ] 🧟‍♀️ [Обсессия](https://www.kinopoisk.ru/film/10355286/) (2025) IMDb 8.1 KP 6.9 - [ ] [Мандалорец и Грогу](https://www.kinopoisk.ru/film/5437088/) (2026) IMDb 6.8 KP 7.0 @@ -87,7 +88,7 @@ related: - [ ] 🧟‍♀️ [28 лет спустя: Храм костей](https://www.kinopoisk.ru/film/6745035/) (2026) IMDb 7.4 KP 6.7 - [ ] [Баллада об острове Уоллис](https://www.kinopoisk.ru/film/7411830/) (2025) IMDb 7.4 KP 6.9 - [ ] Одиссея 2026 - - [ ] ❓ Приятель 2026 😨 + - [ ] 🧟‍♀️ Приятель 2026 😨 - [ ] девять 2009 - Девять (2009) ★7.0 - Девять Семь Семь (2006) ★4.6 @@ -108,8 +109,8 @@ related: - [ ] Triangle of Sadness 2022 - [ ] ❓ Babylon - Вавилон (2022) ★7.3 - - Babylon (2019) ★6.0 - - Babylon (2004) ★0.0 + - Вавилон (2014) ★6.6 + - Вавилон 5 (1994) ★8.0 - [ ] Everything Everywhere All at Once 2022 - Всё везде и сразу (2022) ★7.7 - Almost Everything You Ever Wanted to Know About Everything Everywhere All at Once (2022) ★10.0 @@ -146,7 +147,7 @@ related: - [ ] ❓ Злая 2024 - Cattiva (1991) ★7.5 - Злая наука (2004) ★8.2 - - Злая шутка (2016) ★7.0 + - Злая сказка (1989) ★6.0 - [ ] ⬇️ Не оставляй следов - [ ] ⬇️ Очень странные дела - [ ] Джеймс Кемерон морские приключения? 2024 @@ -242,7 +243,7 @@ related: - [ ] Convoy - [ ] Красный шелк - [ ] 🗓️ Без лица (1997/2011/2025) - - [ ] ❓ Дворец полански + - [ ] Дворец полански - [ ] ❓ Space merchants - [ ] ❓ All systems red - [ ] Transformers one @@ -285,7 +286,7 @@ related: - [ ] Past lives - [ ] In the Grey - [ ] Flow 2024 - - [ ] ❓ Волки + - [ ] 🗓️ Волки (2014/2009/2025) - Волки (1981) ★5.9 - Wolves (2009) ★6.0 - Волки (2025) ★0.0 @@ -373,9 +374,9 @@ related: - [ ] ❓ ⬇️Семь жизней - [ ] 🧟‍♀️ Хижина в лесу - [ ] ❓ Орлеан - - Орлеан (2015) ★4.5 + - Орлеан (2015) ★4.6 - Морская полиция: Новый Орлеан (2014) ★7.3 - - Мальчишник в Новом Орлеане (2011) ★5.7 + - The Messenger: The Story of Joan of Arc (1999) ★6.4 - [ ] ⬇️Русь изначальная - [ ] ❓ ⬇️Spy - [ ] ⬇️Под электрическими облаками @@ -491,14 +492,14 @@ related: - [ ] Race for Glory Audi vs Lancia - [ ] ❓ Left behind - Оставленные (2014) ★4.3 - - Left Behind (2026) ★10.0 - - Left Behind (2016) ★0.0 + - Left Behind (2000) ★4.2 + - Left behind (None) ★0.0 - [ ] Point blank - [ ] 🧟‍♀️ Resident evil - [ ] 🧟‍♀️ The dead don't die - [ ] What's next - [ ] ❓ Альфа - - Альфа (2025) ★6.2 + - Альфа (2018) ★6.6 - Альфа (2026) ★5.1 - Альфа (2020) ★0.0 - [ ] ❓ Загадочное убийство diff --git a/family/documents/movies-watchlist.md.bak-questions b/family/documents/movies-watchlist.md.bak-questions index b43e50a4..ffe40596 100755 --- a/family/documents/movies-watchlist.md.bak-questions +++ b/family/documents/movies-watchlist.md.bak-questions @@ -18,6 +18,7 @@ related: - "[[family/documents/karaoke-songs]]" --- ## Новинки - 👍/👎 + - [ ] 🗓️ [Фьорд](https://www.kinopoisk.ru/film/7029820/) (2026) IMDb 7.6 KP 7.2 - [ ] [Человек-паук: Новый день](https://www.kinopoisk.ru/film/5494049/) (2026) IMDb 8.1 KP 8.0 - [ ] 🧟‍♀️ [Обсессия](https://www.kinopoisk.ru/film/10355286/) (2025) IMDb 8.1 KP 6.9 - [ ] [Мандалорец и Грогу](https://www.kinopoisk.ru/film/5437088/) (2026) IMDb 6.8 KP 7.0 @@ -87,7 +88,7 @@ related: - [ ] 🧟‍♀️ [28 лет спустя: Храм костей](https://www.kinopoisk.ru/film/6745035/) (2026) IMDb 7.4 KP 6.7 - [ ] [Баллада об острове Уоллис](https://www.kinopoisk.ru/film/7411830/) (2025) IMDb 7.4 KP 6.9 - [ ] Одиссея 2026 - - [ ] ❓ Приятель 2026 😨 + - [ ] 🧟‍♀️ Приятель 2026 😨 - [ ] девять 2009 - Девять (2009) ★7.0 - Девять Семь Семь (2006) ★4.6 @@ -108,8 +109,8 @@ related: - [ ] Triangle of Sadness 2022 - [ ] ❓ Babylon - Вавилон (2022) ★7.3 - - Babylon (2019) ★6.0 - - Babylon (2004) ★0.0 + - Вавилон (2014) ★6.6 + - Вавилон 5 (1994) ★8.0 - [ ] Everything Everywhere All at Once 2022 - Всё везде и сразу (2022) ★7.7 - Almost Everything You Ever Wanted to Know About Everything Everywhere All at Once (2022) ★10.0 @@ -146,7 +147,7 @@ related: - [ ] ❓ Злая 2024 - Cattiva (1991) ★7.5 - Злая наука (2004) ★8.2 - - Злая шутка (2016) ★7.0 + - Злая сказка (1989) ★6.0 - [ ] ⬇️ Не оставляй следов - [ ] ⬇️ Очень странные дела - [ ] Джеймс Кемерон морские приключения? 2024 @@ -242,7 +243,7 @@ related: - [ ] Convoy - [ ] Красный шелк - [ ] 🗓️ Без лица (1997/2011/2025) - - [ ] ❓ Дворец полански + - [ ] Дворец полански - [ ] ❓ Space merchants - [ ] ❓ All systems red - [ ] Transformers one @@ -285,7 +286,7 @@ related: - [ ] Past lives - [ ] In the Grey - [ ] Flow 2024 - - [ ] ❓ Волки + - [ ] 🗓️ Волки (2014/2009/2025) - Волки (1981) ★5.9 - Wolves (2009) ★6.0 - Волки (2025) ★0.0 @@ -373,9 +374,9 @@ related: - [ ] ❓ ⬇️Семь жизней - [ ] 🧟‍♀️ Хижина в лесу - [ ] ❓ Орлеан - - Орлеан (2015) ★4.5 + - Орлеан (2015) ★4.6 - Морская полиция: Новый Орлеан (2014) ★7.3 - - Мальчишник в Новом Орлеане (2011) ★5.7 + - The Messenger: The Story of Joan of Arc (1999) ★6.4 - [ ] ⬇️Русь изначальная - [ ] ❓ ⬇️Spy - [ ] ⬇️Под электрическими облаками @@ -491,14 +492,14 @@ related: - [ ] Race for Glory Audi vs Lancia - [ ] ❓ Left behind - Оставленные (2014) ★4.3 - - Left Behind (2026) ★10.0 - - Left Behind (2016) ★0.0 + - Left Behind (2000) ★4.2 + - Left behind (None) ★0.0 - [ ] Point blank - [ ] 🧟‍♀️ Resident evil - [ ] 🧟‍♀️ The dead don't die - [ ] What's next - [ ] ❓ Альфа - - Альфа (2025) ★6.2 + - Альфа (2018) ★6.6 - Альфа (2026) ★5.1 - Альфа (2020) ★0.0 - [ ] ❓ Загадочное убийство diff --git a/family/how-to/htpc-bazzite-ecosystem.md b/family/how-to/htpc-bazzite-ecosystem.md index 46b2209a..ec88ad21 100755 --- a/family/how-to/htpc-bazzite-ecosystem.md +++ b/family/how-to/htpc-bazzite-ecosystem.md @@ -20,7 +20,7 @@ Synthesis across [[htpc-bazzite-proton]], [[tech/htpc-steam-emulators]], [[tech/htpc-kodi-layout]], and [[tech/htpc-magic4pc]]. Intel i7-6800K / RX 570 / Bazzite 44 at `192.168.1.86`. Connected to -LG webOS TV (`192.168.1.75`) via HDMI. +LG webOS TV (`192.168.1.70`, Ethernet) via HDMI. ## Mode Map diff --git a/family/how-to/htpc-system.md b/family/how-to/htpc-system.md index f3f5715e..1ff6d493 100755 --- a/family/how-to/htpc-system.md +++ b/family/how-to/htpc-system.md @@ -6,7 +6,7 @@ - RAM: 32 GB - GPU: AMD Radeon RX 570 - Подключение к TV: HDMI -- TV: LG webOS (192.168.1.75) +- TV: LG webOS (Ethernet `192.168.1.70`) - HTPC IP: 192.168.1.86 ## Контроллеры @@ -128,7 +128,19 @@ Sleep управляется `htpc-sleep-guard` — Python-скрипт + system | `htpc-sleep-guard` | **active/enabled** | актуальный guard (SSH + торренты + rsync-файл) | | `transmission-sleep-guard` | disabled | старый, отключён (дублировал и держал ингибитор постоянно) | -### Логика guard +### Редизайн guard — nudge вместо ингибитора (задеплоен 2026-10-11 14:51) + +**Инцидент 2026-10-11 14:10:** guard (правка 08.10 в рамках virfield) сам вызвал suspend через 30 мин после отпускания удержания — во время игровой сессии. Игровая активность в условиях guard не проверялась (SSH/торренты/rsync-файл/чужие block-ингибиторы, которых gamescope не ставит). + +**Дизайн (активен):** Steam (`-steamdeck`, gamescope) — единственный инициатор сна; его idle-таймер нативно уважает геймпад/игру. Guard НЕ ставит systemd-inhibit и НЕ вызывает suspend. Пока выполняются условия удержания (SSH-сессия / дневные торренты+15-мин cooldown / `/tmp/rsync-active`) — guard каждые 60 с шлёт nudge: `xdotool mousemove_relative ±1px` на дисплей сессии (Steam PID → DISPLAY/XAUTHORITY; канал XTest в Xwayland — тот же, что у magic4pc, доказано), fallback — `key F13`. Условия кончились → nudge прекращается → Steam сам усыпляет по своему таймауту. Ночь (23–11): без nudge даже с торрентами + RTC-wake 11:00 (NOPASSWD rtcwake на месте). + +**Живой запуск 14:51:09:** `started (nudge design)` → `[nudge] start: Active SSH session` → `[nudge] xdotool OK`; ингибиторов guard не ставит. Бэкап: `~/htpc-sleep-guard.py.bak-20261011` (предыдущая версия — `.bak-20261008`). + +**Питфолы:** Xwayland в gamescope не поддерживает MIT-SCREEN-SAVER — X-idle замерить нельзя (всегда 0), проверка только поведенческая; ctypes-XSSI без restype=c_void_p сегфолтит; uupd применяет staged-обновления с перезагрузкой как только машина idle (2026-10-11 15:14, kernel 6.17.7→7.2.8); `sleep infinity` в ps — entrypoint контейнера Transmission, не guard. + +**Приёмка (2026-10-11, обе фазы PASS):** удержание — 21 мин пустого SSH с nudge каждые 60 с, 0 suspend; само-сон — после остановки nudge машина уснула сама в 16:22 (~67 мин после последней активности, инициатор logind/Steam idle), проспала 42 мин стабильного S3, разбужена WoL (B0:6E:BF:60:6D:64, magic packet на 192.168.1.255:9/7). Guard в само-соне не участвовал. Бонус: баг мгновенного пробуждения из S3 (XHC/GLAN, июль) не воспроизвёлся на ядре 7.2.8 — 42 мин стабильного сна. Эмпирический idle-таймаут Steam ≈ 60–70 мин. uupd (авто-обновление Bazzite) применяет staged-обновления с перезагрузкой как только машина idle — без block-inhibit это происходит сразу после отпускания nudge (наблюдалось 2026-10-11 15:14, kernel 6.17.7→7.2.8). `sleep infinity` в `ps` на HTPC — entrypoint контейнера Transmission (cgroup libpod-payload), не guard. + +### Логика guard (до 2026-10-11, заменяется) **Всегда (вне зависимости от времени):** - Активная SSH сессия → держит inhibitor (HTPC не спит) @@ -542,4 +554,4 @@ systemd-inhibit --what=sleep:idle --who=rsync-storage-backup --why="Data transfe ```sudo bazzite ALL=(ALL) NOPASSWD: /usr/bin/systemctl bazzite ALL=(ALL) NOPASSWD: /usr/bin/rsync -``` \ No newline at end of file +``` diff --git a/family/how-to/htpc-tplink-wrt-wol.md b/family/how-to/htpc-tplink-wrt-wol.md index c2ecf712..85a7060c 100755 --- a/family/how-to/htpc-tplink-wrt-wol.md +++ b/family/how-to/htpc-tplink-wrt-wol.md @@ -1,7 +1,13 @@ -# HTPC за TPLink WRT — WOL через роутер +# HTPC за TPLink WRT — старая схема (заменена 2026-10-07) + +> **Текущее состояние (проверено 2026-10-07):** Bazzite HTPC подключён Ethernet напрямую к ASUS RT-AC68U, без промежуточного TP-Link. Интерфейс `enp0s31f6`, DHCP reservation на ASUS: MAC `B0:6E:BF:60:6D:64` → `192.168.1.86`, имя `htpc`. `htpc` через DNS ASUS (`192.168.1.1`) разрешается в `192.168.1.86`. Линк HTPC: **1000 Mb/s, full duplex**; ASUS Port 4 показывает `1000FD` и MAC HTPC. +> +> Конфигурация ниже описывает прежнее подключение HTPC к LAN TP-Link через Wi-Fi uplink. Она больше не относится к текущему пути HTPC. WOL-прокси `socat` и маршрут через TP-Link для прямого Ethernet-соединения не нужны. Удалённое состояние TP-Link не менялось. ## Схема сети +### Старая схема (до 2026-10-07) + ``` Главная сеть: 192.168.1.0/24 (основной роутер) │ diff --git a/family/how-to/htpc-webos-luna.md b/family/how-to/htpc-webos-luna.md index da851b56..651afb3d 100755 --- a/family/how-to/htpc-webos-luna.md +++ b/family/how-to/htpc-webos-luna.md @@ -1,41 +1,41 @@ # WebOS TV — luna-send via SSH -TV IP: `192.168.1.75`, user: `root` +TV IP: `192.168.1.70` (Ethernet), user: `root` ## Проблема `luna-send` пишет вывод в tty, не в stdout. Через SSH без PTY — пусто. ## Решение — через `script` ```bash -ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://...\" /tmp/o.txt; cat /tmp/o.txt" +ssh root@192.168.1.70 "script -q -c \"luna-send -n 1 -f luna://...\" /tmp/o.txt; cat /tmp/o.txt" ``` ## Методы ### Список запущенных приложений ```bash -ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.service.applicationmanager/running '{}'\" /tmp/o.txt; cat /tmp/o.txt" +ssh root@192.168.1.70 "script -q -c \"luna-send -n 1 -f luna://com.webos.service.applicationmanager/running '{}'\" /tmp/o.txt; cat /tmp/o.txt" ``` ### Закрыть приложение ```bash -ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.service.applicationmanager/closeByAppId '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt" +ssh root@192.168.1.70 "script -q -c \"luna-send -n 1 -f luna://com.webos.service.applicationmanager/closeByAppId '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt" ``` ### Удалить приложение (dev) ```bash -ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.appInstallService/dev/remove '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt" +ssh root@192.168.1.70 "script -q -c \"luna-send -n 1 -f luna://com.webos.appInstallService/dev/remove '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt" ``` ### Установить ipk ```bash -scp app.ipk root@192.168.1.75:/tmp/ -ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.appInstallService/dev/install '{\"id\":\"APP_ID\",\"ipkUrl\":\"/tmp/app.ipk\",\"subscribe\":true}'\" /tmp/o.txt; cat /tmp/o.txt" +scp app.ipk root@192.168.1.70:/tmp/ +ssh root@192.168.1.70 "script -q -c \"luna-send -n 1 -f luna://com.webos.appInstallService/dev/install '{\"id\":\"APP_ID\",\"ipkUrl\":\"/tmp/app.ipk\",\"subscribe\":true}'\" /tmp/o.txt; cat /tmp/o.txt" ``` ### Запустить приложение ```bash -ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.applicationManager/launch '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt" +ssh root@192.168.1.70 "script -q -c \"luna-send -n 1 -f luna://com.webos.applicationManager/launch '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt" ``` ## Не работает diff --git a/family/how-to/htpc.md b/family/how-to/htpc.md index 620907ba..3ce67e72 100755 --- a/family/how-to/htpc.md +++ b/family/how-to/htpc.md @@ -3,6 +3,15 @@ **IP:** 192.168.1.86 **OS:** Bazzite (Linux) +## Сеть (проверено 2026-10-07) + +- Подключён Ethernet напрямую к ASUS RT-AC68U; промежуточный TP-Link больше не используется. +- Интерфейс: `enp0s31f6`; IPv4 получает по DHCP. +- ASUS DHCP reservation: MAC `B0:6E:BF:60:6D:64` → `192.168.1.86` (`htpc`). +- DNS: `htpc` → `192.168.1.86` через `192.168.1.1`. +- Ethernet link: **1000 Mb/s, full duplex**. +- Старая схема с TP-Link: [[htpc-tplink-wrt-wol]] (историческая). + ## Wake on LAN **MAC:** `B0:6E:BF:60:6D:64` diff --git a/family/how-to/magic4pc-webos.md b/family/how-to/magic4pc-webos.md index 5934ed65..316b951e 100755 --- a/family/how-to/magic4pc-webos.md +++ b/family/how-to/magic4pc-webos.md @@ -12,6 +12,12 @@ - `inputBackKey()` → Esc в gamescope, x1 в KDE - Репо: https://github.com/mallexxx/magic4pc_altclient (ветка `main`) +## Текущая сеть (проверено 2026-10-08) + +- TV по Ethernet: `192.168.1.70` (MAC `ac:5a:f0:25:11:c6`); старый Wi-Fi IP `.75` не использовать. +- HTPC-клиент по умолчанию подключается к `192.168.1.70:42831`; после обновления клиент запущен, ошибок повторного подключения нет. +- WoL MAC HTPC: `B0:6E:BF:60:6D:64`. Проверить/обновить сохранённый WoL MAC в TV-приложении: сейчас там `60:6e:bf:60:6d:64` (не совпадает). + ## Исходники | Компонент | Путь | @@ -69,7 +75,7 @@ NODE_OPTIONS=--openssl-legacy-provider npm run build > ⚠️ Оба аргумента `dist/ service/` обязательны — иначе сервис не попадёт в IPK. > ⚠️ `npm run package` = `ares-package -n` (unsigned) — **не использовать**, TV отклоняет. -## Деплой на TV (192.168.1.75) +## Деплой на TV (192.168.1.70) ### Правильный способ — deploy.sh @@ -92,14 +98,14 @@ cd ~/Developer/magic4pc/webos cd ~/Developer/magic4pc/webos NODE_OPTIONS=--openssl-legacy-provider npm run build /Users/admin/webOS_TV_SDK/CLI/bin/ares-package dist/ service/ --outdir . -scp me.wouterdek.magic4pc_1.1.0_all.ipk root@192.168.1.75:/tmp/magic4pc.ipk +scp me.wouterdek.magic4pc_1.1.0_all.ipk root@192.168.1.70:/tmp/magic4pc.ipk ~/Automation/tv-luna-send.sh -n 1 -f luna://com.webos.service.applicationmanager/closeByAppId '{"id":"me.wouterdek.magic4pc"}' || true ~/Automation/tv-luna-send.sh -n 1 -f luna://com.webos.appInstallService/dev/remove '{"id":"me.wouterdek.magic4pc"}' || true sleep 2 # install — через прямой script (luna-send -i не работает через враппер) -ssh root@192.168.1.75 "script -q -c \"luna-send -i -f luna://com.webos.appInstallService/dev/install '{\\\"id\\\":\\\"me.wouterdek.magic4pc\\\",\\\"ipkUrl\\\":\\\"/tmp/magic4pc.ipk\\\",\\\"subscribe\\\":true}'\" /tmp/install.txt & +ssh root@192.168.1.70 "script -q -c \"luna-send -i -f luna://com.webos.appInstallService/dev/install '{\\\"id\\\":\\\"me.wouterdek.magic4pc\\\",\\\"ipkUrl\\\":\\\"/tmp/magic4pc.ipk\\\",\\\"subscribe\\\":true}'\" /tmp/install.txt & for i in \$(seq 1 30); do sleep 1; grep -q '\"state\":\"installed\"' /tmp/install.txt 2>/dev/null && break; done kill %1 2>/dev/null; grep -v '^Script ' /tmp/install.txt; rm -f /tmp/install.txt" @@ -164,8 +170,8 @@ Magic4pc автоматически запускает выбранный app п ```bash # Деплой -scp tv-scripts/init.d-magic4pc.sh root@192.168.1.75:/var/lib/webosbrew/init.d/magic4pc -ssh root@192.168.1.75 "chmod +x /var/lib/webosbrew/init.d/magic4pc" +scp tv-scripts/init.d-magic4pc.sh root@192.168.1.70:/var/lib/webosbrew/init.d/magic4pc +ssh root@192.168.1.70 "chmod +x /var/lib/webosbrew/init.d/magic4pc" # Применяется после ребута TV ``` @@ -175,14 +181,14 @@ ssh root@192.168.1.75 "chmod +x /var/lib/webosbrew/init.d/magic4pc" ```bash # Лог UI (appendLogPersist пишет сюда) -ssh root@192.168.1.75 "tail -30 /tmp/m4p_debug.log" +ssh root@192.168.1.70 "tail -30 /tmp/m4p_debug.log" # Run-state -ssh root@192.168.1.75 "cat /tmp/magic4pc-run-state" +ssh root@192.168.1.70 "cat /tmp/magic4pc-run-state" # Settings / last-app -ssh root@192.168.1.75 "cat $PERSISTENT_DIR/magic4pc-settings" -ssh root@192.168.1.75 "cat $PERSISTENT_DIR/magic4pc-last-app" +ssh root@192.168.1.70 "cat $PERSISTENT_DIR/magic4pc-settings" +ssh root@192.168.1.70 "cat $PERSISTENT_DIR/magic4pc-last-app" ``` > ⚠️ `appendLog()` пишет **только в UI**. В файл попадает только `appendLogPersist()`. При отладке использовать `appendLogPersist`. diff --git a/family/how-to/router-bishkek-asus.md b/family/how-to/router-bishkek-asus.md index 6dccdd0f..f2ce5905 100755 --- a/family/how-to/router-bishkek-asus.md +++ b/family/how-to/router-bishkek-asus.md @@ -97,7 +97,7 @@ address=/tv/192.168.1.75 | Имя | IP | MAC | Примечание | |-----|----|-----|------------| -| htpc | 192.168.1.86 | — | Bazzite, статический IP, RX 570 | +| htpc | 192.168.1.86 | `B0:6E:BF:60:6D:64` | Bazzite; DHCP reservation, напрямую по Ethernet | | tv / LGwebOSTV | 192.168.1.75 | ac:5a:f0:25:11:c6 | LG TV | > ⚠️ **2026-09-04:** LG TV подключён по **проводу** (вместо WiFi). Проводная часть использует Ethernet-MAC `ac:5a:f0:25:11:c6` и на конец сессии получал **`192.168.1.70`** (DHCP), а статический lease `.75` перестал отвечать по этому MAC (на .75 когда-то был WiFi-MAC `54:77:87:ce:fb:b3`). Если `.75` вдруг «пропал» из сети — телевизор просто переключился на провод и его теперь надо искать по .70 или заново в DHCP-lease. Линк eth0 ТВ на 2026-09-04 = **100 Mbit/s** (downshift, кабель не тянет 1G; Wi-Fi ТВ к тому моменту был 867 PHY — быстрее). @@ -140,6 +140,10 @@ ssh -i ~/.ssh/id_rsa admin@192.168.1.1 "nvram show | grep -E '^(dhcp_dns|wan_dns ## Диагностика скорости линка портов (2026-09-20) +### HTPC — проверка 2026-10-07 + +HTPC напрямую подключён к ASUS по Ethernet: `enp0s31f6`, DHCP reservation `192.168.1.86`, имя `htpc`. Клиентский `ethtool` показал **1000 Mb/s, full duplex, link detected**; ASUS `robocfg` показал **Port 4: 1000FD**, MAC `b0:6e:bf:60:6d:64`. `dig @192.168.1.1 htpc +short` → `192.168.1.86`. + **Метод: сопоставить MAC на порту (`robocfg show`) с устройством из `arp -a`.** Фактическое состояние на 2026-09-20: diff --git a/family/how-to/samsung-m2020.md b/family/how-to/samsung-m2020.md new file mode 100644 index 00000000..23966273 --- /dev/null +++ b/family/how-to/samsung-m2020.md @@ -0,0 +1,65 @@ +--- +title: "🖨 Samsung M2020 — Бишкек" +aliases: ["Samsung M2020", "Samsung M2020 Series"] +tags: ["family", "how-to", "devices", "printer", "bishkek"] +updated: "2026-10-09" +--- + +# Samsung M2020 — Бишкек + +## Подключение + +- Принтер: **Samsung M2020 Series**, идентификатор `SEC84251974A6B3`. +- Адрес: `192.168.1.80`. +- Mac: AirPrint / IPP (`dnssd://…_ipp._tcp.local`). +- Веб-интерфейс: `http://192.168.1.80/sws/index.html`. +- Вход в веб-интерфейс: `admin` / `sec00000`. + +## Конфликт Mac и Android + +### Исходная проблема + +Стоит **заводской картридж без чипа**. M2020 сообщает по SNMP `Printer is not able to print` (`C2-1511`). + +- Android через Samsung Print при этом печатал нормально. +- Mac через AirPrint отказывался печатать с сообщением `Printer is not able to print`. + +### Изменение ради Mac + +На M2020 выключили `SNMPv1/v2 Protocol`. Mac перестал получать статус `C2-1511` и начал печатать. + +### Регрессия Android + +После отключения SNMP Android всё ещё видел M2020, но при выборе принтера ждал около минуты и сообщал **«Принтер не готов»**. Переустановка модуля Samsung Print не помогла. + +### Подтверждённое восстановление + +Включение `SNMPv1/v2 Protocol` сразу восстановило печать с Android. SLP на результат не влияет. + +### Текущее состояние + +SNMPv1/v2 включён. Android печатает. На Mac применён обход ниже; Mac печатает. + +Проверка CUPS 2026-10-09: задание `#99` без `waiteof=false` получило `The printer is not responding` через 30 секунд. `waiteof=false` убирает это ожидание только в Mac: документ сразу исчезает из очереди и диалог печати закрывается после передачи данных. Он не подтверждает завершение физической печати и не ускоряет M2020. + +Контрольный тест: четыре пустых задания отправлены сразу друг за другом, без ухода принтера в sleep. Первое напечаталось сразу; следующие три начинали печать через **30 секунд после окончания мигания** индикатора приёма данных. Значит задержка не связана с Power Save. + +Причина задержки — текущий путь Mac через сырой `socket://…:9100`: AirPrint-драйвер передаёт поток `image/urf` без IPP-границы задания, а M2020 ждёт внутренний таймаут конца задания и только затем принудительно печатает. `waiteof=false` завершает задание для macOS, но не задаёт M2020 границу задания. + +## Решение конфликта на Mac + +Оставить SNMPv1/v2 включённым на M2020. На Mac направить его очередь напрямую на JetDirect, отключив SNMP-проверку только для Mac: + +```text +socket://192.168.1.80:9100/?snmp=false&waiteof=false +``` + +Для существующей очереди Mac `Samsung_M2020_Series__SEC84251974A6B3_`: + +```zsh +sudo lpadmin -p 'Samsung_M2020_Series__SEC84251974A6B3_' -v 'socket://192.168.1.80:9100/?snmp=false&waiteof=false' -E +``` + +Настройка очереди Mac применена 2026-10-09. `snmp=false` не даёт Mac блокировать задание по статусу `C2-1511`; `waiteof=false` закрывает соединение после передачи данных и не ждёт фактического завершения печати. + +Для устранения задержки нужна очередь Mac через IPP/AirPrint с явной границей задания, при сохранении отключённой проверки расходников только на Mac. Эту конфигурацию ещё нужно проверить отдельно; текущую рабочую очередь не менять без подтверждённого варианта. diff --git a/family/how-to/samsung.md b/family/how-to/samsung.md deleted file mode 100755 index 1a33f809..00000000 --- a/family/how-to/samsung.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "🖨 Samsung — настройки" -aliases: ["Samsung CLX-2160", "Samsung TV", "samsung"] -tags: ["family", "how-to", "devices"] -updated: "2026-08-26" ---- -# 🖨 Samsung — настройки - -## Принтеры в системе (на Маке admin, macOS) - -Два принтера: -- **Samsung CLX-216x** — сетевой: `ipps://192.168.2.197:631/printers/Samsung_CLX-216x_Series`. Драйвер Generic PostScript. -- **Samsung M2020 Series** (SEC84251974A6B3) — AirPrint (dnssd), дефолтный. Подключается по Wi-Fi/AirPrint. - -## Состояние печати / шеринга (диагностика 2026-08-26) - -Симптом: с телефона не виден принтер. - -### ✅ Корень проблемы (подтверждено SSH на TrueNAS) - -**Samsung CLX-216x физически подключён к TrueNAS (USB) и обслуживается docker-контейнером `cups-splix` (драйвер splix). Контейнер НЕ запущен** — образ не собран, контейнер отсутствует после пересоздания пула. Поэтому принтер не виден по сети → телефон не печатает. - -- На TrueNAS нет другой службы печати: `lpstat`/`cupsd` не установлены, порт 631 закрыт. -- `192.168.2.197` — это адрес TrueNAS (не принтер); запись `ipps://192.168.2.197:631/...` = расшаренная печать TrueNAS. -- **Фикс:** пересобрать `cups-splix` и поднять — см. `[[truenas-infrastructure]]` (раздел «cups-splix — принтер») и `[[mac-print-shared-services]]`. - -### Факты из CUPS на этом Маке (вторичны для этой проблемы) -- `Listen localhost:631` — служба печати CUPS слушает **только локально**, наружу не отдаёт. -- `SharePrinters` в `/etc/cups/cupsd.conf` не активен — **шеринг печати выключен** (оба принтера `Shared: No`). Шеринг на Маc актуален только для принтера, висящего на Маcе (Samsung M2020). - -Подсеть: Мак в этом сеансе был на `192.168.6.x`, инфраструктура живёт на `192.168.2.x` — расхождение из-за того, что Мак был вне основной сети, а не из-за принтера. - -Примечание: `sudo -n cupsctl` не работает без пароля — шеринг удалённо через SSH проверить нельзя. - -## Отключение Detecting Device - -``` -Обнаружение устройства -Mute, Volume down, Channel down, Mute -Note: Mute is activated by pressing in on the Volume rocker -``` \ No newline at end of file diff --git a/family/how-to/vault-git-sync.md b/family/how-to/vault-git-sync.md index d753e305..98274568 100755 --- a/family/how-to/vault-git-sync.md +++ b/family/how-to/vault-git-sync.md @@ -1,6 +1,6 @@ --- title: Vault Git Sync — Architecture & Scripts -updated: '2026-09-22' +updated: '2026-10-15' type: tech tags: - vault @@ -127,7 +127,7 @@ Obsidian vault is a bare git repo on TrueNAS: `/mnt/RED_2TB/storage/git/obsidian-vault.git` Also mirrored in Gitea: `https://git.mallexxx.duckdns.org/git_admin/obsidian-vault` -Four clients sync to it: Eagle, Kraken, Taiga (vault), Taiga (syncthing/phone). +Five clients sync to it: Eagle, Kraken, Taiga (vault), Taiga (syncthing/phone), iPad (Edhita Documents). ## Architecture @@ -164,6 +164,7 @@ No stash. No GIT_DIR/GIT_WORK_TREE workarounds. | Eagle | `~/scripts/sync-vault.sh` | full clone | **launchd** `com.sync-vault` (⚠️ НЕ Hermes cron) `StartInterval=300` | | Kraken | `~/scripts/sync-vault.sh` | sparse clone | host crontab */5 | | Taiga | `/opt/data/sync-vault.sh` | 3-phase orch. | Hermes cron **`*/5 * * * *`** — job `29851c413903`. ⚠️ `hermes cron list` и поле `schedule_display` в `jobs.json` показывают устаревшее `0 * * * *` (см. поправку в STATE 2026-09-26 выше); фактические тики — каждые 5 мин | +| iPad | `/var/mobile/Library/VaultSync/sync-vault.sh` | full working tree, initial shallow clone | **launchd** `local.ipad.obsidian-vault-sync`, mobile, StartInterval300 | > **⭐ УТОЧНЕНО 2026-09-02 (Eagle/мак sync-механизм):** автосинка на маке запускается **НЕ Hermes cron, а launchd-агентом** `~/Library/LaunchAgents/com.sync-vault.plist`: > - Программа: `/Users/admin/scripts/sync-vault.sh`, `StartInterval = 300` сек (5 мин) @@ -343,3 +344,7 @@ payload = { - **2026-05-23**: Taiga deleted 32+ wiki files. Root cause: `git add -A` before merge staged deletions of files outside sparse cone. Fixed with scoped `git add`. - **2026-06-01**: "Керамика" lost from gift-ideas. Root cause: `git add $SPARSE_PATHS` failed silently when `.obsidian/` absent — patch+move not committed. - **2026-06-02**: Full architecture migration. Taiga `/vault` converted from `GIT_DIR=bare GIT_WORK_TREE` workaround to proper sparse clone. All clients unified on same `commit→fetch→merge→push` algorithm. Sync interval: every 5 min. + +## iPad iOS9.3.5 — подключён 2026-10-15 + +Прямой SSH Git клиент того же TrueNAS bare main, Git2.8.1 от Saurik, отдельный restricted Ed25519 key (только этот repo), persisted TrueNAS user settings. Vault в Documents Edhita/ObsidianVault; task работает от mobile каждые300с и при load. Проверены actual iPad→NAS push и NAS→iPad automatic pull на двух последовательных ticks. Native fixture tests повторены 2026-10-15: offline сохранение/retry, commit/push конфликтных маркеров с обеими версиями, получение другим clone, продолжение синка и возобновление прерванного merge. Script/last-success/last-result/error logs находятся вне Git vault; core.fileMode=false, auto gc отключён. При конфликте, как на Mac, client коммитит маркеры с пометкой `merge conflict — review needed` и пушит; ручное разрешение не блокирует последующие ticks. Скрипты прочих клиентов не менялись. Полные пути, source/evidence и обслуживание: [[personal/how-to/ipad-vault-sync]]. diff --git a/family/plans/red2tb-backup-acl-inherit-fix.md b/family/plans/red2tb-backup-acl-inherit-fix.md new file mode 100644 index 00000000..ca52aaf1 --- /dev/null +++ b/family/plans/red2tb-backup-acl-inherit-fix.md @@ -0,0 +1,29 @@ +# RED_2TB/backup — inherit ACL fix (nas_users) — план + +> Запрошено Alex 2026-10-06 (Mattermost): применить к `/mnt/RED_2TB/backup` тот же фикс, +> что делали для `Edu` (2026-09-23) и `storage/obsidian-syncthing` (2026-09-26). +> Цель: `truenas_admin` (uid 950) может писать в датасет backup (287G, личные бэкапы). + +## План (5 шагов) + +1. **Пре-чек** (read-only): `stat`, `nfs4xdr_getfacl`, `midclt filesystem.getacl`, + `touch` (ожидаем Permission denied), распределение `uid:gid` по дереву (до). +2. **Бэкап ACL** → `/mnt/RED_2TB/storage/acl-backup-before-.json` (паттерн Edu). +3. **Фикс** — скрипт на NAS (scp + python3, НЕ с Mac): read-modify-write dacl + (все ACE → `flags={"BASIC":"INHERIT"}`, `group@` полный grant, `id` сохранены), + ОДИН `filesystem.setacl` `{uid: <текущий корневой>, gid: 3000, acltype: NFS4, + options: {recursive: true, traverse: true, stripacl: false}}`, полл `core.get_jobs` до SUCCESS. +4. **Верификация**: `nfs4xdr_getfacl` → `trivial_acl: false`, `group 3000`, флаги `fd-----`; + `stat` → `root:nas_users drwxrwxr-x`; `touch` от truenas_admin → OK; `mkdir` + getacl + вложенного → `INHERITED: True`; распределение групп после. +5. **Обновить доки**: эта нота (итог), `red2tb-dataset-map` (строка backup). + +## Питфоллы (из skill truenas-administration + vault truenas-nfs4-acl-and-arrmultiuser) + +- `dacl` строить с нуля НЕЛЬЗЯ (нужен `id` в каждой ACE) — только read-modify-write. +- Флаги — строка `{"BASIC":"INHERIT"}`, не булев dict. +- `setacl` асинхронный — ждать job до `SUCCESS`, иначе ложный провал. +- `getacl` сразу после `setacl` врёт кэшем → верифицировать `nfs4xdr_getfacl`. +- `group@` = POSIX gid объекта → смена gid на 3000 ОБЯЗАТЕЛЬНА, иначе ACE даёт ничего. +- `uid`/`gid` в payload с `recursive:true` переписывают владельца всего дерева (287G) — + осознанно, тот же результат что у Edu (`root:nas_users` на всё дерево). diff --git a/personal/how-to/ipad-ios935-build-deploy.md b/personal/how-to/ipad-ios935-build-deploy.md new file mode 100644 index 00000000..53116ec1 --- /dev/null +++ b/personal/how-to/ipad-ios935-build-deploy.md @@ -0,0 +1,222 @@ +--- +title: iPad iOS 9.3.5 — сборка редакторов, fake sign и деплой +created: '2026-10-14' +updated: '2026-10-15' +tags: [ipad, ios, markdown, virfield, build, deploy] +--- +# iPad iOS 9.3.5 — сборка редакторов, fake sign и деплой + +Запрос: checkout найденных открытых редакторов в `~/Developer`, сборка на Virfield/Monterey, fake sign и установка на физический iPad. **Edhita, Notepad Example, официальный iVim 1.40 и legacy GitJournal собраны, fake-signed, установлены и запущены на iOS 9.3.5; экраны всех четырёх приложений проверены.** GitJournal потребовал local compatibility patch, описанный ниже. Fork holzschu требует 32-bit rebuild зависимостей и не установлен. Проверенный SSH-доступ к iPad настроен 2026-10-15 через `ssh-copy-id` после явного указания пользователем пароля. Все артефакты и diagnostics экспортированы; по отдельному запросу пользователя рабочая Monterey VM штатно released, её отсутствие в runtime подтверждено. Готовый golden сохранён. + +## Устройство и доступ + +Проверено через libimobiledevice 2026-10-14: + +- Модель `iPad2,5`: iPad mini первого поколения, 32-bit ARM (`armv7`). +- iOS `9.3.5`; имя `iPad (Alexey)`. +- UDID `3a214de4ad222863b82458f3611ad6b7b53eb05f`. +- `idevice_id -l` в обычном sandbox возвращает `Unable to retrieve device list`; вне sandbox устройство видно по USB и как network device. +- Локальный USB SSH-туннель: `iproxy -u 3a214de4ad222863b82458f3611ad6b7b53eb05f 2235:22`. +- SSH-сервер устройства: `OpenSSH_6.7`, host-key algorithms `ssh-rsa,ssh-dss`. Современный клиент без compatibility flag не согласует host key. +- Host key закреплён в `~/Developer/ipad-editors/ipad-known-hosts`; RSA fingerprint `SHA256:sl+pEjLygox+shHazV2JnzKGvvRFeiTbpx3ZevgT2Kk`. +- Первоначально `~/.ssh/id_rsa` (`SHA256:UZ8oPNIe8z2bvBOhWQRyt+JWi99oqQnP8N5XAAm5Uhs`) отклонялся для `root` и `mobile`: этот ключ ещё не был установлен. 2026-10-15 пользователь явно предоставил пароль и попросил `ssh-copy-id`; команда добавила один public key, затем вход `root` с `BatchMode=yes` без пароля прошёл. Первая password-сессия оборвалась `Broken pipe`; повторная завершилась exit 0. +- Ранее automatic approval review отклонил password probe и privileged AFC2 поиск authorized_keys до исполнения. Это исторический approval blocker, снятый новым явным запросом пользователя на парольный вход и установку ключа. Пароли и private keys здесь не хранятся. + +Фактически исполненная установка ключа (пароль вводится в интерактивный prompt): + +```sh +ssh-copy-id -i "$HOME/.ssh/id_rsa.pub" -p 2235 \ + -o HostKeyAlgorithms=ssh-rsa -o PubkeyAcceptedAlgorithms=ssh-rsa \ + -o StrictHostKeyChecking=yes \ + -o UserKnownHostsFile="$HOME/Developer/ipad-editors/ipad-known-hosts" \ + root@127.0.0.1 +``` + +Проверенный вход по ключу: + +```sh +ssh -p 2235 -i "$HOME/.ssh/id_rsa" \ + -o IdentitiesOnly=yes -o BatchMode=yes \ + -o HostKeyAlgorithms=ssh-rsa -o PubkeyAcceptedAlgorithms=ssh-rsa \ + -o StrictHostKeyChecking=yes \ + -o UserKnownHostsFile="$HOME/Developer/ipad-editors/ipad-known-hosts" \ + root@127.0.0.1 'uname -a' +``` + +Через SSH подтверждены `/usr/bin/appinst`, `/usr/bin/ldid`, `/usr/bin/uicache`, `/usr/bin/uiopen`; тестовые IPA установлены ниже через USB installation_proxy. Обычный `id` в окружении iPad отсутствует, поэтому для smoke check использован `uname`. + +## Checkouts + +Все пять source checkouts скачаны в `~/Developer/ipad-editors/`. Публичные исходники Editorial, 1Writer, Textastic, Working Copy и самого приложения Git2Go не найдены; Git2Go website repository не является приложением и не подменяет его исходники. + +| Checkout | Закреплённая ревизия | Проверенные требования и ограничения | +|---|---|---| +| [Edhita](https://github.com/tnantoka/edhita/tree/8614a583f765b0f73d3e4c7d150e8d44a9137dbe) | `8614a583f765b0f73d3e4c7d150e8d44a9137dbe` | Исходники 2.3.0, iOS 9.0, Swift 5; файловый редактор с Markdown preview. Ветка `uikit` на HEAD уже требует iOS 10.0. CocoaPods зависимости закреплены старым Podfile.lock. | +| [iVim / holzschu](https://github.com/holzschu/iVim/tree/f0d6dbceb7900ff6eb122691114a64a64cd9a580) | `f0d6dbceb7900ff6eb122691114a64a64cd9a580` | iOS 9.1, Swift 5; полноценный Vim, document picker и shell-команды через ios_system. В checkout отсутствуют Frameworks; upstream get_frameworks.sh указывает ios_system 2.4, Python/Lua dependencies нужно закрепить и проверить armv7. | +| [Notepad](https://github.com/ruddfawcett/Notepad/tree/8ae529d831380e203029381a7b1eccad68701fda) | `8ae529d831380e203029381a7b1eccad68701fda` | MIT Markdown editor component и Example app. Исходные Xcode targets задают 10.1; override 9.3 проверен успешной сборкой и запуском на iPad 9.3.5. Demo открывает встроенный tests.md, не является готовым browser для Obsidian vault. | +| [GitJournal](https://github.com/GitJournal/GitJournal/tree/50dfb2d4ea2b8f00f9e5938e682970e53981ae84) | `50dfb2d4ea2b8f00f9e5938e682970e53981ae84` | Исторический 1.76.0+10 непосредственно перед повышением minimum iOS до 10.0. Runner, Podfile и AppFrameworkInfo.plist задают iOS 9.0; нужен Flutter >=2.0.3 с Dart >=2.12 и <3.0. Markdown + встроенный Git sync. Latest checkout требует iOS 11 и не подходит. | + +Дополнительно найден и скачан официальный [terrychou/iVim](https://github.com/terrychou/iVim/tree/d6aaa3c8cd620f035209776f5cc998e7b2da5d5f), checkout `~/Developer/ipad-editors/iVim-upstream`, revision `d6aaa3c8cd620f035209776f5cc998e7b2da5d5f` (2018-09-29, 1.40). Targets задают iOS 9.1; внешних frameworks в проекте нет. На Monterey/Xcode 13.4.1 с override `SWIFT_VERSION=4.0`, `ARCHS=armv7`, minimum 9.3 компиляция завершилась `BUILD SUCCEEDED`; приложение установлено и запущено. + +Форк holzschu: скачан официальный `ios_system` v2.4 `release.tar.gz`, SHA-256 `17e220bc4bd89745105f037edcbb37ce445b44b9154d207c882352ce02cc6af4`. `lipo -archs` показал `ios_system.framework` armv7+arm64, но `lua_ios.framework` и `libctags.dylib` — только arm64. Заявленный minimum iOS 9.1 не доказывает поддержку 32-bit в этих бинарных зависимостях. Upstream getPackages.sh также собирает Python/ZeroMQ с arm64 и iOS 11/12; он не запускался. + +[Flutter removed 32-bit iOS after the 2.10 stable cycle](https://github.com/flutter/flutter/issues/97327). Для GitJournal нельзя брать текущий Flutter; наличие deployment target 9.0 само по себе не доказывает armv7 в каждом готовом framework. + +## Virfield: исходный блокер и его восстановление + +Прочитаны installed `virfield_help`: workflows, verification, operations. Верифицированный template `monterey-xcode-13.4.1`: macOS 12.7.6 / 21H1320, Xcode 13.4.1 / 13F100, golden в `samsung-tart`. + +Запросы сохранены локально: + +- `~/Developer/ipad-editors/virfield-acquire.json`: default storage; отклонён `resource_exhausted`. +- `~/Developer/ipad-editors/virfield-acquire-release-check.json`: explicit internal storage; принят, но clone не подтверждён. +- Identity только для этой аренды: `~/.local/share/virfield-identities/ipad-editors-20261014-attempt-1/`; private key не хранится в Git/vault. +- Lease `lease-9e65ca2f956c0f061eb3ac021d9f6b6f`, VM `vf-9e65ca2f956c0f061eb3ac021d9f6b6f`, job `job-ee57f1c483518f251f1bcd095621e6e9`. +- Job `needs_attention` / `clone_outcome_unknown`; lease `quarantined`. Последний status не показывает физическую VM с этим именем, но reservation остаётся. SSH configuration не создавалась: lease не ready. + +Причина и диагностические недостатки записаны в [[personal/projects/virfield]]. Local Tart golden нельзя клонировать в другой TART_HOME; явный cross-container destination был принят admission, затем отклонён backend. Требуется штатное operator recovery с подтверждением точного имени, без обхода journal. Recovery может удалить VM навсегда — отдельное подтверждение пользователя обязательно. + +После восстановления использовать свободное место в исходном `samsung-tart`, либо создать отдельный verified Monterey/Xcode golden непосредственно в internal `release-check` и клонировать уже его в том же контейнере. Чужую macos27 lease не останавливать и не удалять. + +Этот исходный lease уже `released` после отдельно разрешённого recovery. Новый verified golden `ipad-editors-monterey-xcode-1341-20261014` создан в `release-check`, image `image-f8c888fcafbd1a2df2a3b9a02821685d`, macOS 12.7.6 / Xcode 13.4.1. Новая lease `lease-327bb8e4a3a06b7d5ac8e527c57d1907` прошла ready и реально собрала две apps. С 17:57:04 UTC 2026-10-14 она `needs_attention` / `vm_drift`: manager закрыл tunnel `127.0.0.1:60131`. Последний inventory при этом показывает VM running на прежнем `192.168.64.251`. Recovery новой VM требует отдельного разрешения пользователя; старое разрешение относилось только к `vf-9e65…`. Подробности в [[personal/projects/virfield]]. + +## Процедура сборки и деплоя + +1. Получить job `succeeded` и lease `ready`, затем создать pinned SSH config через установленный Virfield CLI. Проверить `sw_vers`, `xcodebuild -version`, `xcrun --sdk iphoneos --show-sdk-version` в госте. Не работать на golden. +2. Передать checkouts/зафиксированные зависимости в guest `~/workspace`; сохранить SHA исходников и полный build log отдельно для каждого приложения. +3. Для Xcode targets использовать `-sdk iphoneos -configuration Release -destination generic/platform=iOS`, `ARCHS=armv7`, `ONLY_ACTIVE_ARCH=NO`, `IPHONEOS_DEPLOYMENT_TARGET=9.3`, `CODE_SIGNING_ALLOWED=NO`, `CODE_SIGNING_REQUIRED=NO`, `ENABLE_BITCODE=NO`. Edhita требует `pod install` с закреплёнными версиями и template AppSecret; fork iVim — старые frameworks; Notepad — app scheme `Example` (scheme `Notepad` собирает только framework). GitJournal требует старый Flutter и lockfiles. `~/Developer/ipad-editors/build-native-on-monterey.sh` реально собрал Notepad и iVim-upstream; отдельный helper GitJournal до компиляции не дошёл. +4. Экспортировать .app/IPA на Mac до окончания lease; проверять `lipo -archs` у executable и всех вложенных Mach-O: должен присутствовать `armv7`. Проверить minimum OS <=9.3.5, UIDeviceFamily включает 2, итоговые bundle IDs, отсутствие обязательной arm64 capability. Подписывать вложенные dylib/framework/appex до основного executable. +5. Fake sign выбранным совместимым `ldid`, проверить signature/entitlements; сформировать IPA с `Payload/.app` и SHA-256. `codesign -s -` без проверки совместимости старого устройства не считать проверенным эквивалентом. +6. Перед установкой прочитать список installed bundles: существующий экземпляр с пользовательскими документами не удалять/перезаписывать без подтверждения. Для этой сессии отсутствие обоих target bundles подтверждено до install; ранее установленные приложения сохранены. Для установки fake-signed IPA проверен USB `ideviceinstaller`; наличие рабочего SSH не требуется этому маршруту. +7. Передать IPA, вызвать доступный installer, проверить его exit code и появление bundle. При disconnect сначала прочитать состояние устройства, затем решать о повторе. Обновить icon cache, запустить по bundle ID доступным launcher и проверить работающий процесс/экран. Installer success не доказывает launch или редактирование. +8. Сохранить результат отдельно для build, fake sign, install, launch, Markdown editing; дополнить эту заметку фактическими командами и логами. Освободить только собственную lease после экспорта и явного разрешения cleanup. + +Fake signer source: [ProcursusTeam/ldid](https://github.com/ProcursusTeam/ldid/tree/af86971ae72ec3ed3d0a699107c4e882324c941b), checkout `~/Developer/ipad-editors/ldid`, ревизия `af86971ae72ec3ed3d0a699107c4e882324c941b`. Это вспомогательный host tool. Бинарник собран на локальном Mac (`make -j4`), версия `v2.1.5-procursus7-23-gaf86971`, Mach-O arm64, SHA-256 `f36d613b2fb6e245f99bef8373844e7fa6c97a2f82059faadc74dcbcc90c9458`. Подпись с `-Hsha1` реально проверена на двух armv7 apps: embedded entitlements прочитаны обратно, USB install и launch прошли. + +## Связь с Obsidian sync + +На Mac `~/scripts/sync-vault.sh` уже запускается `launchd` `com.sync-vault` каждые 300 секунд; текущий daemon state подтверждает StartInterval. Remote скрипта — `nas`, не GitHub. Редактирование серверных .md через SFTP может использовать этот существующий синк; прямому iPad GitJournal/Working Copy потребуется собственный remote. Обычный iOS-app sandbox не даёт cron для Bash/Git; на jailbroken устройстве daemon/launchd и системные Git/Bash требуют отдельной настройки. Запрос на cron пока был исследовательским: существующие расписания не менялись. + +Read-only проверка после вопроса пользователя 2026-10-15: iPad уже имеет `/bin/bash` (4.0.x), `/bin/sh`, `/bin/launchctl`, `/usr/bin/ssh`, dpkg. **Git, cron/crontab, basename, head и tr отсутствуют** в штатном PATH; date/sed/mkdir доступны. Поэтому собственный скрипт синка возможен, но Mac wrapper/library нельзя просто скопировать и объявить работающим: нужны совместимый armv7 Git и недостающие core utilities либо их замена в скрипте. Расписание можно сделать launchd, как на Mac. Vault нужно хранить в директории, которую открывает выбранный редактор (например его Documents), запускать синк с согласованными permissions/mobile user и отдельным клиентским SSH key к remote. Mac→iPad key, установленный выше, не является ключом iPad→NAS/GitHub. Планировщик, пакеты Git и реальный vault на iPad в этой сессии ещё не настраивались; вопрос был о возможности, не отдельным поручением менять синк. + +См. также [[personal/how-to/old-ipad-ios935-ipa-sources]], [[family/how-to/vault-git-sync]]. + +## Исторический checkpoint 2026-10-14 22:40 Asia/Bishkek + +- Explicitly authorized recovery завершился успешно: cleanup `job-1fe239f3064566b2a4b3f75ebce13813`; старый lease освобождён. Новый образ `ipad-editors-monterey-xcode-1341-20261014` строится непосредственно в internal `release-check`, image `image-f8c888fcafbd1a2df2a3b9a02821685d`, job `job-076452fa609adc3e6d4093a8e047a693`. См. [[personal/projects/virfield]]. +- Host `ideviceinstaller` 1.2.0 установлен через Homebrew. Проверена штатная USB-служба: `ideviceinstaller -u 3a214de4ad222863b82458f3611ad6b7b53eb05f list -a CFBundleIdentifier -a CFBundleDisplayName -a CFBundleVersion` завершился exit 0 и вернул installed bundles. Ни один bundle редакторов ещё не установлен. Для install синтаксис этой версии: `ideviceinstaller -u UDID install PATH.ipa`; installer success нужно дополнительно сверить со списком приложений и запуском. Наличие SSH для этого USB-маршрута не требуется; возможность установки fake-signed IPA ещё не проверена. +- Поиск отпечатков public authorized_keys через privileged AFC2 отвергнут automatic approval review ДО исполнения как credential probing without specific authorization. AFC2-команда не выполнялась. Используется обычная USB installation_proxy без чтения privileged SSH files. +- Flutter 2.10.5/Dart 2.16.2 x64 SDK скачан с официального Google archive и совпал с published SHA-256 `cc3b48d864c5863898246b8f8e602489cc8e2e77098db27ef3484a25162e1c80`; размер 1,181,514,897 bytes. На ARM Monterey worker этому историческому host SDK нужен Rosetta. Это подготовка инструмента, не подтверждение сборки GitJournal. + +## Проверенные команды и результаты, 2026-10-15 + +Guest workspace: `/Users/admin/ipad-editor-build/ipad-editors`. Источники переданы как git archives с `SOURCE_REVISION`; private keys в архив не включались. Guest toolchain в exported `toolchain.txt`: macOS 12.7.6, Xcode 13.4.1 / 13F100, iPhoneOS SDK 15.5. + +В ready worker фактически выполнено: + +```sh +cd /Users/admin/ipad-editor-build/ipad-editors +bash build-native-on-monterey.sh Notepad +bash build-native-on-monterey.sh iVim-upstream +``` + +Products и полные build logs экспортированы на Mac в `/Users/admin/Developer/ipad-editors/exported-editors/`. Оба `build.log` содержат `BUILD SUCCEEDED`. Helper выбирает `Example` и `iVim` schemes, выключает Apple signing/bitcode, задаёт armv7 / minimum 9.3. Для upstream iVim установлен Swift language mode 4.0. Изменений исходного кода этих двух приложений для сборки не понадобилось. + +Host packaging использует `/Users/admin/Developer/ipad-editors/package-fake-signed.py`. Он копирует original .app, проверяет minimum OS всех Mach-O, требует armv7, удаляет прочие slices только в копии, подписывает nested binaries SHA1, затем main/extension с entitlements, читает entitlements обратно и создаёт IPA с сохранёнными Unix permissions/symlinks. Для iVim сохранены source entitlements/app group; `IPADLOCAL9` — локальный fake team, работоспособность iCloud не проверена. + +```sh +cd /Users/admin/Developer/ipad-editors +python3 package-fake-signed.py exported-editors/Notepad/Example.app \ + packages/Notepad-20261014 +python3 package-fake-signed.py exported-editors/iVim-upstream/iVim.app \ + packages/iVim-upstream-20261014 \ + --entitlements iVim-upstream/iVim/iVim.entitlements +``` + +Output directory должен быть новым: helper отказывает при существующем каталоге. Уже созданные пакеты повторно не перезаписывать. + +| App | IPA и SHA-256 | Install / launch | +|---|---|---| +| Notepad Example | `packages/Notepad-20261014/Example.ipa`; `835431ecb821d996b932e523fe32188f21b82fecab4808a6536a0fe0975c4748` | `com.ruddfawcett.Example`, minimum 9.3; USB install Complete / exit 0; process 3355, UI с Markdown test document виден на screenshot | +| iVim 1.40 | `packages/iVim-upstream-20261014/iVim.ipa`; `e2b67b451b11defb30fd8ba1d64a5f3e898a3010be14c3f451f41dfe12b6c777` | `com.terrychou.ivim`, minimum 9.3; USB install Complete / exit 0; process 3366, Vim welcome screen и клавиатура видны на screenshot | +| Edhita 2.3.0 | `packages/edhita-20261015/Edhita.ipa`; `f354872cc0e4596dca82903f0741ccf0204242befd3400e54fabcc1ef09a8aea` | `com.bornneet.Edhita`, minimum 9.3; USB install Complete / exit 0; detached debug launch exit 0, UI с Documents browser/Editor/Browser/Dual виден на screenshot | +| GitJournal 1.76.0+10, local legacy build | `packages/GitJournal-20261015/Runner.ipa`; `5dc474f641cb26e64586b8f1c48ee6520c0dd7797e53a6ab59ee721e098f7a52` | `io.gitjournal.gitjournal`, build10, minimum9.3; USB install Complete / exit0; detached launch exit0, onboarding UI показан на screenshot | + +Установлен `ideviceinstaller` 1.2.0. До install отсутствие обоих bundle IDs проверено; другие приложения/документы не удалялись. Исполненные команды: + +```sh +UDID=3a214de4ad222863b82458f3611ad6b7b53eb05f +ideviceinstaller -u "$UDID" list -a CFBundleIdentifier +ideviceinstaller -u "$UDID" install \ + /Users/admin/Developer/ipad-editors/packages/Notepad-20261014/Example.ipa +ideviceinstaller -u "$UDID" install \ + /Users/admin/Developer/ipad-editors/packages/iVim-upstream-20261014/iVim.ipa +ideviceinstaller -u "$UDID" list -b com.ruddfawcett.Example -a MinimumOSVersion +ideviceinstaller -u "$UDID" list -b com.terrychou.ivim -a MinimumOSVersion +``` + +Первый запуск через debugserver не прошёл без Developer Disk Image. Затем скачан [9.3 device support mirror](https://github.com/filsv/iOSDeviceSupport/tree/master/9.3): архив `dependencies/ios-device-support-9.3.zip`, SHA-256 `46dc58f181de29853c72c391d70e51b03a3c38ee8797365e7557a539ddff6276`. Git blob архива сверён с `81d23af3e57472f4e77222acb02fd6b5a6a529b1`. Это проверка неизменности mirror, не независимая Apple attestation. `DeveloperDiskImage.dmg` с accompanying `.signature` смонтирован на iOS 9.3.5 со статусом Complete: + +```sh +ideviceimagemounter -u "$UDID" \ + /Users/admin/Developer/ipad-editors/dependencies/ios-device-support-9.3/9.3/DeveloperDiskImage.dmg \ + /Users/admin/Developer/ipad-editors/dependencies/ios-device-support-9.3/9.3/DeveloperDiskImage.dmg.signature +idevicedebug -u "$UDID" run com.ruddfawcett.Example +idevicedebug -u "$UDID" run com.terrychou.ivim +``` + +Обычный `run` держит debugger connection; проверенный в installed help вариант для самостоятельной работы приложения — `idevicedebug -u "$UDID" --detach run BUNDLEID`. Screenshot service после DDI также заработал: + +```sh +idevicescreenshot -u "$UDID" /Users/admin/Developer/ipad-editors/Notepad-first-launch.png +idevicescreenshot -u "$UDID" /Users/admin/Developer/ipad-editors/iVim-first-launch.png +``` + +Оба screenshots просмотрены. Raw orientation landscape повернута относительно PNG; UI присутствует. В launch log есть предупреждения jailbreak tweak HMX_UIKit о недоступном notification window/keyboard method; запуску они не помешали, tweaks не менялись. Notepad — демонстрация editing component без готового vault browser. iVim — полноценный Vim. Сохранение изменённой заметки, подключение реального vault и Git sync отдельно не тестировались. + +### Исторические блокеры зависимостей (исходный worker) + +- **Edhita:** native ARM Ruby 2.6 / FFI падал `Bus Error` на Ethon/CocoaPods; отдельный x86_64 Ruby/CocoaPods через Rosetta загрузился успешно. `pod install --deployment` отказал из-за spec checksum/repo metadata и версии CocoaPods 1.6.1 → 1.11.3; полученных новых версий PODS в этом запуске не обнаружено. На host helper исправлен на обычный `pod install` с сохранением before/after lock и обязательным сравнением массива PODS. Последний перенос исправления в guest не прошёл, потому что Virfield tunnel уже закрыт. Xcode compile Edhita не состоялся. +- **GitJournal:** verified Flutter 2.10.5 действительно содержит armv7 Release framework с minimum iOS 9.0; запуск SDK через Rosetta прошёл. Automatic Flutter version check зависал на upstream git fetch; helper использует документированный `--no-version-check`. Native `ios-libraries` v1.1 скачаны с pinned archive SHA-256 `54d788da33397bd923b773f2041d0249b28682446eabf98046bec089eaf025c3`; все четыре static archives содержат armv7. `git_bindings` pinned `52a9def…` также подготовлен. `flutter pub get` остановился на недоступном публично `GitJournal/ext_storage` (GitHub API 404). Host pubspec изменён на опубликованный `ext_storage: 1.0.3`, но transfer в guest не прошёл; этот fallback ещё не проверен сборкой. Plugin Android-only, поэтому его platform-specific usage нужно проверить. Компиляция/деплой/Git sync GitJournal не заявляются успешными. +- **iVim / holzschu:** готовые Lua/ctags зависимости только arm64; полный fork не собран для armv7. Upstream get-frameworks/Python build scripts с изменчивыми refs и iOS 11/12 не запускались. Для полноценного fork требуется отдельная подготовка совместимых 32-bit зависимостей; официальный iVim 1.40 установлен как дополнительный найденный редактор. + +Состояние и пути артефактов также сохранены в `/Users/admin/Developer/ipad-editors/manifest.json`. Исторический blocker `lease-327bb8…` снят разрешённым recovery, cleanup `job-5cb66a109f395c15cd51633ab858bee7` succeeded 18:15:12 UTC 2026-10-14. Replacement `lease-9c1a94ff2b56b396fee7f1bbd2e0dcea` ready, prepare `job-b47d43f833f4bc28e4ec880f8fa40b00` succeeded; pinned tunnel `127.0.0.1:55530`, отдельные `worker-replacement-ssh.conf`/known-hosts и caller identity attempt-3. Не запускать команды через direct-IP в обход Virfield journal. + +На replacement реально выполнен `build-native-on-monterey.sh edhita`, RUN_ID `20261015T001900Z`: `BUILD SUCCEEDED`, before/after массив PODS одинаков. Полный export `edhita-export-20261015.tar.gz` сохранён на Mac. Fake-sign helper проверил armv7 main minimum 9.3, Swift dylibs minimum 7.0; `ideviceinstaller install packages/edhita-20261015/Edhita.ipa` завершился Complete, bundle metadata сверена, `idevicedebug --detach run com.bornneet.Edhita` завершился exit 0. Screenshot `Edhita-first-launch.png` просмотрен и показывает редактор и файловый browser. Изменённой пользователем заметки ещё нет; запись/редактирование vault отдельно не проверены. + +GitJournal на replacement: опубликованный ext_storage 1.0.3 успешно разрешился. Затем выявлено противоречие upstream: Dart firebase_analytics 8.0.0 требует более высокий minimum iOS, несмотря на Runner9.0 и native lock6.33.0. Выбраны точные firebase_analytics6.2.0 / firebase_core0.5.2 из исторического iOS lock; это local compatibility patch. При пере-resolve незакреплённый dart-git HEAD перешёл на современный Dart3 и нарушил old SDK2.16.2. Все четыре git dependencies теперь явно pin к исходным resolved-ref (`4e47b63…`, `52a9def…`, `d7bfaa69…`, `2e2da41…`). Эти изменения находятся в host `GitJournal/pubspec.yaml` и переданы guest. Дальнейший результат компиляции пока ожидается. + +Позднейшая проверка old Firebase6 выявила quiver2/quiver3 conflict с dart-git. **Final compatibility patch отключает optional Firebase analytics**: dependency удалена, `Analytics` сохраняет API с no-op Firebase methods и disabled collection, ссылка на отсутствующий публично `GoogleService-Info.plist` убрана из PBX. Actual pub get теперь успешно завершён (8.8s), native CocoaPods/build продолжается. Это локальная iOS9-сборка с изменениями в трёх source files, не утверждение неизменного upstream binary. Markdown/Git implementation сохранён. + +### GitJournal: итоговая успешная сборка и установка + +Следующий compiler pass выявил три ошибки: отсутствующий generated `lib/.env.dart`, removed `Platform.packageRoot` у platform3.0.0 на Dart2.16, несовместимый PointerEvent callback у photo_view0.11.1 на Flutter2.10. Исправлено: + +- `platform: 3.1.0`, `photo_view: 0.13.0` — официальные pub.dev packages с SDK >=2.12 <3; API photo_view customChild, используемый приложением, сохранился. Versions/compatible callback проверены по опубликованному archive source. +- Helper исполняет просмотренный upstream `scripts/setup_env.dart` с `SENTRY_DSN=''`, генерируя пустой локальный config; настоящие credentials не искались. Sentry endpoint не задан. +- All four Git dependency refs явно закреплены из original lock; `ext_storage` взят с pub.dev1.0.3. Firebase analytics отключён. Final Dart/iOS lockfiles скопированы в host checkout. + +Final pass `RUN_ID=20261015T003500Z` завершился **BUILD SUCCEEDED**, SDK15.5, ARCHSarmv7, target9.3, Apple codesigning disabled. Archive `gitjournal-export-20261015.tar.gz` экспортирован на Mac; directory `exported-editors/GitJournal` содержит app, build/dependency/configure logs, exact revisions/toolchain/Flutter version, used lockfiles, generated PBX/scheme, empty env и `compatibility.patch`. Различия tracked source включают два final lockfiles и три source files; оригинальная revision50dfb2d сохраняется отдельно. + +```sh +python3 /Users/admin/Developer/ipad-editors/package-fake-signed.py \ + /Users/admin/Developer/ipad-editors/exported-editors/GitJournal/Runner.app \ + /Users/admin/Developer/ipad-editors/packages/GitJournal-20261015 \ + --entitlements /Users/admin/Developer/ipad-editors/GitJournal/ios/Runner/Runner.entitlements +ideviceinstaller -u "$UDID" install \ + /Users/admin/Developer/ipad-editors/packages/GitJournal-20261015/Runner.ipa +ideviceinstaller -u "$UDID" list -b io.gitjournal.gitjournal \ + -a CFBundleIdentifier -a CFBundleDisplayName -a MinimumOSVersion -a CFBundleVersion +idevicedebug -u "$UDID" --detach run io.gitjournal.gitjournal +idevicescreenshot -u "$UDID" /Users/admin/Developer/ipad-editors/GitJournal-first-launch.png +``` + +Fake-sign verification проверил **49 Mach-O**: все armv7, minimum7.0 /9.0 /9.3, main/extension entitlements прочитаны обратно. Отсутствие target bundle перед install подтверждено; install Complete/exit0, metadata io.gitjournal.gitjournal /GitJournal /9.3 /10. Detached launch exit0, screenshot просмотрен: GitJournal onboarding `An Open Source Note Taking App built on top of Git`, кнопки Skip/Next. Это проверка запуска, а не реального remote sync: vault, account, clone/push и iCloud/ShareExtension отдельно не тестировались. + +Все оставшиеся worker diagnostics и exact x86_64 Gemfile.lock также экспортированы в `diagnostics-20261015.tar.gz` / `exported-diagnostics`. Процесс сборки/деплоя закончен для четырёх совместимых вариантов; full fork holzschu остаётся архитектурно несовместимым с mini1 в имеющемся бинарном dependency наборе. + +После явного поручения пользователя «Monterrey релизь если больше не нужен» выполнен release только `lease-9c1a94ff2b56b396fee7f1bbd2e0dcea`, idempotency `ipad-editors-release-20261015-9c1a94ff`. Cleanup `job-efbdecc8f058d3b33ab55a2e03c2b448` succeeded в 2026-10-14T18:51:19.492842Z; lease released, runtime не содержит этой VM. Golden image-f8c888… остаётся image_ready. Final reproducible source payload `worker-input-final-20261015.tar.gz` содержит все compatibility patches; Flutter SDK архив хранится отдельно. Дополнительных release/recovery вне собственной Monterey VM не выполнялось. + +## Обновление: vault sync настроен 2026-10-15 + +После отдельного поручения пользователя настроен native Git2.8.1→TrueNAS bare SSH→launchd300s клиент от mobile, vault в Documents Edhita/ObsidianVault. Dedicated Ed25519 key ограничен exact vault Git operations и persisted в TrueNAS user settings. Actual push iPad→NAS и automatic pull NAS→iPad подтверждены; два последовательных scheduled ticks прошли exit0, позднейший третий также ok. Isolated native tests подтвердили offline сохранение/retry и stale empty lock recovery. Обработка конфликтов приведена к Mac-скрипту 2026-10-15: маркеры с обеими версиями коммитятся с `review needed` и пушатся; следующий синк и возобновление прерванного merge проверены на iPad. Folder виден в Edhita. Это заменяет прежний build-only checkpoint о ненастроенном синке; собственного GitJournal remote эта настройка не касается. Полная актуальная инструкция: [[personal/how-to/ipad-vault-sync]]. diff --git a/personal/how-to/ipad-vault-sync.md b/personal/how-to/ipad-vault-sync.md new file mode 100644 index 00000000..eb9bc598 --- /dev/null +++ b/personal/how-to/ipad-vault-sync.md @@ -0,0 +1,77 @@ +--- +title: iPad — Obsidian vault sync +created: '2026-10-15' +updated: '2026-10-15' +tags: [ipad, obsidian, git, sync, launchd] +--- +# iPad — Obsidian vault sync + +Метод: прямой двусторонний Git-синк с существующим bare repo TrueNAS по SSH. Выбран после проверки [[family/how-to/vault-git-sync]], [[family/how-to/obsidian-sync]], [[family/how-to/syncthing-truenas-android]] и [[family/how-to/obsidian-android-sync]]. Он использует тот же source of truth, что Mac; Syncthing/Gitea и синк внутри редактора не нужны этому клиенту. Новый доступ не меняет синк существующих устройств. + +Устройство: iPad mini1 `iPad2,5`, iOS9.3.5, jailbreak. Редактор — установленная Edhita2.3.0; в её файловом browser открыть **Documents → ObsidianVault**. Полный рабочий набор заметок клонирован неглубоко (depth1), чтобы не расходовать место на старую историю. Перед настройкой доступно335MB; после установки Git и clone —311MB. Ветка `main`, remote `nas`. + +## Пути + +- Vault: `/private/var/mobile/Containers/Data/Application/27C12C43-7961-4D13-815E-29FB11A9AE57/Documents/ObsidianVault`. +- Script: `/var/mobile/Library/VaultSync/sync-vault.sh`. +- Git SSH wrapper: `/var/mobile/Library/VaultSync/bin/git-ssh`. +- SSH config/pinned host key: `/var/mobile/Library/VaultSync/ssh/config`, `known_hosts`. +- Dedicated private key: `/var/mobile/Library/VaultSync/ssh/id_ed25519` — остаётся на iPad, владелец mobile, private directory700/key600. +- Log: `/var/mobile/Library/Logs/ipad-vault-sync.log` (bounded2MiB). +- State: `/var/mobile/Library/VaultSync/state/last-result`, `last-attempt`, `last-success`. +- LaunchDaemon: `/Library/LaunchDaemons/local.ipad.obsidian-vault-sync.plist`, label `local.ipad.obsidian-vault-sync`, UserName/GroupName mobile, RunAtLoad=true, StartInterval=300. +- NAS repo: `ssh://vault-nas/mnt/RED_2TB/storage/git/obsidian-vault.git`; SSH alias vault-nas = truenas_admin@mallexxx.duckdns.org:22. +- Host sources/evidence: `/Users/admin/Developer/ipad-vault-sync/`. + +Vault в Documents принадлежит редактору. При удалении приложения его данные могут удалиться; переустановка с новым container UUID требует обновить VAULT path. Background job требует активного jailbreak; после reboot iPad сначала восстановить jailbreak. Исполнение строго раз в пять минут во время сна устройства не гарантируется; очередной tick после возобновления/доступности сети доставит сохранённые локальные commits. + +## Git и доступ + +Установлены оригинальные Saurik packages: git2.8.1-5, curl7.33.0-9, expat2.0.1-3. Existing OpenSSL0.9.8 и OpenSSH6.7 не обновлялись. Package bytes сверены с MD5 опубликованного HTTPS Packages index; дополнительный SHA256 каждого download сохранён на Mac. Git2.8.1 реально запускается от mobile на iPad9.3.5. + +Отдельный Ed25519 client key iPad→NAS сохранён через TrueNAS user.update; прежние SSH keys/options сохранены. Для этого ключа разрешены только git-upload-pack и git-receive-pack exact `/mnt/RED_2TB/storage/git/obsidian-vault.git`; shell, PTY, port/agent/X11 forwarding запрещены. Guard на NAS: `/home/truenas_admin/.local/bin/ipad-vault-git`. Home dataset NAS noexec, поэтому forced command вызывает `/bin/sh guard`, а не исполняет файл напрямую. NAS host key закреплён из доверенного Mac known_hosts. Mac→iPad login key отдельно; private Mac key не копировался на устройство. + +## Поведение + +1. Один запуск за раз; stale task lock снимается после проверки PID/boot. +2. Local edits коммитятся до обращения к серверу. +3. Fetch main → обычный merge → push без force. +4. При unavailable remote локальные commits сохраняются, процесс возвращает75 и повторяет попытку на следующем tick. +5. При конфликте поведение такое же, как в Mac `~/scripts/sync-vault-lib.sh`: `git add -A`, commit `iPad: merge conflict — review needed`, затем обычный push. Маркеры конфликта с обеими версиями попадают в заметку; последующие ticks продолжают синк без ожидания ручного разрешения. Уже прерванный merge с unmerged files также коммитится и пушится на следующем запуске. +6. Успех отмечается только после совпадения local HEAD и remote main и отсутствия новых working-tree edits. core.fileMode=false; автоматический gc на маленьком flash отключён. + +Внешние изменения открытой заметки могут потребовать Reload/переоткрытия в Edhita. Скрипт не изменяет поведение редактора. + +## Проверка и обслуживание + +Ручной запуск на iPad от mobile: + +```sh +bash /var/mobile/Library/VaultSync/sync-vault.sh +cat /var/mobile/Library/VaultSync/state/last-success +cat /var/mobile/Library/VaultSync/state/last-result +``` + +От root через SSH: + +```sh +su mobile -c 'bash /var/mobile/Library/VaultSync/sync-vault.sh' +launchctl list local.ipad.obsidian-vault-sync +launchctl start local.ipad.obsidian-vault-sync +``` + +Изолированные тесты на настоящем Git2.8/Bash4 iPad повторно прошли 2026-10-15: push локальной заметки, pull peer-заметки, сохранение offline edits/retry, commit/push маркеров с обеими версиями и получение другим clone, продолжение следующего синка, возобновление уже прерванного конфликтного merge. Лог на Mac `test-results-mac-conflicts.log`; fixtures retained `/var/mobile/Library/VaultSync/test-20261015T033520Z-12175`. Прежняя остановка на конфликте заменена поведением Mac-скрипта. Первый production manual sync завершился успешно, local/NAS main совпали `9bc1a2847ef2fce0172ecf1f9f6ae87db7c68920`. Production roundtrip и автоматический scheduler проверены; результаты ниже. + +Исправленный script установлен атомарно после тестов; предыдущая версия сохранена на iPad как `sync-vault.sh.before-mac-conflicts-20261015`. Байты установленного файла сверены с host source: SHA256 `6db11b994888e3a523614fe30c56a5066ccceba51b3b1d6c44f3c0c437e0618f`. Запуск через существующий launchd завершился 2026-10-15T03:35:49Z, LastExitStatus0 / last-result ok, working tree чистый, local/NAS main `386ce6e9ee6651072279b6dc9a6eb01baebcfe64`. Evidence на Mac: `mac-conflicts-deploy-verification.log`. Расписание осталось каждые300с. + +См. [[personal/how-to/ipad-ios935-build-deploy]]. + +## Проверка рабочего подключения + +Первый запуск launchd от mobile завершился exit0; iPad создал эту заметку и отправил в NAS main commit `98b9dafcddf3dd6e4248619c25f434146c4035d5` (19:34:04 UTC 2026-10-14). + +Контроль NAS→iPad: `ipad-vault-peer-check-20261015`. Эта строка добавлена через отдельный peer clone к NAS и получена iPad автоматическим tick в19:39:11UTC 2026-10-14. + +Итог: **синк настроен и включён**. Первое автоматическое выполнение стартовало19:33:58UTC, завершилось19:34:04UTC; следующий tick без ручного запуска завершился19:39:11UTC. После второго tick local/NAS main равны `68eb11d85c2f956cc33253a4a2eba2f542dcaf0d`, контрольная peer-строка присутствует на iPad, LastExitStatus0 /last-result ok. Edhita screenshot подтверждает видимость Documents/ObsidianVault и сохранение example. Последующие server commits получаются очередным tick; равенство SHA проверяется на каждом успешном запуске. + +Диагностические ограничения: NAS push сообщает ignored hooks/post-receive (не executable); фактическое обновление bare main и доставка Mac/iPad проверены, Gitea mirror отдельно не проверялся. Базовый dpkg сообщил отсутствующие file lists для старых unrar/gzip/p7zip; установка выбранных новых packages и native Git запуск успешны, чужие packages не ремонтировались. diff --git a/personal/how-to/oreilly-book-to-ipad-pdf.md b/personal/how-to/oreilly-book-to-ipad-pdf.md new file mode 100644 index 00000000..fd023279 --- /dev/null +++ b/personal/how-to/oreilly-book-to-ipad-pdf.md @@ -0,0 +1,111 @@ +--- +title: O'Reilly book to iPad PDF +created: '2026-10-10' +updated: '2026-10-10' +tags: + - automation + - oreilly + - pdf + - ipad + - chrome +--- +# O'Reilly book to iPad PDF + +Автоматизация печатает доступную через подписку O'Reilly книгу по главам средствами Chrome, объединяет главы и создаёт PDF для старого iPad. + +## Расположение + +Скрипт: + +```text +~/Automation/OReillyPDF/oreilly_book_to_ipad_pdf.mjs +``` + +Рабочие файлы при запуске из каталога автоматизации: + +```text +~/Automation/OReillyPDF/work/ +``` + +Готовый PDF: + +```text +~/Automation/OReillyPDF/outputs/<имя-книги>.pdf +``` + +Проверенный документ Building Agentic AI Systems: + +```text +~/Automation/OReillyPDF/outputs/Building-Agentic-AI-Systems-iPad-768x1024.pdf +``` + +## Что делает workflow + +1. Локально клонирует профиль Chrome `Default`, чтобы использовать существующую авторизацию O'Reilly. +2. Запускает headless Chrome через Chrome DevTools Protocol. +3. Открывает корневую страницу книги и читает верхний уровень оглавления O'Reilly. +4. Последовательно открывает каждый раздел верхнего уровня, чтобы O'Reilly отрисовал лениво загружаемые вложенные главы, затем собирает их в правильном порядке без дубликатов. +5. Печатает каждую уникальную секцию через движок Chrome; поддерживаются имена страниц `.html` и `.xhtml`. +6. Применяет размер страницы 576×768 pt — это соотношение 768×1024 при 96 DPI. +7. Добавляет безопасные поля и правила разрыва страниц, чтобы строки не обрезались по краям. +8. Объединяет главы с помощью `pdfunite`. + +## Требования + +- macOS; +- Google Chrome; +- авторизация в O'Reilly в профиле Chrome `Default`; +- Node.js с глобальными `fetch` и `WebSocket`; +- `rsync`; +- Poppler/`pdfunite`: + +```bash +brew install poppler +``` + +## Настройка для другой книги + +Редактировать скрипт не нужно. Передать URL книги первым аргументом; допускается как корневая страница книги, так и URL отдельной главы `.html`/`.xhtml`. + +Название книги извлекается из страницы O'Reilly. На его основе автоматически создаётся имя `-iPad-768x1024.pdf`. + +Число глав и имена файлов указывать не нужно: workflow извлекает уникальные секции из оглавления книги. + +## Запуск + +```bash +cd ~/Automation/OReillyPDF +node oreilly_book_to_ipad_pdf.mjs 'https://learning.oreilly.com/library/view/SLUG/BOOK_ID/' +``` + +Результат появится в: + +```text +~/Automation/OReillyPDF/outputs/ +``` + +## Проверка результата + +```bash +pdfinfo outputs/Book-Name-iPad-768x1024.pdf | grep -E 'Pages|Page size|File size' +``` + +Ожидаемый размер: + +```text +Page size: 576 x 768 pts +``` + +## Диагностика + +Подробный stderr Chrome записывается в: + +```text +~/Automation/OReillyPDF/work/pdfs/oreilly-book-driver/chrome.log +``` + +Workflow не ждёт загрузки всех lazy-изображений страницы перед распознаванием главы: это ранее вызывало ложный `Timed out waiting for chapter content`. Перед печатью он отдельно подгружает изображения внутри области книги; если отдельное изображение не успело загрузиться, печать продолжается с предупреждением. + +## Безопасность + +Каталог `work/chrome-oreilly-driver-profile` содержит локальную копию данных профиля Chrome, включая данные авторизации. Не синхронизировать и не публиковать этот каталог. При каждом запуске workflow пересоздаёт копию профиля. diff --git a/personal/plans/balda-callee-prism-plan.md b/personal/plans/balda-callee-prism-plan.md index 935d1936..700c7cac 100755 --- a/personal/plans/balda-callee-prism-plan.md +++ b/personal/plans/balda-callee-prism-plan.md @@ -1,3 +1,9 @@ +> [!WARNING] Исторический документ +> Не использовать как runbook текущей Balda. Актуальная локальная схема, пути и команды: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Текущий контейнер: `balda-mm-mac`; config: `/Users/admin/Docker/balda-mm-mac/config/config.yaml`; Obsidian MCP: `type: http`, `http://host.docker.internal:3101/mcp`. +> Материал ниже сохранён только как история. +> Актуальные результаты локального прогона 2026-10-14, статус кандидата rc.26 и незавершённые планы: [[personal/projects/balda/execution-broker|Execution Broker — текущий локальный контур]]. Старые NO-GO и SHA ниже относятся к указанным историческим запускам. + # Текущее состояние — Balda / Broker — 2026-10-03 22:41 Бишкек Статус: **приёмочный Docker-прогон выполнен на прежнем образе; автоматическая публикация исправлена, а Balda запущена из текущего исправленного HEAD PR #12 (`73e02156`). Общий release остаётся NO-GO до нового end-to-end прогона, подтверждающего публикацию и уведомления на образе из текущего HEAD `73e02156`.** Записи ниже — история и могут содержать устаревшие статусы. @@ -538,13 +544,13 @@ Balda остаётся оркестратором, Broker изолирует и Реализованы единый 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 в текущей реализации отсутствуют. -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). +Исторический релиз v2.0.0 использовал Lume 0.5.3; его CI и golden/clone acceptance относятся к release commit 2026-09-30. С 2026-10-08 установленный Virfield использует Tart + SSH nodes. В hardening-кандидате 2026-10-14 Lume backend/factory/wrapper/build/install code удалён; старый отдельный Lume LaunchDaemon отключён и выгружен 2026-10-14 после проверки пустого inventory. Новый кандидат ещё не принят для релиза; текущие Tart/factory live результаты записаны отдельно. Текущие evidence и gates — в [[personal/projects/virfield]] и [Verification](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/VERIFICATION.md). ### Граница проектов и репозиториев — принятое решение `virfield` и `execution-broker` — два независимых проекта. Их нельзя объединять в один репозиторий или один daemon. -Репозиторий `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 нет. +Репозиторий `virfield` содержит host control plane: корневой Go module, `cmd/virfieldd`, `cmd/virfield`, `cmd/virfield-mcp`, реализации в `internal/`, deployment в `deploy/`. Актуальная карта модулей — [Architecture](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/ARCHITECTURE.md); отдельного каталога приложения v2 нет. Целевая структура отдельного `execution-broker` (реализацию сверять в его репозитории): @@ -636,6 +642,13 @@ DeepSeek подходит для ограниченного routing и прос 3. **Принять пользовательский Mattermost flow.** Сообщение Balda не содержит repo name/path. Она сама вызывает `execution_repository_create`, создаёт Prism Story, запускает run, доставляет Human approval и события в исходный chat/topic, публикует артефакты и фиксирует cleanup. Проверить Git commit в новом repo и отсутствие двойного создания при повторе idempotency key. 4. **Закрыть release gates.** Разобрать наблюдённый ACP `fs/write_text_file: Method not found`, выполнить CI/publication checks на точном SHA, проверить rollback и оставшиеся credential/managed-host ограничения. Public stable объявлять только после live приёмки. +### Дополнительные задачи — 2026-10-11: альтернативные аппрувы и ACP-контекст + +- [x] **Telegram для Broker workflows и worker ACP.** Реализованы привязка к run/Human/владельцу, выбор единственного канала запроса, возврат результата в исходную беседу, срок действия, обновление кнопок, restart recovery и competing-channel deduplication. Текущий контракт и доказательства: [[personal/projects/balda/execution-broker]]. +- [ ] **Прямые ACP-разрешения хостовых агентов Balda.** Единая межканальная доставка этих разрешений не покрывается Telegram-механизмом Broker; это отдельная незавершённая часть плана. +- [ ] **Прогон субагента для автоаппрува и сбора дополнительного контекста команд ACP-субагентов.** Перед решением по запросу разрешения запускать отдельного субагента: собрать цель команды, cwd, аргументы, затрагиваемые файлы/ресурсы, ожидаемые побочные эффекты и связь с текущей задачей. Использовать собранный контекст для автоаппрува в пределах настроенной политики; при недостатке данных или необходимости решения пользователя направлять запрос на ручной аппрув, включая Telegram. Сохранять решение и обоснование в событиях run. +- [ ] **Приёмочный прогон.** Проверить связку ACP-запрос → сбор контекста субагентом → автоаппрув либо ручной ответ через Telegram → возобновление нужного ACP-субагента. Покрыть недостаточный контекст, отказ, таймаут и повторный ответ. + ## 17. Критерии готовности 1. Balda сама создаёт новый локальный Git repo под настроенным workspace root из обычной Mattermost-задачи; пользователь не передаёт заранее repo name/path. diff --git a/personal/plans/balda-mm-endtoend-plan.md b/personal/plans/balda-mm-endtoend-plan.md index 0ed8d515..d87ba523 100755 --- a/personal/plans/balda-mm-endtoend-plan.md +++ b/personal/plans/balda-mm-endtoend-plan.md @@ -1,3 +1,8 @@ +> [!WARNING] Историческая схема Balda +> Не использовать пути, контейнеры, provider или MCP transport из этой заметки для текущего запуска. +> Канонический текущий runbook: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Актуально: `balda-mm-mac`, `/Users/admin/Docker/balda-mm-mac/config/config.yaml`, Mattermost, Codex ACP, Obsidian `type: http` → `http://host.docker.internal:3101/mcp`. + # План: доделать сквозной путь `@balda` → ответ в Mattermost > Создан 2026-09-26. Обновлён 2026-09-26 (сессия реализации, полный проход). diff --git a/personal/plans/balda-mm-phase4-agents.md b/personal/plans/balda-mm-phase4-agents.md index e3a876c8..6e35ce14 100755 --- a/personal/plans/balda-mm-phase4-agents.md +++ b/personal/plans/balda-mm-phase4-agents.md @@ -1,3 +1,8 @@ +> [!WARNING] Историческая схема Balda +> Не использовать пути, контейнеры, provider или MCP transport из этой заметки для текущего запуска. +> Канонический текущий runbook: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Актуально: `balda-mm-mac`, `/Users/admin/Docker/balda-mm-mac/config/config.yaml`, Mattermost, Codex ACP, Obsidian `type: http` → `http://host.docker.internal:3101/mcp`. + # Фаза 4 — исполнитель на Mac + `~/agents` + секция «Agents» в Eagle Dashboard > План + статус. Старт 2026-09-26. diff --git a/personal/plans/balda-runtime-rebuild-mm-validation.md b/personal/plans/balda-runtime-rebuild-mm-validation.md index 912eb246..dd1063e7 100755 --- a/personal/plans/balda-runtime-rebuild-mm-validation.md +++ b/personal/plans/balda-runtime-rebuild-mm-validation.md @@ -1,3 +1,8 @@ +> [!WARNING] Исторический документ +> Не использовать как runbook текущей Balda. Актуальная локальная схема, пути и команды: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Текущий контейнер: `balda-mm-mac`; config: `/Users/admin/Docker/balda-mm-mac/config/config.yaml`; Obsidian MCP: `type: http`, `http://host.docker.internal:3101/mcp`. +> Материал ниже сохранён только как история. + > Создан 2026-09-28. Статус: **✅ ЧАСТЬ A (runtime) · C/D (сборка+деплой+валидация) · E (sync с апстримом) ВЫПОЛНЕНЫ.** > Часть B (3 блокера PR #8) — **✅ ПРОВЕРЕНА 2026-09-29: фиксы УЖЕ в апстриме** (см. блок ниже). > ⛔ **2026-09-29: Balda-стек на Kraken СНЕСЁН.** Топология пересмотрена — стек переезжает на Mac. diff --git a/personal/projects/archive/balda-reference-before-2026-10-14.md b/personal/projects/archive/balda-reference-before-2026-10-14.md new file mode 100644 index 00000000..a044d0e5 --- /dev/null +++ b/personal/projects/archive/balda-reference-before-2026-10-14.md @@ -0,0 +1,227 @@ +# Balda — историческая карточка и шаблоны до 2026-10-14 + +> [!WARNING] Архив +> Эти сведения и инструкции относятся к прежним версиям. Они не описывают текущий запуск и не применяются автоматически. +> Актуальные карточки: [[personal/projects/balda/balda|Balda]], [[personal/projects/balda/setup|runbook]], [[personal/projects/balda/execution-broker|Broker и приёмка]]. +> Старые PR #8 и #12 уже merged. Литералы старых credentials заменены ссылкой на приватное хранилище. + +## Карточка Balda до актуализации + +> **Актуальный статус — 2026-10-03.** Mattermost-интеграция PR #8 уже в upstream. [PR #12](https://github.com/baldaworks/balda/pull/12) по маршрутизации webhook открыт на `73e02156`: 8/8 GitHub checks прошли; повторное ревью после исправления запрошенных изменений ещё ожидается. Balda запущена из чистого текущего HEAD PR `73e02156`, и хеш бинарника в контейнере совпадает с собранным артефактом. Ревьюер запросил изменения в PR #12 из-за 404 при временном сбое lookup session. Исправление `73e02156` уже отправлено: теперь ответ 503, добавлен HTTP-тест; локальные race tests и lint прошли, все 8 checks нового HEAD прошли. До повторного сквозного прогона merge/release — NO-GO. Прежний вывод о другом SHA был ошибкой: `d094943b` относился к внешнему репозиторию Broker, а `deepseekfix` был старой меткой образа. Локальных правок кода Balda в текущем бинарнике нет; новый сквозной прогон ещё нужен. Приёмочный Broker run `run-fbe2cb459fe2965554402aba1bd5fcd0` прошёл; Mattermost отправил апрув и финал в исходный тред. Результат `4dafb9d` был доставлен в `go-cli-test` вручную через Broker API: Balda пропустила автоматическую публикацию. Broker теперь сам проверяет commit/quality/bundle без обязательного SHA от Balda; webhook и плагин rc.19 требуют публикацию до закрытия Story. Новый end-to-end прогон ещё не проведён. Общий release — NO-GO. Детали и текущие проверки: [[personal/plans/balda-callee-prism-plan]]. Ниже сохранена историческая документация; старые статусы PR и конфигурации не являются текущими. + +Аналог Hermes. Go-сервис: берёт задачи из чата (Telegram или Zulip), запускает AI CLI и отвечает. + +## Репо + +- Upstream: https://github.com/baldaworks/balda (старое имя `normahq/balda` — редирект) +- Fork: https://github.com/mallexxx/balda +- Local: ~/Developer/balda +- Ветка: `feat/mattermost-channel` (PR [#8](https://github.com/baldaworks/balda/pull/8), OPEN, 8/8 CI, MERGEABLE) + +### 🔴 Два репозитория — не путать + +| Репо | Что там | PR | +|---|---|---| +| **`baldaworks/balda`** | сам бот, транспорты (Mattermost, Zulip) | [#8](https://github.com/baldaworks/balda/pull/8) Mattermost, OPEN · [#1](https://github.com/baldaworks/balda/pull/1) Zulip, merged | +| **`normahq/runtime`** | библиотека рантайма (`agentfactory`, `hostedagent`) | [#5](https://github.com/normahq/runtime/pull/5) фикс MCP-тулинга, OPEN · **`CHANGES_REQUESTED`** (3 дефекта, план — [[personal/plans/runtime-pr5-toolset-dedup-review-fixes]]) · [#4](https://github.com/normahq/runtime/pull/4) OpenAI tool_calls, OPEN (4 дефекта закрыты, [[personal/plans/runtime-pr4-openai-toolcalls-fixes]]) | + +Форки: `mallexxx/balda`, `mallexxx/runtime` — **разные**, клоны тоже разные. +Детали по runtime-PR → [[personal/projects/balda/balda-valera]]. + +⚠️ **PR из форка: CI не запускается сам.** GitHub требует ручного подтверждения workflows +владельцем репо («Approve and run workflows») → `mergeStateStatus: UNSTABLE` при +`check-runs: total_count 0`. Это не поломка PR. + +## Архитектура + +- NATS JetStream — event bus (embedded) +- SQLite — состояние (owner, sessions, tasks) +- Telegram — через polling или webhook +- Zulip — через outgoing webhook bot +- Providers: codex, opencode, copilot, gemini, claude (ACP protocol) + +## Zulip Integration + +Полностью реализована. Webhook-based (не polling). +Тип бота: **Outgoing webhook** (не Generic bot). + +### Credentials (zulip.qentra.top) + +- Bot email: `balda-bot@zulip.qentra.top` +- API key: `<из приватного хранилища>` +- Server URL: `https://zulip.qentra.top` +- Webhook token: берётся из Settings → Bots → balda-bot → Edit → Token + +### Config (env vars) + +``` +BALDA_ZULIP_BOT_EMAIL=balda-bot@zulip.qentra.top +BALDA_ZULIP_API_KEY=<из приватного хранилища> +BALDA_ZULIP_SERVER_URL=https://zulip.qentra.top +BALDA_ZULIP_WEBHOOK_TOKEN=<из настроек бота> +BALDA_ZULIP_WEBHOOK_ENABLED=true +``` + +### Webhook setup в Zulip + +1. Settings → Bots → balda-bot → Edit +2. Bot type: Outgoing webhook +3. Endpoint URL: `http://:8090/zulip/webhook` +4. Скопировать token → `BALDA_ZULIP_WEBHOOK_TOKEN` + +### Авторизация + +После запуска написать боту в DM: +``` +/start owner= +``` + +## Реализованные команды (Telegram parity) + +| Команда | Статус | +|---------|--------| +| `/start owner=` | ✅ | +| `/start invite=` | ✅ | +| `/goal ` / `/goal clear` | ✅ | +| `/topic` | ✅ (создаёт сессию для нового топика) | +| `/user add ` | ✅ | +| `/user list` | ✅ (с инвайтами + expiry) | +| Typing indicator | ✅ (isDM-aware: true в DM, false в стримах) | +| plan_updates / SendDraftPlain | ➖ no-op (нет аналога в Zulip) | + +## Upcoming: mention-based thread takeover + +Когда `@balda-bot` упоминается в топике без активной сессии — бот автоматически берёт топик под контроль. + +Механизм (аналог whale-thread-guard в Hermes): +- Webhook payload поле `trigger == "mention"` → auto-create session +- `allowed_owners` список в конфиге: Zulip email без токена +- После захвата топик отвечает на все сообщения (обычная сессия) + +## Конфиг и инструкции + +- [`balda/soul.md`](../balda/soul.md) — soul (global_instruction) — редактировать здесь, синхронизировать в config.yaml +- [`balda/workspace-context.md`](../balda/workspace-context.md) — per-provider system_instructions (рабочий проект/стек) +- `~/Developer/balda/.config/balda/config.yaml` — основной конфиг (runtime + balda) +- `~/Developer/balda/.env` — секреты (Zulip API key, webhook token) + +### Запуск + +```bash +cd ~/Developer/balda && ~/.local/bin/balda start +``` + +После первого запуска: из логов взять `owner_token` и отправить боту в Zulip DM: +``` +/start owner= +``` + +## Docs + +- `docs/zulip-webhook.md` — полное руководство по настройке +- `docs/balda.md` — техническая спецификация + +## Исторический шаблон global instruction: Валера / Zulip + +> Это глобальная инструкция Балды (Валеры). Вставляется в system prompt каждой сессии. +> После правки — синхронизировать вручную в `~/Developer/balda/.config/balda/config.yaml` +> (поле `balda.global_instruction`), затем перезапустить Балду. + +--- + +Ты **Валера** — практичный AI-ассистент команды в Zulip. + +## Стиль + +- Отвечай на языке собеседника (русский или English). +- Кратко и конкретно. Никакой воды, никаких вступлений. +- Показывай результат, а не процесс. +- Код и команды — в fenced code blocks. +- Не объясняй что ты сделал — пользователь видит результат. + +## Работа + +- Берёшь задачу и доводишь до конкретного результата. +- Если задача большая или неоднозначная — уточни объём, прежде чем начать. +- Возвращай что-то осязаемое: код, файл, ответ, список шагов. +- Не останавливайся на полпути — если начал, закончи. + +## Ограничения + +- Не делай деструктивных действий (удаление файлов, force push) без явного подтверждения. +- Не пиши в main/master напрямую. Используй ветки. +- Если нужны credentials или secrets — попроси, не угадывай. + +## Память + +- Durable факты и предпочтения команды сохраняй через `balda.memory.remember`. +- Не сохраняй промежуточные состояния задач и временный контекст. +- Сохраняй: соглашения, предпочтения, архитектурные решения, стек. + +## Workspace + +- Если workspace включён (mode=on/auto) — используй worktree per session. +- `balda.workspace.import` — перед началом крупных правок. +- `balda.workspace.export` — после завершения, Conventional Commit message. +- Не делай merge/rebase через raw git если доступны workspace MCP tools. + +## Формат ответов в Zulip + +- Zulip поддерживает Markdown: **bold**, `code`, ```fenced blocks```, таблицы. +- Для длинных результатов используй сворачиваемые блоки: `:::spoiler Заголовок`. +- Цитируй исходное сообщение только если нужна явная привязка. + +## Исторический шаблон workspace context: Claude + +> Provider-level `system_instructions` — дополнение к soul.md для конкретного провайдера. +> Задаётся в `~/Developer/balda/.config/balda/config.yaml` под +> `runtime.providers.claude_code.system_instructions`. + +--- + +## Текущий контекст + +Рабочий проект и стек пока не заданы. Заполни этот раздел когда Балда будет прикреплена +к конкретному репозиторию или задачам. + +Шаблон для заполнения: +``` +## Проект + +- Репо: ~/Developer/ +- Стек: +- Основная ветка: main + +## Команда + +- alex (owner) — говорит по-русски, можно и по-английски +- <другие участники> + +## Соглашения + +- Стиль коммитов: Conventional Commits (feat/fix/chore/docs) +- PR: через gh cli, base=main +- Тесты: +- Линтер: + +## Workflow + +- Задачи приходят в Zulip топик +- Результат: коммит в ветку + краткий отчёт в тот же топик +``` + +## Провайдер + +`claude_code_acp` с моделью `claude-sonnet-4-6`. + +Если нужны особые флаги модели: +```yaml +runtime: + providers: + claude_code: + type: claude_code_acp + system_instructions: | + <вставить сюда содержимое этого файла> + claude_code_acp: + model: claude-sonnet-4-6 +``` diff --git a/personal/projects/archive/virfield-checkpoints-through-2026-10-08.md b/personal/projects/archive/virfield-checkpoints-through-2026-10-08.md new file mode 100644 index 00000000..1f54bf20 --- /dev/null +++ b/personal/projects/archive/virfield-checkpoints-through-2026-10-08.md @@ -0,0 +1,178 @@ +--- +title: Virfield +namespace: personal +updated: '2026-10-07' +status: historical +tags: + - virfield + - macos + - vm + - go + - infrastructure +archived: '2026-10-14' +--- +> [!WARNING] Исторический архив +> Чекпойнты до 2026-10-08. Не использовать старые пути, ветки, команды и статусы как текущий runbook. Актуальная карточка: [[personal/projects/virfield]]. + +# Virfield 3.0 — handoff checkpoint — 2026-10-07 15:35 Bishkek + +**Текущий статус: Stage 1 (Tart/Orchard migration) в работе; продолжать в `/Users/admin/Developer/virfield-v3`, branch `codex/virfield-v3-stage1`.** Это актуальная запись состояния; ниже сохранена история v2 от 2026-10-03. + +## Обновление 2026-10-08 22:20 — R3 живой: рабочий стол VM-аренд + +- `virfield desktop LEASE_ID [--print]`, кнопка Desktop в Web Console, MCP `vm_tunnel` с `"service":"desktop"` → `vnc://admin:<пароль аренды>@127.0.0.1:<порт>` (Screen Sharing.app входит сам). +- Гостевой Screen Sharing включается при подготовке каждой VM-аренды (`launchctl enable` + `bootstrap`), подготовка ждёт 5900. Tart: lease IP:5900 (host-only сеть). HTPC: guest 5900 → passt (`USER_PORTS=22,5900`, QEMU VNC → 5950) → loopback ноды (SSH-порт+1000) → SSH ноды. В LAN ничего нового. +- Туннели по сервисам (`ssh`/`desktop`), закрываются при release/истечении/дрейфе. Приёмка 11/11 (Tart Ventura + HTPC Sonoma), визуально Ventura-рабочий стол открылся без вопросов. +- Коммиты `24a6904`…`4277f72` + docs. Не сделано: noVNC в браузере, рабочий стол MacBook (Screen Sharing на томах). + +## Обновление 2026-10-08 21:30 — уборка, пробуждение арендой, сторож сна HTPC, спека R3 + +- Уборка: Lume удалён (brew); в корзину: `~/.lume` (253 ГБ), IPSW/архивы/upgrades/state/логи v2 из `~/.virfield-v2`, `virfieldd.pre-*`, хранилище Lume на Samsung (57 ГБ), сборочные папки HTPC (KDE-корзина). Оставлено живое: bin (virfieldd/virfield/virfield-mcp), config, токены, GHCR creds, `cache/xcode`, Orchard. Пользователю: очистить корзины; `sudo rm /Library/LaunchDaemons/ai.virfield.lume.plist`. Код Lume в репо — отдельная задача. +- Пробуждение арендой HTPC: PASS (готов через 27 с после WoL). +- `~/htpc-sleep-guard.py` (user unit `htpc-sleep-guard`): после отпускания удержания ждёт 30 мин и делает `systemctl suspend`, если ничего не держит сон и нет чужих block-ингибиторов; бэкап `htpc-sleep-guard.py.bak-20261008`. Причина: таймер простоя рабочего стола срабатывает один раз и истекал под удержанием Virfield. +- R3 (рабочий стол VM): спека `docs/superpowers/specs/2026-10-08-desktop-r3-design.md` (`a00fc57`) — гостевой Screen Sharing, туннель аренды `service=desktop`, `virfield desktop`, кнопка в Web Console; только VM (не MacBook), без noVNC. Ждёт ревью спеки → план. + +## Обновление 2026-10-08 21:00 — R2 живой: macOS-VM на HTPC арендуются через Virfield + +- План `docs/superpowers/plans/2026-10-08-remote-nodes-r2-macos-vms.md` выполнен (inline). Коммиты `5563aba`…`5599e0a` на `codex/virfield-v3-stage1`, задеплоено. +- Код: SSH-адрес = IP + порт (`VM/Lease.SSHPort`, контроллер, туннель, `ssh-config`); `guestssh` с портом аренды, маршрутизируемым dialer и списком моделей (`iMacPro1,1`); `nodes[].vms` в конфиге; скрипты ноды для VM (clone/start/stop/delete/commit/probe, баннер SSH); источник образа `node` и цепочка `build→qualify→stop→commit`; пакет `internal/nodeimage`; SSH Virfield к гостю — через закреплённое SSH ноды на `127.0.0.1:<порт>`. +- Защищённые golden на HDD HTPC: `htpc-sonoma-14.qcow2`, `htpc-sequoia-15.qcow2` (Virfield: пароль сменён, ключ управления, SSH только по ключу, автологин, проверка после перезагрузки). Шаблоны `htpc-sonoma-14`, `htpc-sequoia-15` в config. +- Приёмка 19/19: две VM (порты 22100/22101) + аренда хоста одновременно; чужой ключ и bootstrap-пароль отклоняются; после release всё убрано. Готовность двух VM разом ~9 мин (HDD), одна ~2 мин. +- Найдено и исправлено вживую: проброс порта принимает TCP раньше sshd (баннер + повтор рукопожатия, `0b0cf05`); `sysadminctl` дольше минуты (5 мин на мутации, `dcf96e2`); устаревший probe после commit (диспетчеризация по ImageID, `163caa4`). +- Осталось: тест пробуждения HTPC арендой (запущен), pmset на Monterey/Big Sur/Catalina, уборка сборочных папок на HTPC (`~/virfield/hackintosh/build`, контейнеры `vf-build-*`, `vf-test-*`), R3 gateway, VS Code debug на Tart, GHCR, Orchard. + +## Обновление 2026-10-08 16:40 — все тома MBP; macOS-VM на HTPC (R2) — golden-образы готовы + +- MBP: Monterey/Big Sur/Catalina/Ventura — все арендуются (по 5/5), host keys всех томов в `runtime.nodes[].host_keys` и `~/.ssh/known_hosts`. Management key добавлен на каждый том. `pmset -c` (без сна на зарядке) применён только в Ventura — остальные тома при загрузке. +- Код: `a37bddf` (несколько host keys), `8e32df3` (последний probe ноды хранится в `state_dir/nodes/*.probe.json` → asleep-нода арендуема после рестарта демона). Документы `c58e7a9`. +- HTPC: VT-x включён, `/dev/kvm` доступен без sudo; virtqemud работает, но libvirt не используется. +- R2 = rootless Podman + `dockurr/macos@sha256:08d1bcaa…` (QEMU+OpenCore), SIP off через OpenCore `csr-active-config=0x7F` (custom.plist). Спека `docs/superpowers/specs/2026-10-08-hackintosh-nodes-r2-design.md`. +- Golden-образы (HDD `/run/media/system/Data/virfield/goldens`, read-only): `sonoma-14.8.9-23J631-20261008.qcow2` (15 ГБ), `sequoia-15.8.1-24H32-20261008.qcow2` (18 ГБ) + `.opencore.plist`. Контракт как у Tart base: admin/admin, sudo без пароля, Remote Login, без сна/автообновлений, свежие host keys. +- Клоны: qcow2 overlay на SSD (`~/virfield/hackintosh/leases/`, `chattr +C`) поверх golden на HDD → SSH за ~110 с, overlay 57–77 МБ, новая identity (serial/MAC) на каждый клон. Клон зависает в конце shutdown → остановка = shutdown по SSH + `podman kill`. +- Сборочные папки (`~/virfield/hackintosh/build/{sonoma,sequoia}`, контейнеры `vf-build-*`, `vf-test-*`) пока оставлены; SSD HTPC свободно ~109 ГБ. +- Не сделано: провайдер Virfield для этих VM (код), secure-шаг Virfield на golden, тест пробуждения HTPC арендой (повтор), pmset на остальных томах MBP, R3 gateway, VS Code debug на Tart, GHCR publish, Orchard. + +## Обновление 2026-10-08 — MBP Big Sur: несколько host keys на одну ноду + +- Каждый том MBP имеет свой SSH host key → `runtime.nodes[].host_keys` (доп. идентичности); dialer принимает любой из них, lease отдаёт фактически предъявленный. Коммит `a37bddf`, задеплоено. +- Big Sur 11.7.9: ключ пользователя и management key добавлены в authorized_keys тома Big Sur; ключ Big Sur в `~/.ssh/known_hosts` (бэкап `known_hosts.bak-*`) и в config. Приёмка `mbp2014-big-sur` 5/5. +- Ранее сегодня: Finder/ASIF — спек-кэш `tart get` + листинг каталогов вместо `tart list` (`96dfae3`, `0283901`); Clone будит спящую ноду (`ad78b8d`). +- Дальше: Catalina/Ventura — enroll при загрузке (ключ пользователя + management.pub, `ssh-keyscan` → `host_keys`); HTPC VT-x/libvirtd → R2; повтор теста пробуждения арендой. + +## Обновление 2026-10-08 11:20 — Remote nodes R1 работает вживую + +- Спека `docs/superpowers/specs/2026-10-08-remote-nodes-r1-design.md`. SSH-first (агент позже), без sudo на нодах, «аренда того, что загружено». HEAD `9f2dabd`. +- Ноды в `~/.virfield-v2/config.json` (`runtime.nodes`): `mbp-2014` = admin@192.168.1.79 (MBP 11,1, Monterey 12.6.8 загружен; тома Catalina/Big Sur/Ventura/BOOTCAMP; sudo с паролем; без WoL); `htpc` = bazzite@192.168.1.86 (Bazzite 43, WoL B0:6E:BF:60:6D:64, keep-awake `/tmp/rsync-active`; VT-x выключен в UEFI → для R2 Hackintosh нужно включить). Host keys взяты из `~/.ssh/known_hosts`, отпечатки сверены. +- Management key Virfield: `~/.virfield-tart/nodes/management(.pub)`; добавлен в authorized_keys admin (только том Monterey!) и bazzite. Остальные тома MBP — enroll при загрузке. +- Шаблоны: `mbp2014-monterey|big-sur|catalina|ventura` (доступен только загруженный том), `htpc-bazzite`. +- Код: `internal/wol`, `internal/baremetal` (скрипты на ноде, псевдо-golden = имя тома, lease-маркеры `~/virfield/leases/`, ключ лиза с тегом `virfield-lease-`), `internal/fleet` (композит Tart + nodes, параллельно), per-host capacity в контроллере. +- Приёмка 20/20 (MBP + HTPC + Tart VM одновременно, Mac 1/2 слота). Тест пробуждения HTPC арендой — в процессе (ждём естественного сна). +- Наблюдение: Finder 356% CPU (обход VM-SSD) → `tart list/get` 12–18 с → кратковременные паузы admission. Рекомендовано `killall Finder`. + +## Обновление 2026-10-08 01:45 — macos27 на Tart, Broker smoke пройден + +- Шаблон `macos27` (ID, который используют Broker-воркеры) теперь Tart golden из `macos-golden-gate-xcode@sha256:324ea565…` (macOS 27.0/26A428, тот же IPSW, что у Lume-golden), SIP off, Xcode 27.0 (27A266a) переименован в `/Applications/Xcode.app`, общий рецепт `uitest-27-v1` (`internal/guestscripts/provision27.sh`, без `lume`). Квалификация с UI-test probe пройдена. +- Broker smoke (`execution-broker/scripts/macos-smoke.py --config-dir state/deploy --balda-container balda-mm-mac`) пройден без изменений Broker: run `run-af3ed27f…` succeeded, cleanup done, XCTest 1/0 fail. HEAD `7c12fdf`. +- Найдено и исправлено: `tart run` сразу после Packer падает «already running» — раньше проглатывалось (`b0e5bf7`); инвентарь Tart с ASIF-дисками не укладывался в 5 с (последовательные `tart get` ~1 с каждый) → admission на паузе, аренда висла в provisioning (`2101918`: параллельно + 30 с). +- Remote nodes R1 (MBP 2014: Catalina/Big Sur/Monterey, без WoL, «что загружено»; HTPC Bazzite 192.168.1.86 с WoL; SSH-first, агент позже; per-host capacity; композитный runtime) — дизайн предложен, ждёт одобрения. В LAN есть `kraken.local` (Raspberry Pi, Debian 12, 192.168.1.14) — кандидат в WoL-relay. + +## Обновление 2026-10-07 23:40 — Tart: оба golden приняты вживую + +- Live-сервис 7780 работает на Tart (`virfieldd` `ae7b3df`, подписан `Apple Development: mallexxx@gmail.com`, identifier `ai.virfield.virfieldd` — FDA-грант переживает пересборки). Docs-коммит `19f5c01`; запись в `docs/VERIFICATION.md#tart-image-adoption-2026-10-07`. +- Golden: `ventura-xcode-15.2` (13.7.4/22H420, Xcode 15.2, SIP off) и `monterey-xcode-13.4.1` (12.7.6/21H1320, Xcode 13.4.1, SIP on) — `image_ready`, собраны и квалифицированы job'ом без ручных шагов. Two-clone acceptance: 23/23 PASS каждый (изоляция SSH, ключи, Xcode, Swift, scp, удаление VM). Скрипт приёмки: в scratchpad сессии (`accept.sh`), не в репо. +- Исправлено по ходу live: probe тома (mount point), рост APFS в госте, гонка `packer init`, DeviceSupport extractor (bundle-файл), сброс local-network сессии после обновления демона (retry dial), `nfsd restart` при SIP on → `nfsd update`. +- Хост-требования: Full Disk Access для `~/.virfield-v2/bin/virfieldd`; `registry_credentials` для GHCR (Docker-креды на хосте отвергаются GHCR). +- Откат на Lume: `cp ~/.virfield-v2/config.lume.json ~/.virfield-v2/config.json` + бинарник `bin/virfieldd.pre-tart-20261007-205243` + `kill -TERM` PID (launchd поднимет). Lume state (`~/.virfield-v2`) не тронут, включая needs_attention job 13.6/Xcode 15.2. +- Дальше: Broker v1 smoke и VS Code remote-debug на Tart-арендах; GHCR push golden; Orchard; тест рестарта во время Tart build; pin sha256 плагина. Lume-шаблоны (macOS 27 UI-tests и др.) в Tart-режиме недоступны. + +## Обновление 2026-10-07 вечер — Tart adoption: этапы 1–2 реализованы (не развернуты) + +- Ветка `codex/virfield-v3-stage1`, HEAD `d60e72a`, дерево чистое, `make check` зелёный. Спека: `docs/superpowers/specs/2026-10-07-tart-image-adoption-design.md`; планы: `docs/superpowers/plans/2026-10-07-tart-guest-identity.md` (этап 1), `…-tart-adoption-pipeline.md` (этап 2). +- Решения пользователя: Tart window (один launchd job, отдельные config+state_dir, переключение только без активных Lume-аренд); профиль = OS базы + Xcode, SIP как в профиле; golden локально (push в GHCR позже); максимум Tart/Cirrus/Packer, Lume не развивать; Monterey включить. +- Этап 1: `guestssh` работает от `lease.GuestUser` (пусто → `lume`), Tart-аренды проходят `LeasePreparer`. Этап 2: `ImageProfile.Tart` (ghcr@sha256), `runtime.tart.image`, пакет `internal/qualify` (вынесен из `images`, Lume вызывает его с `lume`), `internal/tartimage` (встроенный Packer-рецепт, плагин `cirruslabs/tart = 1.21.0`, фазы `resolve → build → qualify → stop`), регенерация SSH host keys в каждом golden. +- Проверенные факты: Ventura base `sha256:9fb387bb…` = 13.7.4 (22H420), SIP выключен; Monterey `macos-monterey-vanilla:12.7.6` `sha256:4bc904cf…` = 21H1320, SIP включён (`macos-monterey-xcode`/`-base` в формате `disk.v1`, Tart 2.40 их не тянет). Обе в кэше `TART_HOME=/Volumes/Samsung970EVO/virfield-tart`. `tart clone` сохраняет ECID (local clone → новый MAC); APFS Encryption=true при FileVault off → для Tart разрешено. `~/.docker/config.json` содержит GHCR-креды, которые GHCR отвергает (403) — нужен `registry_credentials` с `ghcr-mallexxx.token`. Xcode XIP 15.2/13.4.1 в `~/.virfield-v2/cache/xcode/.xip` (verified). +- Этап 3 (в работе, ~21:10): плагин Packer `cirruslabs/tart 1.21.0` установлен, рецепт валиден. Lume-аренда `lease-c30327cb…` освобождена (VM удалена, подтверждено). Live-сервис переключён на Tart: `~/.virfield-v2/config.json` = Tart-конфиг (`state_dir ~/.virfield-tart`, контейнер `samsung-tart`, шаблоны `ventura-xcode-15.2`, `monterey-xcode-13.4.1`); откат = `config.lume.json` + `bin/virfieldd.pre-tart-20261007-205243` + restart. Исправлен баг probe тома (diskutil на не-mount-point, `f491ed4`). **Блокер**: macOS TCC не даёт `virfieldd` доступ к Removable Volumes → `tart list` в `TART_HOME` на Samsung висит/падает. Пользователь должен добавить `~/.virfield-v2/bin/virfieldd` в Full Disk Access; ad-hoc подпись → грант теряется при каждой пересборке (нужна стабильная подпись). Далее: сборка двух golden, две параллельные аренды каждого, запись в `docs/VERIFICATION.md`. Отложено из ревью: pin sha256 плагина, проверка runtime/profile при загрузке конфига. HEAD `02fb431`. + +## Обновление 2026-10-07 17:00 — dirty-дерево развернуто на 7780 + +- Исправлен логин: `api()` в `internal/web/app.js` сообщал «Cannot reach Virfield API» на любой `TypeError`, а `fetch()` бросает `TypeError` ещё до запроса, если токен содержит не-Latin-1/управляющие символы (кириллица, emoji, перевод строки). Теперь `Request` строится отдельно → `invalid_token` / «Invalid token format…»; «Cannot reach» только при реальном сбое сети. Неверный ASCII-токен → серверный 401 «a valid bearer token is required». Проверено вживую в UI. +- Разобраны незакоммиченные Go-правки (registry credentials только для matching Tart remote, APFS free-space fallback, тесты) — оставлены. Ограничение: registry host с портом (`localhost:5000`) отклоняется валидацией. +- Открытый вопрос: CSP в `internal/httpapi/server.go` ослаблен (`style-src 'unsafe-inline'`, `img-src data:`), но UI не использует inline styles/data: URI (meters на ``). Кандидат на откат к строгому CSP — решение за владельцем. +- `make check` exit 0, `git diff --check` чисто, `make build` прошёл. Деплой: исходники = HEAD `8830ad9` + dirty-дерево (не закоммичено); `virfieldd` sha256 `b6dbc77d4e1b05122aca9b5ad146ae609abbe226d71ec28da818bfad12758f97`. Rollback: `~/.virfield-v2/bin/virfieldd.pre-v3-20261007-165759` (это бинарник, лежавший на диске с 15:18; работавший до этого процесс PID 54497 был запущен в 13:50 из более старого, уже заменённого файла). +- Перезапуск без sudo подтверждён: `kill -TERM` единственного PID → launchd (`KeepAlive`) поднял PID 65669 за 2 с, last exit code 0. 7780 отдаёт `app.js`, идентичный worktree. Статус после рестарта: lease `lease-c30327cb…` (macos27, samsung, 192.168.64.211) остался `ready`, VM running, SSH доступен; job `job-3adb9d9d…` (13.6/Xcode 15.2) по-прежнему `needs_attention` (`image_command_failed` на Setup Assistant) — требует отдельного разбора по recovery-процедуре. + +## Что проверено сейчас + +- Worktree: HEAD `8830ad9` (`Add Tart and Orchard runtime providers`), родительский план `6013310`. Восемь файлов modified и не закоммичены: `cmd/virfieldd/main.go`, `internal/config/config.go`, `internal/httpapi/server.go`, `internal/tart/client.go`, `internal/tart/client_test.go`, `internal/web/app.js`, `internal/web/index.html`, `internal/web/style.css`. Не откатывать и не считать эти изменения заведомо своими без проверки. +- `http://127.0.0.1:7780` отвечает HTTP 200 и отдаёт v3 UI (Fleet / Images / Activity, Hosts & storage). Факт подтверждён запросом к live-сервису. +- Live `virfieldd`: launchd label `system/ai.virfield.virfieldd`, PID 54497 на момент проверки, пользователь `admin`; plist `/Library/LaunchDaemons/ai.virfield.virfieldd.plist` запускает `~/.virfield-v2/bin/virfieldd -config ~/.virfield-v2/config.json`. Имя `virfield-v2` — legacy путь развертывания, не доказательство версии исходников. +- Точная ревизия уже работающего процесса не установлена. Не заявлять, что бинарник на 7780 собран из HEAD `8830ad9`. +- Текущий dirty source успешно компилируется (`go build -trimpath -o /private/tmp/virfieldd-v3-check ./cmd/virfieldd`) и полный `make check` прошёл на этом состоянии 2026-10-07: docs links, Python tests, gofmt, `go vet ./...`, `go test -race ./...` (включая `internal/tart` и `internal/orchard`). Реальный Tart VM lifecycle и live Orchard acceptance не прогонялись. + +## Следующее действие + +> Шаги 1–5 ниже выполнены 2026-10-07 (см. обновление выше). Дальше: закоммитить проверенное дерево на `codex/virfield-v3-stage1`; решить по CSP; разобрать `needs_attention` job 13.6/Xcode 15.2; затем Phase 1 — digest-pinned Cirrus Tart adoption и две disposable Tart clone/boot/SSH/release проверки. + +1. Разобрать каждое из восьми незакоммиченных изменений и сохранить нужное; проверить владельца/намерение, не затирать. +2. Прогнать `make check` в этом worktree и устранить регрессии. +3. Собрать `make build`; сохранить копию текущего deployment binary для отката, заменить `~/.virfield-v2/bin/virfieldd` собранным бинарником. +4. Перезапуск текущего launchd job пока не проверен. Для контролируемой проверки после сборки: + ```sh + pgrep -x virfieldd + # Убедиться, что найден ровно один PID текущего сервиса. + kill -TERM PID + launchctl print system/ai.virfield.virfieldd | rg 'state =|pid =|runs =' + curl -fsS http://127.0.0.1:7780/ | rg 'v3|Fleet|Hosts & storage' + ``` + Причина ожидания автоматического старта: plist имеет `KeepAlive=true`, процесс работает от `admin`, а deployment directory принадлежит `admin`. Это ожидаемый способ без `sudo`, но пока не подтверждён живой проверкой. Если launchd не поднял новый PID, остановиться и диагностировать; не запускать второй daemon. + + Сборка/установка (после успешных проверок; перед заменой сохранить бинарник для rollback): + ```sh + cd /Users/admin/Developer/virfield-v3 + make check + make build + cp -p /Users/admin/.virfield-v2/bin/virfieldd /private/tmp/virfieldd-before-v3 + install -m 755 bin/virfieldd /Users/admin/.virfield-v2/bin/virfieldd + ``` + До live-проверки не объявлять обновление завершённым. Общий install/runbook находится в `docs/OPERATIONS.md`; он описывает регистрацию system LaunchDaemon с `sudo`, но не dev-перезапуск существующего job без `sudo`. +5. После подтверждения записать точный commit/build и результат live-проверки здесь. До этого не создавать второй listener и не менять порт. + +## План/код — актуальный разбор + +**Есть в коде:** единый `provider.Runtime` seam; конфиг выбирает Tart либо Orchard для одного процесса; Tart inventory/clone/run/stop/delete и отдельные `TART_HOME` storage containers с UUID/availability/free-space; Orchard worker/VM inventory, labels, per-host CPU/RAM/VM-slot capacity, offline reasons, create/stop/delete; общий lease/controller; Hosts/storage UI; WoL magic-packet sender; registry credentials передаются только командам Tart с matching registry host. Текущие dirty правки также чинят disk free-space APFS fallback, CSP для нового UI и registry auth. `make check` прошёл на текущем dirty дереве. + +**Частично / не принято live:** внешний SSD и device groups отражаются из конфига/runtime observations, но отдельная независимая durable device registry в SQLite не добавлена; WoL отправляется самим процессом на configured broadcast, а не через отдельный same-L2 node-agent relay; Tart/Orchard проверены unit tests, но ни Cirrus digest adoption, ни реальная VM lease/clone/boot/SSH/release, ни live Orchard pool не приняты. Один `virfieldd` выбирает ровно один runtime — смешанный local Tart + remote Orchard/Lume provider routing пока отсутствует. + +**Не сделано из плана:** node-agent и bare-metal lease для Intel Mac/Linux; connection grants/access gateway; VNC/noVNC и единый desktop; v3 API/target capability model; VS Code extension (остаётся генератор workspace/LLDB v2); libvirt/QEMU/OpenCore Hackintosh; Broker contract migration; distributed image worker/promotion; drain, multi-host lifecycle acceptance и production rollout. `image_tools` pipeline остаётся Lume-only и явно отклоняется при Tart; для Tart нужен отдельный digest-pinned Cirrus adoption/qualification path. + +`docs/VIRFIELD-3-PLAN.md` остаётся целевой архитектурой, но 2026-10-07 его этапы обновлены: Phase 1 теперь Tart/Cirrus adoption и отдельная Orchard acceptance; статус, незакрытые gates и отличие unit tests от live acceptance прописаны. Docs link check и `git diff --check` прошли. Изменение в worktree пока не закоммичено. + +- Источник кода — worktree `virfield-v3`; live deployment — `~/.virfield-v2`; это разные копии. 7780 показывает v3 UI, но точная ревизия процесса не установлена. + +--- + +# Virfield — статус 2026-10-03 + +**Следующее действие:** проверить загрузку, работу и удаление временного клона из нового чистого образа Monterey/Xcode. + +## Состояние + +- Monterey 12.6 + Xcode 13.4.1: образ `image_ready`, временный legacy-клон прошёл загрузку, компиляцию Swift, SSH, выгрузку артефакта и очистку. Тест `TestLiveLeaseSSH` прошёл за 86,99 с 2026-10-03. +- Исходный образ `macos-12.6-xcode-13.4.1` остановлен и сохранён. Временный клон удалён; активных заданий и занятых слотов нет. +- Release-ready: нет. Чистая сборка прошла; клон нового образа и полный путь Balda/Broker ещё не приняты. +- Ветка `codex/versioned-images`: локальный коммит `19e01ac`; push не сделан. + +## Установка Xcode и размер диска + +- macOS 13+ использует VirtioFS. Monterey не монтирует VirtioFS; его путь передаёт проверенный XIP по закреплённому SSH и сверяет SHA-1 в госте. +- На существующей 80 GB VM `xip` отказался распаковываться при ~42 GiB свободного места. Фолбэк передал проверенный Xcode.app по SSH без macOS tar metadata; гостевая подпись Apple и точная версия прошли проверку. +- XIP занимает ~10 GB. Кэшированный Xcode.app занимает ~17 GB на хосте; несжатый поток файлов составил ~32 GiB. Готовая 80 GB VM занимает на хосте ~49 GiB. +- Новые macOS 11/12 VM с Xcode получают разреженный виртуальный диск 120 GB. Чистая сборка подтвердила, что XIP распаковывается на нём без фолбэка; готовый новый диск занимает 34,8 GiB на хосте. Существующая 80 GB VM не увеличивалась. + +## Legacy-клон и проверки + +- `legacy_uuid` допускает APFS encryption at rest при выключенном FileVault и только одного активного worker. Registry publish для этого образа запрещён. +- Первый живой клон не загрузился: Lume поменял `machineIdentifier` и MAC-адрес. Он был удалён. Virfield теперь восстанавливает оба значения из остановленного образа до запуска копии и проверяет наличие скопированного NVRAM. Обычные клоны сохраняют новую идентичность. +- Повторный клон подтвердил Xcode 13.4.1 / 13F100, Swift, SIP, Finder, политику диска, закреплённый SSH, отказ ключу исходного образа, туннель и SCP-артефакт. Второму одновременному legacy worker отказано. После теста исходный образ остался `image_ready`. +- Чистая сборка `macos-12.6-xcode-13.4.1-clean-20261003` завершилась без ручного восстановления: задача `job-ca072dfb3bfee011bd7ee9fcd28d8f46` succeeded, образ `image_ready` и остановлен. Первый запуск через `image-create` был отклонён из-за APFS: эта команда не задаёт `legacy_uuid`; неудачная VM удалена с разрешения пользователя. Повторная сборка использовала профиль в `config.json` с legacy UUID. +- `make check` и `make build` прошли; установленный менеджер обновлён. Подробные результаты — `docs/VERIFICATION.md`; контракт установки — `docs/IMAGE-PIPELINE.md`. diff --git a/personal/projects/balda/balda-kraken-mm-deploy.md b/personal/projects/balda/balda-kraken-mm-deploy.md index 1653cbd1..9a09f5e3 100755 --- a/personal/projects/balda/balda-kraken-mm-deploy.md +++ b/personal/projects/balda/balda-kraken-mm-deploy.md @@ -1,3 +1,8 @@ +> [!WARNING] Исторический документ +> Не использовать как runbook текущей Balda. Актуальная локальная схема, пути и команды: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Текущий контейнер: `balda-mm-mac`; config: `/Users/admin/Docker/balda-mm-mac/config/config.yaml`; Obsidian MCP: `type: http`, `http://host.docker.internal:3101/mcp`. +> Материал ниже сохранён только как история. + # Фаза 3 — Балда на Kraken + Mattermost (деплой) > ⛔ **2026-09-29: СТЕК СНЕСЁН.** Контейнеры `balda-mm`, `balda-executor-mcp`, `obsidian-mcp` diff --git a/personal/projects/balda/balda-mattermost-connector.md b/personal/projects/balda/balda-mattermost-connector.md index 29962aed..d99e33bb 100755 --- a/personal/projects/balda/balda-mattermost-connector.md +++ b/personal/projects/balda/balda-mattermost-connector.md @@ -1,7 +1,12 @@ -# Balda — Mattermost коннектор (архитектура) +# Balda — Mattermost-коннектор: исторический дизайн + +> [!WARNING] Историческая спецификация +> Код Mattermost-коннектора принят в [PR #8](https://github.com/baldaworks/balda/pull/8), merged **2026-09-29**; статус перепроверен **2026-10-14**. +> Схема, пути, команды и результаты ниже описывают версию сентября и не служат текущим runbook. +> Текущий запуск: [[personal/projects/balda/setup]]. Текущие PR и код: [[personal/projects/balda/balda]]. Broker/ingress recovery и приёмка: [[personal/projects/balda/execution-broker]]. > Создано 2026-09-26. Обновлено 2026-09-28 (правки по ревью применены). -> Статус: **✅ PR ОТКРЫТ — baldaworks/balda#8, 8/8 CI PASS, MERGEABLE.** +> Статус PR: **MERGED, 2026-09-29**. Приведённые ниже CI и commit IDs — история приёмки PR #8. > 🟢 **PR:** https://github.com/baldaworks/balda/pull/8 — 46 файлов, +6850/−27, 9 коммитов. > Фаза 2 закрыта полностью: код, 103+ новых теста, доки, зелёный CI. > Блокер `tools/` снят: `/tools/` в `.gitignore` + `git rm -r --cached tools/`. diff --git a/personal/projects/balda/balda-mm-delegation-plan.md b/personal/projects/balda/balda-mm-delegation-plan.md index 028af281..467e713a 100755 --- a/personal/projects/balda/balda-mm-delegation-plan.md +++ b/personal/projects/balda/balda-mm-delegation-plan.md @@ -1,3 +1,8 @@ +> [!WARNING] Историческая схема Balda +> Не использовать пути, контейнеры, provider или MCP transport из этой заметки для текущего запуска. +> Канонический текущий runbook: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Актуально: `balda-mm-mac`, `/Users/admin/Docker/balda-mm-mac/config/config.yaml`, Mattermost, Codex ACP, Obsidian `type: http` → `http://host.docker.internal:3101/mcp`. + # Balda 2.0 — Mattermost + распределённое делегирование (план) > Создан 2026-09-25. Статус (обновлён **2026-09-28**): **Фазы 1-3 закрыты** (MM на Kraken · diff --git a/personal/projects/balda/balda-valera.md b/personal/projects/balda/balda-valera.md index 8014f6fb..6351a027 100755 --- a/personal/projects/balda/balda-valera.md +++ b/personal/projects/balda/balda-valera.md @@ -1,3 +1,8 @@ +> [!WARNING] Историческая схема Balda +> Не использовать пути, контейнеры, provider или MCP transport из этой заметки для текущего запуска. +> Канонический текущий runbook: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Актуально: `balda-mm-mac`, `/Users/admin/Docker/balda-mm-mac/config/config.yaml`, Mattermost, Codex ACP, Obsidian `type: http` → `http://host.docker.internal:3101/mcp`. + # Балда / Валера — эксплуатация & MCP debug > ## ⛔ СНЕСЁН 2026-09-29 — агент удалён на Mac diff --git a/personal/projects/balda/balda.md b/personal/projects/balda/balda.md index 26b1e3e6..73d11324 100755 --- a/personal/projects/balda/balda.md +++ b/personal/projects/balda/balda.md @@ -1,115 +1,31 @@ -# Balda (Валера) — AI Worker Bot +# Balda — актуальный обзор -> **Актуальный статус — 2026-10-03.** Mattermost-интеграция PR #8 уже в upstream. [PR #12](https://github.com/baldaworks/balda/pull/12) по маршрутизации webhook открыт на `73e02156`: 8/8 GitHub checks прошли; повторное ревью после исправления запрошенных изменений ещё ожидается. Balda запущена из чистого текущего HEAD PR `73e02156`, и хеш бинарника в контейнере совпадает с собранным артефактом. Ревьюер запросил изменения в PR #12 из-за 404 при временном сбое lookup session. Исправление `73e02156` уже отправлено: теперь ответ 503, добавлен HTTP-тест; локальные race tests и lint прошли, все 8 checks нового HEAD прошли. До повторного сквозного прогона merge/release — NO-GO. Прежний вывод о другом SHA был ошибкой: `d094943b` относился к внешнему репозиторию Broker, а `deepseekfix` был старой меткой образа. Локальных правок кода Balda в текущем бинарнике нет; новый сквозной прогон ещё нужен. Приёмочный Broker run `run-fbe2cb459fe2965554402aba1bd5fcd0` прошёл; Mattermost отправил апрув и финал в исходный тред. Результат `4dafb9d` был доставлен в `go-cli-test` вручную через Broker API: Balda пропустила автоматическую публикацию. Broker теперь сам проверяет commit/quality/bundle без обязательного SHA от Balda; webhook и плагин rc.19 требуют публикацию до закрытия Story. Новый end-to-end прогон ещё не проведён. Общий release — NO-GO. Детали и текущие проверки: [[personal/plans/balda-callee-prism-plan]]. Ниже сохранена историческая документация; старые статусы PR и конфигурации не являются текущими. +Проверено: **2026-10-15**. Balda принимает задачи из чата и связывает provider execution, сессии и интеграции. Текущий локальный запуск — **два инстанса на Mac, Mattermost, Codex ACP**: `balda-mm-mac` и `balda-mm-eagle`. Оба работают на source `6238856b` (upstream `6621b189` с исправлением контекста канала); Eagle имеет те же основные MCP и дополнительный Asana readonly. Точные версии и проверенные границы продолжений — в карточке запуска. -Аналог Hermes. Go-сервис: берёт задачи из чата (Telegram или Zulip), запускает AI CLI и отвечает. +## Источники текущего состояния -## Репо +- [[personal/projects/balda/setup|Работающий контейнер, конфигурация, MCP и перезапуск]] +- [[personal/projects/balda/execution-broker|Broker/Balda: проверенные версии, артефакты и незавершённая работа]] +- [[personal/projects/balda/soul|Снимок global instruction]] +- [[personal/projects/balda/workspace-context|Provider context]] -- Upstream: https://github.com/baldaworks/balda (старое имя `normahq/balda` — редирект) -- Fork: https://github.com/mallexxx/balda -- Local: ~/Developer/balda -- Ветка: `feat/mattermost-channel` (PR [#8](https://github.com/baldaworks/balda/pull/8), OPEN, 8/8 CI, MERGEABLE) +В карточках указаны работающий образ, действующая конфигурация и границы готовности Broker. -### 🔴 Два репозитория — не путать +## Репозитории -| Репо | Что там | PR | -|---|---|---| -| **`baldaworks/balda`** | сам бот, транспорты (Mattermost, Zulip) | [#8](https://github.com/baldaworks/balda/pull/8) Mattermost, OPEN · [#1](https://github.com/baldaworks/balda/pull/1) Zulip, merged | -| **`normahq/runtime`** | библиотека рантайма (`agentfactory`, `hostedagent`) | [#5](https://github.com/normahq/runtime/pull/5) фикс MCP-тулинга, OPEN · **`CHANGES_REQUESTED`** (3 дефекта, план — [[personal/plans/runtime-pr5-toolset-dedup-review-fixes]]) · [#4](https://github.com/normahq/runtime/pull/4) OpenAI tool_calls, OPEN (4 дефекта закрыты, [[personal/plans/runtime-pr4-openai-toolcalls-fixes]]) | +Upstream: [baldaworks/balda](https://github.com/baldaworks/balda). Fork: [mallexxx/balda](https://github.com/mallexxx/balda). -Форки: `mallexxx/balda`, `mallexxx/runtime` — **разные**, клоны тоже разные. -Детали по runtime-PR → [[personal/projects/balda/balda-valera]]. +## Конфигурация и владение -⚠️ **PR из форка: CI не запускается сам.** GitHub требует ручного подтверждения workflows -владельцем репо («Approve and run workflows») → `mergeStateStatus: UNSTABLE` при -`check-runs: total_count 0`. Это не поломка PR. +Действующий конфиг: `/Users/admin/Docker/balda-mm-mac/config/config.yaml`. Dev-конфиг в `~/Developer/balda` — отдельный файл. Provider — `codex_acp`, reasoning `medium`; Obsidian MCP — `type: http`, `http://host.docker.internal:3101/mcp`. -## Архитектура +Balda и локальные агенты владеют оркестрацией, MCP, search/Obsidian и прикладными workflows. Execution Broker владеет disposable worker, lifecycle, credentials, инструментами и артефактами; его незавершённые задачи перечислены отдельно. -- NATS JetStream — event bus (embedded) -- SQLite — состояние (owner, sessions, tasks) -- Telegram — через polling или webhook -- Zulip — через outgoing webhook bot -- Providers: codex, opencode, copilot, gemini, claude (ACP protocol) +Документация кода: [README](https://github.com/baldaworks/balda/blob/main/README.md), [configuration](https://github.com/baldaworks/balda/blob/main/docs/reference/configuration.md), [plugins](https://github.com/baldaworks/balda/blob/main/docs/reference/plugins.md). -## Zulip Integration +## История -Полностью реализована. Webhook-based (не polling). -Тип бота: **Outgoing webhook** (не Generic bot). - -### Credentials (zulip.qentra.top) - -- Bot email: `balda-bot@zulip.qentra.top` -- API key: `AtC9FypdIl6F0hNICW0lcOzehrVrWhPr` -- Server URL: `https://zulip.qentra.top` -- Webhook token: берётся из Settings → Bots → balda-bot → Edit → Token - -### Config (env vars) - -``` -BALDA_ZULIP_BOT_EMAIL=balda-bot@zulip.qentra.top -BALDA_ZULIP_API_KEY=AtC9FypdIl6F0hNICW0lcOzehrVrWhPr -BALDA_ZULIP_SERVER_URL=https://zulip.qentra.top -BALDA_ZULIP_WEBHOOK_TOKEN=<из настроек бота> -BALDA_ZULIP_WEBHOOK_ENABLED=true -``` - -### Webhook setup в Zulip - -1. Settings → Bots → balda-bot → Edit -2. Bot type: Outgoing webhook -3. Endpoint URL: `http://:8090/zulip/webhook` -4. Скопировать token → `BALDA_ZULIP_WEBHOOK_TOKEN` - -### Авторизация - -После запуска написать боту в DM: -``` -/start owner= -``` - -## Реализованные команды (Telegram parity) - -| Команда | Статус | -|---------|--------| -| `/start owner=` | ✅ | -| `/start invite=` | ✅ | -| `/goal ` / `/goal clear` | ✅ | -| `/topic` | ✅ (создаёт сессию для нового топика) | -| `/user add ` | ✅ | -| `/user list` | ✅ (с инвайтами + expiry) | -| Typing indicator | ✅ (isDM-aware: true в DM, false в стримах) | -| plan_updates / SendDraftPlain | ➖ no-op (нет аналога в Zulip) | - -## Upcoming: mention-based thread takeover - -Когда `@balda-bot` упоминается в топике без активной сессии — бот автоматически берёт топик под контроль. - -Механизм (аналог whale-thread-guard в Hermes): -- Webhook payload поле `trigger == "mention"` → auto-create session -- `allowed_owners` список в конфиге: Zulip email без токена -- После захвата топик отвечает на все сообщения (обычная сессия) - -## Конфиг и инструкции - -- [`balda/soul.md`](balda/soul.md) — soul (global_instruction) — редактировать здесь, синхронизировать в config.yaml -- [`balda/workspace-context.md`](balda/workspace-context.md) — per-provider system_instructions (рабочий проект/стек) -- `~/Developer/balda/.config/balda/config.yaml` — основной конфиг (runtime + balda) -- `~/Developer/balda/.env` — секреты (Zulip API key, webhook token) - -### Запуск - -```bash -cd ~/Developer/balda && ~/.local/bin/balda start -``` - -После первого запуска: из логов взять `owner_token` и отправить боту в Zulip DM: -``` -/start owner= -``` - -## Docs - -- `docs/zulip-webhook.md` — полное руководство по настройке -- `docs/balda.md` — техническая спецификация +- [[personal/projects/archive/balda-reference-before-2026-10-14|Прежняя карточка, Zulip и старые provider templates]] +- [[personal/projects/balda/balda-mattermost-connector|Исторический дизайн Mattermost-коннектора]] +- [[personal/plans/balda-callee-prism-plan|Архив раннего плана Broker/Callee/Prism]] +- Старые Kraken/Valera/Claudio runbooks помечены историческими и не задают текущий запуск. diff --git a/personal/projects/balda/claudio-klaudiy.md b/personal/projects/balda/claudio-klaudiy.md index d7847f51..78d97ea2 100755 --- a/personal/projects/balda/claudio-klaudiy.md +++ b/personal/projects/balda/claudio-klaudiy.md @@ -1,3 +1,8 @@ +> [!WARNING] Историческая схема Balda +> Не использовать пути, контейнеры, provider или MCP transport из этой заметки для текущего запуска. +> Канонический текущий runbook: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Актуально: `balda-mm-mac`, `/Users/admin/Docker/balda-mm-mac/config/config.yaml`, Mattermost, Codex ACP, Obsidian `type: http` → `http://host.docker.internal:3101/mcp`. + # Клавдий (Claudio) — эксплуатация ## Расположение diff --git a/personal/projects/balda/execution-broker.md b/personal/projects/balda/execution-broker.md new file mode 100644 index 00000000..8094bda1 --- /dev/null +++ b/personal/projects/balda/execution-broker.md @@ -0,0 +1,81 @@ +# Execution Broker — эксплуатация + +Проверено: **2026-10-15** по исходникам, работающим контейнерам и реальным запускам. Полная release-ready приёмка ещё не завершена. + +## Развёрнутый комплект + +| Компонент | Текущее состояние | +| --- | --- | +| Репозиторий | `/Users/admin/Developer/execution-broker`, `codex/production-readiness`; основной комплект `fee5409`, Broker hotfix `1b09e0f` | +| Broker | `execution-broker:1b09e0f`, версия `0.1.0-rc.32+approval30.1b09e0f`, immutable SHA256 pin в Compose | +| Gateway | `execution-broker-gateway:fee5409`, версия `0.1.0-rc.32` | +| Prism | `execution-prism-adapter:fee5409`, версия `0.1.0-rc.32` | +| Smoke worker | `execution-broker-worker:fee5409`; один SHA256 image pin в Broker и gateway | +| OpenCode worker | `execution-broker-executors:fee5409`; один SHA256 image pin в Broker и gateway, Go SDK 1.26.9 | +| macOS bootstrap | Четыре пакета `*-fee5409.tar.gz` с Runner/Callee этого комплекта | +| Оба Balda | Source `6238856b`: upstream `6621b189` + исправление контекста канала; image `balda-balda:upstream-6621b189-channel-fix`; подробности в [[personal/projects/balda/setup]] | +| Managed plugin | rc32 у обоих, Enabled=true, Drifted=false; прежние plugin data, revisions и marketplace сохранены | +| Release archives | `0.1.0-rc.32`, source `fee5409`; четыре платформенных архива и plugin в `dist/`, SHA256 проверены | + +Docker socket и daemon group отсутствуют у coding workers. Административный доступ к Docker остаётся у gateway. Основные модели, home volumes и история обоих Balda сохранены; сессии не сбрасывались. Серверная проверка Codex auth: models endpoint отвечает HTTP 200 у обоих инстансов. У @balda дополнительно проверена реальная генерация в ephemeral read-only сессии: `AUTH_OK`, `turn.completed`, exit 0. Исходный аккаунт сохранён; Balda перечитал credentials после обычного перезапуска. + +## Инструменты и артефакты + +`execution_profiles` показывает разрешённые tooling profiles. Подготовка окружения задаётся декларативно: platform, версии, approved packages/archives, SHA256 и readiness probes. Новый стек требует подходящего operator profile; Makefile сам по себе не устанавливает зависимости. + +В текущем контуре Go 1.26.9 задан стандартным profile для Linux OpenCode и четырёх macOS workers. Специального Go installer в Runner больше нет. Tooling cache хранит проверенные immutable archives, ограничен 4 GiB; фактические версии сохраняются в `tooling.json`. Временные build products выполняются внутри приватного каталога run; общий Linux `/tmp` остаётся `noexec`. + +Отдельный Git cache хранит immutable bundles по repository/commit с лимитом 4 GiB, durable deadline holds и отдельными run-scoped токенами. Disposable checkouts не разделяют mutable worktree и upstream credentials. В production `linux-smoke` подключён к внутренней control-сети Broker; cache/inputs/tooling требуют рабочего маршрута к Broker, одного публичного HTTPS clone недостаточно. + +Durable смена окружения использует явно заданный operator checkpoint: остановка Callee и credential fence → snapshot исходников с сохранением base ancestry → cleanup старого worker → `execution_reconfigure` → отдельный owner approval → новая immutable среда и фиксированный continuation. Task и исходный deadline сохраняются; максимум две замены, один admission на checkpoint, отмена охватывает цепочку. Ожидание approval не резервирует worker capacity. Это opt-in политика workflow; в стандартных coding packs checkpoints по умолчанию не включены. Произвольный live graph не сериализуется и не переигрывается. Требуется `execution/v3`. + +Artifact inputs реализованы и развёрнуты через `execution/v2`: до восьми файлов, суммарно до 1 GiB, точные source run/name/SHA256 и исходная сессия. Source run должен быть терминальным с `cleanup=done`; transactional retention holds защищают принятые зависимости. Передача возобновляется до начала исполнения. + +## Продолжения и одобрения + +Generic webhook в текущем Balda запускает изолированное задание. Канонический канал исходной сессии остаётся Mattermost; Telegram approval не меняет её locator. Продолжение исходной сессии использует `balda.state` и `balda.session.wait`; попытка и наблюдатель сохраняются до Start/retry. Потерянный admission восстанавливается через `execution_lookup`, отмена закрывает и поздний идентичный запрос. Прежние callback routes Broker приостановлены; недоставленные cursors сохранены. + +Telegram approval bot получает вопрос только для явно выбранных сессий; иначе вопрос принадлежит исходной беседе. В текущем контуре `telegram_approvals.timeout_seconds=1800`: окно ответа — 30 минут. `min_run_ttl_seconds=3600` требует для новых запусков выбранных сессий общий TTL не меньше часа; более короткий запрос получает `approval_window_too_short` до admission. TTL включает очередь, планирование, ожидание ответа и исполнение; исходный deadline остаётся жёсткой границей и при появлении вопроса не продлевается. Сообщение сначала отправляется без кнопок, message ID сохраняется в state, затем публикуются controls. Рестарт завершает прерванную публикацию или renewal без повторного callback. Устаревшая копия очищается при callback до сохранения update cursor. Ответ владельца передаётся через bound `execution_respond`; модель не подменяет его. `execution_retry` сохраняет точный task, Story, revision, executor и действительное одобрение; новый scope требует нового решения. Для environment checkpoint используется `execution_reconfigure`; обычный retry таких runs запрещён. + +Managed lifecycle и native wait restart проверены на развёрнутом Balda. Реальный conversational smoke прошёл: модель использовала исходные Story/Task, подтвердила observer/recovery waits, дождалась фактического Telegram-ответа владельца и получила `succeeded`, `cleanup=done`. Все шесть артефактов скачаны с проверкой SHA256; единственный итоговый ответ подтверждён через Mattermost API в исходной беседе, оставшиеся waits отменены. Приватные доказательства: `state/balda-channel-context-20261015/`. Outage/restart реальной модельной беседы также прошёл: Balda получила HTTP 502, затем Broker/Prism/Balda были перезапущены; сохранились тот же run/Story, provider thread и исходный deadline. После фактического Telegram approval подтверждены `succeeded`, шесть скачанных SHA256-проверенных артефактов, `cleanup=done`, закрытие Story/Task и единственное сообщение о завершении restart-приёмки в исходном Mattermost. Native waits отменены, duplicate admission и остаточных worker container/volume нет. Существующие сессии принимают новый capability snapshot через обычный `/reset`; обновление само их не сбрасывает. + +## Проверки + +- Полные race/vet Broker на macOS ARM64 и Linux ARM64; Callee adapter, source/binary govulncheck — 0 reachable vulnerabilities, secret scan — без находок. +- Развёрнутый Balda source `6238856b`: полный race, lint, architecture gate и govulncheck (0 reachable); SQLite/PostgreSQL migration regressions, оба migration validators, managed plugin lifecycle и native wait restart. Существующий Codex thread продолжился с исправленным Mattermost-контекстом. +- Production service acceptance: настоящий Callee Human → restart Broker/Prism → resume → шесть артефактов с проверенными SHA256 и provenance Git cache → `succeeded`, `cleanup=done`; Task и Story закрыты. +- Реальная Balda-сессия: исправленный Mattermost-контекст → durable waits → Broker smoke → фактический Telegram approval → шесть скачанных артефактов с проверенными SHA256 → `cleanup=done` → итог в исходной Mattermost-беседе. Доставка и отсутствие дубликата подтверждены readonly API. +- Настоящая macOS VM: verified Go archive через scoped tunnel, `tooling.json`, один XCTest без ошибок и сохранённый xcresult; восемь артефактов с проверенными SHA256, включая `repository.json`, VM cleanup подтверждён. +- Реальные Make/C, Python, Node и JVM проекты на macOS и Linux; Docker builder/Runner/Callee cache hit и изменение Node SDK; durable смена окружения с двумя рестартами и одним выполнением внешнего действия; отдельная проверка реального `go run` при `/tmp noexec`. +- Artifact input transfer/restart/cleanup и установка из Linux ARM64 release archive без исходников и Go прошли. +- Runtime archives: все четыре платформы — native. Linux AMD64 проверен на физическом htpc x86_64; Darwin AMD64 — на MacBook Pro 13″ 2014, Intel i5-4278U, macOS 12.6.8 (21G725), Python 3.8.9 через pinned Virfield SSH. Оба AMD64-прогона проверили семь binaries, MCP/auth rejection, synthetic vault import/revoke, SQLite backup и graceful shutdown; рабочие provider credentials не использовались. + +Сервисные fixtures не подтверждают выбор tools и доставку результата моделью в настоящей беседе. + +## Незавершённый объём + +| Область | Что остаётся | +| --- | --- | +| Recovery | Выбран порядок: unattended восстановление рабочих ключей из защищённой копии, затем OAuth при неудаче восстановления/refresh. Production escrow ещё не настроен: нужен независимый recovery public key или secret store. Native перенос тестового vault проверен; рабочие master keys не экспортировались | +| Docker providers | Для настроенных Linux OpenCode/DeepSeek, Codex и Claude нужны отдельные реальные Story, повтор на свежем worker, restart, credential checkpoint/reuse и проверка sandbox/запрета записи. Синтетические lifecycle-тесты не закрывают эту приёмку | +| Provider lifecycle | Для macOS Claude не закрыта реальная expiry/upstream revocation; для macOS OpenCode/DeepSeek — denied-write и upstream revocation. Claude умеет сохранить явный отказ native cache как reauthentication-required и запросить OAuth при следующем admission; это не доказательство реальной provider-приёмки | + +Источник требований — `docs/work-plan.md`. iPad, прикладные UI/PR workflows и права Obsidian принадлежат вызывающему проекту или Balda. + +## Конфигурация и восстановление + +Приватный Compose: `state/deploy/compose.production.json`; конфиги `broker.json`, `worker.json`, assets в `state/deploy/assets`. Токены находятся только в secret-файлах. + +После выбора согласованного проверенного комплекта применять из репозитория: + +```bash +docker-compose -f state/deploy/compose.production.json -p execution-broker up -d --no-build worker broker prism +``` + +До смены комплекта завершить runs/cleanup, сохранить state/config/image pins и исходные immutable assets. Сам Git commit deployment не меняет. + +Backup перед текущим обновлением: `state/backups/20261015-before-rc32`. Проверены SHA256, 31 SQLite database и inert restore шести компонентов, включая encrypted credential vault. Все три credential identity были освобождены и checkpointed. Restore не запускал сервисы; master keys Keychain в backup отсутствуют. Это подтверждение восстановления production snapshot на том же хосте. Отдельная native-проверка перенесла синтетический encrypted vault с macOS ARM64 на физический Linux AMD64: отсутствие и подмена ключа отклоняются без перезаписи ciphertext, отдельный escrow key восстанавливает запись, revoke работает, fresh enrollment в новый vault с новым ключом проходит. Production credentials и Keychain keys в этом тесте не использовались. Он не заменяет escrow или повторную авторизацию реальных аккаунтов после потери хоста. + +Актуальные согласованные state/config backups обоих Balda, exact image/binary hashes и доказательства restart/native/off-host fixture проверок: `state/balda-upstream-hooks-20261015/`. Более ранние state/home backups обоих Balda: `state/balda-upstream-rollout-20261015/`. Рабочие account/config hashes после обновления совпали с исходными. Приватные отчёты проверок основного комплекта: `state/broker-rc32-rollout-20261015/`. Broker hotfix: `state/telegram-timeout-20261015/`, включая консистентный `broker.before.db` с успешными integrity/foreign-key checks и сохранённый Compose для отката. Hotfix прошёл полный `make check`, Linux ARM64 race для Broker/config/HTTP API и govulncheck без достижимых уязвимостей. Release archives rc32 остаются неизменными и содержат исходный `fee5409`; hotfix развёрнут отдельным Broker image. Native Darwin AMD64 proof: `state/balda-pr62-review-20261015/native-darwin-amd64.json`. Проверочный скрипт поддерживает штатный Python 3.8; публичные rc32 archives не перезаписывались. Приватные отчёты не входят в release archives. + +Контракты и процедуры: `docs/protocol.md`, `docs/tooling.md`, `docs/environment-changes.md`, `docs/repository-cache.md`, `docs/operations.md`, `docs/telegram-approvals.md`, `docs/recovery.md`, `docs/testing.md`. diff --git a/personal/projects/balda/fast-rlm-integration.md b/personal/projects/balda/fast-rlm-integration.md index 946b9cde..c0961fa7 100755 --- a/personal/projects/balda/fast-rlm-integration.md +++ b/personal/projects/balda/fast-rlm-integration.md @@ -1,3 +1,8 @@ +> [!WARNING] Исторический документ +> Не использовать как runbook текущей Balda. Актуальная локальная схема, пути и команды: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Текущий контейнер: `balda-mm-mac`; config: `/Users/admin/Docker/balda-mm-mac/config/config.yaml`; Obsidian MCP: `type: http`, `http://host.docker.internal:3101/mcp`. +> Материал ниже сохранён только как история. + # fast-rlm MCP HTTP integration with Balda > ## ⚠️ СТАТУС (2026-09-25) diff --git a/personal/projects/balda/fix-openaimodel-tools.md b/personal/projects/balda/fix-openaimodel-tools.md index a48e1fc4..cf9d3eec 100755 --- a/personal/projects/balda/fix-openaimodel-tools.md +++ b/personal/projects/balda/fix-openaimodel-tools.md @@ -1,4 +1,9 @@ -# План: фикс MCP для OpenAIModel +# Исторический черновик: MCP для OpenAIModel + +> [!WARNING] Исторический черновик +> Это список идей для прежней кодовой базы, а не действующий план Broker или свидетельство незакрытого дефекта текущего runtime. +> Текущий контур и проверенные версии: [[personal/projects/balda/balda]] и [[personal/projects/balda/execution-broker]]. +> Детали ниже сохранены для истории; их реализацию нельзя выводить из наличия этого списка. ## Что сделать 1. В `openAIChatRequest` добавить поле `Tools []openAIToolDefinition` diff --git a/personal/projects/balda/mattermost-kraken-deploy.md b/personal/projects/balda/mattermost-kraken-deploy.md index 0cad627a..d17229e0 100755 --- a/personal/projects/balda/mattermost-kraken-deploy.md +++ b/personal/projects/balda/mattermost-kraken-deploy.md @@ -1,3 +1,8 @@ +> [!WARNING] Историческая схема Balda +> Не использовать пути, контейнеры, provider или MCP transport из этой заметки для текущего запуска. +> Канонический текущий runbook: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]]. +> Актуально: `balda-mm-mac`, `/Users/admin/Docker/balda-mm-mac/config/config.yaml`, Mattermost, Codex ACP, Obsidian `type: http` → `http://host.docker.internal:3101/mcp`. + # Mattermost на Kraken — деплой (arm64) > Создано 2026-09-26. Обновлено 2026-09-26. Статус: **✅ СЕРВЕР РАБОТАЕТ**. diff --git a/personal/projects/balda/setup.md b/personal/projects/balda/setup.md index d7773cdf..23624da5 100755 --- a/personal/projects/balda/setup.md +++ b/personal/projects/balda/setup.md @@ -1,86 +1,93 @@ -# Balda — Setup & Config +# Balda — актуальный локальный запуск -_Последнее обновление: 2026-06-24_ +Проверено: **2026-10-15** по обоим работающим контейнерам, Compose, конфигурации и реальным MCP-вызовам. -## Хост +Обзор: [[personal/projects/balda/balda|Balda]]. Broker, готовность кандидата и оставшаяся работа: [[personal/projects/balda/execution-broker|Execution Broker — текущий локальный контур]]. -Mac (Eagle), **Colima** (arm64, 8 CPU, 24 GB RAM, 100 GB sparse disk). Контейнеры собираются из исходников в `~/Developer/balda/`. +## Что работает сейчас -**Важно:** `buildx_buildkit_arm64builder0_state` volume — основная причина зависаний Zulip при сборке. См. [[tech/docker-mac-disk-issues]]. +| Параметр | Фактическое значение | +| --- | --- | +| Хост / контейнер | Mac / `balda-mm-mac` | +| Канал | Mattermost | +| Provider | `codex`, type `codex_acp`, reasoning effort `medium` | +| Образ обоих инстансов | `balda-balda:upstream-6621b189-channel-fix`, image ID `sha256:e68ecaed4ceed2040c4592e9d4f8cd053d0b65d8086fa67ef1c99c8d10f42db1` | +| Balda source | `6238856b5189f34f6e2a244e146cb6342e948623`: upstream `6621b189` + закоммиченное исправление контекста канала; Linux ARM64 binary SHA256 `94827ac2b57456c7f30bfd7a02fecd2d3ddb4e52a51af702f3f830720b56bf8d` | +| Compose | `/Users/admin/Docker/balda-mm-mac/docker-compose.yml` | +| Активный конфиг | `/Users/admin/Docker/balda-mm-mac/config/config.yaml` | +| State / plugins | `/Users/admin/Docker/balda-mm-mac/state` | +| Workspace | `/Users/admin/Docker/balda-mm-mac/work` | +| Home volume | `balda_balda-home`, mounted в `/home/node` | -## Компоненты +Config bind-mounted в `/workspace/.config/balda` read-only для контейнера; state и work доступны ему на запись. Файл `~/Developer/balda/.config/balda/config.yaml` относится к отдельному dev checkout и не управляет этим контейнером. -| Бот | Порт | Провайдер | Dockerfile | -|-----|------|-----------|------------| -| **Валера** (`balda-agent-valera-1`) | `:8091` | DeepSeek | `Dockerfile` (одинаковый) | -| **Клавдий** (`claudio-agent-claudio-1`) | `:8092` | Claude (через proxy :3457) | `Dockerfile.claudio` (тот же + arm64 target) | +## Eagle и общие инструменты -## Расположение +Eagle работает на том же Mac в `balda-mm-eagle`; Compose, config, state и work находятся в `/Users/admin/Docker/balda-mm-eagle/`, service — `eagle`, отдельный home volume — `balda_eagle-home`. Образы обоих инстансов одинаковы. Авторизации Codex раздельные; при обновлении home volumes сохранены. Серверная проверка: models endpoint отвечает HTTP 200 у обоих. У @balda реальная генерация в отдельной ephemeral read-only сессии завершилась ответом `AUTH_OK` и `turn.completed`; исходный аккаунт сохранён. После перечитывания credentials Mattermost websocket подключён, существующие беседы не сбрасывались. Не копировать auth между разными аккаунтами. -| Item | Валера | Клавдий | -|------|--------|---------| -| Compose | `~/Docker/balda-agent/docker-compose.yaml` | `~/Docker/claudio-agent/docker-compose.yaml` | -| Config volume | `~/Docker/balda-agent/.config/balda/` | `~/Docker/claudio-agent/.config/balda/` | -| Env | `~/Docker/balda-agent/.env` | `~/Docker/claudio-agent/.env` | -| Dev repo (общий) | `~/Developer/balda/` | `~/Developer/balda/` | +У обоих включены одинаковые Obsidian, Execution Broker и Prism MCP, одинаковые права runtime и managed plugin `execution-broker` rc.32. Проверены реальные initialize/tools-list: Obsidian — 15, Broker — 26, Prism — 5 инструментов; списки совпадают. Eagle дополнительно имеет `asana-readonly`, URL `http://asana-readonly:3100/mcp` в приватной Docker-сети. Отдельный контейнер `balda-eagle-asana-readonly` не публикует порт на хост. Реальное чтение Asana прошло; все пять операций изменения и запись заметок в файл отклоняются сервером. -**Важно:** оба бота собираются из одного репозитория `~/Developer/balda/` (normahq/balda fork). Разница — только в config.yaml (провайдер) и .env (Zulip credentials). +В обоих конфигурациях provider `codex_acp`, reasoning `medium`, явный model отсутствует. Последние записи Codex подтверждают `gpt-6.1-sol` у обоих. При выравнивании инструментов настройки основной модели не менялись. `balda.nats.max_store` у обоих — `16gb`. -## Образ +## Продолжение задач -- Собирается локально из `Dockerfile` (Go, multi-stage: golang:1.26 → alpine:3) -- Target: `linux/arm64` (статический Go бинарник) -- Image name: `balda-agent-valera:latest` / `claudio-agent-claudio:latest` (по имени compose проекта) -- Entrypoint: `/usr/local/bin/balda` (ELF arm64) -- Сеть: `balda_default` (bridge, внешняя, создаётся через docker network create) +Тип канала берётся из канонической привязки сессии. Для Mattermost он остаётся `mattermost`, включая native waits и возврат результата; `human.delivery_channel=telegram` меняет только доставку одобрения. SQLite/PostgreSQL migration исправляет прежний сгенерированный Telegram-заголовок в сохранённых ACP instructions без `/reset`, сохраняя provider thread, capability snapshot и историю. Согласованные Linux SQLite snapshots обоих инстансов прошли integrity/foreign-key checks; последнее обновление сохранило все 2072 прежних события основного инстанса, locator, capability snapshots, provider threads и auth. Плагин rc32 совместим с текущей Balda и не требовал переустановки; immutable revisions сохранены. Актуальный backup и отчёты: `state/balda-upstream-hooks-20261015/`; backup миграции контекста также сохранён в `state/balda-channel-context-20261015/`. -## Запуск / рестарт +В этой версии generic webhooks выполняют изолированные задания. Они не продолжают исходную сессию. Старые `routes.*.path`, `envelope.target`, `key_from_body`, `mode` и `fallback_to` удалены из конфигурации; listener задаётся через `balda.http`. Сейчас он слушает loopback `127.0.0.1:8095`. + +Плагин rc32 использует `balda.state` и штатный `balda.session.wait`: наблюдатель вооружается до Start/retry и возвращается в исходную сессию. Managed lifecycle и restart-контракт проверены. Реальный conversational smoke с моделью, фактическим Telegram Human ответом, шестью проверенными артефактами, `cleanup=done` и единственным итоговым сообщением в исходной Mattermost-беседе прошёл; Story/Task закрыты и waits отменены. Реальная беседа прошла также HTTP 502 и restart Broker/Prism/Balda во время Human pause: тот же run/Story, provider thread и deadline восстановились, фактический Telegram approval принят, шесть артефактов проверены, `cleanup=done`. Story/Task закрыты, waits отменены, сообщение о завершении restart-приёмки подтверждено через Mattermost API. Старые callbacks Broker на `:8090` приостановлены, недоставленные cursors сохранены. Native wait acceptance не является подтверждением доставки сообщения провайдером. + +Оба инстанса имеют также одинаковые пять глобальных Codex skills и одинаковую Codex tool policy; различий не найдено. Обновление плагина выполнено штатной переустановкой из нового operator source с сохранением `plugin-data/execution-broker`, старых revisions/catalog snapshots и содержимого прежнего marketplace. Существующие сессии не сбрасывались. + +## Изменения и перезапуск + +| Изменение | Действие | +| --- | --- | +| Только host `config/config.yaml` | `docker restart balda-mm-mac`: процесс перечитывает конфигурацию при старте | +| `.env`, environment, mounts, service definition | Из каталога Compose: `docker-compose up -d balda` | +| Новый image | Сначала получить или собрать выбранный образ, затем `docker-compose up -d balda`; в действующем Compose нет build-секции | +| Код в checkout | Сам по себе не обновляет образ; нужен отдельный build и применение выбранного image | +| Изменение catalog / skills существующей беседы | Обычный `/reset` для выбора текущего capability snapshot | + +`docker restart` не применяет изменения Compose или `.env`. `--force-recreate` для изменения только config.yaml не требуется. До смены image сохраняют согласованный state backup и прежний image/config для отката. + +## Plugins, skills и инструкции + +Managed plugin revisions неизменяемые; вручную редактировать их содержимое в state нельзя. Документация проекта описывает управление пакетами через **Backoffice → Operations → Plugins**: Installed/Marketplaces, review exact revision, install/upgrade/enable/disable/rollback/remove. Проверять доступность поверхности на используемой версии, а не переносить команды из архивных runbooks: [plugins reference](https://github.com/baldaworks/balda/blob/main/docs/reference/plugins.md). + +Management не сбрасывает существующие сессии. Новая сессия выбирает текущий catalog; существующая принимает capabilities через обычный `/reset`. Standalone skills также редактируются отдельно от уже закреплённого session snapshot. + +[[personal/projects/balda/soul|Global instruction]] содержит сверенный снимок `balda.global_instruction`. [[personal/projects/balda/workspace-context|Provider context]] описывает `runtime.providers.codex.system_instructions`; сейчас отдельное значение не настроено. Редактирование заметки не меняет работающий конфиг. + +## Codex ACP + +Reasoning effort в активном конфиге — `medium`. Авторизация CLI хранится в home volume. Для восстановления существующего @balda: `docker exec -it balda-mm-mac codex login --device-auth`, завершить вход в исходный аккаунт и проверить реальный запрос к провайдеру. `codex login status` подтверждает только наличие локальной авторизации и сам по себе не доказывает действительность токена на сервере. При необходимости перезапустить Balda для перечитывания auth; `/reset` не требуется. Для отдельного headless-входа используется команда из каталога Compose: -**Валера:** ```bash -cd ~/Docker/balda-agent -docker-compose restart # без пересборки, без перечитывания .env -docker-compose up -d # пересоздаёт контейнер с текущим .env -docker-compose build && docker-compose up -d # после изменений в коде +docker-compose run --rm --entrypoint codex balda login --device-auth ``` -**Клавдий:** +## Obsidian MCP + +Проверенный блок активной конфигурации находится в `runtime.mcp_servers`: + +```yaml +runtime: + mcp_servers: + obsidian: + type: http + url: http://host.docker.internal:3101/mcp +``` + +Используется Streamable HTTP. Для Codex ACP SSE-конфигурацию из старых заметок не переносить. После изменения этого блока нужен перезапуск Balda. + +## Диагностика + ```bash -cd ~/Docker/claudio-agent -# те же команды +docker ps --filter name=balda-mm-mac +docker logs --tail 120 balda-mm-mac ``` -**После изменений кода** (в `~/Developer/balda/`): `build && up -d` в каждом compose. +Проверять успешный startup provider и подключение Mattermost. Не копировать токены, cookie или login URLs из логов в заметки. -## .env (общие переменные) - -```env -OPENAI_BASE_URL=https://api.deepseek.com/v1 # обязательна для deepseek provider -# для claude provider не нужна -``` - -**Важно:** `docker-compose restart` не перечитывает `.env`. Только `docker-compose up -d`. - -## Известные грабли - -### 1. OPENAI_BASE_URL — обязательна для DeepSeek -Norma не читает `base_url` из config.yaml для `provider: deepseek`. Читает env `OPENAI_BASE_URL`. -Без неё запросы уходят на `api.openai.com` (401). - -### 2. DOCKER_OPTS — пустая строка убивает старт -```env -DOCKER_OPTS={"max_tokens": 2048, "temperature": 0.7} -``` -Не пустая строка! Иначе `strconv.ParseFloat: parsing ""` при старте. - -### 3. exec format error на arm64 -Симптом: контейнер в crash-цикле, логи повторяют `exec /usr/local/bin/balda: exec format error`. -Docker показывает `Up N hours` (накопленное время рестартов), но exec не работает. - -**Причина:** контейнер создан с `Platform: linux/amd64` (старый Docker Desktop или первый run без platform). Образ arm64, контейнер amd64 — несовместимость. - -**Фикс:** `docker-compose down; docker-compose up -d` — удаляет старый контейнер и создаёт новый с правильной платформой. - -### 4. После перезапуска нужно @mention для создания сессии -Events API polling подхватывает сообщения только если есть активная сессия в теме. -После рестарта: написать `@Валера <текст>` (или `@Клавдий`). +Архив старых схем и шаблонов: [[personal/projects/archive/balda-reference-before-2026-10-14]]. diff --git a/personal/projects/balda/soul.md b/personal/projects/balda/soul.md index c7c5e3f9..2474b476 100755 --- a/personal/projects/balda/soul.md +++ b/personal/projects/balda/soul.md @@ -1,49 +1,21 @@ -# Balda Soul — Global Instruction +# Balda — global instruction -> Это глобальная инструкция Балды (Валеры). Вставляется в system prompt каждой сессии. -> После правки — синхронизировать вручную в `~/Developer/balda/.config/balda/config.yaml` -> (поле `balda.global_instruction`), затем перезапустить Балду. +Проверено: **2026-10-15**. Ниже точный снимок `balda.global_instruction` из активного `/Users/admin/Docker/balda-mm-mac/config/config.yaml`. Он относится к контейнеру `balda-mm-mac`; dev-конфиг в `~/Developer/balda` является отдельным файлом. ---- +Порядок инструкций в Balda: built-in → `balda.global_instruction` → `runtime.providers..system_instructions`. Текущий provider — `codex`; отдельные provider-level инструкции не настроены. -Ты **Валера** — практичный AI-ассистент команды в Zulip. +## Действующее значение -## Стиль +Ты Балда — AI-помощник в Mattermost. -- Отвечай на языке собеседника (русский или English). -- Кратко и конкретно. Никакой воды, никаких вступлений. -- Показывай результат, а не процесс. -- Код и команды — в fenced code blocks. -- Не объясняй что ты сделал — пользователь видит результат. +Отвечай кратко и по делу. Русский или English — как к тебе обратились. +Код и команды в fenced code blocks. +Не объясняй процесс, показывай результат. +В каналах ты отвечаешь только когда тебя упомянули через @balda. +For execution-broker calls, use the exact current Balda Session ID shown under Session in the system instruction as chat_id and an empty topic_id. The channel type is also shown there; never infer Telegram from numeric Mattermost metadata. Numeric chat_id=0 and topic_id=0 are transport placeholders and must never be sent to execution tools. Never ask the user to supply a Session ID. If an existing Story has chat_id=0 or topic_id=0, create a new Story and Task with the current Session ID and new Story and run idempotency keys before starting a new execution. Do not reuse the placeholder-bound Story because Prism cannot sync it. At a coding approval question, forward the exact free-text requirement change with execution_respond for that run; Callee will regenerate the plan and ask again without a new Story or run. Reply approved only after the user approves the latest plan. -## Работа +## Как поддерживать этот снимок -- Берёшь задачу и доводишь до конкретного результата. -- Если задача большая или неоднозначная — уточни объём, прежде чем начать. -- Возвращай что-то осязаемое: код, файл, ответ, список шагов. -- Не останавливайся на полпути — если начал, закончи. +Изменение заметки само по себе не меняет production-конфигурацию. Изменение глобальных инструкций применяется отдельно через активный host config и перезапуск Balda по [[personal/projects/balda/setup|runbook]]. При последующей актуализации заметку снова сверяют с этим файлом. -## Ограничения - -- Не делай деструктивных действий (удаление файлов, force push) без явного подтверждения. -- Не пиши в main/master напрямую. Используй ветки. -- Если нужны credentials или secrets — попроси, не угадывай. - -## Память - -- Durable факты и предпочтения команды сохраняй через `balda.memory.remember`. -- Не сохраняй промежуточные состояния задач и временный контекст. -- Сохраняй: соглашения, предпочтения, архитектурные решения, стек. - -## Workspace - -- Если workspace включён (mode=on/auto) — используй worktree per session. -- `balda.workspace.import` — перед началом крупных правок. -- `balda.workspace.export` — после завершения, Conventional Commit message. -- Не делай merge/rebase через raw git если доступны workspace MCP tools. - -## Формат ответов в Zulip - -- Zulip поддерживает Markdown: **bold**, `code`, ```fenced blocks```, таблицы. -- Для длинных результатов используй сворачиваемые блоки: `:::spoiler Заголовок`. -- Цитируй исходное сообщение только если нужна явная привязка. +Исторический шаблон для Валеры/Zulip сохранён в [[personal/projects/archive/balda-reference-before-2026-10-14]]. Контекст конкретного provider описан в [[personal/projects/balda/workspace-context]]. diff --git a/personal/projects/balda/workspace-context.md b/personal/projects/balda/workspace-context.md index 52c122fe..0013f99b 100755 --- a/personal/projects/balda/workspace-context.md +++ b/personal/projects/balda/workspace-context.md @@ -1,54 +1,22 @@ -# Balda Workspace Context +# Balda — provider context -> Provider-level `system_instructions` — дополнение к soul.md для конкретного провайдера. -> Задаётся в `~/Developer/balda/.config/balda/config.yaml` под -> `runtime.providers.claude_code.system_instructions`. +Проверено: **2026-10-15** по активному конфигу `/Users/admin/Docker/balda-mm-mac/config/config.yaml`. ---- +Текущий provider — `codex`, type `codex_acp`, reasoning effort `medium`. Поле `runtime.providers.codex.system_instructions` **не настроено**; эта заметка не объявляет Balda привязанной к одному репозиторию. -## Текущий контекст +Дополнение для этого provider задаётся в активном host config, отдельно от [[personal/projects/balda/soul|global instruction]]. Пример структуры: -Рабочий проект и стек пока не заданы. Заполни этот раздел когда Балда будет прикреплена -к конкретному репозиторию или задачам. - -Шаблон для заполнения: -``` -## Проект - -- Репо: ~/Developer/ -- Стек: -- Основная ветка: main - -## Команда - -- alex (owner) — говорит по-русски, можно и по-английски -- <другие участники> - -## Соглашения - -- Стиль коммитов: Conventional Commits (feat/fix/chore/docs) -- PR: через gh cli, base=main -- Тесты: -- Линтер: - -## Workflow - -- Задачи приходят в Zulip топик -- Результат: коммит в ветку + краткий отчёт в тот же топик -``` - -## Провайдер - -`claude_code_acp` с моделью `claude-sonnet-4-6`. - -Если нужны особые флаги модели: ```yaml runtime: providers: - claude_code: - type: claude_code_acp + codex: + type: codex_acp system_instructions: | - <вставить сюда содержимое этого файла> - claude_code_acp: - model: claude-sonnet-4-6 + <контекст и соглашения для этого provider> + codex_acp: + reasoning_effort: medium ``` + +Пример — шаблон, а не установленная конфигурация. Описание конкретного проекта должно содержать точный repository/worktree, задачу, критерии приёмки и команды проверок; стек определяется проектом. Изменение заметки не применяет эти настройки к контейнеру. + +Пути, перезапуск и session boundaries: [[personal/projects/balda/setup]]. Старый Claude/Zulip template: [[personal/projects/archive/balda-reference-before-2026-10-14]]. diff --git a/personal/projects/personal-os/autonomous-agent-safety.md b/personal/projects/personal-os/autonomous-agent-safety.md index f601257e..d2afb905 100755 --- a/personal/projects/personal-os/autonomous-agent-safety.md +++ b/personal/projects/personal-os/autonomous-agent-safety.md @@ -1,7 +1,7 @@ --- title: Autonomous Agent Safety Patterns created: '2026-05-24' -updated: '2026-05-24' +updated: '2026-10-14' type: concept tags: [agent, security, architecture, executor, rules] sources: @@ -10,8 +10,8 @@ sources: - wiki/personal-os-agent-rules.md confidence: high related: - - "[[concepts/executor-security-incident]]" - - "[[concepts/executor-orchestrator]]" + - "[[personal/projects/personal-os/executor-security-analysis]]" + - "[[personal/projects/personal-os/executor-orchestrator-redesign]]" - "[[personal-os-agent-rules]]" --- @@ -62,7 +62,7 @@ session context. ## The Auto-Approve Table Pattern -From [[concepts/executor-orchestrator]]: instead of blanket trust or blanket +From [[personal/projects/personal-os/executor-orchestrator-redesign]]: instead of blanket trust or blanket denial, classify actions by risk tier: | Risk | Action type | Default | @@ -108,6 +108,6 @@ can be reviewed without running the agent: ## See Also -- [[concepts/executor-security-incident]] — incident post-mortem with full timeline -- [[concepts/executor-orchestrator]] — post-incident architecture (orchestrator pattern) +- [[personal/projects/personal-os/executor-security-analysis]] — incident post-mortem with full timeline +- [[personal/projects/personal-os/executor-orchestrator-redesign]] — post-incident architecture (orchestrator pattern) - [[personal-os-agent-rules]] — Eagle's specific rules derived from these patterns diff --git a/personal/projects/personal-os/eagle-dashboard.md b/personal/projects/personal-os/eagle-dashboard.md index c06b6c2d..e798a4ec 100755 --- a/personal/projects/personal-os/eagle-dashboard.md +++ b/personal/projects/personal-os/eagle-dashboard.md @@ -108,7 +108,7 @@ PID-file-based — survives Dashboard restarts without crashing. | claude_proxy_node | Claude Proxy (node) | localhost | daemon | | claude_proxy_python | Claude Proxy (python) | localhost | daemon | | asana_mcp | Asana MCP | localhost | daemon | -| virfield | [[personal/projects/virfield\|Virfield v2]] | `127.0.0.1:7780` by default | separate system LaunchDaemons; dashboard integration not verified | +| virfield | [[personal/projects/virfield\|Virfield (Tart + SSH nodes)]] | `127.0.0.1:7780` by default | system Virfield LaunchDaemon; dashboard integration not verified | ### ML @@ -328,7 +328,7 @@ When a launchd cron is created and `launchctl print gui//