npm audit --omit=dev on a bare ruflo@3.38.20 install: 1 critical + 12 high transitive, with the critical on the live embedding path
Context: standing up ruflo mcp start -t http as a private, IAM-gated Cloud Run service for ruvnet/ruClip (ruClip#1, cognitum-one/ruclip ADR-0001/0002). Before shipping the image we audited its production tree: the published package, fresh npm i ruflo@3.38.20 in an empty directory, nothing else installed.
npm audit --omit=dev
38 vulnerabilities (25 moderate, 12 high, 1 critical)
High/critical by package, as npm reports them:
critical protobufjs
high @claude-flow/cli, @huggingface/transformers, @xenova/transformers, onnxruntime-node,
onnxruntime-web, onnx-proto, adm-zip, agentdb, agentic-flow,
@opentelemetry/sdk-node, @opentelemetry/propagator-jaeger
Two import paths reach the critical protobufjs (npm ls protobufjs):
ruflo@3.38.20 → @claude-flow/cli@3.38.20
├─ agentdb@3.0.0-alpha.20 → @huggingface/transformers@4.2.0 → onnxruntime-web → protobufjs
└─ agentdb@3.0.0-alpha.20 → @opentelemetry/sdk-node@0.218.0 → …grpc-js → @grpc/proto-loader → protobufjs
Why it matters for a hosted bridge specifically: the transformers/onnxruntime path is not dormant — every memory_store through the bridge generates a 384-dim embedding (hasEmbedding: true, embeddingDimensions: 384 in the store response), so that code executes on every write from a network-reachable service. --tools limits which tools are callable; it doesn't change which packages load.
Related: the repo's own CVE gate (Audit root (critical-blocking), CVE Audit Gate workflow) currently fails on main for an unrelated reason — npm error notarget No matching version found for @claude-flow/mcp@3.0.0-alpha.10 (run 33467634804) — so it isn't surfacing this today. Not filing a PR: the fix is version bumps in agentdb/@claude-flow/cli dependency ranges, a maintainer call on compatibility (onnxruntime in particular).
One more operational finding from the same session, for whoever owns the HTTP transport: the bridge enforces a per-client rate limit that fires after ~51 calls within ~0.3 s and had not cleared 65 s later (fresh process clears it). Paced at ~1.3 calls/s it never fires (40 store+retrieve pairs, p50 16 ms / 11 ms). The string Rate limit exceeded isn't in v3/@claude-flow/cli/src, so it's coming from a dependency — worth documenting the threshold/window and exposing a knob, since a control plane fanning out several calls per heartbeat across many devices will hit it.
Downstream, cognitum-one/ruclip ADR-0002 records the posture (private service, IAM-gated, exact-name --tools allowlist, pinned version, this issue linked) rather than treating the allowlist as a supply-chain control.
npm audit --omit=devon a bareruflo@3.38.20install: 1 critical + 12 high transitive, with the critical on the live embedding pathContext: standing up
ruflo mcp start -t httpas a private, IAM-gated Cloud Run service for ruvnet/ruClip (ruClip#1, cognitum-one/ruclip ADR-0001/0002). Before shipping the image we audited its production tree: the published package, freshnpm i ruflo@3.38.20in an empty directory, nothing else installed.High/critical by package, as npm reports them:
Two import paths reach the critical
protobufjs(npm ls protobufjs):Why it matters for a hosted bridge specifically: the transformers/onnxruntime path is not dormant — every
memory_storethrough the bridge generates a 384-dim embedding (hasEmbedding: true, embeddingDimensions: 384in the store response), so that code executes on every write from a network-reachable service.--toolslimits which tools are callable; it doesn't change which packages load.Related: the repo's own CVE gate (
Audit root (critical-blocking), CVE Audit Gate workflow) currently fails onmainfor an unrelated reason —npm error notarget No matching version found for @claude-flow/mcp@3.0.0-alpha.10(run 33467634804) — so it isn't surfacing this today. Not filing a PR: the fix is version bumps inagentdb/@claude-flow/clidependency ranges, a maintainer call on compatibility (onnxruntime in particular).One more operational finding from the same session, for whoever owns the HTTP transport: the bridge enforces a per-client rate limit that fires after ~51 calls within ~0.3 s and had not cleared 65 s later (fresh process clears it). Paced at ~1.3 calls/s it never fires (40 store+retrieve pairs, p50 16 ms / 11 ms). The string
Rate limit exceededisn't inv3/@claude-flow/cli/src, so it's coming from a dependency — worth documenting the threshold/window and exposing a knob, since a control plane fanning out several calls per heartbeat across many devices will hit it.Downstream, cognitum-one/ruclip ADR-0002 records the posture (private service, IAM-gated, exact-name
--toolsallowlist, pinned version, this issue linked) rather than treating the allowlist as a supply-chain control.