каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 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
|
|
|
|
# Подъём стенда и рутина. Цели, которых ещё нет, честно падают
|
|
|
|
|
|
# и называют карточку, которая их закрывает, — README не должен врать.
|
|
|
|
|
|
|
|
|
|
|
|
UV ?= uv
|
|
|
|
|
|
COMPOSE ?= docker compose
|
|
|
|
|
|
|
|
|
|
|
|
.DEFAULT_GOAL := help
|
|
|
|
|
|
|
|
|
|
|
|
help: ## Список целей
|
|
|
|
|
|
@grep -hE '^[a-z-]+:.*##' $(MAKEFILE_LIST) | sed 's/:.*##/\t/' | expand -t22
|
|
|
|
|
|
|
|
|
|
|
|
dev: ## Поднять стенд: postgres + backend --reload + frontend
|
|
|
|
|
|
$(COMPOSE) up --build
|
|
|
|
|
|
|
|
|
|
|
|
down: ## Погасить стенд
|
|
|
|
|
|
$(COMPOSE) down
|
|
|
|
|
|
|
|
|
|
|
|
back: ## Только бэкенд, локально, без докера
|
|
|
|
|
|
cd backend && $(UV) run uvicorn app.main:app --reload --port 8000
|
|
|
|
|
|
|
|
|
|
|
|
front: ## Только фронтенд, локально
|
|
|
|
|
|
npm --prefix frontend install && npm --prefix frontend run dev
|
|
|
|
|
|
|
|
|
|
|
|
types: ## domain/events.py → frontend/src/shared/types/generated.ts
|
|
|
|
|
|
cd backend && $(UV) run --no-project --with 'pydantic>=2.7' python scripts/export_types.py
|
|
|
|
|
|
|
|
|
|
|
|
test: ## Тесты бэкенда
|
|
|
|
|
|
cd backend && $(UV) run --extra dev pytest -q
|
|
|
|
|
|
|
|
|
|
|
|
typecheck: ## Проверить фронтенд компилятором
|
|
|
|
|
|
npm --prefix frontend run typecheck
|
|
|
|
|
|
|
|
|
|
|
|
models: ## Скачать веса GigaAM (STT) и Silero (TTS) в backend/models/
|
|
|
|
|
|
@echo "не реализовано — карточка tasks/lct-02-latency-baseline.md"; exit 1
|
|
|
|
|
|
|
|
|
|
|
|
seed: ## Залить сценарии из /scenarios в БД
|
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
|
|
|
|
cd backend && $(UV) run python scripts/seed.py
|
|
|
|
|
|
|
|
|
|
|
|
migrate: ## Накатить миграции
|
|
|
|
|
|
cd backend && $(UV) run alembic upgrade head
|
|
|
|
|
|
|
|
|
|
|
|
revision: ## Создать миграцию: make revision m="что изменилось"
|
|
|
|
|
|
cd backend && $(UV) run alembic revision --autogenerate -m "$(m)"
|
каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 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
|
|
|
|
|
|
|
|
|
|
repl: ## Текстовый диалог со звонящим без голоса
|
|
|
|
|
|
@echo "не реализовано — карточка tasks/lct-07-caller-slots.md"; exit 1
|
|
|
|
|
|
|
|
|
|
|
|
pregen: ## Дерево диалога и WAV первых реплик для офлайна
|
|
|
|
|
|
@echo "не реализовано — карточка tasks/lct-19-reference-dialog.md"; exit 1
|
|
|
|
|
|
|
|
|
|
|
|
demo: ## Поднять всё в демо-режиме: офлайн, прогретые модели
|
|
|
|
|
|
@echo "не реализовано — карточка tasks/lct-21-demo-readiness.md"; exit 1
|
|
|
|
|
|
|
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
|
|
|
|
.PHONY: help dev down back front types test typecheck migrate revision models seed repl pregen demo
|