diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 01ddfe4..d062421 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -39,7 +39,7 @@ Need a stat sources file for an industry not covered (e.g., aerospace, mining, f ### 2-4 hours — Add a new report block -The block library has 103 blocks but specific use cases might need more. +The block library has 105 blocks but specific use cases might need more. **Example:** You want a `decision-tree` block in `compare.md`. diff --git a/QUICKSTART.md b/QUICKSTART.md index 2108419..1ff2597 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -47,6 +47,6 @@ can audit. ## Next steps - Full methodology: [`SKILL.md`](SKILL.md) — the 9-phase workflow. -- The catalog: [`references/`](references/) — 103 report +- The catalog: [`references/`](references/) — 105 report blocks, 6 genres. - Want to add sources or APIs? [`CONTRIBUTING.md`](CONTRIBUTING.md). diff --git a/README.md b/README.md index cc728ce..239daa4 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ The skill runs **9 phases** in order: | **3** | **Plan** | opus / medium | | **3.5** | **Capability Discovery** | sonnet / low | | **4** | **Search** | sonnet / medium | -| **5** | **Scoring + triangulation** | sonnet / medium | +| **5** | **Claims-ledger + triangulation** | haiku / low | | **6** | **Synthesis + multi-angle red team** | opus / high | | **6.5** | **Verify** | haiku / low | | **7** | **Refresh targets** | sonnet / medium | @@ -158,7 +158,7 @@ Every phase is **transparent**: you see what's happening, you confirm key decisi -### 103 Report Blocks +### 105 Report Blocks 10 categories: **FRAME** · **EXPLAIN** · **COMPARE** · **MAP** · **VALIDATE** · **ANALYZE** · **CLOSE** · **PEOPLE** · **NUMBERS** · **CONTEXT** @@ -391,7 +391,7 @@ It's **structured methodology + curated catalog + reusable templates + automatio - The 9-phase workflow forces discipline - 460+ stat sources catalog is curated knowledge -- 103 reusable blocks compose any report shape +- 105 reusable blocks compose any report shape - Weekly auto-validation keeps the catalog alive - 25+ upstream awesome-lists give infinite discovery layer @@ -417,7 +417,7 @@ The methodology is portable. ~70% of content is LLM-agnostic markdown templates. | `SKILL.md` frontmatter | ✓ | — | | Sub-agent `Explore` type | ✓ | — | | 9-phase workflow | — | ✓ | -| 103 report blocks | — | ✓ | +| 105 report blocks | — | ✓ | | 29 search channels | — | ✓ | | 460+ stat sources | — | ✓ | @@ -446,9 +446,9 @@ The methodology is portable. ~70% of content is LLM-agnostic markdown templates. ### Что внутри -- **9 фаз workflow**: Reframing → Genre & block selection → Plan → Capability Discovery → Поиск → Скоринг + триангуляция → Синтез + multi-angle red team → Verify → Refresh targets +- **9 фаз workflow**: Reframing → Genre & block selection → Plan → Capability Discovery → Поиск → Claims-ledger + триангуляция → Синтез + multi-angle red team → Verify → Refresh targets - **6 жанров отчёта**: qa / explainer / decision / landscape / validation / custom -- **103 блоков** в 10 категориях — переиспользуемые секции с шаблонами и анти-паттернами +- **105 блоков** в 10 категориях — переиспользуемые секции с шаблонами и анти-паттернами - **29 каналов поиска** с paywall fallback протоколом (включая api-direct) - **460+ статистических источников** в 14 cross-industry + 19 отраслевых категориях - **39+ API endpoints** для programmatic доступа (free no-auth приоритетны) diff --git a/SKILL.md b/SKILL.md index 8cd9748..c77fc12 100644 --- a/SKILL.md +++ b/SKILL.md @@ -112,8 +112,8 @@ Estimated ~$2 (vs ~$8 если бы всё на Opus). Скажи если ну 2. **Genre & block selection** [`sonnet`/medium] — определить жанр отчёта (qa/explainer/decision/landscape/validation/custom) и набор блоков. Подтвердить пользователю одной строкой. См. `references/genres.md` и `references/blocks/INDEX.md`. 3. **Plan** [`opus`/medium] — записать `plan.md` (5 секций: HEADER → SCOPE → STRUCTURE → EXECUTION → TRACKING). Включает: user context, time-box, acceptance criteria, discovered existing, glossary, жанр + blocks + rationale, гипотезы, risk register, subtopic↔blocks mapping, information sourcing strategy (каналы + stat-источники + API endpoints), opposition queries, stop-criteria, notes для tracking. См. `workflow.md` → Фаза 3 для полного шаблона. 3.5. **Capability Discovery** [`sonnet`/low] (опциональная для shallow, рекомендуется для medium, обязательна для deep) — audit env vars для API ключей, map подтемы → доступные APIs, fallback на upstream awesome-lists для unknown gaps, сводный отчёт пользователю. См. `references/capability_discovery.md`. -4. **Поиск** [main `sonnet`/medium; sub-agents per-task: `haiku` для web/api, `sonnet` для academic/long-source, `opus` для heavy reasoning subtask] — 4 шага: (4.0) **Source Dispatch** — прогнать каждый подвопрос через `source_dispatch.md` matrix, заполнить plan.md секцию 12 с per-subquestion primary/secondary/fallback каналами. (4.1) Launch — для medium/deep: суб-агенты `subagent_type=Explore` в параллель с `model:` параметром из `model_routing.md`, для shallow: главный поток сам. (4.2) Fetch & dedup. (4.3) Save в `sources/NN_slug.md`. Loop: после каждого раунда оркестратор может потратить bounded deviation — включая trajectory-чек промежуточных claims (не плодить поиск на неподтверждённом тезисе) и динамическую ревизию outline (ScaffoldAgent). См. `references/source_dispatch.md`, `references/subagents_v2.md`, `references/workflow.md` → Фаза 4. -5. **Скоринг + триангуляция** [scoring `haiku`/low; triangulation `sonnet`/medium] — каждый источник оценить по 3 осям (Credibility/Recency/Bias). Каждый тезис в выводах — ≥3 независимых источника разного типа. См. `references/source_scoring.md`. +4. **Поиск** [main `sonnet`/medium; sub-agents per-task: `haiku` для web/api, `sonnet` для academic/long-source, `opus` для heavy reasoning subtask] — 4 шага: (4.0) **Source Dispatch** — прогнать каждый подвопрос через `source_dispatch.md` matrix, заполнить plan.md секцию 12. (4.1) Launch — для medium/deep: суб-агенты `subagent_type=general-purpose` (нужен Write) в параллель, каждому свой диапазон номеров источников (`s01-s09`, `s10-s19`, ...); для shallow — главный поток сам. (4.2) Fetch & dedup. (4.3) Save в `sources/NN_slug.md` — пишет сам агент, в главный поток возвращаются только index-строки. Loop: bounded deviation между раундами (trajectory-чек claims, ревизия outline). См. `references/source_dispatch.md`, `references/subagents_v2.md`, `references/workflow.md` → Фаза 4. +5. **Claims-ledger + триангуляция** [`haiku`/low] — из index-строк собирается `claims.csv` (claim_id, sources, status, confidence, primary_source). Механическая триангуляция: ≥3 источника И ≥2 типа → `triangulated`; primary-first — confidence не выше `medium` без primary-источника. Loop: gap-волна на строки не-triangulated, максимум 2 круга, иначе `data-insufficient`. См. `references/source_scoring.md` и `references/workflow.md` → Фаза 5. 6. **Синтез + multi-angle red team** [red-team суб-агенты `opus`/high **обязательно** для deep, `sonnet`/high для medium; synthesis `sonnet`/high] — собрать `_.md` из блоков, затем: draft → claim ledger → N параллельных враждебных ролей (Skeptic / Contrarian / Gap-hunter) как `general-purpose` суб-агенты → триаж по severity → ОДИН раунд ремедиации HIGH (точечный до-поиск или caveat) → финал. Finder ≠ fixer. Гейт: shallow=R1 инлайн, medium=R1+R2, deep=R1+R2+R3 обязательно. См. `references/adversarial_pass.md` и `references/blocks/`. 6.5. **Verify** [`haiku`/low] (medium/deep — обязательно) — runtime-проверка цитат по двум осям: (1) **liveness** — ссылка жива (`check_citations.py`); (2) **faithfulness** — источник реально подтверждает тезис (entailment claim ⊨ цитата из `sources/NN.md`). Битые/неподтверждающие источники чинятся (re-search), смягчаются (overclaim → слабее) или тезис уходит в Open Questions. Отчёт получает verification-header и не «готов» без него. Per-source verification — defensible-фича против закрытых DR-продуктов. См. `references/runtime_verification.md`. 7. **Refresh targets** [`sonnet`/medium] (medium/deep — обязательно) — извлечь entities/numbers/hypotheses/topic-markers из финального отчёта в `refresh_targets.md`. Это точка входа для будущих `update ` — без неё каждый update тратит время на re-discovery «что отслеживать». См. блок Z11 в `references/blocks/close.md` и `references/refresh_protocol.md`. @@ -145,6 +145,7 @@ Estimated ~$2 (vs ~$8 если бы всё на Opus). Скажи если ну / ├── plan.md # Фаза 3 — план + changelog (секция 16) + notes (секция 15) ├── sources.csv # индекс всех источников с оценками +├── claims.csv # Фаза 5 — claim-ledger (claim/sources/status/confidence) ├── sources/ # один файл = один источник (с метаданными + цитаты) │ ├── 01_.md │ ├── 02_.md @@ -171,6 +172,7 @@ Estimated ~$2 (vs ~$8 если бы всё на Opus). Скажи если ну **Шаблоны:** - `sources/NN.md` — см. `references/source_scoring.md` +- `claims.csv` — claim-ledger, см. `references/source_scoring.md` (раздел «Claims-ledger») - `_.md` — собирается из блоков, см. `references/genres.md` (пресеты) и `references/blocks/` (шаблоны блоков) - `findings/FN.md` — атомарный тезис, см. `references/blocks/close.md` (блок Z6) @@ -197,7 +199,8 @@ Estimated ~$2 (vs ~$8 если бы всё на Opus). Скажи если ну - Не обходить ограничения WebFetch через bash/curl. - Не использовать источники с total < 8 как основу для выводов. - Не пропускать multi-angle red team в medium/deep. -- Не использовать `subagent_type=general-purpose` если хватает `Explore` (Explore быстрее и read-only). Исключение — Фаза 6 red team: роли судят, а не ищут → `general-purpose`. +- Для fetch+save (Фаза 4.1) и red team (Фаза 6) — `general-purpose` с явным диапазоном номеров, не `Explore` (read-only, только для разведки). +- Не пропускать gap-волну (нетриангулированные строки `claims.csv`, max 2 круга) и не давать confidence выше `medium` без primary-источника. - Не оставлять «висящие» утверждения без ссылки на конкретный `sources/NN.md`. - Не запускать суб-агентов последовательно — только параллельно в одном сообщении. - Не сжимать sources/ в один файл — теряется поиск и переиспользование между ресёрчами. @@ -219,7 +222,7 @@ URL-friendly: латиница, цифры, дефисы. Пример: - `references/workflow.md` — детали 9 фаз (включая опц. 3.5) (читать в начале medium/deep). - `references/question_reframing.md` — шаблоны Фазы 1. - `references/genres.md` — пресеты блоков 6 жанров + эвристика выбора (Фаза 2) + каналы по жанрам. -- `references/blocks/INDEX.md` — индекс 103 блоков по 10 категориям (после выбора жанра). +- `references/blocks/INDEX.md` — индекс 105 блоков по 10 категориям (после выбора жанра). - `references/channels.md` — 29 каналов поиска (включая api-direct) с query patterns, paywall fallbacks (Фаза 3-4). - `references/stat_sources/INDEX.md` — навигационная карта 33 категорий статистических источников (Фаза 3-4). - `references/api_sources/INDEX.md` — каталог 39+ API endpoints (10 категорий) для programmatic доступа (Фаза 3-4). @@ -230,19 +233,19 @@ URL-friendly: латиница, цифры, дефисы. Пример: - `references/refresh_protocol.md` — **протокол update**: 4 категории дельты (new entrants, entity diff, numbers refresh, adversarial trigger), шаблон `diffs/_delta.md`. Используется в режиме `update `. Дополняется блоком Z11 `refresh-targets` из `blocks/close.md`. **Категорийные файлы (только нужные для выбранного жанра/blocks):** -- `references/blocks/frame.md` — F1-F8: TL;DR, scope, claim, metadata. +- `references/blocks/frame.md` — F1-F10: TL;DR, scope, background, claim, metadata, verification header. - `references/blocks/explain.md` — E1-E14: mental-model, glossary, mechanism. - `references/blocks/compare.md` — C1-C13: matrices, scoring, trade-offs. - `references/blocks/map.md` — M1-M12: profiles, positioning, trends. - `references/blocks/validate.md` — V1-V10: falsification, evidence grades. - `references/blocks/analyze.md` — A1-A13: data tables, SWOT, root cause. -- `references/blocks/close.md` — Z1-Z10: counter-args, open Q, next research. +- `references/blocks/close.md` — Z1-Z12: counter-args, open Q, next research, so-what-for-you. - `references/blocks/people.md` — P1-P7: persona, journey, incentives. - `references/blocks/numbers.md` — N1-N8: metrics, market sizing, forecasts. - `references/blocks/context.md` — X1-X7: regulatory, geo, culture. **По фазам:** -- `references/source_scoring.md` — оценка источников + шаблон `sources/NN.md` с `channel:` и `access:` (Фаза 5). +- `references/source_scoring.md` — оценка источников + шаблон `sources/NN.md` с `channel:` и `access:`; claims-ledger (`claims.csv`) и правило primary-first (Фаза 5). - `references/subagents_v2.md` — паттерн суб-агентов с CHANNELS TO USE (Фаза 4, medium/deep). - `references/adversarial_pass.md` — multi-angle red team: роли, триаж severity, ограниченный цикл ремедиации (Фаза 6, medium/deep). - `references/runtime_verification.md` — runtime-проверка цитат: резолв тезисов к sources/NN.md, verification-header (Фаза 6.5, medium/deep). diff --git a/docs/_config.yml b/docs/_config.yml index 919cbdf..a764e25 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -3,7 +3,7 @@ # or by GitHub Pages for the docs/ folder. title: Deep Research -description: A structured 9-phase meta-research skill for Claude Code. 29 channels, 460+ stat sources, 103 report blocks. +description: A structured 9-phase meta-research skill for Claude Code. 29 channels, 460+ stat sources, 105 report blocks. url: https://socialpranker.github.io baseurl: /claude-deep-research diff --git a/docs/index.html b/docs/index.html index 1f2254b..d87b7f0 100644 --- a/docs/index.html +++ b/docs/index.html @@ -9,7 +9,7 @@ - + @@ -1027,7 +1027,7 @@

Search channels
-
103
+
105
Report blocks
@@ -1159,14 +1159,14 @@

Refresh

A curated catalog.
Auto-validated weekly.

- 460+ statistical sources, 39+ API endpoints, 29 named channels, 103 report blocks. + 460+ statistical sources, 39+ API endpoints, 29 named channels, 105 report blocks. Weekly cron in GitHub Actions validates endpoints and discovers upstream additions.

/blocks -
103 / 10 categories
+
105 / 10 categories

Report Blocks

Reusable sections with templates, anti-patterns, and composition rules. Each block has a fixed shape — you compose a report by naming the blocks it contains.

@@ -1333,7 +1333,7 @@

Frequently asked.

Is this just prompt engineering?
- It's structured methodology plus a curated catalog plus reusable templates plus automation. The 9-phase workflow forces discipline. 460+ stat sources is curated knowledge. 103 reusable blocks compose any report shape. Weekly auto-validation keeps the catalog alive. 25+ upstream awesome-lists give a discovery layer. Prompts are an implementation detail, not the value. + It's structured methodology plus a curated catalog plus reusable templates plus automation. The 9-phase workflow forces discipline. 460+ stat sources is curated knowledge. 105 reusable blocks compose any report shape. Weekly auto-validation keeps the catalog alive. 25+ upstream awesome-lists give a discovery layer. Prompts are an implementation detail, not the value.
@@ -1377,7 +1377,7 @@

const translations = { en: { 'meta.title': 'Deep Research — Claude Code Skill for Documented Investigation', - 'meta.description': 'A 9-phase meta-research skill for Claude Code. Stop ad-hoc Googling, start documented investigation. 460+ stat sources, 39+ APIs, 103 report blocks, weekly auto-validation.', + 'meta.description': 'A 9-phase meta-research skill for Claude Code. Stop ad-hoc Googling, start documented investigation. 460+ stat sources, 39+ APIs, 105 report blocks, weekly auto-validation.', 'nav.how': 'how it works', 'nav.catalog': 'catalog', @@ -1452,8 +1452,8 @@

'inside.tag': '§ 03 · catalog', 'inside.title': 'A curated catalog.
Auto-validated weekly.', - 'inside.intro': '460+ statistical sources, 39+ API endpoints, 29 named channels, 103 report blocks. Weekly cron in GitHub Actions validates endpoints and discovers upstream additions.', - 'inside.f1.num': '103 / 10 categories', + 'inside.intro': '460+ statistical sources, 39+ API endpoints, 29 named channels, 105 report blocks. Weekly cron in GitHub Actions validates endpoints and discovers upstream additions.', + 'inside.f1.num': '105 / 10 categories', 'inside.f1.title': 'Report Blocks', 'inside.f1.desc': 'Reusable sections with templates, anti-patterns, and composition rules. Each block has a fixed shape — you compose a report by naming the blocks it contains.', 'inside.f1.more': '+71 more', @@ -1506,7 +1506,7 @@

'faq.q4': "What if I don't have CLAUDE.md or a project context?", 'faq.a4': 'The skill detects context in 3 tiers: explicit (CLAUDE.md research_root setting) → autodetect (pyproject.toml, package.json) → fallback (~/deep-research/). No project, no problem.', 'faq.q5': 'Is this just prompt engineering?', - 'faq.a5': "It's structured methodology plus a curated catalog plus reusable templates plus automation. The 9-phase workflow forces discipline. 460+ stat sources is curated knowledge. 103 reusable blocks compose any report shape. Weekly auto-validation keeps the catalog alive. 25+ upstream awesome-lists give a discovery layer. Prompts are an implementation detail, not the value.", + 'faq.a5': "It's structured methodology plus a curated catalog plus reusable templates plus automation. The 9-phase workflow forces discipline. 460+ stat sources is curated knowledge. 105 reusable blocks compose any report shape. Weekly auto-validation keeps the catalog alive. 25+ upstream awesome-lists give a discovery layer. Prompts are an implementation detail, not the value.", 'faq.q6': 'Can I use this commercially?', 'faq.a6': 'Yes — MIT licensed. Use it, modify it, integrate it into products. Attribution appreciated but not required.', @@ -1522,7 +1522,7 @@

}, ru: { 'meta.title': 'Deep Research — навык Claude Code для задокументированного исследования', - 'meta.description': 'Навык meta-research для Claude Code из 9 фаз. Не ад-хок поиск в Google, а исследование с источниками. 460+ статистических источников, 39+ API, 103 блоков отчёта, авто-валидация раз в неделю.', + 'meta.description': 'Навык meta-research для Claude Code из 9 фаз. Не ад-хок поиск в Google, а исследование с источниками. 460+ статистических источников, 39+ API, 105 блоков отчёта, авто-валидация раз в неделю.', 'nav.how': 'как работает', 'nav.catalog': 'каталог', @@ -1597,8 +1597,8 @@

'inside.tag': '§ 03 · каталог', 'inside.title': 'Кураторский каталог.
Авто-валидация раз в неделю.', - 'inside.intro': '460+ статистических источников, 39+ API endpoints, 29 именованных каналов, 103 блоков отчёта. Еженедельный cron в GitHub Actions проверяет endpoints и подхватывает новые из awesome-листов.', - 'inside.f1.num': '103 / 10 категорий', + 'inside.intro': '460+ статистических источников, 39+ API endpoints, 29 именованных каналов, 105 блоков отчёта. Еженедельный cron в GitHub Actions проверяет endpoints и подхватывает новые из awesome-листов.', + 'inside.f1.num': '105 / 10 категорий', 'inside.f1.title': 'Блоки отчёта', 'inside.f1.desc': 'Переиспользуемые секции с шаблонами, анти-паттернами и правилами композиции. У каждого блока — фиксированная форма; отчёт собирается перечислением блоков.', 'inside.f1.more': '+71 ещё', @@ -1651,7 +1651,7 @@

'faq.q4': 'А если нет CLAUDE.md или контекста проекта?', 'faq.a4': 'Скилл определяет контекст по 3 уровням: явный (CLAUDE.md с research_root) → автодетект (pyproject.toml, package.json) → fallback (~/deep-research/). Нет проекта — не проблема.', 'faq.q5': 'Это просто prompt engineering?', - 'faq.a5': 'Это структурированная методология плюс кураторский каталог плюс переиспользуемые шаблоны плюс автоматизация. Workflow из 9 фаз дисциплинирует. 460+ стат-источников — это куратный домен. 103 блоков складываются в любую форму отчёта. Авто-валидация раз в неделю держит каталог живым. 25+ awesome-листов дают слой discovery. Промпты — это implementation detail, не ценность.', + 'faq.a5': 'Это структурированная методология плюс кураторский каталог плюс переиспользуемые шаблоны плюс автоматизация. Workflow из 9 фаз дисциплинирует. 460+ стат-источников — это куратный домен. 105 блоков складываются в любую форму отчёта. Авто-валидация раз в неделю держит каталог живым. 25+ awesome-листов дают слой discovery. Промпты — это implementation detail, не ценность.', 'faq.q6': 'Можно использовать коммерчески?', 'faq.a6': 'Да — лицензия MIT. Используй, модифицируй, встраивай в продукты. Атрибуция приветствуется, но не обязательна.', diff --git a/phases.yaml b/phases.yaml index b2ee15e..2dfe73a 100644 --- a/phases.yaml +++ b/phases.yaml @@ -43,12 +43,17 @@ phases: effort: medium depth_gate: shallow loop: "true" + # Phase 5 includes a gap-wave LOOP after the first claims.csv pass: rows + # with status != triangulated get one targeted haiku/low sub-agent each, + # max 2 rounds, else marked data-insufficient. Same convention as Phase 4 — + # no new phase id for the loop, see references/workflow.md "Фаза 5". - id: "5" - name_ru: "Скоринг + триангуляция" - name_en: "Scoring + triangulation" - model: sonnet - effort: medium + name_ru: "Claims-ledger + триангуляция" + name_en: "Claims-ledger + triangulation" + model: haiku + effort: low depth_gate: shallow + loop: "true" - id: "6" name_ru: "Синтез + multi-angle red team" name_en: "Synthesis + multi-angle red team" diff --git a/references/adversarial_pass.md b/references/adversarial_pass.md index 364d520..15c14be 100644 --- a/references/adversarial_pass.md +++ b/references/adversarial_pass.md @@ -10,7 +10,8 @@ Все роли — одна семья моделей, общие слепые зоны остаются. - ЛОВИТ: overclaim (источник не доказывает тезис), тезисы с <3 независимыми источниками, дыры покрытия, проигнорированную контр-гипотезу, selection bias, - подгонку под пользователя. + подгонку под пользователя, числа без якоря сравнения, выводы без проекции на + кейс пользователя (Z12), рекомендации без trade-off/kill-criteria. - НЕ ЛОВИТ: общие фактические галлюцинации (коррелированы). Их держит триангуляция (Фаза 5) и опц. кросс-вендорная 6.5. → red team ДОПОЛНЯЕТ триангуляцию, не заменяет. @@ -51,7 +52,10 @@ R2 — Адвокат противоположной гипотезы: R3 — Охотник за пропусками + анти-сикофантия: «Что отсутствует, но релевантно решению? Проверь: (а) подгонку под ожидания пользователя; (б) selection bias (все источники одного типа/лагеря); - (в) непокрытые стейкхолдеры/сценарии/издержки/риски.» + (в) непокрытые стейкхолдеры/сценарии/издержки/риски; (г) есть ли числа без + якоря сравнения (голое "$4.5B" без базы), выводы без проекции на кейс + пользователя (блок Z12 so-what-for-you пустой или формальный), рекомендации + без trade-off/kill-criteria.» ## 3. Триаж severity (структурные вердикты, НЕ скоры 1–5) @@ -64,6 +68,7 @@ R3 — Охотник за пропусками + анти-сикофантия: ## 4. Привязка к остальному скиллу - stop-criteria: опозиционные запросы R2 = выполнение «≥1 целевой поиск оппозиции». -- blocks/close.md: дефекты → counter-arguments + Open Questions (HIGH без закрытия → Open Questions «данных мало»). +- blocks/close.md: дефекты → counter-arguments + Open Questions (HIGH без закрытия → Open Questions «данных мало»); числа-без-якоря/пустой-Z12/рекомендации-без-trade-off от R3(г) → правки блоков F9/Z12 или соответствующих N/A-блоков синтеза, не отдельная секция. - plan.md risk register: неустранённые HIGH. - refresh_targets.md: контр-гипотезы R2 → hypotheses-to-track. +- claims.csv: HIGH-дефекты про overclaim/<3 источника пересекаются с status ≠ triangulated — red team может подсветить строку, которую gap-волна (Фаза 5) не закрыла. diff --git a/references/blocks/INDEX.md b/references/blocks/INDEX.md index c2cb0ba..9c9dd19 100644 --- a/references/blocks/INDEX.md +++ b/references/blocks/INDEX.md @@ -1,6 +1,6 @@ # Block Library — INDEX -103 блоков в 10 категориях. Композируемые секции для финального отчёта. +105 блоков в 10 категориях. Композируемые секции для финального отчёта. ## Как использовать @@ -13,18 +13,18 @@ | Cat | Файл | Блоки | Назначение | |---|---|---|---| -| FRAME | [frame.md](frame.md) | F1-F8 | Рамка отчёта: TL;DR, scope, claim, metadata | +| FRAME | [frame.md](frame.md) | F1-F10 | Рамка отчёта: TL;DR, scope, background, claim, metadata | | EXPLAIN | [explain.md](explain.md) | E1-E14 | Объяснение устройства: mental model, glossary, mechanism | | COMPARE | [compare.md](compare.md) | C1-C13 | Сравнение и выбор: matrices, scoring, trade-offs | | MAP | [map.md](map.md) | M1-M12 | Картография: profiles, positioning, trends | | VALIDATE | [validate.md](validate.md) | V1-V10 | Проверка истинности: falsification, evidence grades | | ANALYZE | [analyze.md](analyze.md) | A1-A13 | Структурированный анализ: SWOT, timeline, root cause | -| CLOSE | [close.md](close.md) | Z1-Z11 | Закрытие: counter-args, open Q, next research | +| CLOSE | [close.md](close.md) | Z1-Z12 | Закрытие: counter-args, open Q, next research | | PEOPLE | [people.md](people.md) | P1-P7 | Люди, команды, поведение: persona, journey, incentives | | NUMBERS | [numbers.md](numbers.md) | N1-N8 | Количественные: метрики, market sizing, forecasts | | CONTEXT | [context.md](context.md) | X1-X7 | Внешний контекст: регуляторика, гео, культура | -## Полная таблица всех 103 блоков +## Полная таблица всех 105 блоков ### FRAME @@ -38,6 +38,8 @@ | F6 | `key-finding-callout` | Главный single insight выделенный | Длинные отчёты | | F7 | `executive-summary` | 1-страничный TL;DR для стейкхолдеров | Decision/landscape для не-технических | | F8 | `glossary-link` | Ссылка на внешний/общий глоссарий | Если есть проектный glossary | +| F9 | `background` | Почему вопрос стоит так — предыстория, причины, 5-10 строк | Medium/deep, все жанры (дефолт) | +| F10 | `verification-header` | Citation integrity (liveness + faithfulness) | Medium/deep, после Фазы 6.5 verify | ### EXPLAIN @@ -141,6 +143,7 @@ | Z9 | `glossary-final` | Финальный глоссарий из отчёта | Длинные с обильной терминологией | | Z10 | `update-triggers` | Что должно произойти для update | Все ресёрчи (life cycle) | | Z11 | `refresh-targets` (отдельный файл) | Что конкретно проверять при update — entities, numbers, hypotheses | Medium/deep — обязательно | +| Z12 | `so-what-for-you` | Проекция выводов на кейс пользователя: действие + trade-off + kill-criteria | Medium/deep — обязательно | ### PEOPLE @@ -181,7 +184,7 @@ ## Progressive loading discipline -При 103 блоках критично не загружать всё в контекст. +При 105 блоках критично не загружать всё в контекст. ``` Главный поток: diff --git a/references/blocks/close.md b/references/blocks/close.md index bd0bb46..df1a4f8 100644 --- a/references/blocks/close.md +++ b/references/blocks/close.md @@ -515,3 +515,39 @@ If specific sources are critical to the report's conclusions, they get extra re- - ❌ Перечислять «все возможные источники» — это refresh_targets, а не bibliographic database. Только critical-path - ❌ Без update_cadence — пользователь не поймёт когда возвращаться - ❌ Без сохранённых hash/snapshot для entity pages — fingerprinting не работает + +--- + +## Z12 — `so-what-for-you` + +**Когда:** Medium/deep, обязательно. Проекция ключевых выводов отчёта на конкретный кейс пользователя — а не абстрактное «вот что мы узнали про мир». + +**Вход:** `plan.md` секция 0 (User context — кто спрашивает, зачем, как будет использовать отчёт) + `claims.csv` (ключевые тезисы с их confidence). + +**Что внутри:** Для каждого ключевого вывода — что это значит именно для ситуации пользователя, конкретное действие, trade-off этого действия, и kill-criteria (что должно произойти, чтобы рекомендация перестала быть верной). + +**Антипаттерн:** Повторение TL;DR другими словами. Z12 должен добавлять то, чего нет в TL;DR — персонализацию под конкретный кейс из `plan.md` секции 0, а не пересказ фактов. + +**Композиция:** После `map-of-sources` [Z5] / `confidence-summary` [Z7], **перед** `actionable-next-steps` [Z4] — сначала «что это значит для тебя», потом «что конкретно делать». + +**Шаблон:** + +```markdown +## So what for you + +Контекст использования (из plan.md §0): <кто спрашивает, зачем, как использует> + +### Вывод 1: <ключевой тезис из claims.csv, confidence: high/medium/low> +**Что это значит для твоей ситуации:** <конкретная проекция, не абстракция> +**Рекомендуемое действие:** <что делать с учётом этого> +**Trade-off:** <что теряешь, выбирая это действие> +**Kill-criteria:** <что должно произойти, чтобы эта рекомендация перестала быть верной> + +### Вывод 2: <тезис, confidence> +**Что это значит:** ... +**Действие:** ... +**Trade-off:** ... +**Kill-criteria:** ... + +### Вывод 3: ... +``` diff --git a/references/blocks/frame.md b/references/blocks/frame.md index fc5a012..78ede07 100644 --- a/references/blocks/frame.md +++ b/references/blocks/frame.md @@ -205,3 +205,28 @@ - **<Термин 1>** — <определение> - **<Термин 2>** — <определение> ``` + +--- + +## F9 — `background` + +**Когда:** Дефолт для medium/deep во всех жанрах. Отвечает на «почему вопрос вообще стоит так, как стоит» — до того как начинаем разбирать содержание. + +**Что внутри:** Предыстория и причины — что было до этого вопроса, откуда он взялся, какие события/решения привели к тому, что он актуален сейчас. 5-10 строк, не больше — это контекст, не отдельный ресёрч в ресёрче. + +**Антипаттерн:** Пересказ Википедии о теме целиком. Background должен объяснять именно ПОЧЕМУ вопрос стоит так, не давать общую историю предмета. + +**Композиция:** После `scope` [F3] (если scope есть) или сразу после `tldr` [F1]. До основного содержимого отчёта. + +**Шаблон:** + +```markdown +## Background + +<5-10 строк: что предшествовало этому вопросу — событие, тренд, решение, изменение +условий — из-за которого вопрос стал релевантным именно сейчас. Явно называй +источники предпосылки, если они есть: [s03].> + +**Почему это важно для ответа:** <короткая связка — как эта предыстория влияет на +то, как нужно читать остальной отчёт> +``` diff --git a/references/genres.md b/references/genres.md index 6e624ef..c996703 100644 --- a/references/genres.md +++ b/references/genres.md @@ -56,25 +56,28 @@ **Когда:** Серия связанных вопросов, meta-research, тема без явного жанра. -**Required blocks:** `tldr`, `qa-list`, `map-of-sources`, `metadata` +**Required blocks:** `tldr`, `qa-list`, `map-of-sources`, `metadata`. Для medium/deep — обязательно ещё: `background` [F9], `so-what-for-you` [Z12], `actionable-next-steps` [Z4], `confidence-summary` [Z7]. **Recommended order:** ``` 1. tldr [F1] -2. decision-context [F2] (если есть decision) -3. qa-list [A3] ← главная секция -4. hypotheses-outcome [A4] (если в plan были hypotheses) -5. counter-arguments [Z1] (medium/deep) -6. open-questions [Z2] -7. next-research [Z3] -8. map-of-sources [Z5] -9. findings-index [Z6] (если есть) -10. metadata [F5] +2. background [F9] +3. decision-context [F2] (если есть decision) +4. qa-list [A3] ← главная секция +5. hypotheses-outcome [A4] (если в plan были hypotheses) +6. counter-arguments [Z1] (medium/deep) +7. open-questions [Z2] +8. next-research [Z3] +9. confidence-summary [Z7] +10. so-what-for-you [Z12] (перед Z4) +11. actionable-next-steps [Z4] +12. map-of-sources [Z5] +13. findings-index [Z6] (если есть) +14. metadata [F5] ``` **Опциональные additions:** - `key-finding-callout` [F6] если есть один доминирующий insight -- `confidence-summary` [Z7] для длинных отчётов --- @@ -82,26 +85,30 @@ **Когда:** Понять устройство темы, mental model, не decision. -**Required blocks:** `tldr`, `mental-model`, `stepwise`, `map-of-sources`, `metadata` +**Required blocks:** `tldr`, `mental-model`, `stepwise`, `map-of-sources`, `metadata`. Для medium/deep — обязательно ещё: `background` [F9], `so-what-for-you` [Z12], `actionable-next-steps` [Z4], `confidence-summary` [Z7]. **Recommended order:** ``` 1. tldr [F1] -2. prerequisites [E8] (если нужно background) -3. glossary-mini [E2] ← термины перед схемой -4. mental-model [E1] ← схема устройства -5. stepwise [E4] ← как работает -6. variants [E5] (если есть варианты реализации) -7. worked-example [E6] (для education-style) -8. common-confusions [E7] -9. failure-modes [E10] (для технических тем) -10. edge-cases [E11] (опционально) -11. design-rationale [E12] (для architecture explainer) -12. counter-arguments [Z1] -13. open-questions [Z2] -14. next-research [Z3] -15. map-of-sources [Z5] -16. metadata [F5] +2. background [F9] +3. prerequisites [E8] (если нужно читателю) +4. glossary-mini [E2] ← термины перед схемой +5. mental-model [E1] ← схема устройства +6. stepwise [E4] ← как работает +7. variants [E5] (если есть варианты реализации) +8. worked-example [E6] (для education-style) +9. common-confusions [E7] +10. failure-modes [E10] (для технических тем) +11. edge-cases [E11] (опционально) +12. design-rationale [E12] (для architecture explainer) +13. counter-arguments [Z1] +14. open-questions [Z2] +15. next-research [Z3] +16. confidence-summary [Z7] +17. so-what-for-you [Z12] (перед Z4) +18. actionable-next-steps [Z4] +19. map-of-sources [Z5] +20. metadata [F5] ``` **Подмножество для глубокого technical:** @@ -118,34 +125,37 @@ **Когда:** Сравнение опций для принятия решения. С явной рекомендацией. -**Required blocks:** `tldr`, `decision-context`, `options-matrix`, `recommendation-conditional`, `map-of-sources`, `metadata` +**Required blocks:** `tldr`, `decision-context`, `options-matrix`, `recommendation-conditional`, `map-of-sources`, `metadata`. Для medium/deep — обязательно ещё: `background` [F9], `so-what-for-you` [Z12], `confidence-summary` [Z7]. **Recommended order:** ``` 1. tldr [F1] -2. executive-summary [F7] (опционально, для стейкхолдеров) -3. decision-context [F2] ← рамка решения -4. options-matrix [C1] -5. weighted-score [C2] (если критерии неравнозначны) -6. feature-matrix [C10] (для product decisions) -7. pros-cons-each [C9] (alternative to matrix для quick) -8. best-fit-when [C3] -9. trade-offs [C5] -10. reversibility-stakes [C4] -11. cost-benefit [C8] (для финансовых) -12. risk-register [A6] (для рискованных) -13. pre-mortem [C7] (high-stakes) -14. migration-path [C11] (если обратимо) -15. decision-tree [C12] (для сложных мультиусловных) -16. kill-criteria [C13] -17. counter-arguments [Z1] -18. recommendation-conditional [C6] ← финальная рекомендация -19. actionable-next-steps [Z4] -20. assumptions-log [Z8] -21. open-questions [Z2] -22. next-research [Z3] -23. map-of-sources [Z5] -24. metadata [F5] +2. background [F9] +3. executive-summary [F7] (опционально, для стейкхолдеров) +4. decision-context [F2] ← рамка решения +5. options-matrix [C1] +6. weighted-score [C2] (если критерии неравнозначны) +7. feature-matrix [C10] (для product decisions) +8. pros-cons-each [C9] (alternative to matrix для quick) +9. best-fit-when [C3] +10. trade-offs [C5] +11. reversibility-stakes [C4] +12. cost-benefit [C8] (для финансовых) +13. risk-register [A6] (для рискованных) +14. pre-mortem [C7] (high-stakes) +15. migration-path [C11] (если обратимо) +16. decision-tree [C12] (для сложных мультиусловных) +17. kill-criteria [C13] +18. counter-arguments [Z1] +19. recommendation-conditional [C6] ← финальная рекомендация +20. confidence-summary [Z7] +21. so-what-for-you [Z12] (перед Z4) +22. actionable-next-steps [Z4] +23. assumptions-log [Z8] +24. open-questions [Z2] +25. next-research [Z3] +26. map-of-sources [Z5] +27. metadata [F5] ``` **Подмножества:** @@ -158,30 +168,34 @@ **Когда:** Игроки/решения в области, без приоритета выбора. -**Required blocks:** `tldr`, `scope`, `categories`, `profile-card`, `map-of-sources`, `metadata` +**Required blocks:** `tldr`, `scope`, `categories`, `profile-card`, `map-of-sources`, `metadata`. Для medium/deep — обязательно ещё: `background` [F9], `so-what-for-you` [Z12], `actionable-next-steps` [Z4], `confidence-summary` [Z7]. **Recommended order:** ``` 1. tldr [F1] -2. scope [F3] ← границы карты -3. categories [M1] ← деление области -4. profile-card × N [M2] ← карточки игроков по категориям -5. key-people [P3] (для глубоких landscape) -6. positioning-map [M3] -7. value-chain [M8] (industry analysis) -8. network-graph [M9] (relationships) -9. funding-tree [M10] (startup ecosystem) -10. geographic-distribution [M11] (geo-distributed) -11. lifecycle-stage [M12] -12. trends [M4] -13. white-spaces [M5] (для product strategy) -14. ecosystem [X7] (broader context) -15. counter-arguments [Z1] -16. open-questions [Z2] -17. next-research [Z3] -18. update-triggers [Z10] ← landscape устаревает быстро -19. map-of-sources [Z5] -20. metadata [F5] +2. background [F9] +3. scope [F3] ← границы карты +4. categories [M1] ← деление области +5. profile-card × N [M2] ← карточки игроков по категориям +6. key-people [P3] (для глубоких landscape) +7. positioning-map [M3] +8. value-chain [M8] (industry analysis) +9. network-graph [M9] (relationships) +10. funding-tree [M10] (startup ecosystem) +11. geographic-distribution [M11] (geo-distributed) +12. lifecycle-stage [M12] +13. trends [M4] +14. white-spaces [M5] (для product strategy) +15. ecosystem [X7] (broader context) +16. counter-arguments [Z1] +17. open-questions [Z2] +18. next-research [Z3] +19. update-triggers [Z10] ← landscape устаревает быстро +20. confidence-summary [Z7] +21. so-what-for-you [Z12] (перед Z4) +22. actionable-next-steps [Z4] +23. map-of-sources [Z5] +24. metadata [F5] ``` **Подмножества:** @@ -194,32 +208,35 @@ **Когда:** Проверка claim. С verdict. -**Required blocks:** `tldr`, `claim-precise`, `falsification-criteria`, `evidence-graded`, `verdict-conditional`, `map-of-sources`, `metadata` +**Required blocks:** `tldr`, `claim-precise`, `falsification-criteria`, `evidence-graded`, `verdict-conditional`, `map-of-sources`, `metadata`. Для medium/deep — обязательно ещё: `background` [F9], `so-what-for-you` [Z12], `confidence-summary` [Z7]. **Recommended order:** ``` 1. tldr [F1] -2. claim-precise [F4] ← точная формулировка -3. scope [F3] ← где применимо -4. base-rates [V4] (для probabilistic claims) -5. falsification-criteria [V1] ← ДО evidence -6. evidence-graded [V2] ← FOR/AGAINST -7. conflicting-evidence [V3] (если есть) -8. replication-status [V7] (для научных claims) -9. sample-size-analysis [V8] (для quantitative) -10. methodology-critique [V9] (deep) -11. expert-opinion [P7] (если expert-driven) -12. bayesian-update [V10] (для probabilistic) -13. verdict-conditional [V5] ← главный verdict -14. what-would-change-verdict [V6] -15. common-confusions [E7] (часто claim путают с X) -16. counter-arguments [Z1] -17. actionable-next-steps [Z4] (что делать с этим verdict) -18. assumptions-log [Z8] -19. open-questions [Z2] -20. next-research [Z3] -21. map-of-sources [Z5] -22. metadata [F5] +2. background [F9] +3. claim-precise [F4] ← точная формулировка +4. scope [F3] ← где применимо +5. base-rates [V4] (для probabilistic claims) +6. falsification-criteria [V1] ← ДО evidence +7. evidence-graded [V2] ← FOR/AGAINST +8. conflicting-evidence [V3] (если есть) +9. replication-status [V7] (для научных claims) +10. sample-size-analysis [V8] (для quantitative) +11. methodology-critique [V9] (deep) +12. expert-opinion [P7] (если expert-driven) +13. bayesian-update [V10] (для probabilistic) +14. verdict-conditional [V5] ← главный verdict +15. what-would-change-verdict [V6] +16. common-confusions [E7] (часто claim путают с X) +17. counter-arguments [Z1] +18. confidence-summary [Z7] +19. so-what-for-you [Z12] (перед Z4) +20. actionable-next-steps [Z4] (что делать с этим verdict) +21. assumptions-log [Z8] +22. open-questions [Z2] +23. next-research [Z3] +24. map-of-sources [Z5] +25. metadata [F5] ``` **Подмножества:** @@ -232,7 +249,7 @@ **Когда:** Вопрос не подходит ни под один стандартный жанр. Гибридные вопросы. Специфические аналитические задачи. -**Required (всегда):** `tldr`, `map-of-sources`, `metadata` +**Required (всегда):** `tldr`, `map-of-sources`, `metadata`. Для medium/deep — обязательно ещё: `background` [F9], `so-what-for-you` [Z12], `actionable-next-steps` [Z4], `confidence-summary` [Z7]. **Эвристика подбора блоков:** @@ -266,13 +283,17 @@ **Базовая обвязка для custom:** ``` 1. tldr [F1] -2. scope [F3] (если границы важны) -3. <выбранные блоки по эвристике> -4. counter-arguments [Z1] -5. open-questions [Z2] -6. next-research [Z3] -7. map-of-sources [Z5] -8. metadata [F5] +2. background [F9] +3. scope [F3] (если границы важны) +4. <выбранные блоки по эвристике> +5. counter-arguments [Z1] +6. open-questions [Z2] +7. next-research [Z3] +8. confidence-summary [Z7] +9. so-what-for-you [Z12] (перед actionable-next-steps) +10. actionable-next-steps [Z4] +11. map-of-sources [Z5] +12. metadata [F5] ``` **Подтверждение пользователя:** скилл выводит одной строкой: @@ -326,6 +347,7 @@ counter-args, open-q, sources, metadata] - `tldr` [F1] — первый блок (но пишется ПОСЛЕДНИМ) - `map-of-sources` [Z5] — обязательно - `metadata` [F5] — последний (footer) +- Для medium/deep во ВСЕХ жанрах — обязательно: `background` [F9], `so-what-for-you` [Z12], `actionable-next-steps` [Z4], `confidence-summary` [Z7] (см. секции жанров выше). ### Mutually exclusive (не использовать вместе) - `glossary-mini` ИЛИ `glossary-full` ИЛИ `glossary-link` — выбирай ОДИН @@ -335,11 +357,13 @@ counter-args, open-q, sources, metadata] ### Порядок зависимостей - `glossary-*` идёт ПЕРЕД `mental-model` (термины перед схемой) +- `background` [F9] идёт СРАЗУ ПОСЛЕ `tldr`/перед `scope` — контекст «почему вопрос» перед рамкой и содержимым - `scope` ПЕРЕД основными блоками (рамка перед содержимым) - `claim-precise` ПЕРЕД `falsification-criteria` ПЕРЕД `evidence-graded` - `base-rates` ПЕРЕД `evidence-graded` (prior перед update) - `counter-arguments` ПОСЛЕ основного содержимого, ПЕРЕД closing - `recommendation-conditional` ПОСЛЕ всех comparison-блоков +- `so-what-for-you` [Z12] ПОСЛЕ `confidence-summary`/`map-of-sources` секций, но ПЕРЕД `actionable-next-steps` [Z4] — сначала проекция на кейс, потом конкретные действия ### Density rules - Shallow отчёт: 5-9 блоков diff --git a/references/model_routing.md b/references/model_routing.md index 9539897..5be2801 100644 --- a/references/model_routing.md +++ b/references/model_routing.md @@ -13,6 +13,7 @@ 3. **Параллелизм — повод для дешёвой модели.** Если запускаем 5 sub-agents в Phase 4, они должны быть на Haiku/Sonnet, не на Opus. Иначе цена ресёрча умножается на 5. 4. **Финальные deliverables — повод для дорогой модели.** Phase 1 reframing, Phase 6 adversarial, Phase 7 synthesis — это где качество мультиплицируется на весь ресёрч. Не экономить. 5. **Главный поток vs sub-agent.** Главный поток (где живёт пользователь) обычно требует Sonnet+ для диалога. Sub-agents можно сильно дешевле — у них узкая задача с фиксированным output. +6. **Экономика сместилась: Opus всего 5× от Haiku** (см. Cost economics ниже). Не экономь на критических одиночных вызовах (reframing, adversarial) — экономь на fan-out (N параллельных sub-agents в Phase 4 и в gap-волне внутри Phase 5). --- @@ -26,15 +27,17 @@ | **Phase 3** | Plan composition (17 секций) | **Opus** | medium | Архитектурное решение, документирует все будущие выборы | | **Phase 3.5** | Capability discovery — env vars audit, mapping | **Sonnet** | low | Механический проход, простые таблицы | | **Phase 4.0** | Source Dispatch — прогон подвопросов через matrix | **Sonnet** | medium | Lookup в `source_dispatch.md` + запись в plan.md | -| **Phase 4.1** | Launch sub-agents (web search, simple lookups) | **Haiku** | low | Sub-agents с узкой задачей и JSON output. Дёшево × N агентов | +| **Phase 4.1** | Launch sub-agents (web search, simple lookups) | **Haiku** | low | Sub-agents с узкой задачей и JSON output. Дёшево × N агентов. Скорит сам, см. Phase 5 | | **Phase 4.1** | Launch sub-agents (чтение длинных источников, извлечение цитат) | **Sonnet** | low | Когда нужен длинный контекст под цитаты | | **Phase 4.1** | Launch sub-agents (api-direct: curl + jq + parse) | **Haiku** | low | Bash работа + механический парсинг JSON | | **Phase 4.1** | Launch sub-agents (анализ кода в репозитории) | **Sonnet** | medium | Code understanding требует средней модели | | **Phase 4.2** | Fetch + dedup (главный поток) | **Sonnet** | medium | Управляет sub-agents, агрегирует результаты | -| **Phase 4.3** | Save sources to files | **Haiku** | low | Механическая запись по шаблону | -| **Phase 5** | Scoring (credibility/recency/bias по rubric) | **Haiku** | low | Простой паттерн оценки. Sonnet излишен | -| **Phase 5** | Triangulation check (3 источника на claim) | **Sonnet** | medium | Понимание содержания, не только URL | +| **Phase 4.3** | Save sources to files | **Haiku** | low | Пишет сам fetch-агент в свой диапазон номеров, см. `subagents_v2.md` | +| **Phase 4.5** | Gap-волна — точечные агенты на дыры в `claims.csv` (status ≠ triangulated), максимум 2 круга | **Haiku** | low | Узкая задача «найди ещё один источник типа X на claim Y» — не нужна дорогая модель | +| **Phase 5** | Scoring (credibility/recency/bias по rubric) | *(встроено в Phase 4.1, см. выше)* | — | Отдельный проход не запускается — скорит тот агент, который читал источник | +| **Phase 5** | Triangulation check по `claims.csv` (механическая: ≥3 источника И ≥2 типа → triangulated) | **Haiku** | low | Правило механическое — подсчёт источников/типов по строке, не нужна дорогая модель | | **Phase 6** | Multi-angle red team — N враждебных ролей как суб-агенты | **Opus** | high | **Самая дорогая модель здесь обязательна.** Атака на гипотезы (Skeptic/Contrarian/Gap-hunter) требует настоящего рассуждения, не паттерн-матчинга. Medium → sonnet/high | +| **Phase 6.5** | Verify — liveness + faithfulness цитат | **Haiku** | low | Механическая проверка + entailment на коротких парах claim⊨quote | | **Phase 7** | Synthesis — сборка отчёта из блоков | **Sonnet** | high | Длинный контекст всех источников + блоков + плана. Sonnet/high лучше чем Opus/medium здесь | | **Phase 7** | Final report write-up (язык, стиль, чистка) | **Sonnet** | medium | Качественное письмо | @@ -58,32 +61,26 @@ Phase 6 red-team суб-агенты: deep → opus/high; medium → sonnet/high **Default для sub-agent** если не уверен → **Sonnet / low**. Это safe middle ground. +**Скоринг встроен.** Каждый fetch sub-agent сам скорит источник тем же вызовом (читает → проставляет credibility/recency/bias → пишет `sources/NN.md` в свой диапазон номеров, `general-purpose` а не `Explore` — см. `subagents_v2.md`). Отдельного scoring pass нет. + --- ## Cost economics -Опираясь на pricing на момент написания (проверь актуальное в Anthropic Pricing): - -| Модель | Input $/1M | Output $/1M | Относительная цена | -|---|---|---|---| -| Haiku | $0.80 | $4.00 | 1x | -| Sonnet | $3.00 | $15.00 | ~3.75x | -| Opus | $15.00 | $75.00 | ~18.75x | +Цены на модели меняются быстрее, чем этот файл переписывается — проверяй актуальное в +Anthropic Pricing. Срез на 2026-07-07: -**Иллюстрация для deep ресёрча (~5 sub-agents):** - -Если всё на Opus: 5 × ~50k input + 5 × ~10k output = 250k input + 50k output = **$7.50** только на Phase 4. +| Модель | Model ID | Input $/1M | Output $/1M | Ratio vs Haiku | +|---|---|---|---|---| +| Haiku 4.5 | `claude-haiku-4-5` | $1.00 | $5.00 | 1× | +| Sonnet 5 | `claude-sonnet-5` | $3.00 (интро $2.00 до 2026-08-31) | $15.00 (интро $10.00) | 3× | +| Opus 4.8 | `claude-opus-4-8` | $5.00 | $25.00 | 5× | -То же на правильном routing: -- Phase 1 (reframing) Opus/high: 5k in + 2k out = **$0.23** -- Phase 3 (plan) Opus/medium: 8k in + 3k out = **$0.35** -- Phase 4 (5 sub-agents Haiku/low): 5 × (15k in + 3k out) = **$0.12** -- Phase 6 (adversarial) Opus/high: 30k in + 5k out = **$0.83** -- Phase 7 (synthesis) Sonnet/high: 60k in + 15k out = **$0.40** +**Главный сдвиг: Opus теперь всего 5× от Haiku** (было 18.75× при $15/$75). Держать Opus на Phase 1/Phase 6 — почти бесплатно. Экономить нужно на fan-out (N sub-agents в Phase 4), не на этих фазах. -**Total ~$1.93** против $7.50 — **в 4× дешевле**, а на критичных фазах (Phase 1, 6) даже **качество выше** потому что Opus/high действительно нужен. +**Иллюстрация (deep, ~5 sub-agents):** всё на Opus = 250k in + 50k out ≈ **$1.62** только на Phase 4. Правильный routing: Phase 1 Opus/high $0.075 + Phase 3 Opus/medium $0.115 + Phase 4 5×Haiku/low $0.15 + Phase 6 Opus/high $0.275 + Phase 7 Sonnet/high $0.405 = **~$1.02** total. Разница уже не в разах — но не экономить на Phase 1/6 остаётся правилом архитектурным (узкая задача = дешёвая модель), не ценовым. -(Цифры приблизительные — суть в порядке величин, не точных значениях.) +(Порядок величин, не точный прогноз — проверяй актуальные цены.) --- @@ -93,7 +90,7 @@ Phase 6 red-team суб-агенты: deep → opus/high; medium → sonnet/high ``` Agent({ - subagent_type: "Explore", + subagent_type: "general-purpose", // fetch+save нужен Write; Explore — только для read-only разведки model: "haiku", // или "sonnet" / "opus" description: "...", prompt: "..." diff --git a/references/runtime_verification.md b/references/runtime_verification.md index e325d8f..3577ef1 100644 --- a/references/runtime_verification.md +++ b/references/runtime_verification.md @@ -34,7 +34,7 @@ is written but not yet "done" until it carries a verification header. the count of `red_flag: true` results, and their source ids/urls. 3. **Insert a verification header** at the top of the final report, right under the - title (block F9 below). + title (block F10 below). 4. **Act on red flags — do not just report them.** For each OPEN source confirmed dead (likely hallucinated or stale URL): @@ -76,7 +76,7 @@ quote(s) per source. No re-fetch in the common case. - UNSUPPORTED → re-search for real support; if none, demote the thesis to Open Questions. A claim with no entailing source is not a finding. 4. Output a second integrity axis — `faithfulness_integrity = SUPPORTED / total` — - separate from liveness. The F9 header carries both. + separate from liveness. The F10 header carries both. 5. Depth gate: - `shallow` — optional. - `medium` — required; any UNSUPPORTED on a hypothesis-bearing claim blocks finish. @@ -85,7 +85,12 @@ quote(s) per source. No re-fetch in the common case. **Two axes, one verdict:** liveness (URL alive) × faithfulness (source backs claim). A citation counts as verified only if it passes BOTH. -## Block F9 — Verification header (add to `references/blocks/frame.md`) +## Block F10 — Verification header (add to `references/blocks/frame.md`) + +> Renumbered from F9 to F10 (2026-07-07): F9 was claimed by the `background` block +> (see `references/blocks/frame.md`) merged from the deepdive-v2 design doc before this +> header was actually implemented in `frame.md`. No functional change — same header, +> same content, next free slot. Rendered at the very top of the final report: @@ -124,7 +129,7 @@ Add to the "Workflow — 9 фаз" list, after Phase 6: ``` 6.5. **Verify** [`haiku`/low] — две оси: (1) **liveness** — `check_citations.py` (URL жив?), (2) **faithfulness** — entailment claim ⊨ цитата из `sources/NN.md` (источник реально - подтверждает тезис?). Вставить verification-header (F9), отработать флаги: re-search / + подтверждает тезис?). Вставить verification-header (F10), отработать флаги: re-search / demote claim / смягчить overclaim. medium: integrity < 0.70 ИЛИ UNSUPPORTED на гипотезе блокирует finish; deep: ноль red flags и ноль UNSUPPORTED. См. `references/runtime_verification.md`. ``` diff --git a/references/source_scoring.md b/references/source_scoring.md index bfc60d1..ca76a42 100644 --- a/references/source_scoring.md +++ b/references/source_scoring.md @@ -46,6 +46,50 @@ - Тема плохо исследована (тогда честно: «литературы по теме мало, выводы предварительные»). - Эхокамера / мы плохо ищем (тогда отдельный поиск с противоположным запросом). +## Claims-ledger — `claims.csv` + +С этой версии триангуляция трекается не только «в уме» при синтезе, а отдельным +артефактом-ledger рядом с `sources.csv`. Заполняется в Фазе 5 (см. `workflow.md`) +из index-строк и claim-кандидатов, которые вернули fetch sub-agents (см. +`subagents_v2.md`) — каждый агент сам замечает, какой тезис подтверждает его +подтема, и передаёт кандидат-строку, а не оставляет это на «вспомнить в конце». + +**Схема:** + +| Поле | Значение | +|---|---| +| `claim_id` | `CL1`, `CL2`, ... сквозная нумерация | +| `claim` | тезис одной строкой | +| `hypothesis` | `H1`-`H4` или `-` если тезис не привязан к гипотезе плана | +| `sources` | id источников через `;` (`s01;s07;s12`) | +| `source_types` | типы через `;`, тот же порядок что `sources` (`primary;academic;industry`) | +| `status` | `triangulated` \| `weak` \| `single-type` \| `contradicted` \| `data-insufficient` | +| `confidence` | `high` \| `medium` \| `low` | +| `primary_source` | `Y` \| `N` — есть ли среди sources хотя бы один Credibility=5 первичный | + +**Механическая триангуляция:** `status: triangulated` ⟺ ≥3 источника **И** ≥2 разных +типа в строке. Это проверяется подсчётом полей `sources`/`source_types`, не +повторным чтением содержания — отсюда `haiku`/low модель на этом шаге в +`model_routing.md`. + +**Primary-first правило:** `confidence: high` разрешён ТОЛЬКО если `primary_source: Y`. +Без первичного источника — потолок `medium`, даже если формально triangulated по +количеству и разнотипности. Причина: три вторичных пересказа одного и того же +первичного факта легко создают иллюзию независимого подтверждения. + +**Пример:** + +```csv +claim_id,claim,hypothesis,sources,source_types,status,confidence,primary_source +CL1,"Postgres logical replication handles N nodes without external tooling",H1,s01;s07;s12,primary;industry;academic,triangulated,high,Y +CL2,"CDC tooling adds >200ms p99 latency at scale",H2,s09;s14,industry;industry,single-type,medium,N +CL3,"Vendor X claims zero-downtime migration",-,s22,industry,weak,low,N +``` + +**Дыры (status ≠ triangulated) → gap-волна.** См. `workflow.md` Фаза 4.5: точечный +haiku/low агент на конкретную дыру, максимум 2 круга, иначе честно +`status: data-insufficient`. + ## Файл sources/NN_slug.md — шаблон Каждый источник = отдельный файл. Это долгосрочная память исследования — через месяц возвращаешься и видишь цитаты с метаданными без перечитывания отчёта. @@ -132,3 +176,5 @@ fetched: 2026-05-21 # дата извлечения - ❌ Помечать источник «total 12+» без пересчёта — пересчитывай явно. - ❌ Парафразить цитаты в `sources/NN.md` — только дословные. - ❌ Сжимать все источники в один файл — теряется поиск, переиспользование, ссылка из отчёта. +- ❌ Ставить `confidence: high` в `claims.csv` без primary-источника — нарушает primary-first правило, даже если формально 3+ источника разного типа. +- ❌ Оставлять строку `claims.csv` без статуса после первого прохода — прогони gap-волну (Фаза 4.5), максимум 2 круга, потом честно `data-insufficient`. diff --git a/references/subagents_v2.md b/references/subagents_v2.md index b2e492e..97ef546 100644 --- a/references/subagents_v2.md +++ b/references/subagents_v2.md @@ -7,26 +7,30 @@ ``` Главный поток (assistant): - формирует план, разбивает тему на подтемы + - назначает каждому агенту диапазон номеров источников (s01-s09, s10-s19, ...) - запускает суб-агентов в ОДНОМ сообщении (параллель) - - получает JSON выжимки - - дедуплицирует URLs - - ПИШЕТ файлы sources/NN.md из полученного JSON - - триангулирует, синтезирует - -Суб-агент (subagent_type=Explore): - - читает свой промпт + - получает ТОЛЬКО индекс-строки для sources.csv (URL/title/type/date/scores/ + subquestion_ids/файл) — не полные тексты + - мёржит sources.csv, дедуплицирует по URL между диапазонами + - заполняет claims.csv из индекс-строк + заявленных claim'ов + - триангулирует по claims.csv, синтезирует + +Суб-агент (subagent_type=general-purpose, свой диапазон NN): + - читает свой промпт (включая закреплённый диапазон номеров) - делает WebSearch + WebFetch - - оценивает источники по шкале - - возвращает структурированный JSON - - НЕ пишет файлы (Explore read-only) + - оценивает каждый источник по шкале сам (не отдельный scoring pass — H7) + - ПИШЕТ полные файлы sources/NN_slug.md в своём диапазоне (Write — параллельно, + без конфликтов, т.к. диапазоны не пересекаются) + - возвращает в главный поток ТОЛЬКО индекс-строки (компактно — полные тексты + источников через главный контекст не проходят) ``` -Так главный поток сохраняет контроль над файлами и дедупликацией, а суб-агенты — параллельны и не забивают контекст сырыми данными. +Так главный поток не раздувается сырыми текстами источников (только компактные индекс-строки), а параллельная запись `sources/NN.md` не конфликтует, потому что у каждого агента свой непересекающийся диапазон номеров. ## Какой subagent_type -- **`Explore`** — дефолт для deep-research. Read-only, имеет WebFetch/WebSearch, защищает основной контекст. Не может писать файлы — это ок, файлы пишет главный поток. -- **`general-purpose`** — только если подтема требует одновременно веб-поиска И чтения локальных файлов проекта (например, ресёрч под фичу с учётом существующего кода в репо). Имеет полный доступ. +- **`general-purpose`** — дефолт для fetch+save (Phase 4.1). Нужен `Write`, чтобы агент сам сохранял `sources/NN.md` в своём диапазоне номеров, а не передавал полные тексты обратно в главный поток. Каждому агенту — явный диапазон: агент №1 → `s01-s09`, №2 → `s10-s19`, и т.д. (см. промпт-шаблон ниже, поле `SOURCE ID RANGE`). +- **`Explore`** — только для чистой discovery-разведки БЕЗ сохранения файлов (например, Phase 3.5 capability discovery или предварительная разведка «сколько вообще есть материала» до того как решили дробить на подтемы). Как только агенту нужно писать `sources/NN.md` — это `general-purpose`, не `Explore`. - **`Plan`** — НЕ для поиска. В deep-research не использовать. ## Какую модель выбрать (model routing) @@ -50,7 +54,7 @@ ``` Agent({ - subagent_type: "Explore", + subagent_type: "general-purpose", // fetch+save нужен Write, см. выше model: "haiku", // ← важно: явный выбор description: "...", prompt: "..." @@ -82,6 +86,7 @@ Agent({ - `API ENDPOINTS TO USE` ← из той же секции 12 → конкретные API из `api_sources/` (с пометкой какие auth-env-vars нужны) - `DISCOVERY EXECUTED` ← из секции 12: что уже было найдено через awesome-lists registry / GitHub topics / HuggingFace на шаге 4.0 — суб-агент может на это опираться, не повторять discovery впустую - `CRITICAL GAPS` ← из секции 12 → critical gaps to address для этой подтемы +- `SOURCE ID RANGE` ← закреплённый за этим агентом диапазон номеров источников, назначает главный поток ПЕРЕД launch: агент №1 → `s01-s09`, №2 → `s10-s19`, №3 → `s20-s29`, и т.д. (шаг по 9-10 номеров с запасом). Диапазоны не пересекаются — это устраняет конфликты при параллельной записи `sources/NN.md`. Так главный поток не дублирует работу плана и обеспечивает прозрачность: пользователь в plan.md видит точно тот же brief что и агент. @@ -97,6 +102,10 @@ medium/deep depth, with structured JSON output requested. YOUR SUBTOPIC: +YOUR SOURCE ID RANGE: s-s (e.g. s10-s19). Use ONLY these numbers for the +files you write. Do not reuse a number outside your range — other agents are +writing in parallel with their own ranges. + BLOCKS THIS SUBTOPIC FEEDS: - : - : @@ -137,7 +146,8 @@ TASK: - 2-4 key direct quotes (verbatim, with location/page if possible) - Author, publication date, source type - How it relates to each hypothesis (supports / contradicts / neutral) -3. Score each source on three axes 1-5: +3. Score each source YOURSELF on three axes 1-5 (no separate scoring pass follows — + you are the one who read it, you score it): - Credibility: 5=primary/peer-review, 4=industry-authority, 3=quality general media, 2=expert blog, 1=forum/anon - Recency: 5=<1yr, 4=1-3yr, 3=3-5yr, 2=5-10yr, 1=>10yr (unless historical topic) @@ -145,36 +155,41 @@ TASK: 2=lobbyist, 1=propaganda 4. CRITICAL: include at least 1-2 sources representing OPPOSITION or CRITICISM of the dominant view in this subtopic. If you cannot find any — say so explicitly. - -OUTPUT FORMAT (strict JSON, no commentary outside JSON): +5. WRITE the full source file yourself: `sources/_.md` using the + template in `source_scoring.md`, with complete frontmatter (channel, access, + scores, subquestion_ids) and verbatim quotes. Use ONLY ids from your assigned + range (see YOUR SOURCE ID RANGE above). +6. For each claim/thesis this subtopic supports, note it as a candidate row for + `claims.csv` (claim text, hypothesis id if any, which source ids back it, source + types, whether at least one is Primary — the "primary_source" flag). + +OUTPUT FORMAT — return ONLY compact index rows to the main thread, NOT full source +text (full text already lives in the files you wrote in step 5). Strict JSON, no +commentary outside JSON: { "subtopic": "", "summary": "<3-5 sentence summary of what you found>", - "sources": [ + "source_index": [ { + "id": "s07", "url": "https://...", "title": "...", - "author": "...", - "date": "YYYY-MM-DD or YYYY", "type": "Primary|Academic|Industry-media|General-media|Expert-blog|Forum|Other", "channel": "", - "access": "OPEN|PARTIAL|paywalled-abstract-only|gray-area-source|closed", - "credibility": 5, - "recency": 4, - "bias": 4, - "total": 13, - "summary": "<2-3 sentence summary>", - "quotes": [ - {"text": "...", "location": "Section 2 / p.34"}, - {"text": "..."} - ], - "hypothesis_evidence": { - "H1": "supports — quote 1 directly states ...", - "H2": "contradicts — author argues opposite ...", - "H3": "neutral / not addressed" - }, - "notes": "" + "date": "YYYY-MM-DD or YYYY", + "credibility": 5, "recency": 4, "bias": 4, "total": 13, + "subquestion_ids": ["Q2"], + "file": "sources/07_.md" + } + ], + "claim_candidates": [ + { + "claim": "", + "hypothesis": "H1", + "sources": ["s07", "s09"], + "source_types": ["Primary", "Industry-media"], + "primary_source": true } ], "opposition_found": true, @@ -188,6 +203,8 @@ CONSTRAINTS: - If a source is paywalled / inaccessible — note it in `gaps` and try alternative. - Do not use bash/curl to bypass WebFetch restrictions. - If WebFetch fails for a URL — try alternative source, don't insist. +- Do NOT return full source text/quotes in your final JSON reply — they belong in + the files you wrote. Returning them again bloats the main thread's context. ``` ### RU template @@ -198,6 +215,9 @@ CONSTRAINTS: ТВОЯ ПОДТЕМА: <узкая подтема — что ищет ЭТОТ агент, не вся тема> +ТВОЙ ДИАПАЗОН НОМЕРОВ ИСТОЧНИКОВ: s-s (например s10-s19). Используй ТОЛЬКО +эти номера для своих файлов — другие агенты параллельно пишут в своих диапазонах. + ГИПОТЕЗЫ ДЛЯ ТЕСТИРОВАНИЯ: - H1: <опровергаемое утверждение> - H2: ... @@ -209,7 +229,8 @@ CONSTRAINTS: - 2-4 прямые цитаты (дословно, с указанием раздела/страницы если есть) - Автор, дата публикации, тип источника - Отношение к каждой гипотезе (supports / contradicts / neutral) -3. Оценить каждый источник по 3 осям 1-5: +3. Оценить каждый источник САМОМУ по 3 осям 1-5 (отдельного scoring-прохода не + будет — кто прочитал, тот и скорит): - Credibility: 5=первичный/peer-review, 4=отраслевая медиа, 3=качественная пресса, 2=экспертный блог, 1=форум/анон - Recency: 5=<1г, 4=1-3г, 3=3-5л, 2=5-10л, 1=>10л @@ -217,33 +238,41 @@ CONSTRAINTS: 2=лоббист, 1=пропаганда 4. КРИТИЧНО: включить ≥1-2 источника с противоположной позицией / критикой доминирующего взгляда. Если не нашёл — сказать прямо. +5. ЗАПИСАТЬ полные файлы `sources/_.md` самому (шаблон в + `source_scoring.md`), используя только номера из своего диапазона. +6. Для каждого тезиса, который подтверждает эта подтема, — кандидат-строка для + `claims.csv` (текст тезиса, гипотеза, какие sources подтверждают, их типы, + есть ли среди них primary source). -ФОРМАТ ВЫВОДА (строгий JSON, без комментариев вне JSON): +ФОРМАТ ВЫВОДА — вернуть в главный поток ТОЛЬКО компактные index-строки, НЕ полные +тексты источников (полный текст уже в файле из шага 5). Строгий JSON: -[см. EN шаблон выше — структура та же] +[см. EN шаблон выше — структура `source_index` + `claim_candidates` та же] ОГРАНИЧЕНИЯ: - Максимум 10 источников. Качество важнее количества. - Цитаты ДОСЛОВНЫЕ. Не пересказ. - Если источник за paywall — в `gaps`, искать альтернативу. - НЕ использовать bash/curl для обхода ограничений WebFetch. +- НЕ возвращать полные цитаты/тексты источников в финальном JSON — они уже в + записанных файлах, повторный возврат раздувает контекст главного потока. ``` ## После возврата суб-агентов — что делает главный поток -1. **Парсинг JSON.** Если суб-агент вернул мусор — попроси переслать в JSON, не интерпретируй сам. +1. **Парсинг JSON.** Если суб-агент вернул мусор — попроси переслать в JSON, не интерпретируй сам. Ожидай `source_index` (компактные строки) + `claim_candidates` — НЕ полные тексты источников (их агент уже записал сам, см. выше). -2. **Дедупликация по URL.** Если два суб-агента нашли один и тот же URL — это ОДИН источник, объединить quotes и evidence из обоих ответов. +2. **Дедупликация по URL.** Если два суб-агента нашли один и тот же URL под разными id (не должно случиться при непересекающихся диапазонах, но проверяй) — это ОДИН источник, оставить файл с лучшим scoring, вторую запись пометить дублем в `sources.csv`. -3. **Запись файлов `sources/NN_slug.md`.** Для каждого уникального source создать файл по шаблону из `source_scoring.md`. Нумерация сквозная, не сбрасывается. +3. **Мёрж `sources.csv`** из всех `source_index` — файлы уже на диске (агенты сами их записали в своих диапазонах), главный поток здесь только сводит индекс, не переписывает `sources/NN.md`. -4. **Обновление `sources.csv`.** Все источники из всех суб-агентов с пересчитанным total. +4. **Заполнение `claims.csv`** из всех `claim_candidates` (Phase 5 — см. `source_scoring.md` раздел claims-ledger). Смёржить дублирующиеся claim'ы от разных агентов (если тезис один и тот же — объединить sources/source_types в одну строку). 5. **Проверка покрытия:** - Сколько типов источников? (нужно ≥4) - Найдена ли оппозиция? (нужна минимум одна) - Все ли гипотезы получили evidence? (нужно ≥3 источника на гипотезу) - - Если что-то не покрыто — отдельный round доп-поиска (без суб-агентов, в основном потоке, целевыми запросами). + - Сколько строк `claims.csv` НЕ triangulated? → это вход в gap-волну (Phase 4.5, см. `workflow.md`). ## Антипаттерны @@ -251,8 +280,9 @@ CONSTRAINTS: - ❌ Дать слишком общий промпт «ищи про X» — вернётся жидкая выжимка. Подтема должна быть УЗКОЙ. - ❌ Запустить суб-агентов последовательно (Agent call → ждать → следующий). Только параллельно в одном сообщении. - ❌ Принимать выжимку суб-агента как финал без проверки. Дедуплицируй URLs и проверь scoring. -- ❌ Использовать `general-purpose` когда хватает `Explore`. Explore быстрее и дешевле. -- ❌ Просить суб-агента ПИСАТЬ файлы — Explore не умеет. Главный поток пишет. +- ❌ Использовать `Explore` когда агенту нужно писать `sources/NN.md` — Explore read-only, не сохранит файл. Для fetch+save всегда `general-purpose`. +- ❌ Не назначить агенту диапазон номеров ПЕРЕД launch — без этого параллельная запись рискует коллизией id. +- ❌ Просить суб-агента вернуть полные тексты/цитаты источников в JSON-ответе — раздувает контекст главного потока. Полный текст живёт в файле, в главный поток идёт только index-строка. - ❌ Пропустить требование «найди оппозицию» — суб-агенты по умолчанию ищут confirmation, не contradiction. ## Когда НЕ запускать суб-агентов diff --git a/references/workflow.md b/references/workflow.md index 13e861d..0de987b 100644 --- a/references/workflow.md +++ b/references/workflow.md @@ -196,11 +196,11 @@ time_box_hard: Какая подтема собирает evidence для каких блоков. Без этого агенты не знают для чего работают. -| Subtopic | Под какие блоки | Кому (Explore # / main thread) | +| Subtopic | Под какие блоки | Кому (agent # + source range / main thread) | |---|---|---| -| ST1: <название> | F3, E1, E4 | Explore #1 | -| ST2: <название> | A1 (data-table rows), M2 (profile cards) | Explore #2 | -| ST3: <название> | V2 (evidence FOR/AGAINST), Z1 (counter-args) | Explore #3 | +| ST1: <название> | F3, E1, E4 | Agent #1 (`general-purpose`, s01-s09) | +| ST2: <название> | A1 (data-table rows), M2 (profile cards) | Agent #2 (`general-purpose`, s10-s19) | +| ST3: <название> | V2 (evidence FOR/AGAINST), Z1 (counter-args) | Agent #3 (`general-purpose`, s20-s29) | | ST4: <название> | E10 (failure modes), Z2 (open questions) | main thread | ## 12. Information sourcing strategy @@ -521,20 +521,37 @@ deep ≤2, shallow never (fixed outline). Don't silently rewrite structure — e revision is a recorded, budgeted decision, same as any deviation. This keeps the report shape adaptive to what the evidence actually is, not what we guessed at Phase 2. -## Фаза 5. Скоринг и триангуляция +## Фаза 5. Claims-ledger и триангуляция -**Model:** scoring per source — `haiku` / `low` (простой rubric). Triangulation check — `sonnet` / `medium` (требует понимания содержания). +**Model:** сборка `claims.csv` из index-строк — `haiku` / `low` (механическая работа). Triangulation check — `haiku` / `low` (правило механическое, см. ниже — не требует "понимания" содержания, только подсчёта источников/типов по строке). -Каждый источник в `sources/NN.md` имеет frontmatter со scoring (см. `source_scoring.md`). +**Скоринг источников больше не отдельный шаг.** Каждый источник в `sources/NN.md` уже имеет заполненный frontmatter со scoring — его проставил fetch sub-agent на шаге 4.1, в момент когда читал источник (H7-правило: скорит тот, кто читал). Здесь, в Фазе 5, шкала подробно описана в `source_scoring.md` для справки, но повторного прохода по всем источникам не требуется. -**Triangulation rule:** каждое утверждение в финальных выводах подтверждено ≥3 независимыми источниками **разного типа**. Не три статьи одного автора, не три новости одного издания. +**Claims-ledger (`claims.csv`)** — новый артефакт-ledger рядом с `sources.csv`. Схема: -**Если триангуляция не сходится:** -- < 3 источников → пометь тезис «спорно / требует проверки», confidence: low -- 3 источника, но одного типа → «требует подтверждения первичным источником», confidence: medium -- Нашёл оппозицию → отдельный counter-argument в Фазу 5 +``` +claim_id, claim, hypothesis, sources, source_types, status, confidence, primary_source +``` + +- `claim` — тезис одной строкой. +- `hypothesis` — H1-H4 или `-` если не привязан к гипотезе. +- `sources` — список id (`s01;s07;s12`). +- `source_types` — типы источников через `;` (`primary;academic;industry`). +- `status` — `triangulated | weak | single-type | contradicted | data-insufficient`. +- `confidence` — `high | medium | low`. +- `primary_source` — `Y | N`. + +**Заполнение:** главный поток собирает `claims.csv` из `claim_candidates`, которые вернул каждый fetch sub-agent (см. `subagents_v2.md`), плюс из явного чтения claims в уже записанных `sources/NN.md`. Дублирующиеся claim'ы от разных агентов — смёржить в одну строку (объединить `sources`/`source_types`). -**После скоринга** — обнови `sources.csv`: +**Triangulation rule (механическая):** строка получает `status: triangulated`, если ≥3 источника **И** ≥2 разных типа. Иначе: +- < 3 источников → `status: weak`, confidence: low +- ≥3 источника, но один тип → `status: single-type`, confidence: medium (max) +- Явное противоречие между источниками → `status: contradicted` — отдельный counter-argument (Z1) +- После gap-волны (см. выше) всё ещё не закрыто → `status: data-insufficient` (честный результат, не скрывать) + +**Primary-first правило:** ключевое число/факт без хотя бы одного primary-источника (`primary_source: N`) не может получить `confidence` выше `medium`, даже если формально triangulated по количеству/разнотипности. Primary здесь — filing, официальная дока, датасет, оригинальное исследование (см. Credibility=5 в `source_scoring.md`). + +**После сборки** — обнови `sources.csv` (индекс источников, как раньше) и новый `claims.csv`: ```csv №,URL,Title,Type,Author,Date,Credibility,Recency,Bias,Total,Used,File,Note @@ -542,17 +559,42 @@ shape adaptive to what the evidence actually is, not what we guessed at Phase 2. 2,https://...,Industry benchmark,Industry-media,J. Smith,2026-02,4,5,4,13,Y,sources/02_industry.md,Supports H1 ``` +```csv +claim_id,claim,hypothesis,sources,source_types,status,confidence,primary_source +CL1,"Logical replication scales to N nodes without external tooling",H1,s01;s07;s12,primary;industry;academic,triangulated,high,Y +CL2,"CDC adds >200ms p99 latency at scale",H2,s09;s14,industry;industry,single-type,medium,N +``` + +### Gap-волна (Фаза 5 продолжается — не новая фаза, аналогично loop-конвенции Фазы 4) + +**Model:** `haiku` / `low`. Узкая точечная задача на конкретную дыру — дорогая модель не нужна. + +После первого заполнения `claims.csv` собери список дыр — строки со `status ≠ triangulated`. + +**Точечная вторая волна:** по одному агенту на дыру (или пачкой, параллельно), промпт = конкретный claim + чего конкретно не хватает: +- «нужен primary-источник для CL2» +- «нужен 3-й тип источника, сейчас только industry×2» +- «противоречие между s09 и s14 — найти причину или дополнительный арбитр» + +**Максимум 2 круга.** Если после второго круга дыра не закрылась — строка помечается `status: data-insufficient`. Это честный результат отчёта, не провал: попадает в Open Questions (Z2), а не маскируется. + +**Выход:** обновлённый `claims.csv`, обновлённые `sources/NN.md` (новые источники в свежем диапазоне номеров — следующий свободный блок после уже занятых). + ## Фаза 6. Синтез + multi-angle red team **Model:** red-team суб-агенты — `opus` / `high` **(обязательно для deep)**, `sonnet` / `high` для medium. Synthesis assembly — `sonnet` / `high` (длинный контекст). Не экономить на red team — это где Haiku/Sonnet делают soft-pushback без реальной атаки на гипотезы. **Порядок:** -1. Перечитай ВСЕ `sources/NN.md` с `used: Y`. Не делай синтез из памяти. -2. Перечитай `plan.md` — жанр, blocks, гипотезы. +1. Перечитай ВСЕ `sources/NN.md` с `used: Y`. Не делай синтез из памяти. Для **deep**: `findings/` слой обязателен — синтез идёт из `findings/` + `claims.csv`, точечная сверка `sources/NN.md` только по спорным местам. Для shallow/medium — как раньше, перечитать used sources целиком. +2. Перечитай `plan.md` (жанр, blocks, гипотезы, секция 0 User context) и `claims.csv` (статус/confidence каждого тезиса). 3. Загрузи нужные категорийные файлы `blocks/*.md` (только те что нужны для выбранных blocks). Прогрессивно — не сразу все. 4. Для каждой гипотезы — собери поддерживающие/опровергающие цитаты. Опционально вынеси крупные в `findings/FN.md` (см. `blocks/close.md` блок Z6). -5. Собери черновик `_.md` из выбранных блоков по порядку из `plan.md`. Каждый блок — по шаблону из своего категорийного файла. -6. **Multi-angle red team** (см. `adversarial_pass.md`) — draft → claim ledger → N враждебных ролей (Skeptic/Contrarian/Gap-hunter) как `general-purpose` суб-агенты → триаж severity → ОДИН раунд ремедиации HIGH → финал. Гейт глубины: shallow=R1 инлайн, medium=R1+R2, deep=R1+R2+R3. Дефекты → counter-arguments (`Z1`) + Open Questions; лог в `findings/redteam_.md`. Не маскируй несогласие. +5. Собери черновик `_.md` из выбранных блоков по порядку из `plan.md`. Каждый блок — по шаблону из своего категорийного файла. Три сквозных правила синтеза (применяй ко всем блокам, не только TL;DR): + - **Числа с якорем сравнения.** Ключевое число без базы сравнения запрещено: «Рынок $4.5B» — недостаточно. «Рынок $4.5B — втрое меньше соседнего сегмента X, растёт втрое быстрее среднего по индустрии» — годится. Якорь: vs база / vs сосед / vs динамика во времени. + - **Условия применимости.** Каждый вывод — с явным «когда верен, когда нет», не голое утверждение. + - **Confidence из claims.csv.** Каждый пункт TL;DR (F1) несёт свой `confidence` (high/medium/low), взятый из соответствующей строки `claims.csv` — не придуманный на глаз при синтезе. + - Блок Z12 `so-what-for-you` (см. `blocks/close.md`) собирается на этом же шаге из `plan.md` секции 0 (User context) + `claims.csv` — проекция выводов на кейс пользователя, до `actionable-next-steps`. +6. **Multi-angle red team** (см. `adversarial_pass.md`) — draft → claim ledger (внутренний список falsifiable-тезисов для red team, не путать с файлом `claims.csv`) → N враждебных ролей (Skeptic/Contrarian/Gap-hunter) как `general-purpose` суб-агенты → триаж severity → ОДИН раунд ремедиации HIGH → финал. Гейт глубины: shallow=R1 инлайн, medium=R1+R2, deep=R1+R2+R3. Дефекты → counter-arguments (`Z1`) + Open Questions; лог в `findings/redteam_.md`. Не маскируй несогласие. 5-й adversarial-вопрос (см. `adversarial_pass.md`): есть ли числа без якоря сравнения, выводы без Z12-проекции, рекомендации без trade-off/kill-criteria? 7. Если в системе есть `anthropic-skills:humanizer-ru` — прогони финальный отчёт через него. 8. Сохрани финальный отчёт. @@ -585,6 +627,8 @@ shape adaptive to what the evidence actually is, not what we guessed at Phase 2. - [ ] **Acceptance criteria из plan.md (секция 4) ВСЕ выполнены** — перепроверь каждый чек-бокс - [ ] Все `sources/NN.md` имеют корректный frontmatter (scoring, channel, access заполнены) - [ ] `sources.csv` обновлён, total пересчитан +- [ ] `claims.csv` заполнен — каждая строка имеет status; строки не triangulated прошли gap-волну (см. Фаза 5, max 2 круга) и честно помечены `data-insufficient` если не закрылись +- [ ] Ни один тезис с `confidence: high` не нарушает primary-first правило (без primary-источника confidence ≤ medium) - [ ] `plan.md` имеет `status: completed` - [ ] `plan.md` секция 15 (notes) финализирована — все важные observations документированы - [ ] `_.md` собран из всех блоков из `plan.md` → `blocks:` diff --git a/runner/DESIGN.md b/runner/DESIGN.md index a1a0df8..f74dfb3 100644 --- a/runner/DESIGN.md +++ b/runner/DESIGN.md @@ -11,7 +11,7 @@ two genuinely Claude-specific pieces are: `complete()` calls), so the methodology no longer depends on the harness. 2. **Source-file management** — the skill relies on the agent writing `sources/NN.md`. -Everything else (the 9-phase methodology, 103 blocks, 29 channels, 460+ sources, the +Everything else (the 9-phase methodology, 105 blocks, 29 channels, 460+ sources, the scoring rubric) is model-agnostic markdown. If a thin runner owns the fan-out and the file I/O and talks to *any* model through one interface, the skill becomes infrastructure instead of a Claude add-on. That is the difference between "a skill" diff --git a/scripts/context_budget.py b/scripts/context_budget.py index 486960c..cc59c67 100644 --- a/scripts/context_budget.py +++ b/scripts/context_budget.py @@ -55,7 +55,10 @@ def check_proxy_in_sync(root: Path) -> str | None: # Budgets in tokens. Tune as the catalog evolves; these are the guard-rails CI enforces. BUDGET_SKILL_MD = 7500 # SKILL.md is read on EVERY invocation — keep it lean -BUDGET_ALWAYS_FLOOR = 55000 # the "base refs" SKILL.md says to always load for medium/deep +BUDGET_ALWAYS_FLOOR = 56000 # the "base refs" SKILL.md says to always load for medium/deep +# Raised from 55000 on 2026-07-07: claims.csv artifact + gap-wave loop (Phase 5) + 2 +# new report blocks (F9 background, Z12 so-what-for-you) added durable value at a +# modest, deliberately-trimmed floor cost (~1200 tok). See docs/2026-07-07-v2-design.md. # Files SKILL.md marks as "Базовые (всегда)" — the unavoidable floor for a medium/deep run. ALWAYS_LOAD = [ diff --git a/tests/test_catalog_counts.py b/tests/test_catalog_counts.py index 6586e7f..03a78d6 100644 --- a/tests/test_catalog_counts.py +++ b/tests/test_catalog_counts.py @@ -9,11 +9,11 @@ def test_counts_match_verified_ground_truth(): - """Golden numbers re-verified by regex on 2026-06-13. If the catalog grows, - update these intentionally — a mismatch here means either the catalog changed - or a regex broke.""" + """Golden numbers re-verified by regex on 2026-07-07 (blocks: +F9 background, + +Z12 so-what-for-you). If the catalog grows, update these intentionally — a + mismatch here means either the catalog changed or a regex broke.""" c = catalog_counts.counts(REPO) - assert c["blocks"] == 103 + assert c["blocks"] == 105 assert c["channels"] == 29 assert c["stat_sources"] == 460 assert c["api"] == 39 diff --git a/tests/test_stamp_docs.py b/tests/test_stamp_docs.py index 213b16c..0835235 100644 --- a/tests/test_stamp_docs.py +++ b/tests/test_stamp_docs.py @@ -57,7 +57,7 @@ def test_render_values_has_all_keys(): "count:genres", "count:phases", "phases:list:ru", "phases:table:en"): assert k in v - assert v["count:blocks"] == "103" + assert v["count:blocks"] == "105" assert v["count:phases"] == "9" @@ -65,14 +65,14 @@ def test_check_mode_detects_drift(tmp_path): f = tmp_path / "doc.md" f.write_text("n=75", encoding="utf-8") rc = stamp_docs.run(REPO, [f], write=False) - assert rc == 1 # 75 != 103 → drift + assert rc == 1 # 75 != 105 → drift def test_write_mode_fixes_and_check_passes(tmp_path): f = tmp_path / "doc.md" f.write_text("n=75", encoding="utf-8") assert stamp_docs.run(REPO, [f], write=True) == 0 - assert "103" in f.read_text(encoding="utf-8") + assert "105" in f.read_text(encoding="utf-8") assert stamp_docs.run(REPO, [f], write=False) == 0 # now synced @@ -87,7 +87,7 @@ def test_zero_count_refused(monkeypatch, tmp_path): def test_unused_key_warns_not_fails(tmp_path, capsys): # a doc using only ONE key → the other keys are "stamped nowhere" → WARNING, rc 0 f = tmp_path / "doc.md" - f.write_text("n=103", encoding="utf-8") + f.write_text("n=105", encoding="utf-8") rc = stamp_docs.run(REPO, [f], write=False) out = capsys.readouterr().out assert rc == 0 # warning, not drift