Этот документ — справочник по полям отчётов Revieko: что означает каждое поле, где оно встречается (PR-коммент / Full report / JSON), как его интерпретировать и какие типовые причины у “странных” значений.
Сначала прочитай: docs/PR_REVIEW_QUICKSTART.md (маршрут чтения за 3–5 минут).
Здесь — именно словарь полей.
В GitHub PR обычно есть два уровня выдачи:
PR-коммент (Summary)
Короткий: статусы, top-N hotspots, per-file structural risk, ссылки на Full report.
Full report (Markdown / JSON)
Полный артефакт: таблицы, дополнительные секции, служебные поля, лимиты анализа.
_risk ∈ [0,100] — нормализованные оценки, удобные для порогов и “светофора”._risk_level ∈ {low, medium, high} — дискретизация для быстрого решения._density ∈ [0,1] — доля “сигнальных” токенов/эффектов в выбранной области.path/to/file.py:LINE_START-LINE_ENDfile_pathline_start / line_end (1-based)Колонки Effects / Taint / Control в hotspots могут быть пустыми, если:
partial и кусок не попал в разбор.Типичный заголовок:
Status: High riskstruct_risk: 69.49hotspots: 10ci_status: warncontrol_risk_level: lowanalysis: full|partialНиже — расшифровка.
Status (человеческий статус)Где: Summary / Full report (Markdown)
Тип: string (обычно Low/Medium/High risk)
Смысл: человекочитаемая “выжимка” по риску/CI-политике.
Практически Status обычно согласован с risk_level + ci_status, но это именно “лейбл”.
risk_levelГде: Full report (Markdown), часто в JSON (зависит от режима CLI/интеграции)
Тип: enum: low | medium | high
Смысл: дискретный уровень структурного риска (для быстрого решения “копать или нет”).
Типовая интерпретация:
low: структурно похоже на типичный код репозитория.medium: стоит глянуть hotspots.high: заметная структурная аномалия — почти всегда ручной просмотр.struct_riskГде: Summary / Full report (Markdown)
Тип: float 0..100
Смысл: глобальный структурный риск для объекта анализа (PR/diff).
Важно:
Per-file structural risk.В JSON-репортах аналог обычно называется global_struct_risk.
hotspots (count)Где: Summary (короткий коммент)
Тип: int
Смысл: сколько hotspots показано в этом комментарии.
Важно:
ci_statusГде: Summary / Full report (Markdown), иногда JSON
Тип: enum: ok | warn | fail
Смысл: сигнал для CI/интеграции (как отображать/гейтить).
Типовая политика:
ok: пороги не превышены.warn: есть что посмотреть (soft gate).fail: строгий режим (hard gate) — зависит от настройки.control_risk_levelГде: Summary / Full report (Markdown), JSON (если включён control-канал)
Тип: enum: low | medium | high
Смысл: дискретный уровень “контрольной сложности” (условия / error-path / return-tail).
Интуиция:
low: ветвления/ошибки/return-хвосты выглядят нормально.high: условия и/или error-ветки и/или хвосты перегреты → читать трудно, легко ошибиться.analysis: full|partialГде: Summary / Full report (Markdown)
Тип: enum: full | partial
Смысл: покрытие отчётом поддерживаемых типов файлов.
full → весь поддерживаемый код в PR проанализирован (на текущем этапе — Python).partial → в PR есть изменения в файлах, которые CodeGuard не анализирует (например, YAML/CSV/Markdown и т.п.). Python-файлы при этом анализируются полностью; “partial” относится к PR как целому.Практика:
partial не надо трактовать как “Python разобран наполовину”.partial означает: “часть PR лежит вне области анализа и должна ревьюиться вручную”.Где: Summary / Full report (Markdown)
Смысл: вклад каждого файла в общий structural-риск.
Колонки:
File — путьRisk — структурный риск файла (0..100)Как читать:
В JSON аналог: file_struct_risk: { "path": number, ... }
Hotspot = локальный участок строк, который выглядит нетипично.
Типичная строка:
| Location | Kind | Score | Effects | Taint | Control |
|---|
Расшифровка колонок:
Locationfile.py:START-ENDKindТип: enum
Обычно:
struct_pattern_break — “слом типичного структурного рисунка” в окне (нетипичные маркеры IF/LOOP/RETURN/..., новые “паттерны”, смена стиля).depth_spike — локально аномальная вложенность.control_outlier — окно перегрето по control-режимам (условия/error/return).mixed — нет одного доминанта, но окно всё равно выбивается.ScoreТип: float (ранжирование)
Смысл: приоритет просмотра (чем больше — тем выше в списке).
Важно:
score — не вероятность бага и не абсолютная “оценка качества”.EffectsТип: string / метка / краткая подсказка
Смысл: семантическая подсказка про side-effects (если semantic-канал включён и что-то найдено).
Обычно эффекты (уровень токенов/фрагментов):
LOG, DB, FILE_IO, NET_IO, EXEC (и т.п.)TaintТип: string / метка / краткая подсказка
Смысл: источники данных рядом (если включено):
USER_INPUT — входные данныеSECRET — потенциальные секретыCONST — константыControlТип: string / метка / краткая подсказка
Смысл: контрольный контекст окна:
BRANCH_COND, ERROR_PATH, RETURN_PATH, INIT_PATH, CLEANUP_PATH, NORMALОбычно:
file_path: stringline_start, line_end: int (1-based)segment_id: string (например, hunk_0)segment_kind: enum (diff_hunk, full_file, …)kind: enumscore: floateffect_hint, taint_hint, control_hintГде: Full report (Markdown) и JSON (если включён control-канал)
В PR-репорте может быть таблица:
| File | overall | branch_cond | error_path | return_path |
|---|
Смысл:
overall — общий control-риск для файла (обычно агрегат/максимум).branch_cond — риск ветвлений/условий.error_path — риск error-веток.return_path — риск “return/raise-хвостов”.control_summary.per_file[path]Полевая модель (часто встречается как “пер-файл агрегаты”):
control_share_branch_condcontrol_share_error_pathcontrol_share_return_pathcontrol_share_init_pathcontrol_share_cleanup_pathcontrol_*_complexity_meancontrol_*_complexity_maxbranch_cond_effect_densityerror_path_effect_densityreturn_path_effect_densitybranch_cond_riskerror_path_riskreturn_path_riskoverall_control_riskПримеры:
branch_cond_risk высокий + branch_cond_effect_density > 0 → в условиях происходит IO/NET/DB/LOG (часто подозрительно и плохо читается).error_path_risk высокий + error_path_effect_density высокий → обработчики ошибок делают много эффектов.return_path_risk высокий + return_path_effect_density высокий → “перед возвратом” происходит эффектная логика (меняет поведение на выходе).Если semantic-канал включён, в JSON (и иногда в Markdown) появляются поля, связанные с эффектами и “опасными” потоками.
effect_summaryГде: JSON, иногда Full report (Markdown)
Смысл: агрегаты по эффектам/taint.
effect_summary.per_file[path] (по файлам)Типовые метрики:
effect_density_tail ∈ [0,1]
Доля “эффектных” токенов (NET/DB/FILE/EXEC/LOG) в хвосте файла/сегмента.
Интуиция: ближе к 1 → хвост “плотно эффектный”.
dangerous_flow_score ∈ [0,1]
Грубый сигнал, что USER_INPUT проходит рядом с эффектами (NET_IO/DB/EXEC/LOG).
> 0 → найден хотя бы один потенциально опасный соседний flow.
secret_leak_score ∈ [0,1]
Грубый сигнал, что SECRET встречается рядом с LOG / NET_IO.
> 0 → возможная утечка секретов.
effect_summary.globalМаксимумы/агрегаты по всем файлам отчёта — быстрый ответ “есть ли вообще effect-активность”.
file_semantic_risk и file_semantic_risk_levelГде: JSON
Тип:
file_semantic_risk[path] ∈ [0,100]file_semantic_risk_level[path] ∈ {low, medium, high}Смысл: repo-aware оценка “семантического” риска файла (эффектный хвост + suspicious flow + поправка по истории).
Частое правило приоритизации:
struct_risk и высокий file_semantic_risk по одному и тому же файлу → файл почти всегда стоит ревьюить вручную “в первую очередь”.taint (как интерпретировать)Taint-метки обычно не “про безопасность”, а про источники данных рядом:
USER_INPUT → важно смотреть, куда дальше идёт значение (особенно рядом с NET/DB/EXEC/LOG)SECRET → важно смотреть, нет ли рядом логирования/сетиЕсли подключены командные правила (семантические инварианты), отчёт может содержать:
invariant_violations: список нарушенийЭто самый “жёсткий” и понятный слой:
правило нарушено → вот место → исправляем или осознанно исключаем.
partialanalysis=partial означает: в PR есть файлы вне профиля анализа (на текущем этапе CodeGuard заточен под Python-код). Примеры: YAML, CSV, Markdown, ассеты, данные, конфиги и т.п.
partialЕсли проекту важно, чтобы YAML/Markdown/CSV тоже проходили “автоматический радар”, это отдельный roadmap: подключать анализаторы для новых типов/языков и расширять scope.
В зависимости от интеграции/версии могут присутствовать:
Generated / timestamp (в Markdown шапке)repo_root, pr_number (в JSON)Markdown / JSON (в Summary)expires_at_unix_s (в Summary, если ссылки на Full report имеют срок действия) Unix time (секунды), когда токенизированная ссылка/артефакт может истечь.Markdown struct_risk (в PR Summary/Full report)
≈ JSON global_struct_risk
Markdown “Per-file structural risk”
≈ JSON file_struct_risk
Markdown “Hotspots” (таблица top-N)
≈ JSON hotspots (может быть шире/полнее в полном артефакте)
Markdown analysis: full|partial
⇐ выводится из analysis_limits + fallback/ограничений
control_summary везде 0.0?Effects/Taint пустые в hotspots?