pult · v1.0.0 · 2026-09-24 · sha256 1f1d02797376b199

pult v1.0.0A

Immutable. This exact content never changes and is served at /api/v1/blob/1f1d02797376b199.

---
name: pult
description: "📱 ПУЛЬТ — ежедневная ПУСТАЯ сессия с Remote Control на каждом узле Антона, чтобы он мог управлять машиной с ТЕЛЕФОНА без AnyDesk. Триггеры “/pult“, “/пульт“, “/cockpit“, “поставь пульт“, “сессия-пульт“, “нужен доступ с телефона“, “пульт не поднялся“, “проверь пульты на флоте“"
version: 1.0.0
---

> 🔴🔴 **ОПРОВЕРГНУТО 10.09.2026 13:45 — ЧИТАЙ ПЕРЕД ИСПОЛНЕНИЕМ.**
> Замер по логу приложения (`%LOCALAPPDATA%\Claude\Logs\main.log`, 07-10.09):
> планировщик поднял **51 сессию**, Remote Control получили из них **0**.
> Приложение включает RC только на трёх UI-событиях — `first_turn`, `warm_send`,
> `cold_resume` (строка `[rcAutoEnable] verdict: ... trigger=<X>`), и сессия,
> рождённая scheduled-task, ни одного из них не вызывает.
> ⇒ Ежедневная пустая сессия по крону телефоном НЕ управляется. Ставить её как
> «пульт» больше нельзя — это ложная зелень второго рода.
> ✅ Что теперь верно: `cold_resume` РАБОТАЕТ, значит **любая** сессия, открытая
> Антоном на десктопе одним кликом, становится управляемой с телефона.
> Отдельный пульт не нужен, нужен один клик. Подробности: память
> `remote-control-always-on` §Опровержение 10.09.


# 📱 Пульт — свежая сессия под телефон, каждый день, на каждом узле

**Приказ Антона 09.09.2026** (голосом 00:15 + 07:49) и подтверждение 10.09.2026 («и хаб, и оба моих ноутбука — по одной такой сессии в сутки»).

**Корень, ради которого это существует** ([[remote-control-always-on]], доказано main.log 18.08): RC-мост по-сессионный и рождается ТОЛЬКО в момент старта нового процесса сессии. Резюм старой сессии моста НЕ поднимает — на телефоне «Disconnected», тап её не будит.

Значит управляемая сессия = ВСЕГДА свежерождённая. С телефона создать новую нельзя ⇒ её обязана рождать рутина.

**Дешевизна — часть контракта.** Пульт стоит ~0 токенов: ставит имя, роняет одну строку, молчит. Любая инициатива в пультовой сессии = дефект.

## Шаг 1 — статус текущего узла (детерминированно, 0 токенов)

```bash
python ~/.claude/scripts/pult_status.py
```

exit 0 = пульт ЖИВ (есть в расписании) → Шаг 3. exit 1/2 → Шаг 2. exit 3 = реестр приложения не найден, прибор себя не доказал — молчи о данных, разбирайся с прибором.

⛔ **`ls ~/.claude/scheduled-tasks/` доказательством НЕ является.** Эта папка синкается между узлами через claude-config, а РЕГИСТРАЦИЯ расписания — локальная, в реестре аккаунта приложения (`scheduled-tasks.json`, поле записи `id`, **не** `taskId`). Замер 10.09.2026: на хабе папка лежала, записи в реестре не было — пульт по утрам не вставал, а глазами выглядел стоящим. Это ложная зелень, ровно [[instrument-is-a-claim-too]].

## Шаг 2 — поставить пульт на ЭТОМ узле

`create_scheduled_task` со строго такими полями:

- `taskId`: `rc-cockpit-anton-daily` (имя ОДНО на весь флот — так `fleet`-проверка ищет его одной строкой)
- `schedule`: cron ежедневно `08:44` локального времени узла (диспетчер сдвигает на ~+4 мин, это норма)
- `notifyOnCompletion`: `false` — пульт не должен пищать Антону каждое утро
- `description`: `📱 Пустая сессия-пульт: Remote Control с телефона`
- `prompt` — САМОДОСТАТОЧНЫЙ (сессия стартует без контекста родителя), тело ниже.

Тело промпта (подставь имя узла вместо `<УЗЕЛ>` — короткое, как Антон его называет: ZBook / Хаб / MacBook):

```
ПЕРВЫМ ДЕЛОМ переименуй эту сессию: вызови mcp__ccd_session_mgmt__set_session_title
с title "[Антон] 📱 Пульт <УЗЕЛ> <ДД.ММ сегодняшняя дата>".

Ты — ПУСТАЯ сессия-пульт для Антона. Твоя работа — стоить ноль токенов и ждать.

После переименования сделай РОВНО одно: ответь одной строкой по-русски
"📱 Пульт готов, жду команду с телефона. Антон, ответь любым словом." и остановись.

Больше НИЧЕГО: не читай инбокс, не запускай скрипты, не шли в шину и Telegram,
не строй дашборды, не делай ретро, не делай RECALL, без ELI5-блока.
Никаких инициатив до первого сообщения Антона.
Когда Антон напишет — работай как обычная сессия по CLAUDE.md.
```

⛔ **Модель задать нельзя** — планировщик её не принимает, Антон переключает сам (его дефолт «opus medium»). Не выдумывай поле.
⛔ **Из РУТИННОЙ сессии `create_scheduled_task` не звать** (CLAUDE.md §9.2): в безлюдном прогоне апрув-окно некому нажать, сессия виснет. Пульт ставится из ЖИВОЙ сессии либо через сид `spawn_queue.py`.

Сразу после создания — объяви выход (§5.5), иначе рутина считается немой:

```bash
python -c "import json; p=r'[путь владельца]'; d=json.load(open(p,encoding='utf-8')); d['exempt']['rc-cockpit-anton-daily']='пульт по построению молчит: выход = сама живая сессия-пульт, потребитель = Антон с телефона (RC-мост); проверка = sessions_now.py утром'; json.dump(d,open(p,'w',encoding='utf-8'),ensure_ascii=False,indent=1); print('exempt записан')"
```

⚠️ Грабля 10.09 (хаб): `green_gap.py exempt <id> --reason` НЕ существует — движок лежит в `scripts/_shared/green_gap.py` и субкоманды exempt не имеет (печатает подсказку и выходит). Причина пишется строкой прямо в `green_gap_exempt.json` (ключ в объекте `exempt`), команда выше делает ровно это.
```bash
: # (историческая строка удалена — не звать green_gap.py exempt)
```

## Шаг 3 — статус по ФЛОТУ (узлы Антона с приложением Claude)

Пульт нужен на трёх узлах: **ZBook** · **Хаб [машина флота]** · **[машина флота]**.
[машина флота] (Маяк, Linux VPS) — приложения нет, пульт неприменим, это законный skip.
Узлы [коллега] и [коллега] — не пульт Антона, не трогаем.

```bash
# хаб — прибором, не наличием папки
python ~/.claude/scripts/hubrun.py --cmd 'python "$env:USERPROFILE\.claude\scripts\pult_status.py"'
```

[машина флота] по ssh недоступен (Remote Login выключен — замер 10.09, таймаут порта 22). Единственная дверь к нему = шина, ставит сессия НА САМОМ Mac (§7.2: пир своё делает у себя). Строку ниже про bus_send — использовать сразу, не искать ssh.

Узел молчит/недоступен → НЕ молчать: TASK в шину dual-send, чтобы поставила сессия НА ТОМ узле (§7.2 — пир своё ставит у себя):

```bash
python ~/.claude/scripts/bus_send.py <MACHINE_KEY> "TASK: поставь у себя ежедневный пульт — скилл /pult Шаг 2. Проверка ФАКТОМ: python ~/.claude/scripts/pult_status.py. Причина: Антон управляет узлом с телефона, RC живёт только у свежей сессии."
```

## Шаг 4 — хвост «вторые аккаунты»

Задача живёт в реестре ТОГО аккаунта приложения, из-под которого создана. У Антона на узлах бывает второй аккаунт (BB / a@) — там пульта НЕТ, пока не создашь из сессии этого аккаунта. Не закрывай вопрос словом «стоит на узле», если аккаунтов два: назови, в каком именно стоит.

## Шаг 5 — вердикт о скилле (§9.3-бис, обязателен)

Одной строкой: 🔧 обновляю (что споткнулось + чиню тем же заходом) · 📝 обновлю не сейчас (причина + куда легла строка) · ✅ не надо (почему именно). Пустое «не надо» вердиктом не является.

## Проверка живости (что считать доказательством)

«Задача создана» ≠ «пульт работает». Доказательство = Антон открыл сессию с телефона и она ответила (канарейка 17.08 13:19–14:03 — так и доказали). Прибор постфактум:

```bash
python ~/.claude/scripts/sessions_now.py    # свежая "[Антон] 📱 Пульт ..." в списке = утро прошло штатно
```

Канон: память [[remote-control-always-on]] · CLAUDE.md §4.1 (человек = бутылочное горлышко), §9.2 (рождение сессий), §5.5 (рутина называет свой выход).

## Грабли, проверенные на живых данных (не повторяй)

- `bus_send.py` — аргументы ПОЗИЦИОННЫЕ (`bus_send.py <MACHINE_KEY> "текст"`), флагов `--to/--text` нет.
- Тело задачи для робота обязано начинаться с `TASK:` — **с двоеточием**. Гейт шины отбивает «TASK » без двоеточия: инбокс-робот такое не берёт, сообщение молча теряется как задача.
- Реестр задач: `%APPDATA%/Claude/claude-code-sessions/<org>/<acct>/scheduled-tasks.json` (Win), `~/Library/Application Support/Claude/...` (macOS). Ключ записи — `id`.
- Модели у задачи нет: планировщик поле не принимает, Антон переключает вручную.