Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,25 @@ Alternativ über `.env`:
ROUTEFORGE_DEMO_MODE=true
```

## Alpha Demo Flow

1. Demo-Modus starten (`ROUTEFORGE_DEMO_MODE=true`).
2. ASN Check ausführen.
3. ASN-RPKI-Batchprüfung starten.
4. Prefix + Origin-AS prüfen.
5. Gesamtbewertung und Einzelprüfungen lesen.
6. Markdown Report kopieren.

## Bekannte Einschränkungen

- RIPEstat-/Whois-Strukturen können je nach Antwort variieren.
- Der Registry/IRR Check ist eine Plausibilitätsprüfung und keine autoritative Entscheidung.
- Der Demo-Modus nutzt feste Beispieldaten.
- RouteForge arbeitet vollständig read-only (keine Schreibzugriffe).
- Es gibt noch keinen lokalen RPKI Validator.
- RIPE Atlas Messungen sind noch nicht integriert.
- Eine historische Trendanalyse ist noch nicht enthalten.

## Tests ausführen

Backend:
Expand Down
63 changes: 63 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Release Notes: v0.1.0-alpha

## Überblick

RouteForge v0.1.0-alpha ist ein selfhosted, read-only Preflight- und Explainability-Tool für BGP/RPKI/RIPE-nahe Prüfabläufe.
Diese Alpha-Version ist für Demos, frühes Feedback und nachvollziehbare Erstbewertungen gedacht.

## Enthaltene Funktionen

- ASN Check (inkl. Prefix-Extraktion aus sichtbaren Ankündigungen)
- Prefix Check mit optionalem Origin-AS
- RPKI Einzelprüfung im Prefix-Check
- ASN-RPKI-Batchprüfung für sichtbare Prefixe
- Registry/IRR-Plausibilitätscheck
- Kombinierte Prefix-Gesamtbewertung mit Einzelprüfungen
- Reports in JSON, Markdown und HTML
- Demo-Modus mit festen Beispieldaten
- Robuste Parser und CI-Basis

## Nicht enthalten

- Keine neuen externen Datenquellen
- Keine Schreibzugriffe auf Registries/IRR-Systeme
- Keine ROA-Erstellung
- Kein Router-Deployment
- Keine EVPN/VXLAN-Funktionalität
- Keine große Refaktorierung bestehender Endpoints

## Read-only Sicherheitsmodell

RouteForge arbeitet in v0.1.0-alpha vollständig read-only.
Das Tool sammelt, normalisiert und bewertet Daten, nimmt aber keine operativen Änderungen an Routing-Infrastruktur oder Registry-Systemen vor.

## Demo-Modus

Mit `ROUTEFORGE_DEMO_MODE=true` nutzt RouteForge feste Beispieldaten für reproduzierbare Vorführungen und Offline-Demos.
**Demo data, not for operational use.**

## Bekannte Einschränkungen

- RIPEstat-/Whois-Strukturen können variieren und unterschiedliche Detailgrade liefern.
- Registry/IRR Check ist eine Plausibilitätsprüfung, keine autoritative Entscheidung.
- Demo-Modus nutzt feste Beispieldaten und ist nicht für operative Entscheidungen geeignet.
- Keine Schreibzugriffe (read-only by design).
- Kein lokaler RPKI Validator enthalten.
- Noch keine RIPE Atlas Messungen.
- Noch keine historische Trendanalyse.

## Beispielablauf

1. RouteForge im Demo-Modus starten.
2. ASN Check für eine Beispiel-ASN ausführen.
3. ASN-RPKI-Batchprüfung der sichtbaren Prefixe starten.
4. Prefix + Origin-AS einzeln prüfen.
5. Gesamtbewertung und Einzelprüfungen vergleichen.
6. Markdown-Report kopieren und im Team teilen.

## Nächste geplante Schritte

- Dokumentation und Demo-Artefakte weiter schärfen.
- UI-Microcopy für technische Zielgruppen weiter vereinfachen.
- Weitere Beispielreports für typische Warn-/Unknown-Szenarien ergänzen.
- Stabilität, Testabdeckung und Präsentationsreife vor breiterem Alpha-Feedback erhöhen.
17 changes: 17 additions & 0 deletions docs/screenshots/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Screenshot Plan for Alpha Demo

Dieses Verzeichnis enthält die geplanten Screenshots für die Alpha-Demo-Dokumentation.
Aktuell werden nur Struktur und Zielmotive vorbereitet (keine Bilddateien enthalten).

## Gewünschte Screenshots

- `start-page.png`
Startansicht mit Navigation und kurzer Tool-Einordnung.
- `asn-check.png`
ASN Check Formular mit ausgefülltem Beispiel und Ergebnisbereich.
- `asn-rpki-batch.png`
ASN-RPKI-Batchprüfung mit Summary und sortierten Einzelresultaten.
- `prefix-overall-evaluation.png`
Prefix-Check mit kombinierter Gesamtbewertung plus Einzelprüfungen.
- `demo-mode-banner.png`
Sichtbarer Hinweistext, dass Demo-Modus aktiv ist und feste Daten genutzt werden.
32 changes: 32 additions & 0 deletions examples/reports/asn-rpki-batch-demo-example.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# ASN-RPKI Batch Demo Report Example

> Demo data, not for operational use.

## Input

- ASN: `AS64501`
- Batch limit: `25`
- Mode: Demo

## Batch summary

- Checked prefixes: `8`
- Prefixes seen: `8`
- valid: `5`
- invalid_asn: `1`
- invalid_length: `1`
- unknown: `1`
- errors: `0`

## Interpretation

- Majority valid indicates baseline ROA coverage exists.
- `invalid_asn` indicates at least one prefix appears with a non-authorized origin.
- `invalid_length` indicates a max-length mismatch risk.
- `unknown` means no conclusive validation result was available for that prefix.

## Follow-up actions

1. Review invalid entries first (`invalid_asn`, `invalid_length`).
2. Confirm announcements against intended origin policy.
3. Treat unknown results as investigation backlog, not immediate acceptance.
28 changes: 28 additions & 0 deletions examples/reports/prefix-valid-warning-example.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Prefix Report Example: valid + warning context

> Demo data, not for operational use.

## Input

- Prefix: `203.0.113.0/24`
- Origin-AS: `AS64500`
- Mode: Demo

## Result overview

- Overall status: `WARNING`
- RPKI check: `OK` (`valid`)
- Registry/IRR plausibility check: `WARNING`

## Why this can happen

The prefix can be RPKI-valid while Registry/IRR signals are incomplete or ambiguous.
In this demo case, route object hints are not strong enough for a confident positive assessment.

## Operator note

Use this as a triage signal:

1. Confirm route/route6 object status in authoritative tooling.
2. Confirm Origin-AS intent with current policy/process.
3. Keep RPKI and Registry results separate when communicating risk.
4 changes: 2 additions & 2 deletions frontend/src/components/AsnCheckForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export function AsnCheckForm() {
<input className='border p-2 w-full' placeholder='AS3320' value={asn} onChange={e => setAsn(e.target.value)} />
<button disabled={loading} className='mt-2 px-3 py-2 bg-blue-600 text-white rounded' onClick={onSubmit}>Prüfen</button>
{loading && <p className='mt-3 text-sm text-slate-700'>Prüfung läuft ...</p>}
{result && <p className='mt-2 text-sm text-slate-700'>ASN wurde geprüft. Für ASN allein ist RPKI nicht direkt anwendbar.</p>}
{result && <p className='mt-2 text-sm text-slate-700'>ASN wurde geprüft. Die RPKI-Bewertung erfolgt für die sichtbaren Prefixe der ASN.</p>}
{result && <p className='mt-1 text-sm text-slate-700'>Extrahierte Prefixe: {extractedPrefixes.length}</p>}
{result && extractedPrefixes.length > 0 && (
<button disabled={batchLoading} className='mt-2 ml-2 px-3 py-2 bg-indigo-600 text-white rounded' onClick={onBatchRpki}>RPKI für sichtbare Prefixe prüfen</button>
Expand All @@ -54,7 +54,7 @@ export function AsnCheckForm() {
{error && <div className='mt-3 p-3 rounded border border-red-300 bg-red-50 text-red-800'><p className='font-semibold'>Die Prüfung konnte nicht ausgeführt werden.</p><p className='text-sm mt-1'>{error.message}</p></div>}
{result && <div className='mt-4'><ReportView report={result} /></div>}
{batchResult && <div className='mt-4'>
<h3 className='text-md font-bold mb-2'>Batchprüfungsergebnis</h3>
<h3 className='text-md font-bold mb-2'>ASN-RPKI-Batchergebnis</h3>
<ReportView report={batchResult} />
</div>}
</div>
Expand Down
10 changes: 5 additions & 5 deletions frontend/src/components/ReportView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ export function ReportView({ report }: { report: CheckResponse }) {
{recs.length > 0 ? <ul className='list-disc pl-5'>{recs.map((r, i) => <li key={`${r}-${i}`}>{r}</li>)}</ul> : <p>Keine Empfehlungen verfügbar.</p>}

{hasAnyChecks && <h4 className='font-semibold mt-4'>Gesamtbewertung</h4>}
{hasAnyChecks && <p className='mt-1 text-sm text-gray-700'>Oben siehst du den kombinierten Status aus RPKI und Registry/IRR.</p>}
{hasAnyChecks && <p className='mt-1 text-sm text-gray-700'>Der kombinierte Status fasst RPKI und Registry/IRR nachvollziehbar zusammen.</p>}

<h4 className='font-semibold mt-4'>Einzelprüfungen</h4>
{hasAnyChecks ? <div className='mt-2 space-y-3'>
{rpki && <div className='border rounded p-3'>
<div className='flex items-center gap-2'><span className='font-semibold'>RPKI</span><StatusBadge status={rpki?.status || 'UNKNOWN'} /></div>
<p className='mt-2'><strong>Summary:</strong> {rpki?.summary || '-'}</p>
<p className='mt-2'><strong>Kurzfassung:</strong> {rpki?.summary || '-'}</p>
<p className='mt-1'><strong>Erklärung:</strong> {rpki?.explanation || '-'}</p>
<p className='mt-1'><strong>Risiko:</strong> {rpki?.risk || '-'}</p>
<details className='mt-2'>
Expand All @@ -47,7 +47,7 @@ export function ReportView({ report }: { report: CheckResponse }) {
</div>}
{registry && <div className='border rounded p-3'>
<div className='flex items-center gap-2'><span className='font-semibold'>Registry/IRR</span><StatusBadge status={registry?.status || 'UNKNOWN'} /></div>
<p className='mt-2'><strong>Summary:</strong> {registry?.summary || '-'}</p>
<p className='mt-2'><strong>Kurzfassung:</strong> {registry?.summary || '-'}</p>
<p className='mt-1'><strong>Erklärung:</strong> {registry?.explanation || '-'}</p>
<p className='mt-1'><strong>Risiko:</strong> {registry?.risk || '-'}</p>
<details className='mt-2'>
Expand All @@ -57,7 +57,7 @@ export function ReportView({ report }: { report: CheckResponse }) {
</div>}
</div> : <p className='mt-2'>Für diesen Check-Typ sind keine Einzelprüfungen verfügbar.</p>}

{rpkiSummary && <div className='mt-4 border rounded p-3'><h4 className='font-semibold'>ASN-RPKI Summary</h4>
{rpkiSummary && <div className='mt-4 border rounded p-3'><h4 className='font-semibold'>ASN-RPKI Zusammenfassung</h4>
<p className='text-sm mt-1'>geprüft: {checkedPrefixes} / gesehen: {totalPrefixesSeen}</p>
{limited && <p className='text-sm text-amber-700'>Hinweis: Ergebnis wurde durch das gesetzte Limit begrenzt.</p>}
<ul className='list-disc pl-5 text-sm'>
Expand All @@ -78,7 +78,7 @@ export function ReportView({ report }: { report: CheckResponse }) {
</ul>
</div>}

<button className='mt-4 px-3 py-2 border rounded' onClick={() => navigator.clipboard.writeText(report.markdown)}>Markdown kopieren</button>
<button className='mt-4 px-3 py-2 border rounded' onClick={() => navigator.clipboard.writeText(report.markdown)}>Markdown-Report kopieren</button>
<RawDataPanel data={report.details} />
</div>
}
Loading