lct-12: детерминированная оценка по ГОСТ, таксономия, радар
Каждая метрика — факт против норматива со ссылкой: «94 с при ≤ 75 с, ГОСТ Р 22.7.03-2021», а не балл. По недобытому факту — отдельная отметка E1 с эталонным вопросом: в разборе нужен конкретный вопрос, не процент. Радар — проекция тех же метрик без пересчёта весов, коммуникация без судьи не рисуется нулём. Таймер, не остановленный событием, — провал, а не зачёт: время недоказуемо, операция не завершена. Метрика, которую нечем посчитать (полнота опроса без модели эмбеддингов), видна как «не посчитано» — молча выброшенная выглядела бы пройденной. Найдено противоречие: таймеры опроса (75 с) и оповещения ДДС (60 с) стартовали на ответе и останавливались передачей в ДДС — один отрезок, два лимита. Опрос за законные 70 с давал E3, а на экране курсанта краснел таймер посреди нормального разговора. События «опрос закончен» в контракте нет, поэтому dds_notify снят с учёта, вопрос записан в CONTRACT.md. KIO проверяет присваивание: card.dds = "03" клало в карточку сырую строку вместо кода ДДС, и падала уже оценка, далеко от места ошибки.
This commit is contained in:
parent
7c97310938
commit
f01f2dab76
9 changed files with 489 additions and 7 deletions
|
|
@ -14,9 +14,16 @@ from dataclasses import dataclass, field
|
|||
from app.domain.timers import NORMATIVES, TimerCode, TimerSnapshot, state_for
|
||||
|
||||
#: Какое событие какой таймер запускает.
|
||||
#:
|
||||
#: `dds_notify` (≤ 60 с) не запускается ничем, и это сознательно. Стартуй он
|
||||
#: на ответе, как опрос, оба таймера мерили бы один отрезок с разными лимитами:
|
||||
#: курсант, опросивший за законные 70 секунд, получал бы E3 «ДДС не оповещена
|
||||
#: за 60 с», а на экране краснел бы таймер посреди нормального разговора.
|
||||
#: Норматив, судя по порядку операций, отсчитывается от конца опроса — а события
|
||||
#: «опрос закончен» в контракте нет. Вопрос к людям: docs/arch/CONTRACT.md.
|
||||
STARTS: dict[str, tuple[TimerCode, ...]] = {
|
||||
"call.incoming": (TimerCode.ANSWER,),
|
||||
"call.answer": (TimerCode.INTERVIEW, TimerCode.DDS_NOTIFY),
|
||||
"call.answer": (TimerCode.INTERVIEW,),
|
||||
"dds.dispatch": (TimerCode.DDS_ACK, TimerCode.CLOSE),
|
||||
"card.received": (TimerCode.ZONE_CHECK,),
|
||||
"callback.dial": (TimerCode.CALLBACK,),
|
||||
|
|
@ -25,7 +32,7 @@ STARTS: dict[str, tuple[TimerCode, ...]] = {
|
|||
#: Какое событие какой таймер останавливает.
|
||||
STOPS: dict[str, tuple[TimerCode, ...]] = {
|
||||
"call.answer": (TimerCode.ANSWER,),
|
||||
"dds.dispatch": (TimerCode.INTERVIEW, TimerCode.DDS_NOTIFY),
|
||||
"dds.dispatch": (TimerCode.INTERVIEW,),
|
||||
"card.ack": (TimerCode.DDS_ACK,),
|
||||
"zone.decision": (TimerCode.ZONE_CHECK,),
|
||||
"crew.arrived": (TimerCode.CLOSE,),
|
||||
|
|
|
|||
Loading…
Reference in a new issue