# 1C Company Intelligence для AW-rus Этот слой строится **поверх** `clickhouse-1c/` и не трогает саму 1С. Его задача: - анализировать работу с компаниями (`counterparty`); - показывать, где компании выпали из активности; - считать простой, объяснимый прогноз по событиям и activity score; - давать read-only API для AI Investigator и внешних аналитических сервисов. ## Что считается компанией В file-based AWatch-rus контуре компания = `documents.counterparty`, но это поле заполняется **не из бухгалтерских проводок**, а из read-only file-base telemetry. Сейчас есть два связанных слоя: - `documents` - событийный слой; - содержит `CompanyActivitySnapshot`; - `companies` - отдельная read-only business-like таблица по каждой файловой базе; - хранит `owner_user`, `base_path`, `db_size_bytes`, `reglog_size_bytes`, `active_locks`, `temp_db_present`, `scheduler_touched`, `activity_score`. Для `documents` действует telemetry-модель: - `counterparty = infobase`; - `doc_type = CompanyActivitySnapshot`; - `amount` = интегральный `activity score` по изменению базы, росту reglog, lock/temp markers и scheduler activity. То есть это слой прогноза **операционной активности по компаниям/базам**, а не финансовый forecast по первичке. ### Счетчики компаний Важно не смешивать разные счетчики: - `companies_total` в `/api/health` — технический счетчик записей/срезов 1C analytics, а не число компаний в управленческом портфеле; - количество компаний для портала и демонстрации берется из `GET /api/1/analytics-1c/companies/overview` и `analytics_1c.v_company_portfolio_overview`; - если registry и portfolio расходятся, это считается вопросом качества привязок/актуальности 1C analytics, а не ошибкой портала. ## Что добавлено ### ClickHouse Файл: - `clickhouse-1c/clickhouse/init/04_company_intelligence.sql` Создаёт: - `v_companies_current` - `company_forecasts` - `company_health_signals` - `v_counterparty_daily` - `v_counterparty_latest_activity` - `v_company_forecasts_current` - `v_company_health_current` - `v_company_portfolio_overview` ### Forecast refresh Файл: - `clickhouse-1c/ai/refresh_company_intelligence.py` Что делает: - строит daily series по `counterparty`; - учитывает текущее состояние файловой базы из `companies`; - считает базовую линию и линейный тренд; - материализует прогнозы на `7` и `30` дней; - создаёт health-signals: - `inactive_company` - `amount_drop` - `docs_stopped` - `base_busy` - `scheduler_activity` - `open_cases` - `open_detections` ### Read-only API Файл: - `clickhouse-1c/ai/company_intelligence_api.py` Endpoints: - `GET /health` - `GET /api/1/analytics-1c/companies/overview` - `GET /api/1/analytics-1c/companies/{counterparty}/summary` - `GET /api/1/analytics-1c/companies/{counterparty}/forecast` - `GET /api/1/analytics-1c/companies/{counterparty}/timeline` - `GET /api/1/analytics-1c/companies/{counterparty}/actions` - `GET /api/1/analytics-1c/manager/actions` - `GET /api/1/analytics-1c/manager/actions/companies` - `GET /api/1/analytics-1c/manager/brief/latest` - `GET /api/1/analytics-1c/manager/brief/latest.md` - `GET /api/1/analytics-1c/manager/brief/history` - `GET /manager/brief` - `GET /manager/actions` `/manager/brief` — это human-facing browser page для руководителя: - server-rendered HTML; - без frontend build chain и SPA-зависимостей; - опирается на уже сгенерированный `latest.json`; - показывает headline, человеческие комментарии, top risks, top forecasts, действия и свежесть источников; - даёт быстрые ссылки на raw JSON/Markdown и в Grafana. Отдельно появился deterministic слой `manager/actions`: - не зависит от LLM; - строится из `v_company_portfolio_overview`, `business_events`, `document_change_events`, `cases`, `detections`; - показывает очередь действий вида `компания -> почему -> что делать -> кто отвечает -> насколько срочно`. - верхний management-срез теперь enterprise-first: сначала агрегирует необходимые действия по предприятиям, а текущий `owner_name` оставляет вторичным operational metadata. - `GET /api/1/analytics-1c/manager/actions` и `GET /api/1/analytics-1c/manager/actions/companies` теперь явно отдают `priority_model=enterprise_risk` и `owner_mode=secondary_operational_metadata`. ### Executive brief для руководителя Файлы: - `clickhouse-1c/ai/generate_manager_brief.py` - `clickhouse-1c/ai/manager_brief_prompt.md` - `clickhouse-1c/ai/manager_brief_schema.json` - `clickhouse-1c/ops/run_manager_brief.sh` - `clickhouse-1c/ops/aw-1c-manager-brief.service` - `clickhouse-1c/ops/aw-1c-manager-brief.timer` Что делает: - собирает live context по портфелю компаний из `ClickHouse`; - вызывает локальный `codex exec` на `` от пользователя `codex`; - требует structured JSON по schema, а не свободный текст; - рендерит итог в `latest.json` и `latest.md`; - при сбое `codex` даёт deterministic fallback, чтобы контур не оставался пустым. Важно: - `tmux` не является production-зависимостью; - интерактивная сессия `codex` может быть открыта, но pipeline работает через обычный `codex exec`; - service не трогает `1С`, работает только на уже выгруженных read-only данных. ### Ops Файлы: - `clickhouse-1c/ops/run_company_intelligence_refresh.sh` - `clickhouse-1c/ops/run_company_intelligence_api.sh` - `clickhouse-1c/ops/aw-1c-company-api.service` И production writer `aw-1c-ingest-rust` теперь: 1. грузит новые выгрузки; 2. обновляет timeline/detections/cases; 3. применяет `04_company_intelligence.sql`; 4. пересчитывает company forecasts/signals. ## Развёртывание ### 1. Установить зависимости ```bash cd clickhouse-1c python3 -m venv .venv . .venv/bin/activate pip install -r etl/requirements.txt pip install -r ai/requirements.txt ``` ### 2. Применить schema ```bash clickhouse-client --queries-file clickhouse/init/04_company_intelligence.sql ``` ### 3. Пересчитать company intelligence ```bash ./ops/run_company_intelligence_refresh.sh ``` ### 4. Запустить API ```bash ./ops/run_company_intelligence_api.sh ``` ### 5. Сформировать manager brief ```bash ./ops/run_manager_brief.sh ``` По умолчанию: - host: `127.0.0.1` - port: `8710` ## Переменные окружения См.: - `clickhouse-1c/.env.example` Ключевые: - `AW_1C_COMPANY_API_HOST` - `AW_1C_COMPANY_API_PORT` - `AW_1C_COMPANY_LOOKBACK_DAYS` - `AW_1C_COMPANY_MIN_DAYS` - `AW_1C_COMPANY_HORIZONS` - `AW_1C_MANAGER_BRIEF_STATE_DIR` - `AW_1C_MANAGER_BRIEF_MODEL` - `AW_1C_MANAGER_BRIEF_CODEX_USER` - `AW_1C_MANAGER_BRIEF_CODEX_BIN` - `AW_1C_MANAGER_BRIEF_WORKDIR` - `AW_1C_MANAGER_BRIEF_TOP_LIMIT` - `AW_1C_MANAGER_BRIEF_FRESHNESS_HOURS` - `AW_1C_MANAGER_BRIEF_TIMEOUT_SEC` - `AW_1C_MANAGER_BRIEF_RUN_AFTER_INGEST` ## Что уже есть в live payload В live `overview/summary` теперь идут не только прогнозы, но и текущее состояние файловой базы компании: - `company_name` - `owner_user` - `base_path` - `current_status` - `db_size_bytes` - `reglog_size_bytes` - `active_locks` - `current_activity_score` ## Что прогноз реально означает Это не black-box ML и не «магический AI». Сейчас используется объяснимый MVP: - daily baseline; - linear trend; - confidence; - health signals на простых правилах. Этого достаточно для: - раннего обнаружения выпадения компаний из потока; - ранжирования портфеля; - AI summary поверх уже объяснимых чисел. ## Ограничения - в file-based telemetry `amount` означает `activity score`, а не деньги; - прогноз показывает тенденцию активности компании/базы, а не финансовое обещание; - API строго read-only; - никакой записи обратно в 1С нет.