---
name: 03
description: >
  Launch autonomous multi-machine consensus between Claude peers (hub + laptops + teammate
  machines): the peers negotiate a decision among themselves over a shared coordination channel
  and execute it, without using the human as a courier. Trigger on "/03" or phrases like "work
  it out among yourselves" / "find consensus". Announce-and-go: drop one status line, then open
  a proposal via the consensus engine. The human is woken only for irreversible/high-risk
  actions or a deadlock.
license: MIT
---

# /03 — машины сами находят консенсус

> 🧒 **При докладе Антону:** заверши простым «Простыми словами» (его правило [[eli5-always]]). Только в сообщении ЕМУ.

Антон сказал «03» / «теперь вы сами» → это МАНДАТ: пиры-Claude договариваются между собой и исполняют сами. Я НЕ переспрашиваю разрешения — **анонсирую и иду**. Антон нужен только на 2 воротах (ниже).

**Аргумент:** `/03 <тема/решение>` — что согласовать. Если темы нет (голое «03»/«003») — беру предмет из текущего разговора; если неоднозначно, сам формулирую предложение из контекста.

**Алиасы:** `003` = `03` (лишний ноль игнорирую); регистр не важен [[commands-case-insensitive]]. Не путать с «02» — это эскалация К Антону (TG-группа 02 POLICE), обратное направление.

---

## Шаг 0 — Живость пира ТОЛЬКО по живому сигналу (грабли 2026-07-04)
Прежде чем пинговать узел или выносить вердикт «лежит/жив» — спроси факт, не гадай по mtime:
```
python "%USERPROFILE%\.claude\scripts\_shared\clan_alive.py" [<node>]
```
Живость = Syncthing `connected==True` **ИЛИ** свежий `.tg-seen-<node>` (TG-рельс). 🟡 = жив по TG, Syncthing флапнул — это НЕ смерть. ⛔ НИКОГДА не суди по mtime файловых маркеров (`.read-*`, `.robot-done-*`, наличию `log-<node>.jsonl`) — TG-рельсовый follower их не пишет by design. Канон: [[peer-liveness-live-signal]].

## Шаг 1 — Анонс одной строкой, БЕЗ ожидания «да»
Роняю Антону ровно одну строку и сразу иду дальше (он может отменить, но я не жду):
```
🤝 если не против, иду согласовывать с <пиры> через 03: «<тема>»…
```
`<пиры>` = другие машины клана (хаб `HUB-1`, ноут `LAPTOP-1`, машины коллег). Кто онлайн — видно по шине; точный список не критичен, движок раздаёт всем.

## Шаг 2 — Определить риск-тир (это решает, нужен ли Антон)
- **Tier-0/1** (безопасное, обратимое: какая машина гоняет фон, расписание, выбор формата, разметка, дедуп-суждение) → пиры закроют сами.
- **Tier-2** (деньги · отправка наружу · необратимое · секреты · правка ОБЩЕГО канона CLAUDE.md/Библии/operating-agreement) → даже при согласии НЕ авто-коммит, уйдёт к Антону через QQQ.
В сомнении — выбираю более высокий тир (безопаснее).

## Шаг 3 — Открыть предложение через движок
- ⚠️ **СНАЧАЛА проверь, нет ли уже чужого треда на ЭТО действие** (грабли 17.07: хаб и Якорь независимо открыли #0eaf6c3c и #490b0384 на один и тот же мерж канона → дубль): `consensus.py pending` + `consensus.py list`. Есть открытое предложение пира на то же действие → **отвечаю в него** (`respond <id> accept/counter`), НЕ открываю рядом свой. Открывать новый — только если чужого нет.
```
python "%USERPROFILE%\.claude\scripts\consensus.py" propose "<ДЕЙСТВИЕ одной строкой>" --details "<улики/контекст>" --tier <0|1|2>
```
(Bash-вариант: `python "$USERPROFILE/.claude/scripts/consensus.py" propose "<action>" --details "<evidence>" --tier <N>`.)
- ⚠️ **Действие — в `"<тема>"` (subject), доказательства/диагностику — в `--details`.** Tier-tripwire сканит на стоп-слова ТОЛЬКО subject (действие), не улики. Свалишь диагностику («…laptop **sends**…», «**apikey** matches») в тему — ложно поднимет tier→2 и зря дёрнет Антона. Держи subject коротким и про действие.
- Движок дуально шлёт событие в TG-03 + `_machine-bus` (по конструкции, одиночный рельс запрещён) → переговоры видны в чате.
- Tier-2 propose движок САМ эскалирует на Антона (`❓ QQQ=да / NO=нет`) и НЕ коммитит.
- Запоминаю `#id` из вывода.

## Шаг 4 — Вести переговоры до согласия
Другая машина отвечает `respond <id> accept|counter|reject`. Когда я — отвечающая сторона, сперва `pending` (0-LLM ворк-лист «что ждёт МОЕГО ответа»), потом сужу по существу (Sonnet-грунт, [[model-routing-sonnet-grunt]]) и отвечаю тем же глаголом. Драйвит таймауты/раунды детерминированный `tick` (0-LLM, уже в inbox-роботе; таймаут = SLA самого медленного пира, спящий ноут/Mac ждём дольше хаба):
```
python "%USERPROFILE%\.claude\scripts\consensus.py" pending
python "%USERPROFILE%\.claude\scripts\consensus.py" tick
python "%USERPROFILE%\.claude\scripts\consensus.py" status <id>
```

## Шаг 5 — Исполнить и кросс-проверить (анти-«работает-у-меня»)
- Согласовано (status=agreed) и Tier-0/1 → `commit <id>` → **применяю реальную правку** → `verify <id> "<доказательство>"`.
- Задача globally done ТОЛЬКО когда ОБЕ машины независимо постят `VERIFY` (>=2). Один пир «сделал» — ещё не done.

## Шаг 6 — Ворота к Антону (ровно 2, иначе без него)

⛔ **Вопрос Антону НИКОГДА не пишу руками в чат** — только через движок `approval.py` [[remote-approval-qqq]]. Аск от руки не имеет `#id`: его не видит `approval.py due` (нет перепинга и эскалации), и позднее «+» Антона не к чему привязать — ответ проваливается в щель между состояниями (инцидент 21.07, разрешение вносили руками). Чат-id в скилле не хардкожу: адреса берёт сам движок из `~/.claude/approval.json → targets`.

**Как минтится аск:**
```
python "%USERPROFILE%\.claude\scripts\approval.py" ask "<что + зачем + риск> (консенсус #<id>)" --cat <money|delete|outbound|secret|config|other>
```
→ печатает JSON `{id, ask_text, targets}`. `ask_text` постит **вызывающая сессия** (approval.py — рекордер, не сендер) по `targets` ПО ПОРЯДКУ: `tg_police` = «02 POLICE» ПЕРВЫМ (стерильный канал «нужно внимание Антона»), дубль в `tg_group`/WA/личку. Ответ ловлю `approval.py check` (stdin = реплаи из MCP) → `APPROVED/REJECTED/EXPIRED <id>`. Висящий аск не бросаю: `approval.py due` печатает конверты перепинга — их постит в 02 та же сессия/inbox-робот. Это же страхует обрыв «сминтил id, но не успел запостить»: неотправленный аск всплывёт конвертом `due` в пределах freshness (15 мин), а не умрёт молча.

**Дедуп аска (иначе два вопроса на один спор):** перед `ask` смотрю `approval.py pending` — если открытый аск с этим `консенсус #<id>` уже есть (его мог породить `tick` или пир), второй НЕ минчу. Поэтому consensus-id ОБЯЗАН стоять в тексте аска: он единственная связка между тредом консенсуса и вопросом Антону.

**Типизация — что вообще достойно 02** ([[remote-approval-qqq]] §Типизация 14.07): **A** внутреннее/флот-обратимое · **B** наш контент в наши каналы · **C** короткое исходящее 3-м лицам по делу → решаю САМ как кофаундер, журналирую в `approvals.db`, отчёт постфактум — в 02 НЕ шлю. В 02 идут только **D** «нужны физически руки Антона» (2FA/UAC/пароль; формулировка = клик-путь, не «дай добро») и **E** категорически серьёзное (деньги · невозвратное удаление · секреты 3-м лицам · юр.обязательства · масс-рассылка · новый пир). Сомнение C-vs-E → E.

**Ворота (ровно два):**
1. **Tier-2 действие класса D/E** → `escalate <id> "<почему>"` фиксирует СОСТОЯНИЕ треда, но сам по себе трекуемого вопроса не создаёт → тем же ходом минчу аск через `approval.py ask` (см. выше) и постю его `ask_text`. Пришёл `QQQ`/`+` от подписанта (Антон · Рита · Нина) → `approve <id> "<кто/где/msg-id>"` фиксирует ОК в треде → только тогда `commit`.
2. **Пиры не сошлись** за round_cap (3) / таймаут по чему-то важнее Tier-0 → сперва **tie-break Якорьа** (`ANCHOR-1` — координатор, хранилище истины и арбитр межмашинных споров). Якорь мёртв/не способен рассудить (leader-down >70 мин → арбитр-на-тик хаб) → и **только тогда** будим Антона тем же маршрутом `approval.py ask`.
- **НЕ эскалирую:** безопасный Tier-0-тупик → tie-break (disagree-and-commit) закрывает сам, Антона не трогаю.
- ⚠️ `tick` при round-cap/таймауте может сам крикнуть в 02 по своей рельсе — это НЕ заменяет аск: он без `#id` approval-движка. Крикнул `tick` — доминчиваю аск через `approval.py`, чтобы у вопроса были id, перепинг и запись ответа.

## Доклад Антону (постфактум, коротко)
Что согласовали · с кем · вердикт (✅ committed+verified / ⏳ ждёт QQQ / 🔴 спор → тебе) · что реально сделано. Простыми словами в конце.

---

### Границы
- Tier-2 хард-стоп держится: «вы сами» НЕ даёт права самим тратить деньги/слать наружу/переписать канон.
- Канон коммитит только Антон через хаб [[machine-governance-leader-follower]].
- Failure-modes (византийский пир, авто-цикл, ложный VERIFY) — открытый DR; до закрытия держим Phase 1 консервативным.
- Движок — единственный источник истины состояния (`_machine-bus/_decisions/log-<MACHINE>.jsonl`); я не дублирую логику, только вызываю вербы.

---

<!-- CONTACT-FOOTER -->
## About & contact

Built and battle-tested at **Palo Alto AI Research Lab** — a fleet of Claude Code machines
running 24/7 as a second brain and synthetic cofounder. Every skill here survived real
production use before publication.

- 📦 All 101 skills: https://github.com/tonydzi/second-brain-starter-kit
- 👤 Author: **Anton Dziatkovskii** — Telegram [@tonydzi](https://t.me/tonydzi) · WhatsApp [+1 341 222 9178](https://wa.me/13412229178) · X [@Tony_Stef_](https://x.com/Tony_Stef_)
- 🧪 **Engineers: want to test-drive this setup?** Message me — I hand out free starter seeds to engineers who test and report back. Custom skill requests welcome.
