Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 19:52 UTC

jpwesselink / imferno

RustMIT★ 2 estrellas⑂ 0 forksdesde feb 2026Ver en GitHub ↗

jpwesselink/imferno 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 (86/100) y la más baja, Security (27/100). Se actualizó por última vez hace 5 días. 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

JP WesselinkCuenta personal
98 seguidores94 repositorios públicosdesde jun 2012@jp10k

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
crates.ioxtaskapunta a otro repositorio; no se puntúa0.1.41875hace 23 díasautomationmacosreleasecodesignxtaskcommand-line-utilities
npmdocs0.4.0395813hace 47 días

Métricas por categoría

Vitalidad

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

86Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
11.8/36Cadencia de commits — 17/52 semanas con commits
18/18Volumen de commits — 357 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year357
human_commit_share0,99
days_since_last_push5
active_weeks_last_year17
Cómo se puntúa
27/27Publica versiones — 54 versiones publicadas
36/36Recencia de las versiones — última versión hace 34 días
27/27Cadencia de publicación — una versión cada ~4,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count54
latest_release_tagimferno-wasm-v3.0.1
releases_from_tagsno
days_since_latest_release34
mean_days_between_releases4,3
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?

33En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
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
48/80Descargas mensuales — 3958 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesdocs
dependents
ecosystemsnpm
total_downloads
monthly_downloads3958
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?

59Moderado · 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
10/10OpenSSF Scorecard: Contributors — project has 6 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
36.7/38.3Aceptación de PR — 72/75 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/12 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs72
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs3
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
14.3/25Alcance del propietario — 98 seguidores de jpwesselink
25/25Trayectoria — 94 repos públicos, cuenta de ~14 años
Datos de entrada utilizados
followers98
owner_typeUser
is_verified
owner_loginjpwesselink
public_repos94
account_age_days5162
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 47 días
20/20Historial de versiones — 13 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesdocs
ecosystemsnpm
any_deprecatedno
min_days_since_publish47

Calidad de Ingeniería

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

73Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 8 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 11 out of 11 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://jpwesselink.github.io/imferno
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepagehttps://jpwesselink.github.io/imferno
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?

27Crítico · 16% del índice global
Cómo se puntúa
4.5/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — sin datos
2.5/2.5CI-Tests — 11 out of 11 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/12 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 6 contributing companies or organizations
0/10Dangerous-Workflow — 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 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
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
0/7.5Vulnerabilities — 36 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,7
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, signed_releases. Los pesos restantes se han renormalizado.

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.

55Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 96 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,97
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — Cargo.toml, crates/benchmarks/Cargo.toml, crates/corpus-tests/Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — crates/imferno-wasm/tsconfig.json, docs-astro/tsconfig.json, docs/tsconfig.json, examples/node/tsconfig.json
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
lockfilespnpm-lock.yaml
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configscrates/imferno-wasm/tsconfig.json, docs-astro/tsconfig.json, docs/tsconfig.json, examples/node/tsconfig.json
agent_commit_share0
toolchain_manifestsCargo.toml, crates/benchmarks/Cargo.toml, crates/corpus-tests/Cargo.toml, crates/imferno-core/Cargo.toml, crates/imferno-napi/Cargo.toml, crates/imferno-wasm/Cargo.toml, crates/imferno/Cargo.toml, xtask/Cargo.toml
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
53.8/55Tamaños de archivo manejables — 4/185 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes399.222
source_files_sampled185
oversized_source_files4
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

2estrellas de GitHub
1contribuidores
357commits en los últimos 12 meses
5días desde el último push
54versiones publicadas
1factor bus
0issues abiertas
crates.io, npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • crates package 'xtask' points at a different repository (https://github.com/arcboxlabs/xtask); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 2.7 / 10
2.7agregado

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-23 19:52 UTC

6Binary-Artifactsbinaries present in source code
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests11 out of 11 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/12 approved changesets -- score normalized to 0
10Contributorsproject has 6 contributing companies or organizations
0Dangerous-Workflowdangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow 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
0Vulnerabilities36 existing vulnerabilities detected
Dependencias directas 15
RegistroPaqueteRestricción de versiónManifiesto
npm@astrojs/react^4.4.2docs-astro/package.json
npm@astrojs/starlight^0.37.6docs-astro/package.json
npm@tailwindcss/vite^4.2.0docs-astro/package.json
npm@types/react^19.2.14docs-astro/package.json
npm@types/react-dom^19.2.3docs-astro/package.json
npmastro^5.6.1docs-astro/package.json
npmclsx^2.1.1docs-astro/package.json
npmreact^19.2.4docs-astro/package.json
npmreact-dom^19.2.4docs-astro/package.json
npmsharp^0.34.2docs-astro/package.json
npmtailwind-merge^3.5.0docs-astro/package.json
npmtailwindcss^4.2.0docs-astro/package.json
crates.ioimferno-corextask/Cargo.toml
crates.ioschemars0.8xtask/Cargo.toml
crates.ioserde_json1xtask/Cargo.toml
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 27955,
      "has_wiki": true,
      "homepage": "https://jpwesselink.github.io/imferno",
      "languages": {
        "CSS": 6987,
        "MDX": 12677,
        "HTML": 27171,
        "Rust": 1665082,
        "Astro": 21303,
        "Shell": 6473,
        "Python": 10194,
        "JavaScript": 177635,
        "TypeScript": 84486
      },
      "pushed_at": "2026-07-18T12:14:47Z",
      "created_at": "2026-02-25T19:34:12Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T11:02:42Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://twitter.com/jp10k",
      "name": "JP Wesselink",
      "type": "User",
      "login": "jpwesselink",
      "company": "@jp10k",
      "location": "Netherlands",
      "followers": 98,
      "avatar_url": "https://avatars.githubusercontent.com/u/1814479?v=4",
      "created_at": "2012-06-04T09:04:24Z",
      "is_verified": null,
      "public_repos": 94,
      "account_age_days": 5162
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "imferno-wasm-v3.0.1",
          "kind": "other",
          "published_at": "2026-06-19T18:10:37Z"
        },
        {
          "tag": "imferno-v3.0.1",
          "kind": "other",
          "published_at": "2026-06-19T18:10:34Z"
        },
        {
          "tag": "imferno-core-v3.0.1",
          "kind": "other",
          "published_at": "2026-06-19T18:10:09Z"
        },
        {
          "tag": "imferno-wasm-v3.0.0",
          "kind": "other",
          "published_at": "2026-06-19T13:44:41Z"
        },
        {
          "tag": "imferno-v3.0.0",
          "kind": "other",
          "published_at": "2026-06-19T13:44:38Z"
        },
        {
          "tag": "imferno-core-v3.0.0",
          "kind": "other",
          "published_at": "2026-06-19T12:46:54Z"
        },
        {
          "tag": "imferno-wasm-v2.4.1",
          "kind": "other",
          "published_at": "2026-05-18T13:50:46Z"
        },
        {
          "tag": "imferno-v2.4.1",
          "kind": "other",
          "published_at": "2026-05-18T13:50:42Z"
        },
        {
          "tag": "imferno-core-v2.4.1",
          "kind": "other",
          "published_at": "2026-05-18T13:50:18Z"
        },
        {
          "tag": "imferno-wasm-v2.4.0",
          "kind": "other",
          "published_at": "2026-05-11T18:09:51Z"
        },
        {
          "tag": "imferno-v2.4.0",
          "kind": "other",
          "published_at": "2026-05-11T18:09:48Z"
        },
        {
          "tag": "imferno-core-v2.4.0",
          "kind": "other",
          "published_at": "2026-05-11T18:09:21Z"
        },
        {
          "tag": "imferno-v2.3.0",
          "kind": "other",
          "published_at": "2026-05-11T12:58:23Z"
        },
        {
          "tag": "imferno-core-v2.3.0",
          "kind": "other",
          "published_at": "2026-05-11T12:57:58Z"
        },
        {
          "tag": "imferno-v2.2.0",
          "kind": "other",
          "published_at": "2026-05-11T12:44:29Z"
        },
        {
          "tag": "imferno-core-v2.2.0",
          "kind": "other",
          "published_at": "2026-05-11T12:44:05Z"
        },
        {
          "tag": "imferno-wasm-v2.1.2",
          "kind": "other",
          "published_at": "2026-04-29T16:38:06Z"
        },
        {
          "tag": "imferno-v2.1.2",
          "kind": "other",
          "published_at": "2026-04-29T16:38:04Z"
        },
        {
          "tag": "imferno-core-v2.1.2",
          "kind": "other",
          "published_at": "2026-04-29T16:37:41Z"
        },
        {
          "tag": "imferno-wasm-v2.1.1",
          "kind": "other",
          "published_at": "2026-04-29T12:27:21Z"
        },
        {
          "tag": "imferno-v2.1.1",
          "kind": "other",
          "published_at": "2026-04-29T12:27:19Z"
        },
        {
          "tag": "imferno-core-v2.1.1",
          "kind": "other",
          "published_at": "2026-04-29T12:26:54Z"
        },
        {
          "tag": "imferno-wasm-v2.1.0",
          "kind": "other",
          "published_at": "2026-04-29T08:24:24Z"
        },
        {
          "tag": "imferno-v2.1.0",
          "kind": "other",
          "published_at": "2026-04-29T08:24:21Z"
        },
        {
          "tag": "imferno-core-v2.1.0",
          "kind": "other",
          "published_at": "2026-04-29T08:23:58Z"
        },
        {
          "tag": "imferno-wasm-v2.0.0",
          "kind": "other",
          "published_at": "2026-03-04T21:33:32Z"
        },
        {
          "tag": "imferno-v2.0.0",
          "kind": "other",
          "published_at": "2026-03-04T21:33:30Z"
        },
        {
          "tag": "imferno-core-v2.0.0",
          "kind": "other",
          "published_at": "2026-03-04T21:33:13Z"
        },
        {
          "tag": "imferno-wasm-v1.1.0",
          "kind": "other",
          "published_at": "2026-03-02T10:15:32Z"
        },
        {
          "tag": "imferno-v1.1.0",
          "kind": "other",
          "published_at": "2026-03-02T10:15:31Z"
        },
        {
          "tag": "imferno-core-v1.1.0",
          "kind": "other",
          "published_at": "2026-03-02T10:15:13Z"
        },
        {
          "tag": "imferno-v1.0.1",
          "kind": "other",
          "published_at": "2026-03-02T10:06:05Z"
        },
        {
          "tag": "imferno-core-v1.0.1",
          "kind": "other",
          "published_at": "2026-03-02T10:05:48Z"
        },
        {
          "tag": "test-data-v1",
          "kind": "other",
          "published_at": "2026-03-02T09:29:54Z"
        },
        {
          "tag": "v1.0.5",
          "kind": "patch",
          "published_at": "2026-02-27T22:50:19Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-02-27T22:30:36Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-02-27T22:26:24Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-02-27T22:15:15Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-02-27T21:34:11Z"
        },
        {
          "tag": "imferno-wasm-v1.0.0",
          "kind": "other",
          "published_at": "2026-02-27T20:30:05Z"
        },
        {
          "tag": "imferno-v1.0.0",
          "kind": "other",
          "published_at": "2026-02-27T20:30:04Z"
        },
        {
          "tag": "imferno-core-v1.0.0",
          "kind": "other",
          "published_at": "2026-02-27T20:29:47Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-02-27T20:29:09Z"
        },
        {
          "tag": "imferno-v0.1.5",
          "kind": "other",
          "published_at": "2026-02-27T19:10:05Z"
        },
        {
          "tag": "imferno-core-v0.1.4",
          "kind": "other",
          "published_at": "2026-02-27T19:09:47Z"
        },
        {
          "tag": "imferno-v0.1.4",
          "kind": "other",
          "published_at": "2026-02-27T18:34:09Z"
        },
        {
          "tag": "imferno-core-v0.1.3",
          "kind": "other",
          "published_at": "2026-02-27T18:33:50Z"
        },
        {
          "tag": "imferno-v0.1.3",
          "kind": "other",
          "published_at": "2026-02-27T18:08:15Z"
        },
        {
          "tag": "imferno-core-v0.1.2",
          "kind": "other",
          "published_at": "2026-02-27T18:07:56Z"
        },
        {
          "tag": "imferno-v0.1.2",
          "kind": "other",
          "published_at": "2026-02-27T14:55:08Z"
        },
        {
          "tag": "imferno-v0.1.1",
          "kind": "other",
          "published_at": "2026-02-27T14:08:17Z"
        },
        {
          "tag": "imferno-core-v0.1.1",
          "kind": "other",
          "published_at": "2026-02-27T14:07:49Z"
        },
        {
          "tag": "imferno-v0.1.0",
          "kind": "other",
          "published_at": "2026-02-27T12:47:26Z"
        },
        {
          "tag": "imferno-core-v0.1.0",
          "kind": "other",
          "published_at": "2026-02-27T12:42:07Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8b55d2c38fb8cf9ee90c6508ff3733a90320ec8f",
          "body": "…rds-table\n\ndocs: reflect ST 2067-203/-204 essence-layer coverage + add Fraunhofer fetch script",
          "is_bot": false,
          "headline": "Merge pull request #76 from jpwesselink/docs/fraunhofer-corpus-standa…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-18T11:02:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44e0a5f5edee519e0d3cac961dad33bc5688500d",
          "body": "The ST 377-1 row was flagged Partial because we don't decode essence\nsamples into their codec output. That's not a ST 377-1 gap — decoding\nJPEG 2000 pixels or PCM audio frames is the codec spec's job (ST 422,\nST 382, ST 379-2), and those are already listed as \"Not implemented\"\nin the same table. Eve\n[…]\ne table refresh:\n    377-1 moves out of the Partial section into Complete, 377-4\n    added right after it. Partial section now contains only the\n    genuinely-partial ST 2067-203 and ST 2067-204 rows.",
          "is_bot": false,
          "headline": "docs(standards): promote ST 377-1 to Complete, add ST 377-4",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-18T10:52:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "544c71e754ffa4a57898e7c6a27e67bd807d149d",
          "body": "…ptor\n\nPre-existing block in `video_info_from_descriptor` (report.rs:1064)\ntripped `clippy::question-mark` under the toolchain now used in CI:\nthe `else if let Some(ref d) = ed.rgba_descriptor { … } else { return None }`\ntail can be collapsed to `let d = ed.rgba_descriptor.as_ref()?; …`\nwith identical semantics.\n\nNot caused by anything in this branch — it fires on every rebuild\nnow — but the docs PR triggered the rebuild, so folding the fix in\nhere keeps CI green without a separate one-line PR.",
          "is_bot": false,
          "headline": "fix(clippy): apply question-mark suggestion in video_info_from_descri…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-18T10:22:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a89f03cd8498dc21d932ccb8f68b2260342b7a6",
          "body": "The four feature cards on the docs homepage understated the tool's\nactual reach — three of them predated the v3.0/v3.1 essence-layer +\naudit work.\n\n  - Card 1 \"IMF core + applications\" only listed ST 2067-2/-3/-21/-201,\n    missing ST 2067-9 (SCM), ST 2067-202 (ISXD), ST 2067-203/-204\n    (S-ADM/ADM\n[…]\n #76) and the vendored App #2E,\n    App5 (IMAX HDR), IAB, ISXD, HT, S-ADM, and Netflix-Sony Plugfest\n    fixture sets.\n  - Card 3 \"Rust, Node.js & WASM\" unchanged — packaging story\n    hasn't shifted.",
          "is_bot": false,
          "headline": "docs(homepage): refresh feature cards to reflect current coverage",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-18T10:11:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "32b66b172c45248645beab73b993eea5074cded9",
          "body": "…r fetch script\n\nThe essence-layer work in #65 (Mode A / ADM detection, footer→header\npartition fallback) plus follow-up audit PRs #66-#75 shifted both\nST 2067-203 (S-ADM) and ST 2067-204 (ADM) from \"Not implemented\" to\n\"Partial — essence detection + rule-standdown wired; CPL-level plug-in\nsemantics\n[…]\n` — new: parallel curl of the\n    11 corpus files from IMFTool's mirror, skip-if-present, prints\n    the follow-up `cargo run --example` invocation. Companion to the\n    existing `fetch-test-data.sh`.",
          "is_bot": false,
          "headline": "docs: reflect ST 2067-203/-204 essence-layer coverage + add Fraunhofe…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-18T09:58:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8585625998165a398ad22ff99de6b94375da579",
          "body": "fix(mxf): cfg-gate iab_labeling for wasm32",
          "is_bot": false,
          "headline": "Merge pull request #75 from jpwesselink/fix/wasm-gate-iab-labeling",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-06T11:34:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34f6b6d30bafada3ab9463f87559a1a07abc5d60",
          "body": "PR #74's new iab_labeling module imports native-only audio_mca helpers\nand walks MXF-derived RegXML, but was declared without the\nwasm32 cfg-gate the sibling essence modules carry — breaking the wasm\nbuild on main (unresolved import crate::mxf::audio_mca). The\npackage/mod.rs call site was already inside the existing wasm gate.\n\nVerified: cargo build -p imferno-core --target wasm32-unknown-unknown\n--features wasm compiles; native workspace tests unchanged.",
          "is_bot": false,
          "headline": "fix(mxf): cfg-gate iab_labeling for wasm32",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-06T11:24:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33b16baa0a5b65a8c4db106a09ea2ae2b2d55f75",
          "body": "feat(validation): audit P3 batch — IAB and ISXD gap rules + font/otf (AUDIT-18/21, AUDIT-13 partial)",
          "is_bot": false,
          "headline": "Merge pull request #74 from jpwesselink/fix/audit-p3-batch",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-06T11:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ade913c2b58817898338780a13831459fdc5db4",
          "body": "…D §6/§9.3 gap rules, font/otf (AUDIT-18, AUDIT-21, AUDIT-13 partial)\n\nImplements the remaining implementable gap findings from the 2026-07\nspec-conformance audit, each grounded in the staged publication PDFs.\n\nAUDIT-18 — IAB labeling + composition gaps (ST 2067-201, both editions)\n- NEW mxf/iab_lab\n[…]\nm the new rules on real packages)\n- fraunhofer_corpus_check: unchanged (SADM clean; -204 only the\n  pre-existing RFC5646 warning)\n- snapshot + codes.js/codes.d.ts + docs codes.md regenerated via xtask",
          "is_bot": false,
          "headline": "feat(validation): audit P3 batch — IAB §5.10.2/Annex C.2/§6.2 and ISX…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-06T11:11:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff3a164da1a5058e54fec309f72bcfd1aa6bea43",
          "body": "fix(validation): audit P2 batch — remaining fix-queue findings (AUDIT-2/3/9/10/11/12/15/16/17/19/20/21-partial)",
          "is_bot": false,
          "headline": "Merge pull request #73 from jpwesselink/fix/audit-p2-batch",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T21:54:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51ff0b1a2931a1a74df5def3a796c3a75c23ddec",
          "body": "…audio MCA, IAB, ISXD\n\nImplements the remaining fix-queue items from the 2026-07 spec-conformance\naudit (docs/spec-conformance-audit-2026-07.md), all verified against the\nstaged publication PDFs.\n\nAUDIT-9 — MCAChannelIDMissing channel-1 false positive\n- ST 2067-2:2016 §5.3.6.5 Table 7: MCAChannelID \n[…]\n: unchanged (SADM files\n  clean; -204 files only the pre-existing RFC5646 warning)\n- specs/CHECKSUMS verifies (shasum -a 256 -c)\n- snapshots + codes.js/codes.d.ts + docs codes.md regenerated via xtask",
          "is_bot": false,
          "headline": "fix(validation): audit P2 batch — 9 spec-conformance findings across …",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T21:41:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "11ebfcfb7e1e0fa437955f4b00605bbf9395f92c",
          "body": "docs(audit): Phase 3 — rule-by-rule prose verification, 16 new findings",
          "is_bot": false,
          "headline": "Merge pull request #70 from jpwesselink/audit/phase-3-findings",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T15:09:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ead4fd5648057cb24e5610af129305eaca6fc000",
          "body": "fix(validation): audit P1 batch — invented IAB rule, timed-text UL byte, ADM-gated Mode A",
          "is_bot": false,
          "headline": "Merge pull request #71 from jpwesselink/fix/audit-p1-batch",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T15:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4582fec29c2e7a9c925a8c1ff3e77f8ee68b384",
          "body": "…te, ADM-gated Mode A\n\nThree P1 fixes from the 2026-07 spec-conformance audit (Phase 3).\n\nAUDIT-14 — remove invented MainAudioMissing rule\n- Delete the ST2067-201:*:6.2/MainAudioMissing emission and the\n  IabCode::MainAudioMissing variant (codes, descriptions, examples,\n  ALL entries, for_code arms)\n[…]\no timed-text/MCA regressions)\n- fraunhofer_corpus_check /tmp/fraunhofer-corpus: all 4 files clean of\n  the gated rules (only the pre-existing RFC5646SpokenLanguageMissing\n  warnings on the -204 files)",
          "is_bot": false,
          "headline": "fix(validation): audit P1 batch — invented IAB rule, timed-text UL by…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T14:49:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4bacb048c60f3288d57f66caea27f4d8b937ec48",
          "body": "…ew findings\n\nThree firsthand-pdf verification passes (ST 2067-2 §5.3/§5.4 + ST 377-4;\nST 2067-201; ST 2067-202/-203). Headlines: three P1s — MainAudioMissing\nis an invented rule (no prose basis, actively firing since #66),\ntimed-text mapping-kind checks the wrong UL byte (false Error on every\nconfo\n[…]\nt TT file), and the Mode A carve-out (#65) has no ST 2067-2\nbasis and must gate on ADM/ST 2131 markers instead. AUDIT-5 resolved\n(377-4 :2012 citations remain valid). FIX-16b fully scoped (~43 rules).",
          "is_bot": false,
          "headline": "docs(audit): Phase 3 complete — rule-by-rule prose verification, 16 n…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T14:28:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c5fc81a3fe005735e8e78500bf4b59632aaf2164",
          "body": "docs(audit): spec-conformance audit kickoff — audio stack",
          "is_bot": false,
          "headline": "Merge pull request #68 from jpwesselink/audit/spec-conformance-2026-07",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:43:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf01939df03e17994753d0a578a99cbf9fc5ca33",
          "body": "fix(audio): skip §5.3 WAVE-PCM rules on ST 2067-201 IAB essence (AUDIT-1)",
          "is_bot": false,
          "headline": "Merge pull request #69 from jpwesselink/fix/iab-essence-descriptor-guard",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:43:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b252ef4e3b1b991f830db9183c1ecf016298dd3",
          "body": "…T-1)\n\nThe audio-MCA skip guard covered ST 2067-203 MGA/SADM essence\n(`MGASoundEssenceDescriptor`, fixed in v3.0.1) but not ST 2067-201 IAB\nessence. IAB tracks carry an `IABEssenceDescriptor` (+\nIABSoundfieldLabelSubDescriptor), not a WAVEPCMDescriptor — confirmed\nagainst the real Atmos track in tes\n[…]\nn the PCM audio track) is a\ngenuine ST 377-4 §6.3.2 finding, unchanged.\n\nTests: +2 (synthetic IAB RegXML guard pin; end-to-end guard against the\nreal corpus Atmos MXF, fixture-gated). Workspace green.",
          "is_bot": false,
          "headline": "fix(audio): skip §5.3 WAVE-PCM rules on ST 2067-201 IAB essence (AUDI…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:32:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "40c33061c0a42d3e6930e8ca969a29a407e38373",
          "body": "…-end\n\nfix(audio): Mode A channel labeling + footer→header partition fallback",
          "is_bot": false,
          "headline": "Merge pull request #65 from jpwesselink/feat/fraunhofer-corpus-end-to…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:29:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1efe37b1705bfe1496acecb3f0a546bd21c01a4",
          "body": "Phase 0 complete (PR #65 pending, #66 merged), Phase 1 prose acquisition\ncomplete (all audio-stack specs fetched firsthand from pub.smpte.org\nwith sha256s recorded). Findings so far: dispatch gap (fixed, #66), IAB\nWAVE-PCM false positive (open), ISXD edition mislabel :2022→:2023\n(firsthand-pdf confirmed), vendored XSD provenance drift (benign),\nST 2067-204:2026-05 published with canonical XSD + sample MXF, ST 377-4\n:2021 edition currency question.",
          "is_bot": false,
          "headline": "docs(audit): spec-conformance audit kickoff — audio stack, 6 findings",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:24:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b781e70183d8247c7280e7eff764822cec49ed9d",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into feat/fraunhofer-corpus-end-to-end",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:18:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f424a0bc916305e4b744e145bb6ac0067cc418d3",
          "body": "fix(validation): register IAB/ISXD plug-ins in validator dispatch",
          "is_bot": false,
          "headline": "Merge pull request #66 from jpwesselink/fix/register-iab-isxd-plugins",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:18:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e140807facd1614d66e18f87164e41f122ef2c93",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into feat/fraunhofer-corpus-end-to-end",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:03:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2973c5122aadf409be470ee44f51d208e92789aa",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into fix/register-iab-isxd-plugins",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:03:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af1c61742f27fe4613d114ceee4cb99925e6daac",
          "body": "chore(deps): quick-xml 0.31 → 0.41 (RUSTSEC-2026-0194/-0195)",
          "is_bot": false,
          "headline": "Merge pull request #67 from jpwesselink/chore/quick-xml-0.41",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T12:03:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60b39eb0cc0d7a9bdb05584d3315b5b7fe686338",
          "body": "The Quality & Security job runs BOTH cargo-audit and cargo-deny;\nthe previous commit only covered audit.toml. Same justification and\nremoval condition (regxml/regxml-dict 0.1.2 with quick-xml >= 0.41).",
          "is_bot": false,
          "headline": "chore(deny): mirror quick-xml transitive ignores in deny.toml",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T11:52:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b325a2370f504070b863155dc0b70fb564137ea",
          "body": "Two advisories published 2026-06-29 flag quick-xml < 0.41:\n  - RUSTSEC-2026-0194 — quadratic run time checking a start tag for\n    duplicate attribute names (severity 7.5)\n  - RUSTSEC-2026-0195 — unbounded namespace-declaration allocation in\n    NsReader (memory-exhaustion DoS)\n\nBoth matter for imfe\n[…]\nsment (that path parses compile-time-embedded SMPTE registers and\nMXF-KLV-derived metadata, not attacker-supplied XML documents).\n\nVerified: cargo test --workspace 614 passed / 0 failed; clippy clean.",
          "is_bot": false,
          "headline": "chore(deps): quick-xml 0.31 → 0.41 (RUSTSEC-2026-0194/-0195)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T11:41:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57784de7d4895356657061ed0e12b32b69ba0064",
          "body": "The ST 2067-201 (IAB) and ST 2067-202 (ISXD) plug-in validators were\nimplemented and tested but never registered in either validator\nregistry — no namespace arm mapped their URIs, and nothing dispatched\non sequence presence. `imferno validate` on an IAB or ISXD package\nnever ran a single plug-in rul\n[…]\n(URI resolution ×2, sequence-\npresence dispatch on the IAB/ISXD CompleteIMP fixtures, negative\ncontrol on MERIDIAN, URI+sequence dedupe, pinned-selection\nsuppression). Workspace: 621 passed, 0 failed.",
          "is_bot": false,
          "headline": "fix(validation): register IAB/ISXD plug-ins in validator dispatch",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T11:25:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "67339558a1c8a4a2128bc1dd60679da8c7cd235a",
          "body": "Two fixes surfaced by running v3.0.1 against the official Fraunhofer\nSMPTE working-group ST 2067-203/-204 test corpus (IMFTool repo,\nCC-BY-NC-ND, not vendored):\n\n1. **Mode A channel labeling (ST 2067-2 §5.3.6).** The §5.3.6.2/.3\n   sub-descriptor rules were applied unconditionally. The spec supports\n[…]\n(0 issues);\nST 2067-204 WAVE PCM files drop from 8/5 errors to 1 advisory warning\n(RFC5646SpokenLanguage missing — genuine per §5.3 recommendation).\n`cargo test --workspace`: 614 passed, +4 new tests.",
          "is_bot": false,
          "headline": "fix(audio): Mode A channel labeling + footer→header partition fallback",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T11:14:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99f62329b90ad9cf364ba3ac1539be182752cc51",
          "body": "… PatternInvalid pin\n\nTwo hardening items for the XSD layer, both surfaced by this cycle's\narchitecture review:\n\n1. **`XSD/NotValidated` skip notice.** `validate_parsed_cpl` silently\n   returned empty for namespaces without a vendored schema (DCI-era\n   ST 429-7, unknown xmlns). A silent skip reads \n[…]\nttern schema + violating instance\n   that pins the full path.\n\nTests: +4 (pattern e2e pin, DCI skip notice, unknown-namespace skip\nnotice, known-namespace negative). 507 lib tests green; clippy clean.",
          "is_bot": false,
          "headline": "feat(xsd): emit Info notice when the schema pre-pass is skipped + e2e…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-07-02T10:12:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e22f849548778f3a9f70e3ccff814b491c8f7d99",
          "body": "docs: add \"Try in browser\" top-nav link to the WASM playground",
          "is_bot": false,
          "headline": "Merge pull request #64 from jpwesselink/docs/top-nav-try-in-browser",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-20T07:51:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "092b02c33422803bcbf9f548701d9baa5fbd4095",
          "body": "The \"Try in browser\" nav link landed in #64 but the anchor didn't\nactually scroll on click — Rspress uses client-side routing, so\nnavigating to \\`/#playground\\` updates the URL without firing the\nbrowser's default scroll-to-fragment behavior.\n\nFix in two parts:\n\n  - Homepage.tsx: a useEffect that, o\n[…]\ny top nav.\n\nAfter this the nav link works from any page in the docs site — both\non first navigation (URL has hash on initial load) and from the\nhomepage itself (hashchange fires without a navigation).",
          "is_bot": false,
          "headline": "docs(playground): manual scroll-to-fragment + scroll-margin-top",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T20:00:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "75f48b9c23ad59136121ca790d207b7c2d0876dd",
          "body": "The WASM playground (\\`<ImfPlayground />\\` on the homepage) is the\nfastest path to demonstrating what imferno does without installing\nanything — drop an IMF XML file, see the validation report, all in\nthe browser. But it was buried below the fold on the homepage with\nno top-nav entry, so first-time \n[…]\n slot intentionally —\n    it's the highest-friction-to-discover, lowest-friction-to-try\n    surface, and putting it before Guide / Reference puts the demo\n    one click away from any page in the site.",
          "is_bot": false,
          "headline": "docs: add \"Try in browser\" top-nav link to the WASM playground",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T19:50:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a74d1f35c607f8672244c5ae2374f63aa307464d",
          "body": "docs: refresh stale \"MXF header partition only\" claim",
          "is_bot": false,
          "headline": "Merge pull request #63 from jpwesselink/docs/refresh-mxf-coverage-claim",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T19:48:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83b8eb504c338583195db84a39e18b346c7ef515",
          "body": "The standards table in the crate README, the Rspress site (guide\nindex, reference/standards, Homepage.tsx), and the legacy Astro\ndocs all described ST 377-1 coverage as \"header partition only —\nno KLV traversal or essence decoding.\" That language pre-dates the\naudio MCA + timed text + IAB work, whic\n[…]\nme audio,\n    per-IAB-frame audio) are not decoded — that's the only real\n    \"partial\" caveat\n\nUpdated every standards-table row + \"Known gaps\" bullet to reflect\nthe actual coverage. No code changes.",
          "is_bot": false,
          "headline": "docs: refresh stale \"MXF header partition only\" claim",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T18:44:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ca55af9c707c276da52a031cb1d852445a7e9ab",
          "body": "chore: release v3.0.1",
          "is_bot": false,
          "headline": "Merge pull request #55 from jpwesselink/release-plz-2026-05-18T13-49-50Z",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T18:08:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ed9f19f41d00766300955fe475488d4bcae067e",
          "body": null,
          "is_bot": true,
          "headline": "chore: release v3.0.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-19T18:07:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "148820d42a8b512ec72e85fc190269591f5ca9f1",
          "body": "…e-positive\n\nfix(audio): skip §5.3 WAVE-PCM rules on ST 2067-203 SADM/MGA tracks",
          "is_bot": false,
          "headline": "Merge pull request #61 from jpwesselink/fix/sadm-mga-not-wavepcm-fals…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T18:06:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87399aed08c2c9316e5fca84034236b84861ec91",
          "body": "…A tracks\n\nThe §5.3 audio block (SoundDescriptorNotWAVEPCM, channel-label count,\nsoundfield-group count, MCALinkID coverage, etc.) was unconditionally\napplied to any RegXML containing an AudioSampleRate field. ST 2067-203\n(2023) S-ADM audio is wrapped as MGA — it carries an\n`MGASoundEssenceDescripto\n[…]\n_audio_track_file__compliant`\n    no longer fires `SoundDescriptorNotWAVEPCM`; remaining 2 errors are\n    legitimate fixture-structure issues (the fixture is audio-track-only,\n    not a complete IMP).",
          "is_bot": false,
          "headline": "fix(audio): skip ST 2067-2 §5.3 WAVE-PCM rules on ST 2067-203 SADM/MG…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T17:56:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f59efbbd7f8568748d8ca2091e1d3c600880d26",
          "body": "…patched-feature\n\nfix(cli): don't enable `uppsala-patched` on published `imferno`",
          "is_bot": false,
          "headline": "Merge pull request #60 from jpwesselink/fix/imferno-cli-drop-uppsala-…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T13:43:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "519b7063bf09cc7891ea127111d98df3432dc3be",
          "body": "When release-plz publishes `imferno` (the CLI) to crates.io it runs\n`cargo publish --verify`, which builds imferno from the packaged tarball\nwith `imferno-core` resolved from the crates.io registry (NOT the\nworkspace path). The published imferno-core depends on vanilla\nuppsala 0.4 — `[patch.crates-i\n[…]\npackage -p imferno --allow-dirty`: the\nverify build pulls imferno-core 3.0.0 from crates.io and compiles\ncleanly (where it previously failed with `no field 'element_path' on\ntype '&ValidationError'`).",
          "is_bot": false,
          "headline": "fix(cli): don't enable `uppsala-patched` on published imferno",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T12:52:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "307639047db813d9ae3c83c83d744004ab4a5159",
          "body": "fix(core): gate uppsala `element_path` behind `uppsala-patched` feature",
          "is_bot": false,
          "headline": "Merge pull request #59 from jpwesselink/fix/uppsala-patched-feature-gate",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-19T12:04:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce018ec4926f8e3749099eb2c61a2013bba22d7c",
          "body": "…feature\n\n`cargo publish --verify` for imferno-core failed because the workspace\n`[patch.crates-io]` block (which points uppsala at the jpwesselink/uppsala\nfork with the `element_path` field added) is not honored during the\nverify build — verify always resolves against the published registry.\nThe cr\n[…]\n+ many integration, no regressions)\n  - `cargo package -p imferno-core --allow-dirty` ✓ (verify now passes,\n    where it previously failed with `no field 'element_path' on type\n    'ValidationError'`)",
          "is_bot": false,
          "headline": "fix(core): gate uppsala element_path access behind `uppsala-patched` …",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-18T11:31:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e3f688803cde12494c15fa065fd0424360862c11",
          "body": "fix(core): vendor XSDs inside crate so `cargo package` succeeds",
          "is_bot": false,
          "headline": "Merge pull request #58 from jpwesselink/fix/vendor-xsds-into-crate",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-18T11:30:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81cab82a61960e1e4d282db64497fd0e9c882d26",
          "body": "`crates/imferno-core/src/xsd/mod.rs` referenced 6 XSDs via\n`include_str!(\"../../../../specs/X.xsd\")`. Those paths resolved during\n`cargo build` (workspace layout) but failed during `cargo package\n--verify` (isolated tarball) — the published tarball never reached\nthe workspace-root `specs/` directory\n[…]\n-io]` not honored during\n`cargo publish` verify) — that's a separate blocker that needs\neither upstreaming the uppsala patches or vendoring uppsala into\nthe workspace. This PR removes blocker #1 of 2.",
          "is_bot": false,
          "headline": "fix(core): vendor XSDs inside the crate so `cargo package` succeeds",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-18T11:19:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1470f8db5a0adfdedc120a7e195ffe89dc0e63e5",
          "body": "fix(cli): accept a single CPL XML file in `imferno cpl`",
          "is_bot": false,
          "headline": "Merge pull request #57 from jpwesselink/fix/cpl-single-file-input",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-18T11:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d29fb9407f1ca863568a1e3b1943d40c133f2f7a",
          "body": "Previously `imferno cpl CPL_xxx.xml` failed with the cryptic OS-level\n`IO: Not a directory (os error 20)` because the command unconditionally\nrouted through the package-reading path which expects a directory.\n\nNow branches on `path.is_file()`: file inputs are parsed directly via\n`parse_cpl` and proj\n[…]\nnputs keep the existing full-package flow.\n\nAlso extracts the projection from `Imferno::get_cpl_details` into a free\nfunction so both code paths share it without depending on a parsed\npackage context.",
          "is_bot": false,
          "headline": "fix(cli): accept a single CPL XML file path in `imferno cpl`",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-18T10:42:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "352ff78ee1218e9a65314c6a35f6ec067deee0d1",
          "body": "feat: parser audit + catalogue cleanup + IAB 2026 (3.0.0)",
          "is_bot": false,
          "headline": "Merge pull request #56 from jpwesselink/feat/full-smpte-compliance",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T21:13:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5054787bba0366f3d233a074059f204c2a95b09e",
          "body": null,
          "is_bot": false,
          "headline": "docs(astro): bump install snippet to 3 (alongside Rspress docs)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T20:33:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c8f0d4d34c66b43b7ebf8290d134dc123dba676",
          "body": "External review caught the install-snippet drift after the 3.0.0\nversion bump: crates/imferno-core/README.md and\ndocs/docs/guide/quick-start.md both still showed\n`imferno-core = \"2.0\"`. Both updated to `\"3\"` so new readers\nmatch what's actually on crates.io.",
          "is_bot": false,
          "headline": "docs: bump README install snippets from 2.0 to 3",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T20:30:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ba4c1ced69ca86dfdd856c4a827b70fc9d14ba0",
          "body": "Two CI fixes after the workspace-test + cargo-deny runs on PR #56:\n\n- deny.toml: add jpwesselink/uppsala to allow-git. uppsala is patched\n  onto our imferno-patches fork via [patch.crates-io] in the workspace\n  Cargo.toml; cargo-deny's `unknown-git = \"deny\"` rule was blocking\n  the patch. The commen\n[…]\nh`) was the\n  wrong delivery mechanism for these — they're synthesised /\n  trimmed for specific rules, not part of a corpus package — so\n  a per-path `!` exception keeps them in git where they belong.",
          "is_bot": false,
          "headline": "fix(ci): allow uppsala git source + vendor small MXF unit-test fixtures",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T14:12:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e33de7f53fa275ac38882868150ddce2f8cadaad",
          "body": "Walks test-data/ (the vendored Photon-derived IMF corpus), gathers\nevery XML asset inside each package directory (ASSETMAP / PKL / CPL /\nOPL / SCM / VOLINDEX), feeds the file map straight into the wasm\nvalidate() entry point, and asserts the validation runs without a\nRust panic.\n\nMXFs are deliberate\n[…]\nable` would be a panic and\nfails the test. Findings are not asserted on — the corpus mixes\nintentionally-broken samples with known-clean references; per-\nfixture conformance is separate test coverage.",
          "is_bot": false,
          "headline": "test(wasm): photon corpus smoke validation under wasm bundle",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T13:32:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c237294797d0d8a8c0c99d8ad56cf2d35ad7f1f3",
          "body": "You're right — uppsala IS wasm-compatible. The temp_dir panic was on\nus: dcml_specs_dir() was writing the dcml stub to disk so uppsala\ncould read it back via from_schema_with_base_path. That round-trip\ndefeated the entire reason uppsala was selected as the XSD validator\n(pure-Rust, browser-runnable)\n[…]\n the now-removed dcml_specs_dir).\n- dcml_specs_dir() removed (was the sole std::env::temp_dir caller).\n\nTests: native cargo test --workspace green, wasm pnpm test 22/22.\nClippy clean across workspace.",
          "is_bot": false,
          "headline": "xsd: route validate_parsed_* through uppsala's in-memory path",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T13:27:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "80402a48fa52792c0fa692958983d3c0a6e9083d",
          "body": "Three CI fixes after the initial PR #56 push:\n\n- rustfmt: ran `cargo fmt` to clean 17 examples + module files\n  that the Quality & Security `cargo fmt --check` step flagged.\n- xsd: `validate_parsed_cpl` now has a wasm32 stub returning\n  Vec::new() so the wasm bundle doesn't hit `std::env::temp_dir()\n[…]\n job is to verify CLI end-to-end, not to re-litigate\n  MERIDIAN's known bug.\n\nLocal wasm test suite: 22/22 pass.\nLocal cargo test --workspace: green except the documented\nmissing-MXF-fixture failures.",
          "is_bot": false,
          "headline": "fix(ci): rustfmt, wasm temp_dir panic, CLI test fixture override",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T13:08:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b82c33de356ba4184f173f470551ad15c86b539",
          "body": "…m to 3.0.0\n\nMajor-version bump for the breaking-change surface introduced by the\nparser-audit + IAB-2026 work:\n\n- Dropped CplNamespace::Smpte2067_3_2020, St2067_3_2020 rule enum,\n  IMF_CPL_2020_XSD include — variants are unreachable because the\n  canonical 2020 publication reuses the 2016 namespace\n[…]\nd `ST2067-9:2020/*`\n  codes no longer exist).\n- Listrules JSON shape gained an optional `sameAsPreviousEdition`\n  field on rule entries that opt in (currently 2016 catalogues\n  pointing back at 2013).",
          "is_bot": false,
          "headline": "chore(release): bump imferno-core, imferno-napi, imferno, imferno-was…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:38:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b26b8aa157f0aa706a7c1c11918044f1b0f726be",
          "body": "…nges\n\nWorkspace-clippy + workspace-test caught two callers that weren't\nvisible from --skip package::tests / -p imferno-core scoped runs:\n\n- xtask/generate_docs.rs + xtask/generate_codes_ts.rs imported\n  St2067_3_2020 (dropped in 5ded3d5). Removed both imports + the\n  generation rows; the 2016 cata\n[…]\nhe AssetMap + CPL fixtures\n  unchanged (those doc types do not use a Properties wrapper).\n\nFull workspace clippy + tests now green except for the documented\npre-existing missing-MXF-fixture CLI tests.",
          "is_bot": false,
          "headline": "fix: xtask + corpus-tests fallout from St2067_3_2020 + SCM parser cha…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0952d0d411c8bad2646d1c916012666ff378adca",
          "body": "Updates four docs pages to reflect the just-shipped AppIabPlugin2026:\n- docs/components/Homepage.tsx: hero copy now reads \"through the\n  2026 IAB revision\"; standards table row updated to 2019/:2021/:2026\n  with the Annex E call-out.\n- reference/standards.md: editions cell + coverage cell updated.\n-\n[…]\n6\" section listing the single delta\n  rule (IabChannelSubDescriptorRecommended, Annex E §E.2, Warning).\n\nMirrors what the napi listRules enumerator now exposes\n(St2067_201_2026Delta with one variant).",
          "is_bot": false,
          "headline": "docs: surface IAB 2026 support on homepage + standards refs + codes",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2250a89ab66d0b37d96defba502fcff0a8c58d60",
          "body": "Adds two synthetic CPL fixtures under tests/fixtures/iab/:\n- cpl-iab-2026-conformant.xml: IAB descriptor with two\n  IABChannelSubDescriptor entries (one per BedDefinition channel).\n- cpl-iab-2026-missing-channel-subdescriptors.xml: IAB descriptor\n  with only IABSoundfieldLabelSubDescriptor (2021-bas\n[…]\nex E.\n\nAlso re-exports AppIabPlugin2026 from validation::* (forgotten in\nthe previous commit; the parent re-export pattern matches 2019/2021).\n\nTest floor: 437 lib + 28 integration pass, clippy clean.",
          "is_bot": false,
          "headline": "iab(2026): vendor synthetic Annex E fixtures + fixture-backed test",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7db13f5a2d22cd9983c4a43a55fe9b1589e86230",
          "body": "Adds ST 2067-201:2026 support — the substantive delta from 2021 is\na single new recommended (`should`-strength) rule in Annex E §E.2:\neach IAB Track File should carry one `IABChannelSubDescriptor` per\nchannel of each BedDefinition.\n\nImplementation:\n- `IABSubDescriptors` gains `iab_channel_sub_descri\n[…]\nubdescriptors_present`\n- `plugin_2021_silent_on_annex_e_recommendation` — proves the\n  2026-only check does **not** fire from the 2021 plugin.\n\nTest floor: 437 lib + 24 integration pass, clippy clean.",
          "is_bot": false,
          "headline": "iab: add 2026 plugin + Annex E IABChannelSubDescriptor recommendation",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "66e7c0854477acd87f6494f619f64041ee8113de",
          "body": "Confirmed firsthand via `pdftotext` on `st2067-201-2021.pdf`:\nline 642 declares `targetNamespace=\"http://www.smpte-ra.org/ns/2067-201/2019\"`.\nThe 2021 publication's schema reuses the 2019 namespace — same\npattern as CPL 2020 / AssetMap 2020 / PKL 2020 / IAB 2026.\n\nThe `URI_2021` and `URI_2021_SCHEMA\n[…]\nn as the authoritative\nrule. Regression test `iab_namespace_uris_match_pdf_evidence`\npins the firsthand-verified URI strings.\n\nAudit doc updated to mark the IAB 2021 namespace question\nfully resolved.",
          "is_bot": false,
          "headline": "iab: drop fictional URI_2021 / URI_2021_SCHEMAS consts",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "153e5c1996f17a8e7ade8d0ea3d8672f811eaa13",
          "body": "… CPL 2020",
          "is_bot": false,
          "headline": "docs(audit): IAB 2021/2026 namespace evidence — likely fictional like…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3e1e11d5b99d3a0bc308cf8d5a18c04eb124062",
          "body": "Vendored `specs/st2067-2b-2016.xsd` from the canonical\n`st2067-2-20160518-pub.zip` and wired `validate_pkl_xml` to dispatch:\n- DCI 429-8 → SMPTE-429-8-PKL-2007.xsd (existing)\n- 2067-2:2016 PKL → st2067-2b-2016.xsd (new)\n- 2067-2:2020 PKL → st2067-2b-2016.xsd (2020 publication's PKL XSD\n  reuses the \n[…]\n\ntests added pinning the new dispatch arms (modern 2016, modern\n2020, and skip-on-bare-namespace). xsd-drift.yml manifest updated.\n\nTest floor: 433 lib + 24 integration pass, 0 failures, clippy clean.",
          "is_bot": false,
          "headline": "xsd: vendor modern PKL schema + close remaining XSD vendoring gaps",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7562dfa5fba3be30163d70cc43e275decb441bd7",
          "body": "Audit found 4 enums returning the trait-default None from example():\nXsdConstraintCode, St2067_3_2013/2016 (via macro), St2067_2_2020 +\nSt2067_2_2013/2016_Core (via macros), St377_4_2012, ImfernoMxf,\nSt2067_2_2016 (mxf-layer), St2067_21_2023, St2067_21_2025.\n\nEvery variant in every enum now returns \n[…]\nrn None. Adding a new variant without an\nexample trips this test before merge.\n\nCloses catalogue item 6. Remediation hint column remains out of\nscope per the locked-in note in docs/catalogue-todos.md.",
          "is_bot": false,
          "headline": "catalogue(item 6): populate example() across every code enum",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8cd35a524fb2508c6afc0952e14a0b76d1eea606",
          "body": null,
          "is_bot": false,
          "headline": "docs: harden remediation out-of-scope note in catalogue item 6",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dcd619a84cc47a2eb612bc1fc3e3eb818bf2755",
          "body": "Item 5 was about line-number-pinned XSD codes (XSD-121-127, XSD-66,\nXSD-88) being brittle. Audit found zero line-pinned codes anywhere\nin the current source — the concern reflects an earlier code shape\nthat's already been migrated.\n\nCurrent XSD codes use the recommended structural form:\n- Canonical:\n[…]\ng/IssueDate, etc.\n\nAlso updates error-code-format.md Cross-edition section to reference\nthe now-shipped sameAsPreviousEdition annotation (was \"tracked in\ncatalogue-todos item 1\", now live in 7d9c39c).",
          "is_bot": false,
          "headline": "docs: close catalogue item 5 (XSD-pinned codes already stable)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00e0a4f37bee3434ac15c9cb34a2e251d61f4772",
          "body": "Wire up the cross-edition-duplication audit conclusions from Item 2\nof docs/catalogue-todos.md so downstream consumers (Studio listRules\nUI in particular) can group identical-rule blocks.\n\n- ValidationCode trait gains a `previous_identical_edition()` method\n  (default None) returning the predecessor\n[…]\n/codes.rs.\n- Item 4 (ISXD mis-tagged as Audio, MXF/Encoding bucket): already\n  done — ISXD uses Category::Data, MXF uses Category::Container for\n  partition pack rules. Doc updated to reflect closure.",
          "is_bot": false,
          "headline": "catalogue: same-as-previous-edition annotation + close items 3/4",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dcdf89144807603a93eaf128839e05120debba00",
          "body": "Empirical diff of every per-edition code prefix in the snapshot:\n\n| Pair                      | Diff                                |\n|---------------------------|-------------------------------------|\n| ST 2067-2:2013 ↔ 2016     | 0 codes differ (identical)          |\n| ST 2067-2:2016 ↔ 2020     | \n[…]\nseness is a real coverage gap, not\nduplication.\n\nThree identical pairs are now ripe for the Item 1\n\"same-as-previous-edition\" annotation; tracked as a follow-up rather\nthan implemented in this commit.",
          "is_bot": false,
          "headline": "docs: answer cross-edition rule-duplication audit (catalogue Item 2)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "641a25b39c8b5003fbce023ddd0dc062de4177b7",
          "body": "ST 2067-100 OPL declares <Macro> via an abstract MacroType with\nxsi:type polymorphism into vendor-specific extension namespaces\n(opl:PresetMacroType, arm:AudioRoutingMixingMacroType, etc).\nquick_xml's serde derives can't handle that — previously the\nMacroList was silently dropped, hiding macros from\n[…]\nmacro\nwith all fields populated, and multiple macros with mixed xsi:type\nprefixes preserved in document order. The two pre-existing\nfixture-backed OPL tests continue to pass against real corpus files.",
          "is_bot": false,
          "headline": "feat(opl): extract MacroList via quick_xml walker (FIX-8)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2e520a61c80f45d0b049752f37b148ea2c727e77",
          "body": "…19, 20)\n\nSweep through the June 2026 parser+severity audit findings. Two\ntickets explicitly deferred (FIX-8 OPL MacroList xsi:type parser\nneeds a dedicated session; FIX-18 App #5 ACES has no test corpus).\n\nHighlights:\n- Dropped unreachable Smpte2067_3_2020 / Smpte2067_9_2020 namespace\n  variants + \n[…]\n fixture, serde round-trip).\n- CI XSD drift check (.github/workflows/xsd-drift.yml + Python script)\n  to catch future SMPTE-RA revisions.\n\nFull per-ticket status table in docs/parser-audit-2026-06.md.",
          "is_bot": false,
          "headline": "audit: resolve 18 of 20 parser correctness tickets (FIX-1..7, 9..17, …",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24615a38632aa118571aefc1fe9d95e8e6980e90",
          "body": "A systematic correctness review across 10 axes:\n\n1. CPL parser\n2. AssetMap / PKL / OPL / VolumeIndex parsers\n3. SCM parser\n4. MXF partition-pack parser (hand-rolled)\n5. MXF → RegXML pipeline wrapper\n6. MXF audio MCA + timed-text rule modules\n7. XSD pre-pass (uppsala-backed)\n8. Severity overrides + s\n[…]\nion tests where the\nfinding is a bug or a behaviour-changing fix.\n\nNo code changes in this commit — audit doc only. The\nparser-correctness work continues in follow-up commits as each\nfix ticket lands.",
          "is_bot": false,
          "headline": "docs: spec-parser + severity-override correctness audit (June 2026)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88fdf9e178ebad5b41a77a7dcee1af2f737d6ed2",
          "body": "Caught during code review of the last session's MXF essence rules:\n\n**Bug fix** — `extract_field` was missing the boundary check that\n`count_elements` and `extract_all_fields` had. It would prefix-match\n`:Channel` against `<ns2:ChannelCount>…` and then fail to find a\nmatching close tag, returning `N\n[…]\n code, _)` shape.)\n\nVerified: 461 lib + 49 corpus + 9 xsd integration tests pass.\nNative + wasm clean. Same 7 pre-existing missing-MXF-fixture\nfailures untouched. Zero clippy warnings on imferno-core.",
          "is_bot": false,
          "headline": "mxf: real bug + clippy fixes in essence-rule code review",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "450b8fa55e9ac580f5ae76ff2b7928b19610aef3",
          "body": "Caught a consistency gap in code review — ~20 new validation codes\nwere shipped as bare string literals in `ValidationIssue::new(…, \"ST…/…\", …)`\ncalls, breaking the typed-enum pattern the rest of the codebase\nfollows (e.g. `St377_1_2011`, `St2067_2_2020_Core`).\n\nThis commit moves every new code into\n[…]\nings in\nthe new enums' `code()` methods match the previous literals exactly),\nso existing tests continue to pass without modification. 461 lib +\n49 corpus tests still pass; native + wasm builds clean.",
          "is_bot": false,
          "headline": "mxf: refactor essence/audio_mca/timed_text/metadata to typed code enums",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "755f064df1702467375ce33bc312ce1cb7695e66",
          "body": "Imferno is its own product, not a Photon port. This commit scrubs\n\"Photon-parity\", \"Photon equivalent: …\", \"Mirrors Photon\", \"Ported\nfrom Photon\", and similar framing from doc-comments, module\ndocstrings, and user-facing docs. Each removal either:\n\n- Replaces with a neutral spec citation (\"Per ST 20\n[…]\nn.\n- Test function names like `test_parse_netflix_photon_package` —\n  they document which fixture they load.\n\nTests still pass: 461 lib, 49 corpus, 9 xsd integration.\nBuild clean. No behaviour change.",
          "is_bot": false,
          "headline": "docs/comments: drop Netflix-Photon framing references",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96178f4eddc1360d370f745fd724edc45540af42",
          "body": "Three more SMPTE XSDs vendored to match Photon's resource bundle:\n\n- `st2067-201-2019.xsd` — ST 2067-201:2019 Immersive Audio Bitstream\n  (IAB) plugin schema.\n- `st2067-202a-2023.xsd` — ST 2067-202:2022 Identified Subtitle and\n  Captions Data (ISXD) plugin schema.\n- `st2067-203-2023.xsd` — ST 2067-2\n[…]\ndcml-types-stub) or\nrestructure to mirror Photon's layout.\n\nVendored as reference + future-ready coverage. No runtime cost\ntoday — uppsala only loads what's referenced from the active CPL's\nnamespace.",
          "is_bot": false,
          "headline": "specs: vendor IAB / ISXD / MGA-SADM XSDs (Photon-parity coverage)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a77bc29207376fbf8e485647310bea2e1fb768d",
          "body": "…nerFormat UL\n\nThe last two RegXML-reachable Photon essence rules. Both decoded\nfrom the ContainerFormat UL on the descriptor (no partition-pack\ndata needed), sharing a new `parse_ul_bytes()` helper.\n\n- **ST 2067-2 §5.3.3 / ST 382 §10 — Wave Clip-Wrapped**\n  (`AudioNotClipWrapped`, Error). Container\n[…]\nquire either\nKLV-level walking past header metadata (e.g. partition pack\nexclusivity beyond the header partition) or registry lookups\n(specific channel-layout UL identification beyond the MCA\nprefix).",
          "is_bot": false,
          "headline": "photon-parity: Wave Clip-Wrapped + Timed-Text Mapping Kind via Contai…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2024cb46d5c8491411f794cfcd6e0560090e1bdc",
          "body": "…e test\n\nThree more rules fire on MXF essence — closing Photon's\ntimed-text check list:\n\n- **§5.4 — UCSEncoding = UTF-8** (Error, `TimedTextUCSEncodingNotUTF8`).\n  Photon equivalent: IMFConstraints.java L311-316.\n\n- **§5.4 — NamespaceURI ∈ IMSC1 profiles** (Error,\n  `TimedTextNamespaceNotIMSC`). Acc\n[…]\nmllib-rs's test-mxf/ doesn't include one).\n\nVerified: 21 mxf tests pass (was 15 → +5 timed-text + 1 video\nsilence), 457 lib tests overall. Wasm clean. Same 7 pre-existing\nmissing-MXF package failures.",
          "is_bot": false,
          "headline": "photon-parity: ST 2067-2 §5.4 timed-text essence rules + video-silenc…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c51d11a520e209c07ed8906d10aac20ebbb07286",
          "body": "Two more ST 2067-2 §5.3 rules now firing against MXF essence:\n\n- **§5.3.4.2 — ChannelAssignment must be a SMPTE 428-12 MCA UL**\n  (`ChannelAssignmentNotMCA`, Error). Whitelisted by prefix\n  `urn:smpte:ul:060e2b34.0401010d.04020210.…` so registry-byte\n  revisions don't false-flag. Photon equivalent: \n[…]\nON_FATAL).\n\nTests: 15/15 audio MCA pass — audio1.mxf's UL passes the MCA\nprefix check, and the RFC5646 warning fires on it correctly\n(audio1 is a test fixture, no language tag). 451 lib tests\noverall.",
          "is_bot": false,
          "headline": "photon-parity: ChannelAssignment UL + RFC-5646 spoken-language checks",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5bfd496ba5aee9bfb979c2d65e787ad04f64e19d",
          "body": "Closes most of the remaining Photon-parity gap in ST 2067-2 §5.3\naudio essence checks. Six new rules emitted by\n`mxf::audio_mca::check_audio_mca`:\n\n- **ST 377-4 §6.3.2 — SoundfieldGroupLinkID match** (Error).\n  Every AudioChannelLabelSubDescriptor's SoundfieldGroupLinkID must\n  equal the SoundfieldG\n[…]\nst pins those for regression.\n\nVerified: 13 audio MCA tests pass (was 9 → +4 unit + 1 round-trip\n+ 1 warning-fire). 449 lib tests overall. Wasm clean. Same 7\npre-existing missing-MXF package failures.",
          "is_bot": false,
          "headline": "photon-parity: 6 more audio MCA rules + extract_all_fields helper",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b636caeb5e3199a03120d82e5a819bf81737b0d",
          "body": "…ptors\n\nAdds the sixth audio MCA rule to `mxf::audio_mca::check_audio_mca`:\nevery AudioChannelLabelSubDescriptor + the SoundfieldGroupLabel\nmust carry an `MCALinkID` (ST 377-4 §6.3.2). Counted as\n`channel_labels + soundfield_count` expected vs. actual MCALinkID\nelements in the RegXML. Photon equival\n[…]\n252-275.\n\nVerified: 9/9 audio MCA tests pass — including the round-trip\nagainst the real audio1.mxf fixture, which carries the expected\nMCALinkIDs and continues to pass cleanly. 445 lib tests overall.",
          "is_bot": false,
          "headline": "photon-parity: ST 377-4 §6.3.2 MCALinkID presence on audio MCA descri…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce5d80a03c0f458c78e669137410f1de175bbf64",
          "body": "Third slice of GAP #3, building on the metadata pipeline from\ncommit 14a5dc3. The partition-pack diagnostics fired structural\nchecks; this commit applies Photon's audio MCA rules against the\ntyped RegXML output for any MXF asset present in a validated\npackage.\n\nNew rules (`mxf::audio_mca::check_audi\n[…]\ning-MXF-fixture package failures untouched.\n\nPhoton coverage status post-commit: all four bullets in their\nST 2067-2 §5.3 audio essence suite now fire in imferno against\nreal MXF binaries, end-to-end.",
          "is_bot": false,
          "headline": "photon-parity: ST 2067-2 §5.3 audio MCA rules + vendor test MXFs",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a09f54809da6cdf43671d66c9b18f83148e06e74",
          "body": "Second slice of Photon-parity GAP #3. The partition-pack layer\n(commit 28a4f14) covers the four foundational essence checks; this\ncommit wires the full `regxml`/`regxml-dict` pipeline so the audio\nMCA (ST 2067-2 §5.3), timed-text IMSC (§5.4), and IAB parameter\n(§5.5) rules can be applied against typ\n[…]\nsn't vendor; that lands when the audio MCA checks do.\n\nVerified: 436 lib tests (was 434 → +2), wasm build clean, native\nbuild clean. Same 7 pre-existing missing-MXF-fixture package\nfailures untouched.",
          "is_bot": false,
          "headline": "mxf: add full header-metadata pipeline (regxml + embedded dictionaries)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f55e65754cdc08627ae7a1f2c1f352606241410b",
          "body": "The new `mxf::essence::validate_mxf_essence` (added in commit 28a4f14)\nwas reachable as a function but didn't fire automatically during\npackage validation. This commit wires it into `validate_mxf_headers`\nso every MXF asset gets its partition-pack diagnostics emitted into\nthe unified report.\n\nGated \n[…]\n native lib tests pass (434), wasm build clean. The new\ndiagnostics surface only on packages with real MXF files present;\nno test fixtures vendored yet so the existing test suite shape\ndoesn't change.",
          "is_bot": false,
          "headline": "mxf: wire essence validator into package-level validation flow",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4781973ffbed43ffc154129aa6b8177eec010ea",
          "body": "MXF binaries don't reach the wasm validator — browser callers upload\nthe XML side of an IMF package (CPLs/PKLs/AssetMap) and pass file\nreferences for the MXF assets that stay on disk. Compiling smpte-mxf\nand the new `mxf::essence` module into the wasm bundle just adds\nbytes for code that can never r\n[…]\nsts pass (4 essence tests + the rest);\nwasm build clean. The existing partition-pack-only parser in\n`mxf/mod.rs` is unchanged and continues to compile on both targets —\nit doesn't depend on smpte-mxf.",
          "is_bot": false,
          "headline": "mxf: gate essence module + smpte-mxf deps to native targets",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9a3cc17b195c556c9911fb11e590983f4fee5c9",
          "body": "…mllib-rs\n\nGAP #3 from the Photon audit was full MXF essence-header validation —\nPhoton parses MXF binary down to Preface/MaterialPackage/descriptors\nand enforces ST 2067-2 §5.x rules against the parsed metadata. Imferno\npreviously stopped at hand-rolled partition-pack parsing in `mxf/mod.rs`.\n\nThis\n[…]\n so they don't depend on\nvendoring real MXF binaries. Verified: 434 lib tests (was 430 → +4\nnew), 9 xsd integration, 49 corpus. Same 7 pre-existing\nmissing-MXF-fixture package-test failures unchanged.",
          "is_bot": false,
          "headline": "photon-parity: MXF essence validation (partition-pack layer) via regx…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "120ae3689c4a90260b1d71648e5371e8cb607b3e",
          "body": "Audit against Photon found three concrete PKL-side gaps imferno\nhad not yet enforced. All three are real SMPTE rules — Photon\nimplements them and imferno previously didn't.\n\nNew rules (`validate_pkl_constraints`):\n\n- **ST 2067-2 §9 — PKL namespace whitelist** (`PklUnknownNamespace`).\n  The PKL docum\n[…]\nsetMap↔PKL/CPL cross-doc) is partly already implemented\n(NotInAssetMap, UnresolvedUuid) — full diff still TBD. GAP #3\n(MXF essence header validation) remains as the major outstanding\nPhoton advantage.",
          "is_bot": false,
          "headline": "photon-parity: PKL semantic checks (3 new spec rules)",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1bee78e96aa65df483fb43bec02ef3241afaf5ce",
          "body": "Two bugs landed in lockstep:\n\n1. uppsala's `from_schema_with_base_path` treats `base_path` as a\n   *file* path and resolves `schemaLocation` URIs relative to its\n   parent directory. Imferno's wrappers passed the specs directory\n   directly, so `.parent()` returned one level too high and uppsala\n   \n[…]\nests pass. 7 pre-existing package-test\nfailures unchanged. SMPTE-spec-compliant XSD validation now reaches\nimported-namespace facets — every constraint expressible in the\nXSD layer fires on every CPL.",
          "is_bot": false,
          "headline": "xsd-runtime: fix base_path so imported dcml schema actually loads",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "947f0a160e359fe651203a88ef515d524097d0f3",
          "body": "SMPTE-spec-compliant validation is not optional. uppsala becomes a\nregular (non-optional) dependency; every `validate_cpl()` call runs\nthe XSD pre-pass automatically. No more `--features xsd-runtime`,\nno more cfg gates on the test cases that exercise it.\n\nChanged:\n- crates/imferno-core/Cargo.toml: d\n[…]\nss imported namespaces, so\n`dcml:UUIDType` patterns don't fire. Tracked as task #20 (patch 2\nto the uppsala fork). Everything XSD-expressible within the\nprimary namespace IS now enforced on every CPL.",
          "is_bot": false,
          "headline": "xsd-runtime: remove feature gate — XSD validation is always on",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "425017f5f9352bc47a8971ca56375cffc9416149",
          "body": "Forwards `aggregateRepeats: bool` from the JS options object into\n`ValidationOptions::aggregate_repeats`. When true, the report is\ncollapsed via `ValidationReport::aggregate()` before serialisation\nso JS consumers receive one entry per (code, severity-bucket) tuple\ncarrying the rest of the locations\n[…]\ns opt in explicitly.\n\nThe other diagnostics-v2 additions (source field on issues,\nsuppressed bucket on reports) already flow through automatically\nvia serde derives — no binding code needed for those.",
          "is_bot": false,
          "headline": "napi,wasm: expose aggregateRepeats option",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa689dbb587e7d7d7294a7416248510de5ef28d6",
          "body": "The 12 tests were gutted into `#[ignore]` placeholders when their\nhand-rolled implementations were classified as XSD-overlap. With the\nruntime-XSD pre-pass now firing per-element diagnostics\n(`XSD/<kind>/<element>`), 10 are restored as raw-XML round-trip\ntests that exercise `parse_cpl + validate_cpl\n[…]\n  per-element code suffix.\n\nVerified: full lib suite passes (425 → 427 with the new tests),\nxsd integration suite 8/8 green, 7 pre-existing package-test\nfailures (missing MXF fixture files) untouched.",
          "is_bot": false,
          "headline": "xsd-runtime: un-ignore 10 of 12 core_flags_* tests via XSD pre-pass",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5736ff8bd08a31038db9247445a0d82635843c81",
          "body": "…lob/source rule overrides\n\nOperator-facing surface for the §5.1 prose-vs-XSD escape hatch:\n\n- `IssueSource { XsdLayer, ProseRule, EngineInternal }` enum, populated\n  on every `ValidationIssue` at `::new()` time by inferring from the\n  code prefix. Field is serialised so JS consumers get\n  `issue.so\n[…]\n:aggregate_repeats: bool` (default false; native\n  callers and bindings can flip it on).\n\n- 18 new tests across diagnostics + rules. Existing tests\n  re-verified including a 100-run determinism guard.",
          "is_bot": false,
          "headline": "diagnostics-v2: source provenance + suppressed bucket + aggregate + g…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e2e9a31d30c28f01f2c6a69c7374385b7cf9fece",
          "body": "…path)\n\nCloses the architectural gap between `validate_cpl(&parsed_cpl)` and\n`validate_cpl_xml(raw_xml, ...)`: both now produce schema-level\ndiagnostics from the runtime-XSD validator when source_xml is\navailable.\n\nChanges:\n\n- xsd/mod.rs:\n  - Embed imf-cpl.xsd / st2067-3a-2016.xsd / st2067-3a-2020.x\n[…]\ntruct tests via parse_cpl(raw_xml) rather than\nmanual struct construction.\n\nPatch 2 (imported-namespace facet enforcement) still ahead; would\nclose the dcml:UUIDType pattern facet gap that v0.4.0 has.",
          "is_bot": false,
          "headline": "xsd-runtime: wire XSD pre-pass into validate_core_structure (unified …",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18ac73c8fdf11a24cbb637e8702f5aec294bfffc",
          "body": "…ched uppsala\n\nTwo changes that together unify the runtime-XSD path:\n\n1. CompositionPlaylist gains `source_xml: Option<String>` (serde-skipped).\n   parse_cpl() fills it. Lets callers going through validate_cpl(&cpl)\n   reach the XSD validator without restructuring API.\n\n2. workspace Cargo.toml gets \n[…]\nidation/mod.rs)\nupdated to add `source_xml: None`.\n\nNext commit: hook xsd:: into validate_core_structure so any caller\nwith cpl.source_xml = Some gets schema-level diagnostics alongside\nsemantic ones.",
          "is_bot": false,
          "headline": "xsd-runtime: thread source_xml through CompositionPlaylist + wire pat…",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d40be1d8240400cc8ca2d35c2c0dda9cc5b5469",
          "body": "runtime-XSD spike\n\nStandalone reference for the two limitations the spike encountered\nin uppsala that block \"fully SMPTE compliant\" runtime XSD\nvalidation on the imferno-wasm target:\n\n1. ValidationError has no element-path field — diagnostics can only\n   be classified into 5 generic bucket codes, no\n[…]\nrs — Issue 2 pinned via\n  #[ignore]d composite_schema_catches_dcml_typed_violations\n- crates/imferno-core/src/validation/mod.rs — 12 core_flags_*\n  tests #[ignore]d, blocked on Issue 1 for un-ignoring",
          "is_bot": false,
          "headline": "docs: catalogue the two uppsala v0.4.0 issues found during the",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f074927aab2d3e80d0fe58116951890abbbd6c09",
          "body": "Adds ImfUuid::parse_urn which strictly requires the `urn:uuid:`\nprefix per SMPTE dcml:UUIDType (xs:anyURI restricted to the URN\nform). Existing lenient ImfUuid::parse stays for callers that\nneed to accept bare UUIDs.\n\nWired into SCM XML parsing — bare UUIDs in SCM documents now fail\nat parse time, m\n[…]\nte\ntype (like SCM does) instead of typing fields directly as ImfUuid.\nThat's a meaningful refactor — deferred.\n\nTest result: 387 pass, 7 fail (pre-existing package tests), 13\nignored. No new failures.",
          "is_bot": false,
          "headline": "ImfUuid: add parse_urn (XSD-strict) — partial tightening only",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b16c6fbb8ab832b088ea926b969c8a73547f7c98",
          "body": "Composes the XSD pass (composite path, with the dcml stub bound)\nand the existing semantic validate_cpl into one callable that\ntakes raw CPL XML and returns the concatenated issues. Non-invasive:\nno struct changes, no signature changes on existing functions.\n\nSignature:\n    pub fn validate_cpl_xml(\n\n[…]\nTypeInvalid; the test also pins the XSD-before-semantic\n  ordering invariant\n\nTest result: 7/7 integration tests pass, 1 ignored (upstream uppsala\nv0.4.0 limitation documented earlier in this branch).",
          "is_bot": false,
          "headline": "xsd-runtime: add validate_cpl_xml as the top-level wired entry",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "56b36729739ecddff4f24b35e73fde0f43cfb5a2",
          "body": "Closes the lax-validation gap for SMPTE XSDs that use namespace-only\nxs:import (every CPL/PKL imports ST 433 dcml types this way). The\nimports were silently skipped by uppsala because no schemaLocation\nhint is provided in the source.\n\nAdds:\n\n- specs/dcml-types-stub.xsd — minimal stub defining UUIDTy\n[…]\ntion tests pass, 1 ignored (the\ndocumented limitation). xsd::tests still 7/7 green.\n\nCosmetic: branch renamed `spike/xsd-runtime-xmloxide` →\n`spike/xsd-runtime` (xmloxide didn't survive the bake-off).",
          "is_bot": false,
          "headline": "xsd-runtime: composite-schema validation via dcml-types stub",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "09e4687ab8e950d956906bf5c279f64f86b1beca",
          "body": "Closes the loop on the runtime-XSD architecture proposal: a real\nproduction module that wraps uppsala's XSD diagnostics into the\nimferno catalogue surface. Gated behind the new `xsd-runtime`\nfeature; off by default.\n\nWhat's added:\n\n- `xsd-runtime` Cargo feature, with `uppsala = \"0.4\"` as an optional\n[…]\nvalidates anything typed against the unresolved namespace.\nFor full CPL coverage operators would need to inject schemaLocation\nhints + provide a stub dcml schema (path 1 from the spike\ninvestigation).",
          "is_bot": false,
          "headline": "xsd-runtime: add uppsala-backed validation module behind feature flag",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5a8ea52ee0ace43708f296b1562309a8add1484e",
          "body": "The validation/mod.rs hand-rolled checks that mirror constraints\nalready expressed in the SMPTE XSDs are gone. They will be re-emitted\nby the runtime-XSD validation path (see uppsala spike on this branch)\nvia a translator that maps schema diagnostics back into the\nCoreConstraintsCode catalogue.\n\nRem\n[…]\nit them\nonce wired up.\n\nTest result after gut:\n  387 passed, 7 failed (pre-existing package::tests::*), 13 ignored\n  No new failures introduced by the gut.\n\nFile delta: 459 lines changed (+39 / -420).",
          "is_bot": false,
          "headline": "gut: remove hand-rolled XSD-overlap validation checks",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "80b9a3518ce34ae9464cf61d03864f58423b0f76",
          "body": "Adds a parallel example covering the same 20 SMPTE CPL fixtures +\n3 synthetic broken CPLs + the no-import boundary probe.\n\nFindings (uppsala vs xmloxide on identical inputs):\n\nREAL FIXTURES (20):\n- xmloxide: 20/20 is_valid=true\n- uppsala : 20/20 0 errors\n  Same outcome because every required CPL fie\n[…]\namples remain as dev-deps; no production code paths\nchanged. Run individually:\n  cargo run --example xsd_validate_spike -p imferno-core\n  cargo run --example xsd_validate_spike_uppsala -p imferno-core",
          "is_bot": false,
          "headline": "spike: uppsala XSD validation — head-to-head with xmloxide",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9213ce6dc3cc51fe84862197944b82a75ac07140",
          "body": "Proves the architecture but surfaces a known sharp edge with\nmulti-namespace schema composition.\n\nFindings:\n\n1. xmloxide v0.4.3 (pure-Rust libxml2 replacement, MIT) builds\n   clean, ships its own XSD validator under validation::xsd, and\n   handles real SMPTE schemas + real CPL fixtures end-to-end. T\n[…]\n prose.\n\nRun with:\n\n    cargo run --example xsd_validate_spike -p imferno-core\n\nNot gated by a feature flag; xmloxide is a dev-dep only. No\nproduction code changes — this is a spike on its own branch.",
          "is_bot": false,
          "headline": "spike: xmloxide XSD validation against real SMPTE CPL fixtures",
          "author_name": "JP Wesselink",
          "author_login": "jpwesselink",
          "committed_at": "2026-06-13T12:36:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 54,
      "commits_last_year": 357,
      "latest_release_at": "2026-06-19T18:10:37Z",
      "latest_release_tag": "imferno-wasm-v3.0.1",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 34,
      "mean_days_between_releases": 4.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "xtask",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "automation",
            "macos",
            "release",
            "codesign",
            "xtask",
            "command-line-utilities",
            "development-tools::build-utils"
          ],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/xtask",
          "is_deprecated": false,
          "latest_version": "0.1.4",
          "repository_url": "https://github.com/arcboxlabs/xtask",
          "versions_count": 5,
          "total_downloads": 560,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 187,
          "first_published_at": "2026-06-24T11:01:25.012607Z",
          "latest_published_at": "2026-06-30T09:55:36.509458Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 23
        },
        {
          "name": "docs",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": null,
          "registry_url": "https://www.npmjs.com/package/docs",
          "is_deprecated": false,
          "latest_version": "0.4.0",
          "repository_url": null,
          "versions_count": 13,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3958,
          "first_published_at": "2011-08-30T11:02:27.838000Z",
          "latest_published_at": "2026-06-06T13:26:09.959000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 47
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "crates/imferno-wasm/tsconfig.json",
        "docs-astro/tsconfig.json",
        "docs/tsconfig.json",
        "examples/node/tsconfig.json"
      ],
      "toolchain_manifests": [
        "Cargo.toml",
        "crates/benchmarks/Cargo.toml",
        "crates/corpus-tests/Cargo.toml",
        "crates/imferno-core/Cargo.toml",
        "crates/imferno-napi/Cargo.toml",
        "crates/imferno-wasm/Cargo.toml",
        "crates/imferno/Cargo.toml",
        "xtask/Cargo.toml"
      ],
      "largest_source_bytes": 399222,
      "source_files_sampled": 185,
      "oversized_source_files": 4,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "docs-astro/package.json",
        "docs/package.json",
        "xtask/Cargo.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates",
        "npm"
      ],
      "dependencies": [
        {
          "name": "@astrojs/react",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.2"
        },
        {
          "name": "@astrojs/starlight",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.37.6"
        },
        {
          "name": "@tailwindcss/vite",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "@types/react",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.14"
        },
        {
          "name": "@types/react-dom",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.3"
        },
        {
          "name": "astro",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.6.1"
        },
        {
          "name": "clsx",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "react",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.4"
        },
        {
          "name": "react-dom",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.4"
        },
        {
          "name": "sharp",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.34.2"
        },
        {
          "name": "tailwind-merge",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.5.0"
        },
        {
          "name": "tailwindcss",
          "manifest": "docs-astro/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "imferno-core",
          "manifest": "xtask/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "schemars",
          "manifest": "xtask/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "serde_json",
          "manifest": "xtask/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 72,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 3
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "jpwesselink",
          "commits": 345,
          "avatar_url": "https://avatars.githubusercontent.com/u/1814479?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-docs.yml",
        "publish-napi.yml",
        "publish-npm-binary.yml",
        "publish-npm-schema.yml",
        "publish-npm.yml",
        "release-plz.yml",
        "xsd-drift.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 6,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/12 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 6 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 0,
            "reason": "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 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 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": 0,
            "reason": "36 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8b55d2c38fb8cf9ee90c6508ff3733a90320ec8f",
        "ran_at": "2026-07-23T19:52:14Z",
        "aggregate_score": 2.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T07:14:47Z",
      "oldest_open_prs": [
        {
          "number": 72,
          "created_at": "2026-07-02T15:10:16Z",
          "last_comment_at": "2026-07-07T21:35:02Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 77,
          "created_at": "2026-07-18T12:13:00Z",
          "last_comment_at": "2026-07-18T12:14:48Z",
          "last_comment_author": "github-actions"
        }
      ],
      "last_merged_pr_at": "2026-07-18T11:02:38Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/jpwesselink/imferno",
    "host": "github.com",
    "name": "imferno",
    "owner": "jpwesselink"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 27,
        "vitality": 86,
        "community": 33,
        "governance": 59,
        "engineering": 73
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 357,
              "human_commit_share": 0.99,
              "days_since_last_push": 5,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "357 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 357
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "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": 54,
              "latest_release_tag": "imferno-wasm-v3.0.1",
              "releases_from_tags": false,
              "days_since_latest_release": 34,
              "mean_days_between_releases": 4.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "54 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 54
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 34 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 34
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.3
                    }
                  }
                ],
                "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": 33,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "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": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "packages": [
                "docs"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3958
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,958 downloads/month across npm",
                "points": 48,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3958,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "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": 59,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "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 6 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 69,
            "inputs": {
              "merged_prs": 72,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 3
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "72/75 decided PRs merged",
                "points": 36.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 72,
                      "decided": 75
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/12 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "followers": 98,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "jpwesselink",
              "public_repos": 94,
              "account_age_days": 5162
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "98 followers of jpwesselink",
                "points": 14.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 98,
                      "login": "jpwesselink"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "94 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 94
                    }
                  },
                  {
                    "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": [
                "docs"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 47
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 47 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 47
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "13 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 73,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "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": "8 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://jpwesselink.github.io/imferno",
              "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": "https://jpwesselink.github.io/imferno",
                "points": 15,
                "status": "met",
                "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": "critical",
        "name": "Security",
        "value": 27,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/12 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "dangerous workflow patterns detected",
                "points": 0,
                "status": "missed",
                "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 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 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": "36 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 6
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 55,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.97,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "96 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "crates/imferno-wasm/tsconfig.json",
                "docs-astro/tsconfig.json",
                "docs/tsconfig.json",
                "examples/node/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "crates/benchmarks/Cargo.toml",
                "crates/corpus-tests/Cargo.toml",
                "crates/imferno-core/Cargo.toml",
                "crates/imferno-napi/Cargo.toml",
                "crates/imferno-wasm/Cargo.toml",
                "crates/imferno/Cargo.toml",
                "xtask/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, crates/benchmarks/Cargo.toml, crates/corpus-tests/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, crates/benchmarks/Cargo.toml, crates/corpus-tests/Cargo.toml"
                    }
                  }
                ],
                "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": "crates/imferno-wasm/tsconfig.json, docs-astro/tsconfig.json, docs/tsconfig.json, examples/node/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "crates/imferno-wasm/tsconfig.json, docs-astro/tsconfig.json, docs/tsconfig.json, examples/node/tsconfig.json"
                    }
                  }
                ],
                "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": 99,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 399222,
              "source_files_sampled": 185,
              "oversized_source_files": 4
            },
            "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": "4/185 source files over 60KB",
                "points": 53.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 185,
                      "oversized": 4
                    }
                  }
                ],
                "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",
    "crates package 'xtask' points at a different repository (https://github.com/arcboxlabs/xtask); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T19:52:31.537685Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jpwesselink/imferno.svg",
  "full_name": "jpwesselink/imferno",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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, npm.