tweet-broadcast
Post queued tweets and replies from .pending-x/ via X API v2 (tweepy)
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Post queued tweets and replies from .pending-x/ via X API v2 (tweepy)
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | tweet-broadcast |
| description | Post queued tweets and replies from .pending-x/ via X API v2 (tweepy) |
| var | |
| tags | ["twitter","delivery"] |
Read memory/goals.json. If tweetingPaused is true, log "tweet-broadcast: paused by operator — skipping all posts" to memory/logs/{today}.md and exit immediately. Do not post anything, do not move files.
Post queued tweet files from .pending-x/ to Twitter/X using the X API v2.
Each tweet-*.txt file is a standalone post. Never pass --reply-to for tweet files.
Do NOT chain tweets into threads. Each one goes out independently to the main feed.
Only reply-{TWEET_ID}.txt files use --reply-to. Threads appear under "Replies" not "Posts" — this is wrong.
ls .pending-x/*.txt 2>/dev/null | head -20
If no files exist, log "tweet-broadcast: nothing queued" and exit cleanly.
For each queued file, check whether it was already posted by looking up its basename in memory/x-tweet-log.jsonl before calling X:
import json, os
posted = set()
try:
with open("memory/x-tweet-log.jsonl") as f:
posted = {json.loads(l)["source_file"] for l in f if l.strip()}
except FileNotFoundError:
pass
# skip if os.path.basename(filepath) in posted
If already posted: move the file to .pending-x/sent/ (use the Write tool if mv fails in sandbox) and skip — no X API call. This prevents duplicate-content 403s and saves POST quota.
Process at most 5 files per run. Tweets (tweet-*.txt) before replies (reply-*.txt).
Sort by filename (chronological order).
For each file (up to 5):
#content_type: first line — that is metadata only, never tweet text.tweet-*.txt) — standalone post, no reply-to:
python scripts/tweet-browser.py --action post --file .pending-x/tweet-20260604-on-chain-report.txt
reply-{TWEET_ID}.txt) — reply to that tweet ID:
python scripts/tweet-browser.py --action post --file .pending-x/reply-1234567890.txt --reply-to 1234567890
"status": "ok":
.pending-x/sent/memory/x-tweet-log.jsonl:
{"tweet_id":"1234567890123456789","content_type":"on-chain-report","text":"0.485 DIEM/day...","posted_at":"2026-06-04T14:00:00Z","source_file":"tweet-20260604-140000-on-chain-report.txt"}
"status": "error": leave file in .pending-x/, log error, continue.Log to memory/logs/{today}.md:
tweet-broadcast: posted N tweet(s), N replies — N failed (left in queue)
Launch a Liquid Protocol token with a LiquidPresaleVault presale. STAKE MODE ONLY (policy 2026-06-12) — depositors lock DIEM and always get it back; allocation is lock-to-earn. One vault per launch, 10% of supply, 60d default lock.
Weekly audit of memory/goals.json — recompute milestone ETAs, self-funding ratio, mode consistency; report deltas and one recommendation to the creator
Proactive ambient check — surface anything worth attention
Analyze AUTONO's own performance and implement one high-impact improvement today
Safety net for Venice inference credits — if sDIEM is below stake_min_diem, queue a stake-diem intent for the gated executor
Run one AUTONOMOPOLY agent tick — claim fees, LP DIEM, LP range check + reposition, maintenance inference