# Milestone 4 Acceptance Checklist

Scope: Features #9/#5 (voice outbound core: voicemail + IVR + outbound campaign + compliance)

## Implemented

- [x] Outbound campaign scheduling and chaining
  - `packages/backend/convex/public/outboundCampaign.ts`
  - `packages/backend/convex/system/outboundCalls.ts`
- [x] Call outcome logging and transcript fallback
  - `packages/backend/convex/system/vapiToolCall.ts`
  - `packages/backend/convex/system/vapiWebhook.ts`
- [x] Compliance guardrails
  - DNC list schema/API/enforcement:
    - `packages/backend/convex/schema.ts`
    - `packages/backend/convex/public/compliance.ts`
    - `packages/backend/convex/system/compliance.ts`
    - `packages/backend/convex/system/outboundCalls.ts`
  - Calling-hour restriction (09:00-20:00 org local timezone)
- [x] Voicemail and IVR detection + signal persistence
  - `packages/backend/convex/system/vapiWebhook.ts`
  - `packages/backend/convex/system/voiceSignals.ts`
  - `packages/backend/convex/public/voiceSignals.ts`
- [x] IVR navigation support via DTMF tool
  - `navigate_ivr` in `packages/backend/convex/system/vapiToolCall.ts`
  - Tool surfaced by `packages/backend/convex/system/outboundCalls.ts`

## Validation

- [x] `npx convex codegen`
- [x] `pnpm -C packages/backend test -- --runInBand`

## Residual Risks

- IVR detection is transcript/keyword based; provider-native IVR event codes would be more robust.
- DTMF navigation currently records and confirms sequence usage but does not yet verify downstream telephony-level success callbacks.
- Outbound campaign throttling is currently schedule-based; dedicated per-tenant queue backpressure can be added for very high scale.
