/social-daily — автопостинг на FB + Threads + Instagram
⛔ ЛИЧНОСТЬ БРАУЗЕРА (канон 30.08.2026). Chrome профиля Default на хабе = личность Антона (claude.ai там под [рабочий аккаунт], всегда).
Робот здесь ЧИТАЕТ и действует, но НЕ ТРОГАЕТ ЛОГИНЫ: ни logout, ни смены аккаунта, ни «самолечения входа», ни инжекта кук.
Увидел «не тот аккаунт» → доложи и работай из робо-профиля (_chrome_profile_a2, Firefox-профили). Канон: reglament-hab-brauzernye-lichnosti-bb-i-roboty.
Зачем. Раньше у каждой площадки была своя лесенка: у FB — движок-селектор, у Threads — проза внутри scheduled-задачи, у Instagram — ничего. Очереди рассинхронились и обе замёрзли 14.07 молча: трекер перестали пополнять, селектор честно видел ноль, лейн стоял 16 дней при живом производстве в канале. Один контракт + одна очередь + один счётчик темпа убирают этот класс.
Жёсткие правила (не обходить)
- ⭐ ПУБЛИКУЮ САМ. Гейт [коллега] снят приказом Антона 06.08.2026 («гейт [коллега] снят»), окно апрува = 0 часов с 05.08. Правило Антона 11.08.2026 дословно: «если за 24ч [коллега] не дала ОК — ты постишь сам». То есть ОК не ждём вообще; если материал почему-то отправлен ей на просмотр — таймер 24 часа, потом публикую без него. ⛔ «Набил в композер и жду клика» = провал прогона: человек в СЕРЕДИНЕ конвейера — баг архитектуры ([[human-is-the-bottleneck]]).
- Что осталось выше меня (это НЕ отменено):
paused в registry/limits.json — аварийный стоп-кран площадки у [коллега] и Антона · Tier-2 (деньги, юр.обязательства, секреты 3-м лицам) · приватность (private ⛔ наружу, personal — обобщённо) · матрица форматов platform_rules.json · slop_gate FAIL = переписать сейчас · IP-гейт §7.2. Увидел BLOCKED by registry — это работающий стоп-кран, а не сбой: не обходить.
- ⭐ ОДНА ДВЕРЬ. Перед отправкой спросить
pub_registry.can_post(<платформа>), после — записать факт в registry/pub_ledger.jsonl. Постинг мимо реестра = баг: замер 11.08.2026 — TG/X/FB публиковали десятками, а pub_ledger стоял с 10.08 и день-леджер честно показывал «FB 0 · X 0». Слепой прибор врёт в обе стороны.
- §7.2 IP-гейт. Постинг FB/Threads/Instagram — с постоянного IP (хаб). Селектор проверяет узел сам:
gate.mode == "block" → не постим отсюда, шлём задачу разрешённому узлу текстом по шине.
- Темп режет
fb_guard, не глазомер. guard.ok == false → стоп, назвать слот. Один ledger на все площадки — второй счётчик не заводить.
- Голос — готовый текст Антона, не переписываем и не выдумываем. Нет тела — нет поста.
- Один текст дважды не постим. Селектор берёт только незапощенное; вручную его не обходить. Перед FB-постом сверить реальную стену (трекер — не истина о стене, дубли 10.07 и 12.07).
Шаг 0-бис. ⭐ ТРОЙКА ДНЯ — сперва проверь её (приказ Антона 23.08.2026)
Каждый день наружу обязаны уйти три поста за ПРЕДЫДУЩИЙ день: 🏆 итог дня · 💥 факап дня · ❓ боль дня.
Канон: reglament-ezhednevnaya-troyka-postov-itog-fakap-bol, память daily-ask-and-fail-lanes.
python [путь владельца] build --day <вчера>
- Полосы пусты при живых кормушках → полоса молчит честно.
exit 1 / блок «🔴 КОРМУШКА СЛОМАНА» → чинить источник, не постить.
- Публикует [коллега]; Антон правит, не успел за 24ч — публикуем как есть, человека дольше суток не ждём.
- ⛔ @ClawRus — не публикуем вообще · ⚠️ @ClawEng — не чаще 1 поста в сутки (
limits.json, темп-гейт вернёт блокер сам).
- После публикации отметить полосу:
daily_community.py consumed --day D --lane win|fail|ask --note "...".
Шаг 0. Что вообще в очереди (0 токенов)
python3 ~/.claude/scripts/social_next_pending.py --board
Печатает по всем площадкам: сколько опубликовано, сколько в очереди, и поимённо все блокеры. Дальше идём только по площадке со статусом ГОТОВ.
Шаг 1. Взять следующий
python3 ~/.claude/scripts/social_next_pending.py --platform fb
python3 ~/.claude/scripts/social_next_pending.py --platform threads
python3 ~/.claude/scripts/social_next_pending.py --platform instagram
Читаем: can_post, blockers[], gate, guard, next.
can_post == false → стоп, доложить блокеры словами. Не обходить.
gate.mode == "warn" → постим, но карв-аут упоминаем в отчёте (узел формально не по канону).
Шаг 2. Тело поста — по лейнам
⭐ Перед набивкой любого лейна — ИСТОРИЯ, НЕ ТЕЗИС (anton 02.09.2026, голосом hub:6094; канон reglament-vsegda-rasskazyvay-istoriyu-storytelling, память [[storytelling-always-package-as-story]], гейт /taste-check P34): у тела поста есть герой · реальная ситуация · перелом · вывод. Голое наблюдение без контекста и жаргон без бытовой аналогии («упала рутина», «протух Python») → переписать: планка читателя — не-инженер, ELI5. ⭐ Пре-тест (anton 03.09): сюжет = ЖИВОЙ ЧЕЛОВЕК и эмоции (неудачи·страдания·деньги·стыд·камбэк), железо — декорация; «герой — инфраструктура» = переписать через человека. Каркас поста 60–120 слов = ABT («и…, НО…, ПОЭТОМУ…»); факап дня = расследование со ставкой (сцена → неверная гипотеза → улика → причина → что изменили), не исповедь; приёмка = чек-лист 10 вопросов в разделе «Чек-лист приёмки» $OBSIDIAN_VAULT\03-Insights\Operations\reglament-vsegda-rasskazyvay-istoriyu-storytelling.md. ⛔ Упаковка ≠ право менять слова Антона (§9.7) и раздувать объём (§9.4).
FB (body_source: channel): telegram MCP, аккаунт [рабочий аккаунт], get_message_context chat_id=[аккаунт] message_id={next.channel_msg} context_size=0. Тело = весь текст до разделителя ---. 1-й коммент собрать из next.links:
📖 Лонгрид для людей (EN): {longread_en}
🤖 Версия для машин (devlog): {devlog}
Что будет дальше — подпишитесь: t.me/ClawRus
Написать напрямую двум кофаундерам: WhatsApp +1 341 222 9178
Threads (body_source: bank): текст уже готов — next.text из банка _Dashboards/Threads-Posts-Bank.md. Лимит 500 знаков (next.over_limit подскажет). Стиль: без длинных тире, без буквы «ё» (пишем «е»), эмодзи 0-1, без хэштегов, живо, вопрос/CTA в конце.
Осталось [ ] меньше двух → сперва пополнить банк: прочитать свежие посты [аккаунт], разбить идею на standalone-микро-посты ~150 знаков, дописать секцией со статусом [ ]. Не дублировать уже помеченное [x].
Instagram (body_source: card, needs_image: true): лента не принимает пост без картинки. Рендерим карточку:
python3 ~/.claude/scripts/social_card.py --text "<тело>" --kicker "<тема>" --footer "<дата>" --out ~/Downloads/ig_card.png
Откажет с цифрами, если текст не влезает → сократить или разбить на карусель (несколько карточек). Подпись поста — тот же текст (до 2200 знаков).
Шаг 3. НАБИТЬ И ОПУБЛИКОВАТЬ
Chrome — живой залогиненный (claude-in-chrome), не headless. Не залогинен → это блок для человека, логин/2FA не трогаем.
-
FB: поле «What's on your mind, Anton?» → модалка Create post → клик в текст → type тело (в композере Enter = перенос строки, безопасно).
-
Threads: поле «What's new?» → модалка New thread → проверить, что активен antondzi → type.
⚠️ Грабли: первый клик часто сдвигает layout и теряет фокус — кликнуть второй раз и скрином убедиться, что текст лёг. Кнопка Post уезжает вниз после ввода — кликать по актуальной координате со скрина, не по памяти.
-
Instagram: Create → Post → загрузить PNG → Next → подпись.
-
X ([аккаунт]): вкладка x.com, сверить залогиненный handle по реестру, композер «What's happening», ≤280 знаков на твит (длиннее — тред через reply на свой твит). Темп: _shared/social_guard.py check x.
-
Telegram-каналы: не через браузер, а через MCP telegram аккаунтом [рабочий аккаунт] (send_message по id из 00-System\Channels-Registry.md). Матрица форматов: лонгрид целиком в канал ⛔ — только тизер + ссылка.
Всегда: скриншот (save_to_disk:true) — доказательство, что набито именно то.
Шаг 4. ⭐ Публиковать сейчас или положить в ОТЛОЖКУ
Человека не ждём (правило выше). Решение принимаю сам по темпу и времени суток:
- Сейчас — если дневной кап не выбран и материал привязан ко дню (факап дня, вопрос дня, свежая веха).
- В отложку — если постов за сегодня уже много, стоит глубокая ночь по аудитории, или разгребаю накопленный бэклог пачкой (тогда размазываю по дням, а не вываливаю стеной).
FB умеет нативную отложку — проверено вживую 11.08.2026 (профиль Антона профессиональный, Content Library доступна):
facebook.com/professional_dashboard/content/content_library/ → вкладки Published · Scheduled · Drafts, плюс раздел Planner (календарь). Планировать можно двумя путями: (а) в композере поста кнопка Create → Schedule post и выбор даты/времени; (б) из Content Library → Create. Проверить результат — вкладка ?filter=SCHEDULED: запланированное видно строкой «Scheduled • <дата, время>».
⚠️ Отложка = тоже публикация: она так же считается темпом и так же пишется в pub_ledger (событие scheduled с полем времени), иначе тот же класс слепого прибора.
X, Threads, Instagram нативной отложки под нашей рельсой не имеют — там либо сейчас, либо оставить в очереди с явной причиной.
Шаг 5. Публикация
- Опубликовать (FB: Next → Post settings → Post; при отложке — Schedule).
- Скрин-подтверждение («Just now» / тост «Posted»).
- Записать темп:
python3 ~/.claude/scripts/fb_guard.py record post --platform <fb|threads|instagram> (для FB --platform можно опустить).
- Забрать пермалинк: FB — клик «Comment», URL из таба; Threads — профиль
[аккаунт], клик по таймстампу верхнего поста; IG — клик по посту в профиле.
- FB: 1-й коммент (печатать построчно, между строк
shift+Return, отправить синей стрелкой — в комменте Enter = отправка) + селф-лайк.
Шаг 6. Реестр + трекер СРАЗУ + шина
Сначала реестр — это одна дверь наружу, а не отчётность. В [путь владельца] дописать строку по факту:
{"event": "posted"|"scheduled", "id": "<id материала>", "platform": "<fb_wall|x_en|tg_paloaltoairu|threads|...>", "url": "<пермалинк>", "title": "<коротко>", "at": "<ГГГГ-ММ-ДДTЧЧ:ММ>"} (для scheduled — at = время публикации, плюс "scheduled_from" = сейчас).
Не записал — считай, что не постил: день-леджер и все дашборды читают именно этот файл.
Дальше не копить пачкой — писать статус в тот момент, когда забрал пермалинк.
cp <трекер> <трекер>.bak-$(date +%Y%m%d-%H%M%S) # бэкап перед правкой
Правим строку {row_id} в _Dashboards/content-distribution-tracker.html (живой файл в волте, не в браузере): status:'✅ Запощен', url:'<пермалинк>', date:'<сегодня>', note += «✅ выложил Claude ({оператор}); источник {откуда тело}».
Threads дополнительно: в банке [ ] → [x] + ✅DD.MM → <пермалинк>.
python3 ~/.claude/scripts/bus_send.py ALL "✅ {площадка}: пост {N} выложен → {url}. Обновил {row_id}. ХАБУ: при перепечке трекера не затирай статус."
Шаг 7. Доклад одной строкой
«✅ {площадка} пост {N} — опубликован + коммент + трекер. Сегодня N/{кап}. Следующий: {что} в слот ~{время}.»
Стоп-краны
- Любой варнинг площадки (checkpoint, «слишком часто», подтверждение личности) → немедленно стоп, не ретраить, доложить.
gate.mode == "block" → отсюда не постим. Задачу — на разрешённый узел по шине.
- Текст не влезает в карточку IG → не обрезать молча, сократить или карусель.
- Логин/пароль/2FA не трогаем.
Инструменты
| Что | Где |
|---|
| Селектор очереди + нода-гейт | ~/.claude/scripts/social_next_pending.py |
| Конфиг площадок (узлы, капы, стиль) | ~/.claude/social_targets.json |
| Счётчик темпа (один на все площадки) | ~/.claude/scripts/fb_guard.py |
| Текст → PNG для Instagram | ~/.claude/scripts/social_card.py |
| Тесты | ~/.claude/scripts/_test_social_autopost.py |
| Паспорт детали | 00-System/Social-Autopost-Passport.md |
Связанное
fb-daily (скилл удалён, поглощён этим) — прежний одно-площадочный предок (его селектор fb_next_pending.py теперь шим над общим движком, контракт не менялся). /fb-post — разовый постинг конкретного текста. /fb-reply — комменты. /content-mine — пополнение воронки.
Открытый вопрос к Антону
Канон §7.2 (16.07) требует постить FB/Threads только с хаба (постоянный IP), а живые рутины fb-daily-poster и threads-daily-poster заведены раньше (08–09.07) на [машина флота]. Сейчас узел пускается по карв-ауту с пометкой. Решение Антона: мигрировать оба лейна на хаб или узаконить карв-аут в каноне. Instagram как новый лейн заведён сразу по канону — только хаб.
Анти-слоп гейт (anton 14.08)
Любой ИИ-написанный текст наружу из этого скилла перед отправкой - финальный проход /ai-slop (ban-лист + ритм). Исключения ровно три: текст с плашкой Майкрофта (§3.3) · машиночитаемое (GitHub/техдока/dev-log/journey-machine) · текст, написанный Антоном руками. Канон: reglament-posty-ot-lica-antona-tolko-cherez-ai-slop.
<!--kit-footer-->
Like this skill? It is one of 100 in second-brain-starter-kit: the second brain we built for ourselves and run every day at Palo Alto AI Research Lab. Install the whole set with npx skills add tonydzi/second-brain-starter-kit. Everything is open source and free, so take what you need.
Flagships worth a look on their own: secondop-panel (a second opinion from a panel of external models), claude-memory-tidy (stop your agent's memory from rotting), telegram-mcp-kit (your own Telegram over MCP in about 15 minutes).
Author: Anton Dziatkovskii, Palo Alto AI Research Lab. Telegram @tonydzi - WhatsApp +1 341 222 9178 - X @Tony_Stef_
Engineers: want to test-drive this setup? Message me. I hand out free starter seeds to engineers who test and report back, and custom skill requests are welcome.