tg-slot · git:20260814.5023d8c · 2026-08-14 · sha256 f7a5761e26407273
tg-slot git:20260814.5023d8cA
Immutable. This exact content is served forever at /api/v1/blob/f7a5761e26407273.
---
name: tg-slot
description: >
Free a SLOT in Telegram for a new group and join it immediately. Accounts have a hard ceiling
of channels+supergroups; at the ceiling the account can neither CREATE a group nor JOIN by
invite (the error message misleadingly blames the target chat). The skill finds the least-
valuable current memberships, proposes what to leave, and retries the join. Trigger on "/tg-
slot", "can't join the group", "free a telegram slot".
license: MIT
---
# /tg-slot — освободить слот под новую Telegram-группу
**Боль (поймана вживую 26.07 при сборке «Пульса»):** `corp_acct` не смог ни создать супергруппу, ни войти по инвайту. Сообщение Telegram про «maximum number of participants» уводит в сторону — переполнен не чат, а НАШ аккаунт. Пришлось делать владельцем группы запасной `personal_acct`, что неправильно: рабочие группы должны жить на рабочем аккаунте.
**Движок:** `~/.claude/scripts/tg_group_slots.py` — режимы `count` · `rank` · `emit-plan` · `leave`. Один файл, Telethon, без сервера и БД.
## Ритуал (шаги по порядку, ни один не пропускать)
### 1. Замерить — без цифры дальше не идём
```bash
python ~/.claude/scripts/tg_group_slots.py count --account corp_acct --no-probe
```
Печатает `Premium: ДА/нет · потолок ~N` и `СЛОТОВ ЗАНЯТО`. **Потолок читай из вывода, не из памяти** — он зависит от Premium, и «500» верно далеко не всегда (замер 27.07: `work_acct_b` = 1003 занятых).
### 2. Ранжировать кандидатов
```bash
python ~/.claude/scripts/tg_group_slots.py emit-plan --account corp_acct --top 50
```
Чем МЕНЬШЕ балл, тем безопаснее выходить. Балл понижают: группа молчит ≥1 года (−4, главный сигнал), конференция прошедшего года в названии (−3), молчит ≥полугода (−2), ни одного нашего сообщения (−2), крипто-шум по словарю (−1).
**Защита от дурака — в кандидаты не попадают никогда:**
- **99** — наши бренд-группы (Palo Alto, ClawRus, ClawEng, VCsDAO, SV_founders, страновые event-группы), любые где мы **админ или создатель** (админка теряется необратимо), рабочие чаты флота (03, 02 POLICE, 04, CALLS, Пульс).
- **98** — **intro-группы** («X <> Palo Alto…», «Intro: …», «Знакомство…»). Intro = ядро продукта Антона; даже тихая intro-группа идёт только отдельным разбором. Мёртвая intro = молчит много месяцев **И** сделка закрыта — это решает Антон поимённо, не скрипт.
Перед показом списка **убедись, что защита реально сработала** — и не по счётчику в шапке, а глазами по названиям. Шапка печатает «защищено (наши/админ): N · intro-групп: M», но счётчик не видит того, чего словарь не знает.
⚠️ **Инцидент 27.07, ради которого этот шаг и существует.** Первый прогон выдал в кандидаты на выход 10 живых intro-групп: `Mei Shmidt 🤝 Stanford AiW3 Research Lab`, `HSG < > AAAPadSF`, `Ivan 🤝 Ted`. Детектор искал `<>`, а **основная конвенция Антона — эмодзи-рукопожатие `🤝`**; плюс `Stanford AiW3` и `A.A.A / AAAPad` вообще не значились как бренды. Счётчик в шапке при этом выглядел здоровым. Вывод, который дороже самого фикса: **словарь всегда отстаёт от жизни**, поэтому список читается глазами по названиям, а не принимается по метрике. Читая список, ищи глазами: два имени/компании через разделитель · знакомую фамилию · незнакомый бренд, который может оказаться вашим.
### 3. Показать Антону и получить «+»
Покажи список **до** выхода: название · дата последнего сообщения · причина. Выход из группы **НЕОБРАТИМ** — в приватную группу без нового инвайта не вернуться. Поэтому здесь настоящий стоп: без явного «+» Антона на КОНКРЕТНЫЙ список ничего не исполняется. Антона нет у терминала → `approval.py ask` в 02 POLICE (это тип E — необратимое удаление доступа), а не «решу сам».
### 4. Выйти
```bash
python ~/.claude/scripts/tg_group_slots.py leave --account corp_acct --confirm ANTON-PLUS-2026-07-27
```
Исполнитель перепроверяет статус каждой группы **в момент выхода**, а не доверяет плану: план мог устареть (нас сделали админом, группа ожила). Всё защищённое пропускается с причиной. Журнал каждого выхода — `~/.claude/tg_leave_log.jsonl` (это и есть evidence для задачи).
### 5. Пере-замерить и войти
Повтори шаг 1 — цифра должна упасть. Затем войди в новую группу тем аккаунтом, ради которого чистили. **Проверка делом, а не «должно работать»:** пока аккаунт фактически не вошёл, слот не считается освобождённым.
## Правило «вошёл в новую → освободи слот»
Это не разовая уборка, а обмен. Каждый раз, когда рабочий аккаунт входит в новую группу вблизи потолка — сразу назови наименее релевантную к выходу и предложи обмен. Иначе через месяц снова упрёмся, уже в разгар живой задачи (ровно так и случилось с «Пульсом»).
## Границы
- ⛔ **Выход без явного «+» Антона на конкретный список — никогда.** Необратимо.
- ⛔ **`personal_acct` и `work_acct_a` не чистим** — они не переполнены, это наш запасной ресурс. Чистка только `corp_acct` и `work_acct_b`.
- ⛔ Intro-группы и группы с живой перепиской лидов/партнёров — только поимённый разбор Антоном.
## Грабли прогона (стоили одного убитого прогона 26.07)
- **Не оборачивать в `timeout N`** — обход всех диалогов идёт дольше 5 минут, обёртка `timeout 280` убила первый прогон.
- **Не резать вывод через `tail`** — съедает шапку со счётчиком слотов, ради которого всё и затевалось.
- **Вывод буферизуется** при перенаправлении в файл: запускай в фоне и опрашивай файл, «пусто» ≠ «сломалось». Проверить, что процесс жив: `Get-CimInstance Win32_Process -Filter "Name like '%python%'" | ? { $_.CommandLine -like '*tg_group_slots*' }`.
- Между выходами стоит пауза 2 с и обработка `FloodWait` — Telegram не любит пачку выходов подряд.