# pipeline_setup_v2

Новый общий harness для двух семейств прогонов:

- `code_qa_eval` — synthetic/golden проверки
- `runtime` — router_only / router_rag / full_chain

## Идея

Один runner:

- читает все `*.yaml` из папки с кейсами
- для кейса принимает либо `repo_path`, либо `rag_session_id`
- при `repo_path` сам индексирует репозиторий и получает `rag_session_id`
- запускает выбранный runner/mode
- проверяет ожидания
- пишет per-case артефакты и `summary.md`

## Структура

- `run.py` — верхнеуровневый entrypoint
- `llm_prompts.yaml` — общий каталог LLM-промтов для `full_chain`
- `cases/` — папки с YAML-наборами кейсов
- `core/` — общий harness: модели, loader, validator, session provider, artifact writer, orchestration
- `runtime/` — конкретные исполнители для `runtime` и `code_qa_eval`
- `test_results/` — артефакты прогонов

## Запуск

```bash
PYTHONPATH=. python -m tests.pipeline_setup_v2.run \
  --cases-dir tests/pipeline_setup_v2/cases/suite_01_synthetic \
  --run-name suite_01_smoke
```

```bash
PYTHONPATH=. python -m tests.pipeline_setup_v2.run \
  --cases-dir tests/pipeline_setup_v2/cases/suite_02_pipeline \
  --run-name suite_02_smoke
```

## Индексация RAG

Если вы хотите получить `rag_session_id` заранее и подставлять его в кейсы, можно отдельно запустить индексатор:

```bash
PYTHONPATH=. python -m tests.pipeline_setup.suite_02_pipeline.cli.index_repo \
  --repo-path /absolute/path/to/repo \
  [--project-id my-project]
```

На выходе индексатор печатает:

```bash
rag_session_id=<uuid>
```

После этого `rag_session_id` можно использовать в описании кейса:

```yaml
cases:
  - id: explain-existing-session
    runner: runtime
    mode: router_rag
    query: "Как работает OrderService?"
    input:
      rag_session_id: "<uuid>"
```

Если в кейсе вместо `rag_session_id` указан `repo_path`, то `pipeline_setup_v2` сам выполнит индексацию перед прогоном.

## Формат кейсов

Runner читает несколько YAML-файлов из одной папки.

Поддерживаемые поля:

- `defaults.runner`: `runtime` или `code_qa_eval`
- `defaults.mode`: `router_only`, `router_rag`, `full_chain`
- `defaults.input.repo_path`
- `defaults.input.project_id`
- `defaults.input.rag_session_id`

На уровне кейса:

- `id`
- `query`
- `runner`
- `mode`
- `input`
- `expected.router.*`
- `expected.retrieval.*`
- `expected.llm.*`
- `expected.pipeline.answer_mode`

## LLM Промпты

Общий каталог промтов для `full_chain` находится в:

- `tests/pipeline_setup_v2/llm_prompts.yaml`

Выбор шаблона идёт в таком порядке:

- `intent + sub_intent`
- fallback на `intent`
- fallback на `default`

## Артефакты

Результаты пишутся в:

- `tests/pipeline_setup_v2/test_results/<run_name>/<timestamp>/`

Там создаются:

- `*.json` по каждому кейсу
- `*.md` по каждому кейсу
- `summary.md`
