From e4641d1e717e179ef82fb13117d210f8e0df43ad Mon Sep 17 00:00:00 2001 From: Ben_Kosytorz Date: Thu, 24 Sep 2026 12:36:24 +0200 Subject: [PATCH] Docs: leech mode, no-warranty disclaimer, Rust type-safety standards --- AGENTS.md | 10 ++++++- documentation/ethos.md | 10 +++++-- documentation/ideen/architektur.md | 13 +++++++++ documentation/ideen/recht.md | 7 ++++- server/README.md | 45 +++++++++++++++++++++++++++++- 5 files changed, 80 insertions(+), 5 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index dc585f7..cd06839 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,6 +24,13 @@ Das Projekt besteht aus zwei Hälften: - Code-Lizenz: AGPL-3.0 (passt zum Ethos; `freenet-core` ist ebenfalls AGPL-3.0) - Keine Secrets ins Repo (Passwörter, Token, private IP-Listen realer Nachbarn) - Persönliche Daten von Nachbarn (Namen, Adressen) bleiben außerhalb des Repos +- **Keine Garantie:** Die Software wird ohne jegliche Garantie bereitgestellt + (AGPL §§ 15/16) und muss überall prominent so gekennzeichnet sein — Nutzung + auf eigene Verantwortung der Nutzer:innen, wir übernehmen keine Haftung + für die Verwendung. +- **Maximale Type-Safety in Rust** (Details in `server/README.md`): kein + `unsafe` (`#![forbid(unsafe_code)]`), Newtypes statt roher Primitive, + exhaustive Enums/Match, keine `unwrap()`/`expect()` in nicht-Test-Code. ## Server (geplant) @@ -33,7 +40,8 @@ Das Projekt besteht aus zwei Hälften: und Apps. Wichtig: Freenet bietet **keine Anonymität** (klar im [FAQ](https://freenet.org/about/faq/) benannt) — nicht damit werben. - Kernfeatures: Multi-Exit-Bandbreiten-Pooling, segmentierte Downloads, - Fairness-Scheduler, Nachbarschafts-Cache + Fairness-Scheduler, Nachbarschafts-Cache, **Leech-Modus** (Empfangen ohne + Exit-Bereitstellung ist ausdrücklich erlaubt — Netz unter Nachbarn) - Status: Konzeptphase, Details in `server/README.md` ## Git / Gitea diff --git a/documentation/ethos.md b/documentation/ethos.md index 37ec210..c484ee9 100644 --- a/documentation/ethos.md +++ b/documentation/ethos.md @@ -17,8 +17,14 @@ der Fairness-Scheduler (siehe Architektur) ist unsere Währung. Jeder Haushalt bekommt standardmäßig einen gleichberechtigten, fairen Anteil (max-min Fairness). Stärkere Anschlüsse teilen freiwillig — genau das ist der "anarcho-kommunistische" Kern: voneinander abhängig, freiwillig, ohne Zwang -und ohne Markt. Dauernutzung ohne Gegenleistung wird fair gedealt (Gespräch, -Karma, Drosselung als letztes Mittel) — nicht bestraft. +und ohne Markt. + +**Leechen ist erlaubt.** Wer nichts beiträgt (kein Exit, kein Cache, +keine Faser), darf trotzdem empfangen — Nachbarschaftskultur ist Nachsicht, +nicht Gegenleistungszwang. Der Scheduler behandelt "Leeched" als niedrigste +Priorität bei Knappheit, aber nie als Strafe. Es gibt keine Bezahlung und +keine Pflicht zum Mitmachen; Andenken an Fairness ist Sache des Viertels, +nicht der Software. ## 3. Freiwilligkeit und Do-ocracy diff --git a/documentation/ideen/architektur.md b/documentation/ideen/architektur.md index a8d83c4..9409fd4 100644 --- a/documentation/ideen/architektur.md +++ b/documentation/ideen/architektur.md @@ -61,6 +61,19 @@ Jeder Haushalt bietet seinem Node an, wie viel Uplink er "spendiert" (Kontingent, standardmäßig fair-share). Der Exit-Pool ist die aggregierte Kapazität. Exit ist **opt-in pro Haushalt und jederzeit widerruflich**. +### Leech-Modus + +Wer seinen Uplink nicht teilen will (oder kann), schaltet Sharing einfach +aus und läuft im **Leech-Modus**: rein empfangen, nichts beitragen. Das ist +ausdrücklich legitim — "Netz unter Nachbarn" heißt Nachsicht, nicht +Gegenseitigkeitszwang. Technisch gilt: + +- Leeched Nodes bekommen im Fairness-Scheduler die niedrigste (aber + weiterhin faire) Priorität, wenn Kapazität knapp ist. +- Bei Überlast wird Leeched-Nodes zuerst gedrosselt, ohne sie auszuschließen. +- Der Status ist sichtbar (Karma/Anzeige), aber es gibt keine Strafe und + keine Zwangsfreischaltung. + ### Segmentierter Multi-Exit-Download (`aki-fetch`) ```mermaid diff --git a/documentation/ideen/recht.md b/documentation/ideen/recht.md index e40b9f0..2c75df6 100644 --- a/documentation/ideen/recht.md +++ b/documentation/ideen/recht.md @@ -85,7 +85,12 @@ Damit Agents und Developer das im Code umsetzen: -1. Exit ist opt-in, dokumentiert und jederzeit widerrufbar. +0. **Haftungsausschluss ist Pflicht:** Die Software wird ohne jegliche + Garantie ausgeliefert (AGPL §§ 15/16); README, Startup-Banner und UI + weisen klar darauf hin, dass wir keine Verantwortung für die Verwendung + übernehmen und Inhalte in der Verantwortung der Nutzer:innen liegen. +1. Exit ist opt-in, dokumentiert und jederzeit widerrufbar (Leech-Modus + ist immer möglich). 2. Node kann einzelne Teilnehmer/Segmente sperren (Sperrpflicht-Umsetzung). 3. Logs: minimal, lokal, keine Inhaltslogs. 4. Keine Funktion, deren alleiniger Zweck das Verstecken von Rechtsbrüchen ist. diff --git a/server/README.md b/server/README.md index fd738ad..c293140 100644 --- a/server/README.md +++ b/server/README.md @@ -3,6 +3,18 @@ Die Software, die aus "Nachbarschafts-LAN" ein gepooltes Bandbreitennetz macht. Sprache: **Rust**. Status: **Konzeptphase — noch nichts implementiert.** +## Haftungsausschluss (muss im Produkt sichtbar sein) + +> **KEINE GARANTIE.** Diese Software wird "as is" ohne jegliche Garantie +> bereitgestellt (AGPL §§ 15/16). Die Betreiber und Contributor:innen dieses +> Projekts übernehmen **keinerlei Verantwortung oder Haftung** dafür, wozu +> Nutzer:innen die Software verwenden oder welche Inhalte über sie übertragen +> werden. Die Verantwortung für gesendete und empfangene Inhalte liegt +> vollständig bei den Nutzer:innen. + +Dieser Hinweis muss prominent sichtbar sein: im README, im Startup-Banner +des Daemons und in der Weboberfläche. + ## Zielbild Pro Haushalt läuft ein AKI-Node (Mini-PC oder Einplatinenrechner), der: @@ -42,7 +54,38 @@ Kleinster brauchbarer Schnitt: - Keine Bezahl-/Krypto-Infrastruktur (Kontrast: Althea) - Keine Anonymitätsversprechen (Freenet selbst bietet keine; wir auch nicht) - Kein Zentralserver, keine zentrale Datensammlung -- Kein "Piracy as a Feature" (siehe `documentation/ideen/recht.md`) +- Keine inhaltliche Kontrolle oder Zensur durch die Software selbst — + die Software transportiert Dateien/Webseiten aller Art; was übertragen + wird, liegt in der Verantwortung der Nutzer:innen (Haftungsausschluss oben) + +## Code-Standards: maximale Type-Safety in Rust + +Der Code soll so sicher sein, dass ganze Fehlerklassen schon beim Kompilieren +unmöglich werden. Verbindliche Regeln für jede Crate in `server/`: + +1. **`#![forbid(unsafe_code)]`** in jedem Crate-Root (und `unwrap`, + `expect` nur in `#[cfg(test)]`-Kontext). +2. **Newtypes statt roher Primitive** für alles, was Bedeutung hat: + `struct NodeId(NonZeroU64)`, `struct BytesPerSecond(u64)`, + `struct SegmentIndex(u32)`, `struct ExitQuotaBytes(…)` — keine nackten + `u64`/`String` in Domänen-Typen. +3. **Exhaustive Enums statt Strings/Bool-Flags** für Zustände (z. B. + `enum ExitState { OptedIn(Quota), Leeching, Suspended }`), + `match` ohne `_`-Arm, damit Compiler-Checks beim Erweitern greifen. +4. **Typestate-Pattern** für Protokoll-/Lebenszyklus-Zustände (z. B. + `Download` → `Download` → `Download`), + damit illegale Zustandsübergänge nicht kompilieren. +5. **`TryFrom`/`TryInto` statt stiller Konvertierung**, keine panicking + Operationen in nicht-Test-Code; Fehler via `thiserror`-Enums, Bubble-up + statt Logging-and-continue. +6. **Parsed-data-is-validated:** unsichere Eingaben (Konfig, Netzwerk) werden + direkt beim Einlesen in validierte Typen transformiert; danach trägt der + Typ die Invariante (z. B. `struct ValidatedConfig(ConfigInner)` statt + `Config` mit Optionals). +7. **Keine globalen `Mutex`/`static mut`**; Shared State explizit als + Besitz-/Kanal-Struktur (`tokio::sync` primitives mit bewusster Wahl). +8. `deny(clippy::all, clippy::pedantic)`-basierte CI-Checks, sobald + Code existiert; `cargo-deny` für Dependencies. ## Technologiestack (Vorschlag)