Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 22 forksdesde oct 2019Ver en GitHub ↗
TipoHerramienta de línea de comandosBibliotecacómo se determina

dkorunic/iSMC tiene un índice de salud de 71 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es AI Readiness (88/100) y la más baja, Community & Adoption (50/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

71
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

71
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

El resultado global ponderado 63 se calibra a 71 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

Dinko KorunicCuenta personal
138 seguidores32 repositorios públicosdesde dic 2012HAProxy Technologies

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/dkorunic/iSMCv0.17.0-53hace 4 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

82Excelente · 21% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
13.2/36Cadencia de commits — 19/52 semanas con commits
18/18Volumen de commits — 99 commits en el último año
10/10OpenSSF Scorecard: Maintained — 20 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year99
human_commit_share1
days_since_last_push0
active_weeks_last_year19
Cómo se puntúa
27/27Publica versiones — 50 versiones publicadas
36/36Recencia de las versiones — última versión hace 4 días
27/27Cadencia de publicación — una versión cada ~10,5 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count50
latest_release_tagv0.17.0
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases10,5

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

50Moderado · 17% del índice global
Cómo se puntúa
37.2/60Estrellas — 197 estrellas
11/25Forks — 22 forks
1.7/15Observadores — 3 observadores
Datos de entrada utilizados
forks22
stars197
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (GPL-3.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
readme_badges
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_services
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

63Moderado · 23% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.8/22.5Distribución de commits — el principal contribuyente firma el 97% de los commits
8.1/13.5Amplitud de contribuyentes — 6 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled6
top_contributor_share0,966
Cómo se puntúa
42/42Resolución de issues — 100% de issues cerradas
30/30Aceptación de PR — 8/8 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
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
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
15.4/25Alcance del propietario — 138 seguidores de dkorunic
23.1/25Trayectoria — 32 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers138
owner_typeUser
is_verified
owner_logindkorunic
public_repos32
account_age_days4974
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 4 días
20/20Historial de versiones — 53 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/dkorunic/iSMC
ecosystemsgo
any_deprecatedno
min_days_since_publish4

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

54Moderado · 19% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

60Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 10 topics
10/10Wiki
Datos de entrada utilizados
topicsapple, macos, smc, temperature, current, voltage, power, fan, monitoring, hardware
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

56Moderado · 16% del índice global
Cómo se puntúa
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 — sin datos
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 — sin datos
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — 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 — sin datos
0/5Pinned-Dependencies — sin datos
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 — sin datos
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate4,5
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, token_permissions. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages13
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 13 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

88Excelente · 4% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 80 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,8
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes4821
Cómo se puntúa
18/18Arranque con un solo comando — Taskfile.yml
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
5/8Mantenimiento automatizado — automatización de dependencias configurada, no observada en los commits muestreados
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_filesTaskfile.yml
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod, gosmc/go.mod
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
53.9/55Tamaños de archivo manejables — 1/48 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes78.024
source_files_sampled48
oversized_source_files1

Datos clave

197estrellas de GitHub
6contribuidores
99commits en los últimos 12 meses
0días desde el último push
50versiones publicadas
1factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

Historial de estrellas y forks 0 ★ / 22 ⇿
0Estrellas
22Forks
48Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

048121620242122019-112023-032026-07
Mayor 0Menor 12Parche 36

Cada punto abarca 7 días.

OpenSSF Scorecard 4.5 / 10
4.5agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dCI-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
n/dDangerous-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
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
n/dToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 5
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 13

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 4 paquetes directos y 9 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Gogithub.com/fvbommel/sortorderv1.1.0directa
Gogithub.com/jedib0t/go-pretty/v6v6.8.3directa
Gogithub.com/spf13/cobrav1.10.2directa
Gogithub.com/stretchr/testifyv1.11.1directa
Gogithub.com/clipperhouse/uax29/v2v2.7.0indirecta
Gogithub.com/davecgh/go-spewv1.1.1indirecta
Gogithub.com/inconshreveable/mousetrapv1.1.0indirecta
Gogithub.com/mattn/go-runewidthv0.0.27indirecta
Gogithub.com/pmezard/go-difflibv1.0.0indirecta
Gogithub.com/spf13/pflagv1.0.10indirecta
Gogolang.org/x/sysv0.47.0indirecta
Gogolang.org/x/textv0.40.0indirecta
Gogopkg.in/yaml.v3v3.0.1indirecta
Avisos de dependencias 0

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 13 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 0 tienen avisos conocidos, de los cuales 0 son directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v2.3.1, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.