routing Specification
Purpose
Маршрутизация жалоб и переназначение поручений в системе «Обратная связь — регион».
Requirements
Requirement: REQ-RTE-001 — Выбор маршрута
{
"id": "REQ-RTE-001",
"level": "REQ",
"status": "agreed",
"owner": "product-owner",
"parents": [
"HLR-POS-003"
],
"sources": [
"docs/models.md"
],
"questions": [],
"required_aspects": [
"matched",
"fallback"
],
"verification": "test",
"risk": "high"
}
Система MUST по подтверждённой категории и территории выбрать маршрут из версии справочника, действующей в момент назначения. В поручениях сохраняются идентификатор правила и версия. При отсутствии единственного применимого правила жалоба переводится в manual_routing, оператору видна причина; произвольное ведомство не выбирается.
Scenario: SCN-POS-001 — Полный путь жалобы в одно ведомство
- GIVEN Жалоба принята от автора; тестовый маршрут LIGHT-01 v7 действует
- WHEN Подтвердить категорию; назначить маршрут; подготовить и согласовать ответ; опубликовать итог; открыть его автором
- THEN Поручение ссылается на правило и версию справочника
Подробности и данные: acceptance/scenarios/scn-pos-001.json.
Scenario: SCN-POS-006 — Нет маршрута
- GIVEN Категория подтверждена; единственного правила нет
- WHEN Выполнить назначение
- THEN Ручная очередь с причиной; ведомство не выбрано
Подробности и данные: acceptance/scenarios/scn-pos-006.json.
Requirement: REQ-RTE-002 — Несколько исполнителей
{
"id": "REQ-RTE-002",
"level": "REQ",
"status": "agreed",
"owner": "product-owner",
"parents": [
"HLR-POS-003",
"HLR-POS-004"
],
"sources": [
"DEC-POS-003",
"docs/models.md"
],
"questions": [],
"required_aspects": [
"fanout",
"lead"
],
"verification": "test",
"risk": "high"
}
Система MUST создавать отдельное поручение каждому ведомству маршрута с признаком обязательности и назначать ровно одного ведущего ответственного. Число жалоб остаётся одним. Ведущий отвечает за сборку итогового ответа, а каждое ведомство — за своё поручение. В этом срезе все поручения обязательны.
Scenario: SCN-POS-007 — Два ведомства и неполный комплект
- GIVEN Маршрут содержит dept-light и dept-roads; ответ согласован только dept-light
- WHEN Создать поручения и попытаться опубликовать итог
- THEN Два поручения принадлежат одной жалобе; Ровно один ведущий ответственный
Подробности и данные: acceptance/scenarios/scn-pos-007.json.
Requirement: REQ-RTE-003 — Переназначение
{
"id": "REQ-RTE-003",
"level": "REQ",
"status": "agreed",
"owner": "product-owner",
"parents": [
"HLR-POS-003",
"HLR-POS-004",
"HLR-POS-008"
],
"sources": [
"DEC-POS-003",
"docs/models.md"
],
"questions": [],
"required_aspects": [
"superseded",
"stale_denied",
"clock_preserved"
],
"verification": "test",
"risk": "high"
}
Система MUST при переназначении помечать прежнее поручение superseded, создавать новую версию назначения и исключать ответ прежней версии из комплекта. Запись ответа по старой версии возвращает 409, даже если ведомство входит в новый маршрут. Дедлайн жалобы сохраняется. Смена назначения доступна оператору маршрутизации до публикации итогового ответа.
Scenario: SCN-POS-009 — Переназначение и запоздавший ответ
- GIVEN Старое поручение dept-light; оператор переназначает на dept-roads
- WHEN Применить переназначение; отправить ответ по старой версии
- THEN Прежнее поручение исключено из активного комплекта; 409; старый ответ не принят; Дедлайн не изменился
Подробности и данные: acceptance/scenarios/scn-pos-009.json.
Requirement: REQ-RTE-004 — Конкурентное изменение маршрута
{
"id": "REQ-RTE-004",
"level": "REQ",
"status": "agreed",
"owner": "product-owner",
"parents": [
"HLR-POS-003"
],
"sources": [
"docs/models.md"
],
"questions": [],
"required_aspects": [
"version_conflict"
],
"verification": "test",
"risk": "high"
}
Система MUST принимать изменение маршрута только с актуальной версией жалобы. Из двух изменений с одной исходной версией ровно одно применяется; второе получает 409 и актуальную версию без потери первого изменения.
Scenario: SCN-POS-018 — Конкурентная маршрутизация
- GIVEN Два оператора прочитали версию7
- WHEN Отправить две разные правки с expected_version7 одновременно
- THEN Одна правка применена; другая409; нет перезаписи
Подробности и данные: acceptance/scenarios/scn-pos-018.json.