Files
ss-tools/docs/reports/ux10-handoff-report-2026-09-14.md

10 KiB
Raw Permalink Blame History

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. Что осталось (по приоритету)

  1. 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).
  2. D2 — 046 T021: 5/15/50-tab canaries — cost/load/timeout/cancel vs ops-v1; пороги versioned по первому измерению. Зависит от D1.
  3. 046 T017: lifecycle notifications (notify()/persist_notification() пока без callers).
  4. Superset RESULT_TOO_LARGE bound — query-ответы не имеют явного size-bound на границе 044 (browser-действия имеют). Зафиксировано в статусе T042.
  5. 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. Известные долги и оговорки (важно для честности)

  1. Evidence live-прогонов лежал в /tmp/kilo/live_ux_*.json и не сохранился (/tmp очищен). Живые раны персистятся в PostgreSQL (scenario_runs / scenario_step_runs) — это авторитетный источник, он проверен. НО: для новых прогонов evidence писать в specs/044/.../evidence/, не в /tmp.
  2. Изменения не закоммичены. Перед продолжением стоит зафиксировать (или согласовать с владельцем).
  3. Ранние волны (UX-1..UX-11) делегировались субагентам; их конверты изначально принимались как «verified» без независимого прогона. Сейчас подтверждено собственными прогонами (§1), но при доработке этих участков перепроверяйте, а не доверяйте старым записям.
  4. Миграционный инцидент 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.
  5. Стенд: ./run.sh --skip-install (backend :8000, frontend :5173). При старте composition подхватывает live-bindings из БД. source backend/.env в шелле опасен — файл содержит multiline PEM-ключи; извлекать DATABASE_URL/ENCRYPTION_KEY через grep + cut.
  6. Инструменты субагентов (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.