Skip to content
Back to skills

Share Fix

ASecurity

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.

  • 8 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 25, 2026
ai-agentspythongoshellbashgitapi

Works with

  • cursor
  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned October 7, 2026

npx -y skills add tonydzi/second-brain-starter-kit --skill share-fix --agent claude-code

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.

Security grade badge for Share Fix
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tonydzi-share-fix/badge)](https://www.skillsdirectory.com/skills/tonydzi-share-fix)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…