{"slug":"apply-captures","title":"apply-captures","summary":"Разбор extraction-reports со status pending-review — решение R15 (accept/reject/defer) ЖИВЫМ ПИЛОТОМ, запись в Pack, обновление статуса, коммит. Вызывать при Close при наличии N>0 pending-review отчётов.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-27T16:56:14.269047Z","repo":{"url":"https://github.com/TserenTserenov/FMT-exocortex-template","stars":60,"forks":152,"license":"MIT","updatedAt":"2026-09-24T08:59:39Z"},"bodyHtml":"<hr>\n<h2>name: apply-captures\ndescription: Разбор extraction-reports со status pending-review — решение R15 (accept/reject/defer) ЖИВЫМ ПИЛОТОМ, запись в Pack, обновление статуса, коммит. Вызывать при Close при наличии N&gt;0 pending-review отчётов.\nargument-hint: \"[путь к конкретному отчёту | пусто = все pending-review]\"\nversion: 1.3.0\nlayer: L1\nstatus: active\nagents: single\ninteraction: multi-step\ntriggers:\nslash: [/apply-captures]\nphrases: []\ngates_required: []\ngates_enforced: []\ngates_rationale: \"операционный скилл разбора очереди; WP Gate не нужен — вызывается автоматически из Close Gate\"\nrouting:\nexecutor: sonnet\ndeterministic: false</h2>\n<h1>/apply-captures — разбор кандидатов экстрактора</h1>\n<p>Полная ВДВ-карта цикла: <code>${IWE_GOVERNANCE_REPO:-DS-strategy}/inbox/WP-247-ke-pipeline-vdv.md</code>\nКонтракт скилла взят из шагов 5, 6, 6.5, 7 этой карты.</p>\n<h2>When to use</h2>\n<h3>Scope</h3>\n<p><strong>Этот скилл делает:</strong></p>\n<ul>\n<li>Читает <code>${IWE_GOVERNANCE_REPO:-DS-strategy}/inbox/extraction-reports/*.md</code> со <code>status: pending-review</code> или <code>status: deferred</code>.</li>\n<li>Для каждого кандидата в отчёте — запрашивает решение R15 (accept / reject / defer).</li>\n<li>Accept → опциональная редактура → валидация → запись файла в Pack → обновление MAP → коммит.</li>\n<li>Reject → запись причины + паттерна в <code>feedback-log.md</code>.</li>\n<li>Defer → запись причины + <code>defer_until</code> в отчёт.</li>\n<li>Обновляет <code>status</code> отчёта на <code>applied</code> / <code>partially-applied</code> / <code>rejected</code> / <code>deferred</code>.</li>\n</ul>\n<p><strong>Этот скилл НЕ делает:</strong></p>\n<ul>\n<li>Не запускает агента R2 (экстрактор) — это <code>/ke</code> и launchd <code>extractor.sh</code>.</li>\n<li>Не создаёт extraction-reports — это R2.</li>\n<li>Не редактирует содержимое captures.md / fleeting-notes.md.</li>\n</ul>\n<h3>ВДВ-контракт (шаги 5–7 из ke-pipeline-vdv.md)</h3>\n<pre><code>Вход:   ${IWE_GOVERNANCE_REPO:-DS-strategy}/inbox/extraction-reports/*.md  со  status: pending-review\nРоль:   R15 Валидатор (accept/reject/defer)\n        R4 Автор (conditional: редактура при edits_needed: yes)\n        Скилл (автоматика записи, валидации, коммита)\nДействие:\n  Для каждого pending-review отчёта, для каждого кандидата:\n    1. Показать кандидата (id, тип, предложенный target_path, текст).\n    2. Запросить решение R15 по схеме ниже.\n    3. Accept + edits_needed=yes → R4 редактирует текст.\n    4. Шаг 6.5: валидация Pack-сущности (frontmatter, уникальность ID, путь).\n    5. Accept + valid → записать файл в Pack, обновить MAP, дописать feedback-log (паттерн), коммит.\n    6. Reject → записать в feedback-log причину + паттерн.\n    7. Defer → записать defer_reason + defer_until в отчёт.\n  Обновить status отчёта по итогам.\nВыход:\n  - Обновлённый Pack (новые файлы сущностей).\n  - Обновлённый ${IWE_GOVERNANCE_REPO:-DS-strategy}/inbox/feedback-log.md (reject-паттерны).\n  - Отчёт со финальным status (applied / partially-applied / rejected / deferred).\n  - Коммит в PACK-* (при accept).\n</code></pre>\n<h2>Algorithm</h2>\n<h3>R15 = живой пилот, не агент (БЛОКИРУЮЩЕЕ, peer-session 2026-07-07-03)</h3>\n<blockquote>\n<p><strong>Инвариант:</strong> решение accept/reject/defer по каждому кандидату принимает человек, управляющий текущей сессией — не другой агент, не сам исполняющий скилл агент, не автоматически принятый вердикт R2 (экстрактора). Это не рекомендация — источник: <code>DP.ROLE.001</code> (держатель роли R15 — пользователь), <code>DP.SC.040</code> («финальное утверждение — за человеком... полная автоматизация не работает», со ссылкой на SOTA-провал automated rule generation, accuracy &lt;10%).</p>\n</blockquote>\n<p><strong>Запрещено:</strong></p>\n<ul>\n<li>Подменять решение пилота консенсусом двух агентов внутри пир-сессии (<code>peer-conversation</code>/<code>kimi-peer-writer</code>) — согласие Kimi и Claude между собой НЕ есть решение R15, независимо от качества их аргументации.</li>\n<li>Автоматически принимать вердикт R2 («Вердикт: accept» в отчёте) как решение R15 без факта вопроса живому пилоту — даже когда обоснование R2 выглядит убедительно.</li>\n<li>Присваивать агенту роль <code>R15-*</code> в <code>meta.yaml</code>/frontmatter сессии — роль R15 не переносится на агента ни при каких обстоятельствах.</li>\n</ul>\n<p><strong>Если apply-captures вызван внутри пир-сессии</strong> (оба участника — агенты): пир-сессия может готовить кандидатов, проверять дубли/семантику/размещение, спорить о деталях — но на этом шаге обязана остановиться и передать вопрос пилоту напрямую, в текущем интерактивном чате с ним (не через turn-файл диалога с другим агентом), прежде чем зафиксировать решение по любому кандидату.</p>\n<p><strong>Найдено при аудите (2026-07-07):</strong> минимум 4 исторические сессии (<code>2026-05-24-apply-captures-bulk-review</code>, <code>2026-06-11-02-ke-candidates-review-pack</code>, <code>2026-06-26-14-apply-captures-r15</code>, <code>2026-06-28-09-peer-apply-captures-dp</code>) зафиксировали решения по 90+ кандидатам целиком внутри диалога Kimi↔Claude, без единой реплики пилота. Полный разбор → <code>${IWE_GOVERNANCE_REPO:-DS-strategy}/inbox/bugs/bug-2026-07-07-r15-decisions-bypassed-pilot.md</code>.</p>\n<h3>Формат решения R15</h3>\n<p>Каждый кандидат — структурированное решение:</p>\n<pre><code>candidate_id: 3\ndecision: accept        # accept | reject | defer\ndecision_source: pilot   # ОБЯЗАТЕЛЬНО — единственное валидное значение. Заполняется только по факту прямого вопроса пилоту (см. блок выше).\n# --- при accept ---\nedits_needed: no        # yes | no\ntarget_path: PACK-digital-platform/pack/.../02-domain-entities/DP.D.NNN.md\n# --- при reject ---\nreason: \"дубликат PD.METHOD.006\"\npattern: \"проверять существующие METHOD перед предложением нового\"\n# --- при defer ---\nreason: \"ждёт ArchGate WP-245\"\ndefer_until: \"после WP-245 Ф22\"     # ОБЯЗАТЕЛЬНО — дата YYYY-MM-DD или событие\n</code></pre>\n<p><strong>Инвариант decision_source (peer-session 2026-07-07-03):</strong> <code>decision_source: pilot</code> — обязательное поле при ЛЮБОМ решении (accept/reject/defer). Отсутствует или указано иное значение → решение invalid, Шаг 5 (запись в Pack) обязан отказать и вернуть кандидата на Шаг 2.</p>\n<p><strong>Инвариант defer (peer-session 2026-05-31-22):</strong> <code>defer_until</code> — обязательное поле при <code>decision: defer</code>. Без него решение invalid. Reason: <code>deferred</code> без <code>defer_until</code> = masked cancel (см. <code>memory/lessons_defer_with_explicit_triggers.md</code>). Формат: дата <code>YYYY-MM-DD</code> ИЛИ привязка к событию («после WP-NNN Ф», «при следующем Week Close»).</p>\n<h3>Шаг 1. Найти pending-review отчёты</h3>\n<pre><code>find ~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}/inbox/extraction-reports -name \"*.md\" \\\n  -exec grep -l -E \"^status: (pending-review|deferred)\" {} \\; | sort\n</code></pre>\n<p>Если <code>$ARGUMENTS</code> задан путь — работать только с ним.\nЕсли отчётов нет → сообщить «Нет pending-review отчётов. Ничего делать не нужно.»</p>\n<h3>Шаг 2. Для каждого отчёта: показать кандидатов</h3>\n<p>Прочитать отчёт. Для каждого кандидата (frontmatter + тело) показать пилоту напрямую в текущем чате:</p>\n<ul>\n<li><code>id</code>, <code>type</code>, предложенный <code>target_path</code></li>\n<li>Первые 15-20 строк текста (без служебного frontmatter)</li>\n<li>Флаг <code>edits_needed</code> из отчёта (если проставлен R2)</li>\n</ul>\n<p>Запросить решение R15 у пилота — реальным вопросом в текущей интерактивной сессии (<code>AskUserQuestion</code> при работе через Claude Code, обычное сообщение в чате при другом интерфейсе). Один вопрос = один кандидат, ЛИБО (при большом количестве однотипных пред-одобренных R2 кандидатов) одна сводка на весь отчёт с явным перечислением каждого — пилот подтверждает/отклоняет по номерам. В любом случае ответ должен исходить от пилота, не быть выведен агентом из контекста разговора с другим агентом.</p>\n<h3>Шаг 3. Accept — редактура (conditional)</h3>\n<p>Если <code>edits_needed: yes</code> → предложить отредактировать текст совместно с пользователем.\nЕсли <code>edits_needed: no</code> → использовать текст as-is из отчёта.</p>\n<h3>Шаг 4 (= ВДВ шаг 6.5). Валидация Pack-сущности</h3>\n<p>Перед записью проверить три условия:</p>\n<h3>4а. Frontmatter по шаблону Pack</h3>\n<p>Обязательные поля (для большинства Pack-сущностей):</p>\n<ul>\n<li><code>id:</code> — присутствует и соответствует типу (DP.D.NNN, PD.METHOD.NNN и т.д.)</li>\n<li><code>type:</code> — присутствует</li>\n<li><code>status:</code> — присутствует (обычно <code>draft</code> или <code>active</code>)</li>\n<li><code>created:</code> — присутствует</li>\n</ul>\n<p>Источник шаблонов: <code>DP.ROLE.033</code> и соседние сущности целевой директории.</p>\n<p><strong>4а.1. Метод-специфичная проверка (WP-448 Ф12, decision Б):</strong> если <code>target_path</code> → <code>03-methods/</code> (кандидат <code>*.M.NNN</code>/<code>*.METHOD.NNN</code>) — текст кандидата обязан содержать заполненные <code>## Forces</code> (≥1 полюс↔полюс, не плейсхолдер) и <code>## Bias-Annotation</code> (≥1 названное смещение+направление, не плейсхолдер). Не основание для reject — вернуть на Шаг 3 (<code>edits_needed: yes</code>) для дозаполнения R4, затем повторить проверку. Действует только для новых карточек этого пайплайна, не для миграции backlog.</p>\n<h3>4б. Уникальность ID</h3>\n<pre><code>grep -r \"^id: &lt;ID&gt;\" ~/IWE/PACK-* | head -5\n</code></pre>\n<p>Если совпадение найдено → вернуть R15 на reject: паттерн <code>«ID уже занят: &lt;путь&gt;»</code>.</p>\n<h3>4в-0. Фасетный классификатор (WP-429 Ф6.4)</h3>\n<blockquote>\n<p><strong>Когда применяется:</strong> до Шага 4в, для кандидатов, у которых <code>target_path</code> не задан R2 однозначно (домен/полка неочевидны) — либо всегда как проверка предложенного R2 пути. Пропустить, если R2 уже дал <code>target_path</code>, совпадающий с производной полкой Шага 4в ниже.</p>\n</blockquote>\n<p>Четыре явных вопроса R15 (или самопроверка агента перед вопросом пилоту, если ответ выводим детерминированно):</p>\n<ol>\n<li><strong>Уровень FPF.</strong> Base (ZP/FP/SP) / Pack (доменное знание) / DS (реализация) / LPF (личное)? Определяет репо-класс.</li>\n<li><strong>Артефактная роль.</strong> AR (правило) / DRR (решение) / lesson (занятие) / protocol (ритуал) / service-clause (обещание) / доменная сущность (D/METHOD/ROLE/FM/SOTA/…)? Определяет kind-код.</li>\n<li><strong>Домен.</strong> Какой Pack? Использовать тот же вызов <code>knowledge_search</code>, что и Шаг 0 выше (intra-batch) / kNN-подсказка домена: <code>knowledge_search(query=&lt;name&gt;+&lt;первые 400 символов текста&gt;, limit=5)</code> → агрегировать репо соседей. <strong>Confidence band обязателен</strong> (weak/moderate/strong/none — калибровка на реальном golden-set дала repo-level precision ~75%, ниже 80%; это advisory tie-breaker, не финальный ответ): при <code>weak</code>/<code>none</code> — спросить R15 напрямую, не решать за него.</li>\n<li><strong>Полка.</strong> Производная (1)+(2)+(3) по <code>routing.yaml</code> целевого Pack — см. Шаг 4в ниже, не отдельное суждение.</li>\n</ol>\n<p>Результат — предложенный <code>target_path</code>, который Шаг 4в валидирует машинно.</p>\n<h3>4в. Расположение файла</h3>\n<p><strong>SoT — <code>routing.yaml</code> целевого Pack</strong> (WP-429 Ф6.1): <code>&lt;PACK-repo&gt;/pack/&lt;domain&gt;/routing.yaml</code> → <code>kinds.&lt;KIND&gt;.dir</code> даёт каноническую директорию для kind-кода кандидата (<code>DP.D</code>, <code>PD.METHOD</code>, <code>VR.M</code> и т.д.). Прочитать файл, найти секцию по префиксу ID кандидата:</p>\n<pre><code>grep -A3 \"^  &lt;KIND&gt;:\" ~/IWE/&lt;PACK-repo&gt;/pack/&lt;domain&gt;/routing.yaml\n</code></pre>\n<p><code>dir:</code> → каноническая директория. <code>id_pattern:</code> → проверить соответствие имени файла. <code>frontmatter_check:</code> (если не <code>null</code>) → соответствующее поле/значение должно быть в кандидате.</p>\n<p><strong>Fallback (Pack без <code>routing.yaml</code> ещё не покрыт контрактом):</strong> старое эвристическое правило —</p>\n<ul>\n<li><code>DP.D.*</code> → <code>.../02-domain-entities/</code></li>\n<li><code>DP.METHOD.*</code> → <code>.../03-methods/</code></li>\n<li><code>DP.ROLE.*</code> → <code>.../02-domain-entities/</code> или <code>.../roles/</code></li>\n<li><code>DP.SOTA.*</code> → <code>.../06-sota/</code></li>\n<li><code>PD.*</code> → аналогичная структура в <code>PACK-personal/</code> или другом Pack-репо домена</li>\n</ul>\n<p>При сомнении (оба пути) — проверить соседние файлы в целевой директории.</p>\n<p><strong>Результат валидации:</strong></p>\n<ul>\n<li><code>valid</code> → переходить к Шагу 4г</li>\n<li><code>invalid</code> + причина → reject этого кандидата, записать в feedback-log, продолжить следующий кандидат</li>\n</ul>\n<h3>4г. Семантическая проверка (содержательная непротиворечивость)</h3>\n<p><strong>Шаг 0 — pairwise intra-batch (WP-376 CC-120, решение пилота 2026-07-16, вариант А).</strong>\nИндекс/база Pack на момент проверки ещё не содержит соседей из ТЕКУЩЕГО отчёта — сравнение с базой (Шаг 1-2 ниже) слепо к дублям внутри одного батча кандидатов. Перед Шагом 1: для каждого кандидата отчёта с <code>decision: accept</code> сравнить его с остальными accept-кандидатами ТОГО ЖЕ типа (<code>DP.D.*</code> vs <code>DP.D.*</code>, <code>PD.METHOD.*</code> vs <code>PD.METHOD.*</code> и т.д.) из этого же отчёта:</p>\n<ul>\n<li>Сопоставить <code>name</code>/<code>name_ru</code> + первые 3 предложения тела каждой пары.</li>\n<li>Вердикт по паре: <code>duplicate | related | unrelated</code> (шкала как в Шаге 2 ниже).</li>\n<li><code>duplicate</code> → предупредить R15: «кандидаты </li>\n</ul>\n<p>Перед записью проверить содержательную совместимость кандидата с соседними Pack-сущностями того же типа:</p>\n<p><strong>Шаг 1 — прочитать ±5 соседних ID</strong> того же типа в целевой директории:</p>\n<pre><code>ls &lt;target_dir&gt;/ | sort | grep -A5 -B5 \"&lt;ID-slug&gt;\"\n</code></pre>\n<p>Для каждого соседнего файла: прочитать <code>summary:</code> или первые 3 строки тела — проверить на пересечение.</p>\n<p><strong>Шаг 2 — grep ключевых существительных</strong>. Взять 2-3 ключевых существительных из имени кандидата. Искать в целевом Pack-репо:</p>\n<pre><code>grep -ri \"&lt;ключевое_слово&gt;\" ~/IWE/&lt;PACK-repo&gt;/pack/ --include=\"*.md\" -l | head -10\n</code></pre>\n<p>Если найдено совпадение: прочитать файл. Проверить:</p>\n<ul>\n<li><strong>Перекрытие</strong>: кандидат описывает то же самое другими словами → reject (дубликат), паттерн для R2.</li>\n<li><strong>Противоречие</strong>: кандидат утверждает обратное существующему → выяснить, какой новее/точнее; если новый кандидат вытесняет старый — accept + пометить в отчёте <code>supersedes: &lt;ID&gt;</code>.</li>\n<li><strong>Уточнение</strong>: кандидат добавляет деталь без конфликта → accept, добавить <code>see_also: [&lt;ID&gt;]</code> в frontmatter.</li>\n</ul>\n<p><strong>Результат 4г:</strong></p>\n<ul>\n<li><code>clear</code> → переходить к Шагу 4д</li>\n<li><code>overlap</code> → reject; паттерн + ссылка на существующий ID в feedback-log</li>\n<li><code>contradiction</code> → выявить новейший; при accept добавить <code>supersedes:</code></li>\n<li><code>refinement</code> → accept + <code>see_also:</code> в frontmatter кандидата</li>\n<li><code>intra-batch duplicate</code> (Шаг 0) → решение R15 по паре; выживший кандидат продолжает с Шага 1</li>\n</ul>\n<h3>4д. Semantic Gate — WP-429 Контур A (write-time soft gate)</h3>\n<blockquote>\n<p><strong>Когда применяется:</strong> кандидат с <code>decision: accept</code> и тип <code>DP.*</code> (DP.D.<em>, DP.ROLE.</em>, DP.SC.<em>, DP.METHOD.</em>) или <code>PD.*</code> в <code>PACK-digital-platform</code> или <code>PACK-personal</code>.\n<strong>Soft gate:</strong> не блокирует — информирует R15. R15 принимает финальное решение.\n<strong>Когда пропускается:</strong> <code>decision: reject</code> / <code>defer</code>, или тип не Pack-сущность (скрипт, шаблон, docs).</p>\n</blockquote>\n<p><strong>Шаг 1 — семантический поиск соседей</strong> (inline, без внешнего скрипта):</p>\n<p>Вызвать MCP-инструмент <code>knowledge_search</code> с текстом кандидата:</p>\n<pre><code>knowledge_search(query=&lt;первые 400 символов текста кандидата&gt;, limit=5)\n</code></pre>\n<p>Отфильтровать из результатов: только сущности с ID типа <code>DP.*</code> или <code>PD.*</code> (game концепты, не гайды).\nВзять top-3 с наибольшей близостью.</p>\n<p><strong>Шаг 2 — inline LLM-оценка</strong> каждой пары (кандидат × сосед):</p>\n<p>Для каждого из top-3 соседей вынести суждение:</p>\n<ul>\n<li>Кандидат: <code>&lt;name&gt; — &lt;первые 500 символов текста&gt;</code></li>\n<li>Сосед: <code>&lt;neighbor_id&gt; «&lt;neighbor_name&gt;» — &lt;первые 500 символов&gt;</code></li>\n<li>Вердикт: <code>duplicate | contradiction | related | unrelated</code></li>\n</ul>\n<p>Критерии (из detector.py):</p>\n<ul>\n<li><code>duplicate</code> — оба описывают то же понятие с тем же смыслом; держать оба = путаница</li>\n<li><code>contradiction</code> — несовместимые утверждения об одном понятии</li>\n<li><code>related</code> — связаны, но явно различны; конфликта нет</li>\n<li><code>unrelated</code> — разные темы</li>\n</ul>\n<p><strong>Шаг 3 — результат gate:</strong></p>\n<table>\n<thead>\n<tr>\n<th>Вердикт</th>\n<th>Действие</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Все <code>related</code>/<code>unrelated</code></td>\n<td><code>clear</code> → перейти к Шагу 5</td>\n</tr>\n<tr>\n<td>Найден <code>duplicate</code></td>\n<td>Предупредить R15 (формат ниже)</td>\n</tr>\n<tr>\n<td>Найдено <code>contradiction</code></td>\n<td>Предупредить R15 (формат ниже)</td>\n</tr>\n<tr>\n<td><code>partial</code></td>\n<td>Предупредить R15 «судья недоступен, ручная проверка или повтор»</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Формат предупреждения R15:</strong></p>\n<pre><code>⚠️  Semantic Gate (WP-429 Контур A): возможный &lt;дубль/противоречие&gt;\nКандидат: &lt;id/name&gt;\nКонфликт с: &lt;neighbor_id&gt; «&lt;neighbor_name&gt;»\nОценка: &lt;verdict&gt; (уверенность ~&lt;confidence&gt;%)\nПричина: &lt;reasoning&gt;\n\nВарианты:\n  А. Reject кандидата → паттерн в feedback-log: «дубль &lt;neighbor_id&gt;»\n  Б. Accept как уточнение → добавить `see_also: [&lt;neighbor_id&gt;]` в frontmatter\n  В. Accept как замена → добавить `supersedes: &lt;neighbor_id&gt;` + пометить старый как superseded\nR15 выбирает вариант:\n</code></pre>\n<p>Дождаться ответа R15. Обновить <code>decision</code> и frontmatter кандидата согласно выбору.</p>\n<p><strong>Если <code>knowledge_search</code> недоступен</strong> (MCP offline, ошибка сети):</p>\n<ul>\n<li>Пометить в отчёте: <code>semantic_gate: skipped (MCP unavailable)</code></li>\n<li>Перейти к Шагу 5 без блокировки.</li>\n</ul>\n<p><strong>CLI-эквивалент</strong> (для batch/автоматизации):</p>\n<pre><code>cd ~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}\nOPENROUTER_API_KEY=\"sk-or-v1-...\" WP429_DB_ID=3 WP429_TABLE=concept_graph.concepts \\\n  python3 inbox/WP-429/f2-poc/detector.py --check-candidate \\\n    --name \"&lt;имя кандидата&gt;\" \\\n    --text \"&lt;текст кандидата&gt;\"\n</code></pre>\n<h3>Шаг 5. Запись в Pack и коммит</h3>\n<p><strong>Gate перед записью (БЛОКИРУЮЩЕЕ):</strong> проверить, что решение кандидата имеет <code>decision_source: pilot</code>. Нет поля или значение иное → СТОП, вернуться к Шагу 2 и получить решение от пилота напрямую. Записывать в Pack можно только решения с подтверждённым <code>decision_source: pilot</code>.</p>\n<h3>5а. Записать файл</h3>\n<pre><code>Write target_path (из решения R15) ← текст кандидата (после редактуры если была)\n</code></pre>\n<h3>5б. Обновить MAP (если есть)</h3>\n<p>Pack-реестры обычно в:</p>\n<ul>\n<li><code>PACK-digital-platform/pack/.../MAP.md</code></li>\n<li><code>hard-distinctions.md</code> — при добавлении DP.D.*</li>\n</ul>\n<p>Проверить, есть ли MAP в целевой директории. Добавить строку.</p>\n<h3>5в. Записать в feedback-log (при reject)</h3>\n<p>Файл: <code>${IWE_GOVERNANCE_REPO:-DS-strategy}/inbox/feedback-log.md</code> (создать если нет).\nФормат записи:</p>\n<pre><code>## &lt;дата&gt; — reject кандидата &lt;id&gt; из отчёта &lt;filename&gt;\n**Причина:** &lt;reason&gt;\n**Паттерн (для R2):** &lt;pattern&gt;\n</code></pre>\n<h3>5г. Коммит</h3>\n<pre><code>git add &lt;target_path&gt; [MAP если был] &amp;&amp; git commit -m \"feat(KE apply): &lt;id&gt; — &lt;краткое название&gt;\" -- &lt;target_path&gt; [MAP если был]\n</code></pre>\n<p>Репо для коммита: то же, что <code>target_path</code> (PACK-digital-platform, PACK-personal и т.д.)</p>\n<h3>Шаг 6. Обновить status отчёта</h3>\n<p>Правила:</p>\n<ul>\n<li>Все кандидаты resolved (accept/reject/defer) → <code>applied</code> если ≥1 applied, иначе <code>rejected</code> если все reject, <code>deferred</code> если есть defer без applied.</li>\n<li>Часть кандидатов pending → <code>partially-applied</code>.</li>\n<li><strong>Validation gate (peer-session 2026-05-31-22):</strong> если хотя бы один кандидат имеет <code>decision: defer</code> без поля <code>defer_until</code> — отчёт НЕ может получить финальный статус <code>deferred</code>. Остаётся <code>partially-applied</code>. В тело отчёта добавить блок <code>## Unresolved candidates</code> со списком <code>candidate_id</code> + причиной (отсутствует <code>defer_until</code>). Следующий <code>/apply-captures</code>-запуск начинает с unresolved-блока. Это закрывает дыру «masked cancel» — отложенные кандидаты без триггера возврата.</li>\n</ul>\n<p>Обновить <code>status:</code> в frontmatter отчёта и сохранить файл.</p>\n<h3>Шаг 7. Итоговый отчёт</h3>\n<p>Вывести сводку:</p>\n<pre><code>Отчёт: &lt;filename&gt;\n  Кандидатов всего: N\n  Accept: N_a (записано в Pack)\n  Reject: N_r (паттерны в feedback-log)\n  Defer: N_d\n  Статус отчёта: applied / partially-applied / rejected / deferred\n</code></pre>\n<h2>Appendix</h2>\n<h3>Состояния отчёта (справка)</h3>\n<table>\n<thead>\n<tr>\n<th>Статус</th>\n<th>Очистка Session-Prep</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>pending-review</code></td>\n<td>Не трогать</td>\n</tr>\n<tr>\n<td><code>partially-applied</code></td>\n<td>Не трогать</td>\n</tr>\n<tr>\n<td><code>deferred</code></td>\n<td>Не трогать</td>\n</tr>\n<tr>\n<td><code>applied</code></td>\n<td>Удалять через 7 дней</td>\n</tr>\n<tr>\n<td><code>rejected</code></td>\n<td>Удалять через 7 дней</td>\n</tr>\n<tr>\n<td><code>no-pending</code></td>\n<td>Удалять через 7 дней</td>\n</tr>\n</tbody>\n</table>\n<h3>Интеграция в рабочий процесс</h3>\n<p><strong>DayPlan (ежедневный обзор):</strong> Шаблон DayPlan содержит секцию «Наработки ИИ → Экстрактор» с обзором:</p>\n<ul>\n<li>N pending-review отчётов</li>\n<li>Дата самого старого отчёта</li>\n<li>SLA-статус (✅ в норме / ⚠️ истёк)</li>\n<li>Напоминание: разбор в отдельной сессии <code>/apply-captures</code></li>\n</ul>\n<p><strong>Close Gate:</strong> <code>extensions/protocol-close.checks.md</code> — при N &gt; 0 pending-review выдаёт предупреждение ⚠️ и SLA-напоминание (DP.SC.004 §Hard gate). Soft gate — не блокирует Close, но требует решения ≤24ч.</p>\n<p><strong>Полный цикл:</strong></p>\n<ol>\n<li>Cron / <code>extractor.sh</code> → создаёт <code>extraction-reports/*.md</code> (status: <code>pending-review</code>)</li>\n<li>Day Open → секция «Наработки ИИ → Экстрактор» в DayPlan показывает N ожидающих</li>\n<li>Close → <code>protocol-close.checks.md</code> напоминает о SLA</li>\n<li>Пользователь запускает <code>/apply-captures</code> в отдельной сессии → R15 разбор → запись в Pack</li>\n</ol>\n\n\n","files":[{"path":"SKILL.md","sizeBytes":36158,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-13T07:21:33.310658Z","sha256":"F8C7E83B5C914941D29608F9BDE2BC70F920D21166BDBA56123A3FDEF0E5DE0F","sizeBytes":12300},"review":null,"source":{"repositoryUrl":"https://github.com/TserenTserenov/FMT-exocortex-template","path":".claude/skills/apply-captures","license":"MIT","commit":"4d7b8f2e95161240a02a028ae5a8b9d2914b7939","subtreeSha":"E199AD3B80AF30FCD9344ECFE9B2CA5DD6CCFC6EC4E044DCD1E9C3227BA3A098","lastSyncedAt":"2026-09-25T07:36:52.516704Z"},"reviewedAt":"2026-09-13T07:21:52.547949Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/TserenTserenov/FMT-exocortex-template/tree/main/.claude/skills/apply-captures"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install tserentserenov-fmt-exocortex-template@llmmart"},{"target":"git","command":"git clone https://github.com/TserenTserenov/FMT-exocortex-template.git"}]}