Постоянный слой снимков состояния для Dashboard V2. Используется для исторических трендов, ручных базовых точек, compare/export workflow и evidence вокруг release gate.
Назначение¶
Слой снимков больше не является только кэшем временных рядов. Это хранилище evidence с метаданными, которое используется для:
- трендов и period compare в dashboard
- ручных снимков проекта и группы
- snapshot-to-snapshot compare и export
- автоматических pre/post снимков release gate
- snapshot context в release-driven notifications
Модель снимка¶
Каждый снимок хранит как агрегированные оценки, так и provenance-метаданные.
Базовые поля идентификации:
idscope—project,groupилиportfolioscope_ref— каноническая ссылка на объектproject_name/group_idпри необходимостиtimestamp
Метаданные evidence:
reasoninitiatortrigger_sourceanalyzer_versionrule_versionsource_refimmutableretention_class
Данные payload:
- сводки по health, audit, compliance, release, SCA и quality
- source bundle для compare/export
- сериализованный snapshot payload для последующего воспроизведения
Жизненный цикл¶
Снятие -> Сохранение -> Compare / Export -> Хранение / Cleanup
Источники создания снимков:
- фоновый планировщик
- ручные вызовы API и CLI
- автоматизация pre/post release gate
Правила retention:
- стандартная очистка использует
dashboard.snapshot_retention_days - снимки с
immutableзащищены от обычного cleanup - release-triggered снимки могут иметь отдельный retention class
API¶
Все endpoint’ы находятся под /api/v2/dashboard.
Создание ручного снимка¶
POST /snapshots
Используется для ручного сохранения baseline для project, group или portfolio.
Основные поля запроса:
scopeproject_nameилиgroup_idreasontrigger_sourceanalyzer_versionrule_versionsource_refimmutableretention_class
ACL совпадает с правилами ProjectContext для исходного project/group.
Список снимков¶
GET /snapshots
Поддерживаемые фильтры:
scopeproject_namegroup_idlimit
Максимум записей ограничивается dashboard.snapshot_list_limit.
Policy immutable snapshots¶
GET /snapshots/policy
Возвращает live-контракт immutable-governance. Текущий runtime mode:
immutable_governance_mode = no_delete_policydelete_supported = falsearchival_supported = false- обычный cleanup по-прежнему уважает
immutable = true
Сравнение снимков¶
POST /snapshots/compare
Поддерживаемые режимы:
- сравнение по
from_snapshot_idиto_snapshot_id - сравнение по legacy timestamp path для проекта
Результат compare включает:
- дельты метрик
trend_directiondimension_statesсо значениямиimproved,regressed,unchanged- опциональные
drilldown_categories - опциональные
drilldown_previews
Экспорт снимка или compare-отчёта¶
POST /snapshots/{snapshot_id}/export
Поддерживаемые форматы:
jsonmarkdownpdf
Если передан baseline_snapshot_id, формируется compare-report, а не экспорт одного снимка.
Endpoint’ы трендов¶
Существующие routes трендов остаются доступными:
GET /snapshots/{project_name}/trendsGET /snapshots/{project_name}/diffGET /snapshots/{project_name}/compare-periods
Эти routes используют persistent snapshot data, когда она доступна, и остаются совместимыми с общей моделью dashboard trends.
CLI¶
Реализовано в src/cli/dashboard_commands.py.
Доступные команды:
dashboard snapshot createdashboard snapshot listdashboard snapshot showdashboard snapshot policydashboard snapshot comparedashboard snapshot export
Примеры:
codegraph dashboard snapshot create --scope project --project my-service --reason "pre-hardening"
codegraph dashboard snapshot list --scope portfolio --group team-a --format json
codegraph dashboard snapshot show <snapshot_id> --format json
codegraph dashboard snapshot policy --format json
codegraph dashboard snapshot compare --from-snapshot <id1> --to-snapshot <id2> --include-drilldown
codegraph dashboard snapshot export <snapshot_id> --baseline-snapshot <older_id> --format markdown
Интеграция с release gate¶
POST /api/v1/release/check может создавать:
presnapshot до проверкиpostsnapshot после проверки
В ответ добавлены поля:
pre_snapshot_idpost_snapshot_idsnapshot_diff
Поведение управляется через:
dashboard.snapshot_release_pre_enableddashboard.snapshot_release_post_enableddashboard.snapshot_release_immutabledashboard.snapshot_release_retention_class
Интеграция с notifications¶
Notification service использует snapshot-derived context для release-driven notifications. В текущем срезе в event payload передаются:
- идентификаторы снимков
- краткая сводка compare diff
- контекст release outcome
Это позволяет привязать release alerts к воспроизводимому evidence, а не только к строке статуса.
Настройка¶
Ключевые параметры в секции dashboard:
snapshot_enabledsnapshot_interval_minutessnapshot_retention_dayssnapshot_db_pathsnapshot_list_limitsnapshot_release_pre_enabledsnapshot_release_post_enabledsnapshot_release_immutablesnapshot_release_retention_class
Эксплуатационные замечания¶
- Хранилище использует SQLite и создаётся автоматически при первом обращении.
- Для фоновой записи рекомендуется один активный экземпляр scheduler.
- Ручные snapshots и compare/export можно использовать и без включённого фонового scheduler.
immutableтеперь оформлен как явныйno_delete_policy: runtime не экспонирует delete или mutate endpoints, а обычный cleanup пропускает immutable records.
Основные файлы¶
| Файл | Назначение |
|---|---|
src/api/services/dashboard/snapshot_store.py |
Persistent storage и миграция схемы снимков |
src/api/services/dashboard/history.py |
Семантика compare и drilldown |
src/api/services/dashboard/export.py |
Экспорт снимков и compare |
src/api/services/dashboard/snapshot_scheduler.py |
Плановый сбор снимков |
src/api/routers/dashboard_v2.py |
REST endpoints list/create/compare/export/trends |
src/api/routers/release_gate.py |
Автоматические pre/post snapshots для release gate |
tests/unit/test_dashboard_v2/test_snapshot_store.py |
Покрытие snapshot store |
tests/unit/test_dashboard_v2/test_history_service.py |
Покрытие compare semantics |