Mobilize
Use this skill when the user needs a specific number of confirmed people from
an existing, consented pool, under a deadline -- not one call, and not a
cold-outreach campaign. mobilize wraps the mobilize/ engine in this
repository (parallel wave dispatch, commitment calibration, a crash-safe
ledger) so an agent can trigger a real mobilization without reimplementing
any of it.
When To Use
Use this skill for:
- "I need N people to do X by " from a registry, roster, or list
of people who already agreed to be contacted for this purpose
- urgent staffing, donor, or volunteer mobilization
- any task where calling candidates one at a time is clearly too slow and
the pool is large enough that parallel dispatch matters
When Not To Use
Do not use this skill to:
- cold-call people who have not consented to being contacted for this
purpose --
mobilize assumes the pool is a consented registry; it is not
a lead-generation or cold-outreach tool
- place a single one-off call (use CALL-E directly for that)
- guess phone numbers, need counts, or deadlines the user did not provide
- run
mobilize_real calls without the user's explicit confirmation that
the phone numbers are real, owned, or authorized contacts
Core Workflow
- Confirm the pool is consented (the user should say so explicitly, e.g.
"call our registered donors" or "text the on-call rotation").
- Extract required fields:
need_label (what you're asking), count (how
many confirmations needed), deadline_minutes, and the phone numbers or
pool source.
- If no real phone numbers exist yet, or the user wants to see the engine
work first, run the simulated path (
mobilize_simulated via the MCP
server, or python -m mobilize.app.cli) -- zero cost, instant, safe to
run freely.
- Only call
mobilize_real (or python -m mobilize.app.cli --real) when
the user has explicitly confirmed the phone numbers and wants to spend
real CALL-E call credits. Never pass more numbers than the user
explicitly provided.
- Report the result: filled or not, how many confirmed, how many calls
used, and time to fill.
Why Wave Dispatch, Not "Cancel and Retry"
CALL-E's API has no operation to cancel an in-flight call (verified against
the CALL-E OpenAPI spec). mobilize therefore dispatches in waves: size
the first wave using each candidate's prior likelihood of confirming, wait
for results, and only dispatch a further wave if the need is still unmet.
Once the need is met, no further wave is ever dispatched -- calls already in
flight are allowed to finish, but nobody new is ever called. Do not describe
this as "cancelling calls."
Why a Stated "Yes" Is Not a Confirmation
People say yes to be agreeable and then don't follow through (acquiescence
bias). mobilize's reconciler scores commitment from the call's evidence
text -- firm language ("leaving now") scores higher than hedged language
("I'll try") -- blended with the candidate's historical show-up rate. Only
responses above the commitment threshold count toward the need. See
references/commitment-model.md for the scoring detail, and
mobilize/sim/harness.py in this repo for the measured accuracy gain over
treating every stated yes as confirmed.
Safety Rules
Read references/safety.md for the full safety contract used by the
governance module (mobilize/core/policy.py). Always follow these rules:
- Every call must disclose it is an AI at the start (enforced in the task
prompt sent to CALL-E).
- Never call anyone on the do-not-call list, in cooldown, or over the
contact-fatigue limit for the configured window -- the governance module
enforces this before dispatch, not after.
- Respect configured calling-hour windows unless the need is explicitly
marked as an emergency override, and log every override.
- Never dispatch to a larger pool than the user explicitly authorized.
- If CALLE_API_KEY is missing or the user has not confirmed real numbers,
stop and use the simulated path instead of guessing.
Output Format
Report:
filled: whether the need was met
confirmed_count / count needed
calls_used and waves_dispatched
time_to_fill_seconds if filled
- for each confirmed candidate: outcome and commitment score
If not filled, report the blocker (pool exhausted, call budget hit, or
deadline) and never claim the need was met unless filled is true.
1---2name: mobilize3description: Get a required number of confirmed responses from a consented pool of people within a deadline by calling multiple candidates in parallel waves via CALL-E, stopping as soon as the need is met. Use for urgent mobilization tasks like "find 3 donors in the next hour" or "get 2 volunteers by 5pm" from a registry of people who opted in to be contacted.4license: MIT5---67# Mobilize89Use this skill when the user needs a specific number of confirmed people from10an existing, consented pool, under a deadline -- not one call, and not a11cold-outreach campaign. `mobilize` wraps the `mobilize/` engine in this12repository (parallel wave dispatch, commitment calibration, a crash-safe13ledger) so an agent can trigger a real mobilization without reimplementing14any of it.1516## When To Use1718Use this skill for:1920- "I need N people to do X by <deadline>" from a registry, roster, or list21 of people who already agreed to be contacted for this purpose22- urgent staffing, donor, or volunteer mobilization23- any task where calling candidates one at a time is clearly too slow and24 the pool is large enough that parallel dispatch matters2526## When Not To Use2728Do not use this skill to:2930- cold-call people who have not consented to being contacted for this31 purpose -- `mobilize` assumes the pool is a consented registry; it is not32 a lead-generation or cold-outreach tool33- place a single one-off call (use CALL-E directly for that)34- guess phone numbers, need counts, or deadlines the user did not provide35- run `mobilize_real` calls without the user's explicit confirmation that36 the phone numbers are real, owned, or authorized contacts3738## Core Workflow39401. Confirm the pool is consented (the user should say so explicitly, e.g.41 "call our registered donors" or "text the on-call rotation").422. Extract required fields: `need_label` (what you're asking), `count` (how43 many confirmations needed), `deadline_minutes`, and the phone numbers or44 pool source.453. If no real phone numbers exist yet, or the user wants to see the engine46 work first, run the **simulated** path (`mobilize_simulated` via the MCP47 server, or `python -m mobilize.app.cli`) -- zero cost, instant, safe to48 run freely.494. Only call `mobilize_real` (or `python -m mobilize.app.cli --real`) when50 the user has explicitly confirmed the phone numbers and wants to spend51 real CALL-E call credits. Never pass more numbers than the user52 explicitly provided.535. Report the result: filled or not, how many confirmed, how many calls54 used, and time to fill.5556## Why Wave Dispatch, Not "Cancel and Retry"5758CALL-E's API has no operation to cancel an in-flight call (verified against59the CALL-E OpenAPI spec). `mobilize` therefore dispatches in **waves**: size60the first wave using each candidate's prior likelihood of confirming, wait61for results, and only dispatch a further wave if the need is still unmet.62Once the need is met, no further wave is ever dispatched -- calls already in63flight are allowed to finish, but nobody new is ever called. Do not describe64this as "cancelling calls."6566## Why a Stated "Yes" Is Not a Confirmation6768People say yes to be agreeable and then don't follow through (acquiescence69bias). `mobilize`'s reconciler scores commitment from the call's evidence70text -- firm language ("leaving now") scores higher than hedged language71("I'll try") -- blended with the candidate's historical show-up rate. Only72responses above the commitment threshold count toward the need. See73`references/commitment-model.md` for the scoring detail, and74`mobilize/sim/harness.py` in this repo for the measured accuracy gain over75treating every stated yes as confirmed.7677## Safety Rules7879Read `references/safety.md` for the full safety contract used by the80governance module (`mobilize/core/policy.py`). Always follow these rules:8182- Every call must disclose it is an AI at the start (enforced in the task83 prompt sent to CALL-E).84- Never call anyone on the do-not-call list, in cooldown, or over the85 contact-fatigue limit for the configured window -- the governance module86 enforces this before dispatch, not after.87- Respect configured calling-hour windows unless the need is explicitly88 marked as an emergency override, and log every override.89- Never dispatch to a larger pool than the user explicitly authorized.90- If CALLE_API_KEY is missing or the user has not confirmed real numbers,91 stop and use the simulated path instead of guessing.9293## Output Format9495Report:9697- `filled`: whether the need was met98- `confirmed_count` / `count` needed99- `calls_used` and `waves_dispatched`100- `time_to_fill_seconds` if filled101- for each confirmed candidate: outcome and commitment score102103If not filled, report the blocker (pool exhausted, call budget hit, or104deadline) and never claim the need was met unless `filled` is true.