# Intent: Research-Spalten-Konfiguration bei Drag und Ausführung anwenden ## Ziel Wird eine Karte per Drag von `recherche_angefordert` nach `recherche_laeuft` gezogen, liest `trigger.py` die dann gespeicherte `column_config["recherche_laeuft"]` (Runtime, Modell, Reasoning-Effort) statt nur der globalen `board_runtime()` und legt sie im Job-Payload ab; `worker.py`s `run_research()` nimmt diese Werte entgegen und verwendet sie statt der bisher rein Env-Var-basierten Researcher- Defaults (`BOARD_RESEARCHER_CODEX_MODEL` u. a.). ## Umfang - `board-agent/trigger.py`, `update_phase()`, Zweig `new_phase == "recherche_laeuft"` (aktuell Zeile 545-552): analog zum Builder-Trigger `config = load_column_config()["recherche_laeuft"]` lesen und `write_job(..., job_type="research", runtime=config["runtime"], **extra)` mit `extra` nur für nicht-leere `model`/`reasoning_effort` füllen (gleiche Semantik wie in `board-builder-trigger-column-config` beschrieben — leere Werte dürfen nicht als explizite leere Zeichenkette im Payload landen). - `board-agent/worker.py`: - `run_research(slug, research_intent_path, runtime="codex", model=None, reasoning_effort=None)` (aktuell Zeile 638) um die beiden neuen optionalen Parameter erweitern. - Die beiden `append_model_options(...)`-Aufrufe (Codex-Zweig, Zeile 660-664) bzw. `append_claude_model_options(command)` (Claude-Zweig, Zeile 695) so anpassen, dass bei gesetztem `model`/`reasoning_effort`-Parameter dieser statt des bisherigen `os.environ.get("BOARD_RESEARCHER_CODEX_MODEL", "")` bzw. des Claude-Env-Var-Defaults verwendet wird — `model`/`reasoning` bleiben `None`, wenn der Aufrufer nichts übergibt, sodass der bestehende Env-Var-Fallback exakt wie bisher greift. - `process_job()`s `research`-Zweig (aktuell um Zeile 861-915) liest `payload.get("model")`/`payload.get("reasoning_effort")` und reicht sie an `run_research(...)` durch. - `board-agent/test_board_agent.py`: Test, der `column_config["recherche_laeuft"]` vor dem Drag setzt und prüft, dass der resultierende Job-Payload die Felder enthält; sowie ein Test für `run_research()` mit explizitem `model`/`reasoning_effort` gegenüber dem bisherigen reinen Env-Var-Verhalten (z. B. per Monkeypatch/Fake-Subprocess wie in den bestehenden Tests für `run_research()`, falls vorhanden). ## Explizit ausgeschlossen - Kein Iterationslimit für Research — es existiert kein Analogon zu `AGENT_BUILDER_ITERATION_LIMIT` im Research-Pfad, daher kein entsprechendes Feld. - Keine Änderung an `agent-codex/builder.py` — Research läuft vollständig innerhalb von `worker.py`, es gibt keine Weitergabe an einen separaten Agenten-Prozess wie beim Builder. - Kein UI (Scope von `board-column-config-frontend-headers`). - Keine Änderung an Builder- oder Review-Pfaden. ## Annahmen - `board-column-config-backend-state` ist bereits gemergt. - Die bisherigen Env-Vars `BOARD_RESEARCHER_CODEX_MODEL`/ `BOARD_RESEARCHER_CODEX_REASONING_EFFORT` sowie das entsprechende Claude-Pendant bleiben als Fallback-Default bestehen, wenn `column_config["recherche_laeuft"]` keinen Override enthält. ## Offene Risiken / offene Fragen - `append_claude_model_options()` liest ihren Claude-Env-Var-Default aktuell aus den globalen `AGENT_BUILDER_CLAUDE_MODEL`/ `AGENT_BUILDER_CLAUDE_REASONING_EFFORT`-Namen (siehe `common.py` Zeile 421-436), nicht aus researcherspezifischen Namen wie beim Codex-Zweig — vorhandene Asymmetrie im bestehenden Code, die dieses Intent nicht auflöst, nur respektiert (expliziter Parameter aus `column_config` überschreibt in beiden Fällen unabhängig vom jeweiligen Env-Var-Namen). ## Erfolgskriterien - Eine Karte, die mit einer vom Default abweichenden `column_config["recherche_laeuft"]`-Konfiguration nach `recherche_laeuft` gezogen wird, löst einen Research-Lauf mit genau diesem Modell/Reasoning-Effort aus (verifizierbar am tatsächlich aufgerufenen Kommando bzw. an einem Test mit Fake-Subprocess). - Unveränderte Default-Konfiguration führt zu identischem Verhalten wie vor diesem Intent (Env-Var-Fallback). - Bestehende Research-Tests bleiben grün, neue Tests sind grün.