Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-29 03:10 UTC

snoodleboot-io / prompticorn

PythonKeine Lizenz erkannt★ 2 Sterne⑂ 0 Forksseit Feb. 2026Auf GitHub ansehen ↗

snoodleboot-io/prompticorn erreicht einen Gesundheitsindex von 58 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Engineering Quality (82/100) ab, am schwächsten bei Community & Adoption (30/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

58
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

58
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende 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

snoodleboot-ioOrganisation
0 Follower14 öffentliche Reposseit Feb. 2025

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
PyPIprompticorn1.31.02.75433vor 0 Tagenaiclicoding-assistantconfigurationprompts

Metriken nach Kategorie

Vitalität

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

68Mittel · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
7.6/36Commit-Rhythmus — 11/52 Wochen mit Commits
18/18Commit-Volumen — 115 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year115
human_commit_share0,99
days_since_last_push0
active_weeks_last_year11
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 1 Versions-Tags (keine GitHub-Releases)
27/36Release-Aktualität — letztes Release vor 111 Tagen
12.6/27Release-Rhythmus — Rhythmus unbekannt (nur ein Release)
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count1
latest_release_tagv2.1.0
releases_from_tagsja
days_since_latest_release111
mean_days_between_releases
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?

30Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 2 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
0/22.5Lizenz — keine Lizenzdatei erkannt
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licensenein
has_contributingja
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
45.9/80Downloads pro Monat — 2.754 Downloads/Monat über pypi
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesprompticorn
dependents
ecosystemspypi
total_downloads
monthly_downloads2.754
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?

55Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
46.8/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
36.9/38.3PR-Annahme — 111/115 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs111
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs4
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
0/25Reichweite des Inhabers — 0 Follower von snoodleboot-io
11.4/25Kontohistorie — 14 öffentliche Repos, Kontoalter ca. 1 Jahre
Verwendete Eingangsdaten
followers0
owner_typeOrganization
is_verified
owner_loginsnoodleboot-io
public_repos14
account_age_days520

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 — 33 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesprompticorn
ecosystemspypi
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

82Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration
9.6/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_configja
has_precommit_configja
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
0/10Repository-Beschreibung
0/10Topics
0/10Wiki
Verwendete Eingangsdaten
topics
has_wikinein
homepage
has_readmeja
has_docs_dirja
has_descriptionnein

Sicherheit

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

52Mittel · 16 % des Gesamtindex

Sicherheitslage

47Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Lizenz — license file not detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
14.8/35Direkte Abhängigkeiten ohne bekannte Advisories — 1 betroffen: click 8.3.1 (high 7.2)
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
40/40Keine offenen Advisories — kein Advisory ist länger als 90 Tage öffentlich
Verwendete Eingangsdaten
sourceosv
advisories5
affected_packages3
assessed_packages50
unassessed_packages0
affected_by_severityhigh 1, moderate 1, low 1
direct_affected_packages1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories. Die verbleibenden Gewichte wurden renormalisiert. 50 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

60Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 97 von 99 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,98
agent_instruction_filesAGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules
agent_instruction_max_bytes9.483
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — lockfile
6/10Belegte Agentenpraxis — 3 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesuv.lock
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,03
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Python ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/460 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes52.204
source_files_sampled460
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

2GitHub-Sterne
1Mitwirkende
115Commits, letzte 12 Monate
0Tage seit letztem Push
1Releases
1Bus-Faktor
0offene Issues
PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • deps.dev does not index pypi:prompticorn@1.31.0; advisories assessed against the repository dependency graph instead

Weitere Details

OpenSSF Scorecard 4.7 / 10
4.7Gesamtwert

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-29 03:10 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Direkte Abhängigkeiten 7
RegistryPaketVersionsvorgabeManifest
PyPIclick>=8.1pyproject.toml
PyPIjinja2>=3.0.0pyproject.toml
PyPIpydantic>=2.0pyproject.toml
PyPIprompt_toolkit>=3.0.0pyproject.toml
PyPIpyyaml>=6.0pyproject.toml
PyPIruamel.yaml>=0.18pyproject.toml
PyPIsweet_tea>=0.1.0pyproject.toml
Alle Abhängigkeiten 50

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 7 direkte und 43 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
PyPIclick8.3.1direkt
PyPIjinja23.1.6direkt
PyPIprompt-toolkit3.0.52direkt
PyPIpydantic2.12.5direkt
PyPIpyyaml6.0.3direkt
PyPIruamel-yaml0.19.1direkt
PyPIsweet-tea0.1.38direkt
PyPIannotated-types0.7.0indirekt
PyPIbuild1.4.0indirekt
PyPIcfgv3.5.0indirekt
PyPIcolorama0.4.6indirekt
PyPIcoverage7.13.5indirekt
PyPIdistlib0.4.0indirekt
PyPIexceptiongroup1.3.1indirekt
PyPIfilelock3.25.2indirekt
PyPIidentify2.6.18indirekt
PyPIimportlib-metadata8.8.0indirekt
PyPIiniconfig2.3.0indirekt
PyPIlibcst1.8.6indirekt
PyPIlinkify-it-py2.1.0indirekt
PyPImarkdown-it-py4.2.0indirekt
PyPImarkupsafe3.0.3indirekt
PyPImdit-py-plugins0.6.1indirekt
PyPImdurl0.1.2indirekt
PyPImutmut3.6.0indirekt
PyPInodeenv1.10.0indirekt
PyPIpackaging26.0indirekt
PyPIplatformdirs4.9.4indirekt
PyPIpluggy1.6.0indirekt
PyPIpre-commit4.5.1indirekt
PyPIpydantic-core2.41.5indirekt
PyPIpygments2.19.2indirekt
PyPIpyproject-hooks1.2.0indirekt
PyPIpyright1.1.408indirekt
PyPIpytest9.0.2indirekt
PyPIpytest-cov7.0.0indirekt
PyPIpython-discovery1.2.0indirekt
PyPIpyyaml-ft8.0.0indirekt
PyPIrich15.0.0indirekt
PyPIruff0.15.6indirekt
PyPIsetproctitle1.3.7indirekt
PyPItextual8.2.7indirekt
PyPItoml0.10.2indirekt
PyPItomli2.4.0indirekt
PyPItyping-extensions4.15.0indirekt
PyPItyping-inspection0.4.2indirekt
PyPIuc-micro-py2.0.0indirekt
PyPIvirtualenv21.2.0indirekt
PyPIwcwidth0.6.0indirekt
PyPIzipp3.23.0indirekt
Abhängigkeits-Advisories 3

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 50 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 3 tragen bekannte Advisories, davon 1 direkte.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
click8.3.1direkthoch18.3.3
pytest9.0.2indirektmittel29.0.3
pygments2.19.2indirektniedrig22.20.0

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 9291,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "CSS": 34071,
        "HTML": 63263,
        "Jinja": 79558,
        "Python": 1984565,
        "JavaScript": 12471
      },
      "pushed_at": "2026-07-29T03:00:12Z",
      "created_at": "2026-02-25T04:53:40Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-29T03:00:22Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "snoodleboot-io",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/200531939?v=4",
      "created_at": "2025-02-23T22:34:01Z",
      "is_verified": null,
      "public_repos": 14,
      "account_age_days": 520
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2026-04-08T21:40:58Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "dba99e045ebb9e6c00f7887c9641b9eaf2bc2c61",
          "body": "…ion (PRO-135) (#116)\n\nUnblocks the mutation campaign and hardens the first module.\n\nThe config blocker: mutmut 3.x has NO `runner` key (the one PRO-11 set was\nsilently ignored), and with a narrowed `source_paths` it copies only that one\nfile into its `mutants/` sandbox — so tests importing any othe\n[…]\nding=None which is identical to utf-8 on this platform) —\nunkillable by definition.\n\nWhole-tree >85% (PRO-135) continues module by module; two modules done, tooling\nnow works. Full suite: 2528 passed.",
          "is_bot": false,
          "headline": "test: fix mutmut 3.x config and harden skill_emitter.py to ~90% mutat…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-29T03:00:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ec9d1dcebee209e87e317a88d5be0c7039f0e9c",
          "body": "Their conventions (conventions-c.md, conventions-cpp.md, conventions-objc.md)\nand source layouts already existed on disk but no picker language reached them —\nthey were orphan content, allow-listed in the coverage guard to keep it green.\nThis wires them in as real selectable languages.\n\n  languages.\n[…]\nective-C (2.0/1.0),\neach defaulting to the latest and carrying an engine of \"native (compiled)\" /\n\"native (Clang/ObjC runtime)\" per PRO-134.\n\nGolden unchanged (builds python). Full suite: 2514 passed.",
          "is_bot": false,
          "headline": "feat: make C, C++ and Objective-C selectable languages (PRO-136) (#115)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-28T03:44:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3e43a50c7ef105c1e019c87da41d0c9e4bc4a70",
          "body": "…ngine` field (PRO-134) (#114)\n\nThe `runtime` config key was overloaded: the version pickers store the language\nversion there (Go 1.26, TS v7.0, C# 14, ES2026), but the convention templates'\n`Runtime:` line is meant for the execution engine. For Go/Rust/Python/Java the\ntwo coincide so it was invisib\n[…]\ned + this classification fix.\n\nNote: this resolves the user-visible overload; the field is still *named*\n`runtime` while holding the version — the internal rename PRO-134 also mentions\nstays deferred.",
          "is_bot": false,
          "headline": "feat: split language version from execution engine via an additive `e…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-27T06:56:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "62521c14d052ea678d16fc6d1b7582b40142dc08",
          "body": "Completes the two skill tracks from the original PRO-7 brief that were absent\nfrom disk (ML/AI and Security already existed and were filled by PRO-7). Takes\nthe library 96 -> 119 skills.\n\nPlatform (13), mapped to devops/architect/backend/data/security:\n  cloud-provider-tradeoffs, serverless-architec\n[…]\n stays green at 119/119 reachable.\n\nGolden regenerated: 220 new emitted files across tools, 0 removed.\nQUICKSTART skill count 96 -> 119 (doc-count guard).\n\nFull suite: 2502 passed + the doc-count fix.",
          "is_bot": false,
          "headline": "feat: add 13 Platform + 10 Language skills (PRO-90) (#113)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-27T06:07:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ee5a94a1892f1279c4aeedfabe25fae230617e3",
          "body": "… (PRO-94) (#112)\n\n* fix: refresh language versions to current + separate JS/TS language from runtime (PRO-94)\n\nThe runtime pins in language_defaults.yaml and the example hints in\nconventions-*.md were stale and disagreed with each other. Updated both to the\ncurrent releases (verified against July-2\n[…]\nlanguage version there while the convention's Runtime: line\nsemantically wants the engine (Node/Deno/Bun). Worth splitting into\nlanguage_version vs runtime in a later ticket.\n\nFull suite: 2503 passed.",
          "is_bot": false,
          "headline": "fix: refresh language versions + separate JS/TS language from runtime…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-27T05:07:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6ab06248636f2acd28fada6353ccadd73bc2eef",
          "body": "…ree (PRO-93) (#111)\n\nLanguage conventions, source layouts, and the Claude workflow router all resolve\nby a language key, but the picker/registry calls the language `go` while three\ncontent files still said `golang`. Each silently mis-served Go:\n\n1. conventions-golang.md → conventions-go.md. generat\n[…]\n orphan). With the existing\nsource-layout test this pins the go/golang triangle so it can't recur.\n\nGolden: 2 entries changed (the Claude workflow embedding the routing line).\nFull suite: 2476 passed.",
          "is_bot": false,
          "headline": "fix: Go projects get their conventions — align go/golang across the t…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-27T02:51:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "326ac588480846aa2ecb8dd93bf84dabfe64ab14",
          "body": "…-92) (#110)\n\nkilo-cli declared .opencode/ but dispatched to the kilo builder and emitted\n.kilo/ — its documented CLI output never existed, so switch-cleanup and\ndetection for kilo-cli were broken (the cross-tool validation test caught this).\nThe docs were also wrong: they described .opencode/rules/\n[…]\ng to .opencode/ at all, this is net-new working\nsupport, not a regression; subagent/workflow emission can follow up.\n\nFull suite: 2472 passed (the previously-xfailed kilo-cli case is now a real pass).",
          "is_bot": false,
          "headline": "feat: real OpenCode CLI support for kilo-cli (.opencode/agents/) (PRO…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-27T02:10:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "785fdfc2b9ae764d466672f4ffa2a402b4ef6416",
          "body": "…1) (#109)\n\nDelivers the tractable, high-value parts of the quality track and sets up the\nmutation campaign honestly.\n\nCross-tool validation (tests/integration/test_cross_tool_validation.py) — the\nstructural invariants that span tools, asserted for the whole tool set at once:\nevery tool builds and w\n[…]\nts generate and run); raising the score\nto >85% proceeds module by module from here. This PR lands the foundation plus\nthe validation and benchmark suites that catch the highest-value regressions now.",
          "is_bot": false,
          "headline": "test: cross-tool validation, build benchmarks, mutation config (PRO-1…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-26T05:01:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c054914896e8fab81f5ac21fb1515b72fdc54df1",
          "body": "…108)\n\nNative Claude Desktop has no on-disk skill or agent path — its only file config\nis claude_desktop_config.json (MCP servers), which prompticorn does not produce.\nVerified against Anthropic's docs: filesystem SKILL.md skills load in Claude API,\nClaude Code, and claude.ai — not the native deskto\n[…]\nnistic archives (sorted members, POSIX arcnames) so re-running is stable.\n11 packager tests cover the zip layout, one-per-zip, bundled resources, the\nreserved-word/invalid-name skips, and error cases.",
          "is_bot": false,
          "headline": "feat: Claude Desktop support — skills.zip packager + docs (PRO-10) (#…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-26T04:44:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41fe860beafabc37667275f4154fb75459a65ebd",
          "body": "…ation (PRO-9) (#107)\n\n* feat: add AWS Bedrock support — system-prompt bundle + optional CloudFormation (PRO-9)\n\nBedrock is the first non-repo-dotfile target: a model/agent-hosting API, not an\nassistant that reads .claude/-style files. So \"Bedrock support\" emits a bedrock/\ntree carrying each agent's\n[…]\nnt instead of silent truncation.\n\nGolden regenerated: bedrock::minimal/verbose entries added; no other tool changed.\n\n* docs: bump tool count 16->17 and document AWS Bedrock (PRO-9 + PRO-12 reconcile)",
          "is_bot": false,
          "headline": "feat: AWS Bedrock support — system-prompt bundle + optional CloudForm…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-26T04:33:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "656a8bc7837485293254c57b08c30cc63df7f847",
          "body": "…(#106)\n\nThe docs had drifted badly from the library. QUICKSTART and README advertised\n\"5 assistants\" and \"~95 skills\" while prompticorn actually ships 16 tools and 96\nskills; the init walkthrough still listed only the original 6 tool choices. Same\nclass of drift as the skill-content and Copilot-pat\n[…]\nentions\":\n  there are 29 conventions-*.md files (26 are selectable in `init` — a real but\n  separate distinction, not a doc error).\n\nLinked TOOLS.md, FAQ.md, and TROUBLESHOOTING.md from docs/INDEX.md.",
          "is_bot": false,
          "headline": "docs: per-tool guide, persona FAQ, and count-accuracy fixes (PRO-12) …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-26T04:15:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f404bcbfc20460e24bbf2747ea568f6762428670",
          "body": "…#105)\n\n* fix: normalize skill files to SKILL.md and surface unresolvable skills (PRO-89)\n\n52 of the 192 files under prompticorn/skills/*/{minimal,verbose}/ were\nlowercase skill.md. The loader (prompt_builder) and emitter (skill_emitter)\nonly ever resolve uppercase SKILL.md, so on a case-sensitive f\n[…]\nse-hyphenated; file must be named SKILL.md.\n\nGolden regenerated: 82 added, 82 removed, 0 changed — the 41 copilot skills x 2\nvariants relocate from <name>.md to <name>/SKILL.md; no other tool touched.",
          "is_bot": false,
          "headline": "feat: author the final 23 skills, hollow count reaches zero (PRO-7) (…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-23T05:35:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6755143a94bdcdac1ed9c081bdde033fff6d9bb",
          "body": "…ta skills (PRO-7 batch 3) (#104)\n\n* fix: normalize skill files to SKILL.md and surface unresolvable skills (PRO-89)\n\n52 of the 192 files under prompticorn/skills/*/{minimal,verbose}/ were\nlowercase skill.md. The loader (prompt_builder) and emitter (skill_emitter)\nonly ever resolve uppercase SKILL.m\n[…]\nd to norms to calibrate against, without\ninventing a citation — a fabricated authority would be worse than the overstatement.\n\nGolden regenerated: 0 files added, 0 removed, 360 changed — content-only.",
          "is_bot": false,
          "headline": "feat: author real content for 18 backend, architecture, devops and da…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-23T05:22:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4827724da7398e0a2fd6feee39760505d7719245",
          "body": "…ch 2) (#103)\n\n* fix: normalize skill files to SKILL.md and surface unresolvable skills (PRO-89)\n\n52 of the 192 files under prompticorn/skills/*/{minimal,verbose}/ were\nlowercase skill.md. The loader (prompt_builder) and emitter (skill_emitter)\nonly ever resolve uppercase SKILL.md, so on a case-sens\n[…]\ne next occurrence fails\nonce, in the skills suite, naming the offending file.\n\nGolden regenerated: 0 files added, 0 removed, 96 changed — content-only, as\nexpected for skills already mapped in part 1.",
          "is_bot": false,
          "headline": "feat: author real content for 20 ML/AI and frontend skills (PRO-7 bat…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-23T05:06:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8520facfc22bac2516310a88c2c7b2136e7b65b9",
          "body": "…(#102)\n\n* fix: normalize skill files to SKILL.md and surface unresolvable skills (PRO-89)\n\n52 of the 192 files under prompticorn/skills/*/{minimal,verbose}/ were\nlowercase skill.md. The loader (prompt_builder) and emitter (skill_emitter)\nonly ever resolve uppercase SKILL.md, so on a case-sensitive \n[…]\nom disk at 61 remaining, down from 76.\n\nGolden regenerated: 0 files added, 0 removed, 24 changed. Additive counts are\nzero because these skills were already mapped in part 1; only their content moved.",
          "is_bot": false,
          "headline": "feat: author real content for the 13 security skills (PRO-7 batch 1) …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-23T04:55:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "edb060c98c68df3ef76cb9bd5dbdd633e4607b73",
          "body": "…art 1) (#101)\n\n* fix: normalize skill files to SKILL.md and surface unresolvable skills (PRO-89)\n\n52 of the 192 files under prompticorn/skills/*/{minimal,verbose}/ were\nlowercase skill.md. The loader (prompt_builder) and emitter (skill_emitter)\nonly ever resolve uppercase SKILL.md, so on a case-sen\n[…]\nplate. It now accepts \"## Core Patterns\" as well, covering both\nshapes during the conversion.\n\nGolden regenerated to pick up the pilot skill content: the earlier regeneration\npredated those two files.",
          "is_bot": false,
          "headline": "feat: wire the 37 orphan skills + establish content standard (PRO-7 p…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-23T04:42:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6e476f770cd0c27be578b7b07629aaa1fc4279a",
          "body": "…s (PRO-89) (#100)\n\n52 of the 192 files under prompticorn/skills/*/{minimal,verbose}/ were\nlowercase skill.md. The loader (prompt_builder) and emitter (skill_emitter)\nonly ever resolve uppercase SKILL.md, so on a case-sensitive filesystem those\nfiles were invisible to every builder — and for 26 skil\n[…]\n  anywhere, and every skill dir carries both variants\n  - warn via a typed MissingSkillWarning instead of silently skipping an\n    unresolvable skill, following the WindsurfRuleBudgetWarning precedent",
          "is_bot": false,
          "headline": "fix: normalize skill files to SKILL.md and surface unresolvable skill…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-23T04:30:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9bf1259e7fe4aad0dd8e6f60ccad2b387e42b00",
          "body": "…(PRO-80..88) (#99)\n\n* fix: JSON-escape PRIMARY_AGENTS_LIST substitution so amazonq JSON stays valid (PRO-80)\n\nThe post-write {{PRIMARY_AGENTS_LIST}} resolver (PRO-72) did a plain-text\nstr.replace over every emitted file. Amazon Q embeds the token inside a\njson.dumps-escaped agent \"prompt\" string; s\n[…]\nfor all tools (python header fields reformatted).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Templating hardening round 2: fix amazonq JSON regression + cleanups …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-19T23:11:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a82a9336ec209899ea58f47fced5b7e256d3a009",
          "body": "…(#98)\n\n* fix: honor question config_key so version/monorepo picks reach spec (PRO-65, PRO-66)\n\nBoth the single-language and monorepo question flows mapped a question's answer\nto a config spec key in their own way, and both could store it under a key no\ntemplate reads:\n\n- Single-language stripped th\n[…]\ne same keys to the fixture so the block resolves.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Value-coverage testing strategy + template-wiring fixes (PRO-64..73) …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-19T14:17:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d3c40f55c19fb27e7a5ac9beca99c560cfb98c0",
          "body": "Copilot Chat (VS Code) has three first-class customization primitives that map\nonto prompticorn's IR, distinct from the basic `copilot` target's single\nconcatenated .github/copilot-instructions.md:\n\n- Agents      -> .github/agents/<slug>.agent.md      (custom agents)\n- Workflows   -> .github/prompts\n[…]\nhat switching\nround-trips, and golden fixture coverage (32 tool/variant entries). Docs updated\n(README, ARCHITECTURE, INDEX). Formats verified against\ncode.visualstudio.com/docs/copilot/customization.",
          "is_bot": false,
          "headline": "feat: add GitHub Copilot Chat tool support (PRO-8) (#97)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T23:13:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98a8102ecac2980e92a2239d6e8753faed5e530a",
          "body": "…, py3.10 (PRO-63) (#96)\n\n* style: ruff format pre-existing drift + temp CI golden diagnostic PRO-63\n\nReformat 14 pre-existing files flagged by `ruff format --check` (10 question\nlayout files + artifacts/agents_md/amazonq_builder/layouts). Output verified\nunchanged (golden test still green locally).\n[…]\n on python_version < '3.11'.\n\nWith these plus the discovery-order fix, all four CI/CD Pipeline steps\n(Unit Tests 3.10-3.14, Ruff check, Ruff format, pyright) pass. Full suite:\n2212 passed, 22 skipped.",
          "is_bot": false,
          "headline": "fix: green the CI/CD Pipeline — deterministic output, format, pyright…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T20:43:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1247ac013545cd2c7b54c00b27998975b78d78ba",
          "body": "…ilds PRO-62 (#95)\n\nLanguage-specific skill/workflow mappings replaced the agent-level set in\n_filter_agent_for_language, silently dropping every agent-level skill (e.g. the\norchestrator's multiagent-orchestration) from single-language builds. Union the\ntwo instead, agent-level as the base plus lang\n[…]\n6 accidental) with zero dangling references.\n\nAdds regression tests asserting agent-level skills survive a single-language\nbuild and that no referenced SKILL.md is missing. Golden fixture regenerated.",
          "is_bot": false,
          "headline": "fix: union agent-level and language skills so mapping skills reach bu…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T18:51:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ed33f129edcaa17160faa144658436b9d231380",
          "body": "Author a new prompticorn skill packaging an on-demand, portable procedure for a\ngenuinely-parallel multiagent implementation run: load conventions -> discover\nagents -> design the execution model -> environment-readiness gate -> plan-for-\napproval gate -> concurrent subagent spawn + aggregate/debug/\n[…]\nrchestrator skills from a plain single-language build today (pre-existing\nbehavior, not specific to this skill) — the skill still emits whenever a built\nagent carries it, as the emission tests verify.",
          "is_bot": false,
          "headline": "feat: add invocable multiagent-orchestration skill (PRO-28) (#94)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T05:19:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b03f0c1043e068c7af6988e8b4cc4ed9d31f01f",
          "body": "Windsurf caps rule files at ~12,000 chars (per file and the always-on aggregate)\nand silently truncates the overflow. prompticorn's core conventions are ~29k, so\nan always_on core rule blew the budget.\n\n- Emit the core convention rule as model_decision when it exceeds the cap (pulled\n  on demand by \n[…]\nresidual truncation is surfaced rather than silent.\n\nAdds budget tests + updates the pre-existing trigger test; regenerates the\nWindsurf golden entries (core trigger changed). Full suite green (2199).",
          "is_bot": false,
          "headline": "feat: handle Windsurf's 12k rule char-cap (PRO-61) (#93)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T05:07:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57319e8c5230a88a53330d4c0031be30cbdaeee9",
          "body": "…mplates (PRO-27) (#92)\n\nLift the subagent progress-heartbeat convention (from a downstream ad-hoc Claude\nrealization) into the core prompt templates in a tool-agnostic, portable form so\nevery generated assistant carries it.\n\nsystem.md gains a \"Subagent Progress Heartbeats\" subsection next to the ex\n[…]\n No absolute paths, no pirn-specific references, no harness/worktree-tool\nassumptions.\n\nGolden fixture regenerated (the guidance flows into rendered conventions across\ntools). Full suite green (2196).",
          "is_bot": false,
          "headline": "feat: add generalized subagent progress-heartbeat guidance to core te…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T04:55:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28dee76bd9bd4b3ce00c58474b9d36005a826743",
          "body": "…O-17) (#91)\n\nAdd Codex integration tests to test_tool_switching.py: Codex emits .agents/skills/\n+ .codex/config.toml + AGENTS.md, is detected as the current tool, and is cleaned\non switch-away. Plus a Zed<->Codex round-trip test that exercises the collision\nfix end-to-end (both share .agents/; dete\n[…]\nic current_tool match). Document Codex as the 14th\nsupported builder in README, docs/INDEX, and docs/ARCHITECTURE.\n\nFull suite green (2196). Completes the tool-support initiative (9 researched tools).",
          "is_bot": false,
          "headline": "test/docs: Codex switching coverage + document Codex as supported (PR…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T04:46:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "558d6bc420accb00b6660123de39e1926580263e",
          "body": "…(PRO-16) (#90)\n\nAdd an OpenAI Codex CLI emission target (9th tool). Like Zed, agents/skills go to\n.agents/skills/ and conventions ride the root AGENTS.md (E1). Codex additionally\nemits .codex/config.toml — a real Codex config layer that also serves as the\nunique marker distinguishing a Codex projec\n[…]\ndingly.\n\nRegistered via one ToolSpec (create {.agents/, .codex/}). Golden fixture extended\n(15 tools x 2). New test_codex_builder.py pins the Zed-vs-Codex detection both\nways. Full suite green (2194).",
          "is_bot": false,
          "headline": "feat: add Codex generator + resolve the Zed/Codex artifact collision …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-18T04:38:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4a91a26bca584de699a871654fcebee2ef65ee9",
          "body": "… (PRO-3) (#89)\n\nResolve the PRO-3 \"decide\" ticket: the config migration deliberately carries\nlayout_style/error_handling onto frontend folder specs while keeping data-system\nfields (databases/data_access) backend-only. This is correct — layout_style and\nerror_handling are per-language core fields t\n[…]\n a clarifying comment in _migrate_old_orm_database_to_fungible\nexplaining the deliberate asymmetry, and a test pinning it (frontend inherits\nlayout/error but not data-system). Full suite green (2187).",
          "is_bot": false,
          "headline": "docs/test: pin the frontend layout/error migration carryover decision…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-15T03:33:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b1a01459a606225b0d9094463b157444b430a311",
          "body": "…s/databases (PRO-4) (#88)\n\nRetire the compat-shim naming left by the question-scoping redesign: both\nrenderers (core_files_loader, convention_generator) fed the per-folder\n`databases`/`data_access` lists into template vars still named `database`/`orm`.\nRename the context keys and the `{{ }}` placeh\n[…]\nnt end-to-end.\n\nPure rename — rendered output is byte-identical (golden test confirms). The\nlegacy config migration (project.orm/database -> lists) is unrelated and\nunchanged. Full suite green (2186).",
          "is_bot": false,
          "headline": "refactor: rename {{ orm }}/{{ database }} template vars to data_acces…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-15T03:27:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ff96b4e4bcb39f2abe6964fc8d8faef06c8105d",
          "body": "…uages (PRO-2) (#87)\n\nAdd per-language error_handling + layout_style core question classes for the ten\nbackend-capable languages that lacked them (rust, java, csharp, ruby, php,\nswift, kotlin, scala, elixir, fsharp), mirroring the existing python/typescript/\ngo pattern with language-idiomatic option\n[…]\no silent defaults.\n\nAdds a parity test asserting every backend-capable language has both core\nquestions; the existing pipeline coverage test already exercises the new classes.\nFull suite green (2186).",
          "is_bot": false,
          "headline": "feat: complete error_handling/layout_style parity across backend lang…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-15T03:21:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e80e20824734e50e99f8f9355e13175d9484c3f4",
          "body": "…O-59) (#86)\n\nAdd Aider integration tests to test_tool_switching.py: Aider emits\nCONVENTIONS.md + .aider.conf.yml (and no AGENTS.md), is detected as the current\ntool, its artifacts are cleaned on switch-away, and switching aider->claude\ncleans the Aider artifacts. Document Aider as the 13th supported builder in\nREADME, docs/INDEX, and docs/ARCHITECTURE.\n\nFull suite green (2172 passed). Completes the 8-tool support effort.",
          "is_bot": false,
          "headline": "test/docs: Aider switching coverage + document Aider as supported (PR…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-13T02:32:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "924ca6b5587d978c1d1166354835f62656e6acb2",
          "body": "Add an Aider emission target — the smallest of the eight. Aider has no\nagent/skill/workflow primitive, so only conventions map: emit a single root\nCONVENTIONS.md (core + per-language conventions concatenated) plus a\n.aider.conf.yml whose read: [CONVENTIONS.md] list makes aider always load it as\nread\n[…]\nd (no-op layout writes) and the root AGENTS.md is suppressed.\n\nRegistered via one ToolSpec (auto-wired). Golden fixture extended (14 tools x 2);\nexisting tools byte-identical. Full suite green (2170).",
          "is_bot": false,
          "headline": "feat: add Aider generator (PRO-58) (#85)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-13T02:27:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fdeb765cc8b1aebaf6f4f209fc1f753f7960ac8a",
          "body": "…ed (PRO-57) (#84)\n\nAdd Continue integration tests to test_tool_switching.py: Continue emits\n.continue/rules/ + .continue/prompts/ and NO AGENTS.md, is detected as the\ncurrent tool, its artifacts are cleaned on switch-away, and switching\ncontinue->cline cleans the Continue artifacts. Document Continue.dev as the 12th\nsupported builder in README, docs/INDEX, and docs/ARCHITECTURE.\n\nFull suite green (2164 passed).",
          "is_bot": false,
          "headline": "test/docs: Continue switching coverage + document Continue as support…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-13T02:08:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "461e05f10249f73e5bc784414d363ebe482d6efb",
          "body": "Add a Continue.dev emission target, scoped to rules + prompts (Continue has no\nagent router and full assistants pin a model/provider we don't own). Each agent\nflattens to a description-scoped rule (.continue/rules/<slug>.md, alwaysApply\nfalse → pulled in when relevant); conventions go to .continue/r\n[…]\nthe root AGENTS.md is suppressed (Continue does not read it).\n\nRegistered via one ToolSpec (auto-wired). Golden fixture extended (13 tools x 2);\nexisting tools byte-identical. Full suite green (2162).",
          "is_bot": false,
          "headline": "feat: add Continue.dev generator (PRO-55) (#83)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-13T02:00:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "618d2b1316748a333e5707a39490e74cf805a794",
          "body": "…ed (PRO-54) (#82)\n\nAdd Windsurf integration tests to test_tool_switching.py: Windsurf emits\n.windsurf/rules/ + .windsurf/skills/ and NO AGENTS.md, is detected as the\ncurrent tool, its artifacts are cleaned on switch-away, and switching\nwindsurf->cursor cleans the Windsurf artifacts. Document Windsu\n[…]\nin README, docs/INDEX, and docs/ARCHITECTURE.\n\nThe 12k rules char-cap is handled by graceful truncation in v1; explicit\nenforcement is tracked as a follow-up (PRO-61).\n\nFull suite green (2156 passed).",
          "is_bot": false,
          "headline": "test/docs: Windsurf switching coverage + document Windsurf as support…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T14:25:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3da18d89dc2191be58fba136ea6601fdbbfbf883",
          "body": "Add a Windsurf / Cascade emission target. Windsurf has no agent primitive and a\nhard ~12k-char rules budget, so each agent is emitted as a skill\n(.windsurf/skills/<slug>/SKILL.md) — skills are progressively disclosed and\nescape the budget. Conventions go to .windsurf/rules/ with Cascade trigger\nfron\n[…]\nmatter (auto_execution_mode\nis under-documented and omitted).\n\nRegistered via one ToolSpec (auto-wired). Golden fixture extended (12 tools x 2);\nexisting tools byte-identical. Full suite green (2154).",
          "is_bot": false,
          "headline": "feat: add Windsurf generator (PRO-52) (#81)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T14:19:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af12c10f2a75d0e51993ab64b8e857eb1da18a85",
          "body": "…ed (PRO-51) (#80)\n\nAdd Amazon Q integration tests to test_tool_switching.py: Amazon Q emits\n.amazonq/cli-agents/ + .amazonq/rules/ and NO AGENTS.md, is detected as the\ncurrent tool, its artifacts are cleaned on switch-away, and switching\namazonq->kilo-ide cleans the Amazon Q artifacts. Document Amazon Q as the 10th\nsupported builder in README, docs/INDEX, and docs/ARCHITECTURE (noting the\nno-AGENTS.md behavior).\n\nFull suite green (2147 passed).",
          "is_bot": false,
          "headline": "test/docs: Amazon Q switching coverage + document Amazon Q as support…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T05:59:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1b9d67792244becf65565813d8c22ef4a20e3c3",
          "body": "Add an Amazon Q Developer CLI emission target — the most divergent so far:\n- Agents are JSON (.amazonq/cli-agents/<slug>.json) with a resources glob\n  (file://.amazonq/rules/**/*.md) so conventions load (custom agents do not\n  inherit the default agent's resources).\n- Conventions go to .amazonq/rule\n[…]\nt Updated\" line — a latent fragility the date rollover\nsurfaced). Fixture regenerated (11 tools x 2, date-normalized, self-checked).\n\nRegistered via one ToolSpec (auto-wired). Full suite green (2145).",
          "is_bot": false,
          "headline": "feat: add Amazon Q generator + date-stable golden harness (PRO-49) (#79)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T05:54:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d84fb86598d8a667c00a672322e6542411faf254",
          "body": "…PRO-47) (#78)\n\nAdd Gemini integration tests to test_tool_switching.py: Gemini emits\n.gemini/agents/ + .gemini/settings.json, is detected as the current tool, its\nartifacts are cleaned on switch-away, and switching gemini->claude cleans the\nGemini artifacts. Document Gemini CLI as the 9th supported builder in README,\ndocs/INDEX, and docs/ARCHITECTURE.\n\nFull suite green (2138 passed).",
          "is_bot": false,
          "headline": "test/docs: Gemini switching coverage + document Gemini as supported (…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T04:34:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c0f7ac0efe16e3417a1cc30513061126c6cdb22",
          "body": "Add a Google Gemini CLI emission target. Agents are one file per agent\n(.gemini/agents/<slug>.md, frontmatter name/description + system-prompt body,\nlike Junie). Skills ride the E2 emitter (.gemini/skills/); workflows become\n.gemini/commands/<slug>.toml (Markdown wrapped in a TOML literal string, no\n[…]\nonly name+description agent frontmatter (the subagent frontmatter\ncontract is recent/evolving). Golden fixture extended (10 tools x 2 variants);\nexisting tools byte-identical. Full suite green (2136).",
          "is_bot": false,
          "headline": "feat: add Gemini CLI generator (PRO-45) (#77)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T04:30:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f1d7abc9ee6b3a90b87c70b1e0f5f0d3b44be0b",
          "body": "…) (#76)\n\nAdd Zed integration tests to test_tool_switching.py: Zed emits .agents/skills/,\nis detected as the current tool, its artifacts are cleaned on switch-away, and\nswitching zed->junie cleans the Zed artifacts. Document Zed as the 8th supported\nbuilder in README, docs/INDEX, and docs/ARCHITECTURE.\n\nFull suite green (2129 passed).",
          "is_bot": false,
          "headline": "test/docs: Zed switching coverage + document Zed as supported (PRO-43…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T03:57:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81f32bda453018855bd8a6a731c59aaf300e2c10",
          "body": "Add a Zed emission target. Zed has no custom-agent primitive (single agent that\nreads Instructions + Skills), so each prompticorn agent is emitted as a skill\nunder .agents/skills/<slug>/SKILL.md (YAML frontmatter + system-prompt body),\nalongside real skills (E2, base .agents). The always-on routing \n[…]\n\ntools byte-identical. Full suite green (2127).\n\nNote: .agents/skills/ is shared with a future Codex generator (PRO-16) — the\ncurrent_tool detection collision is flagged for when Codex lands (PRO-42).",
          "is_bot": false,
          "headline": "feat: add Zed generator (PRO-41) (#75)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T03:51:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "518330d3fc575557f72ba8dfc5b9cc8e0ec3ef50",
          "body": "…O-40) (#74)\n\nAdd Junie integration tests to test_tool_switching.py: Junie emits .junie/agents/,\nis detected as the current tool, its artifacts are cleaned on switch-away, and\nswitching junie->roo cleans the Junie artifacts. Document Junie (CLI) as the 7th\nsupported builder in README, docs/INDEX, an\n[…]\n (that\nharness assumes string output per non-Claude tool; Junie returns a string, but\nits cross-tool build coverage is the golden byte-identical harness + unit tests).\n\nFull suite green (2122 passed).",
          "is_bot": false,
          "headline": "test/docs: Junie switching coverage + document Junie as supported (PR…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T03:17:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "516b1fea75de76c99e58912b751d7390113e1890",
          "body": "Add a JetBrains Junie (CLI) emission target. Junie agents are one Markdown file\nper agent (.junie/agents/<slug>.md, YAML frontmatter + system-prompt body), so\nunlike Roo's aggregate .roomodes this fits the per-agent write model directly —\nJunieLayout mirrors the Kilo per-agent pattern with no finali\n[…]\nderFactory + _LAYOUTS entry, so Junie is\nautomatically wired into both CLI pickers and dispatch. Golden fixture extended\n(8 tools x 2 variants); existing tools byte-identical. Full suite green (2120).",
          "is_bot": false,
          "headline": "feat: add Junie CLI generator (PRO-38) (#73)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T03:12:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a0c404b18f644cd683056ccb2bc1174990351d0",
          "body": "…) (#72)\n\nAdd Roo integration tests to test_tool_switching.py: Roo emits .roomodes + .roo/,\nis detected as the current tool, its artifacts are cleaned on switch-away, and\nswitching claude->roo cleans the Claude artifacts. Document Roo Code as the 6th\nsupported builder in README, docs/INDEX, and docs\n[…]\neturns\na dict. Roo's cross-tool build coverage instead lives in the golden\nbyte-identical harness (both variants) plus test_roo_builder unit tests, which\nare stronger.\n\nFull suite green (2111 passed).",
          "is_bot": false,
          "headline": "test/docs: Roo switching coverage + document Roo as supported (PRO-36…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T02:16:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5230f2cc023d0099fc354bd1af6610b6d287fa19",
          "body": "Add a Roo Code emission target on the tool foundation. Agents become Roo custom\nmodes in a single aggregate .roomodes file (assembled once via a new generic\nToolLayout.finalize hook), with each agent's bulk prompt written to\n.roo/rules-{slug}/ (Roo loads those per-mode) rather than inlined — .roomod\n[…]\ners and dispatch. Golden fixture\nextended to lock Roo's byte output; the six existing tools stay byte-identical.\n\nFull suite green (2109 passed). Design + source-verified format in the Linear\nRoo doc.",
          "is_bot": false,
          "headline": "feat: add Roo Code generator (PRO-34) (#71)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T02:09:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "520fb19214bac0e09c5c28a27b192916732539ef",
          "body": "Replace the hardcoded `if self.tool_name == ...` branches in prompt_builder.py\nwrite paths with a ToolLayout strategy per internal builder\n(prompticorn/builders/layouts.py). Each layout owns its file placement\n(write_agent, write_skill) and declares capabilities (writes_subagents /\nwrites_workflows \n[…]\nden_tool_output.json): builds every tool id x variant and asserts the file\ntree (path + sha256) is unchanged. No `self.tool_name ==` branches remain in the\nwrite paths. Full suite green (2097 passed).",
          "is_bot": false,
          "headline": "refactor: extract per-tool write-layout strategy (PRO-60) (#70)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-12T00:08:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55caf672890cb91b3f7ec4820dbbce25092ea7d6",
          "body": "Add prompticorn/builders/skill_emitter.py: a tool-agnostic writer for the Agent\nSkills spec folder <base>/skills/<name>/SKILL.md. This shape is identical across\nCodex, Zed, Roo, Junie and is already what Claude/Kilo/Cline/Cursor emit — only\nthe base directory differs.\n\nRefactor prompt_builder._write\n[…]\neeps its flat\n.github/skills/<name>.md layout). Byte-identical output; a base_dir of \".agents\"\nmakes the emitter ready for the upcoming Codex/Zed/Roo/Junie generators.\n\nFull suite green (2088 passed).",
          "is_bot": false,
          "headline": "feat: extract reusable SKILL.md emitter (PRO-32) (#69)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-11T23:53:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "387bdfb2d39506cf19a44a2b3c869ae977c72d9d",
          "body": "Rework the canonical AGENTS.md emitter so a plain AGENTS.md is a working\nbaseline for every tool that reads it natively (Codex, Zed, Windsurf, Roo,\nJunie): an agent routing index plus the inlined core/general conventions\n(sourced via generate_core_convention). Drop the Kilo-specific .kilo/rules/\nfra\n[…]\n repository type\n/ project so conventions render with the user's actual choices. Adds unit tests\n(routing table, inlined conventions, no tool-specific layout leakage).\n\nFull suite green (2083 passed).",
          "is_bot": false,
          "headline": "feat: enrich AGENTS.md into a self-contained baseline (PRO-31) (#68)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-11T23:48:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c9facd51a4b7a91b96945530406192386b519dd",
          "body": "…-30) (#67)\n\nIntroduce prompticorn/tools.py: one declarative ToolSpec per tool as the single\nsource of truth for tool metadata and dispatch. Derive the previously-duplicated\nlists from it:\n\n- cli_utils.SUPPORTED_TOOLS + TOOL_MAPPINGS\n- prompt_builder.get_prompt_builder id->builder dispatch\n- both cl\n[…]\nacts iteration order (current_tool detection) both\npreserved. Full suite green (2076 passed).\n\nExtracting the per-tool write-layout branches in prompt_builder.py is tracked\nseparately as F2b (PRO-60).",
          "is_bot": false,
          "headline": "refactor: central ToolSpec registry for tool metadata + dispatch (PRO…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-11T23:39:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "800738ef43bb8dcf0f08d2e4bf0bed7c7bb42fa0",
          "body": "Replace the hand-maintained per-tool `remove` sets in ARTIFACT_FILES with a\nderivation: remove(tool) = (union of every other tool's create set) plus the\nshared legacy artifacts. Create sets become the single source of truth, so the\nO(n^2) cross-editing (adding a tool meant touching every other tool'\n[…]\n is\ngone and remove sets can no longer drift.\n\nBehavior-preserving: the derived map is byte-for-byte equal to the previous\nhand-written map for all six tools. Adds unit tests locking in the invariant.",
          "is_bot": false,
          "headline": "refactor: derive artifact remove-sets from create sets (PRO-29) (#66)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-11T23:15:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "505b7fcaf542fecec22c2ee46b2c5faf19ceb86f",
          "body": "…(#64)\n\nRe-scope the init questionnaire onto three tiers and activate the dormant\nfungible (per-folder) tier.\n\n- Wire get_fungible_questions into the monorepo per-folder flow; API/UI/worker\n  framework questions were previously never asked.\n- Add per-language *DataAccessQuestion classes + multi-sele\n[…]\npescript/go;\n  remaining languages tracked in PRO-2.\n- One-shot idempotent migration normalizing legacy scalar project.orm/database to\n  the new per-spec list shape; switch renderers to the new shape.",
          "is_bot": false,
          "headline": "feat: re-tier init questions + wire fungible per-folder tier (PRO-1) …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-11T23:02:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0991eb8af904cbc5471e3a2e4771e06fa369e4b",
          "body": "Planning now lives in Linear (issues + project documents), not local docs.\nRemove the entire planning/ tree; unique design/ADR/research content was\nmigrated to Linear documents beforehand.",
          "is_bot": false,
          "headline": "chore: migrate planning to Linear, remove local planning tree (#65)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-07-11T23:02:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdd99d989b11095a37c17e6632d63fbbac28d39e",
          "body": "…sion fix (#63)\n\n* chore: make package version dynamic (CI-injected) instead of a hardcoded anchor\n\npyproject carried a static `version = \"0.1.0\"` that CI string-replaced via sed —\nmisleading (it is not a real release) and confusing locally.\n\n- pyproject: declare `dynamic = [\"version\"]`, source from\n[…]\nows mappings.\n- CONTRIBUTING / DIRECTORY_STRUCTURE: test/coverage (~85%), mutmut mutation testing,\n  dynamic version scheme, and the real source tree.\n\n* chore: sync uv.lock with mutmut dev dependency",
          "is_bot": false,
          "headline": "Dynamic versioning, Phase 3 polish, and a critical conventions-regres…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-06-23T05:42:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35d14c57f967d1ac74c26b1203eb8fffead2ccc4",
          "body": "…nvention TODOs (#62)\n\n* fix: restrict PRIMARY_AGENTS_LIST to active-persona agents\n\nThe orchestrator's agent list listed all primary agents regardless of persona, so\nit referenced agents whose files were never generated for the selected personas.\n\n- primary_agents_handler: select top-level agents e\n[…]\nilently tolerated.\n\nSources: LuaRocks style guide, R Packages (r-pkgs.org), Gradle Groovy plugin,\nGoogle/Apple Objective-C conventions, Flyway/Supabase SQL migration layout, MDN\nstatic-site structure.",
          "is_bot": false,
          "headline": "fix: persona-filter orchestrator agent list and clean up remaining co…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-06-21T16:58:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7dc7f1959c508155fe3bbe1e42d5e8a1780442fd",
          "body": "…machinery (#61)\n\n* fix: rewrite list/validate on agent discovery and retire dead concat machinery\n\nThe `list` and `validate` CLI commands read a stale hand-maintained registry that\nstill described the old flat prompts/ layout, so both reported false MISSING/ORPHAN\nerrors after the move to agents/-b\n[…]\nision-log workflow example\n\nThe ADR-numbering CI example used `cd docs/decisions`, inconsistent with the\nADR-format step above it (planning/current/adrs/). Align it with the migrated\nplanning/ layout.",
          "is_bot": false,
          "headline": "fix: rewrite list/validate on agent discovery and retire dead concat …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-06-20T00:51:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b958a662afaa5a46062e69e850419be442428f3f",
          "body": "…ables (#60)\n\n* fix: populate generated assistant conventions and agent template variables\n\nThe config build path emitted unrendered template variables and raw Jinja2:\nlanguage conventions shipped literal {{ language }}/macro imports, spec choices\nnever reached the conventions, and the orchestrator \n[…]\nes not capture (Database, ORM, commit\nstyle, PR size, deploy target, src layout) remain intentional user fill-ins.\n\n* docs: update template-population plan (Phases 0-3b done; Phase 4 pending decision)",
          "is_bot": false,
          "headline": "fix: populate generated assistant conventions and agent template vari…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-06-17T13:58:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39f1e946f1e61a6c54eda72349c9164f74980045",
          "body": "Co-authored-by: cloudflare-workers-and-pages[bot] <73139402+cloudflare-workers-and-pages[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Add Cloudflare Workers configuration (#58)",
          "author_name": "cloudflare-workers-and-pages[bot]",
          "author_login": "cloudflare-workers-and-pages[bot]",
          "committed_at": "2026-05-15T06:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6213b7564ba9a867593f14a8931f7e5533e8920",
          "body": null,
          "is_bot": false,
          "headline": "feat: add manual Cloudflare Pages deploy workflow (#59)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-05-15T05:58:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f515c8bfd2a2ccd4638dcf0910efc55e7f01cb9",
          "body": "* feat: Complete Prompt System Enhancements with SOLID Architecture, Multi-Language Support, and Pipeline UI (#1)\n\n* feat: refactor to SOLID OOP with sweet_tea factory and add testing\n\n* docs: enhance testing prompt with coverage targets and specialized approaches\n\n* docs: expand testing prompt with\n[…]\neals two competing systems and architectural debt\n\nAnalysis of all 5 builders (Cline, Cursor, Copilot, KiloIDE, KiloCLI):\n- Discovered registry-based system (3 builders) vs kilo-modes system (2 build…",
          "is_bot": false,
          "headline": "feat: update agent registry, skills, subagents and workflows (#57)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-05-15T05:19:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c55f74a1e2b1336d1e6295826b91eee1ea666aa9",
          "body": "Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: migrate .promptosaurus directory to .prompticorn on startup (#56)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-05-15T04:57:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca1201a2357aac9b9cf203de55763870aa69f317",
          "body": "* feat: rebrand promptosaurus → prompticorn\n\nRenamed the Python package directory, CLI entry point, config files,\nand all references across source, tests, docs, website, and CI.\n\n- promptosaurus/ → prompticorn/ (package directory)\n- .promptosaurus.yaml → .prompticorn.yaml (config file)\n- .promptosau\n[…]\nbb / orange #ee7733) on top of any active mode\n- Preference persists via localStorage\n\n* fix: correct repo URLs to snoodleboot-io/prompticorn\n\n* fix: restore test placeholders so CI pytest jobs exit 0",
          "is_bot": false,
          "headline": "feat: lowercase prompticorn brand name and add accessible colours (#54)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-05-15T04:23:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "29e2d9bab73ac6d9c3d767c07484daa1630d5d8b",
          "body": "* feat: Complete Prompt System Enhancements with SOLID Architecture, Multi-Language Support, and Pipeline UI (#1)\n\n* feat: refactor to SOLID OOP with sweet_tea factory and add testing\n\n* docs: enhance testing prompt with coverage targets and specialized approaches\n\n* docs: expand testing prompt with\n[…]\niant terminals\n- Prevents terminal corruption and state pollution\n- Respects terminal size constraints\n- Handles edge cases (small terminals, etc.)\n- Clean separation of curses vs fallback rendering\n…",
          "is_bot": false,
          "headline": "feat: add product website (multi-mode GitHub Pages site) (#53)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-05-14T20:12:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e29ce0953c65c5470873db1fd3b60c82e8dc405",
          "body": "* fix: support item selection 10+ in multi-select menus via digit buffering\n\nIn multi-select mode, digit keypresses now buffer silently and commit\nwhen the user presses space, comma, or after a 500ms pause. Previously\neach digit fired immediately, making items 10+ unreachable.\n\n- Add SEPARATOR and T\n[…]\nchanism\n- Add test_command_factory.py covering all buffering scenarios\n- Update docs: CHANGELOG, ARCHITECTURE, INTERACTIVE_WALKTHROUGH\n\n* update\n\n---------\n\nCo-authored-by: John <john@snoodleboot.com>",
          "is_bot": false,
          "headline": "fix: support item selection 10+ in multi-select menus (#52)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-26T07:25:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d837fa6510b32a1ed0ca24a2516d15fb320bac9b",
          "body": null,
          "is_bot": false,
          "headline": "update stuff",
          "author_name": "John",
          "author_login": null,
          "committed_at": "2026-04-26T06:14:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5e5896f8dbea9f37d76fd649e556ff0c80c62e8",
          "body": null,
          "is_bot": false,
          "headline": "update stuff",
          "author_name": "John",
          "author_login": null,
          "committed_at": "2026-04-26T06:14:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c96efca21963ed1b5529d28ac330a043cf83953",
          "body": "… (#50)\n\n* fix: expand multilang UI paths and support numeric selection beyond 9\n\n- Add dart, swift, kotlin, elm, html to frontend/ui and frontend/library\n- Add kotlin, scala, elixir to backend/api and backend/library\n- Add swift to backend/library; kotlin, elixir, ts/js to backend/worker\n- Add java\n[…]\n mode\n- FallbackInputProvider accepts space as separator alongside comma\n  (e.g. \"1 2 3\" or \"1,2,3\"), and updates its prompt to make this clear\n\n\n---------\n\nCo-authored-by: John <john@snoodleboot.com>",
          "is_bot": false,
          "headline": "fix: expand multilang UI paths and support numeric selection beyond 9…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-21T16:02:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "86a97bf4cccda120b4b1c373e0266c1d58f3115d",
          "body": "* feat: add GitHub Pages product website (two design variants)\n\nTwo standalone static sites deployable to GitHub Pages with no build step:\n\n- webpage1/ — nerdy dark aesthetic (Promptosaurus 2 logo), electric green/blue\n  palette, D3.js force graph + Mermaid diagrams, animated hero logo\n- webpage2/ —\n[…]\n- Add ResizeObserver to reflow D3 force simulation viewBox and recenter\n  nodes on viewport/orientation change\n- Add max-width:100%; height:auto to Mermaid SVGs to prevent overflow\n\n\n* push\n\n---------",
          "is_bot": false,
          "headline": "Feat/GitHub page (#49)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-15T21:01:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "235c6a9b01374a1974341c63fcd51b191e0f392a",
          "body": "* feat: add GitHub Pages product website (two design variants)\n\nTwo standalone static sites deployable to GitHub Pages with no build step:\n\n- webpage1/ — nerdy dark aesthetic (Promptosaurus 2 logo), electric green/blue\n  palette, D3.js force graph + Mermaid diagrams, animated hero logo\n- webpage2/ —\n[…]\nscreens\n- Add ResizeObserver to reflow D3 force simulation viewBox and recenter\n  nodes on viewport/orientation change\n- Add max-width:100%; height:auto to Mermaid SVGs to prevent overflow\n\n\n---------",
          "is_bot": false,
          "headline": "feat: GitHub Pages product website (two design variants) (#48)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-15T20:55:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "69b01d43d05ee06a45793cd9097be0e287cc1cdd",
          "body": "… and docs (#47)\n\n* fix: Remove Python language override causing ML skills to leak to all agents\n\nThe `language_skill_mapping.yaml` had a global `python:` section that was\napplying ML-specific skills and workflows to ALL agents when the project\nlanguage was Python, regardless of persona or agent typ\n[…]\nenerates many Markdown files vs Kilo's single YAML output,\nmaking ratio comparisons environment-sensitive. CI runners show 32x ratio\nvs ~18x locally. 50x gives sufficient headroom for any environment.",
          "is_bot": false,
          "headline": "feat: Split SE personas, fix ML skill leak, remove ABC, fix all tests…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-15T07:21:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7bcfd482071ff0612a9676065e81f9b02e6ed6e",
          "body": "…#46)\n\n* fix: add missing options and default properties to all language version questions\n\nCritical bug fix: 20 language version question classes were missing required\n'options' and 'default' properties, causing TypeError when running 'promptosaurus init'\nfor any language except TypeScript.\n\nFixed \n[…]\nhnical-decision-making\n- Workflows: meta, multi-agent-coordination, task-breakdown, workflow-orchestration-patterns\n\nAll agents now match promptosaurus/configurations/agent_skill_mapping.yaml exactly.",
          "is_bot": false,
          "headline": "fix: add missing options property to 53 question classes (CRITICAL) (…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-14T03:21:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7accd71064e6cd0f8294fd7b326ad4c11cc1b3e",
          "body": "…allucinations, correct counts (#44)\n\n* fix(docs): remove development docs and fix hallucinations, counts, phase refs\n\nComprehensive documentation audit revealed and fixed:\n- Removed 5 development docs from user-facing docs/ (TEST_CONVENTIONS,\n  TECHNICAL_DEBT, QUALITY_METRICS, MAINTENANCE_WORKFLOW,\n[…]\nto 15x to account for CI variance\n\nThese changes align with the removal of the hardcoded model field from\nkilo_builder.py. The model field should only be present when explicitly\nspecified by the user.",
          "is_bot": false,
          "headline": "fix(docs): comprehensive documentation audit - remove dev docs, fix h…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-13T21:58:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cc6a935355f0e9e5755b6a27e5be339c9477d6ce",
          "body": "* docs: Prompt system redesign analysis\n\nComprehensive analysis of three redesign initiatives:\n\n1. VERBOSE vs MINIMAL prompts\n   - Current system: 5-10k tokens per mode\n   - Minimal variant: ~500-1k tokens (10x reduction)\n   - Proposed: Option B (separate .kilocode/rules-minimal/ directory)\n   - Eff\n[…]\nnt)\n✓ document (1 subagent)\n✓ explain (1 subagent)\n✓ migration (1 subagent)\n✓ code (6 subagents)\n✓ review (3 subagents)\n✓ security (1 subagent)\n✓ compliance (1 subagent)\n✓ enforcement\n✓ planning\n✓ as…",
          "is_bot": false,
          "headline": "docs: comprehensive documentation and code improvements (#42)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-13T17:55:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c56eb8615c8ec447ea49fc1196122b0b326d81a9",
          "body": "* updated prompt stuff\n\n* feat: Add template variable substitution to all builders\n\n* update stuff\n\n* update stuff\n\n* fix: resolve pre-commit hooks by fixing Pyright type checking errors\n\n* fix: TypeScript version question default to use latest major version (5.x)\n\n* refactor: extracted the template\n[…]\ne UI rendering issues:\n- Menu text overlapping when navigating options\n- Arrow keys not working properly\n- Multi-line explanations corrupting display\n- Missing explanations for package manager options",
          "is_bot": false,
          "headline": "Feat/feat 001 migrate to jinja (#40)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-04-08T21:40:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33659d2eaa5fff90a72bec3624e240a2ece28b77",
          "body": "* chore: fix\n\n* feat: integrate methodology into project planning system",
          "is_bot": false,
          "headline": "Feat/proj xxx integrate methodology into project planning (#39)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-15T13:25:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfede3b05f095e27a65d17165bf35635fb1496e3",
          "body": "* feat: automatically create sessions directory when ensuring config dir exists\n\n* chore: workign on the pipeline\n\n* chore: fix pipeline formatting\n\n* chore: fix pipeline formatting\n\n* chore: fix pipeline formatting\n\n* feat: update planning prompts to use specific folders (prd, ard, tasks), clarify \n[…]\n Update CI/CD workflow to include event action\n\n* chore: fix\n\n* chore: fix\n\n* chore: fix\n\n* chore: fix\n\n* chore: fix\n\n* fix: added verison information back in\n\n* fix: added verison information back in",
          "is_bot": false,
          "headline": "Feat/auto create sessions directory (#38)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-15T05:13:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d53d843295d25e1574084918aa74530ea6dc669b",
          "body": "* feat: automatically create sessions directory when ensuring config dir exists\n\n* chore: workign on the pipeline\n\n* chore: fix pipeline formatting\n\n* chore: fix pipeline formatting\n\n* chore: fix pipeline formatting\n\n* feat: update planning prompts to use specific folders (prd, ard, tasks), clarify \n[…]\nrsion extraction and formatting logic in calculate_version.py to improve clarity and compliance with PEP 440.\n\n* Update CI/CD workflow to include event action\n\n* chore: fix\n\n* chore: fix\n\n* chore: fix",
          "is_bot": false,
          "headline": "Feat/auto create sessions directory (#37)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-15T04:51:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4530ad3f74d7e6101efd0d1138e931ebcabddfd7",
          "body": "…… (#34)\n\n* feat: automatically create sessions directory when ensuring config dir exists\n\n* chore: workign on the pipeline\n\n* chore: fix pipeline formatting\n\n* chore: fix pipeline formatting\n\n* chore: fix pipeline formatting\n\n* feat: update planning prompts to use specific folders (prd, ard, tasks)\n[…]\nrsion extraction and formatting logic in calculate_version.py to improve clarity and compliance with PEP 440.\n\n* Update CI/CD workflow to include event action\n\n* chore: fix\n\n* chore: fix\n\n* chore: fix",
          "is_bot": false,
          "headline": "feat: automatically create sessions directory when ensuring config di…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-15T04:33:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "68736b956358090876f7e8f2faa31038fa14c627",
          "body": "* Refactor version handling in calculate_version.py\n\nRefactor version extraction and formatting logic in calculate_version.py to improve clarity and compliance with PEP 440.\n\n* Update CI/CD workflow to include event action",
          "is_bot": false,
          "headline": "Fix builds (#36)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-15T04:23:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3237b8d2d7436ccb4d5f3023eeacb17ba852b9ba",
          "body": null,
          "is_bot": false,
          "headline": "Change project version from 0.2.0 to 0.1.0 (#35)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-15T04:05:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b8d25f1fe3341cf7fbb7f6ba03695727f88fdae",
          "body": "* feat: Update planning prompts to use specific folders and clarify subtasks/agents usage; fix Python standards violations\n\n* feat: update planning prompts to use specific folders (prd, ard, tasks), clarify subtasks/agents usage, fix Python standards violations, and strengthen ticket ID guidance to \n[…]\nrevent hallucination\n\n* fix: resolve import errors in test files by replacing incorrect REPO_TYPE_* imports with RepositoryTypes class references\n\n* chore: fix lint\n\n* chore: version\n\n* chore: version",
          "is_bot": false,
          "headline": "Feat/proj 123 planning prompts and python standards (#33)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-14T06:40:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4da140aeea7f2fc87c452a9b56d7ddfdb350080",
          "body": "…s), clarify subtasks/agents usage, fix Python standards violations, and strengthen ticket ID guidance to prevent hallucination (#32)\n\n* feat: Update planning prompts to use specific folders and clarify subtasks/agents usage; fix Python standards violations\n\n* feat: update planning prompts to use sp\n[…]\nd strengthen ticket ID guidance to prevent hallucination\n\n* fix: resolve import errors in test files by replacing incorrect REPO_TYPE_* imports with RepositoryTypes class references\n\n* chore: fix lint",
          "is_bot": false,
          "headline": "feat: update planning prompts to use specific folders (prd, ard, task…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-14T05:36:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ec69669e3550d75ee70a4204dc96c2d282bd97a",
          "body": "…(#31)\n\n* fix: ensure main branch publishes clean versions without .dev suffix\n\n* fix: correct indentation error in calculate_version.py main function definition\n\n* chore: linting issue",
          "is_bot": false,
          "headline": "fix: ensure main branch publishes clean versions without .dev suffix …",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-13T16:05:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1647bff1bbdfd40f4a889c42205e04403f89dc6d",
          "body": "* feat: add multi-language monorepo support\n\n* feat: implement core vs fungible configuration for multi-language monorepo",
          "is_bot": false,
          "headline": "feat: add multi-language monorepo support (#30)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-13T14:31:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51c5a1621024089aa6c638b0d0b9dcc3a29ce09d",
          "body": "* refactor: strengthen branch/session rules to reject common excuses\n\n* fix(ci-cd): publish to PyPI on push to main (not just PR closed)",
          "is_bot": false,
          "headline": "refactor: strengthen branch/session rules + fix CI/CD PyPI publish (#29)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-10T14:50:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7b9e63ec105613fcba04759d4815aa5c0b2c351",
          "body": null,
          "is_bot": false,
          "headline": "docs: add CONTRIBUTING.md with development guidelines",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-10T03:14:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6359aa4ac7a97cdb43da0c25fa7b913509c08b6c",
          "body": null,
          "is_bot": false,
          "headline": "docs: rewrite README as product page with correct install instructions",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-10T03:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b9a90fbff54aefd97fda84c97344a09c3e7fe27",
          "body": "* small fix\n\n* fixed name\n\n* chore: removed uv version restyriction\n\n* chore: wso\n\n* chore: wso\n\n* udpated cicd\n\n* fix(ci-cd): implement PyPI-based semantic versioning\n\n* style: fix ruff lint errors in calculate_version.py\n\n* fix(ci-cd): handle non-PR pushes and fix version format\n\n* fix: use + inst\n[…]\nendency for verify jobs\n\n* fix: add __version__ to package using importlib.metadata\n\n* fix: sort imports correctly in __init__.py\n\n* fix: add retry logic to verify jobs for package availability delays",
          "is_bot": false,
          "headline": "fix(ci-cd): implement PyPI-based semantic versioning (#28)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-10T02:50:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f31378e9f45d97c66f37cdb9fc74a61f0860d452",
          "body": "* small fix\n\n* fixed name\n\n* chore: removed uv version restyriction",
          "is_bot": false,
          "headline": "small fix (#27)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-09T18:01:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1147540564adbf97b91124aacbf4ca9b05abdfb6",
          "body": "* fix(ci-cd): enable publish stages to run correctly\n\n* fix(tests): fix failing tests for unknown language handling",
          "is_bot": false,
          "headline": "fix(ci-cd): enable publish stages to run correctly (#26)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-09T17:19:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "182c1ca75cc99bfa9df415ab9a1e12b8aa7f20ad",
          "body": "* updated configurations\n\n* Add comprehensive documentation with Mermaid diagrams",
          "is_bot": false,
          "headline": "Add comprehensive documentation with Mermaid diagrams (#25)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-09T04:50:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcb55950ee88d638be1fd6f1b50b069fb8db06d6",
          "body": "* chore: small fixes\n\n* refactor: cleaning thingsup\n\n* refactor: cleaning thingsup\n\n* refactor: WIP\n\n* refactor: fixing imports\n\n* chore: cleanup\n\n* feat(conventions): add naming conventions to all language-specific files\n\n* chore: cleanup\n\n* feat(questions): add Python coverage targets question\n\n* fix(ui): pass none_index to selector for mutual exclusion\n\n* refactor: updated\n\n* chore: meh",
          "is_bot": false,
          "headline": "Refactor/builder convention fixes (#24)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-09T00:03:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45a4e8d0138484b4e3030450278d7b22b9e8c996",
          "body": "* fix: resolve custom modes not being generated\n\n* chore: add generated rules directories for built-in modes",
          "is_bot": false,
          "headline": "fix: resolve custom modes not being generated (#23)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-08T03:34:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "230fec91845d0905eb0b22963409c22e7576bb57",
          "body": "…#22)\n\n* missed commits\n\n* feat: add Kilo builder architecture with switch/update CLI commands",
          "is_bot": false,
          "headline": "feat: add Kilo builder architecture with switch/update CLI commands (…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-07T18:00:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b75f4136734abb6d530eb1338d9a3b22d71a6aac",
          "body": "…fault (#21)\n\n* fix: Generate rules in .kilocode instead of .kilo\n\n* fix: populate .kilocode/rules/ with all core files\n\n* feat: change AI assistant selection to single-select with kilo-ide default",
          "is_bot": false,
          "headline": "feat: change AI assistant selection to single-select with kilo-ide de…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-06T21:13:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97084e9b5cd1f49880381f090b9e0bb50c6d2d05",
          "body": "* lots of changes\n\n* refactor: changed prompts\n\n* fixed tests\n\n* fixed tests\n\n* feat: finished refactoring",
          "is_bot": false,
          "headline": "Feat/refactor new kilo needs (#20)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-06T03:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e94ea81d9579dc70186d077a3bd930b7db8315ac",
          "body": null,
          "is_bot": false,
          "headline": "feat: add core file prerequisites to all mode prompts (#19)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-05T04:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e7b5c3bb3fb7c06e802526f897b2bce94142642",
          "body": "* feat: integrate new prompts into registry\n\n* refactor: udpated stuf",
          "is_bot": false,
          "headline": "Feat/new prompt version (#18)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-04T19:21:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1dd72fc183e5f822733fa7c544a29ccb9c1b75ed",
          "body": null,
          "is_bot": false,
          "headline": "feat: integrate new prompts into registry (#17)",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-04T18:09:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11a4e860f2cb8c2a37f12b8ccab3b87a8dbd3add",
          "body": "…cement (#16)",
          "is_bot": false,
          "headline": "fix: standardize path comments and rename coding-enforcement to enfor…",
          "author_name": "John Aven",
          "author_login": "snoodleboot",
          "committed_at": "2026-03-04T17:36:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 1,
      "commits_last_year": 115,
      "latest_release_at": "2026-04-08T21:40:58Z",
      "latest_release_tag": "v2.1.0",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 11,
      "days_since_latest_release": 111,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": false,
      "has_contributing": true,
      "health_percentage": 25,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "prompticorn",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "ai",
            "cli",
            "coding-assistant",
            "configuration",
            "prompts",
            "Development Status :: 3 - Alpha",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3 :: Only",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.14",
            "Topic :: Software Development :: Libraries :: Python Modules",
            "Topic :: Utilities"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/prompticorn/",
          "is_deprecated": false,
          "latest_version": "1.31.0",
          "repository_url": "https://github.com/snoodleboot-io/prompticorn",
          "versions_count": 33,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2754,
          "first_published_at": "2026-05-15T04:26:03.017479Z",
          "latest_published_at": "2026-07-29T03:08:59.322114Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 52204,
      "source_files_sampled": 460,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "examples/cline/.clinerules",
        "examples/cursor/.cursorrules"
      ],
      "agent_instruction_max_bytes": 9483
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "click",
            "direct": true,
            "version": "8.3.1",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 7.2,
            "advisory_ids": [
              "PYSEC-2026-2132"
            ],
            "fixed_version": "8.3.3",
            "advisory_count": 1,
            "oldest_advisory_days": 89
          },
          {
            "name": "pytest",
            "direct": false,
            "version": "9.0.2",
            "severity": "moderate",
            "ecosystem": "pypi",
            "cvss_score": 6.8,
            "advisory_ids": [
              "GHSA-6w46-j5rx-g56g",
              "PYSEC-2026-1845"
            ],
            "fixed_version": "9.0.3",
            "advisory_count": 2,
            "oldest_advisory_days": 187
          },
          {
            "name": "pygments",
            "direct": false,
            "version": "2.19.2",
            "severity": "low",
            "ecosystem": "pypi",
            "cvss_score": 3.3,
            "advisory_ids": [
              "GHSA-5239-wwwm-4pmq",
              "PYSEC-2026-2987"
            ],
            "fixed_version": "2.20.0",
            "advisory_count": 2,
            "oldest_advisory_days": 128
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "low": 1,
          "high": 1,
          "moderate": 1
        },
        "advisory_count": 5,
        "affected_count": 3,
        "assessed_count": 50,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "click",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=8.1"
        },
        {
          "name": "jinja2",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.0.0"
        },
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0"
        },
        {
          "name": "prompt_toolkit",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.0.0"
        },
        {
          "name": "pyyaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0"
        },
        {
          "name": "ruamel.yaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.18"
        },
        {
          "name": "sweet_tea",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.1.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "click",
            "direct": true,
            "version": "8.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "jinja2",
            "direct": true,
            "version": "3.1.6",
            "ecosystem": "pypi"
          },
          {
            "name": "prompt-toolkit",
            "direct": true,
            "version": "3.0.52",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic",
            "direct": true,
            "version": "2.12.5",
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": "6.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "ruamel-yaml",
            "direct": true,
            "version": "0.19.1",
            "ecosystem": "pypi"
          },
          {
            "name": "sweet-tea",
            "direct": true,
            "version": "0.1.38",
            "ecosystem": "pypi"
          },
          {
            "name": "annotated-types",
            "direct": false,
            "version": "0.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "build",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cfgv",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "colorama",
            "direct": false,
            "version": "0.4.6",
            "ecosystem": "pypi"
          },
          {
            "name": "coverage",
            "direct": false,
            "version": "7.13.5",
            "ecosystem": "pypi"
          },
          {
            "name": "distlib",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "exceptiongroup",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "filelock",
            "direct": false,
            "version": "3.25.2",
            "ecosystem": "pypi"
          },
          {
            "name": "identify",
            "direct": false,
            "version": "2.6.18",
            "ecosystem": "pypi"
          },
          {
            "name": "importlib-metadata",
            "direct": false,
            "version": "8.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "iniconfig",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "libcst",
            "direct": false,
            "version": "1.8.6",
            "ecosystem": "pypi"
          },
          {
            "name": "linkify-it-py",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "markdown-it-py",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "markupsafe",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "mdit-py-plugins",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "pypi"
          },
          {
            "name": "mdurl",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "mutmut",
            "direct": false,
            "version": "3.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "nodeenv",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "packaging",
            "direct": false,
            "version": "26.0",
            "ecosystem": "pypi"
          },
          {
            "name": "platformdirs",
            "direct": false,
            "version": "4.9.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pluggy",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pre-commit",
            "direct": false,
            "version": "4.5.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic-core",
            "direct": false,
            "version": "2.41.5",
            "ecosystem": "pypi"
          },
          {
            "name": "pygments",
            "direct": false,
            "version": "2.19.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pyproject-hooks",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pyright",
            "direct": false,
            "version": "1.1.408",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": "9.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-cov",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "python-discovery",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml-ft",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "rich",
            "direct": false,
            "version": "15.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": "0.15.6",
            "ecosystem": "pypi"
          },
          {
            "name": "setproctitle",
            "direct": false,
            "version": "1.3.7",
            "ecosystem": "pypi"
          },
          {
            "name": "textual",
            "direct": false,
            "version": "8.2.7",
            "ecosystem": "pypi"
          },
          {
            "name": "toml",
            "direct": false,
            "version": "0.10.2",
            "ecosystem": "pypi"
          },
          {
            "name": "tomli",
            "direct": false,
            "version": "2.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-extensions",
            "direct": false,
            "version": "4.15.0",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-inspection",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "uc-micro-py",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "virtualenv",
            "direct": false,
            "version": "21.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "wcwidth",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "zipp",
            "direct": false,
            "version": "3.23.0",
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 50,
        "direct_count": 7,
        "indirect_count": 43
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 111,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 1,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "snoodleboot",
          "commits": 113,
          "avatar_url": "https://avatars.githubusercontent.com/u/10266249?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci-cd.yml",
        "deploy-website.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [
        "uv.lock"
      ],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not 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": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "dba99e045ebb9e6c00f7887c9641b9eaf2bc2c61",
        "ran_at": "2026-07-29T03:10:37Z",
        "aggregate_score": 4.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-29T03:00:53Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-29T03:00:08Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/snoodleboot-io/prompticorn",
    "host": "github.com",
    "name": "prompticorn",
    "owner": "snoodleboot-io"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 52,
        "vitality": 68,
        "community": 30,
        "governance": 55,
        "engineering": 82
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 115,
              "human_commit_share": 0.99,
              "days_since_last_push": 0,
              "active_weeks_last_year": 11
            },
            "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": "11/52 weeks with commits",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "115 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 115
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "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": 62,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v2.1.0",
              "releases_from_tags": true,
              "days_since_latest_release": 111,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 111 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 111
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "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": "at_risk",
        "name": "Community & Adoption",
        "value": 30,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "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": 57,
            "inputs": {
              "packages": [
                "prompticorn"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 2754
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,754 downloads/month across pypi",
                "points": 45.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2754,
                      "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": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 111,
              "open_issues": 0,
              "closed_issues": 1,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 4
            },
            "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": "111/115 decided PRs merged",
                "points": 36.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 111,
                      "decided": 115
                    }
                  }
                ],
                "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "snoodleboot-io",
              "public_repos": 14,
              "account_age_days": 520
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of snoodleboot-io",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "snoodleboot-io"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "14 public repos, account ~1 yr old",
                "points": 11.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 14
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "prompticorn"
              ],
              "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": "33 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 33
                    }
                  }
                ],
                "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": 82,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": false
            },
            "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 52,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.7
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 1",
                "points": 0.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "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": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 50 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 50
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 73,
            "inputs": {
              "source": "osv",
              "advisories": 5,
              "affected_packages": 3,
              "assessed_packages": 50,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1, moderate 1, low 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: click 8.3.1 (high 7.2)",
                "points": 14.8,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "click 8.3.1 (high 7.2)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 50,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 60,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.98,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "examples/cline/.clinerules",
                "examples/cursor/.cursorrules"
              ],
              "agent_instruction_max_bytes": 9483
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules"
                    }
                  }
                ],
                "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": "97 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 97,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "uv.lock"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.03,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "3 of the last 100 commits agent-authored or agent-credited",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 3,
                      "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 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 52204,
              "source_files_sampled": 460,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/460 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 460,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "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": 0,
                "status": "missed",
                "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.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "deps.dev does not index pypi:prompticorn@1.31.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T03:10:54.246943Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/snoodleboot-io/prompticorn.svg",
  "full_name": "snoodleboot-io/prompticorn",
  "license_state": "absent",
  "license_spdx": null
}

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.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.