Files
llm/docs/adapter-observer-handoff.md
T
2026-08-14 09:40:51 +03:00

225 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Аналитика адаптера 1С: передача проекта
Дата актуализации: 2026-08-07.
## Назначение
`adapter-observer` — независимый read-only веб-интерфейс аналитики для SQL-only адаптера 1С. Он читает журналы REST и MCP, получает разрешённые снимки метаданных через публичный API адаптера и не имеет прямого доступа к SQL-базе 1С.
Сервис не является зависимостью `adapter-1c-rest` или `adapter-1c-mcp`: остановка либо обновление observer не должна влиять на работу адаптера.
## Описание адаптера 1С
Адаптер 1С — SQL-only сервис для чтения метаданных и выполнения строго контролируемых операций с saved-state конфигурации 1С. Он работает через подтверждённые структуры SQL-хранилища; не запускает Configurator и не должен выдумывать метаданные, маршруты или двоичные payload.
Основные части:
- `adapter-1c-rest` — REST API адаптера;
- `adapter-1c-mcp` — MCP-шлюз, который вызывает REST API;
- `adapter-1c-audit` — аудит-контур REST;
- `adapter-observer` — независимая аналитика журналов и разрешённых read-only вызовов.
Код адаптера находится в текущем репозитории:
```text
plugins/1c/connector/adapter_1c_server.py реализация REST/RPC методов
plugins/1c/connector/contracts/openapi.yaml публичный HTTP-контракт
plugins/1c/mcp/adapter_1c_mcp.py MCP-шлюз
plugins/1c/observer/ аналитика адаптера
```
### Где развёрнут адаптер
| Контур | REST | MCP | Docker-хост | Назначение |
| --- | --- | --- | --- | --- |
| Production / внешний | `http://docker.cin.su:8011` | `http://docker.cin.su:8021/mcp` | `docker.cin.su` | Основной внешний адаптер и observer. |
| Staging / тестовый | `http://docker-test.cin.su:8011` при наличии тестового стека | `http://docker-test.cin.su:8021/mcp` при наличии тестового стека | `test-docker` | Проверка перед production. |
| Изолированная тестовая база | `base_id=upo_test` | через соответствующий MCP | выбранный контур | Разрешены контролируемые тесты и rollback. |
Production-контейнеры на `docker.cin.su`:
```text
adapter-1c-rest порт 8011
adapter-1c-mcp порт 8021
adapter-1c-audit внутренний аудит REST
adapter-observer порт 8031
```
## Как проверять новые функции адаптера
### До развёртывания
1. Изменить реализацию в `plugins/1c/connector/adapter_1c_server.py` и зафиксировать публичный контракт в `plugins/1c/connector/contracts/openapi.yaml`.
2. Добавить либо обновить unit/smoke-тест в `tests/1c/` или `scripts/smoke_1c_*.py`.
3. Для новой метадаты или SQL-маршрута сначала получить доказательства из live SQL в `upo_test`; при неполном codec вернуть `unsupported`/`protocol_incomplete`, а не предполагать данные.
4. Прогнать тесты и smoke-проверку на `upo_test`.
### Staging-проверка
Развернуть обновлённые `adapter-1c-rest` и при необходимости `adapter-1c-mcp` на `test-docker`. Не использовать staging вместо external MCP production без явного запроса.
Проверять новый read-only метод через REST/RPC с явным `base_id=upo_test`. Проверка write-маршрута должна пройти обязательные plan/preflight/apply/rollback-gates и не даёт права заявлять, что Configurator принял или активировал изменение.
Полезные проверки:
```powershell
# Контейнеры и порты выбранного контура
docker --host ssh://test-docker ps --format '{{.Names}} {{.Image}} {{.Status}} {{.Ports}}'
# Контракт/доступные методы на REST
Invoke-WebRequest -UseBasicParsing http://docker-test.cin.su:8011/methods
# Health observer после тестового вызова
Invoke-WebRequest -UseBasicParsing http://docker-test.cin.su:8031/health
```
Пути и аргументы нового метода нельзя составлять по догадке: использовать только его документированный контракт и подтверждённые публичные селекторы.
## Как обновлять аналитику вместе с адаптером
Каждое изменение адаптера нужно оценивать как изменение наблюдаемого контракта.
| Изменение адаптера | Что изменить в observer |
| --- | --- |
| Новый метод аудита или новый статус | Проверить `event_view`, фильтр статусов, группировку summary и русские подписи. |
| Новый read-only метод для объекта | Добавить его в жёсткий allowlist `/api/object/action` только после проверки публичного селектора и безопасного ответа. |
| Новый тип метаданных | Добавить его в `treeGroups`, если он должен быть виден в дереве. |
| Новое поле длительности | Оставить в API машинское значение, а в UI провести через `duration()`. |
| Изменение схемы audit JSONL | Сохранить обратную совместимость: неизвестные поля показывать только в деталях, отсутствующие поля считать необязательными. |
| Новый write-маршрут | Не добавлять кнопку выполнения в observer. Допустимо отобразить только подтверждённую capability/статус после отдельного проектного решения. |
Обязательная последовательность релиза:
1. Сначала обновить адаптер и проверить его новый метод на `upo_test`.
2. Убедиться, что REST/MCP audit содержит безопасную запись вызова без SQL, BSL, payload и секретов.
3. Обновить observer в staging; открыть новый сценарий в UI и проверить, что метод не классифицируется как `exception` ошибочно.
4. Обновить observer на production вместе с совместимой версией адаптера.
5. Проверить `/health`, журнал, аналитику и конкретный объект в дереве.
Observer не должен требовать одновременный рестарт адаптера. При выпуске только frontend/observer достаточно пересоздать `adapter-observer`; REST и MCP остаются запущенными.
## Что сделано
### Интерфейс
- Журнал REST-запросов с фильтрами по методу, базе, статусу, периоду и минимальной длительности.
- Аналитика p50/p95, медленных методов, исключений и ожидаемых безопасных отказов.
- Корреляция MCP ↔ REST по `request_id`.
- Дерево метаданных конфигурации с разделом «Справочники».
- Для каждого доступного справочника отображаются read-only действия:
- Карточка;
- Свойства;
- Реквизиты;
- Формы;
- Команды;
- Модули;
- Макеты;
- Связи.
- Результат действия открывается в диалоге с названием операции, объектом, статусом и длительностью.
- Поиск по уже загруженному списку справочников и счётчик `Показано: N из M`.
### Время выполнения
- Во всех пользовательских представлениях миллисекунды форматируются в секунды, минуты и часы.
- Фильтр минимальной длительности вводится в секундах.
- В технических API-полях сохраняется `duration_ms`: это контрактное машинное значение, не пользовательская подпись.
### Производительность
- Observer отдаёт до 1000 объектов за один запрос к `metadata.objects.list`.
- Для базы `upo` загружается 798 доступных справочников из 825 объектов одного типа одним запросом; 27 объектов скрыты адаптером как отсутствующие/нечитаемые.
- Проверенное время live-сканирования этого списка: около 18,7 секунды. Это время адаптера и SQL-чтения, а не рендеринга кнопок в браузере.
### Безопасность
- Observer вызывает только жёстко заданный allowlist read-only методов для строки справочника.
- Новые действия не выполняют запись, подготовку saved-state, активацию конфигурации или операции Configurator.
- В интерфейсе не восстанавливаются исторические запросы из audit JSONL.
## Что ещё нужно сделать
Приоритетный следующий этап:
1. Добавить быстрый серверный поиск справочника по имени, чтобы не ожидать полное live-сканирование при работе с одним объектом.
2. Добавить отображение прогресса при загрузке больших разделов: число прочитанных объектов, текущая страница и время ожидания.
3. Вынести перечень разрешённых действий и русские названия в отдельную конфигурацию/контракт, а не хранить в фронтенд-коде.
4. Добавить компактные пользовательские карточки результатов действий вместо показа полного JSON; JSON сохранить как диагностическую вкладку.
5. Добавить тесты UI/HTTP для сценария: открыть «Справочники» → загрузить → увидеть кнопки → выполнить «Карточка».
6. Добавить version/release marker в `/health` и UI, чтобы быстро отличать старую Docker-сборку от актуальной.
7. Добавить снимки и сравнение аналитики между релизами: список методов, покрытие метаданных, p50/p95 и изменения ошибок.
8. До публикации вне внутренней сети определить аутентификацию, роли, срок хранения audit-данных и экспортируемые поля.
Не реализовывать без отдельного разрешения:
- повтор исторических write/activation/repository-запросов;
- прямое подключение observer к SQL 1С;
- запуск или автоматизацию Configurator;
- вывод BSL-текста, SQL-полей, паролей или ключей из журналов.
## Исходные файлы
```text
plugins/1c/observer/
observer_server.py HTTP API и безопасный allowlist действий
web/index.html оболочка интерфейса
web/assets/app.js UI, форматирование времени, дерево, действия
web/assets/style.css стили
Dockerfile образ observer
core/deploy/docker/adapter-observer/
compose.yaml отдельный Docker Compose стек
.env.example пример runtime-переменных
docs/runbooks/adapter-observer.md
эксплуатационный контракт и ограничения
```
## Docker-развёртывание
### Текущий production-хост
- Docker host: `docker.cin.su`.
- Контейнер: `adapter-observer`.
- URL: `http://docker.cin.su:8031/`.
- Образ: `adapter-observer:latest`.
- Порт: `8031`.
- Внешняя сеть адаптера: `adapter-1c_default`.
- Read-only тома журналов:
- `adapter-1c_adapter-1c-data``/audit:ro`;
- `adapter-1c-mcp_adapter-1c-mcp-data``/mcp-audit:ro`.
- Собственный state-том: `adapter-observer_adapter-observer-state`.
### Команда обновления
Из корня текущего репозитория:
```powershell
$env:DOCKER_HOST = 'ssh://docker.cin.su'
docker compose `
--project-directory 'Z:\codex\LLM\core\deploy\docker\adapter-observer' `
-f 'Z:\codex\LLM\core\deploy\docker\adapter-observer\compose.yaml' `
up -d --build adapter-observer
```
После обновления:
```powershell
Invoke-WebRequest -UseBasicParsing http://docker.cin.su:8031/health
docker --host ssh://docker.cin.su ps --filter 'name=^/adapter-observer$'
```
Команда пересоздаёт только `adapter-observer`. Не запускать `docker compose down` в проектах REST/MCP адаптера и не перезапускать `adapter-1c-rest` или `adapter-1c-mcp` ради обновления аналитики.
### Тестовый хост
Для staging используется тот же стек с `DOCKER_HOST='ssh://test-docker'` и URL `http://docker-test.cin.su:8031/`.
## Проверки после переноса
1. `GET /health` возвращает `status: ok` и показывает файлы REST/MCP audit.
2. Открыть «Дерево объектов» и загрузить `upo`.
3. Нажать «Читать» у «Справочники»: блок должен остаться раскрытым.
4. Убедиться, что видна строка вида `798 объектов · N с` без единицы `мс`.
5. У первой строки должны быть восемь кнопок действий.
6. Нажать «Карточка»: открывается диалог с успешным статусом и читаемой длительностью.