Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-25 17:18 UTC

imazen / zenpixels

RustApache-2.0★ 1 estrella⑂ 0 forksdesde mar 2026Ver en GitHub ↗

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

58
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

ImazenOrganización
47 seguidores220 repositorios públicosdesde may 2012

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
crates.iozenpixels0.2.1610.29515hace 0 díascodecdescriptorformatimagepixel
crates.iozenpixels-convert0.2.16536216hace 0 díascodecconversionimagepixelsrgb

Métricas por categoría

Vitalidad

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

87Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
13.8/36Cadencia de commits — 20/52 semanas con commits
18/18Volumen de commits — 446 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year446
human_commit_share0,99
days_since_last_push0
active_weeks_last_year20
Cómo se puntúa
27/27Publica versiones — 21 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~10,6 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count21
latest_release_tagzenpixels-convert-v0.2.16
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases10,6
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

35En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks0
stars1
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
55.9/80Descargas mensuales — 15.657 descargas/mes en crates
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packageszenpixels, zenpixels-convert
dependents
ecosystemscrates
total_downloads60.457
monthly_downloads15.657
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

57Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
32.7/46.8Resolución de issues — 70% de issues cerradas
31.4/38.3Aceptación de PR — 32/39 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/17 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs32
open_issues9
closed_issues21
issue_closed_ratio0,7
closed_unmerged_prs7
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
12.1/25Alcance del propietario — 47 seguidores de imazen
25/25Trayectoria — 220 repos públicos, cuenta de ~14 años
Datos de entrada utilizados
followers47
owner_typeOrganization
is_verified
owner_loginimazen
public_repos220
account_age_days5177
Cómo se puntúa
25/25Publicado y resoluble — 2 paquete(s) en crates
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 16 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageszenpixels, zenpixels-convert
ecosystemscrates
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

55Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

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

Seguridad

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

50Moderado · 16% del índice global
Cómo se puntúa
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.5Licencia — 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 — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,8
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages9
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de crates:zenpixels@0.2.16 —lo que arrastra la instalación del paquete publicado—: 9 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

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

70Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 99 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes7162
Cómo se puntúa
18/18Arranque con un solo comando — justfile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Rust (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesCargo.lock
has_dockerfileno
typed_language
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
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
48.9/55Tamaños de archivo manejables — 12/108 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes123.146
source_files_sampled108
oversized_source_files12
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

1estrellas de GitHub
1contribuidores
446commits en los últimos 12 meses
0días desde el último push
21versiones publicadas
1factor bus
9issues abiertas
crates.ioecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.8 / 10
3.8agregado

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

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

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

Instalar crates:zenpixels@0.2.16 arrastra 9 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 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"
}

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

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

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