原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [
"agent-swarms",
"agents",
"ai-agents",
"claude-code",
"codex",
"cursor",
"distributed-systems",
"llm",
"orchestration",
"sqlite"
],
"is_fork": false,
"size_kb": 5888,
"has_wiki": true,
"homepage": null,
"languages": {
"HTML": 19061,
"Shell": 1736,
"Python": 4341587,
"Makefile": 378,
"JavaScript": 5670,
"TypeScript": 4854
},
"pushed_at": "2026-07-30T19:50:49Z",
"created_at": "2026-05-06T18:35:01Z",
"owner_type": "User",
"updated_at": "2026-07-30T19:44:49Z",
"description": "Provider-neutral control plane for durable-state agent swarms: subprocess workers, leases, artifacts, memory, and deterministic stitching.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Python",
"significant_languages": [
"Python"
]
},
"owner": {
"blog": null,
"name": "Cary Palmer",
"type": "User",
"login": "professorpalmer",
"company": null,
"location": null,
"followers": 25,
"avatar_url": "https://avatars.githubusercontent.com/u/24235924?v=4",
"created_at": "2016-11-28T23:06:20Z",
"is_verified": null,
"public_repos": 32,
"account_age_days": 3530
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.21.5",
"kind": "patch",
"published_at": "2026-07-30T19:50:50Z"
},
{
"tag": "v1.21.4",
"kind": "patch",
"published_at": "2026-07-30T17:11:09Z"
},
{
"tag": "v1.21.3",
"kind": "patch",
"published_at": "2026-07-30T15:50:19Z"
},
{
"tag": "v1.21.2",
"kind": "patch",
"published_at": "2026-07-26T17:30:03Z"
},
{
"tag": "v1.21.1",
"kind": "patch",
"published_at": "2026-07-24T20:26:15Z"
},
{
"tag": "v1.21.0",
"kind": "minor",
"published_at": "2026-07-24T17:58:09Z"
},
{
"tag": "v1.20.10",
"kind": "patch",
"published_at": "2026-07-22T05:30:00Z"
},
{
"tag": "v1.20.9",
"kind": "patch",
"published_at": "2026-07-22T04:13:04Z"
},
{
"tag": "v1.20.8",
"kind": "patch",
"published_at": "2026-07-22T03:01:38Z"
},
{
"tag": "v1.20.7",
"kind": "patch",
"published_at": "2026-07-21T03:03:20Z"
},
{
"tag": "v1.20.6",
"kind": "patch",
"published_at": "2026-07-20T17:22:23Z"
},
{
"tag": "v1.20.5",
"kind": "patch",
"published_at": "2026-07-20T06:12:09Z"
},
{
"tag": "v1.20.3",
"kind": "patch",
"published_at": "2026-07-20T02:49:45Z"
},
{
"tag": "v1.20.2",
"kind": "patch",
"published_at": "2026-07-19T14:50:22Z"
},
{
"tag": "v1.20.1",
"kind": "patch",
"published_at": "2026-07-18T20:34:16Z"
},
{
"tag": "v1.20.0",
"kind": "minor",
"published_at": "2026-07-18T07:52:47Z"
},
{
"tag": "v1.19.16",
"kind": "patch",
"published_at": "2026-07-18T01:39:29Z"
},
{
"tag": "v1.19.15",
"kind": "patch",
"published_at": "2026-07-17T23:07:04Z"
},
{
"tag": "v1.19.14",
"kind": "patch",
"published_at": "2026-07-17T20:20:42Z"
},
{
"tag": "v1.19.13",
"kind": "patch",
"published_at": "2026-07-17T18:03:20Z"
},
{
"tag": "v1.19.12",
"kind": "patch",
"published_at": "2026-07-17T07:00:46Z"
},
{
"tag": "v1.19.11",
"kind": "patch",
"published_at": "2026-07-17T06:48:04Z"
},
{
"tag": "v1.19.10",
"kind": "patch",
"published_at": "2026-07-17T06:20:49Z"
},
{
"tag": "v1.19.8",
"kind": "patch",
"published_at": "2026-07-15T03:06:29Z"
},
{
"tag": "v1.19.7",
"kind": "patch",
"published_at": "2026-07-14T22:29:32Z"
},
{
"tag": "v1.19.6",
"kind": "patch",
"published_at": "2026-07-14T21:48:18Z"
},
{
"tag": "v1.19.5",
"kind": "patch",
"published_at": "2026-07-14T19:47:35Z"
},
{
"tag": "v1.19.4",
"kind": "patch",
"published_at": "2026-07-14T18:51:21Z"
},
{
"tag": "v1.19.3",
"kind": "patch",
"published_at": "2026-07-14T16:54:17Z"
},
{
"tag": "v1.19.2",
"kind": "patch",
"published_at": "2026-07-13T15:40:42Z"
},
{
"tag": "v1.19.1",
"kind": "patch",
"published_at": "2026-07-12T21:25:25Z"
},
{
"tag": "v1.19.0",
"kind": "minor",
"published_at": "2026-07-12T20:00:16Z"
},
{
"tag": "v1.18.1",
"kind": "patch",
"published_at": "2026-07-11T06:22:39Z"
},
{
"tag": "v1.18.0",
"kind": "minor",
"published_at": "2026-07-10T03:15:29Z"
},
{
"tag": "v1.17.0",
"kind": "minor",
"published_at": "2026-07-10T01:09:51Z"
},
{
"tag": "v1.16.0",
"kind": "minor",
"published_at": "2026-07-10T00:40:07Z"
},
{
"tag": "v1.15.0",
"kind": "minor",
"published_at": "2026-07-09T21:02:59Z"
},
{
"tag": "v1.14.2",
"kind": "patch",
"published_at": "2026-07-09T20:30:01Z"
},
{
"tag": "v1.14.1",
"kind": "patch",
"published_at": "2026-07-09T18:55:20Z"
},
{
"tag": "v1.14.0",
"kind": "minor",
"published_at": "2026-07-09T04:48:48Z"
},
{
"tag": "v1.13.0",
"kind": "minor",
"published_at": "2026-07-09T02:42:17Z"
},
{
"tag": "v1.12.1",
"kind": "patch",
"published_at": "2026-07-08T20:13:08Z"
},
{
"tag": "v1.12.0",
"kind": "minor",
"published_at": "2026-07-08T18:32:05Z"
},
{
"tag": "v1.11.1",
"kind": "patch",
"published_at": "2026-07-08T15:04:08Z"
},
{
"tag": "v1.11.0",
"kind": "minor",
"published_at": "2026-07-08T13:31:37Z"
},
{
"tag": "v1.10.3",
"kind": "patch",
"published_at": "2026-07-08T08:01:54Z"
},
{
"tag": "v1.10.2",
"kind": "patch",
"published_at": "2026-07-08T01:41:26Z"
},
{
"tag": "v1.10.1",
"kind": "patch",
"published_at": "2026-07-07T19:09:54Z"
},
{
"tag": "v1.10.0",
"kind": "minor",
"published_at": "2026-07-07T01:50:07Z"
},
{
"tag": "v1.9.0",
"kind": "minor",
"published_at": "2026-07-06T22:58:23Z"
},
{
"tag": "v1.7.0",
"kind": "minor",
"published_at": "2026-07-06T20:35:01Z"
},
{
"tag": "v1.5.1",
"kind": "patch",
"published_at": "2026-07-06T19:15:23Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2026-07-06T19:15:06Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-07-05T07:42:34Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-07-04T08:16:32Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2026-07-03T18:04:30Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-07-03T16:42:37Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2026-07-03T09:06:24Z"
},
{
"tag": "v0.9.102",
"kind": "patch",
"published_at": "2026-07-03T03:31:07Z"
},
{
"tag": "v0.9.101",
"kind": "patch",
"published_at": "2026-07-02T18:52:40Z"
},
{
"tag": "v0.9.100",
"kind": "patch",
"published_at": "2026-07-02T17:50:24Z"
},
{
"tag": "v0.9.99",
"kind": "patch",
"published_at": "2026-07-02T16:27:39Z"
},
{
"tag": "v0.9.98",
"kind": "patch",
"published_at": "2026-07-02T08:02:08Z"
},
{
"tag": "v0.9.97",
"kind": "patch",
"published_at": "2026-07-02T06:46:08Z"
},
{
"tag": "v0.9.95",
"kind": "patch",
"published_at": "2026-07-01T20:11:12Z"
},
{
"tag": "v0.9.93",
"kind": "patch",
"published_at": "2026-06-30T15:34:34Z"
},
{
"tag": "v0.9.92",
"kind": "patch",
"published_at": "2026-06-30T05:33:32Z"
},
{
"tag": "v0.9.91",
"kind": "patch",
"published_at": "2026-06-30T03:44:56Z"
},
{
"tag": "v0.9.90",
"kind": "patch",
"published_at": "2026-06-30T01:43:04Z"
},
{
"tag": "v0.9.89",
"kind": "patch",
"published_at": "2026-06-29T14:48:08Z"
},
{
"tag": "v0.9.88",
"kind": "patch",
"published_at": "2026-06-29T14:31:17Z"
},
{
"tag": "v0.9.87",
"kind": "patch",
"published_at": "2026-06-28T02:08:25Z"
},
{
"tag": "v0.9.86",
"kind": "patch",
"published_at": "2026-06-28T01:07:48Z"
},
{
"tag": "v0.9.85",
"kind": "patch",
"published_at": "2026-06-25T04:55:22Z"
},
{
"tag": "v0.9.84",
"kind": "patch",
"published_at": "2026-06-25T04:45:01Z"
},
{
"tag": "v0.9.83",
"kind": "patch",
"published_at": "2026-06-24T15:58:25Z"
},
{
"tag": "v0.9.82",
"kind": "patch",
"published_at": "2026-06-24T15:31:50Z"
},
{
"tag": "v0.9.81",
"kind": "patch",
"published_at": "2026-06-24T06:30:04Z"
},
{
"tag": "v0.9.80",
"kind": "patch",
"published_at": "2026-06-24T05:36:16Z"
},
{
"tag": "v0.9.79",
"kind": "patch",
"published_at": "2026-06-23T23:52:01Z"
},
{
"tag": "v0.9.78",
"kind": "patch",
"published_at": "2026-06-23T23:13:26Z"
},
{
"tag": "v0.9.77",
"kind": "patch",
"published_at": "2026-06-19T08:13:32Z"
},
{
"tag": "v0.9.76",
"kind": "patch",
"published_at": "2026-06-19T08:13:31Z"
},
{
"tag": "v0.9.75",
"kind": "patch",
"published_at": "2026-06-19T08:13:30Z"
},
{
"tag": "v0.9.74",
"kind": "patch",
"published_at": "2026-06-19T08:13:23Z"
},
{
"tag": "v0.9.73",
"kind": "patch",
"published_at": "2026-06-19T08:13:22Z"
},
{
"tag": "v0.9.71",
"kind": "patch",
"published_at": "2026-06-18T19:52:00Z"
},
{
"tag": "v0.9.70",
"kind": "patch",
"published_at": "2026-06-19T08:13:21Z"
},
{
"tag": "v0.9.67",
"kind": "patch",
"published_at": "2026-06-18T02:59:16Z"
},
{
"tag": "v0.9.66",
"kind": "patch",
"published_at": "2026-06-18T02:24:56Z"
},
{
"tag": "v0.9.65",
"kind": "patch",
"published_at": "2026-06-18T02:14:18Z"
},
{
"tag": "v0.9.64",
"kind": "patch",
"published_at": "2026-06-18T01:47:36Z"
},
{
"tag": "v0.9.63",
"kind": "patch",
"published_at": "2026-06-18T01:15:05Z"
},
{
"tag": "v0.9.62",
"kind": "patch",
"published_at": "2026-06-18T00:22:26Z"
},
{
"tag": "v0.9.61",
"kind": "patch",
"published_at": "2026-06-17T23:09:33Z"
},
{
"tag": "v0.9.60",
"kind": "patch",
"published_at": "2026-06-17T22:59:00Z"
},
{
"tag": "v0.9.59",
"kind": "patch",
"published_at": "2026-06-17T21:27:41Z"
},
{
"tag": "v0.9.58",
"kind": "patch",
"published_at": "2026-06-17T20:42:58Z"
},
{
"tag": "v0.9.56",
"kind": "patch",
"published_at": "2026-06-17T18:08:30Z"
},
{
"tag": "v0.9.55",
"kind": "patch",
"published_at": "2026-06-17T17:10:45Z"
}
],
"recent_commits": [
{
"oid": "25a1772daf34347583ea9964e95109dca55ce24a",
"body": "Detect contradictory findings before synthesis, preserve explicit acceptance criteria, and attach truthful execution provenance so audit summaries fail visibly instead of presenting incompatible facts.",
"is_bot": false,
"headline": "feat: reconcile swarm evidence and provenance",
"author_name": "Cary Palmer",
"author_login": null,
"committed_at": "2026-07-30T19:44:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6288d83d9033e26461377f760634197be318f096",
"body": "Close exclusive config handles before unlinking failed writes so Windows does not leave stale partial launch state.",
"is_bot": false,
"headline": "fix: clean partial run files on Windows",
"author_name": "Cary Palmer",
"author_login": null,
"committed_at": "2026-07-30T17:07:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "574b29383313c4f061ab4037ea14f2d4a9e6cb82",
"body": "Reserve collision-proof run IDs and paths across MCP, CodeGraph, and swarm launches so same-millisecond workers cannot overwrite logs or collapse onto one job.",
"is_bot": false,
"headline": "fix: prevent concurrent detached launch collisions",
"author_name": "Cary Palmer",
"author_login": null,
"committed_at": "2026-07-30T17:02:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "504596590f618a3f4e51276a6dd4782dfd4d1afb",
"body": "Assert against the bytes actually written so Windows CRLF does not invalidate the release gate while preserving byte-accurate fingerprint coverage.",
"is_bot": false,
"headline": "fix: make validation fingerprint test line-ending agnostic",
"author_name": "Cary Palmer",
"author_login": null,
"committed_at": "2026-07-30T15:46:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "79308e55d1a1e4b059f7a1de6a313b676eaf2987",
"body": "Give hosts stable validation fingerprints, honest reuse lineage, selective invalidation, and compact artifact references so unchanged findings can be reused without presenting stale evidence as fresh.",
"is_bot": false,
"headline": "Release v1.21.3: add dependency-aware validation reuse.",
"author_name": "Cary Palmer",
"author_login": null,
"committed_at": "2026-07-30T15:42:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e20a022d4f4a3e32043f539ca442da34f085c95",
"body": "…uts.",
"is_bot": false,
"headline": "Release v1.21.2: analyze-mode read-only git for behind-origin checko…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-26T17:25:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d32a59c14d4a817ec7ea0f00b3a86b25b082fe3",
"body": "…arionette.\n\nWhen MARIONETTE_TRACKABLE_SWARMS=1, call_tool blocks job-creating MCP verbs so\nCursor Agent cannot bypass the Swarm Tracker. Shell swarm remains the path.",
"is_bot": false,
"headline": "Release v1.21.1: hard-refuse untracked MCP start_*/implement under M…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-24T20:22:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fc56cf67339c7d629e9da182cb5a83e776ad5db8",
"body": "Near-Fable intelligence at half Fable price ($5/$25); tip-of-stack default with Fable retained as absolute tip.",
"is_bot": false,
"headline": "Release v1.21.0: Claude Opus 5 everyday frontier.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-24T17:54:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "535c23711ae7bb278777e5ba3c6806051f888019",
"body": "Harden CodeGraph UTF-8 console I/O on Windows so symbol queries and markdown passthrough survive cp1252.",
"is_bot": false,
"headline": "Release v1.20.10.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-22T05:26:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43b8c1912badb76c10405359f70c070344376791",
"body": "Passthrough writes no longer die on cp1252; decode/provision/repair paths use utf-8, and child env pins PYTHONUTF8.",
"is_bot": false,
"headline": "Harden CodeGraph UTF-8 on Windows consoles.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-22T05:13:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19089f1b24c77e36ebf9254cef8f4f610c488b34",
"body": "…pin ROUTING.",
"is_bot": false,
"headline": "Release v1.20.9: Muse Spark tool_choice auto-only, reasoning replay, …",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-22T04:09:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9bff23fab98eb4ac6f7e8f1842c04ef008b9db6c",
"body": "Bare --model merges registry payload_defaults (provider); analyze forces a last-chance submit so OpenRouter Muse smokes emit typed FINDINGs.",
"is_bot": false,
"headline": "Release v1.20.8: agentic pin defaults + max-turns submit_findings.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-22T02:57:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fb62e70795c7abaf5bd2596fcebf1fa493714ada",
"body": "Raise the detach handshake timeout and force unbuffered launcher stdout so slow Windows CI/import cannot flake the start_* tools. Leaves PyPI 1.20.6 untouched.",
"is_bot": false,
"headline": "Release v1.20.7: harden MCP early job_id wait on Windows.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-21T02:59:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7455a74e5446b4e729871210fc537b0cde4135e5",
"body": "Prevent start_cursor_swarm from silently hopping to agentic/minimax when vision tags reject cursor models.\n\nEOF",
"is_bot": false,
"headline": "Release v1.20.6: pin allowed_adapters on cursor analysis swarms.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-20T17:15:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31c3a7ad898a0b6ea640715214c5316a7a54d0c4",
"body": "Add puppetmaster swarm twin of start_cursor_swarm (detach + job_id), share builder with MCP, and document the zero-archaeology fallback.",
"is_bot": false,
"headline": "Release v1.20.5 one-command CLI swarm fallback for MCP drops.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-20T06:06:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "57e73e12a0f64eacda593afc809499e4e0cb9e6f",
"body": "Align Status/index/CHANGELOG and Windows console ownership notes; no runtime behavior change.",
"is_bot": false,
"headline": "Release v1.20.4 docs freshness for the 1.20.x line.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-20T05:55:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5432f7832122ce3ce86a13085ab5bbb5ac2ae97c",
"body": null,
"is_bot": false,
"headline": "Release v1.20.3 verified Bedrock routing.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-20T02:42:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a6cc96b8a615387bd1d7b30950b1da7f6e8ddf84",
"body": "Persist credential-scoped health across workers so stale AWS profiles cannot repeatedly route jobs into 403 failures, while preserving explicit recovery and truthful discovery diagnostics.",
"is_bot": false,
"headline": "Make Bedrock routing depend on verified invoke health",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-20T02:41:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c6c470c5f45e04601c4d61342b85baf143f2ec3",
"body": null,
"is_bot": false,
"headline": "Release v1.20.2 constrained model routing.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-19T14:46:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d05d820dbb76a370ab6fa9b3713e105a7afcd131",
"body": "Document and version the durable execution, bounded context, provider resilience, and Windows cleanup improvements.",
"is_bot": false,
"headline": "Release v1.20.1 reliability hardening.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-18T20:31:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "185e8e808d289c48ce926de2d76dcf36070fbdf6",
"body": "Add bounded artifacts and tool contexts, optimistic edits, provider admission control, SQLite operational checks, and hermetic cross-platform regression coverage.",
"is_bot": false,
"headline": "Harden durable agent execution and recovery.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-18T19:47:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e5a4031ed26b9c4df26547625643f3901c31b46",
"body": "Add persisted provenance edges, graph-aware prewalk verification, and cross-adapter safety while hardening Windows subprocess and model pin behavior.",
"is_bot": false,
"headline": "Release v1.20.0: durable execution graph and Windows reliability",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-18T07:47:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5f54589fe0ca3f82475aa3366ca6b4a8d7ba1a72",
"body": "…hoot\n\nA worker whose one giant reasoning turn leapt past the whole token budget\nskipped the submit-reserve zone entirely and died at stop:token_budget with\nno findings. The budget governor now checks the force-submit reserve BEFORE\nthe hard budget break at all three sites, guaranteeing exactly one forced\nsubmit turn on exhaustion without a prior attempt.",
"is_bot": false,
"headline": "Release v1.19.16: force-submit fires even on single-turn budget overs…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-18T01:33:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "34cdc1854fafdcfa9c7f18ccc565d83aa3965f52",
"body": "…urn tool nudge",
"is_bot": false,
"headline": "Release v1.19.15: force-submit budget reserve, reasoning cap, first-t…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-17T23:00:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a4082f6f0abb222bbdb0319208b2ac50b6f91783",
"body": "…apable routing",
"is_bot": false,
"headline": "Release v1.19.14: fail fast on non-tool-calling models; prefer tool-c…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-17T20:08:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cae194d8fac7d6ffa42e7481da4e35cad36c65a7",
"body": "…flood fix)",
"is_bot": false,
"headline": "Release v1.19.13: non-interactive git in worker env (Windows console-…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-17T17:59:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f8fb294794d2113d967a0d6f016338287a5a4d7",
"body": "…bprocess env",
"is_bot": false,
"headline": "Force non-interactive git (no pager, no terminal prompt) in worker su…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-17T17:33:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41f99478a3f4b5bba8b8b5d90a7df2ca49b0b718",
"body": "Preserve stale Cursor registry entries during normal refreshes so catalog\nupdates cannot silently change routing; require --prune for intentional removal.",
"is_bot": false,
"headline": "Release v1.19.12: make catalog pruning explicit",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-17T06:55:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ddb9ff5445ac6180d6da7c9fdc3b3dd527ec63f",
"body": "Add probe-only catalog snapshots, stable pending diffs, cached preflight membership checks, and explicit apply semantics so model updates are visible without silently changing routing. Keep Cursor SDK state isolation opt-in and preserve nominal pool pricing across subscription harnesses.",
"is_bot": false,
"headline": "Release v1.19.11: cross-adapter catalog freshness",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-17T06:43:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3aebee13d26606fd225d81eaa8c6ae75c3ab7436",
"body": "Update the current Cursor model defaults and use public nominal usage rates to route plan-covered models without treating every tier as equally costly. Include catalog drift warnings and the multi-worker Cursor reliability fixes.",
"is_bot": false,
"headline": "Release v1.19.10: price-aware Cursor routing",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-17T06:17:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03cf3583f19c0e78bca186b74cb3af5720ec131c",
"body": "…ild.\n\nLets Marionette request Claude extended thinking on Bedrock without a post-build stamp race.",
"is_bot": false,
"headline": "Forward additionalModelRequestFields through Bedrock Converse body bu…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-16T03:45:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "94ce46242961c26522cee956f06eff82700a55dd",
"body": "…kers.",
"is_bot": false,
"headline": "Release v1.19.8: Hashline edits and mtime read cache for agentic wor…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-15T03:02:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9fa5c6ea575a8b53d84cc84490db003abec2c926",
"body": "…kers.\n\nOMP-inspired surgical edit format with stale-tag rejection, tagged read_file, apply_hashline tool, and fs_cache — keeps edit_file as fallback. Kill switches PUPPETMASTER_HASHLINE / PUPPETMASTER_FS_CACHE.",
"is_bot": false,
"headline": "Add Hashline content-hash edits and mtime read cache for agentic wor…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-15T03:01:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81f30bc3fd8f468128452cc8b0263c0dea0993cb",
"body": "Parallel-safe tool runs in a mixed batch execute concurrently while barrier\ntools and submit/plan preserve emission order. Kill switch\nPUPPETMASTER_TOOL_BATCH_PARALLEL=0.",
"is_bot": false,
"headline": "Add Hermes-style segmented tool-batch concurrency for agentic workers.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T22:26:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "751aa65680b25ba190046ff78bbc18f0aff45914",
"body": null,
"is_bot": false,
"headline": "Docs: CHANGELOG for v1.19.6 same-adapter model fallback.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T21:48:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "55b0f1019f51c6cec40e8ed961bf9344519ebf13",
"body": null,
"is_bot": false,
"headline": "Fix same-adapter fallback test: stub CLI present + platform lock on CI.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T21:40:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c13459664bf78e9099e6cf74eda964e68ddea7dc",
"body": "…orm funded.\n\nKeeps billing recovery on a different platform when available; model_unavailable\nstill recovers on a single funded adapter.",
"is_bot": false,
"headline": "Prefer cross-adapter fallback; same-adapter only when no other platf…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T21:36:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72b9cba444fbba1178c7c9c24a7a245fcd56b037",
"body": "When only one platform is funded, auto-fallback can re-route to another\nregistry model on the same adapter instead of giving up. Tracks tried_models.",
"is_bot": false,
"headline": "Allow same-adapter model fallback on model_unavailable / rate_limit.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T21:36:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "102ab6fb3aafbcca2db5af4aab466c1df8818a15",
"body": "…count.\n\nRegression coverage for plan=quality (deliberate) vs implement=cheap (savings)\non the existing ledger; FEATURES notes prewalk is counted.",
"is_bot": false,
"headline": "Test: prewalk jobs attribute ROUTING savings per-leg without double-…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T20:07:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "150ac4eb1a7172b229ee2147a448533e458f09b9",
"body": "Explore/test stay cheap and review/redteam stay quality under auto_route\nwithout pinning models (OMP modelRoles analogue for durable swarms).",
"is_bot": false,
"headline": "Release v1.19.5: per-role swarm routing_policy defaults.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T19:44:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0975969e66ed447332eea459b13f380ba551ccc1",
"body": null,
"is_bot": false,
"headline": "Docs: CHANGELOG + FEATURES for v1.19.4 prewalk.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T18:47:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9fc109adbae789a5968a06ce7c6c05cc7da60d51",
"body": "…njection.\n\nAdds `puppetmaster prewalk` / MCP start_prewalk: quality plan worker then\ncheap implement via depends_on_roles, injecting plan/decision artifacts\ninto implement prompts at runtime for durable low-cost handoff.",
"is_bot": false,
"headline": "Release v1.19.4: plan-then-cheap prewalk (OMP-style) with artifact i…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T18:46:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "71c1a8056bbe6ee2f97b107bce3953c194033db0",
"body": "No runtime change — PyPI 1.19.3 already published.",
"is_bot": false,
"headline": "Docs: Status at v1.19.3; ConverseStream in FEATURES and source map.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T17:35:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8656bff26952b8f8162948a2ee3c0076697d15a1",
"body": null,
"is_bot": false,
"headline": "Fix CHANGELOG header placement for v1.19.3.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T16:49:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce52fdc8b76f462f36d8af5fbb5da9073d01fbed",
"body": null,
"is_bot": false,
"headline": "Release v1.19.3: Bedrock ConverseStream for live chat deltas.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-14T16:49:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "74492f548b5b4267fd5936cdd4736e843d05eab7",
"body": "Registry effort=<level> on claude-code entries, wizard effort variants,\npuppetmaster claude --effort flag. Escalating effort composes from effort\nvariants + existing escalation policies (documented in MODEL_ROUTING.md).",
"is_bot": false,
"headline": "Release v1.11.0: Claude Code effort levels (issue #15)",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-13T15:36:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eedbee2d797d110101555bf3d63ea9a9195665cf",
"body": "Keep default swarms read-only through routing",
"is_bot": false,
"headline": "Merge pull request #18 from mrcs64/fix/default-swarms-read-only",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-13T15:32:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "57fc70ff199cd66979f38c0356a239369fe7a985",
"body": "… MCP swarms.\n\nEOF",
"is_bot": false,
"headline": "Share ANALYSIS_NO_EDIT_PAYLOAD between DEFAULT_WORKERS and generated…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-13T15:32:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3323b24e22e91b0c75877c42a088df13109b6262",
"body": null,
"is_bot": false,
"headline": "Keep default swarms read-only",
"author_name": "mrcs64",
"author_login": "mrcs64",
"committed_at": "2026-07-13T07:27:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63414edf5d93bbf543cee659c91593d0d9b0a706",
"body": "… cost parity.\n\nAccount discovery, multi-family Converse, cachePoint metering, and docs so Bedrock matches other providers on tokens/savings/price_job.",
"is_bot": false,
"headline": "Release v1.19.1: Bedrock Converse daily driver with prompt cache and…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-12T21:19:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5aa83235fa45b6d089c0206a833460cd2555d226",
"body": "Stdlib InvokeModel client (bearer or SigV4, no boto3) plus Windows Hermes effort-home credential copy fallback.",
"is_bot": false,
"headline": "Release v1.19.0: AWS Bedrock as a first-class agentic provider (BYOK).",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-12T19:56:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e54431bedb77231ef12adf0466069f7090dd057",
"body": "…patches.",
"is_bot": false,
"headline": "Fix WindowsPath crash in _windows_spawn_safe under POSIX CI os.name …",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-11T06:19:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e077909a7e18bd71a5b7d180a2001f7a77e4a2e1",
"body": "… npm-shim layout.\n\nBare codegraph.CMD/npx.CMD could not be CreateProcess-spawned from Marionette; prefer node+npm-shim.js and route .cmd through COMSPEC /c.",
"is_bot": false,
"headline": "Release v1.18.1: Fix Windows CodeGraph WinError 2 for .cmd shims and…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-11T06:15:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9597e5beb54d95d3240a15a8a10421c905de3e8b",
"body": "… BYOK.\n\nClaude breakpoints (system, tools, history) default to ttl:1h; Qwen ephemeral; automatic providers unmarked.",
"is_bot": false,
"headline": "Release v1.18.0: AGNT-style all-1h Anthropic prompt cache for agentic…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-10T03:07:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f337f4aa12a1542f4b42524f8b0cd7cf13bbb8c",
"body": "Stamp cache_control on OpenRouter Claude (1h/5m) and Qwen; sticky session_id.\nAutomatic providers unchanged.",
"is_bot": false,
"headline": "Release v1.17.0: OpenAI-wire Claude/Qwen explicit prompt cache.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-10T01:03:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63d25e193bfa5cb25ca857f8d236916f9736162e",
"body": "Stable system+tool breakpoints use ttl=1h; moving history stays default 5m.\nOverride with PUPPETMASTER_ANTHROPIC_CACHE_TTL=5m|off.",
"is_bot": false,
"headline": "Release v1.16.0: Anthropic cache 1h stable / 5m history split.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-10T00:33:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d339574c726c7c194d38b63697b42165416758f",
"body": "CLI receipt + MCP puppetmaster_job_receipt; PATCH counts as typed yield.",
"is_bot": false,
"headline": "Release v1.15.0: objective job run-efficiency receipts.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T20:59:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5bb35ee15930faaedff566e2250f283c6628284",
"body": "Receipt command + polish (PATCH typed, MCP tool, 3.9 annotations).",
"is_bot": false,
"headline": "Merge pull request #17 from kbentonferguson/bferguson/job-run-receipt",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T20:59:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8a843cb7f4ae8f0bcd65d3bf5390235b7466759f",
"body": "Implement jobs were scored as zero-typed without PATCH. Add puppetmaster_job_receipt MCP parity with cost, drop unused datetime imports, and use Optional for the 3.9 floor.",
"is_bot": false,
"headline": "Polish receipt: count PATCH as typed, MCP tool, 3.9-safe annotations.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T20:53:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b549993fc74eaef0f42d14265db71c1d41afa19e",
"body": "…ests",
"is_bot": false,
"headline": "Add `receipt` command for job run-efficiency metrics and supporting t…",
"author_name": "kbentonferguson",
"author_login": "kbentonferguson",
"committed_at": "2026-07-09T20:52:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05c79a0d54003ed866209edbf41a4aa99df30b33",
"body": "Ship Sol/Terra/Luna across starter + curated catalogs; only unwrap Codex-style wrappers when top-level type is absent so typed artifacts are not clobbered.",
"is_bot": false,
"headline": "Release v1.14.2: GPT-5.6 catalog and safer nested artifact unwrap.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T20:25:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91223c7654956ccdce79036d2b711c8d845560d3",
"body": "…-salvage\n\nHandle nested wrappers as structured artifacts",
"is_bot": false,
"headline": "Merge pull request #16 from kbentonferguson/fix/codex-structured-json…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T20:18:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f2bd7ea256fcbf2e21710c0bff1be15924f78b08",
"body": null,
"is_bot": false,
"headline": "Handle nested wrappers as structured artifacts",
"author_name": "kbentonferguson",
"author_login": "kbentonferguson",
"committed_at": "2026-07-09T19:13:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "239615ceafb9a32f2d9cbf615eb1c04570dad022",
"body": "Prefer router-fallback/escalation and the best usage record so a failed\nplan-billed Cursor attempt no longer zeros a successful agentic run.",
"is_bot": false,
"headline": "Release v1.14.1: price final routing after fallback.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T18:51:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b36270d2ca8cca451394667b68e890c8361572f2",
"body": null,
"is_bot": false,
"headline": "Repair v1.14.0 CHANGELOG backticks after escape mangling.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T04:44:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "27c72b956b4b4251a495c2b8c89b36c1aa770bfd",
"body": "Restore UTF-8 em dashes and drop the BOM introduced by the release bump write.",
"is_bot": false,
"headline": "Fix CHANGELOG encoding for the v1.14.0 section.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T04:42:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "303dd30bb8cb5b92e5af16c79d725c8abaf8af39",
"body": "Savings-gated tool-output offload, turn/budget history compaction, and per-job shared CodeGraph/repo brief for swarm subprocesses.",
"is_bot": false,
"headline": "Release v1.14.0: worker thrift (offload, compaction, job brief).",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T04:41:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b59b14ce051a95c2c80b679f1278bb2b30178dc1",
"body": "Resolve briefs via sidecar/job-dir scan only so adapter stream tests stay hermetic, and use a portable verify command on Windows.",
"is_bot": false,
"headline": "Avoid git probes on the job-brief prompt path.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T04:41:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5d4deaab9ec1470b92e52e64d895a7f92dc7de26",
"body": "Compute census + goal CodeGraph once at job start, persist under the job dir, and inject identical bytes before each task instruction.",
"is_bot": false,
"headline": "Add per-job shared CodeGraph/repo brief for sibling workers.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T04:35:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6646448a2ea478739354ed353e61aee9715ec0cc",
"body": "Stub older tool results after N turns or over budget while keeping the static system prefix cache-stable.",
"is_bot": false,
"headline": "Add turn-count history compaction for long agentic workers.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T04:28:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f911f68ee94dd14474dc3f69982a6da47d99510",
"body": "Spill large tool results to durable blobs with head/tail previews and measured ledger credit instead of blunt 12k truncation.",
"is_bot": false,
"headline": "Add savings-gated tool-output offload for agentic swarm workers.",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T04:20:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "60810dba528dbc92d2c1401d47afb8097421728c",
"body": "test_anthropic_wire_normalizes_blocks still expected a bare system string;\nprompt-cache wrapping emits a text block with ephemeral cache_control.",
"is_bot": false,
"headline": "Fix anthropic wire test for cache_control system blocks",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T02:39:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "add741e654980595c56f85b950086abbd1b34b9d",
"body": "Read-modify-write platform lock so Marionette's harness_initialized marker\nsurvives platform enable. Anthropic cache_control breakpoints and static-first\nworker prompt assembly for cross-worker prefix caching.",
"is_bot": false,
"headline": "v1.13.0: platform.json foreign-key preserve + swarm prompt-cache lifts",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T02:31:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b0e9f1211d392fe11ce56ef2818643e03d9eceb",
"body": "…form.json shared with Marionette)",
"is_bot": false,
"headline": "platform_lock: preserve foreign keys on write (read-modify-write plat…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T00:42:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b7fb660be1255f8971437c30119133f327a8354d",
"body": "…olling history markers, PUPPETMASTER_PROMPT_CACHE kill switch, cache_write_tokens usage)",
"is_bot": false,
"headline": "Anthropic prompt-cache breakpoints in provider_chat (system+tools+2 r…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T00:40:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e7b2749b93f5dde9098096008480341652963f5e",
"body": "Invert prompt assembly to static-first / instruction-last so sibling\nswarm workers open with an identical, provider-cacheable prefix:\n\n- _prompts.py: builders emit boilerplate/contracts first and the task\n instruction last under a stable \"Your task:\" header; census, memory,\n and skill sections ins\n[…]\nn resolved cwd + task + max_nodes) so a swarm does not\n re-run the CodeGraph CLI per worker.\n- New tests in tests/test_prompt_prefix.py including a shared-prefix\n property test across sibling tasks.",
"is_bot": false,
"headline": "Static-first worker prompt assembly for cross-worker prompt caching",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-09T00:24:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "81e2f011e1b9b042f84aab4aff6379170436282f",
"body": "Grok 4.5 at capability 97 clears PLAN_FRONTIER_MIN_CAPABILITY (85), so\ntests that only stripped cursor/fable-5 no longer exercised the\nno-frontier discovery path. Strip every plan-billed model at/above the\nfrontier floor instead.",
"is_bot": false,
"headline": "Fix plan-catalog thin-starter fixtures after Grok 4.5",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T20:08:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "13575748ecd0b15d86dd32b749ad3b4647338d9d",
"body": "Add cursor/grok-4-5 (capability 97) as the plan-billed Opus-class\nworkhorse under Fable/Opus tip-of-stack, and treat sdk_not_installed\nfast-fails as FAILED tasks so dead Cursor runs stop reading green.",
"is_bot": false,
"headline": "Release v1.12.1: Grok 4.5 Cursor workhorse + sdk_not_installed truth",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T20:02:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6377666d6cfa82342f4bf0a58654ddcfe0c4cb0c",
"body": null,
"is_bot": false,
"headline": "Docs: document the three-layer platform lock enforcement (v1.12.0)",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T19:21:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0330a4cb5b888fbcaf2baf3d2b1c6ed8d124ac10",
"body": "Dead swarms now read FAILED instead of green: no_model/unknown_provider\nfast-fails mark the task FAILED (and become re-routable), and a job whose\nevery task failed finishes FAILED with a job.all_tasks_failed event\ninstead of stitching into a healthy-looking COMPLETE at $0. Pairs with\nthe platform-lock kernel gate + MCP verb preflight landed in 9c7e40c.",
"is_bot": false,
"headline": "Release v1.12.0: platform lock everywhere, truthful dead-swarm status",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T18:28:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9c7e40c905583492da079461502c9bd3487f89de",
"body": "A platform-locked host could still run work on a disabled adapter: only\nrouting consulted the lock, so a verb with a hardcoded adapter (e.g.\nstart_cursor_swarm) sailed through when the router hit no-eligible-model\nand passed the spec to dispatch unchanged. Field report: an agentic-only\nlock executed\n[…]\n run+\n start variants, start_cursor_swarm, start_swarm's explicit adapter)\n fail fast with the enabled set and remediation before spawning.\n\nInternal adapters (local, shell) remain exempt as before.",
"is_bot": false,
"headline": "Enforce platform lock at task creation and MCP verb preflight",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T16:30:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1a23c271433301564f28d60b4433c6f6baabcf14",
"body": null,
"is_bot": false,
"headline": "Release v1.11.1: cancelled job status, poison-proof store reads",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T14:59:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14956fddccc41a12663505409e8b50002aa69f16",
"body": "Hosts (Marionette's cancel endpoint, manual store repairs) write\n'cancelled' into job rows; JobStatus had no such member, so ONE row\npoisoned list_jobs() for the whole store with ValueError -- every\nreader (including Marionette's swarm tracker) saw an empty feed.\n\n- JobStatus.CANCELLED: first-class \n[…]\ninal status (await/gc/lifecycle\n terminal sets updated).\n- job_from_dict coerces unknown statuses to STALLED instead of raising,\n so a status written by a newer host can never blank an older reader.",
"is_bot": false,
"headline": "Add JobStatus.CANCELLED and tolerant status deserialization",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T14:57:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1317e2d6f797926c9cc89dde1a6752a89f8dfafe",
"body": "Registry effort=<level> on claude-code entries, wizard effort variants,\npuppetmaster claude --effort flag. Escalating effort composes from effort\nvariants + existing escalation policies (documented in MODEL_ROUTING.md).",
"is_bot": false,
"headline": "Release v1.11.0: Claude Code effort levels (issue #15)",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T13:17:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14b3a334ade14ecca889564ba2f7cf976ca12ae4",
"body": "… claude --effort flag (#15)\n\nClaude Code >= 2.1.204 exposes --effort low/medium/high/xhigh/max, so drop\nthe hard claude-code rejection in model_payload_defaults_for_effort and map\neffort to extra_args the adapter already passes through to the CLI. The\nwizard offers claude-code effort variants; pupp\n[…]\nfort ships as composition, not a new policy: effort variants\nare registry rows, so the escalating policy and confidence/review-gate\nescalation already walk the ladder (documented in MODEL_ROUTING.md).",
"is_bot": false,
"headline": "Claude Code effort levels: registry effort=<level>, wizard variants,…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T09:18:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5090e80632b4095edee81f8481bd60c0072f35a4",
"body": null,
"is_bot": false,
"headline": "docs: remove Discord link from README",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T08:57:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e9a6a03d58f18116afac16325ebf09eb01a78a16",
"body": "puppetmaster.cancellation: in-process kill switch keyed by job id. The\nagentic adapter checks it mid-stream (delta sink aborts the in-flight\nprovider call within one chunk) and per-turn, so embedding hosts can\ncancel a swarm in seconds instead of waiting out max_turns. Cancelled\nruns report stop_reason cancelled in their verification artifact.",
"is_bot": false,
"headline": "Instant cooperative job cancellation (v1.10.3)",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T07:55:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59b57ff5772ec1d01f20a3034cff1cf3f29b847d",
"body": "…ng (v1.10.2)\n\n- OpenRouter chat calls request usage accounting (usage.include) and the\n provider layer captures cached_tokens and the provider-reported cost_usd\n on every turn (OpenAI-compatible + Anthropic, streaming included).\n- The agentic loop accumulates both and stamps tokens_cached /\n rea\n[…]\norted real cost when present\n (even without a registry spec match), and otherwise applies a 0.1\n cache-read multiplier to cached prompt tokens instead of billing every\n prompt token as fresh input.",
"is_bot": false,
"headline": "Honest cost accounting: provider-reported spend and cache-aware prici…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-08T01:25:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d2f9a1e55c2647db02c4a815c4ef87b1ac0294cd",
"body": "Version bump, changelog, and the Windows test fixes: strip developer\nPUPPETMASTER_CODEGRAPH_NODE/_JS repair pins in conftest (they short-circuited\ncodegraph invocation resolution and disabled auto-heal in a dozen tests on a\nrepaired machine), replace cat/true/false with portable Python one-liners in\nthe gate and affected-spec tests, and skip the shim-symlink test on hosts that\ncannot create symlinks.",
"is_bot": false,
"headline": "Release v1.10.1: max_capability routing ceiling + Windows-portable tests",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T19:05:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9fbd0dc4975431a0931e8961848f9e928117f2c5",
"body": "…scores\n\nmin_capability forces the classifier output to one exact value, so a caller\nusing it as a cost guardrail (Marionette's analysis swarms) pinned every task\nto the same 'need' and the balanced policy picked the identical cheapest\nclearing model every time. max_capability only clips the top of the classifier\noutput: cheap roles still classify low and route to cheap models while hard\nroles stop at the cap. Plumbed through TaskSignals, payload.max_capability,\nand the route_task MCP tool.",
"is_bot": false,
"headline": "Add max_capability routing ceiling so cost caps stop flattening task …",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T18:37:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7538f3ab8bf21a7f8c931ff6e8308c278fcf81ca",
"body": "…tegration",
"is_bot": false,
"headline": "Document v1.10.0 memory, degraded-run honesty, and Marionette cost in…",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T07:18:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "040fb566a12fc2765e56884d50e1c8814e629893",
"body": null,
"is_bot": false,
"headline": "Hide child process console windows on Windows",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T01:29:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b3057772118be39797f2c94ddaf1f50723273d6",
"body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "chore(release): bump version to 1.10.0",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T01:17:21Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1a708cd2be3cf909ca964284a0847ef8f8e3682a",
"body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "Classify empty agentic max-turns runs as degraded",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T00:46:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ae3b2cfec72a5d9a72d871bb4a001ede399b0c7f",
"body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "Account memory injection overhead in the savings ledger",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T00:43:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "726ffa43d48c89c9692b787397e5157567f145f0",
"body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "Diversify memory retrieval with MMR reranking",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T00:39:32Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "58e915303f7214acc00a86258884327b1529a7dc",
"body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "Extend design note for retrieval diversity and degraded-run honesty",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-07T00:35:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fb05faa787efb5b2e0ff28dc1549071f6ffc784a",
"body": null,
"is_bot": false,
"headline": "chore(release): bump version to 1.9.0",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-06T22:54:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5ff104be61e8aef2fe5f9e56caf4b2be2e5fd08",
"body": null,
"is_bot": false,
"headline": "Add relevance floor to memory injection",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-06T22:54:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1113f5bd38bac2591ef857b7ce6e533dadd70b0",
"body": null,
"is_bot": false,
"headline": "Rank memory retrieval by scope, precision, and recency",
"author_name": "Cary Palmer",
"author_login": "professorpalmer",
"committed_at": "2026-07-06T22:48:09Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 100,
"commits_last_year": 393,
"latest_release_at": "2026-07-30T19:50:50Z",
"latest_release_tag": "v1.21.5",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 13,
"days_since_latest_release": 0,
"mean_days_between_releases": 1.1
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 71,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "puppetmaster-ai",
"exists": true,
"license": null,
"keywords": [
"agents",
"swarm",
"orchestration",
"cursor",
"llm",
"redis",
"sqlite",
"Development Status :: 3 - Alpha",
"Environment :: Console",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.9",
"Topic :: Software Development :: Build Tools"
],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/puppetmaster-ai/",
"is_deprecated": false,
"latest_version": "1.21.5",
"repository_url": "https://github.com/professorpalmer/Puppetmaster",
"versions_count": 151,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 11490,
"first_published_at": "2026-05-28T16:38:22.498170Z",
"latest_published_at": "2026-07-30T19:51:55.654176Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 29,
"stars": 265,
"watchers": 2,
"fork_history": {
"days": [
{
"date": "2026-05-31",
"count": 1
},
{
"date": "2026-06-01",
"count": 1
},
{
"date": "2026-06-04",
"count": 1
},
{
"date": "2026-06-10",
"count": 2
},
{
"date": "2026-06-11",
"count": 1
},
{
"date": "2026-06-16",
"count": 2
},
{
"date": "2026-06-23",
"count": 3
},
{
"date": "2026-06-25",
"count": 1
},
{
"date": "2026-07-01",
"count": 2
},
{
"date": "2026-07-06",
"count": 1
},
{
"date": "2026-07-08",
"count": 3
},
{
"date": "2026-07-10",
"count": 1
},
{
"date": "2026-07-13",
"count": 1
},
{
"date": "2026-07-17",
"count": 2
},
{
"date": "2026-07-18",
"count": 1
},
{
"date": "2026-07-20",
"count": 1
},
{
"date": "2026-07-22",
"count": 1
},
{
"date": "2026-07-23",
"count": 1
},
{
"date": "2026-07-24",
"count": 1
},
{
"date": "2026-07-27",
"count": 1
},
{
"date": "2026-07-28",
"count": 1
}
],
"complete": true,
"collected": 29,
"total_forks": 29
},
"star_history": null,
"open_issues_and_prs": 1
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"clients/typescript/tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 1205894,
"source_files_sampled": 159,
"oversized_source_files": 12,
"agent_instruction_files": [
".cursor/rules/puppetmaster-workflow.mdc",
"AGENTS.md"
],
"agent_instruction_max_bytes": 15358
},
"dependencies": {
"manifests": [
"package.json",
"pyproject.toml"
],
"advisories": {
"error": null,
"scope": null,
"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": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm",
"pypi"
],
"dependencies": [],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 1,
"merged_prs": 12,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 1,
"closed_unmerged_prs": 5
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "professorpalmer",
"commits": 384,
"avatar_url": "https://avatars.githubusercontent.com/u/24235924?v=4"
},
{
"type": "User",
"login": "kbentonferguson",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/292482176?v=4"
},
{
"type": "User",
"login": "jwellman80",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/5726367?v=4"
},
{
"type": "User",
"login": "mrcs64",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/9069178?v=4"
}
],
"contributors_sampled": 4,
"top_contributor_share": 0.977
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.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": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"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": 0,
"reason": "no 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": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"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": "25a1772daf34347583ea9964e95109dca55ce24a",
"ran_at": "2026-07-30T19:55:20Z",
"aggregate_score": 3.6,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-30T19:51:01Z",
"oldest_open_prs": [
{
"number": 19,
"created_at": "2026-07-29T17:59:47Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-13T15:32:25Z",
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/professorpalmer/Puppetmaster",
"host": "github.com",
"name": "Puppetmaster",
"owner": "professorpalmer"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"security": 36,
"vitality": 78,
"community": 62,
"governance": 56,
"engineering": 70
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 78,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 63,
"inputs": {
"commits_last_year": 393,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 13
},
"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": "13/52 weeks with commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 13
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "393 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 393
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 100,
"latest_release_tag": "v1.21.5",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 1.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "100 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 100
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~1.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 1.1
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": "moderate",
"name": "Community & Adoption",
"value": 62,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 51,
"inputs": {
"forks": 29,
"stars": 265,
"watchers": 2,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "265 stars",
"points": 39.3,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 265
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "29 forks",
"points": 12.1,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 29
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "2 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 2
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (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": 0,
"status": "missed",
"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": 68,
"inputs": {
"packages": [
"puppetmaster-ai"
],
"dependents": null,
"ecosystems": "pypi",
"total_downloads": null,
"monthly_downloads": 11490
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "11,490 downloads/month across pypi",
"points": 54.1,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 11490,
"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": 56,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 15,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 4,
"top_contributor_share": 0.977
},
"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 98% of commits",
"points": 0.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 98
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "4 contributors",
"points": 5.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 4
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 74,
"inputs": {
"merged_prs": 12,
"open_issues": 0,
"closed_issues": 1,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 5
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "12/17 decided PRs merged",
"points": 27,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 12,
"decided": 17
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 54,
"inputs": {
"followers": 25,
"owner_type": "User",
"is_verified": null,
"owner_login": "professorpalmer",
"public_repos": 32,
"account_age_days": 3530
},
"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": "25 followers of professorpalmer",
"points": 10.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 25,
"login": "professorpalmer"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "32 public repos, account ~9 yr old",
"points": 23.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 32
}
},
{
"code": "account_age_years",
"params": {
"years": 9
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"puppetmaster-ai"
],
"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": "151 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 151
}
}
],
"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": 70,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"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": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"topics": [
"agent-swarms",
"agents",
"ai-agents",
"claude-code",
"codex",
"cursor",
"distributed-systems",
"llm",
"orchestration",
"sqlite"
],
"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": "at_risk",
"name": "Security",
"value": 36,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 36,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 3.6
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"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": "no update tool detected",
"points": 0,
"status": "missed",
"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": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
}
],
"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": 69,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "good",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.66,
"agent_instruction_files": [
".cursor/rules/puppetmaster-workflow.mdc",
"AGENTS.md"
],
"agent_instruction_max_bytes": 15358
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": ".cursor/rules/puppetmaster-workflow.mdc, AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".cursor/rules/puppetmaster-workflow.mdc, AGENTS.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": "66 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 35.2,
"status": "partial",
"details": [
{
"code": "legible_history",
"params": {
"legible": 66,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"clients/typescript/tsconfig.json"
],
"agent_commit_share": 0.05,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"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": "clients/typescript/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "clients/typescript/tsconfig.json"
}
}
],
"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": "5 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 5,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "good",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 1205894,
"source_files_sampled": 159,
"oversized_source_files": 12
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python with type-check config (clients/typescript/tsconfig.json)",
"points": 27,
"status": "partial",
"details": [
{
"code": "typecheck_config_language",
"params": {
"files": "clients/typescript/tsconfig.json",
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "12/159 source files over 60KB",
"points": 50.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 159,
"oversized": 12
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "moderate",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": true,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"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.14.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index pypi:puppetmaster-ai@1.21.5; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-30T19:55:25.623477Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/professorpalmer/Puppetmaster.svg",
"full_name": "professorpalmer/Puppetmaster",
"license_state": "standard",
"license_spdx": "MIT"
}