# Other ecosystems: crates.io, RubyGems, Go, Maven, NuGet, Packagist, container images

Since 2026-11-12 (fix103), KarmaDue reads OSV.dev and the package registry for these ecosystems. Before that it answered `unknown` / `proceed_with_care` ("Go ahead with normal care") for all of them. Every answer below still asks your person: KarmaDue has no usage, age or publisher signals for these ecosystems yet, so it never clears a package on its own.

## Target formats

| Ecosystem | Target | Registry KarmaDue reads |
|---|---|---|
| crates.io | `cargo:serde@1.0.200` (also `crates:`) | index.crates.io |
| RubyGems | `gem:rails@7.0.0` | rubygems.org compact index |
| Go | `go:github.com/gin-gonic/gin@v1.9.0` | proxy.golang.org |
| Maven | `maven:org.apache.logging.log4j:log4j-core@2.14.1` | repo1.maven.org (maven-metadata.xml) |
| NuGet | `nuget:Newtonsoft.Json@12.0.1` | api.nuget.org flat container |
| Packagist | `composer:laravel/framework@8.0.0` | repo.packagist.org |
| Container images | `docker:nginx:latest` | none: not assessed |

Use these targets with `/v1/preflight`, the MCP `/safety` `check` tool, or `feeds/v1/packages/check` (with `ecosystem` set, any letter case).

## What you get

- The exact version is looked up in OSV.dev. Advisories for that version give `warn` / `require_human_approval`, naming the advisory IDs. A malicious-package report gives `deny` / `block`.
- "Fixed in" is the lowest release on your version's line that fixes every listed advisory, that OSV.dev itself lists no advisory for, and that the registry confirms is published. If OSV.dev names no fix, or the candidate cannot be confirmed in time, no fix version is given.
- A package or version the registry does not list gives `unverified_existence` / `require_human_approval`.
- Nothing found gives `no_known_issues` / `require_human_approval`: no reports is not a clearance.
- If OSV.dev or the registry cannot be read in time, or answers in an unexpected shape, the answer is `unknown` / `require_human_approval`. It never falls back to "go ahead".
- Container images and any other ecosystem: `unknown` / `require_human_approval`. Pin a digest and scan the image.
- npm and PyPI answers did not change.

## Live answers (captured 2026-11-12, after the deploy)

| Target | Before | Now |
|---|---|---|
| log4j-core 2.14.1 (Maven) | unknown, go ahead with care | warn, ask: 8 advisories for this version (3 critical or high), including CVE-2021-44228 (Log4Shell). Fixed in 2.25.4 |
| laravel/framework 8.0.0 (Packagist) | unknown, go ahead with care | warn, ask: 12 advisories (8 critical or high). Fixed in v12.69.0 |
| gin 1.9.0 (Go) | unknown, go ahead with care | warn, ask: CVE-2023-29401. Fixed in v1.9.1 |
| rails 7.0.0 (RubyGems) | unknown, go ahead with care | warn, ask: CVE-2024-26143. Fixed in 7.0.8.1 |
| Newtonsoft.Json 12.0.1 (NuGet) | unknown, go ahead with care | warn, ask: CVE-2024-21907. Fixed in 13.0.1 |
| serde 1.0.200 (crates.io) | unknown, go ahead with care | no known issues, still ask |
| nginx:latest (Docker) | unknown, go ahead with care | not assessed, ask |

Advisory counts are what OSV.dev listed at capture time and will change.

## feeds/v1/packages/check

An item's `ecosystem` is no longer treated as npm when it is something else. Names are matched in any letter case. Supported ecosystems go through the same lookup, up to 25 per call. Anything else returns that item with `ok: false` and `status: "unsupported_ecosystem"`. Requests that only contain npm and PyPI items get exactly the same response as before.

## Hooks and guards

- The hook endpoint (`/hook/v1/...`) now answers `ask` for decision `unknown`, in both fail modes.
- Claude Code preinstall hook 1.2.0 and karmadue-guard 0.3.0 ask on `unknown` and on any "ask your person" answer.
- The Claude Code script hook (`karmadue-preinstall.js`) also sends `cargo install`, `go install` / `go get` / `go run pkg@version` and `brew install` commands; brew is answered `unknown`, so it asks. The guard (shims, `check` and `hook` commands) and the hook endpoint read only npm and PyPI packages from commands, so check other ecosystems with a direct call. See [hooks](hooks.md) and [any agent](any-agent.md).

## Answer size

Measured live on 2026-11-12 after the deploy. The table compares the bytes of KarmaDue's `/v1/preflight` answer with the bytes of what an agent would fetch to get the same facts itself: the raw OSV.dev `/v1/query` response for that version, plus the registry document(s) KarmaDue reads. These are byte counts, not tokens.

| Target | KarmaDue answer | OSV.dev response | + registry document(s) | Raw total vs KarmaDue |
|---|---|---|---|---|
| `maven:org.apache.logging.log4j:log4j-core@2.14.1` | 4,229 B | 56,393 B | 2,838 B | 14.0x |
| `composer:laravel/framework@8.0.0` | 4,535 B | 151,556 B | 1,020,104 B | 258.4x |
| `go:github.com/gin-gonic/gin@v1.9.0` | 2,617 B | 3,698 B | 200 B | 1.5x |
| `gem:rails@7.0.0` | 2,481 B | 5,054 B | 187,299 B | 77.5x |
| `nuget:Newtonsoft.Json@12.0.1` | 2,594 B | 4,288 B | 1,462 B | 2.2x |
| `cargo:serde@1.0.200` | 1,635 B | 2 B | 164,874 B | 100.8x |

Read this honestly. Against the OSV.dev response alone, the KarmaDue answer is 1.4x to 33x smaller for versions with advisories. For serde, OSV.dev's reply is `{}` (2 bytes), so the KarmaDue answer (1,635 B) is larger. Most of the larger ratios come from registry documents (for example Packagist's full laravel/framework metadata, about 1 MB), which an agent would only fetch if it wanted to confirm the version and the fix are published. A rough token estimate is bytes / 4; no tokenizer was run.
