Files
MindSift/Doku/modules/tasks.md
T
sandrodachandClaude Opus 5.5 d1982816c1
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m34s
fix(alarms): give up after three runs without delivery (FLAW-12)
New column alarm_failures counts ticker runs in which no channel
delivered; at three the alarm is marked as done and a warning is logged
instead of retrying every minute forever. Success, a new due date or
reopening the task starts over with three attempts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 12:22:13 +01:00

7.8 KiB

Modul: Aufgaben, Kanban & Alarme

Code: TasksView.tsx, TaskDetailModal.tsx, ManageColumnsModal.tsx; Backend: handleUpdateThought, handleReorderTasks, *TaskList*-Handler, startAlarmTicker.

Datenmodell

Eine Aufgabe ist ein thought (database.md) mit kanbanStatus, priority (low/normal/high/urgent), dueDate (YYYY-MM-DD oder mit Uhrzeit YYYY-MM-DDTHH:MM; die API nimmt auch YYYY-MM-DD HH:MM an), notes (Markdown), subtasks ([{id, title, isCompleted}]), tags, taskListId, sortOrder und assignees (Benutzer-IDs). Aufgaben ohne Liste sind persönlich.

Ansichten

  • Liste mit Filtern (offen, erledigt, Papierkorb), Gruppierung (z. B. nach Status oder Fälligkeit), Sortierung und Hashtag-Filter.
  • Kanban: Spalten pro Liste frei konfigurierbar (Name, Farbe, „Erledigt“-Spalte). Standard: Zu erledigen, In Bearbeitung, Wartet auf andere, Erledigt. Eine Karte in eine „Erledigt“-Spalte zu ziehen setzt isCompleted.
  • Drag & Drop sortiert in der Liste und zwischen Spalten; ein Klick öffnet das Detail-Fenster (Titel, Status, Priorität, Fälligkeit mit optionaler Uhrzeit und Schnellwahl, Liste, Hashtags, Unteraufgaben mit Fortschrittsbalken, Notizen).
  • Aufgaben lassen sich in eine Notiz umwandeln („Als Notiz vertiefen“). Aufgaben aus Notiz-Checkboxen (enhanced-task) bleiben verknüpft: Abhaken wirkt in beide Richtungen (SyncDocBlockAndTask), „In Notiz öffnen“ springt zum Block.

Aufgabenlisten und Freigabe

  • Jede Liste hat Eigentümer, Titel, Symbol, Farbe und eigene Kanban-Spalten.
  • Freigabe an Gruppen oder Benutzer über den Dialog UnifiedShareModal (Stufe pro Freigabe):
    • Bearbeiter: darf Aufgaben anlegen, ändern, abhaken, verschieben, löschen sowie Liste umbenennen und Spalten ändern.
    • Leser: sieht alles, kann nichts ändern. Der Server antwortet mit 403; die Oberfläche blendet Eingaben aus und zeigt „Nur Lesen“.
    • Gruppenmitglieder mit mehreren Wegen erhalten die höchste Stufe. Nur der Eigentümer legt Freigaben an oder entfernt sie und kann die Liste löschen.
  • Umsetzung: Store.GetTaskListPermission liefert owner/editor/viewer/""; ensureTaskListWritable schützt Schreibpfade.
  • Zuweisen (nur in geteilten Listen, also mit mindestens einer Person außer dem Eigentümer): Im Detail-Fenster unter „Zugewiesen“ lassen sich eine oder mehrere Personen mit Zugriff auf die Liste zuweisen, über die einheitliche Personensuche (ui-patterns.md). Zuweisen dürfen Eigentümer und Bearbeiter. Zeilen und Kanban-Karten zeigen die Zugewiesenen als Profilbild-Stapel.
    • Gespeichert in task_assignees; PATCH /thoughts/{id} mit assignees ersetzt die Liste. Der Server lehnt Personen ohne Zugriff ab (403, storage.ErrAssigneeNoAccess).
    • Zuweisungen folgen den Rechten: Store.PruneTaskAssignees entfernt jede Zuweisung, deren Person die Liste nicht mehr sehen kann. Es läuft nach Entfernen einer Freigabe, Austritt aus oder Entfernen aus einer Gruppe, Löschen einer Gruppe, Löschen der Liste und Verschieben der Aufgabe in eine andere oder keine Liste; beim Löschen eines Kontos werden dessen Zuweisungen direkt gelöscht. Wer über einen zweiten Weg (z. B. direkt und über eine Gruppe) weiter Zugriff hat, bleibt zugewiesen.
  • Wer sehen und zuweisen kann, hängt außerdem von der Sichtbarkeit ab: Verliert jemand sie (z. B. Wechsel der Organisation), fallen Freigabe und Zuweisungen weg (sharing-and-permissions.md).
  • Bekannte Lücke: FLAW-03 (Umsortieren per ID).

Wiederkehrende Aufgaben

  • Im Detail-Fenster unter der Fälligkeit: Keine Wiederholung, täglich, wöchentlich, monatlich oder jährlich (thoughts.recurrence, PATCH /thoughts/{id} mit recurrence). Zeilen und Kanban-Karten zeigen dann ein 🔁-Symbol.
  • Abhaken erzeugt die nächste Aufgabe (recurrence.go): egal ob im Detail, in der Liste, per Ziehen in „Erledigt“ im Kanban oder über die Checkbox in einer Notiz. Die erledigte Aufgabe bleibt erledigt (Historie); die neue übernimmt Titel, Tags, Priorität, Notizen, Liste, Zuweisungen und die Regel, Unteraufgaben kommen unerledigt mit, sie steht in der ersten offenen Spalte.
  • Fälligkeit: das bisherige Datum plus ein Intervall (ohne Datum ab heute); eine Uhrzeit bleibt erhalten. Monate und Jahre behalten den Tag oder rutschen auf das Monatsende (31.1. → 28./29.2.).
  • Jede Aufgabe erzeugt höchstens eine Nachfolgerin (recurrence_spawned): Wieder öffnen und erneut abhaken legt keine zweite an.
  • Die neue Aufgabe geht per TASK_CREATED an alle Beteiligten, sie erscheint ohne Neuladen.
  • Export/Import: im Markdown-Archiv als 🔁 every week (Format des Obsidian-Tasks-Plugins), im JSON-Backup als Feld; beides wird beim Import wiederhergestellt.

Alarme

Der Ticker läuft jede Minute (architecture.md). Für offene Aufgaben mit alarm_sent = 0 sendet er, sobald der Alarmzeitpunkt erreicht ist (Uhrzeit der Fälligkeit, ganztägig 9:00, jeweils minus notifyBeforeMinutes, Zeitzone TZ), an die Kanäle des Aufgaben-Eigentümers:

Kanal Ziel Konfiguration
E-Mail alarmEmail (sonst Konto-Adresse) SMTP aus Admin-Einstellungen oder Umgebung, siehe unten
Discord Webhook-URL Benutzereinstellungen
Webhook beliebige URL (JSON: event, title, notes, dueDate, priority, timestamp) Benutzereinstellungen

Danach wird alarm_sent = 1 gesetzt, sobald mindestens ein Kanal erfolgreich war.

E-Mail-Versand (mail.go) führt den SMTP-Dialog Schritt für Schritt:

  • Verbindung (Port 465: TLS von Anfang an), EHLO mit der Domain der Absenderadresse (nie localhost, das lehnen strenge Server ab), bei SMTP_TLS Pflicht-STARTTLS, Anmeldung, MAIL FROM, RCPT TO, Daten.
  • Anmeldung: AUTH PLAIN; bietet der Server nur LOGIN an, direkt AUTH LOGIN. Lehnt er PLAIN ab und bietet auch LOGIN an, baut MindSift die Verbindung neu auf und versucht AUTH LOGIN (Go schließt die Verbindung nach einem gescheiterten AUTH). Scheitern beide mit 451, nennt die Meldung beide Versuche und verweist auf das SASL-Backend des Mailservers (z. B. Dovecot-Auth), denn dann liegt der Fehler dort. Nie unverschlüsselt an fremde Hosts.
  • SMTP_FROM darf einen Namen enthalten (MindSift <alarm@domain>): im Umschlag steht nur die Adresse, im Header Name und Adresse.
  • Die Nachricht hat Date und Message-ID, einen nach RFC 2047 kodierten Betreff (Umlaute, Emoji) und einen Quoted-Printable-Text.
  • SMTP_SKIP_VERIFY / Schalter „Zertifikatsprüfung deaktivieren“ akzeptiert selbstsignierte Zertifikate (Verbindung bleibt verschlüsselt).
  • Fehler nennen den Schritt, an dem der Server abgelehnt hat (z. B. SMTP-Schritt RCPT TO fehlgeschlagen: 451 …), im Log als smtp_step. Test: internal/api/mail_test.go mit einem Fake-Server (STARTTLS, 451).

Eine neue Fälligkeit oder das Wiederöffnen einer Aufgabe setzt alarm_sent zurück, der Alarm kommt dann erneut. Schlagen alle Kanäle fehl, versucht der Ticker es in den nächsten Minuten erneut und gibt nach 3 erfolglosen Durchläufen auf (alarm_failures, Warnung im Server-Log); eine neue Fälligkeit oder das Wiederöffnen gibt wieder 3 Versuche (FLAW-12). URLs werden geprüft (FLAW-05).

Die Oberfläche zeigt Fälligkeiten relativ („Heute, 14:30“, „Morgen“, „Fr., 30.10.“); überfällige offene Aufgaben (mit Uhrzeit minutengenau) sind rot. Gruppieren und Sortieren nach Fälligkeit berücksichtigen die Uhrzeit, ganztägige Aufgaben stehen vor denen mit Uhrzeit am selben Tag.