[contract] Контракты этапа 1: диалог, API-схемы + фикстуры, адаптеры, сервис мониторинга, модули #34

Closed
opened 2026-10-03 15:16:58 +03:00 by Eleboba · 0 comments
Owner

Описание

Contract-first (регламент TenVex, «вертикальный срез»): до параллельной работы трёх разработчиков замораживаем интерфейсы между зонами, чтобы lane A/B/C шли одновременно без правок чужих файлов. Делает координатор (Claude), мержится первым.

Желаемый результат

  • app/dialog/contracts.py: Event (text | button | system: med_reminder, daily_checkin, scale_due, reach_out), Reply (text, buttons, kind), DialogEngine Protocol handle(token, event) -> list[Reply], get_engine() (заглушка-эхо до #10).
  • app/integrations/base.py: PrescriptionSource, IdentityProvider, Notifier, DrugInfo, Outbox (доставка реплик в канал) + простые in-memory реализации по умолчанию.
  • app/services/contracts.py: MonitoringService Protocol — after_data_change(token) -> list[Action] (персистит алерты/кризис и уведомляет врача сам; возвращает диалоговые действия для движка), заглушка.
  • app/api/schemas.py (pydantic) + app/api/routes.py со всеми ручками этапа 1, отдающими детерминированные фикстуры (app/api/fixtures.py) — дашборд пишется против них с первой минуты.
  • app/main.py уже подключает router, scheduler.start/stop, channels.telegram.start/stop (заглушки) — никому не нужно править main.
  • config/modules.yaml + app/core/modules.py: модули veteran / depression / family (стартовые шкалы, расписание, ежедневный вопрос); config/scales/dar5.yaml.
  • tzdata в зависимостях. Траектория Андрея по дням — в docs/product/01_demo_persona.md. Зоны A/B/C — в docs/dev/WORKFLOW.md, ADR-010.

Лог выполнения

2026-10-03

  • Что сделано: заморожены интерфейсы между lane A/B/C:
    • app/dialog/contracts.py: Event, Reply, Button, DialogEngine, register_engine / get_engine (по умолчанию заглушка EchoEngine);
    • app/integrations/base.py: протоколы PrescriptionSource, IdentityProvider, Notifier, DrugInfo, Outbox + in-memory реализации и реестр integrations;
    • app/services/contracts.py: MonitoringService (after_data_change, is_in_crisis), заглушка NoopMonitoring;
    • app/api/schemas.py + routes.py: все ручки /api/v1 этапа 1, отдают фикстуры (app/api/fixtures.py: Андрей на 13-м дне + 7 пациентов);
    • app/main.py: подключены router, scheduler.start/stop, telegram.start/stop;
    • config/modules.yaml, app/core/modules.py с due_scales(), шкала config/scales/dar5.yaml, зависимость tzdata.
  • Документация: траектория Андрея в docs/product/01_demo_persona.md, зоны A/B/C в WORKFLOW, ADR-010.
  • Результат: make lint test — 471 passed.
  • Заметки: line-length 110 → 120. Модули реальных реализаций подключаются через find_spec, а не try/except ImportError, чтобы ошибки импорта внутри них не проглатывались.
## Описание Contract-first (регламент TenVex, «вертикальный срез»): до параллельной работы трёх разработчиков замораживаем интерфейсы между зонами, чтобы lane A/B/C шли одновременно без правок чужих файлов. Делает координатор (Claude), мержится первым. ## Желаемый результат - `app/dialog/contracts.py`: `Event` (text | button | system: med_reminder, daily_checkin, scale_due, reach_out), `Reply` (text, buttons, kind), `DialogEngine` Protocol `handle(token, event) -> list[Reply]`, `get_engine()` (заглушка-эхо до #10). - `app/integrations/base.py`: `PrescriptionSource`, `IdentityProvider`, `Notifier`, `DrugInfo`, `Outbox` (доставка реплик в канал) + простые in-memory реализации по умолчанию. - `app/services/contracts.py`: `MonitoringService` Protocol — `after_data_change(token) -> list[Action]` (персистит алерты/кризис и уведомляет врача сам; возвращает диалоговые действия для движка), заглушка. - `app/api/schemas.py` (pydantic) + `app/api/routes.py` со всеми ручками этапа 1, отдающими **детерминированные фикстуры** (`app/api/fixtures.py`) — дашборд пишется против них с первой минуты. - `app/main.py` уже подключает router, `scheduler.start/stop`, `channels.telegram.start/stop` (заглушки) — никому не нужно править main. - `config/modules.yaml` + `app/core/modules.py`: модули veteran / depression / family (стартовые шкалы, расписание, ежедневный вопрос); `config/scales/dar5.yaml`. - `tzdata` в зависимостях. Траектория Андрея по дням — в `docs/product/01_demo_persona.md`. Зоны A/B/C — в `docs/dev/WORKFLOW.md`, ADR-010. --- ## Лог выполнения ### 2026-10-03 - **Что сделано:** заморожены интерфейсы между lane A/B/C: - `app/dialog/contracts.py`: `Event`, `Reply`, `Button`, `DialogEngine`, `register_engine` / `get_engine` (по умолчанию заглушка `EchoEngine`); - `app/integrations/base.py`: протоколы `PrescriptionSource`, `IdentityProvider`, `Notifier`, `DrugInfo`, `Outbox` + in-memory реализации и реестр `integrations`; - `app/services/contracts.py`: `MonitoringService` (`after_data_change`, `is_in_crisis`), заглушка `NoopMonitoring`; - `app/api/schemas.py` + `routes.py`: все ручки `/api/v1` этапа 1, отдают фикстуры (`app/api/fixtures.py`: Андрей на 13-м дне + 7 пациентов); - `app/main.py`: подключены router, `scheduler.start/stop`, `telegram.start/stop`; - `config/modules.yaml`, `app/core/modules.py` с `due_scales()`, шкала `config/scales/dar5.yaml`, зависимость `tzdata`. - **Документация:** траектория Андрея в `docs/product/01_demo_persona.md`, зоны A/B/C в WORKFLOW, ADR-010. - **Результат:** `make lint test` — 471 passed. - **Заметки:** line-length 110 → 120. Модули реальных реализаций подключаются через `find_spec`, а не `try/except ImportError`, чтобы ошибки импорта внутри них не проглатывались.
Eleboba added this to the Этап 1 · Ветераны СВО milestone 2026-10-03 15:16:58 +03:00
Eleboba added the chorecontractsize/1stage/veteransP0core labels 2026-10-03 15:16:58 +03:00
Eleboba self-assigned this 2026-10-03 15:16:59 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#34