Quelle: bugs.md #11 — Nutzer-gemeldet, live in der App
Nutzer-Meldung: App bleibt beim Anlegen eines /ip pool-Eintrags im Experte-Tab dauerhaft hängen (kein Fehler, kein Selbst-Erholen, Force-Quit nötig).
Root Cause:SSHTransport.connect()/run(_:) hatten keinen Timeout — im Gegensatz zu RestTransport (timeoutInterval = 5). Jeder erste Schreibvorgang einer Session löst über ensureSessionBackup() eine dedizierte SSH-Verbindung aus (BackupService); hängt dieser connect()-Aufruf (Netzwerk-Aussetzer, schwacher Router unter Last), blieb isApplying unbegrenzt aktiv.
Fix: neuer generischer SSHTransport.withTimeout(_:operation:) (TaskGroup-Race gegen eine Deadline), angewendet auf connect() (10s) und run(_:) (30s). 3 neue Regressionstests für die Race-Logik isoliert (unabhängig von Citadel/echtem Netzwerk).
Nebenbefund:xcodegen generate überschreibt Info.plist komplett aus project.yml (kein Merge) — dabei versehentlich die App-Version stillschweigend zurückgesetzt. In project.yml jetzt explizit verankert.
Build + alle 106 Unit-Tests grün. Root Cause vom Nutzer bestätigt (Experte-Tab, dauerhaft hängend) bevor der Fix geschrieben wurde — nicht erneut live nachgestellt.
**Quelle:** bugs.md #11 — Nutzer-gemeldet, live in der App
Nutzer-Meldung: App bleibt beim Anlegen eines `/ip pool`-Eintrags im Experte-Tab dauerhaft hängen (kein Fehler, kein Selbst-Erholen, Force-Quit nötig).
**Root Cause:** `SSHTransport.connect()`/`run(_:)` hatten keinen Timeout — im Gegensatz zu `RestTransport` (`timeoutInterval = 5`). Jeder erste Schreibvorgang einer Session löst über `ensureSessionBackup()` eine dedizierte SSH-Verbindung aus (`BackupService`); hängt dieser `connect()`-Aufruf (Netzwerk-Aussetzer, schwacher Router unter Last), blieb `isApplying` unbegrenzt aktiv.
**Fix:** neuer generischer `SSHTransport.withTimeout(_:operation:)` (TaskGroup-Race gegen eine Deadline), angewendet auf `connect()` (10s) und `run(_:)` (30s). 3 neue Regressionstests für die Race-Logik isoliert (unabhängig von Citadel/echtem Netzwerk).
**Nebenbefund:** `xcodegen generate` überschreibt `Info.plist` komplett aus `project.yml` (kein Merge) — dabei versehentlich die App-Version stillschweigend zurückgesetzt. In `project.yml` jetzt explizit verankert.
Build + alle 106 Unit-Tests grün. Root Cause vom Nutzer bestätigt (Experte-Tab, dauerhaft hängend) bevor der Fix geschrieben wurde — nicht erneut live nachgestellt.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Quelle: bugs.md #11 — Nutzer-gemeldet, live in der App
Nutzer-Meldung: App bleibt beim Anlegen eines
/ip pool-Eintrags im Experte-Tab dauerhaft hängen (kein Fehler, kein Selbst-Erholen, Force-Quit nötig).Root Cause:
SSHTransport.connect()/run(_:)hatten keinen Timeout — im Gegensatz zuRestTransport(timeoutInterval = 5). Jeder erste Schreibvorgang einer Session löst überensureSessionBackup()eine dedizierte SSH-Verbindung aus (BackupService); hängt dieserconnect()-Aufruf (Netzwerk-Aussetzer, schwacher Router unter Last), bliebisApplyingunbegrenzt aktiv.Fix: neuer generischer
SSHTransport.withTimeout(_:operation:)(TaskGroup-Race gegen eine Deadline), angewendet aufconnect()(10s) undrun(_:)(30s). 3 neue Regressionstests für die Race-Logik isoliert (unabhängig von Citadel/echtem Netzwerk).Nebenbefund:
xcodegen generateüberschreibtInfo.plistkomplett ausproject.yml(kein Merge) — dabei versehentlich die App-Version stillschweigend zurückgesetzt. Inproject.ymljetzt explizit verankert.Build + alle 106 Unit-Tests grün. Root Cause vom Nutzer bestätigt (Experte-Tab, dauerhaft hängend) bevor der Fix geschrieben wurde — nicht erneut live nachgestellt.