kin: KIN-ARCH-024-debugger
This commit is contained in:
parent
f1c868e335
commit
b7d9b53322
1 changed files with 52 additions and 0 deletions
|
|
@ -123,6 +123,58 @@ class TestAnalystInjectionOnRevise:
|
|||
assert data["revise_count"] == 3
|
||||
assert (data.get("pipeline_steps") or [{}])[0]["role"] == "analyst"
|
||||
|
||||
@patch("agents.runner.subprocess.run")
|
||||
def test_pipeline_with_analyst_first_executes_analyst_as_first_agent(self, mock_run, conn):
|
||||
"""Интеграционный тест: run_pipeline с analyst первым шагом запускает analyst первым.
|
||||
|
||||
Проверяет РЕАЛЬНОЕ выполнение пайплайна через run_pipeline() напрямую,
|
||||
без мока _launch_pipeline_subprocess — в отличие от других тестов класса,
|
||||
которые проверяют только JSON-ответ API.
|
||||
|
||||
Структура вызовов subprocess.run:
|
||||
call[0] — check_claude_auth (cmd: [claude, "-p", "ok", ...])
|
||||
call[1] — первый агент пайплайна (должен быть analyst)
|
||||
"""
|
||||
analyst_output = {
|
||||
"status": "done",
|
||||
"root_problem": "Предыдущий подход не учитывал корневую причину X",
|
||||
"suggested_approach": "Переработать алгоритм с учётом Y",
|
||||
"confidence": "high",
|
||||
}
|
||||
mock_run.return_value = _mock_success(analyst_output)
|
||||
|
||||
# Шаги, которые revise_task() строит при ревизии 2+ (после инжекции analyst)
|
||||
analyst_step = {
|
||||
"role": "analyst",
|
||||
"model": "sonnet",
|
||||
"brief": "Задача вернулась на ревизию №2. Проведи анализ.",
|
||||
}
|
||||
steps = [analyst_step]
|
||||
|
||||
result = run_pipeline(conn, "P1-001", steps)
|
||||
|
||||
# conftest._mock_check_claude_auth авто-мокирует check_claude_auth для всех тестов,
|
||||
# поэтому auth-check НЕ занимает slot в call_args_list.
|
||||
# Ожидаемый порядок вызовов subprocess.run:
|
||||
# call[0] = analyst (первый шаг пайплайна)
|
||||
# call[1] = learning extractor (авто-обучение после завершения пайплайна)
|
||||
assert mock_run.call_count >= 1, (
|
||||
f"Ожидалось >= 1 вызова subprocess.run (analyst), "
|
||||
f"получили {mock_run.call_count}"
|
||||
)
|
||||
|
||||
# Первый вызов (индекс 0): cmd = [claude, "-p", prompt, ...]
|
||||
first_agent_cmd = list(mock_run.call_args_list[0].args[0])
|
||||
assert "-p" in first_agent_cmd, "Claude CLI cmd должна содержать -p"
|
||||
prompt_idx = first_agent_cmd.index("-p") + 1
|
||||
first_prompt = first_agent_cmd[prompt_idx]
|
||||
|
||||
# agents/prompts/analyst.md начинается с "You are an Analyst for the Kin..."
|
||||
assert "Analyst" in first_prompt, (
|
||||
f"Первый выполненный агент должен быть analyst. "
|
||||
f"Промпт начинается с: {first_prompt[:200]}"
|
||||
)
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# 2. Smoke tester: cannot_confirm → blocked; confirmed → continues
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue