# Технический отчет: Архитектура, схемотехника и низкоуровневая реализация PC Control

**Проект:** PC Control (Distributed Out-of-band & In-band Workstation Orchestration)  
**Автор:** W1bbex  
**Редакция:** Engineering Deep-Dive v2.0  
**Дата:** Сентябрь 2026  
**Статус:** Production / Боевая эксплуатация  

---

## Содержание

1. [Введение, мотивация и концептуальная новизна](#1-введение-мотивация-и-концептуальная-новизна)
2. [Сквозная архитектурная топология системы](#2-сквозная-архитектурная-топология-системы)
3. [Аппаратный уровень: Микроконтроллер ESP8266 и C++ прошивка](#3-аппаратный-уровень-микроконтроллер-esp8266-и-c-прошивка)
   - 3.1. Принципиальная схема подключения и управление питанием
   - 3.2. Обработка прерываний IRAM_ATTR и кольцевой буфер событий кнопки
   - 3.3. Конечный автомат распознавания кода Морзе и интервалы защиты
   - 3.4. Аппаратный анти-брутфорс и энергонезависимая память EEPROM
   - 3.5. Сетевой стек BearSSL TLS 1.2 и устойчивость к сбоям сокета
4. [Системный агент ядра Windows: Session 0 SYSTEM (boot_agent.py)](#4-системный-агент-ядра-windows-session-0-system-boot_agentpy)
   - 4.1. Контекст исполнения и интеграция с Windows Task Scheduler
   - 4.2. Детекция Fast Startup vs Cold Boot через реестр и Win32 API
   - 4.3. Алгоритм консенсуса Windows Terminal Services (WTS API)
5. [Преодоление изоляции сессий и инжекция пароля (type_password.py)](#5-преодоление-изоляции-сессий-и-инжекция-пароля-type_passwordpy)
   - 5.1. Session 0 Isolation и запуск через PsExec64
   - 5.2. Захват десктопа Winlogon и барьер верификации потока
   - 5.3. Снятие экрана блокировки и нормализация поля ввода
   - 5.4. Синтез скан-кодов через VkKeyScanW и очистка памяти в ОЗУ
6. [Пользовательский агент рабочего стола: Session 1+ (agent.py)](#6-пользовательский-агент-рабочего-стола-session-1-agentpy)
   - 6.1. Мониторинг активного окна и подавление переходных процессов
   - 6.2. Детекция системного простоя и сетевой дифференциальный трекер
   - 6.3. Локальная база данных активности: SQLite в режиме WAL
7. [Мультимедийная подсистема: WinRT GSMTC и CoreAudio (media_manager.py)](#7-мультимедийная-подсистема-winrt-gsmtc-и-coreaudio-media_managerpy)
   - 7.1. Интеграция с Global System Media Transport Controls
   - 7.2. Алгоритм виртуального временного якоря (Virtual Time Anchor)
   - 7.3. Управление системной громкостью через PyCaw / IAudioEndpointVolume
   - 7.4. Telegram-пульт управления воспроизведением и радио «Моя Волна»
8. [Графический экстрактор и синхронизация Telegram Custom Emoji](#8-графический-экстрактор-и-синхронизация-telegram-custom-emoji)
   - 8.1. Сканирование ярлыков и вызов PrivateExtractIconsW
   - 8.2. Нормализация альфа-канала GDI+ HICON и исключение артефактов
   - 8.3. Регистрация кастомного эмодзи-пака через Telegram Bot API
9. [Аппаратный сборщик телеметрии (AdminSensorCollector.exe)](#9-аппаратный-сборщик-телеметрии-adminsensorcollectorexe)
   - 9.1. Архитектура C#/.NET службы на базе LibreHardwareMonitorLib
   - 9.2. Атомарный межпроцессный обмен через временные файлы
10. [Облачный координатор: Сервер VDS (vds_bot)](#10-облачный-координатор-сервер-vds-vds_bot)
    - 10.1. Распределенный конечный автомат питания (Power Flow FSM)
    - 10.2. Фильтр фантомных пакетов (Ghost Retain Filter) и окно тишины 20с
    - 10.3. Серверная визуализация аналитики на Matplotlib
    - 10.4. Пайплайн атомарного деплоя с SHA-256 манифестом
11. [Мобильный терминальный шлюз: Antigravity Telegram Bridge](#11-мобильный-терминальный-шлюз-antigravity-telegram-bridge)
    - 11.1. Двунаправленный пайпинг Google Antigravity CLI (agy)
    - 11.2. Форматирование блоков <blockquote expandable> и IPC сервер
    - 11.3. Пул ботов для защиты от Telegram FloodWait
12. [Сводная спецификация метрик, надежность и тестовый набор](#12-сводная-спецификация-метрик-надежность-и-тестовый-набор)

---

## 1. Введение, мотивация и концептуальная новизна

### 1.1. Проблематика удаленного управления рабочими станциями
При построении персональной инфраструктуры удаленного доступа к мощной рабочей станции разработчик сталкивается с тремя классическими инженерными проблемами:
1. **Холодный запуск (Cold Power-On):** Технология Wake-on-LAN (WoL) не работает при глубоком отключении питания (состояние ACPI S5) на подавляющем большинстве современных материнских плат, блокируется маршрутизаторами без статической ARP-таблицы или полностью отключается при сбое внешней сети.
2. **Экран блокировки и изоляция сессий Windows:** Протокол RDP (Remote Desktop Protocol) принудительно захватывает графическую консоль, сбрасывает аппаратные контексты DirectX/Vulkan и отключает физический монитор. При этом сторонние VNC-решения не способны взаимодействовать с защищенным экраном `Winlogon` до авторизации пользователя.
3. **Уязвимости и ограничения аппаратных USB-эмуляторов клавиатуры:** Существующие любительские проекты часто используют микроконтроллеры с аппаратным USB HID (RP2040, ATmega32u4, ESP32-S2/S3). Постоянно подключенный эмулятор клавиатуры создает критическую уязвимость класса BadUSB, занимает физический USB-порт, определяется BIOS как клавиатура и может вызывать фантомные срабатывания при POST-инициализации.

### 1.2. Концептуальное решение проекта PC Control
В проекте PC Control реализован принцип **чистого разделения Out-of-band и In-band контуров без использования USB-эмуляторов клавиатуры**:
- Аппаратная часть построена на чипе **ESP8266**, у которого физически отсутствует USB-контроллер. Он взаимодействует исключительно с пинами материнской платы (`PWR_SW`) и физической кнопкой корпуса, работая автономно от дежурного питания 5V Standby блока питания ATX.
- Ввод пароля и разблокировка осуществляются **программно через доверенную системную службу Windows (`NT AUTHORITY\SYSTEM`)**, которая переключает рабочий стол потока на `Winlogon` и транслирует виртуальные скан-коды клавиш непосредственно в защищенную очередь диспетчера окон Windows.
- Весь трафик между хостом, микроконтроллером и облаком шифруется по стандарту **TLS 1.2/1.3** с гарантированной доставкой сообщений (QoS 1, ID/TTL/ACK).

---

## 2. Сквозная архитектурная топология системы

```mermaid
flowchart TB
    subgraph Telegram_Ecosystem["Пользовательский интерфейс (Telegram Cloud)"]
        UserClient["Пользователь (iOS / Android / Desktop)"]
        ForumGroup["Инженерный чат (Forum Supergroup)"]
    end

    subgraph Cloud_VDS["Облачный координатор (Ubuntu VDS 148.253.208.121)"]
        Mosquitto["Mosquitto MQTT Broker (:8883 TLS)"]
        VDS_Coordinator["vds_bot/bot.py (State FSM & Telegram UI)"]
        HealthEngine["health_engine.py (Ghost Filter & LWT Monitor)"]
        TelemDB[("telemetry_history.db (SQLite WAL)")]
        ChartEngine["monitoring.py (Matplotlib Render Daemon)"]
        AGY_Bridge["antigravity_tg_bot/ (Google AGY Bridge)"]
        IPC_Server["Local IPC Server (:8765)"]
    end

    subgraph Hardware_Plane["Аппаратный узел (ESP8266 NodeMCU)"]
        ESP_Core["ESP8266 @ 160MHz (BearSSL TLS)"]
        RelayPin["GPIO5: Оптическое реле ATX PWR_SW"]
        ButtonPin["GPIO14: Физическая кнопка (IRAM_ATTR ISR)"]
        LEDStrip["GPIO4: ARGB WS2812B NeoPixel Status"]
        EEPROM_Store["EEPROM: Anti-Bruteforce Lockout + XOR CRC"]
    end

    subgraph Windows_Host["Целевой хост (Windows 10 Workstation)"]
        subgraph Session_0["Session 0 (SYSTEM Context)"]
            BootAgent["boot_agent.py (WTS Session Monitor)"]
            PsExec["PsExec64.exe (-s -x -i)"]
            PassInjector["type_password.py (Winlogon Desktop Injector)"]
            SensorService["AdminSensorCollector.exe (LibreHardwareMonitor)"]
        end

        subgraph Session_1["Session 1+ (Interactive User Context)"]
            DesktopAgent["agent.py (MQTT User Daemon)"]
            ActivityTrack["activity_logger.py (GetForegroundWindow)"]
            ActivityDB[("activity.db (SQLite WAL)")]
            MediaManager["media_manager.py (WinRT GSMTC + PyCaw)"]
            EmojiExtractor["icon_extractor.py + app_emoji_manager.py"]
        end
    end

    UserClient <-->|HTTPS Bot API| VDS_Coordinator
    ForumGroup <-->|HTTPS Bot API| AGY_Bridge
    VDS_Coordinator <-->|Internal Subprocess| AGY_Bridge
    AGY_Bridge <-->|HTTP Callbacks| IPC_Server

    VDS_Coordinator <-->|TCP :8883 TLS| Mosquitto
    ESP_Core <-->|MQTT over TLS :8883| Mosquitto
    BootAgent <-->|MQTT over TLS :8883| Mosquitto
    DesktopAgent <-->|MQTT over TLS :8883| Mosquitto

    ESP_Core -->|Сухой контакт 500мс| RelayPin
    ButtonPin -->|Аппаратный код Морзе| ESP_Core
    ESP_Core -->|Световая индикация| LEDStrip
    ESP_Core <-->|Блокировка кнопки| EEPROM_Store

    BootAgent -->|Запуск инжектора| PsExec
    PsExec -->|Инжекция в Winlogon| PassInjector
    PassInjector -->|SetThreadDesktop + VkKeyScanW| Windows_Host
    SensorService -->|Atomic tmp -> json| BootAgent

    DesktopAgent -->|COM / WinRT| MediaManager
    DesktopAgent -->|GDI PrivateExtractIconsW| EmojiExtractor
    DesktopAgent -->|Win32 Polling 3s| ActivityTrack
    ActivityTrack -->|Запись таймлайна| ActivityDB
    VDS_Coordinator -->|Агрегация и аналитика| TelemDB
    TelemDB -->|Генерация 4-слойных PNG| ChartEngine
```

---

## 3. Аппаратный уровень: Микроконтроллер ESP8266 и C++ прошивка

### 3.1. Принципиальная схема подключения и управление питанием
Микроконтроллер NodeMCU v3 (ESP8266EX, тактовая частота 160 МГц) запитан от дежурного напряжения `+5VSB` блока питания ATX через линейный стабилизатор напряжения.
- **Управление реле (GPIO5 / D1):** Подключено через опторазвязку к контактам `PWR_SW` материнской платы параллельно кнопке включения.
  - Стандартный импульс включения: `500 мс`.
  - Аварийный импульс принудительного выключения (Hard Power-Off): `5000 мс`.
  - Аппаратный кулдаун: `5000 мс` между любыми переключениями реле для исключения дребезга и двойного старта.
- **Индикатор статуса (GPIO4 / D2):** Управление адресной лентой WS2812B (NeoPixel). Отражает статус подключения к Wi-Fi, состояние TLS-сессии и подтверждение приема команд.

### 3.2. Обработка прерываний IRAM_ATTR и кольцевой буфер событий кнопки
Для фиксации физических нажатий кнопки корпуса на пине `GPIO14 (D5)` задействовано аппаратное прерывание `CHANGE`.
- Функция обработчика помещена в быструю оперативную память инструкций микроконтроллера атрибутом `IRAM_ATTR`:
```cpp
void IRAM_ATTR handleButtonInterrupt() {
    uint32_t now = millis();
    int level = digitalRead(BUTTON_PIN);
    // Аппаратный дебаунс 35 мс
    if (now - lastInterruptTime > 35) {
        ringBuffer[bufferHead].timestamp = now;
        ringBuffer[bufferHead].level = level;
        bufferHead = (bufferHead + 1) % RING_BUFFER_SIZE; // Кольцевой буфер на 16 элементов
        lastInterruptTime = now;
    }
}
```
- Прерывание не производит вычислений, а мгновенно фиксирует фронт сигнала и временную метку `millis()` без блокировки процессора.

### 3.3. Конечный автомат распознавания кода Морзе и интервалы защиты
В основном цикле `loop()` процессор считывает события из кольцевого буфера и прогоняет их через конечный автомат (FSM):
1. **Дискриминация длительности импульса:**
   - **Точка (DOT):** Длительность нажатия `10 мс <= t < 500 мс`.
   - **Тире (DASH):** Длительность нажатия `t >= 500 мс`.
2. **Защитные интервалы тишины (Silence Guards):**
   - **Пре-тишина (Leading Silence):** Код начинает считываться только в том случае, если перед первым нажатием кнопка находилась в покое не менее **5000 мс**.
   - **Пост-тишина (Trailing Silence / Timeout):** Символ считается завершенным, если после последнего отпускания прошло **3000 мс** тишины.
3. **Валидация:** При совпадении с мастер-паттерном отправляется MQTT-пакет подтвержденной авторизации `pc/hw/morse_auth`.

### 3.4. Аппаратный анти-брутфорс и энергонезависимая память EEPROM
- Разрешено последовательных ошибок ввода: **3 попытки**.
- При 3-й неверной комбинации система входит в состояние `HARDWARE_LOCKOUT`:
  - Кнопка блокируется на **15 минут (900 000 мс)**.
  - Статус блокировки, число попыток и временная метка сохраняются в EEPROM с вычислением контрольной суммы XOR.
  - При перезагрузке по питанию контроллер верифицирует EEPROM: если таймер блокировки не истек, блокировка восстанавливается, предотвращая сброс счетчика обесточиванием.

### 3.5. Сетевой стек BearSSL TLS 1.2 и устойчивость к сбоям сокета
- Использование легковесного криптографического стека **BearSSL**.
- Ограничение размера сетевых буферов до 1024 байт (`client.setBufferSizes(1024, 1024)`).
- **Защита от зависания TCP:** Жесткий таймаут сокета **3000 мс** (`client.setTimeout(3000)`). Потеря Wi-Fi пакетов не подвешивает систему, а форсирует разрыв сокета и быстрый `WiFi.reconnect()`.

---

## 4. Системный агент ядра Windows: Session 0 SYSTEM (boot_agent.py)

### 4.1. Контекст исполнения и интеграция с Windows Task Scheduler
`boot_agent.py` запускается в нулевой сессии (`Session 0`) с наивысшими правами `NT AUTHORITY\SYSTEM`.
- Регистрация скриптом `scripts/install/install_boot_agent.ps1` через Планировщик заданий Windows:
  - Триггер: `AtStartup` (старт до экрана входа и авторизации любого пользователя).
  - Привилегии: `HighestAvailable` под учетной записью `SYSTEM`.
  - Автоперезапуск каждые 60 секунд при падении процесса.

### 4.2. Детекция Fast Startup vs Cold Boot через реестр и Win32 API
Windows 10/11 по умолчанию переводит ядро в сон (`hiberfil.sys`) при выключении (Fast Startup).
`boot_agent.py` определяет тип старта:
1. Чтение ключа реестра `HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power\HiberbootEnabled`.
2. Анализ аптайма ядра через `GetTickCount64()`: если время работы менее 60 секунд при неинициализированной сессии пользователя — фиксируется `COLD_BOOT`. Если счетчик продолжается — фиксируется `RESUME_FROM_HIBERNATION`.

### 4.3. Алгоритм консенсуса Windows Terminal Services (WTS API)
Опрос 4 источников каждые 1.5 секунды исключает ложные срабатывания:
1. `WTSGetActiveConsoleSessionId()`
2. `WTSQuerySessionInformationW(WTSUserName)`
3. `WTSQuerySessionInformationW(WTSConnectState)`
4. Тестовый дескриптор `OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP)`

| Active Session ID | User Name | Connect State | OpenInputDesktop() | Статус | Действие |
|---|---|---|---|---|---|
| `-1` | Пусто | `WTSDisconnected` | `NULL` | `NO_CONSOLE` | Ожидание инициализации видеодрайвера |
| `>= 1` | Пусто / `SYSTEM` | `WTSDisconnected` | Валидный | `LOGIN_SCREEN` | Ожидание команды ввода PIN |
| `>= 1` | `w1bbex` | `WTSActive` | `NULL` | `LOCKED` | Требуется пробуждение и ввод PIN |
| `>= 1` | `w1bbex` | `WTSActive` | Валидный | `UNLOCKED` | Запуск пользовательского агента |

---

## 5. Преодоление изоляции сессий и инжекция пароля (type_password.py)

### 5.1. Session 0 Isolation и запуск через PsExec64
Процессы Session 0 изолированы от пользовательского графического контекста.
Инжекция в экран входа осуществляется через утилиту Sysinternals `PsExec64.exe`:
```powershell
PsExec64.exe -accepteula -s -x -i <target_session_id> pythonw.exe type_password.py
```
- `-s`: Права `NT AUTHORITY\SYSTEM`.
- `-x`: Доступ к защищенному экрану Winlogon.
- `-i <id>`: Номер консоли.

### 5.2. Захват десктопа Winlogon и барьер верификации потока
Инжектированный скрипт привязывает поток к рабочему столу входа:
```python
hDesk = user32.OpenDesktopW("Winlogon", 0, False, 0x01FF)
user32.SetThreadDesktop(hDesk)
```
- **Защитный таймаут (5 секунд):** Проверка имени десктопа через `GetUserObjectInformationW`. Если за 5 секунд десктоп не подтверждает статус `"Winlogon"`, процесс немедленно завершается без попытки ввода пароля.

### 5.3. Снятие экрана блокировки и нормализация поля ввода
1. **Снятие заставки (Dismiss Lockscreen):** Отправка `VK_SPACE` (0x20) с удержанием 80 мс и паузой 400 мс.
2. **Очистка буфера (Input Reset):** Отправка `Ctrl + A` и цикл из **15 последовательных нажатий `VK_BACK` (Backspace)** с задержками 25 мс.

### 5.4. Синтез скан-кодов через VkKeyScanW и очистка памяти в ОЗУ
- Символы пароля преобразуются в виртуальные скан-коды и маски модификаторов (Shift, Ctrl, Alt) через `VkKeyScanW(ord(char))`.
- Нажатия эмулируются с обязательной паузой **35 мс** для предотвращения отбрасывания символов очередью `LSASS`.
- **Стирание секрета в ОЗУ:** Буфер пароля перезаписывается нулями (`ctypes.memset`) с принудительным вызовом `gc.collect()`.

---

## 6. Пользовательский агент рабочего стола: Session 1+ (agent.py)

### 6.1. Мониторинг активного окна и подавление переходных процессов
- Опрос каждые **3.0 секунды** через `GetForegroundWindow()` и `QueryFullProcessImageNameW()`.
- **Фильтрация шума (<0.2 сек):** Всплывающие уведомления и оверлеи отбрасываются и не попадают в журнал.

### 6.2. Детекция системного простоя и сетевой дифференциальный трекер
- Опрос `GetLastInputInfo()`. При неактивности пользователя более **300 секунд (5 минут)** сессия переходит в статус `AFK / IDLE`.
- Вычисление дифференциальной скорости сети (КБ/с, МБ/с) через `psutil.net_io_counters()`.

### 6.3. Локальная база данных активности: SQLite в режиме WAL
- База `activity.db` в режиме **Write-Ahead Logging (`PRAGMA journal_mode=WAL;`)** и `PRAGMA synchronous=NORMAL;`.
- Обеспечивает параллельное чтение аналитикой без блокировки потока записи.

---

## 7. Мультимедийная подсистема: WinRT GSMTC и CoreAudio (media_manager.py)

### 7.1. Интеграция с Global System Media Transport Controls
- Взаимодействие с медиаплеерами через WinRT API `GlobalSystemMediaTransportControlsSessionManager`.
- Извлечение метаданных (Title, Artist, Album, Cover Art, Duration).

### 7.2. Алгоритм виртуального временного якоря (Virtual Time Anchor)
- Точная позиция считывается только при событиях смены трека или паузы/плея.
- Позиция интерполируется математически: `CurrentPosition = anchor_pos + (time_now - anchor_time)`.
- Результат: **0.0% нагрузки на CPU** без циклического COM-опроса Explorer.

### 7.3. Управление системной громкостью через PyCaw / IAudioEndpointVolume
- Регулировка громкости Windows через CoreAudio API с логарифмической шкалой восприятия.

### 7.4. Telegram-пульт управления воспроизведением и радио «Моя Волна»
- Интерактивный таймлайн: `▶ 01:24 ──🔘─────── 03:45`.
- Кнопки: `⏮`, `⏯`, `⏭`, перемотка `⏪ -10с` / `⏩ +10с`.
- Яндекс Музыка: Лайк трека и запуск персонального радиопотока **«Моя Волна»** через URI `yandexmusic://`.

---

## 8. Графический экстрактор и синхронизация Telegram Custom Emoji

### 8.1. Сканирование ярлыков и вызов PrivateExtractIconsW
- Сканирование ярлыков `.lnk` на Рабочем столе и в Меню «Пуск».
- Извлечение иконок в нативном разрешении **256x256 пикселей** через Win32 `PrivateExtractIconsW`.

### 8.2. Нормализация альфа-канала GDI+ HICON и исключение артефактов
- Коррекция Premultiplied Alpha бага: восстановление полупрозрачности по маске `hbmMask` для исключения черных ореолов.

### 8.3. Регистрация кастомного эмодзи-пака через Telegram Bot API
- Автоматическая публикация иконок в персональный кастомный эмодзи-пак Telegram для кнопок быстрого запуска.

---

## 9. Аппаратный сборщик телеметрии (AdminSensorCollector.exe)

### 9.1. Архитектура C#/.NET службы на базе LibreHardwareMonitorLib
- Автономная фоновая служба на **.NET 8 / C#** с доступом к драйверам кольца Ring 0.
- Сбор параметров: температуры ядер CPU, Package, GPU Core, Hotspot, VRAM, скорость кулеров в RPM и %, износ NVMe SSD.

### 9.2. Атомарный межпроцессный обмен через временные файлы
- Запись во временный файл `.tmp` и атомарная замена через Win32 `MoveFileExW` (`ReplaceFile`).
- Полное исключение состояния гонки при чтении Python-агентом.

---

## 10. Облачный координатор: Сервер VDS (vds_bot)

### 10.1. Распределенный конечный автомат питания (Power Flow FSM)
- Состояния: `OFF`, `POWERING_ON`, `BOOTING`, `LOCKED`, `UNLOCKING`, `LOGGED_IN`, `SHUTTING_DOWN`.
- Взаимные блокировки исключают повторный импульс реле при активной системе.

### 10.2. Фильтр фантомных пакетов (Ghost Retain Filter) и окно тишины 20с
1. **Ghost Retain Filter:** Отсечение старых MQTT Retained пакетов проверкой монотонности таймстемпов.
2. **Окно тишины 20 секунд:** Статус `OFF` подтверждается только после 20 секунд непрерывного молчания обоих агентов.

### 10.3. Серверная визуализация аналитики на Matplotlib
- База `telemetry_history.db` (>117 000 записей).
- Серверная генерация 4-слойных графиков (загрузка, температуры, память, трафик) за 1ч, 6ч, 24ч, 7д, 30д.

### 10.4. Пайплайн атомарного деплоя с SHA-256 манифестом
- Скрипт `deploy_vds.py`: изолированный стейджинг, сверка SHA-256, preflight-тесты, бэкап и автооткат.

---

## 11. Мобильный терминальный шлюз: Antigravity Telegram Bridge

### 11.1. Двунаправленный пайпинг Google Antigravity CLI (agy)
- Потоковый обмен данными с CLI через `asyncio.subprocess.PIPE` с фильтрацией ANSI escape-кодов.

### 11.2. Форматирование блоков <blockquote expandable> и IPC сервер
- Автоматическое сворачивание длинных логов в `<blockquote expandable>` Telegram API.
- Локальный HTTP/IPC сервер (:8765) для интерактивных ответов на `ask_question` прямо через инлайн-кнопки.

### 11.3. Пул ботов для защиты от Telegram FloodWait
- Балансировщик нагрузки с пулом до 5 вспомогательных ботов-воркеров.

---

## 12. Сводная спецификация метрик, надежность и тестовый набор

### 12.1. Ключевые системные константы и параметры таймингов
| Подсистема | Параметр / Константа | Значение | Назначение и контекст |
|---|---|---|---|
| **ESP8266** | `RELAY_POWER_PULSE` | `500 мс` | Импульс замыкания кнопки ATX PWR_SW |
| **ESP8266** | `RELAY_FORCE_SHUTDOWN` | `5000 мс` | Аварийное принудительное выключение |
| **ESP8266** | `RELAY_COOLDOWN` | `5000 мс` | Аппаратная защита от повторного старта |
| **ESP8266** | `BUTTON_DEBOUNCE_MS` | `35 мс` | Дебаунс прерывания IRAM_ATTR |
| **ESP8266** | `MORSE_DOT_MAX_MS` | `500 мс` | Порог точки кода Морзе |
| **ESP8266** | `SILENCE_PRE_MS` | `5000 мс` | Тишина до начала ввода кода |
| **ESP8266** | `SILENCE_POST_MS` | `3000 мс` | Таймаут окончания последовательности |
| **ESP8266** | `LOCKOUT_ATTEMPTS` | `3` | Число ошибок до блокировки кнопки |
| **ESP8266** | `LOCKOUT_DURATION_MS`| `900 000 мс` (15 мин) | Время блокировки кнопки в EEPROM |
| **ESP8266** | `BEARSSL_TIMEOUT_MS` | `3000 мс` | Таймаут сокета TLS |
| **Windows Boot** | `WTS_POLL_INTERVAL` | `1.5 с` | Интервал проверки матрицы консенсуса |
| **Windows Boot** | `WINLOGON_DESK_TIMEOUT`| `5.0 с` | Защитный таймаут ожидания Winlogon |
| **Windows Boot** | `KEY_PRESS_DELAY_MS` | `35 мс` | Задержка скан-кодов для LSASS |
| **Windows User** | `ACTIVITY_POLL_INTERVAL`| `3.0 с` | Опрос активного окна GetForegroundWindow |
| **Windows User** | `IDLE_THRESHOLD_SEC` | `300 с` (5 мин) | Порог фиксации простоя |
| **Windows User** | `WINDOW_DEBOUNCE_SEC` | `0.2 с` | Фильтрация мимолетных окон |
| **VDS Coordinator**| `DUAL_SILENCE_WINDOW` | `20.0 с` | Время подтверждения OFF при тишине |
| **VDS Coordinator**| `BOOT_TIMEOUT_SEC` | `180 с` | Таймаут загрузки после импульса реле |
| **VDS Coordinator**| `UNLOCK_TIMEOUT_SEC` | `15 с` | Таймаут авторизации пользователя |

### 12.2. Архитектура тестового набора
Стабильность валидируется набором из **194 автоматизированных тестов**:
1. **Тесты FSM питания (`test_flow_runner.py`, `test_phase1_pc_state.py`):** Проверка матрицы переходов и сетевых сбоев.
2. **Тесты движка здоровья (`test_health_engine.py`):** Проверка отсечения фантомных Retained-пакетов, LWT и окна тишины 20с.
3. **Тесты UI и мониторинга (`test_monitoring_ui.py`):** Корректность построения графиков Matplotlib и HTML-сущностей Telegram.
4. **Тесты трансляции скан-кодов Win32:** Валидация алгоритмов `VkKeyScanW` и очистки памяти в ОЗУ.

---

## 13. Заключение

Архитектура **PC Control** представляет собой бескомпромиссный инженерный образец построения распределенной системы управления физической рабочей станцией:
- **Безопасность:** Отсутствие физических USB HID эмуляторов исключает риски перехвата и аппаратных закладок. Пароль вводится через внутренний защищенный интерфейс Winlogon с немедленной очисткой памяти.
- **Отказоустойчивость:** Аппаратный контроллер ESP8266 полностью изолирован от зависаний операционной системы ПК, имеет независимое дежурное питание и собственный контур защиты от брутфорса с фиксацией в EEPROM.
- **Глубокая наблюдаемость:** Сквозной мониторинг от температур кристаллов кремния на шине SMBus до фоновых окон и таймлайна активности пользователя с сохранением в SQLite WAL и аналитикой за 30 дней.