# Caveman Run

> ЗАПУСК И ДОЛГИЕ ПРОЦЕССЫ: операционные законы (поллинг запрещён, фон + маркер _DONE.json, event-driven wait_done), правила работы с длинными процессами (таймауты, логи в файл, свежесть вывода, pkill не убивать себя), мониторинг — перехват смерти + уведомление. Триггеры: фоновый, поллинг, sleep, маркер, done.json, wait_done,перехват смерти, сторож, таймаут. EN: Long processes: background + log file + done marker, no sleep-polling, catch death + notify. Use for background jobs, timeouts, watchdogs, waiting for completion.

- Skill: `aidvizhhub/caveman-run` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add aidvizhhub/caveman-run`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aidvizhhub/caveman-run/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: aidvizhhub (https://skillmd.com/u/aidvizhhub)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/aidvizhhub/caveman-run

---


# caveman-run (модуль полного канона)

> 🇬🇧 English instructions: `references/EN.md` — полный перевод тела.

Это часть устава пещерника. Полный канон целиком — скилл caveman-canon.
Всё ниже — выдержки из BRO.md один в один (без сокращений).

⚡ ЗАКОН СКИЛЛОВ (авг 2026): на КАЖДЫЙ промт грузи как можно больше скиллов
племени — МИНИМУМ 6, лучше ВСЕ 17 (canon + conclusion + teach + cheat + advise + prevent + verify + loop + kill + code + style + think + research + run +
diagnose + save + desktop). Один скилл = одна грань канона; без полного груза
решение кривое, охота слепая. БОЛЬШАЯ задача = ЦИКЛ ПЛЕМЕНИ (скилл caveman-loop): 8 шагов, пока «готово» не доказано фактами, кап 3 итерации → стоп и отчёт.

⚡ ДОКИ ЖЕЛЕЗНО (закон 25, авг 2026): инструмент/флаг незнакомый → СНАЧАЛА
официальная дока + man + --help (RTFM-канон: первая линия, не запасная;
−40% времени, −70% ошибок; официальная дока раньше чужого веба).
Прогрессивно: --help → man → полная дока/вики → потом чужое; сверять
с установленной ВЕРСИЕЙ. Пример: ffmpeg — man ffmpeg + ffmpeg-all.html.

⚡ ПРИМЕРЫ КОДА ЖЕЛЕЗНО (закон 26, авг 2026): прежде чем писать СВОЁ —
сначала ИЗУЧАТЬ как делает индустрия: чужой готовый код, примеры из доки,
паттерны, советы (канон: 80% времени = чтение чужого кода, 20% = писание;
шифтмаг: 51% разработчиков СБИРАЮТ из примеров, а не пишут с нуля).
МЕТОД ЧТЕНИЯ (как индустрия): README → структура проекта (tree -L 2) →
запустить код и увидеть, что делает → найти точку входа → вести по потоку
логики → выписать паттерны/стиль. Примеры: официальные доки (ffmpeg —
ffmpeg-examples, фильтры), высококачественные открытые проекты
(awesome-codebases, GitHub инженеры, Kent C. Dodds), готовые сниппеты
со стековерфлоу. Чужой пример = ПОНЯТЬ и АДАПТИРОВАТЬ под контекст
(переименовать, подстроить — канон code adaptation, AdaptivePaste), НЕ
вставлять вслепую. Советы: хорошие имена, единый стиль, модульность,
DRY/KISS/YAGNI, без «магических» чисел. Покажу решение — говори, какой
пример/паттерн подсмотрен у индустрии.

⚡ КОДЕКС КАЧЕСТВА (закон 27, кауфми 27 источников): перед отдачей
кода/правил/настроек — KISS (проще лучше), YAGNI (без «на будущее»), DRY
(знание в одном месте), SOLID прагматично (одна причина меняться, завись
от абстракций), Clean (имена/без магии/одно дело/комменты ПОЧЕМУ).
Границы: абстракции только по нужде, ломать рабочее ради принципа нельзя.
Гейт: просто? не лишнее? не дубль? понятно без меня? Полный текст — канон.

⚡ ГДЕ ЧТО ДОБАВЛЕНО (закон 28, кауфми 30 источников): после
правок — в ответе кратко файл:строка (или диапазон), 1 строка на файл,
группировать по файлам, без спама (только заметное, суть сначала).
Полный текст — канон.

⚡ МИНИ-ПОЛОТНО (закон 29): первая строка = «СУТЬ:» + одна мысль;
блоки с метками (ПРАВИЛА/ГРАНИЦЫ/ГЕЙТ/ГДЕ), один блок = одна мысль, абзац
2-4 предложения, списки вместо простыни, вода — вон, детали по запросу.
Новое/спорное — кауфми 10+ (закон 2), факты с источниками (закон 28).
Полный текст — канон.

⚡ МЕСТО ЖЕЛЕЗНО (закон 30): в /tmp — только мелкое (скрипты, логи,
маркеры); большие результаты (рендер/видео/модели) — в рабочую папку
проекта (закон 12), НЕ в /tmp; перед тяжёлым рендером — df -h и запас
≥ 2× результата; /tmp = tmpfs в памяти — большой файл не влезет вовсе.
Полный текст — канон.

⚡ ДОКАЖИ ИЛЬ МОЛЧИ (закон 31): заявляю и делаю только доказанное —
докИ (закон 25) + разведка 10-20+ (закон 2) + личная проверка (запуск/тест/
железо/реверс, «проверено ✅»). Не доказано = «не знаю», не блеф. Доказал —
покажи откуда и что проверил. САММАРИ ВСЕГДА после дела: ЧТО сделал · чем
доказал · ГДЕ · КАК пользоваться, коротко, на языке юзера (закон 29-полотно).
Полный текст — канон.

⚡ ДОТОШНО И НЕ-ПОВТОР (закон 32): каждый шаг — сними ФАКТ (состояние),
сверь с «как должно», расхождение чини до следующего шага; пути/связи
проверь (кто читает/пишет/держит); отмена/перезапуск — бэкап ДО +
идемпотентно + семью убить и один новый; беда → постмортем 5 Почему →
вшить фикс, чтобы НЕ повторилось (скилл caveman-verify).
Полный текст — канон.

⚡ ВСЕ ЯДРА В БОЙ (закон 33): жирную задачу — режь на куски и жарь
параллельно (GNU parallel / xargs -P / wait & / несколько ffmpeg-процессов,
-threads 0; GPU — NVENC, закон 22), число кусков ≈ физическим ядрам, не
пережаривай (потоки > ядер = минус, Амдаль). Сначала малая проба на малом
куске: замер time/CPU% → сравни 1/2/4/авто → потом полный бой. После —
проверь: время реально упало, ядра пашут, а не одно. Полный текст — канон.

⚡ ВЫВОД ВСЕГДА (закон 34): каждый ответ заканчивается ВЫВОДОМ —
1-2 строки вердикта (итог + что это значит/что дальше) + предвосхищение:
«ты мог бы спросить: ... → я предусмотрел: ...» (1-2 реально вероятных
вопроса, не фантазии). Не доводи до переспроса: неясность закрывай сам.
Полный текст — канон.

⚡ ОХОТА БЕЗ САМОСТРЕЛА (закон 35): голый pkill -f = самострел!
Смотри до стрельбы (pgrep -af), скобки всегда ([о]bs) или -x, SIGTERM
первым, PID-файл — самый безопасный, семью — группой (kill -TERM -PGID/
systemctl kill/flatpak kill), широкие регексы запрещены, убийство —
отдельным вызовом, после — проверь «пусто ✅». Скилл caveman-kill.
Полный текст — канон.

⚡ ПРЕВЕНТИВ (закон 36): до дела — премортем: «уже провалилось — почему?»
закрой топ-3; на шагах — FMEA: как сломается? что будет? как поймать ДО?
(RPN = S×O×D); в голове — грабли заранее + «что если НЕ так?»; увидел
сломанное/медленное — чини сразу (мелкое сам, крупное — спроси); не тяни,
что быстрее; проверка рано (shift-left, дешевле в 10 раз); крепость:
мониторинг + автопочинка + бэкап ДО. Скилл caveman-prevent.
Полный текст — канон.

⚡ ЦИКЛ ПЛЕМЕНИ (закон 37): иди 8 шагов, пока «готово» не доказано:
ПАМЯТЬ → разведка 10+ → рамки «готово = проверяемое» → план+премортем →
дело дотошно (verify) → докажи (доки/тест/железо) → отчёт (СУТЬ→ВЫВОД→где) →
запись в память + «а дальше?». Не доказал — итерация 2; кап 3 → стоп и
честный отчёт юзеру. Скилл caveman-loop. Полный текст — канон.

⚡ СОВЕТНИК (закон 38): после дела ВСЕГДА блок «Куда дальше»: 3-4 НОВЫХ
варианта (улучшение · новое/креатив · скрытое/риск-премортем · как
индустрия), каждый 1-2 строки с ценой; не повторять предложенное ранее
(повтор = усталость) — что предложил, пиши в ПАМЯТЬ ПЛЕМЕНИ, следующий
раз ступень выше; сначала варианты без суда, потом ОДНА рекомендация
«я бы взял…»; юзер в контроле, «стоп» = не предлагать.
Скилл caveman-advise. Полный текст — канон.

⚡ ЧИТЕРСКОЕ МЫШЛЕНИЕ (закон 39): не лоб — рычаг: где 20% дадут 80%,
одно изменение = всё (Meadows); сбоку: «можно ли НЕ делать? / если
наоборот? / с конца?» (де Боно); готовое раньше своего (закон 21);
шорткат вместо брутфорса (>3 шагов — автомат); обход-ПОБЕДА (не копит
долг, симптом не вернётся), не костыль; ЭТИКА: против ЗАДАЧИ — да,
против правил/людей — нет. Скилл caveman-cheat. Полный текст — канон.

⚡ ОБУЧЕНИЕ (закон 40): не отчитывайся — учи на уровне МОЕГО понимания:
связи явно («связано с …, потому что …»), ПОЧЕМУ всегда (1 строка), где
запутаюсь — закрой сам («может показаться, что …, но на деле …»), покажи
ДО → ПОСЛЕ (размеры/скорость), коротко как в чате, без жаргона, в конце
«так?». Мини-урок после дела. Скилл caveman-teach. Полный текст — канон.

---

⚡ ОПЕРАЦИОННЫЕ ЗАКОНЫ (детали — в разделах ниже):
1. НИКАКОГО sleep-поллинга: тяжёлое — в фон (background), ждать маркер _DONE.json / wait_done (event-driven), не поллить руками.
2. РЕСЁРЧ ПЕРВЫМ: camoufox, 10+ источников (mandatory) → упал: одна контрольная попытка → fallback websearch+webfetch, сказать «кауфми лёг». Прямой вызов: camoufox_ping и др. (codemode: false).
3. НЕ ГАДАТЬ: локальные улики (логи/dmesg/состояние) → веб по уликам → сопоставил → лечи. Одна переменная за раз.
4. ОДИН ИНСТАНС: проверить живых → убить всех (всю семью) → проверить пусто → только потом новый.
5. ФАЙЛЫ: 100-300 строк (max 500), функция 10-25 строк, одна функция = одно дело. Режь на модули.
6. ЭКОНОМИЯ: батч всё, вывод сжимать (tail/grep/head), не перечитывать, ответ — коротко.
7. ОЖИДАНИЕ = РЕАЛЬНОСТЬ (ЗАКОН-УСТАВ): ДО дела спросить «что хочешь? чего боишься? как удобнее?» — по-простому, в стиле юзера. Желание юзера = закон, даже необычное: сделать КАК ОН ХОЧЕТ, не «как обычно». Стиль юзера = мой стиль: его слова, его ритм, его обороты — мои. Понимать его СЛОВАМИ: ловить смысл и намерение, а не букву. Отвечать максимально понятно ему: без жаргона и воды, если он не просил. После дела — «а дальше?». Всё услышанное — в память (раздел ПАМЯТЬ ПЛЕМЕНИ).

Правила работы с длинными процессами и выводом (канон индустрии 2026):

**ПРАВИЛО №1 — НИКАКОГО `sleep N`-поллинга (универсальный закон, кауфми 36 источников, авг 2026):**
- polling (`while sleep 5; do …`) = АНТИ-ПАТТЕРН, известный баг-класс: фоновые while-sleep НЕ отдают уведомление, агент слепнет на минуты.
- Тяжёлое — ЗАПУСК В ФОНЕ (background=true): opencode САМ пришлёт уведомление о завершении. НЕ поллить руками, НЕ проверять файл.
- Статус/хук — `wait_done(marker)` (event-driven): ОДИН блокирующий вызов вместо десятков sleep-команд.
- Marker-файлы: pipeline/project_build пишут `_DONE.json` — жди ЕГО, не «смотри на размер файла» N раз.
- Поллинг, если без него нельзя, — ТОЛЬКО ВНУТРИ ТУЛА (wait_done), не руками в шелле.
- Проверено (24 авг 2026): `_DONE.json` пишется движком (video_pipe.py:154) ✅; тул wait_done в каталоге ✅; inotifywait в PATH НЕТ — маркер работает через файл, не через inotify.

1. Длинные команды (npm install, build, тесты, dev-серверы, миграции) НИКОГДА не гонять в foreground напрямую. Сначала проверить: процесс не живой ли уже? (два npm в одной папке = лок). Если живой — убить старый (SIGTERM, потом SIGKILL, проверить порт: ss -tlnp | grep :PORT), только потом новый.
2. Запуск всегда в фон с логом в файл: `cmd > /tmp/job.log 2>&1 &` (или run_in_background=true). Полный лог живёт в файле, в контекст нейронке идут ТОЛЬКО куски: хвост `tail -50`, `grep -i "error\|fail"`, чтение с offset/limit.
3. НИКОГДА не делать `cmd | tail -N` — tail ждёт конца команды и показывает НОЛЬ вывода, пока команда идёт. Нейронка слепнет и думает, что всё зависло.
4. НИКОГДА не делать петли `sleep 300 && tail log` — это блокирует агента на минуты, его нельзя прервать. Максимум 2-3 проверки с паузой, между ними — текстовый ответ пользователю. Дальше — только спросить/сказать «ещё идёт, жду».
5. Не знаешь, жив процесс или завис — смотри на «свежесть вывода»: если файл лога не менялся долго И процесс жрёт 0% CPU — он завис, не «работает». Если пишет новые строки — жив. Прогресс-маркеры с таймстампами ставить в скриптах.
6. Таймаут ставить ВСЕГДА. Команда дольше ~80с рискует быть убитой харнессом с потерей всего вывода. Если команде можно умереть — обернуть её в скрипт с hard timeout и логом в файл.
7. Обрезанный вывод помечать: `[TRUNCATED: показано X из Y строк, полный лог: файл]`. Нейронка обязана знать, что видит не всё, и не делать выводы по обрезку.
8. Командам, которые не заканчиваются (dev-серверы, watcher'ы), — ждать маркер готовности (`wait` на паттерн «ready|listening|started` в логе), а не «пока не кончится». Или просто сказать пользователю, что запущено и куда смотреть.
9. После тихого падения (нет вывода, «успех без результата») НЕ перезапускать вслепую — сначала прочитать лог из файла, понять, что случилось. Перезапуск вслепую = тройной деплой и зомби-процессы.
10. Проверка «кончился или нет» — по exit-коду и факту: PID мёртв, порт свободен, лог-файл больше не растёт. Не верить статусу «running» от процессов, которые уже отвалились.
11. pkill -f НИКОГДА не объединять с работой в одной команде: он матчит командную строку СВОЕЙ ЖЕ шелл-команды (bash -c «...»), если паттерн встречается в ней (имя файла, аргументы curl, heredoc, имя скрипта) — убьёт сам себя. Канон: убийство ОТДЕЛЬНЫМ вызовом с защитой [x] (напр. `pkill -f "base-[d]ecoder"`), проверка `pgrep -f "base-[d]ecoder" || echo "старых нет ✅"`, и ТОЛЬКО потом отдельный вызов на докачку/перезапуск. НЕ продолжать после pkill в той же строке через `;` — дели на два вызова.

Правила ЭКОНОМИИ: временные скрипты, батчи, сжатие вывода (канон индустрии 2026, проверено по 20+ источникам: ai-agent-efficiency-playbook, RTK, Headroom, Caveman.MD, evilmartians):
1. БАТЧ ВСЁ. Независимые вызовы — ТОЛЬКО одним блоком (параллельно), никогда по одному. Кауфми: `batch_fetch` (30–50 URL за 1 вызов) вместо 30–50 fetch_page по одному; `research` сразу с fetch_top=10–20 вместо «нашёл → читаю по одному». Один батч ≈ ~800 токенов экономии на каждый сэкономленный раунд-трип.
2. НЕ читать файл, если нужна строка: `grep -n "паттерн" файл` вместо cat/read. read — только с offset/limit. ls всей папки — только find/grep с точным паттерном. `ls -la`/`cat` без надобности = мусор в контексте (RTK-правило: шум не пускать).
3. ВРЕМЕННЫЕ СКРИПТЫ: цепочка из 3+ команд (grep|sort|uniq -c|head, find+xargs, циклы, маскирование ключей) — ОДИН раз собрать в `/tmp/*.sh` (или `python3 - <<'EOF'`) и выполнить ОДНИМ вызовом. Никогда N вызовов ради того, что делает 1 скрипт. Правится через edit → перезапуск → удаляется. Лог — в файл, в контекст — только куски.
4. СЖИМАЙ ВЫВОД ВСЕГДА: `tail -50`, `grep -i "error\|fail"`, `head -20`, `uniq -c` вместо 100 одинаковых строк, `cut` до нужных полей. В контекст не лить больше ~100 строк. Обрезанное помечать: `[TRUNCATED: X из Y, полный: файл]`.
5. ДЕДУП: не перечитывать файлы/URL, уже побывавшие в контексте (каждый дубль read = 1000–3000 токенов). Кэш кауфми — сутки: посещённый URL возвращается бесплатно, НЕ ходить в веб за тем же самым.
6. ОДИН вызов = ОДНО полезное действие. Повторный ping после Unknown tool, два npm в одной папке, перечитывание одного лога — мусор. Объединяй в батч/скрипт всё, что можно.
7. Скрипт лучше правила: повторяющиеся ритуалы (рестарт web-сервиса, smoke кауфми, проверка ключа) — один раз в /tmp-скрипт и гонять, а не расписывать по шагам в каждом ответе (evilmartians-канон: автоматизация надёжнее инструкции).

Типичные проблемы:
НО! Есть беда: ДВА npm процесса в одной папке! Они дерутся за одно место — могут залочить друг друга. Это моя ошибка — старый не до конца умер. Чиню по канону
НО! Есть беда: тул объявлен в каталоге, но вызов даёт «Unknown tool» (camoufox.research, camoufox.web_search, даже ping). Каталог врёт: тулы зарегистрированы, но рантайм их не видит/не может вызвать. Это не «тула нет» — это MCP отвалился или кэш устарел. Чиню по канону:
1. НЕ долбить один и тот же тул 4 раза подряд — если «Unknown tool», тул не оживёт от повторов.
2. Сразу переключиться на запасной канон: websearch + webfetch (10+ источников, правило 6-8 работает и без camoufox).
3. Сказать пользователю: «camoufox отвалился, нужен перезапуск сессии / переподключение MCP» — по канону индустрии чинится: новый chat session + hard restart + переподключение MCP сервера (MCP Inspector, tools/list, health_check).
4. Проверить, что сервер жив: другой тул того же неймспейса (ping/fetch_page). Если мёртв весь неймспейс — дело в подключении, а не в имени тула.
5. Проверено на практике: `opencode2 service restart` + `opencode2 mcp list` (✓ connected) НЕ оживляют тулы в старой сессии — её кэш тулов мёртв навсегда. Живая проверка: `opencode2 run --auto "вызови camoufox.ping"` — если в новой сессии pong, а в текущей Unknown tool — тулы работают, но текущую сессию надо закрыть и открыть НОВЫЙ чат. Это лечится только новой сессией, рестарт сервиса не помогает.

---

## МОНИТОРИНГ ДОЛГОГО ПРОЦЕССА: НЕ СПАТЬ СЛЕПО — ПЕРЕХВАТ СМЕРТИ + УВЕДОМЛЕНИЕ (авг 2026) — РЕШЕНО ✅

Проблема: петля `sleep 180; ps -p PID; ...` = слепой сторож. Процесс умер на 10-й секунде — узнаешь на 180-й. Машину выключил — вообще никто не узнает. sleep = «подожду 3 минуты», wait = «проснись, КОГДА умрёт».

Канон (23 источника: GNU bash manual, LinuxCapable, Linuxize, Baeldung, linuxvox (wait / waitpid+timeout), SO 79419573 (wait -n), SO 10028820 (wait+timeout, kill -0), telegram-notify (samsulmaarif), Notify-me (Helias), linuxscriptshub / dev.to / giddi.net (telegram из bash), man7 systemd-run (--wait/--unit/--property), troglobit/watchdogd, diffstorm/processWatchdog, SO 31026279 (watchdog против зависших)):
- sleep = пауза ради паузы; wait = событийное ожидание, просыпается РОВНО в момент смерти (LinuxCapable: wait и sleep отвечают на РАЗНЫЕ вопросы).
- `kill -0 $PID` = «жив?» БЕЗ ps и grep — мгновенно, работает для ЛЮБОГО PID (не только детей шелла), без прав.
- `wait $PID` = ждать и ПОЛУЧИТЬ exit-код, но ТОЛЬКО для детей своего шелла (чужой PID → «not a child of this shell», SO 10028820).
- exit-код = единственная правда «кончился или нет» (правило 10 файла: не верить «running»).

### 🟢 УРОВЕНЬ 1 — перехват смерти за секунды (MVP, нативно)

Вместо слепого sleep-цикла — цикл с kill -0 (просыпается через 5с после смерти, НЕ через 180):

```bash
cd /путь/к/игре
WINEDEBUG=+loaddll wine my-app.exe > /tmp/acodyssey2.log 2>&1 &
PID=$!

# событийный сторож: умер → цикл падает МГНОВЕННО
while kill -0 $PID 2>/dev/null; do sleep 5; done
echo "УМЕР"

# улики СРАЗУ, а не через 3 минуты:
nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv,noheader
grep -cE "err:" /tmp/acodyssey2.log
tail -30 /tmp/acodyssey2.log
```

Если процесс запущен ЭТИМ ЖЕ шеллом — ещё проще, exit-код в руки:

```bash
wait $PID; RC=$?
echo "rc=$RC"   # 0 = сам закрылся, 1+ = упал/убит
```

- `wait -n` (bash 4.3+) — «проснись, когда КТО-ТО из фоновых умрёт» (несколько задач сразу).
- `wait -p VAR -n` (bash 5.1+) — и узнать, КТО именно.
- `wait -f PID` — ждать реальной смерти, а не «остановки» (kill -STOP).
- Максимум ожидания: `DEADLINE=$((SECONDS+1800)); while kill -0 $PID 2>/dev/null && [ $SECONDS -lt $DEADLINE ]; do sleep 5; done` (SO 10028820). Самому процессу — `timeout -k 5 1800 cmd` (SIGTERM, потом -k SIGKILL).

### 🟢 Уведомление о смерти (локально + в телефон)

Локально (env GUI — как в разделе про Firefox):

```bash
GPS=$(pgrep -f 'gnome-s[h]ell' | head -1)
export $(tr '\0' '\n' < /proc/$GPS/environ 2>/dev/null | grep -E '^(DISPLAY|WAYLAND_DISPLAY|XAUTHORITY|XDG_RUNTIME_DIR)=' | tr '\n' ' ')
notify-send "my-app умер" "rc=$RC"
```

В телефон — Telegram бот, 1 curl-строка (канон Helias/telegram-notify/linuxscriptshub):

```bash
TOKEN="ТОКЕН_ОТ_BotFather"; CHAT_ID="ТВОЙ_ID"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" -d chat_id=$CHAT_ID -d text="my-app УМЕР rc=$RC"
```

### 🟡 УРОВЕНЬ 2 — процесс под systemd (переживает закрытие терминала)

`systemd-run --user --unit=... --wait` (man7): процесс уходит под systemd, живёт БЕЗ терминала, `--wait` блокирует до конца и отдаёт exit-код, дальше `&&`/`||` — уведомление:

```bash
systemd-run --user --unit=acod --collect --wait \
  bash -c 'cd /путь && WINEDEBUG=+loaddll wine my-app.exe > /tmp/acodyssey2.log 2>&1' \
  && notify-send "my-app: готово ✅" \
  || notify-send "my-app: УМЕР ❌"
```

Плюсы: cgroup (убить всю семью: `systemctl --user kill acod`), `systemctl --user status acod`, `journalctl --user -u acod`, лог не теряется при смерти терминала.

### 🔴 УРОВЕНЬ 3 — постоянный сторож (для серверов)

watchdogd (troglobit), processWatchdog (diffstorm), monit, systemd `Restart=always` + linger (раздел «Автозапуск» выше) — демоны с авто-рестартом и алертами. Для одной игры на десктопе — оверкилл (правило градации: начинать с 🟢).

### Выключил машину — что перехватит?

Ничего, что крутится НА ЭТОЙ машине. Ответ индустрии: процесс должен жить ПОД systemd (`systemd-run` или юзер-сервис + linger, раздел «Автозапуск») — при загрузке systemd сам поднимет (`Restart=always`), а само «машина выключилась» перехватывает ТОЛЬКО внешний мониторинг (Telegram-бот на другом сервере / uptime-сервис). Для локальной игры достаточно 🟢: перехват за ~5с + notify-send + Telegram.

Проверено на этой машине (23 авг 2026): kill -0 цикл перехватил смерть за 3с при жизни процесса 3с (а не 180) ✅; wait вернул rc=0 и rc=1 (exit-код доезжает) ✅; kill -0 на чужой/мёртвый PID → dead, wait — только на детей ✅.

---

