{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"task\": {\n \"id\": 551,\n \"uuid\": \"2b386f08-931f-47a4-9088-23452e3b43ea\",\n \"title\": \"Critics in content_config integrieren (wie Autorenprofil\/Struktur)\",\n \"description\": \"## Vollständige Workflow-Analyse\\n\\n### Content-Generierung Workflow\\n```\\ncontent_orders (author_profile_id, structure_id, contract_id → content_config)\\n ↓ generate\\ncontent_versions (order_id, version_number, content)\\n ↓ critique (run_critique_round)\\ncontent_critiques (version_id, critic_id → critics, round, feedback)\\n ↓ wenn !passed\\nrevision → neue Version → erneut critique\\n ↓ wenn passed\\nvalidate → approve → published\\n```\\n\\n### Betroffene Code-Stellen\\n\\n**PHP (8 Dateien zu entfernen):**\\n- Controller\/CriticsController.php\\n- UseCases\/Critics\/ManageCriticsUseCase.php\\n- UseCases\/Command\/CreateCriticCommand.php\\n- UseCases\/Command\/UpdateCriticCommand.php\\n- Infrastructure\/Persistence\/CriticsRepository.php\\n- Domain\/DTO\/CriticDTO.php + CriticResult.php\\n- View\/critics\/* (4 Templates)\\n\\n**PHP (3 Dateien anzupassen):**\\n- ConfigController.php - Critic-spezifische Logik (prompt_id Dropdown)\\n- ContentConfigRepository.php - sort_order für Critics\\n- View\/config\/form.php - Critic-Felder\\n\\n**Python (2 Dateien anzupassen):**\\n- generators\/critic.py - SELECT von content_config statt critics\\n- generators\/config_loader.py - get_critic() Funktion hinzufügen\\n\\n---\\n\\n## Migrationsplan Option A\\n\\n### Phase 1: Schema-Migration\\n\\n```sql\\n-- 1. ENUM erweitern\\nALTER TABLE content_config \\nMODIFY type ENUM('author_profile','structure','organization','contract','rule','system_prompt','critic');\\n\\n-- 2. Felder für Critics (in content JSON)\\n-- prompt_id → content.prompt_id\\n-- sort_order → content.sort_order\\n-- fokus → content.fokus\\n```\\n\\n### Phase 2: Daten-Migration\\n\\n```sql\\n-- Critics → content_config\\nINSERT INTO content_config (type, name, slug, description, content, version, status)\\nSELECT \\n 'critic',\\n name,\\n LOWER(REPLACE(name, ' ', '-')),\\n CONCAT('Fokus: ', JSON_UNQUOTE(JSON_EXTRACT(fokus, '$[0]'))),\\n JSON_OBJECT(\\n 'fokus', fokus,\\n 'prompt_id', prompt_id,\\n 'sort_order', sort_order\\n ),\\n '1.0',\\n IF(is_active = 1, 'active', 'draft')\\nFROM critics;\\n```\\n\\n### Phase 3: FK-Migration\\n\\n```sql\\n-- ID-Mapping erstellen\\nCREATE TEMPORARY TABLE critic_id_map AS\\nSELECT c.id AS old_id, cc.id AS new_id\\nFROM critics c\\nJOIN content_config cc ON cc.type = 'critic' AND cc.name = c.name;\\n\\n-- content_critiques FK aktualisieren\\nUPDATE content_critiques cc\\nJOIN critic_id_map m ON cc.critic_id = m.old_id\\nSET cc.critic_id = m.new_id;\\n\\n-- FK Constraint ändern\\nALTER TABLE content_critiques \\nDROP FOREIGN KEY fk_content_critiques_critic,\\nADD CONSTRAINT fk_content_critiques_config \\n FOREIGN KEY (critic_id) REFERENCES content_config(id);\\n```\\n\\n### Phase 4: Code-Migration\\n\\n**Python critic.py anpassen:**\\n```python\\ndef get_critic(critic_id: int) -> dict | None:\\n cursor = db.execute(\\n \\\"\\\"\\\"SELECT cc.*, p.content as prompt_content\\n FROM content_config cc\\n LEFT JOIN prompts p ON JSON_UNQUOTE(JSON_EXTRACT(cc.content, '$.prompt_id')) = p.id\\n WHERE cc.id = %s AND cc.type = 'critic' AND cc.status = 'active'\\\"\\\"\\\",\\n (critic_id,),\\n )\\n result = cursor.fetchone()\\n if result:\\n content = json.loads(result['content'])\\n result['fokus'] = content.get('fokus', [])\\n result['prompt_id'] = content.get('prompt_id')\\n result['sort_order'] = content.get('sort_order', 0)\\n return result\\n\\ndef get_active_critics():\\n cursor = db.execute(\\n \\\"\\\"\\\"SELECT id, name, JSON_UNQUOTE(JSON_EXTRACT(content, '$.sort_order')) as sort_order\\n FROM content_config \\n WHERE type = 'critic' AND status = 'active'\\n ORDER BY CAST(JSON_UNQUOTE(JSON_EXTRACT(content, '$.sort_order')) AS UNSIGNED)\\\"\\\"\\\"\\n )\\n return cursor.fetchall()\\n```\\n\\n**PHP ConfigController erweitern:**\\n- In form.php: Zeige prompt_id Dropdown wenn type='critic'\\n- In form.php: Zeige sort_order wenn type='critic'\\n- In form.php: fokus als Textarea (Zeilen → JSON Array)\\n\\n### Phase 5: Cleanup\\n\\n```sql\\nDROP TABLE critics;\\n```\\n\\n```bash\\n# PHP-Dateien entfernen\\nrm src\/Controller\/CriticsController.php\\nrm src\/UseCases\/Critics\/ManageCriticsUseCase.php\\nrm src\/UseCases\/Command\/CreateCriticCommand.php\\nrm src\/UseCases\/Command\/UpdateCriticCommand.php\\nrm src\/Infrastructure\/Persistence\/CriticsRepository.php\\nrm src\/Domain\/DTO\/CriticDTO.php\\nrm src\/Domain\/DTO\/CriticResult.php\\nrm -rf src\/View\/critics\/\\n```\\n\\n### Risiko-Bewertung\\n- **DB-Migration:** LOW (4 Datensätze)\\n- **FK-Update:** MEDIUM (31 content_critiques)\\n- **Code-Änderungen:** MEDIUM (Python-Queries, PHP-Views)\\n- **Rollback:** Möglich via Backup\",\n \"type\": \"ai_task\",\n \"status\": \"completed\",\n \"created_by\": \"mcp-tasks\",\n \"created_by_type\": \"ai\",\n \"parent_task_id\": null,\n \"due_date\": null,\n \"created_at\": \"2025-12-30T16:46:39.317498\",\n \"updated_at\": \"2025-12-30T20:48:52.249304\",\n \"completed_at\": \"2025-12-30T20:48:52.249306\",\n \"metadata\": {}\n },\n \"message\": \"Task #551 status changed: in_progress -> completed\"\n}"
}
]
}