About product-roadmap
product-roadmap is a skill for GitHub repository maintainers that turns code, milestones, issues, and PRs into an actionable product roadmap. It models the existing product before organizing backlog items, and supports single- or multi-repository products.
Key features
- 01Combine codebase context with GitHub backlog
- 02Model existing products and subsystems
- 03Weigh work items by author role and signals
- 04Record and refresh roadmaps in a graph
- 05Render graph, Markdown, and HTML
Use cases
- 01Build a roadmap for a maintained GitHub project
- 02Plan one product across multiple repositories
- 03Set direction using shipped capabilities and backlog
- 04Refresh an existing roadmap without reseeding
MCP support
The skill uses iskron_* tools to work with graphs; the README does not specify MCP.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ iskron-ai/ skills --skill product-roadmapAfter installing, type/product-roadmapin Claude Code to confirm it loaded.
Bundled filesreferences/roadmap-template.htmlreferences/self-checks.md
Details
From the project READMEПродуктовый роадмап
Преврати GitHub-репо, которое ты сопровождаешь, — или мультирепо-продукт — в роадмап, из которого можно действовать. Ценность (обещание solo-разработчику): овладеть контекстом, рассыпанным по кодовой базе и бэклогу issues/PR, и дать графу поднять направления, под которыми проект действительно находится, — а не плоский список тикетов.
Ты отыгрываешь мейнтейнера. Конвейер:
рамка + бутстрап графа → моделирование текущего продукта (vartamana-почва) →
сбор milestones + issues + PR → взвешивание по автору → запись в граф (шабда-интейк) →
сборка (превращения: фигура-на-почве) → рендер (граф + markdown + HTML) → проверка
Скилл композирует три других: iskronify (понимание кодовой базы, граф/контур), intake (источник-независимая дисциплина шабда-интейка — хребет Шага 5) и assembly (различение превращений — сердце Шага 6). Сам он добавляет GitHub-адаптер (Шаги 3–4) и рендер роадмапа (Шаг 7). references/self-checks.md — полный проверочный гейт: Шаг 8 его прогоняет; без него не публикуй.
Обязательства — держи их через все шаги
- Фигура на почве. Issues/PR — это дельта: что люди хотят изменить; сами по себе они читаются как триаж тикетов. Сначала смоделируй существующий продукт — проверенной
vartamana-почвой, зримо отделённой отkalpita/shabda-бэклога. Тогда каждое направление преобразует нечто реальное. - Рычаг графа, не только его текст. Акторы — роли с реальными рёбрами; фигура-на-почве — граф-легальная связь; ключевые потоки — эстафета
ahara/utpatti; структурные риски — из собственных натяжений графа. Роадмап, который мог быть плоским markdown-списком, графом не воспользовался — а всякий рычаг, заявленный прозой, должны нести рёбра (проверка — режим claim-аудита скиллаintegrity). - Один продукт, даже через много репо. ОДИН фокус-контур; каждый репо — top-level-подсистема; кросс-репо-поток — заголовок. Никогда N сшитых роадмапов. Подтверди с мейнтейнером, какие репо в продукте, до моделирования.
- Читай-и-освежай, никогда не пересевай (контракт повторного прогона). В существующий граф ориентируются и освежают его на месте — прежде каждой записи найди, что уже стоит: обнови существующее, добавь только подлинно новое, закрой отгруженное. Отсутствующий граф предлагается, не создаётся молча. Выход — снимок настоящего, не межпрогонный журнал.
- Честно прежде эффектно. Пустой или тощий бэклог констатируется, не надувается; срезы объявляются; превосходные степени — только над множествами, которые ты реально вычислил; каждый процитированный примитив проверен. Полный список стражей —
references/self-checks.md. - Дисциплина ссылок.
#Nзарезервирован за реальными номерами GitHub issue/PR. Мультирепо: каждая ссылка репо-квалифицирована полным ключом (backend#1) — без самодельных сокращений, группировок и диапазонов, без голых#N. Внутренние seq графа — с не-репо-префиксом (ISKRON#1120). Направления —D1/D2или по имени.
Предпосылки
ghCLI аутентифицирован (gh auth status); целевые репо доступны.- Локальный чекаут каждого репо в объёме (
git clone --depth 1; приватные:gh repo clone). Шаг 2 читает реальную структуру кода — моделирование по однимgh-метаданным продукта не схватывает. - Тулы iskron_*; граф — по контракту повторного прогона выше.
- Модель продукта, решения в графе и сборку ведёшь сам (дверь iskron, «Ремесло графа»); объёмное — субагентам, делом: шаги без графа (сбор issues и PR, чтение кода, рендер) и правка многих узлов по готовому решению — роли
weaverна своём мосту-спутнике, итог сверяешь ты; дело прогона заводится до первого запуска (open_roomодной строкой у записи фокус-контура, справка двери iskronleading.md), бриф каждого субагента начинается строкой запускаstart <граф> <роль> <дело №N>, итог он говорит словом в деле; результаты между шагами передавай файлами на диске, возвращай короткие подтверждения + пути — большие возвраты роняют соединение. Проверяй шаг субагента по произведённому артефакту, не по его отчёту.
Шаг 1 — Рамка и бутстрап
- Определи цель — один
owner/repoили набор (org или названный мейнтейнером список) — и границу продукта одной строкой. Несколько репо: подтверди, что это один продукт, и что в объёме. - Сначала найди граф + фокус-контур (
iskron_realmlist;iskron_orient/iskron_semantic_search). Существует → ориентируйся и веди прогон как инкрементальное освежение. Отсутствует → предложи создание, создавай только по согласию мейнтейнера. - Ровно один фокус-контур, названный по продукту,
containsот корня — один контур даже через много репо, никогда по контуру на репо. - Чтение в духе
iskronifyнастраивает граф/контур, но никогда не пишиAGENTS.mdв репо, владение которым только отыгрываешь.
Шаг 2 — Смоделируй текущий продукт (vartamana-почва)
Пропустишь — и весь граф будет shabda: роадмап прочтётся как триаж бэклога, висящего в вакууме.
Читай то, что ЕСТЬ: README + доки (собственная заявка продукта); CHANGELOG + релизы (gh release list — что реально отгружено, текущая версия); структура кодовой базы (top-level директории/пакеты — реальные границы подсистем, точки входа, таблицы роутов); поверхность конфигурации (флаги, env); поверхность API (endpoint'ы, CLI-команды).
Засей почву: anumita · vartamana · upeksha — выведено чтением, действует, принято — строго отдельно от бэклога. Чтение README, CHANGELOG и кода видит содержание, не исполнение: эпистемика почвы по чтению — не выше anumita; pratyakshita — только наблюдённому исполнением (вызов, прогон), pramanita — по reality-audit (writing, «Решение 3: модусы»):
| Что прочитал | Узел | given_as | модус |
|---|---|---|---|
| подсистема (crawler, indexer, auth, storage) | holon | — | (граница) |
| существующая способность («полнотекстовый поиск») | phenomenon | vollzug / sachverhalt | An/Va/Up |
| доменная сущность (Bookmark, Library, User) | phenomenon | bildung / sinn | An/Va/Up |
| ключевой поток, который продукт исполняет сегодня | kriya | — | An/Va/Up |
| отгруженный факт, подтверждённый релизом | phenomenon | sachverhalt | An/Va/Up — релизная заметка слово мейнтейнера, не наблюдение |
- Вкладывай подсистемы под фокус-контур (
contains); способности/сущности живут в своей подсистеме. Мультирепо: репозитории И ЕСТЬ top-level-подсистемы (attrs.repoна каждой); внутри репо может делиться дальше. - Правила заземления — каждый узел почвы: цитируй реальный примитив в
attrs.source_ref(путь модуля, конфиг-флаг, endpoint, релиз-тег; репо-квалифицированно для мультирепо). Цитируй точный примитив — названный символ существует по этому пути; цитируй, где поведение реализовано, не где читается; предпочитай исполняемые примитивы прозе доков; версии читай из манифеста, никогда из дока.vartamana-заявка без цитируемого примитива — догадка: понизь или выброси. Не выводи способность из feature-request'а (это бэклог, не почва). - Объём: подсистемы, главные доменные сущности, горстка ключевых потоков — карта, которую мейнтейнер узнаёт как «да, это мой продукт», не полный реверс-инжиниринг.
- Смоделируй акторов — сначала роль-тест (скилл writing): ролью становится только адресуемый делатель. Два слоя, из двух разных источников, никогда не схлопнутых:
- Операторы рантайма — кто действует на живую систему / кого она обслуживает. Внешний потребитель →
agantuka客; внутренний оператор (админ, модератор, онбординг-стафф) →adhikarin能 — активный делатель, который отвечает и действует, никогда не пассивно-«обслуживаемая» сторона. Парк воркеров / CI / cron — не роль: это ⚙️ феномен (upadhi); повысить его, чтобы заглушить no-actor-натяжение, — ровно тот антипаттерн, о котором натяжение предупреждает. Моделируется из почвы (роли, которым служит код): эти люди почти никогда не пишут issues. - Драйверы разработки — кто авторствует бэклог. Мейнтейнер →
svatantra主 (делегированный dev-scope →adhikarin); случайный контрибьютор →agantuka. Только этот слой виден сбору. Чем уже круг контрибьюторов (solo-проект = один 主), тем сильнее реальный акторный сигнал прячется в слое рантайма. Карта с нулём рёбер — театр: прошей её к деяниям, которые она двигает, или выброси; каждая роль несётmanifested_as.
- Операторы рантайма — кто действует на живую систему / кого она обслуживает. Внешний потребитель →
- Прошей ключевые потоки эстафетой: каждая крия ключевого потока потребляет (
ahara) феномены, которые читает-и-съедает, и производит (utpatti) те, что пишет, в последовательностиnext— хребет продукта как реальная эстафета (трассируется в Шаге 7) и причина, по которой структурные риски становятся вычислимыми. Мультирепо: кросс-репо-хребет — заголовок: крия в репо A производит шарнирный феномен (общая таблица БД, API-контракт, публикуемый артефакт), который потребляет крия в репо B; шарнирные феномены — граф-доказательство единого продукта.
Шаг 3 — Собери milestones + issues + PR
gh, JSON. Три источника — обязательный план мейнтейнера живёт в milestones / Projects-доске и есть сильнейший одиночный сигнал.
- Мультирепо: собирай каждый репо в объёме, помечай элемент его репо, координированную работу поперёк репо веди одной кросс-репо-темой.
- Сначала milestones:
gh api repos/<owner>/<repo>/milestones?state=open, затем issues каждого не-«Backlog»-майлстоуна. Читай прозу описания самого майлстоуна — мейнтейнеры называют там цели, у которых нет issue. Проверь и Projects-доски, и закреплённые «roadmap»-issues. - Issues:
gh issue list --state open --limit <N> --json number,title,body,author,authorAssociation,labels,reactionGroups,comments,milestone,createdAt,updatedAt - PR (открытые + недавно смерженные):
gh pr list --state all --limit <N> --json number,title,body,author,authorAssociation,labels,state,milestone,additions,deletions,createdAt,mergedAt - Отбор = ОБЪЕДИНЕНИЕ, срез объявлен, никогда молча: (a) каждый issue с майлстоуном, (b) каждый с меткой accepted/approved/roadmap, (c) топ-N по реакциям / комментариям, (d) недавно активные N, (e) контрибьюторские PR. Одни реакции роняют уже решённую малореакционную работу — ровно то, что на роадмапе и должно быть. Не ограничивай PR окном новейших N: долго открытый мейнтейнерский PR — высокий сигнал. Залогируй срез и что исключено.
- Пустой/тощий бэклог честен, не провал: элементы НЕ выдумываются. Почва плюс траектория смерженных PR (
gh pr list --state merged— что недавно строилось, в каком направлении) несут роадмап; так и скажи в рендере. - Фиксируй по элементу: номер, заголовок, обрезанное тело, проверенный логин автора + authorAssociation (из API, никогда не выведенный), метки, майлстоун, вовлечённость, связанные issues, состояние.
Шаг 4 — Взвесь по роли автора
| authorAssociation | вес | заметка |
|---|---|---|
| OWNER / MEMBER / COLLABORATOR | высокий | голос мейнтейнера |
| CONTRIBUTOR | высокий | есть смерженная работа — реален |
| FIRST_TIME_CONTRIBUTOR / FIRST_TIMER | средний | суди по содержанию + вовлечённости |
| NONE (issue) | средний | пользовательская нужда — держи, если содержательна |
| NONE (PR без связанного issue) | низкий | случайный; впускай только при реальной вовлечённости |
Повышай за вовлечённость и метки accepted/roadmap; понижай дубликаты, wontfix, ботов, чистые dependency-бампы.
- Членство в майлстоуне перевешивает реакции — issue следующего релиза есть обязательная работа независимо от счёта реакций.
- Авторство проверяй из API, никогда не выводи — приписать общинный вклад мейнтейнеру значит испортить само взвешивание, ради которого шаг существует.
Шаг 5 — Запиши бэклог (шабда-интейк + роадмап-надстройки)
Прогони скилл intake над собранным — Шаги 3–4 суть его GitHub-адаптер (они дают каждому элементу содержание / форму / провенанс / авторитет). Хребет — у intake (тип узла по форме, эпистемика по заявке, средству и истоку, source_kind=shabda, дедуп, якорь arose_from); срез селективности — из Шага 3.
Одно сознательное расхождение с таблицей intake: feature-request ложится здесь феноменом (желаемая способность, sinn/bildung) или семенной крией (anagata/chanda) — не intake-овским превращением. Направления различаются позже сборкой; Шаг 5 сеет желаемую способность, не превращение.
GitHub-PR-формы, которых таблица intake не называет. PR — не крия: в граф идёт изменение, номер PR и SHA — в attrs или истории.
| Элемент источника | Узел |
|---|---|
| смерженный контрибьюторский PR | произведённый им феномен или введённая им крия (повторяемый переход) |
| открытый контрибьюторский PR | феномен или крия, которые он вводит, в модусах замысла (anagata) — работа в полёте |
| маловесный случайный PR | пропустить — или низкоприоритетный феномен с пометкой |
Роадмап-надстройки, которых intake не несёт:
- Якори каждый элемент к его подсистеме (
context/vimarsha_ofк контуру подсистемы из Шага 2 или к способности, которую он расширяет) — бэклог кластеризуется по подсистемам. Элемент без дома — сигнал: недомоделированная почва (вернись в Шаг 2) или подлинно новая почва — скажи, что именно. Кросс-репо-тема якорится к фокус-контуру и линкует каждую задетую подсистему. - Дедуплицируй против ПОЧВЫ, не только бэклога: просьба, совпадающая с отгруженной способностью, — дельта: формулируй «улучшить X», никогда «добавить X»; если базовая форма уже отгружена — переформулируй в реальный оставшийся зазор. Назвать уже отгруженное как to-build — подорвать доверие к знанию продукта. Неси GitHub-реф (номер, автор, вес) в
attrsдля трассируемости рендера. - Ставь модус момента честно: закоммичено майлстоуном →
chanda, и майлстоун едет свидетельством вattrsи в вес ранжирования, а не в волю; спекулятивная просьба →chanda; проектируемая работа →anagata; почва остаётсяvartamanaс эпистемикой по Шагу 2.adhimoksha— акт владельца графа, и читается он из его слова, а не выводится из артефакта чужой форжи: майлстоун ставит мейнтейнер репозитория, который держателям этого графа может быть не тождествен, и запись «держим» по нему выдала бы чужой артефакт за акт воли.adhimokshaзаконен только там, где владелец графа сказал это сам — и тогда кто и где сказал, стоит вreasoningзаписи, не в теле узла. Моделируй поле, как оно стоит сейчас; никогда не переводи модусы заранее. - Дай каждой бэклог-крие её ведущую роль как
actor— dev-драйверскую роль проверенного автора, никогда рантайм-актора. Именно это делает «кто владеет направлением» ребром графа, а не прозаическим ярлыком.
Шаг 6 — Сборка (различи направления)
Прогони скилл assembly над засеянным графом: ориентация поля → триаж свободных вимарш → различение превращений → имя + телос → anga драйверов → порядок anantara. Имена и телосы направлений агент предлагает (chanda), принимает владелец (writing, «Имя и телос»): отыгрыш мейнтейнера акта принятия не даёт, adhimoksha — только по его слову. Имя, телос и запрет превращения на одну вимаршу — по assembly, шаг 5; риски остаются рисками.
- Освежающие прогоны сверяют, не переразличают с нуля: обнови телос / anga / порядок направлений, которые держатся; направление добавляй только для подлинно новой темы; закрой (visarjana) те, чья работа отгружена. Никогда — направление-близнец.
- Фигура-на-почве как реальная стрелка: ведущая крия направления достигает способности почвы через
upadhi/context— никогда буквальнымaharaот превращения (граф запрещает). Направление, чьи ведущие крии не касаются никакой способности почвы, плавает: либо подлинно новая почва (скажи явно), либо знак недомоделированного Шага 2 (иди досей способность). - Подними структурные риски из собственных натяжений графа (
iskron_orient(lens="tensions")): способность без производящего потока, relay-gap эстафеты, деяние без роли — самодиагноз графа, отличный от рисков из бэклога; плоский список тикетов структурно не может их произвести. Мультирепо: кросс-репо мёртвый рецепт или relay-gap — находка высшей ценности. Натяжения, которые завело само моделирование, а не продукт, чини на месте, а не рапортуй. - Атрибутируй каждое направление по двум осям: его драйвер (ведёт мейнтейнер и закоммичено / ведёт контрибьютор и ждёт ревью / просит сообщество и без владельца — из ролей сбора) и его рантайм-цель (кому служит изменённая система: внешний потребитель 客 или внутренний оператор 能 — из почвы). Не схлопывай вторую в первую — жди операторских направлений (админка, онбординг стаффа) рядом с потребительскими; на solo-продукте ось драйвера плоская, и направления реально различаются рантайм-целью. Владение — факт графа: anga-крии направления несут
actor→ роль-драйвера, иначе ярлык понижается до «выведено». - Когерентная высокосигнальная тема сообщества заслуживает направления даже без закоммиченной работы — топ-реакционные issues есть роадмап-сигнал; сознательная отсрочка помечается «отложено, но реально», никогда не роняется молча.
- Майлстоуны целиком: закоммиченный ближний майлстоун — собственное направление, перечисляющее каждый открытый issue майлстоуна; топ-N ранжируй как гейтящие, но назови общее число и что остальное остаётся; никогда телос, заявляющий завершение по частичному списку. Перечисли каждый ОТКРЫТЫЙ майлстоун; catch-all «Backlog» — целиком или явно «сэмплировано». Закоммиченный мейнтейнерский issue из майлстоуна никогда не уступает место менее сигнальному по той же теме.
- Каждому ребру
anantara— свидетельство: issue/PR или заявление мейнтейнера, его устанавливающее; собственный архитектурный вывод помечай эвристикой (kalpita) и хеджируй в рендере. Не называй лишнего «blocked»: направление со своей работой в полёте — идёт следом, не заблокировано. - Именуй направления на языке аудитории репо — они станут заголовками роадмапа, которые читает владелец.
Шаг 7 — Рендер (веди собранной картиной)
Роадмап ведёт собранной кросс-репо-картиной и тем, что нашёл граф, — дифференцирующая ценность на первом экране, не закопана. Три артефакта:
- Граф —
iskron_orient(lens="bianhua"); HTML рендерит его визуальным граф-видом (хребет + направления в порядке зависимостей + флаги структурных рисков). roadmap.md, в этом порядке:- «Продукт, собранный» — подсистемы (по одной на репо) + кросс-репо-хребет, одно-два предложения; реальная картина из ВСЕХ источников.
- «Что нашёл граф» — структурные риски из натяжений, каждый с помеченным швом. Веди ими.
- «Следующие 3 хода» — список действий на 3–5 строк.
- «Что этот продукт сегодня» — почва, каждая строка процитирована к примитиву; доказывает знание продукта.
- «Как это работает сегодня» — одна ключевая эстафета, протрассированная насквозь (
lens="trace"): хребет одним проходом. - Направления в порядке
anantara; по направлению: расширяемая способность, телос, ведущие элементы (дословные заголовки + рефы + вес автора), роль-драйвер и рантайм-цель (客/能), anga (ведущий вопрос), открытые риски, что разблокирует. - «Чтение поля» — роли-драйверы (+ рантайм-цели), структурные риски, карта фигура-на-почве. Написано для мейнтейнера, не методолога: глоссируй каждый термин графа по-простому при первом употреблении.
- «Аудит сигнала» — топ по реакциям и комментариям среди ОТКРЫТЫХ issues (числа + основание запроса), каждый помечен included / deferred / out-of-scope, с названным порогом вовлечённости. Тощий бэклог → таблица траектории (счётчики смерженных PR по репо + темы). Точные числа, никогда оценки.
roadmap.html— страницу НЕ пиши руками. Скопируйreferences/roadmap-template.htmlи замени ТОЛЬКО его data-объектROADMAP(схема задокументирована в начале<script>шаблона); шаблон рендерит дизайн, реф-ссылки, чипы авторов, статус-бейджи, фильтры, темы. Весь текст авто-экранируется — вставляй дословные заголовки. Мультирепо: заполни URL-картуrepos, ставьrepo:'<key>'на каждый реф драйвера/сигнала иdirections[].repos; свободные рефы пиши<key>#N; внутренние seq —ISKRON#…. Один репо: опустиrepos(шаблон линкует черезrepoUrl).
Рендерь на языке аудитории репо. Цитируемые заголовки — дословно. Точность состояний: различай review / rebase / merge по draft-состоянию + mergeability + CI + ревью; докладывай разбор готовности по каждому PR и рекомендуй действие, снимающее связывающее ограничение. mergeable=null → пере-опроси один раз, затем «mergeability pending», никогда «clean»; mergeable=true ≠ готов; mergeable-PR — не «конфликтующий». Никогда не сваливай PR разных состояний в одну строку; ОТКРЫТЫЙ PR никогда не «отгружен». Никаких невычисленных превосходных степеней — заявка с названным охватом или сырое число, никогда глобальное «#1» по срезанному подмножеству. Покрытие — то, что делает путь данных/кода, не то, что перечисляет конфиг или UI.
Шаг 8 — Промежуточное сохранение и проверка (провал — вслух)
Ненаписанный роадмап не стоит ничего; прогон, умерший молча и не отдавший ничего, — худший исход.
- Сохраняй по ходу: пиши сырой выход каждой стадии (
milestones.json,issues.json,prs.json, собранный скелет) в--out-директорию по мере сбора — поздний провал оставит восстановимое состояние. - Проверь запись: перечитай артефакты; убедись — непустые, обязательные секции на месте; нет → скажи громко и почини; никогда не рапортуй успех без проверенного артефакта.
- Прогони
references/self-checks.md— каждую проверку. Каждый PASS зарабатывается над полным названным множеством; расхождения исправь, перерендери, перепроверь. - Возвраты держи маленькими: файлы на диске + короткое подтверждение с путями.
Быстрый режим — короткий показ
Триггеры: --quick, «quick roadmap», «дай суть», первое знакомство. Не гони полный конвейер (десятки минут); выдай одноэкранный короткий показ за пару минут — «он действительно понимает мой продукт» — и предложи полный прогон. Та же механика, вширь и мелко:
- Рамка (Шаг 1) — граница продукта; репо в объёме.
- Лёгкая почва — подсистемы и кросс-репо-хребет (достаточно для граф-вида) + горстка ключевых способностей и сущностей; реальные примитивы процитированы, объём — хребет; засей граф ровно на хребет + одно заголовочное натяжение.
- Взгляд на траекторию — темы смерженных PR / закоммиченный майлстоун; без полного сбора и глубины взвешивания.
- Топ-3 направления + один заголовочный структурный риск; без полного леса.
- Рендер только лида — граф-вид + резюме на 3–5 строк (что это за продукт · что нашёл граф · следующий ход) + явный указатель: «это короткий показ — прогони полный роадмап для полной картины».
Дисциплина держится: честное разделение shabda/vartamana, без фабрикаций, каждый процитированный примитив реален, рефы репо-квалифицированы, честность пустого бэклога. Мельче — да, небрежнее — нет.
Контракт выхода
- Проверенный
vartamana-подграф почвы (подсистемы + способности + ключевые потоки), процитированный к реальным примитивам, отдельный отshabda-бэклога. - Граф засеян трассируемыми феноменами/рисками — шабда-честно, дедуплицировано, со срезом.
- Карта превращений = роадмап, секвенированная, каждое направление заякорено в почву.
- Рычаг графа видим: роли-акторы, связи фигура-на-почве, структурные риски из натяжений — собраны в «Чтении поля».
roadmap.md+roadmap.htmlзаписаны локально; список «следующие 3 хода».- Все self-checks пройдены.