OpenSSF: Scorecard and test coverage of Gunnar, Holger and monetize
Lane OSSF-NEXT, 2026-10-30. OpenSSF Scorecard v5.6.0 in local mode (scorecard --local), the same tool and mode as the nightly scorecard-gunnar / scorecard-holger runs on STATUS.md. Local mode runs only the checks that read the files; Branch-Protection, CI-Tests, CII-Best-Practices, Code-Review, Contributors, Maintained, SBOM, Signed-Releases and Webhooks need a GitHub or GitLab API and are not run.
Scorecard, before and after
| check | Gunnar before (4df9a0aa) | Gunnar after (67ca09f8) | Holger before (8b0cb2b3) | Holger after (b03ead25) |
| aggregate | 5.2 | 9.0 | 2.9 | 8.5 |
| Binary-Artifacts | 10 | 10 | 6 | 9 |
| Dangerous-Workflow | 10 | 10 | inconclusive | inconclusive |
| Dependency-Update-Tool | 0 | 10 | 0 | 10 |
| Fuzzing | 0 | 10 | 0 | 10 |
| License | 9 | 9 | 9 | 9 |
| Packaging | inconclusive | inconclusive | inconclusive | inconclusive |
| Pinned-Dependencies | 0 | 10 | inconclusive | inconclusive |
| SAST | 0 | 0 | 0 | 0 |
| Security-Policy | 10 | 10 | 10 | 10 |
| Token-Permissions | 10 | 10 | inconclusive | inconclusive |
| Vulnerabilities | 0 (42 open) | 9 (1 open) | 0 (12 open) | 10 (0 open) |
What changed:
- Vulnerabilities. Semver-compatible fixes in every lock (wasmtime 49.0.5, pageant, ammonia 4.2.4, quinn-proto 0.11.18, faster-hex 0.10.1, crypto-bigint 0.7). The SSH stack moved to russh 0.64.1: edda's nornir-git 0.2.3, and Gunnar's own SSH server and client. An advisory with no fixed release is triaged with a dated reason in
deny.tomland in anosv-scanner.tomlnext to the lock that carries it (the file Scorecard reads); a test in each repository keeps the two equal. Gunnar still counts GHSA-q54r-jf2p-rfr2 (gix 0.88), which is reachable from its client's worktree checkout: it waits for the gix 0.90 bump. - Fuzzing. A cargo-fuzz crate (
fuzz/) in each repository: Gunnar 8 targets (pack, objects, the receive and upload requests, the gunnar-crypt envelope and files, commit and SSH signatures), Holger 6 (bundle verify, DSSE, in-toto, X.509, the APK index and the package metadata parsers). The first run found a real panic in Holger's bundle index reader (fixed). They run every night in the dwarves forge (fuzz-gunnar,fuzz-holger), and a crash is a red run. - Dependency-Update-Tool.
renovate.jsonin each repository. No Renovate bot runs on git.gunnar.rs; the forge's weeklydeps-gunnar/deps-holgerruns do the same work:cargo updatein every lock, the repository's quick CI on that tree, and a newdeps/update-<date>-<sha>branch when it is green. A person merges it. - Pinned-Dependencies (Gunnar). The workflow actions by commit, the bench image by digest.
- Binary-Artifacts (Holger). Three of four binary fixtures are now built by the tests; one PyPI wheel stays, because its real Sigstore attestation covers exactly those bytes.
What cannot count without GitHub
- SAST counts only a
.github/workflowsfile that runs CodeQL, Snyk, Pysa, Qodana or Hadolint, or SonarCloud named in apom.xml. git.gunnar.rs runs no Actions, and the repositories have no GitHub mirror (owner rule), so a workflow file would run nowhere. The static analysis that does run:cargo clippy -D warningsandcargo denyon every push, and the nightly fuzzing. - Branch-Protection, Code-Review, CI-Tests, Signed-Releases and the other API checks are not run in local mode at all.
Test coverage (cargo llvm-cov)
Measured on oden at lane time; from now on every night by coverage-gunnar and coverage-holger (05:00 UTC), whose numbers appear on STATUS.md.
| repository | packages | lines | functions | regions |
| Gunnar 67ca09f8 | gunnar-core, -wire, -crypt, -store, -ssh, -policy, -lfs | 81.7 % | 76.0 % | 80.2 % |
| Holger 6adb72fa | holger-traits, -errcode, -update-bundle, -provenance, -inspect, -sync, -server-lib | 73.9 % | 68.3 % | 77.1 % |
monetize (lane MON-OSSF, 2026-10-31)
The open monetize crates (git.gunnar.rs/nordisk/monetize). The private vendors in monetize-impl are fuzzed too, but nothing of theirs is published here: their nightly run publishes its verdict only.
Scorecard, before and after
| check | monetize before (65a1602a) | monetize after (2b732123) |
| aggregate | 3.2 | 9.2 |
| Binary-Artifacts | 10 | 10 |
| Dangerous-Workflow | 10 | 10 |
| Dependency-Update-Tool | 0 | 10 |
| Fuzzing | 0 | 10 |
| License | 9 | 9 |
| Packaging | inconclusive | inconclusive |
| Pinned-Dependencies | 0 | 10 |
| SAST | 0 | 0 |
| Security-Policy | 0 | 10 |
| Token-Permissions | 0 | 10 |
| Vulnerabilities | 0 (16 open) | 10 (0 open) |
What changed:
- Vulnerabilities. wasmtime 49.0.5 (RUSTSEC-2026-0422/0423/0424) in five locks and pageant 0.2.5 (GHSA-662x-8wvj-2276) in three, by a semver-compatible lock move; a test keeps those floors. The rest is triaged with a dated reason in
deny.tomland in anosv-scanner.tomlbeside each lock (xtask/tests/osv_triage.rskeeps them equal): the unmaintained compile-time crates andrsa/crypto-bigintas before, and the new russh advisories of 2026-10-30 (fixed only in russh 0.65) and gix 0.88, all under nornir-git in the tooling workspaces (xtask, monetize-fast, the build thing), none in a monetize binary. cargo-deny is clean in all seven workspaces. - Fuzzing.
fuzz/, five cargo-fuzz targets:pay_callback(the open vendors' callbacks),feed_config(the operator's feed andmonetize.toml),signed_facts(snapshots, facts, go-aheads, growth, tickets),fleet_door(a box's signed Fleet call, the old sold-estate door folded in) andfleet_orders(the signed orders a box pulls). 300 s and then 1800 s per target on oden: 154 million runs, no crash. The forge runs them every night (fuzz-monetize), and the private vendors' crate (Stripe, Klarna, Swish) asfuzz-monetize-impl, verdict-only. - Dependency-Update-Tool.
renovate.json; the forge's weeklydeps-monetizeproposes thecargo updateas a branch after the quick CI went green on it. - Pinned-Dependencies, Token-Permissions. The one workflow (mirror-safety) pins actions/checkout to the commit of v4.4.0 and reads with
contents: readonly. - Security-Policy.
SECURITY.md.
Test coverage (cargo llvm-cov, lines), the open crates
Measured on oden over the whole open workspace at 65a1602a (the guests built first): 85.6 % (75655/88393 lines). Four crates were under 70 % and got tests (branch mon-ossf/cov-2026-10-31): fast-edge 22.3 % -> 88.3 %, monetize-pay-guest 67.3 % -> 99.0 %, monetize-cloud-guest 59.0 % -> 75.5 %, lake-product 20.0 % -> 72.9 %. From now on coverage-monetize measures the open crates every night (05:00 UTC) on STATUS.md.
| crate | lines at 65a1602a |
| monetize | 94.5 % |
| monetize-server | 85.6 % |
| monetize-pay | 80.5 % |
| monetize-cloud | 87.0 % |
| monetize-embed | 97.6 % |
| monetize-guardian | 91.9 % |
| monetize-estate-side | 90.1 % |
| monetize-site-buy | 87.3 % |
| monetize-front | 79.6 % |
| monetize-product | 84.2 % |
| monetize-product-wasm | 74.6 % |
| monetize-cloud-wasm | 78.1 % |
| monetize-product-guest | 91.0 % |
| monetize-shop-pairing | 83.1 % |
| monetize-cli | 92.4 % |
| monetize-mail | 91.0 % |
| monetize-ui-server | 87.9 % |
| monetize-ui-web | 98.1 % |
| nordisk-estate-svg | 97.4 % |