Raw JSON report machine-readable
{
"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"
}