workflow-ai 1.0.32 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workflow-ai",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "description": "AI Agent Workflow Coordinator — kanban-based pipeline for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
package/src/runner.mjs CHANGED
@@ -837,8 +837,15 @@ class StageExecutor {
837
837
  const timeout = this.pipeline.execution?.timeout_per_stage || 300;
838
838
  const args = [...agent.args];
839
839
 
840
- // Промпт всегда передаётся последним аргументом
841
- args.push(prompt);
840
+ // Если args содержит -p с ролью — объединяем роль и промпт в один аргумент
841
+ // Иначе Claude CLI интерпретирует роль как промпт, а реальный промпт игнорирует
842
+ const lastPIdx = args.lastIndexOf('-p');
843
+ if (lastPIdx !== -1 && lastPIdx < args.length - 1) {
844
+ const rolePrompt = args[lastPIdx + 1];
845
+ args[lastPIdx + 1] = `${rolePrompt}\n\n${prompt}`;
846
+ } else {
847
+ args.push(prompt);
848
+ }
842
849
 
843
850
  // Логгируем команду перед запуском (вместо промпта — имя skill)
844
851
  if (this.logger) {
@@ -33,6 +33,24 @@ const PLANS_DIR = path.join(WORKFLOW_DIR, 'plans', 'current');
33
33
 
34
34
  const TICKET_DIRS = ['backlog', 'ready', 'in-progress', 'review', 'done', 'blocked'];
35
35
 
36
+ /**
37
+ * Читает статус плана из frontmatter.
38
+ * Только планы со статусом "approved" могут быть декомпозированы автоматически.
39
+ * Планы со статусом "draft", "active" или без статуса — пропускаются.
40
+ */
41
+ function getPlanStatus(planFile) {
42
+ const fullPath = path.join(WORKFLOW_DIR, planFile);
43
+ if (!fs.existsSync(fullPath)) return null;
44
+ try {
45
+ const content = fs.readFileSync(fullPath, 'utf8');
46
+ const { frontmatter } = parseFrontmatter(content);
47
+ return frontmatter.status || null;
48
+ } catch (e) {
49
+ console.error(`[WARN] Failed to read plan status from ${planFile}: ${e.message}`);
50
+ return null;
51
+ }
52
+ }
53
+
36
54
  /**
37
55
  * Проверяет, есть ли тикеты, привязанные к данному плану
38
56
  */
@@ -113,6 +131,13 @@ async function main() {
113
131
 
114
132
  console.log(`[INFO] Found plan file: ${planFile}`);
115
133
 
134
+ const planStatus = getPlanStatus(planFile);
135
+ if (planStatus !== 'approved') {
136
+ console.log(`[INFO] Plan ${planId} has status "${planStatus}" (not "approved") — skipping decomposition`);
137
+ printResult({ status: 'decomposed' });
138
+ return;
139
+ }
140
+
116
141
  if (hasTicketsForPlan(planId)) {
117
142
  console.log(`[INFO] Plan ${planId} already has tickets — decomposed`);
118
143
  printResult({ status: 'decomposed' });
@@ -137,6 +162,11 @@ async function main() {
137
162
  console.log(`[INFO] Found ${allPlans.length} plan(s) in plans/current/`);
138
163
 
139
164
  for (const { planId: pid, planFile } of allPlans) {
165
+ const planStatus = getPlanStatus(planFile);
166
+ if (planStatus !== 'approved') {
167
+ console.log(`[INFO] Plan ${pid} has status "${planStatus}" (not "approved") — skipping`);
168
+ continue;
169
+ }
140
170
  if (!hasTicketsForPlan(pid)) {
141
171
  console.log(`[INFO] Plan ${pid} has no tickets — needs decomposition`);
142
172
  printResult({ status: 'needs_decomposition', plan_file: planFile });
@@ -1,224 +1,224 @@
1
- ---
2
- name: check-relevance
3
- description: Проверить актуальность тикета перед выполнением. Используется для предотвращения выполнения устаревших или уже завершённых задач.
4
- ---
5
-
6
- # Проверка актуальности тикета
7
-
8
- > **ЗАПРЕТ:** НЕ перемещай, НЕ удаляй, НЕ переименовывай файлы тикетов. Твоя задача — ТОЛЬКО прочитать, при irrelevant добавить запись в таблицу ревью, и вернуть вердикт. Перемещение выполняет отдельный stage пайплайна. Проверяй ТОЛЬКО тикет из `ticket_id` контекста, игнорируй остальные поля (`ready_tickets` и т.д.).
9
-
10
- Этот skill проверяет актуальность тикета перед его выполнением. Предотвращает выполнение устаревших/неактуальных задач.
11
-
12
- ## Когда использовать
13
-
14
- - Тикет только что перемещён в `in-progress/`
15
- - Перед выполнением основной задачи (execute-task)
16
- - Для фильтрации задач с неактивными планами или выполненными DoD
17
-
18
- ## Шаги проверки
19
-
20
- ### 0. Быстрый выход по существующему ревью
21
-
22
- **До любых проверок** найди в тикете секцию `## Ревью`.
23
-
24
- Если последняя запись имеет статус `⏭ skipped` — тикет уже был проверен и пропущен. **Повторно проверять НЕ НАДО**, новую запись skipped добавлять НЕ НАДО. Немедленно верни:
25
-
26
- ```
27
- ---RESULT---
28
- status: irrelevant
29
- reason: already_skipped
30
- ---RESULT---
31
- ```
32
-
33
- Если последней записи нет или статус другой — переходи к шагу 1.
34
-
35
- ### 1. Прочитать тикет
36
-
37
- **ОБЯЗАТЕЛЬНО:** Используй `ticket_id` из секции Context промпта.
38
-
39
- ```
40
- Путь: .workflow/tickets/in-progress/{TICKET-ID}.md
41
- ```
42
-
43
- Извлечь:
44
- - `parent_plan` — ссылка на родительский план
45
- - `dependencies` — зависимости тикета
46
- - `conditions` — условия выполнения
47
- - Критерии готовности (Definition of Done)
48
-
49
- ### 2. Проверить родительский план
50
-
51
- Проверить статус родительского плана:
52
-
53
- ```
54
- Путь: .workflow/plans/current/{PARENT_PLAN}.md
55
- ```
56
-
57
- **Критерии неактуальности:**
58
- - План имеет `status: completed` — план уже завершён
59
- - План имеет `status: archived` — план заархивирован
60
- - План имеет `status: cancelled` — план отменён
61
-
62
- **Если план неактивен:** тикет `irrelevant`
63
-
64
- ### 3. Проверить выполнение DoD
65
-
66
- Проверить все критерии из Definition of Done тикета:
67
-
68
- **Критерии неактуальности:**
69
- - Все критерии уже отмечены как выполненные `[x]`
70
- - В секции "Результат выполнения" уже есть заполненные данные
71
-
72
- **Если DoD полностью выполнен:** тикет `irrelevant` (задача уже сделана)
73
-
74
- ### 4. Проверить зависимости
75
-
76
- Проверить тикеты из секции `dependencies`:
77
-
78
- ```
79
- Путь: .workflow/tickets/{status}/{DEP-TICKET}.md
80
- ```
81
-
82
- **Критерии неактуальности:**
83
- - Зависимый тикет находится в `blocked/` с причиной "неактуально"
84
- - Зависимый тикет был удалён или перемещён в архив
85
-
86
- **Если критические зависимости неактуальны:** тикет `irrelevant`
87
-
88
- ### 5. Проверить статус blocked
89
-
90
- **Проверить секцию `## Блокировки` или frontmatter:**
91
-
92
- Если тикет помечен как заблокированный → **неактуален**.
93
-
94
- ### 6. При irrelevant — записать в таблицу ревью тикета
95
-
96
- Если вердикт `irrelevant`, **ОБЯЗАТЕЛЬНО** добавь запись в секцию `## Ревью` тикета:
97
-
98
- - Если секции `## Ревью` нет — создай её в конце файла
99
- - Если таблица уже есть — добавь строку в конец таблицы
100
-
101
- Формат записи:
102
-
103
- ```
104
- | {текущая дата} | ⏭️ skipped | {причина irrelevant: plan_inactive / dod_completed / dependencies_inactive} |
105
- ```
106
-
107
- Пример:
108
-
109
- ```markdown
110
- ## Ревью
111
-
112
- | Дата | Статус | Самари |
113
- |------|--------|--------|
114
- | 2026-03-10 | ⏭️ skipped | DoD уже выполнен, тикет неактуален |
115
- ```
116
-
117
- Это единственная допустимая запись в файл — только добавление строки в таблицу ревью.
118
-
119
- ### 7. Принять решение
120
-
121
- На основе проверок вывести результат:
122
-
123
- | Проверка | Результат | Статус |
124
- |----------|-----------|--------|
125
- | План неактивен | Plan inactive | `irrelevant` |
126
- | DoD выполнен | DoD completed | `irrelevant` |
127
- | Зависимости неактуальны | Dependencies inactive | `irrelevant` |
128
- | Все проверки пройдены | All checks passed | `relevant` |
129
-
130
- ## Fail-safe дизайн
131
-
132
- **Важно:** При неизвестном статусе или ошибке проверки использовать fallback → `relevant`
133
-
134
- Это гарантирует что тикет будет выполнен даже при проблемах с проверкой. Лучше выполнить лишний тикет, чем пропустить нужный.
135
-
136
- ## Формат результата
137
-
138
- Обязательно выведи блок результата:
139
-
140
- ```
141
- ---RESULT---
142
- status: relevant
143
- ---RESULT---
144
- ```
145
-
146
- Или для неактуальных:
147
-
148
- ```
149
- ---RESULT---
150
- status: irrelevant
151
- reason: <причина: plan_inactive / dod_completed / dependencies_inactive>
152
- ---RESULT---
153
- ```
154
-
155
- ## Примеры
156
-
157
- ### Пример 1: Тикет актуален
158
-
159
- ```markdown
160
- ## Result
161
-
162
- ### Что проверено
163
- - Родительский план PLAN-001: status: active ✓
164
- - DoD: не все критерии выполнены ✓
165
- - Зависимости: все активны ✓
166
-
167
- ### Решение
168
- Тикет актуален, можно выполнять
169
-
170
- ---RESULT---
171
- status: relevant
172
- ---RESULT---
173
- ```
174
-
175
- ### Пример 2: План завершён
176
-
177
- ```markdown
178
- ## Result
179
-
180
- ### Что проверено
181
- - Родительский план PLAN-001: status: completed ✗
182
-
183
- ### Решение
184
- План уже завершён, тикет неактуален
185
-
186
- ---RESULT---
187
- status: irrelevant
188
- reason: plan_inactive
189
- ---RESULT---
190
- ```
191
-
192
- ### Пример 3: DoD выполнен
193
-
194
- ```markdown
195
- ## Result
196
-
197
- ### Что проверено
198
- - Родительский план PLAN-001: status: active ✓
199
- - DoD: все критерии отмечены [x] ✗
200
- - Секция "Результат выполнения": заполнена ✗
201
-
202
- ### Решение
203
- Задача уже выполнена, тикет неактуален
204
-
205
- ---RESULT---
206
- status: irrelevant
207
- reason: dod_completed
208
- ---RESULT---
209
- ```
210
-
211
- ## Интеграция с pipeline
212
-
213
- Этот skill используется в stage `check-relevance` который размещается между:
214
- - `move-to-in-progress` → `check-relevance` → `execute-task`
215
-
216
- Переходы:
217
- - `relevant` → перейти к `execute-task`
218
- - `irrelevant` → переместить тикет в `done/` с пометкой
219
- - `default` (fallback) → `execute-task` (fail-safe)
220
-
221
- ## Связанные skills
222
-
223
- - `execute-task` — выполняет задачу после проверки актуальности
224
- - `move-ticket` — перемещает неактуальные тикеты в done/
1
+ ---
2
+ name: check-relevance
3
+ description: Проверить актуальность тикета перед выполнением. Используется для предотвращения выполнения устаревших или уже завершённых задач.
4
+ ---
5
+
6
+ # Проверка актуальности тикета
7
+
8
+ > **ЗАПРЕТ:** НЕ перемещай, НЕ удаляй, НЕ переименовывай файлы тикетов. Твоя задача — ТОЛЬКО прочитать, при irrelevant добавить запись в таблицу ревью, и вернуть вердикт. Перемещение выполняет отдельный stage пайплайна. Проверяй ТОЛЬКО тикет из `ticket_id` контекста, игнорируй остальные поля (`ready_tickets` и т.д.).
9
+
10
+ Этот skill проверяет актуальность тикета перед его выполнением. Предотвращает выполнение устаревших/неактуальных задач.
11
+
12
+ ## Когда использовать
13
+
14
+ - Тикет только что перемещён в `in-progress/`
15
+ - Перед выполнением основной задачи (execute-task)
16
+ - Для фильтрации задач с неактивными планами или выполненными DoD
17
+
18
+ ## Шаги проверки
19
+
20
+ ### 0. Быстрый выход по существующему ревью
21
+
22
+ **До любых проверок** найди в тикете секцию `## Ревью`.
23
+
24
+ Если последняя запись имеет статус `⏭ skipped` — тикет уже был проверен и пропущен. **Повторно проверять НЕ НАДО**, новую запись skipped добавлять НЕ НАДО. Немедленно верни:
25
+
26
+ ```
27
+ ---RESULT---
28
+ status: irrelevant
29
+ reason: already_skipped
30
+ ---RESULT---
31
+ ```
32
+
33
+ Если последней записи нет или статус другой — переходи к шагу 1.
34
+
35
+ ### 1. Прочитать тикет
36
+
37
+ **ОБЯЗАТЕЛЬНО:** Используй `ticket_id` из секции Context промпта.
38
+
39
+ ```
40
+ Путь: .workflow/tickets/in-progress/{TICKET-ID}.md
41
+ ```
42
+
43
+ Извлечь:
44
+ - `parent_plan` — ссылка на родительский план
45
+ - `dependencies` — зависимости тикета
46
+ - `conditions` — условия выполнения
47
+ - Критерии готовности (Definition of Done)
48
+
49
+ ### 2. Проверить родительский план
50
+
51
+ Проверить статус родительского плана:
52
+
53
+ ```
54
+ Путь: .workflow/plans/current/{PARENT_PLAN}.md
55
+ ```
56
+
57
+ **Критерии неактуальности:**
58
+ - План имеет `status: completed` — план уже завершён
59
+ - План имеет `status: archived` — план заархивирован
60
+ - План имеет `status: cancelled` — план отменён
61
+
62
+ **Если план неактивен:** тикет `irrelevant`
63
+
64
+ ### 3. Проверить выполнение DoD
65
+
66
+ Проверить все критерии из Definition of Done тикета:
67
+
68
+ **Критерии неактуальности:**
69
+ - Все критерии уже отмечены как выполненные `[x]`
70
+ - В секции "Результат выполнения" уже есть заполненные данные
71
+
72
+ **Если DoD полностью выполнен:** тикет `irrelevant` (задача уже сделана)
73
+
74
+ ### 4. Проверить зависимости
75
+
76
+ Проверить тикеты из секции `dependencies`:
77
+
78
+ ```
79
+ Путь: .workflow/tickets/{status}/{DEP-TICKET}.md
80
+ ```
81
+
82
+ **Критерии неактуальности:**
83
+ - Зависимый тикет находится в `blocked/` с причиной "неактуально"
84
+ - Зависимый тикет был удалён или перемещён в архив
85
+
86
+ **Если критические зависимости неактуальны:** тикет `irrelevant`
87
+
88
+ ### 5. Проверить статус blocked
89
+
90
+ **Проверить секцию `## Блокировки` или frontmatter:**
91
+
92
+ Если тикет помечен как заблокированный → **неактуален**.
93
+
94
+ ### 6. При irrelevant — записать в таблицу ревью тикета
95
+
96
+ Если вердикт `irrelevant`, **ОБЯЗАТЕЛЬНО** добавь запись в секцию `## Ревью` тикета:
97
+
98
+ - Если секции `## Ревью` нет — создай её в конце файла
99
+ - Если таблица уже есть — добавь строку в конец таблицы
100
+
101
+ Формат записи:
102
+
103
+ ```
104
+ | {текущая дата} | ⏭️ skipped | {причина irrelevant: plan_inactive / dod_completed / dependencies_inactive} |
105
+ ```
106
+
107
+ Пример:
108
+
109
+ ```markdown
110
+ ## Ревью
111
+
112
+ | Дата | Статус | Самари |
113
+ |------|--------|--------|
114
+ | 2026-03-10 | ⏭️ skipped | DoD уже выполнен, тикет неактуален |
115
+ ```
116
+
117
+ Это единственная допустимая запись в файл — только добавление строки в таблицу ревью.
118
+
119
+ ### 7. Принять решение
120
+
121
+ На основе проверок вывести результат:
122
+
123
+ | Проверка | Результат | Статус |
124
+ |----------|-----------|--------|
125
+ | План неактивен | Plan inactive | `irrelevant` |
126
+ | DoD выполнен | DoD completed | `irrelevant` |
127
+ | Зависимости неактуальны | Dependencies inactive | `irrelevant` |
128
+ | Все проверки пройдены | All checks passed | `relevant` |
129
+
130
+ ## Fail-safe дизайн
131
+
132
+ **Важно:** При неизвестном статусе или ошибке проверки использовать fallback → `relevant`
133
+
134
+ Это гарантирует что тикет будет выполнен даже при проблемах с проверкой. Лучше выполнить лишний тикет, чем пропустить нужный.
135
+
136
+ ## Формат результата
137
+
138
+ Обязательно выведи блок результата:
139
+
140
+ ```
141
+ ---RESULT---
142
+ status: relevant
143
+ ---RESULT---
144
+ ```
145
+
146
+ Или для неактуальных:
147
+
148
+ ```
149
+ ---RESULT---
150
+ status: irrelevant
151
+ reason: <причина: plan_inactive / dod_completed / dependencies_inactive>
152
+ ---RESULT---
153
+ ```
154
+
155
+ ## Примеры
156
+
157
+ ### Пример 1: Тикет актуален
158
+
159
+ ```markdown
160
+ ## Result
161
+
162
+ ### Что проверено
163
+ - Родительский план PLAN-001: status: active ✓
164
+ - DoD: не все критерии выполнены ✓
165
+ - Зависимости: все активны ✓
166
+
167
+ ### Решение
168
+ Тикет актуален, можно выполнять
169
+
170
+ ---RESULT---
171
+ status: relevant
172
+ ---RESULT---
173
+ ```
174
+
175
+ ### Пример 2: План завершён
176
+
177
+ ```markdown
178
+ ## Result
179
+
180
+ ### Что проверено
181
+ - Родительский план PLAN-001: status: completed ✗
182
+
183
+ ### Решение
184
+ План уже завершён, тикет неактуален
185
+
186
+ ---RESULT---
187
+ status: irrelevant
188
+ reason: plan_inactive
189
+ ---RESULT---
190
+ ```
191
+
192
+ ### Пример 3: DoD выполнен
193
+
194
+ ```markdown
195
+ ## Result
196
+
197
+ ### Что проверено
198
+ - Родительский план PLAN-001: status: active ✓
199
+ - DoD: все критерии отмечены [x] ✗
200
+ - Секция "Результат выполнения": заполнена ✗
201
+
202
+ ### Решение
203
+ Задача уже выполнена, тикет неактуален
204
+
205
+ ---RESULT---
206
+ status: irrelevant
207
+ reason: dod_completed
208
+ ---RESULT---
209
+ ```
210
+
211
+ ## Интеграция с pipeline
212
+
213
+ Этот skill используется в stage `check-relevance` который размещается между:
214
+ - `move-to-in-progress` → `check-relevance` → `execute-task`
215
+
216
+ Переходы:
217
+ - `relevant` → перейти к `execute-task`
218
+ - `irrelevant` → переместить тикет в `done/` с пометкой
219
+ - `default` (fallback) → `execute-task` (fail-safe)
220
+
221
+ ## Связанные skills
222
+
223
+ - `execute-task` — выполняет задачу после проверки актуальности
224
+ - `move-ticket` — перемещает неактуальные тикеты в done/
@@ -0,0 +1,100 @@
1
+ # Coach — Модульный скилл
2
+
3
+ Скилл для агента workflow-ai, обрабатывающего тикеты `COACH-*`.
4
+ Мета-скил для создания, аудита и совершенствования других скилов.
5
+
6
+ ## Структура
7
+
8
+ ```
9
+ coach/
10
+ ├── SKILL.md # Ядро: роль, маршрутизация, принципы
11
+
12
+ ├── workflows/ # Пошаговые воркфлоу по типам тикетов
13
+ │ ├── create.md # COACH-*: CREATE — создание нового скила
14
+ │ ├── audit.md # COACH-*: AUDIT — полный аудит скила
15
+ │ ├── analyze.md # COACH-*: ANALYZE — анализ эффективности
16
+ │ ├── improve.md # COACH-*: IMPROVE — точечное улучшение
17
+ │ ├── research.md # COACH-*: RESEARCH — поиск знаний
18
+ │ └── review.md # COACH-*: REVIEW — ревью структуры и качества
19
+
20
+ ├── knowledge/ # Экспертные знания (подгружаются по запросу)
21
+ │ ├── skill-anatomy.md # Эталонная структура скила
22
+ │ ├── common-antipatterns.md # Типичные ошибки в скилах
23
+ │ └── prompt-engineering.md # Принципы написания инструкций
24
+
25
+ ├── algorithms/ # Формализованные методы принятия решений
26
+ │ ├── skill-scoring.md # Оценка качества скила (0–100)
27
+ │ ├── gap-analysis.md # Поиск пробелов в покрытии скила
28
+ │ └── improvement-prioritization.md # Приоритизация улучшений (ICE)
29
+
30
+ ├── templates/ # Шаблоны вывода
31
+ │ ├── new-skill.md # Структура нового скила
32
+ │ ├── audit-report.md # Результат аудита
33
+ │ └── improvement-plan.md # План улучшений
34
+
35
+ └── README.md # Этот файл
36
+ ```
37
+
38
+ ## Как это работает
39
+
40
+ 1. Агент получает тикет `COACH-*` из `in-progress/`
41
+ 2. **SKILL.md** — всегда в контексте: роль, маршрутизация, принципы
42
+ 3. По типу тикета агент подгружает нужный **workflow**
43
+ 4. Воркфлоу ссылается на **knowledge** и **algorithms** по необходимости
44
+ 5. Результат оформляется по **template**
45
+
46
+ ## Типичные сценарии
47
+
48
+ | Задача | Тикет | Воркфлоу |
49
+ |--------|-------|----------|
50
+ | Создать скил для новой роли | COACH-001: CREATE | `workflows/create.md` |
51
+ | Проверить качество GML-скила | COACH-002: AUDIT | `workflows/audit.md` |
52
+ | Понять почему тикеты GML выполняются плохо | COACH-003: ANALYZE | `workflows/analyze.md` |
53
+ | Добавить знания в скил | COACH-004: IMPROVE | `workflows/improve.md` |
54
+ | Найти лучшие практики для домена | COACH-005: RESEARCH | `workflows/research.md` |
55
+ | Быстро проверить новый скил | COACH-006: REVIEW | `workflows/review.md` |
56
+
57
+ ## Как расширять
58
+
59
+ ### Добавить новый тип тикета
60
+
61
+ 1. Создай `workflows/new-type.md` с алгоритмом выполнения
62
+ 2. Добавь строку в таблицу маршрутизации в `SKILL.md`
63
+ 3. Если нужен шаблон вывода — добавь в `templates/`
64
+
65
+ ### Добавить новые знания
66
+
67
+ 1. Создай файл в `knowledge/` (например `knowledge/skill-versioning.md`)
68
+ 2. Добавь строку в таблицу «Загрузка знаний» в `SKILL.md`
69
+ 3. Укажи в каких воркфлоу его подгружать
70
+
71
+ ### Добавить новый алгоритм
72
+
73
+ 1. Создай файл в `algorithms/` (например `algorithms/complexity-estimation.md`)
74
+ 2. Добавь строку в таблицу «Загрузка алгоритмов» в `SKILL.md`
75
+ 3. Укажи в каких воркфлоу его использовать
76
+
77
+ ### Добавить новый шаблон
78
+
79
+ 1. Создай файл в `templates/`
80
+ 2. Укажи в соответствующем воркфлоу ссылку на шаблон
81
+
82
+ ### Расширить существующие модули
83
+
84
+ Каждый файл в `knowledge/` содержит маркер:
85
+ ```
86
+ <!-- РАСШИРЕНИЕ: добавляй ... ниже -->
87
+ ```
88
+ Дописывай новую информацию после этого маркера.
89
+
90
+ ## Примеры расширений
91
+
92
+ **Новый антипаттерн:** допиши в `knowledge/common-antipatterns.md` строку в таблицу по формату существующих.
93
+
94
+ **Новый критерий scoring:** допиши в `algorithms/skill-scoring.md` строку в нужную категорию (пересчитай максимум баллов).
95
+
96
+ **Новый тип исследования:** допиши в `workflows/research.md` строку в таблицу поисковых запросов.
97
+
98
+ **Новый воркфлоу (пример — миграция скила на новую версию):**
99
+ 1. Создай `workflows/migrate.md`
100
+ 2. В `SKILL.md` добавь строку: `| MIGRATE | «миграция», «обновить формат» | ... | → workflows/migrate.md |`