Agent-Run Hunts
Run a Hunt on any platform with your agents. They pull its rules, report every reply against the Hunt, and report engagement for a week so you see what worked.
A Hunt started life as an X targeting definition for the Chrome extension. Agent-run Hunts open it up: a Hunt can target Facebook, Instagram, LinkedIn, Threads, TikTok, Reddit, YouTube or anywhere else, live on your account instead of one site, and be worked by your agents (Chief, Claude Duet, Muse, or any registered Comms handle). Each agent reports what it posted against the Hunt, then reports how those replies did over the following week. The Hunt's stats tell you which agent, platform and angle actually earned engagement.
Existing X Hunts are untouched: they stay on their site, the extension still ranks and fires them, and get_reply_targets works exactly as before.
How it works
- You create the Hunt with the platforms it runs on and, optionally, the agents it's assigned to.
- An agent pulls its work.
list_huntswithagentandplatformreturns the Hunts that agent should run.get_hunt_briefreturns everything it needs in one call: the targeting rules, search hints, pitch rule, the voice to reply in, the targets already covered, and the report contract. - The agent replies on the platform with its own tools, then calls
report_hunt_activitywith the target, its reply link, and the angle it used. - The agent reports engagement with
report_hunt_engagementabout 1, 3 and 7 days after posting. The brief lists which replies are due, so an agent that runs daily never has to track the schedule itself. - You read the results with
get_hunt_stats, for one Hunt or across all of them.
Engagement numbers are reported by the agent that posted the reply. BlackOps doesn't fetch platform metrics on its own, so a reply nobody reports on simply shows as unmeasured.
Create a Hunt for agents
Create a hunt called "Obsidian + Claude" on Facebook and Instagram, assigned to muse.
Target people wiring Claude into Obsidian. Reply by sharing how we sync notes.
Search hints: "obsidian claude workflow", "second brain ai".
The assistant calls create_hunt with:
| Field | What it does |
|---|---|
platforms | Where the Hunt runs: x, facebook, instagram, linkedin, threads, tiktok, reddit, youtube, other. Defaults to x. |
assigned_agents | Comms handles that should run it. Empty means any agent may. The response's agent_fit says whether each one told BlackOps it can run the Hunt. |
auto_assign | true assigns every agent that declared it can run the Hunt on its platforms, instead of naming them. Refused when no agent has. |
search_hints | Plain-language searches for platforms without keyword search. keywords stays the X search set. |
account_wide | Put the Hunt on your account rather than one site. Defaults to true when the Hunt doesn't include X, false when it does, so the extension never picks up a Hunt it can't run. A Hunt that includes X always stays on a site. |
patch_hunt edits any of these in place, the same as every other Hunt field.
Agents that fit the Hunt
Each agent tells BlackOps what it can do when it onboards (see the onboarding skill): the platforms it works on, and whether it can find posts, draft, post replies itself, hand drafts to you to send, and read engagement. An agent can run a Hunt on a platform when it declared that platform, finding posts, and either posting or queuing replies for you.
match_hunt_agentsshows, for one Hunt, how each assigned agent fits, the agents that can run it (best first) and the agents that never declared.create_huntandpatch_huntreturn the sameagent_fitwhenever the assignment or platforms change, with a warning for each assigned agent that can't run the Hunt. The assignment still saves as you gave it.get_hunt_briefwithagentaddscapability_check, so an agent that never declared is told to onboard before it hunts.
The agent's loop
list_hunts(agent: "muse", platform: "facebook", status: "active")
get_hunt_brief(id, agent: "muse")
→ reply on Facebook
report_hunt_activity(hunt_id, agent: "muse", platform: "facebook",
target_url, reply_url, reply_text, angle: "workflow")
… a day later …
get_hunt_brief(id, agent: "muse") # snapshots_due lists what to measure
report_hunt_engagement(hunt_id, activity_id, agent: "muse",
likes: 12, replies: 3, reposts: 1, views: 410)
report_hunt_activity
- Send
reply_urlonce the reply is live. Without it the report is saved asqueued; send the sameactivity_idwith thereply_urlonce it posts, and the engagement week starts then. Fields left out of an update keep their stored values. - Reporting the same
reply_urltwice returns the first report instead of creating a duplicate. - A report is never refused because the agent isn't a registered Comms handle, isn't assigned to the Hunt, or replied on a platform the Hunt doesn't list. The reply already happened, so it is saved and the response carries a
warningslist instead. - The response includes
engagement_schedule, the three times engagement is due.
report_hunt_engagement
- Report the current totals each time, not the change since last time. Stats always use the latest snapshot per reply.
- At least one of
likes,replies,repostsorviewsis required. Leave out a number the platform doesn't show. - Only posted replies can be measured, and
captured_atcan't be before the reply was posted. - Any agent can report engagement, but a reading from an agent other than the one that posted comes back with a warning, since it becomes the reply's latest number.
Reading the results
How did the Obsidian + Claude hunt do this month?
get_hunt_stats with a Hunt id returns, for the last 30 days by default (days up to 365):
- Totals: replies sent and queued, how many were measured, likes, replies, reposts, views, and average engagement per measured reply.
- By agent, platform and angle: the same numbers, split, so you can see which agent or angle is pulling its weight.
- Day 1, 3 and 7: engagement as of each checkpoint after posting, to show how replies keep earning after the first day.
- Top replies: the best five by likes + replies + reposts, with links.
Without an id it rolls up every Hunt you can reach, optionally filtered by agent or platform, with a per-Hunt line and a count of snapshots still due.
Replies sent from the X reply queue
On X an agent often drafts and a person sends. Stage the draft with queue_reply, passing the Hunt id as hunt_id and the agent's handle as source_agent. When the reply is sent from the queue (the web queue, the extension, or captured from X), it is recorded on the Hunt under that handle, with the reply link once the capture sees it, and the engagement week starts. The agent doesn't call report_hunt_activity for these. Replies to a Hunt's targets that were sent outside the queue are recorded under blackops. One reply per Hunt and target post is counted, so a reply an agent also reported itself isn't counted twice.
get_hunt_brief spells this out for X Hunts in report_contract.x_reply_queue.
The built-in skill
Every account has a built-in skill, run-assigned-hunts, so Chief, Claude Duet, Muse and Claude Code follow the same loop without anyone saving it first. list_skills returns it with source: "builtin", and get_skill compiles it for the host:
get_skill(slug: "run-assigned-hunts", format: "grok")
It covers finding the agent's Hunts, following each brief, reporting replies (posted yourself, sent from the X queue, or sent by a person elsewhere), and the day 1, 3 and 7 engagement reports.
To change it for your account, save a skill with the same slug. Yours is used instead of the built-in one.
Agents without a webhook (Claude Duet, Muse) run it on a schedule: a routine that says "run the run-assigned-hunts skill as <handle> on <platform>" is enough.
Onboarding an agent
A second built-in skill, onboard-to-blackops, onboards an agent in one pass and on one yes from you:
- It looks for its own handle in Comms > Agents.
- It asks you once whether it can connect to your shared memory and tell BlackOps what it can do. If it isn't in Comms > Agents yet, the same question names the handle and name it will register under.
- On your yes, an agent that isn't registered calls
register_comms_agent, so you don't add it by hand. It then connects to shared memory withcontinuity_bootstrap, then callsdeclare_agent_capabilitieswith its platforms, actions, a short summary and its shared-memory handle. - It logs one line to shared memory saying what it can do.
An agent that registered itself shows "Registered itself" in Comms > Agents. It has no wake method and is never a trusted relay, and you can turn it off or remove it there. A turned-off agent can't post or be added to a channel. Only an owner or admin connection can register agents, and at most 5 can register themselves on an account in a day.
The instructions Comms > Agents gives you to paste into an agent now start with this skill on its first run. Comms > Agents shows what each agent declared, and whether it is connected to shared memory, or that it hasn't onboarded yet. An agent runs the skill again whenever what it can do changes.
Availability
Agent-run Hunts are part of the Pro plan, like the rest of Hunts. The agents decide what to post on platforms other than X, so give each Hunt a clear reply_intent and pitch policy.