公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-29 18:31 UTC

binlecode / actop

Apple Silicon (M1–M4) power, GPU, ANE & memory-bandwidth monitor — sudoless TUI + Python API for profiling local LLM / MLX / CoreML inference

PythonMIT★ 0 星标⑂ 0 复刻始于 2026年2月在 GitHub 上查看 ↗

binlecode/actop 的健康指数为 100 分中的 65 分,处于「中等」区间。 其得分最高的类别是Vitality(78/100),最低的是Community & Adoption(42/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

65
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

65
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

所有权

Bin Le个人账户
3 关注者225 个公开仓库始于 2011年7月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
PyPIactop1.4.142,580210 天前actopapple-siliconioreportperformance-monitor

按类别列示的指标

活力

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

78良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
5.5/36提交节奏 — 52 周中有 8 周有提交
18/18提交量 — 最近一年 272 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year272
human_commit_share0.92
days_since_last_push0
active_weeks_last_year8

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 20 个发布版本
36/36发布时效 — 最近一次发布版本于 44 天前
27/27发布节奏 — 约每 11.7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count20
latest_release_tagv0.8.6
releases_from_tags
days_since_latest_release44
mean_days_between_releases11.7

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

42存在风险 · 占总体的 18%
评分方式
0/60星标 — 0 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

77良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
45.5/80月度下载量 — pypi 合计每月 2,580 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesactop
dependents
ecosystemspypi
total_downloads
monthly_downloads2,580
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

61中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
9.3/22.5提交分布 — 头号贡献者编写了 59% 的提交
9.5/13.5贡献者广度 — 7 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 4 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled7
top_contributor_share0.587
评分方式
0/46.8议题解决 — 没有议题或无数据
37.3/38.3PR 接受 — 已裁定的 PR 中 39/40 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/24 approved changesets -- score normalized to 0
所用输入
merged_prs39
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
4.3/25所有者影响力 — binlecode 有 3 位关注者
25/25既往记录 — 225 个公开仓库,账户约 15 年
所用输入
followers3
owner_typeUser
is_verified
owner_loginbinlecode
public_repos225
account_age_days5,482
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 21 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesactop
ecosystemspypi
any_deprecated
min_days_since_publish0

工程质量

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

75良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

85优秀
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 10 个主题标签
10/10Wiki
所用输入
topicsane, apple-silicon, gpu-monitoring, llm, macos, mlx, ollama, performance-monitoring, python, tui
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

65中等 · 占总体的 16%

安全态势

65中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/24 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 4 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6.5
已排除计分(无数据或不适用):branch_protection。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

59中等 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 92 次人类提交中有 85 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.924
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes12,182
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
10/10已体现的代理实践 — 最近 100 次提交中有 73 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 1 次为自动依赖更新
2/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.73
toolchain_manifests
dependency_bot_commit_share0.01
评分方式
0/45可类型检查的代码 — Python,未配置类型检查
55/55可控的文件大小 — 采样的 44 个源文件中有 0 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes54,777
source_files_sampled44
oversized_source_files0

关键数据

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

数据采集警告

  • deps.dev does not index pypi:actop@1.4.14; advisories assessed against the repository dependency graph instead
  • No resolved dependencies carried a version and a supported ecosystem

更多细节

OpenSSF Scorecard 6.5 / 10
6.5综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-29 18:31 UTC

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/24 approved changesets -- score normalized to 0
10Contributorsproject has 4 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
4Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 2
注册表软件包版本约束清单文件
PyPItextual>=0.60pyproject.toml
PyPIrich>=13.0pyproject.toml
全部依赖 6

来自 GitHub 依赖图的完整解析依赖集合:2 个直接依赖与 4 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
PyPIrich直接
PyPItextual直接
PyPIcoremltools间接
PyPInumpy间接
PyPIpandas间接
PyPIruff间接
依赖安全公告 未评估

本报告未能完成公告比对:No resolved dependencies carried a version and a supported ecosystem

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ane",
        "apple-silicon",
        "gpu-monitoring",
        "llm",
        "macos",
        "mlx",
        "ollama",
        "performance-monitoring",
        "python",
        "tui"
      ],
      "is_fork": false,
      "size_kb": 5847,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Shell": 10280,
        "Python": 333262
      },
      "pushed_at": "2026-07-29T18:28:29Z",
      "created_at": "2026-02-16T00:03:36Z",
      "owner_type": "User",
      "updated_at": "2026-07-29T18:28:08Z",
      "description": "Apple Silicon (M1–M4) power, GPU, ANE & memory-bandwidth monitor — sudoless TUI + Python API for profiling local LLM / MLX / CoreML inference",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://www.linkedin.com/in/bin-le-6b166421/",
      "name": "Bin Le",
      "type": "User",
      "login": "binlecode",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/938862?v=4",
      "created_at": "2011-07-26T05:08:25Z",
      "is_verified": null,
      "public_repos": 225,
      "account_age_days": 5482
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-06-15T14:51:57Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-03-04T00:47:45Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-03-03T23:52:31Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-03-03T23:43:10Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-03-03T23:23:19Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-03-03T02:20:33Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-03-02T20:50:14Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-03-02T06:25:00Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-03-02T05:09:11Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-02T04:56:50Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-03-02T04:13:49Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-03-02T02:24:58Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-02T02:17:55Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-02T02:14:36Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-01T18:27:36Z"
        },
        {
          "tag": "v0.3.9",
          "kind": "patch",
          "published_at": "2026-02-18T22:18:48Z"
        },
        {
          "tag": "v0.3.8",
          "kind": "patch",
          "published_at": "2026-02-18T21:55:40Z"
        },
        {
          "tag": "v0.3.7",
          "kind": "patch",
          "published_at": "2026-02-18T20:09:16Z"
        },
        {
          "tag": "v0.3.6.tar.gz",
          "kind": "other",
          "published_at": "2026-02-18T19:39:45Z"
        },
        {
          "tag": "v0.3.5.tar.gz",
          "kind": "other",
          "published_at": "2026-02-18T19:34:41Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8688f415465aeeaa6ca784b2e5ff2b246e97d0a8",
          "body": "Release v1.4.14: document dependabot GitHub Actions SHA bump",
          "is_bot": false,
          "headline": "Merge pull request #40 from binlecode/release/v1.4.14",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-29T18:28:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "228d76aee1593269681bc350bb62a1cc02f5c245",
          "body": "ruff 0.16.0 expanded its default rule set, turning a previously-clean\ntree into 126 `ruff check` errors and breaking main's lint gate with no\ncode change (the workflow installed ruff unpinned, so a fresh runner\npulled 0.16.0). Cap ruff at >=0.15,<0.16 in both pyproject [dev] and\nmain-ci.yml for a reproducible green gate. Bringing the code into 0.16\ncompliance is deferred to its own PR.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Pin ruff <0.16 to restore the CI lint gate",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-29T18:27:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b441c7390a026e79032f54b778e662868c03736",
          "body": "The dependabot github-actions group update (#39, checkout v7.0.1,\nsetup-python v7.0.0, pypi-publish v1.14.1) merged without the repo's\nper-PR version bump. Cut a patch release so main stays tagged and\nversion-bumped per convention. CI-only; no runtime or API change.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v1.4.14: document dependabot GitHub Actions SHA bump",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-29T18:23:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3d3e5ce8850f9ea99e46cfb2e256e9b7a240d9d2",
          "body": "…b-actions-83e0a6879f\n\nci: Bump the github-actions group across 1 directory with 3 updates",
          "is_bot": false,
          "headline": "Merge pull request #39 from binlecode/dependabot/github_actions/githu…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-29T18:16:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fd68851db9c4d8f23fe8cca3e542e35fc0dda36",
          "body": "Bumps the github-actions group with 3 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [actions/setup-python](https://github.com/actions/setup-python) and [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish).\n\n\nUpdates `actions/checkout` f\n[…]\n  dependency-version: 1.14.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci: Bump the github-actions group across 1 directory with 3 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T13:54:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f902f6344d6b30d714b6b86a9de6fb21add9ec59",
          "body": "…1.4.13) (#38)\n\n* Ratchet bandwidth/package-power chart ceilings to the highest observed session peak\n\nBoth the Mem BW and Package Power charts (and their saturation alerts)\nnormalize against a calibrated per-chip reference constant — a best-effort\nguess, since Apple doesn't publish exact bus-bandwi\n[…]\nhored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Bump version to 1.4.13, changelog for ceiling ratchet\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Ratchet bandwidth/package-power chart ceilings to the session peak (v…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-04T21:35:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb5b86dc7dd0ce09bd4109785c4a11f7c90ec201",
          "body": "…(v1.4.12) (#37)\n\nMemory bandwidth:\n- Scale the Mem BW chart and MEM-BOUND alert against the SoC's true unified-\n  memory bandwidth (single max_mem_bw per profile) instead of cpu_max_bw +\n  gpu_max_bw. Apple Silicon shares one DRAM bus, so summing overstated the\n  ceiling (800 vs. real 546 GB/s on M\n[…]\nvior. Previously an all-time monotonic max let a\n  single transient spike compress the CPU/GPU power charts for the whole session.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix memory bandwidth scaling/reading + power auto-scale rolling peak …",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-04T12:24:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0fbcae78658dee918d874acaae05546219b3f904",
          "body": "…v1.4.11) (#36)\n\n* TUI: split P-CPU/E-CPU into sibling boxes, hide per-core by default (v1.4.11)\n\nRender the P-CPU and E-CPU clusters as two separate titled boxes instead of\ntwo halves of one \"CPU\" box, so each cluster chart stands out as a sibling\nalongside GPU. The grid preset lays them out as the\n[…]\nition under\nthe 1.4.11 CHANGELOG Docs subsection.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "TUI: split P-CPU/E-CPU into sibling boxes, hide per-core by default (…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-03T14:11:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4436ef5c1660d7902aca427df38411dfb8bb1e9a",
          "body": "…) (#35)\n\nCharts in the default `dots` glyph mode now pack two time samples per\ncharacter using both braille dot columns (left = earlier, right = later),\ndoubling horizontal density into a continuous btop-style line instead of the\nprevious sparse single-column poles. Applies to both the section char\n[…]\n  (drop two redundant shape/bounds tests covered behaviorally elsewhere;\n  rewrite the RAM test into a native-parse sanity guard).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "TUI: dense braille charts (2 samples/char) + fan RPM spinner (v1.4.10…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-03T12:00:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b40999e13b4dcbccba052eb9a6afc6d861f64a53",
          "body": "- pyproject.toml: replace the stale generic PyPI description (\"Performance\n  monitoring CLI tool for Apple Silicon\") with the positioning already\n  locked in for the GitHub repo description (sudoless, TUI + Python API,\n  GPU/ANE/bandwidth, local-LLM profiling), so PyPI and GitHub read\n  consistently\n[…]\n a self-contained description. This file is now\n  directly linked from the README's Roadmap section, so external readers\n  hit it.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Refresh pyproject description + fix roadmap dangling ref (v1.4.9) (#34)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-03T00:48:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e997c3d7cafeb258c8dac552779fc844f301aa4",
          "body": "… (#33)\n\nThe \"Where actop fits\" comparison table shows a competitive gap (net/disk\nI/O, menu bar) with no indication whether it's tracked or abandoned. Add a\nRoadmap section pointing to docs/TODO-architecture-roadmap.md and naming\nthe two open items (net/disk I/O in progress, menu bar deliberately\ndeferred post-launch).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "README: add Roadmap section linking the architecture roadmap (v1.4.8)…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-03T00:44:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b4e4418f745735de455880d7ec12ad5e336f389",
          "body": "docs/RUNBOOK-launch-and-growth.md is internal market-promo notes, not part\nof the shipped product (the file itself said to keep it private). Untrack it\nand add a .gitignore entry so it stays local only and never re-enters origin.\nRemove now-dangling references in CLAUDE.md and the docs/TODO-* files;\nhistorical CHANGELOG mentions are left as-is.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove private launch runbook from version control (v1.4.7) (#32)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-03T00:03:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e07a89a4ac759cc37875b7435b49d1dd12f55674",
          "body": "…#31)\n\n- README hero is now images/actop-demo.gif (actop live under an Ollama load:\n  stack layout, braille->block glyphs, then the watt-attributed process panel).\n  Keep images/actop.png (grid) as the still fallback; remove the redundant\n  stack/process stills the GIF now shows in motion.\n- Add CON\n[…]\nprivate vuln\n  reporting; DESIGN-system.md gains 5.8 on the TUI->docs capture skills.\n- Update the launch runbook: Steps 1-3 done.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Animated hero GIF + record-tui-gif skill; sync design docs (v1.4.6) (…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T22:51:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e3b7a979ce199bcf82309641907e13472fb28e0",
          "body": "Supply-chain hardening: pin every action in the CI, PyPI-publish, and\nformula-release workflows to a full commit SHA (with a version comment),\nreplacing mutable tag/branch refs. Most important, the OIDC-privileged\npublish job used pypa/gh-action-pypi-publish@release/v1 (a moving branch);\nit now pins v1.14.0 by SHA. Dependabot's github-actions ecosystem keeps the\npins updated via the version comments.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Pin GitHub Actions to commit SHAs (v1.4.5) (#30)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T22:43:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "400b6b5d823d601d62d26521ee8229535d8bad63",
          "body": "Remove .DS_Store from the repo root and images/ — they predated the\n.gitignore rule and were tracked in origin. The existing .gitignore entry\nkeeps them out going forward.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Untrack .DS_Store files (v1.4.4) (#29)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T22:22:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d71bbd23a7080152bcb3ad90eb42be2a37d3fa52",
          "body": "* docs: add stack-layout screenshot to README (v1.4.3)\n\nShow both layout presets near the top of the README: keep the default grid\nhero (refreshed to v1.4.2, showing the aligned column bottoms) and add\nimages/actop_stacked.png — the single full-width stack preset — with a caption\nnoting the 'l' live\n[…]\nyPI long_description. Grid hero stays full-width.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add stack + process-panel screenshots to README (v1.4.3) (#28)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T21:08:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e409db24690fb309182c8319f822649c80cddf3",
          "body": "…2) (#27)\n\nIn the grid preset the CPU section (left column, row-span: 3) was height:auto,\nso it closed at its own content height and left dead space below it when the\nright-column stack (GPU·ANE + Memory + Power) was taller. Add height:100% scoped\nto HardwareDashboard.layout-grid #section-cpu so the\n[…]\nlowest right-column box. Grid-scoped, so\nthe vertical stack preset is unaffected (verified live).\n\nBump 1.4.1 -> 1.4.2; CHANGELOG.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix grid layout: CPU box fills span to align with right column (v1.4.…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T20:40:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b689cea7cb190f6a18cf34bc28635b92727e7001",
          "body": "* Add --palette accessibility color palettes (v1.4.1)\n\nShip the convergence \"color\" quick win as a startup-only --palette flag\n(thermal/viridis/mono) rather than the originally-scoped decorative runtime\ncycle keybind. An ROI review found the peers (mactop/macmon) converged on\n*decorative* color cycl\n[…]\nioritization-note reference in\nthe net/disk plan.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add --palette accessibility color palettes (v1.4.1) (#26)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T20:27:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "574ed222227d91f50f0e5f1f8c3746bf704cedf4",
          "body": "* TUI layout PR2: grid/stack layout presets (v1.4.0)\n\nShip the two-preset layout system on top of PR1's sectioned dashboard:\nthe same four sections (CPU, GPU·ANE, Memory, Power) render under a `grid`\npreset (two columns, CPU spanning the left via row-span, the default) or a\n`stack` preset (single fu\n[…]\ne-filter\ngotchas hit while building the diagrams.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "TUI layout PR2: grid/stack layout presets (v1.4.0) (#25)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T19:16:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3188715d930759c000422dbcd7033d8bf4a8a314",
          "body": "Realize the first of two layout PRs (docs/TODO-tui-layout-redesign):\n\n- Sectionize HardwareDashboard.compose() into four titled, bordered\n  containers (CPU, GPU · ANE, Memory, Power); titles live in the border\n  at zero row cost. Child widget ids unchanged.\n- Compact CPU/GPU power from label+chart p\n[…]\npple Silicon (M4 Max): four sections render, power rows\ncarry inline sparks, g toggles glyphs, status bar fixed, energy increases.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "TUI layout PR1: sectioned dashboard + compact power rows (v1.3.3) (#24)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T18:09:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c1bc81cfe23eb0ea7f4e61664042650c37faa8b",
          "body": "….3.2) (#23)\n\nDocs-only maintenance: DESIGN-system.md L1/L2/L3 pillar + analytics.py + ane_max_w; delete completed LC plan.",
          "is_bot": false,
          "headline": "docs: sync DESIGN-system with LC layering; drop completed LC plan (v1…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T17:22:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "200bb99b351c049e2567dbe5b7b6ade25d11b30e",
          "body": "Completes the layering-cleanup roadmap (LC-2 ProcessSample through L2 + analytics.py; LC-3 AlertEngine/throttling/session-energy into L2). Released as maintenance v1.3.1.",
          "is_bot": false,
          "headline": "LC-2 + LC-3: ProcessSample L2 + analytics.AlertEngine (v1.3.1) (#22)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T17:14:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd4aa8707300688382072440fcc4d4437b57d774",
          "body": "…ofile (#21)\n\nLayering cleanup LC-1 (F1 + F5). SystemSnapshot now carries ram_total_gb,\nram_used_percent, swap_total_gb, and ane_util_pct (all defaulted), so the\nTUI reads memory and ANE% off the snapshot instead of a second\nget_ram_metrics_dict() call and a render-time divide. MetricsUpdated drops\n\n[…]\ntion: ruff clean; 108 passed (incl. local); --help OK; live TUI run\nconfirmed RAM/ANE rows and charts update with no visual delta.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "LC-1: SystemSnapshot as sole per-frame contract + ANE ref into SoC pr…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T16:32:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f573289a8586e9685057e62ac4e6f1f7425fe4e",
          "body": "Feature B of the convergence quick-wins: close the only remaining\n2/2-converged peer gap (both mactop and macmon read the fan max key)\nwhile staying strictly read-only/unprivileged.\n\n- smc.py: probe F{n}Mx alongside F{n}Ac (shared flt/size-4 guard via\n  new _discover_flt4_key); F{n}Mn/F{n}Tg/F{n}Md \n[…]\nfied on M4 Max: read_fan_info() -> [FanReading(current=0.0,\nmax=5777.0), FanReading(current=0.0, max=5777.0)]. pytest: 107 passed.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add per-fan max RPM (current/max fan telemetry) (#20)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T15:53:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1b7a3e934afb31537918a4bc7549b6452d3f562",
          "body": "Discovers per-fan actual-RPM keys (F{n}Ac, flt type, count from FNum) and\nthreads them through SampleResult -> SystemSnapshot as fan_rpms/fan_available,\nmirroring the existing temperature-reading pattern. The TUI's new Fan row\nhides entirely on fanless Macs (bandwidth_available hide-row pattern) instead\nof showing a phantom 0 RPM. Also exported via NDJSON/Prometheus.\n\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v1.2.2: Fan RPM via SMC (#19)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T03:05:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19739c3978492de0de4fe8a97b7ec6e2a6bc5697",
          "body": "* Fold DCS bandwidth spike findings into DESIGN-system.md, delete SPIKE doc\n\nDESIGN-system.md §3.6 (now renumbered from 3.5) claimed the per-agent\nbandwidth breakdown was merely \"deferred as a sampler change\" -- stale\nrelative to the spike's actual finding that it was investigated and\ndeliberately d\n[…]\n/disk I/O (must-have) and menu bar mode\n(deferred past first market promo).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v1.2.1: doc sync, Python API snippet, roadmap refresh (#18)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-02T01:51:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3e60d81c7473f395157eefe822267be49624f5d9",
          "body": "… load generator (#17)\n\n* docs: sync architecture roadmap Tier 3 to shipped export backends\n\nMark the telemetry-export item [~]: --json (run_json_stream) and\n--serve (serve_prometheus) already ship in actop/export.py; only a\ndedicated JSON push socket/named pipe remains. Clarify the unknown-SoC\nitem\n[…]\npes-guard fix. Minor bump per the Tier-2-completion\nmilestone.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v1.2.0: per-process GPU attribution, cross-platform ctypes guard, ANE…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T22:47:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa77db640f450af3ccecdb6d29f9b92a95b219e0",
          "body": "docs: rename launch/growth guide to RUNBOOK- prefix (v1.0.4)",
          "is_bot": false,
          "headline": "Merge pull request #16 from binlecode/docs/runbook-rename",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:27:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36a51dfa22aa02c58501bc36d8c173b1ed49756e",
          "body": "- DESIGN-system.md: fold in per-process power (PWR) as §5.7; correct the\n  now-stale §3.5 non-goal (per-process CPU power ships since v1.0.2); note the\n  (pid, start_tvsec) PID-reuse guard in §2.3; fix sort-cycle + layout mock.\n- RUNBOOK-launch-and-growth.md: reconcile Homebrew-notability bar with t\n[…]\nv1.0.2; git/PR #11 is the\n  history, DESIGN-system.md §5.7 + roadmap carry the as-built) and rewire the\n  roadmap's inbound links.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sync design/runbook to shipped state; drop T1 tombstone",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:26:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2263c9d46724edfa2386054beb993511012ba214",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 1.0.4",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:18:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8790a6e6245873f84c802354bd112ee2f3f74a81",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: rename launch/growth guide to RUNBOOK- prefix",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:18:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "693c00575101270b0c7feb4d0ddbb89d10213afa",
          "body": "chore: SDLC hardening + consolidate SDLC/CI/CD/release design doc (v1.0.3)",
          "is_bot": false,
          "headline": "Merge pull request #14 from binlecode/chore/sdlc-hardening",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:17:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d8e6a53ef901367b752e62a73d4dbe3add5df55",
          "body": "Docs/SDLC-governance-only release (no runtime code change): consolidated design\ndoc, branching + versioning rules, Dependabot, PR template, SECURITY policy.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 1.0.3",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:14:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69caf4b6ba9c7bf3958e23355c2e89ed63124993",
          "body": "- Rename DESIGN-cicd-release.md -> DESIGN-sdlc-cicd-release.md; update all inbound\n  references (CLAUDE.md, SECURITY.md, DESIGN-system.md, GUIDE-launch-and-growth.md,\n  dependabot.yml)\n- Expand it into the single SDLC + CI/CD + release design doc: new \"SDLC Rules &\n  Guardrails\" section (branching, \n[…]\nd + the design doc: bump version + CHANGELOG\n  in every PR (patch by default, minor for milestone PRs); tag after merge to publish\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: consolidate into DESIGN-sdlc-cicd-release, add versioning rule",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:14:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c66611d45d3f2b66f7718941d337bdba000cfec7",
          "body": "…licy, docs)\n\n- Add .github/dependabot.yml: weekly pip + github-actions updates, grouped\n  minor/patch to cut PR noise (free on public repos; no Actions-minute cost)\n- Add .github/PULL_REQUEST_TEMPLATE.md mirroring the CLAUDE.md PR checklist\n  (validation commands, Apple-Silicon run, functional-test\n[…]\nb secret scanning + push protection (gap 1) is a repo Settings toggle,\nfree on public repos; enable via Settings -> Code security.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: SDLC perimeter hardening (Dependabot, PR template, security po…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:05:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bfdb1072352caab18581d4286ed62e7cc5ae14c6",
          "body": "docs: rename cicd guide to DESIGN-, document both publish flows, reconcile t1 status",
          "is_bot": false,
          "headline": "Merge pull request #13 from binlecode/docs/release-and-t1-doc-updates",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:05:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b06e6b1afc178c62d72ca170aaa79c47b678e761",
          "body": "…ches)\n\nBake the branching rule into the two rules sources: CLAUDE.md \"Commit & PR\nGuidelines\" and DESIGN-cicd-release.md \"Rules\". Every branch forks from main and\ntargets main; never fork a feature branch off another feature branch. Applies\nespecially to CI/CD and release changes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: require branch-from-main / PR-strictly-to-main (no stacked bran…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T12:03:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0f4e63f58ce9b4ce34120f6665da472890062f8e",
          "body": "- TODO-t1-per-process-power: status -> shipped in v1.0.2 (PR #11/#12); note the\n  remaining optional follow-ups (DESIGN-system.md fold-in, export.py proc output)\n- Roadmap #1: mark SHIPPED and replace the stale proc_pid_rusage/RUsageInfoV4 plan\n  (disproved in Phase-0) with the as-built CPU-time-share attribution approach\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: mark Tier-1 per-process power as shipped (v1.0.2)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T11:51:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ebec93d798bbb2417a286ad8473d2c6121920647",
          "body": "- Rename GUIDE-cicd-release.md -> DESIGN-cicd-release.md (git-tracked rename)\n- Add CI Validation section: main-ci matrix (3.11-3.14) + 3.15 canary and the\n  \"not local\" CI-safe test subset rationale\n- Document both PyPI publish flows: OIDC Trusted Publishing (default) and the\n  token-driven twine/A\n[…]\n, with a comparison table and migration note\n- Update inbound references (CLAUDE.md, DESIGN-system.md, GUIDE-launch-and-growth.md)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: rename cicd guide to DESIGN- and document both publish flows",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T11:51:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa5d464d80fc5d3ab80775a10f21a6c02246fb63",
          "body": "Fix CI: mark host-dependent per-process-power tests as local",
          "is_bot": false,
          "headline": "Merge pull request #12 from binlecode/fix/mark-per-process-tests-local",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:47:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dab5d4fdc731fcdfb48187d2bca6f829452d485b",
          "body": "Three PWR tests need a real Apple Silicon host (live processes / SoC info)\nand fail under CI's `pytest -m \"not local\"` on Linux:\n- bounded-share and busy-loop tests rely on get_native_processes (Darwin-only)\n- the dashboard-render test builds ActopApp, which reads real SoC info (int(\"?\")\n  off-Darwi\n[…]\n those three @pytest.mark.local; the pure sort_processes test stays CI-safe.\nNo packaged code change (tests are not in the wheel).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Mark host-dependent per-process-power tests as local",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:45:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "be1bd853f756f657aabb2a1490c8ab7ca8ef81e8",
          "body": "Add per-process PWR column (CPU-time-share power attribution)",
          "is_bot": false,
          "headline": "Merge pull request #11 from binlecode/feat/per-process-power",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:41:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4532a5e74bffa409f6a8512319e67d455c5adb5",
          "body": "Patch release for the per-process PWR column feature.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 1.0.2",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:41:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d65985385e37de43518622623a4ba7a9ab0faf7a",
          "body": "Tier-1 flagship: attribute package CPU watts to processes by their share\nof total CPU-time — the sudoless, in-process answer to \"which process is\ndrawing the watts\" (no peer tool does per-process power).\n\n- native_sys.py: surface pbi_start_tvsec (offset 120) per PID so the\n  CPU-time cache can key o\n[…]\n rises under a busy loop, SORT_POWER\norder, and the PWR column + token rendered through a mounted dashboard.\npytest -q green (90).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add per-process PWR column (CPU-time-share power attribution)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:40:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82085a7ea7a5aadb3c3ad876abe0027de4b28647",
          "body": "Conformance cleanup + v1.0.1 (visible RAM fallback, prune dead config)",
          "is_bot": false,
          "headline": "Merge pull request #10 from binlecode/chore/prune-dashboardconfig",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:38:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbe4bb3e57775a3db0104d4a3c794be8b642860f",
          "body": "Patch release for the conformance cleanup: visible RAM-fallback sentinel\n(was a fabricated 16/8 GB), rich declared as a direct dependency, and\ninternal DashboardConfig/dedup tidy-ups (no behavior change).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 1.0.1",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:37:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2fb651ed256198a848c599750bf8a911fd100a0",
          "body": "Closes out docs/TODO-conformance-2026-06-30.md — every deferred item is\nnow either done or deliberately dropped, so the TODO is removed.\n\nDone:\n- R12: RAM read failure returns a zero sentinel (UI shows 0/0 GB, a\n  visible \"unavailable\") instead of a fabricated 16/8 GB. Consumer\n  already guards tota\n[…]\nated state pairs: cosmetic only; not worth refactoring the\n  sampler's hot delta path with no user benefit.\n\npytest -q green (90).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Resolve conformance backlog; drop the audit TODO",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:37:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca8e7c51c6cf53293450ff7e1c4a64a94b13cbc2",
          "body": "Conformance cleanup (docs/TODO-conformance-2026-06-30.md, R1):\n- Delete DashboardConfig.max_media_bw and proc_filter_raw — written by\n  create_dashboard_config but read by nothing (bandwidth uses cpu+gpu;\n  filtering uses the compiled process_filter_pattern).\n- Delete usage_track_window / core_histo\n[…]\n).\n- Drop unused Monitor.backend_name (create_sampler still returns it).\n\nNo behavior change (500 retained). pytest -q green (90).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Prune write-only DashboardConfig fields; name chart history cap",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:37:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5213c14b80824ad1aa869671b97ffe345caa79bd",
          "body": "Add audit-conformance skill (whole-tree rule audit)",
          "is_bot": false,
          "headline": "Merge pull request #8 from binlecode/chore/audit-conformance-skill",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:37:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec155ddeabe6db619d441e8e52ec5907f2530a87",
          "body": "docs: T1 spec pivot, roadmap reframe, release-doc fixes",
          "is_bot": false,
          "headline": "Merge pull request #9 from binlecode/hardening",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:37:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcecddad2bb3605f66152ee685cfccbbe8bcea12",
          "body": "A write-only field whose job is done by a hardcoded literal elsewhere\n(e.g. a config *_window vs a deque maxlen=500) is a wiring gap, not dead\ncode — the fix is a wire-up-vs-delete decision, not a mechanical prune.\nAdded to the R1 rule + the Pass 2 blind-re-read reclassification step.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "audit-conformance: R1 wiring-gap sub-pattern",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:28:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "078c70e30c9cfaadfd20b6972dfb1be64b4f2c67",
          "body": "Self-contained periodic conformance audit (the whole-codebase counterpart\nto diff-scoped /code-review). Embeds the full R1-R12 rule set, an AST\nimport-edge builder, actop's layer order, and a fan-out/blind-re-read flow.\nEmits an actionable docs/TODO-conformance-YYYY-MM-DD.md checklist.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add audit-conformance skill for whole-tree rule audits",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T04:28:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fe65572ec5b074d0986d53779da577ba4ce4ec7c",
          "body": "…-0 spike\n\nPhase-0 validation (tmp/spike_rusage_energy.py) disproved the rusage-energy\ndata source: ri_billed/serviced_energy stay flat at 0 under full core load,\nand root PIDs return EPERM. Pivot to proportional attribution — proc CPU-time\nshare x package cpu_watts — which needs no new native bindi\n[…]\nche key. Fold in review fixes: acceptance rewrite, sort/cost\nresolution, Prometheus cardinality caveat. Effort revised M-L -> S-M.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(t1): pivot per-process power to CPU-time-share model after Phase…",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T02:35:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3e785d884dd0c0f2cf00f4125977a1863c27b031",
          "body": "- Rename TODO-actop-rename-and-roadmap.md -> TODO-actop-feature-gap-roadmap.md;\n  remove the completed Part A rename section (its durable substance already\n  merged into DESIGN-system.md \\xc2\\xa71.1) and reframe as the pure feature-gap roadmap.\n- Add TODO-t1-per-process-power.md: impl-ready spec for\n[…]\ndge cases, functional tests); point the roadmap's Tier 1 #1 at it.\n- Fix stale 'Where agtop fits' -> 'Where actop fits' reference.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: split flagship spec + reframe roadmap as feature-gap (drop Part A)",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T02:25:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "606b0cb1efbaa7ad6c932f9e9c8df7711f54d9d0",
          "body": "Add DESIGN-system.md \\xc2\\xa71.1 (Identity, Naming & Distribution Model) capturing\nthe actop identity, agtop->actop rename rationale, positioning, and the\nPyPI/Homebrew/PR-only distribution model. Point the rename TODO's Part A at\nit; the checklist is now a historical record. Also refresh the stale\nv0.9.x version string in the TUI layout diagram.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: merge Part A (rename) substance into DESIGN-system.md",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T02:15:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "254892f8fb0bafa659b73a841738a575d63f060a",
          "body": "Update stale status/pending sections: v1.0.0 tagged, PyPI published via\nOIDC, Homebrew tap synced, HOMEBREW_TAP_TOKEN set, local install validated.\nPart B feature roadmap remains the open work. Announce is the only soft\nfollow-up.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: mark Part A (actop rename) done — shipped as v1.0.0",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T02:13:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "15084154282c8c79ecc8337e0e372c1e127e099d",
          "body": "- README: correct 'brew tap binlecode/actop' (drop --custom-remote that\n  pointed at the formula-less code repo); note bundled python@3.13 venv;\n  untap on uninstall. Validated via a real local brew install of v1.0.0.\n- GUIDE-cicd-release: add HOMEBREW_TAP_TOKEN secret-hygiene subsection\n  (least-privilege fine-grained PAT, expiry/rotation, stdin-only set).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix Homebrew tap command and add release secret-hygiene note",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T02:07:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca2cb3ff05611b9a62db3b9c5d44628da53b5bb3",
          "body": "docs: document PyPI OIDC trusted publishing + pypi environment",
          "is_bot": false,
          "headline": "Merge pull request #7 from binlecode/docs-oidc-release",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T01:07:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "518335c9a03e31443f7852f5b05002f4712525ac",
          "body": "- New \"PyPI Publishing (OIDC)\" section: GitHub `pypi` environment (already created,\n  tag-only v* deployment policy), exact PyPI trusted-publisher field values, and\n  the manual step required on pypi.org.\n- Record the 1.0.0 manual-upload bootstrap and the account-scoped-token retirement\n  once OIDC is confirmed.\n- Update failure playbook + quick reference for the environment/tag policy.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document PyPI OIDC trusted publishing + pypi environment",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T01:07:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "335c3e31a92f8ef5d776f9ece597346d4714c131",
          "body": "Drop requires-python upper cap + add pre-release CI canary",
          "is_bot": false,
          "headline": "Merge pull request #6 from binlecode/drop-python-upper-cap",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T00:42:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98753760f7c6d027065ff4a1332cee38c4667e97",
          "body": "- requires-python: >=3.11,<3.15 -> >=3.11. Avoids upper-pin resolver friction\n  for the importable API (Monitor/Profiler); classifiers still signal the\n  tested range (3.11–3.14).\n- main-ci: add non-blocking canary job on next CPython (3.15, allow-prereleases,\n  continue-on-error) as early-warning for future-version breakage.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop requires-python upper cap; add pre-release CI canary",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T00:26:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3c370ef14d489a6381420123e2c6c15cae3a3e33",
          "body": "Add Python 3.14 support (verified); range 3.11–3.14",
          "is_bot": false,
          "headline": "Merge pull request #5 from binlecode/python-314-support",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T00:19:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "768a0adfbe48ff9c3faac892f85fc496185bd2fc",
          "body": "- requires-python widened to >=3.11,<3.15; add 3.14 trove classifier.\n- Verified on real CPython 3.14.6: deps resolve with 3.14 wheels and the full\n  suite passes (86 passed, incl. hardware/IOReport tests).\n- main-ci matrix now 3.11/3.12/3.13/3.14.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Python 3.14 support (verified); range is now 3.11–3.14",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T00:19:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b8840002a4dcf82cf5787da5afeab6c69b98cdce",
          "body": "Support Python 3.11–3.13 (verified) + CI matrix",
          "is_bot": false,
          "headline": "Merge pull request #4 from binlecode/python-311-support",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T00:10:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "547eb7a84f6945471960515861a8983427e639cb",
          "body": "- requires-python lowered to >=3.11,<3.14 (verified: full suite, 86 passed,\n  incl. hardware/IOReport tests, on 3.11.14 — no 3.12+-only syntax/APIs).\n- Add trove classifiers for Python 3.11, 3.12, 3.13.\n- main-ci: matrix over 3.11/3.12/3.13 (was 3.13 only).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support Python 3.11–3.13; test the full range in CI",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-07-01T00:10:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cf634a5ae2f9dc2b48857f3baaba55091799f90e",
          "body": "Finalize tap-repo release flow + redaction pre-commit hook",
          "is_bot": false,
          "headline": "Merge pull request #3 from binlecode/release-arch-finalize",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-06-30T22:31:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1eb47ffa680e9d7f5b1ace6db76bdc6071b8637",
          "body": "- Remove in-repo Formula/actop.rb — the formula now lives solely in the tap repo\n  binlecode/homebrew-actop (single source of truth; synced on tag).\n- main-ci: drop formula parsing; install package + dev tools directly on\n  python@3.13 (matches the formula), run lint/format/test/smoke on push + PR.\n\n[…]\nprivate keys).\n- tag_release.sh + CLAUDE.md + GUIDE-cicd-release.md: document PR-only main,\n  tap-repo formula, PyPI OIDC publish.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Finalize tap-repo release flow; add redaction pre-commit hook",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-06-30T22:31:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20167536fba5778634650b7b0f4b641d7143138b",
          "body": "docs: mark rename roadmap done + record deviations",
          "is_bot": false,
          "headline": "Merge pull request #2 from binlecode/docs-rename-status",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-06-30T22:25:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fafa893d8acd229caf1a04b0c1a7845567bb4e59",
          "body": "Check off completed rename surfaces and note where execution diverged from the\nplan: clean break (no agtop alias), v1.0.0, actop_ metric prefix, formula moved\nto binlecode/homebrew-actop, strict PR-only main. Flag remaining release actions.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: mark Part A rename roadmap done; record deviations",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-06-30T22:25:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "12f342a5a2b137deced10356d15631277732992b",
          "body": "Rename agtop → actop (v1.0.0); enforce PR-only main",
          "is_bot": false,
          "headline": "Merge pull request #1 from binlecode/rename-to-actop",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-06-30T22:23:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f870207756523d85b962ef3c1220892bb4bfce7",
          "body": "- .githooks/pre-push: block direct pushes to main (core.hooksPath set locally)\n- main-ci: run on pull_request to main so PRs are validated\n- release-formula: sync formula into binlecode/homebrew-actop tap repo instead\n  of pushing to main (needs HOMEBREW_TAP_TOKEN secret). Keeps main strictly\n  PR-only while preserving automated brew releases.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Enforce PR-only main; move formula sync to separate tap repo",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-06-30T22:20:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8184b808f514c3c4338221eecc92a82c283f22cd",
          "body": "Whole-chip name (\"Apple Chip top\") and unblocks PyPI distribution. Clean\nbreak: no backward-compatible agtop command, module, or formula.\n\n- package: agtop/ -> actop/, entry actop/actop.py, AgtopApp -> ActopApp\n- pyproject: name/version/urls/scripts/packages -> actop, 1.0.0\n- Homebrew: Formula/actop\n[…]\n -> actop_\n- docs/README/CLAUDE: product name, module paths, asitop as inspiration only\n- LICENSE: sole copyright binlecode (2026)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rename agtop -> actop; bump to 1.0.0",
          "author_name": "Bin Le",
          "author_login": "binlecode",
          "committed_at": "2026-06-30T22:20:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ff8c81974e114d969af2a77aeb6c0bb969c4b44",
          "body": "Move the asitop lineage/IOReport internals below the fold and open with a\none-line value proposition, a \"who it's for\" section foregrounding the local\nLLM / MLX / CoreML profiling wedge, and a one-line install CTA. Add a\ndescriptive alt text on the hero image and a TODO to replace the static\nscreenshot with an animated capture.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: lead README with value prop + who-it's-for; add GIF placeholder",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T12:12:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "089a60eae485c76f9cc7fcaf25778d76f025b92b",
          "body": null,
          "is_bot": true,
          "headline": "Formula/agtop: sync v0.9.7 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-30T11:52:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94274402cdbd00f65dda7d1a6ebf096fc6e97dae",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.9.7",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T11:52:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd73e6a52f31f0be8c73a96bac7967ce99fe6ff8",
          "body": "The regex filter only applies to the process table, but / opened a dead\ninput box in t-off mode (the typed regex was stored yet never read, since\nthe polling loop skips process collection when the table is hidden).\n\nGate the toggle_filter binding via check_action so /  Filter is hidden from\nthe foot\n[…]\nresh_bindings on toggle). Also guard action_toggle_filter itself so the\ninput can't open with the table hidden via any entry path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Hide the / filter binding when the process table is off",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T11:51:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "988ba5565f20cacd771917c8e6dc09a05ac53317",
          "body": null,
          "is_bot": true,
          "headline": "Formula/agtop: sync v0.9.6 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-30T11:11:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a8db2e083d21578679ac0f555d5e18ea5991303",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.9.6",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T11:11:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5969caca1251556a7f8eea7a755b4cde7acda9c4",
          "body": "Pressing / opens a live regex filter; previously only Enter could close it\n(committing the typed pattern), with no way to cancel. Add an app-level\nescape binding wired to action_cancel_filter: it discards the in-progress\nedit, reverts the live-applied filter to the value active before the field\nwas \n[…]\no-op outside\nfilter mode. Matches the htop/vim/fzf cancel convention.\n\nAlso refresh images/agtop.png (resized to half dimensions).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Esc-to-cancel for the regex filter input",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T11:11:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "38883968bef1cc725af7484b94c83e71a21179fc",
          "body": "Make CLAUDE.md the single source of truth for repo guidelines.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Symlink AGENTS.md to CLAUDE.md; remove deprecated GEMINI.md",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T10:57:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "292cc975e00a9bb30c5a9a3bdaafbe147fb26907",
          "body": null,
          "is_bot": true,
          "headline": "Formula/agtop: sync v0.9.5 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-30T03:34:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54b4e43204e08a1b71393d49885131ed0a66c075",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.9.5",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T03:32:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "352b25945014023da2a625f286da655c994b6abe",
          "body": "Backfill from the pre-Textual layout: the header sub-title now always\nshows the core layout (e.g. \"Apple M4 Max · 4E+12P+40GPU\"), not just on\nthe init splash. E/P counts come from the config, GPU core count from\nsoc_info (get_gpu_cores_native); the +NGPU segment is omitted when the\nGPU count is unavailable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show SoC core topology persistently in the header",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T03:32:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6c3caaa77be4c3fde874ee20194c19322ee127fc",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: note agtop name origin (Apple GPU top) in README",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T03:17:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96e5935f65f1f4a0809d78edbe860c63c36cfa3d",
          "body": "Rewrite REVIEW-architecture-comparison.md as a current four-way review\n(agtop vs mactop v2, macmon, asitop) grounded in each tool's live repo;\ncorrect stale agtop claims (Textual not blessed/dashing, native libproc\nnot psutil, NDJSON+Prometheus export, ANE/bandwidth no longer unique).\n\nAdd a \"Why an\n[…]\nop's existence against the whole field — the programmable,\nPython-native profiler niche — plus a trimmed \"Where agtop fits\" table.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: refresh competitor comparison and justify agtop in README",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T03:14:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8974f70a69a789e1d4381378251bcf97c75e6f1f",
          "body": null,
          "is_bot": true,
          "headline": "Formula/agtop: sync v0.9.4 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-30T02:36:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d66e7577337b895647e876ff26fdf34dd9d7007",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.9.4",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T02:34:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8fc578f60072cdfebd43d1925b45e18f63a9071f",
          "body": "Name the proc_taskallinfo byte offsets as module constants with the\nstruct layout documented in one place, and surface the running macOS\nversion on offset drift so a new major reads as a version-coverage\ngap. Continue functional-only test refactors across the chart, TUI,\nand dashboard suites.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Pin native struct offsets and harden functional test suite",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T02:34:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5f13c8ba5de3bb41a55cfc4203fc3924de368ea8",
          "body": "Add a `uv tool install` section for non-Homebrew users — a sandboxed\nper-tool environment with its own managed CPython, no system Python\nrequired. Homebrew install instructions unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document uv install option",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T02:34:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "28f8fde68d9d2b51ee97f85c26484dfe3bd9b487",
          "body": "Sample total DRAM bandwidth in-process and unprivileged from the\nPMP/DCS BW group as a residency-weighted average over the AMCC\nbandwidth-bucket histogram (summed across memory-controller dies),\nexposed via SystemSnapshot.bandwidth_gbps. delta() gains an optional\nextract_states predicate so only the\n[…]\n always hidden. Per-agent breakdown intentionally omitted:\nthose channels hard-cap at 32 GB/s and cannot attribute high bandwidth.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add live memory bandwidth via IOReport PMP/DCS BW",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-30T02:30:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f8d491e8aca001e272e28bb009bc58b22a89583",
          "body": "…ed TODO\n\nAll Tier 1/Tier 2 items shipped in v0.9.3. Merge the durable rationale\n(bandwidth-aggregate limitation + per-channel breakdown stretch, and the\nnetwork/disk-I/O and per-process-attribution non-goals) into a new\nDESIGN-system §3.5, then remove the completed docs/TODO-metric-coverage.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fold metric-coverage rationale into DESIGN-system, drop complet…",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-29T15:32:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c7ee7f2deb1abd88f6075d08ec15d784ff726ee",
          "body": null,
          "is_bot": true,
          "headline": "Formula/agtop: sync v0.9.3 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T14:28:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4b6c2952bb629a3902475da36e6126a3e816740",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.9.3",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-29T14:28:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3568d45e10064fbbf75b515db19dadc40eafa5b8",
          "body": "Rewrite the CLAUDE.md testing rules into an enforceable policy with\nmechanical accept/reject criteria, binding to all tests (not just new\nones). Remove tests that violate it: test_dashboard_stats.py (private\nmath/state poking) and two private-function tests in\ntest_braille_chart_render.py. The avg/max windowing contract is now\ncovered functionally in test_dashboard_metrics.py.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Enforce functional-only testing and remove structural tests",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-29T14:16:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "06a5fa5695ab2bed1d0d5378cc30c30ad3181259",
          "body": "Close the Tier 1/Tier 2 metric-coverage gaps — all data already flowed\nthrough SystemSnapshot/Profiler but was never rendered:\n\n- Mem BW chart + label (GB/s, rolling avg/max), hidden when the platform\n  exposes no bandwidth channel.\n- Package Power chart + label for total-SoC draw.\n- Session energy \n[…]\ntests/test_dashboard_metrics.py, which mounts the real dashboard via\nTextual run_test() and drives the public update_metrics path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Surface memory bandwidth, package power, and session energy in the TUI",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-29T14:16:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aee8d7470fd429be52a716cf8bc45834a9db14fe",
          "body": "The render-style assertions compared against truecolor _pct_to_color() output,\nbut rendering is now color-tier aware: under CI (no TERM) the chart resolves to\nthe \"none\" tier and drops color, breaking the comparison. Pin the test chart to\nthe truecolor tier so the rendered styles are deterministic across terminals.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "tests: pin BrailleChart color tier in render tests",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-29T05:19:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6dc0d877d75873aa9036338bcfb465ed2f42a797",
          "body": null,
          "is_bot": true,
          "headline": "Formula/agtop: sync v0.9.2 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T05:15:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bde6933f931c1a601380e100f63286b74657885b",
          "body": "Tier 2 TUI modernization: color tier degradation + NO_COLOR, and chart\ntime-window label. Consolidate TUI design/impl into docs/DESIGN-system.md\n(Section 5) and remove the completed TODO-tui-modernization.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.9.2",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-29T05:15:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "89b0a4c8aab3744fbacbd7e079454332d09a4c4b",
          "body": null,
          "is_bot": true,
          "headline": "Formula/agtop: sync v0.9.1 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T04:05:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8de348955b8de34a4f326104c6d7918acff6186a",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.9.1",
          "author_name": "Bin Le",
          "author_login": null,
          "committed_at": "2026-06-29T04:05:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 20,
      "commits_last_year": 272,
      "latest_release_at": "2026-06-15T14:51:57Z",
      "latest_release_tag": "v0.8.6",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 44,
      "mean_days_between_releases": 11.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "actop",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "actop",
            "apple-silicon",
            "ioreport",
            "performance-monitor",
            "License :: OSI Approved :: MIT License",
            "Operating System :: MacOS",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.14"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/actop/",
          "is_deprecated": false,
          "latest_version": "1.4.14",
          "repository_url": "https://github.com/binlecode/actop",
          "versions_count": 21,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2580,
          "first_published_at": "2026-07-01T00:54:14.138485Z",
          "latest_published_at": "2026-07-29T18:28:50.730192Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 54777,
      "source_files_sampled": 44,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 12182
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 6,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "textual",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.60"
        },
        {
          "name": "rich",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=13.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "rich",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "textual",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "coremltools",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 6,
        "direct_count": 2,
        "indirect_count": 4
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 39,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "binlecode",
          "commits": 71,
          "avatar_url": "https://avatars.githubusercontent.com/u/938862?v=4"
        },
        {
          "type": "User",
          "login": "tlkh",
          "commits": 35,
          "avatar_url": "https://avatars.githubusercontent.com/u/5409617?v=4"
        },
        {
          "type": "User",
          "login": "TienTim",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/32588948?v=4"
        },
        {
          "type": "User",
          "login": "paul-nameless",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/40021956?v=4"
        },
        {
          "type": "User",
          "login": "Lunar-ZZ",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/95212758?v=4"
        },
        {
          "type": "User",
          "login": "ardacoskunses",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/20194446?v=4"
        },
        {
          "type": "User",
          "login": "iiSeymour",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/4310904?v=4"
        }
      ],
      "contributors_sampled": 7,
      "top_contributor_share": 0.587
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "main-ci.yml",
        "publish-pypi.yml",
        "release-formula.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
            "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/24 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 4 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "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": "30 commit(s) and 0 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 4,
            "reason": "security policy file 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": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "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": "8688f415465aeeaa6ca784b2e5ff2b246e97d0a8",
        "ran_at": "2026-07-29T18:31:05Z",
        "aggregate_score": 6.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-29T18:28:43Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-29T18:28:03Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/binlecode/actop",
    "host": "github.com",
    "name": "actop",
    "owner": "binlecode"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 65,
      "inputs": {
        "security": 65,
        "vitality": 78,
        "community": 42,
        "governance": 61,
        "engineering": 75
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 78,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 272,
              "human_commit_share": 0.92,
              "days_since_last_push": 0,
              "active_weeks_last_year": 8
            },
            "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": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "272 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 272
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 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": 20,
              "latest_release_tag": "v0.8.6",
              "releases_from_tags": false,
              "days_since_latest_release": 44,
              "mean_days_between_releases": 11.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "20 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 44 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 44
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~11.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 11.7
                    }
                  }
                ],
                "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": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 42,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "actop"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 2580
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,580 downloads/month across pypi",
                "points": 45.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2580,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 61,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 7,
              "top_contributor_share": 0.587
            },
            "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 59% of commits",
                "points": 9.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 59
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "7 contributors",
                "points": 9.5,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 39,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "39/40 decided PRs merged",
                "points": 37.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 39,
                      "decided": 40
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/24 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 49,
            "inputs": {
              "followers": 3,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "binlecode",
              "public_repos": 225,
              "account_age_days": 5482
            },
            "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": "3 followers of binlecode",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "binlecode"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "225 public repos, account ~15 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 225
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "actop"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "21 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 75,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "ane",
                "apple-silicon",
                "gpu-monitoring",
                "llm",
                "macos",
                "mlx",
                "ollama",
                "performance-monitoring",
                "python",
                "tui"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "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": 65,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 65,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 6.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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "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/24 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "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": "30 commit(s) and 0 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 2,
                "status": "partial",
                "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": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "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"
              ],
              "review_only_matches": 0,
              "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": "moderate",
        "name": "AI Readiness",
        "value": 59,
        "weight": 0,
        "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.924,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 12182
            },
            "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": "85 of 92 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 85,
                      "sampled": 92
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.73,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "73 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 73,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 54777,
              "source_files_sampled": 44,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/44 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 44,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "deps.dev does not index pypi:actop@1.4.14; advisories assessed against the repository dependency graph instead",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T18:31:25.737739Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/binlecode/actop.svg",
  "full_name": "binlecode/actop",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计PyPI.