From 8d5991f364c729da29994f3ea0d24a8a0f9c6371 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 30 May 2026 02:26:17 +0200 Subject: [PATCH] =?UTF-8?q?fix(brain):=2018.=20seed=5Frule=20=E2=80=94=20S?= =?UTF-8?q?ide-Effect-Tools=20nicht=20blind=20retry'en?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beobachtung 30.05.2026 02:22: Stefan bat 'vorheriges lied'. ARIA hat POST /previous gemacht — Spotify gab 204 No Content zurueck (Erfolgs- Antwort ohne Body), aber der alte Skill-Code warf JSON-Parse-Error weil kein Body zum Parsen. ARIA interpretierte das als 'Skill kaputt', patchte ihn UND fuehrte previous nochmal aus. Folge: Stefan landete ZWEI Lieder zurueck statt eins. Aergerlich weil unerwartete Zustandsaenderung. Neue Regel adressiert das: - Side-Effect-Tools (POST/PUT/DELETE, next/previous/play/pause, send- message etc.) sind NICHT idempotent — Retry verdoppelt den Effekt. - Bei unklarem Result IMMER zuerst State pruefen (currently-playing, list-Endpoint etc.), dann beurteilen ob Wiederholung noetig. - HTTP 204 No Content ist KEIN Fehler bei POST/PUT — typische Spotify- Antwort. Skill darf 204 NICHT als Parse-Error werten. - GET-Calls / Search sind retry-safe, hier keine Sorge. ARIAs zweiter Skill-Patch ist uebrigens technisch korrekt (ARG_- Konvention zurueck, 204 handled, strukturierte Ausgabe fuer currently-playing). Nur das doppelte Side-Effect war das Problem. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 2 +- aria-brain/seed_rules.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b365111..bd3d542 100644 --- a/README.md +++ b/README.md @@ -388,7 +388,7 @@ Chat-Turn an die richtigen Patterns. ### Skill-Regeln (seed_rules) -`aria-brain/seed_rules.py` enthaelt 17 `type=rule, pinned=true, +`aria-brain/seed_rules.py` enthaelt 18 `type=rule, pinned=true, source=seed`-Memories, die bei jedem Brain-Start idempotent in die Vector-DB geschrieben werden (`migration_key`-basiert). Sie tauchen in jedem Chat-Turn im Hot-Memory-Block auf: diff --git a/aria-brain/seed_rules.py b/aria-brain/seed_rules.py index ad5097c..8f855ab 100644 --- a/aria-brain/seed_rules.py +++ b/aria-brain/seed_rules.py @@ -330,6 +330,43 @@ SEED_RULES: List[dict] = [ "Beim ersten Versuch direkt XML-Tag ergibt 3-5s statt 30s+." ), }, + { + "migration_key": "seed/skill-rule/no-blind-retry-side-effects", + "type": "rule", + "title": "Skill-Regel: Side-Effect-Tools NIEMALS blind retry'en", + "category": "skills", + "content": ( + "Wenn ein Tool eine ZUSTANDS-Aenderung macht (POST, PUT, DELETE, " + "next/previous/play/pause, send-message, transfer-funds, " + "create-trigger, …) und das Result unklar ist (leer, " + "merkwuerdig, scheinbar fehlerhaft): NIEMALS blind nochmal " + "ausfuehren. Side-Effects sind nicht idempotent — zweimal " + "POST /previous = zweimal zurueck, nicht einmal.\n" + "\n" + "Richtiger Reflex:\n" + " 1. State pruefen (currently-playing fuer Spotify, GET fuer " + "REST, list-Endpoint allgemein)\n" + " 2. Vergleichen: ist die gewuenschte Aenderung schon " + "passiert?\n" + " 3. WENN ja → Stefan ehrlich sagen 'lief schon, hier der " + "neue Zustand'\n" + " 4. WENN nein → erst dann Aktion wiederholen\n" + "\n" + "Bei GET-Calls / List-Endpoints / Search ist Retry hingegen ok " + "— die haben keine Side-Effects.\n" + "\n" + "HTTP 204 No Content ist KEIN Fehler. Bei Spotify POST/PUT " + "(next/previous/play/pause/volume/seek) ist 204 die normale " + "Erfolgsantwort. Wenn dein Skill bei 204 einen Parse-Error " + "wirft: skill_update mit `if status == 204: print('OK')` " + "VOR dem Retry, nicht erst die Aktion nochmal auslоsen.\n" + "\n" + "Antipattern (30.05.2026): ARIA hat POST /previous einmal " + "gemacht (Spotify 204 OK → Skill-Parse-Error), dachte 'Skill " + "kaputt', patchte ihn UND fuehrte das previous nochmal aus. " + "Folge: Stefan landete zwei Lieder weiter hinten als gewollt." + ), + }, { "migration_key": "seed/skill-rule/arg-env-convention", "type": "rule",