Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-25 17:18 UTC

imazen / zenpixels

RustApache-2.0★ 1 star⑂ 0 forkssince Mar 2026View on GitHub ↗

imazen/zenpixels holds a health index of 58 out of 100, placing it in the Moderate band. It scores highest on Vitality (87/100) and lowest on Community & Adoption (35/100). It was last updated today. A single contributor accounts for most of its recent work.

58
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

58
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe 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.

Ownership

ImazenOrganization
47 followers220 public repossince May 2012

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
crates.iozenpixels0.2.1610,295150 days agocodecdescriptorformatimagepixel
crates.iozenpixels-convert0.2.165,362160 days agocodecconversionimagepixelsrgb

Metrics by category

Vitality

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

87Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
13.8/36Commit cadence — 20/52 weeks with commits
18/18Commit volume — 446 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year446
human_commit_share0.99
days_since_last_push0
active_weeks_last_year20

Release discipline

100Excellent
How it's scored
27/27Ships releases — 21 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~10.6 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count21
latest_release_tagzenpixels-convert-v0.2.16
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases10.6
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

35At risk · 18% of overall
How it's scored
0/60Stars — 1 stars
0/25Forks — 0 forks
0/15Watchers — 1 watchers
Inputs used
forks0
stars1
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
55.9/80Monthly downloads — 15,657 downloads/month across crates
0/20Registry dependents — not reported by this ecosystem
Inputs used
packageszenpixels, zenpixels-convert
dependents
ecosystemscrates
total_downloads60,457
monthly_downloads15,657
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

57Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
32.7/46.8Issue resolution — 70% of issues closed
31.4/38.3PR acceptance — 32/39 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/17 approved changesets -- score normalized to 0
Inputs used
merged_prs32
open_issues9
closed_issues21
issue_closed_ratio0.7
closed_unmerged_prs7
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
12.1/25Owner reach — 47 followers of imazen
25/25Track record — 220 public repos, account ~14 yr old
Inputs used
followers47
owner_typeOrganization
is_verified
owner_loginimazen
public_repos220
account_age_days5,177
How it's scored
25/25Published & resolvable — 2 package(s) on crates
35/35Publish recency — latest publish 0 days ago
20/20Version history — 16 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packageszenpixels, zenpixels-convert
ecosystemscrates
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

55Moderate · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

65Moderate
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
0/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionno

Security

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

50Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/17 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3.8
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages9
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:zenpixels@0.2.16 runtime dependency closure — what installing the published package pulls in — 9 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

70Good · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 99 of 99 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes7,162
How it's scored
18/18One-command bootstrap — justfile
22/22Automated tests
0/11Lint / format config
11/11Static type checking — Rust (statically typed)
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesCargo.lock
has_dockerfileno
typed_languageyes
bootstrap_filesjustfile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml, apidoc/Cargo.toml, benchmarks/transpose-shootout/Cargo.toml, scripts/icc-gen/Cargo.toml, zenpixels-convert/Cargo.toml, zenpixels/Cargo.toml
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Rust (statically typed)
48.9/55Manageable file sizes — 12/108 source files over 60KB
Inputs used
primary_languageRust
largest_source_bytes123,146
source_files_sampled108
oversized_source_files12
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

1GitHub stars
1contributors
446commits, last 12 months
0days since last push
21releases
1bus factor
9open issues
crates.iopackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch crates package 'zenpixels-apidoc' from its registry

More detail

OpenSSF Scorecard 3.8 / 10
3.8aggregate

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-25 17:18 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/17 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Direct dependencies 18
RegistryPackageVersion constraintManifest
crates.iozenutils-apidocapidoc/Cargo.toml
crates.iozenpixelszenpixels-convert/Cargo.toml
crates.iolinear-srgb0.6.12zenpixels-convert/Cargo.toml
crates.iobytemuck1.21zenpixels-convert/Cargo.toml
crates.iorgb0.8zenpixels-convert/Cargo.toml
crates.iogarb0.2.8zenpixels-convert/Cargo.toml
crates.ioarchmage0.9.26zenpixels-convert/Cargo.toml
crates.iolibm0.2zenpixels-convert/Cargo.toml
crates.iomagetypes0.9.26zenpixels-convert/Cargo.toml
crates.iopaste1.0.15zenpixels-convert/Cargo.toml
crates.ioonce_cell1.21.4zenpixels-convert/Cargo.toml
crates.iolz4_flex0.13.1zenpixels-convert/Cargo.toml
crates.iowhereat0.1.5zenpixels-convert/Cargo.toml
crates.iomoxcms>=0.8.1, <0.10zenpixels-convert/Cargo.toml
crates.iobytemuck1.21zenpixels/Cargo.toml
crates.iorgb0.8zenpixels/Cargo.toml
crates.ioimgref1.12zenpixels/Cargo.toml
crates.iowhereat0.1.5zenpixels/Cargo.toml
All dependencies 158

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

RegistryPackageVersionRelation
crates.ioarchmagedirect
crates.ioarchmage0.9.26direct
crates.iobytemuckdirect
crates.iobytemuck1.25.0direct
crates.iogarbdirect
crates.iogarb0.2.8direct
crates.ioimgrefdirect
crates.ioimgref1.12.2direct
crates.iolibmdirect
crates.iolibm0.2.16direct
crates.iolinear-srgbdirect
crates.iolinear-srgb0.6.12direct
crates.iolz4_flexdirect
crates.iolz4_flex0.13.1direct
crates.iomagetypesdirect
crates.iomagetypes0.9.26direct
crates.iomoxcmsdirect
crates.iomoxcms0.8.1direct
crates.iomoxcms0.9.0direct
crates.ioonce_celldirect
crates.ioonce_cell1.21.4direct
crates.iopastedirect
crates.iopaste1.0.15direct
crates.iorgbdirect
crates.iorgb0.8.53direct
crates.iowhereatdirect
crates.iowhereat0.1.5direct
crates.ioanstream1.0.0indirect
crates.ioanstyle1.0.14indirect
crates.ioanstyle-parse1.0.0indirect
crates.ioanstyle-query1.1.5indirect
crates.ioanstyle-wincon3.0.11indirect
crates.ioapprox0.5.1indirect
crates.ioarchmage-macros0.9.26indirect
crates.ioautocfg1.5.1indirect
crates.iobitflags2.13.0indirect
crates.ioblock-buffer0.12.1indirect
crates.ioby_address1.2.1indirect
crates.iobytemuck_derive1.10.2indirect
crates.iocc1.2.64indirect
crates.iocc1.2.65indirect
crates.iocfg-if1.0.4indirect
crates.ioclap4.6.1indirect
crates.ioclap_builder4.6.0indirect
crates.ioclap_derive4.6.1indirect
crates.ioclap_lex1.1.0indirect
crates.iocmake0.1.58indirect
crates.iocolorchoice1.0.5indirect
crates.ioconsole0.15.11indirect
crates.ioconst-oid0.10.2indirect
crates.iocpufeatures0.3.0indirect
crates.iocrunchy0.2.4indirect
crates.iocrypto-common0.2.2indirect
crates.iodigest0.11.3indirect
crates.iodunce1.0.5indirect
crates.ioencode_unicode1.0.0indirect
crates.ioerrno0.3.14indirect
crates.iofast-srgb81.0.0indirect
crates.iofast_transpose0.2.7indirect
crates.iofind-msvc-tools0.1.9indirect
crates.ioforeign-types0.5.0indirect
crates.ioforeign-types-macros0.2.3indirect
crates.ioforeign-types-shared0.3.1indirect
crates.iofs41.1.0indirect
crates.iogetrandom0.3.4indirect
crates.iohalfindirect
crates.iohalf2.7.1indirect
crates.iohashbag0.1.13indirect
crates.ioheck0.5.0indirect
crates.iohybrid-array0.4.12indirect
crates.iois_terminal_polyfill1.70.2indirect
crates.ioitoa1.0.18indirect
crates.iojobserver0.1.34indirect
crates.iolcms2indirect
crates.iolcms26.1.1indirect
crates.iolcms2-sys4.0.6indirect
crates.iolibc0.2.186indirect
crates.iolinux-raw-sys0.12.1indirect
crates.iomemchr2.8.2indirect
crates.iontapi0.4.3indirect
crates.ionum-integer0.1.46indirect
crates.ionum-traits0.2.19indirect
crates.ioobjc2-core-foundation0.3.2indirect
crates.ioobjc2-io-kit0.3.2indirect
crates.ioonce_cell_polyfill1.70.2indirect
crates.iopaletteindirect
crates.iopalette0.7.6indirect
crates.iopalette_derive0.7.6indirect
crates.iopkg-config0.3.33indirect
crates.ioproc-macro21.0.106indirect
crates.iopublic-api0.52.1indirect
crates.iopxfm0.1.29indirect
crates.ioquote1.0.45indirect
crates.ior-efi5.3.0indirect
crates.iorustdoc-types0.57.3indirect
crates.iorustix1.1.4indirect
crates.iorustup-toolchain0.1.10indirect
crates.iorustversion1.0.22indirect
crates.iosafe_unaligned_simd0.2.5indirect
crates.ioserde1.0.228indirect
crates.ioserde_core1.0.228indirect
crates.ioserde_derive1.0.228indirect
crates.ioserde_json1.0.150indirect
crates.iosha2indirect
crates.iosha20.11.0indirect
crates.ioshlex2.0.1indirect
crates.iosimilar2.7.0indirect
crates.iosimilar-asserts1.7.0indirect
crates.iosnapshot-testing0.1.8indirect
crates.iostrength_reduce0.2.4indirect
crates.iostrsim0.11.1indirect
crates.iosyn2.0.117indirect
crates.iosyn2.0.118indirect
crates.iosysinfo0.36.1indirect
crates.ioterminal_size0.4.4indirect
crates.iothiserror2.0.18indirect
crates.iothiserror-impl2.0.18indirect
crates.iotranspose0.2.3indirect
crates.iotypenum1.20.1indirect
crates.iounicode-ident1.0.24indirect
crates.ioutf8parse0.2.2indirect
crates.iowasip21.0.4+wasi-0.2.12indirect
crates.iowinapi0.3.9indirect
crates.iowinapi-i686-pc-windows-gnu0.4.0indirect
crates.iowinapi-x86_64-pc-windows-gnu0.4.0indirect
crates.iowinarm-cpufeatures0.1.2indirect
crates.iowindows0.61.3indirect
crates.iowindows-collections0.2.0indirect
crates.iowindows-core0.61.2indirect
crates.iowindows-future0.2.1indirect
crates.iowindows-implement0.60.2indirect
crates.iowindows-interface0.59.3indirect
crates.iowindows-link0.1.3indirect
crates.iowindows-link0.2.1indirect
crates.iowindows-numerics0.2.0indirect
crates.iowindows-result0.3.4indirect
crates.iowindows-strings0.4.2indirect
crates.iowindows-sys0.59.0indirect
crates.iowindows-sys0.61.2indirect
crates.iowindows-targets0.52.6indirect
crates.iowindows-threading0.1.0indirect
crates.iowindows_aarch64_gnullvm0.52.6indirect
crates.iowindows_aarch64_msvc0.52.6indirect
crates.iowindows_i686_gnu0.52.6indirect
crates.iowindows_i686_gnullvm0.52.6indirect
crates.iowindows_i686_msvc0.52.6indirect
crates.iowindows_x86_64_gnu0.52.6indirect
crates.iowindows_x86_64_gnullvm0.52.6indirect
crates.iowindows_x86_64_msvc0.52.6indirect
crates.iowit-bindgen0.57.1indirect
crates.iozenbenchindirect
crates.iozenbench0.1.8indirect
crates.iozerocopy0.8.52indirect
crates.iozerocopy-derive0.8.52indirect
crates.iozmij1.0.21indirect
crates.iozune-core0.5.1indirect
crates.iozune-image0.5.0indirect
crates.iozune-imageprocs0.5.1indirect
Dependency advisories 0

Installing crates:zenpixels@0.2.16 pulls in 9 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 3308,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C++": 46901,
        "Just": 7051,
        "Rust": 2680551,
        "Shell": 483,
        "Python": 4942
      },
      "pushed_at": "2026-07-24T19:02:24Z",
      "created_at": "2026-03-04T08:55:34Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-24T18:47:11Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "http://imazen.io",
      "name": "Imazen",
      "type": "Organization",
      "login": "imazen",
      "company": null,
      "location": "United States of America",
      "followers": 47,
      "avatar_url": "https://avatars.githubusercontent.com/u/1761920?v=4",
      "created_at": "2012-05-22T01:08:03Z",
      "is_verified": null,
      "public_repos": 220,
      "account_age_days": 5177
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "zenpixels-convert-v0.2.16",
          "kind": "other",
          "published_at": "2026-07-24T19:02:38Z"
        },
        {
          "tag": "zenpixels-v0.2.16",
          "kind": "other",
          "published_at": "2026-07-24T19:02:29Z"
        },
        {
          "tag": "zenpixels-convert-v0.2.14",
          "kind": "other",
          "published_at": "2026-06-18T07:14:49Z"
        },
        {
          "tag": "zenpixels-v0.2.14",
          "kind": "other",
          "published_at": "2026-06-18T07:14:48Z"
        },
        {
          "tag": "zenpixels-convert-v0.2.13",
          "kind": "other",
          "published_at": "2026-06-11T04:59:44Z"
        },
        {
          "tag": "zenpixels-v0.2.13",
          "kind": "other",
          "published_at": "2026-06-11T04:59:43Z"
        },
        {
          "tag": "zenpixels-convert-v0.2.12",
          "kind": "other",
          "published_at": "2026-06-10T04:18:22Z"
        },
        {
          "tag": "zenpixels-convert-v0.2.11",
          "kind": "other",
          "published_at": "2026-04-26T05:36:12Z"
        },
        {
          "tag": "zenpixels-v0.2.11",
          "kind": "other",
          "published_at": "2026-04-26T05:35:54Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-04-20T18:30:57Z"
        },
        {
          "tag": "zenpixels-v0.2.9",
          "kind": "other",
          "published_at": "2026-04-17T03:55:47Z"
        },
        {
          "tag": "zenpixels-convert-v0.2.8",
          "kind": "other",
          "published_at": "2026-04-15T07:29:57Z"
        },
        {
          "tag": "zenpixels-v0.2.8",
          "kind": "other",
          "published_at": "2026-04-15T07:29:48Z"
        },
        {
          "tag": "zenpixels-convert-v0.2.7",
          "kind": "other",
          "published_at": "2026-04-14T16:13:10Z"
        },
        {
          "tag": "zenpixels-v0.2.7",
          "kind": "other",
          "published_at": "2026-04-14T16:13:08Z"
        },
        {
          "tag": "zenpixels-v0.2.6",
          "kind": "other",
          "published_at": "2026-04-13T05:21:49Z"
        },
        {
          "tag": "zenpixels-v0.2.3",
          "kind": "other",
          "published_at": "2026-04-10T14:06:33Z"
        },
        {
          "tag": "zenpixels-convert-v0.2.3",
          "kind": "other",
          "published_at": "2026-04-01T20:45:26Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-03-31T08:34:33Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-03-29T05:22:19Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-03-25T05:06:52Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "640dcedf1ee3f828c66dd19c0a08f08a68da9685",
          "body": "First release since 0.2.14 for both crates. Consolidates ~2 months of\naccumulated unreleased work: the CHANGELOG's [0.2.15] section documents\nchanges prepared 2026-06-23 that were never actually published (Cargo.toml\nwas pre-bumped but cargo publish never ran), plus everything added since\nunder [Unr\n[…]\ns a dependency of ultrahdr-core,\nwhich needs it for the moxcms 0.9.0 upgrade currently blocked across the\nultrahdr-rs -> ultrahdr-core -> zenpixels-convert chain (zenjpeg commit\n0fc2e143, 2026-07-23).",
          "is_bot": false,
          "headline": "release: zenpixels 0.2.16 + zenpixels-convert 0.2.16",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-24T18:45:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a9bdfe5d32316eef2eeedc24d5cbd363b4065b02",
          "body": "HDR SIMD NaN fix, HdrConfig hardening + review-driven cleanups (semver-compatible, 0.2.x)",
          "is_bot": false,
          "headline": "Merge pull request #65 from imazen/hdr-fixes-2026-07-14",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-23T21:56:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30b2ee15c30aee4d230f9d0d05b6afc7f07e2892",
          "body": "# Conflicts:\n#\tzenpixels-convert/src/cms_moxcms.rs",
          "is_bot": true,
          "headline": "Merge remote-tracking branch 'origin/main' into hdr-fixes-2026-07-14",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-07-23T21:47:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c64c895e5cb138a8d1d9678b6ff87e32e89811e",
          "body": "Also fixes two call sites broken by moxcms 0.9.0's white-point API change\n(WHITE_POINT_D50 const -> white_point_d50() fn, same for D60/D65/DCI_P3):\nscripts/icc-gen's cicp_bundle_gen binary and zenpixels-convert's\n#[cfg(test)] gray_icc_bytes_for_cicp helper. Both now call the function;\nvalue is bit-i\n[…]\nthis workspace.\n\nbenchmarks/transpose-shootout/Cargo.lock left at moxcms 0.8.1: the\nzune-imageprocs 0.5.1 dev-dependency there hard-pins moxcms = \"^0.8.0\"\n(external crate, not fixable from this side).",
          "is_bot": false,
          "headline": "deps: bump moxcms to 0.9.0",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-23T01:22:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63d5b2a49bcdd5a26c558fd8bd4fe76e64765e49",
          "body": "Replace the transient \"moxcms bound tightened <0.10 -> <0.9\" entry with the net change: version-agnostic D50 reconstruction so the crate builds and tests against both moxcms 0.8.1 and 0.9.0, dep bound unchanged at <0.10.",
          "is_bot": false,
          "headline": "docs(changelog): record moxcms 0.9 build support (db2b0fc)",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T17:38:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db2b0fcb27daf1d159cfe3de68e2b633eb778dc6",
          "body": "…agnostic D50)\n\nmoxcms 0.9.0 (unreleased; verified vs master 05c88fb) renames the only symbol this crate touches that changed: the D50 white point, from the const WHITE_POINT_D50 (moxcms <=0.8) to the fn white_point_d50() (moxcms >=0.9). Same value (both are white_point_from_temperature(5003)) but m\n[…]\nay patch); gray_blob_decodes_byte_identical_to_moxcms confirms the reconstruction matches each version own synthesis byte-for-byte. semver-checks 196/196; fmt, clippy -D warnings, and cargo doc clean.",
          "is_bot": false,
          "headline": "feat(zenpixels-convert): build against moxcms 0.8.1 and 0.9 (version-…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T17:37:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e8569cb83df47cdac6e76dbdbfd6dfc45033edb7",
          "body": "…builders",
          "is_bot": false,
          "headline": "docs(api): regen public-API snapshots for HdrConfig non_exhaustive + …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T10:06:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c03009a7d956c6ad0c922c345f90b84b8ac5831",
          "body": null,
          "is_bot": false,
          "headline": "style: cargo fmt — reflow new test code (NaN/HdrConfig/estimate suites)",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T10:05:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e2c79f71a9bd28f72c5806dd8a9b3833a9d6bb2",
          "body": "The HDR pipeline (new_with_hdr_config) carries the source alpha mode\nthrough steps (b)-(e), which include the NONLINEAR BT.2446-A tone-map and\nOKLch soft-compress. Linear ops (gamut matrices) commute with\npremultiplication but the tone-map does not, so a premultiplied source is\ntone-mapped on premul\n[…]\near pipeline is subtle — deferred, not done wrong.\nDocumented as a KNOWN LIMITATION for hdr-experimental stabilization (PQ/HLG\nsources are virtually always straight/opaque; premultiplied HDR is rare).",
          "is_bot": false,
          "headline": "docs(hdr): note the premultiplied-source limitation on the tone-map path",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T10:05:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70aff1e2f245ddbdce82c5fa879d9c0ccc1aee68",
          "body": "Three CI gaps from the 2026-07-14 review:\n\n- Add `cargo test -p zenpixels-convert --features avx512` (x64-gated via\n  runner.arch). The avx512 feature routes f16 + SIMD tiers through the\n  w512 magetypes/archmage kernels; dispatch is at runtime so it runs on any\n  x86-64 host, but it was otherwise o\n[…]\n to that sibling could otherwise break this repo's CI. Removed entirely\n  once zenutils-apidoc reaches crates.io.\n\nBoth new steps verified locally (avx512 suite green on Zen4; no_std+hdr\ncheck clean).",
          "is_bot": false,
          "headline": "ci: add avx512 + no_std-hdr-experimental coverage; pin zenutils sibling",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T10:01:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab49182cad6e1a2edd4204387413df028b190b2f",
          "body": "…-HANDOFF\n\nCHANGELOG.md:\n- Added [Unreleased] entries for every fix in this branch (with commit hashes).\n- Marked the \"[0.2.15] - 2026-06-23\" section as authored-but-NOT-published:\n  crates.io latest is 0.2.14 for both crates, there is no v0.2.15/v0.2.16 tag,\n  and zenpixels goes 0.2.14 -> 0.2.16 (0\n[…]\n docs/color-model.md with a staleness banner (numbers were 0.2.8-era; verify\n  version-specific claims against source). Dropped the transient handoff\n  sections (shipped-list, open-issues-read-first).",
          "is_bot": false,
          "headline": "docs: reconcile changelog + API-delta + estimate docs; retire CONTEXT…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T09:58:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "556bf31c6b6751e47e3f06219cc7c627f35233b8",
          "body": "…s <0.9\n\ndep_guard.rs previously scanned only [dependencies] and [dependencies.NAME].\nA dependency added via [build-dependencies] or [target.'cfg(..)'.dependencies]\nwould have slipped past the dependency-lean guard. The parser now covers\nruntime + build dep tables in all their forms (plain, dotted-s\n[…]\nsed 0.9.x that could break the\noptions/transform API we call — a fresh resolution of the published crate\nwould silently pull it. moxcms is 0.8.1 today; widen deliberately after\ntesting when 0.9 ships.",
          "is_bot": false,
          "headline": "test(zenpixels)+deps: dep_guard covers build/target tables; pin moxcm…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T09:51:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "614a8e151cbe9e1e95012995ad14ea3a915062df",
          "body": "…/NaN contracts\n\ngamut_compress.rs computed chroma/hue with the f32 inherent .sqrt()/.atan2(),\nwhile its sibling kernels (bt2446a, measure) use libm::* explicitly for the\ncrate no_std path. Those inherents happen to still resolve in a\n--no-default-features --features hdr-experimental build (verified\n[…]\nes NaN/inf; the pipeline scrubs\n  before calling; direct callers own sanitisation).\n- bt2446a scalar tail: removed a no-op 0.1_f32.max(0.0) on a constant,\n  matching the SIMD path (zero_one * cr_pos).",
          "is_bot": false,
          "headline": "refactor(hdr): use libm explicitly in gamut_compress + document panic…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T09:48:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "816b9598c46b9526263ff26d70871653c7f5b724",
          "body": "ConvertPlan::estimate(_in) truncated the f64 model time to u64 ms, so\nevery sub-millisecond conversion (thumbnails — the web-focused core\ncase) reported wall_ms = Some(0), indistinguishable from zero work for\na scheduler summing many small conversions. Model times and the\nper-core scaling now round \n[…]\nX2 baseline, but the\nmultiplier table maps Unknown to 1.0 (same as baseline) — the doc now\nsays so plainly instead of describing a model that doesn't exist yet\n(per-tier calibration sweep stays TODO).",
          "is_bot": false,
          "headline": "fix(estimate): round wall-time up so sub-ms plans don't report 0",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T09:35:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6013acc24a876cfb56336d37a53337fcf28a97a9",
          "body": "- new_with_hdr_config (and new_with_hdr_peak via delegation) now return\n  HdrSourceRequiresPeak when source_peak_nits or target_peak_nits is\n  non-finite or <= 0 — including HdrConfig::default()'s unset 0.0.\n  Previously a degenerate peak flowed into the BT.2446-A constants\n  (1/ln(1) = inf, powf of\n[…]\ngamut_knee default 0.9 (it is 0.96);\n  the HdrSourceRequiresPeak Display + variant doc now cover the\n  invalid-peak case and point at measure_max (the production default)\n  rather than measure_robust.",
          "is_bot": false,
          "headline": "fix(hdr): reject degenerate HdrConfig peaks; non_exhaustive + builders",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T09:33:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eea47c01e3e10fd8242560a436ff7ddebd5a0808",
          "body": "Platform max NaN semantics diverge (x86 maxps returns the second operand;\nNEON/WASM propagate NaN), so the SIMD max-chain fold violated the documented\n'Negative/NaN samples clamp to 0' contract: a single NaN sample zeroed\nMaxFALL (poisoned running sum) and could underreport MaxCLL, with DIFFERENT\nre\n[…]\nods x RGB/RGBA x chunk/tail seam; measured max-scan throughput\n1.8-3.0 Gpix/s post-fix on the 7950X (the >= 1 Gpix/s doc bound holds;\nhistogram path ~330-350 Mpix/s both before and after this change).",
          "is_bot": false,
          "headline": "fix(hdr): tier-consistent NaN/negative fold in the SIMD CLL kernels",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-14T09:28:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7950e02a6f560231be31dac7ab5e2473d4c7f9b5",
          "body": "…g-19)\n\n.github/workflows/ci.yml had no cargo doc step and no apidoc-snapshot\ncheck, which is how 6 new public types and a broken doc link previously\nlanded on main unaudited (this repo already has the apidoc/ CI-free\nrunner package + docs/public-api/ snapshots wired locally, they were\njust never in\n[…]\neatures (RUSTDOCFLAGS=-D\n  warnings): passes clean.\n- ZEN_API_DOC=check cargo test --manifest-path apidoc/Cargo.toml:\n  passes (committed snapshots are current).\nCI-only change; no source/API changes.",
          "is_bot": false,
          "headline": "ci: add cargo-doc link check + Public API snapshot gate (zenpixels#bu…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-06T03:17:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "760a677758ee3accbfe0a1961fc7bd58bf891f64",
          "body": "…e module doc\n\nThe estimate module doc comment claimed the four local estimate types\n(ResourceEstimate, ComputeEnvironment, ImageCharacteristics, SimdTier)\nare 'shape-compatible' with zencodec::estimate::* and wireable via 'a\ntrivial From conversion'. Verified against source: no From impls exist\nin \n[…]\nvert side). Per the additive-\nonly policy for this published crate, this only corrects the doc text\n(no new From impls added, no public API change) — real From impls are\nan API decision for the owner.",
          "is_bot": false,
          "headline": "docs(zenpixels-convert): remove false trivial-From claim from estimat…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-06T03:16:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f669b2e2723d8158180c8c33355699bdb1b2647",
          "body": "… consumers\n\nFalsification sweep (2026-07-02) before removal, per owner request:\n- Parsed EVERY Cargo.toml under ~/work (direct deps, dev/build deps,\n  target-specific deps, workspace deps, and feature-forwarding items\n  `zenpixels/serde` + `zenpixels?/serde`): zero enable the feature.\n- Grepped CI \n[…]\n tests 1128 ok / 0 fail; doctests 13 ok;\nbenches compile; clippy -D warnings clean; fmt clean.\nTolerated 0.2.x break per repo policy (feature kept, derives removed;\nships in queued unreleased 0.2.16).",
          "is_bot": false,
          "headline": "refactor(zenpixels): soft-remove the serde feature — inert stub, zero…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T09:15:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e6edaa9d4bf261f57516642413b28e3791f4e95",
          "body": "…rustdoc link hygiene\n\nEntries for f70b7406 (HDR kernel per-row allocation hoist), 675ed30b\n(zenpixels tests/dep_guard.rs dependency-lean guard), and e410bba1\n(rustdoc link fixes + docs.rs feature metadata).",
          "is_bot": false,
          "headline": "docs(changelog): record unreleased tone-map perf fix, dep guard, and …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T08:23:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "258e9da89ad0fff3a8413d0fe825c77283172a98",
          "body": "zenpixels-convert: convert the 8 links that pointed at feature-gated items\n(ConvertPlan::new_with_hdr_peak / new_with_hdr_config, hdr::measure and its\nCllMeasure / LightLevelHistogram / LightLevelMethod items) into plain code\nspans so the default-features doc build renders link-clean, and add\n[packa\n[…]\nk in planar.rs\n(plane_width robustness note) to Self::with_subsampling.\n\nVerified: cargo doc --no-deps warning-free for both crates under default\nfeatures, the docs.rs feature set, and --all-features.",
          "is_bot": false,
          "headline": "docs: resolve all broken rustdoc links; add docs.rs feature metadata",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T08:23:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a1d8114c6f32df6295dc476e322c4808c0d57227",
          "body": "… per-row path\n\nThe hdr-experimental step kernels violated the module's documented\nno-per-row-allocation contract:\n- tone_map_bt2446a_kernel (RGBA carrier) allocated a fresh\n  Vec<[f32; 3]> rgb strip every row;\n- soft_compress_oklch_kernel allocated the strip every row (RGBA) AND\n  rebuilt a SoftCom\n[…]\n code path).\nNo public API change.\n\nVerified: cargo test -p zenpixels-convert --features hdr-experimental\n(511 unit + all integration suites pass, 0 failed); builds clean with\nand without the feature.",
          "is_bot": false,
          "headline": "perf(zenpixels-convert): hoist HDR tone-map kernel scratch out of the…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T08:23:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "675ed30ba92b4f17782d8ce52d38fa34c21a6dad",
          "body": "Std-only integration test that string-parses zenpixels/Cargo.toml via\nCARGO_MANIFEST_DIR (no new dev-deps) and asserts every [dependencies]\nname is within the frozen published-0.2.14 set {bytemuck, serde, rgb,\nimgref, whereat}, failing with a message citing the lean-deps rule:\nzenpixels never gains \n[…]\np for archmage/magetypes/intrinsics hits only doc comments); the\nmeasure() deprecation note points at CllMeasure::measure_max and its\nremoval is already queued under CHANGELOG QUEUED BREAKING CHANGES.",
          "is_bot": false,
          "headline": "test(zenpixels): add dependency-lean guard test (tests/dep_guard.rs)",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T03:43:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e0297f750cb6c186a6883bc95b9bff3acaa97239",
          "body": "Two pre-existing lints, both in test files, both outside anything the\ndefault CI clippy matrix compiled until now:\n\n- resource_estimate.rs: top-level `ColorPrimaries` import was only used\n  inside the hdr-experimental-gated test, so the default-features\n  `cargo clippy --workspace --all-targets -- -\n[…]\ntal suite is being\n  linted/run.\n\nVerified: cargo clippy --workspace --all-targets -- -D warnings PASS;\ncargo clippy -p zenpixels-convert --all-targets --features\nhdr-experimental -- -D warnings PASS.",
          "is_bot": false,
          "headline": "fix(tests): clear clippy -D warnings reds in feature-gated test suites",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T03:22:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "30faa8c3be22efeddf799b38e1161751517e5f5f",
          "body": "The root [workspace.package] version sat at 0.2.11 while the published\ncrates are 0.2.14 (main queuing 0.2.16/0.2.15). Verified no member\ninherits it (no version.workspace = true anywhere: zenpixels and\nzenpixels-convert declare their own versions; scripts/icc-gen is\n0.0.0) — the field was dead and only misleading, so remove it with a\ncomment explaining members version independently.",
          "is_bot": false,
          "headline": "chore: remove dead workspace.package.version = \"0.2.11\"",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T03:19:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d97ba322160ee9e3a8d8b2a782c3b3757e8416f",
          "body": null,
          "is_bot": false,
          "headline": "style: cargo fmt reflow of closure in deprecated_measure_parity.rs",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T03:19:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4e1fece7ec148e24604acbbd0fba41f3f4aac12",
          "body": "…asure\n\nCHANGELOG.md and docs/public-api/CHANGES_0.2.14_to_main.md narrated the\nmeasure removal as \"shipped in 0.3.0\" and labeled main as zenpixels\n0.3.0 — but no 0.3.0 was ever released; the manifests queue unreleased\n0.2.16 (zenpixels) / 0.2.15 (zenpixels-convert), and 6019aeef restored\nthe workin\n[…]\n the QUEUED BREAKING\nCHANGES entry so the removal is queued again, and fix the API-delta\ndoc title/version table/removals/backwards-compat sections to reflect\ndeprecated-not-removed on the 0.2.x line.",
          "is_bot": false,
          "headline": "docs: correct false 0.3.0 release narrative for ContentLightLevel::me…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T03:18:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6019aeef74b6100c02773300ddc0f25112662096",
          "body": "…ove unimplemented!() panic shim\n\nThe unreleased 0.2.16 line replaced the published-and-working 0.2.14\nimplementation of ContentLightLevel::measure with a #[deprecated]\n#[doc(hidden)] shim whose body was unimplemented!() — a runtime panic\nfor any 0.2.x caller, which is a behavior break inside the se\n[…]\ner run in CI) execute.\n\nVerified: cargo test -p zenpixels hdr:: (11 pass) and cargo test -p\nzenpixels-convert --features hdr-experimental --test\ndeprecated_measure_parity --test cll_measure (17 pass).",
          "is_bot": false,
          "headline": "fix(zenpixels): restore working ContentLightLevel::measure body — rem…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-07-02T03:14:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36896cf044f78b02f518785bfc526dbde4d7b178",
          "body": "…-convert)\n\nBoth crates now ship a generated badge-free README.crates.md (readme =\n\"README.crates.md\"; ../README.crates.md for zenpixels, whose readme is the repo\nroot). GitHub README.md keeps the full badge row + rendered crosslink footer.\n\nzenpixels: add &label=CI + MSRV badge, fix license -> #lic\n[…]\nlready current for the estimate API.\n\nVerified vs origin/main src: ConvertPlanBuilder is unpushed WIP (not documented);\nICC tables = 298 RGB + 69 gray; f16 still descriptor-only. No Rust code changed.",
          "is_bot": false,
          "headline": "docs: README overhaul + split crates.io README (zenpixels + zenpixels…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-28T02:26:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e37f0025d01f4a600e4c272c41ce142a0084ab39",
          "body": "…olyfill SIMD\n\nThe hand-written scalar curve in hdr/bt2446a.rs (483 LOC) duplicated what\nthe magetypes `scalar` polyfill tier on hdr/bt2446a_simd.rs (266 LOC)\nalready auto-generates. Merge both into a single hdr/bt2446a.rs (472 LOC,\n−277 LOC net) where:\n\n- the magetypes-attributed bt2446a_tier is th\n[…]\nd remainder tail byte-identical to prior version\n\nVerified: cargo test --all-features (all pass), cargo semver-checks\n(196/196), just api-doc (empty diff), zentone cargo test --release (274/274\npass).",
          "is_bot": false,
          "headline": "refactor(zenpixels-convert): collapse bt2446a scalar into magetypes-p…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-25T06:28:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "02cc172458ae6c5ec4077d6eba5ef794274105e7",
          "body": "Move accuracy contract, calibration source, threading + memory models, and\nthe foundation-crate / zencodec shape-compatibility rationale out of the\nmodule docstring into a new zenpixels-convert/docs/ESTIMATE.md (127 LOC).\nThe remaining module docstring is 14 lines pointing at the new doc + the\ntwo e\n[…]\nbench-tolerance gates).\n\n- estimate.rs: 895 → 364 LOC\n- new docs/ESTIMATE.md: 127 LOC\n- zero public-API drift (cargo semver-checks pass, apidoc unchanged)\n- behavior preserved (full test suite passes)",
          "is_bot": false,
          "headline": "refactor(zenpixels-convert): trim estimate.rs 895→364 LOC",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-25T06:12:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "193fdb9b774419d6e83ebba469ae4a32a5e25ca0",
          "body": null,
          "is_bot": false,
          "headline": "style: cargo fmt collateral on tests/ext",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-25T06:11:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aac51e6d749478743a6bbcd31dc6033a646d48aa",
          "body": "…n cleaner snapshots\n\nSwitches `apidoc/tests/public_api_doc.rs` to chain the two new opt-in\ngates introduced in `zenutils-apidoc 0.1.2`:\n\n  ApiDoc::new()\n      .workspace_dir(\"..\")\n      .no_file_meta_header()\n      .no_autotraits_summary()\n      .run();\n\n`no_file_meta_header()` drops the `# files: \n[…]\ntest --manifest-path apidoc/Cargo.toml  # passes\n  git diff --stat HEAD docs/public-api/v0.2.14/                   # empty\n  diff against the snapshots shows only the targeted noise lines  # confirmed",
          "is_bot": false,
          "headline": "docs(apidoc): adopt no_file_meta_header + no_autotraits_summary; rege…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-25T02:08:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e5ac694ea3e5d43be4b1e7734359a401264450b0",
          "body": "…release\n\nThe serde feature on zenpixels-convert existed for exactly one thing:\n`#[cfg_attr(feature = \"serde\", derive(serde::Serialize, serde::Deserialize))]`\non hdr::measure::LightLevelMethod (a 2-variant enum: MaxRgb |\nLuminanceBt2020). Callers can trivially wrap this enum themselves\nwithout dragg\n[…]\ngo build --no-default-features clean\n- cargo semver-checks check-release vs v0.2.14: 196/196 PASS\n- All affected tests (resource_estimate / hdr_pipeline / cmyk_cms_roundtrip) pass\n- apidoc regen clean",
          "is_bot": false,
          "headline": "refactor: drop optional serde dep; soft-remove serde feature for one …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-24T08:11:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2200ff8f051e2236a92d7716d58700e9a86c7a53",
          "body": "…anonical HDR regression gate\n\nThe single-sample producer-SDR ΔE2000 test in zenpixels-convert-e2e was\nsubsumed by zentone's audited 76-sample shootout:\n  zentone/examples/hdr_tone_map_shootout_audited.rs\n  + benchmarks/hdr_tone_map_shootout_full_2026-06-22.csv\n  + benchmarks/shootout_2026-06-22_fin\n[…]\nr-experimental,pipeline,cms-moxcms,rgb: clean\n- cargo build --no-default-features: clean\n- cargo semver-checks vs v0.2.14: 196/196 PASS\n- apidoc regen: clean (no zenpixels-convert-e2e in the snapshot)",
          "is_bot": false,
          "headline": "refactor: drop zenpixels-convert-e2e crate; zentone shootout is the c…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-24T07:27:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a22bbf037913ff28ef2ec9b007c0921855b2959",
          "body": "…_count for paging-pressure schedulers\n\nzenpixels-convert is per-frame: animation frame counts and codec-flavored\nvariance/CPU-vs-wall splits belong on zencodec::estimate::*, not on the\nper-conversion estimate input/output. Trim the local estimate surface\naccordingly and add a buffer-count field sch\n[…]\nwith intermediate_buffer_count_zero_for_identity_plan and\nintermediate_buffer_count_increases_for_multi_step_plan). README +\nconvert.rs docstring + estimate.rs module docs updated. Apidoc regen\nclean.",
          "is_bot": false,
          "headline": "refactor(estimate): ablate codec-only fields; add intermediate_buffer…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-24T07:02:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "598a70243e0bdbd2c9fc0c7720c1aae51f88fc68",
          "body": "…t-e2e crate",
          "is_bot": false,
          "headline": "docs(CHANGELOG): note ThreadingInformation removal + zenpixels-conver…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T23:57:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbe8bb754319123097cde4dc9c7c36907f229572",
          "body": "…onvert-e2e crate\n\nTwo coordinated cleanups in zenpixels-convert.\n\nPart A: Drop ThreadingInformation complexity from src/estimate.rs.\nThe struct + 3 ctors + 5 accessors existed solely to drive\nResourceEstimate::at_cores(); user verdict was that this was an\nunjustified mess. Removed: ThreadingInforma\n[…]\nimate tests pass, e2e crate builds clean,\ncargo semver-checks --baseline-version 0.2.14 PASS 196/196 (this is\nadditive-reduction since ThreadingInformation was just-added in 0.2.15\nand never shipped).",
          "is_bot": false,
          "headline": "refactor: drop ThreadingInformation; factor e2e test into zenpixels-c…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T23:55:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd8200fa5228f2e64cc266adc939152250bd2092",
          "body": "…oundation-crate layering)",
          "is_bot": false,
          "headline": "refactor(estimate): drop zencodec dep; duplicate the types locally (f…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T22:27:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d4061bf788904ed97bc0c3455e3a63f30c98829",
          "body": "…for compose-with-codecs estimation\n\nReplace zenpixels-convert's local `ResourceEstimate { peak_memory_bytes,\nwall_time_ms }` with re-exports of `zencodec::estimate::{ComputeEnvironment,\nImageCharacteristics, ResourceEstimate, SimdTier, ThreadingInformation}` so\nestimates compose with codec-side enc\n[…]\n    ✅ 7 passed, 22 ignored\n  build --no-default        ✅ (zencodec dep absent on this path)\n  cargo semver-checks       ✅ additive\n  cargo test apidoc/        ✅ snapshots regenerated, regen test green",
          "is_bot": false,
          "headline": "feat(estimate): adopt zencodec ComputeEnvironment + ResourceEstimate …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T22:00:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a910c8b25827606d1dc6720898f46418b6ab8e7",
          "body": "User feedback: 'don't use a blind tuple, return an extensible struct'.\n\nThe prior commit b466389 collapsed ResourceEstimate to a (u64, f64)\ntuple as a YAGNI cleanup. Tuples lose named-field self-documentation\nat call sites and can't grow new fields without a breaking change.\n\nRe-introduce as a minim\n[…]\nargo semver-checks --baseline-version 0.2.14: 196/196 PASS, no\n  semver update required (the field-named struct is still additive\n  vs v0.2.14 which had no estimate API)\n- apidoc snapshots regenerated",
          "is_bot": false,
          "headline": "feat(estimate): revert tuple to non_exhaustive ResourceEstimate struct",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T21:45:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b466389e0d81f20cd8b913737e55864955bb47cb",
          "body": "…timate (w, h) -> (u64, f64)\n\nPre-publish YAGNI cleanup. The 0.2.15 work branch had elaborated\n`ResourceEstimate` / `StepEstimate` / `EstimateConfidence` + 11\n`estimate_*` shadow methods spread across `PixelBufferConvertExt` /\n`PixelBufferConvertTypedExt` / `PixelBufferHdrConvertExt` — far too\nmuch \n[…]\nax scan-leg cost — only callable from the deleted\nestimate_convert_to_sdr). `variant_name` on ConvertStep / FusedKind kept\nwith #[allow(dead_code)] — still needed when the `__trace_ops` feature\nis on.",
          "is_bot": false,
          "headline": "refactor(estimate): replace ResourceEstimate API with ConvertPlan::es…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T20:35:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e08ac3d64347c262b97acfb6023736b5ed37ae4d",
          "body": "…!() shim — restore 0.2.x\n\nUser directive: don't bump to 0.3.x; keep the measure method as a\ndeprecated shim with an `unimplemented!()` body.\n\nThe prior commit (e5ac4261) removed the deprecated 2-arg\n`ContentLightLevel::measure(...)` entirely and bumped zenpixels to\n0.3.0 because semver-checks rejec\n[…]\n5 lib + 435 integration across 32 test files = 950 total\n\nApidoc snapshots from commit 54a60594 may need regen via `just api-doc`\nto reflect the restored shim signature in the supported-surface table.",
          "is_bot": false,
          "headline": "fix(hdr): keep ContentLightLevel::measure as deprecated unimplemented…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T19:49:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54a6059470bb1af853b9f88b21f7532ca9c49ea8",
          "body": "Adds a frozen v0.2.14 baseline (docs/public-api/v0.2.14/{zenpixels,\nzenpixels-convert}.{txt,features.txt,internal.txt}) alongside the\nzenutils-apidoc-regenerated current-main snapshots and a delta\nsummary at docs/public-api/CHANGES_0.2.14_to_main.md. The apidoc\nrunner already existed (workspace-excl\n[…]\nct, additive only).\n- zenpixels:         0 fail vs the 0.2.14 -> 0.3.0 major bump (the\n                     only break, ContentLightLevel::measure, is\n                     absorbed by the major bump).",
          "is_bot": false,
          "headline": "docs(apidoc): public-API snapshots for v0.2.14 baseline + main",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T19:45:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e5ac426161a02ef39ce5fe8878ed4b695801a77e",
          "body": "…emove deprecated ContentLightLevel::measure\n\nTask A — zenpixels: 0.2.15 → 0.3.0 (mandatory pre-0.3.0 cleanup)\n\n- Removed `zenpixels::hdr::ContentLightLevel::measure(px, white)` inherent\n  method (deprecated + doc-hidden since 0.2.15). Canonical replacement:\n  `zenpixels_convert::hdr::measure::CllMe\n[…]\nsion can stay\n  0.2.15\" allowance)\n\nResource discipline:\n\n- All cargo builds/tests prefixed with `nice -n 19` per CLAUDE.md.\n- No allocator regressions; in-tree unit + integration tests touch < 64 MB.",
          "is_bot": false,
          "headline": "test+refactor: comprehensive coverage for 0.2.14->0.2.15 additions; r…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T19:38:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e972d21e71ad9eaeed7ba41ff7961a59694fc6d",
          "body": "Replaces the pre-#44 `assert_not_cmyk` process-aborting guard with a\ngraceful `ConvertError::NeedsCms { from, to }` variant on the typed\n`ConvertError`. The pattern is generic on color model — applies to\nCMYK today, future Lab / XYZ / spot inks plug in via the\n`native_color_model` whitelist (`Gray` \n[…]\nxCms)` escape hatch\nunreachable for CMYK ↔ RGB. Production CMYK encoders/decoders can now\npass a CMYK `PixelDescriptor` through `RowConverter` with a moxcms\nplugin attached and get correct RGB output.",
          "is_bot": false,
          "headline": "feat(cms): NeedsCms path lets moxcms convert CMYK<->RGB end-to-end",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T19:11:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da81aaa685e91707e5e9c9b10dcf161ebe59aee2",
          "body": "CI Format job failed on commit 03c63b5c (cleanup-opts) — three minor\nfmt-only diffs the agent didn't run `cargo fmt` on after the\nConvertStep::Fused merge:\n- convert.rs:274 — short struct variant body collapsed to single line\n- convert.rs:2257 — short match-arm bodies collapsed\n- converter.rs:81 — l\n[…]\npe was workspace members only\n(`cargo fmt $(cargo metadata --no-deps --format-version 1 | jq -r '.packages[].name' | sed 's/^/-p /')`)\nper CLAUDE.md — would NOT reach into sibling repos via path-deps.",
          "is_bot": false,
          "headline": "style: cargo fmt (single-line struct + match arm wrapping)",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T17:31:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a4bbf4039ce2864089a17ffb89039f5f9f32c03",
          "body": "The `__hdr-e2e-test` feature's optional zenjpeg dep had\n`path = \"../../zenjpeg/zenjpeg\"` for local-dev convenience (so changes\nto the unpublished zenjpeg main would be picked up by the e2e test\nwithout a publish round-trip). CI runners only clone the zenpixels\nrepo, so the sibling path doesn't exist\n[…]\ne `[patch.crates-io]` block — same shape as the\nexisting `ultrahdr-core` git-patch entry.\n\nVerified: `cargo metadata --no-deps --format-version=1` now succeeds\n(previously exited 101 on every CI job).",
          "is_bot": false,
          "headline": "fix(ci): drop zenjpeg path attribute (sibling missing on CI runners)",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T17:19:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa55a292d87beb82e99087a24e431b230ce13c16",
          "body": "The ResourceEstimate API was added in 0.2.15 (commits 183af66 +\n4aae8b9e covering ConvertPlan::estimate_resources and the 11\nestimate_* trait methods on PixelBufferConvertExt /\nPixelBufferConvertTypedExt / PixelBufferHdrConvertExt) but the\nREADME never documented it. Added a new 'Resource estimation' section\nwith a code example + a row in the key-types-and-functions table\npointing at the trait and the new doc-link entries.",
          "is_bot": false,
          "headline": "docs(README): add ResourceEstimate section + types-table entry",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T17:17:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03c63b5c2c6bfbfe9688b932482da8ce1ddf7acc",
          "body": "…variant_name + Owned share-on-clone + SIMD gamut\n\nLands the items A.1-A.4 + B.5 from\nzenpixels-convert/AUDIT_DEDUP_2026-06-23.md.\n\n## Summary\n\n- Merged 5 `FusedSrgb*` variants → `ConvertStep::Fused { kind, matrix }`\n- Replaced 93-line hand-rolled `Debug` impl with `#[derive(Debug)]`\n- Single source\n[…]\nrectness fix (the Arc thing)\n- DO NOT remove `#[doc(hidden)]` items — untouched\n- DO NOT add new public API — none added (FusedKind/variant_name are\n  `pub(crate)`; the new regression test is private)",
          "is_bot": false,
          "headline": "cleanup(zenpixels-convert): audit dedup — ConvertStep::Fused merge + …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T16:56:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1ebf76b45bb6f8a767b0d9d1a281c041dabf0ea",
          "body": "`HdrConfig::default().gamut_knee` bumped from `0.9` → `0.96` based on an\nempirical sweep of 76 imazen-26 gain-mapped HDR samples against 13 knee\nvalues (0.50–1.00) on 2026-06-23.\n\n`0.96` is the largest knee value (i.e. the LEAST chroma compression /\ndesaturation) where the corpus-p90 fraction of pre\n[…]\n or `ConvertPlan::new_with_hdr_peak()`\npick up the new default automatically.\n\nDriver: zentone/examples/softcompress_knee_sweep.rs\nFindings: zentone/benchmarks/softcompress_knee_findings_2026-06-23.md",
          "is_bot": false,
          "headline": "tune(softcompress): empirical knee default — corpus-validated 0.96",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T16:41:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e890b67148ca6e1768594b43f5a6415d160ef81f",
          "body": "Surveyed ~6100 LOC inserted in zenpixels-convert/src/ between v0.2.14\nand current main (10 files; hdr/measure.rs, hdr/gamut_compress.rs,\nhdr/bt2446a*, estimate.rs, ext.rs, plus the convert/adapt/converter\ntrio). Walked the diff for code duplication, missed SIMD/perf,\nand type-system smells. Audit re\n[…]\nspeedups\n(not LOC-measurable) for the perf items.\n\nVerification: cargo build --features hdr-experimental,pipeline,cms-moxcms,rgb\nclean; cargo test --features hdr-experimental --lib reports 513 passed.",
          "is_bot": false,
          "headline": "audit(zenpixels-convert): dedup + missed-opt review since v0.2.14",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T16:13:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ab70a0e67d717e5666b38b2a25d8dcd84e227e5",
          "body": "…, semver-checks PASS, 43→0 doc warnings\n\nPublish-prep audit for zenpixels-convert 0.2.15 (downstream of the recent\nResourceEstimate / measure_max / Bt2446A work). Findings + fixes:\n\n# API hardening (semver-checks now PASS at 196/196 — was failing 1 major):\n\n- **`PixelBufferConvertExt::estimate_*` f\n[…]\nublish chain unblock:\n\nOnce zenpixels 0.2.15 + zenpixels-convert 0.2.15 are on crates.io,\nultrahdr-core 0.6.0 and ultrahdr-rs 0.4.0 (which depend on the\n0.2.15 hdr-experimental surface) are unblocked.",
          "is_bot": false,
          "headline": "prep(publish): audit zenpixels-convert 0.2.15 — fix serde-feature bug…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T15:45:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4aae8b9ed257f30c32b2587788e6dabd40a06614",
          "body": "…sdr/with_hdr_config\n\nAdds 11 non-allocating estimator companions for the convert extension\ntraits, mirroring the `ConvertPlan::estimate_resources` primitive shipped\nin 183af66. Each returns `ResourceEstimate` with the ±30 % design\ntolerance documented on the underlying plan estimator.\n\nPixelBufferC\n[…]\new methods are required on\nthe traits (breaking change for any external impl; no external impls\nexist in the imazen tree per grep -rn 'impl PixelBufferConvertExt').\nVersion not bumped — author's call.",
          "is_bot": false,
          "headline": "feat(estimate): cover try_*/linearize/delinearize/to_rgb*/convert_to_…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T15:22:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1192d38bd402f39da231a913926e199cf2bb67d2",
          "body": "…rces (accurate to 1-2%)\n\nAdded examples/mem_probe_convert.rs (marginal-WS probe: VmHWM - pre-RSS) +\nbenchmarks/convertplan_estimate_verify_2026-06-23.tsv. Measured the conversion\npeak vs estimate_resources across layout/alpha/gray/depth plans at 1024-4096^2:\nratio meas/est = 1.00-1.07. The memory m\n[…]\ns) matches reality to 1-2% - far tighter than the\ndocumented +-30% (which is the wall-time bench tolerance). Confirms the estimate\nis trustworthy to compose into decode/pipeline peak-memory estimates.",
          "is_bot": false,
          "headline": "test(zenpixels-convert): heaptrack-verify ConvertPlan::estimate_resou…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T14:51:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "183af66179a6b6bb6b1c3dd8266684ae8c52de21",
          "body": "Adds `ConvertPlan::estimate_resources(width, height) -> ResourceEstimate`\nplus a `PixelBufferConvertExt::estimate_convert_to(&target)` shortcut for\npredicting memory + time before running a conversion. Callers integrating\nzenpixels-convert into pipelines (imageflow, zenpipe, ultrahdr-rs, the\nimazen \n[…]\n ms\n\nCHANGELOG entry under zenpixels-convert — added, calibration provenance\nand the ±30 % tolerance documented.\n\nAll 9 new tests pass; 513/513 existing lib tests pass; clippy clean;\ndocs build clean.",
          "is_bot": false,
          "headline": "feat(convert): ResourceEstimate API — predict peak memory + wall-clock",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T14:28:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "69bb400a99d489aac4c62fc82920a6a70272b59c",
          "body": "…onvert::hdr::Bt2446A\n\nThe reinhard_tonemap / reinhard_inverse / exposure_tonemap deprecation\nmessages still pointed at `zentone::Bt2446A` — but Bt2446A was\nextracted from zentone into `zenpixels-convert::hdr` in commit\n52fd949 and is now the audited production default. Updated the\ndeprecation `note\n[…]\n:Bt2446A`\n   location.\n\nNo behaviour change — these fns remain `#[deprecated]` + `#[doc(hidden)]`\nand queued for 0.3.0 removal. Only the warning text and docs are\nupdated to be accurate post-shootout.",
          "is_bot": false,
          "headline": "deprecate(hdr): repoint reinhard/exposure deprecations at zenpixels_c…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T13:58:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e2dfb5a3ec3e988ff2a0de2266c31d1ca5d7990",
          "body": "User directive: max is the only documented production peak-measurement\nAPI in zenpixels-convert. Everything else is implementation detail under\nthe hdr-experimental gate.\n\nAdded `#[doc(hidden)]` to:\n- `CllMeasure::measure_percentile` — secondary explicit-percentile API\n- `CllMeasure::measure_histogr\n[…]\n-features hdr-experimental`.\nInternal call sites (the hidden trait methods + the histogram type +\nDEFAULT_PERCENTILE) still resolve because doc(hidden) doesn't affect\nvisibility — only rustdoc output.",
          "is_bot": false,
          "headline": "feat(hdr): hide everything except measure_max",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T12:07:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "efc0e8403dab7cf008bf5ddd6000e3de6064f568",
          "body": "The 2026-06-22 audited shootout's tail-aware metric set (76 samples ×\n20 curves × 4 peak methods, scored with mean/p95/p99 ΔE2000 + OKLab\nEuclidean ΔE against producer SDR) split 3-3 between `measure_max` and\n`measure_percentile @ 0.99999`:\n\n  | metric          | measure_max | p99999  | winner |\n  |\n[…]\n`default_percentile_constant_is_tail_tightest`.\n\nAll 33 hdr::measure tests pass under `--features hdr-experimental`.\nAPI churn under the `hdr-experimental` gate (no semver break for\nstable consumers).",
          "is_bot": false,
          "headline": "feat(hdr): make measure_max the production default; hide measure_robust",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T12:02:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc31756c35e9ac4b962a481704b87d30c79d9dd7",
          "body": "…smoothed\n\nThe 2026-06-22 audited HDR→SDR shootout (76 imazen-26 samples × 20 curves\n× 4 peak methods) established two findings that drive this change:\n\n1. `measure_percentile @ 0.99999` (== `measure_robust` with the new\n   default) won every tail-aware metric (`de2000_p95`, `de2000_p99`,\n   `de_ok_\n[…]\n99)\n\nAll 33 hdr::measure tests pass under `--features hdr-experimental`.\n\nNote: this is API churn under the `hdr-experimental` gate, which has\nnot stabilized yet. No semver break for stable consumers.",
          "is_bot": false,
          "headline": "feat(hdr): flip DEFAULT_PERCENTILE 0.9999→0.99999 + hide measure_max_…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-23T10:54:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0897f179db46b5459532b364279a21afee1d8553",
          "body": "HDR→SDR conversion is now a native multi-step in the existing\n`ConvertPlan` infrastructure rather than a parallel struct with its own\nbuffer dispatch — when the plan builder sees an HDR-encoded source\n(PQ/HLG) with an HDR config, it composes the existing transfer-decode +\ngamut-matrix steps with two\n[…]\nΔE2000 = 3.16 on the imazen-26 sample — matches the\n  pre-refactor pipeline.\n- New unit tests pin per-pixel parity between the HDR plan and a\n  manual `apply_strip`-equivalent reference (within 5e-4).",
          "is_bot": false,
          "headline": "refactor(hdr): fold HdrToSdr into ConvertPlan as ToneMap step",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-22T22:51:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e712f84e2573d81513c659e5aee932f263c736d4",
          "body": "…diffuse-white\n\nAdd convert_buffer(&PixelBuffer) -> Result<PixelBuffer> and\nconvert_into(&PixelBuffer, &mut PixelBuffer) -> Result<()> on HdrToSdr,\nwrapping the existing linear-light apply_strip primitive with full\ndescriptor-based byte-format dispatch. The strip-level math is untouched\n— the new bu\n[…]\nargo fmt --check: clean\n\nTests added: 14 in hdr::buffer_dispatch::tests covering one cell per axis\n(transfer, format, alpha, signal range, diffuse-white precedence) plus\nmismatched-primary validation.",
          "is_bot": false,
          "headline": "feat(hdr): HdrToSdr auto-handles transfer / format / alpha / range / …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-22T02:40:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f68b759e63cc779806f5f59f6eb4d713cad90629",
          "body": "Replaces the primitive `ColorPrimaries` source/target params on\n`zenpixels_convert::hdr::HdrToSdr` with `PixelDescriptor`. Descriptors\nare the single source of truth for buffer color metadata (primaries,\ntransfer, format, alpha mode, signal range), so the converter no longer\nneeds to fan its inputs \n[…]\nound-trip.\n\nProducer-SDR e2e (`__hdr-e2e-test` feature, imazen-26 12 MP sample)\nstill passes at mean ΔE2000 = 3.16 — bit-identical to the prior commit\nsince only the API surface changed, not the math.",
          "is_bot": false,
          "headline": "refactor(hdr): HdrToSdr takes PixelDescriptor for source and target",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-21T23:39:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ed973cc1ae6e9f122d52edf29bca574794ccd78",
          "body": "Removed the [patch.crates-io] zencodec = { path = \"../zencodec\" } entry now\nthat zencodec 0.1.24 is on crates.io. The patch only affected the\n__hdr-e2e-test transitive graph (zencodec is not a default-build dependency\nof any member); that graph now resolves zencodec from the registry, with the\nlock \n[…]\n zenpixels member implements or reads the\nestimate / ResourceEstimate API. cargo test --workspace green; the\n__hdr-e2e-test test (which exercises the zencodec graph) passes on a real\nimazen-26 sample.",
          "is_bot": false,
          "headline": "deps: migrate to published zencodec 0.1.24 + drop git-rev patch",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-21T22:57:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "505d02e8df22b7ae35a78dca1ea2ee6a685d6df9",
          "body": "…mode\n\nExtends HdrToSdr to accept an arbitrary target ColorPrimaries, not just\nBT.709. When target_primaries == ColorPrimaries::Bt2020, the BT.2020 →\ntarget gamut matrix AND the OKLch soft-compress stages are skipped\nentirely — output is \"as lossless as physics allows\", with only the\ninherent BT.244\n[…]\nr_each_target_primaries — extreme-input safety\n    under each target\n  * property_simd_matches_scalar_under_arbitrary_target_primaries —\n    SIMD/scalar parity holds across every (source, target) pair",
          "is_bot": false,
          "headline": "feat(hdr): target_primaries on HdrToSdr — wide-gamut lossless output …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-21T22:06:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "14c7576cf191f6d990ff547f8afee9ddc8a6c25f",
          "body": "The bug\n=======\n`HdrToSdr::apply_strip` applied the BT.2020 -> BT.709 gamut matrix BEFORE\nthe BT.2446 Method A tone-map. That was wrong: ITU-R BT.2446-1 specifies\nthe curve in BT.2020 R'G'B' / Y'Cb'Cr', so its luma weights\n(0.2627 / 0.6780 / 0.0593) and YCbCr<->RGB coefficients are\nBT.2020-specific.\n[…]\nt and\nhdr-experimental feature sets, plus the e2e test under\n__hdr-e2e-test (requires `-p zenpixels-convert@0.2.15` to disambiguate\nthe workspace + transitive registry-zenpixels-convert@0.2.14 graph).",
          "is_bot": false,
          "headline": "fix(hdr): HdrToSdr pipeline order + arbitrary source primaries",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-21T10:32:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52fd949811b04855e26d2b6b6841c787d493ad66",
          "body": "…mental\n\nPulls ITU-R BT.2446 Method A into the canonical HDR convert home next to\nthe existing CllMeasure primitives:\n\n- src/hdr/bt2446a.rs — concrete Bt2446A struct + scalar map_rgb (verbatim\n  from zentone/src/bt2446a.rs).\n- src/hdr/bt2446a_simd.rs — 16-wide magetypes kernel + POW24 BT.1886 EOTF\n \n[…]\n sensible SDR range,\n  source==target near-identity, knee sensitivity, multi-decade finiteness.\n\nNet: 33 new tests in the hdr submodule; 521 lib tests pass with\nhdr-experimental enabled (455 without).",
          "is_bot": false,
          "headline": "feat(hdr): extract Bt2446A + SoftCompress + HdrToSdr under hdr-experi…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-21T08:12:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "154a901d6828abc0bdd19603bada4aad736f23b3",
          "body": "…:measure (#54)\n\nThe CLL measurement surface lives at zenpixels_convert::hdr::measure now,\ngated behind a new `hdr-experimental` Cargo feature (default-off). Reflects\ntwo corrections to the previous commit:\n\n  1. Path: `measure` is HDR analysis; lives under `hdr::` rather than at\n     crate root. ze\n[…]\n 480 Mpix/s\n    histogram, unchanged from pre-gate measurement.\n\nCHANGELOG zenpixels-convert — added: surface now described as \"gated\nbehind hdr-experimental\". Path references updated to hdr::measure.",
          "is_bot": false,
          "headline": "refactor(hdr): gate measurement behind hdr-experimental, nest at hdr:…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-20T02:27:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b182bba7523afb21f004f32106566037a4a2522d",
          "body": "…trait, #54)\n\nThe measure_* API surface, LightLevelHistogram, LightLevelMethod, and the\nSIMD scan kernel migrate from zenpixels to zenpixels-convert. zenpixels\nbecomes purely structural HDR types (DiffuseWhite / ContentLightLevel\nstruct + new + DEFAULT_PERCENTILE + the deprecated 0.2.14 2-arg measur\n[…]\n_robust → measure for 0.3.0.\n\nThroughput unchanged across the move: 2.5-3.4 Gpix/s measure_max, 1.0-1.3\nGpix/s measure_max_smoothed, 470 Mpix/s measure_histogram (Ryzen 9 7950X,\n-C target-cpu=native).",
          "is_bot": false,
          "headline": "refactor(hdr): move CLL measurement to zenpixels-convert (CllMeasure …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-20T01:04:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c927288a3dbaf8bdd0947738f7ec2e63e90dfe69",
          "body": "…bin (#54)\n\nWalker previously returned the lower edge of the bin where the CDF first\ncrossed `p · total` — up to ~0.02 stops / ~2 % below the true percentile\nat HDR brightness (~13 nits at 1015 cd/m²). Now linearly interpolates in\nlog2 space within that bin:\n\n  fraction = (threshold - count_before) \n[…]\nonfirm the 1 MP dense case lands within ~1\nnit (vs ~13 with the floor walker). Existing percentile and measure_*\ntests pass without bound changes — the readout only ever moved towards\nthe literal max.",
          "is_bot": false,
          "headline": "refine(hdr): LightLevelHistogram::percentile interpolates within the …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T23:10:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b99d0645e2b3f415eb65225d92b7a3fc4b782629",
          "body": "…MaxCLL (#54)\n\nThe defect-tolerant entry point production HDR pipelines actually want.\nEquivalent to measure_percentile(p=DEFAULT_PERCENTILE), with DEFAULT_PERCENTILE\n= 0.9999 (the libplacebo / DaVinci Resolve / x265 / HDR10+ industry default).\nDrops the top 0.01% of pixels as the outlier budget, re\n[…]\nercentile across both\nreduction methods), defect rejection on 100k pixels with 1 stuck pixel,\nsparse-bright cliff (1-in-100 dropped), non-linear rejection, zero image,\nDEFAULT_PERCENTILE constant pin.",
          "is_bot": false,
          "headline": "feat(hdr): measure_robust + DEFAULT_PERCENTILE — recommended-default …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T23:02:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76f02183dfe20244946903e7029a5f84471ab015",
          "body": "…(defect-tolerant, #54)\n\n3×1 horizontal box filter on the per-pixel max(R,G,B) (or BT.2020 luma)\nreduction, mirror-padded at row edges. Single stuck pixel at 10 000 cd/m²\nin a 0.005 cd/m² background reads as ~3 333 instead of 10 000; ≥3-pixel\nclusters preserved at full magnitude. Defect-tolerant alt\n[…]\nsuppression at 1/3, 3-cluster preservation at 1.0×,\n2-cluster at 2/3, MaxFALL parity with measure_max, mirror-pad at edges,\ndegenerate widths (w=1, w=2), luma method, zero image, non-linear\nrejection.",
          "is_bot": false,
          "headline": "feat(hdr): measure_max_smoothed — 3×1 horizontal box-filtered MaxCLL …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T22:39:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cd9f448471a5c484b163bcdc5cf84e6700a61644",
          "body": "…(#60)\n\nThe spec-conformant CLL reading (CTA-861.3 strict — literal MaxCLL +\narithmetic MaxFALL) is the hot path for HDR-aware encoders: runs on\nevery frame of every encode, no histogram needed. Previously `measure_max`\nbuilt the full 1024-bin log histogram just to call `.max()` and `.mean()`\non it,\n[…]\null results,\n  reproducer, libplacebo comparison.\n- CHANGELOG.md: zenpixels — added entry.\n\nLib tests: 246 → 250 pass (4 new). Clippy `-D warnings` clean under\nboth feature combos. no_std build clean.",
          "is_bot": false,
          "headline": "perf(hdr): SOTA measure_max — 2.5-3.4 Gpix/s, above libplacebo (#54) …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T19:28:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5a248ddf604a043df5a1780156ab89d93bc07a3f",
          "body": "…p) (#59)\n\nSIMD acceleration for `ContentLightLevel::measure_histogram` (and the\n`measure_max` / `measure_percentile` convenience methods that route\nthrough it), gated behind a new `simd` cargo feature. The scalar path\nstays the runtime fallback and the no-`simd`-feature build path.\n\nDesign:\n- Tiere\n[…]\n entry.\n\n246 lib tests pass (default features) / 246 with `--features simd`\n(no test-count change — same suite runs under both); clippy\n`-D warnings` clean under `--features simd`; no_std build clean.",
          "is_bot": false,
          "headline": "perf(hdr): SIMD measure_histogram kernel — ~1.7× scalar (#54 follow-u…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T19:07:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9cab557bf54dff7fa3badd853538cdcf0389eee9",
          "body": "…percentile (#54) (#58)\n\nReplaces the deprecated literal-max ContentLightLevel::measure with a\nproper histogram primitive. The redesigned issue #54 documented why a\nfixed-percentile API is the wrong answer: defect-driven outliers\n(stuck pixels, sensor noise, specular blowouts) want a percentile;\nnat\n[…]\n bin edges (within 0.5%); empty-input path;\nnon-Linear / non-f32 rejection.\n\n236 → 246 zenpixels lib tests pass (default features); 282 with\nall features. clippy -D warnings clean. no_std build clean.",
          "is_bot": false,
          "headline": "feat(hdr): histogram-based ContentLightLevel — spec-literal + opt-in …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T09:38:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a8e5ef7160d8f86d057990f7b203b9e4dd39c711",
          "body": "…(#57)\n\nThree production-readiness bugs from the zenpixels-convert audit, all in\nthe raw-bytes free-function path. The PixelBuffer (ext.rs) path was\nalready correctly guarded.\n\n1. assert_not_cmyk PANICS on caller-supplied CMYK descriptor (adapt.rs:80,\n   reached from adapt_for_encode*, convert_buffe\n[…]\n64-bit)\n- Three pre-existing #[should_panic] CMYK tests updated to assert the\n  typed CmykUnsupported error instead of the abort.\n\n448 → 455 zenpixels-convert lib tests pass. clippy -D warnings clean.",
          "is_bot": false,
          "headline": "fix(convert): typed errors instead of panics on raw-bytes path (#44) …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T08:04:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82ba79db6620897e44d7038e92a3cfb58a20c4d5",
          "body": "… (#43) (#56)\n\nTwo production-readiness bugs from the zenpixels#43 audit, both\nfixable non-breakingly at the use site.\n\n1. PlaneDescriptor::plane_width / plane_height (planar.rs:299-309) used\n   ref_width.div_ceil(self.h_subsample as u32) — but h_subsample /\n   v_subsample are public fields, so a st\n[…]\nows)\n- simd_aligned_stride_saturates_and_does_not_wrap_via_align_up\n  (verifies the align-up step doesn't undo the saturation)\n\n236 → 240 zenpixels lib tests pass. clippy -D warnings clean. fmt clean.",
          "is_bot": false,
          "headline": "fix(planar+descriptor): div-by-zero panic + 32-bit silent under-alloc…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-19T07:48:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "799d4ee0fd867d45eb681937d5d23d815dfb0971",
          "body": "…p/icc",
          "is_bot": false,
          "headline": "feat(zenpixels): buffer-level relabel builders with_diffuse_white/cic…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T22:07:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c06d503a5c56da0de6ada3904aec434e44da9aad",
          "body": "…entone\n\nSame outlier-driven failure mode that got ContentLightLevel::measure\ndeprecated in 0.2.15: these three functions ship a global Reinhard\nv/(1+v) and a bare v · 2^stops clamp, neither display-adaptive (no\ndiffuse-white anchor, no peak luminance, no chroma correction). On a\n1000-nit HDR pixel \n[…]\nNGELOG QUEUED BREAKING\nCHANGES); zenpixels-convert version bumps 0.2.14 → 0.2.15.\n\nzentone's Bt2446A had two algorithm bugs (ρ_H exponent, G' matrix\ncoefficient) — fixed separately in zentone 270f7f5.",
          "is_bot": false,
          "headline": "deprecate(hdr): reinhard / exposure tonemaps in zenpixels-convert → z…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T21:43:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5f036f63027719386231e5ed5ebdceae6f06b53b",
          "body": null,
          "is_bot": false,
          "headline": "style: cargo fmt — wrap the cfg-based prod_label in bench_orient",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T10:50:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5a85e07566125d54c498d9f7fb00da9ed23d7f7",
          "body": "…mark compile/speed/size\n\n- orient module docs: 6 private-fn intra-doc links (transpose_*) -> code spans\n  (were dead links on docs.rs; 'public docs link to private item' warnings gone).\n- Cargo.toml: correct the false 'fast-transpose pulls archmage/magetypes' comment.\n  MEASURED (benchmarks/orient_\n[…]\ne fast-transpose default-on for 0.3.0.\n\nVerified: 32 suites pass, clippy -D warnings clean, no-ft + ft builds warning-free,\norient doc-link warnings gone, staged parity test passes under all-features.",
          "is_bot": false,
          "headline": "cleanup(orient): fix doc-links, correct fast-transpose comment, bench…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T10:47:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "208bded996420b9f360797d0f7c4a6fa9cbcb030",
          "body": "The literal-maximum MaxCLL it computes (absolute max over pixels of max(R,G,B))\nis outlier-sensitive: a single specular/noise pixel inflates MaxCLL and makes\ndisplays over-tone-map (dimming the image). Production HDR metadata uses a\npercentile (~99.99th). #[deprecated] + #[doc(hidden)] now; percenti\n[…]\ncement tracked in #54; literal-max method queued for 0.3.0 removal. MaxFALL\n(the mean) is unaffected, and there were no consumers — nothing breaks. Tests\nkeep exercising it under #[allow(deprecated)].",
          "is_bot": false,
          "headline": "deprecate(hdr)!: doc-hide ContentLightLevel::measure — release 0.2.15",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T08:26:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c2b8b372e3316f4a8b1c002ccd193cddf30abb90",
          "body": "…position",
          "is_bot": false,
          "headline": "docs(changelog): post-0.2.14 cleanup — date, done dedup, registry dis…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T07:48:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d5a8920afe94aca2971c93477dfde3a087eefb5",
          "body": "…y + legacy Plane\n\nPer review, narrow the #[non_exhaustive] set to the genuinely-extensible types\nand stop sealing fixed-spec data bags (the seal there is breakage risk for ~zero\nfuture-proofing — the Rect/Size carve-out).\n\n- Keep sealed: planar::{MultiPlaneImage, PlaneLayout}, buffer::InPlacePixels\n[…]\ne, REGISTRY, find_by_*} (allow(dead_code),\n  no consumers) and legacy planar::Plane (superseded by PlaneLayout + buffers,\n  no consumers). Both queued for 0.3.0 removal.\n\ncargo test green (29 suites).",
          "is_bot": false,
          "headline": "refine(api): trim seals to extensible types; doc(hidden) dead registr…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T06:36:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee590cfe4cf54ce95971ab74c77e19d5359bc32a",
          "body": "bench_pq_anchor: RGB f32 → PQ16 @203 (anchored) and RGBA f32 → PQ16\n(alpha-preserving) across 256px/4096px/1080p.",
          "is_bot": false,
          "headline": "bench(hdr): zenbench coverage for anchored/alpha quantize_to",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T05:16:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ee13f680b1e1ca6f9a80f7e1667b295be8d4453",
          "body": "… S2)\n\nAnchor threading, alpha preservation, strided src/dst, the precise SIMD exact-ST\n2084 PQ kernel (round-trip ≤1), PixelBuffer output, and the HLG↔PQ refusal.",
          "is_bot": false,
          "headline": "docs(hdr): CHANGELOG for the anchored PQ encode + HLG↔PQ refusal (#45…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T05:07:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba9d964104ae55c31b9f13128f8f1c9eae03b274",
          "body": "…, PixelBuffer output; refuse HLG↔PQ\n\nThe #45 S2 absolute-luminance anchor, threaded through the PQ ConvertSteps and\nthe public quantize_to / pub(crate) quantize_into entries.\n\nKernels (convert_kernels.rs):\n- PQ kernels (u16+f32, encode+decode) use a vendored *precise* SIMD exact-ST 2084\n  transfer \n[…]\n\n  carries the diffuse_white anchor + target CICP onto the output.\n- quantize_into: no-alloc sibling, strided dst, pub(crate).\n\nTests updated for the HLG↔PQ refusal across the suite; full suite green.",
          "is_bot": false,
          "headline": "feat(hdr): anchored PQ encode — precise SIMD kernels, strided convert…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T05:07:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ce98117dcd2ae49a43ca895939b1cba82f178f4",
          "body": "Move ConvertError out of the 0.3.0 queue into [0.2.14] (cargo-copter-verified\nfree); add the HDR/planar/registry/buffer struct seals; queue ColorAuthority\nfor 0.3.0 (2 measured match victims).",
          "is_bot": false,
          "headline": "docs(changelog): 0.2.14 seal sweep + ConvertError promotion",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T04:40:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ed9c7fe8b27a596ea5b5875a9b29819b1057a87",
          "body": "…iant\n\nPromoted from the 0.3.0 queue on cargo-copter evidence: sealing ConvertError\nproduced 0 E0004 regressions across zpc's published reverse-deps (a\nnon_exhaustive enum only breaks exhaustive matches lacking a '_' arm, and nobody\nmatches ConvertError that way). The seal being free, the Buffer var\n[…]\n, so a StrideTooSmall / InvalidDimensions layout\nerror keeps its real cause instead of being mislabeled AllocationFailed (OOM).\nClassification half of #52 (the trace-preservation half landed earlier).",
          "is_bot": false,
          "headline": "feat(error): ConvertError #[non_exhaustive] + Buffer(BufferError) var…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T04:40:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0edf95095c13a2befd72c613dc1328a15417438",
          "body": "…tive]\n\nTolerated 0.2.x break — cargo-copter measured 0 victims across all 21 published\nzenpixels reverse-deps (nobody downstream struct-literals these; they use the\nconstructors). Sealed: hdr::{ContentLightLevel, MasteringDisplay},\nregistry::KnownColorSpace, planar::{MultiPlaneImage, PlaneDescripto\n[…]\ngrate;\nthe closure destructures already carry '..'). POD pixel types (Bgrx/Rgbx/\nGrayAlpha*) left open — struct-literal is their interface. ColorAuthority\ndeferred to 0.3.0 (2 measured match victims).",
          "is_bot": false,
          "headline": "feat(api): seal HDR/planar/registry/buffer data types as #[non_exhaus…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T04:40:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13d19b4e407fa595d16f41ca71489eb62e2d1731",
          "body": "…0.9.x)",
          "is_bot": false,
          "headline": "deps: widen moxcms to >=0.8.1,<0.10 (support crates.io 0.8.1 through …",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T03:22:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcbb4dd1dc956f2571e9563b73ff1bb4f82ffdbe",
          "body": "…uffer(BufferError) variant as a 0.3.0 breaking change (fixes the AllocationFailed mislabel) (#53)",
          "is_bot": false,
          "headline": "docs(zenpixels-convert): queue the ConvertError #[non_exhaustive] + B…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-18T02:18:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1a12bae6a3174c2f60a0ab5fce3bf00a6443b4c",
          "body": "…oundaries (map_err_at) (#52)\n\nThe cross-crate buffer constructors (PixelBuffer::{try_new,from_vec},\nPixelSlice::new) return At<BufferError>. Ten sites flattened that traced\nerror away:\n\n- 8 AllocationFailed sites (ext.rs x2, output.rs x5, hdr.rs x1) used\n  .map_err(|_| at!(ConvertError::AllocationF\n[…]\nr_format uses a generic Debug-only\nassociated error type (not an At<_>), so its at!+{e:?} is correct and was\nleft as-is.\n\nbuild/test/clippy/fmt green via run-heavy -p zenpixels-convert --all-features.",
          "is_bot": false,
          "headline": "fix(error): preserve zenpixels At<BufferError> trace across convert b…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-17T16:21:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98a9a9b415eb4afa62f7ec7074f4e3d53cdcb312",
          "body": "…e (stride unit) + constants' full descriptors + accessors (insulated-dev usability test) (#51)",
          "is_bot": false,
          "headline": "docs(zenpixels): add the from_vec raw-bytes+stride constructor exampl…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-16T09:42:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7be53d635c249214b50407d82e87996623362b2f",
          "body": "zenpixels-convert set `readme = \"../README.md\"` (the combined workspace\nREADME), but that file is outside the package root and so was never packaged\n— crates.io showed no README for the crate. Add a focused, conversion-API\nREADME in the crate dir, point `readme = \"README.md\"`, and add `/README.md`\nt\n[…]\n). All examples/symbols verified against src/ (RowConverter, best_match,\nConvertIntent, ConvertOptions, PluggableCms/MoxCms, gamut/hdr/orient/pipeline\nre-exports). Markdown-only; no public API change.",
          "is_bot": false,
          "headline": "docs(zenpixels-convert): add README (crate had none on crates.io) (#50)",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-16T06:50:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf4891946aec981382d971b12d1bb2d1eaa42a38",
          "body": "DiffuseWhite wraps f32 (no derived Eq), which had forced ColorContext to drop\nits 0.2.13 Eq — a removed-trait semver break flagged by cargo semver-checks.\nDiffuseWhite is new/unpublished, so give it a bit-exact PartialEq/Eq (a\nluminance anchor is never NaN/-0.0); ColorContext then keeps Eq. semver-checks\ndrops from 2 major failures to 1 (only the tolerated #[non_exhaustive]).",
          "is_bot": false,
          "headline": "fix(hdr): preserve ColorContext Eq via bit-exact DiffuseWhite",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-15T06:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c016be2ef645c5bda51212ba6381655fc2142da",
          "body": "…cessors. Closes #49",
          "is_bot": false,
          "headline": "docs(readme): complete the format-conversion example with verified ac…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-15T02:52:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58a1933e7173dfbb198c5c043ebc9f5fcea09b95",
          "body": "The use-case 'book' gating any public anchor-convert surface (per CLAUDE.md\nAPI policy). Classifies every HDR-convert step as auto (data-driven,\nlossless — e.g. anchor application) vs explicit (intent-driven, lossy —\ntone-map, gain-map reconstruct), writes user stories per proposed API/data\nstructure with a pub vs pub(crate) recommendation each, and concludes the\npublic surface is the *buffer-level auto* convert, not the byte-level\nexplicit one (so convert_buffer_with_anchor stays pub(crate)).",
          "is_bot": false,
          "headline": "docs(hdr): anchor & convert API — user stories + auto-convert taxonomy",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-14T22:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3d6521841450fee3af0d75b602e483ad9516a2c",
          "body": "…encodec emit model\n\nAnswers two design questions raised on review, after actually sweeping\n~/work for consumers:\n\n- 'should we add anything back when hdr is removed?' — No. A ~/work-wide\n  rip-grep shows HdrMetadata has zero consumers outside zenpixels (and its\n  snapshots); nobody reads OutputMeta\n[…]\n bundle paired with converted pixels via EncodeReady).\n\nDrops the deprecated-API usage from the module example; rewrites the hdr\nfield note and the CHANGELOG queued-break entry accordingly. Docs only.",
          "is_bot": false,
          "headline": "docs(output): ground OutputMetadata's HDR/ColorContext story in the z…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-14T07:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c3508b9bfa2e1b7132eaec457fad35b554b9423f",
          "body": "…ar-light contract\n\nmeasure decoded each f32 sample with from_ne_bytes and a hand-rolled\n3-channel max — neither vectorizable nor clean. Cast each row to &[f32]\nonce (sound under the PixelBuffer channel-alignment invariant) and reduce\nover fixed-size [f32; N] chunks via a const-generic helper shared\n[…]\nch the foundational crate doesn't depend\non. Arbitrary-format CLL = linearize first (zenpixels_convert), then\nmeasure. New strided test with a 1e9 padding sentinel proves padding bytes\nare never read.",
          "is_bot": false,
          "headline": "perf(hdr): vectorizable ContentLightLevel::measure; document its line…",
          "author_name": "Lilith River",
          "author_login": "lilith",
          "committed_at": "2026-06-14T07:27:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 21,
      "commits_last_year": 446,
      "latest_release_at": "2026-07-24T19:02:38Z",
      "latest_release_tag": "zenpixels-convert-v0.2.16",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 10.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 25,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "zenpixels",
          "exists": true,
          "license": "Apache-2.0 OR MIT",
          "keywords": [
            "codec",
            "descriptor",
            "format",
            "image",
            "pixel",
            "multimedia::images"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/zenpixels",
          "is_deprecated": false,
          "latest_version": "0.2.16",
          "repository_url": "https://github.com/imazen/zenpixels",
          "versions_count": 15,
          "total_downloads": 41237,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 10295,
          "first_published_at": "2026-03-06T05:32:40.889278Z",
          "latest_published_at": "2026-07-24T19:02:48.595048Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "zenpixels-convert",
          "exists": true,
          "license": "Apache-2.0 OR MIT",
          "keywords": [
            "codec",
            "conversion",
            "image",
            "pixel",
            "srgb",
            "multimedia::images"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/zenpixels-convert",
          "is_deprecated": false,
          "latest_version": "0.2.16",
          "repository_url": "https://github.com/imazen/zenpixels",
          "versions_count": 16,
          "total_downloads": 19220,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 5362,
          "first_published_at": "2026-03-06T05:32:47.839627Z",
          "latest_published_at": "2026-07-24T19:03:06.516886Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 11
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "justfile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "apidoc/Cargo.toml",
        "benchmarks/transpose-shootout/Cargo.toml",
        "scripts/icc-gen/Cargo.toml",
        "zenpixels-convert/Cargo.toml",
        "zenpixels/Cargo.toml"
      ],
      "largest_source_bytes": 123146,
      "source_files_sampled": 108,
      "oversized_source_files": 12,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7162
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "apidoc/Cargo.toml",
        "zenpixels-convert/Cargo.toml",
        "zenpixels/Cargo.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 9,
        "malicious_count": 0,
        "assessed_package": "crates:zenpixels@0.2.16",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates"
      ],
      "dependencies": [
        {
          "name": "zenutils-apidoc",
          "manifest": "apidoc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "zenpixels",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "linear-srgb",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6.12"
        },
        {
          "name": "bytemuck",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.21"
        },
        {
          "name": "rgb",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "garb",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.8"
        },
        {
          "name": "archmage",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9.26"
        },
        {
          "name": "libm",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "magetypes",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9.26"
        },
        {
          "name": "paste",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0.15"
        },
        {
          "name": "once_cell",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.21.4"
        },
        {
          "name": "lz4_flex",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13.1"
        },
        {
          "name": "whereat",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.5"
        },
        {
          "name": "moxcms",
          "manifest": "zenpixels-convert/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": ">=0.8.1, <0.10"
        },
        {
          "name": "bytemuck",
          "manifest": "zenpixels/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.21"
        },
        {
          "name": "rgb",
          "manifest": "zenpixels/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "imgref",
          "manifest": "zenpixels/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.12"
        },
        {
          "name": "whereat",
          "manifest": "zenpixels/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.5"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "archmage",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "archmage",
            "direct": true,
            "version": "0.9.26",
            "ecosystem": "crates"
          },
          {
            "name": "bytemuck",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bytemuck",
            "direct": true,
            "version": "1.25.0",
            "ecosystem": "crates"
          },
          {
            "name": "garb",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "garb",
            "direct": true,
            "version": "0.2.8",
            "ecosystem": "crates"
          },
          {
            "name": "imgref",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "imgref",
            "direct": true,
            "version": "1.12.2",
            "ecosystem": "crates"
          },
          {
            "name": "libm",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "libm",
            "direct": true,
            "version": "0.2.16",
            "ecosystem": "crates"
          },
          {
            "name": "linear-srgb",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "linear-srgb",
            "direct": true,
            "version": "0.6.12",
            "ecosystem": "crates"
          },
          {
            "name": "lz4_flex",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "lz4_flex",
            "direct": true,
            "version": "0.13.1",
            "ecosystem": "crates"
          },
          {
            "name": "magetypes",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "magetypes",
            "direct": true,
            "version": "0.9.26",
            "ecosystem": "crates"
          },
          {
            "name": "moxcms",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "moxcms",
            "direct": true,
            "version": "0.8.1",
            "ecosystem": "crates"
          },
          {
            "name": "moxcms",
            "direct": true,
            "version": "0.9.0",
            "ecosystem": "crates"
          },
          {
            "name": "once_cell",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "once_cell",
            "direct": true,
            "version": "1.21.4",
            "ecosystem": "crates"
          },
          {
            "name": "paste",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "paste",
            "direct": true,
            "version": "1.0.15",
            "ecosystem": "crates"
          },
          {
            "name": "rgb",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "rgb",
            "direct": true,
            "version": "0.8.53",
            "ecosystem": "crates"
          },
          {
            "name": "whereat",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "whereat",
            "direct": true,
            "version": "0.1.5",
            "ecosystem": "crates"
          },
          {
            "name": "anstream",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "crates"
          },
          {
            "name": "anstyle",
            "direct": false,
            "version": "1.0.14",
            "ecosystem": "crates"
          },
          {
            "name": "anstyle-parse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "crates"
          },
          {
            "name": "anstyle-query",
            "direct": false,
            "version": "1.1.5",
            "ecosystem": "crates"
          },
          {
            "name": "anstyle-wincon",
            "direct": false,
            "version": "3.0.11",
            "ecosystem": "crates"
          },
          {
            "name": "approx",
            "direct": false,
            "version": "0.5.1",
            "ecosystem": "crates"
          },
          {
            "name": "archmage-macros",
            "direct": false,
            "version": "0.9.26",
            "ecosystem": "crates"
          },
          {
            "name": "autocfg",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "crates"
          },
          {
            "name": "bitflags",
            "direct": false,
            "version": "2.13.0",
            "ecosystem": "crates"
          },
          {
            "name": "block-buffer",
            "direct": false,
            "version": "0.12.1",
            "ecosystem": "crates"
          },
          {
            "name": "by_address",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "crates"
          },
          {
            "name": "bytemuck_derive",
            "direct": false,
            "version": "1.10.2",
            "ecosystem": "crates"
          },
          {
            "name": "cc",
            "direct": false,
            "version": "1.2.64",
            "ecosystem": "crates"
          },
          {
            "name": "cc",
            "direct": false,
            "version": "1.2.65",
            "ecosystem": "crates"
          },
          {
            "name": "cfg-if",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "crates"
          },
          {
            "name": "clap",
            "direct": false,
            "version": "4.6.1",
            "ecosystem": "crates"
          },
          {
            "name": "clap_builder",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "crates"
          },
          {
            "name": "clap_derive",
            "direct": false,
            "version": "4.6.1",
            "ecosystem": "crates"
          },
          {
            "name": "clap_lex",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "crates"
          },
          {
            "name": "cmake",
            "direct": false,
            "version": "0.1.58",
            "ecosystem": "crates"
          },
          {
            "name": "colorchoice",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "crates"
          },
          {
            "name": "console",
            "direct": false,
            "version": "0.15.11",
            "ecosystem": "crates"
          },
          {
            "name": "const-oid",
            "direct": false,
            "version": "0.10.2",
            "ecosystem": "crates"
          },
          {
            "name": "cpufeatures",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "crates"
          },
          {
            "name": "crunchy",
            "direct": false,
            "version": "0.2.4",
            "ecosystem": "crates"
          },
          {
            "name": "crypto-common",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "crates"
          },
          {
            "name": "digest",
            "direct": false,
            "version": "0.11.3",
            "ecosystem": "crates"
          },
          {
            "name": "dunce",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "crates"
          },
          {
            "name": "encode_unicode",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "crates"
          },
          {
            "name": "errno",
            "direct": false,
            "version": "0.3.14",
            "ecosystem": "crates"
          },
          {
            "name": "fast-srgb8",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "crates"
          },
          {
            "name": "fast_transpose",
            "direct": false,
            "version": "0.2.7",
            "ecosystem": "crates"
          },
          {
            "name": "find-msvc-tools",
            "direct": false,
            "version": "0.1.9",
            "ecosystem": "crates"
          },
          {
            "name": "foreign-types",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "crates"
          },
          {
            "name": "foreign-types-macros",
            "direct": false,
            "version": "0.2.3",
            "ecosystem": "crates"
          },
          {
            "name": "foreign-types-shared",
            "direct": false,
            "version": "0.3.1",
            "ecosystem": "crates"
          },
          {
            "name": "fs4",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "crates"
          },
          {
            "name": "getrandom",
            "direct": false,
            "version": "0.3.4",
            "ecosystem": "crates"
          },
          {
            "name": "half",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "half",
            "direct": false,
            "version": "2.7.1",
            "ecosystem": "crates"
          },
          {
            "name": "hashbag",
            "direct": false,
            "version": "0.1.13",
            "ecosystem": "crates"
          },
          {
            "name": "heck",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "crates"
          },
          {
            "name": "hybrid-array",
            "direct": false,
            "version": "0.4.12",
            "ecosystem": "crates"
          },
          {
            "name": "is_terminal_polyfill",
            "direct": false,
            "version": "1.70.2",
            "ecosystem": "crates"
          },
          {
            "name": "itoa",
            "direct": false,
            "version": "1.0.18",
            "ecosystem": "crates"
          },
          {
            "name": "jobserver",
            "direct": false,
            "version": "0.1.34",
            "ecosystem": "crates"
          },
          {
            "name": "lcms2",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "lcms2",
            "direct": false,
            "version": "6.1.1",
            "ecosystem": "crates"
          },
          {
            "name": "lcms2-sys",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "crates"
          },
          {
            "name": "libc",
            "direct": false,
            "version": "0.2.186",
            "ecosystem": "crates"
          },
          {
            "name": "linux-raw-sys",
            "direct": false,
            "version": "0.12.1",
            "ecosystem": "crates"
          },
          {
            "name": "memchr",
            "direct": false,
            "version": "2.8.2",
            "ecosystem": "crates"
          },
          {
            "name": "ntapi",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "crates"
          },
          {
            "name": "num-integer",
            "direct": false,
            "version": "0.1.46",
            "ecosystem": "crates"
          },
          {
            "name": "num-traits",
            "direct": false,
            "version": "0.2.19",
            "ecosystem": "crates"
          },
          {
            "name": "objc2-core-foundation",
            "direct": false,
            "version": "0.3.2",
            "ecosystem": "crates"
          },
          {
            "name": "objc2-io-kit",
            "direct": false,
            "version": "0.3.2",
            "ecosystem": "crates"
          },
          {
            "name": "once_cell_polyfill",
            "direct": false,
            "version": "1.70.2",
            "ecosystem": "crates"
          },
          {
            "name": "palette",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "palette",
            "direct": false,
            "version": "0.7.6",
            "ecosystem": "crates"
          },
          {
            "name": "palette_derive",
            "direct": false,
            "version": "0.7.6",
            "ecosystem": "crates"
          },
          {
            "name": "pkg-config",
            "direct": false,
            "version": "0.3.33",
            "ecosystem": "crates"
          },
          {
            "name": "proc-macro2",
            "direct": false,
            "version": "1.0.106",
            "ecosystem": "crates"
          },
          {
            "name": "public-api",
            "direct": false,
            "version": "0.52.1",
            "ecosystem": "crates"
          },
          {
            "name": "pxfm",
            "direct": false,
            "version": "0.1.29",
            "ecosystem": "crates"
          },
          {
            "name": "quote",
            "direct": false,
            "version": "1.0.45",
            "ecosystem": "crates"
          },
          {
            "name": "r-efi",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "crates"
          },
          {
            "name": "rustdoc-types",
            "direct": false,
            "version": "0.57.3",
            "ecosystem": "crates"
          },
          {
            "name": "rustix",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "crates"
          },
          {
            "name": "rustup-toolchain",
            "direct": false,
            "version": "0.1.10",
            "ecosystem": "crates"
          },
          {
            "name": "rustversion",
            "direct": false,
            "version": "1.0.22",
            "ecosystem": "crates"
          },
          {
            "name": "safe_unaligned_simd",
            "direct": false,
            "version": "0.2.5",
            "ecosystem": "crates"
          },
          {
            "name": "serde",
            "direct": false,
            "version": "1.0.228",
            "ecosystem": "crates"
          },
          {
            "name": "serde_core",
            "direct": false,
            "version": "1.0.228",
            "ecosystem": "crates"
          },
          {
            "name": "serde_derive",
            "direct": false,
            "version": "1.0.228",
            "ecosystem": "crates"
          },
          {
            "name": "serde_json",
            "direct": false,
            "version": "1.0.150",
            "ecosystem": "crates"
          },
          {
            "name": "sha2",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "sha2",
            "direct": false,
            "version": "0.11.0",
            "ecosystem": "crates"
          },
          {
            "name": "shlex",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "crates"
          },
          {
            "name": "similar",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "crates"
          },
          {
            "name": "similar-asserts",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "crates"
          },
          {
            "name": "snapshot-testing",
            "direct": false,
            "version": "0.1.8",
            "ecosystem": "crates"
          },
          {
            "name": "strength_reduce",
            "direct": false,
            "version": "0.2.4",
            "ecosystem": "crates"
          },
          {
            "name": "strsim",
            "direct": false,
            "version": "0.11.1",
            "ecosystem": "crates"
          },
          {
            "name": "syn",
            "direct": false,
            "version": "2.0.117",
            "ecosystem": "crates"
          },
          {
            "name": "syn",
            "direct": false,
            "version": "2.0.118",
            "ecosystem": "crates"
          },
          {
            "name": "sysinfo",
            "direct": false,
            "version": "0.36.1",
            "ecosystem": "crates"
          },
          {
            "name": "terminal_size",
            "direct": false,
            "version": "0.4.4",
            "ecosystem": "crates"
          },
          {
            "name": "thiserror",
            "direct": false,
            "version": "2.0.18",
            "ecosystem": "crates"
          },
          {
            "name": "thiserror-impl",
            "direct": false,
            "version": "2.0.18",
            "ecosystem": "crates"
          },
          {
            "name": "transpose",
            "direct": false,
            "version": "0.2.3",
            "ecosystem": "crates"
          },
          {
            "name": "typenum",
            "direct": false,
            "version": "1.20.1",
            "ecosystem": "crates"
          },
          {
            "name": "unicode-ident",
            "direct": false,
            "version": "1.0.24",
            "ecosystem": "crates"
          },
          {
            "name": "utf8parse",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "crates"
          },
          {
            "name": "wasip2",
            "direct": false,
            "version": "1.0.4+wasi-0.2.12",
            "ecosystem": "crates"
          },
          {
            "name": "winapi",
            "direct": false,
            "version": "0.3.9",
            "ecosystem": "crates"
          },
          {
            "name": "winapi-i686-pc-windows-gnu",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "crates"
          },
          {
            "name": "winapi-x86_64-pc-windows-gnu",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "crates"
          },
          {
            "name": "winarm-cpufeatures",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "crates"
          },
          {
            "name": "windows",
            "direct": false,
            "version": "0.61.3",
            "ecosystem": "crates"
          },
          {
            "name": "windows-collections",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "crates"
          },
          {
            "name": "windows-core",
            "direct": false,
            "version": "0.61.2",
            "ecosystem": "crates"
          },
          {
            "name": "windows-future",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "crates"
          },
          {
            "name": "windows-implement",
            "direct": false,
            "version": "0.60.2",
            "ecosystem": "crates"
          },
          {
            "name": "windows-interface",
            "direct": false,
            "version": "0.59.3",
            "ecosystem": "crates"
          },
          {
            "name": "windows-link",
            "direct": false,
            "version": "0.1.3",
            "ecosystem": "crates"
          },
          {
            "name": "windows-link",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "crates"
          },
          {
            "name": "windows-numerics",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "crates"
          },
          {
            "name": "windows-result",
            "direct": false,
            "version": "0.3.4",
            "ecosystem": "crates"
          },
          {
            "name": "windows-strings",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "crates"
          },
          {
            "name": "windows-sys",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "crates"
          },
          {
            "name": "windows-sys",
            "direct": false,
            "version": "0.61.2",
            "ecosystem": "crates"
          },
          {
            "name": "windows-targets",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows-threading",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "crates"
          },
          {
            "name": "windows_aarch64_gnullvm",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows_aarch64_msvc",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows_i686_gnu",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows_i686_gnullvm",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows_i686_msvc",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows_x86_64_gnu",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows_x86_64_gnullvm",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "windows_x86_64_msvc",
            "direct": false,
            "version": "0.52.6",
            "ecosystem": "crates"
          },
          {
            "name": "wit-bindgen",
            "direct": false,
            "version": "0.57.1",
            "ecosystem": "crates"
          },
          {
            "name": "zenbench",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "zenbench",
            "direct": false,
            "version": "0.1.8",
            "ecosystem": "crates"
          },
          {
            "name": "zerocopy",
            "direct": false,
            "version": "0.8.52",
            "ecosystem": "crates"
          },
          {
            "name": "zerocopy-derive",
            "direct": false,
            "version": "0.8.52",
            "ecosystem": "crates"
          },
          {
            "name": "zmij",
            "direct": false,
            "version": "1.0.21",
            "ecosystem": "crates"
          },
          {
            "name": "zune-core",
            "direct": false,
            "version": "0.5.1",
            "ecosystem": "crates"
          },
          {
            "name": "zune-image",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "crates"
          },
          {
            "name": "zune-imageprocs",
            "direct": false,
            "version": "0.5.1",
            "ecosystem": "crates"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 158,
        "direct_count": 27,
        "indirect_count": 131
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 32,
        "open_issues": 9,
        "closed_ratio": 0.7,
        "closed_issues": 21,
        "closed_unmerged_prs": 7
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "lilith",
          "commits": 445,
          "avatar_url": "https://avatars.githubusercontent.com/u/107935?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "icc-profiles.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/17 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 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 23 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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "640dcedf1ee3f828c66dd19c0a08f08a68da9685",
        "ran_at": "2026-07-25T17:18:46Z",
        "aggregate_score": 3.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-24T19:01:40Z",
      "oldest_open_prs": [
        {
          "number": 55,
          "created_at": "2026-06-19T00:54:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 62,
          "created_at": "2026-06-28T03:23:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-24T10:19:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 23,
          "created_at": "2026-04-22T23:00:24Z",
          "last_comment_at": "2026-04-26T06:10:29Z",
          "last_comment_author": "lilith"
        },
        {
          "number": 36,
          "created_at": "2026-06-04T20:43:30Z",
          "last_comment_at": "2026-06-11T06:37:48Z",
          "last_comment_author": "lilith"
        },
        {
          "number": 39,
          "created_at": "2026-06-11T05:41:53Z",
          "last_comment_at": "2026-06-17T16:00:28Z",
          "last_comment_author": "lilith"
        },
        {
          "number": 40,
          "created_at": "2026-06-11T09:49:44Z",
          "last_comment_at": "2026-06-14T06:57:04Z",
          "last_comment_author": "lilith"
        },
        {
          "number": 42,
          "created_at": "2026-06-13T22:53:08Z",
          "last_comment_at": "2026-06-17T16:00:26Z",
          "last_comment_author": "lilith"
        },
        {
          "number": 45,
          "created_at": "2026-06-14T00:19:39Z",
          "last_comment_at": "2026-06-17T16:00:27Z",
          "last_comment_author": "lilith"
        },
        {
          "number": 64,
          "created_at": "2026-07-15T20:53:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 69,
          "created_at": "2026-07-15T22:59:27Z",
          "last_comment_at": "2026-07-24T10:21:17Z",
          "last_comment_author": "lilith"
        },
        {
          "number": 71,
          "created_at": "2026-07-24T09:14:44Z",
          "last_comment_at": "2026-07-24T10:21:24Z",
          "last_comment_author": "lilith"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/imazen/zenpixels",
    "host": "github.com",
    "name": "zenpixels",
    "owner": "imazen"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 50,
        "vitality": 87,
        "community": 35,
        "governance": 57,
        "engineering": 55
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 87,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "commits_last_year": 446,
              "human_commit_share": 0.99,
              "days_since_last_push": 0,
              "active_weeks_last_year": 20
            },
            "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": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "446 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 446
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 23 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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 21,
              "latest_release_tag": "zenpixels-convert-v0.2.16",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 10.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "21 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "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 ~10.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 10.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 35,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "packages": [
                "zenpixels",
                "zenpixels-convert"
              ],
              "dependents": null,
              "ecosystems": "crates",
              "total_downloads": 60457,
              "monthly_downloads": 15657
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "15,657 downloads/month across crates",
                "points": 55.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 15657,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "merged_prs": 32,
              "open_issues": 9,
              "closed_issues": 21,
              "issue_closed_ratio": 0.7,
              "closed_unmerged_prs": 7
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "70% of issues closed",
                "points": 32.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 70
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "32/39 decided PRs merged",
                "points": 31.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 32,
                      "decided": 39
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/17 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "followers": 47,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "imazen",
              "public_repos": 220,
              "account_age_days": 5177
            },
            "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": "47 followers of imazen",
                "points": 12.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 47,
                      "login": "imazen"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "220 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 220
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "zenpixels",
                "zenpixels-convert"
              ],
              "ecosystems": "crates",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on crates",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 55,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 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": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 50,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/17 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 23 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 0",
                "points": 0,
                "status": "missed",
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:zenpixels@0.2.16 runtime dependency closure — what installing the published package pulls in — 9 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "crates:zenpixels@0.2.16",
                  "assessed": 9
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 9,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 9,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "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": "good",
        "name": "AI Readiness",
        "value": 70,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7162
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.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": "99 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "justfile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "apidoc/Cargo.toml",
                "benchmarks/transpose-shootout/Cargo.toml",
                "scripts/icc-gen/Cargo.toml",
                "zenpixels-convert/Cargo.toml",
                "zenpixels/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "justfile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "justfile"
                    }
                  }
                ],
                "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": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 123146,
              "source_files_sampled": 108,
              "oversized_source_files": 12
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "12/108 source files over 60KB",
                "points": 48.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 108,
                      "oversized": 12
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch crates package 'zenpixels-apidoc' from its registry"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T17:18:56.750683Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/imazen/zenpixels.svg",
  "full_name": "imazen/zenpixels",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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 v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticscrates.io.