Prometheus
EN DE

Dokumentation · 03 / 09

POC-Spezifikation — Prometheus v2 Phase 1

Der Phase-1-MVP: Registry-Scraping und Self-Instrumentation-SDK parallel, Akzeptanztests K1–K7.

Status Pivot abgeschlossen 2026-05-26 · Spec freigabebereitQuelle concept/02-poc-spezifikation.mdZielgruppe Engineering · Mirror-Betreiber · Maintainer-PilotgruppeLesezeit ~5 Min.

Phase-1-MVP: ~10 Wochen, zwei orthogonale Erfassungs-Tracks parallel, gemeinsamer Open-Plattform-API mit einem Bootstrap-Mirror in der EU. K1–K7 sind die verbindlichen Akzeptanztests.


1. Scope#

In ScopeOut of Scope (Phase 2/3)
Track A — Registry-Scraping (npm, PyPI, Maven Central, crates.io, Go mod) + GitHub-Manifest-CrawlEndnutzer-Agent (Modus B), Hybrid-Aggregator (Modus C)
Track B — Self-Instrumentation-SDK (JavaScript, Python)weitere SDK-Sprachen (Java, Go, Rust, .NET)
Ein Referenz-Mirror in der EU (Single-Node ClickHouse + API-Server + Snapshot-Worker + Rekor-Client)zweiter unabhängiger Mirror, Gossip-Federation
Submission-Protokoll v1.0 (deklarative k-Anon-Attestation)ZK-SNARK-Attestation, Threshold-Konsens
Open Data Snapshots (Parquet, CSV.gz), Public Audit LogMix-Net-Submission, Threshold-Decryption
Dokumentations- und Federation-Registry-Skelettfinale mirrors.json-Governance

2. Track A — Public-Registry-Scraping#

Ziel: Sofort sichtbarer Verbreitungswert über öffentliche Daten, ohne dass Maintainer oder Endnutzer mitwirken müssen.

2.1 Quellen#

RegistryTop-Liste (Discovery)Paket-/Dependency-QuelleFrequenz
npmkuratierter In-Tree-Seed (src/scraper/.../seeds/npm.json)https://registry.npmjs.org/<name>/latesttäglich
PyPIhttps://hugovk.dev/top-pypi-packages/top-pypi-packages.min.jsonhttps://pypi.org/pypi/<name>/jsontäglich
Maven Centralhttps://search.maven.org/solrsearch/select?q=*:* (Solr cappt rows≤200)Dependencies aus POM-XML: https://repo1.maven.org/maven2/<g>/<a>/<v>/<a>-<v>.pomtäglich
crates.iohttps://crates.io/api/v1/crates?sort=downloadshttps://crates.io/api/v1/crates/<name>täglich
Go moduleskuratierter In-Tree-Seed (src/scraper/.../seeds/golang.json)https://proxy.golang.org/<module>/@latesttäglich
GitHub Manifest-CrawlTop-N Public-Repo-Liste (öffentliche package.json, requirements.txt, pom.xml, Cargo.toml, go.mod)wöchentlich, Top-1000 pro Sprache

Hinweis zu den Top-Listen: npm und Go modules besitzen keinen gepflegten, kompakten "Top-Packages"-JSON-Endpoint (npm: nur eine 106 MB große Volumen-Liste aller ~4,1 Mio Namen; Go: index.golang.org/index ist ein chronologischer "recently-added"-Feed, kein Nutzungs-Ranking). Beide werden daher aus einem kuratierten, eingecheckten Seed gespeist (reviewbar, K1 bleibt aussagekräftig). Maven Central liefert über Solr keine Dependencies — diese stehen nur im POM (XML), das deshalb separat von repo1.maven.org geholt und mit defusedxml geparst wird.

2.2 Aggregat-Form (Track A)#

{
  "project_id":  "pkg:npm/example-lib",
  "version_id":  "1.4.2",
  "cohort_id":   "dep-edges-from-public-manifests",
  "metric":      "observed_dependency_count",
  "value":       "1247",
  "window_start":"2026-05-26T00:00:00Z",
  "window_end":  "2026-05-27T00:00:00Z",
  "source_mode": "D",
  "provenance":  "registry-scraper@mirror-eu-1"
}

2.3 k-Anon im Track A#

Daten kommen aus öffentlichen Quellen → k-Constraint trivial gegeben. Schema-Reject-PII bleibt als Defense-in-Depth (z. B. keine Maintainer-E-Mails im Aggregat, keine Owner-Klartextnamen aus GitHub-Metadaten).


3. Track B — Self-Instrumentation-SDK (JS + Python)#

Ziel: Runtime-Nutzungsdauer-Sicht, die Track A nicht liefern kann.

3.1 SDK-API (verkürzt)#

JavaScript:

import { instrument } from "@prometheus/sdk";

instrument({
  projectId: "pkg:npm/example-lib",
  versionId: "1.4.2",
  cohorts: ["rt-runtime-mins", "install-count"],
  mirror: "https://mirror-eu-1.example",     // Default-Mirror via Federation-Registry
  did:    process.env.PROMETHEUS_DID         // optional in Phase 1, Pflicht ab Phase 2
});

Python:

from prometheus_sdk import instrument

instrument(
    project_id="pkg:pypi/example-lib",
    version_id="2.0.0",
    cohorts=["rt-runtime-mins", "install-count"],
    mirror="https://mirror-eu-1.example",
)

3.2 Events, die das SDK emittiert#

EventTriggerCohort-Mapping
installModul-Load erstmals im Prozessinstall-count
session-startErste Funktions-Nutzung im Prozessrt-runtime-mins (Zähler-Start)
runtime-tickalle 5 min, solange Lib genutztaktualisiert rt-runtime-mins-Band
feature-flagoptionale Custom-Hook (z. B. prometheus.flag("v2-api-used"))feature-flag-counter

3.3 Aggregat-Form (Track B)#

{
  "project_id":  "pkg:npm/example-lib",
  "version_id":  "1.4.2",
  "cohort_id":   "rt-runtime-mins",
  "metric":      "runtime_minutes_band",
  "value":       "30-60",
  "k_effective": 23,
  "k_min":       5,
  "window_start":"2026-05-26T12:00:00Z",
  "window_end":  "2026-05-26T13:00:00Z",
  "source_mode": "A"
}

3.4 Banding (verhindert PII-Inferenz)#

Numerische Werte werden in Bänder gemappt, nie als Klartext-Zahl:

BandBedeutung
0-5, 5-15, 15-30, 30-60, 60-180, 180-1440, 1440+ (in Minuten)Runtime-Bänder
1, 2-5, 5-25, 25-100, 100-1000, 1000+Install-Count-Bänder
Custom-Bänder per cohort_id-Definitionwird im Federation-Standard publiziert

4. Bootstrap-Mirror#

Phase-1-Konfiguration: Single-Node, EU-gehostet, Apache-2.0-Open-Source-Stack.

KomponenteStack
Aggregate-StoreClickHouse 24+ Single-Node (oder TimescaleDB-Equivalent)
Submission-APIRust/Go/Python — empfohlen FastAPI oder axum
Public Audit LogSigstore Rekor (selbst-gehostete Instanz)
Snapshot-GeneratorTägliche Parquet- + CSV.gz-Erzeugung um 00:00 UTC
Open Data APIREST + GraphQL, keine Auth
Federation-Registry-EintragEintrag in mirrors.json (zentrales Bootstrap-Repo)
Lokale Compose-Variantedocker compose up für reproduzierbare Forschungs-Setups

5. Erfolgskriterien K1–K7#

IDKriteriumMessung
K1Reach-Discovery: Top-1000-OSS-Pakete pro Registry werden in Track A ≥ 95 % erfassttäglicher Sampling-Check gegen npm/PyPI/Maven-Listen
K2False-Positive-Rate <unclassified>: ≤ 5 % der erfassten Dep-Edges bleiben ohne project_id-Auflösung (PURL-Match)Validator gegen PURL-Standard
K3Schema-Reject PII: Track A und Track B liefern 0 Submissions mit PII-Feldern. Backend-Schema lehnt Versuche aktiv abNegativ-Test mit absichtlichen PII-Payloads, Mirror-Reject erwartet
K4k-Anon-Wirkung Track B: keine cohort_id mit unique_sessions < 5 (Default) im Open-Data-SnapshotSample-Audit nach Snapshot-Erzeugung
K5Verfügbarkeit & Resilienz: Mirror-Ausfall 30 min → 0 Datenverlust (SDK puffert lokal, retransmit; Scraper idempotent)Chaos-Test im Staging
K6Open Data Usability: Forscher:in beantwortet in < 2 min die Frage „Welche TOP-10-OSS-Pakete haben in den letzten 12 Monaten ihre Reach verdoppelt?" über den Open-Data-Dump (kein Login nötig)User-Test mit nicht-eingearbeiteter Forschungs-Persona
K7SDK-Footprint: Track-B-SDK verbraucht im Steady-State < 5 ms CPU/h, < 2 MB RAM in einem Node.js-/Python-ProzessProfiler-Run pro CI-Build

6. Sprint-Plan (10 Wochen, vorläufig)#

SprintWochenFokus
11–2Federation-Registry-Skelett (mirrors.json mit einem Eintrag), Submission-Protokoll-Spec, Reference-Mirror-Stub
23–4Track A: Scraper-Cores (npm + PyPI), Aggregate-Store, ein erster Snapshot
35–6Track A: Maven + crates + Go, GitHub-Manifest-Crawl, K1-Check
47–8Track B: JS-SDK, Python-SDK, Banding, Submission-Roundtrip, K4-Check
59–10Open Data API, Sigstore-Rekor-Integration (K3 + K5), Public-Audit-Log, K6-Forscher-Test, K7-Footprint-Profil

7. Out of Scope für Phase 1 (explizit)#

  • Endnutzer-Agent (Modus B als Daemon-Variante außerhalb der Lib)
  • Hybrid-Aggregator-Daemon (Modus C)
  • ZK-SNARK-Attestation (05-zero-knowledge-vorschlag.md, Baustein B)
  • Cross-Mirror-Gossip (kommt mit Mirror #2 in Phase 2)
  • Threshold-Konsens (Phase 3)
  • weitere SDK-Sprachen außer JS und Python
  • Build-Tool-Plugins (Maven/Gradle/cargo-Hooks)
  • Dashboards mit Live-Visualisierung (Streaming-Charts, Echtzeit-Aktualisierung, serverseitiges Rendering) — Forschung/Hersteller bauen ihre eigenen. Nicht gemeint ist das statische Dashboard: das ist Pflicht-Deliverable Nr. 9 (07-prototyp-requirements.md §2 / §7) und trägt den K6-Nachweis. Phase 1 liefert also API + Open-Data-Dumps plus ein statisches, vom Mirror ausgeliefertes Frontend ohne Build-Step.

8. Querverweise#

  • 01-konzept.md — Gesamtkonzept v2
  • 03-risikoprofil.md — Phase-1-relevante Risiken (D-2-1, M-2-1, M-2-2 priorisiert)
  • 04-executive-summary.md — Stakeholder-Brief
  • 05-zero-knowledge-vorschlag.md — ZK-Bausteine (Phase 2+)
  • 06-offene-punkte.md — Phase-1-Blocker (Mirror-Discovery, Lizenz, Anti-Sybil, GDPR-pro-Mirror)
  • ADRs: ADR-v2-0001 (Federation), ADR-v2-0002 (Vier Modi), ADR-v2-0003 (Aggregat-Key), ADR-v2-0004 (Lizenz + Audit-Log)