公开记录
软件健康报告模式 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年10月在 GitHub 上查看 ↗
类型命令行工具如何判定

dkorunic/iSMC 的健康指数为 100 分中的 71 分,处于「良好」区间。 其得分最高的类别是AI Readiness(88/100),最低的是Community & Adoption(50/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

71
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

71
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

加权总体分 63 经校准后在公布的指数量表上为 71(记录校准 2026-08-02)。

所有权

Dinko Korunic个人账户
138 关注者32 个公开仓库始于 2012年12月HAProxy Technologies

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/dkorunic/iSMCv0.17.0-534 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

82优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
13.2/36提交节奏 — 52 周中有 19 周有提交
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

发布纪律

90优秀
评分方式
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

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(GPL-3.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
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议题解决 — 100% 的议题已关闭
30/30PR 接受 — 已裁定的 PR 中 8/8 已合并
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所有者影响力 — dkorunic 有 138 位关注者
23.1/25既往记录 — 32 个公开仓库,账户约 13 年
所用输入
followers138
owner_typeUser
is_verified
owner_logindkorunic
public_repos32
account_age_days4,974
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 4 天前
20/20版本历史 — 53 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/dkorunic/iSMC
ecosystemsgo
any_deprecated
min_days_since_publish4

工程质量

基础的工程与文档实践是否到位?

54中等 · 占总体的 19%

工程实践

50中等
评分方式
0/24CI 工作流
24/24存在测试
16/16Linter 配置 — .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 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

88优秀 · 占总体的 4%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 80 次说明了意图(结构化标题或解释性正文)
所用输入
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/11Lint / 格式化配置 — .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可控的文件大小 — 采样的 48 个源文件中有 1 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes78,024
source_files_sampled48
oversized_source_files1

关键数据

197GitHub 星标
6贡献者
99最近 12 个月提交数
0距最近推送天数
50发布版本数
1巴士系数(bus factor)
0开放议题
Go软件包生态系统数

数据采集警告

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

更多细节

Star 与 Fork 历史 0 ★ / 22 ⇿
0Star
22Fork
48发布

每颗 star 和每个 fork 的添加时间,来自 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 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
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.