feat(commercial): prioritize workforce module

This commit is contained in:
igor04091968
2026-06-03 10:46:41 +03:00
parent 3a4e70c3b7
commit 5ec9f508db
7 changed files with 202 additions and 22 deletions
+17 -3
View File
@@ -1,17 +1,31 @@
# Описание программного продукта DetMir / AWatch-rus
`DetMir` на базе `AWatch-rus` - программный комплекс операционного контроля,
технического аудита и мониторинга ИТ-инфраструктуры.
технического аудита, оценки трудоотдачи сотрудников и мониторинга
ИТ-инфраструктуры.
## Назначение
Продукт предназначен для централизованного контроля состояния рабочих мест,
серверных сервисов, ActivityWatch telemetry, рабочих интервалов, операторских
runbook-проверок и прикладных событий расследования.
оценки полезной активности сотрудников, анализа загрузки подразделений,
контроля серверных сервисов, ActivityWatch telemetry, рабочих интервалов,
операторских runbook-проверок и прикладных событий расследования.
## Коммерческие модули
- `DetMir Workforce` - ежедневный управленческий слой: полезная активность,
активное время, простои, RDP/1C/рабочие приложения, загрузка сотрудников и
отчеты для руководителя.
- `DetMir Security` - прикладной слой ИБ: DLP-сигналы, evidence metadata,
доступные скриншоты, review/case queue и audit действий оператора.
- `DetMir Forensics` - расследовательский слой: цепочки событий,
Hayabusa/offline-разбор, кейсы и материалы для внутреннего расследования.
## Основные функции
- сбор и нормализация ActivityWatch telemetry;
- оценка полезной активности и загрузки сотрудников;
- управленческие отчеты по worktime, RDP, 1C и рабочим приложениям;
- контроль свежести данных и состояния сборщиков;
- учет активности пользователей и удаленных сессий;
- витрины Grafana и портал оператора;
+12 -4
View File
@@ -1,9 +1,9 @@
# AWatch-rus
AWatch-rus / DetMir - программный комплекс операционного контроля,
технического аудита и мониторинга корпоративной ИТ-инфраструктуры на базе
ActivityWatch, Rust-сервисов автоматизации, Grafana/Prometheus-витрин и
модулей расследования инцидентов.
технического аудита, оценки трудоотдачи сотрудников и мониторинга
корпоративной ИТ-инфраструктуры на базе ActivityWatch, Rust-сервисов
автоматизации, Grafana/Prometheus-витрин и модулей расследования инцидентов.
Проект не позиционируется как сертифицированная DLP/SIEM/EDR/XDR/СЗИ. DLP,
evidence и Hayabusa используются как прикладные модули внутри платформы
@@ -11,6 +11,12 @@ evidence и Hayabusa используются как прикладные мод
## Назначение
- DetMir Workforce: полезная активность, загрузка сотрудников, RDP/1C/рабочие
приложения и управленческие отчеты для владельца бизнеса.
- DetMir Security: DLP-сигналы, evidence, очередь кейсов и audit действий
оператора без заявления продукта как сертифицированной СЗИ.
- DetMir Forensics: цепочки событий, Hayabusa/offline-разбор и материалы для
внутреннего расследования.
- Контроль доступности и свежести данных ActivityWatch.
- Учет активного времени, RDP-сессий, окон, приложений и рабочих интервалов.
- Витрины Grafana для администратора, оператора ИБ и руководителя.
@@ -36,7 +42,8 @@ runtime, OCR/content-analysis, 1C/AI/ETL integration и MCP/dev helpers. Эти
## Кому это полезно
- Руководителю - быстро увидеть рабочую картину без просмотра логов.
- Владельцу и руководителю - видеть полезную активность, загрузку команды,
простои, перегрузки и рабочие приложения без просмотра логов.
- ИБ - заметить DLP-сигналы и подозрительную активность.
- Администратору - проверить, что сборщики и сервер работают стабильно.
@@ -54,6 +61,7 @@ runtime, OCR/content-analysis, 1C/AI/ETL integration и MCP/dev helpers. Эти
- [Сценарий экспертной проверки](docs/EXPERT_TEST_SCENARIO_RU.md)
- [Release manifest 2026-06](docs/RELEASE_MANIFEST_2026-06.md)
- [Эксплуатационный профиль](docs/OPERATIONAL_PROOF_PROFILE_RU.md)
- [Коммерческие модули DetMir](docs/DETMIR_COMMERCIAL_MODULES_RU.md)
- [Сторонние компоненты](THIRD_PARTY_COMPONENTS.md)
- [Сторонние лицензии](THIRD_PARTY_LICENSES_RU.md)
- [Архитектура](docs/ARCHITECTURE_RU.md)
+44
View File
@@ -369,6 +369,7 @@ struct ReportMetrics {
evidence_screenshots: usize,
open_incidents: usize,
acknowledged_incidents: usize,
workforce_index: Option<u8>,
}
fn main() {
@@ -860,6 +861,7 @@ fn build_reports(
.count(),
open_incidents: incidents.iter().filter(|item| !item.acknowledged).count(),
acknowledged_incidents: incidents.iter().filter(|item| item.acknowledged).count(),
workforce_index: workforce_index(users_count, active_seconds),
};
let grafana = grafana_block(snapshot);
let collection = collection_block(snapshot.detmir_check.payload.as_ref());
@@ -904,6 +906,7 @@ fn build_reports(
"headline": headline,
"executive_points": executive_points,
"kpis": [
report_kpi("Индекс активности", workforce_index_text(metrics.workforce_index), workforce_index_status(metrics.workforce_index), "proxy: active time / 8h на сотрудника"),
report_kpi("Сотрудники", metrics.users_count.to_string(), worktime.status.clone(), "строки worktime за сегодня"),
report_kpi("Активное время", human_duration(metrics.active_seconds), worktime.status.clone(), "сумма active_seconds"),
report_kpi("Приложения", metrics.apps_count.to_string(), worktime.status.clone(), "true active applications"),
@@ -924,6 +927,7 @@ fn build_reports(
{
"title": "Работа и управляемость",
"items": [
report_item("Индекс активности", workforce_index_status(metrics.workforce_index), workforce_index_text(metrics.workforce_index)),
report_item("Worktime", worktime.status.clone(), worktime.text.clone()),
report_item("Активное время", worktime.status.clone(), human_duration(metrics.active_seconds)),
report_item("Приложения", worktime.status.clone(), metrics.apps_count.to_string()),
@@ -987,6 +991,10 @@ fn render_report_markdown(
"нет"
}
));
text.push_str(&format!(
"- Индекс полезной активности: {}\n",
workforce_index_text(metrics.workforce_index)
));
text.push_str(&format!(
"- Сотрудники за сегодня: {}\n",
metrics.users_count
@@ -1074,6 +1082,30 @@ fn human_duration(seconds: i64) -> String {
format!("{hours:02}:{minutes:02}")
}
fn workforce_index(users_count: usize, active_seconds: i64) -> Option<u8> {
if users_count == 0 || active_seconds <= 0 {
return None;
}
let planned_seconds = users_count as f64 * 8.0 * 3600.0;
let value = ((active_seconds as f64 / planned_seconds) * 100.0).round();
Some(value.clamp(0.0, 100.0) as u8)
}
fn workforce_index_text(value: Option<u8>) -> String {
value
.map(|value| format!("{value}%"))
.unwrap_or_else(|| "нет данных".to_string())
}
fn workforce_index_status(value: Option<u8>) -> String {
match value {
Some(value) if value >= 80 => "OK".to_string(),
Some(value) if value >= 60 => "WARN".to_string(),
Some(_) => "FAIL".to_string(),
None => "UNKNOWN".to_string(),
}
}
fn build_incidents(snapshot: &Snapshot, state: &IncidentStateFile) -> Vec<IncidentItem> {
let mut incidents = Vec::new();
for source in [
@@ -2591,6 +2623,18 @@ mod tests {
assert_eq!(human_duration(-10), "00:00");
}
#[test]
fn workforce_index_uses_eight_hour_proxy() {
assert_eq!(workforce_index(1, 8 * 3600), Some(100));
assert_eq!(workforce_index(2, 8 * 3600), Some(50));
assert_eq!(workforce_index(0, 8 * 3600), None);
assert_eq!(workforce_index(1, 0), None);
assert_eq!(workforce_index_text(Some(84)), "84%");
assert_eq!(workforce_index_status(Some(84)), "OK");
assert_eq!(workforce_index_status(Some(70)), "WARN");
assert_eq!(workforce_index_status(Some(30)), "FAIL");
}
#[test]
fn reports_include_commercial_kpis_and_disclaimer() {
let snapshot = Snapshot {
@@ -118,11 +118,14 @@ function renderOperator(data) {
}
function renderManager(data) {
const workforceIndex = workforceIndexText(data.users_count, data.total_active_seconds);
return `
<h2 class="section-title">Руководитель</h2>
<div class="grid-2">
<section class="card">
<h3>Работа сегодня</h3>
<p class="kpi-value">${escapeHtml(workforceIndex)}</p>
<p class="muted">Индекс полезной активности: active time / 8 ч на сотрудника</p>
<p class="muted">Сотрудников: ${data.users_count}; активных часов: ${Number(data.total_active_hours || 0).toFixed(1)}</p>
<p class="muted">${escapeHtml(data.status?.text || "")}</p>
</section>
@@ -148,6 +151,14 @@ function renderManager(data) {
`;
}
function workforceIndexText(usersCount, activeSeconds) {
const users = Number(usersCount || 0);
const seconds = Number(activeSeconds || 0);
if (users <= 0 || seconds <= 0) return "Нет данных";
const pct = Math.max(0, Math.min(100, Math.round(seconds / (users * 8 * 3600) * 100)));
return `${pct}%`;
}
function renderOwner(data) {
const cards = Object.entries(data.cards || {});
return `
+79
View File
@@ -0,0 +1,79 @@
# Коммерческие модули DetMir
DetMir / AWatch-rus коммерчески правильнее подавать как платформу
операционного контроля с тремя прикладными модулями. Первый модуль - Workforce:
он дает ежедневную бизнес-ценность владельцу и руководителю. Security и
Forensics усиливают продукт, но не должны перетягивать позиционирование в
сторону сертифицированной DLP/SIEM/СЗИ.
## DetMir Workforce
Для владельца, директора, руководителя подразделения и операционного менеджера.
Показывает:
- кто реально работал в рабочем окне;
- кто перегружен, простаивает или выпадает из нормального профиля активности;
- сколько времени команда проводит в RDP, 1С и рабочих приложениях;
- какие приложения и процессы забирают рабочее время;
- как меняется загрузка сотрудников и подразделений;
- где тормозят бизнес-процессы.
Основные KPI:
- полезная активность;
- активное время;
- простой;
- число рабочих сессий;
- активные приложения;
- индекс полезной активности;
- документы/операции 1С при наличии связанного бизнес-слоя.
Корректная формулировка для продажи:
> DetMir помогает руководителю видеть загрузку сотрудников и бизнес-процессов
> без ручного просмотра логов и без подмены управленческой оценки простым
> учетом "сидел за компьютером".
## DetMir Security
Для ИБ, администратора и оператора расследований.
Показывает:
- DLP-сигналы: буфер обмена, печать, USB, файловые операции;
- severity/status технических сигналов;
- очередь DLP/case review;
- evidence metadata и доступные скриншоты;
- audit просмотра evidence и действий оператора.
В публичных и коммерческих материалах важно говорить аккуратно:
- `detections/cases` - это derived detections/cases;
- подтвержденным инцидентом событие становится после регламентной валидации;
- продукт не заявляется как сертифицированная DLP/SIEM/EDR/XDR/СЗИ.
## DetMir Forensics
Для разбора сложных событий и пост-инцидентной аналитики.
Показывает:
- цепочку событий ActivityWatch;
- Hayabusa/offline evidence workflow;
- связь технических сигналов, кейсов и артефактов;
- audit trail просмотра и обработки материалов;
- экспортируемые материалы для внутреннего расследования.
## Приоритет в демонстрации
Порядок показа владельцу бизнеса:
1. Workforce: полезная активность, загрузка, RDP/1С, рабочие приложения.
2. Commercial reports: ежедневный срез, KPI, Markdown/HTML отчет.
3. Security: DLP-сигналы и evidence.
4. Forensics: цепочка расследования, Hayabusa, кейсы.
5. Reliability: автономность, health-check, SLO, Grafana freshness.
Такой порядок снижает сопротивление вокруг темы "слежки" и переводит разговор
в плоскость эффективности, управляемости и доказуемой операционной картины.
+2
View File
@@ -30,6 +30,8 @@ baseline и раздела `Phase 8: Post-MVP Enhancements`.
- UI tab: `Отчеты`;
- отчет содержит KPI для владельца/руководителя: worktime users, active time,
active applications, DLP WARN/FAIL, evidence screenshots/items, open issues;
- отчет и вкладка `Руководитель` показывают `Индекс полезной активности` как
proxy `active time / 8h на сотрудника`;
- отчет содержит Markdown export для передачи руководителю или заказчику;
- формулировка DLP/case показателей зафиксирована как
`derived detections/cases`, не как вручную подтвержденные инциденты;
+37 -15
View File
@@ -1,10 +1,27 @@
# AW-rus: презентационные экраны
# DetMir / AW-rus: презентационные экраны
Документ собирает живые экраны AW-rus и Grafana для demo, коммерческой презентации и внутренних согласований.
Документ собирает живые экраны DetMir / AW-rus и Grafana для demo,
коммерческой презентации и внутренних согласований.
## 1. Работа пользователей в RDP
## 1. DetMir Workforce: трудоотдача и загрузка
Управленческий экран по активности пользователей: кто работал, сколько времени, как выглядит команда по дням и кто активен сегодня.
Первый коммерческий экран для владельца и руководителя. Показывает не
"сидел за компьютером", а полезную активность: кто реально работал, кто
перегружен, кто простаивает, сколько времени уходит в RDP, 1C и рабочие
приложения.
Ключевые вопросы:
- кто реально работает;
- кто перегружен или простаивает;
- какие подразделения и процессы тормозят работу;
- сколько времени уходит на RDP/1C/рабочие приложения;
- где нужен управленческий разбор, а не технический лог.
## 2. Работа пользователей в RDP
Управленческий экран по активности пользователей: кто работал, сколько времени,
как выглядит команда по дням и кто активен сегодня.
![DetMir: Работа пользователей в RDP](assets/screenshots/grafana-rdp-worktime.png)
@@ -12,7 +29,7 @@
- `grafana/detmir-rdp-user-activity-dashboard.json`
## 2. DLP и ИБ обзор
## 3. DLP и ИБ обзор
Технический dashboard для ИБ: сработки, severity, типы сигналов, verdict'ы, очередь кейсов и состояние доставки данных.
@@ -22,7 +39,7 @@
- `grafana/detmir-dlp-security-dashboard.json`
## 3. ИБ сводка для руководства
## 4. ИБ сводка для руководства
Экран для руководителя ИБ: открытые кейсы, инциденты повышенного риска, ожидающие решения события и верхнеуровневая динамика.
@@ -32,7 +49,7 @@
- `grafana/detmir-dlp-management-dashboard.json`
## 4. AW-rus: DLP обзор
## 5. AW-rus: DLP обзор
Обзорный dashboard для быстрых стендовых demo и smoke-проверки самого DLP-контура.
@@ -42,13 +59,13 @@
- `grafana/dlp-dashboard.json`
## 5. AW-rus summary по активности
## 6. AW-rus summary по активности
Экран ActivityWatch-Russian для просмотра реальной активности хоста и summary по выбранному дню.
![AW-rus summary](assets/screenshots/aw-rus-summary.png)
## 6. Генерируемый отчёт по пользователям
## 7. Генерируемый отчёт по пользователям
Отдельный HTML-отчёт `RDP Worktime Report`, который система генерирует по пользователям: таблица, активное время, диапазон активности и детальные карточки по каждому сотруднику.
@@ -74,14 +91,19 @@ Live endpoint:
- trend;
- свежесть источников данных.
## 7. AW-rus: DLP review, rules и события
## 8. AW-rus: DLP review, rules и события
Экран AW-rus по bucket `aw-dlp-endpoint-signals_*`: здесь видны живые DLP-события, review-вердикты, правила, case-management и нижняя лента событий. Это прямое доказательство, что данные реально приходят на сервер до агрегации в InfluxDB/Grafana.
![AW-rus DLP bucket](assets/screenshots/aw-rus-dlp-bucket.png)
1. `RDP` dashboard — ценность для руководства и HR.
2. `DLP и ИБ обзор` — глубина технического контроля для ИБ.
3. `ИБ сводка для руководства` — понятный риск-ориентированный слой.
4. `RDP Worktime Report` — отдельный генерируемый per-user отчёт, который можно показывать как доказательство реальной работы сотрудников.
5. `AW-rus summary` и DLP review-экран — доказательство, что система не только рисует графики, а реально получает события на сервере.
## Рекомендуемый порядок демонстрации
1. `DetMir Workforce` - полезная активность, загрузка, RDP/1C и рабочие
приложения.
2. `RDP Worktime Report` - отдельный генерируемый per-user отчет как
доказательство реальной работы сотрудников.
3. `DLP и ИБ обзор` - глубина технического контроля для ИБ.
4. `ИБ сводка для руководства` - понятный риск-ориентированный слой.
5. `AW-rus summary` и DLP review-экран - доказательство, что система не только
рисует графики, а реально получает события на сервере.