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

Контракт в коде: КИО по нормативу, 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,64 @@
"""Классификаторы ДДС, типы происшествий, уровни сложности.
Норматив: docs/spec/NORMATIVES.md#классификаторы-ддс
"""
from enum import StrEnum
class DDSCode(StrEnum):
"""Дежурно-диспетчерская служба, в которую уходит карточка."""
FIRE = "01"
POLICE = "02"
MEDICAL = "03"
OTHER = "04"
GKH = "gkh"
class IncidentType(StrEnum):
"""Тип происшествия. Совпадает с полем `type` сценария."""
FIRE = "fire"
MEDICAL = "medical"
POLICE = "police"
OTHER = "other"
GKH = "gkh"
ERA_GLONASS = "era_glonass"
class Level(StrEnum):
"""Уровень сложности сценария."""
L1 = "L1"
L2 = "L2"
L3 = "L3"
DDS_LABELS: dict[DDSCode, str] = {
DDSCode.FIRE: "01 — МЧС",
DDSCode.POLICE: "02 — полиция",
DDSCode.MEDICAL: "03 — скорая помощь",
DDSCode.OTHER: "04 — прочие службы",
DDSCode.GKH: "ЖКХ",
}
INCIDENT_LABELS: dict[IncidentType, str] = {
IncidentType.FIRE: "Пожар",
IncidentType.MEDICAL: "Медицинский вызов",
IncidentType.POLICE: "Правонарушение",
IncidentType.OTHER: "Прочее",
IncidentType.GKH: "Авария ЖКХ",
IncidentType.ERA_GLONASS: "ДТП, автовызов ЭРА-ГЛОНАСС",
}
#: Штатное соответствие типа происшествия и службы. Используется как значение
#: по умолчанию при выводе ground_truth сценария; сценарий вправе переопределить.
DDS_BY_INCIDENT: dict[IncidentType, DDSCode] = {
IncidentType.FIRE: DDSCode.FIRE,
IncidentType.MEDICAL: DDSCode.MEDICAL,
IncidentType.POLICE: DDSCode.POLICE,
IncidentType.OTHER: DDSCode.OTHER,
IncidentType.GKH: DDSCode.GKH,
IncidentType.ERA_GLONASS: DDSCode.MEDICAL,
}