Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 2.3.1 · 2026-07-28 23:43 UTC

dkorunic / iSMC

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

GoGPL-3.0★ 197 Sterne⑂ 22 Forksseit Okt. 2019Auf GitHub ansehen ↗
ArtKommandozeilenwerkzeugBibliothekwie das ermittelt wird

dkorunic/iSMC erreicht einen Gesundheitsindex von 71 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei AI Readiness (88/100) ab, am schwächsten bei Community & Adoption (50/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

71
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer standardisierten Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr gewichtetes Mittel, kalibriert auf die Verteilung des öffentlichen Registers, sodass die Stufen Perzentilbedeutung tragen; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze Gefährdet von 34.

71
Außergewöhnlich93-100Die Spitzengruppe des Registers (≈ obere 5 %); erfüllt im Wesentlichen alle geprüften Kriterien
Exzellent80-92Durchgehend stark; geringfügige Lücken
Gut65-79Gesund; Lücken sind begrenzt und beherrschbar
Mittel50-64Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Schwach35-49Wesentliche Schwächen in mehreren Bereichen
Gefährdet20-34Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-19Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Der gewichtete Gesamtwert 63 wird auf der veröffentlichten Indexskala auf 71 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

Dinko KorunicPersönliches Konto
138 Follower32 öffentliche Reposseit Dez. 2012HAProxy Technologies

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/dkorunic/iSMCv0.17.0-53vor 4 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

82Exzellent · 21 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
13.2/36Commit-Rhythmus — 19/52 Wochen mit Commits
18/18Commit-Volumen — 99 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year99
human_commit_share1
days_since_last_push0
active_weeks_last_year19
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 50 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 4 Tagen
27/27Release-Rhythmus — ein Release etwa alle 10,5 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count50
latest_release_tagv0.17.0
releases_from_tagsnein
days_since_latest_release4
mean_days_between_releases10,5

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

50Mittel · 17 % des Gesamtindex
Wie die Bewertung erfolgt
37.2/60Stars — 197 Stars
11/25Forks — 22 Forks
1.7/15Watcher — 3 Watcher
Verwendete Eingangsdaten
forks22
stars197
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (GPL-3.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
readme_badge_services
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

63Mittel · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.8/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 97 % der Commits
8.1/13.5Breite der Beitragenden — 6 Beitragende
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Verwendete Eingangsdaten
bus_factor1
contributors_sampled6
top_contributor_share0,966
Wie die Bewertung erfolgt
42/42Issue-Lösungsquote — 100 % der Issues geschlossen
30/30PR-Annahme — 8/8 entschiedene PRs gemergt
0/13Newcomer PR acceptance — kein PR eines Erstbeitragenden in 30 Tagen entschieden
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs8
open_issues0
closed_issues29
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs0
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
15.4/25Reichweite des Inhabers — 138 Follower von dkorunic
23.1/25Kontohistorie — 32 öffentliche Repos, Kontoalter ca. 13 Jahre
Verwendete Eingangsdaten
followers138
owner_typeUser
is_verified
owner_logindkorunic
public_repos32
account_age_days4.974
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Außergewöhnlich
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 4 Tagen
20/20Versionshistorie — 53 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/dkorunic/iSMC
ecosystemsgo
any_deprecatednein
min_days_since_publish4

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

54Mittel · 19 % des Gesamtindex
Wie die Bewertung erfolgt
0/24CI-Workflows
24/24Tests vorhanden
16/16Linter-Konfiguration — .golangci.yml
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cinein
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 10 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsapple, macos, smc, temperature, current, voltage, power, fan, monitoring, hardware
has_wikija
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

56Mittel · 16 % des Gesamtindex
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — keine Daten
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
0/10Dangerous-Workflow — keine Daten
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — keine Daten
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — keine Daten
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate4,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, dangerous_workflow, packaging, pinned_dependencies, token_permissions. Die verbleibenden Gewichte wurden renormalisiert.

Abhängigkeits-Advisories

100Außergewöhnlich
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages13
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories, Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. 13 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Trägt ein bewusst kleines Gewicht (4 %): Agenten-Tooling ist ein echtes Pflegesignal, doch ein Repository ohne jedes Signal kann weiterhin 100/100 erreichen.

88Exzellent · 4 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 80 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,8
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes4.821
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Taskfile.yml
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .golangci.yml
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
5/8Automatisierte Wartung — Abhängigkeits-Automatisierung konfiguriert, in den erfassten Commits nicht beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_filesTaskfile.yml
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod, gosmc/go.mod
dependency_bot_commit_share0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Pinned-Dependencies. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
53.9/55Handhabbare Dateigrößen — 1/48 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes78.024
source_files_sampled48
oversized_source_files1

Eckdaten

197GitHub-Sterne
6Mitwirkende
99Commits, letzte 12 Monate
0Tage seit letztem Push
50Releases
1Bus-Faktor
0offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 22 ⇿
0Sterne
22Forks
48Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

048121620242122019-112023-032026-07
Major 0Minor 12Patch 36

Jeder Punkt umfasst 7 Tage.

OpenSSF Scorecard 4.5 / 10
4.5Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-28 23:42 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
k. A.CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
k. A.Dangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
k. A.Pinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
k. A.Token-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 5
RegistryPaketVersionsvorgabeManifest
Gogithub.com/dkorunic/iSMC/gosmcv0.0.0-20260413130435-fb3be841d2e6go.mod
Gogithub.com/fvbommel/sortorderv1.1.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/jedib0t/go-pretty/v6v6.8.3go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Alle Abhängigkeiten 13

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 4 direkte und 9 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
Gogithub.com/fvbommel/sortorderv1.1.0direkt
Gogithub.com/jedib0t/go-pretty/v6v6.8.3direkt
Gogithub.com/spf13/cobrav1.10.2direkt
Gogithub.com/stretchr/testifyv1.11.1direkt
Gogithub.com/clipperhouse/uax29/v2v2.7.0indirekt
Gogithub.com/davecgh/go-spewv1.1.1indirekt
Gogithub.com/inconshreveable/mousetrapv1.1.0indirekt
Gogithub.com/mattn/go-runewidthv0.0.27indirekt
Gogithub.com/pmezard/go-difflibv1.0.0indirekt
Gogithub.com/spf13/pflagv1.0.10indirekt
Gogolang.org/x/sysv0.47.0indirekt
Gogolang.org/x/textv0.40.0indirekt
Gogopkg.in/yaml.v3v3.0.1indirekt
Abhängigkeits-Advisories 0

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 13 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 0 tragen bekannte Advisories, davon 0 direkte.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v2.3.1, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.