4.4 KiB
4.4 KiB
Story 5.3: God Mode — Human-in-the-Loop
Status: done
Story
Als Nutzer, möchte ich im God Mode jeden Schritt des Councils genehmigen, ablehnen oder modifizieren, so dass ich volle Kontrolle über den KI-Prozess habe und kritische Entscheidungen absegnen kann.
Acceptance Criteria
god_mode=true→ Graph pausiert viainterrupt_beforenach dem ersten Node-AbschlussPOST /approvemitaction=approve→ Run setzt am nächsten Node fortPOST /approvemitaction=reject→ Run bricht mitstatus=failedabPOST /approvemitaction=modifyundmodified_state→ Run setzt mit modifiziertem Draft fortGET /councils/run/{run_id}/stategibt den pausierten State zurück (inkl.current_draft,next_nodes)- Frontend-Overlay erscheint bei
status=pausedund zeigt Agent-Name, aktuellen Draft und drei Buttons - Zwei parallele god-mode Runs kontaminieren sich nicht gegenseitig (Session-Isolation)
- Zweimaliges Approve ohne laufenden Run gibt
400 Bad Requestzurück
Tasks / Subtasks
- Task 1:
interrupt_beforein dynamischem Graph-Builder implementieren (AC: 1)- Subtask 1.1:
compile(interrupt_before=[...alle node IDs...])beigod_mode=True - Subtask 1.2: Nach
graph.invoke()auf__interrupt__-Signal prüfen
- Subtask 1.1:
- Task 2: God-Mode-State-Verwaltung implementieren (AC: 1, 5, 7)
- Subtask 2.1:
_god_mode_sessions: dict[run_id, GodModeSession]in-memory - Subtask 2.2:
GodModeSessionmitgraph,config,current_state,next_nodes - Subtask 2.3: Session-Isolation sicherstellen (kein shared-state)
- Subtask 2.1:
- Task 3: Resume-Logik implementieren (AC: 2, 3, 4)
- Subtask 3.1:
resume_god_mode(run_id, action, modified_state)Funktion - Subtask 3.2: Bei
modify: State-Override vorgraph.invoke(None, config) - Subtask 3.3: Bei
reject: Session löschen, Status auffailed
- Subtask 3.1:
- Task 4: API-Endpunkte (AC: 2–5, 8)
- Subtask 4.1:
POST /councils/run/{run_id}/approveRoute - Subtask 4.2:
GET /councils/run/{run_id}/stateRoute - Subtask 4.3:
400-Guard wenn Session nicht pausiert
- Subtask 4.1:
- Task 5: Frontend God-Mode-UI (AC: 6)
- Subtask 5.1: Polling
GET /councils/run/{run_id}aufstatus=paused - Subtask 5.2: Overlay-Komponente mit Draft-Text, Agent-Name, drei Buttons
- Subtask 5.3: Modify-Modus mit Textarea für Draft-Bearbeitung
- Subtask 5.1: Polling
- Task 6: Tests (AC: 1–5, 7, 8)
- Subtask 6.1:
test_god_mode.py— alle AC als Tests
- Subtask 6.1:
Dev Notes
- LangGraph
interrupt_before: Dies ist der einzige Pause-Mechanismus — kein eigener einbauen. graph.invoke(None, config): DerNone-Input setzt die Ausführung nach einem Interrupt fort.- God-Mode-State-Isolation: Jede
run_idhat eine eigene Session-Instanz im Dict. - Thread Safety: Da LangGraph-Invokes in
run_in_executorlaufen, muss der Session-Store thread-safe sein. - Bezug:
backend/services/dynamic_graph_builder.py, LangGraph-Dokumentation zuinterrupt_before
Project Structure Notes
- Implementiert in:
backend/services/dynamic_graph_builder.py(GodMode-Logik) - Implementiert in:
backend/api/routes.py(Endpunkte) - Frontend:
frontend/app/konferenzzimmer/page.tsx(Overlay) - Tests in:
backend/tests/test_god_mode.py
References
- [Source: _bmad-output/planning-artifacts/architecture.md#ADR-001] — LangGraph interrupt_before
- [Source: _bmad-output/planning-artifacts/architecture.md#God-Mode-Sequenzdiagramm]
- [Source: _bmad-output/planning-artifacts/epics.md#Story-5.3] — ACs
- [Source: CLAUDE.md#Key Design Constraints] — Human-in-the-Loop via interrupt_before
Dev Agent Record
Agent Model Used
Amelia (💻 BMAD Dev Agent) — dev-story workflow
Completion Notes List
- LangGraph
interrupt_beforegibt nach Pause eineCommand-Instanz zurück; der Typ wird viaisinstancegeprüft. - Der
config-Parameter ({"configurable": {"thread_id": run_id}}) wird für LangGraph-Checkpointer benötigt. - In-Memory-Sessions gehen bei Server-Neustart verloren — für MVP akzeptabel.
File List
backend/services/dynamic_graph_builder.pybackend/api/routes.pybackend/tests/test_god_mode.pyfrontend/app/konferenzzimmer/page.tsx