# AWatch-rus: Отчет по изменениям за последние 24 часа

Дата фиксации: `2026-05-26 07:55 MSK`

## Источники

- `tmux` session `codex`, scrollback выгружен в `/tmp/codex-tmux-last24.txt`
- текущий worktree `git status` в `<PROJECT_ROOT>`
- live-проверки на:
  - `<GATEWAY_HOST>` Proxmox
  - `<GRAFANA_HOST>` Grafana
  - `<AUX_SERVICE_HOST>` Loki/Alloy
  - `<AW_SERVER_HOST>` aw-server
  - `<FIREWALL_HOST>` pfSense
  - `<WINDOWS_HOST>` Windows RDP host

## Важная оговорка

`git log --since='24 hours ago'` пустой: за последние сутки изменения не были оформлены git-коммитами.

Рабочее дерево уже грязное и содержит больше изменений, чем было сделано в этом 24-часовом окне. Поэтому ниже зафиксированы только те изменения, которые явно подтверждаются `tmux`-историей и live-проверками.

## Что было сделано

### 1. Восстановление ActivityWatch-Russian

Симптом:
- на `<AW_SERVER_HOST>:5600` UI не обновлялся для `HOST-EXAMPLE`;
- `aw-server` был жив, но stale были `aw-watcher-afk`, `aw-watcher-window`, `aw-worktime-sessions`.

Действия:
- проверен `aw-server` и свежесть bucket’ов;
- через WinRM на `<WINDOWS_HOST>` проверены процессы, tasks и recovery-скрипты;
- запущены:
  - `ActivityWatch Recovery`
  - `ActivityWatch Launch [HOST-EXAMPLE_user5]`
- отдельно перезапущен зависший `worktime-session-collector`.

Итог:
- `aw-watcher-afk`, `aw-watcher-window`, `aw-session-events`, `aw-dlp-endpoint-signals`, `aw-worktime-sessions` снова стали fresh;
- итоговая серверная сводка: `FRESH=8 STALE=0 DEAD=0`.

### 2. Дополнена авто-сигнализация и самолечение `tsj-guardian-bot`

Проблема:
- фоновый цикл бота не видел stale AW collector bucket’ы;
- manual AW-check был отдельным путем и не участвовал в обычном incident/heal flow.

Сделано:
- в `tsj_guardian_bot.py` добавлен разбор `[FAIL] aw-rus:*`;
- AW collector freshness включен в стандартный background check cycle;
- добавлен Windows recovery path для:
  - `watcher-*`
  - `worktime-session-collector`
- добавен server-side rebuild worktime views после Windows remediation;
- тесты обновлены и прогнаны.

Затронутые файлы:
- [proxmox/tsj_guardian_bot.py](<PROJECT_ROOT>/proxmox/tsj_guardian_bot.py)
- [proxmox/test_tsj_guardian_bot.py](<PROJECT_ROOT>/proxmox/test_tsj_guardian_bot.py)
- [ansible/deploy_tsj_guardian_bot_proxmox.yml](<PROJECT_ROOT>/ansible/deploy_tsj_guardian_bot_proxmox.yml)
- [ansible/group_vars/proxmox-bot.example.yml](<PROJECT_ROOT>/ansible/group_vars/proxmox-bot.example.yml)

Проверка:
- `python3 -m py_compile proxmox/tsj_guardian_bot.py proxmox/test_tsj_guardian_bot.py`
- `python3 -m unittest proxmox.test_tsj_guardian_bot`
- `tsj-guardian-bot.service` перезапускался и работал в `active`.

### 3. Бот переведен на `igor` вместо `codex`

Проблема:
- production bot был завязан на `AI_EXEC_USER=codex`, `TMUX_USER=codex` и read-only пути под `/home/codex/infra-admin`;
- это ломало встроенный `codex-cli` support path после перехода на `igor`.

Сделано:
- переключены:
  - `AI_EXEC_USER=igor`
  - `TMUX_USER=igor`
  - `AI_CHAT_WORKDIR=<OPERATOR_HOME>`
- добавлены настраиваемые:
  - `PFSENSE_ENV_PATH`
  - `PFSENSE_INVENTORY_PATH`
- создан `igor`-readable bundle:
  - `<OPERATOR_HOME>/.config/tsj-bot/pfsense.env.readonly`
  - `<OPERATOR_HOME>/.config/tsj-bot/inventory.md`

Итог:
- диалоговая техподдержка и AI-эскалация в боте работают от `igor`;
- bot-side pfSense/inventory контекст больше не зависит от старого `codex`-домика.

### 4. Исправлен сетевой доступ `<GATEWAY_HOST> -> <WINDOWS_HOST>`

Root cause:
- на `pfSense <FIREWALL_HOST>`, интерфейс `opt1/MGMT`:
  - allow rule для `<GATEWAY_HOST> -> <WINDOWS_HOST>:22` был ниже `block all`;
  - allow rule для `<GATEWAY_HOST> -> <FIREWALL_HOST>:2022` был ниже `block all`;
  - rule для `<GATEWAY_HOST> -> <WINDOWS_HOST>:5985` отсутствовал.

Сделано:
- подняты нужные allow rules выше `block all`;
- добавлено недостающее правило на `5985`.

Итог:
- с `<GATEWAY_HOST>` подтвержден доступ на:
  - `<FIREWALL_HOST>:2022`
  - `<WINDOWS_HOST>:22`
  - `<WINDOWS_HOST>:5985`
- SSH вход на `<WINDOWS_HOST>` под `Администратор` был подтвержден.

### 5. Убрано ложное сообщение “автолечение невозможно”

Причина:
- в production `.env` бота была повреждена строка `AW_RUS_WORKTIME_HEAL_CMD`;
- бот слишком жестко реагировал на единичный таймаут worktime CSV.

Сделано:
- восстановлен `AW_RUS_WORKTIME_HEAL_CMD`;
- добавлен retry для получения worktime CSV;
- обновлены дефолты под `igor`.

Итог:
- `pending_incident = null`;
- циклы снова идут как `Check OK`.

### 6. Наведен порядок в Grafana folder/dashboard catalog

Изменения:
- folder `AWatch-rus` переименован в `DLP`;
- `pfSense System Dashboard` перенесен в folder `pfSense`;
- `LXC Containers Monitoring` перенесен в folder `LXC`;
- `Proxmox Influx 2.0 Dashboard` перенесен в folder `LXC`.

### 7. Починен `pfSense Logs Dashboard All Logs`

Проблема была не в Grafana, а в цепочке `pfSense -> Alloy -> Loki`.

Сделано:
- на `<FIREWALL_HOST>` поднят `syslogd`;
- на `<AUX_SERVICE_HOST>` в Alloy для pfSense syslog включен правильный формат `rfc3164`;
- отключен stale docker self-scrape path, забивавший `loki.write` старыми batch’ами;
- перезапущен `alloy`.

Итог:
- появились живые `job="pfsense"` streams в Loki;
- дашборд `pfSense Logs Dashboard All Logs` перестал быть пустым.

### 8. Починен `1C File - Operations Health`

Проблема:
- не обновлялись данные в `1C File - Operations Health`.

Сделано на `<WINDOWS_HOST>`:
- exporter больше не падает на недоступных `ibases.v8i`;
- `export-upload-file-1c-telemetry.ps1` научен брать `remoteKeyPath` из `deployment-config.json`;
- рабочий ключ закреплен как `C:\Users\USER1\.ssh\awops_ed25519`;
- исправлены права к `file1c-telemetry-state.json`.

Сделано на `<GATEWAY_HOST>`:
- прогнан ingest;
- `proofcheck` выведен в green.

Затронутые файлы:
- [windows/export-upload-file-1c-telemetry.ps1](<PROJECT_ROOT>/windows/export-upload-file-1c-telemetry.ps1)
- [ansible/deploy_file_1c_windows_telemetry.yml](<PROJECT_ROOT>/ansible/deploy_file_1c_windows_telemetry.yml)

Итог:
- `1C File - Operations Health` снова обновляется;
- свежесть downstream была подтверждена через ingest и proofcheck.

### 9. Рабочие ключи выданы всем пользователям Windows-хоста

Сделано:
- ключ `awops_ed25519` разложен по локальным профилям:
  - `USER1`
  - `USER2`
  - `USER3`
  - `USER4`
  - `USER5`
  - `Администратор`
- `remoteKeyPath` перестал быть жестко привязан только к `USER1`;
- права на `file1c-telemetry-state.json` выданы рабочим пользователям.

Итог:
- схема больше не зависит от одного профиля;
- scheduled upload path продолжает работать.

### 10. Поднят management board по файловой 1С

Сделано:
- добавлен новый Grafana dashboard `1C File - Management Board`;
- обновлены manager brief links и gateway route.

Live-итог:
- `uid=1c-file-mgmt`
- `go/grafana-1c` редиректит на новый board

### 11. Поднят первый financial board по файловой 1С

Сделано:
- добавлен SQL слой:
  - [clickhouse-1c/clickhouse/init/05_financial_reporting.sql](<PROJECT_ROOT>/clickhouse-1c/clickhouse/init/05_financial_reporting.sql)
- добавлен dashboard:
  - [clickhouse-1c/grafana/provisioning/dashboards/files/1c-financial-reporting.json](<PROJECT_ROOT>/clickhouse-1c/grafana/provisioning/dashboards/files/1c-financial-reporting.json)
- обновлен gateway route:
  - `go/file1c-finance`

Итог:
- financial screen работает как честный transitional layer;
- live readiness была `proxy_only`;
- `postings_table_rows = 0`, то есть настоящие проводки еще не поступают.

### 12. Проведено расследование production-source для `postings`

Что подтверждено на `<WINDOWS_HOST>`:
- готового `toolkit`/REST/service под postings нет;
- порт `6003` и типовые service-порты не слушаются;
- текущий Windows upload path шлет только telemetry/snapshot, без `postings`.

Что проверено:
- наличие `1C 8.3.27` и `comcntr.dll`;
- COMConnector в user-token path;
- интерактивные scheduled tasks под `USER1`;
- явные 1С-креды:
  - `Администратор / <WINDOWS_PASSWORD>`
  - `user / <WINDOWS_PASSWORD>`
  - `user1 / <WINDOWS_PASSWORD>`

Итог:
- blocker остался прежним: нужен реальный пользователь 1С с read-only доступом;
- без него production extractor проводок не собрать.

### 13. Поднят отдельный `1C File - Telemetry Board`

Сделано:
- добавлен новый dashboard:
  - [clickhouse-1c/grafana/provisioning/dashboards/files/1c-telemetry-board.json](<PROJECT_ROOT>/clickhouse-1c/grafana/provisioning/dashboards/files/1c-telemetry-board.json)
- добавлена ссылка на него из `1C File - Management Board`;
- добавлен gateway route:
  - `go/file1c-telemetry`

Live-итог:
- в Grafana зарегистрирован `uid=1c-file-telemetry`;
- все 1C dashboards лежат в folder `1C File Analytics`;
- `https://<GATEWAY_HOST>/go/file1c-telemetry` редиректит на новый board.

### 14. Live-путь `1C File Analytics` в Grafana был приведен к устойчивому состоянию

Выяснилось:
- file-based provisioning на `<GRAFANA_HOST>` не был основной точкой для 1C dashboards;
- текущие `file-1c` dashboards жили в DB Grafana.

Сделано:
- на CT201 добавлен отдельный provisioning provider `1C File Analytics`;
- в него выложены:
  - `1c-management-board.json`
  - `1c-telemetry-board.json`
- `grafana-server` перезапущен;
- через SQLite БД Grafana подтверждено наличие:
  - `1c-file-mgmt`
  - `1c-file-finance`
  - `1c-file-ops`
  - `1c-file-telemetry`
  - folder `file-1c / 1C File Analytics`

## Файлы, которые точно редактировались в этом окне по данным tmux

- [proxmox/tsj_guardian_bot.py](<PROJECT_ROOT>/proxmox/tsj_guardian_bot.py)
- [proxmox/test_tsj_guardian_bot.py](<PROJECT_ROOT>/proxmox/test_tsj_guardian_bot.py)
- [ansible/deploy_tsj_guardian_bot_proxmox.yml](<PROJECT_ROOT>/ansible/deploy_tsj_guardian_bot_proxmox.yml)
- [ansible/group_vars/proxmox-bot.example.yml](<PROJECT_ROOT>/ansible/group_vars/proxmox-bot.example.yml)
- [windows/export-upload-file-1c-telemetry.ps1](<PROJECT_ROOT>/windows/export-upload-file-1c-telemetry.ps1)
- [ansible/deploy_file_1c_windows_telemetry.yml](<PROJECT_ROOT>/ansible/deploy_file_1c_windows_telemetry.yml)
- [clickhouse-1c/clickhouse/init/05_financial_reporting.sql](<PROJECT_ROOT>/clickhouse-1c/clickhouse/init/05_financial_reporting.sql)
- [ansible/deploy_proxmox_web_gateway.yml](<PROJECT_ROOT>/ansible/deploy_proxmox_web_gateway.yml)

Новые dashboard JSON, подтвержденные live-выкладкой:
- [clickhouse-1c/grafana/provisioning/dashboards/files/1c-financial-reporting.json](<PROJECT_ROOT>/clickhouse-1c/grafana/provisioning/dashboards/files/1c-financial-reporting.json)
- [clickhouse-1c/grafana/provisioning/dashboards/files/1c-management-board.json](<PROJECT_ROOT>/clickhouse-1c/grafana/provisioning/dashboards/files/1c-management-board.json)
- [clickhouse-1c/grafana/provisioning/dashboards/files/1c-telemetry-board.json](<PROJECT_ROOT>/clickhouse-1c/grafana/provisioning/dashboards/files/1c-telemetry-board.json)

## Проверки, которые были явно пройдены

- `python3 -m py_compile proxmox/tsj_guardian_bot.py proxmox/test_tsj_guardian_bot.py`
- `python3 -m unittest proxmox.test_tsj_guardian_bot`
- `./check-aw-full.sh` дал `FRESH=8 STALE=0 DEAD=0`
- gateway deploy на Proxmox прошел успешно
- `go/file1c-telemetry` отдает `302` на Grafana
- SQLite Grafana подтвердил наличие `1c-file-telemetry` в folder `1C File Analytics`

## Незафиксированные в git риски

- коммитов за последние 24 часа нет;
- есть значительный dirty worktree за пределами этого отчета;
- часть новых файлов все еще `??` в `git status`;
- без отдельного git-упорядочивания следующий человек может смешать сегодняшние изменения с более старыми незакоммиченными правками.

## Следующий жесткий шаг

Если цель именно финансовая отчетность по проводкам, нужен отдельный read-only пользователь 1С для боевых файловых баз. Это единственный текущий внешний blocker, который не решается локальным refactor/deploy.
