mobilize · git:20260817.1804c71 · 2026-08-17 · sha256 c18df8ee9880a46c

mobilize git:20260817.1804c71A

Immutable. This exact content is served forever at /api/v1/blob/c18df8ee9880a46c.

---
name: mobilize
description: 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.
license: MIT
---

# 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 <deadline>" 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

1. Confirm the pool is consented (the user should say so explicitly, e.g.
   "call our registered donors" or "text the on-call rotation").
2. Extract required fields: `need_label` (what you're asking), `count` (how
   many confirmations needed), `deadline_minutes`, and the phone numbers or
   pool source.
3. 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.
4. 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.
5. 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.