Skip to content

feat: Phase 7 — Refresh targets generation - #5

Merged
Socialpranker merged 14 commits into
mainfrom
feat/phase7-refresh
Jun 15, 2026
Merged

feat: Phase 7 — Refresh targets generation#5
Socialpranker merged 14 commits into
mainfrom
feat/phase7-refresh

Conversation

@Socialpranker

Copy link
Copy Markdown
Owner

Что это

Финальная фаза прогона deep-research — Orchestrator.refresh(s) после verify() (Phase 6.5), перед return s.dir. Пишет <slug>/refresh_targets.md — точку входа для будущего дельта-ресёрча update <slug>.

Паттерн фазы как у scoring/capabilities/verify: чистый модуль runner/refresh.py (5 pure-функций, без сети/I/O) + тонкий метод в оркестраторе.

Ключевое решение

synthesize() сейчас — scaffold (отчёт без блоков M2/N1/A4, block-render не реализован). Поэтому Phase 7 извлекает данные из RunState (s.hypotheses/s.sources/s.triangulation/deviations.md), а не парсит отчёт. Чего нет в RunState (pricing-URL+hash, FRED series id, OpenAlex concept ids) — помечено машинно-видимыми <!-- TODO -->-маркерами для будущего block-render, не выдумано.

Содержимое refresh_targets.md (шаблон Z11)

Frontmatter (slug, last_research_date, depth, update_cadence: deep→30d / иначе→90d) + 5 секций:

  1. Entities to track — дедуп по домену из s.sources
  2. Numbers to refresh — эвристика (digit в claim ИЛИ data-домен по netloc)
  3. Topic markers — TODO (нет discovery-метаданных в RunState)
  4. Hypotheses to re-test — H1–H4 со статусом supported/inconclusive из triangulation
  5. Refresh candidates — carry-forward из deviations.md (not_pursued)

Гейт: if s.depth == "shallow": return (как Phase 3.5). Сети/subprocess нет → run()-тесты оффлайн. JSON-схем нет → guard-тест не затронут.

Сверх скоупа Phase 7 (2 pre-existing инфра-фикса)

В ветку также вошли два независимых фикса pre-existing проблем (подтверждены на main, обнаружены при верификации):

  • 02de15apytest.ini: addopts = -m "not live". Маркер live объявлялся, но механизма скипа не было → дефолтный pytest падал на live-тесте без API-ключа. Теперь дефолтный прогон зелёный, live запускаются явным -m live.
  • 41a69aerunner/providers.py: try/except-импорт hypothesis_ids (relative→absolute) по канону остальных модулей. Чинит ModuleNotFoundError при запуске python3 runner/orchestrator.py как скрипта.

Верификация

  • python3 -m pytest -q161 passed, 6 deselected (дефолт теперь зелёный благодаря фиксу выше)
  • tests/test_refresh.py → 25 тестов (юнит на голых dict/строках + оффлайн через run() на DryRunProvider)
  • ruff check → All checks passed!
  • Дымовой end-to-end (DryRun) → файл валиден, 5 секций, cadence корректен, shallow пропущен

Каждая из 6 реализационных задач прошла spec + code-quality ревью; финальный review (pr-review-toolkit) — Ready to merge, 0 Critical/Important.

Дизайн: docs/superpowers/specs/2026-06-15-phase7-refresh-design.md
План: docs/superpowers/plans/2026-06-15-phase7-refresh.md

🤖 Generated with Claude Code

Socialpranker and others added 14 commits June 15, 2026 12:25
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…, раскрыт ternary (review)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ь §5, тест why-fallback (review)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pytest.ini объявлял маркер live с комментарием «skipped by default»,
но механизма скипа не было → дефолтный прогон всегда падал на
test_claude_score_live (нет ANTHROPIC_API_KEY). Добавлен
addopts = -m "not live": дефолт зелёный (161 passed, 6 deselected),
явный -m live переопределяет и запускает live-тесты.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Inline `from runner.scoring import hypothesis_ids` в score() (DryRun и Claude)
ломал `python3 runner/orchestrator.py` (корень проекта не в sys.path →
ModuleNotFoundError: No module named 'runner'). Поднял импорт на верхний
уровень одним try/except-блоком (relative→absolute) по канону refresh.py,
убрал оба inline. Скриптовый и модульный запуск оба отрабатывают end-to-end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Socialpranker
Socialpranker merged commit 9f03880 into main Jun 15, 2026
2 checks passed
@Socialpranker
Socialpranker deleted the feat/phase7-refresh branch June 15, 2026 12:52
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