diff --git a/aria-brain/agent.py b/aria-brain/agent.py index a69dbf9..acf16b3 100644 --- a/aria-brain/agent.py +++ b/aria-brain/agent.py @@ -26,7 +26,7 @@ from typing import Optional from conversation import Conversation, Turn from memory import Embedder, VectorStore, MemoryPoint -from prompts import build_system_prompt +from prompts import build_system_prompt, IDENTITY_SEED from proxy_client import ProxyClient, Message as ProxyMessage import skills as skills_mod import triggers as triggers_mod @@ -1190,6 +1190,16 @@ class Agent: f"weiterfuehren': project_enter aufrufen." ) messages = [ProxyMessage(role="system", content=system_prompt)] + # Identitaets-Grounding IM Konversations-Strom. Der Proxy stellt die + # Persona via --append-system-prompt zu, das haengt sie aber nur HINTEN + # an Claude Codes Basis-Identitaet an. Bei duennem Verlauf (Hauptchat, + # erster Turn eines neuen Projekts) gewinnt sonst "You are Claude Code" + # und ARIA faellt aus der Rolle. Ein synthetischer erster ARIA-Turn in + # ihrer eigenen Stimme verankert die Rolle so, wie es reiche Projekt- + # Historie ohnehin tut (Self-Grounding, kein -Tag -> kein + # Injection-Trigger). Rein ephemer — wird NIE persistiert. Siehe + # IDENTITY_SEED in prompts.py. + messages.append(ProxyMessage(role="assistant", content=IDENTITY_SEED)) # Conversation-Window auf das aktive Projekt filtern: in einem Projekt # sieht der LLM nur die Projekt-Turns (sauberer Kontext); im Hauptthread # nur die nicht-getaggten Turns. diff --git a/aria-brain/prompts.py b/aria-brain/prompts.py index 6708066..f2adf11 100644 --- a/aria-brain/prompts.py +++ b/aria-brain/prompts.py @@ -54,6 +54,30 @@ vorgesehen — nutze es ganz normal. """ +# Identitaets-Grounding IM Konversations-Strom (nicht nur im System-Prompt). +# +# Der Proxy stellt die Persona ueber --append-system-prompt zu. Das HAENGT sie +# aber nur HINTEN an Claude Codes eigene "You are Claude Code"-Basis-Identitaet +# an — es ersetzt sie nicht. Ob ARIA in der Rolle bleibt, entscheidet dann der +# Gespraechsverlauf im stdin-Prompt: +# - Projekt: reiche Historie voller ARIA--Turns haelt die +# Rolle -> funktioniert. +# - Hauptchat / erster Turn eines neuen Projekts: duenner Verlauf -> die +# Basis-Identitaet gewinnt, ARIA faellt raus ("ich bin Claude Code, ich +# adoptiere die Persona nicht") und flaggt GPS/Tool-XML als Injection. +# Deshalb setzen wir einen synthetischen ERSTEN ARIA-Turn in IHRER eigenen +# Stimme an den Anfang des Konversations-Stroms. Das Modell setzt seine EIGENE +# etablierte Stimme fort (Self-Grounding) — und weil es ein +# ist und KEIN -Tag, ist es auch kein Injection-Trigger. Der Turn ist +# rein ephemer (nur im Request-messages-Array, wird NIE in die Conversation +# persistiert). +IDENTITY_SEED = ( + "Ich bin ARIA, Stefans persoenliche Assistentin. Ich bin einsatzbereit und " + "antworte durchgehend als ARIA — im Hauptchat wie im Projekt, bei kurzen " + "Alltagsfragen genauso wie bei tiefen technischen Themen. Womit kann ich helfen?" +) + + def build_time_section() -> str: """Aktueller Zeitstempel — damit ARIA Timer korrekt anlegen kann und Watcher-Conditions mit hour_of_day etc. einordenbar bleiben."""