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

dkorunic / iSMC

Apple SMC CLI — decode temperature, fans, battery, power, voltage and current on macOS

GoGPL-3.0★ 197 зірок⑂ 22 форкиз жовт. 2019 р.Переглянути на GitHub ↗
ТипІнструмент командного рядкаБібліотекаяк це визначено

dkorunic/iSMC має індекс здоров’я 71 зі 100, що відповідає смузі «Добрий». Найвищий показник — AI Readiness (88/100), найнижчий — Community & Adoption (50/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

71
загалом / 100
Добрий

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

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

71
Винятковий93-100Верхній щабель реєстру (≈ топ-5%); відповідає практично всім перевіреним критеріям
Відмінний80-92Сильний за всіма напрямами; незначні прогалини
Добрий65-79Здоровий; прогалини обмежені та керовані
Помірний50-64Прийнятний, але з помітними прогалинами; рекомендовано перевірку
Слабкий35-49Суттєві недоліки в кількох сферах
У зоні ризику20-34Суттєві слабкі місця; впровадження потребує обережності
Критичний1-19Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

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

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

Зважений загальний бал 63 калібровано до 71 за шкалою опублікованого індексу (калібрування реєстру 2026-08-02).

Власність

Dinko KorunicОсобистий обліковий запис
138 підписників32 публічні репозиторіїз груд. 2012 р.HAProxy Technologies

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/dkorunic/iSMCv0.17.0-534 дні тому

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

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

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

82Відмінний · 21% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
13.2/36Ритм комітів — 19/52 тижнів із комітами
18/18Обсяг комітів — 99 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year99
human_commit_share1
days_since_last_push0
active_weeks_last_year19
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 50 релізів
36/36Свіжість релізів — останній реліз 4 дн. тому
27/27Ритм релізів — реліз кожні ~10,5 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count50
latest_release_tagv0.17.0
releases_from_tagsні
days_since_latest_release4
mean_days_between_releases10,5

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

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

50Помірний · 17% загального індексу
Як обчислюється оцінка
37.2/60Зірки — 197 зірок
11/25Форки — 22 форків
1.7/15Спостерігачі — 3 спостерігачів
Використані вхідні дані
forks22
stars197
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (GPL-3.0)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
readme_badges
has_contributingні
has_issue_templateні
has_code_of_conductні
readme_badge_services
has_pull_request_templateні

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

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

63Помірний · 23% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0.8/22.5Розподіл комітів — головний контриб’ютор — автор 97% комітів
8.1/13.5Широта контриб’юторів — 6 контриб’юторів
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Використані вхідні дані
bus_factor1
contributors_sampled6
top_contributor_share0,966
Як обчислюється оцінка
42/42Вирішення issue — закрито 100% issue
30/30Прийняття PR — злито 8/8 вирішених PR
0/13Newcomer PR acceptance — за 30 дн. не вирішено жодного PR від новачка
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs8
open_issues0
closed_issues29
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs0
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Виключено з оцінювання (немає даних або не застосовно): newcomer_pr_acceptance. Залишкові ваги перенормовано.
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
15.4/25Охоплення власника — 138 підписників у dkorunic
23.1/25Послужний список — 32 публічних репозиторіїв, вік облікового запису ~13 р.
Використані вхідні дані
followers138
owner_typeUser
is_verified
owner_logindkorunic
public_repos32
account_age_days4 974
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Винятковий
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 4 дн. тому
20/20Історія версій — 53 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/dkorunic/iSMC
ecosystemsgo
any_deprecatedні
min_days_since_publish4

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

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

54Помірний · 19% загального індексу
Як обчислюється оцінка
0/24Процеси CI
24/24Наявні тести
16/16Конфігурація лінтера — .golangci.yml
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciні
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.

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

60Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
10/10Теми — 10 тем
10/10Wiki
Використані вхідні дані
topicsapple, macos, smc, temperature, current, voltage, power, fan, monitoring, hardware
has_wikiтак
homepage
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

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

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

Стан безпеки

45Слабкий
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
0/10Dangerous-Workflow — немає даних
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
0/5Pinned-Dependencies — немає даних
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — немає даних
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate4,5
Виключено з оцінювання (немає даних або не застосовно): ci_tests, dangerous_workflow, packaging, pinned_dependencies, token_permissions. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages13
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 13 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

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

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Має свідомо малу вагу (4%): агентний інструментарій — реальний сигнал супроводу, але репозиторій без нього все одно може отримати 100/100.

88Відмінний · 4% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 80 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,8
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes4 821
Як обчислюється оцінка
18/18Розгортання однією командою — Taskfile.yml
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .golangci.yml
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
5/8Автоматизоване супроводження — автоматизацію залежностей налаштовано, але у вибірці комітів її не видно
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_filesTaskfile.yml
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod, gosmc/go.mod
dependency_bot_commit_share0
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Pinned-Dependencies. Залишкові ваги перенормовано.
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
53.9/55Керовані розміри файлів — 1/48 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes78 024
source_files_sampled48
oversized_source_files1

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

197зірок GitHub
6контриб'юторів
99комітів за останні 12 місяців
0днів від останнього пушу
50релізів
1бас-фактор
0відкритих issue
Goпакетних екосистем

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

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Докладніше

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

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

048121620242122019-112023-032026-07
Мажорні 0Мінорні 12Патчі 36

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

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

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
н/дDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
н/дPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
н/дToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 5
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/dkorunic/iSMC/gosmcv0.0.0-20260413130435-fb3be841d2e6go.mod
Gogithub.com/fvbommel/sortorderv1.1.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/jedib0t/go-pretty/v6v6.8.3go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Усі залежності 13

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

РеєстрПакетВерсіяЗв'язок
Gogithub.com/fvbommel/sortorderv1.1.0пряма
Gogithub.com/jedib0t/go-pretty/v6v6.8.3пряма
Gogithub.com/spf13/cobrav1.10.2пряма
Gogithub.com/stretchr/testifyv1.11.1пряма
Gogithub.com/clipperhouse/uax29/v2v2.7.0непряма
Gogithub.com/davecgh/go-spewv1.1.1непряма
Gogithub.com/inconshreveable/mousetrapv1.1.0непряма
Gogithub.com/mattn/go-runewidthv0.0.27непряма
Gogithub.com/pmezard/go-difflibv1.0.0непряма
Gogithub.com/spf13/pflagv1.0.10непряма
Gogolang.org/x/sysv0.47.0непряма
Gogolang.org/x/textv0.40.0непряма
Gogopkg.in/yaml.v3v3.0.1непряма
Сповіщення про залежності 0

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

Жодне відоме сповіщення не стосується оцінених залежностей.

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "apple",
        "macos",
        "smc",
        "temperature",
        "current",
        "voltage",
        "power",
        "fan",
        "monitoring",
        "hardware"
      ],
      "is_fork": false,
      "size_kb": 921,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C": 17754,
        "Go": 250976,
        "Shell": 1183
      },
      "pushed_at": "2026-07-28T10:46:10Z",
      "created_at": "2019-10-17T20:47:42Z",
      "owner_type": "User",
      "updated_at": "2026-07-28T10:48:16Z",
      "description": "Apple SMC CLI — decode temperature, fans, battery, power, voltage and current on macOS",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "GPL-3.0",
      "default_branch": "master",
      "license_spdx_raw": "GPL-3.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://www.linkedin.com/in/dkorunic",
      "name": "Dinko Korunic",
      "type": "User",
      "login": "dkorunic",
      "company": "HAProxy Technologies",
      "location": "Zagreb, Croatia",
      "followers": 138,
      "avatar_url": "https://avatars.githubusercontent.com/u/3041939?v=4",
      "created_at": "2012-12-14T10:54:53Z",
      "is_verified": null,
      "public_repos": 32,
      "account_age_days": 4974
    },
    "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": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-07-24T10:08:50Z"
        },
        {
          "tag": "v0.16.7",
          "kind": "patch",
          "published_at": "2026-07-09T14:20:01Z"
        },
        {
          "tag": "v0.16.6",
          "kind": "patch",
          "published_at": "2026-06-25T17:35:35Z"
        },
        {
          "tag": "v0.16.5",
          "kind": "patch",
          "published_at": "2026-06-07T15:11:07Z"
        },
        {
          "tag": "v0.16.4",
          "kind": "patch",
          "published_at": "2026-05-08T12:35:46Z"
        },
        {
          "tag": "v0.16.3",
          "kind": "patch",
          "published_at": "2026-05-08T09:52:23Z"
        },
        {
          "tag": "v0.16.2",
          "kind": "patch",
          "published_at": "2026-04-28T11:52:32Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-04-28T11:03:33Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-04-23T11:10:00Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-04-21T07:30:33Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-04-17T07:39:41Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-04-14T14:21:49Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-04-14T09:31:18Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-04-13T14:57:18Z"
        },
        {
          "tag": "v0.13.5",
          "kind": "patch",
          "published_at": "2026-03-23T17:35:13Z"
        },
        {
          "tag": "v0.13.4",
          "kind": "patch",
          "published_at": "2026-03-16T12:32:59Z"
        },
        {
          "tag": "v0.13.3",
          "kind": "patch",
          "published_at": "2026-03-16T11:04:19Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-03-16T08:50:10Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-03-15T19:27:58Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-03-15T17:23:12Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-03-14T13:02:30Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-02-16T16:04:43Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-01-01T11:25:00Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2025-12-09T06:37:16Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2025-10-11T08:12:21Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2025-07-04T10:50:26Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2025-03-06T13:08:02Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2025-02-21T09:56:08Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2024-12-24T18:03:25Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2024-12-13T09:28:36Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2024-12-10T08:45:38Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2024-10-02T16:24:19Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2024-08-18T09:07:43Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2024-04-23T15:28:44Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2024-02-04T10:35:23Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2023-06-13T20:42:45Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2023-02-02T07:03:04Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2022-11-23T10:16:56Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2022-04-18T10:35:38Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2022-04-08T20:26:48Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2022-04-08T15:19:36Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2022-04-08T06:46:19Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2022-04-07T20:29:46Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2022-04-07T15:37:16Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2022-04-03T18:44:41Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2022-03-17T18:29:45Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2021-10-08T15:24:05Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2020-06-09T12:33:02Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2020-01-21T08:59:29Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2019-10-17T21:03:34Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "c22bacc7ac7147c6d90d8157b9b9bfb6f37e4201",
          "body": "EnumerateKeysPrefix binary-searches the firmware's key index — ascending\nASCII order on every machine in internal/reports — to fetch a prefix\nblock in ~30 IOKit round trips instead of a full namespace walk, falling\nback to filtered EnumerateKeys on any probe failure, order violation, or\nempty block.\n[…]\nan M2 Max (OSHI), while genuine mapped readings stay ≥21 °C;\nno key mapped in src/temp.txt reads between 10 and 15 °C in any dump.\nAlso refresh the stale maxKeys comment (~1800 → observed up to 2409).",
          "is_bot": false,
          "headline": "feat(smc): add sorted-index prefix scan and raise sentinel floor (#37)",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-07-28T10:46:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4cc6e710822d288ed14fb0353fd6934258859124",
          "body": "Findings:\n- influx: quote free-text string field values and only split unit when the\n  prefix parses as a number; fixes corrupted/truncated hardware lines\n- smc: omit battery/fan entries on read failure instead of phantom zeros\n- gosmc: read SMC keys via a stack [5]C.char (no per-read alloc, bounds-\n[…]\ncheck, nonamedreturns, noinlineerr, dupword, godot, errchkjson\n- scoped nlreturn exclusion for cgo files (skewed positions)\n\nComments: tighten production doc/inline comments to intent, drop narration.",
          "is_bot": false,
          "headline": "fix: address AI-review findings, clean up lint, tighten comments",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-07-24T10:07:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55cdc75d016549a85a7988f54b8b08e41f61505e",
          "body": "- bump go-pretty v6.8.2 -> v6.8.3 and go-runewidth v0.0.24 -> v0.0.27\n- merge same-type parameters in SMCCall and runStressPhase signatures",
          "is_bot": false,
          "headline": "chore: update deps and consolidate parameter declarations",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-07-24T08:08:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86fda471e451f17dc4b68619ead508fe897613c3",
          "body": "The guess command produced wildly unreliable output (55-68 \"Performance\ncores\" on a 16P+4E M1 Ultra, SSD/heatsink sensors labelled as CPUs,\n243-line run-to-run diffs, zero-detection phases on warm starts). Root\ncauses and fixes:\n\n- Replace mixed-radix index parsing (decimal unless A-F present, then\n\n[…]\nplets (16P+4E) detected,\nall intact, stable across consecutive warm-started runs. New\ncorpus-derived tests cover the parser, grouping, eligibility, and\nclassifier against real M1/M4/M5/Intel key sets.",
          "is_bot": false,
          "headline": "fix(guess): decode SMC indices positionally and classify cores per group",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-07-24T08:04:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45bcc867e1630ad68a9b8d98e2d9b364ac9aa6de",
          "body": "Update deps:\n- golang.org/x/text to v0.40.0\n- github.com/jedib0t/go-pretty/v6 to v6.8.2\n- golang.org/x/sys to v0.47.0",
          "is_bot": false,
          "headline": "Update dependancies.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-07-09T14:19:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfcecb234f9353017d4d5012f9a35f3f84769ecb",
          "body": "Migrate the deprecated brews-only setup to also emit a Homebrew cask via\nhomebrew_casks, while keeping the formula in Formula/. The cask strips the\ncom.apple.quarantine xattr post-install so the CLI runs without Gatekeeper\nprompts. Also clear pre-existing deprecations: pin version 2, rename\nsnapshot.name_template -> version_template and format_overrides.format ->\nformats.",
          "is_bot": false,
          "headline": "build(goreleaser): add homebrew_casks alongside formula",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-06-25T17:34:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b21ebd2d2a5e8e396e64e7142570c955638a600",
          "body": "Update deps:\n- github.com/jedib0t/go-pretty/v6 to v6.8.0\n- github.com/mattn/go-runewidth to v0.0.24\n- golang.org/x/sys to v0.45.0",
          "is_bot": false,
          "headline": "Update dependancies.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-06-06T10:28:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8019bb8a379b1725513230616b989545d340bbaf",
          "body": "Review-driven hardening and cleanup across the sensor pipeline:\n\n- smc: clamp kernel-supplied DataSize before slicing raw bytes\n- gosmc: add compile-time size assertions for the unsafe C reinterprets\n- output: strip newlines in Influx line-protocol escaping\n- output: merge sensor maps in place, dropping the redundant deep copy\n- style: tidy control flow, conversions, and unused command args",
          "is_bot": false,
          "headline": "refactor: harden SMC/HID boundaries and tidy sensor output",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-06-06T10:27:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2b751f8aac9370fd5fd822cdbde7d2c9ec1e45a",
          "body": null,
          "is_bot": false,
          "headline": "Remove camo purge action",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-06-04T06:14:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "955305cb3c8804010975ab6a9d663981392fbe06",
          "body": "cmd, output, platform, reports, and stress are relocated to internal/\nso they become compiler-enforced private to the module; gosmc, smc,\nand hid remain public as the intended library surface. The\n-ldflags -X paths in Taskfile.yml and .goreleaser.yml are updated to\nmatch — a path mismatch fails sile\n[…]\nmes through SMC, not HID), clarify M1–M5 + A18 Pro\n  coverage, complete the command alias list, and drop the now-done\n  data-types Todo item.\n- CLAUDE.md: refresh package layout and data-flow diagram.",
          "is_bot": false,
          "headline": "refactor: move app-glue packages under internal/",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-25T07:45:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "241fa80697e2c4b16bfbb3c72161a11211ed7ea4",
          "body": "… 0.37.0\n\nRoutine indirect dependency updates from go mod tidy.",
          "is_bot": false,
          "headline": "chore(deps): bump golang.org/x/sys to 0.44.0 and golang.org/x/text to…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-17T15:28:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ec22abc4b7e038c752e22cec32264f9aa3a1b8c",
          "body": "Capture the constraints that aren't visible from CLAUDE.md alone:\nthe darwin-only build tag, the two-module layout, the generated\nsmc/sensors.go, and the required generate->fmt->build order.",
          "is_bot": false,
          "headline": "docs(agents): add AGENTS.md with non-obvious build constraints",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-17T15:28:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29be3ae39e353dc3c4187620d5b48782cc3e268e",
          "body": null,
          "is_bot": false,
          "headline": "refactor: tighten comments across packages to focus on intent",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-14T11:00:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1f2b7bda2cb276af56d58b8824eacd5a733660e",
          "body": "Replace the 12-line GNU GPLv3 boilerplate in every Go source file\nwith a single `SPDX-License-Identifier: GPL-3.0-only` line, keeping\nthe existing copyright attribution (Dinko Korunic 2019/2026, Roland\nSchaer 2022). The original wording — \"Free Software Foundation,\nversion 3\" with no upgrade clause \n[…]\nes\n  (Copyright 2006 devnull) are intentionally left untouched —\n  scope is Go sources, and the C layer carries a different\n  upstream license.\n\nNet diff: 49 insertions, 516 deletions across 45 files.",
          "is_bot": false,
          "headline": "chore(license): switch GPL boilerplate to SPDX identifier",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-13T11:32:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ecac96b52cc063501a62010d5c39a8615562d8a5",
          "body": "The original M2 block (#23, 2024-10-02) was added before any M2 dump\nexisted and used an M5-style single-key probe-B convention with five\nkeys (Tp0X, Tp1h/t/p/l, Tg0j) absent on real hardware. With\nreports/report-m2.txt now embedded, an M2 Pro user saw 7 of 8 P-cores\nat the probe-B value (1.5-2.5 C \n[…]\nal-state mutation in TestIngest_skipsNonTKeys raced\n  with TestKeysIntegration, surfacing once the M2 file invalidated\n  Go's test cache.\n- Capture reports/report-m2.txt SMC dump as the evidence base.",
          "is_bot": false,
          "headline": "fix(sensors): rewrite M2 mappings against real SMC dump; fix test race",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-08T12:33:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9c0fced1c9795a9af18e40959da6bb536814ca1c",
          "body": "- Promote SoC heatsink Th** triplets from :M3 to :Apple (12 rows). M1\n  Pro/Max/Ultra populate Th00-Th0E with live values but were filtered\n  out by the M3-only tag. M4/M5/A18 don't populate Th**, runtime-rejected.\n- Add Th0G-Th0I (M1 Max/Ultra extra triplet) and Th20-Th2I (M1 Ultra\n  die-2, five tr\n[…]\nhree-line\n  heatsink block to one line. All comments now under 13 words.\n- Capture reports/report-m1-pro-2.txt refresh and add report-m3-max-2,\n  report-m4-max, report-m5-max-2 dumps as evidence base.",
          "is_bot": false,
          "headline": "feat(smc): map cross-platform heatsinks, regulators, airflow zones",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-08T09:47:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b3f7e06bd03825d86573738e8518888b1d5e5fa",
          "body": "- Add Test_RawKeyToFloat32 case for huge ioft sentinels (observed on\n  report-m4-4.txt as TR3d ≈ 10¹⁴ °C); finiteInRange must reject.\n- Update Test_filterByFamily_A18_GeneratedTable assertion from 69 to 71\n  rows to reflect TQ0d/TQ0j ISP-sensor additions in 7ec7b7e.",
          "is_bot": false,
          "headline": "test(smc): bound ioft decode and sync A18 row count",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-08T09:46:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d4af83c579c86a727d7d2af9ed9365ee7b0ab5b",
          "body": "…droom\n\n- Add Tf04/06/08-0B and Tf14/16/18-1B as M5 GPU Fabric Block 0/1\n  (M3-style: aggregate, max, four probes per block; absent on M5 base/Pro,\n  silently ignored).\n- Extend M5 fabric with TfC6/7/8/9/A — complementary to the M5 Pro\n  TfC0/1/3/5/B/D/E/F set; both unions mapped under one section.\n\n[…]\n5 Max idle).\n- Add TVSx Apple alias (mirrors TVS0; lowercase x not reachable via the\n  % wildcard, which expands to digits 0-9 only).\n- Capture reports/report-m5-max.txt SMC dump as the evidence base.",
          "is_bot": false,
          "headline": "feat(smc): expand M5 Max coverage with GPU fabric, SSD slots, die hea…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-05-04T09:48:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "61e12fe10e949dd9ed6e873565fd061419cfe09f",
          "body": null,
          "is_bot": false,
          "headline": "refactor(guess): tighten inline comments to focus on intent",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-30T10:49:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ec7b7ef5aeb8ee3d57d09d07d2b08502e637976",
          "body": "Drives phase labels, QoS hints, and per-type counts from a new platform.SKULayout\nroster (S/P/E core ranges, GPU cores, dies, pair signature) so the M5 S+E vs S+P\nsplit is named correctly. Adds smc.LookupTempDesc / MappedTempKeys reverse\nlookups (mirroring runtime wildcard expansion and platform fil\n[…]\ne that embeds reports/*.txt at compile time. guess output now\nflags each detected key as matching src/temp.txt, mismatched, or NEW, and prints\nmapped-vs-silent-vs-novel summaries against both sources.",
          "is_bot": false,
          "headline": "feat(guess): annotate detected sensors against temp.txt and report dumps",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-30T10:37:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7888e1f165b6dcbf8b125367f8091df756ee736",
          "body": null,
          "is_bot": false,
          "headline": "refactor(smc): rework M3 GPU fabric mapping; cover all five Tf bands",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-28T11:50:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4528671f0ed9716765b75fd257537d5e287c316",
          "body": "… M5 Tp1E label\n\n- Add TPDg-j and TRDg-j (Apple-wide): M1 Pro/Max/Ultra real readings\n- Backfill M1 Ultra die-2 TpDc-j (8 keys) and TrDb-j (9 keys)\n- Map M4 Pro Tp0d-w as 5 cluster-fabric triplets (53-66 °C under load)\n- Relabel M5 Tp1E from \"Efficiency Core Cluster\" to \"Performance Cluster\n  Aggregate\" (M5 Pro/Max has no E-cores under S+P pair signature)\n- Refine Tp0u/v/w alias comment with measured per-snapshot divergence",
          "is_bot": false,
          "headline": "feat(smc): expand M1 PD/RF + Ultra die-2 mappings, M4 Pro fabric; fix…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-28T10:58:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8328ddd44cc3ddf8f07d6aaa134ac1f3d6903bd7",
          "body": "…appings\n\n- Promote TIOP/TSCD/TCHP/TMVR/TT%D to All (Intel/T2 + Apple Silicon);\n  move TIED from Intel to All.\n- Add TS0P/TS1P SSD proximity (case-distinct from Ts0P/Ts1P controller).\n- Map M1 Ultra die-2 power/RF delivery cluster (TpD%/TpDX/TpDa/TpDb,\n  TrD%/TrDX/TrDa); lowercase is case-distinct from TPD/TRD.\n- Reclassify M4 Te0U-X as cluster aggregates rather than spurious\n  \"Core 5/6\" probes (M4 base has no such cores).",
          "is_bot": false,
          "headline": "feat(smc): add cross-platform diodes, SSD proximity, M1-Ultra die-2 m…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-27T21:06:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b94dca8408abeea827ab539496cce87ea0802a9",
          "body": "Cross-checks src/temp.txt against reports/ evidence: adds universal\nprobes (TPMP/TPSP/TAOL), explicit hex-letter slots (TPDA-F, TPDa-f,\nTRDa-f and TVDA/G/M/P/c on M5) since % only expands to digits 0-9,\nM4 dual-range per-core mapping (Tp00-0c and Tp1i-Tp2G — sentinel\nfilter selects whichever range i\n[…]\nfiniteInRange\nhelper to reject the M5 Pro TTPD flt32 garbage observed in reports/.\n\nRenames mislabeled report-m1.txt to report-intel-t2.txt; adds a\nfresh M1 Pro snapshot. Bumps go-pretty/v6 to 6.7.10.",
          "is_bot": false,
          "headline": "refactor(smc): rework Apple-Silicon temp mappings; bound float decode",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-27T19:48:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf4c25c06413e3495405d30d35f84965b9fee334",
          "body": "… aggregates\n\nCollapse 22 A18-exclusive rows (TCMb/TCMz, TVD0, TVMR, TVmS, TVA0/1,\nTVS0-4, TPD0-6, TRD0-3) into wildcard Apple-umbrella entries so every\nApple Silicon family (M1-M5, A18) picks them up. Verified against the\n16 raw reports in reports/ that these keys are populated beyond A18.\n\nAdd exp\n[…]\nve TCGC/TCSC from All to Intel to prevent label leaks on\nApple Silicon.\n\nUpdate Test_filterByFamily_A18_GeneratedTable assertion from 91 to 69\nA18-exclusive rows to reflect the promoted-to-Apple keys.",
          "is_bot": false,
          "headline": "refactor(smc): consolidate Apple-wide temp keys and capture TPDX/TRDX…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-23T09:56:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72149de800e3e8479d1a262231d03db2bbd7cfcb",
          "body": "Add sensor definitions for the MacBook Neo (Mac17,5, A18 Pro, 2P+4E) to\nsrc/temp.txt: P-cores (Tp00-06), E-cores (Te04-06, Te0R-T, Tp0l/m/n,\nTp0o/q/t), cluster aggregates, CPU die, GPU, SSD, power/RF delivery,\nvirtual SoC, and proximity sensors. Regenerate smc/sensors.go.\n\nFix PCIe Slot %F/P/S/T wil\n[…]\nbody comments for conciseness: remove narrative\n\"what-the-next-line-does\" comments, tighten multi-line rationales to\nsingle-line intent statements, preserve domain-knowledge context in\ngodoc comments.",
          "is_bot": false,
          "headline": "feat(smc): add A18 Pro sensor mapping and fix PCIe leak on Apple Silicon",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-23T08:37:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1c2f78a297dc8711bc695e5af82570b47d9c831d",
          "body": "- output/influxoutput.go: escape commas, equals signs, and spaces in\n  line-protocol measurement, sensortype, unit, and key tag values so\n  future sensor/product names cannot produce malformed lines; preserve\n  the structural \",key=\" separator unescaped.\n- output/jsonoutput.go: on ParseFloat failure\n[…]\noValue sentinel for the\n  read-failed / zero-dataSize branch of getKeyFloat32/Uint32/Bool,\n  eliminating a fmt.Errorf allocation on every absent key during the\n  generic-sensor scan (the common case).",
          "is_bot": false,
          "headline": "fix: code-review follow-ups across smc, hid, output, gosmc, cmd",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-20T11:22:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a36a7bbf8ae10d2163d55f7a034a52727641457b",
          "body": "- Replace lazy qsort+dirty-flag cache with always-sorted insertion\n  (binary search + memmove), eliminating O(N² log N) sort overhead\n- Add negative caching: absent/restricted keys are recorded with a\n  negative flag so repeated lookups skip IOKit entirely\n- Fix keyInfoCacheInsert capacity guard: mo\n[…]\n each byte\n- Add lower-bound clamp and C99 loop variable in smcPackKeyBytes\n- Update README to document negative caching, SMCCall underrun\n  guard, upgrade-before-capacity invariant and SMCClose flush",
          "is_bot": false,
          "headline": "fix(gosmc): comprehensive SMC C layer hardening and cache correctness",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-16T12:48:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "708ca2897904889f473b48394bd29ada84bc1575",
          "body": "queryHIDPowerSensors() and getThermals() were calling CFRelease(system)\nimmediately after IOHIDEventSystemClientCopyServices(), before passing\nthe returned srvRef to getNamesFromServices() and getPowerValuesFromServices().\nThe IOHIDServiceClientRef objects inside srvRef are owned by the system;\nrele\n[…]\na segfault in IOHIDServiceClientCopyProperty/CopyEvent.\n\nMove CFRelease(system) to the end of the if(system) block in both\nfunctions, mirroring the correct ordering already used in getAllHIDSensors().",
          "is_bot": false,
          "headline": "fix(hid): release IOHIDEventSystemClient after service clients are used",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-15T09:11:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d930944a1c12f764f5e5689c9cfd11e55cb502dd",
          "body": "- gosmc/smc.c: rename _strtoul/_ultostr to smcPackKeyBytes/smcUnpackKeyBytes\n  (static helpers, avoid C99 §7.1.3 reserved identifiers); add shift-UB guard\n  (size clamped to 4, C99 §6.5.7); add NULL guard for IOServiceMatching\n  returning kIOReturnNoMemory; replace deprecated IOMainPort/masterPort w\n[…]\nocol tag formatting)\n- output/jsonoutput.go, output/output.go: fix error reporting and deepCopy\n  to preserve Go types correctly\n- platform/get.go: check sysctl return values; improve family detection",
          "is_bot": false,
          "headline": "fix: comprehensive SMC/HID improvements and C safety fixes",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-15T08:47:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c32cba5b698287c50d20462e6a50e0edf84c7bdb",
          "body": "Cover four previously untested areas:\n\n- smc/conv_test.go: Test_decodeToFloat32 and Test_DecodeValue exercise\n  all dispatch paths (ui*/si*, flag, pwm, flt, ioft, fp*/sp*) including\n  zero-size and unknown-type short-circuits.\n\n- smc/rawtemp_test.go: Test_RawKeyToFloat32 validates the flt/ioft/fp*\n \n[…]\n_test.go: TestDeltaTemps, TestPhaseMidWord, TestBuildPhases\n  and TestSortedSeriesKeys cover the pure helper functions added with\n  the guess command, including 2-level vs 3-level chip topology paths.",
          "is_bot": false,
          "headline": "test: add missing unit tests for conv, rawtemp, platform and guess",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-14T14:21:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a61ab874bd3f554d6c3865e350e0a5a45587a2cf",
          "body": "- Add isValidReading() with minTempCelsius=10.0 to reject firmware\n  sentinel values (-4, 2.2, 3.4, 5.2°C) from inactive sensor slots\n- Remove Tp00-Tp0U M4 mappings: these return sentinel values that\n  corrupt valid Tp1*/Tp2* readings on M4 Pro 14-core (10P+4E)\n- Remove Tp2I-Tp2X and Tp0d/e/f: no kn\n[…]\n sensor range; values reflect thermal fabric, not real cores\n- Keep only Tp0W-Tp0Z (Core 9) and Tp0a-Tp0c (Core 10) from Tp0* range\n- Extract TempUnit constant to avoid hardcoded °C string duplication",
          "is_bot": false,
          "headline": "fix(sensors): filter M4 sentinel temps and remove spurious P-core keys",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-14T13:49:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82648eaf73cfe11c6cc86db924b09826c8b1a80c",
          "body": "…re triplets\n\nOn the M4 Pro 14-core (10P+4E), the second E-cluster exposes per-core\nsensors via Tpx8/9/A (core 3) and TpxB/C/D (core 4) rather than the\nTe08/Te0G keys used on M4 base. The Tpx8-D entries were previously\nremoved with a note that they \"read 0°C on every report\", but that was\nbased on M\n[…]\nncomplete P-core sensor triplets observed in the same\nM4 Pro 14-core report: Tp1q as the third sensor of P-core 3 (alongside\nTp1t/Tp1u), and Tp20 as the third sensor of P-core 5 (alongside\nTp1y/Tp1z).",
          "is_bot": false,
          "headline": "fix(sensors): add M4 Pro 14-core E-core 3/4 sensors and complete P-co…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-14T09:29:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ffcd8127f4e440edcb786ff265e01e56d6fe74a4",
          "body": "Add DecodeValue() to smc/conv.go covering all SMC types (ui8/16/32,\nsi8/16/32, flag, flt, ioft, fp*, sp*, pwm, hex_) so the raw command\ndisplays human-readable values alongside raw hex bytes.\n\nExtract decodeToFloat32() helper to eliminate float-dispatch duplication\nbetween getKeyFloat32 and DecodeVa\n[…]\n in output/ and hid/: extract sortedKeys() helper used\nin three places; collapse getCurrent/getTemperature/getVoltage to merge()\none-liners; extract hidGet() to eliminate three identical HID wrappers.",
          "is_bot": false,
          "headline": "feat(raw): decode SMC values and fix missing large-dataSize keys",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-14T08:56:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c75d195d1b688b46661a7b3290e750974c43b68b",
          "body": null,
          "is_bot": false,
          "headline": "Add more SMC reports.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T15:58:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70b4a3851986e5ebd994126383e8142a6c32d8b3",
          "body": "Introduces the `hw` subcommand (aliases: hardware, info) that displays\ndetected hardware information: Mac model name, model identifier, platform\nfamily, CPU, year, total physical/logical CPU counts, and per-cluster\n(Performance/Efficiency) core counts sourced from hw.perflevel* sysctls.\n\nExtends platform.GetFamily with GetModelID, GetProduct and GetTotalCPU\nhelpers, adds Hardware() to the Output interface and implements it across\nall four output backends (table, ascii, json, influx).",
          "is_bot": false,
          "headline": "feat(hw): add hw command with platform family, CPU model and core counts",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T15:57:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a4fd7cbd10bd385e0a13bb2f6058aae00b242ad",
          "body": "Remove erroneous duplicate mappings for Tg1U and Tg1k in the M4 base\nGPU section: these keys appear only on M4 Pro (correctly mapped as\nGPU 21/25 in the Pro section), not on M4 base. The duplicates caused\naddGeneric to emit two output rows with identical values on M4 Pro —\none labelled GPU 1/2 and o\n[…]\nTaLR (Airflow Left Rear) and TsOP — the last one uses\nASCII letter O (0x4F) as the third byte, not digit zero (0x30), making\nit a distinct SMC key from Ts0P used on M4 Pro.\n\nRegenerate smc/sensors.go.",
          "is_bot": false,
          "headline": "fix(sensors): fix duplicate M4 GPU keys; add missing Apple/M4 sensors",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T14:56:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb3be841d2e6b3a15079efb534e663b2ee699e8d",
          "body": null,
          "is_bot": false,
          "headline": "Remove Claude Code plans. Update .gitignore.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T13:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af04ac7cb264f79dae929f982f08b489d6fe8765",
          "body": "- betteralign: swap phaseResult fields (deltas before spec, saves 24 bytes)\n- gofumpt: align comment columns in test table literals\n- gocritic/ifElseChain: rewrite seriesKey if-else chain as switch statement\n- wsl: add blank lines to separate var decl, assignments, and appends in\n  numericValue and printMapping\n- paralleltest: add t.Parallel() to all four Test* functions and their\n  subtests in cmd/guess_test.go",
          "is_bot": false,
          "headline": "style: fix lint findings from task fmt/lint",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T10:46:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83b4853fbccd5d9f3607ff260563f66da981abfb",
          "body": "…re indexing\n\nReplace hard-coded 2-phase P/E logic with dynamic phase loop driven by\nbuildPhases(GetPerfLevels()), supporting 2-tier (M1–M4) and 3-tier (M5+)\nchips. printMapping now accepts []phaseResult and uses groupByStrideWithinSeries\nfor accurate per-core sub-group assignment and coreIdx tracking.",
          "is_bot": false,
          "headline": "refactor(guess): N-phase runGuess + printMapping with stride-aware co…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:48:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d5b8acb9ed32a080968d5306b96b58998b95a7d",
          "body": "…rd helpers",
          "is_bot": false,
          "headline": "feat(guess): add phaseSpec/phaseResult types, buildPhases, phaseMidWo…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:45:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f1e11c84c1406f795992ccbd1c3db62effe149f",
          "body": "…coverage\n\nseriesKey now correctly masks uppercase hex digits (A-F) that appear in the\nnumeric index position (after a decimal digit starts), allowing M1 triplets\nlike [Tp08, Tp09, Tp0A] to group as the same series \"Tp**\" instead of\nsplitting across \"Tp*A\" for the last element.\n\nAdded test coverage for hex index cases:\n- TestSeriesKey: Tp0A→Tp**, Tp0C→Tp** (uppercase hex digits are masked)\n- TestNumericValue: Tp0A→10, Tp0C→12 (hex parsing works correctly)",
          "is_bot": false,
          "headline": "fix(guess): mask uppercase hex digits A-F in seriesKey; add hex test …",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:43:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91c6eacd359430a9d04eb60ca90081cea0788b98",
          "body": "…de detection",
          "is_bot": false,
          "headline": "feat(guess): implement groupByStrideWithinSeries for triplet and stri…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:37:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fba157419b6822d3959dcc32bebbb326f81ddf0",
          "body": "… detection",
          "is_bot": false,
          "headline": "test(guess): add failing TestGroupByStrideWithinSeries for stride/gap…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:33:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dca5ebf3b38046953abdf6e0b2723b309ce306cf",
          "body": "…w.perflevel*",
          "is_bot": false,
          "headline": "feat(platform): add PerfLevel struct and GetPerfLevels() via sysctl h…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:30:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d560ca02c41158a6dd2aa5c8216d33653cc13313",
          "body": null,
          "is_bot": false,
          "headline": "feat(stress): add QoSUserInteractive constant for M5+ Super core bias",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:28:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0281d2bb217d716325abe3c55f7b866720b4c13d",
          "body": "- Covers GetPerfLevels() sysctl API in platform package\n- Three-phase stress (QoSUserInteractive + UserInitiated + Background) for M5+\n- Stride/gap detection within series for correct M1/M3 triplet grouping\n- N-phase generalised classification replacing the binary P/E split",
          "is_bot": false,
          "headline": "docs: add design spec for topology-aware guess with Super core detection",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-13T08:05:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e39d885d91cf30effb5155cae8fe9e62bc399af",
          "body": "Add raw SMC sensor readouts used to validate temperature sensor mappings:\n\n- report-m1.txt        — Intel MacBook Pro (mistakenly named M1; kept as-is)\n- report-m3-max.txt    — M3 Max MacBook Pro\n- report-m3-pro-2.txt  — second M3 Pro sample (rename from report-m3-pro2.txt)\n- report-m4.txt        — \n[…]\nro\n- report-m5-pro.txt    — M5 Pro MacBook Pro\n\nThese dumps were cross-referenced against src/temp.txt to identify\nmissing keys, phantom entries, and incorrect chip-family tags in the\nprevious commit.",
          "is_bot": false,
          "headline": "data(reports): add SMC hardware dumps for M1/M3 Max/M4/M5 Pro validation",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T21:42:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "464b854a5dc55a5102036c089ea8a932c8f51884",
          "body": "… families\n\nCross-validate all report-*.txt SMC dumps against src/temp.txt and fix\nevery discrepancy found:\n\nM1:\n- Add SSD 1-2 + controller sensors (Ts00-Ts06, Ts0P, Ts1P) for M1 Pro/Max/Ultra\n- Add M1 Ultra die-2 SSD sensors (Ts20-Ts26)\n\nM3:\n- Add E-core 6 triplet (Te0K/L/M) for M3 Max; Te0L was pr\n[…]\nugh Tg43)\n- Add GPU fabric sensors TfC0/1/3/5/D/E/F\n- Add 40 unified memory sensors Tm00-Tm2n\n- Add 13 SSD sensors + 2 controllers\n- Add TN00-TN03 package sensors\n- Add 17 uncore die sensors TUD0-TUDf",
          "is_bot": false,
          "headline": "fix(sensors): validate and expand temperature mappings across all CPU…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T21:41:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0f384101c1275b8731ccfbf205571957e764c45",
          "body": "…ve dead per-core code\n\n- Replace sequential runPhase with runAllCoresPhase (all cores simultaneously)\n- Remove sensorResult, buildByKey, isClusterSensor, activeSortedCores, peakDelta\n- Rewrite printMapping: cross-phase delta classification + groupBySeries stride\n- Simplify constants: remove guessTrackThreshold/MaxCoreHits/ExclusivityRatio\n- Add guessClusterRatio for both-phases cluster detection\n- Update guessCmd.Long and progress output for new ~34s run time",
          "is_bot": false,
          "headline": "refactor(guess): parallel all-cores stress, series-based stride, remo…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T18:34:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9368b4f34684de466149a6ad3c0602a9942185e",
          "body": "…Keys",
          "is_bot": false,
          "headline": "feat(guess): add seriesKey, numericValue, groupBySeries, sortedSeries…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T18:24:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0b4a78f1c7c93bfd2abfd9001b8646eae501281",
          "body": "…ries",
          "is_bot": false,
          "headline": "test(guess): add failing tests for seriesKey, numericValue, groupBySe…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T18:23:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dba93f6cc9fe2fa924885e5f3f61515f0046403",
          "body": "… command",
          "is_bot": false,
          "headline": "docs: add design spec for parallel all-cores stress refactor of guess…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T18:13:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b4aeb886e64e3bdcc0e85387a24363f45504a48",
          "body": "Introduce a two-threshold approach (guessTrackThreshold=0.5°C for\ncross-core tracking, guessOutputThreshold=1.5°C for final output) so\nbroadly coupled sensors accumulate hit counts and get reclassified as\ncluster sensors even when their secondary responses fall below the\nvisible threshold.\n\nAdd isCl\n[…]\neasure hot samples while the core is still under load (before\nclose(done)) since Apple Silicon sheds heat within seconds of dropping\nload, then remove the settle pause to avoid near-baseline readings.",
          "is_bot": false,
          "headline": "Improve guess sensor classification with exclusivity analysis",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T15:27:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72a0e9d68708fb62226acca0c460d62f77c9cb90",
          "body": "stress/: CGo wrappers for THREAD_AFFINITY_POLICY (SetAffinityTag) and\npthread_set_qos_class_self_np (SetQoS) with QoSUserInitiated/QoSBackground\nconstants.\n\nsmc/rawtemp.go: exports RawKeyToFloat32 so the guess command can decode\nSMC byte values without duplicating the conversion logic in smc/conv.go\n[…]\noverflow guards are moved outside the hot\ninner loop to eliminate the per-iteration branch.\n\nsmc/sensors.go: regenerated to reflect src/temp.txt sensor additions and\nremovals from the previous commit.",
          "is_bot": false,
          "headline": "Add guess subcommand for two-phase QoS SMC sensor mapping",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T12:57:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e38fab954f526897ac45f6a2856543a755643019",
          "body": "…erage\n\nRemove Tf1C and Tf2C from M3 GPU mappings as they contain normalised\nfloat control values (0.94–1.0), not temperatures. Add M1 family\ndie-level aggregate sensors Te00–Te02 validated across M1 Pro/Max/Ultra\nhardware reports, plus M1 Ultra die-2 sensors Te20/Te21. Extend M4\nP-core coverage wit\n[…]\nobserved on 14-core M4 Pro,\nadd five GPU fabric cluster sensors TfC0–TfC4 seen on M4 Pro, and\ndocument that M4 memory sensors Tm0p/Tm1p/Tm2p are absent on M4 Pro\nand likely restricted to M4 Max/Ultra.",
          "is_bot": false,
          "headline": "Fix M3 GPU sensor misclassifications and expand M1/M4 temperature cov…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T11:59:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4a4314126813a5c5d305b0f8ed128f02689948c7",
          "body": null,
          "is_bot": false,
          "headline": "Update M1 Max hardware report for broader sensor coverage.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T11:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04e494d3d968632de8f5c7b2dfeab464e6c9f649",
          "body": "Rename the Chip field to CPU in the Product struct for clarity, populate\nCPU model strings for all Intel Mac entries, and add a second M3 Pro\nhardware report for broader sensor coverage.",
          "is_bot": false,
          "headline": "Rename Chip to CPU in Product struct and add specific CPU model names",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-12T09:46:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc96db447811e3aa8db4f77e3ffe259d1615a12b",
          "body": null,
          "is_bot": false,
          "headline": "Add smc raw reports.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-11T11:20:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ce6d1ccf0b8c52c9e992b941f91619a9caaa75e",
          "body": "M3 Pro (61% → 94%):\n- Add P-Cores 9–10 (Tp0u–Tp0z), Cluster 3 (Tp16–Tp3T)\n- Add 12 secondary Tg* GPU cluster sensors (GPU 4–9: Tg00/01,\n  Tg0U/0u, Tg0V/0v, Tg12/13, Tg1A/1B, Tg1k/1l)\n- Add NVMe die triplets SSD 1–5 plus controller (Ts00–Ts1P)\n\nM4 Pro (24% → 48%):\n- Discover that M4 Pro uses the Tp0*\n[…]\nTex0–Tex3)\n- Add 14 additional GPU cluster sensors (GPU 9–22: Tg04/05,\n  Tg0R/0S, Tg0X/0Y, Tg0y/0z, Tg1E/1F, Tg1V, Tg1c/1d, Tg1l)\n- Add NVMe die triplets SSD 1–8, controller, and aggregate (Ts00–Tsx1)",
          "is_bot": false,
          "headline": "Expand M3/M4 temperature sensor coverage using real hardware reports",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-11T09:16:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee8cda70ea3787069fe49b084ae5969bcd60debb",
          "body": "Implements iSMC raw which reads the total key count from #KEY,\niterates every index via SMCCall(CMDReadIndex), then reads each key\ntype and raw bytes with SMCReadKey, printing output in the same format\nused by the hardware report files.\n\nKeys are sorted alphabetically. Useful for discovering undocumented\nsensor keys on new hardware.",
          "is_bot": false,
          "headline": "Add raw subcommand to enumerate all SMC keys with byte values",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-11T07:33:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb8caabf8668259a200ab68228ec40c5a6c6e7c7",
          "body": "Tp1E/F/G were labeled Core 2 and Tp1Q/R/S as Core 5, but\ntemperature analysis shows they cannot be the same physical cores:\nTp1S (81.53C) is 10C hotter than Core 5 own x0 (Tp0g=71.50C),\nwhich is physically impossible for the same core under simultaneous load.\nRelabeled as CPU Performance Core 7 (Tp1E/F/G) and Core 8 (Tp1Q/R/S),\nconsistent with an 18-core M3 Pro having 12 performance cores.",
          "is_bot": false,
          "headline": "Reclassify M3 secondary P-core triplets as Cores 7 and 8",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-10T16:48:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eadf9f5c9769725e64983ae71d242979e6f013f2",
          "body": "- Shift all 12 P-core keys from x0 (sub-die) to x1 (per-core reading),\n  consistent with M1/M3 convention: Tp1i→Tp1j, Tp1m→Tp1n, Tp1q→Tp1t,\n  Tp1v→Tp1w, Tp1y→Tp1z, Tp21→Tp22, Tp24→Tp25, Tp27→Tp28,\n  Tp2A→Tp2B, Tp2D→Tp2E, Tp2I→Tp2J, Tp2L→Tp2M\n- Add P-Cores 13-15 (Tp2Q, Tp2T, Tp2W): cluster-2 outer cores confirmed\n  by exact match of Tp2R=TpxB as cluster-2 aggregate\n- Add secondary cluster sensors Tpx8, TpxA, TpxC pairing with\n  existing Tpx9, TpxB, TpxD aggregates",
          "is_bot": false,
          "headline": "Fix M4 P-core sensor keys and expand cluster/core coverage",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-10T15:20:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e47c2d51dbac83dc539cde08c23fa3b9b553b71c",
          "body": "M1 memory: expand all 4 banks to full 3-sensor groups (chan A, chan B,\nstandalone); fix Memory 3/4 which only had aliased channel sensors\nand missed the standalone Tm0A; add previously absent Memory 4 group.\n\nM3 efficiency cores: replace phantom Te0L with correct Te0H; add full\nsub/core/cluster-ref \n[…]\n/Tp3X); add\nhigh-confidence secondary triplets for P-core 2 (Tp1E-1G, delta 0.3C)\nand P-core 5 (Tp1Q-1S, delta 0.1C).\n\nM3 GPU: add byte-identical alias sensors Tf1D/Tf1E (GPU 1) and\nTf2D/Tf2E (GPU 5).",
          "is_bot": false,
          "headline": "Overhaul M1 memory and M3 CPU/GPU sensor mappings",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-10T13:47:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed8a3d46324fbcc652eabc95d9bb9ac0bdb30f82",
          "body": "Each M1 GPU cluster exposes two thermal sensors (secondary ~29C and\nprimary ~37C) at consecutive alphanumeric indices within an 8-wide\nslot, matching M4's dual-sensor-per-cluster convention. M1 Ultra adds\na second die (clusters 5-8, keys Tg0a-Tg0z) that were entirely absent;\nnon-Ultra chips silently ignore these missing keys.",
          "is_bot": false,
          "headline": "Add M1 Ultra die 1 GPU sensors and secondary per-cluster sensors (Tg0x)",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-10T12:44:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0ddf8e88849f7e9d5f03c8da7fbf69127b926bc",
          "body": "M1 Ultra is two M1 Max dies joined via UltraFusion, so it exposes a\nsecond set of Tp2x temperature keys mirroring die 0's Tp0x layout with\na 0x20 key offset. Map efficiency cores 3-4 (Tp29, Tp2T) and\nperformance cores 9-16 (Tp21, Tp25, Tp2D, Tp2H, Tp2L, Tp2P, Tp2X,\nTp2b) under the existing M1 platform tag. On M1/M1 Pro/M1 Max the\nabsent Tp2x keys are silently ignored by addGeneric.",
          "is_bot": false,
          "headline": "Add M1 Ultra die 1 CPU core sensors (Tp2x)",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-10T11:58:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e229fa6aea6f65d20ee345778a2b5e236c56aba",
          "body": "…-positive values\n\n- Replace incorrect M4 CPU Performance Core SMC keys (Tp01/Tp05/... → Tp1i/Tp1m/...)\n- Add M4 CPU Performance Cores 11-12 and cluster sensors (Tpx9, TpxB, TpxD)\n- Replace ABS() and -127 special-casing with positive-only (val > 0.0) guards in\n  hid/get.go, hid/hid.go, and smc/smc.go to skip invalid/sentinel readings\n- Narrow Power Supply sensor platform from \"All\" to \"Intel\" (Tp%C/D/P keys)",
          "is_bot": false,
          "headline": "Correct M4 CPU performance core keys, add cluster sensors, filter non…",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-10T11:39:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a29a3f011a52ff8356b4a4947d9e5a858a285d49",
          "body": null,
          "is_bot": false,
          "headline": "Add missing M4 Pro Core sensors (#32) following predictable pattern",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-04-10T09:59:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdf73b8135ccc1ffeeec4bb12cdd181abc8c81a9",
          "body": "Add new tests across output and smc packages covering: empty key handling\nin InfluxDB line protocol (TC-18), sp78 type enrichment in JSON output\n(TC-19), deep copy isolation for nested maps (TC-14), influx factory\nrouting (TC-22), AppleFPConv lookup table correctness for sp78 (TC-5),\nand Apple Silicon platform sensor inclusion with HasPrefix guard (TC-11).\nAlso fix a test case label (\"table\" -> \"json\") in outputfactory_test.go.",
          "is_bot": false,
          "headline": "Expand test coverage with targeted edge-case and regression tests",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-23T17:33:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5088cfd494defe5a01ac12c16605626a38c04c6",
          "body": "Mac15,14 was incorrectly mapped as M3 Max; it is M3 Ultra (2025).\nMac16,9 Mac Studio (M4 Max) and Mac17,2 MacBook Pro 14 (M5) had\nwrong release years; both corrected to their actual release years.",
          "is_bot": false,
          "headline": "Fix Mac Studio M3 Ultra misclassification and correct release years",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-22T10:45:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f78cecc95cfa65a1c3e5e676757c76beda7d0f09",
          "body": null,
          "is_bot": false,
          "headline": "Remove Go Report Card.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-20T16:45:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0276c59376cd6bbae36dd67f3c31b836f1559032",
          "body": "Add granular Chip field to Product to distinguish variants like M1 Pro/Max/Ultra\nwithin the same family. Add M5 Super Core and Efficiency Core Cluster SMC keys,\nand broaden Apple Silicon family detection to include A-series chips (A18 Pro in\nMacBook Neo).",
          "is_bot": false,
          "headline": "Add Chip field to Product struct and expand platform/sensor support",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-17T09:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb16b461d01b345c267e58c532ddbfd074070e3f",
          "body": null,
          "is_bot": false,
          "headline": "More possible M5 platform heuristics",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-16T13:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "becb999fdcdd5ac3b4d1b3d99373f5ec4c62719e",
          "body": null,
          "is_bot": false,
          "headline": "Update README with Brew information.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-16T12:40:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5c6818cc72c609ea78c2c9a4351e9f9fcd272f0",
          "body": null,
          "is_bot": false,
          "headline": "Add Brews pipeline.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-16T12:32:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63e4534859a93ad2511c9dc4e3e7426bd54709f1",
          "body": null,
          "is_bot": false,
          "headline": "Fix M5 Super Core naming as per Apple naming",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-16T11:03:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25d6e17fb98d73164f6ce0a09dd61c65c339e3a7",
          "body": null,
          "is_bot": false,
          "headline": "Better attempt in (heuristics) mapping SMC keys for M5 platform",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-16T10:00:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48cfd5f6f1d6086a958c350bf0465c4776d0cb93",
          "body": "cmd/version.go: add version subcommand printing build-time tag, commit,\nand Go version; fix ldflags package path from main to cmd package in\nTaskfile.yml and .goreleaser.yml; add test task to Taskfile.\n\nhid/get.go: guard [result UTF8String] and strdup return against NULL\nunder memory pressure; check\n[…]\n before registering defer and\ncalling getGeneric; improve sp78 threshold from >= 256.0 to > 130.0\nbased on Apple Silicon die temperature limits (~125°C max); add missing\nABS(value) in dumpNamesValues.",
          "is_bot": false,
          "headline": "Add version command and fix HID CGo safety issues",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-16T08:49:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4708058f8cb74d59153e379b57fa6be7b338664",
          "body": "- Guard IOHIDEventSystemClientCreate() return value in all three HID\n  getter functions to avoid nil dereference when the system client\n  cannot be allocated\n- Wrap per-iteration Objective-C temporaries in @autoreleasepool blocks\n  inside dumpNamesValues and dumpThermalNamesValues to prevent unbound\n[…]\ns that\n  contain the separator character are handled correctly\n- Remove the abs() sign flip on negative sensor values; negative\n  readings (e.g. current direction) are meaningful and must be preserved",
          "is_bot": false,
          "headline": "Fix HID null safety, memory leaks, and sensor parsing correctness",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T19:26:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ec96f5797cf7fd66bd1434f8ddd2e9c4ae20ce0",
          "body": "- Add test files for influx output, SMC conversion, and SMC sensor reads\n- Fix influxoutput and jsonoutput to write to the configured writer\n  instead of stdout, enabling proper test coverage\n- Add default case in JSON format loop to skip non-string sensor values\n- Rewrite README for clarity: update Apple Silicon support description,\n  add output format table, fix command listing and aliases, clean up\n  related work and todo sections",
          "is_bot": false,
          "headline": "Add tests, fix output writers, and refresh README",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T17:22:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dd79baa2bf47bffe5eb780c29dcb9976590d8fa",
          "body": "Add missing godoc comments to all exported and unexported functions.\nFix four bugs: strings.Trim -> TrimPrefix for InfluxDB unit parsing,\nadd \"Apple\" to familyApple predicate so the arm64 fallback path\ncorrectly enables Apple Silicon sensors, SMCWriteKeyUnsafe now calls\nC.SMCWriteKeyUnsafe instead of C.SMCWriteKey, and JSONOutput.All error\nfallback prints already-fetched data instead of re-calling GetAll.",
          "is_bot": false,
          "headline": "Add doc comments and fix bugs across the codebase",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T16:52:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "759a28b6c4a0e7d75ffa0bd9f5643165d176867c",
          "body": "Correct typos ('Termal' -> 'Thermal') and wrong TC key descriptions\n(TC%E/F/H/P were scrambled by one position) validated against exelban/stats.\nRename TCGC from 'Graphics Cluster' to 'GPU Intel Graphics'. Add M5\nplatform sensor keys (6 efficiency cores, 4 performance cores, 8 GPU).",
          "is_bot": false,
          "headline": "Fix sensor descriptions and add M5 temperature sensor keys",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T16:37:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "653e741f2555083a94173cddb2a1ab4b43b0d904",
          "body": "- github.com/dkorunic/iSMC/gosmc to v0.0.0-20260315163403-355e3217c285\n- golang.org/x/text to v0.35.0\n- github.com/mattn/go-runewidth to v0.0.21\n- golang.org/x/sys to v0.42.0",
          "is_bot": false,
          "headline": "Update deps:",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T16:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "355e3217c285c57276962dbd5b171f3114784e39",
          "body": null,
          "is_bot": false,
          "headline": "Add M5 platform temperature sensor keys",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T16:34:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fe7ec4891903b3b8190be67ecd0dacac8956994",
          "body": "When the system family cannot be determined, fall back to architecture-based\ndetection (arm64→Apple, amd64/386→Intel) instead of always assuming Apple,\nensuring correct sensor filtering on Intel Macs with unknown platform info.",
          "is_bot": false,
          "headline": "Fix platform family fallback using runtime architecture detection",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T14:20:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "038c0e6a2b04fa7664b316dfeed82096fff51f5b",
          "body": "Introduce a new platform/ package that detects the Mac hardware family\n(Intel, M1–M5, Neo) via sysctl hw.model lookup, with a comprehensive\nmodel-to-family mapping table. Use this to filter SMC temperature sensors\nby platform in GetTemperature(), so only sensors relevant to the running\nhardware are \n[…]\n, and use range.length instead of the hardcoded\noffset 4 for robustness. Also guard sysctlbyname in platform/get.go\nagainst a zero-size return to prevent malloc(0). Fix Mac17,9 year\nfrom 2024 to 2026.",
          "is_bot": false,
          "headline": "Add platform-aware sensor filtering and fix HID tdie/tdev detection",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-15T14:15:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28580f5731dc996dc6245c31eb015cb557adbb82",
          "body": null,
          "is_bot": false,
          "headline": "Add CLAUDE.md",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-14T13:02:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "243bd37161e011e92ce76301984f6dee9bbbeaa6",
          "body": "- Release IOHIDEventSystemClient, CFArrayRef and HID events after use\n  in all three HID sensor functions (getProductNames, getPowerValues,\n  getThermalValues)\n- Wrap HID sensor retrieval in @autoreleasepool blocks to ensure\n  Objective-C objects are released promptly\n- Add bounds checks in fpToFloa\n[…]\nlue arrays differ\n- Mark dumpNamesValues as static to limit its linkage scope\n- Clean up Ta0P mislabeled-type handling to reuse fpToFloat32\n- Add blank lines between top-level var blocks in sensors.go",
          "is_bot": false,
          "headline": "Fix memory leaks and improve robustness in HID and SMC code",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-14T12:57:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c03df02a8fa7877607c7d2639bf571e778990e21",
          "body": "* Fix temperature sensor reading errors\n\n- Fix PMU tdev HID sensors showing ~9200°C (sp78 format needs /256)\n- Fix DCIn Air Flow Ta0P showing 8°C (mislabeled as 'flt', actually sp78)\n- Add Thunderbolt Left/Right Proximity (TaLT/TaRT) sensors for M-series Macs\n\n* Fix temperature sensor readings and a\n[…]\ng sp78\n  format for mislabeled 'flt' type sensors\n- Add Thunderbolt Left/Right Proximity sensors (TaLT, TaRT) to src/temp.txt\n- Improve code clarity by separating thermal and generic sensor formatting",
          "is_bot": false,
          "headline": "Fix temperature sensor reading errors (#29)",
          "author_name": "startergo",
          "author_login": "startergo",
          "committed_at": "2026-03-14T11:18:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef79e029883e4dba863909351a8b2f09e71b0527",
          "body": null,
          "is_bot": false,
          "headline": "Add GHA configuration.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-03-10T09:03:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9bb1dcae0092726c140dbce577b6fe677fdcc55",
          "body": "- github.com/dkorunic/iSMC/gosmc to v0.0.0-20260105120608-6d99ffd358b5\n- github.com/clipperhouse/uax29/v2 to v2.7.0\n- golang.org/x/text to v0.34.0\n- golang.org/x/sys to v0.41.0\n\nUpdate Go toolchain to 1.26.",
          "is_bot": false,
          "headline": "Update deps:",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-02-16T16:03:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d99ffd358b5c4001ee5421097f265ca7f143865",
          "body": null,
          "is_bot": false,
          "headline": "Minor refactoring",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-01-05T12:06:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39054d54fac52024804bf11e215af96e128ad5c2",
          "body": null,
          "is_bot": false,
          "headline": "WIP gosmc",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-01-01T11:02:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5390a744a6d3c7bbb064ec70f17cde81d09a3ab",
          "body": null,
          "is_bot": false,
          "headline": "WIP gosmc",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-01-01T10:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a1d11b2fa820a335928bdc48c9b48b2829a8296",
          "body": null,
          "is_bot": false,
          "headline": "Forked and added gosmc w/ deprecation fixes locally (#6)",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2026-01-01T10:32:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bcc594193e59d703cedfa6fba9a271982d89e90",
          "body": "- github.com/spf13/cobra to v1.10.2\n- github.com/clipperhouse/stringish to v0.1.1\n- github.com/clipperhouse/uax29/v2 to v2.3.0\n- golang.org/x/text to v0.32.0\n- github.com/jedib0t/go-pretty/v6 to v6.7.5\n- golang.org/x/sys to v0.39.0",
          "is_bot": false,
          "headline": "Update deps:",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2025-12-09T06:35:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29d26e2be1b4f67d799740204b0ab5c4d542df13",
          "body": null,
          "is_bot": false,
          "headline": "Update deps.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2025-10-11T08:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0e9edb149ea5b0cccc14ec69daa8d610788ec4e",
          "body": null,
          "is_bot": false,
          "headline": "Update deps. Don't limit number of decimal places at all.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2025-10-11T08:09:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4fe5eeee241afe3b54ba44df32cf6ec2c49a482",
          "body": null,
          "is_bot": false,
          "headline": "Drop goccy/go-json.",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2025-09-17T09:15:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94c565ef1c705d1ca44dc4e12f2c7d4de95141e6",
          "body": "- github.com/spf13/cobra to v1.10.1\n- golang.org/x/text to v0.29.0\n- github.com/jedib0t/go-pretty/v6 to v6.6.8\n- github.com/spf13/pflag to v1.0.10\n- golang.org/x/sys to v0.36.0",
          "is_bot": false,
          "headline": "Update deps:",
          "author_name": "Dinko Korunic",
          "author_login": "dkorunic",
          "committed_at": "2025-09-12T11:59:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 50,
      "commits_last_year": 99,
      "latest_release_at": "2026-07-24T10:08:50Z",
      "latest_release_tag": "v0.17.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 19,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 10.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/dkorunic/iSMC",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dkorunic/iSMC",
          "is_deprecated": false,
          "latest_version": "v0.17.0",
          "repository_url": "https://github.com/dkorunic/iSMC",
          "versions_count": 53,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-24T10:07:38Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 22,
      "stars": 197,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2019-11-22",
            "count": 1
          },
          {
            "date": "2020-02-18",
            "count": 1
          },
          {
            "date": "2020-04-22",
            "count": 1
          },
          {
            "date": "2020-06-01",
            "count": 1
          },
          {
            "date": "2020-08-31",
            "count": 1
          },
          {
            "date": "2021-03-29",
            "count": 1
          },
          {
            "date": "2022-04-05",
            "count": 1
          },
          {
            "date": "2022-07-31",
            "count": 1
          },
          {
            "date": "2023-02-10",
            "count": 1
          },
          {
            "date": "2023-05-17",
            "count": 1
          },
          {
            "date": "2023-06-13",
            "count": 1
          },
          {
            "date": "2024-12-17",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-07-05",
            "count": 1
          },
          {
            "date": "2025-12-15",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-07-14",
            "count": 1
          },
          {
            "date": "2026-07-24",
            "count": 1
          },
          {
            "date": "2026-07-28",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 21,
        "total_forks": 22
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Taskfile.yml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod",
        "gosmc/go.mod"
      ],
      "largest_source_bytes": 78024,
      "source_files_sampled": 48,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4821
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "gosmc/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 13,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/dkorunic/iSMC/gosmc",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20260413130435-fb3be841d2e6"
        },
        {
          "name": "github.com/fvbommel/sortorder",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/jedib0t/go-pretty/v6",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v6.8.3"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/fvbommel/sortorder",
            "direct": true,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/jedib0t/go-pretty/v6",
            "direct": true,
            "version": "v6.8.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cobra",
            "direct": true,
            "version": "v1.10.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/stretchr/testify",
            "direct": true,
            "version": "v1.11.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/uax29/v2",
            "direct": false,
            "version": "v2.7.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/davecgh/go-spew",
            "direct": false,
            "version": "v1.1.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/inconshreveable/mousetrap",
            "direct": false,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-runewidth",
            "direct": false,
            "version": "v0.0.27",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pmezard/go-difflib",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/pflag",
            "direct": false,
            "version": "v1.0.10",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.47.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.40.0",
            "ecosystem": "go"
          },
          {
            "name": "gopkg.in/yaml.v3",
            "direct": false,
            "version": "v3.0.1",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 13,
        "direct_count": 4,
        "indirect_count": 9
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 8,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 29,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "dkorunic",
          "commits": 143,
          "avatar_url": "https://avatars.githubusercontent.com/u/3041939?v=4"
        },
        {
          "type": "User",
          "login": "arvenil",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/450355?v=4"
        },
        {
          "type": "User",
          "login": "roele",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/181773?v=4"
        },
        {
          "type": "User",
          "login": "grecky-goo",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/72578545?v=4"
        },
        {
          "type": "User",
          "login": "seaburr",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/3466989?v=4"
        },
        {
          "type": "User",
          "login": "startergo",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/7897244?v=4"
        }
      ],
      "contributors_sampled": 6,
      "top_contributor_share": 0.966
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "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": 10,
            "reason": "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": 10,
            "reason": "20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10",
            "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": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "c22bacc7ac7147c6d90d8157b9b9bfb6f37e4201",
        "ran_at": "2026-07-28T23:42:53Z",
        "aggregate_score": 4.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-28T10:46:11Z",
      "oldest_open_prs": [
        {
          "number": 38,
          "created_at": "2026-07-28T23:14:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-03-14T11:18:40Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dkorunic/iSMC",
    "host": "github.com",
    "name": "iSMC",
    "owner": "dkorunic"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 63 is calibrated to 71 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 63,
            "calibrated": 71,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 71,
      "inputs": {
        "security": 56,
        "vitality": 82,
        "community": 50,
        "governance": 63,
        "calibration": "2026-08-02",
        "engineering": 54,
        "ai_readiness": 88,
        "weighted_overall_raw": 63
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 82,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "commits_last_year": 99,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 19
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "19/52 weeks with commits",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 19
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "99 commits in the last year",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 50,
              "latest_release_tag": "v0.17.0",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 10.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "50 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 50
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~10.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 10.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 5,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 5 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 50,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "forks": 22,
              "stars": 197,
              "watchers": 3,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "197 stars",
                "points": 37.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 197
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "22 forks",
                "points": 11,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "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": 0,
                "status": "missed",
                "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": 63,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 6,
              "top_contributor_share": 0.966
            },
            "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 97% of commits",
                "points": 0.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "6 contributors",
                "points": 8.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 83,
            "inputs": {
              "merged_prs": 8,
              "open_issues": 0,
              "closed_issues": 29,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "8/8 decided PRs merged",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 8,
                      "decided": 8
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 61,
            "inputs": {
              "followers": 138,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "dkorunic",
              "public_repos": 32,
              "account_age_days": 4974
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "138 followers of dkorunic",
                "points": 15.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 138,
                      "login": "dkorunic"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "32 public repos, account ~13 yr old",
                "points": 23.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 32
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/dkorunic/iSMC"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "53 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 53
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 54,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "topics": [
                "apple",
                "macos",
                "smc",
                "temperature",
                "current",
                "voltage",
                "power",
                "fan",
                "monitoring",
                "hardware"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 56,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 4.5
            },
            "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": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "exceptional",
            "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 13 resolved dependencies against OSV. 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": 13
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 13,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "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": "exceptional",
            "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": 13,
              "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": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 6
            },
            "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": "excellent",
        "name": "AI Readiness",
        "value": 88,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.8,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4821
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "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": "80 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 80,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 86,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Taskfile.yml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod",
                "gosmc/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Taskfile.yml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Taskfile.yml"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 78024,
              "source_files_sampled": 48,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/48 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 48,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "cli",
        "library"
      ],
      "scores": {
        "cli": 6,
        "library": 6
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "cli",
          "source": "dep:github.com/spf13/cobra",
          "weight": 4
        },
        {
          "tier": "description",
          "label": "cli",
          "source": "description:cli",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T23:43:00.446791Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dkorunic/iSMC.svg",
  "full_name": "dkorunic/iSMC",
  "license_state": "standard",
  "license_spdx": "GPL-3.0"
}

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

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

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