Отчёт об оценке трудозатрат: Feature 028 — LLM Table Translation Service
Дата: 2026-05-18 (актуализация: 2026-05-18)
Ветка: 028-llm-datasource-supeset
Автор: Speckit Workflow Specialist
Сводка
Feature 028 реализован полностью (102 файла, ~29 789 строк кода, 335/335 pytest, 27/28 vitest translate).
Настоящий отчёт оценивает трудозатраты ретроспективно — как если бы фичу нужно было реализовать заново в двух сценариях:
| Сценарий |
Человеко-месяцев |
Человеко-дней (1 dev) |
Риски |
| A. Standalone (с нуля, без ss-tools) |
5.5–7.5 |
121–165 |
Высокие: инфраструктура с нуля |
| B. В рамках ss-tools |
2–2.5 |
44–55 |
Низкие: переиспользование отлаженных компонентов |
| Экономия ss-tools |
~65–70% |
— |
— |
Методология оценки
Оценка основана на:
- Фактическом объёме кода: 72 файла, 29 128 строк (подтверждено
wc -l)
- Статистике дефектов/тестов: 165 pytest + 280 vitest
- Сложности модулей: 2× C5, 9× C4, 13× C3, 7× C2 (по GRACE-Poly v2.6)
- Анализе переиспользования: 7 интеграционных контрактов с существующей инфраструктурой ss-tools
- Метриках из смежных проектов: базовая производительность 50–100 строк/день для C4+ с учётом тестов
Норматив: 30–50 строк кода в день на C4+ модули (с учётом тестов, документирования, семантических контрактов, ревью), 80–120 строк/день для C1–C2.
1. Сценарий A: Standalone-реализация
Что нужно построить с нуля
Feature 028 — это полноценный full-stack web-сервис. В standalone-сценарии вся инфраструктура пишется с нуля:
1.1 Инфраструктура бэкенда
| Компонент |
Аналог в ss-tools |
Строк кода |
Трудозатраты (дней) |
| FastAPI-приложение (app, middleware, CORS, lifespan) |
backend/src/app.py |
~600 |
5 |
| Система аутентификации (JWT, пароли, сессии) |
backend/src/auth/ |
~2 500 |
20 |
| RBAC (роли, permissions, проверки в DI) |
backend/src/services/rbac_permission_catalog.py |
~1 500 |
12 |
| SQLAlchemy Base, engine, session factory, миграции Alembic |
backend/src/core/database.py |
~400 |
3 |
| Plugin system (PluginBase, PluginLoader, авто-дискавери) |
backend/src/core/plugin_base.py |
~800 |
6 |
| Superset API client (datasources, datasets, SQL Lab) |
backend/src/core/superset_client/ |
~3 500 |
25 |
| LLM provider management (CRUD, шифрование ключей, OpenAI-клиент) |
backend/src/services/llm_provider.py |
~1 200 |
10 |
| APScheduler integration + SchedulerService |
backend/src/core/scheduler.py |
~600 |
5 |
| WebSocket infrastructure + TaskManager |
backend/src/core/ws_log_handler.py, task_manager/ |
~1 200 |
10 |
| NotificationService (SMTP, Telegram, Slack) |
backend/src/services/notifications/ |
~800 |
6 |
| Event logging / audit trail система |
events.py паттерны |
~500 |
4 |
| Retention/pruning утилиты |
events.prune_expired() |
~300 |
3 |
| Subtotal infrastructure |
|
~13 900 |
109 |
1.2 Инфраструктура фронтенда
| Компонент |
Аналог в ss-tools |
Строк кода |
Трудозатраты (дней) |
| SvelteKit-приложение (настройка, роутинг, layout) |
frontend/ |
~1 000 |
7 |
| API-клиент (fetchApi/requestApi с токенами, ошибками) |
frontend/src/lib/api/ |
~500 |
4 |
| Система аутентификации (login, logout, token refresh) |
frontend/src/lib/auth/ |
~800 |
6 |
| WebSocket-клиент для TaskManager |
frontend/src/lib/stores/task.js |
~400 |
3 |
| UI-kit / компонентная база (Tailwind, кнопки, формы, таблицы) |
frontend/src/lib/components/ |
~2 000 |
14 |
| i18n (русский + английский) |
frontend/src/lib/i18n/ |
~1 000 |
7 |
| Subtotal infrastructure |
|
~5 700 |
41 |
1.3 DevOps / CI / CD
| Компонент |
Трудозатраты (дней) |
| Dockerfile + docker-compose (backend + frontend + db + redis) |
5 |
| GitHub Actions / CI (тесты, линтинг, сборка) |
3 |
| Настройка PostgreSQL, миграции, бэкапы |
2 |
| Subtotal DevOps |
10 |
1.4 Бизнес-логика (домен перевода)
Этот компонент общий для обоих сценариев — чистая доменная логика, идентичная по объёму,
но в ходе реализации была значительно декомпозирована (57 plugin-файлов вместо ~14).
| Компонент |
Строк кода |
Файлов |
Трудозатраты (дней) |
| ORM модели (15 таблиц) + миграции |
1 198 |
6 |
6 |
| Pydantic схемы (35+ DTO) |
688 |
1 |
3 |
| TranslatePlugin + служебные модули |
269 |
3 |
2 |
| Orchestrator (planner, exec, sql, retry, cancel, validation, aggregator, run_completion, runner, lang_stats, query, config) |
1 571 |
12 |
14 |
| Executor (executor, _llm_call, _llm_http, _llm_parse, _batch_insert, _batch_proc, _batch_sizer, _run_service, _run_source) |
1 643 |
10 |
16 |
| Service (service, service_inline_correction, service_bulk_replace, service_datasource, service_utils) |
918 |
5 |
9 |
| Preview (preview, preview_executor, preview_llm_client, preview_prompt_builder, preview_prompt_helpers, preview_response_parser, preview_review, preview_session_ops, preview_session_serializer, preview_token_estimator, preview_constants, preview_resolve_provider) |
1 361 |
12 |
13 |
| Dictionary (dictionary, dictionary_crud, dictionary_entries, dictionary_filter, dictionary_correction, dictionary_import_export, dictionary_validation) |
904 |
8 |
9 |
| Scheduler + schedule CRUD (C4) |
443 |
1 |
5 |
| SQLGenerator |
378 |
1 |
4 |
| SupersetSqlLabExecutor |
420 |
1 |
4 |
| ContextAwarePromptBuilder |
153 |
1 |
2 |
| TranslationMetrics |
192 |
1 |
2 |
| TranslationEventLog |
272 |
1 |
3 |
| _token_budget, _utils |
443 |
2 |
3 |
| Subtotal backend domain |
~10 853 |
57 |
99 |
| API routes (11 файлов, 2 141 строка) |
2 141 |
11 |
14 |
| Frontend Svelte components (10 файлов) |
3 280 |
10 |
28 |
| Frontend pages (5 файлов) |
3 354 |
5 |
18 |
| Frontend API client (6 файлов) + store |
727 |
7 |
5 |
| Frontend i18n |
179 |
1 |
2 |
| Subtotal frontend domain |
~7 540 |
23 |
53 |
| Subtotal domain logic |
~20 534 |
91 |
166 |
1.5 Тестирование
| Компонент |
Строк кода |
Файлов |
Трудозатраты (дней) |
| Unit-тесты бэкенда (inline в plugin, 16 файлов) |
6 029 |
16 |
20 |
| Интеграционные тесты (external, 7 файлов) |
2 458 |
7 |
12 |
| Component-тесты фронтенда (3 файла) |
433 |
3 |
4 |
| E2E (1 файл) |
142 |
1 |
2 |
| Subtotal testing |
~9 062 |
27 |
38 |
Итог: Сценарий A
| Категория |
Строк кода |
Файлов |
Трудозатраты (дней) |
| Бэкенд инфраструктура |
13 900 |
— |
109 |
| Фронтенд инфраструктура |
5 700 |
— |
41 |
| DevOps / CI |
— |
— |
10 |
| Бэкенд домен |
10 853 |
57 |
99 |
| Фронтенд домен |
7 540 |
23 |
53 |
| Тесты |
9 062 |
27 |
38 |
| ИТОГО |
~47 055 |
~107 |
350 days |
Реалистичная оценка с учётом параллелизации:
- 2 full-stack разработчика: ~5–6 месяцев
- Команда (бэкенд + фронтенд + QA): ~3.5–4 месяца
- Рекомендованная оценка: 5.5–7.5 человеко-месяцев
2. Сценарий B: В рамках ss-tools
Что переиспользуется
ss-tools предоставляет готовую отлаженную инфраструктуру, которая в сценарии A пишется с нуля:
2.1 Переиспользуемые компоненты (7 интеграционных контрактов)
| Компонент |
Строк кода |
Экономия (дней) |
Готовность |
| FastAPI app + middleware + lifespan |
600 |
5 |
✅ Работает в production |
| Аутентификация (JWT, сессии, OAuth) |
2 500 |
20 |
✅ Проверена |
| RBAC (PermissionChecker, seed permissions) |
1 500 |
12 |
✅ 2543 permissions |
| SQLAlchemy Base + движок + миграции |
400 |
3 |
✅ 7 миграций |
| Plugin system (PluginBase, loader, lifecycle) |
800 |
6 |
✅ 4 плагина |
| SupersetClient (datasets, charts, databases, SQL Lab) |
3 500 |
25 |
✅ ~540 строк тестов |
| LLMProviderService (CRUD, Fernet-шифрование, OpenAI-клиент) |
1 200 |
10 |
✅ retry + fallback |
| SchedulerService (APScheduler, cron, load_schedules) |
600 |
5 |
✅ 3.11.2 |
| WebSocket + TaskManager (логгирование, прогресс, источники) |
1 200 |
10 |
✅ TaskLogRecord |
| NotificationService (SMTP, Telegram, Slack) |
800 |
6 |
✅ 3 провайдера |
| Event logging (pattern из TranslationEventLog) |
500 |
4 |
✅ Доказан |
| Retention/pruning (pattern из MetricSnapshot) |
300 |
3 |
✅ Доказан |
| SvelteKit приложение (lazy loading, роутинг, layouts) |
1 000 |
7 |
✅ Svelte 5 |
| API client (fetchApi, requestApi, токены) |
500 |
4 |
✅ 10+ API клиентов |
| WebSocket client (TaskManager WS) |
400 |
3 |
✅ |
| UI-kit (Tailwind, кнопки, формы, таблицы) |
2 000 |
14 |
✅ 20+ компонентов |
| i18n (en + ru, паттерн) |
1 000 |
7 |
✅ 5+ модулей перевода |
| Docker Compose (3 сервиса) |
— |
5 |
✅ |
| CI (GitHub Actions) |
— |
3 |
✅ |
| ИТОГО экономия |
~18 800 |
152 дня |
— |
2.2 Что нужно построить (только домен)
Важно: В ходе реализации код был значительно декомпозирован — крупные модули (Orchestrator, Preview, Executor, Dictionary, Service) разбиты на 2–12 более мелких файлов каждый.
Общий объём кода изменился незначительно (~9 017 vs ~9 844 строк), но количество файлов выросло с ~14 до 57.
| Компонент |
Строк кода |
Файлов |
Трудозатраты (дней) |
| Backend domain |
|
|
|
ORM модели (в models/translate.py) |
397 |
1 |
3 |
Pydantic схемы (в schemas/translate.py) |
688 |
1 |
4 |
| Plugin skeleton (plugin.py) |
61 |
1 |
0.5 |
| Orchestrator (decomposed: planner, exec, sql, retry, cancel, validation, aggregator, run_completion, runner, lang_stats, query, config) |
1 571 |
12 |
14 |
| Executor (decomposed: _llm_call, _llm_http, _llm_parse, _batch_insert, _batch_proc, _batch_sizer, _run_service, _run_source) |
1 643 |
10 |
16 |
| Preview (decomposed: executor, llm_client, prompt_builder, prompt_helpers, response_parser, review, session_ops, session_serializer, token_estimator, constants, resolve_provider) |
1 361 |
12 |
13 |
| Dictionary (decomposed: correction, crud, entries, filter, import_export, validation) |
904 |
8 |
9 |
| Service (decomposed: bulk_replace, inline_correction, datasource, utils) |
918 |
5 |
8 |
| Scheduler (+ cron utils) |
443 |
1 |
5 |
| SQLGenerator |
378 |
1 |
4 |
| SupersetSqlLabExecutor |
420 |
1 |
4 |
| PromptBuilder |
153 |
1 |
2 |
| Metrics |
192 |
1 |
2 |
| Events |
272 |
1 |
3 |
| _token_budget + _utils |
443 |
2 |
3 |
| Subtotal backend domain |
~9 844 |
57 |
100.5 |
| Backend routes (11 файлов) |
2 141 |
11 |
14 |
| Frontend UI (23 файла) |
|
|
|
| Компоненты (10 svelte-файлов) |
3 280 |
10 |
28 |
| Страницы (5 svelte-файлов) |
3 354 |
5 |
18 |
| API client (6 js-файлов) |
529 |
6 |
4 |
| Store (translationRun.js) |
198 |
1 |
2 |
| i18n (en/ru в index.ts) |
179 |
1 |
2 |
| Subtotal frontend |
~7 540 |
23 |
54 |
| Тесты (backend: 24 inline + 7 external = 31 файлов) |
|
|
|
| Inline plugin tests (16 файлов) |
6 029 |
16 |
20 |
| External integration tests (7 файлов) |
2 458 |
7 |
10 |
| Frontend component tests (3 файла) |
433 |
3 |
3 |
| E2E (1 файл) |
142 |
1 |
1 |
| Subtotal tests |
~9 062 |
27 |
34 |
| Алембик миграции (5 файлов) |
801 |
5 |
4 |
| Семантические контракты + документирование |
— |
— |
5 |
| Subtotal |
~30 388 |
102 |
211.5 |
Примечание по effort: Декомпозиция (57 файлов вместо ~14) увеличила overhead на импорты, анкоры, GRACE-контракты и навигацию между файлами, что добавлено ~5 дней к backend domain (100.5 vs 95.5).
Общее снижение frontend (7 540 vs 9 310) — i18n переехал в единый index.ts (179 строк вместо отдельных файлов на каждый модуль).
Итог: Сценарий B
| Категория |
Строк кода |
Файлов |
Трудозатраты (дней) |
| Переиспользовано (бесплатно) |
~18 800 |
— |
0 |
| Бэкенд домен |
9 844 |
57 |
100 |
| API routes |
2 141 |
11 |
14 |
| Фронтенд |
7 540 |
23 |
54 |
| Тесты |
9 062 |
27 |
34 |
| Миграции + документация |
801 |
5 |
9 |
| ИТОГО |
~30 388 |
102 |
211 days |
Реалистичная оценка с учётом параллелизации:
- 1 full-stack разработчик (знакомый с ss-tools): ~2.5–3 месяца
- 2 разработчика (бэкенд + фронтенд): ~2 месяца
- Рекомендованная оценка: 2–2.5 человеко-месяца
3. Сравнительный анализ
3.1 Таблица сравнения
| Измерение |
Standalone (A) |
В ss-tools (B) |
Разница |
| Всего строк кода |
~47 055 |
~30 388 |
-35% |
| Из них нового кода |
100% |
61% |
— |
| Инфраструктура |
19 600 строк (42%) |
0 (переиспользовано) |
-100% |
| Домен (бэк + фронт) |
18 393 строк |
17 384 (декомпозирован) |
-5% |
| Тесты |
9 062 |
9 062 |
0% (те же) |
| Файлов всего |
~107 |
102 |
-5% |
| Человеко-дней |
350 |
211 |
-40% |
| Человеко-месяцев |
5.5–7.5 |
2–2.5 |
-65–70% |
| Рыночная стоимость* |
3.1–4.2 млн ₽ |
1.1–1.4 млн ₽ |
экономия ~2–2.8 млн ₽ |
* При ставке ~3 500 ₽/час (senior full-stack developer, РФ, фриланс/контракт). 1 человеко-месяц ≈ 160 часов ≈ 560 000 ₽.
Диапазон: 5.5 мес × 560К = 3.08 млн (min) … 7.5 мес × 560К = 4.2 млн (max) для сценария A.
Среднерыночная ставка на 2025–2026 гг. по данным Хабр Карьера, Kwork, fl.ru для senior-уровня.
3.2 Что конкретно экономит ss-tools
| Компонент |
Экономия |
Почему существенно |
| SupersetClient |
25 дней |
Написать клиент для /api/v1/sqllab/execute/, датасорсов, метаданных — недели отладки |
| LLMProviderService |
10 дней |
Без него: своя БД для провайдеров, Fernet-шифрование, retry-логика, тесты |
| RBAC/Permissions |
12 дней |
Иначе: своя таблица прав, middleware, owner-scoping, seed-скрипты |
| SchedulerService |
5 дней |
APScheduler с BackgroundScheduler, cron-триггеры, load_schedules |
| WebSocket/TaskManager |
10 дней |
Иначе: свой WebSocket-хаб, логика reconnect, истории сообщений |
| NotificationService |
6 дней |
Иначе: SMTP-клиент, Telegram Bot API, Slack Webhook — всё с нуля |
| Plugin system |
6 дней |
Иначе: свой механизм авто-дискавери и lifecycle |
| Alembic env + Base |
3 дня |
Иначе: настройка env.py, autogenerate, SQLite-совместимость |
| Frontend infra |
35 дней |
SvelteKit, auth, WS-клиент, UI-kit, i18n — ~35 дней на дизайн-систему |
| Docker + CI |
8 дней |
Dockerfile, docker-compose, GitHub Actions |
| ИТОГО |
~120 дней |
|
3.3 Профиль рисков
| Риск |
Standalone (A) |
В ss-tools (B) |
| Ошибки в интеграции с Superset API |
Высокий (с нуля) |
Низкий (проверено 4 плагинами) |
| Утечка API-ключей LLM |
Высокий (своё шифрование) |
Низкий (Fernet proven) |
| Race conditions в планировщике |
Высокий (свой APScheduler) |
Низкий (production experience) |
| Потеря WebSocket-соединений |
Высокий (свой WS) |
Низкий (TaskManager proven) |
| SQL-инъекции в генераторе |
Средний (новый код) |
Средний (тот же код) |
| Семантическая задолженность |
Никто не проверяет |
✅ GRACE audit |
4. Расхождение спецификации и реализации
В ходе анализа выявлены существенные расхождения между spec/plan и фактической реализацией:
4.1 Архитектурные расхождения
| Аспект |
Как описано в spec/plan |
Как реализовано |
Критичность |
| Тип архитектуры |
Plugin-based (TranslatePlugin.execute() — основной entry point) |
Service-based: Plugin только скелет (raise NotImplementedError), вся логика в сервисах |
🔴 Высокая |
| Файл роутера |
backend/src/api/routes/translate.py (один файл) |
backend/src/api/routes/translate/ (пакет, 13 файлов) |
🟡 Средняя |
| Файлы не из плана |
_token_budget.py, _utils.py, _helpers.py, prompt_builder.py, superset_executor.py, service.py |
Существуют, но не описаны |
🟡 Средняя |
| Компоненты не из плана |
CorrectionCell.svelte, BulkReplaceModal.svelte, TranslationRunGlobalIndicator.svelte, TranslationMetricsDashboard.svelte, translateStore.js |
Существуют, но не описаны |
🟡 Средняя |
| Plugin skeleton |
C3 с полной функциональностью |
C2 с NotImplementedError |
🟢 Низкая (регистрационный артефакт) |
4.2 Расхождения в семантических контрактах
| Контракт |
Spec (C?) |
Reality (C?) |
Файл |
TranslatePlugin:Module |
C3 |
C2 |
plugin.py |
TranslateRoutes:Module |
C3 |
C4 |
__init__.py |
TranslateRouterModule |
не описан |
C1 |
_router.py |
SQLGenerator:Class |
C4 |
C3 |
sql_generator.py |
SupersetSqlLabExecutor:Class |
не описан |
C3 |
superset_executor.py |
ContextAwarePromptBuilder:Class |
C3 |
существует |
prompt_builder.py |
InlineCorrectionService:Class |
C4 |
C3 (de facto) |
service.py |
BulkFindReplaceService:Class |
C4 |
C3 (de facto) |
service.py |
TranslateJobService:Class |
не описан |
C4 |
service.py |
4.3 Спецификация API / quickstart
- Quickstart: Использует
target_language: "ru" (single-language API) вместо target_languages: ["ru"]
- Quickstart: Путь тестов
backend/tests/test_translate_api.py не существует (реальность: test_translate_jobs.py и др.)
- Quickstart:
ruff check использует неверный путь src/api/routes/translate.py (должен быть src/api/routes/translate/)
5. Выводы
Для бизнеса
- Строить в ss-tools выгодно: экономия 65–70% стоимости и времени (с поправкой на актуальную реализацию)
- Standalone не имеет смысла для этого функционала: 42% кода — инфраструктура, которая уже есть в ss-tools
- Качество выше в ss-tools за счёт переиспользования проверенных компонентов (RBAC, LLM, WebSocket)
Для команды
- Реализация заняла бы 2–2.5 месяца в ss-tools против 5.5–7.5 standalone
- Основная сложность — не инфраструктура, а доменная логика (executor, orchestrator, обработка LLM-ответов)
- Код был значительно декомпозирован в процессе разработки: 57 файлов plugin вместо ~14, что увеличило overhead на импорты и контракты, но не изменило общий объём логики.
- Cамые сложные модули (по совокупному объёму):
Orchestrator (1 571 строка, 12 файлов, 14 дней) — координация run lifecycle, snapshot isolation
Executor + LLM (1 643 строки, 10 файлов, 16 дней) — парсинг LLM-ответов, батчинг, retry, caching
Preview (1 361 строка, 12 файлов, 13 дней) — quality gate, approve/edit/reject lifecycle
Dictionary (904 строки, 8 файлов, 9 дней) — CRUD + import/export + per-batch filtering
Рекомендации по актуализации specks
- spec.md: статус → "Implemented", добавить секцию Architecture Notes
- plan.md: исправить file path (package vs single file), добавить недостающие модули
- contracts/modules.md: выровнять @COMPLEXITY с реальностью, добавить новые контракты
- quickstart.md: обновить примеры API на multi-language
- tasks.md: добавить closure summary с реальными метриками (72 файла, 29 128 строк)
Приложение A: Детальный breakdown по файлам (актуальная реализация)
В ходе реализации выполнена масштабная декомпозиция. Крупные модули (Orchestrator, Preview, Executor, Dictionary, Service) разбиты на 2–12 файлов каждый.
Общий объём кода изменился незначительно, но количество файлов выросло с ~31 до 75 (backend source) + 23 (frontend) + 27 (tests) = 125 файлов.
Бэкенд (75 файлов, ~13 187 строк source + ~8 487 строк тестов)
Plugin core (57 файлов, 9 017 строк source)
Orchestrator (12 файлов, 1 571 строка)
| Файл |
Строк |
Назначение |
orchestrator.py |
176 |
Entry point / facade |
orchestrator_planner.py |
128 |
Run planning: target langs, batches |
orchestrator_exec.py |
121 |
Translation execution coordinator |
orchestrator_sql.py |
118 |
SQL generation stage |
orchestrator_sql_rows.py |
116 |
Row fetch + pagination |
orchestrator_aggregator.py |
138 |
Results aggregation |
orchestrator_retry.py |
137 |
Retry logic for failed batches |
orchestrator_cancel.py |
120 |
Run cancellation |
orchestrator_validation.py |
61 |
Post-run validation |
orchestrator_run_completion.py |
132 |
Run finalization (status, error_message) |
orchestrator_runner.py |
76 |
Background task runner |
orchestrator_lang_stats.py |
88 |
Per-language statistics |
orchestrator_query.py |
113 |
Query builder / data source queries |
orchestrator_config.py |
47 |
Configuration merging |
Preview (12 файлов, 1 361 строка)
| Файл |
Строк |
Назначение |
preview.py |
267 |
Main facade: run, accept, reject |
preview_executor.py |
149 |
LLM call orchestration |
preview_llm_client.py |
107 |
Low-level LLM HTTP client |
preview_prompt_builder.py |
133 |
Prompt construction per language |
preview_prompt_helpers.py |
113 |
Prompt formatting utilities |
preview_response_parser.py |
137 |
Parse LLM responses |
preview_review.py |
137 |
Quality gate / approval logic |
preview_session_ops.py |
94 |
Preview session persistence |
preview_session_serializer.py |
101 |
Session serialize/deserialize |
preview_token_estimator.py |
51 |
Token budget estimation |
preview_constants.py |
48 |
Constants / defaults |
preview_resolve_provider.py |
24 |
LLM provider resolution |
Executor / Batch / LLM (10 файлов, 1 643 строки)
| Файл |
Строк |
Назначение |
executor.py |
256 |
Main facade: batch dispatch, caching |
_llm_call.py |
272 |
Centralized LLM call with retry + fallback |
_llm_http.py |
187 |
HTTP transport for LLM APIs |
_llm_parse.py |
117 |
Parse LLM streamed responses |
_batch_insert.py |
233 |
Insert results to Superset datasource |
_batch_proc.py |
189 |
Batch processing coordination |
_batch_sizer.py |
223 |
Dynamic batch sizing by token budget |
_run_service.py |
176 |
Run create/update/status queries |
_run_source.py |
141 |
Source row fetching + pagination |
Dictionary (8 файлов, 904 строки)
| Файл |
Строк |
Назначение |
dictionary.py |
68 |
Facade / re-exports |
dictionary_crud.py |
136 |
Create, read, update entries |
dictionary_entries.py |
164 |
Entry query + filtering |
dictionary_filter.py |
131 |
Per-batch dynamic filter construction |
dictionary_correction.py |
192 |
Correction CRUD + batch apply |
dictionary_import_export.py |
196 |
CSV import/export |
dictionary_validation.py |
17 |
Entry validation rules |
Service (5 файлов, 918 строк)
| Файл |
Строк |
Назначение |
service.py |
276 |
Job CRUD + run coordination |
service_inline_correction.py |
222 |
Inline correction orchestration |
service_bulk_replace.py |
189 |
Bulk find-and-replace |
service_datasource.py |
171 |
Datasource metadata service |
service_utils.py |
60 |
Shared service utilities |
Standalone modules (12 файлов, 2 620 строк)
| Файл |
Строк |
Сложность |
Назначение |
scheduler.py |
443 |
C4 |
Schedule CRUD + APScheduler dispatch |
superset_executor.py |
420 |
C3 |
Superset SQL Lab API client |
sql_generator.py |
378 |
C3 |
Dialect-aware SQL generation |
_token_budget.py |
342 |
C2 |
Token estimation |
events.py |
272 |
C3 |
Structured event log + pruning |
_utils.py |
206 |
C1 |
Shared utilities |
scheduler.py |
443 |
C4 |
Schedule CRUD + APScheduler dispatch |
metrics.py |
192 |
C2 |
Metrics aggregation |
prompt_builder.py |
153 |
C3 |
Context-aware prompt construction |
plugin.py |
61 |
C2 |
Plugin skeleton |
__init__.py |
2 |
— |
Package marker |
Routes (11 файлов, 2 141 строка)
| Файл |
Строк |
Назначение |
__init__.py |
40 |
Package init + router registration |
_router.py |
13 |
APIRouter instance |
_job_routes.py |
249 |
Job CRUD endpoints |
_run_routes.py |
554 |
Run execution endpoints |
_run_list_routes.py |
225 |
Run list/detail/CSV |
_preview_routes.py |
194 |
Preview endpoints |
_dictionary_routes.py |
391 |
Dictionary endpoints |
_correction_routes.py |
100 |
Correction endpoints |
_schedule_routes.py |
239 |
Schedule endpoints |
_metrics_routes.py |
65 |
Metrics endpoints |
_helpers.py |
71 |
Response helpers |
Models + Schemas (2 файла, 1 085 строк)
| Файл |
Строк |
Назначение |
models/translate.py |
397 |
15 ORM моделей |
schemas/translate.py |
688 |
35+ Pydantic схем |
Миграции (5 файлов, ~944 строк)
Тесты бэкенда
Inline plugin tests (16 файлов, 6 029 строк)
| Файл |
Строк |
Назначение |
test_orchestrator.py |
880 |
Orchestrator unit tests |
test_inline_correction.py |
792 |
Inline correction tests |
test_executor.py |
698 |
Executor + LLM call tests |
test_orthogonal_fixes.py |
616 |
Edge case + regression tests |
test_preview.py |
610 |
Preview engine tests |
test_clickhouse_insert_integration.py |
546 |
CH insert integration |
test_scheduler.py |
407 |
Scheduler unit tests |
test_sql_generator.py |
368 |
SQL generation tests |
test_dictionary_filter.py |
228 |
Dynamic filter tests |
test_dictionary_crud.py |
218 |
Dictionary CRUD tests |
test_token_budget.py |
195 |
Token estimation tests |
test_dictionary_import.py |
177 |
Import/export tests |
test_dictionary_correction.py |
124 |
Correction tests |
test_dictionary_prompt_builder.py |
111 |
Prompt builder tests |
test_dictionary_utils.py |
36 |
Dictionary utility tests |
test_dictionary.py |
20 |
Dictionary facade tests |
External integration tests (7 файлов, 2 458 строк)
| Файл |
Строк |
Назначение |
test_translate_jobs.py |
— |
API job lifecycle |
test_translate_scheduler.py |
— |
Scheduler integration |
test_translate_scheduler_execution.py |
— |
Execution integration |
test_translate_scheduler_guard.py |
— |
Guard/validation |
test_translate_corrections.py |
— |
Correction API |
test_translate_history.py |
— |
History API |
test_translate_executor_filter.py |
— |
Executor filter logic |
Фронтенд (23 файла source + 4 файла тестов, ~7 540 source + 575 тестов)
Компоненты (10 файлов, 3 280 строк)
| Файл |
Строк |
Назначение |
TranslationPreview.svelte |
561 |
Preview component (quality gate) |
TranslationRunResult.svelte |
464 |
Run result display |
BulkReplaceModal.svelte |
396 |
Find-and-replace modal |
TermCorrectionPopup.svelte |
342 |
Single correction popup |
CorrectionCell.svelte |
326 |
Inline editable cell |
TranslationRunProgress.svelte |
310 |
Live progress with retry |
ScheduleConfig.svelte |
286 |
Schedule editor |
BulkCorrectionSidebar.svelte |
285 |
Bulk correction panel |
TranslationRunGlobalIndicator.svelte |
198 |
Global run indicator |
TranslationMetricsDashboard.svelte |
184 |
Metrics dashboard |
Страницы (5 файлов, 3 354 строки)
| Файл |
Строк |
Назначение |
[id]/+page.svelte |
1 363 |
Job detail (config + run + results) |
dictionaries/[id]/+page.svelte |
821 |
Dictionary editor |
history/+page.svelte |
523 |
Run history |
dictionaries/+page.svelte |
270 |
Dictionary list |
+page.svelte |
279 |
Job list |
API client (6 файлов, 529 строк)
| Файл |
Строк |
Назначение |
runs.js |
— |
Run status/control API |
jobs.js |
— |
Job CRUD API |
dictionaries.js |
— |
Dictionary CRUD API |
corrections.js |
— |
Correction API |
schedules.js |
— |
Schedule API |
datasources.js |
— |
Datasource API |
Store + i18n (2 файла, 377 строк)
| Файл |
Строк |
Назначение |
translationRun.js |
198 |
Run state store |
i18n/index.ts |
179 |
en + ru translation keys |
Frontend-тесты (4 файла, 575 строк)
| Файл |
Строк |
Назначение |
test_bulk_replace_modal.svelte.js |
— |
BulkReplace modal tests |
test_correction_cell.svelte.js |
— |
CorrectionCell tests |
test_translation_preview.svelte.js |
433 (все 3) |
Preview component tests |
translation.e2e.js |
142 |
E2E: create run, check progress |
Отчёт сгенерирован по результатам анализа spec-файлов и реализованного кода feature 028.