FileRW list sortiert und gedeckelt (#673), Taskboard task_find (#674)

Die Betriebskontrolle im Testbetrieb meldete Stundendateien als fehlend, die
es gab: 105 Eintraege in der Reihenfolge des Dateisystems, vierzeilig als
eingeruecktes JSON. list liefert jetzt die 50 zuletzt geaenderten Eintraege,
neueste zuerst, eine Zeile je Eintrag, mit Gesamtzahl im Kopf; pattern, sort,
order und limit steuern das.

Dabei aufgefallen (#675): Directory.GetFiles wertet Trennzeichen im Muster
aus - pattern "../*" fuehrte an der Pfadpruefung vorbei aus dem Verzeichnis
heraus, in list wie in read_many. Muster mit '/', '\' oder '..' werden jetzt
abgewiesen.

Und derselbe Befund ist keine zweite Aufgabe (#674): task_find beantwortet
die Frage vor dem Anlegen, task_create legt bei gleichbedeutendem Titel einer
offenen Aufgabe keine zweite an, sondern vermerkt das erneute Auftreten an
der bestehenden. force=true geht trotzdem, Erledigtes blockiert nichts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-21 21:19:19 +02:00
co-authored by Claude Opus 5
parent 24e457b11f
commit 060dc6a6ad
10 changed files with 815 additions and 19 deletions
+13
View File
@@ -240,10 +240,23 @@ Memory`):
| Aktion | Zweck |
|---|---|
| `task_create` | Aufgabe anlegen — schreibt Datei **und** DB-Zeile (über den Importer). Vergibt die `id`. |
| `task_find` | Offene Aufgaben mit ähnlichem Titel — die Frage vor dem Anlegen (#674). |
| `task_list` | Aufgaben filtern (Status, Assignee, Betreff). Gekappte, kontextschonende Ausgabe wie bei Memory. |
| `task_update` | Status/Felder ändern; `blocked` melden; Ergebnis eintragen. |
| `task_comment` | Kommentar/Kritik anhängen; mit Reopen den Zuständigen erneut wecken. |
**Derselbe Befund ist keine zweite Aufgabe (#674).** Titel werden normalisiert (Kleinschrift,
Umlaute gefaltet, Satzzeichen weg) und als Wortmengen verglichen; „Eur Kurse nicht aktuell"
und „Kurse EUR nicht aktuell" sind dieselbe Aufgabe. Findet `task_create` eine *offene*
Aufgabe mit gleichbedeutendem Titel, legt es keine zweite an, sondern vermerkt das erneute
Auftreten als Kommentar an der bestehenden und verweist darauf. `force: true` legt trotzdem
an — für den Fall, dass es wirklich ein anderer Sachverhalt ist. Erledigte und verworfene
Aufgaben blockieren nichts: derselbe Befund darf wiederkommen.
Anlass war der Testbetrieb (#572): Eine Betriebskontrolle alle drei Stunden legte über
dreißig Aufgaben an `@human` an, sechs davon mit demselben Kursbefund. Aus einer solchen
Liste ist nicht mehr abzulesen, ob ein Problem neu ist oder seit Tagen unbeantwortet liegt.
Agent-zu-Agent-Delegation läuft künftig hierüber: Statt rekursivem `send_message` legt
ein Agent eine Aufgabe mit `assignee: @<other>` an. Das ist strukturell zyklenfrei (B8) —
eine Aufgabe ist ein Datensatz, kein synchroner Aufruf-Stack.
+11
View File
@@ -268,6 +268,17 @@ Schlägt ein Zugriff fehl, weil der Pfad im *anderen* Workspace liegt, sagt die
Fehlermeldung das (#662) – aber nur, wenn der Agent den anderen Workspace auch benutzen
darf.
`list` zeigt die 50 zuletzt geänderten Einträge, neueste zuerst, eine Zeile je Eintrag;
`pattern`, `sort` (`modified`/`name`), `order` (`desc`/`asc`) und `limit` (max 500) steuern
das. Der Kopf nennt immer die Gesamtzahl – eine gedeckelte Liste, die ihre Deckelung
verschweigt, ist die schlimmere Falle. Der Grund steht in #673: Ein Verzeichnis mit 105
Dateien, unsortiert und als eingerücktes JSON ausgegeben, ließ die Betriebskontrolle zwei
vorhandene Dateien als fehlend melden.
`pattern` ist ein **Dateiname mit Platzhaltern, kein Pfad**. Trennzeichen und `..` werden
abgewiesen, weil `Directory.GetFiles` sie auswertet und ein Muster sonst an der
Pfadprüfung vorbei aus dem Verzeichnis herausführt (#675).
**Config-Felder:**
- `rootPath` – Basisverzeichnis (Agent ist darin eingesperrt)
- `allowWrite` – `true`/`false`