Ein fehlgeschlagener Abgleich loescht den letzten guten Stand #20

Closed
opened 2026-09-01 15:49:51 +00:00 by florian.wilde · 2 comments
Owner

persistSnapshot in lib/sync/index.ts überschreibt Branches, Tags, Commits, Releases, Sprachen, PRs und Issues bedingungslos mit dem, was fetchRepo geliefert hat:

branchCount: data.branches.length,
tagCount: data.tags.length,
branches: data.branches as unknown as object,
tags: data.tags as unknown as object,
commits: data.commits as unknown as object,
releases: data.releases as unknown as object,

Kommen die Listen leer zurück, weil die Abrufe gescheitert sind (siehe #19), ist der vorher gespeicherte Stand weg — überschrieben mit Nullen, ohne Fehler, ohne Rückfrage.

Beobachtet

Genau so verloren gegangen: Ältere Repositories, die seit dem Auftreten des Problems nicht abgeglichen wurden, tragen ihre Commits, Tags und Branches noch. syslog-platform hatte sie ebenfalls — bis auf „Jetzt synchronisieren" gedrückt wurde. Ein Klick, und der letzte brauchbare Stand ist ersetzt.

Das macht die Fehlersuche teurer, als sie sein müsste: jeder Versuch, das Problem nachzustellen, zerstört weitere Daten.

Zu tun

Ein Abgleich, der eine Liste nicht holen konnte, darf die vorhandene nicht ersetzen. Der Snapshot ist ein Zwischenspeicher, kein Protokoll — ein alter Stand mit einem sichtbaren Hinweis „zuletzt erfolgreich am …" ist in jedem Fall brauchbarer als eine leere Liste, die aussieht wie eine Aussage.

Wichtig ist die Unterscheidung, die es heute nicht gibt: leer geholt (das Repository hat wirklich keine Tags) gegenüber nicht geholt (der Abruf ist gescheitert). Nur der zweite Fall darf den Bestand stehen lassen. Setzt damit #19 voraus.

`persistSnapshot` in `lib/sync/index.ts` überschreibt Branches, Tags, Commits, Releases, Sprachen, PRs und Issues bedingungslos mit dem, was `fetchRepo` geliefert hat: ```ts branchCount: data.branches.length, tagCount: data.tags.length, branches: data.branches as unknown as object, tags: data.tags as unknown as object, commits: data.commits as unknown as object, releases: data.releases as unknown as object, ``` Kommen die Listen leer zurück, weil die Abrufe gescheitert sind (siehe #19), ist der vorher gespeicherte Stand weg — überschrieben mit Nullen, ohne Fehler, ohne Rückfrage. ## Beobachtet Genau so verloren gegangen: Ältere Repositories, die seit dem Auftreten des Problems nicht abgeglichen wurden, tragen ihre Commits, Tags und Branches noch. `syslog-platform` hatte sie ebenfalls — bis auf „Jetzt synchronisieren" gedrückt wurde. Ein Klick, und der letzte brauchbare Stand ist ersetzt. Das macht die Fehlersuche teurer, als sie sein müsste: jeder Versuch, das Problem nachzustellen, zerstört weitere Daten. ## Zu tun Ein Abgleich, der eine Liste nicht holen konnte, darf die vorhandene nicht ersetzen. Der Snapshot ist ein **Zwischenspeicher**, kein Protokoll — ein alter Stand mit einem sichtbaren Hinweis „zuletzt erfolgreich am …" ist in jedem Fall brauchbarer als eine leere Liste, die aussieht wie eine Aussage. Wichtig ist die Unterscheidung, die es heute nicht gibt: **leer geholt** (das Repository hat wirklich keine Tags) gegenüber **nicht geholt** (der Abruf ist gescheitert). Nur der zweite Fall darf den Bestand stehen lassen. Setzt damit #19 voraus.
florian.wilde added the in-arbeit label 2026-09-01 15:50:28 +00:00
Author
Owner

🤖 Claude Code hat mit der Umsetzung begonnen — zusammen mit #19.

  • Branch: fix/19-abrufe-nicht-verschlucken
  • Verstanden als: Eine Liste, die nicht geholt werden konnte, darf die gespeicherte nicht ersetzen. „Leer geholt“ und „nicht geholt“ müssen unterscheidbar werden.
  • Warum auf demselben Branch: genau diese Unterscheidung entsteht in #19. Ohne sie könnte persistSnapshot gar nicht wissen, wann es den Bestand stehen lassen soll — getrennt umgesetzt wäre es geraten. Der PR schließt beide Issues, die Zeit läuft auf #19.

Zeiterfassung läuft (auf #19).

🤖 **Claude Code hat mit der Umsetzung begonnen — zusammen mit #19.** - Branch: `fix/19-abrufe-nicht-verschlucken` - Verstanden als: Eine Liste, die nicht geholt werden konnte, darf die gespeicherte nicht ersetzen. „Leer geholt“ und „nicht geholt“ müssen unterscheidbar werden. - Warum auf demselben Branch: genau diese Unterscheidung entsteht in #19. Ohne sie könnte `persistSnapshot` gar nicht wissen, wann es den Bestand stehen lassen soll — getrennt umgesetzt wäre es geraten. Der PR schließt beide Issues, die Zeit läuft auf #19. Zeiterfassung läuft (auf #19).
florian.wilde added zu-testen and removed in-arbeit labels 2026-09-01 16:09:58 +00:00
Author
Owner

🚀 Freigegeben und nach main übernommen — zusammen mit #19.

  • Merge-Commit: 97ba863
  • Pull Request: #21 (gemergt)
  • Zeit erfasst auf #19 (gemeinsamer Branch): 00:19

persistSnapshot lässt jetzt stehen, was nicht geholt werden konnte. Nachgewiesen gegen einen nachgebauten Gitea-Server, dessen Teillisten 403 liefern: Branches, Tags, Commits und Releases bleiben unverändert, completeAt wird nicht fortgeschrieben, und nach dem nächsten gesunden Durchlauf räumt sich der Hinweis von selbst weg.

Issue wird geschlossen.

🚀 **Freigegeben und nach `main` übernommen** — zusammen mit #19. <!-- claude-status merge: 97ba8633564f6571fd66b64e154cf083b38159fd pr: 21 zeit_sekunden: 0 --> - Merge-Commit: `97ba863` - Pull Request: #21 (gemergt) - Zeit erfasst auf #19 (gemeinsamer Branch): 00:19 `persistSnapshot` lässt jetzt stehen, was nicht geholt werden konnte. Nachgewiesen gegen einen nachgebauten Gitea-Server, dessen Teillisten 403 liefern: Branches, Tags, Commits und Releases bleiben unverändert, `completeAt` wird nicht fortgeschrieben, und nach dem nächsten gesunden Durchlauf räumt sich der Hinweis von selbst weg. Issue wird geschlossen.
florian.wilde removed the zu-testen label 2026-09-09 20:05:55 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/nebula#20