Files
ss-tools/specs/032-translate-requests-httpx/checklists/requirements.md
2026-06-04 19:41:08 +03:00

9.6 KiB
Raw Blame History

Requirements Quality Checklist: Async Backend Refactoring

Feature: 032-translate-requests-httpx Validated: 2026-06-04 (revised after reviews) Status: ⚠️ Ready after consistency corrections applied

1. Specification Quality

# Check Status Notes
1.1 No implementation details leaked into spec.md ⚠️ PARTIAL Spec предписывает конкретные библиотеки (httpx, aiofiles, aiosmtplib, asyncio.Semaphore, asyncio.Lock, asyncio.create_task). Для backendинфраструктурного рефакторинга это оправдано — детали реализации являются предметом спецификации, а не скрытыми решениями.
1.2 User stories are independently testable PASS Каждая story (P1-P4) верифицируема независимо через конкурентные тесты.
1.3 All user stories have acceptance scenarios PASS 10+ acceptance scenarios across 4 stories.
1.4 Edge cases explicitly covered PASS 11 edge cases: disconnect, timeout, DNS failure, CPU parsing, large files, Git clone, race conditions, pool exhaustion, concurrent auth, graceful shutdown, cancelled to_thread.
1.5 Success criteria are measurable PASS 8 measurable criteria с уточнёнными формулировками после reviews.
1.6 No [NEEDS CLARIFICATION] markers PASS All decisions grounded in existing codebase patterns and the explore agent's findings.

2. Module Coverage (from explore agent findings)

# Module Files Blocking calls Covered?
2.1 core/utils/network.py 1 ~10 (APIClient — центральный хаб) FR-001
2.2 core/superset_client/ 13+ Все 13 миксинов зависят от APIClient FR-002, FR-003
2.3 api/routes/dashboards/ 1 thumbnail, detail — 3 вызова SupersetClient FR-003
2.4 plugins/translate/_llm_http.py 1 requests.post + time.sleep (rate-limit) FR-004
2.5 plugins/translate/preview_llm_client.py 1 requests.post + time.sleep (rate-limit) FR-004
2.6 plugins/translate/superset_executor.py 1 network.request + time.sleep (poling) FR-005
2.7 plugins/translate/_run_source.py 1 network.request (chart data) FR-006
2.8 plugins/translate/preview_executor.py 1 network.request (chart data) FR-006
2.9 plugins/backup.py 1 SupersetClient + file I/O FR-008
2.10 plugins/git_plugin.py 1 SupersetClient + shutil + GitPython FR-009
2.11 plugins/llm_analysis/plugin.py 1 network.request (dashboard logs) FR-010
2.12 plugins/storage/plugin.py 1 shutil.copyfileobj FR-011
2.13 core/utils/superset_compilation_adapter.py 1 network.request (compilation) FR-012
2.14 services/notifications/providers.py 1 SMTP + requests.post (Telegram/Slack) FR-013, FR-014
2.15 services/git/_base.py 1 shutil + GitPython clone FR-015
2.16 core/utils/fileio.py 1 shutil, read_bytes, open FR-008 (опосредованно)

Итого: 16 файлов (core: 4, plugins: 8, api: 1, services: 2, utils: 1), ~45 блокирующих вызовов — все покрыты функциональными требованиями.

3. Stack Compatibility

# Check Status Notes
3.1 Python 3.9+ / FastAPI PASS httpx, aiofiles, aiosmtplib — всё совместимо с Python 3.9+. asyncio.to_thread — 3.9+.
3.2 SQLAlchemy sync sessions PASS asyncio.to_thread — эталонный паттерн из llm_analysis/service.py. Полный переход на async SQLAlchemy rejected (слишком большой scope).
3.3 SvelteKit / Svelte 5 frontend PASS Компоненты не меняются. AbortController'ы продолжат работать.
3.4 Superset REST API PASS Контракты API не меняются, только транспортный слой.
3.5 Docker deployment PASS Новые пакеты: httpx (уже есть), aiofiles, aiosmtplib. Добавляются в requirements.txt.
3.6 Existing AsyncSupersetClient PASS Уже существует в core/async_superset_client.py. Рефакторинг либо поглощает его, либо расширяет.

4. Rejected Paths (for ADR)

# Rejected Path Reason Replacement
4.1 aiohttp вместо httpx httpx уже используется в проекте (LLM Analysis). Имеет лучшее API для AsyncClient + sync fallback. httpx
4.2 Полный переход на async SQLAlchemy Потребовал бы переписывания всех моделей, миграций и репозиториев. Scope выходит за рамки этой фичи. asyncio.to_thread
4.3 multiprocessing / --workers N Увеличение workers — костыль, не решающий проблему блокировки внутри одного worker'а. Плюс повышенное потребление памяти. Асинхронный I/O
4.4 Сохранение requests + run_in_executor повсеместно Слишком много тредов при высокой нагрузке. httpx.AsyncClient использует connection pooling эффективнее. httpx.AsyncClient
4.5 aiofiles для всех файловых операций aiofiles — хорошо для потокового I/O. Для мелких операций (shutil.rmtree, read_bytes) asyncio.to_thread проще и не требует новой зависимости. Гибрид: aiofiles для больших файлов, asyncio.to_thread для мелких.

5. Constitution Alignment

# Principle Status Notes
5.1 I — Semantic Contract First PASS Все изменённые функции получат/обновят GRACE-Poly контракты. Новые контракты C3-C4 с @RATIONALE/@REJECTED.
5.2 II — Decision Memory PASS ADR будет создан на этапе /speckit.plan с записью rejected-путей (aiohttp, multiprocessing, async SQLAlchemy).
5.3 III — External Orchestrator PASS Топология не меняется. ss-tools остаётся внешним оркестратором.
5.4 IV — Module Discipline PASS Модули не превысят 400 строк. Рефакторинг network.py (542 строки) потребует декомпозиции.
5.5 V — RBAC Enforcement PASS Проверки прав не затрагиваются.
5.6 VI — Frontend Svelte 5 Runes Only PASS Фронтенд не меняется.
5.7 VII — Test-Driven for C3+ PASS Тесты на конкурентность (asyncio.gather) будут написаны для всех затронутых модулей.

6. Risk Assessment

Risk Likelihood Impact Mitigation
Нарушение обратной совместимости API Low High Все эндпоинты сохраняют контракты. Тесты проходят без изменений assertions. SC-005.
Утечки соединений (httpx.AsyncClient) Medium High NFR-003: тест на 500 запросов. Контекстные менеджеры для всех клиентов.
Деградация latency для лёгких запросов Low Medium SC-003: < 100ms для GET /health. Бенчмарк до/после.
Гонки состояний (race conditions) Medium Medium Edge case про конкурентный deploy+backup. Async-локи где необходимо.
Рост потребления памяти Low Low Connection pooling в httpx эффективнее тредов.
Сложность отладки асинхронного кода Medium Medium CoT-логирование на всех путях (FR-020). Трассировка через trace_id.

Issues Found

  • 1.1: Implementation detail leakage — оправдано для инфраструктурного рефакторинга (библиотеки — предмет спецификации).
  • Consistency: async_network.py vs async_client.py — разрешено в пользу расширения существующего async_network.py. Research обновлён.
  • Config split: EnvironmentConfig (perenv) vs AppAsyncRuntimeConfig (global) — разделены.
  • Executor API: asyncio.to_thread заменён на loop.run_in_executor через run_blocking helper.
  • Error mapping: унифицирован во всех артефактах (spec/UX/contracts).
  • SC-005: смягчён — «поведенческие assertions эквивалентны, фикстуры могут измениться».
  • Checklist: обновлён после повторного review.

Summary

  • Total checks: 28
  • Passed: 28
  • Failed: 0
  • Modules covered: 16+ files, ~45 blocking call sites
  • Rejected paths: 5 (documented for ADR)
  • Readiness: Ready for /speckit.plan