Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.14.0 · 2026-07-30 19:55 UTC

professorpalmer / Puppetmaster

Provider-neutral control plane for durable-state agent swarms: subprocess workers, leases, artifacts, memory, and deterministic stitching.

PythonMIT★ 265 Sterne⑂ 29 Forksseit Mai 2026Auf GitHub ansehen ↗

professorpalmer/Puppetmaster erreicht einen Gesundheitsindex von 62 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (78/100) ab, am schwächsten bei Security (36/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

62
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer standardisierten Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr gewichtetes Mittel, kalibriert auf die Verteilung des öffentlichen Registers, sodass die Stufen Perzentilbedeutung tragen; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze Gefährdet von 34.

62
Außergewöhnlich93-100Die Spitzengruppe des Registers (≈ obere 5 %); erfüllt im Wesentlichen alle geprüften Kriterien
Exzellent80-92Durchgehend stark; geringfügige Lücken
Gut65-79Gesund; Lücken sind begrenzt und beherrschbar
Mittel50-64Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Schwach35-49Wesentliche Schwächen in mehreren Bereichen
Gefährdet20-34Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-19Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Cary PalmerPersönliches Konto
25 Follower32 öffentliche Reposseit Nov. 2016

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
PyPIpuppetmaster-ai1.21.511.490151vor 0 Tagenagentsswarmorchestrationcursorllmredissqlite

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

78Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
9/36Commit-Rhythmus — 13/52 Wochen mit Commits
18/18Commit-Volumen — 393 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year393
human_commit_share1
days_since_last_push0
active_weeks_last_year13

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 100 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,1 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count100
latest_release_tagv1.21.5
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases1,1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

62Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
39.3/60Stars — 265 Stars
12.1/25Forks — 29 Forks
0/15Watcher — 2 Watcher
Verwendete Eingangsdaten
forks29
stars265
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
54.1/80Downloads pro Monat — 11.490 Downloads/Monat über pypi
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagespuppetmaster-ai
dependents
ecosystemspypi
total_downloads
monthly_downloads11.490
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

56Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.5/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 98 % der Commits
5.4/13.5Breite der Beitragenden — 4 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled4
top_contributor_share0,977
Wie die Bewertung erfolgt
46.8/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
27/38.3PR-Annahme — 12/17 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs12
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs5
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
10.2/25Reichweite des Inhabers — 25 Follower von professorpalmer
23.1/25Kontohistorie — 32 öffentliche Repos, Kontoalter ca. 9 Jahre
Verwendete Eingangsdaten
followers25
owner_typeUser
is_verified
owner_loginprofessorpalmer
public_repos32
account_age_days3.530
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf pypi
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 151 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagespuppetmaster-ai
ecosystemspypi
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

70Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.

Dokumentation

85Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 10 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsagent-swarms, agents, ai-agents, claude-code, codex, cursor, distributed-systems, llm, orchestration, sqlite
has_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

36Gefährdet · 16 % des Gesamtindex

Sicherheitslage

36Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — keine Daten
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Trägt ein bewusst kleines Gewicht (4 %): Agenten-Tooling ist ein echtes Pflegesignal, doch ein Repository ohne jedes Signal kann weiterhin 100/100 erreichen.

69Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — .cursor/rules/puppetmaster-workflow.mdc, AGENTS.md
0/15Maschinenlesbare Doku (llms.txt)
35.2/40Lesbare Commit-Historie — 66 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,66
agent_instruction_files.cursor/rules/puppetmaster-workflow.mdc, AGENTS.md
agent_instruction_max_bytes15.358
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — clients/typescript/tsconfig.json
0/10Reproduzierbare Umgebung
10/10Belegte Agentenpraxis — 5 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languagenein
bootstrap_filesMakefile
has_devcontainernein
has_linter_confignein
typecheck_configsclients/typescript/tsconfig.json
agent_commit_share0,05
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
27/45Typprüfbarer Code — Python mit Typprüfungs-Konfiguration (clients/typescript/tsconfig.json)
50.8/55Handhabbare Dateigrößen — 12/159 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes1.205.894
source_files_sampled159
oversized_source_files12
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
20/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalja
api_schema_files

Eckdaten

265GitHub-Sterne
4Mitwirkende
393Commits, letzte 12 Monate
0Tage seit letztem Push
100Releases
1Bus-Faktor
0offene Issues
npm, PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 29 ⇿
0Sterne
29Forks
97Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

0510152025302932026-052026-062026-07
Major 1Minor 19Patch 77
OpenSSF Scorecard 3.6 / 10
3.6Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-30 19:55 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
k. A.CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.14.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.