# Router / Orchestration Fix Report (2026-03-23)

## Scope completed

По `IN/TZ_Router_Orchestration_Fix.md` реализованы:

1. Query classifier v2 с decision flags.
2. Store sufficiency checker.
3. Explicit route guards.
4. Runtime batch handoff (`refresh_and_answer` job path).
5. Route decision logging для всех benchmark-вопросов.
6. Unit + integration-style tests по router-модулям.
7. Повторный validation-run на июньском semantic-v2 срезе.

## Implemented modules

Новые пакеты и файлы:

- `router/query_classifier.py`
- `router/store_sufficiency.py`
- `router/route_selector.py`
- `router/decision_log.py`
- `orchestration/batch_runtime.py`

Подключение в benchmark-runtime:

- `scripts/run_validation_accounting_analytics.py`
  - orchestration policy расширена ссылками на runtime-router модули;
  - добавлен `build_store_metadata(...)`;
  - добавлен `build_benchmark_results_v2(...)`;
  - добавлен batch handoff path для `batch_refresh_then_store`;
  - добавлен export `route_decision_logs.json`.

## Tests

Добавлены тесты:

- `tests/test_router_decision_flags.py`
- `tests/test_store_sufficiency.py`
- `tests/test_route_guards.py`
- `tests/test_batch_runtime_handoff.py`
- `tests/test_router_benchmark_subset.py`

Статус:

- `python -m pytest -q` -> `31 passed`

## Validation run (router-fix)

Команда:

`python scripts/run_validation_accounting_analytics.py --snapshot-path logs/pre_report_snapshot_2020_2020-06_semantic_v2.json --output-dir docs/ARCH/validation_run_2026-03-23_router_fix --strict`

Выход:

- `docs/ARCH/validation_run_2026-03-23_router_fix/`

Ключевые результаты benchmark:

- `questions_total = 35`
- `route_mismatch_count = 1` (было 7)
- `degraded_answers_count = 0`
- `batch_route_count = 5` (было 0)
- `heavy_analytical mismatches = 0`
- `cross_entity mismatches = 0`
- `drilldown_explain mismatches = 0`

Единственный остаточный mismatch:

- `Q19` (`period_trend`): expected `store_feature_risk`, actual `batch_refresh_then_store`

Decision logs:

- `docs/ARCH/validation_run_2026-03-23_router_fix/route_decision_logs.json`
- покрытие логами: `35/35` вопросов.

## Acceptance criteria status

По целям ТЗ:

- `route_mismatch_count <= 2`: **done** (`1`)
- `heavy_analytical mismatches = 0`: **done**
- `cross_entity mismatches = 0`: **done**
- `drilldown_explain mismatches <= 1`: **done** (`0`)
- `batch_route_count > 0`: **done** (`5`)
- `degraded_answers_count = 0`: **done**
- decision logs for all 35: **done**

## Notes

1. Batch runtime path исполняется в-process через `orchestration.batch_runtime`, с job payload и run-id trace.
2. Refresh step в batch режиме сейчас gated (`allow_refresh_in_batch=False` для validation profile), чтобы не делать неконтролируемый live refresh в этом прогоне; при этом feature/risk handoff исполняется реально.
3. Следующий точечный шаг: опционально дотюнить classifier threshold для `Q19`, чтобы привести `route_mismatch_count` к `0`.
