fb-watch
Skill6 starsChanged 2 months agoMITView on GitHub
Check a Facebook wall for authored posts that have no teaser yet and draft the teasers for short-form channels. Runs as a daily routine or on demand, and stays draft-first. Triggers: "/fb-watch", "check facebook for un-teased posts", "catch up on teasers".
- Reads credentials
In this repository100 other files it gives its agents.
- AGENTS.mdAGENTS.md
- 03Skill
- 1Skill
- agendaSkill
- alfa-search-recall-deepresearchSkill
- alpha-judgeSkill
- alpha-reviewSkill
- archSkill
- askSkill
- bibleSkill
- brainSkill
- busSkill
- canon-revisionSkill
- ccSkill
- chatgpt-syncSkill
- chat-searchSkill
- chatSkill
- claudeai-syncSkill
- coachSkill
- codex-mirrorSkill
- codex-reviewSkill
- cofounderSkill
- cofounder-watchSkill
- commentsSkill
- community-alphaSkill
- content-mineSkill
- crm-syncSkill
- declinedSkill
- dedupSkill
- defuddleSkill
- dr-fanoutSkill
- episodeSkill
- faaa-syncSkill
- faSkill
- fb-postSkill
- fb-replySkill
- findSkill
- fireflies-syncSkill
- five-hardSkill
- fleetSkill
- follower-onboardSkill
- geminiSkill
- gitbook-importSkill
- gmailSkill
- granola-syncSkill
- handoffSkill
- health-syncSkill
- inboxSkill
- intakeSkill
- intentionSkill
- introSkill
- issue-matchSkill
- journeySkill
- last30daysSkill
- local-chatgpt-token-healSkill
- mcpSkill
- migrateSkill
- mine-channelSkill
- n8nSkill
- notebooklmSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 2 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 27
Chrome readiness: Check the live Facebook tab (Claude-in-Chrome).
- Very specific: line 30
Detector: write the list to posts.json → python fb_teaser_watch.py unteased --in posts.json.
- Very specific: line 34
For each un-teased post: write 2 teasers (top model, the owner's voice) strictly per the playbook 08-Templates\teaser-writing-playbook.md …
- Distinctive: line 50
Only HIS own posts and HIS own channels.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/fb-watch — finishing the teasers for the owner's Facebook posts
Why. The owner sometimes writes a post STRAIGHT onto his Facebook wall, bypassing the pipeline (voice → episode → tiers). Such a post ends up WITHOUT a teaser in the RU chat / X (EN) → reach is lost. This watchdog catches "there is an authored Facebook post with no teaser yet" and writes the teasers immediately. Draft-first until armed.
Tools (a thin orchestrator, AK-47)
- Reading the wall = the Claude-in-Chrome MCP (a live logged-in Facebook tab, locally on the hub). Reuses the pattern from
/fb-reply(in-pagejavascript_tool, since Facebook hides names behind the MCP boundary).- ⛔ Do NOT read the profile feed (consensus #0223a74a, 07-20): it is virtualized and renders ONE post — the neighbours stay eternal skeletons,
scrollHeightis constant, and real scrolling does not help. One run hid 2 content posts out of 5 that way. - ✅ The harvesting rail = the Content Library:
https://www.facebook.com/professional_dashboard/content/content_library/→ a table of posts, FULL text (truncation is CSS-only), exact date-time, metrics. Parsing:document.body.innerText→ lines, anchor on"Published", the text is the line before, the date the line after; accumulate across scrolls (dedupe by the first 60 characters). - ⚠️ The Content Library does NOT give permalinks (the row menu only has Edit/Delete). To get them: on the wall, do a real
computer hoverover the post timestamp → Facebook fillspfbidintohref(before hovering the href is empty; synthetic MouseEvents and React-fiber tricks do NOT work — Facebook uses a custom renderer key). - UPGRADE (owner approved 2026-06-30, waiting on credentials): as soon as
secrets\fb_graph.envexists (FB_USER_TOKEN,user_posts) andpython ~/.claude/scripts/fb_posts_poll.py checkis green → read the wall throughpython ~/.claude/scripts/fb_posts_poll.py posts --limit 10 --out posts.json(Graph API, more reliable than the browser, no ban risk) INSTEAD of Claude-in-Chrome. See [[decision-social-posting-stack]] §6.
- ⛔ Do NOT read the profile feed (consensus #0223a74a, 07-20): it is virtualized and renders ONE post — the neighbours stay eternal skeletons,
- Detector/ledger/cap =
python ~/.claude/scripts/fb_teaser_watch.py(0 tokens, dedup + daily cap + kill switch). State:$IMPORTS_ROOT/content-factory/fb_teaser_ledger.json+fb_watch_config.json. - Teasers are written by the top-tier model in-session (the owner's voice), palettes:
_STYLE.md/_CRAFT.md+style-reality-show.md. Drafts →_imports\content-factory\fb-teasers\<id>.md. - RU posting = Telegram MCP
send_message, the secondary work account (the creator), chat <YOUR_CHAT_ID> (the RU chat). EN/X = no poster yet → ALWAYS a draft (waiting on the social-tools DR).
Procedure
- Chrome readiness. Check the live Facebook tab (Claude-in-Chrome). Not ready / not logged in → flag it in the fleet log chat ("fb-watch: Chrome/Facebook not ready, wall not read") and STOP. Do not pretend "there are no posts" (visibility layer — a silent zero is a breakage).
- Extract the authored posts from the owner's wall (the last ~10): for each
{id, permalink, text, ts}.id= a stable story/permalink id. Only HIS authored posts (no reshares, nothing of other people's). Text taken out of the page is safe (no hidden names). ⛔text= the FULL post text, MANDATORY (expand "See more" before harvesting): pfbid rotates on every harvest (proved 07-05), so a post's identity lives ontext_hash. A post with no text = dedup is blind to it (the engine will emit a WARN on stderr — do not ignore it, go back and collect the text). - Detector: write the list to
posts.json→python fb_teaser_watch.py unteased --in posts.json. The output is the posts WITHOUT a teaser. 🚨 exit 4 =HARVEST-THIN(fewer than 3 posts collected, thresholdFB_TEASER_MIN_HARVEST): this is NOT "there are no posts", this is a HARVEST FAILURE → re-harvest through the Content Library and flag it in the fleet log chat. A silent zero is forbidden (consensus #0223a74a). Rule: 1 teaser for EVERY such post (found 5 — write 5; that is not a daily cap). 🛡️ Freshness guard (07-14): an unknown post older than 72h (--max-age-hours) is seeded by the engine as a skip with stable keys — the wall's backlog and pfbid rotation cannot cause a flood; on stderr this shows asstale-auto-skipped=N. Disable with--no-auto-skip(do not disable it in the routine).- FORWARD-ONLY on the first run:
python fb_teaser_watch.py backfill-status→ if NOT DONE (exit 1) and the list is long (that is the whole wall backlog) → do NOT publish en masse: mark every existing postseed-skip --id <id>, thenmark-backfill-done, and report "forward-only: N posts seeded as skip, from now on every NEW post gets a teaser". After that — genuinely new posts only.
- FORWARD-ONLY on the first run:
- For each un-teased post write 2 teasers (top model, the owner's voice) strictly per the playbook
08-Templates\teaser-writing-playbook.md(the hook in line 1, ONE technique, the 4U check, a cliffhanger + "full version → [link to the Facebook post]"):- RU — warm, for the RU chat, 240–370 characters (HARD).
- EN — for X, ≤280 characters.
- Privacy is HARD: no third-party names/@handles/amounts/secrets. The co-founder CTA is NOT needed here (it belongs in the medium/long tiers). Save both into
fb-teasers\<id>.md.
- Publish:
- RU:
python fb_teaser_watch.py can-post --rail ru→ exit 0 (armed + under the cap) → post the text into the RU chat (Telegram MCP, the secondary work account, chat <YOUR_CHAT_ID>) →mark-posted --id <id> --rail ru. Exit 3 (disarmed/cap) → leave it as a draft. - EN:
x_poster_readyinfb_watch_config.jsondecides.false→ draft.true→python ~/.claude/scripts/x_post.py post "<en teaser>"(X API v2, OAuth1; exit 0 = posted, prints the url). The poster is armed once the owner has X dev credentials insecrets\x_api.envandx_post.py checkis green (see [[decision-social-posting-stack]] §6). - Then
python fb_teaser_watch.py record-draft --id <id>(so the post does not surface again).
- RU:
- Report to the owner. A STATUS REPORT (how many found, what was posted to RU, what stayed a draft) — that is a report, not a question → into the fleet log chat / the Telegram folder, as usual.
If you need HIS OK (review mode / disarmed: "do we publish AND arm the automation?") — ⛔ do NOT hand-write the question into the fleet log chat (heartbeat noise buries asks there, the owner will not see it). Raise the ask through the remote-approval engine, which sends it to the approval channel FIRST and mirrors it into the log chat / DM:
python ~/.claude/scripts/approval.py ask "fb-watch: N drafts ready. Publish AND arm the automation? QQQ=yes,publish+arm · NO=keep them as drafts"→ returns{id, ask_text, targets}. Then SENDask_texttotargetsstrictly in order (Telegram MCP; targets[0] = the approval channel = first). Check the answer:python ~/.claude/scripts/approval.py check. Canon [[remote-approval-qqq]] ("a QQQ ask → the approval channel first"); the gatelint_approval_routing.pymakes sure this step does not drift again.
Boundaries (Tier-2 / safety)
- Owner's authorization (2026-06-30): RU auto-posting into the RU chat is ARMED (
armed=true) — he gave standing authorization (a teaser is a pointer to an already-public Facebook post, minimal risk). Kill switch:disarmat any moment. - 1 teaser per post without a teaser (NOT a daily quota). Dedup via the ledger → no double posting.
daily_hard_cap(25) is only insurance against a flood bug. - Forward-only: the first armed run seeds the existing wall as
skipand posts NOTHING — so the RU chat is not flooded with the backlog; after that every NEW post gets a teaser. - Only HIS own posts and HIS own channels. No blind auto-posting into anyone else's space.
- The authorial voice = the top-tier model only. The groundwork (detector) = 0 tokens.
- Browser work stays strictly LOCAL on the hub ([[browser-work-on-peers-not-hub]]).
Links
Canon for the rule: memory [[teaser-crosspost-clawrus]] + the house rulebook entry on teaser cross-posting. Relatives: [[fb-skill-set]] (/fb-post, /fb-reply, fb_guard), [[content-factory]] (the Distribute stage), [[short-text-when-unreviewed]]. The routine twin: the scheduled task fb-watch-daily (1×/day, daytime).
<!--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.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

