公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-29 03:10 UTC

snoodleboot-io / prompticorn

Python未检测到许可证★ 2 星标⑂ 0 复刻始于 2026年2月在 GitHub 上查看 ↗

snoodleboot-io/prompticorn 的健康指数为 100 分中的 58 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(82/100),最低的是Community & Adoption(30/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

58
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

58
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

0 关注者14 个公开仓库始于 2025年2月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
PyPIprompticorn1.31.02,754330 天前aiclicoding-assistantconfigurationprompts

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

68中等 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
7.6/36提交节奏 — 52 周中有 11 周有提交
18/18提交量 — 最近一年 115 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year115
human_commit_share0.99
days_since_last_push0
active_weeks_last_year11

发布纪律

62中等
评分方式
16.2/27有发布版本 — 1 个版本标签(无 GitHub 发布版本)
27/36发布时效 — 最近一次发布版本于 111 天前
12.6/27发布节奏 — 节奏未知(仅一次发布)
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count1
latest_release_tagv2.1.0
releases_from_tags
days_since_latest_release111
mean_days_between_releases
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

30存在风险 · 占总体的 18%
评分方式
0/60星标 — 2 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

45存在风险
评分方式
22.5/22.5README
0/22.5许可证 — 未检测到许可证文件
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
45.9/80月度下载量 — pypi 合计每月 2,754 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesprompticorn
dependents
ecosystemspypi
total_downloads
monthly_downloads2,754
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

55中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
46.8/46.8议题解决 — 100% 的议题已关闭
36.9/38.3PR 接受 — 已裁定的 PR 中 111/115 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs111
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs4
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
0/25所有者影响力 — snoodleboot-io 有 0 位关注者
11.4/25既往记录 — 14 个公开仓库,账户约 1 年
所用输入
followers0
owner_typeOrganization
is_verified
owner_loginsnoodleboot-io
public_repos14
account_age_days520
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 33 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesprompticorn
ecosystemspypi
any_deprecated
min_days_since_publish0

工程质量

基础的工程与文档实践是否到位?

82良好 · 占总体的 20%

工程实践

100优秀
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
16/16Linter 配置
9.6/9.6Pre-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
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

55中等
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
0/10仓库描述
0/10主题标签
0/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

52中等 · 占总体的 16%

安全态势

47存在风险
评分方式
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.5许可证 — 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 — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.7
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
14.8/35直接依赖不含已知公告 — 1 个受影响:click 8.3.1 (high 7.2)
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
40/40没有长期未处理的公告 — 没有公告公开超过 90 天
所用输入
sourceosv
advisories5
affected_packages3
assessed_packages50
unassessed_packages0
affected_by_severityhigh 1, moderate 1, low 1
direct_affected_packages1
已排除计分(无数据或不适用):间接依赖不含已知公告。 其余权重已重新归一化。 已将 50 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

60中等 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 99 次人类提交中有 97 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.98
agent_instruction_filesAGENTS.md, CLAUDE.md, examples/cline/.clinerules, examples/cursor/.cursorrules
agent_instruction_max_bytes9,483
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置
0/11静态类型检查
10/10可复现环境 — lockfile
6/10已体现的代理实践 — 最近 100 次提交中有 3 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
1/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
所用输入
has_nix
has_tests
lockfilesuv.lock
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.03
toolchain_manifests
dependency_bot_commit_share0
评分方式
0/45可类型检查的代码 — Python,未配置类型检查
55/55可控的文件大小 — 采样的 460 个源文件中有 0 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes52,204
source_files_sampled460
oversized_source_files0

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

2GitHub 星标
1贡献者
115最近 12 个月提交数
0距最近推送天数
1发布版本数
1巴士系数(bus factor)
0开放议题
PyPI软件包生态系统数

数据采集警告

  • 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

更多细节

OpenSSF Scorecard 4.7 / 10
4.7综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。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
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
直接依赖 7
注册表软件包版本约束清单文件
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
全部依赖 50

来自 GitHub 依赖图的完整解析依赖集合:7 个直接依赖与 43 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

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

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 50 个包,其中也包含从不交付的开发与测试版本固定:3 个存在已知公告,1 个为直接依赖。

软件包版本关系严重程度公告数修复版本
click8.3.1直接18.3.3
pytest9.0.2间接29.0.3
pygments2.19.2间接22.20.0

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计PyPI.