Turn a fix you made for a whole class of bugs into help for others: reverse-search GitHub for people hitting the same symptom, pick the 3-5 best live threads and post one tailored answer or gist each, no copy-paste fan-out. Use after a verified class fix. Triggers: /share-fix, /sf, share the fix.
Installs into .claude/skills of the current project.
Are you the author of Share Fix?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/tonydzi-share-fix)
---
name: share-fix
description: "Turn a fix you made for a whole class of bugs into help for others: reverse-search GitHub for people hitting the same symptom, pick the 3-5 best live threads and post one tailored answer or gist each, no copy-paste fan-out. Use after a verified class fix. Triggers: /share-fix, /sf, share the fix."
license: MIT
version: 1.0.0
---
# /share-fix — 🌍 починил у себя → сразу раздай миру
**Канон:** Библия `reglament-pochinil-u-sebya-srazu-razday-miru` + память `fixed-it-share-it-with-the-world` + CLAUDE.md §4.7. Логика Антона: в момент починки у нас в руках лучший поисковый ключ на свете — дословный симптом; никакой «робот-сканер всего GitHub» не сравнится с реверс-поиском того, кто только что дебажил. Поэтому раздача = ритуал в момент фикса, не фоновый сканер.
## Шаг 0-бис — источник кандидатов: очередь (anton 01.09)
Кроме «только что починил в руках», кандидаты приходят из очереди `$OBSIDIAN_VAULT/_outreach/share_fix_queue.jsonl` — её наполняет `/retro` Step 4🌍 (судья), а раздаёт ночная рутина `share-fix-daily` (хаб, ≤3 pending за прогон, полный ритуал ниже на каждого; после раздачи строка кандидата дополняется `status:done`+`threads`). Формат строки: `added·from·artifact·queries[дословные симптом-запросы]·numbers·status`.
⛔ **ТЕРМИНАЛЬНЫХ СТАТУСОВ ЧЕТЫРЕ, НЕ ОДИН** (08.09.2026, 3-й датированный случай `share-fix-selector-drift-task-vs-engine`): раздача закрывает строку не только как `done` — ⚪ пусто кладётся как `dry`, ⛔ непереносимо как `skip` (`VALID_STATUS` движка). Селектор «`status != done`» поэтому поднимает УЖЕ отработанные строки: замер 08.09 — 40 «не-done», из них 17 закрыты вердиктом, и первые три FIFO были ровно такими. Открытая строка = статус НЕ в {done, dry, skip} И без даты `done` (строка вовсе без поля `status`, как писал casebook-drip, тоже открытая — наивный `== pending` её теряет).
⛔ **ПРИПАРКОВАННУЮ СТРОКУ НЕ БЕРЁМ** (замер 07.09, 1-й датированный случай `ochered-ne-uvazhaet-pole-parkovki-revisit`): строка может нести `revisit: <дата>` — это парковка до урожая, а не обычный `pending`, и ни текст рутины, ни `share_fix_queue.py` её не отличают. Перед взятием кандидата: `revisit` в будущем ⇒ **пропустить, статус не трогать**, взять следующий FIFO. Иначе в мир уезжают недоказанные числа (07.09 так чуть не ушёл A/B с n=1 за сутки до урожая). Популяцию очереди читай прибором (`share_fix_queue.py status`), а не числом из текста задачи — оно стареет молча (класс `share-fix-selector-drift-task-vs-engine`, 2 случая).
## Шаг 0 — порог (2 булевых, оба ДА, иначе честный ⛔)
1. **Переносимость:** чужой человек может воспроизвести наш симптом БЕЗ наших внутренностей (наших скриптов, нашей инфры, наших аккаунтов)? Одноразовый глюк самоделки миру не нужен.
2. **Чистота:** в раздаваемом нет секретов/приватного/внутренних имён (аккаунты, задачи, пути с личным)? Скрипт для мира = НОВЫЙ чистый файл на английском, не внутренняя кнопка. Леак-скан глазами обязателен.
## Шаг 0-бис — САМОЕ ПЕРВОЕ: СВОЙ СОБСТВЕННЫЙ ТИКЕТ, в котором мы уже заявили дефект (замер 23.09.2026)
Раньше, чем своя сеть репо, и намного раньше чужих тредов, стоит вопрос: **мы сами где-то публично утверждали этот дефект?** Если да, то там уже сидят люди с ровно этой болью, они пришли по своей воле, и наш артефакт обязан лежать ПОД нашим же утверждением. Утверждение о дефекте без своего детерминированного repro недоделано.
Это НЕ раздача по чужим тредам (та измерена мёртвой: 3 коммента, 19 суток, 0 переходов) — это завершение своей собственной заявки, и оно бесплатно и постоянно.
```
gh api repos/<owner>/<repo>/issues/<N> --jq '.body' | grep -c <artifact-slug>
gh api repos/<owner>/<repo>/issues/<N>/comments --paginate --jq '[.[]|select(.body|test("<artifact-slug>"))]|length'
```
⚠️ **`--paginate` ОБЯЗАТЕЛЕН**: без него `gh` отдаёт первые 30 комментов и печатает уверенный **0** на длинном треде. 23.09 именно так проверка «стоит ли наша ссылка» соврала на треде с 51 комментом.
ЗАМЕР, ПОРОДИВШИЙ ШАГ (23.09.2026, `casebook-drip-daily`): у публичного касбука были 48/48 внутренних ссылок, строка в витрине, посадочная страница с запускаемой командой и два поста в FB — а **шесть наших собственных upstream-заявок за 19 суток не ссылались на него ни разу, ни в теле, ни в комментах**. Среди них наш же тикет про ту самую поломку, у которой в касбуке лежит готовый repro, и чужой тред с 51 комментом, где мы стояли с 24.08. Сначала закрой это, потом трать время на поиск незнакомцев. Границы: **закрытый** тикет и мелкие треды (<7 комментов, 0 реакций) не трогаем — там аудитории нет, и это повторение мёртвой тактики.
## Шаг 0-тер — ПОТОМ СВОЯ СЕТЬ РЕПО, и только затем чужие треды (замер 14.09.2026)
Раздача наружу стоит времени и живёт один день; ссылка внутри нашей же сети бесплатна и стоит вечно. Поэтому до реверс-поиска проверь, ссылаются ли на артефакт НАШИ репо:
```bash
python ~/.claude/scripts/ecosystem_footer.py # сухой прогон: у кого нет блока карты
```
Блок «🧩 One piece of a working system» с соседями по слою пишет `ecosystem_footer.py` по карте `LAYERS`. Репо, которого в карте НЕТ, невидимо внутри собственной сети: ни футера у него, ни упоминания у остальных. Нет в карте → допиши слой (`governance` · `memory` · `gates` · `fleet` · `connectors` · `in public`) и прогони `--apply`, прогнав перед этим `_test_ecosystem_footer.py`.
⛔ **ТЕСТ КРАСНЫЙ → `--apply` НЕ ЗВАТЬ** (замер 21.09.2026, share-fix-daily): сухой прогон просил блок в 25 публичных README, а `_test_ecosystem_footer.py` был красным на 2 проверках (5d безымянных 3, 5e касбука нет в карте). Раскатка 25 публичных репо с красного движка = отказ по общей причине (§7.3-бис канарейка), и починка 14.09 класс не закрыла. На красном: строка в журнал классов (`selfheal.py journal --class ecosystem-footer-map-leaves-repos-unnamed`), вердикт ⚪ по шагу 0-тер, дальше по своему классу. Разовая проверка одного репо — `--repo NAME`, она канарейка и разрешена.
⭐ **СПЕРВА ОЦЕНИ СТОИМОСТЬ ПОЧИНКИ ДВИЖКА, ПОТОМ ЖУРНАЛЬ** (замер 23.09.2026, [машина флота]): строка в журнал — это про класс, который дорого чинить сейчас; она не индульгенция на то, чтобы обходить красный тест бесконечно. 23.09 движок стоял красным ТРЕТИЙ прогон подряд (21.09, 23.09 хаб, 23.09 [машина флота]), а починка заняла две правки: круговой выбор соседей вместо плоского `[:3]` + касбук в карту `LAYERS`. Правило: красный тест → посмотри, что именно он краснит; починка в пределах одной функции и одного словаря делается В ТОМ ЖЕ заходе (канарейка на одном репо → verify чтением README с GitHub → остальные), и только если корень дороже — журналь и ставь ⚪.
ПОЧЕМУ ЭТО ПЕРВЫМ. Касбук `agent-control-plane-casebook` раздавался наружу с 04.09: 3 коммента в живых чужих тредах, два тизера в наши TG-каналы. Через 10 суток — `views_14d=3`, `uniques=2`, `referrers` = только `l.facebook.com`, с github.com РОВНО НОЛЬ. Причина оказалась не в тредах и не в текстах: касбука не было в карте `LAYERS`, и ни один из 47 наших репо на него не ссылался — переходить было неоткуда. Побочно прибор назвал ещё 6 репо, которых не называл никто (`agent-runtime-integrity-bench`, `always-loaded-diet`, `claw-retro`, `cofounder`, `oss-publish`, `verified-ops-starter`): соседи брались плоским срезом `[:3]` по порядку словаря. Починено 14.09 круговым выбором.
Витрина `tonydzi/tonydzi` у генератора в `SKIP` — её правь отдельно через Contents API с трейлерами §4.9; раздел «🔨 What I'm building right now» и есть парадный вход.
## Шаг 1 — реверс-поиск по ДОСЛОВНОМУ симптому (2 минуты)
```bash
gh api -X GET search/issues -f q='<ключевые слова> in:title updated:>ГГГГ-ММ-ДД' -f per_page=10 \
--jq '.items[] | "\(.state[:1]) \(.updated_at[:10]) c\(.comments) \(.html_url) | \(.title[:90])"'
```
⛔ **`gh search issues "<много слов>"` ОДНИМ аргументом = ЛОЖНЫЙ НОЛЬ** (замер 14.09.2026, [машина флота]): gh оборачивает всю строку в кавычки как фразу (в URL `%5C%22`), 13 запросов подряд дали пусто, те же слова через `gh api search/issues` — живые треды. Сортировка `updated` топит релевантное в бот-шуме — без `--sort` (по релевантности) + `in:title`. Между запросами `sleep 8`, иначе secondary rate limit 403.
Пробуй 2-3 формулировки (код ошибки `0x…`, статус `Modified, NeedsRemediation`, фраза из диалога). Пусто везде → вердикт ⚪ с названным запросом, конец.
⛔ **`state:open` В КАЖДЫЙ ЗАПРОС** (замер 19.09.2026, [машина флота]): без него выдача уходит в архив — первый круг из 9 запросов дал 13 попаданий, из которых ЖИВОЕ было ровно одно, остальные `closed` за 2025-2026. Шаг 2 требует ЖИВЫХ тредов, значит фильтр ставится на Шаге 1, а не глазами постфактум; цена промаха — лишний круг поиска и съеденная квота search (30/мин). Строка: `-f q='<слова> state:open'`.
⛔ **ГОЛОЕ ЧИСЛО В ЗАПРОСЕ = ЛОЖНЫЙ НОЛЬ** (замер 08.09.2026, 1-й датированный случай `gh-search-golye-chisla-chitayutsya-kak-nomer-issue`): `gh search issues "gemini cli valid license 3501"` возвращает issue **с номером 3501** из случайных репо (BusinessCentral, WordPress/Learn…), а не текстовый матч — выдача выглядит как честный поиск и читается как «фронт пуст». Так строка очереди 03.09 получила вердикт «пусто, 3 формулировки», а поиск ТОЧНОЙ ФРАЗОЙ `'"valid license of this product"'` в тот же вечер дал 4 живых треда, крупнейший на 45 комментов.
Правило: ищи **фразой в кавычках без чисел**, номер ошибки добавляй словами («error 3501» отдельным прогоном); длинная фраза из 6+ слов тоже отдаёт пусто — GitHub ANDит токены, дели на 1-3 ключевых слова + `--repo`.
✅ **ДОМЕН-ГЕЙТ: дверь жива.** (20.09.2026) `~/.claude/registry/github-universe/targets.json` на месте, `github_targets.py --top/--check` работают — цели берём из них, `domain_why` пишем в вердикт. Если прибор всё же выйдет exit 2 — применяй `domain.json` руками и НАЗОВИ это в вердикте; тихо считать «гейта нет» ⛔. Статус двери — сам по себе claim: проверяй `--top 5`, а не пересказывай чужой вердикт.
⛔ **`domain=off` ПО ПУСТОМУ ИЛИ МАРКЕТИНГОВОМУ ОПИСАНИЮ — НЕ ПРИГОВОР, НО ТРЕБУЕТ НАЗВАННОЙ ПРИЧИНЫ** (замер 21.09.2026, share-fix-daily, 1-й датированный случай `domain-gate-judges-repo-by-one-line-description`): `--check` судит по ОДНОСТРОЧНОМУ `description` репо, а у агентских рантаймов там пусто или маркетинг — в тот прогон гейт отбил `code-yeongyu/oh-my-openagent` (тред = дублирование spawn-сессий, ровно наш класс), `openclaw/openclaw` и `[человек]-lin/notebooklm-py` (19.4k★, гоняем в проде), оставив core только у `stripe/ai`, `claude-code`, `codex`.
Брать такую цель можно ТОЛЬКО когда сходятся три условия: описание пустое/маркетинговое · САМ ТРЕД лежит в одной из 12 ниш `github-niche-focus-block.md` · отвечаем ПРОГОНОМ из своей боевой практики, а не мнением. Причина пишется словами в вердикт очереди и в отчёт — «взято по названной причине: <ниша треда>». Лазерный фокус 07.09 этим НЕ ослабляется: мимо идут репо, где ниши нет и в самом треде.
## Шаг 2 — отобрать 3-5 ЛУЧШИХ живых тредов (anton капсом: «ТРИ - ПЯТЬ, не 1-2»)
Критерии лучшего: живой (человеческая активность, не бот-бампы) · наш симптом там воспроизведён (не однословная коллизия) · есть кому помочь (страдальцы без решения). Дедуп: проверь, нет ли нас (tonydzi) уже в треде. Перекрёстно-связанные треды одного класса сверх 5 — НЕ слать: 7-й одинаковый коммент = веер. Ужимание до 1-2 «чтобы не отсвечивать» — нарушение §1.5 точно так же.
## Шаг 3 — раздать: каждый коммент ЗАТОЧЕН под тред
⭐ ЧЕМ ПОДАВАТЬ (замер 05.09): тред — PR и касание ПЕРВОЕ → только `gh pr review <N> -R <owner/repo> --comment --body-file <файл>`. `gh pr comment` не создаёт объект Review, работа не видна ни в графе вкладов, ни в фильтре `reviewed-by:tonydzi`, которым нас ищут (в чужих PR за 30 дн: 127 комментов против 7 ревью = 5.2% видимых). ⛔ ГРАНИЦА: у ISSUE ревью НЕ СУЩЕСТВУЕТ — там `gh issue comment`, и это большинство раздач; реплика в идущем PR-диалоге — тоже коммент. В вердикте называть, чем подано. Канон: Библия `reglament-v-chuzhom-pr-pishem-revyu-a-ne-kommentariy` + файл-константа `$OBSIDIAN_VAULT/08-Templates/github-review-not-comment.md`.
- ⭐ ПЕРЕД созданием gist/repo — прогони `/pack` (декрет 24.08: наружу выходит ПРОДУКТ, не сниппет: README по скелету, `--selftest`, дружелюбные комментарии, гейт публикации). Вердикт /pack «не дотянул» = сперва дотянуть, потом раздавать.
- Раскрытие Майкрофта первой строкой (§3.3), дальше — по существу ИХ улик: что у них в треде уже есть и как наша находка это дополняет/объясняет. Копипаста-веер ⛔.
- ⭐ ПОДПИСЬ-CTA ПОСЛЕДНЕЙ СТРОКОЙ — ОБЯЗАТЕЛЬНА (anton 10.09, голосом; замер: 94% комментов без ссылки на нас → «ответившие × звёзды» = 0). Одна строка со ссылкой `github.com/tonydzi`, формулировку варьировать; gist/README = полный блок. Единый источник: `$OBSIDIAN_VAULT/08-Templates/github-touch-signature.md`. Проверка перед отправкой: последняя строка тела несёт `github.com/tonydzi`? Нет → не отправляем. Канон: память `cta-signature-every-github-touch`; сторож `cta_signature_watch.py`.
- ⚠️ ТЕЛО КОММЕНТА БЕЗ BOM: файл под `-F body=@file` пиши только UTF-8 **без BOM** (python `open(...,encoding='utf-8')` / `Set-Content -Encoding utf8NoBOM`); PowerShell `Out-File`/`>` на этой машине ставит BOM по умолчанию, и `U+FEFF` уезжает ПЕРВЫМ символом публичного коммента — прямо перед раскрытием Майкрофта. Замер 01.09.2026: так ушли все 7 тредов ночной раздачи, чинено правкой постфактум. Перед постом: `head -c 3 <файл> | xxd` → `efbbbf` = стоп.
- Скрипт-лечилка → публичный gist (после Шага 0.2) → ссылка. Ссылку в уже отправленные комменты дописывай ПРАВКОЙ своих сообщений, не новыми постами: `gh api -X PATCH repos/<r>/issues/comments/<id> -F body=@file`.
- Кросс-вендор: тот же класс болезни у codex/gemini-cli — тоже дверь (прецедент openai/codex#35347).
## Шаг 4 — вахта + вердикт (молчание запрещено)
```bash
python "$USERPROFILE/.claude/scripts/pr_watch.py" --add <url каждого треда>
```
Вердикт в отчёт, один из трёх: **🟢 раздал** (ссылки) · **⚪ искал-пусто** (запрос назван) · **⛔ непереносимо/приватно** (причина). Треды дальше веду САМ (реглумент `reglament-github-kommunikaciya-vsegda-sam`), показ в утреннем отчёте из `pr_watch --digest`; ответ живого инженера → /pr-reply Шаг 5-бис (контент-воронка).
## Границы
- Юридическое (CLA/DCO), деньги, секреты, масс-действия = Tier-2 → пауза+спрос.
- Правда в цифрах: раздаём только доказанное нашим /tt; гипотезы помечаем 🤔 прямо в комменте.
- Скилл ничего не решает про НАШ контент-каскад — только GitHub-треды + gist.
⭐⭐ ДОМЕН-ГЕЙТ (07.09) — ЛАЗЕРНЫЙ ФОКУС (приказ Антона 07.09.2026: «мусорные PR нам не нужны, нанимающий инженер должен за минуту понять: этот человек живёт в агентских рантаймах»).
Цели ТОЛЬКО из нашего круга: агентские фреймворки · LLM SDK · MCP · память для LLM · evals · observability для LLM.
Дверь: `python3 ~/.claude/scripts/github_targets.py --top 20` — по умолчанию отдаёт только domain=core; первыми идут ⭐ own_pain (репо, обо что споткнулись САМИ во флоте — правило первого приоритета), дальше остальной круг.
Репо не из выдачи → `--check owner/repo`: domain=off или `adjacent` = НЕ ТРОГАТЬ, даже если issue красивая и хозяин живой. Исключение только по прямому слову Антона.
⚠️ «нет в списке целей» ≠ off (поправка 23.09, пережито в прогоне): так дверь говорит «этот репо не сканировали», и сама печатает, чего ей не хватает — `домен не посчитан: подай --ecosystem и/или --desc`. Досыпь описание репо и пересчитай: `gh api repos/<o>/<r> --jq '[.description,(.topics|join(","))]|@tsv'` → `python github_targets.py --check <o>/<r> --desc "<описание> <топики>"`. Только ПОСЛЕ этого вердикт core/off настоящий. Замер 23.09: 8 несканированных репо, буквальное «нет в списке = не трогать» выбросило бы 5 целей домена=core (agent-fleet, TangleClaw, recall, pi-cursor-sdk, roost) вместе с 3 настоящими off. Это ровно тот шаг, который описан в `~/.claude/scripts/github-niche-focus-block.md` v2 — строка выше ему противоречила.
Правила и own_pain: `~/.claude/registry/github-universe/domain.json` (0 LLM; тест `_test_github_targets_domain.py`).
Метод (репро · красный тест · мутации · ревью объектом Review) не меняется — сужены только мишени.
## ⭐ Чёрный юмор обязателен (anton 10.09.2026, голосом)
Любой текст, который этот скилл отправляет ЖИВОМУ человеку наружу, несёт чёрную самоиронию — ровный служебный тон = дефект, объяснять надо не шутку, а её отсутствие. Строку берёшь через `/mycroft-joke` (полка (д) банка + строки 56-62 под холодное касание), приёмка — `/taste-check` P36. ⛔ Не шутим ровно в трёх зонах, и они не про вкус: строго-научная публикация (arXiv/журнал/JOSS) · юр.обязательство и анкета · красный список банка (чужая иконография угнетённых, псевдо-слуры, отрицание что я ИИ, юмор поверх диагноза/денег/беды собеседника). Одна шутка на тред. Канон: CLAUDE.md §3.3 §Поправка 10.09 + [[dark-humor-default-everywhere-external]].
## ⭐ Полнота списка потребителей (anton 10.09.2026)
Первый найденный потребитель почти никогда не единственный — он просто лежал на поверхности. Поиск закончен не когда кто-то найден, а когда **две оси подряд дали ноль новых имён**; внутренний потребитель (узел флота, робот, наш же скилл с костылём) ищется ПЕРВЫМ. Девять осей перебора и обязательный вердикт с числом («осей N/9 · адресов M · насыщение да/нет») — `/consumer-hunt` §Шаг 1-бис. ⚠️ Исчерпывающим обязан быть ПОИСК, адресация идёт по правилам двери: найденный адрес не выбрасывается, а получает статус и дату (🟢 постучались · ⏸ глухая очередь по замеру · 🪦 непереносимо). Канон: `reglament-vypustil-funkcional-naydi-potrebiteley-i-pridi-k-nim` §Поправка 10.09 + [[consumers-are-a-set-not-the-first-one]].
<!--kit-footer-->
---
**Like this skill?** It is one of 100 in [second-brain-starter-kit](https://github.com/tonydzi/second-brain-starter-kit): the second brain we built for ourselves and run every day at Palo Alto AI Research Lab. Install the whole set with `npx skills add tonydzi/second-brain-starter-kit`. Everything is open source and free, so take what you need.
Flagships worth a look on their own: [secondop-panel](https://github.com/tonydzi/secondop-panel) (a second opinion from a panel of external models), [claude-memory-tidy](https://github.com/tonydzi/claude-memory-tidy) (stop your agent's memory from rotting), [telegram-mcp-kit](https://github.com/tonydzi/telegram-mcp-kit) (your own Telegram over MCP in about 15 minutes).
Author: **Anton Dziatkovskii**, Palo Alto AI Research Lab. Telegram [@tonydzi](https://t.me/tonydzi) - WhatsApp [+1 341 222 9178](https://wa.me/13412229178) - X [@Tony_Stef_](https://x.com/Tony_Stef_)
**Engineers: want to test-drive this setup?** Message me. I hand out free starter seeds to engineers who test and report back, and custom skill requests are welcome.