6.8 KiB
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 implementiertagent_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 Accessfilter_visible_agents()prüftagents: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_TYPESpattern:^(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_idwird ausentity_idabgeleitet (nicht in FK-Spalte gespeichert) — vermeidet FK-Constraint-Probleme- Subtasks:
parent_task_idself-reference korrekt - Dependencies:
depends_onJSONB array korrekt - Progress Aggregation:
_recompute_progress()+_propagate_parent_status()korrekt - Success Criteria:
_evaluate_success_criteria()mitall_doneundcriteriashapes tenant_idauf 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 keinenrequire_approvaloderhuman_in_loopParameter- 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_approvalParameter inrun_react_loop(), der den Loop pausiert und eine Approval-Request erstellt
4. Workstream-Konsistenz ✅
post_agent_message(): Erstellt CommMessage in Agent-Channelpost_agent_step(): Postet Thought/Action/Observation als CommBlockpost_agent_result(): Postet finales Ergebnispost_approval_request(): Postet Approval-Request in Channel- Alle Funktionen verwenden
tenant_idundagent_idkonsistent _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ügtai_generatedflag +ai_metadata(model, provider, timestamp) hinzuis_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-Entscheidungencreate_decision_record(): Erstellt Decision Record mit tenant_id, agent_id, tool_name, decisionDecisionRecordDBerbt vonBase,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_idauf 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