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`.