fb-post · v1.0.0 · 2026-09-24 · sha256 0d389752e0861082

fb-post v1.0.0A

Immutable. This exact content never changes and is served at /api/v1/blob/0d389752e0861082.

---
name: fb-post
description: "Facebook, стена Антона: Publish a VETTED post to Anton's personal Facebook wall through his real logged-in Chrome (Claude-in-Chrome MCP = the low-ban-risk “act in the live tab“ path), rate-limit-guarded and draft-first. Trigger on “/fb-post“, “запости в фб“, “опубликуй пост в facebook“, “выложи на стену“, “publish to facebook“, “post this to my wall“"
version: 1.0.0
---

# /fb-post — опубликовать пост на стену Антона (безопасно, draft-first)

> ⛔ **ЛИЧНОСТЬ БРАУЗЕРА (канон 30.08.2026).** Chrome профиля Default на хабе = личность Антона (claude.ai там под **[рабочий аккаунт]**, всегда).
> Робот здесь **ЧИТАЕТ и действует, но НЕ ТРОГАЕТ ЛОГИНЫ**: ни logout, ни смены аккаунта, ни «самолечения входа», ни инжекта кук.
> Увидел «не тот аккаунт» → доложи и работай из робо-профиля (`_chrome_profile_a2`, Firefox-профили). Канон: `reglament-hab-brauzernye-lichnosti-bb-i-roboty`.

**Зачем.** Контент-фабрика и FB-дневник уже ПИШУТ посты голосом Антона, но черновик до сих пор оседает в Saved/волте. Не хватало только «кнопки публикации». Этот скилл закрывает её — и делает это самым безопасным способом (действуем в живой залогиненной вкладке Chrome, а не headless-ботом), с жёстким счётчиком объёма.

**Главные правила:**
- ⭐ **Публикую САМ, «+» не жду** (обновлено 11.08.2026). Гейт [коллега] снят приказом Антона 06.08, окно апрува = 0 часов с 05.08; правило Антона 11.08 дословно: «если за 24ч [коллега] не дала ОК — ты постишь сам». Прежняя строка «публикация = Tier-2, жди +» держала очередь: замер 11.08 — 25 готовых черновиков стояли до 6 дней при полностью открытых разрешениях. Tier-2 остаётся тем, чем был всегда: деньги, юр.обязательства, секреты 3-м лицам — не «наш пост в наш канал».
- **Выше меня остаются:** `paused` площадки (стоп-кран [коллега] и Антона) · приватность · правда в цифрах · матрица форматов · `slop_gate` FAIL · IP-гейт §7.2.
- ⭐ **Отложка вместо стены прямо сейчас** (проверено вживую 11.08): `facebook.com/professional_dashboard/content/content_library/` → **Scheduled / Drafts / Planner**, в композере **Create → Schedule post**. Разгребаю бэклог — размазываю по дням отложкой, а не вываливаю стеной.
- **Записать в реестр:** после публикации (или постановки в отложку) строка в `_imports\content-factory\registry\pub_ledger.jsonl`. Не записал = не постил.
- **Голос Антона = Opus.** Текст беру из готового черновика (`content-factory`, `facebook-diary`, `episode`) или пишу на Opus. Не выдумываю новый голос, не даю Sonnet писать авторское.
- **Объём низкий:** `fb_guard` режет на ≤8 постов/день. Не дублировать один и тот же текст (спам-флаг).

---

## 0. Предохранитель ПЕРЕД браузером (обязательно)
```bash
python "$USERPROFILE/.claude/scripts/fb_guard.py" check post
```
- `OK post (...)` → можно продолжать.
- `BLOCKED post: ...` (exit 3) → СТОП. Скажи Антону, что дневной лимит постов исчерпан, предложи запланировать на завтра. Не обходи.

## 1. Текст (голос Антона, Opus)
1. Если Антон дал готовый черновик — бери его. Если просит «оформи из X» — собери на Opus/Fable в его голосе (см. `fb-diary-voice`: вплетённо, с самоиронией, ~4000 знаков для дневникового; короче для анонса).
2. Прогони `slop_gate.py` по тексту. FAIL = переписать **сейчас**, в этом же заходе. Пройден — публикуй, разрешения не жди.

## 2. Браузер (Claude-in-Chrome, живая вкладка)
> Браузерная работа — строго ЛОКАЛЬНО на этой машине (Антон за хабом). Не тащить окно Claude вперёд.
> ⛔ IP-гейт (anton 16.07): постинг/комментинг FB — ТОЛЬКО с хаба `[машина флота]` (постоянный IP). Ты на другой машине? НЕ постить отсюда — задачу текстом на хаб (шина/03). Канон: `reglament-ip-sensitive-deystviya-tolko-s-haba`.

1. Проверь, что Chrome-MCP подключён: `mcp__Claude_in_Chrome__list_connected_browsers`. Если нет — попроси Антона открыть Chrome с расширением (не падай в Playwright).
2. Открой/выбери вкладку `facebook.com` (он уже залогинен — НЕ трогаем логин/пароль). Если не залогинен — это блок, скажи Антону.
3. Найди композер: `mcp__Claude_in_Chrome__find` запросом «What's on your mind / Что у вас нового — create post box». Кликни, чтобы открыть окно создания поста.
4. Введи текст в поле композера (`form_input` по ref из `find`). Перед отправкой перечитай, что РЕАЛЬНО легло в поле (§3.6: буфер обмена — общий ресурс машины, чужая вставка ловится только глазами).
5. Жми «Опубликовать»/«Post» сам. ⚠️ Диалог двухшаговый: compose → «Next» → Post settings → «Post». Нужна отложка вместо стены — в том же меню **Schedule post**, дата/время, потом проверь вкладку `content_library/?filter=SCHEDULED`. Сделай скриншот результата (`computer` screenshot), чтобы Антон ВИДЕЛ, что пост ушёл.
6. **Футер 1-м комментарием** (правило §7.7, тело поста без ссылок): открой опубликованный пост → поле «Comment» → блоки B+C+E из `_imports\content-factory\_STYLE-footer.md` (только живые ссылки). ⚠️ Enter отправляет коммент — переносы строк только Shift+Enter.
7. **Лайк-хвост** (правило Антона 05.07 «первый лайк всегда тяжело ставить» + голосовая 04.08 «все наши посты и комментарии должны получать лайки»): сразу после футер-коммента поставь Like (а) на свой пост, (б) на свой футер-коммент, (в) на КАЖДЫЙ комментарий под постом и на наши ответы в тредах. Штатный шаг, отдельно не спрашивать. Полный порядок, гейт темпа и запись в счётчик — скилл `/fb-likes` ЛЕЙН 1 (перед серией `fb_guard.py check like_own`, после каждого лайка `record like_own`).
7-бис. **Кнопки модалки жми по `ref`, не по координатам** (пережито 15.09.2026, пост касбука): клик по координатам «Next» закрыл диалог вместо перехода, черновик остался в композере и в ленте выглядел как опубликованный пост. Порядок: `find` «Next button in Create post dialog» -> клик по `ref` -> `find` «Post button in Post settings» -> клик по `ref`. И не верь `find` про реакции: он возвращает счётчики ЧУЖИХ постов той же страницы; число отклика бери из текста страницы рядом с телом СВОЕГО поста. `Page.captureScreenshot` на FB виснет пачками по 30с — доказательство публикации собирай перезагрузкой пермалинка и чтением текста, а не скриншотом.
7-тер. ⚠️ **ВТОРОЙ ЭКРАН `Post settings` НЕСЁТ ДВЕ КНОПКИ, И `find` ПУТАЕТ ИХ** (пережито 20.09.2026, пост касбука — это ПОПРАВКА к 7-бис, чей совет «клик по ref на Post» и привёл к провалу). За `Next` открывается экран `Post settings` с Post preview и ДВУМЯ кнопками в ряд: `Save` (слева, серая — сохраняет ЧЕРНОВИК) и `Post` (справа, синяя). Экран несколько секунд висит скелетом, и `find` в этот момент честно возвращает «Post button (submit)», который на деле оказывается сохранением. Итог 20.09: композер закрылся, текст остался в `region[Create a post]`, пост выглядел опубликованным, а на стене сверху стоял вчерашний.
Рабочий порядок: `Next` по `ref` -> ЖДАТЬ 6с -> СКРИНШОТ и убедиться глазами, что видны Post preview и ОБЕ кнопки -> клик по `Post` координатами из ЭТОГО свежего скриншота (здесь координаты ПРАВИЛЬНЕЕ, чем `ref`, потому что различают соседние кнопки).
Как отличить публикацию от черновика (наличие текста в `document.body.innerText` НЕ доказывает ничего, черновик лежит там же): текст обязан найтись внутри `div[role="article"]`, а у страницы обязан появиться пермалинк `.../posts/pfbid...`. Диалог браузера «Leave site? unsaved changes» при уходе со страницы = висит черновик.
Футер первым комментом: Enter в поле комментария ОТПРАВЛЯЕТ — переносы строк только `shift+Return`; пермалинк поста удобнее всего снять из `location.href` сразу после клика по «Leave a comment».

8. Грабли композера: первый клик может попасть в Stories (лента сдвигается при ленивой подгрузке) — после навигации подожди ~2с, скриншот, потом клик по свежим координатам.

## 3. Зафиксируй в счётчике (ПОСЛЕ успешной публикации)
```bash
python "$USERPROFILE/.claude/scripts/fb_guard.py" record post
```

## 4. Доложи
Одной строкой: что опубликовано + ссылка/скрин + «сегодня постов N/8».

---

## Стоп-краны (account safety)
- Любое предупреждение FB (checkpoint, «вы делаете это слишком часто», запрос подтверждения личности) → **немедленно СТОП**, доложи Антону, НЕ ретрай-спам (ретраи и есть путь в бан).
- Не публиковать идентичный текст повторно.
- Не трогать логин/пароль/2FA — если не залогинен, это блок для Антона.

## Связанное
- 🗺 **Общая карта FB-рельсы (читать первой при любой FB-задаче):** `~/.claude/scripts/docs/fb-rails.md` — где лежат данные, все капы `fb_guard`, IP-гейт, общие грабли браузера, кто из `fb-*` за что отвечает.
- `/fb-likes` — лайк-хвост шага 7 целиком + ежедневный обход лидов.
- `/fb-reply` — ответы на комментарии (Фаза 1, тот же guard).
- Движок-счётчик: `~/.claude/scripts/fb_guard.py` (общий на post/reply/dm).
- Тексты: `content-factory`, `facebook-diary`, `episode`, голос — `fb-diary-voice`.
- Канон: Decision Memo 2026-06-28 (набор FB-скиллов), `chrome-autonomy-self-drive`, `browser-work-on-peers-not-hub`.

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