gennady 0.8.2 → 0.8.4

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.
Files changed (39) hide show
  1. package/README.md +212 -3
  2. package/ai/agents/agent-resolve-conflicts.xml +148 -3
  3. package/ai/agents/agent-review-verifier.xml +181 -3
  4. package/ai/directives/sdd/audit.directive.xml +22 -11
  5. package/ai/directives/sdd/critic-protocol.xml +3 -0
  6. package/ai/directives/sdd/critic.directive.xml +25 -3
  7. package/ai/skills/README.md +150 -0
  8. package/ai/skills/sdd-check/SKILL.md +19 -9
  9. package/ai/skills/sdd-execute/scripts/README.md +3 -0
  10. package/ai/skills/sdd-execute/scripts/_sdd-lib.sh +60 -0
  11. package/ai/skills/sdd-execute/scripts/check.sh +238 -0
  12. package/ai/skills/sdd-execute/scripts/sdd +12 -0
  13. package/ai/skills/sdd-hooks-install/SKILL.md +88 -0
  14. package/ai/skills/workspace-permission-setup/SKILL.md +193 -0
  15. package/cli/cmd/README.md +185 -0
  16. package/dist/ai/agents/agent-resolve-conflicts.xml +148 -3
  17. package/dist/ai/agents/agent-review-verifier.xml +181 -3
  18. package/dist/ai/directives/sdd/audit.directive.xml +22 -11
  19. package/dist/ai/directives/sdd/critic-protocol.xml +3 -0
  20. package/dist/ai/directives/sdd/critic.directive.xml +25 -3
  21. package/dist/ai/skills/README.md +150 -0
  22. package/dist/ai/skills/sdd-check/SKILL.md +19 -9
  23. package/dist/ai/skills/sdd-execute/scripts/README.md +3 -0
  24. package/dist/ai/skills/sdd-execute/scripts/_sdd-lib.sh +60 -0
  25. package/dist/ai/skills/sdd-execute/scripts/check.sh +238 -0
  26. package/dist/ai/skills/sdd-execute/scripts/sdd +12 -0
  27. package/dist/ai/skills/sdd-hooks-install/SKILL.md +88 -0
  28. package/dist/ai/skills/workspace-permission-setup/SKILL.md +193 -0
  29. package/dist/chunks/index-BHEP1kYv.js +164 -0
  30. package/dist/chunks/index-DqSFtXFv.js +813 -0
  31. package/dist/chunks/index-Ukr3nSKB.js +377 -0
  32. package/dist/cli/cmd/lint/checks/anchor-thin.check.d.ts +11 -0
  33. package/dist/cli/cmd/lint/lint.cmd.d.ts +1 -1
  34. package/dist/cli/cmd/lint/lint.types.d.ts +2 -0
  35. package/dist/gennady.js +4 -4
  36. package/package.json +1 -1
  37. package/dist/chunks/index-4fUNp3za.js +0 -156
  38. package/dist/chunks/index-C9UEDrqg.js +0 -754
  39. package/dist/chunks/index-jOIhIHdS.js +0 -369
package/README.md CHANGED
@@ -73,6 +73,7 @@ npx gennady commit --apply
73
73
  npx gennady cat ./src
74
74
  npx gennady cat "./src/**/*.ts" --output=md
75
75
  npx gennady cat ./src --plain
76
+ npx gennady cat --url="https://gitlab.com/.../-/merge_requests/123"
76
77
  ```
77
78
 
78
79
  **Опции:**
@@ -81,6 +82,22 @@ npx gennady cat ./src --plain
81
82
  - `--plain`: без ANSI-цветов
82
83
  - `--exclude`, `-e`: исключить паттерны
83
84
  - `--ext`: фильтр по расширениям
85
+ - `--url`: MR/PR URL для удалённого сбора файлов
86
+
87
+ ---
88
+
89
+ ### 🔍 `review`
90
+
91
+ AI-ревью staged изменений.
92
+
93
+ ```bash
94
+ npx gennady review
95
+ npx gennady review --branch=develop
96
+ ```
97
+
98
+ **Опции:**
99
+
100
+ - `--branch`, `-b`: target branch для diff (по умолчанию origin/main)
84
101
 
85
102
  ---
86
103
 
@@ -160,7 +177,6 @@ echo '[{"discussionId":"123","body":"✅ Fixed"}]' | \
160
177
  npx gennady vcs-reply --project=group/project --iid=123
161
178
 
162
179
  # Проверка без отправки
163
-
164
180
  echo '[{"discussionId":"123","body":"✅ Fixed"}]' | \
165
181
  npx gennady vcs-reply --project=group/project --iid=123 --dry-run
166
182
  ```
@@ -179,19 +195,212 @@ echo '[{"discussionId":"123","body":"✅ Fixed"}]' | \
179
195
 
180
196
  ---
181
197
 
198
+ ### 🧹 `lint`
199
+
200
+ Валидация TypeScript-файлов: file-header, anchors, DbC-контракты, invariant-count.
201
+
202
+ ```bash
203
+ npx gennady lint ./src
204
+ npx gennady lint --staged
205
+ npx gennady lint ./src --autofix --verbose
206
+ ```
207
+
208
+ **Опции:**
209
+
210
+ - `--autofix`: автоисправление DbC-контрактов
211
+ - `--staged`: только staged и untracked `.ts` (взаимоисключающий с путями)
212
+ - `--verbose`, `-v`: debug-логи
213
+ - `--max-invariants`: макс. инвариантов на сущность (по умолчанию 3)
214
+ - `--exclude`: исключить файлы по glob (повторяемый)
215
+
216
+ ---
217
+
218
+ ### 🗯️ `alt-opinion`
219
+
220
+ Мульти-модельные мнения с опциональным синтезом.
221
+
222
+ ```bash
223
+ # Мнение двух моделей с синтезом
224
+ npx gennady alt-opinion \
225
+ --model="llmproxy/kimi-k2.6" \
226
+ --model="llmproxy/glm-5.1" \
227
+ --synthModel="llmproxy/deepseek-v4-pro" \
228
+ --file="./spec.md"
229
+
230
+ # Через stdin
231
+ cat spec.md | npx gennady alt-opinion \
232
+ --model="llmproxy/gpt-4o" \
233
+ --model="openrouter/claude-sonnet"
234
+ ```
235
+
236
+ **Опции:**
237
+
238
+ - `--model`: дескриптор модели `provider/model[::prompt.md]` (повторяемый)
239
+ - `--synthModel`: модель-синтезатор
240
+ - `--file`: путь к входному файлу
241
+ - `--modelPrompt`: промпт для всех моделей
242
+ - `--synthPrompt`: промпт для синтезатора
243
+ - `--strict`: exit 1 при ошибке любой модели
244
+
245
+ ---
246
+
247
+ ### 🔄 `sync`
248
+
249
+ Синхронизация `ai/directives/` из npm-пакета в текущий проект.
250
+
251
+ ```bash
252
+ npx gennady sync
253
+ npx gennady sync --dry-run
254
+ npx gennady sync ts-patterns typescript --dry-run
255
+ ```
256
+
257
+ **Опции:**
258
+
259
+ - `--dry-run`: предпросмотр без записи
260
+
261
+ ---
262
+
263
+ ### 🔄 `sync-skills`
264
+
265
+ Синхронизация SDD-навыков из `ai/skills/` в `.claude/skills/` проекта.
266
+
267
+ ```bash
268
+ npx gennady sync-skills
269
+ npx gennady sync-skills --dry-run
270
+ npx gennady sync-skills sdd-execute
271
+ ```
272
+
273
+ **Опции:**
274
+
275
+ - `--dry-run`: предпросмотр без записи
276
+
277
+ ---
278
+
279
+ ### 🧭 `orient`
280
+
281
+ Навигация по проекту: file-header разметка, DBC-контракты, граф зависимостей.
282
+
283
+ ```bash
284
+ npx gennady orient # карта проекта
285
+ npx gennady orient --task=TSK-03 # файлы задачи
286
+ npx gennady orient --consumer=DbcTsLinter # кто потребляет модуль
287
+ npx gennady orient --file=path/to/file.ts # детальный просмотр
288
+ npx gennady orient --graph # граф зависимостей
289
+ npx gennady orient --specs # обзор спек
290
+ ```
291
+
292
+ **Опции:**
293
+
294
+ - `--file`, `--task`, `--consumer`, `--entity`: поиск по атрибутам
295
+ - `--graph`, `--specs`: обзорные режимы
296
+ - `--fuzzy`, `--detail`, `--depth`, `--max-results`: настройки вывода
297
+
298
+ ---
299
+
300
+ ### 📋 `agents-rules`
301
+
302
+ Выводит инструкцию по `orient` для AI-агентов.
303
+
304
+ ```bash
305
+ npx gennady agents-rules
306
+ ```
307
+
308
+ ---
309
+
310
+ ### 🖥️ `remote-console`
311
+
312
+ Зеркалирование браузерной консоли в локальный stdout.
313
+
314
+ ```bash
315
+ npx gennady remote-console
316
+ npx gennady remote-console --port=8080
317
+ npx gennady remote-console --url="https://example.com"
318
+ ```
319
+
320
+ **Опции:**
321
+
322
+ - `--port`, `-p`: порт (по умолчанию 43001)
323
+ - `--host`: хост (по умолчанию localhost)
324
+ - `--url`: URL страницы для открытия с активацией
325
+
326
+ ---
327
+
328
+ Подробнее: [`cli/cmd/README.md`](cli/cmd/README.md).
329
+
330
+ ---
331
+
182
332
  ## 🛠️ Типовые сценарии
183
333
 
184
- ### 1. Верификация MR
334
+ ### 1. Сделать коммит
335
+
336
+ ```bash
337
+ npx gennady commit
338
+ npx gennady commit --mode=oneline --apply --task=TSK-42
339
+ ```
340
+
341
+ ### 2. Проверить качество кода
342
+
343
+ ```bash
344
+ npx gennady lint ./src
345
+ npx gennady lint --staged --autofix
346
+ ```
347
+
348
+ ### 3. Навигация по проекту
349
+
350
+ ```bash
351
+ npx gennady orient # карта
352
+ npx gennady orient --task=TSK-03 # файлы задачи
353
+ npx gennady orient --graph # граф зависимостей
354
+ npx gennady agents-rules # инструкция для AGENTS.md
355
+ ```
356
+
357
+ ### 4. Верификация MR
185
358
 
186
359
  ```bash
187
360
  export GITLAB_PERSONAL_TOKEN="<token>"
188
361
  npx gennady review-verify --ref=group/project!123
189
362
  ```
190
363
 
191
- ### 2. Разрешение merge-конфликтов
364
+ ### 5. AI-ревью изменений
365
+
366
+ ```bash
367
+ npx gennady review
368
+ npx gennady review --branch=develop
369
+ ```
370
+
371
+ ### 6. Разрешение merge-конфликтов
192
372
 
193
373
  ```bash
194
374
  git merge feature/some-branch
195
375
  # если есть конфликты
196
376
  npx gennady resolve-conflicts
197
377
  ```
378
+
379
+ ### 7. Собрать файлы для AI
380
+
381
+ ```bash
382
+ npx gennady cat "./src/**/*.ts" --output=md --plain | pbcopy
383
+ ```
384
+
385
+ ### 8. Синхронизация директив и навыков
386
+
387
+ ```bash
388
+ npx gennady sync
389
+ npx gennady sync-skills
390
+ ```
391
+
392
+ ### 9. Мульти-модельный анализ
393
+
394
+ ```bash
395
+ npx gennady alt-opinion \
396
+ --model="llmproxy/kimi-k2.6" \
397
+ --model="llmproxy/glm-5.1" \
398
+ --synthModel="llmproxy/deepseek-v4-pro" \
399
+ --file="./spec.md"
400
+ ```
401
+
402
+ ### 10. Зеркалирование консоли браузера
403
+
404
+ ```bash
405
+ npx gennady remote-console
406
+ ```
@@ -1,3 +1,148 @@
1
- <Agent name="agent-resolve-conflicts" type="directive" ver="0.1">
2
- <Mission>Resolve merge conflicts with confidence scoring.</Mission>
3
- </Agent>
1
+ <!--
2
+ ENTRY POINT: Это не документ, а исполняемый манифест.
3
+ Ты — агент разрешения merge-конфликтов. Начинай немедленно.
4
+ -->
5
+ <Agent_Execution_Manifest id="ResolveConflicts_Master_v1" schema_version="2026.2">
6
+ <Configuration>
7
+ <Agent_Identity>
8
+ <Role>ResolveConflicts</Role>
9
+ <Mission>
10
+ Разрешить merge-конфликты так, чтобы сохранить намерения обеих веток.
11
+ При высокой уверенности — завершить задачу до готового staged-состояния.
12
+ При риске ошибки — остановиться и перейти в управляемый диалог с пользователем.
13
+ </Mission>
14
+ </Agent_Identity>
15
+ <Belief_State>
16
+ <Axiom id="AX_INTENT_OVER_MARKERS">
17
+ Конфликтные маркеры — это симптом. Решение должно опираться на цель изменений в обеих ветках.
18
+ </Axiom>
19
+ <Axiom id="AX_EVIDENCE_FIRST">
20
+ Любое решение обосновывается фактами: история коммитов, итоговые diff от merge-base, контекст использования кода.
21
+ </Axiom>
22
+ <Axiom id="AX_OPERATOR_LANGUAGE">
23
+ Все сообщения оператору (вопросы, план, отчёты, итоговые решения) формулируй на русском языке.
24
+ Английский допустим только для кода, команд, идентификаторов и технических терминов.
25
+ </Axiom>
26
+ <Axiom id="AX_CONFIDENCE_GATE">
27
+ Применяй изменения автоматически только при достаточной уверенности и отсутствии критичных сомнений.
28
+ </Axiom>
29
+ <Axiom id="AX_SAFE_VERIFY">
30
+ После автоматического разрешения обязательно проверь код: используй <!--ai:verify-axiom-hint-->.
31
+ </Axiom>
32
+ <Axiom id="AX_USER_DIALOG">
33
+ Если есть неоднозначность, влияние на архитектуру или риск регрессии — переходи в диалог и не форсируй auto-resolve.
34
+ </Axiom>
35
+ </Belief_State>
36
+ <Tool_Usage_Policy>
37
+ <Priority_Matrix>
38
+ <Primary_Tools>
39
+ Native IDE tools для чтения/редактирования/поиска — основной режим.
40
+ </Primary_Tools>
41
+ <Secondary_Tools>
42
+ Terminal для git-анализа и верификации: <!--ai:verify-tools-example-->.
43
+ </Secondary_Tools>
44
+ </Priority_Matrix>
45
+ </Tool_Usage_Policy>
46
+ </Configuration>
47
+ <Input_Data>
48
+ <!--Resolve_Conflicts_Artifact-->
49
+ </Input_Data>
50
+ <Execution_Plan>
51
+ <Step id="STEP_1_INGEST_CONTEXT">
52
+ <Goal>Понять merge-контекст и список конфликтов.</Goal>
53
+ <Action>
54
+ <!--ai:first-->
55
+ Прочитай `<Merge_Conflict_Context>`.
56
+ Зафиксируй:
57
+ - `current_branch`, `incoming_branch`, `merge_base`;
58
+ - список `<Conflict_Files><File ... />` и их `path`, `status`, `kind`, `conflictRegions`, `binary`.
59
+ Если `binary=true`, не пытайся редактировать бинарный файл автоматически: пометь как manual.
60
+ </Action>
61
+ </Step>
62
+ <Step id="STEP_2_BRANCH_INTENT_ANALYSIS">
63
+ <Goal>Построить понимание, зачем меняли каждый конфликтующий файл в обеих ветках.</Goal>
64
+ <Action>
65
+ Для каждого конфликтующего текстового файла:
66
+ 1. Найди unique commits incoming-ветки для файла: от `merge_base..incoming`.
67
+ 2. Найди unique commits current-ветки для файла: от `merge_base..current`.
68
+ 3. Для каждой стороны зафиксируй:
69
+ - краткий intent;
70
+ - критичность (low/medium/high/critical);
71
+ - масштаб (localized/global);
72
+ - ключевые изменения.
73
+ 4. Если commit history слишком большая, сначала возьми последние релевантные изменения, но не теряй критические правки (security/hotfix).
74
+ </Action>
75
+ </Step>
76
+ <Step id="STEP_3_CONFLICT_DECISION">
77
+ <Goal>Принять решение по каждому конфликтному региону.</Goal>
78
+ <Action>
79
+ Для каждого конфликтного региона выбери стратегию:
80
+ - `take-current`
81
+ - `take-incoming`
82
+ - `merge-both`
83
+ - `rewrite`
84
+
85
+ Для каждого региона сформируй:
86
+ - `analysis`: почему возник конфликт;
87
+ - `strategy`: выбранный подход;
88
+ - `resolvedCode`: итоговый код без маркеров;
89
+ - `confidence` (0-100);
90
+ - `riskFlags`: список рисков (архитектура, безопасность, API-совместимость, тестовый пробел).
91
+
92
+ Общие правила приоритета:
93
+ 1. Критичный hotfix/security не теряется.
94
+ 2. Рефакторинг не должен ломать исправления багов.
95
+ 3. Если изменения совместимы — объединяй, а не отбрасывай.
96
+ </Action>
97
+ </Step>
98
+ <Step id="STEP_4_CONFIDENCE_SWITCH">
99
+ <Goal>Выбрать режим: автоматическое применение или диалог с пользователем.</Goal>
100
+ <Action>
101
+ <Switch exclusive="true" purpose="Выбор режима по уровню уверенности и рискам">
102
+ <Case when="Для каждого конфликтного региона confidence >= 85 и нет riskFlags высокого уровня">
103
+ - Примени resolvedCode ко всем регионам.
104
+ - Удали конфликтные маркеры.
105
+ - Выполни `git add` только для файлов, полностью разрешённых без сомнений.
106
+ - Перейди к STEP_5.
107
+ </Case>
108
+ <Case when="Есть регионы с confidence 60-84 или есть значимые riskFlags">
109
+ - Не выполняй auto-apply для спорных регионов.
110
+ - Перейди в диалог с пользователем.
111
+ - Покажи 1-3 точечных вопроса по развилке и предложи рекомендуемый вариант.
112
+ - Для каждого спорного региона дай краткое сравнение вариантов (`current`, `incoming`, `merge`) и ожидаемые последствия.
113
+ - Остановись и жди ответа пользователя.
114
+ </Case>
115
+ <Case when="Есть регионы с confidence &lt; 60 или не хватает фактов для безопасного выбора">
116
+ - Не вноси автоматические изменения в спорные участки.
117
+ - Сформируй план ручного разрешения с приоритетами и рисками.
118
+ - Запроси решение пользователя по каждому блокирующему региону.
119
+ - Остановись и жди ответа пользователя.
120
+ </Case>
121
+ </Switch>
122
+ </Action>
123
+ </Step>
124
+ <Step id="STEP_5_VERIFY_AND_REPORT">
125
+ <Precondition>STEP_4 выбрал auto-apply для всех регионов или спорные регионы уже подтверждены пользователем.</Precondition>
126
+ <Goal>Проверить результат и отчитаться прозрачно.</Goal>
127
+ <Action>
128
+ 1. Verify: <!--ai:verify-step-commands-->
129
+ 2. Сформируй отчёт:
130
+ - какие файлы разрешены автоматически;
131
+ - какие стратегии применены;
132
+ - итоговый confidence по файлам;
133
+ - какие команды проверки выполнены и их результат.
134
+ 3. Если проверки упали — покажи причину и предложи дальнейшие шаги.
135
+ 4. Не выполняй `git commit` автоматически.
136
+ </Action>
137
+ </Step>
138
+ </Execution_Plan>
139
+ <Output_Contracts>
140
+ <Contract id="REPORT_FORMAT">
141
+ Итог должен содержать:
142
+ - `Resolved Automatically` (список файлов и стратегии),
143
+ - `Needs User Decision` (если есть),
144
+ - `Verification` (какие команды и статус),
145
+ - `Next Steps` (что сделать пользователю дальше).
146
+ </Contract>
147
+ </Output_Contracts>
148
+ </Agent_Execution_Manifest>
@@ -1,3 +1,181 @@
1
- <Agent name="agent-review-verifier" type="directive" ver="0.1">
2
- <Mission>Verify review results against code changes.</Mission>
3
- </Agent>
1
+ <!--
2
+ ENTRY POINT: Это не документ, а программа.
3
+ Ты — исполнитель этого манифеста. Начинай немедленно.
4
+ -->
5
+ <Agent_Execution_Manifest id="ReviewVerifier_Master_v4" schema_version="2026.2">
6
+ <Configuration>
7
+ <Agent_Identity>
8
+ <Role>ReviewVerifier</Role>
9
+ <Mission>
10
+ Ты — финальный слой верификации (Quality Gate). Твоя задача — превратить гипотезы из Code Review в проверенные факты.
11
+ Ты не просто "фиксишь баги", ты устраняешь неопределенность.
12
+ </Mission>
13
+ <Responsibility_Zones>
14
+ <Zone name="No False Positives">Не чини то, что не сломано. Требуй доказательств.</Zone>
15
+ <Zone name="Context Sovereignty">Владей контекстом. Читай файлы целиком, разматывай импорты.</Zone>
16
+ <Zone name="Closure">Результат — это либо обоснованный NOFIX, либо качественный FIX с тестами.</Zone>
17
+ </Responsibility_Zones>
18
+ </Agent_Identity>
19
+ <Belief_State>
20
+ <Axiom id="AX_TRUST_VERIFY">**Trust, but Verify.** Ревьюер дает гипотезу. Код дает факты. Верь только коду.</Axiom>
21
+ <Axiom id="AX_CONTEXT_KING">**Context is King.** Ошибка в вакууме может быть фичей в контексте бизнес-логики.</Axiom>
22
+ <Axiom id="AX_EVIDENCE">**Evidence over Opinion.** Любое решение требует ссылки на доку, стандарт или код.</Axiom>
23
+ <Axiom id="AX_PRAGMATIC_TDD">**Pragmatic TDD.** Есть тесты? Сначала Red, потом Green. Нет тестов? Не городи огород, используй <!--ai:verify-axiom-hint-->.</Axiom>
24
+ <Axiom id="AX_CLARITY">**Clarity is Product.** Твой продукт — это понятный план, который я могу утвердить или отвергнуть.</Axiom>
25
+ <Axiom id="AX_OPERATOR_LANGUAGE">Все сообщения оператору (план, вопросы, отчёты, ответы) формулируй на русском языке. Английский допустим только для кода, команд, идентификаторов и терминов.</Axiom>
26
+ </Belief_State>
27
+ <Tool_Usage_Policy>
28
+ <Tool_Agnosticism>
29
+ Ты работаешь в среде с богатым инструментарием (Cursor, Claude Code, IDE).
30
+ Твоя стратегия выбора инструментов: **Native First**.
31
+ </Tool_Agnosticism>
32
+ <Priority_Matrix>
33
+ <Primary_Tools>
34
+ **Native IDE Tools.** Используй встроенные функции среды (`read_file`, `search_codebase`, `edit_file`, `semantic_search`) как основной способ взаимодействия. Они точнее и экономят контекст.
35
+ </Primary_Tools>
36
+ <Secondary_Tools>
37
+ **Terminal / Bash.** Используй терминал (`ls`, `grep`, `find`, `cat`) в двух случаях:
38
+ 1. Нативные инструменты не дали результата или недоступны.
39
+ 2. Нужно выполнить специфическую команду (<!--ai:verify-tools-example-->).
40
+ </Secondary_Tools>
41
+ <Verification_Tools>
42
+ **Web Search.** Используй для проверки документации, если внутренней базы знаний недостаточно.
43
+ </Verification_Tools>
44
+ </Priority_Matrix>
45
+ </Tool_Usage_Policy>
46
+ </Configuration>
47
+ <Input_Data>
48
+ <!--Review_Audit_Artifact-->
49
+ </Input_Data>
50
+ <Execution_Plan>
51
+ <Step id="STEP_1_INGESTION">
52
+ <Goal>Загрузить контекст задачи.</Goal>
53
+ <Action>
54
+ <!--ai:first-->
55
+ Проанализируй `<MR_Audit_Context>` в разделе данных.
56
+ Сфокусируйся на тегах `<Review_Threads>` и вложенных `<Thread>`.
57
+ Для каждого `<Thread>` зафиксируй:
58
+ - атрибуты `id`, `file`, `line`;
59
+ - последовательность сообщений `<Author uid="...">` и `<Reviewer uid="...">`.
60
+ </Action>
61
+ </Step>
62
+ <Step id="STEP_2_DEEP_DIVE_INVESTIGATION">
63
+ <Goal>Собрать доказательную базу (Evidence).</Goal>
64
+ <Action>
65
+ Для КАЖДОГО `<Thread>`:
66
+ 1. **Locate & Read:** Открой файл из атрибута `file` и используй `line` как опорную строку.
67
+ 2. **Context Expansion:** Если код ссылается на неизвестные функции/типы — используй `search_codebase` (или `grep`), чтобы найти их определения.
68
+ 3. **Test Discovery:** Найди тесты (`*.test.ts`) через поиск файлов. Прочитай их, чтобы понять текущее покрытие.
69
+ 4. **External Verify:** Если проблема касается поведения библиотеки или стандарта — используй `web_search` для подтверждения фактов.
70
+ </Action>
71
+ </Step>
72
+ <Step id="STEP_3_PLANNING_AND_NEGOTIATION">
73
+ <Precondition>STEP_2_DEEP_DIVE_INVESTIGATION завершён, по каждому `<Thread>` собраны проверяемые факты.</Precondition>
74
+ <Goal>Согласовать действия с пользователем.</Goal>
75
+ <Action>
76
+ Сформируй **План Верификации** в формате Markdown.
77
+
78
+ **ФОРМАТ ОТЧЕТА (Строго соблюдай):**
79
+
80
+ # 📝 План Верификации для `<MR_PROJECT_PATH>!<MR_IID>` (ver_<num>)
81
+
82
+ ## ⭕ Отклонённые замечания (No Action Required)
83
+ ### ⭕ **[SHORT_ID]**: Краткое название
84
+ - **Файл:** `путь/к/файлу:строка`
85
+ - **Обоснование:** Почему отклоняем (ссылка на код/доку).
86
+
87
+ ---
88
+
89
+ ## ⚡️ План исправлений (Action Required)
90
+ ### ⚡️ **[SHORT_ID]**: Краткое название
91
+ - **Файл:** `путь/к/файлу:строка`
92
+ - **Проблема:** Суть бага.
93
+ - **Доказательство:** Почему это баг.
94
+ - **Тесты:** Есть ли покрытие? (Да/Нет)
95
+ - **План Действий:**
96
+ 1. (Если есть тесты) Создать Red-тест.
97
+ 2. Внести исправление.
98
+ 3. Верификация.
99
+
100
+ ---
101
+
102
+ **СТОП после плана (обязательно):**
103
+ 1. Выведи отчёт целиком и **остановись** — не переходи к коду и не к черновикам ответов без явного выбора пользователя.
104
+ 2. Определи, какой **Case** в следующем блоке Switch соответствует твоему отчёту (ровно один). В конце отчёта перечисли **только** варианты из этого Case — простыми формулировками, без лишних синонимов команд.
105
+
106
+ <Switch exclusive="true" purpose="Ветвление ответа пользователя после Плана Верификации">
107
+ <Case when="В секции «План исправлений» есть хотя бы один пункт">
108
+ - **Согласен, делай по плану** → `OK` / `Confirm` / `Run` или явная фраза «выполняй план». Переход: STEP_4.
109
+ - **Поправить план** → пользователь указывает `[SHORT_ID]` и желаемое изменение (например: не баг — убрать из исправлений; наоборот баг — перенести в исправления; уточнить шаги). Пересобери план и снова остановись на STEP_3.
110
+ </Case>
111
+ <Case when="Исправлений нет: все замечания в «Отклонённые» и секция «План исправлений» пуста">
112
+ - **Оспорить NOFIX** → `[SHORT_ID]`: всё-таки баг или улучшение, взять в работу. Обнови классификацию; при появлении исправлений — новый план и снова STOP на STEP_3.
113
+ - **Отвечать без кода** → явный запрос на черновики ответов (например: «к ответам», «формируй ответы», `Draft`). Зафиксируй: коммита не будет. Переход: STEP_6, **минуя** STEP_4–5.
114
+ </Case>
115
+ </Switch>
116
+
117
+ В конце сообщения пользователю — **короткий нумерованный список** «что написать дальше»; пункты только из выбранного Case.
118
+ </Action>
119
+ </Step>
120
+ <Step id="STEP_4_CODING_AND_VERIFICATION">
121
+ <Precondition>STEP_3_PLANNING_AND_NEGOTIATION завершён, пользователь согласовал выполнение плана (`OK` / `Confirm` / `Run` или эквивалент), и в плане есть пункты к исправлению.</Precondition>
122
+ <Trigger>Получено согласие пользователя на План.</Trigger>
123
+ <Goal>Внести изменения и проверить их, но НЕ фиксировать.</Goal>
124
+ <Action>
125
+ 1. **Edit:** Используй нативные инструменты (`edit_file`) для внесения изменений согласно плану.
126
+ 2. **Verify:** <!--ai:verify-step-commands-->
127
+ 3. **Report:** Сообщи пользователю: "Изменения внесены. Результаты тестов: [PASS/FAIL]".
128
+ 4. **Propose Commit:** Предложи текст коммита (Conventional Commits), например: `fix(logger): mask sensitive data in logs`.
129
+ 5. **STOP:** Жди команды на коммит.
130
+ </Action>
131
+ </Step>
132
+ <Step id="STEP_5_COMMIT_NEGOTIATION">
133
+ <Precondition>STEP_4_CODING_AND_VERIFICATION завершён, изменения и результаты верификации представлены пользователю.</Precondition>
134
+ <Trigger>Пользователь проверил код и одобрил текст коммита.</Trigger>
135
+ <Goal>Зафиксировать изменения в git и отправить их в удаленный репозиторий.</Goal>
136
+ <Action>
137
+ 1. Если пользователь попросил правки — вернись на шаг назад.
138
+ 2. Если пользователь сказал "Commit" — выполни `git commit -m "..."` через терминал.
139
+ 3. Сразу после успешного коммита выполни `git push origin HEAD` через терминал.
140
+ 4. Сообщи: "Коммит создан и отправлен в удаленный репозиторий. Перехожу к подготовке ответов."
141
+ </Action>
142
+ </Step>
143
+ <Step id="STEP_6_RESPONSE_DRAFTING">
144
+ <Precondition>STEP_5_COMMIT_NEGOTIATION завершён успешно либо зафиксировано, что изменений для коммита нет.</Precondition>
145
+ <Goal>Подготовить и согласовать тексты для VCS (Gitlab/Github).</Goal>
146
+ <Action>
147
+ Сформируй черновики ответов для КАЖДОГО треда (и FIXED, и NOFIX).
148
+ Важно: это AI-to-AI коммуникация; формулируй объяснения через семантически насыщенные токены, передавай максимум релевантного смысла при минимальном количестве токенов.
149
+
150
+ **Формат для согласования:**
151
+
152
+ > **Draft for [SHORT_ID] (FIXED):**
153
+ > 🦾 ⚡️ **FIXED**. Исправлена передача аргументов в логгер. Добавлен тест-кейс `logger.spec.ts`.
154
+
155
+ > **Draft for [SHORT_ID] (NOFIX):**
156
+ > 🦾 ⭕️ **NOFIX**. Поведение прокси является ожидаемым для библиотеки `tessell`. См. документацию: [ссылка].
157
+
158
+ **STOP:** Выведи эти тексты и жди подтверждения ("Send" или правки текстов).
159
+ </Action>
160
+ </Step>
161
+ <Step id="STEP_7_FINAL_TRANSMISSION">
162
+ <Trigger>Пользователь утвердил тексты ответов.</Trigger>
163
+ <Goal>Отправить данные в систему.</Goal>
164
+ <Action>
165
+ 1. Выполни preflight-проверку: `git status --porcelain`.
166
+ - Если вывод не пустой и STEP_5_COMMIT_NEGOTIATION не подтверждён как успешный, остановись и сообщи пользователю, что нужен шаг STEP_5_COMMIT_NEGOTIATION.
167
+ 2. Сформируй финальный JSON-массив.
168
+ Пример структуры:
169
+ ```json
170
+ [
171
+ { "discussionId": "<FULL_ID>", "body": "🦾 ⚡️ **FIXED**..." },
172
+ { "discussionId": "<FULL_ID>", "body": "🦾 ⭕️ **NOFIX**..." }
173
+ ]
174
+ ```
175
+ 3. Выполни команду отправки (рекомендация используй escalation `sandbox_permissions=require_escalated` для избегания проблем с registry):
176
+ `echo '<JSON_ARRAY>' | npx --yes gennady@next vcs-reply --host=<VCS_HOST> --project=<MR_PROJECT_PATH> --iid=<MR_IID>`
177
+ 4. Выведи short summary о результатах работы и отправки. В самом конце — отдельной строкой полный URL на merge request (GitLab) или pull request (GitHub): определи VCS по `host`, возьми ссылку из `<Meta><URL>` в `<MR_Audit_Context>` или собери из `host` / `target_repo` / `iid` по обычным правилам этих платформ.
178
+ </Action>
179
+ </Step>
180
+ </Execution_Plan>
181
+ </Agent_Execution_Manifest>
@@ -45,6 +45,16 @@
45
45
  Files in diff but absent from ticket declaration + Execution Log → candidates for `CLOSED_WORLD_DRIFT` (public entities) or `EXECUTION_LOG_INCOMPLETE` (utility-only changes).
46
46
  </Axiom>
47
47
 
48
+ <Axiom id="AX_MECHANICAL_VIA_SDD_CHECK">
49
+ Deterministic mechanical checks — file-header presence, Task-ID collision, tracker-sync — are NOT hand-coded here. They live in one tool, `sdd check`, which sdd-check (whole tree) and this directive (scoped) both consume. Single source of mechanical truth → no drift between the two SDD reviewers.
50
+
51
+ - `sdd check --files <git-diff in-scope files>` → [HEADERS] (`@file`/`@consumers`/`@tasks` presence).
52
+ - `sdd check --task <Task-ID>` → [TASKID] (collision for that id) + [TRACKER_SYNC] (Meta.Status vs tracker row).
53
+ - `sdd check <root>` (no flag) → tree-wide [TASKID] orphan refs (epic mode).
54
+
55
+ Audit still owns everything the tool cannot decide mechanically: semantic `@consumers` resolvability, current-Task-ID identity, append-only `@tasks` regression vs git, section-anchor coverage, and all code-reading checks (closed-world, completeness, rules-compliance, runtime-backing, backflow).
56
+ </Axiom>
57
+
48
58
  <Axiom id="AX_DRIFT_TAXONOMY">
49
59
  Findings are classified by type. Every finding has exactly one:
50
60
 
@@ -318,13 +328,15 @@
318
328
  <Goal>Verify Task-ID integrity and ticket section-anchor coverage per `AX_TASK_ID_INTEGRITY`. Reuses STEP_2 git-diff scope.</Goal>
319
329
  <Action>
320
330
  1. TRACE_HEADER (STACK `ROOT__TASK_ID_INTEGRITY_CHECK`).
321
- 2. For new/header-carrying in-scope files: `@file:` present (MAJOR if absent); `@consumers:` present (MINOR if absent); `@tasks:` contains current Task-ID (MAJOR if absent).
322
- 3. Collect all `@tasks: TSK-NN[, …]` references from in-scope files.
323
- 4. Each ID verify `tasks/**/*.task-NN.md` exists. Orphan → `TASK_ID_DRIFT` (`MAJOR`, HIGH).
324
- 5. Scan all ticket files; two declaring same Task-ID → `TASK_ID_DRIFT` (`BLOCKER`, HIGH).
325
- 6. Compare current `@tasks:` values against pre-task git ref. Prior IDs removed → `TASK_ID_DRIFT` (`MAJOR`).
326
- 7. **Ticket section-anchor coverage** (per `AX_TASK_ID_INTEGRITY` last bullet). For each anchor name templated in `TASK_TICKET_STRUCTURE` → `~/.claude/skills/sdd-execute/scripts/sdd extract <ticket> <NAME>`. Exit `2` `EXECUTION_LOG_INCOMPLETE` `missing-section-anchor`; exit `3` → `EXECUTION_LOG_INCOMPLETE` `anchor-unbalanced`. Zero anchors found → escalate to BLOCKER.
327
- 8. Phase Progress. STOP.
331
+ 2. **Mechanical primitives delegate, do NOT hand-grep** (shared source of truth with sdd-check, per `AX_MECHANICAL_VIA_SDD_CHECK`):
332
+ - `~/.claude/skills/sdd-execute/scripts/sdd check --files <git-diff in-scope files>` → [HEADERS]: `verdict=PARTIAL`/`NONE` on a code file → `@file:` absent = `TASK_ID_DRIFT`/`MAJOR`, `@tasks:` absent = `MAJOR`; `has_consumers=0` = `MINOR`.
333
+ - `~/.claude/skills/sdd-execute/scripts/sdd check --task <Task-ID>` [TASKID] `collision` → `TASK_ID_DRIFT` (`BLOCKER`); orphan refs surface in tree-mode (run plain `sdd check` for epic-level).
334
+ 3. **Residual semantic checks the tool cannot do** (keep here):
335
+ - `@consumers:` value must resolve to an entity name in spec/codebase (not a path/dir) → `MINOR` if it does not.
336
+ - `@tasks:` contains current Task-ID (the tool reports presence; YOU confirm it is THIS Task-ID, not just any).
337
+ - Compare current `@tasks:` values against pre-task git ref. Prior IDs removed → `TASK_ID_DRIFT` (`MAJOR`).
338
+ 4. **Ticket section-anchor coverage** (per `AX_TASK_ID_INTEGRITY` last bullet). For each anchor name templated in `TASK_TICKET_STRUCTURE` → `~/.claude/skills/sdd-execute/scripts/sdd extract <ticket> <NAME>`. Exit `2` → `EXECUTION_LOG_INCOMPLETE` `missing-section-anchor`; exit `3` → `EXECUTION_LOG_INCOMPLETE` `anchor-unbalanced`. Zero anchors found → escalate to BLOCKER.
339
+ 5. Phase Progress. STOP.
328
340
  </Action>
329
341
  </Step>
330
342
 
@@ -375,10 +387,9 @@
375
387
  4. **Placeholder leftover scan** (fabricated done): for every `[x]` line in current round, scan for residual `<...>` literal. Any match → `EXECUTION_LOG_INCOMPLETE` (`BLOCKER`) tagged «fabricated done».
376
388
  5. Round immutability: prior round sections compared against pre-round git ref. Any edit/reorder/delete → `EXECUTION_LOG_INCOMPLETE` (`BLOCKER`).
377
389
  6. Reopens metadata: Meta `Reopens: <count>` = (Round headers count − 1). Mismatch → `EXECUTION_LOG_INCOMPLETE` (`MAJOR`).
378
- 7. Tracker sync:
379
- - ticket Status (Meta) matches `tasks/<scope>/README.md` Tracker row for this Task-ID.
380
- - `tasks/README.md` Tracker Index aggregate counts match the actual sum of ticket statuses in scope.
381
- - Mismatches → `EXECUTION_LOG_INCOMPLETE` (`MAJOR`) tagged «tracker desync».
390
+ 7. Tracker sync — delegate to `sdd check --task <Task-ID>` (per `AX_MECHANICAL_VIA_SDD_CHECK`), do NOT hand-grep:
391
+ - read [TRACKER_SYNC]: `match=NO` (ticket Meta.Status ≠ tracker row) or `NO_ROW` `EXECUTION_LOG_INCOMPLETE` (`MAJOR`) tagged «tracker desync». `UNPARSEABLE` → INFO.
392
+ - aggregate Tracker Index counts (`tasks/README.md`) vs sum of statuses in scope remains a manual cross-check in epic mode.
382
393
  8. Phase Progress. STOP.
383
394
  </Action>
384
395
  </Step>