Discovery of virtual datasets now works, but a runtime blocker remained: any virtual dataset whose SQL exceeds sqlparse's MAX_GROUPING_TOKENS (10000 tokens) raised SQLParseError 'Maximum number of tokens exceeded (10000)' from extract_tables_from_sql_span, which is called unguarded in the scan loop — one oversized virtual dataset aborted the whole maintenance preview/start. - extract_tables_from_sql_span now wraps sqlparse.parse + token walk in try/except and falls back to regex-only extraction (keeping all schema.table matches) instead of raising, so huge SQL no longer fails the scan. - Tier-1 virtual filter uses value "" (not None) so the sql is_not_null filter passes Superset's rison schema instead of always falling back to a full scan. Tests: huge-SQL fallback (extractor) and huge-virtual-dataset scan resilience (scanner). ADR-0020 updated with Decision 3.
51 lines
6.1 KiB
Markdown
51 lines
6.1 KiB
Markdown
# Реестр архитектурных решений
|
||
|
||
ADR фиксирует принятое и проверяемое архитектурное решение. Это не план работ и
|
||
не каталог желаемой архитектуры: обещание, которое ещё не реализовано, должно
|
||
иметь статус `PROPOSED` или быть вынесено в spec.
|
||
|
||
## Статусы
|
||
|
||
| Статус | Значение |
|
||
|---|---|
|
||
| `ACCEPTED` | Решение действует и соответствует реализации. |
|
||
| `PARTIALLY IMPLEMENTED` | Направление принято, но в репозитории есть существенная незавершённая часть. |
|
||
| `SUPERSEDED` | Решение заменено указанным ADR; исторический файл не меняет действующую архитектуру. |
|
||
| `REJECTED` | Альтернатива запрещена; это не описание действующей реализации. |
|
||
| `PROPOSED` | Решение обсуждается и не должно считаться обязательным. |
|
||
|
||
## Актуальный реестр
|
||
|
||
| ADR | Статус | Проверенное содержание |
|
||
|---|---|---|
|
||
| [0001](ADR-0001-module-layout.md) | `PARTIALLY IMPLEMENTED` | Базовое разделение backend/frontend/docs/specs сохранено; точная схема файла устарела. |
|
||
| [0002](ADR-0002-semantic-protocol.md) | `ACCEPTED` | Семантические skills и контракты в исходном коде остаются правилом репозитория. |
|
||
| [0003](ADR-0003-orchestrator-pattern.md) | `ACCEPTED` | Сервис остаётся внешним оркестратором Superset. |
|
||
| [0004](ADR-0004-plugin-architecture.md) | `SUPERSEDED` | Заменён ADR-0016: исходный subprocess/TOML-контракт не был реализован. |
|
||
| [0005](ADR-0005-auth-rbac.md) | `ACCEPTED` | Локальная аутентификация, RBAC и ADFS JIT provisioning реализованы. |
|
||
| [0006](ADR-0006-frontend-architecture.md) | `ACCEPTED` | Svelte 5, Screen Models и UI atoms применяются в frontend. |
|
||
| [0007](ADR-0007-rejected-fromStore-derived.md) | `REJECTED` | Комбинация `fromStore` с несколькими `$derived` запрещена. |
|
||
| [0008](ADR-0008-assistant-tool-registry.md) | `ACCEPTED` | Декораторный registry реализован в `backend/src/api/routes/assistant/_tool_registry.py`. |
|
||
| [0009](ADR-0009-ssl-certificate-management.md) | `ACCEPTED` | Управление корпоративными CA реализовано в Docker и HTTP-клиентах. |
|
||
| [0010](ADR-0010-model-decomposition-gate.md) | `ACCEPTED` | Порог декомпозиции Screen Model остаётся архитектурным ограничением. |
|
||
| [0011](ADR-0011-async-backend.md) | `PARTIALLY IMPLEMENTED` | Async Task Manager, EventBus и bounded executors внедрены; утверждение о полном отказе от sync-кода не подтверждено. |
|
||
| [0012](ADR-0012-superset-testcontainers.md) | `ACCEPTED` | Интеграционные Superset-тесты используют Postgres, init/web контейнеры и `superset_config.py`. |
|
||
| [0013](ADR-0013-coverage-reporting.md) | `ACCEPTED` | `scripts/coverage-summary.sh` существует и собирает сводный отчёт. |
|
||
| [0014](ADR-0014-agent-source-copy-strategy.md) | `SUPERSEDED` | Заменён [ADR-0015](ADR-0015-agent-shared-package-boundaries.md). |
|
||
| [0015](ADR-0015-agent-shared-package-boundaries.md) | `ACCEPTED` | Agent и shared utilities выделены в отдельные installable packages. |
|
||
| [0016](ADR-0016-in-process-plugin-runtime.md) | `ACCEPTED` | Плагины загружаются в процессе из `backend/src/plugins` через `PluginBase`. |
|
||
| [0017](ADR-0017-agent-centric-logging.md) | `ACCEPTED` | Agent-centric traces achieved by editing call sites (meaningful intents, removal of per-request noise) rather than only adding complexity to the logger. |
|
||
| [0018](ADR-0018-rejected-dataset-review.md) | `REJECTED` | Dataset Review is removed from the active product; `specs/027-dataset-llm-orchestration/` is retained only as archived history. |
|
||
| [0019](ADR-0019-dashboard-import-mechanism.md) | `ACCEPTED` | UUID-трансформация БД (не strip_databases), cross-filter patching через IdMappingService, password injection flow (await_input→wait_for_input→retry), разделение dry-run/execute, парсинг имён YAML-файлов БД. |
|
||
| [0020](ADR-0020-maintenance-virtual-dataset-discovery.md) | `ACCEPTED` | Обнаружение виртуальных (SQL) датасетов в maintenance discovery через серверный фильтр `sql is_not_null` (fallback — клиентский скан по непустому `sql`); `AsyncAPIClient.request` поднимает не-2xx ответы (`raise_for_status`); sqlparse token-limit (10000) fallback к regex-only для гигантских виртуальных датасетов. |
|
||
|
||
## Правила сопровождения
|
||
|
||
1. Новый ADR добавляется только для решения, которое меняет границу модулей,
|
||
runtime/topology, безопасность, данные или постоянный способ разработки.
|
||
2. Каждый ADR содержит контекст, решение, последствия и отклонённые альтернативы.
|
||
3. При изменении решения создаётся новый ADR со ссылкой на заменённый, а прежний
|
||
получает `SUPERSEDED`; историю не переписывают.
|
||
4. В ADR указываются существующие пути и проверяемые факты. Версии, пороги и
|
||
команды обновляются вместе с кодом либо заменяются ссылкой на источник истины.
|