Демо-консоль и сплит-экран для показа жюри: веб-чат пациента (запасной к React-приложению), управление демо-часами, проигрывание сценария data/synthetic/<персона>.jsonl («проиграть день N», «прокрутить до дня N») с паузой при ошибке, сплит-экран «пациент | врач» с живыми алертами. Всё только через HTTP API.
make up # или: uv run uvicorn app.main:app & API_BASE_URL=http://localhost:8000 uv run streamlit run dashboard/app.py
http://localhost:8501 → «Демо-консоль»: выбрать пациента (или «Подключить демо-пациента» в сайдбаре, если сида нет) → «🚀 Начать» → кнопки в чате; «Следующий день», «К 08:00».
При наличии data/synthetic/andrey.jsonl (#18): «▶ Проиграть день N» / «⏭ Прокрутить до дня N», журнал шагов.
«Сплит-экран»: слева чат (или iframe при PATIENT_WEB_URL=http://localhost:5173), справа пациенты и алерты, красный баннер на новый острый алерт.
uv run pytest -q tests/test_dashboard_console.py tests/test_dashboard_console_pages.py — 30 тестов.
Чек-лист
rebase на origin/dev
make lint + make test зелёные
лог в issue (### 2026-10-04)
нет ПДн в логах, нет реальных данных, нет секретов
общие файлы не тронуты (dashboard/app.py, api_client.py — зона #16)
## Что меняется
Демо-консоль и сплит-экран для показа жюри: веб-чат пациента (запасной к React-приложению), управление демо-часами, проигрывание сценария `data/synthetic/<персона>.jsonl` («проиграть день N», «прокрутить до дня N») с паузой при ошибке, сплит-экран «пациент | врач» с живыми алертами. Всё только через HTTP API.
Closes #17
## Зона
C
## Как проверить
```bash
make up # или: uv run uvicorn app.main:app & API_BASE_URL=http://localhost:8000 uv run streamlit run dashboard/app.py
```
- http://localhost:8501 → «Демо-консоль»: выбрать пациента (или «Подключить демо-пациента» в сайдбаре, если сида нет) → «🚀 Начать» → кнопки в чате; «Следующий день», «К 08:00».
- При наличии `data/synthetic/andrey.jsonl` (#18): «▶ Проиграть день N» / «⏭ Прокрутить до дня N», журнал шагов.
- «Сплит-экран»: слева чат (или iframe при `PATIENT_WEB_URL=http://localhost:5173`), справа пациенты и алерты, красный баннер на новый острый алерт.
- `uv run pytest -q tests/test_dashboard_console.py tests/test_dashboard_console_pages.py` — 30 тестов.
## Чек-лист
- [x] rebase на origin/dev
- [x] make lint + make test зелёные
- [x] лог в issue (### 2026-10-04)
- [x] нет ПДн в логах, нет реальных данных, нет секретов
- [x] общие файлы не тронуты (`dashboard/app.py`, `api_client.py` — зона #16)
- pages/2_Демо-консоль.py: persona selector, virtual clock bar (+1 h, to 08:00/20:00,
next day, reset with confirm), fallback patient web chat (buttons from Reply.buttons,
kind styling, outbox drained after every action and on a 2 s fragment poll), scenario panel
- pages/3_Сплит-экран.py: patient chat or PATIENT_WEB_URL iframe on the left, compact doctor
panel (patients, live alerts, red banner on a new acute alert) on the right
- console/playback.py: data/synthetic/<persona>.jsonl runner (advance_to/press/text/
expect_color/start), date chaining between days, pause on failure with retry/skip/manual
- console/api.py: own HTTP client over the frozen API contract, ApiError only
Refs #17
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- personas degrade: /demo/personas → doctor's patients (hero first) → env token
- scenario file guessed from the transliterated first name (andrey.jsonl), like the backend
- «Подключить демо-пациента»: connects the synthetic hero via /patients/connect when no seed
- connect code prefilled from ?code= of the console link
Refs #17
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что меняется
Демо-консоль и сплит-экран для показа жюри: веб-чат пациента (запасной к React-приложению), управление демо-часами, проигрывание сценария
data/synthetic/<персона>.jsonl(«проиграть день N», «прокрутить до дня N») с паузой при ошибке, сплит-экран «пациент | врач» с живыми алертами. Всё только через HTTP API.Closes #17
Зона
C
Как проверить
data/synthetic/andrey.jsonl(#18): «▶ Проиграть день N» / «⏭ Прокрутить до дня N», журнал шагов.PATIENT_WEB_URL=http://localhost:5173), справа пациенты и алерты, красный баннер на новый острый алерт.uv run pytest -q tests/test_dashboard_console.py tests/test_dashboard_console_pages.py— 30 тестов.Чек-лист
dashboard/app.py,api_client.py— зона #16)