{"methodology":{"version":"1.6","scale":100,"min_category_coverage":0.5,"low_confidence_categories":3,"max_security_scan_age_days":90,"max_ci_run_age_days":90,"categories":{"security":{"weight":18,"title":"Безопасность","short":"Security"},"code_health":{"weight":21,"title":"Состояние кода и техдолг","short":"Code health"},"activity":{"weight":18,"title":"Активность проекта","short":"Activity"},"docs":{"weight":17,"title":"Документация и практики","short":"Docs"},"ci":{"weight":13,"title":"CI/CD","short":"CI/CD"},"issues":{"weight":13,"title":"Работа с issues","short":"Issues"}},"metrics":[{"id":"security.open_weighted","category":"security","weight":5,"title":"Открытые уязвимости, взвешенные по критичности","unit":"балл риска","display":"number","normalize":{"fn":"linear","lo":30,"hi":0}},{"id":"security.resolved_ratio_90d","category":"security","weight":2,"title":"Доля исправленных findings за 90 дней","unit":"","display":"percent","normalize":{"fn":"ratio"}},{"id":"security.open_secrets","category":"security","weight":3,"title":"Открытые секреты в коде","unit":"шт.","display":"number","normalize":{"fn":"steps","steps":[[0,1.0],[1,0.0]]}},{"id":"security.scan_fresh","category":"security","weight":1,"title":"Свежий скан безопасности (≤ 30 дней)","unit":"","display":"bool","normalize":{"fn":"bool"}},{"id":"code.todo_density","category":"code_health","weight":3,"title":"Плотность TODO/FIXME/HACK на 1000 строк кода","unit":"на 1000 строк","display":"number","normalize":{"fn":"linear","lo":20,"hi":1}},{"id":"code.todo_old_share","category":"code_health","weight":2,"title":"Доля TODO старше 6 месяцев","unit":"","display":"percent","normalize":{"fn":"linear","lo":1,"hi":0}},{"id":"code.tests_ratio","category":"code_health","weight":3,"title":"Тесты: наличие и доля тестового кода","unit":"кода в тестах","display":"percent","normalize":{"fn":"steps","steps":[[0,0.0],[0.0001,0.5],[0.05,0.75],[0.15,1.0]]}},{"id":"code.lockfile","category":"code_health","weight":1,"title":"Зафиксированные зависимости (lockfile) при наличии манифеста","unit":"","display":"bool","normalize":{"fn":"bool"}},{"id":"code.heavy_files_share","category":"code_health","weight":1,"title":"Доля крупных и бинарных файлов","unit":"","display":"percent","normalize":{"fn":"linear","lo":0.3,"hi":0.02}},{"id":"code.quality_tooling","category":"code_health","weight":1,"title":"Линтеры, форматтеры, editorconfig","unit":"инструментов","display":"number","normalize":{"fn":"steps","steps":[[0,0.0],[1,0.7],[2,1.0]]}},{"id":"activity.days_since_last_commit","category":"activity","weight":3,"title":"Давность последнего осмысленного коммита","unit":"дней назад","display":"days","normalize":{"fn":"recency","tau":90}},{"id":"activity.meaningful_commits_90d","category":"activity","weight":2,"title":"Осмысленные коммиты за 90 дней","unit":"шт.","display":"number","normalize":{"fn":"log_saturate","k":30}},{"id":"activity.human_authors_365d","category":"activity","weight":2,"title":"Живые авторы за год (без ботов)","unit":"чел.","display":"number","normalize":{"fn":"log_saturate","k":3}},{"id":"activity.bus_factor","category":"activity","weight":2,"title":"Bus factor (авторов, покрывающих 50% коммитов за год)","unit":"чел.","display":"number","normalize":{"fn":"steps","steps":[[0,0.0],[1,0.2],[2,0.6],[3,1.0]]}},{"id":"activity.merged_prs_90d","category":"activity","weight":1,"title":"Влитые PR за 90 дней","unit":"шт.","display":"number","normalize":{"fn":"log_saturate","k":10}},{"id":"activity.pr_authors_365d","category":"activity","weight":1,"title":"Разных авторов влитых PR за год","unit":"чел.","display":"number","normalize":{"fn":"log_saturate","k":2}},{"id":"activity.release_recency_days","category":"activity","weight":1,"title":"Давность последнего релиза или тега","unit":"дней назад","display":"days","normalize":{"fn":"recency","tau":180}},{"id":"docs.readme_quality","category":"docs","weight":4,"title":"README: наличие, объём и ключевые разделы","unit":"","display":"percent","normalize":{"fn":"ratio"}},{"id":"docs.license","category":"docs","weight":2,"title":"Лицензия (распознанный SPDX)","unit":"","display":"license","normalize":{"fn":"ratio"}},{"id":"docs.practices","category":"docs","weight":2,"title":"CONTRIBUTING, CODEOWNERS, CHANGELOG, SECURITY.md","unit":"из 4","display":"number","normalize":{"fn":"linear","lo":0,"hi":3}},{"id":"docs.description","category":"docs","weight":1,"title":"Описание репозитория заполнено в SourceCraft","unit":"","display":"bool","normalize":{"fn":"bool"}},{"id":"docs.sourcecraft_policies","category":"docs","weight":2,"title":"Правила ревью и политики веток","unit":"из 2","display":"number","normalize":{"fn":"steps","steps":[[0,0.0],[1,0.6],[2,1.0]]}},{"id":"docs.run_instructions","category":"docs","weight":2,"title":"Инструкция запуска и сборки","unit":"","display":"bool","normalize":{"fn":"bool"}},{"id":"ci.config_present","category":"ci","weight":3,"title":"Есть конфигурация CI (.sourcecraft/ci.yaml)","unit":"","display":"bool","normalize":{"fn":"bool"}},{"id":"ci.success_rate","category":"ci","weight":4,"title":"Успешные прогоны среди последних 30 (с весом по свежести)","unit":"","display":"percent","normalize":{"fn":"ratio"}},{"id":"ci.last_status_ok","category":"ci","weight":2,"title":"Последний прогон успешен","unit":"","display":"bool","normalize":{"fn":"bool"}},{"id":"ci.flakiness","category":"ci","weight":2,"title":"Нестабильность: чередование успех/провал","unit":"","display":"percent","normalize":{"fn":"linear","lo":0.6,"hi":0.1}},{"id":"ci.duration_median_min","category":"ci","weight":1,"title":"Медианная длительность прогона","unit":"мин","display":"number","normalize":{"fn":"linear","lo":30,"hi":5}},{"id":"ci.pr_trigger","category":"ci","weight":1,"title":"CI запускается на pull request","unit":"","display":"bool","normalize":{"fn":"bool"}},{"id":"issues.stale_share","category":"issues","weight":3,"title":"Зависшие открытые issues (без обновления > 60 дней)","unit":"открытых","display":"percent","normalize":{"fn":"linear","lo":1,"hi":0}},{"id":"issues.first_response_median_h","category":"issues","weight":3,"title":"Медиана первого ответа или текущего ожидания","unit":"ч","display":"number","normalize":{"fn":"linear","lo":336,"hi":24}},{"id":"issues.close_median_days","category":"issues","weight":2,"title":"Медианное время закрытия (за 180 дней)","unit":"дней","display":"number","normalize":{"fn":"linear","lo":90,"hi":7}},{"id":"issues.backlog_trend","category":"issues","weight":2,"title":"Закрытые / созданные за 90 дней","unit":"","display":"ratio","normalize":{"fn":"linear","lo":0.5,"hi":1.2}},{"id":"issues.triage_usage","category":"issues","weight":1,"title":"Использование меток, приоритетов, исполнителей","unit":"issues","display":"percent","normalize":{"fn":"ratio"}}],"gates":[{"id":"gate.security.critical_open","category":"security","when":"raw.get('security.open_critical', 0) > 0","cap":25,"title":"Открытая critical-уязвимость по данным AppSec"},{"id":"gate.security.secret_open","category":"security","when":"raw.get('security.open_secrets_high', 0) > 0","cap":15,"title":"Находка Secret scanning высокой критичности"},{"id":"gate.ci.five_failures","category":"ci","when":"raw.get('ci.last5_all_failed') is True","cap":30,"title":"Последние 5 прогонов CI неуспешны"},{"id":"gate.activity.dead_year","category":"activity","when":"raw.get('activity.last_commit_confirmed') is True and raw.get('activity.days_since_last_commit') is not None and raw['activity.days_since_last_commit'] > 365","cap":20,"title":"Нет коммитов больше года"},{"id":"gate.docs.no_readme","category":"docs","when":"raw.get('docs.readme_length') == 0","cap":40,"title":"README отсутствует"}],"modifiers":[{"id":"mod.activity.authenticity","category":"activity","when":"raw.get('activity.authenticity') is not None and raw['activity.authenticity'] < 0.5","multiply_by_raw":"activity.authenticity","title":"Признаки искусственной активности: пустые, залповые или шаблонные коммиты","flag":"artificial_activity"}],"strengths_threshold":0.8,"weaknesses_threshold":0.3},"rules":[{"id":"sec.critical_open","category":"security","resolves_gate":"gate.security.critical_open","severity":"critical","effort":"medium","title":"Проверить {raw[security.open_critical]} находок AppSec критической важности","problem":"SourceCraft AppSec показывает открытые находки с критической оценкой.","why":"Причина может быть в коде, зависимости или секрете; риск нужно подтвердить по каждой находке.","action":"Откройте находки в SourceCraft, проверьте их применимость, исправьте подтверждённые проблемы и повторите сканирование.","evidence":["security.open_by_severity"],"whatif":{"security.open_critical":0},"link":"/security/overview"},{"id":"sec.appsec_open","category":"security","severity":"medium","severity_when":[{"when":"raw.get('security.open_high_nonsecret', 0) > 0","severity":"high"}],"effort":"medium","title":"Разобрать {raw[security.open_noncritical_nonsecret]} открытых находок AppSec","problem":"SourceCraft AppSec показывает открытые находки в коде, зависимостях или конфигурации.","why":"Находки требуют проверки применимости: часть может быть ложным срабатыванием, подтверждённые проблемы нужно исправить.","action":"Откройте список AppSec, разберите находки по важности, исправьте подтверждённые и повторите сканирование. Ложные срабатывания закройте в SourceCraft.","evidence":["security.open_by_severity"],"whatif_security":true,"link":"/security/overview"},{"id":"sec.secret_open","category":"security","severity":"medium","effort":"low","title":"Проверить возможный секрет в репозитории","problem":"SourceCraft Secret scanning пометил данные как возможный секрет; находку нужно проверить.","why":"Сканер может сработать на тестовый ключ; действующий ключ в публичном репозитории нужно отзывать.","action":"Откройте находку в SourceCraft. Если ключ действующий, отзовите его, вынесите в секреты CI и повторите сканирование. Если это тестовый пример, закройте находку как ложное срабатывание.","evidence":["security.open_by_severity"],"whatif":{"security.open_secrets":0},"link":"/security/secrets"},{"id":"sec.secret_high","category":"security","resolves_gate":"gate.security.secret_open","severity":"critical","effort":"low","title":"Проверить находку Secret scanning высокой критичности","problem":"SourceCraft пометил возможный секрет как находку высокой критичности.","why":"Если ключ действующий, его следует считать скомпрометированным даже после удаления коммита.","action":"Проверьте находку в SourceCraft. Если ключ действующий, отзовите его, вынесите в секреты CI и повторите сканирование.","evidence":["security.open_by_severity"],"whatif":{"security.open_secrets_high":0},"link":"/security/secrets"},{"id":"sec.refresh_scan","category":"security","allow_no_data":true,"severity":"low","effort":"low","title":"Проверить AppSec для текущего коммита","problem":"Находки прошлого коммита не подтверждают состояние текущего; Security временно без оценки.","why":"После изменения кода находки могли остаться, исчезнуть или появиться заново.","action":"Проверьте статус сканирования в SourceCraft. Если новый скан не запущен, запустите его для текущего коммита, затем обновите анализ.","delta_note":"Новый скан покажет, какие находки актуальны; изменение Score заранее неизвестно.","evidence":["security.prior_open_count"],"link":"/security/overview"},{"id":"ci.no_config","category":"ci","severity":"high","effort":"medium","title":"Настроить CI: добавить .sourcecraft/ci.yaml","problem":"В репозитории нет конфигурации CI.","why":"Без автоматических проверок изменения не проверяются, качество зависит от дисциплины каждого автора.","action":"Добавьте `.sourcecraft/ci.yaml` с workflow на push и pull_request: установка зависимостей, линтер, тесты.","evidence":["files.ci_config"],"whatif":{"ci.config_present":true,"ci.pr_trigger":true},"link":""},{"id":"ci.failing","category":"ci","resolves_gate":"gate.ci.five_failures","severity":"high","effort":"medium","title":"Починить падающий CI","problem":"Последний прогон CI завершился неуспешно (успешных среди последних: {pct[ci.success_rate]}).","why":"Красный CI обесценивает проверки: команда перестаёт обращать внимание на статус.","action":"Откройте последний неуспешный прогон, устраните причину, добейтесь зелёного статуса на ветке по умолчанию.","evidence":["ci.runs_seen"],"whatif":{"ci.last_status_ok":true,"ci.success_rate":0.9,"ci.last5_all_failed":false},"link":"/cicd/runs"},{"id":"ci.unstable","category":"ci","severity":"medium","effort":"medium","title":"Разобраться с ошибками CI","problem":"Среди последних пяти запусков есть ошибка; успешность в наблюдаемой истории — {pct[ci.success_rate]}.","why":"Неуспешные проверки снижают уверенность в новых изменениях.","action":"Откройте последние неуспешные прогоны, найдите повторяющуюся причину и проверьте исправление следующим запуском.","evidence":["ci.runs_seen"],"whatif":{"ci.success_rate":0.9,"ci.flakiness":0.1},"link":"/cicd/runs"},{"id":"ci.no_pr_trigger","category":"ci","severity":"low","effort":"low","title":"Запускать CI на pull request","problem":"CI запускается только на push, PR не проверяются до слияния.","why":"Проверка до слияния дешевле, чем исправление после.","action":"Добавьте триггер `pull_request` в блок `on` файла `.sourcecraft/ci.yaml`.","evidence":["files.ci_config"],"whatif":{"ci.pr_trigger":true},"link":"/-/blob/{branch}/.sourcecraft/ci.yaml"},{"id":"docs.no_license","category":"docs","severity":"low","effort":"low","title":"Добавить файл LICENSE","problem":"В репозитории нет лицензии.","why":"Для открытого проекта явные условия использования упрощают повторное применение кода.","action":"Если хотите разрешить повторное использование кода, добавьте подходящую лицензию в корень репозитория.","evidence":["files.license"],"whatif":{"docs.license":1.0},"link":""},{"id":"docs.license_unknown","category":"docs","severity":"low","effort":"low","title":"Использовать стандартный текст лицензии","problem":"Файл LICENSE есть, но текст не распознаётся как стандартная лицензия.","why":"Нестандартную лицензию сложно проверить автоматически при выборе компонента.","action":"Замените текст на стандартный (SPDX) вариант.","evidence":["files.license"],"whatif":{"docs.license":1.0},"link":"/-/blob/{branch}/LICENSE"},{"id":"docs.readme_missing","category":"docs","resolves_gate":"gate.docs.no_readme","severity":"high","effort":"low","title":"Написать README","problem":"README отсутствует.","why":"README — первое, что видит пользователь; без него проект не выбирают.","action":"Опишите назначение, установку, запуск, сборку и тесты; добавьте пример использования.","evidence":["files.readme"],"whatif":{"docs.readme_quality":1.0,"docs.readme_length":2000,"docs.run_instructions":true},"link":""},{"id":"docs.readme_short","category":"docs","severity":"medium","effort":"low","title":"Дополнить короткий README","problem":"README короче 200 символов и почти не объясняет проект.","why":"Новому участнику сложно понять назначение проекта и как его запустить.","action":"Добавьте краткое описание, команду запуска и пример использования.","evidence":["files.readme"],"whatif":{"docs.readme_quality":0.7,"docs.readme_length":500,"docs.run_instructions":true},"link":"/-/blob/{branch}/README.md"},{"id":"docs.readme_sections","category":"docs","severity":"medium","effort":"low","title":"Дополнить README недостающими разделами","problem":"В README нет части ключевых разделов (установка, запуск, сборка, тесты, использование, лицензия).","why":"Неполная документация увеличивает порог входа и число вопросов в issues.","action":"Добавьте недостающие разделы с командами в блоках кода.","evidence":["files.readme"],"whatif":{"docs.readme_quality":1.0,"docs.run_instructions":true},"link":"/-/blob/{branch}/README.md"},{"id":"docs.run_instructions","category":"docs","severity":"medium","effort":"low","title":"Добавить инструкцию запуска и сборки","problem":"Не найдены ни раздел запуска в README, ни Makefile/Dockerfile/compose.","why":"Без воспроизводимого запуска проект сложно оценить и в него сложно вносить вклад.","action":"Добавьте раздел «Запуск» с командами или Makefile/docker-compose.","evidence":["files.readme"],"whatif":{"docs.run_instructions":true},"link":"/-/blob/{branch}/README.md"},{"id":"docs.practices","category":"docs","severity":"low","effort":"low","title":"Добавить CONTRIBUTING и CODEOWNERS","problem":"Нет CONTRIBUTING, CODEOWNERS, CHANGELOG и SECURITY.md.","why":"Для проекта с несколькими авторами правила вклада и владельцы кода ускоряют ревью.","action":"Добавьте CONTRIBUTING.md и CODEOWNERS, ведите CHANGELOG.","evidence":["files.practices"],"whatif":{"docs.practices":3},"link":""},{"id":"docs.policies","category":"docs","severity":"low","effort":"low","title":"Включить правила ревью и защиту веток SourceCraft","problem":"Нет `.sourcecraft/review.yaml` и `branches.yaml` при активных PR.","why":"Обязательное ревью и защищённая ветка по умолчанию предотвращают случайные слияния.","action":"Добавьте `.sourcecraft/review.yaml` (need_ships ≥ 1) и `branches.yaml` с защитой ветки по умолчанию.","evidence":["files.practices"],"whatif":{"docs.sourcecraft_policies":2},"link":""},{"id":"docs.description","category":"docs","severity":"low","effort":"low","title":"Заполнить описание репозитория","problem":"Описание репозитория в SourceCraft пустое или слишком короткое.","why":"Описание видно в каталоге и рейтинге, по нему проект находят.","action":"Заполните поле «Описание» в настройках репозитория одним-двумя предложениями.","evidence":["meta.description"],"whatif":{"docs.description":true},"link":""},{"id":"code.todo_heavy","category":"code_health","severity":"medium","effort":"medium","title":"Разобрать накопленные TODO/FIXME ({raw[code.todo_total_int]} шт.)","problem":"Плотность TODO/FIXME/HACK: {fmt[code.todo_density]} на 1000 строк.","why":"Накопленные пометки — признак незавершённой работы и техдолга, который никто не отслеживает.","action":"Переведите TODO в issues с приоритетом, устраните устаревшие, запретите новые без ссылки на задачу.","evidence":["code.todo_total","code.todo_old_180d"],"whatif":{"code.todo_density":1,"code.todo_old_share":0},"link":""},{"id":"code.todo_old","category":"code_health","severity":"low","effort":"medium","title":"Закрыть устаревшие TODO","problem":"Больше половины TODO старше 6 месяцев.","why":"Старые TODO почти никогда не выполняются и вводят в заблуждение.","action":"Проверьте старые пометки: выполните, удалите или превратите в issues.","evidence":["code.todo_old_180d"],"whatif":{"code.todo_old_share":0},"link":""},{"id":"code.no_tests","category":"code_health","severity":"high","effort":"high","title":"Добавить автоматические тесты","problem":"В репозитории не найдено тестов.","why":"Без тестов CI проверяет только сборку, регрессии находят пользователи.","action":"Добавьте тесты на ключевые сценарии и запуск тестов в CI.","evidence":["code.test_files"],"whatif":{"code.tests_ratio":0.1},"link":""},{"id":"code.lockfile","category":"code_health","severity":"low","effort":"low","title":"Зафиксировать версии зависимостей","problem":"Есть манифест зависимостей без lockfile в том же подпроекте.","why":"Без фиксации версий сборка невоспроизводима, обновления ломают проект незаметно.","action":"Добавьте lockfile (package-lock.json, poetry.lock, go.sum и т.п.) и коммитьте его.","evidence":["files.dependencies"],"whatif":{"code.lockfile":true},"link":""},{"id":"code.tooling","category":"code_health","severity":"low","effort":"low","title":"Подключить линтер и форматтер","problem":"Не найдены конфигурации линтеров и форматтеров.","why":"Единый стиль и статические проверки снижают шум в ревью и число мелких ошибок.","action":"Добавьте линтер для основного языка и .editorconfig, включите проверку в CI.","evidence":["files.tooling"],"whatif":{"code.quality_tooling":2},"link":""},{"id":"activity.dead","category":"activity","resolves_gate":"gate.activity.dead_year","severity":"high","effort":"high","title":"Проект не обновлялся больше года","problem":"Последний коммит был {days[activity.days_since_last_commit]} дней назад.","why":"Без изменений проект может устаревать, а пользователям сложно понять, поддерживается ли он.","action":"Обновите зависимости, закройте или пометьте issues, опубликуйте статус проекта в README (поддерживается / архив).","evidence":["git.last_commit_at"],"whatif":{"activity.days_since_last_commit":10,"activity.meaningful_commits_90d":5},"link":"/-/commits/{branch}"},{"id":"activity.maintenance_status","category":"activity","severity":"low","effort":"low","title":"Прояснить статус поддержки проекта","problem":"Осмысленных коммитов за 90 дней нет; последний был {days[activity.days_since_last_commit]} дней назад.","why":"Длительная пауза не обязательно означает проблему, но пользователю важно понимать, поддерживается ли проект.","action":"Укажите в README, поддерживается ли проект и куда сообщать об ошибках. Если работа продолжается, обновите план и публикуйте реальные изменения по мере готовности; если завершена — отметьте это явно.","evidence":["git.last_commit_at"],"link":"/-/commits/{branch}"},{"id":"activity.bus_factor","category":"activity","severity":"medium","effort":"high","title":"Снизить зависимость от одного разработчика","problem":"Bus factor = 1: половину коммитов за год сделал один человек.","why":"Уход ключевого разработчика останавливает проект.","action":"Вовлекайте второго maintainer'а, распределяйте ревью, документируйте архитектуру.","evidence":["git.bus_factor_365d","git.human_authors_365d"],"whatif":{"activity.bus_factor":2,"activity.human_authors_365d":3},"link":""},{"id":"activity.artificial","category":"activity","severity":"medium","effort":"low","title":"Убрать пустые и залповые коммиты","problem":"Индекс подлинности активности {fmt[activity.authenticity]}: много пустых, шаблонных или залповых коммитов.","why":"Такая активность не учитывается в Score и помечается как искусственная.","action":"Коммитьте осмысленные изменения с описательными сообщениями, объединяйте залпы в один коммит.","evidence":["git.activity_authenticity"],"whatif":{"activity.authenticity":1.0},"link":"/-/commits/{branch}"},{"id":"activity.no_releases","category":"activity","severity":"low","effort":"low","title":"Публиковать релизы","problem":"Активный проект без релизов и тегов.","why":"Релизы дают пользователям стабильные версии и changelog.","action":"Создайте тег и релиз в SourceCraft, ведите версии по semver.","evidence":["releases.count","tags.count"],"whatif":{"activity.release_recency_days":30},"link":"/releases"},{"id":"issues.stale","category":"issues","severity":"medium","effort":"medium","title":"Разобрать зависшие issues","problem":"{pct[issues.stale_share]} открытых issues не обновлялись больше 60 дней.","why":"Зависшие задачи снижают доверие: пользователи не понимают, читают ли их.","action":"Ответьте в каждой, закройте неактуальные, остальным задайте приоритет и исполнителя.","evidence":["issues.open"],"whatif":{"issues.stale_share":0.1},"link":"/issues"},{"id":"issues.slow_response","category":"issues","severity":"medium","effort":"low","title":"Отвечать в issues быстрее","problem":"Медиана до первого ответа или уже прошедшего ожидания: {fmt[issues.first_response_median_h]} ч.","why":"Первый ответ в течение суток-двух удерживает контрибьюторов.","action":"Назначьте дежурного по issues, включите уведомления, используйте шаблоны ответов.","evidence":["issues.open","issues.closed"],"whatif":{"issues.first_response_median_h":24},"link":"/issues"},{"id":"issues.triage","category":"issues","severity":"low","effort":"low","title":"Ввести триаж issues: метки, приоритеты, исполнители","problem":"Только {pct[issues.triage_usage]} issues имеют метки, приоритет или исполнителя.","why":"Без триажа невозможно понять, что важно и кто отвечает.","action":"Заведите набор меток, проставляйте приоритет и исполнителя при разборе.","evidence":["issues.open"],"whatif":{"issues.triage_usage":0.8},"link":"/issues"}],"severity_weight":{"critical":4,"high":3,"medium":2,"low":1},"effort_weight":{"low":1,"medium":1.5,"high":2.5}}