公开记录
软件健康报告模式 0.27.0 · 指标 2.5.0 · 2026-07-31 02:57 UTC

LSSTDESC / firecrown

DESC Cosmology Likelihood Framework

PythonBSD-3-Clause★ 32 星标⑂ 12 复刻始于 2016年11月在 GitHub 上查看 ↗
类型命令行工具如何判定

LSSTDESC/firecrown 的健康指数为 100 分中的 84 分,处于「优秀」区间。 其得分最高的类别是Vitality(92/100),最低的是Security(59/100)。 最近一次更新在今天。 近期的大部分工作由 2 位贡献者完成。

84
总分 / 100
优秀

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

84
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

加权总体分 71 经校准后在公布的指数量表上为 84(记录校准 2026-08-02)。

所有权

230 关注者482 个公开仓库始于 2012年11月

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

按类别列示的指标

活力

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

92优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
29.1/36提交节奏 — 52 周中有 42 周有提交
18/18提交量 — 最近一年 256 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year256
human_commit_share0.97
days_since_last_push0
active_weeks_last_year42

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 33 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 31 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count33
latest_release_tagv1.15.2
releases_from_tags
days_since_latest_release0
mean_days_between_releases31

社区与采用

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

59中等 · 占总体的 17%
评分方式
24.2/60星标 — 32 个星标
8.7/25复刻 — 12 个复刻
10/15关注者 — 64 位关注者
所用输入
forks12
stars32
watchers64
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

77良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(BSD-3-Clause)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
readme_badges
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template

可持续性与治理

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

74良好 · 占总体的 23%
评分方式
25.2/54巴士系数 — 2 位贡献者贡献了半数提交
11.8/22.5提交分布 — 头号贡献者编写了 47% 的提交
13.5/13.5贡献者广度 — 29 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 18 contributing companies or organizations
所用输入
bus_factor2
contributors_sampled29
top_contributor_share0.474
评分方式
39.1/42议题解决 — 93% 的议题已关闭
26/30PR 接受 — 已裁定的 PR 中 342/395 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs342
open_issues17
closed_issues231
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0.931
closed_unmerged_prs53
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
17/25所有者影响力 — LSSTDESC 有 230 位关注者
25/25既往记录 — 482 个公开仓库,账户约 13 年
所用输入
followers230
owner_typeOrganization
is_verified
owner_loginLSSTDESC
public_repos482
account_age_days5,015

工程质量

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

68良好 · 占总体的 19%

工程实践

64中等
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
16/20OpenSSF Scorecard:CI-Tests — 8 out of 9 merged PRs checked by a CI test -- score normalized to 8
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

75良好
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 6 个主题标签
0/10Wiki
所用输入
topicscobaya, cosmosis, likelihood-functions, python, sampler, numcosmo
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

59中等 · 占总体的 16%

安全态势

59中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2/2.5CI-Tests — 8 out of 9 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 18 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5.9
已排除计分(无数据或不适用):branch_protection, packaging。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

60中等 · 占总体的 4%
评分方式
45/45代理指令 — .github/copilot-instructions.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 97 次人类提交中有 79 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.814
agent_instruction_files.github/copilot-instructions.md
agent_instruction_max_bytes698
评分方式
18/18一条命令的引导启动 — Makefile, docs/Makefile
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
2/10已体现的代理实践 — 最近 100 次提交中有 1 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 2 次为自动依赖更新
1/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_filesMakefile, docs/Makefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.01
toolchain_manifests
dependency_bot_commit_share0.02
评分方式
0/45可类型检查的代码 — Python,未配置类型检查
54.8/55可控的文件大小 — 采样的 311 个源文件中有 1 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes79,152
source_files_sampled311
oversized_source_files1
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — example, examples
所用输入
example_dirsexample, examples
has_mcp_signal
api_schema_files

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch pypi package 'firecrown' from its registry
  • No resolved dependencies carried a version and a supported ecosystem

更多细节

Star 与 Fork 历史 0 ★ / 12 ⇿
0Star
12Fork
32发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

0246810121222018-122022-092026-07
主版本 1次版本 15修订 9

每个点涵盖 7 天。

OpenSSF Scorecard 5.9 / 10
5.9综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-31 02:57 UTC

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
8CI-Tests8 out of 9 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 18 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 15
注册表软件包版本约束清单文件
PyPIastropypyproject.toml
PyPIcobayapyproject.toml
PyPIcosmosispyproject.toml
PyPIlsstdesc-crowpyproject.toml
PyPIfitsiopyproject.toml
PyPInumcosmo_pypyproject.toml
PyPInumpy>=2.0,<2.4pyproject.toml
PyPIpandaspyproject.toml
PyPIpycclpyproject.toml
PyPIpydanticpyproject.toml
PyPIpyyamlpyproject.toml
PyPIrichpyproject.toml
PyPIsacc>=2.3pyproject.toml
PyPIscipypyproject.toml
PyPItyperpyproject.toml
全部依赖 2

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

注册表软件包版本关系
PyPInumpy直接
PyPIsacc直接
依赖安全公告 未评估

本报告未能完成公告比对:No resolved dependencies carried a version and a supported ecosystem

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "cobaya",
        "cosmosis",
        "likelihood-functions",
        "python",
        "sampler",
        "numcosmo"
      ],
      "is_fork": false,
      "size_kb": 24085,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "CSS": 17,
        "Lua": 5154,
        "SCSS": 949,
        "Shell": 5533,
        "Python": 2647155,
        "Makefile": 29945,
        "JavaScript": 596
      },
      "pushed_at": "2026-07-30T19:56:50Z",
      "created_at": "2016-11-01T19:39:51Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-28T16:58:31Z",
      "description": "DESC Cosmology Likelihood Framework",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "BSD-3-Clause",
      "default_branch": "master",
      "license_spdx_raw": "BSD-3-Clause",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "http://lsstdesc.org",
      "name": "LSST Dark Energy Science Collaboration (DESC)",
      "type": "Organization",
      "login": "LSSTDESC",
      "company": null,
      "location": null,
      "followers": 230,
      "avatar_url": "https://avatars.githubusercontent.com/u/2731443?v=4",
      "created_at": "2012-11-06T02:18:04Z",
      "is_verified": null,
      "public_repos": 482,
      "account_age_days": 5015
    },
    "license": {
      "state": "standard",
      "spdx_id": "BSD-3-Clause",
      "raw_spdx": "BSD-3-Clause",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.15.2",
          "kind": "patch",
          "published_at": "2026-07-30T19:57:17Z"
        },
        {
          "tag": "v1.15.1",
          "kind": "patch",
          "published_at": "2026-07-02T19:44:21Z"
        },
        {
          "tag": "v1.15.0",
          "kind": "minor",
          "published_at": "2026-06-12T00:16:01Z"
        },
        {
          "tag": "v1.14.3",
          "kind": "patch",
          "published_at": "2026-05-21T19:01:25Z"
        },
        {
          "tag": "v1.14.2",
          "kind": "patch",
          "published_at": "2026-04-18T12:55:11Z"
        },
        {
          "tag": "v1.14.1",
          "kind": "patch",
          "published_at": "2026-04-13T19:05:38Z"
        },
        {
          "tag": "files-v1.1.0",
          "kind": "other",
          "published_at": "2025-12-13T19:36:39Z"
        },
        {
          "tag": "files-v1.0.0",
          "kind": "other",
          "published_at": "2025-11-03T18:31:33Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2025-10-27T21:22:09Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2025-10-24T18:16:21Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2025-10-16T19:52:12Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2025-06-09T20:48:05Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2025-03-31T20:40:24Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2025-02-18T16:12:08Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2025-01-31T23:31:43Z"
        },
        {
          "tag": "v1.7.5",
          "kind": "patch",
          "published_at": "2024-06-21T20:33:09Z"
        },
        {
          "tag": "v1.7.4",
          "kind": "patch",
          "published_at": "2024-05-14T17:42:07Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2024-04-12T18:22:51Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2024-04-02T17:57:43Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2024-02-20T19:17:45Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2024-02-08T19:50:08Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2023-10-16T19:52:42Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2023-08-14T18:17:03Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2023-03-02T19:17:03Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2022-12-05T18:26:08Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2022-10-17T14:29:58Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2022-08-03T01:45:34Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2022-03-31T23:12:51Z"
        },
        {
          "tag": "v0.5",
          "kind": "other",
          "published_at": "2021-01-26T14:38:24Z"
        },
        {
          "tag": "v0.4",
          "kind": "other",
          "published_at": "2020-04-23T20:51:41Z"
        },
        {
          "tag": "v0.3",
          "kind": "other",
          "published_at": "2020-04-03T20:18:30Z"
        },
        {
          "tag": "v0.2",
          "kind": "other",
          "published_at": "2020-04-03T11:50:22Z"
        },
        {
          "tag": "v0.1",
          "kind": "other",
          "published_at": "2019-11-26T20:12:35Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7f2c81eb422e3b4bed9ad3512d2fb53bf67c1498",
          "body": "* Add CMBLensing tracer and tests.\n* Generalize tracers and finish metadata and likelihood updates.\n* Rename tracer module to _two_point_tracers and update imports.\n* Rename InferredGalaxyZDist to TomographicBin.\n* Rename variables, functions, and methods to match the new names.\n  Keep backward comp\n[…]\nrk configurations.\n* Add CMB lensing + shear example generator.\n* Document CMBConvergence support in tutorials.\n* Clarify future extensions.\n\n---------\n\nCo-authored-by: Marc Paterno <paterno@fnal.gov>",
          "is_bot": false,
          "headline": "Generalize Tracer Framework and Add CMB Lensing Support (#616)",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-07-28T16:48:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5de2e8b7606a3d8217cb8865c424495dce584fc3",
          "body": "* build(examples): remove notebook dependencies and tracked notebooks\n\nDrop the notebook cleanup CI action and remove notebook checkpoint ignore rules.\n\nDelete the tracked cluster example notebooks so the repository no longer carries notebook artifacts.\n\n* build(ci): bump conda-lock to 4.0.2\n\nUpdate\n[…]\np table output as the default for local interactive\nuse and add a CLI toggle to explicitly choose full or table output.\n\nAdd tests covering CI default full output and explicit table output in\nCI mode.",
          "is_bot": false,
          "headline": "Remove obsolete notebooks (#662)",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-25T13:21:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "055b907a2caf8abf6ae9cadd55e5080b0ec3187a",
          "body": "Adding a requierement for the numpy version",
          "is_bot": false,
          "headline": "Merge pull request #658 from joselotl/numpy_version",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-23T19:38:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f2ec0d639e85b49aad4d1b69c01ff173180a9a9",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into numpy_version",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-23T18:04:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "368bae7dc57dff5c2e7e550215f321666fbb9702",
          "body": "Reorg weak lensing package",
          "is_bot": false,
          "headline": "Merge pull request #661 from LSSTDESC/reorg-weak-lensing-package",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-23T17:57:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b01a6e2f667d8fed7ff58a0b6d4bdc87022eb85",
          "body": "Extract weak-lensing arguments, source logic, and factory classes from\nthe monolithic private module into dedicated private submodules. Keep\nsystematics in a renamed _systematics module and update package\nre-exports to preserve the public firecrown.likelihood.weak_lensing\nAPI, including WeakLensingS\n[…]\nicFactory.\n\nUpdate internal and test imports to target the package namespace\ninstead of the old private _weak_lensing module, preserving behavior\nwhile improving module boundaries and maintainability.",
          "is_bot": false,
          "headline": "refactor(weak-lensing): split internals into focused submodules",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-22T22:37:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a583b3bf563b54887e57c24ccd7fcaf7f704a5d6",
          "body": null,
          "is_bot": false,
          "headline": "style: add AGENTS.md to .gitignore",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-22T22:37:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2388653b4fe517080cf120789fcee53055de0d1f",
          "body": "Fixing theory/data-vector subclassing numpy arrays instead of type-hint.",
          "is_bot": false,
          "headline": "Merge pull request #659 from LSSTDESC/data-theory-vector-fix",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-22T22:33:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a52d597baf2c260459654a9aa64ba7743451c51",
          "body": "Remove cyclic dependency",
          "is_bot": false,
          "headline": "Merge pull request #656 from LSSTDESC/remove-cyclic-dependency",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-22T21:50:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f1f6b488fdb2e406793712ff4fb151632023049",
          "body": null,
          "is_bot": false,
          "headline": "Restricting CAMB version.",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-07-20T18:39:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ae3d043530a83a4709ca60ee5c50b593b44853e",
          "body": null,
          "is_bot": false,
          "headline": "Fixing theory/data-vector subclassing numpy arrays instead of type-hint.",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-07-20T18:23:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66ceb302a643eef56a5366beaff4f90c902dcd0a",
          "body": null,
          "is_bot": false,
          "headline": "Adding a requierement for the numpy version",
          "author_name": "Josue De-Santiago",
          "author_login": "joselotl",
          "committed_at": "2026-07-11T00:43:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08f2c03abdc50ce572311a9fb6b8e1f71f07df62",
          "body": "Merge branch 'master' into remove-cyclic-dependency",
          "is_bot": false,
          "headline": "style: reorder imports for firecrown.app.sacc._transform",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-07T16:30:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a37fb61c5f30760b99a5c36206b2224ae23f48d",
          "body": "* Drop support for Python 3.11.\n* Refactor SACC helper utilities by moving them into `firecrown.utils`, keeping backward-compatible re-exports, and delegating file format detection to SACC's native detection API.\n* Update SACC dependency constraints to avoid incompatible releases while upstream comp\n[…]\nport is addressed.\n* Regenerate conda lockfiles for Python 3.12, 3.13, and 3.14 with updated dependencies.\n* Apply code style and import cleanups (Black, pylint quoting fixes, and import refactoring).",
          "is_bot": false,
          "headline": "Drop py 311 (#651)",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-07T00:19:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "491c394196773bcaafd40dceb75dc461c52f22a4",
          "body": "Change imports of ConstGaussian and TwoPointFactory to use private\nmodules directly, which avoids circular dependency issues while\nmaintaining the same functionality.",
          "is_bot": false,
          "headline": "refactor(likelihood): import from private modules to avoid circular deps",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-03T19:32:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8df12774402b4e792a235ebc5a1937129664b50b",
          "body": null,
          "is_bot": false,
          "headline": "refactor(likelihood): replace private by public imports",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-03T17:50:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "123e6473d1f2dfbb6ba3e0a0ef8353661e621211",
          "body": "This organization follows the rules applied by ruff, i.e.\n\n1. standard library imports\n2. third-parth imports\n3. project imports\n4. relative imports\n\nWithin each group, imports are in alphabetical order.\n\n        modified:   firecrown/fctools/link_checker.py",
          "is_bot": false,
          "headline": "style: reformat imports",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-03T17:29:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "480b10582366bdc7ec44eaa2dc6cda67ee25fd65",
          "body": "Move core likelihood base classes from _base.py to\na new likelihood_base.py at the package root. This breaks a\ncyclic dependency by decoupling the base classes from the likelihood\nsubpackage, allowing cleaner imports throughout the codebase.\n\nAll imports across the package have been updated to reference the new\nmodule location.",
          "is_bot": false,
          "headline": "refactor(likelihood): move base classes to root level module",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-03T04:03:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b73c0919658f20c77ccd787870ef35a220feee02",
          "body": "Update conda-lock.yml files to synchronize dependency versions\nand reformat YAML indentation for consistency.\n\n- py3.12: updated package hashes and dependencies\n- py3.13: updated package hashes and dependencies\n- py3.14: updated package hashes and dependencies",
          "is_bot": false,
          "headline": "build: update conda lock files for py3.12, py3.13, py3.14",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-02T23:01:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee47a59ee6d4929c380ec4acc9c7a6a6f5fa8774",
          "body": "Remove a duplicate sacc.utils.detect_sacc_file_type import in\n_transform.py. In _sacc_utils.py, import ensure_path and\nload_sacc_data directly from firecrown.utils._sacc_ops instead of\nthe firecrown.utils package, and declare them explicitly in\n__all__ for re-export.",
          "is_bot": false,
          "headline": "refactor(imports): fix duplicate and internal import paths",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-02T22:54:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4b1e0bca9ee9c6607b805912750e44bebc2fe4b",
          "body": null,
          "is_bot": false,
          "headline": "(style) Apply black",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-02T21:52:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b723889b19ec837704f237157dadf67c1f908a87",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into drop-py-311",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-02T21:52:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c72ad625e1ad9d8dd184d6b979fdcc13c3be67d",
          "body": "Use sacc 2.3",
          "is_bot": false,
          "headline": "Merge pull request #654 from LSSTDESC/use-sacc-2.3",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-02T17:31:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1acb089497b4bcecc35abcd5747359a002469530",
          "body": "Ignore local workspace artifacts at the repo root (.headroom, .kilo,\nplans/, and .github/instructions/) so personal tooling files do not\nshow up as noise in status output.\n\nIgnore tutorial/docs/ output in .gitignore to avoid committing\ngenerated tutorial documentation.",
          "is_bot": false,
          "headline": "chore(gitignore): ignore local tooling and tutorial docs artifacts",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-01T20:08:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4472592f32af4c011ac1ee7a7ffa8eabed993e0",
          "body": "Update conda lockfiles for py3.11 through py3.14 with refreshed\nconda-forge resolution.\n\nBump key pinned dependencies including sacc (2.1.2 -> 2.3),\nqp-prob (1.0.1 -> 1.1.1), matplotlib-base (3.10.9 -> 3.11.0),\nand Python 3.14 (3.14.5 -> 3.14.6).",
          "is_bot": false,
          "headline": "build(conda-lock): update lockfiles",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-01T20:06:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70cf3f8f0a7dbf0ea33ff66196a306ae0110fb62",
          "body": "Bump minimum sacc version to 2.3 in pyproject.toml and\nenvironment.yml, then migrate all loading code to use the\nnew unified sacc.Sacc.load() method and sacc.utils.detect_sacc_file_type\nhelper instead of manually trying HDF5 then FITS.\n\nload_sacc_data in _sacc_utils.py and the example script are\nupd\n[…]\nuous .sacc extensions with both HDF5 and FITS\ncontent, update the error-message assertion for the dual-failure\ncase, and add a guard test that detect_sacc_file_type remains\nimportable from sacc.utils.",
          "is_bot": false,
          "headline": "build(deps): migrate to sacc 2.3 unified loading API",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-01T19:53:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c14e39c59529ed398464f755c532e84fb17912ae",
          "body": "…b-actions-85840bb9b5\n\nBump the github-actions group with 3 updates",
          "is_bot": false,
          "headline": "Merge pull request #653 from LSSTDESC/dependabot/github_actions/githu…",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-07-01T17:49:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4539189fbba18dbfeb331ccf1896e3023cbbda44",
          "body": "Bumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [actions/cache](https://github.com/actions/cache) and [codecov/codecov-action](https://github.com/codecov/codecov-action).\n\n\nUpdates `actions/checkout` from 6.0.3 to 7.0.0\n- [Release notes](https:\n[…]\n\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the github-actions group with 3 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-01T13:38:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "92457b2c02340d91629a3a054e1d0bdcee97ff36",
          "body": null,
          "is_bot": false,
          "headline": "build: update sacc dependency constraint",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-29T21:11:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48398da52171db4dbcf62ee9b7234a526ed95d76",
          "body": "Move load_sacc_data and ensure_path from the private module\nfirecrown.likelihood.factories._sacc_utils into firecrown.utils\n(via _sacc_ops). The old module is kept as a backward-compatible\nre-export shim with a deprecation notice.\n\nReplace the manual try-HDF5/try-FITS fallback in load_sacc_data and\nTransform.detect_format with a call to sacc.utils.detect_sacc_file_type,\ndelegating format detection to SACC itself.",
          "is_bot": false,
          "headline": "refactor(utils): move SACC helpers to firecrown.utils",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-27T21:05:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73bcffb96c4bc9592909cc5292600bea8c0a23d2",
          "body": "Regenerate conda-lock files for Python 3.12, 3.13, and 3.14 with updated dependency versions.",
          "is_bot": false,
          "headline": "build(conda-lock): regenerate lockfiles",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-26T21:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb7775fb607a4d5959abcbf987a5cdfda3d99d24",
          "body": "This is needed because SACC 2.2 no longer transparently handles\ncompressed files. I have filed an issue in SACC and will follow up with\na PR there to implement the needed support.",
          "is_bot": false,
          "headline": "build(deps): constrain sacc to < 2.2",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-26T21:31:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8637cda919cb986e2da6bd9fba9bf893638baae",
          "body": "…ng SACC data\"\n\nThis reverts commit e33299e678df8b6e3e576d98e5f29286033f97dc.\nSACC 2.2 can no longer read compressed files, and that needs to be fixed\nbefore we can start supporting the new version.",
          "is_bot": false,
          "headline": "Revert \"fix(sacc): catch ValueError in addition to OSError when loadi…",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-26T21:22:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e33299e678df8b6e3e576d98e5f29286033f97dc",
          "body": "…data\n\nExpand exception handling in SACC file loading operations to catch both\nOSError and ValueError. The sacc library can raise ValueError for invalid\nfile formats or corrupted data, so this ensures those errors are properly\nhandled during format detection and file loading attempts.\n\nThis is needed to support sacc v2.2",
          "is_bot": false,
          "headline": "fix(sacc): catch ValueError in addition to OSError when loading SACC …",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-26T19:31:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d75b28e54cb0c5afd81b887899ccf4d30938173d",
          "body": null,
          "is_bot": false,
          "headline": "(style): Fix quoting as directed by pylint",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-26T17:38:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d76a63a4e53afbf9491035e1e1ef441ec04fc58",
          "body": "Regenerate conda-lock files for Python 3.12, 3.13, and 3.14 with updated dependency versions.",
          "is_bot": false,
          "headline": "build(conda-lock): regenerate lockfiles",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-26T13:02:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dedd76a97b2efc5ceda4e000419d81fdb6db70a",
          "body": null,
          "is_bot": false,
          "headline": "Drop support for Python 3.11",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-26T13:01:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7098afc792a439218245257c3802d491537a8f10",
          "body": "Forward-port RTD docs fix and docs-rtd-check to master",
          "is_bot": false,
          "headline": "Merge pull request #650 from LSSTDESC/rtd-version-fix-master",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-25T20:03:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6bd1ad905f4eca8d7c399f441211e4eaf572176b",
          "body": null,
          "is_bot": false,
          "headline": "Forward-port RTD docs fix and docs-rtd-check to master",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-25T19:27:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "859a293c59c25ec5f1a9d16fd7ab6139840d7609",
          "body": "* Fix conda-forge release procedure\n\nAdd release-verify-archive target to confirm GitHub auto-archives are\nnot valid conda-forge sources. The auto-archive lacks PKG-INFO and\n.git, causing setuptools-scm to fail version detection.\n\nEnhance release-conda-forge to require a verified sdist and compute i\n[…]\ninction between the\nrelease sdist (correct) and GitHub auto-archive (incorrect), plus\nmanual git workflow steps for syncing the conda-forge feedstock fork.\n\nFix instructions to avoid just-fixed errors",
          "is_bot": false,
          "headline": "Fix conda-forge release procedure (#647)",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-17T16:19:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "40b52ef7966d4ccd584d46bc23070b523788e643",
          "body": "Add release-env-check target to verify the firecrown_developer conda\nenvironment is active before running release targets. This ensures all\nrelease tools (build, GitHub CLI) and dependencies are available.\n\nAdded build to environment.yml as a pip dependency to support the\nPython packaging workflow.\n\nUpdated Making_a_new_release.md to document the environment\nrequirement for release targets.\n\nRegenerated conda lock files with the new build dependency.",
          "is_bot": false,
          "headline": "Enforce release environment validation",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-11T23:54:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8eee206c37bcc489ed26e03721dd1bf211e933d6",
          "body": "Enforce that release targets run from the firecrown_developer conda\nenvironment to ensure all release tools (build, GitHub CLI) and\ndependencies are available.\n\nAdd build to environment.yml as a pip dependency.\n\nUpdate Making_a_new_release.md to document the environment\nrequirement.",
          "is_bot": false,
          "headline": "Add release environment validation",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-11T22:44:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7631b64c45c3a8158f3413e4f31d2b45f563f2f4",
          "body": "Refactor release targets to separate fast validation (release-validate)\nfrom full pre-commit checks. Cache successful validation results in\n.git/firecrown-release/ to avoid rerunning expensive make pre-commit\nchecks when running subsequent release targets like release-tag.\n\nThis simplifies the release workflow by removing the explicit\nrelease-check step from documentation and making release-tag reuse\npreviously successful checks for the same HEAD and VERSION.",
          "is_bot": false,
          "headline": "Cache release check results",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-11T21:36:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8833add25b3c4244af457cf69f8699ded28a738",
          "body": null,
          "is_bot": false,
          "headline": "Update lockfiles and do not check in release check",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-11T17:47:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ccb3c87842386654a191bf8905c174ba5268639",
          "body": "* Revert to simple reference to isitgr in envronment.yml\n* Fix typechecking error in link checker\n* Update conda lock files\n* Handle Rate-limited External Links\n* Add special handling for HTTP 429 (Too Many Requests)\nresponses when checking external links. Rate-limited\nURLs are tracked separately and excluded from broken\nlink reports, ensuring that temporary rate limits do\nnot cause false failures in link validation.",
          "is_bot": false,
          "headline": "Prep v1.15.0 (#645)",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-11T17:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81981d9289612ecd2ffd700c7eeac704ee20f596",
          "body": "* Update environment\n\n- Release restrictions on several packages\n- Force local building of wheel for isitgr because the one on PyPI\n  is defective for macOS.\n\n* Remove the version restriction on plotnine\n\n* Use PEP 440 direct-reference for isitgr\n\nThe use of the bare URL causes a failure in conda-lo\n[…]\nns prior\nto 0.27, including the dynamic 'likelihood.likelihood' module\nregistration. This removes the unused Ncm import and simplifies the\ninitialization code by explicitly requiring NumCosmo >= 0.27.",
          "is_bot": false,
          "headline": "Prep v1.15.0 (#644)",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-04T23:44:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8800bd1f5a848eea7ddcc96f8951b49666b2f28",
          "body": "Simplify conda release and resolve CI workflow merge conflicts",
          "is_bot": false,
          "headline": "Merge pull request #642 from LSSTDESC/simplify-conda-release",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-04T18:18:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46b3a2d979eef789b710d9d3f936c7c6a15061a7",
          "body": "This reverts commit 7e1fbe34ab7182e58da0933f8c1ed68e1c4daf95.",
          "is_bot": false,
          "headline": "Revert \"Add --no-fail-on-broken-links option to link checker\"",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-04T17:23:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e1fbe34ab7182e58da0933f8c1ed68e1c4daf95",
          "body": "Introduce new CLI option `--fail-on-broken-links` (default: on) that allows\nthe link checker to exit successfully even when broken links are found. This is\nuseful for generating documentation before all links have been fixed.\n\nAlso update Makefile to use `--no-fail-on-broken-links` for the docs-linkcheck\ntarget, and add `.gitignore` entry for tutorial/docs directory.",
          "is_bot": false,
          "headline": "Add --no-fail-on-broken-links option to link checker",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-04T15:40:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea9dd8fce33bd7c31321eba69a1cae574523c622",
          "body": null,
          "is_bot": true,
          "headline": "Merge origin/master to resolve workflow conflicts",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-06-03T22:19:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28600852f983d594d8aa6918b893f5e03234f76f",
          "body": "This enables automatic version detection for future development after\na release branch, e.g. v1.14.x. The new scheme guesses the next\nversion (e.g. 1.15.0) when commits are ahead of the latest tag, making\nit clear this is not v1.14 development.\n\nThis requires the a tag be placed on the commit after a new branch\nis made for long-term maintenance.",
          "is_bot": false,
          "headline": "Update setuptools_scm version scheme to guess-next-dev",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-06-03T22:11:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76d1fcdd64604ecce0090b35577ea12347d0824c",
          "body": "…b-actions-fc20006228\n\nBump the github-actions group with 2 updates",
          "is_bot": false,
          "headline": "Merge pull request #643 from LSSTDESC/dependabot/github_actions/githu…",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-06-03T15:20:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76d7f7add9a39820a05052d05f2714cb8e9dadd8",
          "body": "Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [codecov/codecov-action](https://github.com/codecov/codecov-action).\n\n\nUpdates `actions/checkout` from 6.0.2 to 6.0.3\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelo\n[…]\n\n  dependency-version: 6.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the github-actions group with 2 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-02T16:53:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f709291aae93d42cd5b86f82f8f8cbd02cbfc30",
          "body": "Update conda environment creation commands across documentation\nand scripts to explicitly specify the environment name\n'firecrown_developer' using the --name flag. This improves clarity\nand consistency for users following installation instructions.",
          "is_bot": false,
          "headline": "Add explicit conda environment name",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-29T21:08:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53e956c08b9b10561351033381672481c84bc453",
          "body": "This ensures the Augur test suite has access to the project\ndirectory path through the AUGUR_DIR environment variable.",
          "is_bot": false,
          "headline": "Set AUGUR_DIR for Augur tests",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-29T16:17:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "466a591b58a25b6172a5c0cd081c5866a0d2b9f3",
          "body": "Accept extra keyword arguments in the ModelingTools constructor to\nmaintain backward compatibility with deprecated parameters. The\ndeprecation warnings for these arguments are already in place, and\naccepting them via **_ allows existing code to continue working while\nwe phase them out. Updated test with type ignore comment to suppress\nspurious type checking errors from the intentional incompatibility.",
          "is_bot": false,
          "headline": "Add kwargs catch-all to ModelingTools",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-29T14:49:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d37f8836b772edbdf69b1f738280e974ba40efb7",
          "body": "Regenerate all four Python-version lock files\n(py3.11 through py3.14) with refreshed package\nversions, including astropy-iers-data, black,\nand several other dependencies.",
          "is_bot": false,
          "headline": "Update conda lock files",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-28T20:43:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e1bb8849456b0dcc28c6267851f98c0e56ec8ab",
          "body": "Add a parametrized test that verifies both\ncluster_abundance and cluster_deltasigma legacy\nconstructor parameters emit DeprecationWarning,\npreventing silent regression of the deprecation\nbehavior.",
          "is_bot": false,
          "headline": "Test deprecated ModelingTools constructor args",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-28T20:38:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df9b5c46c0796fd838e43ac1223c261a879865f7",
          "body": "Add Makefile targets for release validation, tagging, sdist\ncreation, GitHub publication, and conda-forge handoff.\n\nDocument the feature-line and maintenance release flow around\nthose targets, including branch expectations and release\npreconditions. Update the PR template to point contributors to\nma\n[…]\ns the current\ndeveloper entry point.\n\nThis standardizes release steps, catches missing build or gh\nsetup early, and verifies the sdist version metadata before\ntags and release artifacts are published.",
          "is_bot": false,
          "headline": "Add Makefile release workflow",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-28T19:59:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "224376ab671bfcd89efd6b72f411b2ca37fdcd8c",
          "body": "Remove the pinned commit ref from the Augur\ncheckout step, so it now tracks the default\nbranch rather than a fixed SHA.\n\nChange the Augur pytest invocation from the\nrepo root to augur/tests, scoping the run to\nthe intended test directory.\n\nAlso fix indentation in the \"Report environment\"\nstep and reformat long cache-key YAML lines for\nreadability.",
          "is_bot": false,
          "headline": "Update Augur CI checkout and test path",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-28T15:47:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b810af29ff52e55dc51766bf6d131d9c59de7802",
          "body": "Move _UNSET sentinel to after all imports in\n_modeling_tools.py to resolve E402/C0413 import-order\nviolations. Add deprecated cluster_abundance and\ncluster_deltasigma parameters to ModelingTools.__init__,\neach emitting a DeprecationWarning when passed.\n\nRemove unused pytest import from\ntest_likeliho\n[…]\nlass names as first words with \"Verify\".\nFix E1135 pylint false positive by using .keys() on\nmodel_fields. Add test_modeling_tools_deprecated.py\ncovering the two new deprecated constructor parameters.",
          "is_bot": false,
          "headline": "Fix lint errors in backward compat shims",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-27T22:18:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "558b673863cc38ae6e9e26346c4da09f91de763a",
          "body": "Re-export TwoPointFactory from firecrown.likelihood.factories\nto restore backward compatibility with code that imports it\nfrom that path. The class itself remains in\nfirecrown.likelihood._two_point and is the canonical export\nof firecrown.likelihood.\n\nAdd tests verifying the class is importable from the factories\nmodule, is identical to the object in firecrown.likelihood,\nappears in __all__, is a Pydantic BaseModel subclass, and\nexposes the correlation_space field.",
          "is_bot": false,
          "headline": "Export TwoPointFactory from likelihood.factories",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-27T22:07:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43b8decdc9d6c9a4a07590da9df09b260478a2c6",
          "body": "Add firecrown/likelihood/gaussian.py as a backward\ncompatibility shim that re-exports ConstGaussian from\nits current private location (_gaussian.py). The shim\nemits a DeprecationWarning directing users to import\nfrom firecrown.likelihood instead.\n\nAdd tests verifying the deprecation warning is emitted,\nthat the exported class is importable, that it is the\nidentical object to the one in the canonical location,\nand that it appears in __all__.",
          "is_bot": false,
          "headline": "Add gaussian shim for backward compat",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-27T21:57:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b792f37b5849f66f283faa0ef531eeeaea593ba0",
          "body": "The module firecrown.likelihood.two_point was renamed to\nfirecrown.likelihood._two_point (private), which broke\nthird-party code (e.g., augur) that imported from the old\npublic path.\n\nAdd a backward-compatibility shim at\nfirecrown/likelihood/two_point.py that re-exports all public\nnames from the new\n[…]\n tests in tests/test_two_point_deprecated.py covering: the\ndeprecation warning, importability of all re-exported names,\nobject identity with the canonical location, alias import, and\n__all__ contents.",
          "is_bot": false,
          "headline": "Add two_point backward-compat shim",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-27T20:45:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "49446febbf8f419a0d3c73ca02fa26bb02987642",
          "body": "Add fetch-depth: 0 to all checkout steps in ci.yml,\nci-reusable.yml, and nightly.yml.\n\nA shallow clone (the default) omits git tags and\nhistory, which is required for tools that derive the\npackage version from git history during CI builds.",
          "is_bot": false,
          "headline": "Fetch full history in CI workflows",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-27T17:14:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cc1e37dff90cdfe8182e105de2dbb6f835e7748",
          "body": "All tutorial documents now display the Firecrown package version\nautomatically as a subtitle. Version is extracted at build time using\nimportlib.metadata and passed to Quarto via the new version_filter.lua\nLua filter. This eliminates manual version maintenance for 14 tutorial\nfiles and ensures version numbers stay synchronized across the project.\nUpdated Makefile to export FIRECROWN_VERSION and pass it to the Quarto\nbuild process with the new version filter in the metadata chain.",
          "is_bot": false,
          "headline": "Add automatic version generation to tutorials",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-26T15:24:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9376b3ab492c8515e29ff0a9a95f13bcfe900a7e",
          "body": "Replace the manual version.py file with importlib.metadata, which reads\nthe version from package metadata. Add setuptools_scm configuration to\nautomatically manage versioning based on git tags. Delete the manual\nversion file, update_quarto_version.py script, and hardcoded version\nstrings in tutorial files. Update version tests to validate the new\nmetadata-based system. This eliminates manual version maintenance and\nensures consistency across the project.",
          "is_bot": false,
          "headline": "Use importlib.metadata for versioning",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-26T13:31:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ea33ee6cf83b8e90e9ba7e4cc144844621126ea",
          "body": "Fix MuSigmaModel initialization and API",
          "is_bot": false,
          "headline": "Merge pull request #641 from LSSTDESC/fix_640",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T19:16:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d864709da4aa38f15b62120c8404bf7a3faecc85",
          "body": "Update MuSigmaModel.create() to use named parameters for\nMuSigmaMG instantiation (mu_0, sigma_0, c1_mg, c2_mg,\nlambda_mg) as required by the pyccl library API. Also\nadjusted default values for mu, sigma, and lambda0 from 1.0\nto 0.0. Added comprehensive test assertions to verify the\ncreated MuSigmaMG object has correct parameter values and\nparametrization type.",
          "is_bot": false,
          "headline": "Fix MuSigmaModel initialization and API",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T18:38:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21f01990bdce392d553a6d52fcef5802f319cbb4",
          "body": "Update conda-lock to 4.0.0 and CCL to 3.3.4",
          "is_bot": false,
          "headline": "Merge pull request #639 from LSSTDESC/update-ccl",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T18:05:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "399731ee297209b17840156a1c2c448f6ff60a6e",
          "body": "The lsstdesc-crow package is now available as a conda dependency,\nwhich is preferable to the pip-only dependency. Updated environment.yml\nand regenerated conda-lock files for Python 3.11–3.14.",
          "is_bot": false,
          "headline": "Move lsstdesc-crow to conda",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T17:25:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fabcf7c54af7a514dcdffbeebfbe0d8ced6060f",
          "body": "Ensure conda-lock installation and execution both run in the base\nconda environment using conda run -n base. This prevents activation\nconflicts and ensures the tools operate in a predictable environment.\nAlso remove redundant conda-lock installation steps that were run\nbefore the actual lockfile installation process.",
          "is_bot": false,
          "headline": "Run conda-lock tools in base environment",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T15:02:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0cfb40284d7fc07795f5298ece097963d7320b0",
          "body": null,
          "is_bot": false,
          "headline": "Reformat YAML",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T14:53:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57b80b2fee346ec6212b6702605dabd2af7de37b",
          "body": "Refactor conda-lock installation to occur immediately after Miniforge\nsetup across all CI jobs for better consistency. Move the installation\nstep before environment reporting to ensure conda-lock is available\nthroughout the job.\n\nAdd documentation to CONTRIBUTING.md about regenerating and checking\nc\n[…]\nersions.\n\nFix file path references in CONTRIBUTING_ADVANCED.md CI system\ndocumentation table to use correct `.github/` prefixes.\n\nRegenerate conda lockfiles for Python 3.11-3.13 with updated metadata.",
          "is_bot": false,
          "headline": "Update CI workflow and lockfile docs",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T14:46:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e122fd3317f05acc1873ea3124174a207536c561",
          "body": "Update dependency lock files for Python 3.11, 3.12, 3.13,\nand 3.14. These lock files pin exact versions of all\ndependencies across supported Python versions, ensuring\nconsistent reproducible builds and environments.",
          "is_bot": false,
          "headline": "Update conda-lock files",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T14:20:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75448901de455dfaed4ff7f80e4e0d44afbda0e2",
          "body": "Upgrade conda-lock from 2.5.7 to 4.0.0 and migrate to the unified lockfile\nformat. This replaces per-platform lock files with YAML-based unified\nlockfiles that are cleaner and easier to maintain.\n\nSimplified the lock generation script by removing probe_conda_lock and\nprepare_lock_input functions, wh\n[…]\nfor cobaya, isitgr, and lsstdesc-crow, which\nare now properly handled by the unified lockfiles.\n\nRegenerated all conda lockfiles for Python 3.11, 3.12, 3.13, and 3.14 across\nLinux and macOS platforms.",
          "is_bot": false,
          "headline": "Update conda-lock to 4.0.0",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-21T03:37:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f368df8f0dda7a9ad0f7f0b22bc76f810cf8a7b9",
          "body": "* Added implementation of the mass-dependent NLA intrinsic-alignment model for weak-lensing tracers.\n* Included shared IA amplitude and mass-scaling parameters with tracer-dependent red-galaxy fractions and average halo masses.\n* Switched halo-mass sampling to `log10(<M_h>)`.\n* Added tests for the `\n[…]\negistration.\n* Final cleanup, documentation updates, and removal of debug output.\n\n---------\n\nCo-authored-by: Sandro Dias Pinto Vitenti <vitenti@uel.br>\nCo-authored-by: Marc Paterno <paterno@fnal.gov>",
          "is_bot": false,
          "headline": "Nla m test (#602)",
          "author_name": "Christos Georgiou",
          "author_login": "chrgeorgiou",
          "committed_at": "2026-05-20T15:04:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5184f81092b697b84625412f1e21aefe885d18da",
          "body": "* Move cluster predictions from Firecrown to crow\n* Replace cluster files and add `lsstdesc-crow` dependency\n* Rename dependency from `desc-crow` to `lsstdesc-crow`\n* Setup environment and recipe initialization for crow-based workflows\n* Provide working `cluster_redshift_richness_deltasigma.py` exam\n[…]\ning, linting, typing, and CI issues\n\n---------\n\nCo-authored-by: Michel <aguena@lapp.in2p3.fr>\nCo-authored-by: Sandro Dias Pinto Vitenti <vitenti@uel.br>\nCo-authored-by: Marc Paterno <paterno@fnal.gov>",
          "is_bot": false,
          "headline": "Removing cluster theory prediction from Firecrown (#581)",
          "author_name": "eduardojsbarroso",
          "author_login": "eduardojsbarroso",
          "committed_at": "2026-05-19T13:16:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f5fcea63727104090f786da71f5f8f1f03bc035",
          "body": "Update GitHub actions",
          "is_bot": false,
          "headline": "Merge pull request #635 from LSSTDESC/update-github-actions",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-12T14:04:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63269e2400e003ade0395b7c840a5f2ad336985b",
          "body": null,
          "is_bot": false,
          "headline": "Fix YAML indendentation errors",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-06T14:54:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "496beb591ebb5a88004c94140ace865bd3756772",
          "body": "Enable monthly grouped Dependabot updates for workflow references and\ndocument the needed repository setting for Dependabot version updates.\n\nThis requires manual activation on the repository web site before it\nwill take effect.",
          "is_bot": false,
          "headline": "Add Dependabot config for GitHub Actions",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-06T14:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2037357345ab9468beaf72ff9a106e5a06db4d0",
          "body": "Upgrade GitHub Actions steps across CI workflows to newer supported versions.\nUpdates checkout, setup-miniconda, paths-filter, cache restore/save, codecov,\nand upload-artifact actions in ci-reusable.yml, ci.yml, and nightly.yml.\n\nThis also changes from using bare tags (e.g. @4) to exact versions (e.g\n@v4.0.1). This is following the best-practices recommendation in the\nGithub actions documentation at:\nhttps://docs.github.com/en/actions/reference/security/secure-use#using-third-party-actions.",
          "is_bot": false,
          "headline": "Update GitHub Actions workflow actions",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-06T14:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9795d7c9069e1d390e5e025fc867798468afe86f",
          "body": null,
          "is_bot": false,
          "headline": "Allow manual triggering of firecrown-ci workflow",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-05-06T14:02:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef3534e0874b4b7e2f044b5e0daa567a98f9ed53",
          "body": "Unify CI to use lockfile-based env",
          "is_bot": false,
          "headline": "Merge pull request #634 from LSSTDESC/alter-macos-ci",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-30T19:17:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58d65f75ad07f9d8f1317a88dddb36cebf41bab9",
          "body": "This adjusts the build so that it tests the `master` branch when merged into `master`.",
          "is_bot": false,
          "headline": "Update CI branches to include 'master'",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-30T19:16:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d16b57399f362f089d2d639036be21ab82ef796b",
          "body": "Consolidated nightly and pull request CI modes to always use lockfile-based\nenvironment creation with lock-hash cache keys. This eliminates separate\ndate-based caching logic for PR mode and simplifies conditional branching\nthroughout the reusable workflow.\n\nAdded a new non-blocking rebuild-drift can\n[…]\ning\nmerges.\n\nAdded debug output throughout environment setup steps and updated\nCONTRIBUTING_ADVANCED.md to document the new PR drift detection behavior\nand clarify the unified lockfile-based approach.",
          "is_bot": false,
          "headline": "Unify CI to use lockfile-based env",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-28T18:37:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e15c7ffd722e1f97ca5fc9b49350072b855a9253",
          "body": "Added a new section explaining the nightly workflow's use of lockfile-based\nenvironments and rebuild-drift advisory jobs. This documents how conda solve\ncaching works in nightly mode and how drift detection jobs diagnose\nenvironment resolution issues. Also updated the CI System Architecture link\nreference to point to CONTRIBUTING_ADVANCED.md, where this documentation\nnow resides.",
          "is_bot": false,
          "headline": "Document nightly mode and rebuild-drift jobs",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-28T15:43:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8029b794bab21e13b961a1c0870d5cc256c3033b",
          "body": null,
          "is_bot": false,
          "headline": "Run CI job only on the alter-macos-ci branch",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-28T14:51:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "768f330ffe29b2b534461956a15b11e9969c2d27",
          "body": "Update nightly conda cache keys with a pip dependency version suffix\nso cache entries are invalidated when those pip requirements change.\nInstall cobaya, isitgr, and pygobject-stubs in the lockfile-based\nenvironment setup so nightly jobs consistently include required\npackages for linting, matrix runs, and external dependencies.\nNo new tests were added because this change only updates CI\nenvironment",
          "is_bot": false,
          "headline": "Refresh CI cache for pip dependencies",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-28T14:47:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "429c6d99edde0c39dbcd25bffb2b8defa5f723dd",
          "body": "This is a temporary addition to allow testing of the new CI\nconfiguration.",
          "is_bot": false,
          "headline": "Run CI on alter-macos-ci branch",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-28T13:47:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2441b186b725a859b2d15c5c190fabda8aeb9f04",
          "body": "Add a nightly-only CI mode that installs from committed explicit\nlockfiles on cache misses while keeping pull-request jobs on the\nexisting environment.yml flow.\n\nSwitch nightly cache keys from date-based values to lockfile-hash\nkeys for stable reuse and deterministic invalidation.\n\nAdd lockfile gene\n[…]\nython lock\nmatrix.\n\nRemove the top-level environment name from environment.yml and add\nnon-blocking Linux and macOS nightly drift-rebuild checks to surface\nsolver drift without failing nightly status.",
          "is_bot": false,
          "headline": "Stabilize nightly CI with lockfiles",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-28T02:01:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2129da7ca38fddcb452d43b58947d038d142630",
          "body": "Using working method for conda env creation.",
          "is_bot": false,
          "headline": "Merge pull request #633 from LSSTDESC/improve_conda_ci",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-24T14:10:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82731928f6df34bf936fd5ef52feb03b964516ce",
          "body": "Refresh reusable CI environment setup for more reliable Conda behavior:\nbump the cache version from 16 to 33, upgrade setup-miniconda from v3\nto v4, enable auto-activation, disable mamba, and add Conda/Python\ndiagnostic output during environment updates.",
          "is_bot": false,
          "headline": "Isolate unit coverage artifacts (#632)",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-24T04:58:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d43f297353a07ef19fdcf642af2bdad8898963f",
          "body": null,
          "is_bot": false,
          "headline": "Using working method for conda env creation.",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-04-23T22:37:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "589fe96752a2cb0e8e58eff8c3a642144fb1f9de",
          "body": "…) (#631)\n\n* Initial plan\n* Document sign convention for photo-z shifts in PhotoZShift classes\n* Removed redundancy in the dndz note.\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: vitenti <7767706+vitenti@users.noreply.github.com>\nCo-authored-by: Sandro Dias Pinto Vitenti <vitenti@uel.br>",
          "is_bot": false,
          "headline": "Document sign convention for photo-z shifts (opposite to Cosmosis CSL…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-04-23T22:33:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e625eb8731747f3af1b29e30916c0bec353c4181",
          "body": "Parallel running of targets produces jumbled output from commands.\nTHis uses the MAKEFLAGS variable to enforce the output of each\ncommand as an atomic unit, with no mixing between commands.",
          "is_bot": false,
          "headline": "Add MAKEFLAGS to ensure coherent output",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-16T19:07:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdb2e2ed92ff3b2589e7bf834eefd0906a350a57",
          "body": "* Adding new filter_two_point_combinations.\n* Adding more tests for bin combinations.\n* Expanded `tutorial/two_point_bin_selectors.qmd` with physical motivation, index-based selectors, advanced constraints, and 3x2pt distance-parameter guidance.\n* Added `filter_two_point_combinations` to filter an existing list of `TwoPointXY` without regenerating combinations.\n* Added a new test module covering `filter_two_point_combinations` behavior and selector interactions.",
          "is_bot": false,
          "headline": "Improve bin pair selectors tutorial with more complete content (#630)",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-04-15T17:12:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9325bd5a1faa85afafc07ed5db9cc8c60f8ab8d2",
          "body": "Export missing selectors.",
          "is_bot": false,
          "headline": "Merge pull request #627 from LSSTDESC/missing_selectors",
          "author_name": "Marc Paterno",
          "author_login": "marcpaterno",
          "committed_at": "2026-04-13T21:22:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c226abf83bd9156b2a5788efedc3b4fa1079360",
          "body": null,
          "is_bot": false,
          "headline": "Export missing selectors.",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-04-13T20:19:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "622125d81ec1e1726a588b174abb1bbb1ea187e5",
          "body": "Normalize window option",
          "is_bot": false,
          "headline": "Merge pull request #626 from LSSTDESC/normalize_window_option",
          "author_name": "Sandro Dias Pinto Vitenti",
          "author_login": "vitenti",
          "committed_at": "2026-04-10T00:04:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 33,
      "commits_last_year": 256,
      "latest_release_at": "2026-07-30T19:57:17Z",
      "latest_release_tag": "v1.15.2",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 42,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 31
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 12,
      "stars": 32,
      "watchers": 64,
      "fork_history": {
        "days": [
          {
            "date": "2018-12-05",
            "count": 1
          },
          {
            "date": "2019-02-08",
            "count": 1
          },
          {
            "date": "2022-03-07",
            "count": 1
          },
          {
            "date": "2022-08-04",
            "count": 1
          },
          {
            "date": "2022-09-08",
            "count": 1
          },
          {
            "date": "2022-10-09",
            "count": 1
          },
          {
            "date": "2023-06-07",
            "count": 1
          },
          {
            "date": "2025-12-18",
            "count": 1
          },
          {
            "date": "2026-02-10",
            "count": 1
          },
          {
            "date": "2026-02-18",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-11",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 12,
        "total_forks": 12
      },
      "star_history": null,
      "open_issues_and_prs": 20
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "docs/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 79152,
      "source_files_sampled": 311,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        ".github/copilot-instructions.md"
      ],
      "agent_instruction_max_bytes": 698
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "setup.cfg",
        "setup.py"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 2,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "astropy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "cobaya",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "cosmosis",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "lsstdesc-crow",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "fitsio",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "numcosmo_py",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "numpy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0,<2.4"
        },
        {
          "name": "pandas",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pyccl",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pyyaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "rich",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "sacc",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.3"
        },
        {
          "name": "scipy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "typer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "numpy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sacc",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 2,
        "direct_count": 2,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 342,
        "open_issues": 17,
        "closed_ratio": 0.931,
        "closed_issues": 231,
        "closed_unmerged_prs": 53
      },
      "bus_factor": 2,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "marcpaterno",
          "commits": 420,
          "avatar_url": "https://avatars.githubusercontent.com/u/181471?v=4"
        },
        {
          "type": "User",
          "login": "vitenti",
          "commits": 136,
          "avatar_url": "https://avatars.githubusercontent.com/u/7767706?v=4"
        },
        {
          "type": "User",
          "login": "joezuntz",
          "commits": 121,
          "avatar_url": "https://avatars.githubusercontent.com/u/220537?v=4"
        },
        {
          "type": "User",
          "login": "beckermr",
          "commits": 53,
          "avatar_url": "https://avatars.githubusercontent.com/u/5296416?v=4"
        },
        {
          "type": "User",
          "login": "empEvil",
          "commits": 37,
          "avatar_url": "https://avatars.githubusercontent.com/u/25800254?v=4"
        },
        {
          "type": "User",
          "login": "elikrause",
          "commits": 18,
          "avatar_url": "https://avatars.githubusercontent.com/u/9046576?v=4"
        },
        {
          "type": "User",
          "login": "jablazek",
          "commits": 18,
          "avatar_url": "https://avatars.githubusercontent.com/u/12451014?v=4"
        },
        {
          "type": "User",
          "login": "tilmantroester",
          "commits": 12,
          "avatar_url": "https://avatars.githubusercontent.com/u/26582252?v=4"
        },
        {
          "type": "User",
          "login": "damonge",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/8809493?v=4"
        },
        {
          "type": "User",
          "login": "matt-april",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/8204123?v=4"
        }
      ],
      "contributors_sampled": 29,
      "top_contributor_share": 0.474
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci-reusable.yml",
        "ci.yml",
        "nightly.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "8 out of 9 merged PRs checked by a CI test -- score normalized to 8",
            "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": 10,
            "reason": "all changesets reviewed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 18 contributing companies or organizations",
            "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": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 4 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": null,
            "reason": "packaging workflow not 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": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7f2c81eb422e3b4bed9ad3512d2fb53bf67c1498",
        "ran_at": "2026-07-31T02:57:33Z",
        "aggregate_score": 5.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-31T02:42:30Z",
      "oldest_open_prs": [
        {
          "number": 532,
          "created_at": "2025-07-03T16:53:38Z",
          "last_comment_at": "2025-07-03T17:10:55Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 603,
          "created_at": "2026-01-09T12:24:59Z",
          "last_comment_at": "2026-01-14T08:26:22Z",
          "last_comment_author": "arthurmloureiro"
        },
        {
          "number": 636,
          "created_at": "2026-05-13T21:16:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-30T19:17:19Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 267,
          "created_at": "2023-05-08T20:07:03Z",
          "last_comment_at": "2023-10-10T17:07:20Z",
          "last_comment_author": "vitenti"
        },
        {
          "number": 270,
          "created_at": "2023-05-15T19:59:00Z",
          "last_comment_at": "2025-12-18T20:55:45Z",
          "last_comment_author": "marcpaterno"
        },
        {
          "number": 332,
          "created_at": "2023-10-18T09:54:10Z",
          "last_comment_at": "2025-12-18T20:51:32Z",
          "last_comment_author": "marcpaterno"
        },
        {
          "number": 338,
          "created_at": "2023-10-25T22:44:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 383,
          "created_at": "2024-02-15T13:44:19Z",
          "last_comment_at": "2024-07-11T14:48:18Z",
          "last_comment_author": "marcpaterno"
        },
        {
          "number": 437,
          "created_at": "2024-07-16T08:46:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 438,
          "created_at": "2024-07-17T13:36:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 439,
          "created_at": "2024-07-18T08:52:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 442,
          "created_at": "2024-07-18T12:30:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 474,
          "created_at": "2024-12-02T16:37:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 495,
          "created_at": "2025-03-17T10:49:37Z",
          "last_comment_at": "2025-05-12T09:23:42Z",
          "last_comment_author": "JaimeRZP"
        },
        {
          "number": 508,
          "created_at": "2025-04-08T09:38:12Z",
          "last_comment_at": "2025-05-12T20:07:14Z",
          "last_comment_author": "marcpaterno"
        },
        {
          "number": 517,
          "created_at": "2025-05-12T19:51:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 518,
          "created_at": "2025-05-12T20:06:08Z",
          "last_comment_at": "2025-08-05T11:43:54Z",
          "last_comment_author": "tilmantroester"
        },
        {
          "number": 536,
          "created_at": "2025-08-01T20:09:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 547,
          "created_at": "2025-09-23T16:43:27Z",
          "last_comment_at": "2025-10-03T07:42:46Z",
          "last_comment_author": "arthurmloureiro"
        },
        {
          "number": 622,
          "created_at": "2026-03-11T11:14:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/LSSTDESC/firecrown",
    "host": "github.com",
    "name": "firecrown",
    "owner": "LSSTDESC"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 71 is calibrated to 84 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 71,
            "calibrated": 84,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 84,
      "inputs": {
        "security": 59,
        "vitality": 92,
        "community": 59,
        "governance": 74,
        "calibration": "2026-08-02",
        "engineering": 68,
        "ai_readiness": 60,
        "weighted_overall_raw": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "exceptional",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 93,
            "inputs": {
              "commits_last_year": 256,
              "human_commit_share": 0.97,
              "days_since_last_push": 0,
              "active_weeks_last_year": 42
            },
            "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": "42/52 weeks with commits",
                "points": 29.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 42
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "256 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 256
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 33,
              "latest_release_tag": "v1.15.2",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 31
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "33 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 33
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~31 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 31
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 7,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 7 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 59,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "weak",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "forks": 12,
              "stars": 32,
              "watchers": 64,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "32 stars",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "12 forks",
                "points": 8.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "64 watchers",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 64
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (BSD-3-Clause)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "BSD-3-Clause"
                    }
                  }
                ],
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 74,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 29,
              "top_contributor_share": 0.474
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 47% of commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 47
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "29 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 18 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 92,
            "inputs": {
              "merged_prs": 342,
              "open_issues": 17,
              "closed_issues": 231,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.931,
              "closed_unmerged_prs": 53,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "93% of issues closed",
                "points": 39.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 93
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "342/395 decided PRs merged",
                "points": 26,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 342,
                      "decided": 395
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "followers": 230,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "LSSTDESC",
              "public_repos": 482,
              "account_age_days": 5015
            },
            "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": "230 followers of LSSTDESC",
                "points": 17,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 230,
                      "login": "LSSTDESC"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "482 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 482
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 68,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "8 out of 9 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "cobaya",
                "cosmosis",
                "likelihood-functions",
                "python",
                "sampler",
                "numcosmo"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "6 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "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": 59,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 5.9
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "8 out of 9 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "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": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 18 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 4 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 1",
                "points": 0.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 5
            },
            "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.04,
        "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.814,
              "agent_instruction_files": [
                ".github/copilot-instructions.md"
              ],
              "agent_instruction_max_bytes": 698
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".github/copilot-instructions.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".github/copilot-instructions.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "79 of 97 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 79,
                      "sampled": 97
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile",
                "docs/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.02
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, docs/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, docs/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "2 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "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": 79152,
              "source_files_sampled": 311,
              "oversized_source_files": 1
            },
            "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": "1/311 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 311,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example",
                "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": "example, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example, examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "application"
      ],
      "labels": [
        "cli"
      ],
      "scores": {
        "cli": 4,
        "library": 2
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "dependencies",
          "label": "cli",
          "source": "dep:typer",
          "weight": 4
        },
        {
          "tier": "description",
          "label": "library",
          "source": "description:library",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "low",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": false
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch pypi package 'firecrown' from its registry",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-31T02:57:58.717692Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/l/LSSTDESC/firecrown.svg",
  "full_name": "LSSTDESC/firecrown",
  "license_state": "standard",
  "license_spdx": "BSD-3-Clause"
}

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

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

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