{ "description": "Callback stub scenarios (CONTRACT.md section 8). Each is the sequence of handoff.status messages the stub sends, one per step. A step {'wait_for_details': [fields]} sends 'negotiating' with needs = the missing fields and waits until handoff.update supplies them; it is skipped when the handoff.request already carried them. After handoff.cancel the stub sends 'cancelled' next. 'silent' never answers.", "default": "completed", "scenarios": { "completed": [ { "status": "scheduled", "at": "2026-10-20T10:00:00Z" }, { "status": "running" }, { "status": "completed" } ], "negotiate": [ { "wait_for_details": [ "phone", "time" ] }, { "status": "scheduled", "at": "2026-10-20T10:00:00Z" }, { "status": "running" }, { "status": "completed" } ], "no-answer-retry": [ { "status": "scheduled", "at": "2026-10-20T10:00:00Z" }, { "status": "attempted", "outcome": "no-answer" }, { "status": "scheduled", "at": "2026-10-20T14:00:00Z" }, { "status": "running" }, { "status": "completed" } ], "no-answer-fail": [ { "status": "scheduled", "at": "2026-10-20T10:00:00Z" }, { "status": "attempted", "outcome": "no-answer" }, { "status": "scheduled", "at": "2026-10-20T14:00:00Z" }, { "status": "attempted", "outcome": "no-answer" }, { "status": "failed", "detail": "two attempts, no answer" } ], "call-failed": [ { "status": "scheduled", "at": "2026-10-20T10:00:00Z" }, { "status": "running" }, { "status": "failed", "detail": "line dropped" } ], "expired": [ { "status": "scheduled", "at": "2026-10-20T10:00:00Z" }, { "status": "expired", "detail": "slot passed" } ], "unavailable": [ { "status": "refused", "reason": "mode-unavailable" } ], "declined": [ { "status": "refused", "reason": "declined" } ], "out-of-hours": [ { "status": "refused", "reason": "out-of-hours" } ], "silent": [] } }