# Отчёт об оценке трудозатрат: Feature 028 — LLM Table Translation Service

**Дата**: 2026-05-18 (актуализация: 2026-06-11)  
**Ветка**: `033-gradio-agent-chat`  
**Автор**: Speckit Workflow Specialist

---

## Сводка

Feature 028 реализован полностью (core: ~153 файла, ~36 091 строка кода, ~503 pytest, ~65 vitest).  
**Enhancement Phase** (Direct DB Insert + Connection Settings, US11–US12): в активной разработке — ~21 новых файлов, ~3 301 строка кода, ~16 новых тестовых файлов.

Настоящий отчёт оценивает трудозатраты **ретроспективно** — как если бы фичу нужно было реализовать заново в трёх сценариях:

| Сценарий | Человеко-месяцев | Человеко-дней (1 dev) | Риски |
|----------|:-:|:-:|-------|
| **A. Standalone (с нуля, без ss-tools)** | 7.5–9.5 | 165–209 | Высокие: инфраструктура с нуля |
| **B. В рамках ss-tools (core)** | 2.5–3 | 55–66 | Низкие: переиспользование отлаженных компонентов |
| **C. В рамках ss-tools (core + enhancement)** | 3.0–3.5 | 66–77 | Низкие: ~10–11 дополнительных дней на US11–US12 |
| **Экономия ss-tools** | **~62–65%** | — | — |

---

## Методология оценки

Оценка основана на:
1. **Фактическом объёме кода**: 148+21=169 файлов, ~39 392 строк (подтверждено `wc -l`)
2. **Статистике дефектов/тестов**: ~580+ pytest + ~68 vitest
3. **Сложности модулей**: 2× C5, 6× C4, 12× C3, 7× C2, 4× C1 (core) + 2× C3, 2× C2, 2× C1 (enhancement)
4. **Анализе переиспользования**: 7 интеграционных контрактов с существующей инфраструктурой ss-tools
5. **Метриках из смежных проектов**: базовая производительность 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 Бизнес-логика (домен перевода)

Этот компонент **общий для обоих сценариев** — чистая доменная логика, идентичная по объёму,  
но в ходе реализации была значительно декомпозирована (59 plugin-файлов вместо ~14).

| Компонент | Строк кода | Файлов | Трудозатраты (дней) |
|-----------|:-:|:-----:|:-:|
| ORM модели (15 таблиц) | 401 | 1 | 3 |
| Pydantic схемы (35+ DTO) | 712 | 1 | 4 |
| Plugin skeleton | 61 | 1 | 0.5 |
| **Orchestrator** (14 файлов) | 1 631 | 14 | 15 |
| **Executor** (executor, _batch_*, _llm_*, _run_*) | 2 196 | 9 | 21 |
| **Preview** (11 файлов) | 1 291 | 11 | 12 |
| **Dictionary** (7 файлов) | 921 | 7 | 9 |
| **Service** (6 файлов) | 1 281 | 6 | 11 |
| Scheduler + schedule CRUD | 443 | 1 | 5 |
| SQLGenerator | 402 | 1 | 4 |
| SupersetSqlLabExecutor | 439 | 1 | 4 |
| ContextAwarePromptBuilder | 153 | 1 | 2 |
| TranslationMetrics | 192 | 1 | 2 |
| TranslationEventLog | 274 | 1 | 3 |
| _token_budget | 395 | 1 | 4 |
| _utils | 225 | 1 | 2 |
| _lang_detect + _text_cleaner | 270 | 2 | 3 |
| _llm_async_http | 246 | 1 | 3 |
| service_target_schema | 355 | 1 | 4 |
| **Subtotal backend domain** | **~11 888** | **59** | **105** |
| API routes (13 файлов, 2 296 строк) | 2 296 | 13 | 15 |
| Frontend Svelte components (14 файлов) | 5 017 | 14 | 38 |
| Frontend pages (5 файлов) | 1 237 | 5 | 14 |
| Frontend API client (8 файлов) | 987 | 8 | 8 |
| **Subtotal frontend domain** | **~9 537** | **40** | **75** |
| **Subtotal domain logic** | **~21 425** | **99** | **180** |

#### 1.5 Enhancement Domain (Direct DB + Connections)

| Компонент | Строк кода | Файлов | Трудозатраты (дней) |
|-----------|:-:|:-----:|:-:|
| ConnectionService (CRUD + шифрование + test) | 448 | 1 | 4 |
| DbExecutor (asyncpg/clickhouse-connect с пулом) | 369 | 1 | 3 |
| Connection CRUD endpoints (+5 в settings.py) | ~200 | 1 | 2 |
| ORM model updates (insert_method, connection_id, connection_snapshot) | ~100 | 2 | 1 |
| Pydantic schema updates | ~80 | 1 | 0.5 |
| Orchestrator dispatch logic (insert_method routing) | ~120 | 1 | 1 |
| Alembic migration | 34 | 1 | 0.5 |
| ConnectionsTab.svelte (Settings UI, CRUD, test button) | 385 | 1 | 3 |
| InsertMethodSelector.svelte (radio + dropdown) | 185 | 1 | 1.5 |
| API client updates (connections) | ~40 | 1 | 0.5 |
| i18n keys (en + ru, settings + translate) | ~60 | 4 | 0.5 |
| Settings page/tab registration | ~20 | 2 | 0.5 |
| **Subtotal enhancement domain** | **~2 041** | **~17** | **~18** |

#### 1.6 Тестирование

| Компонент | Строк кода | Файлов | Трудозатраты (дней) |
|-----------|:-:|:-----:|:-:|
| Unit-тесты бэкенда (inline в plugin, 27 файлов) | 9 090 | 27 | 32 |
| Интеграционные тесты (external, 12 файлов) | 3 746 | 12 | 16 |
| Plugin integration (2 файла) | 279 | 2 | 2 |
| Component-тесты фронтенда (5 файлов) | 699 | 5 | 5 |
| Model-тесты фронтенда (2 файла) | 406 | 2 | 3 |
| E2E (1 файл) | 142 | 1 | 1 |
| Enhancement inline tests (6 файлов) | 1 229 | 6 | 5 |
| Enhancement external tests (3 файла) | 635 | 3 | 3 |
| Enhancement integration tests (5 файлов) | 1 015 | 5 | 4 |
| Enhancement frontend tests (1 файл) | 144 | 1 | 1 |
| **Subtotal testing** | **~17 385** | **~64** | **~72** |

#### Итог: Сценарий A

| Категория | Строк кода | Файлов | Трудозатраты (дней) |
|-----------|:-:|:-----:|:-:|
| Бэкенд инфраструктура | 13 900 | — | 109 |
| Фронтенд инфраструктура | 5 700 | — | 41 |
| DevOps / CI | — | — | 10 |
| Бэкенд домен (+enhancement) | 13 929 | ~76 | 123 |
| Фронтенд домен + routes (+enhancement) | 10 118 | ~42 | 85 |
| Тесты (+enhancement) | 17 385 | ~64 | 72 |
| **ИТОГО** | **~61 032** | **~182** | **440 days** |

**Реалистичная оценка с учётом параллелизации**:  
- 2 full-stack разработчика: **~7–8 месяцев**  
- Команда (бэкенд + фронтенд + QA): **~5–6 месяцев**  
- **Рекомендованная оценка**: **7.5–9.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 Что нужно построить (только домен)

> **Важно**: В ходе дальнейшей разработки код был расширен — добавились новые модули (_lang_detect, _text_cleaner, _llm_async_http, service_target_schema) и тесты.  
> Общий объём кода: ~10 174 строк (plugin) + 401 (models) + 712 (schemas) = 11 287 строк в backend domain.

| Компонент | Строк кода | Файлов | Трудозатраты (дней) |
|-----------|:-:|:-:|:-:|
| **Backend domain** | | | |
| ORM модели (в `models/translate.py`) | 401 | 1 | 3 |
| Pydantic схемы (в `schemas/translate.py`) | 712 | 1 | 4 |
| Plugin skeleton (plugin.py) | 61 | 1 | 0.5 |
| **Orchestrator** (14 файлов: planner, exec, sql, retry, cancel, validation, aggregator, run_completion, runner, lang_stats, query, config, sql_rows) | 1 631 | 14 | 15 |
| **Executor / LLM** (9 файлов: executor, _llm_call, _llm_parse, _llm_async_http, _batch_insert, _batch_proc, _batch_sizer, _run_service, _run_source) | 2 196 | 9 | 21 |
| **Preview** (11 файлов: executor, prompt_builder, prompt_helpers, response_parser, review, session_ops, session_serializer, token_estimator, constants, resolve_provider) | 1 291 | 11 | 12 |
| **Dictionary** (7 файлов: correction, crud, entries, filter, import_export, validation) | 921 | 7 | 9 |
| **Service** (6 файлов: bulk_replace, inline_correction, datasource, target_schema, utils) | 1 281 | 6 | 12 |
| Scheduler (+ cron utils) | 443 | 1 | 5 |
| SQLGenerator | 402 | 1 | 4 |
| SupersetSqlLabExecutor | 439 | 1 | 4 |
| PromptBuilder | 153 | 1 | 2 |
| Metrics | 192 | 1 | 2 |
| Events | 274 | 1 | 3 |
| _token_budget | 395 | 1 | 4 |
| _utils | 225 | 1 | 2 |
| _lang_detect | 207 | 1 | 2 |
| _text_cleaner | 63 | 1 | 1 |
| **Subtotal backend domain** | **~11 287** | **59** | **105** |
| **Backend routes (13 файлов)** | **2 296** | **13** | **15** |
| **Frontend UI (27 файлов)** | | | |
| Компоненты (14 svelte-файлов) | 5 017 | 14 | 38 |
| Страницы (5 svelte-файлов) | 1 237 | 5 | 14 |
| API client (8 js/ts-файлов) | 987 | 8 | 8 |
| **Subtotal frontend** | **~7 241** | **27** | **60** |
| **Enhancement domain (US11–US12)** | | | |
| ConnectionService | 448 | 1 | 4 |
| DbExecutor | 369 | 1 | 3 |
| Connection CRUD (+5 endpoints в settings.py) | ~200 | 1 | 2 |
| ORM + schema updates | ~180 | 3 | 1.5 |
| Orchestrator dispatch logic | ~120 | 1 | 1 |
| Alembic migration | 34 | 1 | 0.5 |
| ConnectionsTab.svelte | 385 | 1 | 3 |
| InsertMethodSelector.svelte | 185 | 1 | 1.5 |
| API client + i18n + settings/tab reg | ~120 | 7 | 1.5 |
| **Subtotal enhancement domain** | **~2 041** | **~17** | **~18** |
| **Тесты** | | | |
| Inline plugin tests (27 файлов) | 9 090 | 27 | 32 |
| External integration tests (10 файлов) | 3 467 | 10 | 15 |
| Plugin integration (2 файла) | 279 | 2 | 2 |
| Frontend component tests (5 файлов) | 699 | 5 | 5 |
| Frontend model tests (2 файла) | 406 | 2 | 3 |
| E2E (1 файл) | 142 | 1 | 1 |
| Enhancement inline tests (6 файлов) | 1 229 | 6 | 5 |
| Enhancement external tests (3 файла) | 635 | 3 | 3 |
| Enhancement integration tests (5 файлов) | 1 015 | 5 | 4 |
| Enhancement frontend tests (1 файл) | 144 | 1 | 1 |
| **Subtotal tests** | **~17 106** | **~62** | **~71** |
| Алембик миграции (6 файлов) | 835 | 6 | 4.5 |
| Семантические контракты + документирование | — | — | 6 |
| **Subtotal** | **~40 041** | **~182** | **~279** |

> **Примечание по effort**: Добавлены новые модули (_lang_detect, _text_cleaner, _llm_async_http, service_target_schema, connection_service, db_executor) и существенно расширены тесты (+3 023 строки, +15 файлов), что увеличило backend domain на ~10 дней, frontend на ~4.5 дня и тесты на ~13 дней.

#### Итог: Сценарий B

| Категория | Строк кода | Файлов | Трудозатраты (дней) |
|-----------|:-:|:-----:|:-:|
| Переиспользовано (бесплатно) | ~18 800 | — | 0 |
| Бэкенд домен | 11 287 | 59 | 105 |
| API routes | 2 296 | 13 | 15 |
| Фронтенд | 7 241 | 27 | 60 |
| Enhancement (US11–US12) | 2 041 | ~17 | 18 |
| Тесты | 17 106 | ~62 | 71 |
| Миграции + документация | 835 | 6 | 10.5 |
| **ИТОГО** | **~40 806** | **~184** | **~279 days** |

**Реалистичная оценка с учётом параллелизации**:  
- 1 full-stack разработчик (знакомый с ss-tools): **~3.5–4 месяца**  
- 2 разработчика (бэкенд + фронтенд): **~3–3.5 месяца**  
- **Рекомендованная оценка**: **3.0–3.5 человеко-месяца**

---

## 3. Сравнительный анализ

### 3.1 Таблица сравнения

| Измерение | Standalone (A) | В ss-tools (B) | Разница |
|-----------|:-:|:-:|:-:|
| Всего строк кода | ~61 032 | ~40 806 | -33% |
| Из них нового кода | 100% | 67% | — |
| Инфраструктура | 19 600 строк (32%) | 0 (переиспользовано) | -100% |
| Домен (бэк + фронт + enhancement) | 24 047 | 22 865 | -5% |
| Тесты | 17 385 | 17 106 | -2% |
| Файлов всего | ~182 | ~184 | +1% |
| Человеко-дней | 440 | 279 | -37% |
| Человеко-месяцев | 7.5–9.5 | 3.0–3.5 | -60–63% |
| Рыночная стоимость* | 4.2–5.3 млн ₽ | 1.7–2.0 млн ₽ | экономия ~2.5–3.3 млн ₽ |

\* При ставке ~3 500 ₽/час (senior full-stack developer, РФ, фриланс/контракт). 1 человеко-месяц ≈ 160 часов ≈ 560 000 ₽.  
Диапазон: 7.5 мес × 560К = 4.20 млн (min) … 9.5 мес × 560К = 5.32 млн (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 |
| **EncryptionManager** | 3 дня | Переиспользован для шифрования паролей DB-соединений (US12) |
| **ConfigManager** | 2 дня | Переиспользован для хранения DatabaseConnection в GlobalSettings |
| **ИТОГО** | **~125 дней** | |

### 3.3 Профиль рисков

| Риск | Standalone (A) | В ss-tools (B) |
|------|:---:|:---:|
| Ошибки в интеграции с Superset API | Высокий (с нуля) | Низкий (проверено 4 плагинами) |
| Утечка API-ключей LLM | Высокий (своё шифрование) | Низкий (Fernet proven) |
| Race conditions в планировщике | Высокий (свой APScheduler) | Низкий (production experience) |
| Потеря WebSocket-соединений | Высокий (свой WS) | Низкий (TaskManager proven) |
| SQL-инъекции в генераторе | Средний (новый код) | Средний (тот же код) |
| Утечка паролей DB-соединений | Высокий (своё шифрование) | Низкий (EncryptionManager proven) |
| Семантическая задолженность | Никто не проверяет | ✅ GRACE audit |
| Прямое подключение к БД (US11) | Высокий (connection pooling с нуля) | Низкий (asyncpg + существующий ConfigManager) |

---

## 4. Статус реализации Enhancement Phase (US11–US12)

### 4.1 Прогресс на 2026-06-11

Enhancement phase (Direct DB Insert + Connection Settings) в активной реализации на ветке `033-gradio-agent-chat`. Статус компонентов:

| Компонент | Статус | Файл | Строк |
|-----------|:------:|------|:-----:|
| `DatabaseConnection` (Pydantic model) | ✅ Реализован | `config_models.py` | ~50 |
| `ConnectionService` (CRUD + encrypt/test) | ✅ Реализован | `core/connection_service.py` | 448 |
| `DbExecutor` (asyncpg/clickhouse-connect) | ✅ Реализован | `core/db_executor.py` | 369 |
| Connection CRUD endpoints (+5) | ✅ Реализован | `routes/settings.py` | +~200 |
| ORM model updates (insert_method, connection_id) | ✅ Реализован | `models/translate.py` | +~100 |
| Pydantic schema updates | ✅ Реализован | `schemas/translate.py` | +~80 |
| Orchestrator dispatch (insert_method routing) | ✅ Реализован | `orchestrator_aggregator.py` и др. | +~120 |
| Alembic migration | ✅ Реализован | `c0d1e2f3a4b5_add_insert_method_and_connection_fields.py` | 34 |
| `ConnectionsTab.svelte` | ✅ Реализован | `routes/settings/ConnectionsTab.svelte` | 385 |
| `InsertMethodSelector.svelte` | ✅ Реализован | `components/translate/InsertMethodSelector.svelte` | 185 |
| API client updates | ✅ Реализован | `api/translate.ts`, `api.ts` | +~40 |
| i18n keys | ✅ Реализован | `en/ru: settings.json + translate.json` | +~60 |
| Settings page/tab registration | ✅ Реализован | `settings-utils.ts`, `+page.svelte` | +~20 |
| RBAC permission (`settings.connections.manage`) | ✅ Реализован | `seed_permissions.py` | — |
| `requirements.txt` (asyncpg, clickhouse-connect) | ✅ Реализован | `requirements.txt` | — |
| Inline plugin tests (6 новых файлов) | ✅ Реализован | `__tests__/test_batch_insert.py` и др. | 1 229 |
| External tests (3 новых файла) | ✅ Реализован | `test_connection_service.py` и др. | 635 |
| Integration tests (5 новых файлов) | ✅ Реализован | `test_superset_sqllab_e2e.py` и др. | 1 015 |
| Frontend tests (InsertMethodSelector) | ✅ Реализован | `InsertMethodSelector.test.ts` | 144 |

### 4.2 Оставшиеся задачи (Tasks T135–T160)

Из 26 запланированных enhancement-задач основная реализация выполнена. Остаются:

- **Верификация**: прогон полного набора тестов (`pytest`, `vitest`), семантический аудит
- **Quickstart**: обновление quickstart.md для flow direct DB insert
- **Документирование**: актуализация spec-файлов по факту реализации

---

## 5. Расхождение спецификации и реализации

В ходе анализа выявлены существенные расхождения между spec/plan и фактической реализацией:

### 5.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 | 🟢 Низкая (регистрационный артефакт) |
| **Connection storage** | Отдельная таблица БД | В `GlobalSettings.connections` (Pydantic model) | 🟢 Низкая (config persistence pattern) |

### 5.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 |
| `ConnectionService:Class` | не описан | C3 (NEW) | connection_service.py |
| `DbExecutor:Class` | не описан | C3 (NEW) | db_executor.py |

### 5.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/`)
- **Quickstart**: Отсутствует flow для Direct DB insert (US11) и Connection Settings (US12)

---

## 6. Выводы

### Для бизнеса
1. **Строить в ss-tools выгодно**: экономия ~60–63% стоимости и времени (с поправкой на актуальную реализацию, включая enhancement)
2. **Standalone не имеет смысла** для этого функционала: 32% кода — инфраструктура, которая уже есть в ss-tools
3. **Качество выше в ss-tools** за счёт переиспользования проверенных компонентов (RBAC, LLM, WebSocket, EncryptionManager)
4. **Enhancement phase** (Direct DB + Connections) добавляет ~10–11 рабочих дней при реализации в ss-tools — незначительно по сравнению с ~20 днями в standalone

### Для команды
1. **Реализация заняла бы 3.0–3.5 месяца** в ss-tools против 7.5–9.5 standalone
2. **Основная сложность** — не инфраструктура, а доменная логика (executor, orchestrator, обработка LLM-ответов)
3. **Код был существенно расширен** в процессе дальнейшей разработки: 59 файлов plugin → +17 enhancement, 148 → 184 файлов всего, ~39 400 строк
4. **Самые сложные модули** (по совокупному объёму):
   - `Orchestrator` (1 631 строка, 14 файлов, 15 дней) — координация run lifecycle + dispatch insert_method
   - `Executor + LLM` (2 196 строк, 9 файлов, 21 день) — парсинг LLM-ответов, батчинг, retry, caching
   - `Preview` (1 291 строка, 11 файлов, 12 дней) — quality gate, approve/edit/reject lifecycle
   - `Dictionary` (921 строка, 7 файлов, 9 дней) — CRUD + import/export + per-batch filtering
   - `Service` (1 281 строка, 6 файлов, 12 дней) — job coordination, target schema, inline correction
   - `ConnectionService` + `DbExecutor` (817 строк, 2 файла, 7 дней) — native DB drivers, pooling, encryption [NEW]

### Рекомендации по актуализации specks
- spec.md: статус → "Implemented ✅ + Enhancement ✅", обновить секцию Implementation Notes
- plan.md: исправить file path (package vs single file), добавить недостающие модули, отразить enhancement
- contracts/modules.md: выровнять @COMPLEXITY с реальностью, добавить новые контракты (ConnectionService, DbExecutor)
- quickstart.md: обновить примеры API на multi-language, добавить flow для Direct DB insert
- tasks.md: обновить closure summary, отметить enhancement tasks как [x]
- effort-estimate-report.md: ✅ актуализирован (этот документ)

---

## Приложение A: Детальный breakdown по файлам (актуальная реализация)

> В ходе дальнейшей разработки код был расширен: добавлены новые модули, расширены тесты, реализован enhancement (US11–US12).  
> Общий объём кода: 74 файла backend source + 27 frontend source + 64 тестов + 17 enhancement = 182 файлов, ~40 041 строк.

### Бэкенд (74 файла source + 17 enhancement + 62 файла тестов, ~13 585 source + ~2 041 enhancement + ~14 415 тестов)

#### Plugin core (59 файлов, 10 174 строк source)

**Orchestrator (14 файлов, 1 631 строка)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `orchestrator.py` | 175 | Entry point / facade |
| `orchestrator_planner.py` | 127 | Run planning: target langs, batches |
| `orchestrator_exec.py` | 121 | Translation execution coordinator |
| `orchestrator_sql.py` | 118 | SQL generation stage |
| `orchestrator_sql_rows.py` | 115 | Row fetch + pagination |
| `orchestrator_aggregator.py` | 139 | Results aggregation (+insert_method dispatch) |
| `orchestrator_retry.py` | 136 | Retry logic for failed batches |
| `orchestrator_cancel.py` | 120 | Run cancellation |
| `orchestrator_validation.py` | 61 | Post-run validation |
| `orchestrator_run_completion.py` | 139 | Run finalization (status, error_message) |
| `orchestrator_runner.py` | 76 | Background task runner |
| `orchestrator_lang_stats.py` | 87 | Per-language statistics |
| `orchestrator_query.py` | 148 | Query builder / data source queries |
| `orchestrator_config.py` | 69 | Configuration merging |

**Preview (11 файлов, 1 291 строка)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `preview.py` | 286 | Main facade: run, accept, reject |
| `preview_executor.py` | 149 | LLM call orchestration |
| `preview_prompt_builder.py` | 133 | Prompt construction per language |
| `preview_prompt_helpers.py` | 111 | Prompt formatting utilities |
| `preview_response_parser.py` | 158 | Parse LLM responses |
| `preview_review.py` | 136 | 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 (9 файлов, 2 196 строк)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `executor.py` | 272 | Main facade: batch dispatch, caching |
| `_llm_call.py` | 540 | Centralized LLM call with retry + fallback |
| `_llm_parse.py` | 116 | Parse LLM streamed responses |
| `_llm_async_http.py` | 246 | Async HTTP transport for LLM APIs |
| `_batch_insert.py` | 246 | Insert results to Superset datasource |
| `_batch_proc.py` | 259 | Batch processing coordination |
| `_batch_sizer.py` | 201 | Dynamic batch sizing by token budget |
| `_run_service.py` | 175 | Run create/update/status queries |
| `_run_source.py` | 141 | Source row fetching + pagination |

**Dictionary (7 файлов, 921 строка)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `dictionary.py` | 63 | Facade / re-exports |
| `dictionary_crud.py` | 129 | Create, read, update entries |
| `dictionary_entries.py` | 184 | Entry query + filtering |
| `dictionary_filter.py` | 140 | 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 (6 файлов, 1 281 строка)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `service.py` | 274 | Job CRUD + run coordination |
| `service_inline_correction.py` | 221 | Inline correction orchestration |
| `service_bulk_replace.py` | 189 | Bulk find-and-replace |
| `service_datasource.py` | 171 | Datasource metadata service |
| `service_target_schema.py` | 355 | Target schema management |
| `service_utils.py` | 71 | Shared service utilities |

**Standalone modules (12 файлов, 2 854 строки)**
| Файл | Строк | Сложность | Назначение |
|------|:-----:|:---------:|------------|
| `scheduler.py` | 443 | C4 | Schedule CRUD + APScheduler dispatch |
| `superset_executor.py` | 439 | C3 | Superset SQL Lab API client |
| `sql_generator.py` | 402 | C3 | Dialect-aware SQL generation |
| `_token_budget.py` | 395 | C2 | Token estimation |
| `_lang_detect.py` | 207 | C2 | Language detection for SQL |
| `_utils.py` | 225 | C1 | Shared utilities |
| `events.py` | 274 | C3 | Structured event log + pruning |
| `metrics.py` | 192 | C2 | Metrics aggregation |
| `prompt_builder.py` | 153 | C3 | Context-aware prompt construction |
| `_text_cleaner.py` | 63 | C1 | Text sanitization utilities |
| `plugin.py` | 61 | C2 | Plugin skeleton |
| `__init__.py` | 2 | — | Package marker |

#### Enhancement: Core Services (2 файла, 817 строк) 🆕

| Файл | Строк | Сложность | Назначение |
|------|:-----:|:---------:|------------|
| `core/connection_service.py` | 448 | C3 | Connection CRUD, encrypt/decrypt, test connectivity |
| `core/db_executor.py` | 369 | C3 | Direct DB execution: asyncpg + clickhouse-connect, pooling |

#### Routes (13 файлов, 2 296 строк)

| Файл | Строк | Назначение |
|------|:-----:|------------|
| `__init__.py` | 42 | Package init + router registration |
| `_router.py` | 13 | APIRouter instance |
| `_job_routes.py` | 285 | Job CRUD endpoints |
| `_run_routes.py` | 205 | Run execution endpoints |
| `_run_list_routes.py` | 359 | Run list/detail/CSV |
| `_run_edit_routes.py` | 200 | Run edit endpoints |
| `_run_history_routes.py` | 133 | Run history endpoints |
| `_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` | 70 | Response helpers |

#### Models + Schemas (2 файла, 1 113 строк)

| Файл | Строк | Назначение |
|------|:-----:|------------|
| `models/translate.py` | 401 | 15 ORM моделей (+insert_method, +connection_id, +connection_snapshot) |
| `schemas/translate.py` | 712 | 35+ Pydantic схем (+insert_method, +connection_id) |

#### Миграции (6 файлов, ~835 строк)

#### Тесты бэкенда

**Inline plugin tests (27 + 6 enhancement = 33 файла, 10 319 строк)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `test_orchestrator.py` | 884 | Orchestrator unit tests |
| `test_dialect_detection_orthogonal.py` | 932 | Dialect/edge case detection |
| `test_inline_correction.py` | 792 | Inline correction tests |
| `test_executor.py` | 698 | Executor + LLM call tests |
| `test_orthogonal_fixes.py` | 624 | Edge case + regression tests |
| `test_clickhouse_insert_integration.py` | 546 | CH insert integration |
| `test_target_schema.py` | 462 | Target schema tests |
| `test_preview.py` | 425 | Preview engine tests |
| `test_scheduler.py` | 407 | Scheduler unit tests |
| `test_sql_generator.py` | 368 | SQL generation tests |
| `test_batch_classify_persist.py` | 362 | Batch classification tests |
| `test_dictionary_filter.py` | 341 | Dynamic filter tests |
| `test_run_service.py` 🆕 | 295 | Run service tests |
| `test_token_budget.py` | 284 | Token estimation tests |
| `test_dictionary_crud.py` | 271 | Dictionary CRUD tests |
| `test_dict_snapshot_hash.py` | 240 | Dictionary hash tests |
| `test_batch_insert.py` 🆕 | 232 | Batch insert tests |
| `test_sql_insert_service.py` 🆕 | 221 | SQL insert service tests |
| `test_lang_detect.py` | 212 | Language detection tests |
| `test_response_field_coverage.py` 🆕 | 181 | Response field coverage |
| `test_dictionary_import.py` | 177 | Import/export tests |
| `test_metrics_cumulative.py` | 177 | Metrics cumulative tests |
| `test_lang_stats.py` 🆕 | 168 | Language statistics tests |
| `test_batch_sizer.py` | 155 | Batch sizing tests |
| `test_enforce_dictionary.py` | 168 | Dictionary enforcement tests |
| `test_retry.py` 🆕 | 132 | Retry logic tests |
| `test_dictionary_correction.py` | 124 | Correction tests |
| `test_dictionary_prompt_builder.py` | 111 | Prompt builder tests |
| `test_text_cleaner.py` | 186 | Text cleaner tests |
| `test_dictionary_utils.py` | 36 | Dictionary utility tests |
| `test_dictionary.py` | 20 | Dictionary facade tests |

**External integration tests (10 + 5 enhancement = 15 файлов, 4 482 строки)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `test_translate_jobs.py` | 563 | API job lifecycle |
| `test_core_scheduler.py` | 518 | Core scheduler tests |
| `test_translate_history.py` | 467 | History API |
| `test_translate_scheduler_execution.py` | 399 | Execution integration |
| `core/test_async_regression.py` | 370 | Async regression tests |
| `test_translate_scheduler_guard.py` | 298 | Guard/validation |
| `test_translate_executor_filter.py` | 289 | Executor filter logic |
| `test_translate_corrections.py` | 249 | Correction API |
| `test_translate_scheduler.py` | 195 | Scheduler integration |
| `test_translate_status_fk.py` 🆕 | 245 | Status FK tests |
| `test_translate_schedules.py` 🆕 (integration) | 235 | Schedule integration |
| `test_superset_sqllab_e2e.py` 🆕 | 227 | SQL Lab E2E |
| `test_translate_clickhouse.py` 🆕 | 181 | ClickHouse integration |
| `test_translate_corrections.py` 🆕 (integration) | 127 | Correction integration |
| `test_alembic_migrations.py` | 119 | Migration tests |

**Plugin external integration tests (2 файла, 279 строк)**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `test_llm_async.py` | 193 | LLM async integration tests |
| `test_async_concurrency.py` | 86 | Async concurrency tests |

**Enhancement external tests (3 файла, 635 строк) 🆕**
| Файл | Строк | Назначение |
|------|:-----:|------------|
| `test_connection_service.py` | 312 | ConnectionService CRUD + encrypt + test |
| `test_orchestrator_direct_db.py` | 196 | Orchestrator direct DB dispatch |
| `test_db_executor.py` | 127 | DbExecutor asyncpg/clickhouse-connect |

### Фронтенд (27 файлов source + 8 файлов тестов + 3 enhancement, ~7 241 source + ~1 247 тестов + ~714 enhancement)

#### Компоненты (14 + 1 enhancement = 15 файлов, 5 202 строки)

| Файл | Строк | Назначение |
|------|:-----:|------------|
| `TranslationPreview.svelte` | 561 | Preview component (quality gate) |
| `TranslationRunResult.svelte` | 464 | Run result display |
| `BulkReplaceModal.svelte` | 396 | Find-and-replace modal |
| `RunTabContent.svelte` | 370 | Run tab content |
| `TargetTabForm.svelte` | 358 | Target language tab form |
| `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 |
| `ConfigTabForm.svelte` | 274 | Configuration tab form |
| `TranslationRunGlobalIndicator.svelte` | 198 | Global run indicator |
| `TranslationMetricsDashboard.svelte` | 184 | Metrics dashboard |
| `InsertMethodSelector.svelte` 🆕 | 185 | Insert method selector (sqllab / direct DB) |
| `TargetSchemaHint.svelte` | 62 | Target schema hint tooltip |

#### Страницы (5 файлов, 1 237 строк)

| Файл | Строк | Назначение |
|------|:-----:|------------|
| `[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 |

#### Settings (1 файл, 385 строк) 🆕

| Файл | Строк | Назначение |
|------|:-----:|------------|
| `routes/settings/ConnectionsTab.svelte` | 385 | Connection management: list, add, edit, test, delete |

#### API client (7 + 1 enhancement = 8 файлов, ~869 строк)

| Файл | Строк | Назначение |
|------|:-----:|------------|
| `translate.ts` | 382 | Main translate API client (+connections methods) |
| `target-schema.ts` | 83 | Target schema API |
| `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-тесты (8 + 1 enhancement = 9 файлов, 1 391 строка)

| Файл | Строк | Назначение |
|------|:-----:|------------|
| `tests/TranslationJobModel.test.ts` | 354 | Job model tests |
| `tests/test_translation_preview.svelte.js` | 199 | Preview component tests |
| `tests/TargetSchemaHint.test.ts` | 158 | Target schema hint tests |
| `tests/InsertMethodSelector.test.ts` 🆕 | 144 | Insert method selector tests |
| `tests/test_correction_cell.svelte.js` | 136 | CorrectionCell tests |
| `tests/test-target-schema.test.ts` | 109 | Target schema API tests |
| `tests/test_bulk_replace_modal.svelte.js` | 97 | BulkReplace modal tests |
| `tests/TranslateHistoryModel.test.ts` | 52 | History model tests |
| `translation.e2e.js` | 142 | E2E: create run, check progress |

---

*Отчёт сгенерирован по результатам анализа spec-файлов и реализованного кода feature 028.  
Актуализация 2026-06-11: добавлен enhancement phase (US11–US12), обновлены метрики (+21 файл, +~3 301 строка, +~16 тестовых файлов).*
