---
name: fb-messenger
description: Read and reply to Anton's Facebook MESSENGER 1-on-1 chats (leads, partners like [коллега] [человек]) through his real logged-in Chrome (Claude-in-Chrome MCP = the low-ban-risk "act in the live tab" path), draft-first. Trigger on "/fb-messenger", "фб мессенджер", "открой мессенджер", "переписка с <имя> в мессенджере", "что писал <имя> в фейсбуке", "ответь в мессенджере", "read my messenger chat with <name>", "reply in messenger". READING is the safe default (0 outbound). SENDING a DM is OUTBOUND = Tier-2: show the draft in chat, get Anton's explicit "+" before typing into the composer (⚠️ in Messenger Enter SENDS immediately). Replies are meaningful messages in Anton's voice (Opus) — Messenger is a real conversation needing full context (pull the lead's card/history first), NOT a 5-word FB-comment joke. Sibling of /fb-post & /fb-reply (Facebook wall); browser work stays LOCAL on this machine. Canon: memory browser-work-on-peers-not-hub + short-text-when-unreviewed + chrome-autonomy-self-drive.
---

## ⚖️ ШАГ 0 — СНАЧАЛА БИБЛИЯ (обязательно, origin: anton 2026-07-26)

Перед ЛЮБЫМ действием этого скилла подними выстраданные правила Библии по лидам:

```bash
python3 ~/.claude/scripts/bible_leads.py            # карта (0 токенов)
python3 ~/.claude/scripts/bible_leads.py --grep <тема>   # срез
```

Идёт РАНЬШЕ `outreach_log.py check` и раньше RECALL по человеку. Нет правила в Библии →
это находка, после работы занести через `/intake`, а не импровизировать молча.
Канон: `reglament-lyubaya-rabota-s-lidami-snachala-bibliya` · `_Bible-Outreach-MOC` · CLAUDE.md §9.5

# /fb-messenger — читать и отвечать в Facebook Messenger (безопасно, draft-first)

**Зачем.** Антон ведёт живые разговоры с лидами и партнёрами (напр. [коллега] [человек] — обсуждение сида/коллаборации) именно в **FB Messenger**, а у нас были только Telegram/WhatsApp MCP. Этот скилл закрывает канал: читаем историю вживую и отвечаем голосом Антона — самым безопасным способом (действуем в его залогиненной вкладке Chrome, не headless-ботом).

**Главные правила:**
- **Чтение = безопасно** (ничего наружу) → делаю сам, автономно.
- **Отправка DM = OUTBOUND = Tier-2** → показываю финальный текст в чате, жду явного `+` Антона. ⚠️ В Messenger **Enter отправляет сразу** (в отличие от FB-поста с 2-шаговым диалогом) — поэтому в поле композера печатаю ТОЛЬКО после `+`.
- **Голос Антона = Opus, сообщение осмысленное.** Messenger — это настоящий диалог с контекстом (не FB-коммент-шутка на 5 слов). Сперва подними карточку лида + историю (RECALL), потом пиши. См. [[short-text-when-unreviewed]]: разный канал — разный режим; мессенджер требует контекста и знать человека.
- **Браузер строго ЛОКАЛЬНО** на этой машине (Антон за хабом отвлекается на чужое окно Chrome) — [[browser-work-on-peers-not-hub]]. Не тащить окно Claude вперёд, логин/пароль не трогать.

---

## 0. Chrome подключён? (обязательно)
```
mcp__claude-in-chrome__list_connected_browsers
```
- Есть локальный браузер (`isLocal:true`) → продолжаю.
- Нет → прошу Антона открыть Chrome с расширением. Не падаю в Playwright/headless.

## 1. Открыть Messenger
1. `tabs_context_mcp {createIfEmpty:true}` → получить tabId своей MCP-вкладки.
2. `navigate` → `https://www.messenger.com/`. Скриншот: должен быть залогинен (список Chats слева, аккаунт Anton Dziatkovskii). Не залогинен → блок для Антона (логин не трогаю).

## 2. Найти диалог по имени
1. Клик по полю «Search Messenger» (вверху слева, ~`210,103`).
2. Печатать имя. ⚠️ **Грабли (проверено 2026-07-08):** поиск по кириллическому имени («[коллега]») может не всплыть контакт — показывает только «Search messages». **Латиница по фамилии работает лучше** («Arsenov» → верхний результат `[коллега] [человек]`). Если не нашлось — пробую оба варианта написания / транслитерацию.
3. Верхний блок результатов (без заголовка «More people») = существующие диалоги/близкие контакты. Клик по нужному → откроется `messenger.com/t/<id>`.

## 3. Прочитать переписку (чисто, без рискованных кликов)
**Контент** — извлекаю текстом через JS (чище скриншота, порядок сверху вниз):
```js
// mcp__claude-in-chrome__javascript_tool, action: javascript_exec
(() => {
  const main = document.querySelector('div[role="main"]');
  if (!main) return 'no main';
  const seen = new Set(), out = [];
  [...main.querySelectorAll('div[dir="auto"]')].forEach(d => {
    const t = (d.innerText||'').trim();
    if (t && !seen.has(t)) { seen.add(t); out.push(t); }
  });
  return {count: out.length, msgs: out};
})();
```
- Диалог **виртуализирован** — видно ~13 последних. Нужна история глубже → `computer` scroll ВВЕРХ по области сообщений (центр ~`800,300`) и повторить JS; собрать в буфер.
- **Кто написал** — беру со СКРИНШОТА (`computer` screenshot), это истина: **исходящие (Антон) = синие, справа**; **входящие (собеседник) = серые, слева, с аватаром** (входящий bg `rgb(240,240,240)`). JS-эвристики по цвету/позиции дают пробелы на части пузырей — не полагаюсь на них для авторства.

## 4. (если просят ответить) Черновик → `+` → отправка
1. **RECALL сначала**: карточка лида/история/что Антон по нему писал (vault grep / CRM / TG). Messenger — осмысленный диалог, контекст обязателен.
2. Напиши ответ **голосом Антона (Opus)**, по существу треда. Покажи Антону **финальный текст в чате** и спроси `+`. Это Tier-2 gate — без явного «да» в композер не печатаю.
3. После `+`:
   - Клик по полю ввода «Aa» (внизу, ~`860,711`).
   - Ввести текст (`computer` type или `form_input`). ⚠️ **Enter = отправка.** Многострочный текст — только `Shift+Enter` для переносов; финальный Enter отправляет.
   - Отправить (Enter или клик по кнопке отправки). Скриншот результата, чтобы Антон ВИДЕЛ, что ушло.

## 4-бис. ⭐ Занеси собеседника в лайк-ростер (штатно, не спрашивать)

Разобрал тред — **в тот же заход** отдай человека дальше по конвейеру (правило Connect §4.2).
Это НЕ побочная услуга: замер 05.08 показал, что склейки TG→FB в данных нет (3 карточки из 13233),
и треды Messenger — **единственный** источник FB-профилей для ежедневного обхода лидов. Не занёс —
лейн 2 скилла `/fb-likes` завтра снова пустой.

Критерий (голосовая Антона 04.08): заносим только тех, с кем был **реальный контакт** — звонок
или осмысленная переписка. Пустая «привет-привет» ветка не считается.

```bash
python "$USERPROFILE/.claude/scripts/fb_like_roster.py" add --slug <slug> --name "<Имя>" \
    --fb-url "<ссылка на его FB-профиль>" --proof "<звонок 2026-07-12 | переписка о сиде, 40 сообщ.>" \
    --source messenger
```

- `slug` — тот же, что у карточки `07-People\person-<slug>.md`, если она есть; иначе `имя-фамилия`.
- Ссылку на профиль брать из шапки треда (клик по имени → профиль), не из `messenger.com/t/<id>`.
- Идемпотентно: повторный `add` того же человека просто обновит запись.
- Заодно, если карточка в волте есть, а поля `facebook:` в ней нет — впиши ссылку туда же.
  Тогда `fb_like_roster.py seed` подберёт человека и без ручного `add`.

## 5. Доложи
Одной строкой: с кем диалог + суть последних сообщений (+ если отправил — что и скрин) + занесён ли
в лайк-ростер. ELI5-блок для Антона.

---

## ⭐ КОНВЕЙЕР «КОММЕНТАТОР → DM» (anton 31.07: «писать всем кто прокомментил»)

Вход: список комментаторов поста (из `/fb-alpha` шаг 4 или `/fb-reply`). По КАЖДОМУ — пять шагов, порядок железный:

**(1) РАЗУЗНАТЬ — до единого слова наружу.**
Библия (`bible_leads.py`) → карточка `07-People/person-*` → лид-карточка CRM → `outreach_log.py check` (долг по ответам = стоп!) → был ли контакт, чем занимается, AI-вайбкодер/автоматизатор ли. Чем занимается неясно → это выясняет ПЕРВОЕ сообщение (искренний вопрос про его коммент), не выдумываем.

**(2) Развилка знакомства:**
- **НЕ знакомы** (карточки нет / dm_msgs 0) → короткий DM-заход: зацеп от его коммента (конкретно, что он написал) + предложение познакомиться. Без питча в первом сообщении.
- **Знакомы** → сперва **TOUCH BASE по Библии** ([[reglament-outreach-genuine-interest-first]] — искренний интерес первым, по [человек]; без питча, если звонок был <1 мес — только освежить): зацеп = его коммент + что у него сейчас (из карточки/переписки). Приглашение — вторым ходом, не в touch-base.

**(3) @clawrus:** если ещё не в группе (спросить/проверить по участникам) — позвать в t.me/clawrus как «наша RU-группа по Claude Code / AI-агентам». Уже там → шаг пропустить, не спамить.

**(4) Звонок:** ТОЛЬКО если выяснили, что человек сам в AI-вайбкодинге/автоматизациях → вывод на бук по канону `/to-call` (окно 48ч, CTA, лестница касаний — Calendly не раньше 4-5-го сообщения холодному!). Не-AI-человеку звонок не предлагаем.

**(5) Журнал:** каждый отправленный DM → `outreach_log.py` + пометка в карточке; ответ пришёл → прерывание №1 [[maintainer-first-issue-matching-measured]].

Гейты не слабеют: DM = Tier-2 draft-first (пачку черновиков → «+» Антона → отправка по одному); темп `fb_guard`; долг по ответам блокирует новые инвайты [[outreach-relationship-debt-gate]]; частота Библии (проекты ≤1/6мес). Плашка Майкрофта: DM пишу я → первая строка раскрытия обязательна (§3.3), текст после неё — регистр DM Антона [[style-anton-dm-register]].

---

## Стоп-краны (account safety + Tier-2)
- Любое предупреждение FB (checkpoint, «слишком часто», запрос подтверждения личности) → **немедленно СТОП**, доложить, не ретрай-спам.
- Не печатать в композер до `+` — случайный Enter отправит.
- Не отправлять идентичный текст многим (спам-флаг).
- Логин/пароль/2FA не трогаю; не залогинен = блок для Антона.
- E2EE-чаты (`messenger.com/e2ee/t/...`) тоже читаемы со скриншота; JS-извлечение отлажено на обычных `/t/` чатах.

## Связанное
- 🗺 **Общая карта FB-рельсы (читать первой при любой FB-задаче):** `~/.claude/scripts/docs/fb-rails.md` — где лежат данные, капы `fb_guard`, IP-гейт, общие грабли браузера. Там же замер 05.08 «склейки TG→FB нет» — почему §4-бис выше вообще существует.
- `/fb-likes` — потребитель ростера, который наполняет этот скилл (§4-бис).
- `/fb-post`, `/fb-reply` — стена Facebook (тот же принцип «живая вкладка Chrome, draft-first»).
- Механика Chrome — [[chrome-autonomy-self-drive]]; локальность — [[browser-work-on-peers-not-hub]].
- Тон/длина по каналу — [[short-text-when-unreviewed]] (мессенджер = осмысленное, не шутка).
- Голос Антона = только Opus (авторские исходящие).

## Анти-слоп гейт (anton 14.08)
Любой ИИ-написанный текст наружу из этого скилла перед отправкой - финальный проход `/ai-slop` (ban-лист + ритм). Исключения ровно три: текст с плашкой Майкрофта (§3.3) · машиночитаемое (GitHub/техдока/dev-log/journey-machine) · текст, написанный Антоном руками. Канон: `reglament-posty-ot-lica-antona-tolko-cherez-ai-slop`.
