Skip to content

feat: адаптивный цикл поиска (фаза 4) — round → Opus-eval → bounded deviation - #3

Merged
Socialpranker merged 35 commits into
mainfrom
feat/adaptive-search-phase45
Jun 14, 2026
Merged

feat: адаптивный цикл поиска (фаза 4) — round → Opus-eval → bounded deviation#3
Socialpranker merged 35 commits into
mainfrom
feat/adaptive-search-phase45

Conversation

@Socialpranker

Copy link
Copy Markdown
Owner

Что это

Превращает Фазу 4 (Search) deep-research-каркаса из одного запланированного залпа в оркестратор-управляемый цикл: раунд → оценка Opus → опциональный ограниченный раунд-отклонение, с бюджетом отклонений, лимитом глубины и аудит-логом deviations.md.

Реализовано по плану docs/superpowers/plans/2026-06-13-adaptive-search-loop.md (11 задач TDD) методом subagent-driven (implementer → spec-review → code-review на каждой задаче).

Слой A — методология (docs)

  • phases.yaml: Фаза 4 помечена как loop (без новой phase-id; счётчик фаз остаётся 9).
  • references/workflow.md: Фаза 4 переписана как цикл раундов (signals-блок, бюджет/глубина, deviations.md, условия терминации); 5-й adversarial-вопрос (аудит deviations) в Фазе 6; carry_forward в Фазе 7.

Слой B — движок (runner/adaptive.py, на DryRun + mocks)

  • parse_signals — контракт сигналов сабагента + fail-safe парсинг
  • Budget/BUDGET_BY_DEPTH/class_of — бюджет cheap/expensive + depth-лимит (atomic debit, не уходит ниже нуля)
  • Deviation/write_deviations — запись deviations.md (pursued/not_pursued — исчерпанный бюджет/глубина всё равно оставляет запись)
  • cross_agent_contradiction_scan — дешёвый скан противоречий между агентами (ловит то, что отдельный сабагент не видит)
  • decide_deviations — Opus-решение об отклонении (фильтр justified/reject, default-to-reject)
  • run_search_loop — цикл раундов с гарантированной терминацией (каждый путь тратит бюджет или упирается в depth-cap)
  • Orchestrator.search() — встроен цикл; RunState.deviations; пишет deviations.md

Реальный веб-поиск — вне scope (URL остаются плейсхолдерами); цикл прогоняется end-to-end на DryRun, артефакт появляется.

Процесс ревью

Каждая задача прошла две стадии (spec-compliance → code-quality, opus-ревьюеры) + финальное holistic-ревью всего инкремента. Находки пофикшены: убран мёртвый RoundResult; покрыты ветки default-to-reject / fallback-rationale / depth_limit / budget_exhausted / cross-agent; переименованы неиспользуемые параметры; добавлен TODO(Phase 5) на плейсхолдеры outcome/new_source_ids.

Test Plan

  • python3 -m pytest -q82 passed, 4 skipped (4 skip = opt-in -m live smoke)
  • python3 scripts/stamp_docs.py --check → exit 0 (счётчик фаз неизменён, 9)
  • Scaffold deep-run валидируется --strict (exit 0) и эмитит deviations.md
  • Live-smoke (-m live, нужен ANTHROPIC_API_KEY) — не гонялся, в CI не обязателен

⚠️ Замечание по scope PR

origin/main отставал от локального main на 16 коммитов (предыдущая, несвязанная фича — «мульти-LLM runner, фаза 2», ранее не запушенная). Поэтому этот PR включает 35 коммитов: 16 предыдущих (multi-LLM runner) + 19 этой фичи (adaptive-search-loop). Предыдущая фича едет вместе по решению автора — не пугаться лишних коммитов в диффе.

🤖 Generated with Claude Code

Socialpranker and others added 30 commits June 13, 2026 17:14
Дизайн доведения runner до рабочего мульти-LLM движка: реальные
complete()/fanout() для ClaudeProvider (anthropic SDK) и нового
OpenAICompatProvider (один класс, configurable base_url → покрывает
OpenAI/OpenRouter/Ollama/Groq/vLLM). fanout = N параллельных API-вызовов
через ThreadPoolExecutor (runner standalone, без harness sub-agents).
Ключи из ENV, fail-fast без ключа. Тесты: mock SDK + opt-in live smoke.
Web-search осознанно вынесен в следующую фазу (URL остаются плейсхолдерами).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Пошаговый план: run_parallel → ClaudeProvider.complete/fanout →
OpenAICompatProvider → build_provider (fail-fast) → CLI-флаги orchestrator →
deps+live-smoke → reconcile DESIGN.md. Каждая задача — red/green/commit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…il-loud)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… CI, сохраняет дискриминацию)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…+ tier→model

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…non-empty system

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… run_parallel

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…/Ollama/Groq

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…аемость messages + 2 теста

Пустой choices (content-filter/refusal) теперь даёт ValueError с контекстом,
а не IndexError, роняющий весь fanout-батч. messages собирается явно (две строки
вместо backslash-continuation). Тесты: model_override, empty-choices guard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…t без ключа

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…н мёртвый get_provider; base_url хранится

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… python)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ры реализованы, fanout=thread-pool)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… расхождение с fanout-буллетом)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Реальные ClaudeProvider + OpenAICompatProvider (anthropic/openai SDK),
fanout через ThreadPoolExecutor (standalone), build_provider + fail-fast,
CLI --model/--base-url, mock+live тесты. Web-search — следующая фаза.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Брейншторм-дизайн runtime-адаптивности поиска: условная фаза 4.5 между
Search и Scoring. Гибрид с бюджетом отклонений (cheap/expensive + depth-лимит),
4 триггера, двухуровневая детекция (сабагент=recall / Opus=precision),
структурный deviations.md, аудит в фазе 6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Отказ от отдельной условной фазы 4.5 в пользу чистого Approach 2: сама
фаза 4 становится оркестрируемым циклом (раунд → оценка Opus → опц. раунд).
Налог на Opus-оценку каждого прогона принят осознанно ради простоты.

Переносится без изменений: 4 триггера, классы cheap/expensive,
бюджет 2/0/1·4/1/1·8/3/2, depth-лимит, deviations.md, аудит в фазе 6,
двухуровневая детекция. Убрано: фаза 4.5, вариант B (условный запуск),
гейт по флагу. Файл переименован (phase45→loop), phase count не меняется.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…+ движок)

Пласт A (Tasks 1-4): phases.yaml аннотация loop без новой фазы + переписать
workflow.md (цикл раундов, signals, бюджет, deviations.md, 5-й adversarial,
carry_forward). Пласт B (Tasks 5-11): новый runner/adaptive.py через TDD на
DryRun+моках — signals-парсинг, бюджет/depth, deviations writer, cross-agent
scan, Opus-решение, run_search_loop с терминацией, встройка в search().
Real web search вне scope (URL остаются плейсхолдерами, как в спеке).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ward в фазе 7

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…_pass.md + дедуп в workflow.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…е уходит ниже нуля)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…pursued)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… что сабагент не видит)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… классификация)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e_deviations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ацией (бюджет/depth)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Socialpranker and others added 5 commits June 13, 2026 21:07
…и cross-agent пути в цикле

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…й тест (DryRun + live-smoke)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…outcome (Phase 5)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Socialpranker
Socialpranker merged commit a6c0c10 into main Jun 14, 2026
2 checks passed
@Socialpranker
Socialpranker deleted the feat/adaptive-search-phase45 branch June 14, 2026 04:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant