# AWatch-rus: Единая рабочая модель системы Дата фиксации: `2026-05-24` Последнее runtime-уточнение: `2026-05-30` Этот файл предназначен как единая рабочая опора по `AWatch-rus`: что именно входит в систему, где это живет, каким инструментарием проект надо планировать и сопровождать, и какой операционный контур считать промышленным. Если старые документы расходятся с этим файлом по адресам или runtime-ролям, для текущей эксплуатации приоритет у этого файла. Связанная security-основа: `docs/THREAT_MODEL_RU.md` фиксирует текущую операционную модель угроз. Это рабочая модель для платформы операционного контроля и технического аудита, а не формальная сертификационная модель ФСТЭК. Связанное продуктовое позиционирование: `docs/RUSSIAN_SOFTWARE_REGISTRY_POSITIONING_RU.md` фиксирует безопасный заход для реестра российского ПО: AWatch-rus как платформа операционного контроля и управления ИТ-инфраструктурой, с ориентиром на класс `09.10`, без заявления сертифицированной DLP/SIEM/EDR/XDR/СЗИ. Нейминг для внешних материалов: `AWatch-rus` - продукт, `AWatch-rus` - репозиторий и техническая база. Рекомендуемая формула: `AWatch-rus, программный комплекс на базе AWatch-rus`. ## 1. Назначение `AWatch-rus` в этом репозитории это не только `ActivityWatch Server`. Это полный production-контур: - сбор активности и DLP-сигналов с Windows/RDP; - сервер `AW-rus` с RU WebUI, API, health и management-отчетами; - операторский узел `Proxmox/DetMirAuto`; - сетевой контур `pfSense + OpenVPN`; - Telegram bot для инцидентов, auto-heal, recovery и операционных команд; - `Hayabusa` как DFIR enrichment слой; - визуализация и аналитика в `Grafana`; - отдельный `1C/file analytics` контур через `ClickHouse/Grafana/API`. Цель проекта: - держать рабочий production-контур без дрейфа между кодом, runtime и документацией; - обеспечивать управляемый deploy, health-check, auto-heal и incident response; - поддерживать дальнейшее развитие без разрушения текущей рабочей системы. ## 2. Текущий подтвержденный runtime Ниже не историческая схема, а рабочая опорная карта. | Узел | Роль | |---|---| | `` | `pfSense`, firewall, VPN, ACL, OpenVPN export target | | `` | `Proxmox/DetMirAuto`, web gateway, Telegram bot, operator entrypoint | | `` | основной `AW-rus` server, health, worktime/reporting, `Hayabusa` server-side processing | | `` | `HOST-EXAMPLE`, Windows/RDP host, collectors, worktime session path, EVTX export | Практический вывод: - серверный путь `AW-rus` сейчас должен считаться ``; - операторский и gateway-контур должен считаться ``; - Windows production-host для `AWatch-rus` сейчас ``, а не старые упоминания ``. ### 2.1 Runtime snapshot после полной проверки 2026-05-28 Проверка выполнялась как production-contour test, а не только как HTTP ping. Покрыты: - `AW-rus` API/WebUI на `:5600`; - worktime/management API на `:5610`; - Windows/RDP host `` через WinRM/SSH/Scheduled Tasks; - `1C/file analytics` backend на `:8710`; - Proxmox/nginx gateway на ``; - Grafana на `:3000`; - browser smoke через Playwright по operator-facing страницам. Фактический результат после стабилизации: | Проверка | Результат | |---|---| | `./check-aw-full.sh` | `FRESH=8 STALE=0 DEAD=0` | | `aw-rus-healthd.py --json` | `ok=13 warn=0 fail=0` | | `dlp-health-check --json` | `ok=20 warn=0 fail=0` | | `systemctl --failed` на `` | `0 loaded units listed` | | Playwright browser smoke | `14/14` страниц открылись | | Grafana authenticated API/UI smoke | login OK, `19` dashboards в `/api/search`, все ключевые `1C File`/`AWatch-rus` dashboards открылись | | Grafana datasource health | `OK` для `clickhouse-1c`, `InfluxDB-AW`, `loki`, Proxmox/pfSense Influx datasources | | Python unit tests по AW server/worktime/DLP/exporters | `36 passed` | | `proxmox.test_tsj_guardian_bot` | `25 tests OK` | | Windows `ActivityWatch Recovery` | `Last Result: 0` | Ключевые runtime-факты на момент фиксации: - `activitywatch-server`, `aw-worktime-api`, `aw-worktime-ui-bridge.timer`, `aw-worktime-autoheal.timer` активны; - свежие buckets: `aw-watcher-afk_*`, `aw-watcher-window_*`, `aw-worktime-sessions_*`, `aw-dlp-endpoint-signals_*`; - `aw-dlp-incidents_*`, `aw-dlp-review_*`, `aw-dlp-rules_*` могут быть event-driven и не обязаны двигаться каждую минуту; - Grafana dashboards без авторизации корректно редиректят на login, это не считается отказом; с сохраненной admin-учеткой проверены фактические страницы и datasource health; - gateway `/go/file1c-brief`, `/go/file1c-actions`, `/go/aw-ui` ведет на рабочие внутренние surface. ### 2.3 Runtime-семантика операторских сигналов от 2026-05-30 После Phase 8 операторские проверки должны читаться по смыслу статуса, а не только по возрасту последнего события. | Статус | Как трактовать | |---|---| | `FRESH` | Данные свежие, источник сейчас активен или недавно обновлялся. | | `INACTIVE` | Нормальное состояние для desktop/window/DLP endpoint buckets, если worktime-сессия свежая, но интерактивной активности нет. Это не инцидент. | | `EVENT-DRIVEN` | Нормальное состояние для buckets, которые пишутся только при событии: `aw-session-events_*`, `aw-dlp-incidents_*`, `aw-dlp-review_*`, `aw-dlp-rules_*`. Отсутствие новых событий само по себе не отказ. | | `STALE` | Потенциальная деградация активного источника; проверять collector/session placement. | | `DEAD` / `EMPTY` | Отказ или неинициализированный обязательный источник; требуется диагностика. | Операторские правила: - `./check-aw-full.sh` с `FRESH=8 STALE=0 DEAD=0` считается зеленым контуром, даже если отдельные строки показывают `INACTIVE` или `EVENT-DRIVEN`. - `./check-aw-data.sh` должен использовать ту же семантику, что и full-check; `EVENT-DRIVEN` и `INACTIVE` не являются поводом для ручного recovery. - SLO-строка бота `aw_rus_slo: recovered ... current_sample=OK ... budget_remaining_seconds<0` означает исторически сожженный error budget при здоровом текущем контуре. Это не активная авария. - SLO становится инцидентом только при текущем `current_sample=FAIL` и исчерпанном бюджете или при stale SLO summary. - `aw-browser-smoke.timer` хранит ограниченное число запусков через `AW_BROWSER_SMOKE_KEEP_RUNS` и ограничен `TimeoutStartSec=180`; рост `/var/lib/activitywatch/browser-smoke` выше нескольких сотен MB надо считать regression в retention/config. ### 2.2 Стабилизация management report, bridge и recovery от 2026-05-28 До стабилизации слабые места были такими: - холодный `management report` на `:5610` занимал примерно `38-58s`; - `aw-worktime-autoheal` мог считать тяжелый management warm частью health-check и перезапускать `aw-worktime-api`; - `aw-worktime-ui-bridge.service` периодически ловил `start-limit-hit`, хотя затем восстанавливался; - Windows task `ActivityWatch Recovery` оставался с `Last Result: 1`, несмотря на зеленый основной сбор данных. Что изменено: | Компонент | Файл | Решение | |---|---|---| | Management report API | `aw-server/aw-worktime-api.py` | Добавлены in-process events cache, build lock на `(host, report_date)`, переиспользование уже построенного payload для trend и чтение historical cache без TTL. | | Autoheal | `aw-server/aw-worktime-autoheal.sh` | Management warm больше не является обязательным health probe; timeout warm увеличен до `60s`. | | Worktime UI bridge | `aw-server/aw-worktime-ui-bridge.service` | `StartLimitBurst` поднят до `20`, чтобы штатные timer-запуски не переводили unit в `start-limit-hit`. | | Windows recovery | `windows/ActivityWatch.Windows.Common.psm1` | Усилен hidden wrapper, добавлен fallback через `schtasks.exe`, recovery task выбирает live interactive user, если SYSTEM path на хосте проблемный. | Измеренный эффект: | Сценарий | До | После | |---|---:|---:| | Cold/cold-ish management JSON | `38-58s` | около `11s` на сервере | | Повторный management JSON из cache | нестабильно | около `0.006s` на сервере | | Внешний первый request | до `58s` | около `18.9s` | | Внешний повторный request | нестабильно | около `0.215s` | Операционное ограничение: - полный `hardening-recovery.ps1` на Windows host может упираться в CIM/ScheduledTasks `message filter`; - для текущего production recovery закреплен рабочий путь через `schtasks.exe` и live interactive admin principal; - не запускать полный hardening-прогон без причины, если buckets свежие и `ActivityWatch Recovery` уже `Last Result: 0`. ## 3. Полный функциональный состав AWatch-rus ### 3.1 Ядро AW-rus | Функция | Где реализована | |---|---| | ActivityWatch API и WebUI | `aw-server/`, `activitywatch-server.service` | | RU WebUI patch | `aw-server/`, `docs/FULL_DEPLOYMENT_MANUAL_RU.md` | | DLP overlay в WebUI | `aw-server/`, buckets `aw-dlp-review_*`, `aw-dlp-rules_*` | | Health daemon | `aw-server/aw-rus-healthd.py` | | Расширенный health-check | `aw-server/health-check.sh`, `check-aw-full.sh`, `check-aw-data.sh` | | Management/worktime reports | server-side API на `:5610`, `docs/runbook.md`, `docs/worktime_aql_detmir.md` | ### 3.2 Windows/RDP контур | Функция | Где реализована | |---|---| | Массовый deploy | `windows/deploy-domain-users.ps1`, `windows/deploy-ensemble.ps1` | | Single-user deploy | `windows/deploy-single-user.ps1` | | Validation | `windows/validate-deployment.ps1` | | Recovery/hardening | `windows/hardening-recovery.ps1` | | AFK/window watchers | `ActivityWatch` watchers + scheduled tasks | | Browser domains | `windows/browser-domains-native-collector.ps1` | | DLP endpoint signals | `windows/dlp-endpoint-signals-collector.ps1` | | Email/DLP path | `windows/email-outbound-collector.ps1` | | Worktime session presence | `windows/worktime-session-collector.ps1` | | Incident artifacts / screenshots / EVTX export | `windows/export-evtx-for-hayabusa.ps1` и related runtime scripts | ### 3.3 DLP и расследование | Функция | Где реализована | |---|---| | Endpoint DLP сигналы | bucket `aw-dlp-endpoint-signals_*` | | DLP incidents | bucket `aw-dlp-incidents_*` | | Review/rules operator flow | buckets `aw-dlp-review_*`, `aw-dlp-rules_*`, WebUI overlay | | DLP report/scheduler | `aw-server` runtime + tests/docs | | Transport/self-test telemetry | `aw-health-check` и Windows transport telemetry | | Incident follow-up | operator path + `Hayabusa` enrichment | ### 3.4 Worktime и managerial layer | Функция | Где реализована | |---|---| | Presence по RDP-сессиям | bucket `aw-worktime-sessions_*` | | Работа по окнам/AFK | buckets `aw-watcher-window_*`, `aw-watcher-afk_*` | | Web category worktime | bucket `aw-detmir-web-category_*` | | AQL-шаблоны | `docs/worktime_aql_detmir.md` | | Management report API | `:5610/reports/worktime/management` | | Owner/department reporting | aliases и manager-facing filters в server-side report layer | ### 3.5 Proxmox / operator / bot | Функция | Где реализована | |---|---| | LXC/bootstrap/deploy | `proxmox/create-ct.sh`, `proxmox/push-aw-artifacts.sh`, `ansible/` | | Telegram incident bot | `proxmox/tsj_guardian_bot.py` | | Auto-heal и recovery path | `tsj_guardian_bot.py`, `.planning/phases/02-operator-bot-recovery/` | | OpenVPN config generation/export | `proxmox/pfsense_openvpn_client_export.php`, bot runtime | | Proxmox restore/snapshot operator flow | bot pending restore flow + playbooks/runtime | | Web gateway / internal entrypoint | `docs/runbook.md`, nginx/gateway rollout | ### 3.6 pfSense / network / VPN | Функция | Где реализована | |---|---| | Firewall/ACL | `pfSense` ruleset | | OpenVPN user access | `pfSense` + bot export path | | pfSense telemetry в AW | `pfsense/pfsense-aw-poller.py`, `docs/pfsense.md` | | Buckets `aw-pfsense-*` | health/interfaces/gateways | | Routing between server and Windows | `pfSense` rules, не Windows-local hacks | ### 3.7 Форензика Windows логов (Hayabusa) | Функция | Где реализована | |---|---| | EVTX export на Windows | `windows` runtime/export scripts | | Intake на сервере | ``, drop/inbox flow | | Processing/reporting | `aw-hayabusa`, `/opt/hayabusa`, server-side services | | Bounded integration с AW-rus | `docs/hayabusa-aw-rus-integration-2026-05-14.md` | | Operator guidance | `docs/hayabusa-operator-ib-guide-2026-05-14.md`, `docs/runbook.md` | Ключевая граница: - `Hayabusa` это enrichment для incident/forensics; - это не замена обычного realtime health/collector/DLP runtime. ### 3.8 Grafana / monitoring / 1C analytics | Контур | Когда использовать | |---|---| | `grafana/` dashboards | AW-rus runtime, RDP activity, DLP, management/security overview | | `grafana-1c/` | когда есть удобный SQL/read-only KPI путь из 1С | | `clickhouse-1c/` | когда 1С файловая и нужен audit/timeline/detections/cases слой | По `clickhouse-1c/`: - это отдельный industrial scaffold для `file-1C analytics`; - он не заменяет AW-rus, а добавляет audit/timeline/cases/company-intelligence контур; - строится вокруг `landing -> ETL -> ClickHouse -> Grafana + AI Investigator`. ## 4. Главные пользовательские и операторские входы Внутренний операторский доступ должен идти через VPN/внутреннюю сеть, не через случайно открытые наружу порты. Базовые входы: - `https:///` — gateway; - `https:///go/proxmox-gui` — Proxmox GUI; - `https:///go/file1c-brief` — management/file-1C brief; - `https:///go/file1c-actions` — actions; - `http://:5600/api/0/info` — AW-rus API health; - `http://:5610/reports/worktime/management` — management reporting API. Telegram bot `DetMirAuto` обязан покрывать: - incident detection; - `/ack`, `/heal`, `/run check`, `/run support`, `/run fallback`, `/status`; - `/aw_dlp_check`, `/dlp_mode`, `/dlp_mode_toggle` для операторского DLP-контура; - OpenVPN config issuance/export; - operator-safe workflows по recovery и restore; - отсутствие ложных алертов при transient self-heal. Операторская семантика меню бота: - DLP-кнопка обязана показывать текущий режим и следующее действие: - `DLP сейчас: наблюдение | включить блокировку` - `DLP сейчас: блокировка | включить наблюдение` - `DLP сейчас: смешанный | выровнять в блокировку` - Кнопка `Форензика Windows логов` — человеко-понятный вход в bounded Hayabusa path для Windows EVTX / DFIR follow-up. - Если Telegram-клиент держит устаревшую custom-keyboard, оператор должен нажать `Статус` или `/start`: бот обязан переслать свежую клавиатуру с актуальным DLP label. ## 5. Промышленный набор инструментов для планирования и сопровождения Ниже минимальный правильный стек, который стоит считать базовым для `AWatch-rus`. ### 5.1 Обязательное ядро GSD Эти компоненты нужны постоянно: - `gsd-phase` - `gsd-plan-phase` - `gsd-planner` - `gsd-phase-researcher` - `gsd-plan-checker` - `gsd-execute-phase` - `gsd-executor` - `gsd-verifier` - `gsd-verify-work` - `gsd-review` - `gsd-code-reviewer` - `gsd-code-fixer` - `gsd-debug` - `gsd-debugger` - `gsd-secure-phase` - `gsd-security-auditor` ### 5.2 Нужные supporting-компоненты - `gsd-doc-writer` - `gsd-doc-synthesizer` - `gsd-doc-verifier` - `gsd-integration-checker` - `gsd-intel-updater` - `gsd-codebase-mapper` Для UI-фаз подключать только по необходимости: - `gsd-ui-phase` - `gsd-ui-researcher` - `gsd-ui-checker` - `gsd-ui-auditor` ### 5.3 Операционные skills для живого AWatch-rus - `aw-ops-checks` - `aw-russian-collectors-guard` - `bot` - `autonomous-skill` для длинных recovery/ops-циклов ### 5.4 Что не нужно включать в базовый industrial-контур По умолчанию не поднимать как обязательную часть процесса: - `gsd-fast` - `gsd-quick` - `gsd-sketch` - большинство `gsd-ns-*` - `gsd-workstreams` Причина простая: - `AWatch-rus` уже не greenfield и не playground; - лишняя оркестрация здесь опаснее, чем полезна; - нужен жесткий управляемый контур, а не разросшийся набор экспериментальных режимов. ## 6. Что именно надо реанимировать из .codex Практическая схема такая: - использовать agent-описания из `/agents/gsd-*` как действующее ядро исполнителей; - вернуть orchestrator-skills из `/skills_disabled/2026-05-21-current-prune/` для верхнеуровневого workflow; - hooks `gsd-phase-boundary.sh`, `gsd-statusline.js`, `gsd-workflow-guard.js` держать как сервисную обвязку, а не как замену основному процессу. Минимум к восстановлению как orchestrator layer: - `gsd-phase` - `gsd-plan-phase` - `gsd-execute-phase` - `gsd-review` - `gsd-verify-work` - `gsd-debug` - `gsd-secure-phase` - `gsd-ui-phase` ## 7. Рабочий lifecycle для AWatch-rus ### 7.1 Планирование Каждая нетривиальная работа должна идти через фазу, а не через бессистемные правки. Обязательная цепочка: 1. зафиксировать изменение в `.planning/ROADMAP.md` и состоянии проекта; 2. открыть фазу в `.planning/phases/-/`; 3. собрать `PLAN.md` через `gsd-plan-phase`; 4. выполнить research/check loop до defensible плана; 5. только после этого идти в выполнение. ### 7.2 Исполнение Исполнение должно идти волнами, а не одним большим неоткатываемым махом. Обязательные правила: - backup-first перед risky runtime changes; - server/network/windows changes не смешивать без явной причины; - после каждого meaningful шага оставлять проверяемый след в артефактах и сервисных логах; - не считать задачу завершенной без реальной проверки на живом контуре. ### 7.3 Проверка и приемка После выполнения обязательно: - `gsd-verifier` на достижение целевого эффекта; - `gsd-review` на код/риск/регрессии; - `gsd-verify-work` на пользовательскую приемку; - `gsd-secure-phase`, если фаза трогала сеть, доступы, VPN, secrets, bot, `pfSense`, `Windows` admin path. ### 7.4 Документация После фазы обновлять не “когда-нибудь”, а сразу: - runbook; - relevant docs; - phase `SUMMARY.md`; - если нужно, `STATE.md` и `ROADMAP.md`. Для `AWatch-rus` это обязательно, потому что основная историческая боль проекта была не в отсутствии кода, а в расхождении между repo, runtime и реальностью. ## 8. Базовый комплект артефактов Для каждой фазы и для всей системы нужны конкретные файлы, а не размытые договоренности. | Артефакт | Назначение | |---|---| | `.planning/ROADMAP.md` | очередь и границы проекта | | `.planning/STATE.md` | текущее состояние production-контура | | `.planning/phases/-/PLAN.md` | исполнимый план | | `.planning/phases/-/SUMMARY.md` | факт выполненного | | `VERIFICATION.md` | доказательство результата | | `REVIEW.md` | findings по code/review | | `SECURITY.md` | security findings по risky фазам | | `UAT.md` | операторская приемка | | `docs/runbook.md` | живая эксплуатация | | `docs/THREAT_MODEL_RU.md` | рабочая модель угроз и границы security-позиционирования | | `docs/RUSSIAN_SOFTWARE_REGISTRY_POSITIONING_RU.md` | стратегия позиционирования для реестра российского ПО | | `docs/ADMIN_GUIDE_RU.md` | руководство администратора | | `docs/OPERATOR_GUIDE_RU.md` | руководство оператора | | `docs/INSTALL_RU.md` | установка и первичная проверка | | `docs/ARCHITECTURE_RU.md` | продуктовая архитектура | | `docs/OWNERSHIP_RU.md` | правообладание и состав продукта | | `docs/THIRD_PARTY_LICENSES_RU.md` | сторонние компоненты и license-audit baseline | | `docs/REGISTRY_CHECKLIST_RU.md` | чек-лист подготовки к реестру российского ПО | | этот файл | единая карта системы и рабочего процесса | ## 9. Операционный минимум, который нельзя терять Система считается реально сопровождаемой только если одновременно живы все эти контуры: - `AW-rus API` отвечает; - buckets по `afk/window/worktime/DLP` свежие; - `aw-rus-healthd` и `aw-health-check` не врут и не шумят ложными fail; - Telegram bot не генерирует ложные auto-heal incidents; - `pfSense` ACL соответствуют фактическому runtime; - есть рабочий Windows deploy/validate/recovery path; - есть рабочий `Hayabusa` follow-up path; - Grafana/importable dashboards version-controlled; - management/reporting path на `:5610` не сломан; - docs и phase-artifacts отражают реальное состояние, а не прошлую эпоху. ## 10. Что считать правильным направлением развития Приоритет для `AWatch-rus` сейчас такой: 1. не расширять систему ценой потери baseline stability; 2. сначала держать зеленым production runtime; 3. потом усиливать regression guards и operator path; 4. затем развивать `DLP`, `management`, `Hayabusa`, `file-1C analytics`; 5. любой новый слой вводить только так, чтобы он не ломал существующий recovery path. ## 11. Краткое правило принятия решений Если есть выбор между: - “быстро добавить еще один контур”; - и “сделать существующий контур проверяемым, документированным и устойчивым”, для `AWatch-rus` правильный выбор почти всегда второй. Это и есть промышленный режим сопровождения этой системы.