Звіт у форматі 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"
}