10 KiB
UX-10 / 044 / 046 — промежуточный отчёт для передачи (2026-09-14)
Назначение: передать агенту-разработчику контекст незавершённой волны. Отчёт самодостаточен: что сделано, где лежит, как проверить, что осталось и какие есть долги/оговорки.
Репозиторий: /home/busya/dev/ss-tools, ветка master, HEAD b4148cfe
(fix(automation): scheduled runs execute as schedule-owner principal; MCP upsert signature parity).
Изменения не закоммичены (рабочее дерево грязное) — 72 tracked-файла изменено, 24 untracked.
1. Что проверено лично (воспроизводимо)
| Проверка | Команда | Результат |
|---|---|---|
| Backend, полный suite | cd backend && source .venv/bin/activate && python -m pytest -q |
11796 passed, 264 skipped, 1 xpassed (575.73s) |
| Frontend, полный suite | cd frontend && npm run test -- --run |
3585 passed / 214 файлов (58.21s) |
| Alembic, реальный PostgreSQL | alembic upgrade head |
0023 → 0024_retention_deletions, 16 колонок, PK+3 индекса+unique, повторный прогон no-op |
| Alembic heads | alembic heads |
единственная голова 0024_retention_deletions |
| Lint | cd backend && python -m ruff check . |
All checks passed |
| MCP parity тест | pytest -q tests/test_mcp_automation_parity.py |
4 passed |
Live-факты проверены в PostgreSQL (durable), а не в отчётах воркеров:
SELECT id,status,trigger_source,error_code FROM scenario_runs → ран e642d3a8 = passed,
шаг phase-2-B01-apply_native_filter passed с sha256=c064bd0008f7a0e978d3ca6841d7dba0ce186755de71cce46c53dae30d92d1cf,
шаг capture_screenshot — 8 артефактов; ран 6de8d0d9 = inconclusive c QUEUED_DISPATCH_ERROR
(реальный дефект, найденный и впоследствии исправленный).
2. Инвентарь изменений
Новые исходники (untracked)
| Файл | Строк | Назначение |
|---|---|---|
backend/src/services/dashboard_testing/automation/deletions.py |
331 | durable deletion pipeline 046 |
backend/src/services/dashboard_testing/execution/providers/browser_session.py |
501 | run-scoped browser session (acquire/reuse/replay/close) |
backend/src/services/dashboard_testing/execution/providers/browser_readonly_actions.py |
534 | 9 read-only действий каталога |
backend/src/services/dashboard_testing/execution/providers/browser_native_filter.py |
275 | apply_native_filter + safe checkpoint |
backend/src/services/dashboard_testing/execution/providers/browser_admission.py |
208 | admission split |
backend/alembic/versions/0024_retention_deletions.py |
— | миграция retention receipts |
frontend/src/lib/components/scenario-run/terminal-reasons.ts |
84 | typed terminal reasons |
frontend/src/lib/components/scenario-run/TerminalReasonBanner.svelte |
32 | баннер терминальных причин |
docs/mcp-client-setup.md |
226 | UX-4 гайд |
Новые тесты (untracked): test_browser_limits_cleanup.py, test_browser_native_filter.py,
test_browser_readonly_actions.py, test_browser_session.py, test_dispatch_capacity_lifecycle.py,
test_due_admission_atomicity.py, test_provider_superset.py,
test_scenario_compare_to_baseline_typed_failure.py, test_scenario_retention_holds.py,
test_mcp_automation_parity.py.
Изменённые спеки
specs/036-agent-test-stabilization/spec.md, specs/038-.../contracts/browser-actions.md,
specs/044-.../{spec,tasks,traceability}.md, specs/045-.../{openapi.yaml,data-model,ux_reference},
specs/046-.../{spec,tasks,traceability,contracts/production-operations.md}.
Планы
docs/reports/ux-flow-improvement-plan-2026-09-11.md,
docs/reports/ux10-production-ops-plan-2026-09-12.md (содержит session-state и лог инцидентов).
3. Статус задач в спеках
- 044: 36 задач
[x]. Открытые[~]/[ ]: T007, T008, T010, T011, T014e/f/h, T017, T018, T019, T022, T024, T025, T042[~], T042b[ ](PREPROD canaries), T043. - 046: 9 задач
[x]. Открытые: T004, T005, T006, T007, T008, T009, T010, T011, T013, T013d, T013e, T014, T015, T016, T017[ ](lifecycle notifications), T021[~](retention done, 5/15/50-tab canaries open).
4. Что осталось (по приоритету)
- D1 — 044 T042b: PREPROD canaries (блокирует production GO).
Требуется: живой стенд + binding класса PREPROD/DEV. Готовый инструмент:
specs/044-dashboard-scenario-execution/prototype/browser_readonly_canary.py(режимыSS_CANARY_MODE:actions(default),timeout,soak,reconcile,recovery,mutation). Env:SS_STAND_URL/USER/PASSWORD,SS_STAND_STAGE(mutation требуетPREPROD),SS_STAND_DASHBOARD_ID. Evidence писать вspecs/044-.../evidence/browser-provider/(не в /tmp — см. §6). Креды стенда: в typed AppConfig (шифрованные; читаютсяConfigManager()._load_config()при заданномENCRYPTION_KEY). Среды:ss-dev(https://ss-dev.bebesh.ru),ss-prod(https://ss-prod.bebesh.ru). - D2 — 046 T021: 5/15/50-tab canaries — cost/load/timeout/cancel vs ops-v1; пороги versioned по первому измерению. Зависит от D1.
- 046 T017: lifecycle notifications (
notify()/persist_notification()пока без callers). - Superset
RESULT_TOO_LARGEbound — query-ответы не имеют явного size-bound на границе 044 (browser-действия имеют). Зафиксировано в статусе T042. - Cancel mid-I/O для browser — cancel закрывает сессию на терминале, но активная операция прерывается drain-deadline (30s+5s) + reconcile sweep, а не мгновенным provider-cancel. Осознанный компромисс drain-first модели (задокументирован).
5. Ключевые точки входа в код
- Провайдер:
backend/src/services/dashboard_testing/execution/providers/browser.py - Транспорт Playwright:
.../providers/browser_transport.py(сессия, лимиты, cleanup) - Сессия:
.../providers/browser_session.py - Admission:
.../providers/browser_admission.py - Capacity/lease:
.../execution/capacity.py,provider_operations.py - Dispatch:
.../execution/dispatch.py,dispatch_runs.py,cancel_lifecycle.py - Retention:
.../automation/retention.py,.../automation/deletions.py - Миграция:
backend/alembic/versions/0024_retention_deletions.py
6. Известные долги и оговорки (важно для честности)
- Evidence live-прогонов лежал в
/tmp/kilo/live_ux_*.jsonи не сохранился (/tmp очищен). Живые раны персистятся в PostgreSQL (scenario_runs/scenario_step_runs) — это авторитетный источник, он проверен. НО: для новых прогонов evidence писать вspecs/044/.../evidence/, не в /tmp. - Изменения не закоммичены. Перед продолжением стоит зафиксировать (или согласовать с владельцем).
- Ранние волны (UX-1..UX-11) делегировались субагентам; их конверты изначально принимались как «verified» без независимого прогона. Сейчас подтверждено собственными прогонами (§1), но при доработке этих участков перепроверяйте, а не доверяйте старым записям.
- Миграционный инцидент 2026-09-14: revision id
0024_scenario_retention_deletions(33 симв.) превышалalembic_version.version_num VARCHAR(32)→ падениеalembic upgradeна PostgreSQL на шаге stamp (transactional DDL откатил чисто). Исправлено: id →0024_retention_deletions. Добавлен guard:backend/tests/test_alembic_migrations.py::test_revision_ids_fit_varchar32. Правило: revision id ≤ 32 символов; миграционную цепочку проверять на PostgreSQL, не на SQLite. - Стенд:
./run.sh --skip-install(backend :8000, frontend :5173). При старте composition подхватывает live-bindings из БД.source backend/.envв шелле опасен — файл содержит multiline PEM-ключи; извлекатьDATABASE_URL/ENCRYPTION_KEYчерезgrep+cut. - Инструменты субагентов (
deepseek-v4.1-flash) были недоступны (403/rate-limit) — часть волны доработана в основном потоке.
7. Быстрый старт для принимающего агента
# 1) Проверить состояние
cd /home/busya/dev/ss-tools && git status --short && git log --oneline -3
# 2) Backend (полный) — ~10 мин
cd backend && source .venv/bin/activate && python -m pytest -q
# 3) Frontend — ~1 мин
cd frontend && npm run test -- --run
# 4) Миграции на реальном PostgreSQL
cd backend && export DATABASE_URL="$(grep -m1 '^DATABASE_URL=' .env | cut -d= -f2- | tr -d '"')"
alembic current && alembic heads
# 5) Стенд
cd /home/busya/dev/ss-tools && ./run.sh --skip-install
Порядок продолжения: сначала §6.2 (закоммитить или согласовать), затем D1 (044 T042b) → D2 (046 T021) → 046 T017 / RESULT_TOO_LARGE.