---
name: issue-match
description: >
  Measure a TARGET repository's queue + find a LIVE door (an open issue matching our artifact)
  BEFORE pushing a PR there. Trigger on "/issue-match", "is this repo worth a PR", "measure the
  queue", "find a live issue". Answers "knock here or skip": how many open PRs, how many of the
  last N closed ones were actually merged, and which open issue our contribution would close. A
  cold PR into a dead queue is a wasted artifact.
license: MIT
---

# /issue-match — стучаться сюда или мимо?

> 🧒 В конце отчёта Антону — блок «Простыми словами» ([[eli5-always]]).

Правило Антона от 25.07.2026 ([[cold-pr-into-silent-queue]]): **холодный PR в глухую очередь = не вклад, а шум.** Замер очереди — первый шаг, ДО написания кода. Этот скилл делает замер кнопкой вместо ручного дёрганья `gh` в каждой сессии.

Замерено 25.07 в `anthropics/claude-cookbooks`: 220 открытых PR, медиана возраста 47 дней, 51% без единого комментария, 67% мержей — в сутки после подачи (значит договорённость была ДО PR). Наших там 6 открытых, 5 холодных, **смержено 0**. Единственный, на который отреагировал человек, — тот, что вошёл через чужое открытое issue.

## Как гонять

```bash
python "$USERPROFILE/.claude/scripts/issue_match.py" anthropics/claude-cookbooks --artifact "search agent, adversarial verify"
```

| Команда | Что делает |
|---|---|
| `<owner/repo>` | замер одного репо |
| `--artifact "kw1, kw2"` | **главный параметр** — ключевые слова нашего артефакта, по ним ищется дверь |
| `--all` | веер по всем репо из конфига (~5 с на репо; 14 репо ≈ 70 с) |
| `--init` | собрать конфиг из НАШЕЙ истории PR (`gh` сам находит, куда мы подавали) |
| `--live-days N` | issue считается живым, если обновлялся за N дней (дефолт 30) |
| `--json` | машинный вывод |
| `--no-draft` | без черновика входа |

Конфиг: `~/.claude/issue_match.json`. Exit: `0` замер сделан · `2` кривые аргументы · `4` `gh` недоступен или все заборы упали.

## Что читать в выводе

1. **ОЧЕРЕДЬ** — открытых PR (точный счёт, не обрезанный лимитом), медиана возраста (при выборке — это **оценка снизу**, настоящая выше), доля без комментариев, паттерн мержей. Если «в день подачи» ≥60% — это не «быстро мёржат», это **преддоговорённость**; холодный PR такой ритм не повторит. Смотри **«разовых авторов»**: если среди мержей нет ни одного разового, репо мержит только своих и здоровая медиана чужаку ничего не обещает.
2. **МЫ ТАМ** — сколько наших PR лежит и сколько из них без реакции. Много холодных = сперва греть их, а не плодить новые.
3. **ДВЕРИ** — живые чужие issue с совпадением по ключевым словам. Наши собственные issue считаются отдельно: **своя дверь не приглашение**.
4. **ВЕРДИКТ** — 🟢 входим через issue · 🟡 открываем своё issue и ждём · 🔴 не пушим · ⚪ **не замерено** (забор issue упал или дверь могла остаться за выборкой) — на таких данных решение не принимаем, гоним замер заново. Молчание забора — не ответ.

⚠️ Без `--artifact` вердикт 🟢 **не выдаётся намеренно**: совпадение не проверялось, а свежее issue само по себе ещё не наша дверь. Широкие слова («agent», «memory») дают 🟢 почти везде — это честный шум, а не находка; сужай до сути артефакта и смотри строку `← совпало:`.

## Границы

- **READ-ONLY.** Скилл ничего не отправляет. Комментарий в чужой тред и PR = исходящее наружу → отправляет человек (или я по мандату [[ship-github-no-plus-wait]], но с подписью и после гейта качества).
- Матчинг — по словам в заголовке, метках и теле issue. Это грубый фильтр, а не понимание; финальное «наш это тред или нет» решает человек, глядя на список.
- Медиана возраста при >100 открытых PR считается по новейшим → занижена. В отчёте помечено.
- **Живость issue** = человеческая активность (последний комментарий ЖИВОГО человека либо открытие issue человеком), а не `updatedAt`: тот дёргают лейблы и боты, и «bump» от Dependabot/stale выглядел бы как живая дверь. Комментарии ботов считаются отдельно и в живость не идут.
- **Где совпало — важно.** Совпадение в заголовке или метке = по теме; одно общее слово в теле (`auth`, `fix`, `token`) = скорее коллизия, и 🟢 за него не даётся (нужно либо попадание в заголовок/метку, либо ≥2 слова в теле). Строка `← совпало` показывает, где именно.
- **Медиана мержей глобальная** по репо: она смешивает все типы PR (правка опечатки и новый рецепт) и не показывает очередь конкретного направления. Ориентир, не приговор — если наш артефакт узкой темы, смотри руками, как двигались PR именно этой темы. (Замечание внешнего ревьюера Codex, 27.07; чинить фильтром по путям = усложнение, пока не берём.)
- Подпись коммитов/PR проверяй ДО отправки ([[signature-is-part-of-the-work]]) — 16 из 20 PR ушли подписанные пустым аккаунтом.

## Дальше по конвейеру

🟢 → комментарий в тред → ответ мейнтейнера → PR со ссылкой на issue → `pr_watch.py` сторожит реакцию → бамп по расписанию.
🔴 → в этот репо не пушим; уже лежащие холодные PR **греем** (привязать каждый к issue, которому он отвечает), а не добавляем девятый.
