{
"event": "PreToolUse",
"tool_name": "mcp__mcp-tasks__tasks_create",
"tool_input": {
"title": "Content Studio: Einstellungs-Parität mit Chat + Kritiker-Auswahl",
"type": "ai_task",
"description": "## Ziel\nContent Studio (`\/content\/new`, `\/content\/{id}`) soll alle Einstellungsmöglichkeiten haben wie der Chat, plus die Möglichkeit, Kritiker auszuwählen und inline zu bearbeiten.\n\n---\n\n## IST-Analyse: Feature-Vergleich\n\n### Chat Config Panel (src\/View\/chat\/partials\/_config_panel.php)\n| Feature | Vorhanden | Inline-Edit |\n|---------|-----------|-------------|\n| Modell (gruppiert Anthropic\/Ollama) | ✅ | - |\n| Quellen (context_limit) | ✅ | - |\n| Sammlungen (collections) | ✅ Checkboxen mit Count | - |\n| Temperatur (Slider + Presets) | ✅ | - |\n| Max Tokens (Dropdown) | ✅ | - |\n| Qualitätsprüfung | ✅ Checkbox | - |\n| System Prompt | ✅ Dropdown | ✅ ✎ Button |\n| Ausgabeformat\/Struktur | ✅ Dropdown | ✅ ✎ Button |\n| Autorenprofil | ✅ Dropdown | ✅ ✎ Button |\n| **Kritiker** | ❌ | ❌ |\n\n### Content Studio (src\/View\/content\/new.php)\n| Feature | Vorhanden | Inline-Edit |\n|---------|-----------|-------------|\n| Modell (NICHT gruppiert) | ✅ | - |\n| Quellen (context_limit) | ✅ | - |\n| Sammlungen (collections) | ✅ Checkboxen | - |\n| Temperatur | ❌ FEHLT | - |\n| Max Tokens | ❌ FEHLT | - |\n| Qualitätsprüfung | ❌ FEHLT | - |\n| System Prompt | ❌ FEHLT | ❌ |\n| Ausgabeformat\/Struktur | ✅ Dropdown | ❌ FEHLT |\n| Autorenprofil | ✅ Dropdown | ❌ FEHLT |\n| Contract | ✅ Dropdown | ❌ FEHLT |\n| **Kritiker** | ❌ FEHLT | ❌ |\n\n---\n\n## IST-Analyse: Datenbank\n\n### chat_sessions (ki_content)\n```\nmodel, context_limit, temperature, max_tokens, \nauthor_profile_id, system_prompt_id, collections\n```\n\n### content_orders (ki_content)\n```\nmodel, context_limit, \nauthor_profile_id, contract_id, structure_id, collections\n```\n\n**FEHLENDE Spalten in content_orders:**\n- `temperature` DECIMAL(3,2) DEFAULT 0.50\n- `max_tokens` INT DEFAULT 4096\n- `system_prompt_id` INT → FK content_config\n- `selected_critics` JSON (Array von Critic-IDs)\n- `quality_check` TINYINT(1) DEFAULT 0\n\n---\n\n## IST-Analyse: Kritiker-Workflow\n\n**Aktuell (critic.py:150-154):**\n```python\ncursor = db.execute(\n \"SELECT id, name FROM content_config \n WHERE type = 'critic' AND status = 'active' \n ORDER BY sort_order\"\n)\n```\n→ ALLE aktiven Critics werden automatisch verwendet, keine Auswahl pro Order.\n\n**SOLL:** Order-spezifische Kritiker-Auswahl aus `content_orders.selected_critics`\n\n---\n\n## Code-Impact-Analyse\n\n### PHP-Dateien zu ändern\n\n| Datei | Änderung |\n|-------|----------|\n| `src\/Controller\/ContentController.php` | Neue Parameter in store(), show(), edit() |\n| `src\/UseCases\/Command\/CreateContentOrderCommand.php` | Neue Felder |\n| `src\/Infrastructure\/Persistence\/ContentRepository.php` | SQL anpassen |\n| `src\/View\/content\/new.php` | UI-Elemente hinzufügen |\n| `src\/View\/content\/edit.php` | UI-Elemente hinzufügen |\n| `src\/View\/content\/show.php` | Kritiker-Auswahl bei \"Kritik starten\" |\n\n### Python-Dateien zu ändern\n\n| Datei | Änderung |\n|-------|----------|\n| `\/var\/www\/scripts\/pipeline\/generators\/critic.py` | `run_critique_round()` - Order.selected_critics nutzen |\n\n### Neue Dateien (optional)\n\n| Datei | Zweck |\n|-------|-------|\n| `src\/View\/content\/partials\/_config_panel.php` | Wiederverwendbares Config-Panel (wie Chat) |\n| `src\/View\/partials\/form\/config-editor.php` | Inline-Editor Partial |\n\n---\n\n## Implementierungsplan\n\n### Phase 1: Schema-Migration\n```sql\nALTER TABLE content_orders\nADD COLUMN temperature DECIMAL(3,2) DEFAULT 0.50,\nADD COLUMN max_tokens INT DEFAULT 4096,\nADD COLUMN system_prompt_id INT NULL,\nADD COLUMN selected_critics JSON NULL,\nADD COLUMN quality_check TINYINT(1) DEFAULT 0,\nADD CONSTRAINT fk_orders_system_prompt \n FOREIGN KEY (system_prompt_id) REFERENCES content_config(id);\n```\n\n### Phase 2: PHP Backend\n1. ContentRepository: CRUD für neue Spalten\n2. CreateContentOrderCommand: Neue Parameter\n3. ContentController: Store\/Update anpassen\n\n### Phase 3: View - Neue Einstellungsfelder\n1. Temperatur-Slider mit Presets (wie Chat)\n2. Max Tokens Dropdown\n3. System Prompt Dropdown\n4. Qualitätsprüfung Checkbox\n5. Model-Gruppierung (Anthropic\/Ollama)\n\n### Phase 4: View - Kritiker-Auswahl\n1. Multi-Select Checkbox-Liste aller aktiven Critics\n2. Kritiker-Card mit:\n - Name\n - Fokus-Tags\n - Sort-Order\n - Edit-Button (→ \/config\/{id}\/edit)\n3. \"Alle auswählen\" \/ \"Keine auswählen\" Buttons\n\n### Phase 5: View - Inline-Edit\n1. ✎ Button für Autorenprofil, Struktur, Contract\n2. Textarea\/Modal zum Bearbeiten\n3. HTMX Save-Handler (wie Chat)\n\n### Phase 6: Python - Kritiker-Filter\n```python\n# In run_critique_round():\norder_critics = json.loads(order.get(\"selected_critics\", \"[]\"))\nif order_critics:\n critic_ids = \",\".join(map(str, order_critics))\n cursor = db.execute(\n f\"SELECT id, name FROM content_config \n WHERE id IN ({critic_ids}) \n AND type = 'critic' AND status = 'active' \n ORDER BY sort_order\"\n )\nelse:\n # Fallback: alle aktiven Critics\n cursor = db.execute(...)\n```\n\n---\n\n## Pflicht-Referenzen\n\n### CLAUDE.md Regeln (BINDEND)\n1. **MCP-DB nutzen** - Kein direkter DB-Zugriff\n2. **HTMX-Pflicht** - Alle interaktiven Elemente mit HTMX + CSRF\n3. **Constants-Pflicht** - Keine Magic Numbers\n4. **Quality vor Sync** - `\/var\/www\/scripts\/php-check.sh` muss bestehen\n5. **MCP-Code nutzen** - Vor Refactoring `code_impact()` ausführen\n\n### HTMX-Regeln\n- `hx-post` MUSS `hx-headers='{\"X-CSRF-TOKEN\": \"...\"}'` haben\n- Inline-Edit: `hx-target` + `hx-swap` korrekt setzen\n\n### Architektur\n- Controller → UseCase → Repository Pattern\n- Views in `src\/View\/content\/`\n- Partials für wiederverwendbare Komponenten\n\n---\n\n## Risiko-Bewertung\n\n| Bereich | Risiko | Grund |\n|---------|--------|-------|\n| Schema-Migration | LOW | Nur neue Spalten, keine Datenänderung |\n| PHP-Änderungen | MEDIUM | Mehrere Dateien, aber isolierte Änderungen |\n| Python-Änderungen | LOW | Eine Funktion anpassen |\n| UI-Änderungen | MEDIUM | Komplexes Config-Panel |\n| Rollback | MÖGLICH | Via Backup\/ALTER TABLE DROP COLUMN |\n\n---\n\n## Testplan\n\n1. `\/content\/new` - Alle neuen Felder erscheinen\n2. Auftrag erstellen mit allen Einstellungen\n3. Kritik-Runde mit ausgewählten Critics\n4. Inline-Edit für Profil\/Struktur\/Contract\n5. PHPStan + CS-Fixer + Semgrep bestehen"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"task\": {\n \"id\": 552,\n \"uuid\": \"a30bf5a0-d1b9-4dcc-a6a4-908cc1442b29\",\n \"title\": \"Content Studio: Einstellungs-Parität mit Chat + Kritiker-Auswahl\",\n \"description\": \"## Ziel\\nContent Studio (`\/content\/new`, `\/content\/{id}`) soll alle Einstellungsmöglichkeiten haben wie der Chat, plus die Möglichkeit, Kritiker auszuwählen und inline zu bearbeiten.\\n\\n---\\n\\n## IST-Analyse: Feature-Vergleich\\n\\n### Chat Config Panel (src\/View\/chat\/partials\/_config_panel.php)\\n| Feature | Vorhanden | Inline-Edit |\\n|---------|-----------|-------------|\\n| Modell (gruppiert Anthropic\/Ollama) | ✅ | - |\\n| Quellen (context_limit) | ✅ | - |\\n| Sammlungen (collections) | ✅ Checkboxen mit Count | - |\\n| Temperatur (Slider + Presets) | ✅ | - |\\n| Max Tokens (Dropdown) | ✅ | - |\\n| Qualitätsprüfung | ✅ Checkbox | - |\\n| System Prompt | ✅ Dropdown | ✅ ✎ Button |\\n| Ausgabeformat\/Struktur | ✅ Dropdown | ✅ ✎ Button |\\n| Autorenprofil | ✅ Dropdown | ✅ ✎ Button |\\n| **Kritiker** | ❌ | ❌ |\\n\\n### Content Studio (src\/View\/content\/new.php)\\n| Feature | Vorhanden | Inline-Edit |\\n|---------|-----------|-------------|\\n| Modell (NICHT gruppiert) | ✅ | - |\\n| Quellen (context_limit) | ✅ | - |\\n| Sammlungen (collections) | ✅ Checkboxen | - |\\n| Temperatur | ❌ FEHLT | - |\\n| Max Tokens | ❌ FEHLT | - |\\n| Qualitätsprüfung | ❌ FEHLT | - |\\n| System Prompt | ❌ FEHLT | ❌ |\\n| Ausgabeformat\/Struktur | ✅ Dropdown | ❌ FEHLT |\\n| Autorenprofil | ✅ Dropdown | ❌ FEHLT |\\n| Contract | ✅ Dropdown | ❌ FEHLT |\\n| **Kritiker** | ❌ FEHLT | ❌ |\\n\\n---\\n\\n## IST-Analyse: Datenbank\\n\\n### chat_sessions (ki_content)\\n```\\nmodel, context_limit, temperature, max_tokens, \\nauthor_profile_id, system_prompt_id, collections\\n```\\n\\n### content_orders (ki_content)\\n```\\nmodel, context_limit, \\nauthor_profile_id, contract_id, structure_id, collections\\n```\\n\\n**FEHLENDE Spalten in content_orders:**\\n- `temperature` DECIMAL(3,2) DEFAULT 0.50\\n- `max_tokens` INT DEFAULT 4096\\n- `system_prompt_id` INT → FK content_config\\n- `selected_critics` JSON (Array von Critic-IDs)\\n- `quality_check` TINYINT(1) DEFAULT 0\\n\\n---\\n\\n## IST-Analyse: Kritiker-Workflow\\n\\n**Aktuell (critic.py:150-154):**\\n```python\\ncursor = db.execute(\\n \\\"SELECT id, name FROM content_config \\n WHERE type = 'critic' AND status = 'active' \\n ORDER BY sort_order\\\"\\n)\\n```\\n→ ALLE aktiven Critics werden automatisch verwendet, keine Auswahl pro Order.\\n\\n**SOLL:** Order-spezifische Kritiker-Auswahl aus `content_orders.selected_critics`\\n\\n---\\n\\n## Code-Impact-Analyse\\n\\n### PHP-Dateien zu ändern\\n\\n| Datei | Änderung |\\n|-------|----------|\\n| `src\/Controller\/ContentController.php` | Neue Parameter in store(), show(), edit() |\\n| `src\/UseCases\/Command\/CreateContentOrderCommand.php` | Neue Felder |\\n| `src\/Infrastructure\/Persistence\/ContentRepository.php` | SQL anpassen |\\n| `src\/View\/content\/new.php` | UI-Elemente hinzufügen |\\n| `src\/View\/content\/edit.php` | UI-Elemente hinzufügen |\\n| `src\/View\/content\/show.php` | Kritiker-Auswahl bei \\\"Kritik starten\\\" |\\n\\n### Python-Dateien zu ändern\\n\\n| Datei | Änderung |\\n|-------|----------|\\n| `\/var\/www\/scripts\/pipeline\/generators\/critic.py` | `run_critique_round()` - Order.selected_critics nutzen |\\n\\n### Neue Dateien (optional)\\n\\n| Datei | Zweck |\\n|-------|-------|\\n| `src\/View\/content\/partials\/_config_panel.php` | Wiederverwendbares Config-Panel (wie Chat) |\\n| `src\/View\/partials\/form\/config-editor.php` | Inline-Editor Partial |\\n\\n---\\n\\n## Implementierungsplan\\n\\n### Phase 1: Schema-Migration\\n```sql\\nALTER TABLE content_orders\\nADD COLUMN temperature DECIMAL(3,2) DEFAULT 0.50,\\nADD COLUMN max_tokens INT DEFAULT 4096,\\nADD COLUMN system_prompt_id INT NULL,\\nADD COLUMN selected_critics JSON NULL,\\nADD COLUMN quality_check TINYINT(1) DEFAULT 0,\\nADD CONSTRAINT fk_orders_system_prompt \\n FOREIGN KEY (system_prompt_id) REFERENCES content_config(id);\\n```\\n\\n### Phase 2: PHP Backend\\n1. ContentRepository: CRUD für neue Spalten\\n2. CreateContentOrderCommand: Neue Parameter\\n3. ContentController: Store\/Update anpassen\\n\\n### Phase 3: View - Neue Einstellungsfelder\\n1. Temperatur-Slider mit Presets (wie Chat)\\n2. Max Tokens Dropdown\\n3. System Prompt Dropdown\\n4. Qualitätsprüfung Checkbox\\n5. Model-Gruppierung (Anthropic\/Ollama)\\n\\n### Phase 4: View - Kritiker-Auswahl\\n1. Multi-Select Checkbox-Liste aller aktiven Critics\\n2. Kritiker-Card mit:\\n - Name\\n - Fokus-Tags\\n - Sort-Order\\n - Edit-Button (→ \/config\/{id}\/edit)\\n3. \\\"Alle auswählen\\\" \/ \\\"Keine auswählen\\\" Buttons\\n\\n### Phase 5: View - Inline-Edit\\n1. ✎ Button für Autorenprofil, Struktur, Contract\\n2. Textarea\/Modal zum Bearbeiten\\n3. HTMX Save-Handler (wie Chat)\\n\\n### Phase 6: Python - Kritiker-Filter\\n```python\\n# In run_critique_round():\\norder_critics = json.loads(order.get(\\\"selected_critics\\\", \\\"[]\\\"))\\nif order_critics:\\n critic_ids = \\\",\\\".join(map(str, order_critics))\\n cursor = db.execute(\\n f\\\"SELECT id, name FROM content_config \\n WHERE id IN ({critic_ids}) \\n AND type = 'critic' AND status = 'active' \\n ORDER BY sort_order\\\"\\n )\\nelse:\\n # Fallback: alle aktiven Critics\\n cursor = db.execute(...)\\n```\\n\\n---\\n\\n## Pflicht-Referenzen\\n\\n### CLAUDE.md Regeln (BINDEND)\\n1. **MCP-DB nutzen** - Kein direkter DB-Zugriff\\n2. **HTMX-Pflicht** - Alle interaktiven Elemente mit HTMX + CSRF\\n3. **Constants-Pflicht** - Keine Magic Numbers\\n4. **Quality vor Sync** - `\/var\/www\/scripts\/php-check.sh` muss bestehen\\n5. **MCP-Code nutzen** - Vor Refactoring `code_impact()` ausführen\\n\\n### HTMX-Regeln\\n- `hx-post` MUSS `hx-headers='{\\\"X-CSRF-TOKEN\\\": \\\"...\\\"}'` haben\\n- Inline-Edit: `hx-target` + `hx-swap` korrekt setzen\\n\\n### Architektur\\n- Controller → UseCase → Repository Pattern\\n- Views in `src\/View\/content\/`\\n- Partials für wiederverwendbare Komponenten\\n\\n---\\n\\n## Risiko-Bewertung\\n\\n| Bereich | Risiko | Grund |\\n|---------|--------|-------|\\n| Schema-Migration | LOW | Nur neue Spalten, keine Datenänderung |\\n| PHP-Änderungen | MEDIUM | Mehrere Dateien, aber isolierte Änderungen |\\n| Python-Änderungen | LOW | Eine Funktion anpassen |\\n| UI-Änderungen | MEDIUM | Komplexes Config-Panel |\\n| Rollback | MÖGLICH | Via Backup\/ALTER TABLE DROP COLUMN |\\n\\n---\\n\\n## Testplan\\n\\n1. `\/content\/new` - Alle neuen Felder erscheinen\\n2. Auftrag erstellen mit allen Einstellungen\\n3. Kritik-Runde mit ausgewählten Critics\\n4. Inline-Edit für Profil\/Struktur\/Contract\\n5. PHPStan + CS-Fixer + Semgrep bestehen\",\n \"type\": \"ai_task\",\n \"status\": \"pending\",\n \"created_by\": \"mcp-tasks\",\n \"created_by_type\": \"ai\",\n \"parent_task_id\": null,\n \"due_date\": null,\n \"created_at\": \"2025-12-30T20:57:38.801459\",\n \"updated_at\": \"2025-12-30T20:57:38.801460\",\n \"completed_at\": null,\n \"metadata\": {}\n },\n \"message\": \"Task #552 created\"\n}"
}
]
}