Zwanzig feste Abzeichen plus dynamische für vollständig gesehene Filmreihen und abgeschlossene Universen. Sie tauchen auf, wenn etwas erreicht ist, und bleiben dann — keine Streaks, keine Fortschrittsbalken, kein Drängeln.
Spider Bro
Für Filmreihen braucht es keine gepflegte Liste: TMDB gruppiert sie selbst, und tmdbCollectionId liegt beim Import schon am Titel. „Alle Spider-Man gesehen" ist damit eine Abfrage, kein Sonderfall.
Umgesetzt ist der Vorschlag aus dem Issue — beides:
generisch als Grundlage: „Reihe komplett — Nordlicht Filmreihe", funktioniert für jede Reihe
kuratierte Eigennamen obendrauf in src/lib/achievement-names.ts: eine Zeile pro Reihe, sonst nichts
Eine Absicherung, auf die ich bestanden habe
Ich habe die TMDB-Collection-Kennungen aus dem Gedächtnis geschrieben und kann sie hier nicht gegen TMDB prüfen — der Entwicklungsaufbau spricht mit einem Stub. Eine falsch abgeschriebene Kennung würde jemandem das falsche Abzeichen geben: wer Ocean's durchhat, bekäme „Spider Bro".
Deshalb trägt jeder kuratierte Eintrag ein Stück des erwarteten TMDB-Namens:
Passt der Name der Reihe nicht dazu, wird der Eintrag ignoriert und der generische greift. Ein Tippfehler bleibt folgenlos. Ein Test deckt genau das ab.
Alle Regeln arbeiten auf einem Datensatz, der einmal geholt wird. Sonst stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen würden zwanzig Abfragen bei jedem Abhaken.
Ausgewertet wird nach Sichtungsaktionen und einmal täglich. Der erste Lauf eines Kontos ist stumm — eine gewachsene Bibliothek löst sonst zwei Dutzend Meldungen auf einmal aus. Beim ersten Öffnen der Übersicht wird dieser stumme Lauf angestoßen, sonst bliebe sie bis zum nächsten Hintergrundlauf leer.
Einmal erreicht, bleibt erreicht. Wer eine Sichtung zurücknimmt, verliert kein Abzeichen.
Ein Fehler, den der Test gefunden hat
Die Uhrzeit-Regel („zwischen drei und fünf") las die Stunde aus der formatierten Zeichenkette. Auf Deutsch liefert Intl für eine einzelne Stunde aber „03 Uhr", und Number("03 Uhr") ist NaN — das Abzeichen wäre nie vergeben worden. Jetzt über formatToParts.
Der Test war absichtlich so gebaut, dass er den Zeitzonenversatz mitprüft: 01:30 UTC ist 03:30 in Berlin. Wer in Serverzeit rechnet, verpasst es.
Geprüft
88 Tests grün (vorher 78), Typecheck sauber. Zehn neue: Stummschaltung, Entdopplung, „bleibt erreicht", Zeitzone in beide Richtungen, eingefrorene Namen, die Absicherung der kuratierten Einträge.
Screenshot gegen die geseedete Instanz aufgenommen — nebenbei fiel dabei auf, dass die klebende Kopfleiste sich über Ausschnitte legt; das Aufnahmeskript hebt sie jetzt fürs Bild auf. Entwicklungsdatenbank wieder im Ausgangszustand.
Zwanzig feste Abzeichen plus dynamische für vollständig gesehene **Filmreihen** und abgeschlossene **Universen**. Sie tauchen auf, wenn etwas erreicht ist, und bleiben dann — keine Streaks, keine Fortschrittsbalken, kein Drängeln.

## Spider Bro
Für Filmreihen braucht es **keine gepflegte Liste**: TMDB gruppiert sie selbst, und `tmdbCollectionId` liegt beim Import schon am Titel. „Alle Spider-Man gesehen" ist damit eine Abfrage, kein Sonderfall.
Umgesetzt ist der Vorschlag aus dem Issue — beides:
- **generisch als Grundlage**: „Reihe komplett — Nordlicht Filmreihe", funktioniert für jede Reihe
- **kuratierte Eigennamen obendrauf** in `src/lib/achievement-names.ts`: eine Zeile pro Reihe, sonst nichts
## Eine Absicherung, auf die ich bestanden habe
Ich habe die TMDB-Collection-Kennungen **aus dem Gedächtnis** geschrieben und kann sie hier nicht gegen TMDB prüfen — der Entwicklungsaufbau spricht mit einem Stub. Eine falsch abgeschriebene Kennung würde jemandem das falsche Abzeichen geben: wer Ocean's durchhat, bekäme „Spider Bro".
Deshalb trägt jeder kuratierte Eintrag ein Stück des **erwarteten TMDB-Namens**:
```ts
556: { name: "Spider Bro", symbol: "spinne", erwartet: "Spider-Man" },
```
Passt der Name der Reihe nicht dazu, wird der Eintrag ignoriert und der generische greift. Ein Tippfehler bleibt folgenlos. Ein Test deckt genau das ab.
## Der Katalog
| Gruppe | Abzeichen |
|---|---|
| Anfänge | Erstkontakt, Abgehakt, Schlüsselmeister, Heimkehrer |
| Reihen | Reihe komplett *(dynamisch)*, Universum vollendet *(dynamisch)*, Chronologe |
| Ausdauer | Serientäter, Vielseher, Ein ganzer Tag, Eine ganze Woche, Marathon, Der lange Atem, Treu geblieben, Wiederholungstäter |
| Breite | Feinschmecker, Zeitreisender, Kritiker, Strenges Urteil |
| Ordnung | Sammler, Aufgeräumt, Durchgemacht |
## Wie es gerechnet wird
**Alle Regeln arbeiten auf einem Datensatz**, der einmal geholt wird. Sonst stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen würden zwanzig Abfragen bei jedem Abhaken.
Ausgewertet wird nach Sichtungsaktionen und einmal täglich. Der **erste Lauf eines Kontos ist stumm** — eine gewachsene Bibliothek löst sonst zwei Dutzend Meldungen auf einmal aus. Beim ersten Öffnen der Übersicht wird dieser stumme Lauf angestoßen, sonst bliebe sie bis zum nächsten Hintergrundlauf leer.
**Einmal erreicht, bleibt erreicht.** Wer eine Sichtung zurücknimmt, verliert kein Abzeichen.
## Ein Fehler, den der Test gefunden hat
Die Uhrzeit-Regel („zwischen drei und fünf") las die Stunde aus der formatierten Zeichenkette. Auf Deutsch liefert `Intl` für eine einzelne Stunde aber **„03 Uhr"**, und `Number("03 Uhr")` ist `NaN` — das Abzeichen wäre nie vergeben worden. Jetzt über `formatToParts`.
Der Test war absichtlich so gebaut, dass er den Zeitzonenversatz mitprüft: 01:30 UTC ist 03:30 in Berlin. Wer in Serverzeit rechnet, verpasst es.
## Geprüft
**88 Tests grün** (vorher 78), Typecheck sauber. Zehn neue: Stummschaltung, Entdopplung, „bleibt erreicht", Zeitzone in beide Richtungen, eingefrorene Namen, die Absicherung der kuratierten Einträge.
Screenshot gegen die geseedete Instanz aufgenommen — nebenbei fiel dabei auf, dass die klebende Kopfleiste sich über Ausschnitte legt; das Aufnahmeskript hebt sie jetzt fürs Bild auf. Entwicklungsdatenbank wieder im Ausgangszustand.
Closes #15
Zwanzig feste Abzeichen plus dynamische fuer vollstaendig gesehene Filmreihen
und abgeschlossene Universen. Sie tauchen auf, wenn etwas erreicht ist, und
bleiben — auch wenn die Bedingung spaeter wegfaellt. Eine zurueckgenommene
Sichtung soll kein Abzeichen kosten.
Alle Regeln arbeiten auf *einem* Datensatz, der einmal geholt wird. Sonst
stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen wuerden
zwanzig Abfragen bei jedem Abhaken. Ausgewertet wird nach Sichtungsaktionen
und einmal taeglich; der erste Lauf eines Kontos ist stumm, weil eine
gewachsene Bibliothek sonst zwei Dutzend Meldungen auf einmal ausloest.
Fuer Filmreihen braucht es keine gepflegte Liste: TMDB gruppiert sie selbst,
und tmdbCollectionId liegt beim Import schon am Titel. Eigennamen wie
"Spider Bro" kommen aus einer kleinen Datendatei obendrauf; fehlt ein Eintrag,
greift der generische Name.
Die kuratierten Eintraege tragen jeweils ein Stueck des erwarteten
TMDB-Namens. Ich habe die Collection-Kennungen aus dem Gedaechtnis
geschrieben und kann sie hier nicht gegen TMDB pruefen — passt der Name
nicht, wird der Eintrag ignoriert und der generische greift. Eine falsch
abgeschriebene Kennung bleibt damit folgenlos statt jemandem das falsche
Abzeichen zu geben.
Die Uhrzeit-Regel liest die Stunde ueber formatToParts statt ueber die
formatierte Zeichenkette: auf Deutsch liefert Intl fuer eine einzelne Stunde
"03 Uhr", und daraus wird beim Umwandeln NaN. Ein Test hat das aufgedeckt.
Beim ersten Oeffnen der Uebersicht wird einmal ausgewertet — sonst bliebe sie
bei einem Bestandskonto leer, bis nachts der Hintergrundlauf kommt.
Zehn Tests, Anleitung mit Screenshot. Symbole als eigene SVG auf einem
gemeinsamen Raster; erreicht und offen unterscheiden sich nicht nur durch
Farbe, sondern auch im Text.
Refs #15
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.
Zwanzig feste Abzeichen plus dynamische für vollständig gesehene Filmreihen und abgeschlossene Universen. Sie tauchen auf, wenn etwas erreicht ist, und bleiben dann — keine Streaks, keine Fortschrittsbalken, kein Drängeln.
Spider Bro
Für Filmreihen braucht es keine gepflegte Liste: TMDB gruppiert sie selbst, und
tmdbCollectionIdliegt beim Import schon am Titel. „Alle Spider-Man gesehen" ist damit eine Abfrage, kein Sonderfall.Umgesetzt ist der Vorschlag aus dem Issue — beides:
src/lib/achievement-names.ts: eine Zeile pro Reihe, sonst nichtsEine Absicherung, auf die ich bestanden habe
Ich habe die TMDB-Collection-Kennungen aus dem Gedächtnis geschrieben und kann sie hier nicht gegen TMDB prüfen — der Entwicklungsaufbau spricht mit einem Stub. Eine falsch abgeschriebene Kennung würde jemandem das falsche Abzeichen geben: wer Ocean's durchhat, bekäme „Spider Bro".
Deshalb trägt jeder kuratierte Eintrag ein Stück des erwarteten TMDB-Namens:
Passt der Name der Reihe nicht dazu, wird der Eintrag ignoriert und der generische greift. Ein Tippfehler bleibt folgenlos. Ein Test deckt genau das ab.
Der Katalog
Wie es gerechnet wird
Alle Regeln arbeiten auf einem Datensatz, der einmal geholt wird. Sonst stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen würden zwanzig Abfragen bei jedem Abhaken.
Ausgewertet wird nach Sichtungsaktionen und einmal täglich. Der erste Lauf eines Kontos ist stumm — eine gewachsene Bibliothek löst sonst zwei Dutzend Meldungen auf einmal aus. Beim ersten Öffnen der Übersicht wird dieser stumme Lauf angestoßen, sonst bliebe sie bis zum nächsten Hintergrundlauf leer.
Einmal erreicht, bleibt erreicht. Wer eine Sichtung zurücknimmt, verliert kein Abzeichen.
Ein Fehler, den der Test gefunden hat
Die Uhrzeit-Regel („zwischen drei und fünf") las die Stunde aus der formatierten Zeichenkette. Auf Deutsch liefert
Intlfür eine einzelne Stunde aber „03 Uhr", undNumber("03 Uhr")istNaN— das Abzeichen wäre nie vergeben worden. Jetzt überformatToParts.Der Test war absichtlich so gebaut, dass er den Zeitzonenversatz mitprüft: 01:30 UTC ist 03:30 in Berlin. Wer in Serverzeit rechnet, verpasst es.
Geprüft
88 Tests grün (vorher 78), Typecheck sauber. Zehn neue: Stummschaltung, Entdopplung, „bleibt erreicht", Zeitzone in beide Richtungen, eingefrorene Namen, die Absicherung der kuratierten Einträge.
Screenshot gegen die geseedete Instanz aufgenommen — nebenbei fiel dabei auf, dass die klebende Kopfleiste sich über Ausschnitte legt; das Aufnahmeskript hebt sie jetzt fürs Bild auf. Entwicklungsdatenbank wieder im Ausgangszustand.
Closes #15