Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-29 03:10 UTC

snoodleboot-io / prompticorn

PythonSin licencia detectada★ 2 estrellas⑂ 0 forksdesde feb 2026Ver en GitHub ↗

snoodleboot-io/prompticorn tiene un índice de salud de 58 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (82/100) y la más baja, Community & Adoption (30/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

58
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

58
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

snoodleboot-ioOrganización
0 seguidores14 repositorios públicosdesde feb 2025

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPIprompticorn1.31.0275433hace 0 díasaiclicoding-assistantconfigurationprompts

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

68Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
7.6/36Cadencia de commits — 11/52 semanas con commits
18/18Volumen de commits — 115 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year115
human_commit_share0,99
days_since_last_push0
active_weeks_last_year11
Cómo se puntúa
16.2/27Publica versiones — 1 etiquetas de versión (sin releases de GitHub)
27/36Recencia de las versiones — última versión hace 111 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count1
latest_release_tagv2.1.0
releases_from_tags
days_since_latest_release111
mean_days_between_releases
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

30En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_licenseno
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
45.9/80Descargas mensuales — 2754 descargas/mes en pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesprompticorn
dependents
ecosystemspypi
total_downloads
monthly_downloads2754
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

55Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
36.9/38.3Aceptación de PR — 111/115 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs111
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs4
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
0/25Alcance del propietario — 0 seguidores de snoodleboot-io
11.4/25Trayectoria — 14 repos públicos, cuenta de ~1 años
Datos de entrada utilizados
followers0
owner_typeOrganization
is_verified
owner_loginsnoodleboot-io
public_repos14
account_age_days520
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 33 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesprompticorn
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

82Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter
9.6/9.6Hooks de pre-commit
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
Datos de entrada utilizados
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

Documentación

55Moderado
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dir
has_descriptionno

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

52Moderado · 16% del índice global
Cómo se puntúa
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.5Licencia — 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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,7
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
14.8/35Dependencias directas libres de avisos conocidos — 1 afectados: click 8.3.1 (high 7.2)
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories5
affected_packages3
assessed_packages50
unassessed_packages0
affected_by_severityhigh 1, moderate 1, low 1
direct_affected_packages1
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos. Los pesos restantes se han renormalizado. Se cotejaron 50 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

60Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 97 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,98
agent_instruction_filesAGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules
agent_instruction_max_bytes9483
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — lockfile
6/10Práctica demostrada con agentes — 3 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Datos de entrada utilizados
has_nixno
has_tests
lockfilesuv.lock
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,03
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/460 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes52.204
source_files_sampled460
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

2estrellas de GitHub
1contribuidores
115commits en los últimos 12 meses
0días desde el último push
1versiones publicadas
1factor bus
0issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 4.7 / 10
4.7agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Dependencias directas 7
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 50

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 7 paquetes directos y 43 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 50 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 3 tienen avisos conocidos, de los cuales 1 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
click8.3.1directaalta18.3.3
pytest9.0.2indirectamoderada29.0.3
pygments2.19.2indirectabaja22.20.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasPyPI.