Public record
Software health reportschema 0.27.0 · metrics 2.5.0 · 2026-07-31 02:57 UTC

LSSTDESC / firecrown

DESC Cosmology Likelihood Framework

PythonBSD-3-Clause★ 32 stars⑂ 12 forkssince Nov 2016View on GitHub ↗
KindCommand-line toolhow this is determined

LSSTDESC/firecrown holds a health index of 84 out of 100, placing it in the Excellent band. It scores highest on Vitality (92/100) and lowest on Security (59/100). It was last updated today. 2 contributors account for most of its recent work.

84
overall / 100
Excellent

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean, calibrated against the distribution of the public record so bands carry percentile meaning; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At Risk ceiling of 34.

84
Exceptional93-100The record's top tier (≈ top 5%); essentially all checked criteria met
Excellent80-92Strong across the board; minor gaps
Good65-79Healthy; gaps are limited and manageable
Moderate50-64Acceptable with notable gaps; review recommended
Weak35-49Material weaknesses across several areas
At Risk20-34Significant weaknesses; adoption warrants caution
Critical1-19Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

The weighted overall 71 is calibrated to 84 on the published index scale (record calibration 2026-08-02).

Ownership

230 followers482 public repossince Nov 2012

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

92Excellent · 21% of overall
How it's scored
36/36Push recency — last push 0 days ago
29.1/36Commit cadence — 42/52 weeks with commits
18/18Commit volume — 256 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year256
human_commit_share0.97
days_since_last_push0
active_weeks_last_year42
How it's scored
27/27Ships releases — 33 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~31 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count33
latest_release_tagv1.15.2
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases31

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

59Moderate · 17% of overall
How it's scored
24.2/60Stars — 32 stars
8.7/25Forks — 12 forks
10/15Watchers — 64 watchers
Inputs used
forks12
stars32
watchers64
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (BSD-3-Clause)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
readme_badges
has_contributingyes
has_issue_templateno
has_code_of_conductno
readme_badge_services
has_pull_request_templateyes

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

74Good · 23% of overall
How it's scored
25.2/54Bus factor — 2 contributor(s) cover half of all commits
11.8/22.5Commit distribution — top contributor authored 47% of commits
13.5/13.5Contributor breadth — 29 contributors
10/10OpenSSF Scorecard: Contributors — project has 18 contributing companies or organizations
Inputs used
bus_factor2
contributors_sampled29
top_contributor_share0.474
How it's scored
39.1/42Issue resolution — 93% of issues closed
26/30PR acceptance — 342/395 decided PRs merged
0/13Newcomer PR acceptance — no first-time contributor's PR decided in 30d
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Inputs used
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
Excluded from scoring (no data or not applicable): newcomer_pr_acceptance. Remaining weights renormalized.
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
17/25Owner reach — 230 followers of LSSTDESC
25/25Track record — 482 public repos, account ~13 yr old
Inputs used
followers230
owner_typeOrganization
is_verified
owner_loginLSSTDESC
public_repos482
account_age_days5,015

Engineering Quality

Are baseline engineering and documentation practices in place?

68Good · 19% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 8 out of 9 merged PRs checked by a CI test -- score normalized to 8
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 6 topics
0/10Wiki
Inputs used
topicscobaya, cosmosis, likelihood-functions, python, sampler, numcosmo
has_wikino
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

59Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
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.5License — 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 — no data
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
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5.9
Excluded from scoring (no data or not applicable): branch_protection, packaging. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight (4%): agent tooling is a real maintenance signal, but a repository with none can still reach 100/100.

60Moderate · 4% of overall
How it's scored
45/45Agent instructions — .github/copilot-instructions.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 79 of 97 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.814
agent_instruction_files.github/copilot-instructions.md
agent_instruction_max_bytes698
How it's scored
18/18One-command bootstrap — Makefile, docs/Makefile
22/22Automated tests
0/11Lint / format config
0/11Static type checking
0/10Reproducible environment
2/10Demonstrated agent practice — 1 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 2 of the last 100 commits are automated dependency updates
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageno
bootstrap_filesMakefile, docs/Makefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.01
toolchain_manifests
dependency_bot_commit_share0.02
How it's scored
0/45Type-checkable code — Python without a type-check config
54.8/55Manageable file sizes — 1/311 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes79,152
source_files_sampled311
oversized_source_files1
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — example, examples
Inputs used
example_dirsexample, examples
has_mcp_signalno
api_schema_files

Key facts

32GitHub stars
29contributors
256commits, last 12 months
0days since last push
33releases
2bus factor
17open issues
PyPIpackage ecosystems

Data collection 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

More detail

Star and fork history 0 ★ / 12 ⇿
0Stars
12Forks
32Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0246810121222018-122022-092026-07
Major 1Minor 15Patch 9

Each point covers 7 days.

OpenSSF Scorecard 5.9 / 10
5.9aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-31 02:57 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-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
n/aPackagingpackaging 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
Direct dependencies 15
RegistryPackageVersion constraintManifest
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
All dependencies 2

Full resolved dependency set from the GitHub dependency graph: 2 direct and 0 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
PyPInumpydirect
PyPIsaccdirect
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies carried a version and a supported ecosystem

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v2.5.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statistics.