feat: адаптивный цикл поиска (фаза 4) — round → Opus-eval → bounded deviation - #3
Merged
Merged
Conversation
Дизайн доведения 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>
…е уходит ниже нуля) 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>
…и 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что это
Превращает Фазу 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 -q→ 82 passed, 4 skipped (4 skip = opt-in-m livesmoke)python3 scripts/stamp_docs.py --check→ exit 0 (счётчик фаз неизменён, 9)--strict(exit 0) и эмититdeviations.md-m live, нуженANTHROPIC_API_KEY) — не гонялся, в CI не обязателенorigin/mainотставал от локальногоmainна 16 коммитов (предыдущая, несвязанная фича — «мульти-LLM runner, фаза 2», ранее не запушенная). Поэтому этот PR включает 35 коммитов: 16 предыдущих (multi-LLM runner) + 19 этой фичи (adaptive-search-loop). Предыдущая фича едет вместе по решению автора — не пугаться лишних коммитов в диффе.🤖 Generated with Claude Code