Files
leocrm/docs/arch-f-review.md
T

155 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ARCH-F Review — Architecture Review nach Phase F
**Datum:** 2026-08-18
**Reviewer:** AI Agent
**Phase:** F — Agents (41/41 Tasks done)
---
## Review-Kriterien
### 1. Permission-Lücken ✅
**Permission Intersection (User ∩ Agent ∩ Skill ∩ Tool):**
- `agent_permissions.py`: `resolve_agent_permissions()` korrekt implementiert
- `agent_tools.py`: `get_agent_tools()` filtert Tools nach User-Permissions
- Skills orchestrieren Tools aber **erweitern niemals** Permissions
- System Admins bekommen alle Tools (korrekt)
- `check_agent_execute_permission()` prüft RBAC + Entity-Level Access
- `filter_visible_agents()` prüft `agents:read` + EntityPermission
- Jeder Tool/Service Call re-checkt Permissions (nicht eingefroren)
**Fazit:** Keine Permission-Lücken gefunden. Die Intersection-Logik ist solide.
### 2. Task-Modell-Konsistenz ✅
- `TASK_TYPES` pattern: `^(todo|approval|follow_up|review|goal|milestone|agent_subtask)$` — konsistent in Schema und Model
- Polymorphic Fields: `assignee_type/assignee_id`, `entity_type/entity_id`, `creator_type/creator_id` — korrekt
- `contact_id` wird aus `entity_id` abgeleitet (nicht in FK-Spalte gespeichert) — vermeidet FK-Constraint-Probleme
- Subtasks: `parent_task_id` self-reference korrekt
- Dependencies: `depends_on` JSONB array korrekt
- Progress Aggregation: `_recompute_progress()` + `_propagate_parent_status()` korrekt
- Success Criteria: `_evaluate_success_criteria()` mit `all_done` und `criteria` shapes
- `tenant_id` auf allen Queries und Operations
**Fazit:** Task-Modell ist konsistent. Keine Inkonsistenzen gefunden.
### 3. Approval-Integration ⚠️
**Approval API:** Vollständig implementiert (create, list, get, approve, reject, expire)
**Approval Model:** `ApprovalRequest` mit tenant_id, entity_type, entity_id, action, status
**Workstream:** `post_approval_request()` korrekt implementiert
**⚠️ Finding: Agent Loop hat keine Human-in-the-Loop Approval-Integration**
- `run_react_loop()` hat keinen `require_approval` oder `human_in_loop` Parameter
- Agent kann aktuell keine Approval-Requests während eines Loops pausieren/warten
- Approval API existiert aber ist nicht in den Agent Loop integriert
- **Empfehlung:** In Phase G oder I integrieren — `require_approval` Parameter in `run_react_loop()`, der den Loop pausiert und eine Approval-Request erstellt
### 4. Workstream-Konsistenz ✅
- `post_agent_message()`: Erstellt CommMessage in Agent-Channel
- `post_agent_step()`: Postet Thought/Action/Observation als CommBlock
- `post_agent_result()`: Postet finales Ergebnis
- `post_approval_request()`: Postet Approval-Request in Channel
- Alle Funktionen verwenden `tenant_id` und `agent_id` konsistent
- `_get_or_create_agent_channel()` für dedizierte Agent-Channels
**Fazit:** Workstream-Patterns sind konsistent.
### 5. Zirkuläre Abhängigkeiten ✅
Import-Test erfolgreich:
```
from app.ai.agent_loop import run_react_loop
from app.ai.agent_permissions import resolve_agent_permissions
from app.ai.agent_workstream import post_agent_message
from app.ai.data_policy import enforce_data_policy
from app.ai.oversight import create_decision_record
from app.core.approval import create_approval_request
→ No circular imports
```
**Fazit:** Keine zirkulären Abhängigkeiten.
### 6. Data Policy ✅
- `enforce_data_policy()` prüft SENSITIVE_FIELDS vor LLM-Calls
- Provider Compliance: `_filter_by_provider_compliance()` filtert Felder nach Provider-Datenklassen
- `get_provider_compliance()` lädt Provider-Konfiguration aus DB
- Tenant-spezifische Provider-Konfiguration
**Fazit:** Data Policy korrekt implementiert.
### 7. Transparency ✅
- `mark_as_ai_generated()`: Fügt `ai_generated` flag + `ai_metadata` (model, provider, timestamp) hinzu
- `is_ai_participant()`: Erkennt AI-Participant-Types (agent, ai, system_ai)
- Wird von Kommunikation-Plugin und Agent Loop verwendet
**Fazit:** Transparency-Layer korrekt implementiert.
### 8. Oversight ✅
- `DecisionRecord` + `DecisionRecordDB`: Audit-Trail für AI-Entscheidungen
- `create_decision_record()`: Erstellt Decision Record mit tenant_id, agent_id, tool_name, decision
- `DecisionRecordDB` erbt von `Base`, `TenantMixin`, `OwnedMixin`
**Fazit:** Oversight korrekt implementiert.
### 9. Agent Memory ✅
- `store_agent_memory()`, `retrieve_agent_memory()`, `search_agent_memory()`
- Alle Operationen verwenden `tenant_id`
- Embedding-basierte Suche korrekt
**Fazit:** Agent Memory korrekt implementiert.
### 10. Migrations ✅
- 0122: Agent Definition Phase F Fields (temperature, max_tokens, max_steps, trace_mode, skill_ids, trigger_config, ai_use_case_metadata)
- 0123: approval_requests + ai_decision_records Tabellen (tenant_id, UUID PKs, Indizes)
- 0124: Unified Task System (polymorphic fields, subtasks, dependencies)
- Alle Migrations korrekt verkettet (0122 → 0123 → 0124)
- `tenant_id` auf allen neuen Tabellen/Spalten
- UUID Primary Keys (keine Integer IDs)
**Fazit:** Migrations korrekt und konsistent.
---
## Zusammenfassung
| Kriterium | Status | Findings |
|-----------|--------|----------|
| Permission-Lücken | ✅ | Keine — Intersection-Logik solide |
| Task-Modell-Konsistenz | ✅ | Konsistent — polymorphic fields korrekt |
| Approval-Integration | ⚠️ | Agent Loop hat keine Human-in-the-Loop Integration |
| Workstream-Konsistenz | ✅ | Konsistente Patterns |
| Zirkuläre Abhängigkeiten | ✅ | Keine |
| Data Policy | ✅ | SENSITIVE_FIELDS + Provider Compliance |
| Transparency | ✅ | AI-Generated Marking korrekt |
| Oversight | ✅ | Decision Records mit Audit-Trail |
| Agent Memory | ✅ | tenant_id auf allen Operationen |
| Migrations | ✅ | Korrekt verkettet, tenant_id, UUID PKs |
## Findings
### ⚠️ ARCH-F-1: Agent Loop fehlt Human-in-the-Loop Approval-Integration
**Schwere:** Medium (Design-Gap, kein Bug)
**Beschreibung:** `run_react_loop()` hat keinen `require_approval` Parameter. Approval API existiert aber ist nicht in den Agent Loop integriert.
**Empfehlung:** In Phase G oder I integrieren — `require_approval` Parameter in `run_react_loop()`, der den Loop pausiert und eine Approval-Request erstellt.
### ️ ARCH-F-2: contact_id FK redundant mit entity_id
**Schwere:** Low (bereits im Code behoben)
**Beschreibung:** Task Model hat sowohl `contact_id` (FK zu contacts) als auch `entity_type/entity_id` (polymorphic). Code leitet `contact_id` aus `entity_id` ab, aber die FK-Spalte existiert noch in der DB.
**Empfehlung:** In einer zukünftigen Migration die `contact_id` FK-Constraint droppen und die Spalte als nullable belassen (oder entfernen).
## Fazit
**ARCH-F Review: ✅ BESTANDEN**
Phase F Architektur ist solide. Keine Permission-Lücken, keine zirkulären Abhängigkeiten, konsistente Patterns. Ein Design-Gap (Agent Loop Approval-Integration) wurde identifiziert und für Phase G/I empfohlen.
**Freigabe für Phase G: ✅ erteilt**