„Was sind heute meine Aufgaben?“

Productivity

Jemand stand vor seinem Kanban-Board in Notez, öffnete den KI-Chat und tippte fünf Wörter: Was sind heute meine Aufgaben.

Er bekam eine Liste. Es war die falsche.

Nichts war abgestürzt. Keine Fehlermeldung. Der Assistent suchte, fand ein paar Notizen und präsentierte sie mit voller Überzeugung – und keine davon gehörte zu den Karten, die ein paar Zentimeter weiter links auf dem Board lagen. Das ist die schlimmste Art von Bug in einem KI-Produkt, weil er genau wie eine Antwort aussieht.

Drei Dinge, die dem Assistenten fehlten

Bei einer falschen Antwort liegt es nahe, dem Prompt die Schuld zu geben: eine Zeile ergänzen, die das Modell zu mehr Sorgfalt auffordert, ausliefern, hoffen. Damit habe ich angefangen und bin nicht weitergekommen, denn das Problem lag nicht in der Formulierung. Es fehlten drei Teile, und kein Prompt-Tuning erzeugt ein Teil, das nicht da ist.

Er sah den Bildschirm nicht. Die Anfrage, die beim Modell ankam, enthielt die Frage und sonst nichts. Nicht, welche Ansicht offen war, nicht, welches Board, nicht den Tag-Filter, der die Liste eingrenzte, nicht die Notiz im Seitenpanel. Ein Mensch neben dir kann kurz auf deinen Monitor schauen. Das Modell antwortete mit geschlossenen Augen und konnte das nicht einmal sagen.

Er wusste nicht, was eine Aufgabe ist. Notez hat bewusst kein eigenes To-do-Objekt. Es gibt keinen Aufgabentyp, kein Fälligkeitsfeld, keine Checkbox-Spalte, die die App gesondert behandelt. Es gibt ein Board – und seine Karten meinen die Leute, wenn sie „meine Aufgaben“ sagen. Das hatte dem Modell nie jemand gesagt. Nach Aufgaben gefragt, tat es das Einzige, was es konnte: Es suchte per Stichwort nach dem Wort Aufgabe.

Er hatte kein Tool, das ein Board lesen konnte. Dieser Punkt machte die anderen beiden unlösbar. Selbst ein Modell, das genau gewusst hätte, was du meinst und welches Board du gerade ansiehst, hätte es nicht abrufen können. Es gab ein Tool, das Notizen auflistet, und eins, das sie nach Tag filtert, und ein Board ist weder das eine noch das andere: Es besteht aus Spalten, jede mit einer geordneten Folge von Karten. Eine Frage zum Board lässt sich nicht mit einer Listenfunktion beantworten.

Dem Modell sagen, wo du bist

Die Lösung beginnt im Browser. Jede Nachricht enthält jetzt eine kurze Beschreibung des Bildschirms, auf dem sie getippt wurde: die Ansicht, welches Board offen ist, ob du im Papierkorb bist, der Suchtext und die aktiven Tag-Filter, die geöffnete Notiz und die ausgewählten Karten.

Diese Beschreibung landet im Prompt als schlichte Sätze, die das Modell wörtlich wiedergeben kann. Keine Embeddings, kein versteckter Zustand, kein Raten, was du wohl gemeint hast. Wenn der Assistent weiß, dass du auf einem Board bist, dann weil das Board es ihm gesagt hat.

Zwei Details kosteten mehr Nachdenken als erwartet.

Erstens kann eine Notiz über einer Liste geöffnet sein: Notez öffnet Notizen in einem Seitenpanel, das Dashboard dahinter bleibt also gemountet und meldet weiter seinen eigenen Bildschirm. Beide Komponenten wollen den Kontext beschreiben, und nur eine davon ist die, die du gerade ansiehst. Das Panel gewinnt, weil es oben liegt.

Zweitens sollen Menschen das sehen können. Unter dem Gespräch steht jetzt eine Reihe von Chips – Board-Ansicht, Diese Notiz, 3 ausgewählt –, die genau benennen, was der Assistent sieht. Einem Assistenten mit unsichtbarem Kontext vertraust du erst nach Versuch und Irrtum. Mit den Chips liest du es einfach ab.

Was eine Aufgabe ist, schriftlich festgelegt

Das Modell hat jetzt eine Definition, die ihm vorher fehlte:

Es gibt kein eigenes Aufgaben- oder To-do-Objekt. Fragt der Nutzer nach Aufgaben, To-dos, woran er arbeiten soll oder was gerade in Arbeit ist, meint er die Karten auf dem Board, das er ansieht – oder das Workspace-Board, wenn keins auf dem Bildschirm ist. Spalten, deren Name „erledigt“ bedeutet (Done, Completed, Archived und ähnliche), sind nicht offen.

Der letzte Satz leistet mehr als der Rest zusammen. Ohne ihn liefert „Was sind heute meine Aufgaben?“ alles auf dem Board, einschließlich der Spalte mit dem, was du letzte Woche abgeschlossen hast: technisch eine vollständige Antwort, praktisch nutzlos.

Dieselbe Definition geht auch an MCP-Clients. Wenn du Notez mit Claude Code oder Cursor verbunden hast, liest dein Assistent dort genau denselben Text.

Ein Tool, das ein Board liest

get_board liefert ein Board mit seinen Karten, nach Spalten gruppiert, und die Anzahl der Karten pro Spalte. Es liest das Workspace-Board oder das eigene Board jeder beliebigen Notiz. Die Frage „Was ist gerade in Arbeit?“ ist damit ein einziger Aufruf statt einer Suche und fünf Abrufen einzelner Notizen.

Außerdem habe ich zwei Tools zu einem zusammengelegt. filter_notes gibt es nicht mehr, es ist in list_notes aufgegangen. Das filtert jetzt zusätzlich nach Board-Spalten, Werten eigener Eigenschaften und Zeiträumen für Erstellung oder Änderung. Alle Filter sind mit UND verknüpft, deshalb ist eine Frage wie „Notizen mit dem Tag Arbeit, diese Woche geändert, nicht in Done“ ein einziger Aufruf statt einer Schleife aus Abrufen und Aussieben. Und jede Notiz im Ergebnis bringt jetzt ihre Tags, ihre Spalte, ihre Eigenschaftswerte und ihre Datumsangaben mit – der Assistent öffnet keine Notiz mehr, nur um ein Feld zu lesen.

Wenige, reichhaltige Tools sind besser als viele dünne. Jedes zusätzliche Tool ist eine weitere Gelegenheit für das Modell, das falsche zu wählen.

Der Bug, den ich beim Beheben des Bugs geschrieben habe

Mit Datumsfiltern muss jemand entscheiden, was „heute“ bedeutet, und die ehrliche Antwort lautet: Es hängt davon ab, wo du sitzt. Deshalb schickt der Browser seine Zeitzone mit, und der Server berechnet den Zeitraum in dieser Zone.

Die erste Version dieses Codes war auf eine Weise falsch, die kaum jemandem aufgefallen wäre. Die Bibliothek, mit der ich ein Datum mit Zeitzone erzeugt habe, behält beim Serialisieren dessen Offset – und die Zeitstempel-Spalten der Notizen sind timestamp without time zone. Postgres hätte den Offset also stillschweigend verworfen und jeden Zeitraum um so viele Stunden verschoben, wie du von UTC entfernt lebst. Jeder Nutzer außerhalb von UTC hätte auf „Was habe ich heute erstellt?“ leicht falsche Antworten bekommen, und nirgends wäre ein Fehler gemeldet worden.

Der Test dafür war erst rot und dann grün, und nur deshalb glaube ich ihm. Danach habe ich es noch einmal gegen eine echte Datenbank geprüft: Eine Notiz, die um 22:00 UTC erstellt wurde – ein Uhr nachts Ortszeit –, zählt weiterhin als heute, genau wie es sein soll.

MCP-Clients bekommen UTC, weil dort kein Browser ist, den man fragen könnte. Diese Einschränkung steht offen in der Tool-Beschreibung, damit der Assistent, der sie liest, weiß, was er bekommt.

Zwei Frontends, ein Satz Tools

In Notez erreicht ein Assistent deine Notizen auf zwei Wegen: über den Chat in der App und über den MCP-Server, mit dem sich dein eigener Editor verbindet. Beide teilen sich 29 Tools, und der MCP-Server hat drei eigene: zwei für Datei-Uploads, die eine Shell brauchen, und eins, das bei Verbindungen per Anmeldung deine Workspaces auflistet. Die gemeinsamen sind nicht bloß ähnlich – sie haben dieselben Namen, dieselben Argumente, dieselben Pflichtfelder. Das erzwingt ein Test, der den Build scheitern lässt, sobald die beiden Listen auseinanderlaufen.

Den Test gibt es, weil sie schon einmal auseinandergelaufen sind. Sechs Tools gab es monatelang nur im Chat, und niemand merkte es, weil nichts die Listen verglich. Gleichheit, an die man denken muss, geht irgendwann verloren.

Was er jetzt antwortet

Dieselben fünf Wörter, dasselbe Board:

To Do: Login-Bug beheben, Release Notes schreiben In Progress: PR 42 reviewen

Ich habe Done weggelassen, weil das erledigt ist: Q4-Roadmap planen.

Ein Tool-Aufruf. Die richtige Liste. Und ein Satz, der erklärt, was er bewusst weggelassen hat – für einen Assistenten, der monatelang selbstsicher die falsche Frage beantwortet hat, vielleicht der wichtigste Teil.

Weiterlesen