diff --git a/FEATURES.md b/FEATURES.md index a0e0ca6..9ef2d2b 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -333,6 +333,7 @@ Einzurichten unter *Mein Konto → Benachrichtigungen*, pro Konto und beliebig v | ⚠️ **Abgleich fehlgeschlagen** | Das Git-System war nicht erreichbar oder hat abgelehnt | | 🔴 **CI rot** | Der letzte Lauf auf dem Default-Branch ist fehlgeschlagen | | 🏷️ **Neues Release** | Ein neuer Tag oder ein neues Release ist aufgetaucht | +| 🕸️ **Projekt steht still** | Seit längerem kein Commit — Schwelle einstellbar, Vorgabe 60 Tage | ### Nur bei Änderung @@ -348,6 +349,24 @@ Zwei Feinheiten: - Der Merkstand wird auch dann fortgeschrieben, wenn **kein** Ziel eingerichtet ist. Sonst käme beim ersten eingerichteten Ziel die ganze Vergangenheit hinterher. +### Stillstand + +Der einzige Anlass, der an keinem Ereignis hängt — es passiert ja gerade nichts. Deshalb +ein eigener Durchlauf, **höchstens einmal am Tag**, unabhängig vom automatischen Abgleich. +Hört niemand auf diesen Anlass, läuft die Prüfung gar nicht erst. + +Maßstab ist ausschließlich der **letzte Commit** im verknüpften Repository. Das +Änderungsdatum des Projekts taugt nicht: jeder Abgleich fasst es an und würde den +Stillstand immer wieder zurücksetzen. Projekte **ohne Repository** bleiben deshalb außen +vor, ebenso fertige und archivierte. + +Gemeldet wird je Projekt einmal. Erneut erst, wenn danach wieder ein Commit kam und es +seitdem wieder still geworden ist — ein Projekt, das aufwacht und wieder einschläft, meldet +sich also ein zweites Mal. + +Die Schwelle setzt ein Administrator unter *Admin-Einstellungen → Stillstand* (14 Tage bis +ein Jahr). Eine Änderung wirkt sofort, nicht erst nach 24 Stunden. + ### Zustellwege | Weg | Details | @@ -466,6 +485,8 @@ Datenbank): | `auth/password` | scrypt-Rundlauf, unterschiedliches Salz, Ablageformat, Verhalten bei kaputten Hashes, Passwortregeln | | `tasks` | Berechnung des abgeleiteten Fortschritts, Spaltenreihenfolge | | `notify/pending` | Wann eine Benachrichtigung fällig ist: neuer Fehler ja, gleicher Fehler nein; CI-Wechsel nach rot; Release erst ab dem zweiten Abgleich | +| `notify/stale` | Stillstandsschwelle, keine Zweitmeldung, aber erneute Meldung nach zwischenzeitlicher Aktivität | +| `validation` | Dass jeder Anlass, den die Oberfläche anbietet, auch vom Schema akzeptiert wird — entstanden aus genau diesem Fehler | **`npm run test:e2e` — Ende-zu-Ende** (Playwright, 13 Stück, rund 20 Sekunden). Läuft gegen die gebaute Anwendung mit eigener Datenbank auf Port 3111 — also durch Middleware, diff --git a/ROADMAP.md b/ROADMAP.md index a82b247..765ee51 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -11,13 +11,7 @@ Was bereits steht, listet [FEATURES.md](FEATURES.md). ## 1 · Als Nächstes empfohlen -### 1.1 Stillstehende Projekte melden `S` - -Die Benachrichtigungen decken Fehler und Releases ab. Was fehlt, ist der -sanfte Stups: „Seit 60 Tagen kein Commit". Braucht einen eigenen Durchlauf, -weil es kein Ereignis gibt, an dem es hängt — der Zeitgeber ist da. - -### 1.2 Webhooks statt Polling `M` +### 1.1 Webhooks statt Polling `M` Ein Push aktualisiert den Snapshot sofort, statt bis zum nächsten Durchlauf zu warten. Braucht einen öffentlich erreichbaren Endpunkt mit @@ -117,6 +111,7 @@ Damit klar ist, was **nicht** kommt und warum: | **v0.5.0** Aufgabenbrett je Projekt mit sortierbaren Spalten, Fortschritt aus Aufgaben | ✓ | | **v0.6.0** Ende-zu-Ende-Tests mit Playwright, CI-Pipeline für Gitea Actions | ✓ | | **v0.7.0** Benachrichtigungen über ntfy, Webhook und E-Mail | ✓ | +| **v0.8.0** Stillstehende Projekte melden, Schwelle im Adminbereich | ✓ | Zur Entscheidung beim Export: Git-Tokens gehen **nicht** mit. Die Verbindung wird nur beschrieben, das Token ist nach dem Import neu zu hinterlegen. Snapshots bleiben diff --git a/package.json b/package.json index 57379d6..2bcb6da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nebula", - "version": "0.7.0", + "version": "0.8.0", "private": true, "description": "Nebula – Dashboard fuer Vibe-Coding Projekte mit Git-Anbindung (GitHub, GitLab, Gitea)", "scripts": {