# DH-005/006 — experimentelle öffentliche Snapshot-Synchronisierung 25. Oktober 2026. **Implementierter, explizit aktivierter Public-Transport**; kein stabiler Standard, kein privates Remote-Repository, keine Produktionsfreigabe. Der Dateiname bleibt für bestehende Dokumentlinks erhalten. ## Aktivierung und Identität `public-init --dest NEWDIR --name NAME --owner-key BASE64URL --origin ORIGIN --allow-public` erzeugt einen neuen, getrennten öffentlichen Speicher. `serve --public-sync DIR --public-origin ORIGIN` aktiviert dessen Routen. Ohne diese Flags bleiben sie deaktiviert. Private Registry und vorhandene lokale `.dh`-Repos werden niemals automatisch angebunden. `dh.public-repository/1` enthält schema/repo/name/owner/visibility. Repo-ID: `dh:repo:` + lowercase hex SHA256 der Bytes `decentralhub/public-sync/repo/v1\0` || OwnerPublic32 || `\0` || UTF8(Name). Dies ist nicht die Legacy-DDP-ID; signierte Discovery-Bindings fehlen noch. Der konfigurierte Owner ist die Autorität. Clients pinnen Owner und Origin, nach der Bindung auch die vollständige Repo-Konfiguration. Keine Redirects, keine Environment-Proxies. HTTPS außer ausdrücklich angesprochenem Loopback. ## Request-Protokoll Präfix `/experimental/sync/v1`: | Methode / Pfad | Funktion | |---|---| | GET `/info`, `/ref`, `/objects/{sha256hex}` | Öffentliche Konfiguration, Ref, vollständiges DOP-Objekt | | POST `/challenge` | Request-gebundene kurzlebige Challenge | | POST `/upload/start` | Sitzung mit Objekt-ID, exakter Größe, Delegationsbindung | | PUT `/upload/{token}/chunk` | Exakter Offset und höchstens 256 KiB Daten | | POST `/upload/{token}/finish` | DOP-Hash prüfen, Objekt unveränderlich installieren | | POST `/ref` | Graphprüfung und Fast-forward-CAS mit ExpectedHead/ExpectedRevision | Writes verwenden `{delegation,proof,payload}`, kanonisches JSON, maximal 1 MiB. DIP bindet Origin, Audience `decentralhub-public-sync-v1`, Repo, serverseitig festgelegtes Schreibrecht, Methode, Target, exakte Payload-Bytes, Nonce und Ablauf. Keine Querystrings oder unbekannten Felder. Persistierte Widerrufe werden bei jeder Autorisierung unter Prozesslock geprüft. Nonces sind instanzlokal: Nach Neustart oder bei anderer Instanz sind alte Proofs unbekannt und werden abgewiesen. Ein bereits autorisierter Write darf nach einem späteren Widerruf noch abschließen. Maximal vier Uploads, 300 Sekunden Inaktivitätsfrist, 32 MiB Blob, 4 MiB Metadaten, 10.000 Objekte einschließlich reservierter Uploadplätze und 512 MiB einschließlich Uploadreservierungen. Ein erneutes Start für dasselbe Objekt und dieselbe Delegation liefert Token und bestätigten Offset; Chunks sind fortsetzbar. File-Sync erfolgt vor persistiertem Offset. Open räumt ausschließlich bekannte, unindexierte Rückstände im dedizierten Speicher auf; indexierte Objekte bleiben. Graphgrenzen: 256 lineare Commits, Baumtiefe 64, 16 MiB Metadaten, 100.000 Expansionsschritte, portable reguläre Dateien. `.git`, `.dh` und der bekannte private Decentralhub-Schlüsseldateiname `identity.key` sind auch verschachtelt und unabhängig von Großschreibung verboten. Schlüssel außerhalb des Quellprojekts aufbewahren oder vor einem neuen Snapshot explizit ignorieren; dies ist kein allgemeiner Secret-Scanner. Jeder eindeutige Blob wird je Graphprüfung einmal gelesen/gehasht. Merge-Commits werden abgelehnt. Der v1-Import lehnt ausführbare Modi ab, weil v1 sie nicht erhalten kann. HTTP: acht parallele Requests, zwei große Objekt-Reads; pro Minute 8192 IP-Einheiten und 32768 globale Einheiten. Requests kosten eine Einheit, Ref-Writes 128, Objekt-Reads zusätzlich eine je volle 256 KiB. Das begrenzt auch Bytes, ohne kleine Quellcodedateien pauschal wie große Blobs zu behandeln. 429 enthält Retry-After. Clients warten kontextgebunden höchstens 60 Sekunden je Retry; GETs werden wiederholt, Writes erhalten eine frische Challenge. Ungewisse 503-Writes werden nicht blind wiederholt. CLI-Gesamtdeadline: 30 Minuten, mit `--timeout` einstellbar bis 24 Stunden. Kein Produktions-DDoS-Schutz. ## Import-Provenienz Jeder DOP-Commit benötigt `dh.sync-import-attestation/1`. Feldreihenfolge: schema, repo, commit, imported_by, delegation, issued_at, signature. Ed25519-Signatur über `decentralhub/sync/import-attestation/v1\0` plus Go-JSON mit leerem signature-Feld; Signaturen und Keys in unpadded base64url. Das delegierte Gerät bindet den vollständigen Commit-Hash und Repository-Scope. `imported_by` ist die Root-ID und muss mit DOP author übereinstimmen. Das beweist den Importeur, **nicht ursprüngliche Code-Autorenschaft**. Zeitstempel sind Behauptungen, keine vertrauenswürdige Uhr. Historische Delegation wird zum behaupteten Importzeitpunkt geprüft; aktuelle Write-Rechte werden jetzt geprüft. Ein späterer Gerätewiderruf schreibt historische Signaturen nicht um. ## Veröffentlichung und native Brücke Alle hochgeladenen Objekte sind sofort öffentlich lesbar, auch nach gescheitertem Ref-CAS. Jeder Push benötigt `--allow-public`. Der erste Push benötigt zusätzlich `--snapshot-only`: Nur der aktuelle Snapshot wird neue DOP-Wurzel; alte private Historie bleibt lokal. Der komplette ausgewählte Graph wird lokal validiert, bevor ein Upload beginnt. Die CLI zeigt alle ausgewählten historischen Pfade, Snapshot-IDs und die Unwiderruflichkeit der Veröffentlichung. Kein automatisches DDP-Publish oder MCP-Event. Bereits replizierte Inhalte sind nicht rückrufbar. `.dh/public-sync/` enthält Cache, Prozesslock und atomaren Zustand `dh.public-bridge/1`. DOP→v1-Mapping erhält dieselben Eltern-IDs über Clone→lokalen Commit→Push hinweg. Bestehende v1-Bytes werden nicht migriert. `BaseRemote/BaseRevision/BaseLocal` beschreibt den angewandten/bestätigten Stand; `Fetched` ist separat der zuletzt geprüfte Remote-Stand. - Fetch prüft/cacht den vollständigen Graphen, bewegt weder HEAD noch Base. Rollback und divergierende Remote-Historie werden abgewiesen. - Push konvertiert nur Nachfahren der Base und persistiert genaue IDs/Signaturen als Pending-Intent vor Upload. Retry verwendet diesen Intent, auch nach weiterer lokaler Arbeit. Verlorene ACKs werden über Ziel-Ref oder geprüfte Nachfahren erkannt. Fremde Divergenz bleibt Konflikt, niemals Last-Writer-Wins. - Pull verlangt lokale HEAD=Base. Erst stagen, dann Mapping/Pending speichern, lokalen HEAD per CAS bewegen, danach Base bestätigen. Wiederaufnahme prüft exakt passenden Pending-HEAD. **Arbeitsdateien bleiben unverändert**; `export --dest NEWDIR` materialisiert einen Snapshot ausdrücklich. - Clone prüft in einem temporären Nachbarverzeichnis, exportiert in ein neues Ziel und hängt dann die lokalen Metadaten an. Vorhandene Ziele werden abgewiesen. Fehler nach Export können ein gültiges unversioniertes Ziel hinterlassen; dieses wird gemeldet und nicht gelöscht. Clone ist nicht powerloss-atomar. - `sync-abort` verwirft den lokalen Push-Retry-Intent auch offline nach Pinprüfung. Native Historie/Cache bleiben, öffentliche Daten werden nicht zurückgerufen. Divergenz kann über einen frischen Clone und bewusste eigene Änderungen gelöst werden; ein automatischer Merge ist nicht implementiert. Cache-/Repo-GC und unbegrenzte Historien fehlen. Grenzen erzeugen Fehler statt Datenverlust. Linux File-/Directory-Sync und OS-Prozesslocks werden genutzt; Windows Directory-Powerloss-Durability und echte Windows-E2E bleiben offen. Privilegierter vollständiger Filesystem-Rollback ist ohne externen monotonen Anker nicht erkennbar; lokale Dateisystemadministration ist vertrauenswürdig. ## CLI und verbleibende Gates `init --data OWNER` und separat `init --data DEVICE` erstellen experimentelle Schlüsseldateien, keinen OS-Keystore. `identity-public --data DIR` zeigt den öffentlichen Key. `delegate --data OWNER --device-key PUB --repo ID --dest CERT` erstellt eine zeitlich begrenzte Read/Write-Delegation. Der Owner-Privatschlüssel wird nie zum Node übertragen. `revoke --data OWNER --delegation CERT --public-sync STORE --origin ORIGIN` persistiert den signierten Widerruf. Clientbefehle brauchen `--origin ORIGIN --owner-key TRUSTED_PUBLIC`: `public-preview --workdir DIR --device-data DEVICE --delegation CERT --allow-public --snapshot-only` friert beim ersten Mal einen lokalen signierten Pushintent ein (später ohne snapshot-only). Die CLI liest die gepinnte öffentliche Remoteconfig; die Preview-Bibliotheksmethode führt keine Netzoperation aus. Die vollständige JSON-Vorschau enthält Ziel/Owner/Repo, Source-HEAD, Objekt-IDs, alle ausgewählten historischen Pfade, Commitnachrichten/-zeiten/-Autoren und Importmetadaten. Erst nach inhaltlicher Prüfung: `push --workdir DIR --device-data DEVICE --delegation CERT --allow-public --expected-exposure REVIEWED_DIGEST` (initial zusätzlich `--snapshot-only`). Ohne exakt gebundenen Digest wird CLI-Push vor dem Connect abgelehnt; der Bibliothekspfad vergleicht den Digest vor Reference/Upload. Geändertes Source-HEAD verlangt Abort und neue Vorschau. Ein abgebrochener Intent kann durch den alten Digest nicht automatisch neu erstellt werden. Preview erzeugt lokale Cache-/ Intentdateien, ist also nicht schreibfrei; `sync-abort` verwirft den lokalen Intent, kann aber schon öffentlich hochgeladene Bytes nicht zurückrufen. Details: [Exposurevertrag](../docs/PUBLIC_EXPOSURE.md). Weitere Befehle: `clone --dest NEWDIR`, `fetch --workdir DIR`, `pull --workdir DIR`, `sync-abort --workdir DIR`. Private E2EE-History ist ein getrenntes experimentelles Modul mit eigener CLI ([Private Sync](../docs/PRIVATE_SYNC_CLI.md)); dieser Publicpfad bleibt öffentlich. Intranet-/Unlisted-Produktmodi, vollständige Gruppenrollen, OS-Keystore, Identity-Recovery, automatische Offline-Queue und Merge/Apply bleiben eigene Gates. Exposure.visibility ist ausschließlich public, discovery bleibt false; Metadatenwerbung benötigt weiterhin eine separate ausdrückliche Aktion. Echte Windows-Läufe und unabhängiges Audit werden nicht durch Fixturetests ersetzt. Keine private Registry-Veröffentlichung durch dieses Modul.