каркас: домен, генерация типов фронта, стенд и карточки задач

Контракт в коде: КИО по нормативу, 43 события WS по шести союзам направлений,
таймеры ГОСТ, таксономия E1–E6, шесть компетенций радара. make types гоняет
их через JSON Schema в generated.ts, тест ловит забытую регенерацию.

Стенд: docker compose postgres + backend, health отвечает, база досягаема
из контейнера бэкенда. Makefile не врёт — нереализованные цели падают
и называют карточку, которая их закроет.

frontend/.npmrc: под WSL2 npm install зависает на дефолтных 15 сокетах.
This commit is contained in:
Ivan Gerasimov 2026-09-15 19:35:03 +03:00
commit 7b7dd38e9f
36 changed files with 4997 additions and 0 deletions

View file

@ -0,0 +1,12 @@
# Общий чек-лист по классификатору 01 — МЧС.
# Наследуется сценариями через `extends`, дополняется локально.
# Методика: docs/product/METHODOLOGY.md#чек-листы-опроса
id: fire
dds: "01"
checklist:
- { id: q_address, question: "Назовите адрес: улица, дом, квартира, этаж?" }
- { id: q_what_burns, question: "Что именно горит?" }
- { id: q_people, question: "Есть ли люди в помещении?" }
- { id: q_smoke, question: "Куда идёт дым, есть ли задымление подъезда?" }
- { id: q_gas, question: "Есть ли газ, можно ли перекрыть?" }
- { id: q_caller, question: "Представьтесь и оставьте контактный телефон" }

View file

@ -0,0 +1,68 @@
# Первый сценарий — тот самый, на котором замыкается вертикальный срез
# (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 }
hidden: true
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:
# Выводится из фактов кодом при загрузке, здесь — для наглядности примера.
incident_type: fire
dds: "01"
required_facts: [f_address, f_what_burns, f_people]
address: "улица Ленина, 14"
victims: 2
tree:
pregenerated: false