каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 43 события WS по шести союзам направлений,
таймеры ГОСТ, таксономия E1–E6, шесть компетенций радара. make types гоняет
их через JSON Schema в generated.ts, тест ловит забытую регенерацию.
Стенд: docker compose postgres + backend, health отвечает, база досягаема
из контейнера бэкенда. Makefile не врёт — нереализованные цели падают
и называют карточку, которая их закроет.
frontend/.npmrc: под WSL2 npm install зависает на дефолтных 15 сокетах.
2026-09-15 19:35:03 +03:00
|
|
|
|
# Первый сценарий — тот самый, на котором замыкается вертикальный срез
|
|
|
|
|
|
# (docs/hackathon/CASE-DECISION.md: в первый день один сценарий целиком).
|
|
|
|
|
|
# Формат: docs/spec/SCENARIO-FORMAT.md
|
|
|
|
|
|
id: fire-apartment-l2
|
|
|
|
|
|
title: "Пожар в квартире, паникующий заявитель"
|
|
|
|
|
|
type: fire
|
|
|
|
|
|
level: L2
|
|
|
|
|
|
topics: [fires]
|
|
|
|
|
|
modes: [training, exam, self]
|
|
|
|
|
|
|
|
|
|
|
|
extends: checklists/fire.yaml
|
|
|
|
|
|
|
|
|
|
|
|
persona:
|
|
|
|
|
|
base: panic
|
|
|
|
|
|
arc:
|
|
|
|
|
|
- { stage: registration, mood: panic }
|
|
|
|
|
|
- { stage: interview, mood: panic }
|
|
|
|
|
|
- { stage: dispatch, mood: worried }
|
|
|
|
|
|
|
|
|
|
|
|
background:
|
|
|
|
|
|
loop: fire_crackle.mp3
|
|
|
|
|
|
gain_db: -18
|
|
|
|
|
|
|
|
|
|
|
|
first_line: "Алло! Алло! Помогите! Горим! А-а-а!"
|
|
|
|
|
|
|
|
|
|
|
|
facts:
|
|
|
|
|
|
- id: f_address
|
|
|
|
|
|
value: "улица Ленина, 14, квартира 47, 5-й этаж"
|
|
|
|
|
|
reveal_on: { question: q_address }
|
|
|
|
|
|
- id: f_what_burns
|
|
|
|
|
|
value: "горит балкон, дым пошёл в квартиру"
|
|
|
|
|
|
reveal_on: { question: q_what_burns }
|
|
|
|
|
|
- id: f_people
|
|
|
|
|
|
value: "в квартире жена и ребёнок, не выходят"
|
|
|
|
|
|
reveal_on: { question: q_people }
|
|
|
|
|
|
- id: f_smoke
|
|
|
|
|
|
value: "дым идёт в подъезд, на площадке ничего не видно"
|
|
|
|
|
|
reveal_on: { question: q_smoke }
|
|
|
|
|
|
- id: f_gas
|
|
|
|
|
|
value: "плита газовая, вентиль в кухне, перекрыть не успел"
|
|
|
|
|
|
reveal_on: { question: q_gas }
|
|
|
|
|
|
|
|
|
|
|
|
checklist:
|
|
|
|
|
|
- { id: q_address, fact: f_address }
|
|
|
|
|
|
- { id: q_what_burns, fact: f_what_burns }
|
|
|
|
|
|
- { id: q_people, fact: f_people }
|
|
|
|
|
|
- { id: q_smoke, fact: f_smoke }
|
|
|
|
|
|
- { id: q_gas, fact: f_gas }
|
|
|
|
|
|
|
|
|
|
|
|
required_fields:
|
|
|
|
|
|
- address
|
|
|
|
|
|
- floor
|
|
|
|
|
|
- incident_type
|
|
|
|
|
|
- dds
|
|
|
|
|
|
- victims_count
|
|
|
|
|
|
- description
|
|
|
|
|
|
|
|
|
|
|
|
ground_truth:
|
lct-03 и lct-04: журнал сессий и библиотека сценариев
БД: 11 таблиц, первая миграция. Группы и связь trainee → group заложены
сразу, даже пустыми — размечать накопленные сессии задним числом значит
делать лишнюю миграцию. Номер попытки живёт в сессии, отдельной таблицы
попыток нет: дельта считается запросом по (trainee_id, scenario_id).
Сценарии: строгая схема — опечатка в имени поля падает на старте, а не
игнорируется молча. ground_truth собирается кодом, попытка задать
incident_type, dds или required_facts в YAML отвергается: иначе генератор
разведёт факты и эталон и курсанта оштрафуют за правильный ответ. Руками
задаются только нормализованные адрес и число пострадавших — из фразы
«улица Ленина, 14, квартира 47, 5-й этаж» кодом «улица Ленина, 14»
не достать.
GET /api/scenarios/{id} больше не отдаёт чек-лист. Это содержимое
подсказок: отдать его целиком значит выдать в контрольном режиме то,
чего там быть не должно, в обход выдачи по одному пункту.
Тесты базы поднимают свой движок на каждый тест: глобальный кэшируется
и привязывается к первому событийному циклу.
2026-09-15 20:10:05 +03:00
|
|
|
|
# incident_type, dds и required_facts выводит загрузчик — писать их здесь запрещено.
|
|
|
|
|
|
# Руками задаются только нормализованные ожидания, которые из текста факта
|
|
|
|
|
|
# кодом не достать.
|
каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 43 события WS по шести союзам направлений,
таймеры ГОСТ, таксономия E1–E6, шесть компетенций радара. make types гоняет
их через JSON Schema в generated.ts, тест ловит забытую регенерацию.
Стенд: docker compose postgres + backend, health отвечает, база досягаема
из контейнера бэкенда. Makefile не врёт — нереализованные цели падают
и называют карточку, которая их закроет.
frontend/.npmrc: под WSL2 npm install зависает на дефолтных 15 сокетах.
2026-09-15 19:35:03 +03:00
|
|
|
|
address: "улица Ленина, 14"
|
|
|
|
|
|
victims: 2
|
|
|
|
|
|
|
|
|
|
|
|
tree:
|
|
|
|
|
|
pregenerated: false
|