feat(brain): API-Heuristik — Cross-Session-Counter fuer Skill-Drift

Variante B: scaffold-reflex Regel allein reicht nicht weil jede Chat-
Anfrage eine eigene claude-CLI-Session ist. ARIA sieht in der aktuellen
Session nicht dass sie gestern auch schon 10x dieselbe API gecurled hat.
Beobachtung: 5+ Spotify-Bash-Calls hintereinander, kein Skill angelegt.

Loesung: Brain trackt server-side aus dem persistierten agent_stream.jsonl.
Bei jedem chat() wird der Log gescanned (cache 5min), Bash-curl-Calls
nach Hostname aggregiert. Hosts mit >=3 Calls in 24h ohne passenden
Skill landen als '## API-Heuristik'-Block im System-Prompt mit konkretem
skill_scaffold-Vorschlag.

Neue Module:
- aria-brain/api_heuristic.py:
  - compute_hints(existing_skills, force): Aggregiert + filtert
  - build_section(hints): formatiert als kompakten Markdown-Block
  - Smart suggestions mapping (api.spotify.com → oauth-api template etc.)
  - Ignoriert interne Hosts (aria-brain, localhost, docker-bridge)
  - 5-min Cache damit nicht jeder Turn die JSONL parst

- aria-brain/prompts.py: build_system_prompt nimmt api_heuristic_section
  als optionalen Block direkt nach Skills-Section.

- aria-brain/agent.py: vor build_system_prompt Heuristik berechnen mit
  aktueller Skill-Liste, Block durchreichen.

- 11. seed_rule scaffold-reflex umgeschrieben: kein 'in einer Session'
  mehr (das ergab keinen Sinn — jeder Turn neue Session). Stattdessen:
  '## API-Heuristik'-Block ist Dein Cross-Session-Gedaechtnis. Wenn da
  was steht: scaffolden BEVOR Du Bash machst.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-30 00:19:06 +02:00
parent 0540c49c66
commit 845a8b0020
5 changed files with 226 additions and 23 deletions
+23 -21
View File
@@ -211,32 +211,34 @@ SEED_RULES: List[dict] = [
{
"migration_key": "seed/skill-rule/scaffold-reflex",
"type": "rule",
"title": "Skill-Regel: skill_scaffold-Reflex bei wiederholten API-Calls",
"title": "Skill-Regel: skill_scaffold-Reflex (mit Cross-Session-Counter)",
"category": "skills",
"content": (
"Wenn Du dieselbe externe API in einer Session 2x oder oefter "
"via Bash-curl angerufen hast: HOER AUF und rufe SOFORT "
"`skill_scaffold` auf. Drei Spotify-Calls hintereinander, "
"drei Wetter-Abfragen, drei Calendar-Events — JEDES dieser "
"Pattern schreit nach einem Skill.\n"
"Brain trackt server-side wie oft Du in den letzten 24h dieselbe "
"externe API per Bash-curl angerufen hast (Cross-Session-Counter, "
"siehe '## API-Heuristik'-Block im System-Prompt). Sobald da "
"ein Eintrag steht: das ist KEINE Empfehlung sondern eine "
"Aufforderung. RUFE als ALLERERSTES `skill_scaffold` mit dem "
"vorgeschlagenen Template und params auf, BEVOR Du wieder Bash-"
"curl machst. Dann nutze den frischen Skill via `run_<name>`.\n"
"\n"
"skill_scaffold ist die niedrige Hürde: Du musst keinen "
"kompletten Python-Skill schreiben. Du waehlst nur:\n"
" - oauth-api fuer OAuth2-Services (Spotify, GitHub, Reddit, "
"Google, Discord) -- Token kommt vom Brain mit Auto-Refresh\n"
" - apikey-api fuer statische Keys (OpenWeather, OpenAI, "
"Twilio) -- Key landet im config_schema, Stefan setzt ihn in "
"Diagnostic\n"
" - file-process fuer Datei-In/Datei-Out (PDF, Bild, Daten)\n"
"Warum: jede Chat-Anfrage ist eine eigene Claude-CLI-Session — "
"Du siehst nicht dass Du gestern auch schon 10x Spotify gecurled "
"hast. Der API-Heuristik-Block ist Dein Cross-Session-Gedaechtnis. "
"Wenn er leer ist: alles OK, weitermachen. Wenn nicht: scaffolden.\n"
"\n"
"Brain expandiert das Template in ~1s zu einem fertigen Skill. "
"Falls Du was Spezielles brauchst: erst Scaffold, dann "
"`skill_update` mit Anpassung. NICHT umgekehrt — und schon gar "
"nicht das fuenfte Mal das gleiche Bash-Skript bauen.\n"
"Templates (ausfuehrliche Doku siehe skill_scaffold-Tool):\n"
" - **oauth-api**: Spotify/GitHub/Reddit/Google/Discord. Token "
"kommt vom Brain mit Auto-Refresh.\n"
" - **apikey-api**: OpenWeather/OpenAI/Twilio. Key landet im "
"config_schema → CFG_<NAME> ENV. Stefan setzt ihn in Diagnostic.\n"
" - **file-process**: PDF/Bild/JSON-Wandler. process()-Stub, "
"danach `skill_update` mit echtem Code.\n"
"\n"
"Belohnung: ein Spotify-Skill macht 'welches lied laeuft' in "
"1 Tool-Call (~3s) statt 5 Bash-Roundtrips (~20s). Stefan "
"merkt das sofort und ist zufriedener."
"Belohnung konkret: ein Spotify-Skill macht 'welches lied laeuft' "
"in 1 Tool-Call (~3s) statt 3-5 Bash-Roundtrips (~13-20s). Stefan "
"merkt das sofort. Ein einmaliger Scaffold-Aufwand spart hunderte "
"Bash-Roundtrips."
),
},
{