Vault-Synchronisation — Feature-Epic #76

Closed
opened 2026-10-18 14:18:07 +00:00 by alf · 65 comments
Owner

Vault-Synchronisation über ein gemeinsames Forgejo-Repo. Plan: obsidian-docs/plans/VAULT-SYNC.md (Iris-Vault-Ordner).

Architektur

Sync-Logik auf den Servern (Mac-Server + Linux-Server), GUI auf allen Clients (Iris, IrisClient, IrisRemote). Byte-identisches Wire-Protokoll. Mechanisch, kein LLM.

Grundregeln

  • Merge statt Rebase (ein Konflikt pro Sync, ours = lokales Vault).
  • Eine Sperre für Fetch, Merge, Push, Commit-Wächter und Job-Hook; paralleler Sync-Aufruf → 409 busy.
  • Der Vault bleibt immer sauber: bei Konflikt wird der Merge abgebrochen (merge --abort), Status conflict, der Job läuft trotzdem. Kein Push solange conflict.
  • Nie --force, nie Dateien überschreiben.

Wire-Protokoll (neue Routen /vault/sync/*, Bearer-Auth)

  • GET status → {has_git, has_remote, sync_state, ahead, behind, conflict_count, last_sync_at, lfs_available, error?}
  • POST pull / POST push → manuell
  • GET conflicts → base/ours/theirs aus Commits (git show), nicht aus dem Working Tree
  • POST resolve → Wahl pro Pfad (ours|theirs|merged); Merge läuft, sobald alle Pfade eine Wahl haben
  • POST forge/login → Anmeldung am Forgejo mit Benutzer + Passwort (Token wird einmalig erzeugt, nur im Speicher), antwortet mit der Repository-Liste; POST forge/create → neues privates Repository
  • POST configure → „Vault verbinden“: Body {remote_url, username, token} oder {remote_url, use_login: true}; Klon, Union (nie überschreiben, Kollisionen werden gemeldet), Veröffentlichen oder nur Zugangsdaten aktualisieren
  • GET events (SSE) → live Status

sync_state: not_configured | no_remote | synced | syncing | offline | pending | conflict | error

Sync-Trigger (serverseitig)

  • Job-Start: commit → Reachability (gecacht) → online: fetch + Merge / offline: überspringen
  • Job-Ende (nach dem Hook-Commit): push, bei Non-FF fetch + Merge + push, max. 3 Versuche
  • Änderungserkennung: git ls-remote alle 60 s (nur ausgehend, kein Webhook); bei geändertem Hash fetch + Merge, sobald der Vault sauber ist. Dieselbe Abfrage ist die Reachability-Probe.
  • Serverstart, Reconnect, manuell (GUI „Synchronisieren")

Zugangsdaten

Das Forgejo-Token liegt in einer 0600-Datei außerhalb des Vaults (Mac: Application Support/Iris, Linux: /data), git bekommt es pro Aufruf per GIT_CONFIG_* (http.<Server>.extraHeader). Nicht in .git/config, nicht im Vault-Backup, kein Keychain-Zugriff. Nur http(s), keine Zugangsdaten in der URL.

Stand (2026-10-20)

Gebaut und gemergt: Linux-Server und Mac-Server (Sync-Logik, Routen, configure), GUI in Iris, IrisClient und IrisRemote (Lampe, Konflikt-Dialog, Sheet „Vault verbinden“), die Verzweigung des Vault-Schritts im Onboarding und die Wire-Doku. Details und Prüfstand: Plan VAULT-SYNC.md, Abschnitt „Stand der Umsetzung“. Nur lokal mit echtem git getestet; weder gegen echtes Forgejo über HTTP noch mit dem Notebook als zweitem Peer.

Bestehende Bausteine, die sich ändern

  • Bundled Job-Hook committet nur noch; Push-Logik wird entfernt/migriert (sonst doppelter Push)
  • Rollback (/vault/git/reset-hard) wird mit Remote ein neuer Commit
  • /vault/git/init darf auf einem geklonten Vault nicht mehr laufen
  • Linux-Server: git-lfs ins Image, _attachments/ wird LFS-getrackt

Versionier-Scope

Nutzerinhalt + Obsidian-Konfiguration (.obsidian/*.json). Zustand pro Maschine bleibt draußen: .obsidian/workspace.json, .obsidian/plugins/, .claude/, .claudian/, .DS_Store. _attachments/ per LFS, Full-Clone.

Notebook-Bootstrap

git clone (mit LFS) in ein leeres Verzeichnis, nicht rsync: Das Linux-Vault hat eigene Historie und ließe sich nicht auf das Studio-Repo pushen.

Abnahmekriterien

  1. Bidirektional: Studio <-> Notebook, LFS-Anhänge auf beiden Seiten
  2. Server-Parität: gleiche GUI gegen Mac- und Linux-Server
  3. Offline: Job läuft sofort; Reconnect -> Auto-Sync
  4. Parallele Änderung: conflict, Vault sauber, Job läuft, Dialog mit 3 Optionen und 3-Wege-Diff; „Meine Version" = lokales Vault
  5. Während conflict keine Commits mit Konfliktmarkern; Rollback bleibt nach dem nächsten Sync erhalten
  6. Kein Jargon: Lampe + Synchronisieren + 3 Dialog-Optionen
  7. workspace.json/plugins/ einer Maschine beeinflussen die andere nicht
  8. Build: Alle drei Clients zeigen das Feature; Linux-Server pytest grün

Offene Punkte

  • iOS-Onboarding: „Aus Backup zurücklesen“ fehlt (IrisRemote hat keine Backup-Ansicht).
  • Onboarding-Verzweigung (Backup / Default-Vault / KI / Vault verbinden) ist in Mac-, Client- und iOS-Onboarding gebaut, aber nicht bedient.
  • Echter Durchlauf (Sandbox mit Test-Repo und zweitem Peer: Konflikte, Offline, LFS) und Paritätsprüfung Mac gegen Linux.
  • Schreibt der Vault-Editor beim Speichern eine zwischenzeitlich gepullte Fassung zurück? Prüfen.
  • Hook auf dem Studio enthält eigene Push-Logik des Nutzers: entfernen.
  • Studio-Vault hat noch ein Passwort in der Remote-URL: ablösen (Token, per „Vault verbinden“).
  • SSE statt Abfrage alle 10 s in den Clients.
  • Forgejo-Anmeldung (Token-Erzeugung mit Passwort, Zwei-Faktor-Header, Rechte) ist nur gegen eine Attrappe getestet.
  • Webhook als spätere Beschleunigung (Forgejo sperrt private Ziele per ALLOWED_HOST_LIST)
Vault-Synchronisation über ein gemeinsames Forgejo-Repo. Plan: `obsidian-docs/plans/VAULT-SYNC.md` (Iris-Vault-Ordner). ## Architektur Sync-Logik auf den Servern (Mac-Server + Linux-Server), GUI auf allen Clients (Iris, IrisClient, IrisRemote). Byte-identisches Wire-Protokoll. Mechanisch, kein LLM. ## Grundregeln - **Merge statt Rebase** (ein Konflikt pro Sync, `ours` = lokales Vault). - **Eine Sperre** für Fetch, Merge, Push, Commit-Wächter und Job-Hook; paralleler Sync-Aufruf → `409 busy`. - **Der Vault bleibt immer sauber:** bei Konflikt wird der Merge abgebrochen (`merge --abort`), Status `conflict`, der Job läuft trotzdem. Kein Push solange `conflict`. - Nie `--force`, nie Dateien überschreiben. ## Wire-Protokoll (neue Routen `/vault/sync/*`, Bearer-Auth) - `GET status` → `{has_git, has_remote, sync_state, ahead, behind, conflict_count, last_sync_at, lfs_available, error?}` - `POST pull` / `POST push` → manuell - `GET conflicts` → base/ours/theirs aus Commits (`git show`), nicht aus dem Working Tree - `POST resolve` → Wahl pro Pfad (`ours|theirs|merged`); Merge läuft, sobald alle Pfade eine Wahl haben - `POST forge/login` → Anmeldung am Forgejo mit Benutzer + Passwort (Token wird einmalig erzeugt, nur im Speicher), antwortet mit der Repository-Liste; `POST forge/create` → neues privates Repository - `POST configure` → „Vault verbinden“: Body `{remote_url, username, token}` oder `{remote_url, use_login: true}`; Klon, Union (nie überschreiben, Kollisionen werden gemeldet), Veröffentlichen oder nur Zugangsdaten aktualisieren - `GET events` (SSE) → live Status `sync_state`: `not_configured | no_remote | synced | syncing | offline | pending | conflict | error` ## Sync-Trigger (serverseitig) - **Job-Start:** commit → Reachability (gecacht) → online: fetch + Merge / offline: überspringen - **Job-Ende** (nach dem Hook-Commit): push, bei Non-FF fetch + Merge + push, max. 3 Versuche - **Änderungserkennung:** `git ls-remote` alle 60 s (nur ausgehend, kein Webhook); bei geändertem Hash fetch + Merge, sobald der Vault sauber ist. Dieselbe Abfrage ist die Reachability-Probe. - **Serverstart, Reconnect, manuell** (GUI „Synchronisieren") ## Zugangsdaten Das Forgejo-Token liegt in einer 0600-Datei **außerhalb des Vaults** (Mac: `Application Support/Iris`, Linux: `/data`), git bekommt es pro Aufruf per `GIT_CONFIG_*` (`http.<Server>.extraHeader`). Nicht in `.git/config`, nicht im Vault-Backup, kein Keychain-Zugriff. Nur http(s), keine Zugangsdaten in der URL. ## Stand (2026-10-20) Gebaut und gemergt: Linux-Server und Mac-Server (Sync-Logik, Routen, `configure`), GUI in Iris, IrisClient und IrisRemote (Lampe, Konflikt-Dialog, Sheet „Vault verbinden“), die Verzweigung des Vault-Schritts im Onboarding und die Wire-Doku. Details und Prüfstand: Plan `VAULT-SYNC.md`, Abschnitt „Stand der Umsetzung“. Nur lokal mit echtem git getestet; weder gegen echtes Forgejo über HTTP noch mit dem Notebook als zweitem Peer. ## Bestehende Bausteine, die sich ändern - Bundled Job-Hook committet nur noch; Push-Logik wird entfernt/migriert (sonst doppelter Push) - Rollback (`/vault/git/reset-hard`) wird mit Remote ein neuer Commit - `/vault/git/init` darf auf einem geklonten Vault nicht mehr laufen - Linux-Server: git-lfs ins Image, `_attachments/` wird LFS-getrackt ## Versionier-Scope Nutzerinhalt + Obsidian-Konfiguration (`.obsidian/*.json`). Zustand pro Maschine bleibt draußen: `.obsidian/workspace.json`, `.obsidian/plugins/`, `.claude/`, `.claudian/`, `.DS_Store`. `_attachments/` per LFS, Full-Clone. ## Notebook-Bootstrap `git clone` (mit LFS) in ein leeres Verzeichnis, nicht rsync: Das Linux-Vault hat eigene Historie und ließe sich nicht auf das Studio-Repo pushen. ## Abnahmekriterien 1. Bidirektional: Studio <-> Notebook, LFS-Anhänge auf beiden Seiten 2. Server-Parität: gleiche GUI gegen Mac- und Linux-Server 3. Offline: Job läuft sofort; Reconnect -> Auto-Sync 4. Parallele Änderung: `conflict`, Vault sauber, Job läuft, Dialog mit 3 Optionen und 3-Wege-Diff; „Meine Version" = lokales Vault 5. Während `conflict` keine Commits mit Konfliktmarkern; Rollback bleibt nach dem nächsten Sync erhalten 6. Kein Jargon: Lampe + Synchronisieren + 3 Dialog-Optionen 7. `workspace.json`/`plugins/` einer Maschine beeinflussen die andere nicht 8. Build: Alle drei Clients zeigen das Feature; Linux-Server `pytest` grün ## Offene Punkte - **iOS-Onboarding:** „Aus Backup zurücklesen“ fehlt (IrisRemote hat keine Backup-Ansicht). - Onboarding-Verzweigung (Backup / Default-Vault / KI / Vault verbinden) ist in Mac-, Client- und iOS-Onboarding gebaut, aber nicht bedient. - Echter Durchlauf (Sandbox mit Test-Repo und zweitem Peer: Konflikte, Offline, LFS) und Paritätsprüfung Mac gegen Linux. - Schreibt der Vault-Editor beim Speichern eine zwischenzeitlich gepullte Fassung zurück? Prüfen. - Hook auf dem Studio enthält eigene Push-Logik des Nutzers: entfernen. - Studio-Vault hat noch ein Passwort in der Remote-URL: ablösen (Token, per „Vault verbinden“). - SSE statt Abfrage alle 10 s in den Clients. - Forgejo-Anmeldung (Token-Erzeugung mit Passwort, Zwei-Faktor-Header, Rechte) ist nur gegen eine Attrappe getestet. - Webhook als spätere Beschleunigung (Forgejo sperrt private Ziele per `ALLOWED_HOST_LIST`)
Author
Owner

Plan-Stand 2026-10-19

Der Plan VAULT-SYNC.md liegt jetzt im Iris-Vault (plans/) und wurde gegen Code und Vault-Repo geprüft und überarbeitet. Die Beschreibung oben ist entsprechend nachgezogen.

Befund (im Code/Repo verifiziert)

  • .obsidian/ ist nicht komplett ignoriert: sechs Konfig-Dateien sind getrackt, ignoriert sind nur workspace.json und plugins/. Der Plan übernimmt jetzt den Ist-Stand.
  • Das Linux-Vault hat ein eigenes Repo mit eigener Historie (/vault/git/init). Ein rsync-Bootstrap ließe sich nicht auf das Studio-Repo pushen → Klon statt Kopie.
  • Der Wächter (add -A alle 30 s) würde in einem Rebase-Konflikt Konfliktmarker committen → ein Sperrmechanismus und ein Vault, das nie im Merge-Zustand bleibt.
  • Im Rebase sind :2:/:3: vertauscht (ours = Server), der Dialog wäre falsch beschriftet → Merge.
  • reset-hard würde vom nächsten Merge rückgängig gemacht → Rollback als neuer Commit.
  • Der Linux-Image hat git, aber kein git-lfs; _attachments/ ist dort ignoriert.
  • Das Passwort steht im Klartext in der Remote-URL → Forgejo-Token nur für dieses Repo.

Entscheidungen

  • Konflikt: Merge abbrechen, Vault bleibt sauber, Job läuft.
  • Merge statt Rebase.
  • .obsidian/*.json bleibt synchron, Zustand pro Maschine nicht.
  • Änderungserkennung per git ls-remote alle 60 s statt Webhook (Webhook-Erreichbarkeit der Server von Forgejo aus ist ein Problem; ausgehend funktioniert unterwegs und hinter NAT). Kein Fetch, nur ein Hash-Vergleich.
  • Arbeit in diesem einen Issue, jeder Schritt ein Kommentar.

Neu im Wire-Protokoll: sync_state syncing und error, 409 busy, POST resolve pro Pfad.

Offen: siehe Beschreibung (Konflikt-Dialog-Design, iOS-Routen, Editor-Überschreiben, Hook-Migration, optionaler Webhook).

Noch nichts gebaut. Nächster Schritt: Phase 1 auf dem Linux-Server.

## Plan-Stand 2026-10-19 Der Plan `VAULT-SYNC.md` liegt jetzt im Iris-Vault (`plans/`) und wurde gegen Code und Vault-Repo geprüft und überarbeitet. Die Beschreibung oben ist entsprechend nachgezogen. **Befund (im Code/Repo verifiziert)** - `.obsidian/` ist nicht komplett ignoriert: sechs Konfig-Dateien sind getrackt, ignoriert sind nur `workspace.json` und `plugins/`. Der Plan übernimmt jetzt den Ist-Stand. - Das Linux-Vault hat ein eigenes Repo mit eigener Historie (`/vault/git/init`). Ein rsync-Bootstrap ließe sich nicht auf das Studio-Repo pushen → Klon statt Kopie. - Der Wächter (`add -A` alle 30 s) würde in einem Rebase-Konflikt Konfliktmarker committen → ein Sperrmechanismus und ein Vault, das nie im Merge-Zustand bleibt. - Im Rebase sind `:2:`/`:3:` vertauscht (ours = Server), der Dialog wäre falsch beschriftet → Merge. - `reset-hard` würde vom nächsten Merge rückgängig gemacht → Rollback als neuer Commit. - Der Linux-Image hat `git`, aber kein git-lfs; `_attachments/` ist dort ignoriert. - Das Passwort steht im Klartext in der Remote-URL → Forgejo-Token nur für dieses Repo. **Entscheidungen** - Konflikt: Merge abbrechen, Vault bleibt sauber, Job läuft. - Merge statt Rebase. - `.obsidian/*.json` bleibt synchron, Zustand pro Maschine nicht. - Änderungserkennung per `git ls-remote` alle 60 s statt Webhook (Webhook-Erreichbarkeit der Server von Forgejo aus ist ein Problem; ausgehend funktioniert unterwegs und hinter NAT). Kein Fetch, nur ein Hash-Vergleich. - Arbeit in diesem einen Issue, jeder Schritt ein Kommentar. **Neu im Wire-Protokoll:** `sync_state` `syncing` und `error`, `409 busy`, `POST resolve` pro Pfad. **Offen:** siehe Beschreibung (Konflikt-Dialog-Design, iOS-Routen, Editor-Überschreiben, Hook-Migration, optionaler Webhook). **Noch nichts gebaut.** Nächster Schritt: Phase 1 auf dem Linux-Server.
Author
Owner

PR #54 gemergt: feat(vault-sync): Sync-Logik und /vault/sync/*-Routen auf dem Linux-Server (iris/Iris#76)
iris/iris-linux-server#54

Commits:

  • feat(vault-sync): Sync-Logik und /vault/sync/*-Routen auf dem Linux-Server (iris/Iris#76)
PR #54 gemergt: feat(vault-sync): Sync-Logik und /vault/sync/*-Routen auf dem Linux-Server (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/54 Commits: - feat(vault-sync): Sync-Logik und /vault/sync/*-Routen auf dem Linux-Server (iris/Iris#76)
Author
Owner

Linux-Server: Sync-Logik und Routen (PR iris/iris-linux-server#54)

Gebaut (Phase 1, Schritt 1): vault_git_sync.py und vault_sync_routes.py mit allen sechs Routen aus dem Plan (status, pull, push, conflicts, resolve, events); git-lfs im Image.

  • Merge statt Rebase; bei Konflikt wird der Merge sofort abgebrochen, der Vault bleibt sauber, Status conflict, der Job läuft weiter. Kein Push, solange ein Konflikt offen ist.
  • Eine Sperre für alles (SYNC_LOCK → 409 busy, Merge unter HOOK_LOCK).
  • Trigger: Job-Start (Fetch + Merge, offline überspringen, nicht wenn ein anderer Job läuft), Job-Ende nach dem Hook-Commit (Push, bei Non-FF Fetch + Merge + Push, max. 3 Versuche), Änderungserkennung per ls-remote alle 60 s (Reconnect schiebt dabei auch ausstehende lokale Commits hinaus).
  • Rollback (/vault/git/reset-hard) ist mit Remote ein neuer Commit; /vault/git/init überschreibt bei vorhandenem Remote nichts und nutzt LFS, wenn git-lfs da ist.

Geprüft: 24 lokale Tests (test_vault_git_sync.py: Fast-Forward, Merge ohne Konflikt, Non-FF-Push, Konflikt mit sauberem Vault, ours/theirs/merged, alle Pfade nötig, veralteter Konflikt, Binär, offline, Reconnect, Erkennung, Rollback, busy, LFS-Roundtrip, Wire-Format) laufen mit echtem git gegen ein Bare-Repo. Deploy auf alf@iris-server (git 2.47.3, git-lfs 3.6.1 im Image), test_vault_sync_routes.py, test_vault_git.py, test_job_hooks.py gegen den laufenden Server grün (14).

Grenzen / offen:

  • Nicht gegen ein echtes Forgejo getestet; der Dev-Vault hat kein Remote.
  • Zugangsdaten (Token) und Onboarding fehlen noch; das Remote kommt aus git config.
  • Die Routen liegen in vault_sync_routes.py statt in vault_git_routes.py (Zirkelimport).
  • Nächster Schritt: Mac-Server (VaultSyncController.swift) und Wire-Parität.
## Linux-Server: Sync-Logik und Routen (PR iris/iris-linux-server#54) **Gebaut (Phase 1, Schritt 1):** `vault_git_sync.py` und `vault_sync_routes.py` mit allen sechs Routen aus dem Plan (`status`, `pull`, `push`, `conflicts`, `resolve`, `events`); git-lfs im Image. - Merge statt Rebase; bei Konflikt wird der Merge sofort abgebrochen, der Vault bleibt sauber, Status `conflict`, der Job läuft weiter. Kein Push, solange ein Konflikt offen ist. - Eine Sperre für alles (`SYNC_LOCK` → `409 busy`, Merge unter `HOOK_LOCK`). - Trigger: Job-Start (Fetch + Merge, offline überspringen, nicht wenn ein anderer Job läuft), Job-Ende nach dem Hook-Commit (Push, bei Non-FF Fetch + Merge + Push, max. 3 Versuche), Änderungserkennung per `ls-remote` alle 60 s (Reconnect schiebt dabei auch ausstehende lokale Commits hinaus). - Rollback (`/vault/git/reset-hard`) ist mit Remote ein neuer Commit; `/vault/git/init` überschreibt bei vorhandenem Remote nichts und nutzt LFS, wenn git-lfs da ist. **Geprüft:** 24 lokale Tests (`test_vault_git_sync.py`: Fast-Forward, Merge ohne Konflikt, Non-FF-Push, Konflikt mit sauberem Vault, ours/theirs/merged, alle Pfade nötig, veralteter Konflikt, Binär, offline, Reconnect, Erkennung, Rollback, busy, LFS-Roundtrip, Wire-Format) laufen mit echtem git gegen ein Bare-Repo. Deploy auf `alf@iris-server` (git 2.47.3, git-lfs 3.6.1 im Image), `test_vault_sync_routes.py`, `test_vault_git.py`, `test_job_hooks.py` gegen den laufenden Server grün (14). **Grenzen / offen:** - Nicht gegen ein echtes Forgejo getestet; der Dev-Vault hat kein Remote. - Zugangsdaten (Token) und Onboarding fehlen noch; das Remote kommt aus `git config`. - Die Routen liegen in `vault_sync_routes.py` statt in `vault_git_routes.py` (Zirkelimport). - Nächster Schritt: Mac-Server (`VaultSyncController.swift`) und Wire-Parität.
Author
Owner

PR #96 gemergt: feat(vault-sync): Sync-Logik und /vault/sync/*-Routen im Mac-Server (#76)
#96

Commits:

  • feat(vault-sync): Sync-Logik und /vault/sync/*-Routen im Mac-Server (#76)
PR #96 gemergt: feat(vault-sync): Sync-Logik und /vault/sync/*-Routen im Mac-Server (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/96 Commits: - feat(vault-sync): Sync-Logik und /vault/sync/*-Routen im Mac-Server (#76)
Author
Owner

Mac-Server: Sync-Logik und Routen (PR #96)

Gebaut (Phase 1, Schritt 2): VaultSyncController.swift (Actor, Port von vault_git_sync.py) und die sechs Routen /vault/sync/{status,pull,push,conflicts,resolve,events} in IrisRemoteServer.swift, Wire-Format wie auf dem Linux-Server (Fehlerantworten wie bei den übrigen Mac-Routen als {"error": …} mit HTTP-Status).

  • Gleiche Regeln: Merge statt Rebase, bei Konflikt merge --abort (Vault bleibt sauber), eine Sperre (zweiter API-Aufruf → 409 busy), Commit/Merge über JobHookManager.runExclusive, Konfliktzustand in .git/iris-sync-state.json im selben Format wie auf Linux.
  • Kein macOS-Keychain-Zugriff: jeder git-Aufruf läuft mit credential.helper= leer.
  • Trigger: Jobstart (createJob/sendFollowUp starten den Prozess jetzt erst nach prepareVaultForJobStart: Änderungen sichern, dann Fetch + Merge; offline sofort; nicht, wenn ein anderer Job läuft), Jobende (executeHooks stößt nach dem Hook den Push an), ls-remote-Erkennung alle 60 s (IRIS_VAULT_SYNC_INTERVAL).
  • Rollback (/vault/git/reset-hard) ist mit Remote ein neuer Commit; VaultGitSetup.initVaultGitRepo tut bei vorhandenem Remote nichts.

Geprüft: Beide Schemes (Iris und IrisClient) bauen über Xcode fehlerfrei. Nicht zur Laufzeit geprüft: Iris.app wurde nicht neu gestartet, die Routen sind gegen den Mac-Server noch nie aufgerufen worden. Die Swift-Logik ist ein Port der Python-Logik, die mit 24 lokalen Tests abgedeckt ist, aber selbst ungetestet.

Grenzen / offen:

  • Wire-Parität (Schritt 3) steht aus: derselbe Ablauf gegen Mac- und Linux-Server vergleichen. Dafür muss Iris.app neu gestartet werden.
  • Der bundled Hook auf dem Studio enthält eigene Push-Logik des Nutzers: sie ist unschädlich (danach ist ahead 0), sollte aber bei der Migration entfallen.
  • Zugangsdaten (Token), Onboarding und die Clients fehlen noch.
## Mac-Server: Sync-Logik und Routen (PR #96) **Gebaut (Phase 1, Schritt 2):** `VaultSyncController.swift` (Actor, Port von `vault_git_sync.py`) und die sechs Routen `/vault/sync/{status,pull,push,conflicts,resolve,events}` in `IrisRemoteServer.swift`, Wire-Format wie auf dem Linux-Server (Fehlerantworten wie bei den übrigen Mac-Routen als `{"error": …}` mit HTTP-Status). - Gleiche Regeln: Merge statt Rebase, bei Konflikt `merge --abort` (Vault bleibt sauber), eine Sperre (zweiter API-Aufruf → `409 busy`), Commit/Merge über `JobHookManager.runExclusive`, Konfliktzustand in `.git/iris-sync-state.json` im selben Format wie auf Linux. - Kein macOS-Keychain-Zugriff: jeder git-Aufruf läuft mit `credential.helper=` leer. - Trigger: Jobstart (`createJob`/`sendFollowUp` starten den Prozess jetzt erst nach `prepareVaultForJobStart`: Änderungen sichern, dann Fetch + Merge; offline sofort; nicht, wenn ein anderer Job läuft), Jobende (`executeHooks` stößt nach dem Hook den Push an), `ls-remote`-Erkennung alle 60 s (`IRIS_VAULT_SYNC_INTERVAL`). - Rollback (`/vault/git/reset-hard`) ist mit Remote ein neuer Commit; `VaultGitSetup.initVaultGitRepo` tut bei vorhandenem Remote nichts. **Geprüft:** Beide Schemes (Iris und IrisClient) bauen über Xcode fehlerfrei. **Nicht** zur Laufzeit geprüft: Iris.app wurde nicht neu gestartet, die Routen sind gegen den Mac-Server noch nie aufgerufen worden. Die Swift-Logik ist ein Port der Python-Logik, die mit 24 lokalen Tests abgedeckt ist, aber selbst ungetestet. **Grenzen / offen:** - Wire-Parität (Schritt 3) steht aus: derselbe Ablauf gegen Mac- und Linux-Server vergleichen. Dafür muss Iris.app neu gestartet werden. - Der bundled Hook auf dem Studio enthält eigene Push-Logik des Nutzers: sie ist unschädlich (danach ist `ahead` 0), sollte aber bei der Migration entfallen. - Zugangsdaten (Token), Onboarding und die Clients fehlen noch.
Author
Owner

PR #97 gemergt: test(vault-sync): git-Kern in VaultSyncCore.swift ausgelagert, Tests gegen echte Temp-Repos (#76)
#97

Commits:

  • test(vault-sync): git-Kern in VaultSyncCore.swift ausgelagert, Tests gegen echte Temp-Repos (#76)
PR #97 gemergt: test(vault-sync): git-Kern in VaultSyncCore.swift ausgelagert, Tests gegen echte Temp-Repos (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/97 Commits: - test(vault-sync): git-Kern in VaultSyncCore.swift ausgelagert, Tests gegen echte Temp-Repos (#76)
Author
Owner

Mac-Server: Tests für den git-Kern (PR #97)

Der git-Kern liegt jetzt in Iris/VaultSyncCore.swift (git-Aufrufe, Konfliktzustand, Merge, Auflösung; ohne Abhängigkeit zu Iris-Typen). VaultSyncController.swift enthält nur noch den Actor. Dazu scripts/test-vault-sync-core.sh: übersetzt den Kern mit swiftc und prüft ihn gegen echte Temp-Repos (Bare-Repo als „Forgejo“, zwei Arbeitskopien), ohne Xcode-Build und ohne Iris-Neustart.

Geprüft (56 Prüfungen, 0 Fehler): Fast-Forward, Merge ohne Konflikt, lokal voraus, ungesicherte Änderungen (kein Merge), Konflikt (Vault bleibt sauber, kein MERGE_HEAD, Konfliktpfad und die drei Fassungen aus Commits), Auflösung ours/theirs/merged inklusive Push zum anderen Peer, veralteter Konflikt (stale), Binär-Erkennung, ls-remote-Exitcodes und Fehlerklassifikation. Beide Schemes bauen weiterhin.

Noch nicht geprüft: der Actor selbst (Sperre, Trigger, Jobstart-Verzögerung) und die Routen gegen den laufenden Mac-Server. Die Routen dürfen nicht mit pull/push gegen das echte Studio-Vault getestet werden (echtes Forgejo, 3 Commits voraus, ungesicherte Änderungen); möglich sind nur die lesenden Aufrufe status und conflicts.

## Mac-Server: Tests für den git-Kern (PR #97) Der git-Kern liegt jetzt in `Iris/VaultSyncCore.swift` (git-Aufrufe, Konfliktzustand, Merge, Auflösung; ohne Abhängigkeit zu Iris-Typen). `VaultSyncController.swift` enthält nur noch den Actor. Dazu `scripts/test-vault-sync-core.sh`: übersetzt den Kern mit swiftc und prüft ihn gegen echte Temp-Repos (Bare-Repo als „Forgejo“, zwei Arbeitskopien), ohne Xcode-Build und ohne Iris-Neustart. **Geprüft (56 Prüfungen, 0 Fehler):** Fast-Forward, Merge ohne Konflikt, lokal voraus, ungesicherte Änderungen (kein Merge), Konflikt (Vault bleibt sauber, kein `MERGE_HEAD`, Konfliktpfad und die drei Fassungen aus Commits), Auflösung `ours`/`theirs`/`merged` inklusive Push zum anderen Peer, veralteter Konflikt (`stale`), Binär-Erkennung, `ls-remote`-Exitcodes und Fehlerklassifikation. Beide Schemes bauen weiterhin. **Noch nicht geprüft:** der Actor selbst (Sperre, Trigger, Jobstart-Verzögerung) und die Routen gegen den laufenden Mac-Server. Die Routen dürfen nicht mit `pull`/`push` gegen das echte Studio-Vault getestet werden (echtes Forgejo, 3 Commits voraus, ungesicherte Änderungen); möglich sind nur die lesenden Aufrufe `status` und `conflicts`.
Author
Owner

PR #98 gemergt: feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (#76)
#98

Commits:

  • feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (#76)
PR #98 gemergt: feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/98 Commits: - feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (#76)
Author
Owner

macOS-GUI: Lampe, Synchronisieren, Konflikt-Dialog (PR #98)

Gebaut (Phase 2, Schritte 4 und 5): VaultSyncModel.swift (Modell, Wire-Parser, RemoteVaultSyncService, View-Modell) und VaultSyncViews.swift (VaultSyncStatusView, VaultConflictResolverView). Eingebaut in die Toolbar des RemoteVaultBrowserView. Das ist auch der Vault-Browser von Iris.app (gegen den eingebetteten Mac-Server), also bekommen Iris und IrisClient dieselbe Oberfläche; es gibt keinen zweiten Pfad.

  • Entscheidungen aus der Abstimmung: Lampe in der Kopfzeile des Vault-Browsers, Konflikt-Dialog als Sheet mit Liste links und Detail rechts.
  • Lampe: grün/blau/gelb/rot/orange/grau je sync_state, Text ohne Jargon („Synchronisiert vor 2 Min“, „Änderungen warten“, „Offline“, „Konflikt – bitte entscheiden“), unsichtbar ohne Forgejo-Remote oder gegen einen älteren Server ohne Sync-Routen. Status per Poll alle 10 s, solange die Ansicht sichtbar ist.
  • „Synchronisieren“ holt erst und lädt dann hoch; ein Konflikt öffnet den Dialog. Mit offenem Konflikt heißt der Button „Konflikt lösen …“.
  • Dialog: zwei Spalten „Meine Version“ / „Version vom Server“ (Zeilen, die in der anderen fehlen, sind markiert), drei Buttons, „Zusammenführen“ öffnet ein editierbares Textfeld (Start: meine Version); Anhänge bieten nur die ersten beiden. Veralteter Konflikt (409) lädt neu und sagt es.
  • Fehlerantworten beider Server (error und detail) werden gleich behandelt.

Geprüft: Beide Schemes (Iris, IrisClient) bauen. Nicht gesehen und nicht bedient: die Oberfläche ist noch nie gestartet worden.

Offen: IrisRemote (iOS, Schritt 6), Onboarding-Schritt „Vault-Synchronisation“ und die Zugangsdaten-Einrichtung (Token statt Passwort in der Remote-URL; dafür fehlt noch eine Server-Route zum Setzen), SSE statt Poll, Menüeintrag im Client-Fenster (bewusst weggelassen).

## macOS-GUI: Lampe, Synchronisieren, Konflikt-Dialog (PR #98) **Gebaut (Phase 2, Schritte 4 und 5):** `VaultSyncModel.swift` (Modell, Wire-Parser, `RemoteVaultSyncService`, View-Modell) und `VaultSyncViews.swift` (`VaultSyncStatusView`, `VaultConflictResolverView`). Eingebaut in die Toolbar des `RemoteVaultBrowserView`. Das ist auch der Vault-Browser von Iris.app (gegen den eingebetteten Mac-Server), also bekommen Iris und IrisClient dieselbe Oberfläche; es gibt keinen zweiten Pfad. - Entscheidungen aus der Abstimmung: Lampe in der Kopfzeile des Vault-Browsers, Konflikt-Dialog als Sheet mit Liste links und Detail rechts. - Lampe: grün/blau/gelb/rot/orange/grau je `sync_state`, Text ohne Jargon („Synchronisiert vor 2 Min“, „Änderungen warten“, „Offline“, „Konflikt – bitte entscheiden“), unsichtbar ohne Forgejo-Remote oder gegen einen älteren Server ohne Sync-Routen. Status per Poll alle 10 s, solange die Ansicht sichtbar ist. - „Synchronisieren“ holt erst und lädt dann hoch; ein Konflikt öffnet den Dialog. Mit offenem Konflikt heißt der Button „Konflikt lösen …“. - Dialog: zwei Spalten „Meine Version“ / „Version vom Server“ (Zeilen, die in der anderen fehlen, sind markiert), drei Buttons, „Zusammenführen“ öffnet ein editierbares Textfeld (Start: meine Version); Anhänge bieten nur die ersten beiden. Veralteter Konflikt (409) lädt neu und sagt es. - Fehlerantworten beider Server (`error` und `detail`) werden gleich behandelt. **Geprüft:** Beide Schemes (Iris, IrisClient) bauen. **Nicht** gesehen und nicht bedient: die Oberfläche ist noch nie gestartet worden. **Offen:** IrisRemote (iOS, Schritt 6), Onboarding-Schritt „Vault-Synchronisation“ und die Zugangsdaten-Einrichtung (Token statt Passwort in der Remote-URL; dafür fehlt noch eine Server-Route zum Setzen), SSE statt Poll, Menüeintrag im Client-Fenster (bewusst weggelassen).
Author
Owner

PR #99 gemergt: fix(vault-sync): Lampe blieb unsichtbar, weil .task an einer leeren View nie anlief (#76)
#99

Commits:

  • fix(vault-sync): Lampe blieb unsichtbar, weil .task an einer leeren View nie anlief (#76)
PR #99 gemergt: fix(vault-sync): Lampe blieb unsichtbar, weil .task an einer leeren View nie anlief (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/99 Commits: - fix(vault-sync): Lampe blieb unsichtbar, weil .task an einer leeren View nie anlief (#76)
Author
Owner

Fix: Lampe blieb unsichtbar (PR iris/Iris, nach #98)

Befund: Im Vault-Browser war nach #98 keine Lampe zu sehen, obwohl der Server GET /vault/sync/status korrekt beantwortet (has_git, has_remote, sync_state geprüft). Ursache: VaultSyncStatusView rendert, solange der Status unbekannt ist, nichts. Das .task, das den Status holt, hing an dieser leeren View und lief deshalb nie an. Der Status wurde nie geladen, die Lampe blieb für immer unsichtbar.

Fix: Die View hat jetzt immer einen festen Anker (HStack mit unsichtbarer 0×0-Fläche), an dem .task, Sheet und Alert hängen.

Geprüft: Beide Schemes bauen. Die Lampe selbst ist erst nach einem Neustart von Iris sichtbar — Prüfung steht beim Nutzer aus.

## Fix: Lampe blieb unsichtbar (PR iris/Iris, nach #98) **Befund:** Im Vault-Browser war nach #98 keine Lampe zu sehen, obwohl der Server `GET /vault/sync/status` korrekt beantwortet (`has_git`, `has_remote`, `sync_state` geprüft). Ursache: `VaultSyncStatusView` rendert, solange der Status unbekannt ist, nichts. Das `.task`, das den Status holt, hing an dieser leeren View und lief deshalb nie an. Der Status wurde nie geladen, die Lampe blieb für immer unsichtbar. **Fix:** Die View hat jetzt immer einen festen Anker (`HStack` mit unsichtbarer 0×0-Fläche), an dem `.task`, Sheet und Alert hängen. **Geprüft:** Beide Schemes bauen. Die Lampe selbst ist erst nach einem Neustart von Iris sichtbar — Prüfung steht beim Nutzer aus.
Author
Owner

PR #100 gemergt: fix(vault-sync): Button-Text 'Synchronisieren' wird in der Toolbar nicht mehr gekürzt (#76)
#100

Commits:

  • fix(vault-sync): Button-Text 'Synchronisieren' wird in der Toolbar nicht mehr gekürzt (#76)
PR #100 gemergt: fix(vault-sync): Button-Text 'Synchronisieren' wird in der Toolbar nicht mehr gekürzt (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/100 Commits: - fix(vault-sync): Button-Text 'Synchronisieren' wird in der Toolbar nicht mehr gekürzt (#76)
Author
Owner

PR #55 gemergt: fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (iris/Iris#76)
iris/iris-linux-server#55

Commits:

  • fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (iris/Iris#76)
PR #55 gemergt: fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/55 Commits: - fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (iris/Iris#76)
Author
Owner

PR #101 gemergt: fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (#76)
#101

Commits:

  • fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (#76)
PR #101 gemergt: fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/101 Commits: - fix(vault-sync): Gitlinks mit Änderungen halten den Vault nicht mehr dauerhaft auf „ungesichert“ (#76)
Author
Owner

Befund (am echten Studio-Vault verifiziert): Die Lampe wurde nicht grün. git status --porcelain meldet die drei Waisen-Gitlinks (04 Ressourcen/Bernini, …/ComfyUI/Bernini, …/LTX Director CS) dauerhaft als geändert ( M), weil in den verschachtelten Repos Dateien liegen. Mit --ignore-submodules=all ist der Status leer. Folge war schlimmer als eine falsche Farbe: isDirty war damit immer wahr, also hat die Änderungserkennung nie gemergt (sie holt nur bei sauberem Vault) und mergeRemote hätte immer dirty geliefert. Auf dem Studio wären Änderungen des Notebooks nie angekommen. Das ist die Kehrseite der Entscheidung „Waisen-Gitlinks in Durchgang 1 ignorieren“ aus dem Plan.

Fix: isDirty ignoriert Gitlinks auf beiden Servern (vault_git_sync.py::_is_dirty, VaultSyncGit.isDirty). Der Status pending kommt jetzt nur noch von echten ungesicherten Änderungen oder ahead/behind.

Geprüft: Neuer Test auf beiden Seiten (Linux: 25 Fälle, Mac: 60 Prüfungen): Vault mit Gitlink, dessen verschachteltes Repo geändert ist, wird nicht als ungesichert gemeldet und mergt trotzdem. Der Linux-Test schlägt ohne den Fix fehl (gegengeprüft). Beide Mac-Schemes bauen.

Offen: Die Gitlinks bleiben im Repo (ihr Inhalt kommt auf dem Notebook nicht an, siehe Plan §8). Iris neu starten und den Linux-Dev-Server neu deployen, damit der Fix läuft.

## Fix: Gitlinks hielten den Vault dauerhaft auf „Änderungen warten“ (Mac und Linux, nach #99) **Befund (am echten Studio-Vault verifiziert):** Die Lampe wurde nicht grün. `git status --porcelain` meldet die drei Waisen-Gitlinks (`04 Ressourcen/Bernini`, `…/ComfyUI/Bernini`, `…/LTX Director CS`) dauerhaft als geändert (` M`), weil in den verschachtelten Repos Dateien liegen. Mit `--ignore-submodules=all` ist der Status leer. Folge war schlimmer als eine falsche Farbe: `isDirty` war damit immer wahr, also hat die Änderungserkennung nie gemergt (sie holt nur bei sauberem Vault) und `mergeRemote` hätte immer `dirty` geliefert. Auf dem Studio wären Änderungen des Notebooks nie angekommen. Das ist die Kehrseite der Entscheidung „Waisen-Gitlinks in Durchgang 1 ignorieren“ aus dem Plan. **Fix:** `isDirty` ignoriert Gitlinks auf beiden Servern (`vault_git_sync.py::_is_dirty`, `VaultSyncGit.isDirty`). Der Status `pending` kommt jetzt nur noch von echten ungesicherten Änderungen oder `ahead`/`behind`. **Geprüft:** Neuer Test auf beiden Seiten (Linux: 25 Fälle, Mac: 60 Prüfungen): Vault mit Gitlink, dessen verschachteltes Repo geändert ist, wird nicht als ungesichert gemeldet und mergt trotzdem. Der Linux-Test schlägt ohne den Fix fehl (gegengeprüft). Beide Mac-Schemes bauen. **Offen:** Die Gitlinks bleiben im Repo (ihr Inhalt kommt auf dem Notebook nicht an, siehe Plan §8). Iris neu starten und den Linux-Dev-Server neu deployen, damit der Fix läuft.
Author
Owner

PR #20 gemergt: feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (iris/Iris#76)
iris/2ndbrain-ios#20

Commits:

  • feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (iris/Iris#76)
PR #20 gemergt: feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/20 Commits: - feat(vault-sync): Lampe, Synchronisieren-Button und Konflikt-Dialog im Vault-Browser (iris/Iris#76)
Author
Owner

iOS-GUI und Linux-Deploy (PR iris/2ndbrain-ios#20)

Gebaut (Phase 2, Schritt 6): In IrisRemote VaultSyncModel.swift (Modell, Wire-Parser, VaultSyncService über ServerConnection, View-Modell) und VaultSyncViews.swift (Lampe mit „Synchronisieren“, Konflikt-Dialog), eingebaut oben in VaultBrowserSheet. SwiftUI-Port der macOS-Ansichten; die Texte sind dieselben, ohne Jargon. Auf dem iPhone statt zweier Spalten ein Umschalter „Meine Version“ / „Version vom Server“ (markierte Zeilen), darunter drei Buttons, „Zusammenführen“ als Sheet mit Texteditor; Anhänge nur die ersten zwei. Pull/Push/Resolve laufen über die Sitzung mit langem Zeitlimit (agentSession). Gleiche Falle wie auf dem Mac vermieden: .task hängt an einem immer vorhandenen Anker, sonst bliebe die Lampe unsichtbar.

Geprüft: IrisRemote baut für iOS (xcodebuild, generisches Gerät, ohne Signatur). Nicht auf einem Gerät oder Simulator gestartet, die Oberfläche ist nicht gesehen.

Linux-Dev-Server: Der Fix für Gitlinks (nach #99) ist deployt und im Container verifiziert (ignore-submodules=all in vault_git_sync.py).

Offen: Onboarding-Schritt „Vault-Synchronisation“ in allen Clients und die Zugangsdaten-Einrichtung (Server-Route zum Setzen von Remote und Token auf beiden Servern), Notebook-Bootstrap, SSE statt Poll, ein echter Konflikt-Durchlauf (Sandbox), Paritätsprüfung Mac gegen Linux mit denselben Szenarien.

## iOS-GUI und Linux-Deploy (PR iris/2ndbrain-ios#20) **Gebaut (Phase 2, Schritt 6):** In IrisRemote `VaultSyncModel.swift` (Modell, Wire-Parser, `VaultSyncService` über `ServerConnection`, View-Modell) und `VaultSyncViews.swift` (Lampe mit „Synchronisieren“, Konflikt-Dialog), eingebaut oben in `VaultBrowserSheet`. SwiftUI-Port der macOS-Ansichten; die Texte sind dieselben, ohne Jargon. Auf dem iPhone statt zweier Spalten ein Umschalter „Meine Version“ / „Version vom Server“ (markierte Zeilen), darunter drei Buttons, „Zusammenführen“ als Sheet mit Texteditor; Anhänge nur die ersten zwei. Pull/Push/Resolve laufen über die Sitzung mit langem Zeitlimit (`agentSession`). Gleiche Falle wie auf dem Mac vermieden: `.task` hängt an einem immer vorhandenen Anker, sonst bliebe die Lampe unsichtbar. **Geprüft:** IrisRemote baut für iOS (`xcodebuild`, generisches Gerät, ohne Signatur). Nicht auf einem Gerät oder Simulator gestartet, die Oberfläche ist nicht gesehen. **Linux-Dev-Server:** Der Fix für Gitlinks (nach #99) ist deployt und im Container verifiziert (`ignore-submodules=all` in `vault_git_sync.py`). **Offen:** Onboarding-Schritt „Vault-Synchronisation“ in allen Clients und die Zugangsdaten-Einrichtung (Server-Route zum Setzen von Remote und Token auf beiden Servern), Notebook-Bootstrap, SSE statt Poll, ein echter Konflikt-Durchlauf (Sandbox), Paritätsprüfung Mac gegen Linux mit denselben Szenarien.
Author
Owner

PR #56 gemergt: feat(vault-sync): POST /vault/sync/configure verbindet das Vault mit Forgejo, Token außerhalb des Vaults (iris/Iris#76)
iris/iris-linux-server#56

Commits:

  • feat(vault-sync): POST /vault/sync/configure verbindet das Vault mit Forgejo, Token außerhalb des Vaults (iris/Iris#76)
PR #56 gemergt: feat(vault-sync): POST /vault/sync/configure verbindet das Vault mit Forgejo, Token außerhalb des Vaults (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/56 Commits: - feat(vault-sync): POST /vault/sync/configure verbindet das Vault mit Forgejo, Token außerhalb des Vaults (iris/Iris#76)
Author
Owner

PR #102 gemergt: feat(vault-sync): POST /vault/sync/configure im Mac-Server, Token außerhalb des Vaults (#76)
#102

Commits:

  • feat(vault-sync): POST /vault/sync/configure im Mac-Server, Token außerhalb des Vaults (#76)
PR #102 gemergt: feat(vault-sync): POST /vault/sync/configure im Mac-Server, Token außerhalb des Vaults (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/102 Commits: - feat(vault-sync): POST /vault/sync/configure im Mac-Server, Token außerhalb des Vaults (#76)
Author
Owner

Server: Vault mit Forgejo verbinden, POST /vault/sync/configure (Mac und Linux)

Entscheidungen (mit dem Nutzer):

  • Token liegt in einer 0600-Datei außerhalb des Vaults (Mac: Application Support/Iris/vault-sync-credentials.json, Linux: /data/vault-sync-credentials.json). Git bekommt es pro Aufruf per Umgebungsvariable (http.<Server>.extraHeader, nur für diesen Server), also nicht in .git/config, nicht in ps, nicht im Vault und nicht im Vault-Backup. Kein Keychain-Zugriff.
  • Beim Einrichten wird nie etwas überschrieben; Kollisionen werden gemeldet.
  • Das Einrichten soll später ein Zweig des Vault-Schritts im Onboarding werden: „Aus Backup zurücklesen“ / „Default-Vault“ / „Per KI einrichten“ / „Vault verbinden“. Dieser Teil ist noch nicht gebaut.

Wire: POST /vault/sync/configure, Body {remote_url, username, token} →
{ok: true, mode: cloned | connected | published | credentials_updated} oder {ok: false, error: auth | unreachable | unrelated_history | collisions | failed, paths?, message?}; 400 bei ungültiger Eingabe (nur http(s), keine Zugangsdaten in der URL), 409 busy.

Ablauf (beide Server gleich): erst ls-remote mit den Zugangsdaten, ohne etwas zu ändern (auth/unreachable brechen hier ab); dann Zugangsdaten speichern und verbinden:

  • leeres Vault, Remote mit Inhalt → Klon (mit LFS-Filter, auch ohne globales git lfs install);
  • Vault mit Dateien, kein Repo, Remote mit Inhalt → init, fetch, checkout -B … --track: lokale Dateien bleiben (Union, der Wächter committet sie später), gleichnamige Dateien → collisions mit Pfadliste, nichts bleibt halb eingerichtet;
  • Vault mit/ohne Dateien, Remote leer → veröffentlichen (published);
  • Vault mit eigenem Repo: ohne Remote und Remote leer → veröffentlichen; Remote mit Inhalt → nur bei gemeinsamer Historie (connected), sonst unrelated_history; mit Remote → nur credentials_updated.
    Scheitert ein Schritt, werden Vault und Zugangsdaten zurückgesetzt.

Geprüft: Linux 41 Tests (16 neu), Mac 86 Prüfungen (26 neu), alle mit echtem git gegen lokale Repos (file:// nur im Test erlaubt). Beide Mac-Schemes bauen. Nicht gegen ein echtes Forgejo und nicht über HTTP getestet; der Linux-Dev-Server ist noch nicht neu deployt.

Offen: Einrichten-Sheet („Vault verbinden“) mit „Verbindung prüfen“ in den Clients, die Lampe zeigt dann „Synchronisation einrichten …“ statt zu verschwinden; Verzweigung des Vault-Schritts im Onboarding (Mac-Onboarding, Client-Onboarding, iOS); Wire-Doku (Entwicklerdokumentation/02-Wire-Protokoll.md kennt /vault/sync/* noch nicht).

## Server: Vault mit Forgejo verbinden, `POST /vault/sync/configure` (Mac und Linux) **Entscheidungen (mit dem Nutzer):** - Token liegt **in einer 0600-Datei außerhalb des Vaults** (Mac: `Application Support/Iris/vault-sync-credentials.json`, Linux: `/data/vault-sync-credentials.json`). Git bekommt es pro Aufruf per Umgebungsvariable (`http.<Server>.extraHeader`, nur für diesen Server), also nicht in `.git/config`, nicht in `ps`, nicht im Vault und nicht im Vault-Backup. Kein Keychain-Zugriff. - Beim Einrichten wird **nie etwas überschrieben**; Kollisionen werden gemeldet. - Das Einrichten soll später ein Zweig des Vault-Schritts im Onboarding werden: „Aus Backup zurücklesen“ / „Default-Vault“ / „Per KI einrichten“ / „Vault verbinden“. Dieser Teil ist noch **nicht** gebaut. **Wire:** `POST /vault/sync/configure`, Body `{remote_url, username, token}` → `{ok: true, mode: cloned | connected | published | credentials_updated}` oder `{ok: false, error: auth | unreachable | unrelated_history | collisions | failed, paths?, message?}`; 400 bei ungültiger Eingabe (nur http(s), keine Zugangsdaten in der URL), 409 `busy`. **Ablauf (beide Server gleich):** erst `ls-remote` mit den Zugangsdaten, ohne etwas zu ändern (`auth`/`unreachable` brechen hier ab); dann Zugangsdaten speichern und verbinden: - leeres Vault, Remote mit Inhalt → Klon (mit LFS-Filter, auch ohne globales `git lfs install`); - Vault mit Dateien, kein Repo, Remote mit Inhalt → `init`, `fetch`, `checkout -B … --track`: lokale Dateien bleiben (Union, der Wächter committet sie später), gleichnamige Dateien → `collisions` mit Pfadliste, nichts bleibt halb eingerichtet; - Vault mit/ohne Dateien, Remote leer → veröffentlichen (`published`); - Vault mit eigenem Repo: ohne Remote und Remote leer → veröffentlichen; Remote mit Inhalt → nur bei gemeinsamer Historie (`connected`), sonst `unrelated_history`; mit Remote → nur `credentials_updated`. Scheitert ein Schritt, werden Vault und Zugangsdaten zurückgesetzt. **Geprüft:** Linux 41 Tests (16 neu), Mac 86 Prüfungen (26 neu), alle mit echtem git gegen lokale Repos (`file://` nur im Test erlaubt). Beide Mac-Schemes bauen. **Nicht** gegen ein echtes Forgejo und nicht über HTTP getestet; der Linux-Dev-Server ist noch nicht neu deployt. **Offen:** Einrichten-Sheet („Vault verbinden“) mit „Verbindung prüfen“ in den Clients, die Lampe zeigt dann „Synchronisation einrichten …“ statt zu verschwinden; Verzweigung des Vault-Schritts im Onboarding (Mac-Onboarding, Client-Onboarding, iOS); Wire-Doku (`Entwicklerdokumentation/02-Wire-Protokoll.md` kennt `/vault/sync/*` noch nicht).
Author
Owner

PR #103 gemergt: feat(vault-sync): Sheet "Vault verbinden" und Lampe "Synchronisation einrichten …" (#76)
#103

Commits:

  • feat(vault-sync): Sheet "Vault verbinden" und Lampe "Synchronisation einrichten …" (#76)
PR #103 gemergt: feat(vault-sync): Sheet "Vault verbinden" und Lampe "Synchronisation einrichten …" (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/103 Commits: - feat(vault-sync): Sheet "Vault verbinden" und Lampe "Synchronisation einrichten …" (#76)
Author
Owner

PR #21 gemergt: feat(vault-sync): Sheet "Vault verbinden" und Eintrag "Synchronisation einrichten …" (iris/Iris#76)
iris/2ndbrain-ios#21

Commits:

  • feat(vault-sync): Sheet "Vault verbinden" und Eintrag "Synchronisation einrichten …" (iris/Iris#76)
PR #21 gemergt: feat(vault-sync): Sheet "Vault verbinden" und Eintrag "Synchronisation einrichten …" (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/21 Commits: - feat(vault-sync): Sheet "Vault verbinden" und Eintrag "Synchronisation einrichten …" (iris/Iris#76)
Author
Owner

Sheet „Vault verbinden“ (macOS und iOS)

Gebaut: In den Clients (Iris, IrisClient, IrisRemote) ein Sheet „Vault verbinden“ (Adresse des Repositorys, Benutzer, Token, Button „Verbinden“) gegen POST /vault/sync/configure. Die Lampe zeigt bei einem Vault ohne Remote „Synchronisation einrichten …“ statt zu verschwinden (gegen ältere Server ohne Sync-Routen bleibt sie unsichtbar). Ergebnis in Klartext: Klon, hochgeladen, verbunden, Zugangsdaten aktualisiert; Fehler auth, unreachable, unrelated_history, collisions (mit der Pfadliste), failed. Beim Verbinden läuft ein Fortschrittskreis, das Token wird nach Erfolg aus dem Feld gelöscht. Pull/Push/Verbinden laufen mit langem Zeitlimit (Klon großer Vaults).

Geprüft: Beide Mac-Schemes bauen, IrisRemote baut für iOS. Die Oberfläche wurde weder auf dem Mac noch auf dem iPhone bedient, und configure lief noch nie gegen ein echtes Forgejo.

Bewusst weggelassen: der Button „Verbindung prüfen“ (die Route prüft vor dem Verbinden ohnehin und ändert bei einem Fehler nichts).

Offen: Verzweigung des Vault-Schritts im Onboarding (Backup / Default-Vault / KI / Vault verbinden) in Mac-Onboarding, Client-Onboarding und iOS-Onboarding; Wire-Doku; Linux-Dev-Server mit configure deployen und einmal echt durchspielen.

## Sheet „Vault verbinden“ (macOS und iOS) **Gebaut:** In den Clients (Iris, IrisClient, IrisRemote) ein Sheet **„Vault verbinden“** (Adresse des Repositorys, Benutzer, Token, Button „Verbinden“) gegen `POST /vault/sync/configure`. Die Lampe zeigt bei einem Vault ohne Remote **„Synchronisation einrichten …“** statt zu verschwinden (gegen ältere Server ohne Sync-Routen bleibt sie unsichtbar). Ergebnis in Klartext: Klon, hochgeladen, verbunden, Zugangsdaten aktualisiert; Fehler `auth`, `unreachable`, `unrelated_history`, `collisions` (mit der Pfadliste), `failed`. Beim Verbinden läuft ein Fortschrittskreis, das Token wird nach Erfolg aus dem Feld gelöscht. Pull/Push/Verbinden laufen mit langem Zeitlimit (Klon großer Vaults). **Geprüft:** Beide Mac-Schemes bauen, IrisRemote baut für iOS. Die Oberfläche wurde weder auf dem Mac noch auf dem iPhone bedient, und `configure` lief noch nie gegen ein echtes Forgejo. **Bewusst weggelassen:** der Button „Verbindung prüfen“ (die Route prüft vor dem Verbinden ohnehin und ändert bei einem Fehler nichts). **Offen:** Verzweigung des Vault-Schritts im Onboarding (Backup / Default-Vault / KI / Vault verbinden) in Mac-Onboarding, Client-Onboarding und iOS-Onboarding; Wire-Doku; Linux-Dev-Server mit `configure` deployen und einmal echt durchspielen.
Author
Owner

PR #104 gemergt: feat(vault-sync): Vault-Schritt im Onboarding verzweigt: Backup, Default-Vault, KI, Vault verbinden (#76)
#104

Commits:

  • feat(vault-sync): Vault-Schritt im Onboarding verzweigt: Backup, Default-Vault, KI, Vault verbinden (#76)
PR #104 gemergt: feat(vault-sync): Vault-Schritt im Onboarding verzweigt: Backup, Default-Vault, KI, Vault verbinden (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/104 Commits: - feat(vault-sync): Vault-Schritt im Onboarding verzweigt: Backup, Default-Vault, KI, Vault verbinden (#76)
Author
Owner

PR #22 gemergt: feat(vault-sync): Vault-Schritt im iOS-Onboarding mit "Vault verbinden" (iris/Iris#76)
iris/2ndbrain-ios#22

Commits:

  • feat(vault-sync): Vault-Schritt im iOS-Onboarding mit "Vault verbinden" (iris/Iris#76)
PR #22 gemergt: feat(vault-sync): Vault-Schritt im iOS-Onboarding mit "Vault verbinden" (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/22 Commits: - feat(vault-sync): Vault-Schritt im iOS-Onboarding mit "Vault verbinden" (iris/Iris#76)
Author
Owner

Onboarding-Verzweigung und Wire-Doku

Gebaut: Der Vault-Schritt verzweigt jetzt in Aus Backup zurücklesen / Default-Vault / Per KI einrichten / Vault verbinden:

  • Client-Onboarding (ClientOnboardingStepVaultView, Iris und IrisClient): vier Wege bei leerem Vault; „Backup“ öffnet RemoteBackupRestoreView, „Vault verbinden“ das Sheet; ein bereits gefüllter Vault bietet „Vault mit Forgejo verbinden …“. Nach dem Schließen wird der Vault neu geprüft.
  • Mac-Onboarding (OnboardingStepVaultSetupView, englische Texte wie im Rest des Schritts): „Restore from backup“ (vorhandene Backup-Ansicht, beendet den Assistenten) und „Connect vault (Forgejo)“. Der Sync-Controller arbeitet auf dem Pfad aus IrisConfig, den der Schritt sonst erst beim Weitergehen einträgt: deshalb legt „Connect vault“ den Ordner an und registriert den Pfad vorab. Dafür gibt es LocalVaultSyncService (Controller im selben Prozess, kein HTTP).
  • iOS-Onboarding (RemoteOnboardingStepVaultView): „Vault verbinden“, „Default-Vault“, „Per KI einrichten“. „Aus Backup zurücklesen“ fehlt: IrisRemote hat keine Backup-Ansicht.

Wire-Doku: Entwicklerdokumentation/02-Wire-Protokoll.md hat den Abschnitt „Vault-Synchronisation“ (alle Routen, Zustände, Regeln, configure-Modi, Zugangsdaten, Fehlerformat).

Geprüft: Beide Mac-Schemes und IrisRemote bauen. Keine der Oberflächen wurde bedient.

Offen: echter Durchlauf (Sandbox, Konflikte, Offline, LFS, Notebook als zweiter Peer), Parität Mac gegen Linux, Studio-Passwort durch Token ersetzen, iOS ohne Backup-Weg, Editor-Überschreiben prüfen, SSE in den Clients.

## Onboarding-Verzweigung und Wire-Doku **Gebaut:** Der Vault-Schritt verzweigt jetzt in **Aus Backup zurücklesen / Default-Vault / Per KI einrichten / Vault verbinden**: - **Client-Onboarding** (`ClientOnboardingStepVaultView`, Iris und IrisClient): vier Wege bei leerem Vault; „Backup“ öffnet `RemoteBackupRestoreView`, „Vault verbinden“ das Sheet; ein bereits gefüllter Vault bietet „Vault mit Forgejo verbinden …“. Nach dem Schließen wird der Vault neu geprüft. - **Mac-Onboarding** (`OnboardingStepVaultSetupView`, englische Texte wie im Rest des Schritts): „Restore from backup“ (vorhandene Backup-Ansicht, beendet den Assistenten) und „Connect vault (Forgejo)“. Der Sync-Controller arbeitet auf dem Pfad aus `IrisConfig`, den der Schritt sonst erst beim Weitergehen einträgt: deshalb legt „Connect vault“ den Ordner an und registriert den Pfad vorab. Dafür gibt es `LocalVaultSyncService` (Controller im selben Prozess, kein HTTP). - **iOS-Onboarding** (`RemoteOnboardingStepVaultView`): „Vault verbinden“, „Default-Vault“, „Per KI einrichten“. **„Aus Backup zurücklesen“ fehlt**: IrisRemote hat keine Backup-Ansicht. **Wire-Doku:** `Entwicklerdokumentation/02-Wire-Protokoll.md` hat den Abschnitt „Vault-Synchronisation“ (alle Routen, Zustände, Regeln, `configure`-Modi, Zugangsdaten, Fehlerformat). **Geprüft:** Beide Mac-Schemes und IrisRemote bauen. Keine der Oberflächen wurde bedient. **Offen:** echter Durchlauf (Sandbox, Konflikte, Offline, LFS, Notebook als zweiter Peer), Parität Mac gegen Linux, Studio-Passwort durch Token ersetzen, iOS ohne Backup-Weg, Editor-Überschreiben prüfen, SSE in den Clients.
Author
Owner

PR #105 gemergt: feat(vault-sync): Weiche im Vault-Schritt des Mac-Onboardings: erst wählen, dann das Formular (#76)
#105

Commits:

  • feat(vault-sync): Weiche im Vault-Schritt des Mac-Onboardings: erst wählen, dann das Formular (#76)
PR #105 gemergt: feat(vault-sync): Weiche im Vault-Schritt des Mac-Onboardings: erst wählen, dann das Formular (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/105 Commits: - feat(vault-sync): Weiche im Vault-Schritt des Mac-Onboardings: erst wählen, dann das Formular (#76)
Author
Owner

Weiche im Mac-Onboarding (Nutzerfund im VM-Test)

Befund: Direkt nach dem Embedding-Provider kam das Formular des Vault-Schritts (Name, Sprache, Ort, Obsidian) mit dem blauen Knopf „Mit KI einrichten“; die vier Wege standen nur als kleine unterstrichene Links darunter. Eine Weiche im Sinne der Entscheidung (erst wählen, dann das passende Formular) war das nicht. Mein Fehler: ich hatte die Wege als Zusatzlinks eingebaut statt den Schritt zu verzweigen.

Fix: Ist am gewählten Pfad noch kein Vault, zeigt der Schritt zuerst die Weiche „Wie soll dein Vault entstehen?“ mit vier Karten: Aus Backup zurücklesen (öffnet sofort die Backup-Ansicht), Vault verbinden, Default-Vault, Per KI einrichten. Erst nach der Wahl erscheint das Formular, und nur mit den Feldern, die der Weg braucht (Vault verbinden: nur der Ort; Default und KI: Name, Sprache, Ort, Obsidian); dazu der passende Knopf und „Andere Wahl treffen“. Ein vorhandenes Vault geht wie bisher durch den Schritt und bietet „Mit Forgejo verbinden …“. Texte der neuen Elemente sind deutsch.

Client-Onboarding (IrisClient) und iOS: dort beginnt der Vault-Schritt bei leerem Vault ohnehin mit der Auswahl (keine Eingabefelder davor); die Weiche besteht dort aus den Wegen als Schaltflächen und wurde nicht auf Karten umgebaut.

Geprüft: beide Mac-Schemes bauen. Nicht bedient.

## Weiche im Mac-Onboarding (Nutzerfund im VM-Test) **Befund:** Direkt nach dem Embedding-Provider kam das Formular des Vault-Schritts (Name, Sprache, Ort, Obsidian) mit dem blauen Knopf „Mit KI einrichten“; die vier Wege standen nur als kleine unterstrichene Links darunter. Eine Weiche im Sinne der Entscheidung (erst wählen, dann das passende Formular) war das nicht. Mein Fehler: ich hatte die Wege als Zusatzlinks eingebaut statt den Schritt zu verzweigen. **Fix:** Ist am gewählten Pfad noch kein Vault, zeigt der Schritt zuerst die Weiche **„Wie soll dein Vault entstehen?“** mit vier Karten: Aus Backup zurücklesen (öffnet sofort die Backup-Ansicht), Vault verbinden, Default-Vault, Per KI einrichten. Erst nach der Wahl erscheint das Formular, und nur mit den Feldern, die der Weg braucht (Vault verbinden: nur der Ort; Default und KI: Name, Sprache, Ort, Obsidian); dazu der passende Knopf und „Andere Wahl treffen“. Ein vorhandenes Vault geht wie bisher durch den Schritt und bietet „Mit Forgejo verbinden …“. Texte der neuen Elemente sind deutsch. **Client-Onboarding (IrisClient) und iOS:** dort beginnt der Vault-Schritt bei leerem Vault ohnehin mit der Auswahl (keine Eingabefelder davor); die Weiche besteht dort aus den Wegen als Schaltflächen und wurde nicht auf Karten umgebaut. **Geprüft:** beide Mac-Schemes bauen. Nicht bedient.
Author
Owner

PR #57 gemergt: fix(vault-sync): Repository nicht gefunden (z. B. nur Server-Adresse) ist ein eigener Fehler statt roher git-Ausgabe (iris/Iris#76)
iris/iris-linux-server#57

Commits:

  • fix(vault-sync): Repository nicht gefunden (z. B. nur Server-Adresse) ist ein eigener Fehler statt roher git-Ausgabe (iris/Iris#76)
PR #57 gemergt: fix(vault-sync): Repository nicht gefunden (z. B. nur Server-Adresse) ist ein eigener Fehler statt roher git-Ausgabe (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/57 Commits: - fix(vault-sync): Repository nicht gefunden (z. B. nur Server-Adresse) ist ein eigener Fehler statt roher git-Ausgabe (iris/Iris#76)
Author
Owner

PR #106 gemergt: fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (#76)
#106

Commits:

  • fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (#76)
PR #106 gemergt: fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/106 Commits: - fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (#76)
Author
Owner

PR #23 gemergt: fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (iris/Iris#76)
iris/2ndbrain-ios#23

Commits:

  • fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (iris/Iris#76)
PR #23 gemergt: fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/23 Commits: - fix(vault-sync): Repository nicht gefunden als eigene Meldung, Adresse ohne Repository-Pfad wird vorab abgewiesen (iris/Iris#76)
Author
Owner

PR #58 gemergt: feat(vault-sync): Forgejo-Anmeldung mit Passwort, Repository-Liste und Neu anlegen (iris/Iris#76)
iris/iris-linux-server#58

Commits:

  • feat(vault-sync): Forgejo-Anmeldung mit Passwort, Repository-Liste und Neu anlegen (iris/Iris#76)
PR #58 gemergt: feat(vault-sync): Forgejo-Anmeldung mit Passwort, Repository-Liste und Neu anlegen (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/58 Commits: - feat(vault-sync): Forgejo-Anmeldung mit Passwort, Repository-Liste und Neu anlegen (iris/Iris#76)
Author
Owner

PR #107 gemergt: feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (#76)
#107

Commits:

  • feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (#76)
PR #107 gemergt: feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/107 Commits: - feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (#76)
Author
Owner

PR #24 gemergt: feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (iris/Iris#76)
iris/2ndbrain-ios#24

Commits:

  • feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (iris/Iris#76)
PR #24 gemergt: feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/24 Commits: - feat(vault-sync): Vault verbinden per Forgejo-Anmeldung: Repository aus Liste wählen oder neu anlegen (iris/Iris#76)
Author
Owner

„Vault verbinden“ für Laien: Anmeldung statt Repository-Namen

Anlass (VM-Test): Der Nutzer trug nur die Server-Adresse ein; git meldete „repository … not found“, im Sheet stand rohe git-Ausgabe. Dahinter steckt das eigentliche Problem: Ein nicht technischer Anwender kennt den Namen seines Repositorys nicht.

Behoben:

  • „Repository nicht gefunden“ ist ein eigener Fehler mit klarer Meldung; eine Adresse ohne benutzer/repository wird vorab abgewiesen. Gegen den echten Forgejo geprüft, dass seine Fehlertexte richtig klassifiziert werden.
  • Neu (Entscheidung des Nutzers: Passwort, Iris erzeugt das Token): Das Sheet ist zweistufig. Anmelden mit Server, Benutzer und Passwort (bei Zwei-Faktor ein Code-Feld), dann Repository wählen (Liste zum Anklicken, leere markiert) oder neu anlegen (privat, Vorschlag iris-vault). „Erweitert“ nimmt Adresse und Token von Hand (Konten ohne Passwort).
  • Server (beide gleich): POST /vault/sync/forge/login erzeugt mit dem Passwort einmalig ein Token (write:repository, read:user) und listet die Repositories; das Passwort wird nie gespeichert, das Token bleibt im Speicher des Servers (30 min) und verlässt ihn nie. POST /vault/sync/forge/create legt ein privates, leeres Repository an. configure nimmt use_login: true, schreibt das Token erst nach erfolgreichem Verbinden in die Zugangsdaten-Datei und verwirft es; die Adresse muss auf denselben Server zeigen.

Geprüft: Linux 52 Tests, Mac 116 Prüfungen, jeweils mit einem Forgejo als Attrappe (Anmelden, falsches Passwort, Zwei-Faktor, kein Forgejo, nicht erreichbar, Repository anlegen, ungültige Namen, Name vergeben, Ablauf der Anmeldung, falscher Server). Linux-Dev-Server deployt und mit falschen Eingaben angesprochen. Beide Mac-Schemes und IrisRemote bauen.

Nicht geprüft: Token-Erzeugung mit Passwort, Zwei-Faktor-Header (X-GITEA-OTP) und die genauen Rechte gegen einen echten Forgejo; die Oberfläche wurde nicht bedient. Ein Forgejo mit selbstsigniertem Zertifikat wird abgelehnt.

## „Vault verbinden“ für Laien: Anmeldung statt Repository-Namen **Anlass (VM-Test):** Der Nutzer trug nur die Server-Adresse ein; git meldete „repository … not found“, im Sheet stand rohe git-Ausgabe. Dahinter steckt das eigentliche Problem: Ein nicht technischer Anwender kennt den Namen seines Repositorys nicht. **Behoben:** - „Repository nicht gefunden“ ist ein eigener Fehler mit klarer Meldung; eine Adresse ohne `benutzer/repository` wird vorab abgewiesen. Gegen den echten Forgejo geprüft, dass seine Fehlertexte richtig klassifiziert werden. - **Neu (Entscheidung des Nutzers: Passwort, Iris erzeugt das Token):** Das Sheet ist zweistufig. **Anmelden** mit Server, Benutzer und Passwort (bei Zwei-Faktor ein Code-Feld), dann **Repository wählen** (Liste zum Anklicken, leere markiert) oder **neu anlegen** (privat, Vorschlag `iris-vault`). „Erweitert“ nimmt Adresse und Token von Hand (Konten ohne Passwort). - Server (beide gleich): `POST /vault/sync/forge/login` erzeugt mit dem Passwort **einmalig** ein Token (`write:repository`, `read:user`) und listet die Repositories; **das Passwort wird nie gespeichert**, das Token bleibt im Speicher des Servers (30 min) und verlässt ihn nie. `POST /vault/sync/forge/create` legt ein privates, leeres Repository an. `configure` nimmt `use_login: true`, schreibt das Token erst nach erfolgreichem Verbinden in die Zugangsdaten-Datei und verwirft es; die Adresse muss auf denselben Server zeigen. **Geprüft:** Linux 52 Tests, Mac 116 Prüfungen, jeweils mit einem Forgejo als Attrappe (Anmelden, falsches Passwort, Zwei-Faktor, kein Forgejo, nicht erreichbar, Repository anlegen, ungültige Namen, Name vergeben, Ablauf der Anmeldung, falscher Server). Linux-Dev-Server deployt und mit falschen Eingaben angesprochen. Beide Mac-Schemes und IrisRemote bauen. **Nicht geprüft:** Token-Erzeugung mit Passwort, Zwei-Faktor-Header (`X-GITEA-OTP`) und die genauen Rechte gegen einen **echten** Forgejo; die Oberfläche wurde nicht bedient. Ein Forgejo mit selbstsigniertem Zertifikat wird abgelehnt.
Author
Owner

PR #59 gemergt: fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont (iris/Iris#76)
iris/iris-linux-server#59

Commits:

  • fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont (iris/Iris#76)
PR #59 gemergt: fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/59 Commits: - fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont (iris/Iris#76)
Author
Owner

PR #108 gemergt: fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont; git-lfs wird eingerichtet (#76)
#108

Commits:

  • fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont; git-lfs wird eingerichtet (#76)
PR #108 gemergt: fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont; git-lfs wird eingerichtet (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/108 Commits: - fix(vault-sync): Vault mit LFS ohne git-lfs wird nicht mehr still als Zeigerdateien geklont; git-lfs wird eingerichtet (#76)
Author
Owner

PR #25 gemergt: fix(vault-sync): Meldung, wenn git-lfs auf dem Server fehlt (iris/Iris#76)
iris/2ndbrain-ios#25

Commits:

  • fix(vault-sync): Meldung, wenn git-lfs auf dem Server fehlt (iris/Iris#76)
PR #25 gemergt: fix(vault-sync): Meldung, wenn git-lfs auf dem Server fehlt (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/25 Commits: - fix(vault-sync): Meldung, wenn git-lfs auf dem Server fehlt (iris/Iris#76)
Author
Owner

PR #109 gemergt: feat(onboarding): git-lfs wird mit den Abhängigkeiten installiert und ist Pflicht, damit Vault-Anhänge aus der Schachtel funktionieren (#76)
#109

Commits:

  • feat(onboarding): git-lfs wird mit den Abhängigkeiten installiert und ist Pflicht, damit Vault-Anhänge aus der Schachtel funktionieren (#76)
PR #109 gemergt: feat(onboarding): git-lfs wird mit den Abhängigkeiten installiert und ist Pflicht, damit Vault-Anhänge aus der Schachtel funktionieren (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/109 Commits: - feat(onboarding): git-lfs wird mit den Abhängigkeiten installiert und ist Pflicht, damit Vault-Anhänge aus der Schachtel funktionieren (#76)
Author
Owner

Vault ohne git-lfs wurde still als Zeigerdateien geklont — behoben, git-lfs jetzt im Onboarding

Befund (VM mac-vm, Nutzerhinweis „ging verdächtig schnell“, später „die ganzen Anhänge fehlen“): du zeigt 550 MB statt ~58 GB, git lfs ist nicht installiert (Homebrew ja, git-lfs nein), alle 12 493 Dateien in _attachments/ sind nur Zeigerdateien, git clone lief ohne Fehler durch. Zusätzlich wären neue Anhänge ohne git-lfs als gewöhnliche Dateien im Verlauf gelandet.

Behoben:

  • configure (beide Server) klont ohne Checkout, prüft die .gitattributes des Remotes und bricht bei fehlendem git-lfs mit lfs_missing ab; nichts bleibt zurück, es werden keine Zugangsdaten gespeichert. Der Mac versucht davor, git-lfs einzurichten.
  • status meldet sync_state: error mit Klartext, wenn git-lfs bei einem LFS-Vault fehlt.
  • Entscheidung des Nutzers: Der Anwender soll nichts von Hand nachinstallieren, Iris muss aus der Schachtel funktionieren. Das Mac-Onboarding installiert git-lfs deshalb mit den Abhängigkeiten (Pflicht neben Homebrew, Node und Python; brew install git-lfs, danach git lfs install --skip-repo, sichtbar unter „System Requirements“, Teil von „Alle installieren“).

Geprüft: Linux 57 Tests, Mac 123 Prüfungen (Klon und Union ohne git-lfs abgelehnt, kein halber Klon, ohne LFS-Regel kein git-lfs nötig, Installer-Hook), beide Mac-Schemes und IrisRemote bauen. Nicht geprüft: die Brew-Installation in einer frischen VM durchgespielt. Der Linux-Dev-Server (iris-server) war beim letzten Deploy nicht erreichbar (SSH-Zeitüberschreitung, kein Ping), die LFS-Änderung ist dort noch nicht deployt.

Offen: Die VM ist weiter ein Zeigerdatei-Klon (Reparatur: git-lfs installieren, git lfs install --local && git lfs pull, oder Ordner löschen und neu verbinden); iOS hat keinen Installationsweg (Linux-Server hat git-lfs im Image).

## Vault ohne git-lfs wurde still als Zeigerdateien geklont — behoben, git-lfs jetzt im Onboarding **Befund (VM `mac-vm`, Nutzerhinweis „ging verdächtig schnell“, später „die ganzen Anhänge fehlen“):** `du` zeigt 550 MB statt ~58 GB, `git lfs` ist nicht installiert (Homebrew ja, git-lfs nein), alle 12 493 Dateien in `_attachments/` sind nur Zeigerdateien, `git clone` lief ohne Fehler durch. Zusätzlich wären neue Anhänge ohne git-lfs als gewöhnliche Dateien im Verlauf gelandet. **Behoben:** - `configure` (beide Server) klont ohne Checkout, prüft die `.gitattributes` des Remotes und bricht bei fehlendem git-lfs mit `lfs_missing` ab; nichts bleibt zurück, es werden keine Zugangsdaten gespeichert. Der Mac versucht davor, git-lfs einzurichten. - `status` meldet `sync_state: error` mit Klartext, wenn git-lfs bei einem LFS-Vault fehlt. - **Entscheidung des Nutzers:** Der Anwender soll nichts von Hand nachinstallieren, Iris muss aus der Schachtel funktionieren. Das Mac-Onboarding installiert git-lfs deshalb mit den Abhängigkeiten (Pflicht neben Homebrew, Node und Python; `brew install git-lfs`, danach `git lfs install --skip-repo`, sichtbar unter „System Requirements“, Teil von „Alle installieren“). **Geprüft:** Linux 57 Tests, Mac 123 Prüfungen (Klon und Union ohne git-lfs abgelehnt, kein halber Klon, ohne LFS-Regel kein git-lfs nötig, Installer-Hook), beide Mac-Schemes und IrisRemote bauen. **Nicht geprüft:** die Brew-Installation in einer frischen VM durchgespielt. Der Linux-Dev-Server (`iris-server`) war beim letzten Deploy nicht erreichbar (SSH-Zeitüberschreitung, kein Ping), die LFS-Änderung ist dort **noch nicht deployt**. **Offen:** Die VM ist weiter ein Zeigerdatei-Klon (Reparatur: git-lfs installieren, `git lfs install --local && git lfs pull`, oder Ordner löschen und neu verbinden); iOS hat keinen Installationsweg (Linux-Server hat git-lfs im Image).
Author
Owner

PR #60 gemergt: feat(vault-sync): Fortschrittsanzeige für Klon, Anhänge, Hochladen: GET /vault/sync/progress (iris/Iris#76)
iris/iris-linux-server#60

Commits:

  • feat(vault-sync): Fortschrittsanzeige für Klon, Anhänge, Hochladen: GET /vault/sync/progress (iris/Iris#76)
PR #60 gemergt: feat(vault-sync): Fortschrittsanzeige für Klon, Anhänge, Hochladen: GET /vault/sync/progress (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/60 Commits: - feat(vault-sync): Fortschrittsanzeige für Klon, Anhänge, Hochladen: GET /vault/sync/progress (iris/Iris#76)
Author
Owner

PR #110 gemergt: feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren: Balken, Menge, Tempo, Restzeit (#76)
#110

Commits:

  • feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren: Balken, Menge, Tempo, Restzeit (#76)
PR #110 gemergt: feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren: Balken, Menge, Tempo, Restzeit (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/110 Commits: - feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren: Balken, Menge, Tempo, Restzeit (#76)
Author
Owner

PR #26 gemergt: feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren (iris/Iris#76)
iris/2ndbrain-ios#26

Commits:

  • feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren (iris/Iris#76)
PR #26 gemergt: feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/26 Commits: - feat(vault-sync): Fortschrittsanzeige beim Verbinden und Synchronisieren (iris/Iris#76)
Author
Owner

Fortschrittsanzeige für große Übertragungen

Anlass (Nutzer, beim Verbinden eines ~60-GB-Vaults): Stundenlang bewegt sich auf dem Bildschirm nichts; das wirkt wie ein Absturz.

Gebaut (Linux- und Mac-Server gleich, Mac/IrisClient/iOS):

  • GET /vault/sync/progress → {active: false} oder {active, phase, percent, files_done, files_total, bytes_done, bytes_total, speed, eta_seconds}.
  • Der Server liest die Fortschrittsausgabe von git (--progress, GIT_PROGRESS_DELAY=0) und von git-lfs (GIT_LFS_PROGRESS, Bytes je Datei, aufsummiert). Die Gesamtgröße der Anhänge kommt exakt aus den Zeigerdateien (git lfs ls-files --json), der Prozentwert beim Laden der Anhänge also nach Bytes; Tempo und Restzeit aus den letzten 15 Sekunden (Restzeit nur geschätzt).
  • Sheet „Vault verbinden“: Balken mit Phase („Lade den Verlauf“, „Lade Anhänge“, „Schreibe Dateien“, „Lade hoch“), Prozent und „12,3 GB von 58,1 GB · 38 MB/s · noch etwa 20 Min“; ohne Prozentwert ein Drehkreis mit Phase. Die Lampe zeigt beim Synchronisieren „Lade Anhänge 43 %“. Abfrage jede Sekunde.
  • Beim Pull werden neue Anhänge vor dem Merge geladen (git lfs fetch), damit der Fortschritt sichtbar ist und der Merge nicht Stunden still steht.
  • Fehler nebenbei gefunden und behoben: git lfs fetch --progress gibt es nicht und hätte jeden Pull in ein LFS-Vault scheitern lassen. Regressionstest (rot ohne den Fix).

Geprüft: Linux 63 Tests (echtes git/git-lfs: Parser, Aufsummieren, großer LFS-Klon mit exakter Gesamtgröße, Route, Pull mit neuen Anhängen), Swift 143 Prüfungen (u. a. echter LFS-Klon mit 20 MB Anhängen), beide Mac-Schemes und IrisRemote bauen, Linux-Dev-Server deployt ({"active": false}).

Nicht geprüft: die Anzeige bei einem echten 58-GB-Transfer und die Oberfläche selbst (nicht bedient); Tempo und Restzeit sind bei kurzen Übertragungen ungenau. Wartezeit bis zum ersten Prozentwert: git meldet den Fortschritt der Anhänge erst, sobald die ersten Dateien durch sind.

## Fortschrittsanzeige für große Übertragungen **Anlass (Nutzer, beim Verbinden eines ~60-GB-Vaults):** Stundenlang bewegt sich auf dem Bildschirm nichts; das wirkt wie ein Absturz. **Gebaut (Linux- und Mac-Server gleich, Mac/IrisClient/iOS):** - `GET /vault/sync/progress` → `{active: false}` oder `{active, phase, percent, files_done, files_total, bytes_done, bytes_total, speed, eta_seconds}`. - Der Server liest die Fortschrittsausgabe von git (`--progress`, `GIT_PROGRESS_DELAY=0`) und von git-lfs (`GIT_LFS_PROGRESS`, Bytes je Datei, aufsummiert). Die Gesamtgröße der Anhänge kommt exakt aus den Zeigerdateien (`git lfs ls-files --json`), der Prozentwert beim Laden der Anhänge also nach Bytes; Tempo und Restzeit aus den letzten 15 Sekunden (Restzeit nur geschätzt). - Sheet „Vault verbinden“: Balken mit Phase („Lade den Verlauf“, „Lade Anhänge“, „Schreibe Dateien“, „Lade hoch“), Prozent und „12,3 GB von 58,1 GB · 38 MB/s · noch etwa 20 Min“; ohne Prozentwert ein Drehkreis mit Phase. Die Lampe zeigt beim Synchronisieren „Lade Anhänge 43 %“. Abfrage jede Sekunde. - Beim Pull werden neue Anhänge vor dem Merge geladen (`git lfs fetch`), damit der Fortschritt sichtbar ist und der Merge nicht Stunden still steht. - **Fehler nebenbei gefunden und behoben:** `git lfs fetch --progress` gibt es nicht und hätte jeden Pull in ein LFS-Vault scheitern lassen. Regressionstest (rot ohne den Fix). **Geprüft:** Linux 63 Tests (echtes git/git-lfs: Parser, Aufsummieren, großer LFS-Klon mit exakter Gesamtgröße, Route, Pull mit neuen Anhängen), Swift 143 Prüfungen (u. a. echter LFS-Klon mit 20 MB Anhängen), beide Mac-Schemes und IrisRemote bauen, Linux-Dev-Server deployt (`{"active": false}`). **Nicht geprüft:** die Anzeige bei einem echten 58-GB-Transfer und die Oberfläche selbst (nicht bedient); Tempo und Restzeit sind bei kurzen Übertragungen ungenau. Wartezeit bis zum ersten Prozentwert: git meldet den Fortschritt der Anhänge erst, sobald die ersten Dateien durch sind.
Author
Owner

PR #61 gemergt: fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht mehr ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (iris/Iris#76)
iris/iris-linux-server#61

Commits:

  • fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht mehr ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (iris/Iris#76)
PR #61 gemergt: fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht mehr ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/61 Commits: - fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht mehr ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (iris/Iris#76)
Author
Owner

PR #111 gemergt: fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (#76)
#111

Commits:

  • fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (#76)
PR #111 gemergt: fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/111 Commits: - fix(vault-sync): Fehlende Anhänge auf dem Server brechen das Verbinden nicht ab, unterbrochener Download setzt fort, Wächter lässt unfertigen Klon in Ruhe (#76)
Author
Owner

PR #27 gemergt: fix(vault-sync): Meldungen für fehlende Anhänge und unterbrochenen Download (iris/Iris#76)
iris/2ndbrain-ios#27

Commits:

  • fix(vault-sync): Meldungen für fehlende Anhänge und unterbrochenen Download (iris/Iris#76)
PR #27 gemergt: fix(vault-sync): Meldungen für fehlende Anhänge und unterbrochenen Download (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/27 Commits: - fix(vault-sync): Meldungen für fehlende Anhänge und unterbrochenen Download (iris/Iris#76)
Author
Owner

Fehlender Anhang auf dem Server und unterbrochener Download

Befund (VM, nach Stunden): „Not Found … smudge filter lfs failed“ für 04 Ressourcen/Aseprite/_attachments/50d98e8d_video.mp4. Das Objekt (37 MB) ist auf dem Studio vorhanden (git lfs fsck ok), fehlt aber im LFS-Speicher von Forgejo (404), es wurde dort nie hochgeladen. Der Checkout brach ab, und der Fehlerzweig löschte den ganzen Klon samt allen geladenen Anhängen.

Behoben (Linux- und Mac-Server gleich):

  • Anhänge werden vor dem Checkout geladen (git lfs fetch, mit Fortschritt); der Checkout kommt danach aus dem lokalen Speicher.
  • filter.lfs.required=false: Fehlt ein Anhang (404), bricht nichts ab. Seine Zeigerdatei bleibt im Vault und wird zurückgeschrieben (der Filter schreibt sonst eine leere Datei; der Wächter würde sie committen und beim anderen Rechner an die Stelle des Anhangs setzen). Die Antwort von configure zählt sie in missing_attachments.
  • Marker .git/iris-setup-incomplete: Klon und geladene Anhänge bleiben bei einem Abbruch (Netz, Zugangsdaten) stehen, configure antwortet resumable: true, ein erneutes „Verbinden“ setzt fort (mode: resumed). Solange der Klon unfertig ist, behandeln Wächter, Erkennung und Status das Vault als nicht eingerichtet; sonst committete git add -A „alles gelöscht“.
  • Auch beim Pull: neue Anhänge werden vor dem Merge geladen, einzelne fehlende stoppen den Sync nicht.
  • Meldungen in allen Clients: „n Anhänge fehlen auf dem Server und wurden übersprungen“ und „Das bisher Geladene bleibt erhalten: noch einmal Verbinden“.

Geprüft: Linux 66 Tests, Swift 156 Prüfungen (echtes git/git-lfs; fehlendes Objekt per GIT_LFS_SKIP_PUSH, Netzabbruch und Fortsetzen, Marker, saubere Arbeitskopie nach dem Zurückschreiben der Zeiger), beide Mac-Schemes und IrisRemote bauen, Linux-Dev-Server deployt. Nicht geprüft: ein echter Transfer von ~58 GB mit Unterbrechung.

Offen / Ursache: Auf dem Server fehlen weiter Objekte (mindestens 50d98e8d_video.mp4). Auf dem Studio liefert git lfs push --all origin sie nach (ändert den echten Forgejo, nicht ausgeführt, wartet auf das Okay des Nutzers).

## Fehlender Anhang auf dem Server und unterbrochener Download **Befund (VM, nach Stunden):** „Not Found … smudge filter lfs failed“ für `04 Ressourcen/Aseprite/_attachments/50d98e8d_video.mp4`. Das Objekt (37 MB) ist auf dem Studio vorhanden (`git lfs fsck` ok), fehlt aber im LFS-Speicher von Forgejo (404), es wurde dort nie hochgeladen. Der Checkout brach ab, und der Fehlerzweig **löschte den ganzen Klon samt allen geladenen Anhängen**. **Behoben (Linux- und Mac-Server gleich):** - Anhänge werden **vor dem Checkout** geladen (`git lfs fetch`, mit Fortschritt); der Checkout kommt danach aus dem lokalen Speicher. - `filter.lfs.required=false`: Fehlt ein Anhang (404), bricht nichts ab. Seine Zeigerdatei bleibt im Vault und wird **zurückgeschrieben** (der Filter schreibt sonst eine leere Datei; der Wächter würde sie committen und beim anderen Rechner an die Stelle des Anhangs setzen). Die Antwort von `configure` zählt sie in `missing_attachments`. - Marker `.git/iris-setup-incomplete`: Klon und geladene Anhänge bleiben bei einem Abbruch (Netz, Zugangsdaten) stehen, `configure` antwortet `resumable: true`, ein erneutes „Verbinden“ setzt fort (`mode: resumed`). Solange der Klon unfertig ist, behandeln Wächter, Erkennung und Status das Vault als nicht eingerichtet; sonst committete `git add -A` „alles gelöscht“. - Auch beim Pull: neue Anhänge werden vor dem Merge geladen, einzelne fehlende stoppen den Sync nicht. - Meldungen in allen Clients: „n Anhänge fehlen auf dem Server und wurden übersprungen“ und „Das bisher Geladene bleibt erhalten: noch einmal Verbinden“. **Geprüft:** Linux 66 Tests, Swift 156 Prüfungen (echtes git/git-lfs; fehlendes Objekt per `GIT_LFS_SKIP_PUSH`, Netzabbruch und Fortsetzen, Marker, saubere Arbeitskopie nach dem Zurückschreiben der Zeiger), beide Mac-Schemes und IrisRemote bauen, Linux-Dev-Server deployt. **Nicht geprüft:** ein echter Transfer von ~58 GB mit Unterbrechung. **Offen / Ursache:** Auf dem Server fehlen weiter Objekte (mindestens `50d98e8d_video.mp4`). Auf dem Studio liefert `git lfs push --all origin` sie nach (ändert den echten Forgejo, nicht ausgeführt, wartet auf das Okay des Nutzers).
Author
Owner

Entscheidung: eigener Forgejo auf jeder Iris-Installation (Standard)

Frage (Nutzer): Wo kommt der Forgejo-Server bei einer Neuinstallation von Null her (Henne-Ei)? Linux: Container im Iris-Image; Mac: ohne Docker?

Entscheidung des Nutzers: Jede Iris-Installation bringt per Standard einen eigenen, kleinen Forgejo mit. Er stört nicht (eine Datei, SQLite) und wird später für das Plugin iris-dev gebraucht (Nutzer entwickeln selbst an Iris; dafür braucht jeder einen Test-Forgejo auf der eigenen Maschine).

Geprüft (nur Fakten, nichts gebaut): Forgejo hat keine offiziellen macOS-Binaries (nur Linux amd64/arm64/arm), Homebrew hat eine Formel (16.0.6, Release 17.0.0, der Dev-Server läuft mit 15.0.9). Homebrew ist bei Iris ohnehin Pflicht, auf dem Mac geht es also ohne Docker per brew install forgejo + Hintergrunddienst; auf Linux als weiterer Compose-Dienst.

Plan: Abschnitt §7a in VAULT-SYNC.md (Entwurf, Teilschritte, offene Entscheidungen: Port ≠ 3000, nur lokales Netz, Token-Pflicht, Backup der Forgejo-Daten, Mac-Dienst per brew services oder von Iris gestartet, Updates, Erreichbarkeit unterwegs). Iris richtet Administrator, Repository iris-vault und Token selbst ein; weitere Rechner verbinden sich mit einem Verbindungscode statt Passwort. Der Weg zu einem fremden Forgejo bleibt daneben.

## Entscheidung: eigener Forgejo auf jeder Iris-Installation (Standard) **Frage (Nutzer):** Wo kommt der Forgejo-Server bei einer Neuinstallation von Null her (Henne-Ei)? Linux: Container im Iris-Image; Mac: ohne Docker? **Entscheidung des Nutzers:** Jede Iris-Installation bringt per Standard einen eigenen, kleinen Forgejo mit. Er stört nicht (eine Datei, SQLite) und wird später für das Plugin **iris-dev** gebraucht (Nutzer entwickeln selbst an Iris; dafür braucht jeder einen Test-Forgejo auf der eigenen Maschine). **Geprüft (nur Fakten, nichts gebaut):** Forgejo hat keine offiziellen macOS-Binaries (nur Linux amd64/arm64/arm), Homebrew hat eine Formel (16.0.6, Release 17.0.0, der Dev-Server läuft mit 15.0.9). Homebrew ist bei Iris ohnehin Pflicht, auf dem Mac geht es also ohne Docker per `brew install forgejo` + Hintergrunddienst; auf Linux als weiterer Compose-Dienst. **Plan:** Abschnitt §7a in `VAULT-SYNC.md` (Entwurf, Teilschritte, offene Entscheidungen: Port ≠ 3000, nur lokales Netz, Token-Pflicht, Backup der Forgejo-Daten, Mac-Dienst per `brew services` oder von Iris gestartet, Updates, Erreichbarkeit unterwegs). Iris richtet Administrator, Repository `iris-vault` und Token selbst ein; weitere Rechner verbinden sich mit einem Verbindungscode statt Passwort. Der Weg zu einem fremden Forgejo bleibt daneben.
Author
Owner

Der Entwurf „Eigener Forgejo auf jeder Iris-Installation“ (Plan §7a) ist nach einer Grill-me-Runde ein eigenes Feature: iris/Iris#112. Dort stehen die Spezifikation und die Meilensteine M1 bis M5. Dieses Issue (#76) bleibt der Vault-Sync; der interne Forgejo löst dort das Henne-Ei-Problem und den Verbindungsweg „Dieser Rechner“.

Der Entwurf „Eigener Forgejo auf jeder Iris-Installation“ (Plan §7a) ist nach einer Grill-me-Runde ein eigenes Feature: **iris/Iris#112**. Dort stehen die Spezifikation und die Meilensteine M1 bis M5. Dieses Issue (#76) bleibt der Vault-Sync; der interne Forgejo löst dort das Henne-Ei-Problem und den Verbindungsweg „Dieser Rechner“.
Author
Owner

Linux-Server-Teil (iris/iris-linux-server#105, gemergt)

  • Geändert: GET /vault/sync/status liefert zusätzlich remote (server[:port]/benutzer/repository, ohne Schema, Zugangsdaten und .git), nur mit Remote. Abwärtskompatibel: Clients behandeln das Feld als optional.
  • Geprüft: tests/test_vault_git_sync.py komplett (68 grün, lokal in einer Wegwerf-venv), darin neu test_status_remote_for_display und test_display_remote (Zugangsdaten werden entfernt, Port bleibt).
  • Nicht geprüft: Lauf der Routen-Tests gegen den laufenden iris-server (rsync-Deploy steht aus); echtes Forgejo.
  • Zusammenhang: Teil des Info-Fensters zur Lampe; Clients in iris/Iris und IrisRemote, Wire-Doku im Wurzel-Repo.
**Linux-Server-Teil (iris/iris-linux-server#105, gemergt)** - **Geändert:** `GET /vault/sync/status` liefert zusätzlich `remote` (`server[:port]/benutzer/repository`, ohne Schema, Zugangsdaten und `.git`), nur mit Remote. Abwärtskompatibel: Clients behandeln das Feld als optional. - **Geprüft:** `tests/test_vault_git_sync.py` komplett (68 grün, lokal in einer Wegwerf-venv), darin neu `test_status_remote_for_display` und `test_display_remote` (Zugangsdaten werden entfernt, Port bleibt). - **Nicht geprüft:** Lauf der Routen-Tests gegen den laufenden iris-server (rsync-Deploy steht aus); echtes Forgejo. - **Zusammenhang:** Teil des Info-Fensters zur Lampe; Clients in iris/Iris und IrisRemote, Wire-Doku im Wurzel-Repo.
Author
Owner

PR #211 gemergt: feat(vault-sync): Klick auf die Statuslampe zeigt Erklärung und Git-Server (#76)
#211

Commits:

  • feat(vault-sync): Klick auf die Statuslampe zeigt Erklärung und Git-Server (#76)

Stand: Klick auf die Statuslampe öffnet ein Info-Fenster

  • Befund: Die Lampe war nur eine Anzeige. Wohin abgeglichen wird, was ein Zustand bedeutet und wo man das ändert, stand nirgends.
  • Geändert: Die Lampe ist anklickbar (Iris, IrisClient). Das Popover zeigt den Status mit Erklärung je Zustand (inkl. Zahl wartender Änderungen), die Adresse des Git-Servers (server/benutzer/repository), den letzten Abgleich und einen Hinweis auf Einstellungen → Git-Server …; „Verbindung ändern …“ öffnet „Vault verbinden“. Wire: GET /vault/sync/status hat das optionale Feld remote (Mac-Server, Linux-Server in eigenem PR, Wire-Doku im Wurzel-Repo). Handbuchkapitel „Vault-Synchronisation“ um den Klick ergänzt.
  • Geprüft: scripts/test-vault-sync-core.sh (165 Prüfungen, 0 Fehler, darin neu die Adressanzeige ohne Zugangsdaten); Xcode-Build von Iris erfolgreich.
  • Nicht geprüft: Das Popover wurde nicht angesehen oder bedient; Layout und Text sind ungesehen. IrisClient wurde nicht eigens gebaut (teilt den Code). Der Screenshot des Nutzers war nicht lesbar.
  • Offen: Bei einem älteren Server ohne remote steht „Adresse nicht verfügbar“.
PR #211 gemergt: feat(vault-sync): Klick auf die Statuslampe zeigt Erklärung und Git-Server (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/211 Commits: - feat(vault-sync): Klick auf die Statuslampe zeigt Erklärung und Git-Server (#76) --- **Stand: Klick auf die Statuslampe öffnet ein Info-Fenster** - **Befund:** Die Lampe war nur eine Anzeige. Wohin abgeglichen wird, was ein Zustand bedeutet und wo man das ändert, stand nirgends. - **Geändert:** Die Lampe ist anklickbar (Iris, IrisClient). Das Popover zeigt den Status mit Erklärung je Zustand (inkl. Zahl wartender Änderungen), die Adresse des Git-Servers (`server/benutzer/repository`), den letzten Abgleich und einen Hinweis auf Einstellungen → Git-Server …; „Verbindung ändern …“ öffnet „Vault verbinden“. Wire: `GET /vault/sync/status` hat das optionale Feld `remote` (Mac-Server, Linux-Server in eigenem PR, Wire-Doku im Wurzel-Repo). Handbuchkapitel „Vault-Synchronisation“ um den Klick ergänzt. - **Geprüft:** `scripts/test-vault-sync-core.sh` (165 Prüfungen, 0 Fehler, darin neu die Adressanzeige ohne Zugangsdaten); Xcode-Build von Iris erfolgreich. - **Nicht geprüft:** Das Popover wurde nicht angesehen oder bedient; Layout und Text sind ungesehen. IrisClient wurde nicht eigens gebaut (teilt den Code). Der Screenshot des Nutzers war nicht lesbar. - **Offen:** Bei einem älteren Server ohne `remote` steht „Adresse nicht verfügbar“.
Author
Owner

PR #52 gemergt: feat(vault-sync): Klick auf die Lampe zeigt Erklärung und Git-Server (iris/Iris#76)
iris/2ndbrain-ios#52

Commits:

  • feat(vault-sync): Klick auf die Lampe zeigt Erklärung und Git-Server (iris/Iris#76)

Stand (IrisRemote): Klick auf die Lampe zeigt Erklärung und Verbindung

  • Geändert: Die Lampe öffnet ein Sheet mit Erklärung zum Status, Adresse des Git-Servers (Feld remote aus /vault/sync/status), letztem Abgleich und Hinweis zur Konfiguration; „Verbindung ändern …“ öffnet „Vault verbinden“. Gleiche Texte wie am Mac.
  • Geprüft: xcodebuild für generic/platform=iOS ohne Signierung: BUILD SUCCEEDED.
  • Nicht geprüft: Nicht auf Gerät oder Simulator gestartet, Layout ungesehen. Nichts auf ein iPhone installiert.
PR #52 gemergt: feat(vault-sync): Klick auf die Lampe zeigt Erklärung und Git-Server (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/52 Commits: - feat(vault-sync): Klick auf die Lampe zeigt Erklärung und Git-Server (iris/Iris#76) --- **Stand (IrisRemote): Klick auf die Lampe zeigt Erklärung und Verbindung** - **Geändert:** Die Lampe öffnet ein Sheet mit Erklärung zum Status, Adresse des Git-Servers (Feld `remote` aus `/vault/sync/status`), letztem Abgleich und Hinweis zur Konfiguration; „Verbindung ändern …“ öffnet „Vault verbinden“. Gleiche Texte wie am Mac. - **Geprüft:** `xcodebuild` für `generic/platform=iOS` ohne Signierung: BUILD SUCCEEDED. - **Nicht geprüft:** Nicht auf Gerät oder Simulator gestartet, Layout ungesehen. Nichts auf ein iPhone installiert.
Author
Owner

PR #125 gemergt: docs(wire): Vault-Sync-Status um remote erweitert (iris/Iris#76)
alf/2ndbrain#125

Commits:

  • docs(wire): Vault-Sync-Status um remote erweitert (iris/Iris#76)
PR #125 gemergt: docs(wire): Vault-Sync-Status um remote erweitert (iris/Iris#76) https://forgejo.lewerken.duckdns.org/alf/2ndbrain/pulls/125 Commits: - docs(wire): Vault-Sync-Status um remote erweitert (iris/Iris#76)
Author
Owner

PR #111 gemergt: feat(forgejo): Repository beim Bereitstellen wählen, kein vorbereitetes iris-vault (iris/Iris#76)
iris/iris-linux-server#111

Commits:

  • feat(forgejo): Repository beim Bereitstellen wählen, kein vorbereitetes iris-vault (iris/Iris#76)

Stand (Linux-Server): Repository beim Bereitstellen wählen, kein vorbereitetes iris-vault

  • Geändert: ensure_setup legt nur noch den Administrator an, kein Repository mehr. Neu: GET /forgejo/repositories (Liste des eigenen Git-Servers, gleiche Felder wie die Anmeldeliste). POST /forgejo/publish-vault nimmt {repository?} (Standard iris-vault, fehlendes wird privat angelegt; 400 invalid_repository_name bei unzulässigem Namen). So lassen sich mehrere Vaults auf einem Git-Server ablegen.
  • Geprüft: test_forgejo_service.py (angepasst, neue Tests für Liste, gewählten Namen, ungültige Namen) und test_forgejo_sharing.py grün (35). Live auf iris-server: GET /forgejo/repositories liefert iris-vault, ein ungültiger Name wird mit 400 abgelehnt.
  • Nicht geprüft: Veröffentlichen in ein neues Repository mit echtem Vault; Ablauf aus der App.
PR #111 gemergt: feat(forgejo): Repository beim Bereitstellen wählen, kein vorbereitetes iris-vault (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/111 Commits: - feat(forgejo): Repository beim Bereitstellen wählen, kein vorbereitetes iris-vault (iris/Iris#76) --- **Stand (Linux-Server): Repository beim Bereitstellen wählen, kein vorbereitetes `iris-vault`** - **Geändert:** `ensure_setup` legt nur noch den Administrator an, kein Repository mehr. Neu: `GET /forgejo/repositories` (Liste des eigenen Git-Servers, gleiche Felder wie die Anmeldeliste). `POST /forgejo/publish-vault` nimmt `{repository?}` (Standard `iris-vault`, fehlendes wird privat angelegt; `400 invalid_repository_name` bei unzulässigem Namen). So lassen sich mehrere Vaults auf einem Git-Server ablegen. - **Geprüft:** `test_forgejo_service.py` (angepasst, neue Tests für Liste, gewählten Namen, ungültige Namen) und `test_forgejo_sharing.py` grün (35). Live auf iris-server: `GET /forgejo/repositories` liefert `iris-vault`, ein ungültiger Name wird mit 400 abgelehnt. - **Nicht geprüft:** Veröffentlichen in ein neues Repository mit echtem Vault; Ablauf aus der App.
Author
Owner

PR #214 gemergt: feat(vault-sync): Kein Sync als Standard, Repository beim Bereitstellen wählen (#76)
#214

Commits:

  • feat(vault-sync): Kein Sync als Standard, Repository beim Bereitstellen wählen (#76)

Stand (App): Vault standardmäßig ohne Forgejo, „Kein Sync“, Repository beim Bereitstellen wählen

  • Befund / Wunsch: Mehrere Vaults auf einem Git-Server kollidierten über den festen Namen iris-vault; das Vault sollte außerdem nicht automatisch verbunden werden.
  • Geändert: (1) Onboarding verbindet das Vault nicht mehr automatisch; die Lampe ist dann grau mit „Kein Sync“, ein Klick öffnet „Vault verbinden“. (2) „Auf diesem Rechner bereitstellen“ zeigt die Repositories des eigenen Git-Servers zur Auswahl; „Hinzufügen“ merkt ein neues vor (Name vorausgefüllt iris-vault, sonst iris-vault-2 …), angelegt wird es erst mit „Verbinden“. „Anmelden …“ führt wie bisher zur Auswahl/Neuanlage nach der Anmeldung. (3) Mac-Server: GET /forgejo/repositories, publish-vault {repository?}, Administrator ohne vorbereitetes Repository. (4) Backup-Wiederherstellung verbindet das Vault nur noch, wenn es vorher auf dem eigenen Git-Server lag (Marker; enthält jetzt den Repository-Namen). (5) Handbuchkapitel angepasst.
  • Geprüft: Xcode-Build von Iris erfolgreich; test-forgejo-core.sh 41 Prüfungen, 0 Fehler (neu: Repository-Namen).
  • Nicht geprüft: Nichts davon bedient oder gesehen (Auswahl, Hinzufügen, Verbinden, graue Lampe); echter Forgejo-Lauf des Core-Tests übersprungen; Wiederherstellung nicht ausprobiert; IrisClient nicht eigens gebaut.
  • Offen: Ein Vault, das schon verbunden ist, bleibt verbunden; der Marker alter Stände (leer) gilt als iris-vault.
PR #214 gemergt: feat(vault-sync): Kein Sync als Standard, Repository beim Bereitstellen wählen (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/214 Commits: - feat(vault-sync): Kein Sync als Standard, Repository beim Bereitstellen wählen (#76) --- **Stand (App): Vault standardmäßig ohne Forgejo, „Kein Sync“, Repository beim Bereitstellen wählen** - **Befund / Wunsch:** Mehrere Vaults auf einem Git-Server kollidierten über den festen Namen `iris-vault`; das Vault sollte außerdem nicht automatisch verbunden werden. - **Geändert:** (1) Onboarding verbindet das Vault nicht mehr automatisch; die Lampe ist dann grau mit „Kein Sync“, ein Klick öffnet „Vault verbinden“. (2) „Auf diesem Rechner bereitstellen“ zeigt die Repositories des eigenen Git-Servers zur Auswahl; „Hinzufügen“ merkt ein neues vor (Name vorausgefüllt `iris-vault`, sonst `iris-vault-2` …), angelegt wird es erst mit „Verbinden“. „Anmelden …“ führt wie bisher zur Auswahl/Neuanlage nach der Anmeldung. (3) Mac-Server: `GET /forgejo/repositories`, `publish-vault {repository?}`, Administrator ohne vorbereitetes Repository. (4) Backup-Wiederherstellung verbindet das Vault nur noch, wenn es vorher auf dem eigenen Git-Server lag (Marker; enthält jetzt den Repository-Namen). (5) Handbuchkapitel angepasst. - **Geprüft:** Xcode-Build von Iris erfolgreich; `test-forgejo-core.sh` 41 Prüfungen, 0 Fehler (neu: Repository-Namen). - **Nicht geprüft:** Nichts davon bedient oder gesehen (Auswahl, Hinzufügen, Verbinden, graue Lampe); echter Forgejo-Lauf des Core-Tests übersprungen; Wiederherstellung nicht ausprobiert; IrisClient nicht eigens gebaut. - **Offen:** Ein Vault, das schon verbunden ist, bleibt verbunden; der Marker alter Stände (leer) gilt als `iris-vault`.
Author
Owner

PR #53 gemergt: feat(vault-sync): Kein Sync und Repository-Auswahl bei Dieser Rechner (iris/Iris#76)
iris/2ndbrain-ios#53

Commits:

  • feat(vault-sync): Kein Sync und Repository-Auswahl bei Dieser Rechner (iris/Iris#76)

Stand (IrisRemote): „Kein Sync“ und Repository-Auswahl bei „Dieser Rechner“

  • Geändert: Graue Lampe „Kein Sync“ statt des Knopfs, Tipp öffnet „Vault verbinden“; „Dieser Rechner“ zeigt die Repositories des Git-Servers zur Auswahl, „Hinzufügen“ merkt ein neues vor (Standardname iris-vault, sonst -2 …), „Verbinden“ legt es an und lädt das Vault hoch. Nutzt GET /forgejo/repositories und publish-vault {repository}.
  • Geprüft: xcodebuild für generic/platform=iOS ohne Signierung: BUILD SUCCEEDED.
  • Nicht geprüft: Nicht gestartet oder bedient; nichts auf ein iPhone installiert.
PR #53 gemergt: feat(vault-sync): Kein Sync und Repository-Auswahl bei Dieser Rechner (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/53 Commits: - feat(vault-sync): Kein Sync und Repository-Auswahl bei Dieser Rechner (iris/Iris#76) --- **Stand (IrisRemote): „Kein Sync“ und Repository-Auswahl bei „Dieser Rechner“** - **Geändert:** Graue Lampe „Kein Sync“ statt des Knopfs, Tipp öffnet „Vault verbinden“; „Dieser Rechner“ zeigt die Repositories des Git-Servers zur Auswahl, „Hinzufügen“ merkt ein neues vor (Standardname `iris-vault`, sonst `-2` …), „Verbinden“ legt es an und lädt das Vault hoch. Nutzt `GET /forgejo/repositories` und `publish-vault {repository}`. - **Geprüft:** `xcodebuild` für `generic/platform=iOS` ohne Signierung: BUILD SUCCEEDED. - **Nicht geprüft:** Nicht gestartet oder bedient; nichts auf ein iPhone installiert.
Author
Owner

PR #127 gemergt: docs(wire): Repository-Auswahl beim Bereitstellen auf dem eigenen Git-Server (iris/Iris#76)
alf/2ndbrain#127

Commits:

  • docs(wire): Repository-Auswahl beim Bereitstellen auf dem eigenen Git-Server (iris/Iris#76)
PR #127 gemergt: docs(wire): Repository-Auswahl beim Bereitstellen auf dem eigenen Git-Server (iris/Iris#76) https://forgejo.lewerken.duckdns.org/alf/2ndbrain/pulls/127 Commits: - docs(wire): Repository-Auswahl beim Bereitstellen auf dem eigenen Git-Server (iris/Iris#76)
Author
Owner

PR #112 gemergt: fix(forgejo): Zertifikat der Freigabe mit serverAuth, macOS lehnte es ab (iris/Iris#76)
iris/iris-linux-server#112

Commits:

  • fix(forgejo): Zertifikat der Freigabe mit serverAuth, macOS lehnte es ab (iris/Iris#76)

Stand (Linux-Server): „Stimmt – vertrauen“ scheiterte, weil dem Zertifikat serverAuth fehlte

  • Befund: Beim Verbinden einer frischen Iris (Mac-VM) mit dem Git-Server von iris-server blieb die Fingerabdruck-Rückfrage nach „Stimmt – vertrauen“ ohne Wirkung. Ursache: Das von forgejo_sharing.py ausgestellte Zertifikat hatte keine Extended Key Usage serverAuth. macOS lehnt das auch bei bestätigter CA ab (security verify-cert: „Invalid Extended Key Usage for policy“); OpenSSL (curl, git) prüft das nicht, deshalb liefen meine Tests über curl/git durch.
  • Geändert: Das Zertifikat bekommt serverAuth und KeyUsage digitalSignature. Ein Zertifikat des älteren Aufbaus wird beim nächsten Serverstart automatisch neu ausgestellt (CERT_VERSION); die CA und damit der Fingerabdruck bleiben unverändert.
  • Geprüft: Test auf serverAuth und auf Neuausstellung (12 Tests in test_forgejo_sharing.py grün). Deploy auf iris-server: neues Zertifikat trägt „TLS Web Server Authentication“, CA unverändert, security verify-cert auf dem Mac: „certificate verification successful“.
  • Nicht geprüft: „Stimmt – vertrauen“ in der App selbst (Mac-VM); iOS-Vertrauen.
PR #112 gemergt: fix(forgejo): Zertifikat der Freigabe mit serverAuth, macOS lehnte es ab (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/112 Commits: - fix(forgejo): Zertifikat der Freigabe mit serverAuth, macOS lehnte es ab (iris/Iris#76) --- **Stand (Linux-Server): „Stimmt – vertrauen“ scheiterte, weil dem Zertifikat serverAuth fehlte** - **Befund:** Beim Verbinden einer frischen Iris (Mac-VM) mit dem Git-Server von iris-server blieb die Fingerabdruck-Rückfrage nach „Stimmt – vertrauen“ ohne Wirkung. Ursache: Das von `forgejo_sharing.py` ausgestellte Zertifikat hatte keine Extended Key Usage `serverAuth`. macOS lehnt das auch bei bestätigter CA ab (`security verify-cert`: „Invalid Extended Key Usage for policy“); OpenSSL (curl, git) prüft das nicht, deshalb liefen meine Tests über curl/git durch. - **Geändert:** Das Zertifikat bekommt `serverAuth` und KeyUsage `digitalSignature`. Ein Zertifikat des älteren Aufbaus wird beim nächsten Serverstart automatisch neu ausgestellt (`CERT_VERSION`); die CA und damit der Fingerabdruck bleiben unverändert. - **Geprüft:** Test auf serverAuth und auf Neuausstellung (12 Tests in `test_forgejo_sharing.py` grün). Deploy auf iris-server: neues Zertifikat trägt „TLS Web Server Authentication“, CA unverändert, `security verify-cert` auf dem Mac: „certificate verification successful“. - **Nicht geprüft:** „Stimmt – vertrauen“ in der App selbst (Mac-VM); iOS-Vertrauen.
Author
Owner

PR #113 gemergt: fix(vault-sync): Anmeldung ignoriert Leerzeichen um das Passwort (iris/Iris#76)
iris/iris-linux-server#113

Commits:

  • fix(vault-sync): Anmeldung ignoriert Leerzeichen um das Passwort (iris/Iris#76)

Stand (Linux-Server): Anmeldung ignoriert Leerzeichen/Zeilenumbruch um das Passwort

  • Geändert: vault_forge.login schneidet Leerzeichen und Zeilenumbrüche an den Rändern des Passworts ab (Einfügen aus der Zwischenablage). Test test_login_ignores_whitespace_around_a_pasted_password.
  • Geprüft: test_forgejo_service.py grün (25); auf iris-server deployt.
  • Nicht geprüft: Ablauf aus IrisRemote.
PR #113 gemergt: fix(vault-sync): Anmeldung ignoriert Leerzeichen um das Passwort (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/113 Commits: - fix(vault-sync): Anmeldung ignoriert Leerzeichen um das Passwort (iris/Iris#76) --- **Stand (Linux-Server): Anmeldung ignoriert Leerzeichen/Zeilenumbruch um das Passwort** - **Geändert:** `vault_forge.login` schneidet Leerzeichen und Zeilenumbrüche an den Rändern des Passworts ab (Einfügen aus der Zwischenablage). Test `test_login_ignores_whitespace_around_a_pasted_password`. - **Geprüft:** `test_forgejo_service.py` grün (25); auf iris-server deployt. - **Nicht geprüft:** Ablauf aus IrisRemote.
Author
Owner

PR #215 gemergt: fix(vault-sync): Passwort anzeigen, kopieren und Längenhinweis beim Verbinden (#76)
#215

Commits:

  • fix(vault-sync): Passwort anzeigen, kopieren und Längenhinweis beim Verbinden (#76)

Stand (App): Passwort beim Verbinden besser prüfbar; Kopieren-Knopf

  • Anlass: Beim Verbinden einer frischen Iris (Mac-VM, auch auf dem Mac-Studio) mit dem Git-Server von iris-server meldete die App „Benutzer oder Passwort stimmen nicht“. Der Anmelde-Code der App funktioniert mit dem richtigen Passwort (Testprogramm gegen den Server: OK; mit Zeilenumbruch am Ende: auth). Der Nutzer berichtet, im eingefügten Passwort fehlten die Unterstriche; im Feld standen 27 statt 32 Zeichen. Die Ursache des Verlusts ist nicht gefunden.
  • Geändert (vorbeugend): Anmeldefeld mit „Passwort anzeigen“ (Auge) und bei falschem Passwort der Hinweis „Eingegeben: N Zeichen“; Leerzeichen und Zeilenumbrüche an den Rändern des Passworts werden ignoriert (VaultForge.login); in den Git-Server-Einstellungen neuer Knopf „Passwort kopieren“ (legt den exakten Text in die Zwischenablage) und die Anzeige ohne Markdown (Text(verbatim:)). iOS: Auge und Längenhinweis.
  • Geprüft: Xcode-Build Iris und iOS (ohne Signierung) erfolgreich.
  • Nicht geprüft: Nichts davon bedient; ob „Passwort kopieren“ das Problem löst, ist offen. Ob das Auswählen/Kopieren aus der Anzeige Unterstriche verliert, wurde nicht nachgewiesen (Render-Versuch ohne Ergebnis).
PR #215 gemergt: fix(vault-sync): Passwort anzeigen, kopieren und Längenhinweis beim Verbinden (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/215 Commits: - fix(vault-sync): Passwort anzeigen, kopieren und Längenhinweis beim Verbinden (#76) --- **Stand (App): Passwort beim Verbinden besser prüfbar; Kopieren-Knopf** - **Anlass:** Beim Verbinden einer frischen Iris (Mac-VM, auch auf dem Mac-Studio) mit dem Git-Server von iris-server meldete die App „Benutzer oder Passwort stimmen nicht“. Der Anmelde-Code der App funktioniert mit dem richtigen Passwort (Testprogramm gegen den Server: OK; mit Zeilenumbruch am Ende: `auth`). Der Nutzer berichtet, im eingefügten Passwort fehlten die Unterstriche; im Feld standen 27 statt 32 Zeichen. **Die Ursache des Verlusts ist nicht gefunden.** - **Geändert (vorbeugend):** Anmeldefeld mit „Passwort anzeigen“ (Auge) und bei falschem Passwort der Hinweis „Eingegeben: N Zeichen“; Leerzeichen und Zeilenumbrüche an den Rändern des Passworts werden ignoriert (`VaultForge.login`); in den Git-Server-Einstellungen neuer Knopf „Passwort kopieren“ (legt den exakten Text in die Zwischenablage) und die Anzeige ohne Markdown (`Text(verbatim:)`). iOS: Auge und Längenhinweis. - **Geprüft:** Xcode-Build Iris und iOS (ohne Signierung) erfolgreich. - **Nicht geprüft:** Nichts davon bedient; ob „Passwort kopieren“ das Problem löst, ist offen. Ob das Auswählen/Kopieren aus der Anzeige Unterstriche verliert, wurde nicht nachgewiesen (Render-Versuch ohne Ergebnis).
Author
Owner

PR #54 gemergt: fix(vault-sync): Passwort anzeigen und Längenhinweis beim Verbinden (iris/Iris#76)
iris/2ndbrain-ios#54

Commits:

  • fix(vault-sync): Passwort anzeigen und Längenhinweis beim Verbinden (iris/Iris#76)
PR #54 gemergt: fix(vault-sync): Passwort anzeigen und Längenhinweis beim Verbinden (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/54 Commits: - fix(vault-sync): Passwort anzeigen und Längenhinweis beim Verbinden (iris/Iris#76)
Author
Owner

PR #216 gemergt: feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (#76)
#216

Commits:

  • feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (#76)
PR #216 gemergt: feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (#76) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/216 Commits: - feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (#76)
Author
Owner

PR #55 gemergt: feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (iris/Iris#76)
iris/2ndbrain-ios#55

Commits:

  • feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (iris/Iris#76)
PR #55 gemergt: feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (iris/Iris#76) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/55 Commits: - feat(vault-sync): Passwort beim Verbinden standardmäßig als Text anzeigen (iris/Iris#76)
Author
Owner

Stand 2026-10-28: Test Linux-Server ↔ frische Mac-VM

  • Geprüft (vom Nutzer und per Messung): Vault von iris-server auf die frische Mac-VM geholt (Onboarding „Vault von Forgejo holen“, Anmeldung am Git-Server https://192.168.178.153:3300, Fingerabdruck der Iris-CA bestätigt). Automatischer Abgleich in beide Richtungen ohne „Synchronisieren“: Anlegen einer Notiz auf der VM → Wächter-Commit nach 92 s → Push nach 9 s → Linux-Server holt nach 28 s (gesamt 2 min 9 s, per Mitschnitt auf der VM und Git-Verlauf auf dem Server gemessen). Änderungen und Löschungen im Quell-Vault (Linux) erschienen ohne manuellen Abgleich auf der VM (Aussage des Nutzers). Der Nutzer ist mit der Geschwindigkeit zufrieden, kein Echtzeitabgleich nötig.
  • Auf dem Weg gefunden und behoben: Zertifikat der Freigabe ohne serverAuth (macOS lehnte es ab); .git des Vaults und vault-sync-credentials.json gehörten root (#107); Freigabe des Git-Servers auch auf dem Linux-Server; Repository beim Bereitstellen wählbar statt fest iris-vault; graue Lampe „Kein Sync“ als Standard; Info-Fenster zur Lampe mit Git-Server-Adresse; Passwort im Anmeldefeld sichtbar, Längenhinweis, „Passwort kopieren“.
  • Nicht geprüft: iOS (IrisRemote) gegen den Linux-Server; Konflikt-Dialog im Zusammenspiel; großes Vault mit vielen LFS-Anhängen; IP-Wechsel bei freigegebenem Linux-Server (Freigabe aus- und einschalten); Weboberfläche und „Zugang entziehen“ im echten Betrieb.
  • Offen: Verbindungscode statt Passwort-Eintippen (Konzept im Plan, nicht gebaut); Schriftgrößen/Lesbarkeit der Oberfläche (iris/Iris#217); Ursache der falschen Zeichen im Passwortfeld (am Ende zwei Tippfehler, kein Fehler der App); _load_credentials() meldet einen unlesbaren Datei-Zugriff als „Zugangsdaten abgelehnt“ (nicht entschieden); Deploy-Vorlage docker-compose.deploy.yml.template ohne Port 3300.
**Stand 2026-10-28: Test Linux-Server ↔ frische Mac-VM** - **Geprüft (vom Nutzer und per Messung):** Vault von iris-server auf die frische Mac-VM geholt (Onboarding „Vault von Forgejo holen“, Anmeldung am Git-Server `https://192.168.178.153:3300`, Fingerabdruck der Iris-CA bestätigt). Automatischer Abgleich in beide Richtungen ohne „Synchronisieren“: Anlegen einer Notiz auf der VM → Wächter-Commit nach 92 s → Push nach 9 s → Linux-Server holt nach 28 s (gesamt 2 min 9 s, per Mitschnitt auf der VM und Git-Verlauf auf dem Server gemessen). Änderungen und Löschungen im Quell-Vault (Linux) erschienen ohne manuellen Abgleich auf der VM (Aussage des Nutzers). Der Nutzer ist mit der Geschwindigkeit zufrieden, kein Echtzeitabgleich nötig. - **Auf dem Weg gefunden und behoben:** Zertifikat der Freigabe ohne `serverAuth` (macOS lehnte es ab); `.git` des Vaults und `vault-sync-credentials.json` gehörten root (#107); Freigabe des Git-Servers auch auf dem Linux-Server; Repository beim Bereitstellen wählbar statt fest `iris-vault`; graue Lampe „Kein Sync“ als Standard; Info-Fenster zur Lampe mit Git-Server-Adresse; Passwort im Anmeldefeld sichtbar, Längenhinweis, „Passwort kopieren“. - **Nicht geprüft:** iOS (IrisRemote) gegen den Linux-Server; Konflikt-Dialog im Zusammenspiel; großes Vault mit vielen LFS-Anhängen; IP-Wechsel bei freigegebenem Linux-Server (Freigabe aus- und einschalten); Weboberfläche und „Zugang entziehen“ im echten Betrieb. - **Offen:** Verbindungscode statt Passwort-Eintippen (Konzept im Plan, nicht gebaut); Schriftgrößen/Lesbarkeit der Oberfläche (iris/Iris#217); Ursache der falschen Zeichen im Passwortfeld (am Ende zwei Tippfehler, kein Fehler der App); `_load_credentials()` meldet einen unlesbaren Datei-Zugriff als „Zugangsdaten abgelehnt“ (nicht entschieden); Deploy-Vorlage `docker-compose.deploy.yml.template` ohne Port 3300.
alf 2026-10-28 12:59:44 +00:00
alf reopened this issue 2026-10-28 14:50:36 +00:00
alf closed this issue 2026-10-31 09:14:41 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/Iris#76
No description provided.