harness/compact.py + cli.py compact [--dry-run|--vacuum|--verify-archives]: шум сек-уровня (CycleTicked sec, ReflexObserved без алерта/команд/каналов) старше часа → архив jsonl.gz (0600, строки целиком со sig) → мост цепочки (подписи унесённых строк, на которые ссылаются остающиеся, + маркеры boundary:<id> для legacy-границ) → подписанный StoreCompacted с sha256 архива/строк/моста → удаление пачками. audit.verify_events принимает мост только при совпадении хеша с подписанным событием; проекции подгружают мост лениво, если хвост перекрыл сжатый диапазон (rebuild с нуля). Репетиция на копии прода: 1389 → 200 МБ, verify 484 с/3.4 ГБ → 29 с/420 МБ, архив 246 МБ — все 2.47 млн подписей проверены; rebuild_projections OK. Найдено репетицией: legacy-граница (id 466633) и коллизия id сжатия в одну секунду — оба покрыты тестом. scripts/compact-store.sh — процедура с VACUUM под остановленными писателями. мин-уровень: если до ответа нужна работа >30 с — сначала короткий tg-reply, итог — cli.py tg-reply <id> --followup (в чат входящего: группа → группа; идемпотентно по тексту). p90 «старт LLM → ответ» был 223 с. hour: лимит 300 вызовов оставлен — реальный пик 205 (p90 169), 100 оборвал бы 8 из 19 тиков. Тесты: test_compact 25 PASS, test_followup 10 PASS; полный набор — без регрессий. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 lines
1.1 KiB
Bash
Executable file
19 lines
1.1 KiB
Bash
Executable file
#!/bin/bash
|
||
# Сжатие боевого стора с подписью (harness/compact.py, аудит 2026-10-16):
|
||
# 1) шум сек-уровня → подписанный архив + мост цепочки, удаление пачками (демоны живы);
|
||
# 2) VACUUM — под остановленными писателями: ждём тихое окно (нет LLM-воркера),
|
||
# стоп лестницы и TG-поллера (Telegram копит апдейты — ничего не теряется), старт.
|
||
# Использование: scripts/compact-store.sh [older_than_hours=1]
|
||
set -euo pipefail
|
||
cd "$(dirname "$0")/.."
|
||
export SIMBIOT_HOME="${SIMBIOT_HOME:-/var/lib/simbiot-harness}"
|
||
PY=./venv/bin/python
|
||
$PY cli.py compact --older-than-hours "${1:-1}"
|
||
for i in $(seq 1 180); do
|
||
pgrep -f '/harness/_llm_worker\.py$' >/dev/null || { sleep 3; pgrep -f '/harness/_llm_worker\.py$' >/dev/null || break; }
|
||
sleep 10
|
||
done
|
||
systemctl stop simbiot-harness simbiot-harness-tg
|
||
trap 'systemctl start simbiot-harness simbiot-harness-tg' EXIT
|
||
$PY cli.py compact --vacuum
|
||
$PY cli.py verify | tail -2
|