lct-22: пульт директив — преподаватель ведёт ситуацию
Мягкие директивы перекрывают дугу сценария и применяются со следующей реплики: разговор не дёргается от того, что преподаватель что-то нажал. Жёсткие правят ситуацию — обрыв связи рвёт звук тем же механизмом, что перебивание, и запускает норматив обратного дозвона; второй пострадавший правит эталон; неточный адрес снимает раскрытый факт, и оператор обязан переспросить. Своя копия сценария на занятие: директивы правят факты и эталон, а сценарий был общим на библиотеку — правка в одной группе протекла бы во все остальные. Тест проверяет, что библиотека не изменилась. Свободный текст честно отказывает: офлайн-дерево предгенерировано, произвольную фразу взять неоткуда, и преподаватель видит это на пульте. Ни одна директива не трогает карточку курсанта — он управляет ситуацией, а не работой обучаемого. Занятие теперь собирается целиком и только потом регистрируется: наблюдатель мог увидеть его без слот-автомата и звонящего.
This commit is contained in:
parent
978d7dc1aa
commit
57f4c858b6
13 changed files with 317 additions and 23 deletions
|
|
@ -20,7 +20,8 @@ log = logging.getLogger(__name__)
|
|||
|
||||
|
||||
async def finish(session_id: UUID, state) -> None:
|
||||
scenario = store.get(state.scenario_id)
|
||||
# Сценарий занятия, а не библиотечный: директивы могли поправить эталон.
|
||||
scenario = state.scenario or store.get(state.scenario_id)
|
||||
if scenario is None:
|
||||
return
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ from app.domain.events import (
|
|||
from app.dialog.caller import TemplateCaller
|
||||
from app.dialog.persona import PersonaState
|
||||
from app.dialog.slots import SlotMachine
|
||||
from app.scenarios.schema import Scenario
|
||||
from app.domain.kio import KIO, apply_patch
|
||||
from app.session.timers import SessionTimers
|
||||
|
||||
|
|
@ -52,6 +53,9 @@ class SessionState:
|
|||
|
||||
# Звонящий. Автомата нет, если не скачана модель эмбеддингов:
|
||||
# занятие идёт, подсказки откатываются на порядок чек-листа.
|
||||
# Своя копия сценария на занятие: директивы преподавателя правят факты
|
||||
# и эталон, и правка в одной группе не должна протекать в остальные.
|
||||
scenario: Scenario | None = None
|
||||
slots: SlotMachine | None = None
|
||||
persona: PersonaState | None = None
|
||||
caller: TemplateCaller | None = None
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ STARTS: dict[str, tuple[TimerCode, ...]] = {
|
|||
"call.answer": (TimerCode.INTERVIEW,),
|
||||
"dds.dispatch": (TimerCode.DDS_ACK, TimerCode.CLOSE),
|
||||
"card.received": (TimerCode.ZONE_CHECK,),
|
||||
"call.dropped": (TimerCode.CALLBACK,),
|
||||
"callback.dial": (TimerCode.CALLBACK,),
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue