Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-23 16:03 UTC

trezor / trezor-core

:lock: Don't use this repo, use the new monorepo instead:

Python · CGPL-3.0★ 358 зірок⑂ 196 форківз лист. 2015 р.архівнийПереглянути на GitHub ↗

trezor/trezor-core має індекс здоров’я 20 зі 100, що відповідає смузі «Критичний». Найвищий показник — Community & Adoption (67/100), найнижчий — Vitality (17/100). Репозиторій заархівовано, тож подальшої підтримки не очікується.

20
загалом / 100
Критичний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

20
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Abandonment Policy applies a 40% multiplier to weighted overall health and gives it a ceiling of 29.

Власність

TrezorОрганізація
1 245 підписників67 публічних репозиторіївз квіт. 2013 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

17Критичний · 22% загального індексу
Як обчислюється оцінка
0/36Свіжість push — останній push 2 652 дн. тому
0/36Ритм комітів — 0/52 тижнів із комітами
0/18Обсяг комітів — 0 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project is archived
Використані вхідні дані
commits_last_year0
human_commit_share1
days_since_last_push2 652
active_weeks_last_year0

Дисципліна релізів

40У зоні ризику
Як обчислюється оцінка
16.2/27Випускає релізи — 7 тегів версій (без релізів GitHub)
0/36Свіжість релізів — останній реліз 2 697 дн. тому
19.8/27Ритм релізів — реліз кожні ~61,6 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count7
latest_release_tagv2.1.0
releases_from_tagsтак
days_since_latest_release2 697
mean_days_between_releases61,6
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

67Помірний · 18% загального індексу
Як обчислюється оцінка
41.4/60Зірки — 358 зірок
19.1/25Форки — 196 форків
4.3/15Спостерігачі — 7 спостерігачів
Використані вхідні дані
forks196
stars358
watchers7
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (GPL-3.0)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

66Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
11.2/22.5Розподіл комітів — головний контриб’ютор — автор 50% комітів
13.5/13.5Широта контриб’юторів — 34 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 19 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled34
top_contributor_share0,5
Як обчислюється оцінка
46.8/46.8Вирішення issue — закрито 100% issue
27.1/38.3Прийняття PR — злито 194/274 вирішених PR
7.5/15OpenSSF Scorecard: Code-Review — Found 12/21 approved changesets -- score normalized to 5
Використані вхідні дані
merged_prs194
open_issues0
closed_issues221
issue_closed_ratio1
closed_unmerged_prs80
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
22.3/25Охоплення власника — 1 245 підписників у trezor
25/25Послужний список — 67 публічних репозиторіїв, вік облікового запису ~13 р.
Використані вхідні дані
followers1 245
owner_typeOrganization
is_verified
owner_logintrezor
public_repos67
account_age_days4 849

Інженерна якість

Чи наявні базові інженерні практики та документація?

60Помірний · 20% загального індексу

Інженерні практики

40У зоні ризику
Як обчислюється оцінка
0/24Процеси CI
24/24Наявні тести
16/16Конфігурація лінтера — .pylintrc
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 12 merged PRs checked by a CI test -- score normalized to 0
Використані вхідні дані
has_ciні
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні

Документація

90Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://github.com/trezor/trezor-firmware
10/10Опис репозиторію
10/10Теми — 3 тем
0/10Wiki
Використані вхідні дані
topicstrezor, micropython, bitcoin
has_wikiні
homepagehttps://github.com/trezor/trezor-firmware
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

46У зоні ризику · 16% загального індексу

Стан безпеки

32У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
0/2.5CI-Tests — 0 out of 12 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3.8/7.5Code-Review — Found 12/21 approved changesets -- score normalized to 5
2.5/2.5Contributors — project has 19 contributing companies or organizations
0/10Dangerous-Workflow — немає даних
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
0/7.5Maintained — project is archived
0/5Packaging — немає даних
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — немає даних
0/7.5Vulnerabilities — 110 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate3,1
Виключено з оцінювання (немає даних або не застосовно): branch_protection, dangerous_workflow, packaging, signed_releases, token_permissions. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories209
affected_packages17
assessed_packages64
unassessed_packages1
affected_by_severitycritical 3, high 5, moderate 1, unknown 8
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 64 резолвлених залежностей із OSV. 1 не вдалося оцінити — немає резолвленої версії, непідтримувана екосистема або поза межами звітованого переліку пакетів. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

51Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 87 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,87
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile, embed/bootloader/protob/Makefile
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .pylintrc
0/11Статична перевірка типів
10/10Відтворюване середовище — Dockerfile, Nix, lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixтак
has_testsтак
lockfilesPipfile.lock
has_dockerfileтак
typed_languageні
bootstrap_filesMakefile, embed/bootloader/protob/Makefile
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
0/45Типізований код — Python без конфігурації перевірки типів
54.8/55Керовані розміри файлів — 2/708 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePython
largest_source_bytes141 528
source_files_sampled708
oversized_source_files2
Як обчислюється оцінка
40/40Схема API (OpenAPI/GraphQL/proto) — embed/bootloader/protob/messages.proto, embed/bootloader/protob/types.proto
0/20Сервер MCP
0/40Придатні до запуску приклади
Використані вхідні дані
example_dirs
has_mcp_signalні
api_schema_filesembed/bootloader/protob/messages.proto, embed/bootloader/protob/types.proto

Ключові факти

358зірок GitHub
34контриб'юторів
0комітів за останні 12 місяців
2 652днів від останнього пушу
7релізів
1бас-фактор
0відкритих issue
PyPIпакетних екосистем

Попередження щодо збору даних

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Advisory severity resolved for 120 of 209 advisories (lookup cap); the remainder are reported as unknown severity

Докладніше

Історія зірок і форків 0 ★ / 196 ⇿
0Зірки
196Форки
7Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

0408012016020017172016-092020-112025-01
Мажорні 0Мінорні 1Патчі 6

Кожна точка охоплює 8 днів.

OpenSSF Scorecard 3.1 / 10
3.1сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-23 16:02 UTC

10Binary-Artifactsno binaries found in the repo
н/дBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
0CI-Tests0 out of 12 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
5Code-ReviewFound 12/21 approved changesets -- score normalized to 5
10Contributorsproject has 19 contributing companies or organizations
н/дDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject is archived
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
н/дSigned-Releasesno releases found
н/дToken-PermissionsNo tokens found
0Vulnerabilities110 existing vulnerabilities detected
Усі залежності 65

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 65 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
PyPIaiounittest1.1.0непряма
PyPIappdirs1.4.3непряма
PyPIasn1crypto0.24.0непряма
PyPIatomicwrites1.2.1непряма
PyPIattrs18.2.0непряма
PyPIblack18.9b0непряма
PyPIbraceexpand0.1.2непряма
PyPIcertifi2018.11.29непряма
PyPIcffi1.11.5непряма
PyPIchacha20poly13050.0.2непряма
PyPIchardet3.0.4непряма
PyPIclick7.0непряма
PyPIconstruct2.9.45непряма
PyPIcryptography2.4.2непряма
PyPIctypeslib22.2.2непряма
PyPIecdsa0.13непряма
PyPIed255191.4непряма
PyPIextended-pathlib0.4.0непряма
PyPIfilelock3.0.10непряма
PyPIflake83.6.0непряма
PyPIidna2.8непряма
PyPIisort4.3.4непряма
PyPIlibusb11.7непряма
PyPImako1.0.7непряма
PyPImarkupsafe1.1.0непряма
PyPImccabe0.6.1непряма
PyPImnemonic0.18непряма
PyPImock2.0.0непряма
PyPImonero-agent2.0.1непряма
PyPImonero-serialize3.0.0непряма
PyPImore-itertools5.0.0непряма
PyPImunch2.3.2непряма
PyPInose1.3.7непряма
PyPIpandoc1.0.2непряма
PyPIpbkdf21.3непряма
PyPIpbr5.1.1непряма
PyPIpep81.7.1непряма
PyPIpillow5.4.0непряма
PyPIpluggy0.8.0непряма
PyPIply3.11непряма
PyPIprotobuf3.4.0непряма
PyPIpy1.7.0непряма
PyPIpy-cryptonight0.1.8непряма
PyPIpy-trezor-crypto-ph40.1.1непряма
PyPIpyblake21.1.2непряма
PyPIpycodestyle2.4.0непряма
PyPIpycparser2.19непряма
PyPIpycryptodome3.7.2непряма
PyPIpyflakes2.0.0непряма
PyPIpympler0.6непряма
PyPIpypandoc1.4непряма
PyPIpytest4.0.2непряма
PyPIrequests2.21.0непряма
PyPIscan-build2.0.15непряма
PyPIshlib0.8.0непряма
PyPIsix1.12.0непряма
PyPItermcolor1.1.0непряма
PyPItoml0.10.0непряма
PyPItox3.6.1непряма
PyPItrezorнепряма
PyPItyping3.6.6непряма
PyPItyping-extensions3.6.6непряма
PyPIurllib31.24.1непряма
PyPIvirtualenv16.2.0непряма
PyPIwheel0.32.3непряма
Сповіщення про залежності 17

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 64 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 17 мають відомі сповіщення, з них 0 прямі. 1 не вдалося оцінити — немає резолвленої версії, непідтримувана екосистема або поза наведеним переліком пакетів.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
black18.9b0непрямакритична526.3.1
ecdsa0.13непрямакритична80.19.2
pillow5.4.0непрямакритична10827.0.0-beta.2
certifi2018.11.29непрямависока52024.7.4
click7.0непрямависока18.3.3
cryptography2.4.2непрямависока17300.0.12
idna2.8непрямависока43.15
mako1.0.7непрямависока61.3.12
filelock3.0.10непрямапомірна43.20.3
protobuf3.4.0непряманевідома7
py1.7.0непряманевідома2
pycryptodome3.7.2непряманевідома2
pytest4.0.2непряманевідома2
requests2.21.0непряманевідома8
urllib31.24.1непряманевідома24
virtualenv16.2.0непряманевідома4
wheel0.32.3непряманевідома2

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "trezor",
        "micropython",
        "bitcoin"
      ],
      "is_fork": false,
      "size_kb": 15541,
      "has_wiki": false,
      "homepage": "https://github.com/trezor/trezor-firmware",
      "languages": {
        "C": 979515,
        "Awk": 396,
        "C++": 16907,
        "Nix": 342,
        "Mako": 5266,
        "Shell": 10923,
        "Python": 1620122,
        "Assembly": 20670,
        "Makefile": 9079,
        "Dockerfile": 2705,
        "Objective-C": 21550
      },
      "pushed_at": "2019-04-19T14:21:30Z",
      "created_at": "2015-11-19T13:16:23Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-02T04:36:52Z",
      "description": ":lock: Don't use this repo, use the new monorepo instead:",
      "is_archived": true,
      "is_disabled": false,
      "license_spdx": "GPL-3.0",
      "default_branch": "master",
      "license_spdx_raw": "GPL-3.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "C"
      ]
    },
    "owner": {
      "blog": "https://trezor.io",
      "name": "Trezor",
      "type": "Organization",
      "login": "trezor",
      "company": null,
      "location": "Prague, Czech Republic",
      "followers": 1245,
      "avatar_url": "https://avatars.githubusercontent.com/u/4146447?v=4",
      "created_at": "2013-04-13T15:41:29Z",
      "is_verified": null,
      "public_repos": 67,
      "account_age_days": 4849
    },
    "license": {
      "state": "standard",
      "spdx_id": "GPL-3.0",
      "raw_spdx": "GPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2019-03-05T12:49:42Z"
        },
        {
          "tag": "v2.0.10",
          "kind": "patch",
          "published_at": "2018-12-05T10:40:57Z"
        },
        {
          "tag": "v2.0.9",
          "kind": "patch",
          "published_at": "2018-11-05T12:56:15Z"
        },
        {
          "tag": "v2.0.8",
          "kind": "patch",
          "published_at": "2018-10-28T12:27:54Z"
        },
        {
          "tag": "v2.0.7",
          "kind": "patch",
          "published_at": "2018-06-22T12:43:22Z"
        },
        {
          "tag": "v2.0.6",
          "kind": "patch",
          "published_at": "2018-03-20T15:25:03Z"
        },
        {
          "tag": "v2.0.5",
          "kind": "patch",
          "published_at": "2018-03-01T04:47:33Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "18c3a6a5bd45923380312b064be96155f5a7377d",
          "body": null,
          "is_bot": false,
          "headline": "README: we're moving to monorepo",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-19T14:21:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52d34955e792695d0f47b7451f4d4c51bb27d6b4",
          "body": "This includes the https://github.com/ElementsProject/secp256k1-zkp library\n(which is a fork from sipa/secp256k1 used in Bitcoin Core) as a module. It\nis currently not used in any app.\n\nThis commit the first step towards integrating Liquid (tracking issue #282).\n\nNote that this creates a new 64 kiB r\n[…]\nure creation and related private key operations.\n\nCo-authored-by: Roman Zeyde <me@romanzey.de>\nCo-authored-by: Andrew Poelstra <apoelstra@wpsoftware.net>\nCo-authored-by: Pavol Rusnak <pavol@rusnak.io>",
          "is_bot": false,
          "headline": "embed/extmod/modtrezorcrypto: add secp256k1_zkp module",
          "author_name": "Tim Ruffing",
          "author_login": "real-or-random",
          "committed_at": "2019-04-15T15:24:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5321cb18907f15d4f7760f705f3c49b623e1a195",
          "body": null,
          "is_bot": false,
          "headline": "vendor: update trezor-common",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-12T11:49:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fe02ae87ed2363dce6389970de3e45173066d90",
          "body": "tests: minor monero script test fix, quotes",
          "is_bot": false,
          "headline": "Merge pull request #551 from ph4r05/pr/xmr-test-fix",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-11T19:17:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8530d05ebe2ed96722f8163d6425603306e0e3b4",
          "body": null,
          "is_bot": false,
          "headline": "tests: minor monero script test fix, quotes",
          "author_name": "Dusan Klinec",
          "author_login": "ph4r05",
          "committed_at": "2019-04-11T14:46:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c55b655325dcfadb2ec93b28e0155cb7cb1f1d84",
          "body": "tests: monero binary test added",
          "is_bot": false,
          "headline": "Merge pull request #541 from ph4r05/pr/monero-bin-test",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-11T11:45:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "817c84e96e5b61da8e38eed75fbfdc99cb2272db",
          "body": "when comparing __slots__, do not create a new dict, but access attributes directly instead",
          "is_bot": false,
          "headline": "utils: optimize __slots__ comparison",
          "author_name": "Vladyslav Burzakovskyy",
          "author_login": "MrMebelMan",
          "committed_at": "2019-04-11T11:22:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75334097655d7cd4c54caf5e360a8561f37ec809",
          "body": null,
          "is_bot": false,
          "headline": "pin: avoid overdraw",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-04-11T10:32:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1398e7a0cb17a129bec5949532079b1aa33515ce",
          "body": null,
          "is_bot": false,
          "headline": "tests: monero binary test added",
          "author_name": "Dusan Klinec",
          "author_login": "ph4r05",
          "committed_at": "2019-04-11T09:35:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd812fecf9e0ca4573f15f62bec67d6e6f4875e5",
          "body": null,
          "is_bot": false,
          "headline": "homescreen: do not return from homescreen workflow",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-04-10T18:23:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c462918e3e6dbc02ab2eeac454fe3c366e792f44",
          "body": "updates #162",
          "is_bot": false,
          "headline": "display: store rotation in storage",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-10T18:23:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2b7b8032a67d3b7ba9ad7b78b540a9a0f81a20b",
          "body": null,
          "is_bot": false,
          "headline": "vendor: update trezor-common; protobuf, templates build",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-10T18:23:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e4e89543f8114cd563905871094c5bcb982946b",
          "body": null,
          "is_bot": false,
          "headline": "style: fix style",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-04-10T14:46:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84c14042b6f2ffce3c3774007624fd3dd9d7106e",
          "body": null,
          "is_bot": false,
          "headline": "ui: save screen after refresh, if env var is set",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-04-10T14:34:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22759ca95fb47e16cdfc10066d8efe330e98dcce",
          "body": null,
          "is_bot": false,
          "headline": "unix: enable micropython uos extmod",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-04-10T14:34:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a36c100eb9dbda36a5113be6f5e4010c6e972997",
          "body": null,
          "is_bot": false,
          "headline": "src/apps/webauthn: pad last packet with zeros (#544)",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-10T14:30:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2227fc60b8d5c043d73b006e2cfd6d3c713e9b9e",
          "body": null,
          "is_bot": false,
          "headline": "src/apps/wallet: display custom locktime confirmation (#540)",
          "author_name": "Ciny",
          "author_login": "ciny",
          "committed_at": "2019-04-10T14:22:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35ac4742bdbe6a26d0f6b85909676846a4bb08e4",
          "body": "paths: validate curve as well",
          "is_bot": false,
          "headline": "Merge pull request #542 from trezor/tsusanka/curve-check",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-10T13:52:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4cfc82fce68907d876dc5b27fdc2ada83589f48",
          "body": "recovery: Verify the return value of config.has_pin() in dry run recovery. Improve UI messages. Remove code duplication in modtrezorconfig.c.",
          "is_bot": false,
          "headline": "Merge pull request #536 from trezor/534",
          "author_name": "Andrew Kozlik",
          "author_login": "andrewkozlik",
          "committed_at": "2019-04-10T13:24:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b84d0e845227dd7fbf9c46a298664e1c1185b0ce",
          "body": null,
          "is_bot": false,
          "headline": "paths: disallow special ed25519 curves",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-09T14:32:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8aa60e6cfd84ba35613e5eed0088fb43e97aa8e0",
          "body": null,
          "is_bot": false,
          "headline": "paths: validate curve as well",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-09T14:18:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac318cc65b3575eaad63f0a1f25462675e05d40a",
          "body": "Update run_tests.sh: show totals, allow interrupts, add colors",
          "is_bot": false,
          "headline": "Merge pull request #543 from MrMebelMan/run_tests_update",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-09T12:21:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e5ab98303edb7f4d6974c2e6096b8be6e78d668",
          "body": "allow the user to stop running tests (CTRL+C)\n\ncolorize the output",
          "is_bot": false,
          "headline": "tests/run_tests.sh: show the number of passed and failed tests",
          "author_name": "Vladyslav Burzakovskyy",
          "author_login": "MrMebelMan",
          "committed_at": "2019-04-08T22:58:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22dfe10c56d2aca75a2f74d8a2552e397dc4cd9c",
          "body": null,
          "is_bot": false,
          "headline": "monero: drop secp256k1 curve",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-05T09:58:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "388fc2ae773e5e3d8bbda6d7b6065d87257a9811",
          "body": "…very. Improve UI messages. Remove code duplication in modtrezorconfig.c.",
          "is_bot": false,
          "headline": "recovery: Verify the return value of config.has_pin() in dry run reco…",
          "author_name": "Andrew Kozlik",
          "author_login": "andrewkozlik",
          "committed_at": "2019-04-04T14:25:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "396f5f1937dd4de7bfcb20954a059175e31fa98e",
          "body": "Pass Keychain to path validation function to throw error before warning",
          "is_bot": false,
          "headline": "Merge pull request #532 from trezor/tsusanka/path-validation",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-04T11:40:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1a01bebc50d19210b3cef33ac85de9e4e97501a",
          "body": null,
          "is_bot": false,
          "headline": "seed: simplify Keychain.validate_path",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-04-04T09:41:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cadefcdd0de3e174fe2e05973a10fc7074446fc",
          "body": "closes #519",
          "is_bot": false,
          "headline": "common: pass Keychain to path validation function",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-04-03T08:36:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e89699817f3e0c4212d4ed2730425b37ae1f5f58",
          "body": null,
          "is_bot": false,
          "headline": "modtrezorui: Display.save skips identical screens (#530)",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-04-02T13:26:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64925350a2b40b6252b385332c09c0b570cdd607",
          "body": null,
          "is_bot": false,
          "headline": "monero: correct header in live refresh confirmation",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-29T16:23:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b7dbc12cbf8c9d1d639f3c63e60ce50346d6b1e",
          "body": null,
          "is_bot": false,
          "headline": "format: start using clang-format with style=Google",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-29T15:35:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e53826e951989f05e2d82c0e743de4ad8303d92d",
          "body": "cardano: taint pages to prevent blank screen",
          "is_bot": false,
          "headline": "Merge pull request #503 from vacuumlabs/cardano-taint",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-29T15:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5deeb7d6f5d70a264f9afcae1d4fe25e131c338e",
          "body": "fixes #523",
          "is_bot": false,
          "headline": "mnemonic: do not use progress bar for U2F",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-29T13:27:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb8d6fe8207942d664954524e7d5814c3d86c4bc",
          "body": null,
          "is_bot": false,
          "headline": "tools: add hid-bridge by Ondrej Vejpustek",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-28T18:16:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a54839acb93f48e7794aa4536ce0f871c515bfb",
          "body": null,
          "is_bot": false,
          "headline": "tests: allow running tests from any directory (#487)",
          "author_name": "Roman Zeyde",
          "author_login": null,
          "committed_at": "2019-03-26T13:12:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c46be39d5830602113c88e07085b1195569109ec",
          "body": null,
          "is_bot": false,
          "headline": "build: update cstyle/cstyle_check targets",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-25T18:48:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dcd3b581250cb4ec7c04bf496527b6e32729407",
          "body": null,
          "is_bot": false,
          "headline": "build: fix shebang and remove prodtest from build-docker",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-25T18:14:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a2482413623191a24c134ac7f3f3cb5932c8d23",
          "body": null,
          "is_bot": false,
          "headline": "gitlab: fix last commit",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-25T14:57:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "478df1c2a90c2400a417681344859e6b4a211f48",
          "body": null,
          "is_bot": false,
          "headline": "gitlab: store artefacts of each build",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-25T14:34:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f4795a7d7abc2d1750a7f48cde774794dde8998",
          "body": "ui: add back button to NumPad",
          "is_bot": false,
          "headline": "Merge pull request #504 from trezor/tsusanka/numpad-improve",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-20T11:57:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dee03a0d512e0d6a8c69528e1f35bc1758c65f9",
          "body": null,
          "is_bot": false,
          "headline": "ui: add back button to NumPad",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-19T15:18:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "118ca37304e5ea78f1e7da8ca0d1701cfd53cefa",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix curve names",
          "author_name": "matejcik",
          "author_login": "matejcik",
          "committed_at": "2019-03-19T14:44:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc46373d897cb773c99461a4d82832c84e59e06b",
          "body": "Taint pages to ensure the texts are rendered when swiping.",
          "is_bot": false,
          "headline": "cardano: taint pages",
          "author_name": "Matúš Juran",
          "author_login": "j-matus",
          "committed_at": "2019-03-18T13:16:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67907b6c4c159a433bfca1bb074c8f99f8304371",
          "body": "Coins doc update (WIP)",
          "is_bot": false,
          "headline": "Merge pull request #502 from trezor/matejcik/coins-doc",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-18T11:21:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29cfdfad2fe166fbc9a211b924cb853cf0165af0",
          "body": null,
          "is_bot": false,
          "headline": "docs: add EOS, Tron and Ontology (WIP)",
          "author_name": "matejcik",
          "author_login": "matejcik",
          "committed_at": "2019-03-15T18:06:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28dd517668fdd0f0fff7efe2d566bfadce267962",
          "body": null,
          "is_bot": false,
          "headline": "docs: refactor and update coins README",
          "author_name": "matejcik",
          "author_login": "matejcik",
          "committed_at": "2019-03-15T17:59:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f697751d53f51a1bbef4163184703d5f4e80f639",
          "body": null,
          "is_bot": false,
          "headline": "style: print versions to log",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-15T13:40:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05c055080a31a56fb3cafa9de3f01164ae010e42",
          "body": null,
          "is_bot": false,
          "headline": "style: fix for black v19.3b0",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-15T13:30:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e736b764ce9fed47f2acc880a2531988446b285",
          "body": null,
          "is_bot": false,
          "headline": "docs: Use proper make targets for code style (#499)",
          "author_name": "Tim Ruffing",
          "author_login": "real-or-random",
          "committed_at": "2019-03-15T10:58:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edb8177f1a6a5d83099a540767dda3d29120c83b",
          "body": "NumPad to enter a number from arbitrary range easily",
          "is_bot": false,
          "headline": "Merge pull request #480 from trezor/tsusanka/numpad",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-14T09:38:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2f75605551d07f28db500e4379470b5f8c41074",
          "body": "The numpad allows to easily enter numbers from an arbitrary range.",
          "is_bot": false,
          "headline": "ui: introduce numpad",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-12T15:08:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfcba533b66aa7c9bf6f40ede519e08cc1202a16",
          "body": null,
          "is_bot": false,
          "headline": "tools: don't generate messages unused in the current codebase",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-12T13:49:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12dd5489381279bbf8d72c847e41a42ff8ca28a8",
          "body": "Store mnemonic as bytes",
          "is_bot": false,
          "headline": "Merge pull request #496 from trezor/tsusanka/pre-slip39",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-12T10:23:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d02d173e69f11d2fd869805e32645828bc5a2a13",
          "body": null,
          "is_bot": false,
          "headline": "vendor: update trezor-common",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-12T09:52:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c37e8dae272b191eeb9e3c20da56ebf8b980f4f",
          "body": "To provide another layer between seed and mnemonic. First step to\nintroduce SLIP-39",
          "is_bot": false,
          "headline": "common: introduce mnemonic module",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-12T09:35:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d86abc473f935a91ee7fd33411220bcdc2a19b6d",
          "body": "Cardano: remove sign/verify functions",
          "is_bot": false,
          "headline": "Merge pull request #494 from trezor/tsusanka/cardano-sign-verify",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-11T15:43:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b591219c5df8f1329970a0fe40492b3f267ed849",
          "body": "They are not currently used anyway. Protobuf messages are missing and they are not registered. Closes #492",
          "is_bot": false,
          "headline": "cardano: remove sign/verify functions",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-03-11T09:01:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2f1cb2b9740986470914743420fc9322124df6e",
          "body": null,
          "is_bot": false,
          "headline": "apps/webauthn: re-add generic icon",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-09T19:20:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e02ab996a0fe1a0921a19f70f9b6a9cd9165b4c8",
          "body": "add more WebAuthn facets",
          "is_bot": false,
          "headline": "src/apps: rename fido_u2f app to webauthn app",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-09T17:59:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c59b02d9062143556138c21d59f91c64aba0ccd",
          "body": null,
          "is_bot": false,
          "headline": "u2f: capitalize Bitwarden (#491)",
          "author_name": "Yegor Timoshenko",
          "author_login": "lukateras",
          "committed_at": "2019-03-07T12:42:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57d1fe948c4004e83f1325a0d0781486c91ae970",
          "body": null,
          "is_bot": false,
          "headline": "u2f: fix \"u2f.bin.coffee\" label (#490)",
          "author_name": "Yegor Timoshenko",
          "author_login": "lukateras",
          "committed_at": "2019-03-07T12:39:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8be4ed41bc7f3ad841166a731817b68f302d8a50",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'secfix'",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-06T16:33:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f13f065ac4f9f3b03f3ea445bddfecf492ce970d",
          "body": null,
          "is_bot": false,
          "headline": "src/apps/wallet/sign_tx: fix style",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-03-06T09:12:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f0e3a334e03f49ff819d14cbbec00194c586c27",
          "body": "As it's currently impossible to close() the layout generator from the outside, loop.signal() was added, and any started layout signals to terminate.",
          "is_bot": false,
          "headline": "fido_u2f: properly close u2f layout when other layout starts",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-03-05T12:49:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b97b9e840a6b20527e1677e6512198071dabc5f",
          "body": "This reverts commit 34f499fc0461975f698b0fe214f8c50da387eb90.",
          "is_bot": false,
          "headline": "Revert \"scons: disable bip39 seed cache\"",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-03-04T16:31:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c23ad89ee1b0bdcf6ed5cd276112e9ab363322be",
          "body": null,
          "is_bot": false,
          "headline": "storage: Fix bug in U2F counter upgrade.",
          "author_name": "Andrew Kozlik",
          "author_login": "andrewkozlik",
          "committed_at": "2019-02-27T17:27:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a96c39a9d1a438626083cc5acc5fc11ab8a99d6e",
          "body": null,
          "is_bot": false,
          "headline": "mocks: generate",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-02-27T10:30:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bac8d9d5316bb15bc85200a5301cba4c9cb947eb",
          "body": null,
          "is_bot": false,
          "headline": "changelog: update",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-25T11:28:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2311465fdda2d7cd7aff6c4144c73df00cb0653c",
          "body": null,
          "is_bot": false,
          "headline": "firmware: update embedded bootloader",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-24T16:22:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edae40e22cb19a51dc1a02ba6806fc89f6c350fe",
          "body": "An empty PIN is used to signify PIN removal and T1 does not allow entering an empty PIN neither via web-wallet nor via trezorctl.",
          "is_bot": false,
          "headline": "pin: do not allow the user to enter an empty PIN",
          "author_name": "Andrew Kozlik",
          "author_login": "andrewkozlik",
          "committed_at": "2019-02-23T16:50:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e60914e30f4d948008dda911844e6084d21195a6",
          "body": null,
          "is_bot": false,
          "headline": "pin: avoid changing PIN unnecessarily",
          "author_name": "Andrew Kozlik",
          "author_login": "andrewkozlik",
          "committed_at": "2019-02-23T16:50:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "456a2c68d6fe794e37027c50526e403a78ba2874",
          "body": "Don't pre-check old PIN when removing PIN protection.",
          "is_bot": false,
          "headline": "pin: change show_pin_timeout() to display arbitrary message",
          "author_name": "Andrew Kozlik",
          "author_login": "andrewkozlik",
          "committed_at": "2019-02-23T16:50:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d82cca381fbf782b7bd83d8ea788e1db0d2ac18",
          "body": null,
          "is_bot": false,
          "headline": "trezorhal: refactor erasing sectors",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-22T16:22:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbe8320d96ab92d65a2fe3adca69e9a31c716cc2",
          "body": null,
          "is_bot": false,
          "headline": "vendor: update trezor-storage",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-22T15:22:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62c0e91dd036cf8ddfa6956343e60968e2a5967b",
          "body": null,
          "is_bot": false,
          "headline": "firmware: bundle new bootloader 2.0.3",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-21T20:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d645ef61beda1075de134fd76a9fcfd5e6a3897",
          "body": null,
          "is_bot": false,
          "headline": "bootloader: refactor mpu settings",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-21T18:39:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3055633d84d96d64bb3aee12fcf8cb21d461a809",
          "body": null,
          "is_bot": false,
          "headline": "vendor: update trezor-crypto and trezor-storage",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-21T16:03:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "828ba7b5b01f9997a2f8e63e2e5f19d4a3f607af",
          "body": null,
          "is_bot": false,
          "headline": "bootloader: enable MPU, introduce delays to USB stack",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-21T15:53:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5560a35af7f56774a55c65449c666532cadb0107",
          "body": null,
          "is_bot": false,
          "headline": "tools: fix keyctl-proxy",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-21T15:53:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ecd77681ff814e71a34adf78dcf52d0ef597c40",
          "body": null,
          "is_bot": false,
          "headline": "vendor: Update trezor-storage.",
          "author_name": "Andrew Kozlik",
          "author_login": "andrewkozlik",
          "committed_at": "2019-02-21T14:35:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5ee6cef982d2075ca6061334cbae7542e0508d4",
          "body": null,
          "is_bot": false,
          "headline": "boot: fade into the \"verifying PIN\" dialog",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-02-21T13:06:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86bec3b0ae22077377171fecc51f56918023b19d",
          "body": null,
          "is_bot": false,
          "headline": "seed: use sync backlight sliding",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-02-21T12:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f11373c0eee792c3a486d80f95a54568334bfbe6",
          "body": null,
          "is_bot": false,
          "headline": "xmr: set 8 null bytes using multiplication",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-02-21T08:11:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6124c2191523ca4e19d65017939eb6f31c58bdaa",
          "body": null,
          "is_bot": false,
          "headline": "style",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-02-20T13:38:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b048ce25cb96f9fed64992e2a154c6b930d1761",
          "body": null,
          "is_bot": false,
          "headline": "xmr: typos in comments",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-02-20T13:00:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "765d88c2b7e1c1932c2bf65aae89ed90a39d6b5d",
          "body": "xmr: hardfork 10 upgrade",
          "is_bot": false,
          "headline": "Merge pull request #478 from ph4r05/pr/hf10",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-02-20T12:51:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a467e756ca96f2e592bbe94ee7e23a3c94df8dd",
          "body": null,
          "is_bot": false,
          "headline": "embed/trezorhal: move lowlevel.{c,h} from boardloader to trezorhal",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-19T17:30:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bba8bf38ebfaa5da596bed43ac2777dc8be3df59",
          "body": "- Deterministic output commitment masks, based on amount_key\n- Bulletproof v2 serialization, EcdhInfo serialized as 8 B amount, XOR encrypted by a specific key derived from amount key\n- Signing - pseudo_out recomputation on inputs, sign step\n- Dummy encrypted payment ID (if applicable) for better transaction uniformity",
          "is_bot": false,
          "headline": "xmr: hf10 upgrades",
          "author_name": "Dusan Klinec",
          "author_login": "ph4r05",
          "committed_at": "2019-02-19T13:36:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce834d4074ccfdd9bd7d756196e5a95d98821b4d",
          "body": null,
          "is_bot": false,
          "headline": "docs: update otp table",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-19T13:00:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85a482acf25f6c8cc64b93c101356f3e196c510a",
          "body": null,
          "is_bot": false,
          "headline": "firmware/bl_check: remove unused macro",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-19T12:58:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b24c062a3d55f27e6ddb46b07fda99cca43199ab",
          "body": null,
          "is_bot": false,
          "headline": "firmware: bundle latest bootloader, replace it when needed",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-19T12:21:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1bc69fa2d6d8cc76cb7feac5bdf25326f177e263",
          "body": null,
          "is_bot": false,
          "headline": "src/apps/management/recovery_device: ask for PIN in dry_run",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-18T19:05:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1a382c75b1a3c95a8d126bb46baca68cccbe58d",
          "body": null,
          "is_bot": false,
          "headline": "vendor: update trezor-storage",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-18T18:43:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0751c667c3a8125d6cea01a2e34fd6522745b05e",
          "body": "…in dry run",
          "is_bot": false,
          "headline": "src/apps/management/recovery_device: constant time mnemonic checking …",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-18T17:44:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6233cc07203a50d64203d258fc06babc3d7037f7",
          "body": null,
          "is_bot": false,
          "headline": "firmware: fix last commit - lock randomness block after set",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-18T16:43:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee3e313230847158ec94fb293833a933fb9248a9",
          "body": null,
          "is_bot": false,
          "headline": "firmware: use OTP block 3 for storing randomness",
          "author_name": "Pavol Rusnak",
          "author_login": "prusnak",
          "committed_at": "2019-02-18T16:28:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72631db462a3d16443b145882354770b7722f8cc",
          "body": null,
          "is_bot": false,
          "headline": "pb built, templates built",
          "author_name": "Dusan Klinec",
          "author_login": "ph4r05",
          "committed_at": "2019-02-18T16:19:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f077ac30ee9dced77ca5e48e4a8f10ee82da067",
          "body": null,
          "is_bot": false,
          "headline": "xmr: trezor-common version bump",
          "author_name": "Dusan Klinec",
          "author_login": "ph4r05",
          "committed_at": "2019-02-18T16:19:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e3673ad266367f453a15aa96d5a9c58758bbf6b",
          "body": "Unfortunetly, there are coins with the same `address type` field. For\nexample ZClassic Coin uses the same one as Zcash.",
          "is_bot": false,
          "headline": "common: remove coins.by_address_type because there are conflicts",
          "author_name": "Tomas Susanka",
          "author_login": "tsusanka",
          "committed_at": "2019-02-18T16:00:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4709af146b01316aeddbb165b180bca9f26c1ee0",
          "body": null,
          "is_bot": false,
          "headline": "ui: fix content invalidation in HoldToConfirmDialog",
          "author_name": "Jan Pochyla",
          "author_login": "jpochyla",
          "committed_at": "2019-02-18T10:33:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 7,
      "commits_last_year": 0,
      "latest_release_at": "2019-03-05T12:49:42Z",
      "latest_release_tag": "v2.1.0",
      "releases_from_tags": true,
      "days_since_last_push": 2652,
      "active_weeks_last_year": 0,
      "days_since_latest_release": 2697,
      "mean_days_between_releases": 61.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 196,
      "stars": 358,
      "watchers": 7,
      "fork_history": {
        "days": [
          {
            "date": "2016-09-27",
            "count": 1
          },
          {
            "date": "2016-10-11",
            "count": 1
          },
          {
            "date": "2017-03-02",
            "count": 1
          },
          {
            "date": "2017-04-22",
            "count": 3
          },
          {
            "date": "2017-07-14",
            "count": 1
          },
          {
            "date": "2017-08-17",
            "count": 1
          },
          {
            "date": "2017-09-05",
            "count": 1
          },
          {
            "date": "2017-09-22",
            "count": 1
          },
          {
            "date": "2017-09-29",
            "count": 1
          },
          {
            "date": "2017-10-14",
            "count": 1
          },
          {
            "date": "2017-10-28",
            "count": 1
          },
          {
            "date": "2017-11-03",
            "count": 1
          },
          {
            "date": "2017-11-07",
            "count": 1
          },
          {
            "date": "2017-11-11",
            "count": 1
          },
          {
            "date": "2017-11-19",
            "count": 1
          },
          {
            "date": "2017-11-23",
            "count": 1
          },
          {
            "date": "2017-11-29",
            "count": 1
          },
          {
            "date": "2017-12-12",
            "count": 1
          },
          {
            "date": "2017-12-15",
            "count": 1
          },
          {
            "date": "2017-12-16",
            "count": 1
          },
          {
            "date": "2017-12-21",
            "count": 1
          },
          {
            "date": "2017-12-30",
            "count": 1
          },
          {
            "date": "2018-01-17",
            "count": 1
          },
          {
            "date": "2018-01-19",
            "count": 1
          },
          {
            "date": "2018-01-23",
            "count": 1
          },
          {
            "date": "2018-01-27",
            "count": 1
          },
          {
            "date": "2018-02-12",
            "count": 1
          },
          {
            "date": "2018-02-19",
            "count": 4
          },
          {
            "date": "2018-02-27",
            "count": 1
          },
          {
            "date": "2018-02-28",
            "count": 1
          },
          {
            "date": "2018-03-05",
            "count": 1
          },
          {
            "date": "2018-03-06",
            "count": 1
          },
          {
            "date": "2018-03-08",
            "count": 2
          },
          {
            "date": "2018-03-10",
            "count": 1
          },
          {
            "date": "2018-03-12",
            "count": 1
          },
          {
            "date": "2018-03-16",
            "count": 1
          },
          {
            "date": "2018-03-17",
            "count": 1
          },
          {
            "date": "2018-03-25",
            "count": 1
          },
          {
            "date": "2018-03-29",
            "count": 1
          },
          {
            "date": "2018-04-15",
            "count": 1
          },
          {
            "date": "2018-04-16",
            "count": 1
          },
          {
            "date": "2018-05-15",
            "count": 1
          },
          {
            "date": "2018-05-23",
            "count": 1
          },
          {
            "date": "2018-05-31",
            "count": 2
          },
          {
            "date": "2018-06-04",
            "count": 1
          },
          {
            "date": "2018-06-08",
            "count": 1
          },
          {
            "date": "2018-06-13",
            "count": 1
          },
          {
            "date": "2018-06-14",
            "count": 3
          },
          {
            "date": "2018-06-15",
            "count": 2
          },
          {
            "date": "2018-06-19",
            "count": 1
          },
          {
            "date": "2018-06-28",
            "count": 1
          },
          {
            "date": "2018-06-29",
            "count": 2
          },
          {
            "date": "2018-06-30",
            "count": 2
          },
          {
            "date": "2018-07-01",
            "count": 1
          },
          {
            "date": "2018-07-09",
            "count": 1
          },
          {
            "date": "2018-07-25",
            "count": 1
          },
          {
            "date": "2018-07-27",
            "count": 2
          },
          {
            "date": "2018-07-30",
            "count": 1
          },
          {
            "date": "2018-08-04",
            "count": 1
          },
          {
            "date": "2018-08-11",
            "count": 1
          },
          {
            "date": "2018-08-13",
            "count": 1
          },
          {
            "date": "2018-08-14",
            "count": 1
          },
          {
            "date": "2018-08-16",
            "count": 1
          },
          {
            "date": "2018-08-19",
            "count": 1
          },
          {
            "date": "2018-08-20",
            "count": 1
          },
          {
            "date": "2018-08-21",
            "count": 1
          },
          {
            "date": "2018-09-04",
            "count": 1
          },
          {
            "date": "2018-09-11",
            "count": 1
          },
          {
            "date": "2018-09-17",
            "count": 1
          },
          {
            "date": "2018-09-20",
            "count": 1
          },
          {
            "date": "2018-09-24",
            "count": 1
          },
          {
            "date": "2018-09-25",
            "count": 1
          },
          {
            "date": "2018-09-30",
            "count": 1
          },
          {
            "date": "2018-10-12",
            "count": 1
          },
          {
            "date": "2018-10-13",
            "count": 1
          },
          {
            "date": "2018-10-16",
            "count": 1
          },
          {
            "date": "2018-10-18",
            "count": 1
          },
          {
            "date": "2018-10-21",
            "count": 1
          },
          {
            "date": "2018-10-30",
            "count": 2
          },
          {
            "date": "2018-11-02",
            "count": 1
          },
          {
            "date": "2018-11-05",
            "count": 1
          },
          {
            "date": "2018-11-06",
            "count": 1
          },
          {
            "date": "2018-11-07",
            "count": 1
          },
          {
            "date": "2018-11-12",
            "count": 2
          },
          {
            "date": "2018-11-14",
            "count": 2
          },
          {
            "date": "2018-12-04",
            "count": 1
          },
          {
            "date": "2018-12-05",
            "count": 1
          },
          {
            "date": "2018-12-09",
            "count": 1
          },
          {
            "date": "2018-12-12",
            "count": 1
          },
          {
            "date": "2018-12-19",
            "count": 1
          },
          {
            "date": "2018-12-26",
            "count": 1
          },
          {
            "date": "2018-12-28",
            "count": 1
          },
          {
            "date": "2019-01-04",
            "count": 1
          },
          {
            "date": "2019-01-05",
            "count": 1
          },
          {
            "date": "2019-01-09",
            "count": 1
          },
          {
            "date": "2019-01-13",
            "count": 1
          },
          {
            "date": "2019-01-14",
            "count": 2
          },
          {
            "date": "2019-01-19",
            "count": 1
          },
          {
            "date": "2019-01-20",
            "count": 1
          },
          {
            "date": "2019-01-30",
            "count": 1
          },
          {
            "date": "2019-02-01",
            "count": 1
          },
          {
            "date": "2019-02-14",
            "count": 1
          },
          {
            "date": "2019-02-15",
            "count": 1
          },
          {
            "date": "2019-02-20",
            "count": 1
          },
          {
            "date": "2019-03-01",
            "count": 1
          },
          {
            "date": "2019-03-14",
            "count": 1
          },
          {
            "date": "2019-03-15",
            "count": 1
          },
          {
            "date": "2019-03-19",
            "count": 1
          },
          {
            "date": "2019-03-27",
            "count": 2
          },
          {
            "date": "2019-03-31",
            "count": 1
          },
          {
            "date": "2019-04-04",
            "count": 1
          },
          {
            "date": "2019-04-05",
            "count": 1
          },
          {
            "date": "2019-04-08",
            "count": 1
          },
          {
            "date": "2019-04-09",
            "count": 1
          },
          {
            "date": "2019-05-27",
            "count": 1
          },
          {
            "date": "2019-06-11",
            "count": 1
          },
          {
            "date": "2019-10-10",
            "count": 1
          },
          {
            "date": "2019-10-16",
            "count": 1
          },
          {
            "date": "2019-10-30",
            "count": 1
          },
          {
            "date": "2019-11-23",
            "count": 1
          },
          {
            "date": "2019-12-23",
            "count": 1
          },
          {
            "date": "2020-01-05",
            "count": 1
          },
          {
            "date": "2020-03-10",
            "count": 1
          },
          {
            "date": "2020-09-02",
            "count": 1
          },
          {
            "date": "2020-10-12",
            "count": 1
          },
          {
            "date": "2020-11-02",
            "count": 1
          },
          {
            "date": "2020-11-29",
            "count": 1
          },
          {
            "date": "2021-01-14",
            "count": 1
          },
          {
            "date": "2021-01-28",
            "count": 1
          },
          {
            "date": "2021-03-22",
            "count": 1
          },
          {
            "date": "2021-04-10",
            "count": 1
          },
          {
            "date": "2021-04-17",
            "count": 1
          },
          {
            "date": "2021-04-20",
            "count": 1
          },
          {
            "date": "2021-08-06",
            "count": 1
          },
          {
            "date": "2021-09-05",
            "count": 1
          },
          {
            "date": "2021-09-20",
            "count": 1
          },
          {
            "date": "2021-11-29",
            "count": 1
          },
          {
            "date": "2022-01-20",
            "count": 1
          },
          {
            "date": "2022-03-08",
            "count": 1
          },
          {
            "date": "2022-06-05",
            "count": 1
          },
          {
            "date": "2022-06-08",
            "count": 1
          },
          {
            "date": "2022-07-18",
            "count": 1
          },
          {
            "date": "2022-07-22",
            "count": 1
          },
          {
            "date": "2022-09-17",
            "count": 1
          },
          {
            "date": "2022-09-21",
            "count": 1
          },
          {
            "date": "2022-11-04",
            "count": 1
          },
          {
            "date": "2023-05-07",
            "count": 2
          },
          {
            "date": "2023-06-14",
            "count": 1
          },
          {
            "date": "2024-02-22",
            "count": 1
          },
          {
            "date": "2024-09-07",
            "count": 1
          },
          {
            "date": "2024-12-08",
            "count": 1
          },
          {
            "date": "2025-01-18",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 171,
        "total_forks": 196
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": true,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "embed/bootloader/protob/Makefile"
      ],
      "api_schema_files": [
        "embed/bootloader/protob/messages.proto",
        "embed/bootloader/protob/types.proto"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 141528,
      "source_files_sampled": 708,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Pipfile",
        "setup.cfg"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "black",
            "direct": false,
            "version": "18.9b0",
            "severity": "critical",
            "ecosystem": "pypi",
            "cvss_score": 9.8,
            "advisory_ids": [
              "GHSA-3936-cmfr-pm3m",
              "GHSA-fj7x-q9j7-g6q6",
              "PYSEC-2024-48",
              "PYSEC-2026-2120",
              "PYSEC-2026-2121"
            ],
            "fixed_version": "26.3.1",
            "advisory_count": 5,
            "oldest_advisory_days": 856
          },
          {
            "name": "ecdsa",
            "direct": false,
            "version": "0.13",
            "severity": "critical",
            "ecosystem": "pypi",
            "cvss_score": 9.1,
            "advisory_ids": [
              "GHSA-8qxj-f9rh-9fg2",
              "GHSA-9f5j-8jwj-x28g",
              "GHSA-pwfw-mgfj-7g3g",
              "GHSA-wj6h-64fc-37mp",
              "PYSEC-2019-177",
              "PYSEC-2020-163",
              "PYSEC-2026-1325",
              "PYSEC-2026-2467"
            ],
            "fixed_version": "0.19.2",
            "advisory_count": 8,
            "oldest_advisory_days": 2479
          },
          {
            "name": "pillow",
            "direct": false,
            "version": "5.4.0",
            "severity": "critical",
            "ecosystem": "pypi",
            "cvss_score": 9.8,
            "advisory_ids": [
              "GHSA-3f63-hfp8-52jq",
              "GHSA-3wvg-mj6g-m9cv",
              "GHSA-3xv8-3j54-hgrp",
              "GHSA-43fq-w8qq-v88h",
              "GHSA-44wm-f244-xhp3",
              "GHSA-45hq-cxwh-f6vc",
              "GHSA-4fx9-vc88-q2xc",
              "GHSA-4x4j-2g7c-83w6",
              "GHSA-57h3-9rgr-c24m",
              "GHSA-5gm3-px64-rw72"
            ],
            "fixed_version": "27.0.0-beta.2",
            "advisory_count": 108,
            "oldest_advisory_days": 2483
          },
          {
            "name": "certifi",
            "direct": false,
            "version": "2018.11.29",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-43fp-rhv2-5gv8",
              "GHSA-xqr8-7jwr-rhp7",
              "PYSEC-2022-42986",
              "PYSEC-2023-135",
              "PYSEC-2024-230"
            ],
            "fixed_version": "2024.7.4",
            "advisory_count": 5,
            "oldest_advisory_days": 1323
          },
          {
            "name": "click",
            "direct": false,
            "version": "7.0",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 7.2,
            "advisory_ids": [
              "PYSEC-2026-2132"
            ],
            "fixed_version": "8.3.3",
            "advisory_count": 1,
            "oldest_advisory_days": 84
          },
          {
            "name": "cryptography",
            "direct": false,
            "version": "2.4.2",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-3ww4-gg4f-jr7f",
              "GHSA-537c-gmf6-5ccf",
              "GHSA-5cpq-8wj7-hf2v",
              "GHSA-9v9h-cgj8-h64p",
              "GHSA-hggm-jpg3-v476",
              "GHSA-jm77-qphf-c4w8",
              "GHSA-m959-cc7f-wv43",
              "GHSA-r6ph-v2qm-q3c2",
              "GHSA-w7pp-m8wf-vj6r",
              "GHSA-x4qr-2fvf-3mr5"
            ],
            "fixed_version": "300.0.12",
            "advisory_count": 17,
            "oldest_advisory_days": 2094
          },
          {
            "name": "idna",
            "direct": false,
            "version": "2.8",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-65pc-fj4g-8rjx",
              "GHSA-jjg7-2v4v-x38h",
              "PYSEC-2024-60",
              "PYSEC-2026-215"
            ],
            "fixed_version": "3.15",
            "advisory_count": 4,
            "oldest_advisory_days": 832
          },
          {
            "name": "mako",
            "direct": false,
            "version": "1.0.7",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-2h4p-vjrc-8xpq",
              "GHSA-v92g-xgxw-vvmm",
              "GHSA-v973-fxgf-6xhp",
              "PYSEC-2022-260",
              "PYSEC-2026-2617",
              "PYSEC-2026-88"
            ],
            "fixed_version": "1.3.12",
            "advisory_count": 6,
            "oldest_advisory_days": 1415
          },
          {
            "name": "filelock",
            "direct": false,
            "version": "3.0.10",
            "severity": "moderate",
            "ecosystem": "pypi",
            "cvss_score": 6.3,
            "advisory_ids": [
              "GHSA-qmgc-5h2g-mvrw",
              "GHSA-w853-jp5j-5j7f",
              "PYSEC-2026-1374",
              "PYSEC-2026-1375"
            ],
            "fixed_version": "3.20.3",
            "advisory_count": 4,
            "oldest_advisory_days": 218
          },
          {
            "name": "protobuf",
            "direct": false,
            "version": "3.4.0",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-7gcm-g887-7qv7",
              "GHSA-8gq9-2x98-w8hf",
              "GHSA-8qvm-5x2c-j2w7",
              "PYSEC-2022-48",
              "PYSEC-2026-1805",
              "PYSEC-2026-1806",
              "PYSEC-2026-899"
            ],
            "fixed_version": null,
            "advisory_count": 7,
            "oldest_advisory_days": null
          },
          {
            "name": "py",
            "direct": false,
            "version": "1.7.0",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-hj5v-574p-mj7c",
              "PYSEC-2020-92"
            ],
            "fixed_version": null,
            "advisory_count": 2,
            "oldest_advisory_days": null
          },
          {
            "name": "pycryptodome",
            "direct": false,
            "version": "3.7.2",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-j225-cvw7-qrx7",
              "PYSEC-2026-1811"
            ],
            "fixed_version": null,
            "advisory_count": 2,
            "oldest_advisory_days": null
          },
          {
            "name": "pytest",
            "direct": false,
            "version": "4.0.2",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-6w46-j5rx-g56g",
              "PYSEC-2026-1845"
            ],
            "fixed_version": null,
            "advisory_count": 2,
            "oldest_advisory_days": null
          },
          {
            "name": "requests",
            "direct": false,
            "version": "2.21.0",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-9hjg-9r4m-mvj7",
              "GHSA-9wx4-h78v-vm56",
              "GHSA-gc5v-m9x4-r6x2",
              "GHSA-j8r2-6x86-q33q",
              "PYSEC-2023-74",
              "PYSEC-2026-1872",
              "PYSEC-2026-1873",
              "PYSEC-2026-2275"
            ],
            "fixed_version": null,
            "advisory_count": 8,
            "oldest_advisory_days": null
          },
          {
            "name": "urllib3",
            "direct": false,
            "version": "1.24.1",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-2xpw-w6gg-jr37",
              "GHSA-34jh-p97f-mpxf",
              "GHSA-38jv-5279-wg99",
              "GHSA-g4mx-q9vg-27p4",
              "GHSA-gm62-xv2j-4w53",
              "GHSA-gwvm-45gx-3cf8",
              "GHSA-mh33-7rrq-662w",
              "GHSA-pq67-6m6q-mj2v",
              "GHSA-qccp-gfcp-xxvc",
              "GHSA-r64q-w8jr-g9qp"
            ],
            "fixed_version": null,
            "advisory_count": 24,
            "oldest_advisory_days": null
          },
          {
            "name": "virtualenv",
            "direct": false,
            "version": "16.2.0",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-597g-3phw-6986",
              "GHSA-rqc4-2hc7-8c8v",
              "PYSEC-2024-187",
              "PYSEC-2026-2009"
            ],
            "fixed_version": null,
            "advisory_count": 4,
            "oldest_advisory_days": null
          },
          {
            "name": "wheel",
            "direct": false,
            "version": "0.32.3",
            "severity": "unknown",
            "ecosystem": "pypi",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-qwmp-2cf2-g9g6",
              "PYSEC-2022-43017"
            ],
            "fixed_version": null,
            "advisory_count": 2,
            "oldest_advisory_days": null
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 5,
          "unknown": 8,
          "critical": 3,
          "moderate": 1
        },
        "advisory_count": 209,
        "affected_count": 17,
        "assessed_count": 64,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 1,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "aiounittest",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "appdirs",
            "direct": false,
            "version": "1.4.3",
            "ecosystem": "pypi"
          },
          {
            "name": "asn1crypto",
            "direct": false,
            "version": "0.24.0",
            "ecosystem": "pypi"
          },
          {
            "name": "atomicwrites",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "pypi"
          },
          {
            "name": "attrs",
            "direct": false,
            "version": "18.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "black",
            "direct": false,
            "version": "18.9b0",
            "ecosystem": "pypi"
          },
          {
            "name": "braceexpand",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "certifi",
            "direct": false,
            "version": "2018.11.29",
            "ecosystem": "pypi"
          },
          {
            "name": "cffi",
            "direct": false,
            "version": "1.11.5",
            "ecosystem": "pypi"
          },
          {
            "name": "chacha20poly1305",
            "direct": false,
            "version": "0.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "chardet",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "pypi"
          },
          {
            "name": "click",
            "direct": false,
            "version": "7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "construct",
            "direct": false,
            "version": "2.9.45",
            "ecosystem": "pypi"
          },
          {
            "name": "cryptography",
            "direct": false,
            "version": "2.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "ctypeslib2",
            "direct": false,
            "version": "2.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "ecdsa",
            "direct": false,
            "version": "0.13",
            "ecosystem": "pypi"
          },
          {
            "name": "ed25519",
            "direct": false,
            "version": "1.4",
            "ecosystem": "pypi"
          },
          {
            "name": "extended-pathlib",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "filelock",
            "direct": false,
            "version": "3.0.10",
            "ecosystem": "pypi"
          },
          {
            "name": "flake8",
            "direct": false,
            "version": "3.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "idna",
            "direct": false,
            "version": "2.8",
            "ecosystem": "pypi"
          },
          {
            "name": "isort",
            "direct": false,
            "version": "4.3.4",
            "ecosystem": "pypi"
          },
          {
            "name": "libusb1",
            "direct": false,
            "version": "1.7",
            "ecosystem": "pypi"
          },
          {
            "name": "mako",
            "direct": false,
            "version": "1.0.7",
            "ecosystem": "pypi"
          },
          {
            "name": "markupsafe",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "mccabe",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "pypi"
          },
          {
            "name": "mnemonic",
            "direct": false,
            "version": "0.18",
            "ecosystem": "pypi"
          },
          {
            "name": "mock",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "monero-agent",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "monero-serialize",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "more-itertools",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "munch",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "pypi"
          },
          {
            "name": "nose",
            "direct": false,
            "version": "1.3.7",
            "ecosystem": "pypi"
          },
          {
            "name": "pandoc",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pbkdf2",
            "direct": false,
            "version": "1.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pbr",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pep8",
            "direct": false,
            "version": "1.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": false,
            "version": "5.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pluggy",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ply",
            "direct": false,
            "version": "3.11",
            "ecosystem": "pypi"
          },
          {
            "name": "protobuf",
            "direct": false,
            "version": "3.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "py",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "py-cryptonight",
            "direct": false,
            "version": "0.1.8",
            "ecosystem": "pypi"
          },
          {
            "name": "py-trezor-crypto-ph4",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pyblake2",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pycodestyle",
            "direct": false,
            "version": "2.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pycparser",
            "direct": false,
            "version": "2.19",
            "ecosystem": "pypi"
          },
          {
            "name": "pycryptodome",
            "direct": false,
            "version": "3.7.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pyflakes",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pympler",
            "direct": false,
            "version": "0.6",
            "ecosystem": "pypi"
          },
          {
            "name": "pypandoc",
            "direct": false,
            "version": "1.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": false,
            "version": "2.21.0",
            "ecosystem": "pypi"
          },
          {
            "name": "scan-build",
            "direct": false,
            "version": "2.0.15",
            "ecosystem": "pypi"
          },
          {
            "name": "shlib",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "six",
            "direct": false,
            "version": "1.12.0",
            "ecosystem": "pypi"
          },
          {
            "name": "termcolor",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "toml",
            "direct": false,
            "version": "0.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "tox",
            "direct": false,
            "version": "3.6.1",
            "ecosystem": "pypi"
          },
          {
            "name": "trezor",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "typing",
            "direct": false,
            "version": "3.6.6",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-extensions",
            "direct": false,
            "version": "3.6.6",
            "ecosystem": "pypi"
          },
          {
            "name": "urllib3",
            "direct": false,
            "version": "1.24.1",
            "ecosystem": "pypi"
          },
          {
            "name": "virtualenv",
            "direct": false,
            "version": "16.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "wheel",
            "direct": false,
            "version": "0.32.3",
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 65,
        "direct_count": 0,
        "indirect_count": 65
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 194,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 221,
        "closed_unmerged_prs": 80
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "prusnak",
          "commits": 1372,
          "avatar_url": "https://avatars.githubusercontent.com/u/42201?v=4"
        },
        {
          "type": "User",
          "login": "jpochyla",
          "commits": 760,
          "avatar_url": "https://avatars.githubusercontent.com/u/1055497?v=4"
        },
        {
          "type": "User",
          "login": "tsusanka",
          "commits": 260,
          "avatar_url": "https://avatars.githubusercontent.com/u/1835345?v=4"
        },
        {
          "type": "User",
          "login": "mcudev",
          "commits": 94,
          "avatar_url": "https://avatars.githubusercontent.com/u/29890609?v=4"
        },
        {
          "type": "User",
          "login": "admin-slush",
          "commits": 73,
          "avatar_url": "https://avatars.githubusercontent.com/u/59502967?v=4"
        },
        {
          "type": "User",
          "login": "andrewkozlik",
          "commits": 40,
          "avatar_url": "https://avatars.githubusercontent.com/u/42678794?v=4"
        },
        {
          "type": "User",
          "login": "matejcik",
          "commits": 34,
          "avatar_url": "https://avatars.githubusercontent.com/u/596073?v=4"
        },
        {
          "type": "User",
          "login": "ph4r05",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/1052761?v=4"
        },
        {
          "type": "User",
          "login": "alepop",
          "commits": 16,
          "avatar_url": "https://avatars.githubusercontent.com/u/922338?v=4"
        },
        {
          "type": "User",
          "login": "jhoenicke",
          "commits": 16,
          "avatar_url": "https://avatars.githubusercontent.com/u/897826?v=4"
        }
      ],
      "contributors_sampled": 34,
      "top_contributor_share": 0.5
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [
        ".pylintrc"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Pipfile.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 12 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 5,
            "reason": "Found 12/21 approved changesets -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 19 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project is archived",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "110 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "18c3a6a5bd45923380312b064be96155f5a7377d",
        "ran_at": "2026-07-23T16:02:47Z",
        "aggregate_score": 3.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": null,
      "oldest_open_prs": [],
      "last_merged_pr_at": "2019-04-15T15:24:56Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/trezor/trezor-core",
    "host": "github.com",
    "name": "trezor-core",
    "owner": "trezor"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "critical",
      "name": "Overall health",
      "note": "Abandonment Policy applies a 40% multiplier to weighted overall health and gives it a ceiling of 29.",
      "notes": [
        {
          "code": "abandonment_overall_adjustment",
          "params": {
            "cap": 29,
            "pct": 40
          }
        }
      ],
      "value": 20,
      "inputs": {
        "security": 46,
        "vitality": 17,
        "community": 67,
        "governance": 66,
        "engineering": 60,
        "abandonment_cap": 29,
        "abandonment_state": "declared",
        "abandonment_multiplier": 40,
        "weighted_overall_before_abandonment": 51,
        "overall_after_abandonment_multiplier": 20
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "critical",
        "name": "Vitality",
        "value": 17,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "critical",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "commits_last_year": 0,
              "human_commit_share": 1,
              "days_since_last_push": 2652,
              "active_weeks_last_year": 0
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2652 days ago",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2652
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "0/52 weeks with commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "0 commits in the last year",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project is archived",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "at_risk",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 40,
            "inputs": {
              "releases_count": 7,
              "latest_release_tag": "v2.1.0",
              "releases_from_tags": true,
              "days_since_latest_release": 2697,
              "mean_days_between_releases": 61.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "7 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2697 days ago",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2697
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~61.6 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 61.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "at_risk",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "cap": 29,
              "state": "declared",
              "guards": [],
              "signals": [],
              "red_flag": true,
              "multiplier_pct": 40,
              "declared_reason": "archived",
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "the repository is archived on GitHub",
                "points": 40,
                "status": "partial",
                "details": [
                  {
                    "code": "abandonment_archived",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 67,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "forks": 196,
              "stars": 358,
              "watchers": 7,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "358 stars",
                "points": 41.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 358
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "196 forks",
                "points": 19.1,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 196
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "7 watchers",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (GPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "GPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 66,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 34,
              "top_contributor_share": 0.5
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 50% of commits",
                "points": 11.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 50
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "34 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 34
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 19 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "merged_prs": 194,
              "open_issues": 0,
              "closed_issues": 221,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 80
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "194/274 decided PRs merged",
                "points": 27.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 194,
                      "decided": 274
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 12/21 approved changesets -- score normalized to 5",
                "points": 7.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "followers": 1245,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "trezor",
              "public_repos": 67,
              "account_age_days": 4849
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1,245 followers of trezor",
                "points": 22.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1245,
                      "login": "trezor"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "67 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 67
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 60,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".pylintrc",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".pylintrc"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 12 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "trezor",
                "micropython",
                "bitcoin"
              ],
              "has_wiki": false,
              "homepage": "https://github.com/trezor/trezor-firmware",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://github.com/trezor/trezor-firmware",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "3 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "dangerous_workflow",
                    "packaging",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 32,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 3.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 12 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 12/21 approved changesets -- score normalized to 5",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 19 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project is archived",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "110 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 64 resolved dependencies against OSV; 1 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 64
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 1
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 209,
              "affected_packages": 17,
              "assessed_packages": 64,
              "unassessed_packages": 1,
              "affected_by_severity": "critical 3, high 5, moderate 1, unknown 8",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 64,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 13
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 51,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.87,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "87 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": true,
              "has_tests": true,
              "lockfiles": [
                "Pipfile.lock"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile",
                "embed/bootloader/protob/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, embed/bootloader/protob/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, embed/bootloader/protob/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".pylintrc",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".pylintrc"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, Nix, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, Nix, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 141528,
              "source_files_sampled": 708,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/708 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 708,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": false,
              "api_schema_files": [
                "embed/bootloader/protob/messages.proto",
                "embed/bootloader/protob/types.proto"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "embed/bootloader/protob/messages.proto, embed/bootloader/protob/types.proto",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "embed/bootloader/protob/messages.proto, embed/bootloader/protob/types.proto"
                    }
                  }
                ],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Advisory severity resolved for 120 of 209 advisories (lookup cap); the remainder are reported as unknown severity"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T16:03:14.729378Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/trezor/trezor-core.svg",
  "full_name": "trezor/trezor-core",
  "license_state": "standard",
  "license_spdx": "GPL-3.0"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистика.