X use cases

Everything log-cli does on X, one page per job. Each page can be run from a fresh context: say "go on docs/useCases/twitter/<page>.md" and say what this round is for (the role, the post, the topic). The page tells the agent what to read, which tools to call in which order, and what counts as done.

PageThe jobSends?
recruiting.mdfind people posting that they want work, reply with the job linkreplies, through the queue
topicReplies.mdreply to everyone posting about one topic, each reply about their own postreplies, through the queue
engagementReplies.mdanswer the people who commented on your own postsreplies, through the queue
notifications.mdsee who liked, reposted, replied to, quoted or followed, new and historicalnothing
engagerDms.mdDM the people who liked or reposted your postdms, through the queue
dmInbox.mdread the DM inbox and list who is waiting on younothing
affiliateMarketing.mdfollow up the conversations about a tool you use, with your affiliate credit where it helps, and book the partner calldms, one by one or through the queue
followers.mdcheck who really follows you before saying sonothing
whoNeedsYou.mdfind who needs something from you, or who matters, and how close each is to moneynothing
followUps.mdfollow up the people you picked, each in your own voicedms, one message per line, after you say yes
getTheAction.mdget everyone talking to you to do one thing (retweet, like, try it): each conversation explained to you in a line, then a reply that answers them and asksdms, through the account's one queue
networkMaxing.mdgrow the network, the niche map: get to know everyone who messaged and new people from the niche map, each conversation about themreplies, follows, likes and openers, sent once the voice gate passes
collabMaxxing.mdturn open conversations and missed openings into collabs: scope it, position the open-source collab, then the small askdms, one by one or through the queue, once the voice gate passes
nicheMapRegion.mdadd a new world to the niche map (the YC 2026 batches, say), run it through the pipeline, then open on the warmest of itfollows, likes and openers, a few a day, once the voice gate passes
managerMaxxing.mdthe managers of the biggest Kick streamers, category by category: find them on X, reply guy them with memes, then DM the ones who engaged their tweet, a line and a voice notereplies, then dms and voice notes, through the account's one queue

DMs are their own pages. Recruiting is public replies only.

The parts every X page uses

PartWhatWhere
The accounta TWITTER row in Twenty socialAccounts. Its cookies live there and nowhere else. A new account is added with log twitter cookies save --account <handle> in a terminal (skills/xPosting/SKILL.md)Twenty
Copy stylethe account's copyStyle (empty: house). Every send and queue check holds the copy to itsrc/twitter/copy/style
Session checkfirst call of every run, sends nothingtwitterSessionCheck / log twitter session check --account <account>
Finding people and postsan outside search, never X itself (rule 53). Say the price before a big sweeptreg's X search, profile, posts and comments reads
House style (house)all lowercase, no commas, no full stops, no dashes. Urls are fine. check refuses anything elsesrc/twitter/copy/style
One senddry run, then the …Live tool with approvedBytwitterReply, twitterQuote, twitterLike, twitterDm (+ …Live)
The queueany send to 2 or more people. Never a hand looptwitterQueueBuild → Show → Check → Approve → Plan → Run → RunLive, Add, Edit, Nudge, Status
Pacing2 minutes between sends by default (minGap 120), the window about 2 minutes per person; only longer when the owner asks. 240 writes a day per account. Any refusal from X (a 429, 226, 344, a soft block, the governor) stops the run, and nothing goes out until the owner starts it again (rule 94)the account's governor, ~/.logCli/twitter/<account>; --force goes past it only when the owner says so (rule 86)

The queue, step by step

The same calls on every sending page.

  1. Targets file: a JSON list of {handle, tweet_url, post_text} for replies, or {handle, user_id} for dms. A target may carry its own text, a line written for that one person's post, and the queue keeps it.
  2. Lines file (variations): a JSON list of copy lines for the targets without their own text. Build needs one unique line per such target, and isn't needed when every target has its own.
  3. twitterQueueBuild { targets, variations, out, account, action: reply | dm }. Writes the queue, never overwrites one.
  4. twitterQueueShow and twitterQueueCheck: house style and targets, contacts nothing. Show the table to the owner.
  5. twitterQueueApprove { by: "<owner>" } only after the owner says yes. Any edit afterwards voids it.
  6. twitterQueuePlan { window, minGap: 120, like: true }, with the window about 2 minutes per person (20 people: "40m"), then twitterQueueRun (dry run) then twitterQueueRunLive { confirmLive: true } when the owner asked for the live send. Follow it with jobStatus, and start a Monitor on ~/.logCli/mcp/<UTC day>.log first (rule 26). jobCancel stops it at its next wait.

One account has one queue and one run for everything it sends, dms, replies and quotes together (rule 107): twitterQueueAdd { queue, targets, action, by } puts more in, even while it runs, and twitterQueueRunLive { keepOpen: true } keeps the run going until jobCancel. Right before each send the run reads the person again and holds the item when anything happened since the draft (rule 109). Any refusal from X stops the run with the item pending; only a dropped connection with no answer is tried again. A deleted post or replies off (385/433) is skipped. What the run must do: docs/specs/xQueue.md and docs/specs/fullContext.md.

The queue hook puts every held item, send, refusal and stop in front of the agent (>>> QUEUE, rule 114). A held item: read them again (twitterDms { with }), redraft, gate it with voice, stop the run (jobCancel), put it back with twitterQueueEdit and run it again. A refusal or stop: tell the owner X's answer and the time; nothing goes out on that account until the owner says so (rule 94).

Rules that hold on every page

  • The owner approves the list before anything goes out. Show a table (who, which post, the exact copy) and wait for a yes.
  • One reply per person, ever. Before approving, read the account's recent replies and skip anyone it already answered. Dedupe handles inside the queue. If someone replies back, answering them is fine.
  • Personal beats generic. A line about the person's own post goes through; the same generic line with a link sent to strangers tends to come back as "no tweet created". Write each line for its post.
  • No claims you can't back up, and no pay figures in public replies.
  • Log every send: the reply url (https://x.com/<account>/status/<id>) or X's event, kept with the queue.