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 Scope | Out of Scope (Phase 2/3) |
|---|---|
| Track A — Registry-Scraping (npm, PyPI, Maven Central, crates.io, Go mod) + GitHub-Manifest-Crawl | Endnutzer-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 Log | Mix-Net-Submission, Threshold-Decryption |
| Dokumentations- und Federation-Registry-Skelett | finale 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#
| Registry | Top-Liste (Discovery) | Paket-/Dependency-Quelle | Frequenz |
|---|---|---|---|
| npm | kuratierter In-Tree-Seed (src/scraper/.../seeds/npm.json) | https://registry.npmjs.org/<name>/latest | täglich |
| PyPI | https://hugovk.dev/top-pypi-packages/top-pypi-packages.min.json | https://pypi.org/pypi/<name>/json | täglich |
| Maven Central | https://search.maven.org/solrsearch/select?q=*:* (Solr cappt rows≤200) | Dependencies aus POM-XML: https://repo1.maven.org/maven2/<g>/<a>/<v>/<a>-<v>.pom | täglich |
| crates.io | https://crates.io/api/v1/crates?sort=downloads | https://crates.io/api/v1/crates/<name> | täglich |
| Go modules | kuratierter In-Tree-Seed (src/scraper/.../seeds/golang.json) | https://proxy.golang.org/<module>/@latest | täglich |
| GitHub Manifest-Crawl | Top-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/indexist 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 vonrepo1.maven.orggeholt und mitdefusedxmlgeparst 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#
| Event | Trigger | Cohort-Mapping |
|---|---|---|
install | Modul-Load erstmals im Prozess | install-count |
session-start | Erste Funktions-Nutzung im Prozess | rt-runtime-mins (Zähler-Start) |
runtime-tick | alle 5 min, solange Lib genutzt | aktualisiert rt-runtime-mins-Band |
feature-flag | optionale 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:
| Band | Bedeutung |
|---|---|
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-Definition | wird im Federation-Standard publiziert |
4. Bootstrap-Mirror#
Phase-1-Konfiguration: Single-Node, EU-gehostet, Apache-2.0-Open-Source-Stack.
| Komponente | Stack |
|---|---|
| Aggregate-Store | ClickHouse 24+ Single-Node (oder TimescaleDB-Equivalent) |
| Submission-API | Rust/Go/Python — empfohlen FastAPI oder axum |
| Public Audit Log | Sigstore Rekor (selbst-gehostete Instanz) |
| Snapshot-Generator | Tägliche Parquet- + CSV.gz-Erzeugung um 00:00 UTC |
| Open Data API | REST + GraphQL, keine Auth |
| Federation-Registry-Eintrag | Eintrag in mirrors.json (zentrales Bootstrap-Repo) |
| Lokale Compose-Variante | docker compose up für reproduzierbare Forschungs-Setups |
5. Erfolgskriterien K1–K7#
| ID | Kriterium | Messung |
|---|---|---|
| K1 | Reach-Discovery: Top-1000-OSS-Pakete pro Registry werden in Track A ≥ 95 % erfasst | täglicher Sampling-Check gegen npm/PyPI/Maven-Listen |
| K2 | False-Positive-Rate <unclassified>: ≤ 5 % der erfassten Dep-Edges bleiben ohne project_id-Auflösung (PURL-Match) | Validator gegen PURL-Standard |
| K3 | Schema-Reject PII: Track A und Track B liefern 0 Submissions mit PII-Feldern. Backend-Schema lehnt Versuche aktiv ab | Negativ-Test mit absichtlichen PII-Payloads, Mirror-Reject erwartet |
| K4 | k-Anon-Wirkung Track B: keine cohort_id mit unique_sessions < 5 (Default) im Open-Data-Snapshot | Sample-Audit nach Snapshot-Erzeugung |
| K5 | Verfügbarkeit & Resilienz: Mirror-Ausfall 30 min → 0 Datenverlust (SDK puffert lokal, retransmit; Scraper idempotent) | Chaos-Test im Staging |
| K6 | Open 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 |
| K7 | SDK-Footprint: Track-B-SDK verbraucht im Steady-State < 5 ms CPU/h, < 2 MB RAM in einem Node.js-/Python-Prozess | Profiler-Run pro CI-Build |
6. Sprint-Plan (10 Wochen, vorläufig)#
| Sprint | Wochen | Fokus |
|---|---|---|
| 1 | 1–2 | Federation-Registry-Skelett (mirrors.json mit einem Eintrag), Submission-Protokoll-Spec, Reference-Mirror-Stub |
| 2 | 3–4 | Track A: Scraper-Cores (npm + PyPI), Aggregate-Store, ein erster Snapshot |
| 3 | 5–6 | Track A: Maven + crates + Go, GitHub-Manifest-Crawl, K1-Check |
| 4 | 7–8 | Track B: JS-SDK, Python-SDK, Banding, Submission-Roundtrip, K4-Check |
| 5 | 9–10 | Open 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 v203-risikoprofil.md— Phase-1-relevante Risiken (D-2-1, M-2-1, M-2-2 priorisiert)04-executive-summary.md— Stakeholder-Brief05-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)