conformance/FLOWS.md defines setup, steps, captures and expectations, all observable at the contract boundary. flows.json carries setups (peer ids), fixed test keys, statute, scenario and explicit assign steps; scenarios.json holds the callback scenarios (the stub loads them). CONTRACT.md defines the case.assign response. Runner reads only the bundle and rejects undefined keys; new flow s-006 (held over cap). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 5787@bnt-lap001 Assistant-Session: 5db26b82-138b-40cc-9856-4d5eb0f752fd
120 lines
2.5 KiB
JSON
120 lines
2.5 KiB
JSON
{
|
|
"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": []
|
|
}
|
|
}
|