A safety-first predictive dialer for human agents. It estimates how many borrowers to call, quantifies uncertainty, and refuses capacity risk it cannot explain.
The browser calls GET /v1/demo/pacing-decision. That endpoint invokes PredictivePacingEngine and SafetyController directly—there is no frontend-only safety formula.
95%one-sided confidence
1%absolute risk ceiling
30samples before prediction
3×maximum intent attempts
0real telecom calls
The problem
Predictive speed can strand a borrower without a human.
Calling too slowly wastes agent time. Calling too aggressively means more borrowers answer than humans can serve. This prototype treats that overload probability as an explicit, operator-owned constraint.
This is an applied AI/ML systems assignment, not a chatbot. The intelligence is a conservative statistical control policy operating under uncertain answer behavior and changing human capacity.
01
Estimate demand
Expected-value pacing
Observed answers, ringing calls, setup time, and near-term agent releases produce a candidate batch.
ceil(unfilled_capacity / answer_rate)→02
Bound uncertainty
Wilson upper confidence
The controller assumes a more conservative answer probability than the raw mean.
p̂ → one-sided 95% upper bound→03
Search safe batch
Exact binomial tail
Binary search finds the largest batch whose chance of exceeding capacity remains within policy.
P(answered > humans) ≤ 0.5%→04
Persist permission
Schema-linked receipt
Every call intent must reference a persisted safety decision. PostgreSQL rejects bypasses.
call_intent.safety_decision_id NOT NULL
Known uncertainty?Cold dataStale presenceRapid agent lossProvider degradation→ progressive mode
Running system evidence
The implementation, alive.
These are current PostgreSQL records from the deployed application—not a marketing mockup.