feat: исход вызова — не каждый звонок заканчивается карточкой (lct-36)

Весь продукт стоял на допущении «звонок → карточка → выезд». В билетах
заказчика оно нарушается намеренно: «поругался с продавцом Мегафон» — справка,
а вызов из Волгоградской области передаётся в систему-112 другого субъекта.
Курсант, заведший карточку на такой вызов, занял расчёт зря, и прежняя оценка
этого не видела — наоборот, награждала за полноту заполнения.

- Outcome в домене, поле outcome в сценарии, событие call.resolve у курсанта
  и две кнопки на АРМ. Отдельное действие, а не «положил трубку»: система
  должна отличить осознанное решение от брошенного вызова.
- Метрика outcome (E2, вес 3 — лишний выезд дороже неточного признака).
- Там, где карточка не заводится, метрики карточки не считаются вовсе.
  Полнота опроса считается: передать вызов не значит не опрашивать.
- call.resolve останавливает норматив опроса, как и передача карточки.

Попутно (lct-34): библиотека стала вложенной — scenarios/tickets/, поля
ticket и position, чек-листы для медицины, полиции и ЖКХ. Перенесён билет 1
целиком: три вызова, три классификатора, третий — из другого региона.

Найдено по ходу: модификаторы списка оповещения не были подключены ни к чему.
В классификаторе скорая добавляется к массовой драке признаком «пострадавшие»,
но взять его было неоткуда. Теперь модификаторы берутся из карточки —
victims_count, life_threat, evacuation_needed, fire.gasified, — и список
оповещения пересобирается при правке любого из этих полей.

161 тест зелёный (13 новых), make typecheck чистый.
This commit is contained in:
Ivan Gerasimov 2026-09-20 08:33:30 +03:00
commit b8dc39fd7d
22 changed files with 628 additions and 9 deletions

View file

@ -0,0 +1,26 @@
# Чек-лист по классификатору 03 — скорая помощь.
# Методика: docs/product/METHODOLOGY.md#чек-листы-опроса
#
# `examples` — как спрашивают живые операторы, а не как написано в инструкции.
# Чем их больше и чем они разнообразнее, тем точнее звонящий «понимает» вопрос.
id: medical
dds: "03"
checklist:
- id: q_address
question: "Назовите адрес: улица, дом, квартира, этаж, код домофона?"
examples: ["Какой у вас адрес?", "Где вы находитесь?", "Куда ехать скорой?", "Код домофона какой?", "Номер квартиры?"]
- id: q_what_happened
question: "Что случилось с пострадавшим?"
examples: ["Что с человеком?", "Что произошло?", "На что жалуется?", "Как это случилось?"]
- id: q_who
question: "Кто пострадавший: имя, возраст, пол?"
examples: ["Сколько лет?", "Как зовут больного?", "Это мужчина или женщина?", "Возраст какой?"]
- id: q_conscious
question: "Человек в сознании, дышит?"
examples: ["В сознании?", "Дышит?", "Он отвечает вам?", "Реагирует на голос?"]
- id: q_can_move
question: "Может ли пострадавший передвигаться самостоятельно?"
examples: ["Он может идти?", "Ходит сам?", "Встать может?"]
- id: q_caller
question: "Представьтесь и оставьте контактный телефон"
examples: ["Как вас зовут?", "Ваш номер телефона?", "Кем вы приходитесь пострадавшему?"]