@audienti/cli 0.2.0-exora.3 → 0.2.0-exora.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +2 -2
  2. package/cli/account-reply-operations.mjs +24 -1
  3. package/cli/agents.mjs +42 -10
  4. package/cli/audience-operations.mjs +1 -1
  5. package/cli/audienti.mjs +54 -17
  6. package/cli/campaign-find.mjs +155 -0
  7. package/cli/campaign-operations.mjs +6 -3
  8. package/cli/campaigns.mjs +21 -3
  9. package/cli/cohort-operations.mjs +1 -1
  10. package/cli/discovery-operations.mjs +2 -1
  11. package/cli/discovery.mjs +3 -2
  12. package/cli/json-file.mjs +1 -1
  13. package/cli/kv-operations.mjs +17 -0
  14. package/cli/kv.mjs +58 -0
  15. package/cli/mcp.mjs +2 -2
  16. package/cli/outcome-operations.mjs +19 -0
  17. package/cli/outcomes.mjs +16 -0
  18. package/cli/owner-account-client.mjs +1 -1
  19. package/cli/{approach-operations.mjs → playbook-operations.mjs} +15 -15
  20. package/cli/progress.mjs +6 -6
  21. package/cli/question-operations.mjs +4 -4
  22. package/cli/questions.mjs +4 -4
  23. package/cli/queue-operations.mjs +7 -6
  24. package/cli/queue.mjs +4 -3
  25. package/cli/recipient-operations.mjs +1 -1
  26. package/cli/rooms-operations.mjs +6 -5
  27. package/cli/rooms.mjs +7 -6
  28. package/cli/secret-operations.mjs +7 -0
  29. package/cli/secrets.mjs +30 -0
  30. package/cli/sender-account-operations.mjs +6 -2
  31. package/cli/sender-accounts.mjs +13 -8
  32. package/cli/skills-mcp.mjs +6 -2
  33. package/cli/skills.mjs +55 -12
  34. package/cli/tools-operations.mjs +18 -10
  35. package/cli/tools.mjs +48 -20
  36. package/cli/work-execution-operations.mjs +6 -0
  37. package/cli/work-execution.mjs +3 -3
  38. package/cli/work-operations.mjs +4 -3
  39. package/cli/work.mjs +2 -2
  40. package/cli/workspaces.mjs +28 -16
  41. package/package.json +2 -2
  42. package/skills/agent-rooms/SKILL.md +104 -0
  43. package/skills/agent-rooms/references/commands.md +58 -0
  44. package/skills/audienti/SKILL.md +106 -5
  45. package/skills/audienti/references/helpers.md +15 -2
  46. package/skills/audienti/references/profile-workflows.md +4 -2
  47. package/skills/audienti/scripts/contracts.mjs +1 -1
  48. package/skills/getting-started/SKILL.md +180 -154
  49. package/skills/getting-started/references/audience.md +72 -7
  50. package/skills/getting-started/references/campaign-draft.md +54 -13
  51. package/skills/getting-started/references/capabilities.md +214 -0
  52. package/skills/getting-started/references/mailbox-check.md +64 -0
  53. package/skills/getting-started/references/outcome-checks.md +89 -0
  54. package/skills/getting-started/references/replies.md +152 -0
  55. package/skills/getting-started/references/reply-checks.md +54 -0
  56. package/skills/playbook-design/SKILL.md +132 -0
  57. package/skills/playbook-design/references/fields.md +89 -0
  58. package/source-manifest.json +58 -43
  59. package/skills/getting-started/references/inventory.md +0 -52
@@ -1,193 +1,219 @@
1
1
  ---
2
2
  name: getting-started
3
- description: Run once, right after your Audienti connection is approved. Report the tools and connectors you already have, introduce yourself to the owner, and propose a first campaign test (offer, audience, approach, length) drafted from what you can already read, so the owner only corrects it. Use again when your tools change or the owner asks for a new test.
3
+ description: Run once, right after your Audienti connection is approved. Report the tools and connectors you already have, introduce yourself to the user, and propose a first campaign test (offer, audience, playbook, length) drafted from what you can already read, so the user only corrects it. Use again when your tools change or the user asks for a new test.
4
4
  ---
5
5
 
6
6
  # Getting started with Audienti
7
7
 
8
- You are an agent that has just been connected to a person's Audienti account. Audienti
9
- is an agentic CRM and the system of record for this work: audiences, offers, campaigns,
10
- people, companies and the work you do for them. The person who approved you is the
11
- owner.
12
-
13
- The owner wants to learn which approach books meetings. Your job is to turn their ideas
14
- into campaign tests quickly and to do as much of the work as you can. Ask only for what
15
- you cannot find yourself.
16
-
17
- Start every run with the work queue. Audienti keeps a queue of what is due for you:
18
-
19
- ```sh
20
- audienti queue next --json
21
- ```
22
-
23
- The reply starts with `orientation`: what Audienti is, who you are in this workspace and
24
- how to work. Read it. Your first task is usually **Report your tools and connectors**,
25
- which is part 1 below. Claim a task before you start it (`audienti queue claim TASK`),
26
- and report it when you finish (`audienti queue done TASK --note "what you did"`). If
27
- you cannot finish, release it (`audienti queue release TASK --note "why"`) so another
28
- agent can take it. Over MCP, use `agent_queue_list`, `agent_queue_claim`,
29
- `agent_queue_complete` and `agent_queue_release`.
30
-
31
- There are three parts, in order:
32
-
33
- 1. **Triage your tools** and report them to Audienti. Ask nothing.
34
- 2. **Introduce yourself and propose a first campaign** as one question in Operator
35
- (`audienti ask`), not in chat.
36
- 3. **Save the campaign as a draft** once the owner answers, and show five fits.
37
-
38
- Keep messages plain and short. Address the owner as "you". No emoji, no marketing tone.
8
+ You have just been connected to a person's Audienti account. Audienti is an agentic CRM
9
+ and the system of record for this work: audiences, offers, campaigns, people, companies
10
+ and the work you do for them. The person who approved you is the user. The user wants
11
+ to learn which playbook books meetings: turn their ideas into campaign tests quickly, do
12
+ as much of the work as you can, and ask only for what you cannot find yourself. Write
13
+ plainly and briefly, address the user as "you", no emoji, no marketing tone.
14
+
15
+ Start every run with the work queue: `audienti queue next --json`. The reply opens with
16
+ `orientation`: what Audienti is, who you are and how to work. Follow it. One read
17
+ covers every workspace your user approved you in (`workspaces` lists them), so one
18
+ schedule and one call are enough; `--workspace ID` narrows it to one. `next` is the task
19
+ to take now; tasks you already hold are in `holding`, finish those first. Each task names
20
+ its `workspace`: run every `audienti` command for it with `--workspace` and that ID, as
21
+ `workspaceStep` says. Claim a task before you start it (`audienti queue claim TASK`), report it
22
+ when you finish (`audienti queue done TASK --note "what you did"`) or release it
23
+ (`audienti queue release TASK --note "why"`). Over MCP, use `agent_queue_list`,
24
+ `agent_queue_claim`, `agent_queue_complete` and `agent_queue_release`. On a long task,
25
+ claim it again every 20 to 30 minutes with a note that says where you are: that extends
26
+ your lease and shows the user your progress; if your lease lapses, another agent may
27
+ take the task and continue from your last note. A refused claim says why: `task_taken`
28
+ (another agent holds it; pick another task), `task_closed` (done, skipped or no longer
29
+ due; read the queue again) or `task_not_for_you` (the message says which: assigned to
30
+ another agent; or it needs a capability you have not reported as connected, so report
31
+ your tools again if you have one; or its requirements are being refreshed, so read the
32
+ queue again and claim it from there). Your first task is usually
33
+ **Report your tools and connectors**, part 1 of three: triage your tools and report
34
+ them, asking nothing; introduce yourself and propose a first campaign as one question in
35
+ Operator (`audienti ask`), not in chat; save the campaign as a draft once the user
36
+ answers, and show five fits.
39
37
 
40
38
  ## Rules that always apply
41
39
 
42
40
  - **Report, never connect.** List only the tools and connectors your runtime already
43
- has. Do not install connectors, start OAuth or ask the owner to sign in to anything
41
+ has. Do not install connectors, start OAuth or ask the user to sign in to anything
44
42
  during this skill. If something is missing, say it is missing.
45
43
  - **Never invent.** Draft only from what you read. Do not make up customers, results,
46
44
  numbers or claims. Mark anything you inferred as inferred.
47
45
  - **Draft, never send.** Everything you create is a draft. Nothing goes to a prospect.
48
- The owner activates a campaign in Audienti.
46
+ The user activates a campaign in Audienti.
49
47
  - **Never include secrets.** No passwords, API keys, tokens or session cookies in any
50
48
  report, message or field.
51
- - **Audienti is the record.** Save decisions from your conversations with the owner in
52
- Audienti records (offer text, audience filters, campaign premise and notes), not only
53
- in chat or your own memory.
49
+ - **Read-only does not stop you.** Run this skill right after connecting, without
50
+ waiting to be told. If the user left **Allow workspace changes** unticked, you can
51
+ still read, work the queue, report your tools and ask in Operator (`audienti ask`).
52
+ When a step has to save a record, ask the user there to turn it on in **Settings →
53
+ Agents**, and carry on with the rest.
54
+ - **Audienti is the record.** Save what you and the user decide in Audienti records
55
+ (offer text, audience filters, campaign premise and notes), not only in chat or memory.
54
56
 
55
57
  ## 1. Triage your tools
56
58
 
57
- 1. Confirm your connection: `audienti whoami --json`, then select the workspace the owner
58
- approved (`audienti workspace use ID`; over MCP, `workspace_select`).
59
- 2. List every tool, connector, plugin and integration you can call now. Use your
60
- runtime's own listing (tool list, connector settings, MCP servers, installed plugins)
61
- and every integration hub you use. Check aggregators first: if you reach tools
62
- through Composio, Treg or another hub, list each app connected there and put the hub
63
- name in `via`. Then list your native connectors (built into your runtime, no hub) and
64
- leave `via` out for those. Check each category in turn: CRM, email, LinkedIn,
65
- other social, people data, company data, web search and browsing, spreadsheets and
66
- documents, chat, calendar, tasks, scheduling, memory. Leave out Audienti's own hosted
67
- tools unless you reach them through another connector.
68
- 3. Record each tool's category, name, access (`read`, `write`, `send`) and status
69
- (`connected`, `needs_sign_in`, `unavailable`). See [the inventory format](references/inventory.md).
70
- 4. Report it. The report replaces the previous one, and the owner sees it in
71
- **Settings → Agents**:
72
-
73
- ```sh
74
- audienti agent inventory report --file inventory.json --profile AGENT_PROFILE
75
- ```
76
-
77
- Over MCP, call `agent_inventory_report` with the same JSON. Over HTTP, send
78
- `PUT /api/v1/agent-inventory`.
79
- 5. Also report each mailbox or LinkedIn seat you act through with
80
- `audienti agent capabilities report` (see the `audienti` skill). The inventory says
81
- what you have; the capability report says which accounts you can act as.
82
- 6. Install the skills you will use for the work: `audienti skills list`, then
83
- `audienti skills show ID` (over MCP, `skills_list` and `skills_show`). Prospect
84
- finding, planning, writing and cadence skills are published in the `audienti/plugins`
85
- marketplace; install the ones your tools can run, using your runtime's plugin
86
- installer. Use the `audienti` skill for prospect finding and profile research.
59
+ First, keep yourself awake. Audienti never calls you, so set a durable schedule in your
60
+ own host now that starts you and runs `audienti queue next` (no `--workspace`, so it
61
+ covers all your user's workspaces), then does the work it returns: every 5 minutes during your user's working hours, every 15 minutes outside them
62
+ (`queue next` names the hours in `orientation`; `pollAfterSeconds` gives the next gap). A
63
+ timer inside your current session, such as a Claude Code `/loop` or a session cron, stops
64
+ when the session ends and does not count. Use a schedule your host keeps: a Paseo schedule
65
+ (`paseo schedule create`, then check it with `paseo schedule ls`), a Claude Code routine or
66
+ cloud schedule, a Codex automation, or cron. Tell your user the schedule is set, and name
67
+ it, when you introduce yourself. If your host cannot wake you, say plainly that it cannot
68
+ wake you, so you only check when they message you.
69
+
70
+ 1. Confirm your connection: `audienti workspace list --profile AGENT_PROFILE`, then select
71
+ the workspace the user approved (`audienti workspace use ID --profile AGENT_PROFILE`;
72
+ over MCP, `workspace_select`).
73
+ 2. List every tool, connector, plugin and integration you can call now: your runtime's
74
+ own listing (tool list, connector settings, MCP servers, installed plugins) and every
75
+ integration hub you use. Check aggregators first: if you reach tools through Composio,
76
+ Treg or another hub, list each app connected there. Then list your native connectors.
77
+ Leave out Audienti's own hosted tools unless you reach them through another connector.
78
+ 3. Turn that list into capability rows (capability id, provider, `via`, the user's
79
+ `account` for anything you send as the user, access, status) as
80
+ [the capability report format](references/capabilities.md) describes; it has the
81
+ full catalog. Never write `via: audienti`.
82
+ 4. Report it: `audienti agent capabilities report --file CAPABILITIES.json --profile
83
+ AGENT_PROFILE` (over MCP, `agent_capabilities_report` with the same JSON; over HTTP,
84
+ `PUT /api/v1/agent-capabilities`). The report replaces the previous one, and the
85
+ user sees it in **Settings → Agents**. It counts as stale after seven days: report
86
+ again whenever your tools change, and at least weekly.
87
+ 5. Check what Audienti counts for you: `audienti agent capabilities --profile
88
+ AGENT_PROFILE` (over MCP, `agent_capabilities_list`): the rows that work now and the
89
+ ones that work with Audienti's hosted tools in this workspace.
90
+ 6. Install the skills you will use: `audienti skills list --compact`, then `audienti
91
+ skills read ID SKILL.md` and only the references the task needs (over MCP,
92
+ `skills_list` with `compact: true` and `skills_read`). The `audienti` skill covers
93
+ prospect finding and profile research; planning, writing and cadence skills are in
94
+ the `audienti/plugins` marketplace, installed with your runtime's plugin installer.
95
+
96
+ Email goes out from your user's own mailbox through your own email connector (Gmail or
97
+ Outlook, through Composio, a Claude connector or similar). If you have none, tell your user
98
+ exactly: “I need a Gmail or Outlook connector to send from your mailbox.” Never send your
99
+ user to Settings to connect a mailbox. If you have one, report the mailbox in your
100
+ capability report and ask your user to approve it in **Settings → Sending**; then
101
+ Audienti gives you a queue task to send one test email from the mailbox to itself, read it
102
+ back and report its code; the mailbox counts once you do
103
+ ([the mailbox test email](references/mailbox-check.md)). Never ask your user for the code.
87
104
 
88
105
  ## 2. Introduce yourself and propose a first campaign
89
106
 
90
107
  First check what already exists: `audienti campaign list`, `audienti offer list`,
91
108
  `audienti audience list`. If the workspace already has an active campaign, introduce
92
- yourself, list your tools and ask what the owner wants to test next. Skip the rest of
109
+ yourself, list your tools and ask what the user wants to test next; skip the rest of
93
110
  this section.
94
111
 
95
- Otherwise draft a complete first campaign before you ask anything. Read what your
96
- tools reach: the owner's website, their documents, recent sent email, CRM records and
97
- LinkedIn profile. Then fill the [campaign draft](references/campaign-draft.md):
98
-
99
- - **Offer first.** What they sell, the problem it solves and one proof point, in the
100
- owner's own words where you found them. If you cannot find an offer, your one
101
- question is what they sell and to whom.
102
- - **Audience.** One buyer lane as structured filters: company industry, size and
103
- location; person function, seniority and current title. Resolve every value with
104
- `audienti audience options --kind KIND --q TEXT` and copy its `providerId`. Add one
105
- smart rule (`textCriteria`) only for what the filters cannot express: a single
106
- criterion a reviewer can answer true or false. See [audience definition](references/audience.md).
107
- - **Premise.** Why these people, why now, in one sentence.
108
- - **Approach.** One published approach (`audienti approach list`) and why it fits.
109
- - **Channels.** Only channels you can cover with accounts you reported.
110
- - **Test length.** 30 days or a company cap, whichever comes first.
111
- - **Success measure.** Meetings booked, the approach's goal stage.
112
-
113
- Ask the owner in Audienti, not in chat: `audienti ask "QUESTION" --context "PROPOSAL"
114
- --option "Go" --option "Change it"`. It shows as a card in Operator, and the answer
115
- comes back to you as a task. Put this in the question and its context, in this order:
116
-
117
- 1. Who you are and what you will do (find and research the right people, draft
118
- outreach for review, keep Audienti current).
119
- 2. Your tools in one line, and what is missing as a fact ("No CRM is connected, so I
120
- will keep records only in Audienti").
121
- 3. The proposed campaign as a short card, marking what you inferred.
122
- 4. What you still need, at most two questions, which the owner can answer on the same card.
123
- 5. That nothing is sent without their approval.
124
-
125
- Example shape, not fixed copy:
126
-
127
- > I'm Arthur, your prospecting agent in Audienti. I find people who fit, research them
128
- > and draft first messages for you to review. I can use Gmail (read, draft), LinkedIn
129
- > through Composio, and web search. No CRM is connected, so records stay in Audienti.
130
- >
131
- > Proposed first test, 30 days:
132
- > - Offer: Late-invoice recovery for logistics firms (from your website)
133
- > - Audience: Finance function, Director and above, logistics companies, 51 to 500 staff, UK (region inferred from your last 20 sent emails)
134
- > - Smart rule: The company runs its own truck or freight fleet
135
- > - Premise: Freight rates fell, so cash collection is a board topic this quarter
136
- > - Approach: Problem-led email, then LinkedIn follow-up
137
- > - Success: meetings booked
138
- >
139
- > Two questions: is the UK the right first region, and is there a customer result I
140
- > may cite? Answer "Go" to save it as a draft, or write your changes. Nothing is sent
141
- > until you approve it.
112
+ Otherwise draft a complete first campaign before you ask anything. Start from the
113
+ user's own answers: `audienti workspace show` returns `startingAudience` (their website or
114
+ `noWebsite`, what they sell, `about` the business, the first `offer`, and their target buyer:
115
+ industries, company `sizes`, job functions, job `titles` and regions, with `providerId`s you
116
+ can reuse; ask only for what they left out) and
117
+ `approximateSize`, how many people Audienti can reach for that buyer (10000 means more
118
+ than 10,000); both are `null` if they did not answer on the setup page. Treat them as the
119
+ user's first audience, not a finished one. Under 1,000 people is too few to target: one
120
+ sending account reaches about 500 a month, so the campaign runs dry within a month. If
121
+ `approximateSize` is below 1,000, propose a wider buyer (more industries, job functions or
122
+ regions) in your draft. Then read what your tools reach: the user's
123
+ website, documents, recent sent email, CRM records and LinkedIn profile. Fill every
124
+ field of [the campaign draft](references/campaign-draft.md) in the user's own words,
125
+ offer first; if you cannot find an offer, your one question is what they sell and to
126
+ whom. Build one buyer lane as structured filters, every value resolved with `audienti
127
+ audience options --kind KIND --q TEXT`, always with the person function that owns the
128
+ problem, plus at most one smart rule (`textCriteria`) a reviewer can answer true or
129
+ false ([audience definition](references/audience.md)). The audience says who they are;
130
+ anything about why now (hiring, funding, a new leader, an intent to buy) is a campaign
131
+ signal, not a smart rule. Give the campaign at least one signal: prospect finding starts
132
+ from signals, which find the companies that need the offer today ([the through line](references/campaign-draft.md#signals-the-through-line)).
133
+
134
+ Ask the user in Audienti, not in chat: `audienti ask "QUESTION" --context "PROPOSAL"
135
+ --option "Go" --option "Change it" --topic first_campaign`. It shows as a card in
136
+ Operator, and the answer comes back to you as a task. The topic keeps one open card per
137
+ subject (`first_campaign`, `campaign:ID` or `tools`): a new question with the same topic
138
+ replaces the old one. Keep the question itself to one short sentence: the decision you
139
+ need. Put the rest in the context, one short line per fact, in this order: who you are
140
+ and what you will do; your tools in one line and what is missing, as a fact; the
141
+ proposed campaign as a short card, marking what you inferred; the first message as you
142
+ would send it, so the user can check the voice; every rule that cannot say exactly what
143
+ the user asked for, with what you used instead (company size bands cannot express 200 to
144
+ 2,000 employees); a missing sending account for the playbook's first channel; at most two
145
+ questions the user can answer on the same card; and that nothing is sent without their
146
+ approval. Finding the five fits in section 3 costs credits, so ask for that OK on the
147
+ same card: `--option "Approve, find 5 people for up to 20 credits" --option "Change it"`.
148
+ A note the user types on the card comes with the option they pick. Give every cost in
149
+ credits, never dollars. Name
150
+ things the way the user sees them; never put IDs (campaign, signal, revision) in the
151
+ question or the context.
152
+ Whenever you propose something or ask the user to check your work, give the yes/no choice
153
+ as options (`--option "Approve" --option "Change it"`): each option is a button that sends
154
+ at once. Leave out error codes, status numbers and tool or provider names; say in plain
155
+ words what happened and what you need. Link people and records with their URLs.
156
+ [The campaign draft](references/campaign-draft.md) ends with an example of the shape.
142
157
 
143
158
  ## 3. Save the drafts and show five fits
144
159
 
145
- When the owner answers (a **Read your owner’s answer** task in your queue):
160
+ When the user answers (a **Read your user's answer** task in your queue):
146
161
 
147
162
  1. Apply their changes. Save their words as they wrote them.
148
163
  2. Create the records with fresh request IDs, reusing each ID if you retry:
149
164
  `audienti offer create`, `audienti audience create`, then `audienti campaign create`
150
- with the premise, approach, channels and `schedule.endAt`. The campaign starts in
151
- `Draft`. Nothing runs until the owner starts it. Over MCP, use `offer_create`, `audience_create` and
152
- `campaign_create`.
165
+ with the premise, playbook, channels and `schedule.endAt` (over MCP, `offer_create`,
166
+ `audience_create`, `campaign_create`). The campaign starts in `Draft`; nothing runs
167
+ until the user starts it. Then save the pace: `audienti campaign pace ID --per-day N`
168
+ with the user's number, or `--per-day derived` when they kept it (over MCP,
169
+ `campaign_pace_set`). Only `campaign pace` takes `--per-day`; `campaign create` and
170
+ `update` refuse it. When the user approved a spend for finding, such as "find 5 people
171
+ for up to 20 credits", save the cap too: `audienti campaign pace ID --max-credits 20`.
172
+ Each day's find task carries it; pass it to `audienti campaign find` and never raise it.
153
173
  3. Run `audienti audience summary --audience ID` and name five people or companies
154
174
  that fit, with one line on why each fits and a link to the evidence. If you have no
155
175
  people-data tool, say so and show the audience filters instead.
156
- 4. Ask the owner with `audienti ask --campaign ID` to review it on the campaign page
157
- and start it. Starting moves it to `Preparing`, where signal tracking and prospect
158
- finding run; activating moves it to `Active`, where engagement runs too.
159
- 5. Offer the next step: draft first messages for the five fits once the campaign is
160
- active.
161
-
162
- If a create call fails, say what happened in one sentence and what you will do next.
163
- Do not retry with a new request ID.
164
-
165
- ## New ideas
166
-
167
- When the owner suggests an idea later, draft a new campaign, or a successor
168
- (`audienti campaign successor ID`) that changes one thing: the approach, the offer or
169
- the audience. Name what changed so the two tests can be compared.
176
+ 4. Ask the user with `audienti ask --campaign ID` to review it on the campaign page
177
+ and start it. Quote the campaign's own Pace line from `audienti campaign pace ID`.
178
+ Name the controls the page has: the status menu next to the campaign name offers
179
+ **Find prospects only**, which moves it to `Preparing`, where signal tracking and
180
+ prospect finding run, and **Activate campaign**, which moves it to `Active`, where
181
+ engagement runs too. There is no Start button.
182
+ 5. Then offer to draft first messages for the five fits once the campaign is active.
183
+
184
+ If a create call fails, say what happened in one sentence and what you will do next; do
185
+ not retry with a new request ID. For a later idea, draft a new campaign or a successor
186
+ (`audienti campaign successor ID`) that changes one thing (playbook, offer or audience)
187
+ and name what changed, so the two tests compare; save a new playbook as a template with
188
+ the playbook-design skill, then pin it to the successor.
170
189
 
171
190
  ## After getting started: work the queue
172
191
 
173
- Once your tools are reported and a campaign exists, Audienti puts the daily work in
174
- your queue: get a draft campaign ready to start, find new prospects (25 a day per campaign by default),
175
- plan each prospect's next step, handle replies and send messages the owner approved.
176
- On every run:
177
-
178
- 1. `audienti queue next --json`. `next` is the task to take now. If you already hold
179
- tasks, they are in `holding`; finish those first.
180
- 2. Claim it, do it with your own tools, following the task's steps and skill, and
181
- report it done or released.
182
- 3. `fleet` shows what other agents hold. Do not do their work. To hand off or ask for
183
- help, message them in a room (`audienti rooms send`).
184
- 4. `needsOtherTools` lists tasks no agent can take because no one reported the tools.
185
- Tell the owner which connector would unlock them.
186
- 5. When the queue is empty, poll again after `pollAfterSeconds`.
187
-
188
- Never send anything to a prospect that the owner has not approved.
189
-
190
- ## When to run again
191
-
192
- Run part 1 again whenever your tools change, and at least every seven days; the owner
193
- sees the report as stale after that.
192
+ After that, Audienti puts the daily work in your queue: get a draft campaign ready to
193
+ start, find prospects at the campaign's pace, plan each prospect's next step, handle
194
+ replies and send what the user approved. Every task carries its steps and names its
195
+ skill; outcome checks follow [the check procedure](references/outcome-checks.md),
196
+ replies [the reply procedure](references/replies.md), a mailbox's test email [the mailbox test email](references/mailbox-check.md), and the
197
+ reply check before each email follow-up [the mailbox checks](references/reply-checks.md). When the user skips a touch, do
198
+ not propose it again unless they ask for a rewrite; when they take a person over, leave
199
+ them alone. A **Rewrite** (`work.revise`) comes to the agent that wrote the draft; its
200
+ steps carry the commands. Answer the request with `audienti work changes respond`:
201
+ saving the revision alone does not answer it, and the answer finishes the task. A new
202
+ note from the user replaces the task, and the task closes when the user approves,
203
+ skips or withdraws the touch, even while you hold it: then stop and read the queue
204
+ again. Every first email ends with one plain sentence that lets the prospect opt out.
205
+ Do not do work another agent holds (`fleet`); hand off or ask for help in a room
206
+ (`audienti rooms send`). `needsOtherTools` lists tasks no agent can take: tell the
207
+ user which connector would unlock them. A task there with `waitingOn: credits` needs an
208
+ Audienti hosted tool and the workspace has no credits left: tell the user once that it
209
+ waits on credits and runs when they add credits in Billing, and do not ask again. When
210
+ credits are added or run out, or the user adds or removes one of their own provider keys
211
+ in the Vault, every agent gets a notice task: run `audienti agent capabilities` again,
212
+ then do what its steps say. When the queue is empty, your timer runs it
213
+ again after `pollAfterSeconds`; when `ask` or `queue next` returns an `announce` line,
214
+ say it in your chat and point to Operator. Keep machine state in Audienti, not in your
215
+ own memory: `audienti kv set KEY VALUE` stores cursors, change tokens, hashes, ids and
216
+ timestamps for every agent of your user in this workspace, `audienti kv get KEY` reads
217
+ them back on the next run, and `--if-version N` protects a key two agents may touch;
218
+ credentials never go there: the Vault holds them and you store the Vault key name. Never
219
+ send anything to a prospect that the user has not approved.
@@ -4,12 +4,24 @@ An audience is a set of structured filters plus one smart rule. Discovery and fi
4
4
  read the structured filters first, so put everything you can into them. Free text is
5
5
  only for the one test the filters cannot express.
6
6
 
7
+ An audience says **who** the buyer is: facts about the company and the person that stay
8
+ true for months. It never says **why now**. Hiring, funding, a new leader, a tool
9
+ change, a post or an intent to buy are events, and events are campaign signals (see
10
+ section 5). An audience with an event in it matches almost no one.
11
+
7
12
  ## 1. Pick one buyer lane
8
13
 
9
14
  One audience describes one kind of buyer: one function at one seniority band, in one
10
15
  kind of company. If the offer sells to two different buyers (for example finance and
11
16
  operations), draft two audiences and two campaigns. Do not mix lanes in one audience.
12
17
 
18
+ Every audience sets `person.functions`. Seniority alone is not a lane: "all VPs" reaches
19
+ the VP of Finance and the VP of Engineering as well as the buyer. Pick the function that
20
+ owns the problem the offer solves and signs for it. For example, an outbound or SDR
21
+ agency sells to whoever owns pipeline: Sales, and Marketing when marketing owns
22
+ pipeline. Add `currentTitles` such as "VP of Sales" or "Chief Revenue Officer" when the
23
+ function is still too wide.
24
+
13
25
  ## 2. Resolve every value with `audience options`
14
26
 
15
27
  Never type a value from memory. Look each one up and copy the `providerId` and `name`
@@ -24,8 +36,19 @@ audienti audience options --kind functions --q finance
24
36
  audienti audience options --kind titles --q "head of finance"
25
37
  ```
26
38
 
27
- Kinds: `industries`, `industry_groups`, `sizes`, `types`, `locations`, `seniorities`,
28
- `functions`, `titles`. Over MCP, use `audience_options` with the same `kind`.
39
+ Kinds: `industries`, `sizes`, `types`, `locations`, `seniorities`, `functions`, `titles`.
40
+ Over MCP, use `audience_options` with the same `kind`. Name industries one by one: new
41
+ audiences cannot add industry groups, because a group's industries do not match its name.
42
+
43
+ - Search ignores case. Several terms in one query ("freight and logistics", or a
44
+ comma-separated list) return the matches for each term.
45
+ - An industry search matches the industry's own name, not the group it sits in:
46
+ "logistics" returns the logistics industries, not airlines or rail.
47
+ - Company size comes in LinkedIn's bands. A range in `--q` ("100 to 1000", "500+",
48
+ "under 50") returns every band it overlaps. Add all of them to `company.sizes`.
49
+ - `functions` is LinkedIn's fixed list of 26 job functions. It needs no Sales Navigator
50
+ account.
51
+ - A title that is not in the list can be saved as typed, without a `providerId`.
29
52
 
30
53
  ## 3. Fill the template
31
54
 
@@ -33,7 +56,7 @@ Kinds: `industries`, `industry_groups`, `sizes`, `types`, `locations`, `seniorit
33
56
  {
34
57
  "name": "Heads of finance, UK logistics, 51-500 staff",
35
58
  "company": {
36
- "industries": [{ "providerId": "ID", "name": "Transportation, Logistics, Supply Chain and Storage" }],
59
+ "industries": [{ "providerId": "ID", "name": "Logistics and Supply Chain" }, { "providerId": "ID", "name": "Package/Freight Delivery" }],
37
60
  "sizes": [{ "providerId": "ID", "name": "51-200" }, { "providerId": "ID", "name": "201-500" }],
38
61
  "locations": [{ "providerId": "ID", "name": "United Kingdom" }]
39
62
  },
@@ -45,11 +68,14 @@ Kinds: `industries`, `industry_groups`, `sizes`, `types`, `locations`, `seniorit
45
68
  },
46
69
  "seniorityMatchMode": "at_least",
47
70
  "textCriteria": "The company runs its own truck or freight fleet.",
48
- "notes": "Region and size inferred from the owner's last 20 sent emails; owner confirmed in Operator."
71
+ "notes": "Region and size inferred from the user's last 20 sent emails; user confirmed in Operator."
49
72
  }
50
73
  ```
51
74
 
52
75
  - `seniorityMatchMode: "at_least"` matches the chosen seniority and higher.
76
+ - After saving, `audienti audience summary --audience ID` returns `sizes`: about how many
77
+ people the included industries, functions and regions reach, against the 1,000-person
78
+ minimum. Under 1,000, widen the industries, functions or regions.
53
79
  - Use `negative: true` on a value to exclude it (for example a competitor's industry).
54
80
  - `currentTitles` narrows the lane; keep it to the titles that buy, at most a few.
55
81
 
@@ -67,12 +93,51 @@ Good:
67
93
  Not allowed in the smart rule:
68
94
 
69
95
  - Provenance: "inferred from…", "based on the website", "found in sent email".
70
- - Hedges or open questions: "owner to confirm", "probably", "maybe", "TBD".
71
- - Values the filters already hold (industry, size, region, seniority, title).
96
+ - Hedges or open questions: "user to confirm", "probably", "maybe", "TBD".
97
+ - Values the filters already hold (industry, size, region, seniority, function, title).
72
98
  - More than one test joined with "and" or "or". Pick the one that matters most.
99
+ - Events, timing or intent: "is hiring…", "recently raised…", "is considering…",
100
+ "is looking for…", "just changed…". These are campaign signals (section 5).
73
101
 
74
- Put provenance in `notes`. Put open questions to the owner in Operator with
102
+ Put provenance in `notes`. Put open questions to the user in Operator with
75
103
  `audienti ask`, not in the audience.
76
104
 
105
+ Saving refuses a smart rule that states the company's size or an event, and says where
106
+ it belongs: size in `company.sizes`, events in a campaign signal.
107
+
77
108
  Check the rule before you save: `audienti audience improve --text "RULE"` returns a
78
109
  suggested rewrite when the rule is vague.
110
+
111
+ ## 5. Audience or signal?
112
+
113
+ Ask of each condition: would it still be true of this company in six months?
114
+
115
+ | Condition | Where it goes |
116
+ | --- | --- |
117
+ | Sells B2B software; 51 to 500 staff; based in the US | Audience filters |
118
+ | Sells to hospitals; runs its own freight fleet | Audience smart rule |
119
+ | Owns pipeline or revenue (VP of Sales, CRO) | Audience `person.functions`, `seniorities`, `currentTitles` |
120
+ | Is hiring SDRs; is considering an outbound agency | Campaign signal |
121
+ | Raised a round this quarter; new VP of Sales in the last 90 days | Campaign signal |
122
+
123
+ A signal lives in the campaign's `signals` array. A `research` signal is a yes/no
124
+ question a researcher answers from public evidence such as job posts, news or the
125
+ company's site:
126
+
127
+ ```json
128
+ {
129
+ "signalMatch": "any",
130
+ "signals": [{
131
+ "id": "UUID",
132
+ "kind": "research",
133
+ "scope": "company",
134
+ "question": "Is the company hiring SDRs or BDRs, or looking for an outbound agency?",
135
+ "expected": true,
136
+ "details": "Open SDR or BDR job posts, or a post asking for agency recommendations, in the last 90 days."
137
+ }]
138
+ }
139
+ ```
140
+
141
+ `signalMatch: "any"` lets a company qualify on any one signal; `"all"` needs every one.
142
+ A signal narrows who is worth contacting now; it never replaces the audience, so the
143
+ company and person still have to fit the audience.