Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-23 19:52 UTC

jpwesselink / imferno

RustMIT★ 2 Sterne⑂ 0 Forksseit Feb. 2026Auf GitHub ansehen ↗

jpwesselink/imferno erreicht einen Gesundheitsindex von 58 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (86/100) ab, am schwächsten bei Security (27/100). Zuletzt vor 5 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

58
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

58
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

JP WesselinkPersönliches Konto
98 Follower94 öffentliche Reposseit Juni 2012@jp10k

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
crates.ioxtaskverweist auf ein anderes Repo — nicht bewertet0.1.41875vor 23 Tagenautomationmacosreleasecodesignxtaskcommand-line-utilities
npmdocs0.4.03.95813vor 47 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

86Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 5 Tagen
11.8/36Commit-Rhythmus — 17/52 Wochen mit Commits
18/18Commit-Volumen — 357 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year357
human_commit_share0,99
days_since_last_push5
active_weeks_last_year17

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 54 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 34 Tagen
27/27Release-Rhythmus — ein Release etwa alle 4,3 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count54
latest_release_tagimferno-wasm-v3.0.1
releases_from_tagsnein
days_since_latest_release34
mean_days_between_releases4,3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

33Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 2 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
48/80Downloads pro Monat — 3.958 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesdocs
dependents
ecosystemsnpm
total_downloads
monthly_downloads3.958
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

59Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 6 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
36.7/38.3PR-Annahme — 72/75 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/12 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs72
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
14.3/25Reichweite des Inhabers — 98 Follower von jpwesselink
25/25Kontohistorie — 94 öffentliche Repos, Kontoalter ca. 14 Jahre
Verwendete Eingangsdaten
followers98
owner_typeUser
is_verified
owner_loginjpwesselink
public_repos94
account_age_days5.162
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 47 Tagen
20/20Versionshistorie — 13 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesdocs
ecosystemsnpm
any_deprecatednein
min_days_since_publish47

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

73Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 8 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 11 out of 11 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://jpwesselink.github.io/imferno
0/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepagehttps://jpwesselink.github.io/imferno
has_readmeja
has_docs_dirja
has_descriptionnein

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

27Kritisch · 16 % des Gesamtindex

Sicherheitslage

27Kritisch
Wie die Bewertung erfolgt
4.5/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — keine Daten
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.5Lizenz — 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 — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 36 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

55Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 96 von 99 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,97
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — Cargo.toml, crates/benchmarks/Cargo.toml, crates/corpus-tests/Cargo.toml (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — crates/imferno-wasm/tsconfig.json, docs-astro/tsconfig.json, docs/tsconfig.json, examples/node/tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespnpm-lock.yaml
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
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
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Rust (statisch typisiert)
53.8/55Handhabbare Dateigrößen — 4/185 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageRust
largest_source_bytes399.222
source_files_sampled185
oversized_source_files4
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

2GitHub-Sterne
1Mitwirkende
357Commits, letzte 12 Monate
5Tage seit letztem Push
54Releases
1Bus-Faktor
0offene Issues
crates.io, npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

OpenSSF Scorecard 2.7 / 10
2.7Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-23 19:52 UTC

6Binary-Artifactsbinaries present in source code
k. A.Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
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
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities36 existing vulnerabilities detected
Direkte Abhängigkeiten 15
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikencrates.io, npm.