Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 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 р.Переглянути на GitHub ↗

binlecode/actop має індекс здоров’я 65 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (78/100), найнижчий — Community & Adoption (42/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

65
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

65
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Bin LeОсобистий обліковий запис
3 підписники225 публічних репозиторіївз лип. 2011 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
PyPIactop1.4.142 580210 днів томуactopapple-siliconioreportperformance-monitor

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

78Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
5.5/36Ритм комітів — 8/52 тижнів із комітами
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
Як обчислюється оцінка
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
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateтак
Як обчислюється оцінка
45.5/80Щомісячні завантаження — 2 580 завантажень/місяць у pypi
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Вирішення issue — немає issue або даних
37.3/38.3Прийняття PR — злито 39/40 вирішених PR
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
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.

Власність та опіка

49У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
4.3/25Охоплення власника — 3 підписників у binlecode
25/25Послужний список — 225 публічних репозиторіїв, вік облікового запису ~15 р.
Використані вхідні дані
followers3
owner_typeUser
is_verified
owner_loginbinlecode
public_repos225
account_age_days5 482
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у pypi
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 21 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesactop
ecosystemspypi
any_deprecatedні
min_days_since_publish0

Інженерна якість

Чи наявні базові інженерні практики та документація?

75Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
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. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

59Помірний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 85 з 92 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,924
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes12 182
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
0/10Відтворюване середовище
10/10Підтверджена практика роботи з агентами — 73 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 1 з останніх 100 комітів — автоматичні оновлення залежностей
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Керовані розміри файлів — 0/44 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePython
largest_source_bytes54 777
source_files_sampled44
oversized_source_files0

Ключові факти

0зірок GitHub
7контриб'юторів
272комітів за останні 12 місяців
0днів від останнього пушу
20релізів
1бас-фактор
0відкритих issue
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 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
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.