M22: Aufgaben-Paket — Mentions (#150/#151), Datums-Marker (#152), Task-IDs+Toggle (#153), Aufgabenübersicht (#154) #158

Merged
fable-5 merged 7 commits from m22-aufgaben into main 2026-07-20 02:25:40 +02:00
Collaborator

Implementiert Milestone M22 in 5 Commits (einer je Issue):

  • #150 @-Mentions: Inline-Node {userId, username}, instanzweite User-Suche (GET /users/search, Rate-Limit) + Batch-Brief, Autocomplete, Live-Anzeigename, toter Chip fuer geloeschte Nutzer.
  • #151 Mention-Benachrichtigungen: Tabelle page_mentions (Migration), Diff beim Collab-Persist → pg_notify → api-Listener → fanoutMentions (canAccessPage-Recheck, Autoren ausgeschlossen).
  • #152 Datums-Marker >>/<<: kanonisch ISO, Eingabe-Kulanz dd.mm.yyyy, Block-Guard gegen Blockquote-Kollision, InputRule, lokalisierte Anzeige. (User.locale-Verdrahtung existierte bereits.)
  • #153 Stabile Task-IDs (lazy per appendTransaction) + Toggle-Rueckschreibpfad: TASK_TOGGLE_CHANNEL, neuer collab task-toggle-listener (DirectConnection), POST /pages/:id/tasks/:taskId mit Attribution.
  • #154 Aufgabenuebersicht als Kern-Block: Lesezeit-Extraktion aus Basis-State+Update-Log (keine abgeleitete Tabelle), GET /read/:pond/:slug/tasks, serverseitige statische Tabelle fuer die Public-Ansicht, NodeView mit Rueckschreib-Checkboxen. Neuer CI-Pack tasks.spec (voller Loop end-to-end).

Lokal gruen: typecheck, lint, i18n:check, shared 171 Tests, api-Vollsuite 423 Tests gegen frische DB, settings-nav+tasks-Packs gegen lokalen Stack; Mention-Loop und Toggle-Loop live verifiziert.

Implementiert Milestone M22 in 5 Commits (einer je Issue): - **#150** @-Mentions: Inline-Node {userId, username}, instanzweite User-Suche (GET /users/search, Rate-Limit) + Batch-Brief, Autocomplete, Live-Anzeigename, toter Chip fuer geloeschte Nutzer. - **#151** Mention-Benachrichtigungen: Tabelle page_mentions (**Migration**), Diff beim Collab-Persist → pg_notify → api-Listener → fanoutMentions (canAccessPage-Recheck, Autoren ausgeschlossen). - **#152** Datums-Marker >>/<<: kanonisch ISO, Eingabe-Kulanz dd.mm.yyyy, Block-Guard gegen Blockquote-Kollision, InputRule, lokalisierte Anzeige. (User.locale-Verdrahtung existierte bereits.) - **#153** Stabile Task-IDs (lazy per appendTransaction) + Toggle-Rueckschreibpfad: TASK_TOGGLE_CHANNEL, neuer collab task-toggle-listener (DirectConnection), POST /pages/:id/tasks/:taskId mit Attribution. - **#154** Aufgabenuebersicht als Kern-Block: Lesezeit-Extraktion aus Basis-State+Update-Log (keine abgeleitete Tabelle), GET /read/:pond/:slug/tasks, serverseitige statische Tabelle fuer die Public-Ansicht, NodeView mit Rueckschreib-Checkboxen. Neuer CI-Pack tasks.spec (voller Loop end-to-end). Lokal gruen: typecheck, lint, i18n:check, shared 171 Tests, api-Vollsuite 423 Tests gegen frische DB, settings-nav+tasks-Packs gegen lokalen Stack; Mention-Loop und Toggle-Loop live verifiziert.
fable-5 added 5 commits 2026-07-20 01:27:24 +02:00
Neuer Inline-Atom mention {userId, username}: Markdown-Regel @username
(E-Mail-sicher über Wortgrenzen), Serializer, HTML-Span dt-mention,
Plain-Text für die Suche, Extraktor extractMentionUserIds. Neue
Endpoints GET /users/search (auth, min. 2 Zeichen, Limit 10,
Rate-Limit) und GET /users/brief (Batch-Auflösung für live
Anzeigenamen; gelöschte Nutzer → toter Chip). Editor: MentionView mit
Live-displayName, MentionAutocomplete (Klon des Wikilink-Musters),
Chip-CSS. 5 Unit-Tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
Neuer Inline-Atom date_marker {kind: due|start, date: ISO}. Markdown
kanonisch ISO (>>2026-12-31), Eingabe-Kulanz dd.mm.yyyy; Block-Guard
vor blockquote hält zeilenführende >>Daten aus dem Zitat-Parser;
ungültige Kalenderdaten bleiben Text. Editor: InputRule beim Tippen
(+Leerzeichen), Anzeige per Intl.DateTimeFormat in Nutzersprache,
Überfällig-Färbung. Die User.locale-Verdrahtung existierte bereits
(auth-context, #17) — keine Änderung nötig. 6 Unit-Tests inkl.
Task-Listen-Zeile mit Marker und Mention.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
task_item bekommt ein optionales id-Attr (default null — Bestandsdocs
bleiben gültig), durchgereicht in toDOM/parseDOM und dem Lese-HTML;
der Editor vergibt/entdoppelt IDs lazy per appendTransaction
(TaskItemIds-Extension, auch gegen Copy/Paste). Neuer Kanal
TASK_TOGGLE_CHANNEL; POST /pages/:id/tasks/:taskId {checked} prüft
Schreibrecht, registriert den Toggler als pending contributor und
feuert pg_notify; neuer collab task-toggle-listener (Struktur =
restore-listener) öffnet eine DirectConnection und flippt das
checked-Attribut in einer Transaktion — offene Editoren konvergieren,
unbekannte taskId = geloggter No-op. DB-Test (NOTIFY-Payload,
Attribution, 403/404/400).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
Neuer Block-Atom task_overview (Markdown-Fence dorfteich-tasks,
HTML-Placeholder). Shared extractTaskRows liest Task-Zeilen mit Text,
Mentions (#150) und Start-/Zieldaten (#152); TasksService sammelt zur
Lesezeit den Teilbaum (rekursiv via collectSubtreeIds, canAccessPage-
Filter je Quellseite) aus Basis-State + page_updates-Log — KEINE
abgeleitete Tabelle nötig (Teilbäume sind klein, kein Drift). Neuer
auth-Endpoint GET /read/:pond/:slug/tasks; die öffentliche Ansicht
expandiert den Placeholder serverseitig zur statischen Tabelle
(Instanz-Sprache). NodeView mit Live-Tabelle und Rückschreib-Checkboxen
(optimistisch, Override bis der debounced Collab-Persist nachzieht);
Einfügen über die Block-Auswahl (eingebauter Eintrag). Unit- + DB-Tests,
neuer CI-Pack tasks.spec (voller Loop inkl. Rückschreiben end-to-end),
User-Guide-Doku en+de.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
#151: Mention-Benachrichtigungen über die Glocke
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 4m38s
CI / Build container images (pull_request) Successful in 12s
CI / Auth e2e pack (pull_request) Failing after 6m12s
CI / Import/export fidelity gate (pull_request) Has been skipped
f9d23bf8d0
Neuer Notification-Typ mentioned; abgeleitete Tabelle page_mentions
(Migration), vom Collab-Persist transaktional neu geschrieben — der
Diff gegen den Vorzustand wird als pg_notify
(page_mentions_changed) emittiert, nur NEU Erwähnte lösen aus (kein
Spam bei Folge-Saves). Der api-Listener (erweitert um den zweiten
Kanal) ruft NotificationsService.fanoutMentions: Zustellung nur nach
canAccessPage-Recheck, die Autoren (pending contributors) benachrich-
tigen sich nie selbst; Payload wie gehabt mit Actor-Namen. API-seitig
erzeugte Seiten seeden page_mentions aus deriveContent. Glocken-Text
de+en; DB-Test (Leser ja / Outsider nein / Autor nein); kompletter
Loop live verifiziert (Tippen → Persist → NOTIFY → Notification).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
fable-5 added 1 commit 2026-07-20 01:54:32 +02:00
e2e-Fixes nach CI: section-styles-Selektor eindeutig, settings-nav-Timing
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 4m37s
CI / Build container images (pull_request) Successful in 1m10s
CI / Auth e2e pack (pull_request) Failing after 5m33s
CI / Import/export fidelity gate (pull_request) Has been skipped
5444c39458
Das Block-Menü ist seit dem eingebauten Aufgabenübersicht-Eintrag
(#154) immer sichtbar und teilt die Styling-Klasse
editor-toolbar__section-select — der section-styles-Pack adressiert
das Abschnitts-Select jetzt per :not(.editor-toolbar__block-select).
settings-nav: toBeInViewport bekommt 10 s für Smooth-Scroll auf
langsamen Runnern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
fable-5 added 1 commit 2026-07-20 02:11:38 +02:00
settings-nav robust: Sofort-Sprung statt Smooth-Scroll, Spec wartet auf networkidle
All checks were successful
CI / Lint, typecheck, test (pull_request) Successful in 4m37s
CI / Build container images (pull_request) Successful in 1m8s
CI / Import/export fidelity gate (pull_request) Successful in 54s
CI / Auth e2e pack (pull_request) Successful in 7m11s
CD / Build and push images (push) Successful in 18s
CD / Deploy to Test (push) Successful in 14s
CD / Smoke tests against Test (push) Successful in 1m42s
CD / Promote to Int (push) Successful in 15s
CI / Lint, typecheck, test (push) Successful in 5m21s
CI / Build container images (push) Has been skipped
CI / Auth e2e pack (push) Successful in 7m19s
CI / Import/export fidelity gate (push) Successful in 58s
58f175af32
Der animierte scrollIntoView landete auf einer veralteten Zielposition,
wenn Query-Sektionen (Sessions/Tokens) während der Animation noch
wuchsen — auf dem CI-Runner deterministisch rot. Jetzt springt die
Navigation sofort; der Spec lässt die asynchronen Inhalte vor dem Klick
settlen (networkidle) und lief lokal 10× ohne Retry grün.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
fable-5 merged commit 58f175af32 into main 2026-07-20 02:25:40 +02:00
Sign in to join this conversation.
No description provided.