Add next development plan audit
This commit is contained in:
@@ -0,0 +1,643 @@
|
||||
# AWatch-rus: план развития на следующие 6-12 месяцев
|
||||
|
||||
Дата аудита: 2026-07-01.
|
||||
|
||||
Статус: development planning после анализа текущего репозитория. Документ не
|
||||
добавляет новые продуктовые функции и не меняет runtime-поведение. Цель -
|
||||
снизить эксплуатационные, release, security и maintainability риски без
|
||||
нарушения обратной совместимости.
|
||||
|
||||
## Границы плана
|
||||
|
||||
- Production уже существует; текущий DetMir контур рассчитан примерно на 5 RDP
|
||||
пользователей.
|
||||
- Рабочие подсистемы не переписываются. Все изменения должны быть
|
||||
инкрементальными, проверяемыми и откатываемыми.
|
||||
- DLP runtime остается `core_only/disabled` по умолчанию; `light` включается
|
||||
только вручную после resource preflight.
|
||||
- Loki и always-on Velociraptor не включаются как часть этого плана.
|
||||
- PowerShell fallback на Windows сохраняется до доказанной parity и burn-in
|
||||
Rust-пути.
|
||||
- GitHub остается public mirror validation; release evidence для российского
|
||||
контура должен формироваться отдельно.
|
||||
|
||||
## Фактическое состояние репозитория
|
||||
|
||||
- Основной runtime слой стал Rust-first: `adk-rust/` содержит 58 workspace
|
||||
crates; локальный `cargo metadata --locked` разрешает 349 пакетов.
|
||||
- Rust dependency hygiene уже включен: `cargo audit --deny warnings`,
|
||||
`cargo deny`, `cargo machete --with-metadata`, `cargo tree --duplicates` есть
|
||||
в workflow или локальных gate. Текущий аудит: `cargo audit` и `cargo machete`
|
||||
чистые, `cargo deny` проходит, но оставляет 36 `bans` warnings.
|
||||
- CI уже покрывает Rust, docs/registry, smoke, operational maturity,
|
||||
dependency hygiene, security scan и release binary build. Есть drift:
|
||||
несколько workflows используют floating `stable`, хотя `rust-toolchain.toml`
|
||||
закрепляет `1.94.0`.
|
||||
- DetMir DLP resource guardrails реализованы: runtime disabled/core-only by
|
||||
default, `detmir-dlp-load-guard`, documented rollback, skipped DLP buckets в
|
||||
smoke считаются нормой.
|
||||
- Security Finding Inbox, Hayabusa и Velociraptor оформлены как optional
|
||||
findings/forensics sources и не являются hot-path зависимостью Workforce.
|
||||
- Документация registry/governance сильная, но `docs/PROJECT_STATUS_RU.md` и
|
||||
`docs/RESIDUAL_RISKS_RU.md` фиксируют открытые gaps: Gitea restore drill,
|
||||
Russian build-runner, первый release evidence build, legal/rightsholder
|
||||
package, external review evidence.
|
||||
- Самые крупные maintainability hotspots:
|
||||
`adk-rust/crates/detmir-portal/src/main.rs` - 14200 строк,
|
||||
`adk-rust/crates/aw-windows-telemetry/src/main.rs` - 6411 строк,
|
||||
`proxmox/tsj_guardian_bot.py` - 4610 строк,
|
||||
`adk-rust/crates/worktime-api/src/main.rs` - 3988 строк,
|
||||
`ansible/deploy_aw_server.yml` - 3099 строк.
|
||||
- Найдены точные дубликаты скриптов:
|
||||
`scripts/aw-contour-diag.sh` =
|
||||
`scripts/detmir-full-diagnostics/aw-contour-diag.sh`;
|
||||
`scripts/check_production_inventory_placeholders.sh` =
|
||||
`scripts/detmir-full-diagnostics/check_production_inventory_placeholders.sh`.
|
||||
- Найден security hygiene gap: ClickHouse/1C ops wrappers передают
|
||||
`CLICKHOUSE_PASSWORD` через `--password`, что раскрывает секрет в process
|
||||
argv на хосте.
|
||||
|
||||
## P0 - критично для production
|
||||
|
||||
### P0-1. Gate фактической свежести production Rust-бинарников
|
||||
|
||||
- Почему нужно: `scripts/check_detmir_rust_release_artifacts.sh` проверяет
|
||||
наличие локальных release artifacts, но не доказывает, что production
|
||||
service/timer/Windows task реально запускает тот же binary SHA256.
|
||||
- Риск: stale бинарник в production может отличаться от проверенного кода,
|
||||
усложнить rollback и скрыть регрессию в high-load контуре.
|
||||
- Ожидаемый эффект: воспроизводимая цепочка `service/timer/task -> binary path
|
||||
-> crate -> local artifact -> prod sha256 -> git sha`.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 3-5 инженерных дней.
|
||||
- Затрагиваемые файлы:
|
||||
`scripts/check_detmir_rust_release_artifacts.sh`,
|
||||
`scripts/package_rust_release_binaries.py`,
|
||||
`scripts/detmir-full-diagnostics/`,
|
||||
`adk-rust/crates/detmir-readiness/`,
|
||||
`windows/validate-deployment.ps1`,
|
||||
`docs/DETMIR_CURRENT_STATE_RU.md`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`.
|
||||
- Критерии приемки:
|
||||
команда dry-run выводит все реально задействованные binaries на
|
||||
`10.10.10.2`, `10.10.10.13` и Windows RDP host;
|
||||
для каждого binary есть crate, role, unit/timer/task, prod SHA256 и local
|
||||
release SHA256;
|
||||
gate падает при missing/stale binary;
|
||||
проверка не включает heavy DLP, Loki или always-on Velociraptor;
|
||||
rollback path документирован и проверен на одном canary binary.
|
||||
|
||||
### P0-2. Bounded retention для state, evidence, queues и diagnostic output
|
||||
|
||||
- Почему нужно: DLP/evidence/backlog/diagnostic контуры уже имеют guardrails,
|
||||
но retention/cleanup policy для исторических artifacts остается отдельной
|
||||
future work; disk exhaustion на Proxmox/AW server является прямым outage
|
||||
риском.
|
||||
- Риск: накопление JSONL queues, screenshots, Hayabusa drops, diagnostic runs,
|
||||
ClickHouse landing files или локальных state snapshots может забить диск и
|
||||
остановить ingestion, portal или ActivityWatch.
|
||||
- Ожидаемый эффект: предсказуемое потребление диска, безопасный dry-run cleanup,
|
||||
понятный rollback через backup/hold rules.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 4-7 инженерных дней.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/crates/aw-prune-local-state/`,
|
||||
`scripts/detmir-full-diagnostics/`,
|
||||
`scripts/detmir_dlp_warehouse_sync.sh`,
|
||||
`aw-server/logrotate.conf`,
|
||||
`windows/validate-deployment.ps1`,
|
||||
`adk-rust/crates/aw-windows-telemetry/`,
|
||||
`docs/DLP_OPTIONAL_RUNTIME_RU.md`,
|
||||
`docs/DLP_RESOURCE_PROFILES_RU.md`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`.
|
||||
- Критерии приемки:
|
||||
есть единая retention matrix по путям, владельцам, age/size limits и dry-run;
|
||||
cleanup never follows untrusted paths and only touches allowlisted roots;
|
||||
Windows queues имеют max-age/max-size validation;
|
||||
skipped DLP buckets при `AW_DLP_ENABLED=false` не считаются ошибкой;
|
||||
smoke показывает, что cleanup не удаляет active state и не требует downtime.
|
||||
|
||||
### P0-3. Убрать секреты ClickHouse/1C из process argv
|
||||
|
||||
- Почему нужно: `clickhouse-1c/ops/run_*.sh` передают пароль как
|
||||
`--password "${CLICKHOUSE_PASSWORD}"`; этот аргумент виден через process list
|
||||
локальному пользователю или диагностике.
|
||||
- Риск: утечка ClickHouse credentials с возможностью чтения/изменения
|
||||
production analytics data.
|
||||
- Ожидаемый эффект: секреты передаются через env/config file descriptor или
|
||||
другой non-argv канал; logs и error output остаются redacted.
|
||||
- Сложность: низкая-средняя.
|
||||
- Объем работ: 2-4 инженерных дня.
|
||||
- Затрагиваемые файлы:
|
||||
`clickhouse-1c/ops/run_ingest_cycle.sh`,
|
||||
`clickhouse-1c/ops/run_manager_brief.sh`,
|
||||
`clickhouse-1c/ops/run_recovery_brief.sh`,
|
||||
`clickhouse-1c/ops/run_company_registry_bindings_refresh.sh`,
|
||||
`clickhouse-1c/ops/run_company_intelligence_refresh.sh`,
|
||||
`clickhouse-1c/ops/check_ingest_freshness.sh`,
|
||||
`clickhouse-1c/ai/*.py`,
|
||||
`clickhouse-1c/etl/*.py`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`.
|
||||
- Критерии приемки:
|
||||
`rg -- '--password \"\\$\\{CLICKHOUSE_PASSWORD\\}\"' clickhouse-1c` ничего не
|
||||
находит в runtime wrappers;
|
||||
smoke через `ps` доказывает отсутствие password в argv;
|
||||
существующие env-based deployments остаются совместимыми;
|
||||
failed auth logs не печатают password;
|
||||
`bash -n clickhouse-1c/ops/*.sh` и affected Python smoke проходят.
|
||||
|
||||
## P1 - желательно выполнить до следующего релиза
|
||||
|
||||
### P1-1. Выровнять Rust toolchain во всех CI workflows
|
||||
|
||||
- Почему нужно: `rust-toolchain.toml` закрепляет `1.94.0`, но
|
||||
`.github/workflows/ci.yml`, `security.yml`, `coverage.yml`,
|
||||
`dependency-hygiene.yml` и `release-assets.yml` используют floating
|
||||
`dtolnay/rust-toolchain@stable`.
|
||||
- Риск: CI и release runner могут собирать разные версии компилятора, что
|
||||
снижает воспроизводимость и усложняет анализ regressions.
|
||||
- Ожидаемый эффект: единый compiler baseline для local, GitHub mirror и
|
||||
будущего российского build-runner.
|
||||
- Сложность: низкая.
|
||||
- Объем работ: 1-2 инженерных дня.
|
||||
- Затрагиваемые файлы:
|
||||
`rust-toolchain.toml`,
|
||||
`.github/workflows/ci.yml`,
|
||||
`.github/workflows/security.yml`,
|
||||
`.github/workflows/coverage.yml`,
|
||||
`.github/workflows/dependency-hygiene.yml`,
|
||||
`.github/workflows/release-assets.yml`,
|
||||
`.github/workflows/rust-binary-build.yml`,
|
||||
`.github/workflows/rust-workspace.yml`,
|
||||
`docs/QUALITY_STATUS_RU.md`.
|
||||
- Критерии приемки:
|
||||
все blocking Rust jobs используют `rust-toolchain.toml` или тот же explicit
|
||||
channel;
|
||||
nightly остается только для advisory `cargo udeps`;
|
||||
CI check names не меняются;
|
||||
локально и в CI проходят `cargo fmt`, `cargo test`, `cargo clippy -D warnings`.
|
||||
|
||||
### P1-2. Staged triage для duplicate/deprecated Rust dependencies
|
||||
|
||||
- Почему нужно: `cargo deny` проходит, но `cargo tree --duplicates` показывает
|
||||
дубли `bitflags`, `getrandom`, `hashbrown`, `mio`, `zip`, `windows-*`;
|
||||
`serde_yaml 0.9.34+deprecated` уже зафиксирован как средний риск.
|
||||
- Риск: supply-chain surface и binary size растут, а устаревшие crates могут
|
||||
стать будущим vulnerability blocker.
|
||||
- Ожидаемый эффект: baseline по допустимым дублям, запрет новых необоснованных
|
||||
дублей, replacement path для deprecated crates.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 4-8 инженерных дней.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/Cargo.toml`,
|
||||
`adk-rust/Cargo.lock`,
|
||||
`deny.toml`,
|
||||
`.github/workflows/dependency-hygiene.yml`,
|
||||
crates using `serde_yaml`, `calamine`, `notify`, `zip`, `windows-sys`,
|
||||
`docs/THIRD_PARTY_LICENSES_RU.md`,
|
||||
`docs/QUALITY_STATUS_RU.md`.
|
||||
- Критерии приемки:
|
||||
для каждого duplicate family есть decision: keep with reason, update, or
|
||||
remove;
|
||||
`cargo audit --deny warnings` и `cargo deny ...` проходят;
|
||||
новые duplicates без allowlist/обоснования блокируются;
|
||||
replacement plan для `serde_yaml` не ломает существующие YAML configs;
|
||||
изменения dependency graph идут отдельными PR, не смешиваются с runtime
|
||||
features.
|
||||
|
||||
### P1-3. Load regression harness для portal/worktime/report hot paths
|
||||
|
||||
- Почему нужно: `docs/PROJECT_STATUS_RU.md` прямо фиксирует residual risk:
|
||||
full report/snapshot prewarm может быть CPU/IO дорогим. Сейчас production
|
||||
малый, но расширение users/events без бюджета нагрузки рискованно.
|
||||
- Риск: рост RDP users или history window приводит к slow portal, stale cache,
|
||||
ClickHouse/AW amplification или datastore lock pressure.
|
||||
- Ожидаемый эффект: измеримые budgets для p95 latency, memory, query count,
|
||||
cache hit/stale behavior и degradation semantics.
|
||||
- Сложность: средняя-высокая.
|
||||
- Объем работ: 1-2 недели.
|
||||
- Затрагиваемые файлы:
|
||||
`scripts/operational-maturity-check.mjs`,
|
||||
`scripts/awatch-production-hardening-smoke.mjs`,
|
||||
`adk-rust/crates/detmir-portal/`,
|
||||
`adk-rust/crates/worktime-api/`,
|
||||
`adk-rust/crates/worktime-prewarm/`,
|
||||
`adk-rust/crates/aw-contour-smoke/`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`,
|
||||
`docs/QUALITY_STATUS_RU.md`.
|
||||
- Критерии приемки:
|
||||
synthetic dataset проверяет минимум 5/20/50 users without prod data;
|
||||
harness фиксирует p95 latency, max RSS, query count and stale-cache decisions;
|
||||
disconnected RDP sessions and event-driven buckets не дают false-fail;
|
||||
`AW_DLP_ENABLED=false` profile respected;
|
||||
heavy job остается scheduled/advisory, blocking smoke остается быстрым.
|
||||
|
||||
### P1-4. Windows Rust validation parity before reducing PowerShell runtime
|
||||
|
||||
- Почему нужно: `docs/POWERSHELL_SCRIPT_STATUS_MATRIX_RU.md` показывает, что
|
||||
Rust overlay уже основной для части collectors, но `validate-deployment.ps1`,
|
||||
Hayabusa upload и некоторые recovery paths остаются fallback/runtime.
|
||||
- Риск: преждевременное удаление PowerShell fallback ухудшит recovery на
|
||||
Windows Server 2019 и localized RDP sessions.
|
||||
- Ожидаемый эффект: доказанная parity Rust validation, safe fallback policy и
|
||||
меньше runtime drift.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 1-2 недели.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/crates/aw-windows-telemetry/`,
|
||||
`windows/validate-deployment.ps1`,
|
||||
`windows/export-upload-hayabusa-to-aw-server.ps1`,
|
||||
`windows/ActivityWatch.Windows.Common.psm1`,
|
||||
`ansible/deploy_aw_windows.yml`,
|
||||
`docs/POWERSHELL_SCRIPT_STATUS_MATRIX_RU.md`,
|
||||
`docs/POWERSHELL_TO_RUST_ROADMAP_RU.md`.
|
||||
- Критерии приемки:
|
||||
Rust `validate-deployment` покрывает все 7 секций PowerShell validation;
|
||||
CP866/localized user handling covered by tests;
|
||||
canary run сравнивает Rust и PowerShell reports на одном RDP host;
|
||||
PowerShell fallback остается documented rollback;
|
||||
no removal before burn-in evidence.
|
||||
|
||||
### P1-5. Российский build-runner и первый release evidence build
|
||||
|
||||
- Почему нужно: `ROADMAP.md`, `docs/PROJECT_STATUS_RU.md` и
|
||||
`docs/RESIDUAL_RISKS_RU.md` фиксируют, что `awatch-build-01` planned, а
|
||||
первый release evidence build pending.
|
||||
- Риск: registry/release package cannot be claimed reproducible in target
|
||||
Russian contour.
|
||||
- Ожидаемый эффект: проверяемый release package: source archive, binaries,
|
||||
SBOM, SHA256SUMS, cargo metadata/tree, logs, manifest.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 3-6 инженерных дней плюс инфраструктурное окно.
|
||||
- Затрагиваемые файлы:
|
||||
`scripts/build_release_evidence.sh`,
|
||||
`scripts/check_release_evidence.sh`,
|
||||
`scripts/verify_release_assets.sh`,
|
||||
`docs/registry/RU_BUILD_RUNNER_READINESS_RU.md`,
|
||||
`docs/registry/BUILD_RUNNER_SETUP_RUNBOOK_RU.md`,
|
||||
`docs/registry/RELEASE_EVIDENCE_RUNBOOK_RU.md`,
|
||||
`docs/registry/registry-evidence-manifest.json`.
|
||||
- Критерии приемки:
|
||||
build-runner имеет documented OS/toolchain;
|
||||
release evidence build выполнен не на GitHub runner;
|
||||
`scripts/check_release_evidence.sh` проходит;
|
||||
artifacts имеют SHA256 и manifest;
|
||||
public docs не заявляют registry completion раньше legal approval.
|
||||
|
||||
### P1-6. Gitea backup restore drill
|
||||
|
||||
- Почему нужно: backup и SHA256 documented, но `restore_tested=false` остается
|
||||
открытым residual risk.
|
||||
- Риск: disaster recovery process может оказаться неполным только во время
|
||||
инцидента.
|
||||
- Ожидаемый эффект: доказанный restore на отдельном хосте и понятный RTO/RPO
|
||||
baseline.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 2-4 инженерных дня.
|
||||
- Затрагиваемые файлы:
|
||||
`docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md`,
|
||||
`docs/registry/registry-evidence-manifest.json`,
|
||||
`scripts/registry_readiness_check.sh`,
|
||||
`docs/PROJECT_STATUS_RU.md`,
|
||||
`docs/RESIDUAL_RISKS_RU.md`.
|
||||
- Критерии приемки:
|
||||
restore выполнен на отдельном сервере;
|
||||
checksums, logs, repository accessibility и rollback notes сохранены;
|
||||
manifest обновлен с `restore_tested=true`;
|
||||
recovery evidence не содержит секреты.
|
||||
|
||||
### P1-7. Hayabusa upload path: Rust helper parity and operational proof
|
||||
|
||||
- Почему нужно: матрица PowerShell-to-Rust помечает
|
||||
`windows/export-upload-hayabusa-to-aw-server.ps1` как P1 runtime wrapper.
|
||||
Hayabusa is optional, but it is a security evidence path.
|
||||
- Риск: Windows PowerShell encoding, task principal или SSH wrapper drift
|
||||
ломает forensics upload без явной compile-time проверки.
|
||||
- Ожидаемый эффект: Rust helper covers upload, sidecar metadata, checksum and
|
||||
server drop-zone contract; PowerShell remains fallback.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 5-8 инженерных дней.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/crates/aw-windows-telemetry/`,
|
||||
`adk-rust/crates/hayabusa-tools/`,
|
||||
`windows/export-upload-hayabusa-to-aw-server.ps1`,
|
||||
`aw-server/hayabusa/aw-hayabusa.sh`,
|
||||
`ansible/deploy_aw_windows.yml`,
|
||||
`docs/POWERSHELL_SCRIPT_STATUS_MATRIX_RU.md`,
|
||||
`docs/POWERSHELL_TO_RUST_ROADMAP_RU.md`.
|
||||
- Критерии приемки:
|
||||
helper creates identical server-side intake result on fixture;
|
||||
BOM/backslash/path traversal tests preserved;
|
||||
task principal remains interactive Administrator where required;
|
||||
server `aw-hayabusa-drop.path` processing stays optional and fail-closed;
|
||||
no automatic remediation is introduced.
|
||||
|
||||
## P2 - улучшения архитектуры и сопровождаемости
|
||||
|
||||
### P2-1. Инкрементальная декомпозиция крупных runtime modules
|
||||
|
||||
- Почему нужно: несколько production-critical files слишком крупные для
|
||||
надежного review и локального reasoning, особенно `detmir-portal/main.rs` и
|
||||
`aw-windows-telemetry/main.rs`.
|
||||
- Риск: высокий change-coupling, труднее делать точечные fixes и находить
|
||||
regressions.
|
||||
- Ожидаемый эффект: smaller modules by domain, faster review, focused tests.
|
||||
- Сложность: средняя-высокая.
|
||||
- Объем работ: 2-4 недели несколькими малыми PR.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/crates/detmir-portal/src/main.rs`,
|
||||
`adk-rust/crates/detmir-portal/src/*`,
|
||||
`adk-rust/crates/aw-windows-telemetry/src/main.rs`,
|
||||
`adk-rust/crates/worktime-api/src/main.rs`,
|
||||
`proxmox/tsj_guardian_bot.py`,
|
||||
`clickhouse-1c/ai/company_intelligence_api.py`.
|
||||
- Критерии приемки:
|
||||
каждый PR только moves/extracts one bounded domain;
|
||||
public API, config names, systemd units and task names unchanged;
|
||||
tests before/after identical;
|
||||
no new dependencies without written justification;
|
||||
line count decreases in target `main.rs` files without behavioral rewrite.
|
||||
|
||||
### P2-2. Consolidate exact duplicate diagnostic scripts
|
||||
|
||||
- Почему нужно: две пары скриптов имеют identical SHA256, что создает риск
|
||||
будущего drift при исправлениях.
|
||||
- Риск: one copy fixed, bundled copy stale; diagnostics disagree.
|
||||
- Ожидаемый эффект: single source of truth while preserving existing paths.
|
||||
- Сложность: низкая.
|
||||
- Объем работ: 1-2 инженерных дня.
|
||||
- Затрагиваемые файлы:
|
||||
`scripts/aw-contour-diag.sh`,
|
||||
`scripts/detmir-full-diagnostics/aw-contour-diag.sh`,
|
||||
`scripts/check_production_inventory_placeholders.sh`,
|
||||
`scripts/detmir-full-diagnostics/check_production_inventory_placeholders.sh`,
|
||||
`scripts/detmir-full-diagnostics/detmir-full-diagnostics.sh`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`.
|
||||
- Критерии приемки:
|
||||
оба старых paths продолжают работать;
|
||||
есть один canonical implementation или generated copy check;
|
||||
CI/quality gate ловит future drift;
|
||||
shellcheck/bash syntax pass.
|
||||
|
||||
### P2-3. Split oversized Ansible deployment playbook without behavior change
|
||||
|
||||
- Почему нужно: `ansible/deploy_aw_server.yml` имеет 3099 строк; это усложняет
|
||||
review и безопасные partial changes.
|
||||
- Риск: accidental deploy behavior changes in unrelated task blocks.
|
||||
- Ожидаемый эффект: role/include structure with same task order and clearer
|
||||
ownership.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 1-2 недели.
|
||||
- Затрагиваемые файлы:
|
||||
`ansible/deploy_aw_server.yml`,
|
||||
`ansible/roles/`,
|
||||
`ansible/group_vars/`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`.
|
||||
- Критерии приемки:
|
||||
`ansible-playbook --syntax-check` passes;
|
||||
`--list-tasks` before/after is reviewed for ordering parity;
|
||||
no default vars changed;
|
||||
rollback is reverting includes to previous single playbook.
|
||||
|
||||
### P2-4. Bound 1C ingest memory and file processing profile
|
||||
|
||||
- Почему нужно: `adk-rust/crates/aw-1c-ingest/src/main.rs` currently reads rows
|
||||
into `Vec` and builds large JSON batches; acceptable for pilot, but risky for
|
||||
larger exports.
|
||||
- Риск: memory spikes, long transaction windows, ClickHouse insert amplification
|
||||
on larger 1C files.
|
||||
- Ожидаемый эффект: chunked processing where practical, explicit limits and
|
||||
predictable failure mode for oversized files.
|
||||
- Сложность: средняя-высокая.
|
||||
- Объем работ: 1-2 недели.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/crates/aw-1c-ingest/src/main.rs`,
|
||||
`clickhouse-1c/etl/config.yml`,
|
||||
`clickhouse-1c/etl/config.example.yml`,
|
||||
`clickhouse-1c/sql/`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`,
|
||||
`docs/QUALITY_STATUS_RU.md`.
|
||||
- Критерии приемки:
|
||||
synthetic large CSV/XLSX fixture documents max RSS and runtime;
|
||||
oversized input fails closed with clear diagnostic;
|
||||
existing small DetMir files produce identical rows;
|
||||
ClickHouse insert batch size is configurable and bounded.
|
||||
|
||||
### P2-5. Systematic command execution boundary audit
|
||||
|
||||
- Почему нужно: `detmir-portal` already validates shell probe commands and
|
||||
kills process groups on timeout, but other operational binaries also execute
|
||||
shell/commands (`aw-slo-monitor`, `diag-and-manual-restart`, quality tooling).
|
||||
- Риск: future config drift can reintroduce command injection, secrets in argv
|
||||
or incomplete timeout cleanup.
|
||||
- Ожидаемый эффект: documented command execution policy and shared tests for
|
||||
allowlisted commands, timeouts, redaction and process-group cleanup.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 4-7 инженерных дней.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/crates/detmir-portal/src/main.rs`,
|
||||
`adk-rust/crates/detmir-portal/src/production/limits.rs`,
|
||||
`adk-rust/crates/aw-slo-monitor/src/main.rs`,
|
||||
`adk-rust/crates/diag-and-manual-restart/src/main.rs`,
|
||||
`adk-rust/crates/quality-gate/src/main.rs`,
|
||||
`docs/SECURITY_OPERATIONS_RUNBOOK_RU.md`.
|
||||
- Критерии приемки:
|
||||
every runtime command source is classified as constant, allowlisted config or
|
||||
operator-only diagnostic;
|
||||
tests reject shell control operators where config-driven;
|
||||
timeout tests verify child/grandchild cleanup;
|
||||
logs never include secrets from env or args.
|
||||
|
||||
### P2-6. Install kit artifact reproducibility and stale payload checks
|
||||
|
||||
- Почему нужно: install kit is critical for Windows deployment, includes large
|
||||
LFS artifacts, and must not silently ship stale payloads.
|
||||
- Риск: Windows production receives an older collector or mismatched config
|
||||
while repo checks pass.
|
||||
- Ожидаемый эффект: deterministic installer evidence and stronger
|
||||
install-kit-vs-repo validation.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 5-8 инженерных дней.
|
||||
- Затрагиваемые файлы:
|
||||
`windows/installkit/innosetup/`,
|
||||
`adk-rust/crates/check-install-kit-vs-repo/`,
|
||||
`adk-rust/crates/rebuild-install-kit/`,
|
||||
`adk-rust/crates/validate-install-kit/`,
|
||||
`adk-rust/crates/verify-innosetup-installer/`,
|
||||
`scripts/rebuild_install_kit.sh`,
|
||||
`docs/INSTALL_KIT_RUNBOOK_RU.md`.
|
||||
- Критерии приемки:
|
||||
installer manifest lists exact source commit and payload SHA256;
|
||||
validation fails on stale collector payload;
|
||||
generated artifacts are not confused with source files;
|
||||
Windows task names and config schema remain backward compatible.
|
||||
|
||||
### P2-7. Standardize operational metrics contract across Rust daemons
|
||||
|
||||
- Почему нужно: individual services expose useful fields, but there is no
|
||||
consistent minimal metrics/diagnostics contract for every long-running Rust
|
||||
daemon.
|
||||
- Риск: incident response depends on service-specific knowledge; regressions in
|
||||
one daemon are harder to compare with another.
|
||||
- Ожидаемый эффект: consistent `/health`, structured log fields and optional
|
||||
metrics snapshots for status, cache, queue, retry, timeout and resource
|
||||
pressure.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 2-3 недели staged by service.
|
||||
- Затрагиваемые файлы:
|
||||
`adk-rust/crates/aw-rus-healthd/`,
|
||||
`adk-rust/crates/worktime-api/`,
|
||||
`adk-rust/crates/detmir-portal/`,
|
||||
`adk-rust/crates/dlp-*`,
|
||||
`adk-rust/crates/aw-1c-ingest/`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`,
|
||||
`grafana/`.
|
||||
- Критерии приемки:
|
||||
minimal contract documented;
|
||||
each daemon reports version/build, config profile, degraded reason and queue
|
||||
pressure where applicable;
|
||||
existing endpoints remain backward compatible;
|
||||
Grafana/dashboard changes are additive.
|
||||
|
||||
## P3 - долгосрочные улучшения
|
||||
|
||||
### P3-1. Coverage thresholds after baseline review
|
||||
|
||||
- Почему нужно: coverage workflow exists, but roadmap explicitly says threshold
|
||||
should be added after baseline review.
|
||||
- Риск: coverage can silently decline while CI remains green.
|
||||
- Ожидаемый эффект: gradual coverage floor without slowing blocking jobs.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 1-2 недели.
|
||||
- Затрагиваемые файлы:
|
||||
`.github/workflows/coverage.yml`,
|
||||
`adk-rust/`,
|
||||
`docs/QUALITY_STATUS_RU.md`,
|
||||
`docs/REVIEW_CHECKLIST_RU.md`.
|
||||
- Критерии приемки:
|
||||
initial threshold is based on measured baseline, not arbitrary target;
|
||||
critical crates get stricter per-crate goals;
|
||||
generated/fixture code excluded consistently;
|
||||
threshold moves from advisory to blocking only after stable history.
|
||||
|
||||
### P3-2. Russian OS compatibility matrix
|
||||
|
||||
- Почему нужно: roadmap keeps Russian OS compatibility as planned validation.
|
||||
- Риск: deployment assumptions can fail on target OS variants only after a
|
||||
customer deployment attempt.
|
||||
- Ожидаемый эффект: explicit supported/unsupported OS matrix and installation
|
||||
evidence.
|
||||
- Сложность: средняя-высокая.
|
||||
- Объем работ: 2-4 недели depending on available test hosts.
|
||||
- Затрагиваемые файлы:
|
||||
`docs/registry/`,
|
||||
`docs/INSTALLATION.md`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`,
|
||||
`ansible/`,
|
||||
`windows/`,
|
||||
`windows/installkit/`.
|
||||
- Критерии приемки:
|
||||
matrix lists OS version, role, test date, result and limitations;
|
||||
unsupported combinations are documented explicitly;
|
||||
no production defaults are changed only for compatibility claims.
|
||||
|
||||
### P3-3. Reduce single-maintainer operational risk
|
||||
|
||||
- Почему нужно: `docs/RESIDUAL_RISKS_RU.md` identifies one-main-developer risk
|
||||
and pending reviewed PR evidence.
|
||||
- Риск: incident response and release continuity depend too much on one person.
|
||||
- Ожидаемый эффект: documented ownership, review evidence and handoff paths.
|
||||
- Сложность: организационная, средняя.
|
||||
- Объем работ: 1-3 месяца part-time.
|
||||
- Затрагиваемые файлы:
|
||||
`.github/CODEOWNERS`,
|
||||
`.github/pull_request_template.md`,
|
||||
`docs/PR_REVIEW_WORKFLOW_RU.md`,
|
||||
`docs/PR_REVIEW_EVIDENCE_RU.md`,
|
||||
`docs/REVIEW_CHECKLIST_RU.md`,
|
||||
`docs/RESIDUAL_RISKS_RU.md`.
|
||||
- Критерии приемки:
|
||||
at least one reviewed PR merged without bypass;
|
||||
release branch review policy documented;
|
||||
emergency maintainer handoff checklist exists;
|
||||
residual risk status updated only with real evidence.
|
||||
|
||||
### P3-4. Historical docs and naming hygiene
|
||||
|
||||
- Почему нужно: older docs still reference staged statuses, older check names
|
||||
or public-readiness context; this increases cognitive load for maintainers.
|
||||
- Риск: operators follow outdated docs or confuse GitHub public mirror checks
|
||||
with Russian release evidence.
|
||||
- Ожидаемый эффект: clearer current-state docs and archived historical records.
|
||||
- Сложность: низкая-средняя.
|
||||
- Объем работ: 3-6 инженерных дней.
|
||||
- Затрагиваемые файлы:
|
||||
`docs/PROJECT_STATUS_RU.md`,
|
||||
`docs/ROADMAP_CONFORMANCE_AUDIT_RU.md`,
|
||||
`docs/QUALITY_STATUS_RU.md`,
|
||||
`docs/registry/`,
|
||||
`README.md`,
|
||||
`ROADMAP.md`.
|
||||
- Критерии приемки:
|
||||
current-state docs contain current required check names;
|
||||
historical docs are marked historical and not operational runbooks;
|
||||
no product claims are strengthened without evidence;
|
||||
broken/stale links are corrected.
|
||||
|
||||
### P3-5. Long-horizon capacity sizing guide
|
||||
|
||||
- Почему нужно: current DetMir production is small; future deployments need
|
||||
sizing guidance for AW SQLite, ClickHouse, Influx/Grafana, DLP light profile
|
||||
and Windows collector load.
|
||||
- Риск: deployments scale by guesswork and overload the small-Proxmox pattern.
|
||||
- Ожидаемый эффект: sizing table by users/events/day, retention, disk, CPU/RAM
|
||||
and optional security contours.
|
||||
- Сложность: средняя.
|
||||
- Объем работ: 2-4 недели after P1 load harness data exists.
|
||||
- Затрагиваемые файлы:
|
||||
`docs/DLP_RESOURCE_PROFILES_RU.md`,
|
||||
`docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md`,
|
||||
`docs/DETMIR_CURRENT_STATE_RU.md`,
|
||||
`grafana/`,
|
||||
`scripts/operational-maturity-check.mjs`.
|
||||
- Критерии приемки:
|
||||
guide is based on measured data, not estimates only;
|
||||
separate profiles exist for 5, 20, 50 and 100 users;
|
||||
optional DLP/Hayabusa/Velociraptor resource costs are explicit;
|
||||
default production profile remains conservative.
|
||||
|
||||
## Не включено, потому что уже реализовано
|
||||
|
||||
- Включение dependency hygiene automation: `cargo machete`, `cargo deny`,
|
||||
`cargo audit`, `cargo tree --duplicates`, advisory `cargo udeps` уже есть в
|
||||
workflow.
|
||||
- Удаление текущих unused Rust dependencies: текущий `cargo machete
|
||||
--with-metadata` не нашел unused dependencies.
|
||||
- DetMir DLP light/core-only guardrails: runtime control, resource profiles,
|
||||
load guard and skipped-bucket semantics already implemented.
|
||||
- Security Finding Inbox and optional Hayabusa/Velociraptor findings path:
|
||||
schema, portal/API and fail-closed executor path already documented as
|
||||
optional and approval-driven.
|
||||
- Operational maturity smoke workflow: already exists and explicitly avoids
|
||||
heavy DLP/Loki/always-on Velociraptor.
|
||||
- Branch protection/CODEOWNERS/PR checklist basics: already documented; the
|
||||
remaining work is evidence and regular use, not creating the mechanism.
|
||||
|
||||
## Проверки, использованные для аудита
|
||||
|
||||
```bash
|
||||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian/adk-rust
|
||||
export CARGO_TARGET_DIR=/home/igor/.cache/detmir-adk-rust-target
|
||||
cargo metadata --locked --format-version 1
|
||||
cargo tree --duplicates --locked
|
||||
cargo audit --deny warnings
|
||||
cargo deny --manifest-path Cargo.toml check --config ../deny.toml --hide-inclusion-graph --show-stats
|
||||
cargo machete --with-metadata
|
||||
|
||||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian
|
||||
rg -n "dtolnay/rust-toolchain@(stable|[0-9])|rust-toolchain" .github/workflows rust-toolchain.toml
|
||||
rg -n "CLICKHOUSE_PASSWORD|--password" clickhouse-1c/ops clickhouse-1c/ai clickhouse-1c/etl
|
||||
sha256sum scripts/aw-contour-diag.sh scripts/detmir-full-diagnostics/aw-contour-diag.sh
|
||||
sha256sum scripts/check_production_inventory_placeholders.sh scripts/detmir-full-diagnostics/check_production_inventory_placeholders.sh
|
||||
wc -l adk-rust/crates/detmir-portal/src/main.rs adk-rust/crates/aw-windows-telemetry/src/main.rs proxmox/tsj_guardian_bot.py adk-rust/crates/worktime-api/src/main.rs ansible/deploy_aw_server.yml
|
||||
```
|
||||
Reference in New Issue
Block a user