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.
| Page | The job | Sends? |
|---|---|---|
| recruiting.md | find people posting that they want work, reply with the job link | replies, through the queue |
| topicReplies.md | reply to everyone posting about one topic, each reply about their own post | replies, through the queue |
| engagementReplies.md | answer the people who commented on your own posts | replies, through the queue |
| notifications.md | see who liked, reposted, replied to, quoted or followed, new and historical | nothing |
| engagerDms.md | DM the people who liked or reposted your post | dms, through the queue |
| dmInbox.md | read the DM inbox and list who is waiting on you | nothing |
| affiliateMarketing.md | follow up the conversations about a tool you use, with your affiliate credit where it helps, and book the partner call | dms, one by one or through the queue |
| followers.md | check who really follows you before saying so | nothing |
| whoNeedsYou.md | find who needs something from you, or who matters, and how close each is to money | nothing |
| followUps.md | follow up the people you picked, each in your own voice | dms, one message per line, after you say yes |
| getTheAction.md | get 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 asks | dms, through the account's one queue |
| networkMaxing.md | grow the network, the niche map: get to know everyone who messaged and new people from the niche map, each conversation about them | replies, follows, likes and openers, sent once the voice gate passes |
| collabMaxxing.md | turn open conversations and missed openings into collabs: scope it, position the open-source collab, then the small ask | dms, one by one or through the queue, once the voice gate passes |
| nicheMapRegion.md | add a new world to the niche map (the YC 2026 batches, say), run it through the pipeline, then open on the warmest of it | follows, likes and openers, a few a day, once the voice gate passes |
| managerMaxxing.md | the 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 note | replies, 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
| Part | What | Where |
|---|---|---|
| The account | a 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 style | the account's copyStyle (empty: house). Every send and queue check holds the copy to it | src/twitter/copy/style |
| Session check | first call of every run, sends nothing | twitterSessionCheck / log twitter session check --account <account> |
| Finding people and posts | an outside search, never X itself (rule 53). Say the price before a big sweep | treg'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 else | src/twitter/copy/style |
| One send | dry run, then the …Live tool with approvedBy | twitterReply, twitterQuote, twitterLike, twitterDm (+ …Live) |
| The queue | any send to 2 or more people. Never a hand loop | twitterQueueBuild → Show → Check → Approve → Plan → Run → RunLive, Add, Edit, Nudge, Status |
| Pacing | 2 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.
- Targets file: a JSON list of
{handle, tweet_url, post_text}for replies, or{handle, user_id}for dms. A target may carry its owntext, a line written for that one person's post, and the queue keeps it. - 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. twitterQueueBuild{ targets, variations, out, account, action: reply | dm }. Writes the queue, never overwrites one.twitterQueueShowandtwitterQueueCheck: house style and targets, contacts nothing. Show the table to the owner.twitterQueueApprove{ by: "<owner>" } only after the owner says yes. Any edit afterwards voids it.twitterQueuePlan{ window, minGap: 120, like: true }, with the window about 2 minutes per person (20 people: "40m"), thentwitterQueueRun(dry run) thentwitterQueueRunLive{ confirmLive: true } when the owner asked for the live send. Follow it withjobStatus, and start a Monitor on~/.logCli/mcp/<UTC day>.logfirst (rule 26).jobCancelstops 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.