Add production binary parity gate

This commit is contained in:
igor04091968
2026-07-01 19:56:15 +03:00
parent d79b37fff5
commit ce27a8170d
6 changed files with 578 additions and 5 deletions
+70
View File
@@ -61,6 +61,76 @@ cargo run -p quality-gate -- --root /mnt/usb_hdd2/Projects/ActivityWatch-Russian
Подробности эксплуатационного maturity harness: [эксплуатационная зрелость
DetMir/AWatch-rus](OPERATIONAL_MATURITY_RU.md).
## Production binary parity gate
Production binary parity gate доказывает, что production unit/timer/task
запускает тот же бинарник, который собран из проверяемого Git commit. Gate не
собирает данные с production самостоятельно и не включает DLP/Loki/Velociraptor:
оператор подготавливает evidence JSON, затем репозиторий проверяет SHA256.
Формат evidence: [пример production-binary-parity.example.json](fixtures/production-binary-parity.example.json).
Минимальные поля для каждого активного бинарника:
- `unit_or_task` - systemd unit/timer или Windows scheduled task.
- `binary_path` - фактический путь production executable.
- `crate` - Rust crate, из которого собран бинарник.
- `release_artifact` - имя файла в release directory.
- `runtime_role` - роль в production runtime.
- `production_sha256` - SHA256 production executable.
- `git_sha` - Git commit, из которого собран release.
Опциональные отключенные контуры, включая DLP runtime, указывать как
`"active": false` с `skip_reason`. Это фиксирует намеренное отключение без
ложного отказа gate.
Пример сбора SHA256 на Linux-хосте:
```bash
sha256sum /usr/local/bin/detmir-readiness-rust
systemctl show -p FragmentPath -p ExecStart detmir-readiness.service
```
Пример сбора SHA256 на Windows RDP host:
```powershell
Get-FileHash 'C:\Program Files\AWatch-rus\windows\aw-windows-telemetry.exe' -Algorithm SHA256
Get-ScheduledTask | Where-Object {$_.TaskName -like '*AWatch*'}
```
Проверка evidence против локальных release artifacts:
```bash
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian
export CARGO_TARGET_DIR=/home/igor/.cache/detmir-adk-rust-target
python3 scripts/check_production_binary_parity.py \
--evidence /path/to/production-binary-parity.json \
--output-json /path/to/production-binary-parity-report.json
```
Та же проверка может быть включена в существующий gate локальных release
artifacts:
```bash
PRODUCTION_BINARY_PARITY_EVIDENCE=/path/to/production-binary-parity.json \
scripts/check_detmir_rust_release_artifacts.sh
```
Ожидаемый результат:
```text
production_binary_parity=ok
```
Gate должен падать при:
- отсутствии активных production binaries;
- отсутствии обязательных полей;
- несовпадении `git_sha` с текущим repository HEAD;
- отсутствии локального release artifact;
- несовпадении production SHA256 и release SHA256.
## Browser smoke
Browser smoke не заменяет API/CLI проверки. Он подтверждает, что операторский
@@ -0,0 +1,44 @@
{
"schema_version": 1,
"generated_at_utc": "2026-07-01T00:00:00Z",
"git_sha": "0123456789abcdef0123456789abcdef01234567",
"items": [
{
"id": "aw-server:detmir-readiness.service",
"host": "aw-server-prod",
"kind": "systemd_service",
"unit_or_task": "detmir-readiness.service",
"binary_path": "/usr/local/bin/detmir-readiness-rust",
"crate": "detmir-readiness",
"release_artifact": "detmir-readiness",
"runtime_role": "readiness check",
"production_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"active": true
},
{
"id": "rdp:aw-windows-telemetry",
"host": "rdp-host-prod",
"kind": "windows_scheduled_task",
"unit_or_task": "AWatch-rus telemetry collector",
"binary_path": "C:\\Program Files\\AWatch-rus\\windows\\aw-windows-telemetry.exe",
"crate": "aw-windows-telemetry",
"release_artifact": "aw-windows-telemetry.exe",
"runtime_role": "Windows telemetry collector",
"production_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"platform": "windows",
"active": true
},
{
"id": "optional:dlp-aggregator",
"host": "aw-server-prod",
"kind": "systemd_service",
"unit_or_task": "dlp-aggregator.service",
"binary_path": "/usr/local/bin/dlp-aggregator-rust",
"crate": "dlp-aggregator",
"release_artifact": "dlp-aggregator",
"runtime_role": "optional DLP aggregator",
"active": false,
"skip_reason": "DLP runtime intentionally disabled for production load control"
}
]
}