kodu 2.1.2 → 2.2.0

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 (122) hide show
  1. package/AGENTS.md +23 -1
  2. package/__tests__/core/registry/registry.service.test.ts +82 -0
  3. package/__tests__/shared/runbook/runbook.service.test.ts +104 -0
  4. package/dist/package.json +1 -1
  5. package/dist/src/app.module.js +6 -0
  6. package/dist/src/app.module.js.map +1 -1
  7. package/dist/src/commands/init/init.command.d.ts +1 -0
  8. package/dist/src/commands/init/init.command.js +34 -1
  9. package/dist/src/commands/init/init.command.js.map +1 -1
  10. package/dist/src/commands/ops/ops-add.command.d.ts +18 -0
  11. package/dist/src/commands/ops/ops-add.command.js +102 -0
  12. package/dist/src/commands/ops/ops-add.command.js.map +1 -0
  13. package/dist/src/commands/ops/ops-init.command.d.ts +22 -0
  14. package/dist/src/commands/ops/ops-init.command.js +130 -0
  15. package/dist/src/commands/ops/ops-init.command.js.map +1 -0
  16. package/dist/src/commands/ops/ops-list.command.d.ts +12 -0
  17. package/dist/src/commands/ops/ops-list.command.js +73 -0
  18. package/dist/src/commands/ops/ops-list.command.js.map +1 -0
  19. package/dist/src/commands/ops/ops-path.command.d.ts +9 -0
  20. package/dist/src/commands/ops/ops-path.command.js +52 -0
  21. package/dist/src/commands/ops/ops-path.command.js.map +1 -0
  22. package/dist/src/commands/ops/ops-runbook.command.d.ts +12 -0
  23. package/dist/src/commands/ops/ops-runbook.command.js +81 -0
  24. package/dist/src/commands/ops/ops-runbook.command.js.map +1 -0
  25. package/dist/src/commands/ops/ops-status.command.d.ts +11 -0
  26. package/dist/src/commands/ops/ops-status.command.js +62 -0
  27. package/dist/src/commands/ops/ops-status.command.js.map +1 -0
  28. package/dist/src/commands/ops/ops-use.command.d.ts +12 -0
  29. package/dist/src/commands/ops/ops-use.command.js +76 -0
  30. package/dist/src/commands/ops/ops-use.command.js.map +1 -0
  31. package/dist/src/commands/ops/ops.command.d.ts +7 -0
  32. package/dist/src/commands/ops/ops.command.js +56 -0
  33. package/dist/src/commands/ops/ops.command.js.map +1 -0
  34. package/dist/src/commands/ops/ops.helpers.d.ts +2 -0
  35. package/dist/src/commands/ops/ops.helpers.js +11 -0
  36. package/dist/src/commands/ops/ops.helpers.js.map +1 -0
  37. package/dist/src/commands/ops/ops.module.d.ts +2 -0
  38. package/dist/src/commands/ops/ops.module.js +36 -0
  39. package/dist/src/commands/ops/ops.module.js.map +1 -0
  40. package/dist/src/core/registry/registry.module.d.ts +2 -0
  41. package/dist/src/core/registry/registry.module.js +22 -0
  42. package/dist/src/core/registry/registry.module.js.map +1 -0
  43. package/dist/src/core/registry/registry.schema.d.ts +24 -0
  44. package/dist/src/core/registry/registry.schema.js +21 -0
  45. package/dist/src/core/registry/registry.schema.js.map +1 -0
  46. package/dist/src/core/registry/registry.service.d.ts +16 -0
  47. package/dist/src/core/registry/registry.service.js +91 -0
  48. package/dist/src/core/registry/registry.service.js.map +1 -0
  49. package/dist/src/shared/runbook/runbook.module.d.ts +2 -0
  50. package/dist/src/shared/runbook/runbook.module.js +22 -0
  51. package/dist/src/shared/runbook/runbook.module.js.map +1 -0
  52. package/dist/src/shared/runbook/runbook.service.d.ts +20 -0
  53. package/dist/src/shared/runbook/runbook.service.js +118 -0
  54. package/dist/src/shared/runbook/runbook.service.js.map +1 -0
  55. package/dist/src/shared/runbook/runbook.templates.d.ts +6 -0
  56. package/dist/src/shared/runbook/runbook.templates.js +49 -0
  57. package/dist/src/shared/runbook/runbook.templates.js.map +1 -0
  58. package/dist/tsconfig.build.tsbuildinfo +1 -1
  59. package/package.json +1 -1
  60. package/registry.schema.json +39 -0
  61. package/scripts/generate-json-schema.ts +14 -5
  62. package/skills/ac/SKILL.md +239 -0
  63. package/skills/al/SKILL.md +98 -0
  64. package/skills/audit/SKILL.md +205 -0
  65. package/skills/audit/audit-baseline-template.yml +188 -0
  66. package/skills/audit/runtime-detect.md +64 -0
  67. package/skills/audit/stacks/_generic.md +41 -0
  68. package/skills/audit/stacks/_registry.md +47 -0
  69. package/skills/audit/stacks/go.md +66 -0
  70. package/skills/audit/stacks/java.md +44 -0
  71. package/skills/audit/stacks/node.md +57 -0
  72. package/skills/audit/stacks/python.md +45 -0
  73. package/skills/audit/stacks/rust.md +44 -0
  74. package/skills/audit-api-contracts/SKILL.md +201 -0
  75. package/skills/audit-architecture/SKILL.md +200 -0
  76. package/skills/audit-bugs/SKILL.md +226 -0
  77. package/skills/audit-concurrency/SKILL.md +197 -0
  78. package/skills/audit-deployment/SKILL.md +218 -0
  79. package/skills/audit-docs/SKILL.md +209 -0
  80. package/skills/audit-errors/SKILL.md +216 -0
  81. package/skills/audit-logging/SKILL.md +197 -0
  82. package/skills/audit-matrix/SKILL.md +245 -0
  83. package/skills/audit-meta/SKILL.md +120 -0
  84. package/skills/audit-naming/SKILL.md +200 -0
  85. package/skills/audit-owasp/SKILL.md +223 -0
  86. package/skills/audit-performance/SKILL.md +199 -0
  87. package/skills/audit-reinvention/SKILL.md +214 -0
  88. package/skills/audit-secrets/SKILL.md +198 -0
  89. package/skills/audit-tests/SKILL.md +210 -0
  90. package/skills/audit-validation/SKILL.md +206 -0
  91. package/skills/audit-verify/SKILL.md +139 -0
  92. package/skills/audit-yagni/SKILL.md +188 -0
  93. package/skills/doc-gen/SKILL.md +490 -0
  94. package/skills/doc-gen/scripts/doc_gen.py +911 -0
  95. package/skills/generate-project-docs/SKILL.md +380 -0
  96. package/skills/implement-project/SKILL.md +409 -0
  97. package/skills/litefront-prototype/SKILL.md +484 -0
  98. package/skills/ops/SKILL.md +94 -0
  99. package/skills/post-call-task-builder/SKILL.md +419 -0
  100. package/skills/skills-best-practices/SKILL.md +415 -0
  101. package/skills/start/SKILL.md +319 -0
  102. package/skills/tech-blueprint/SKILL.md +890 -0
  103. package/skills/tech-blueprint/scripts/blueprint_validator.py +417 -0
  104. package/src/app.module.ts +6 -0
  105. package/src/commands/init/init.command.ts +43 -1
  106. package/src/commands/ops/ops-add.command.ts +83 -0
  107. package/src/commands/ops/ops-init.command.ts +125 -0
  108. package/src/commands/ops/ops-list.command.ts +57 -0
  109. package/src/commands/ops/ops-path.command.ts +38 -0
  110. package/src/commands/ops/ops-runbook.command.ts +74 -0
  111. package/src/commands/ops/ops-status.command.ts +47 -0
  112. package/src/commands/ops/ops-use.command.ts +76 -0
  113. package/src/commands/ops/ops.command.ts +42 -0
  114. package/src/commands/ops/ops.helpers.ts +20 -0
  115. package/src/commands/ops/ops.module.ts +23 -0
  116. package/src/core/registry/registry.module.ts +9 -0
  117. package/src/core/registry/registry.schema.ts +46 -0
  118. package/src/core/registry/registry.service.ts +128 -0
  119. package/src/shared/runbook/runbook.module.ts +9 -0
  120. package/src/shared/runbook/runbook.service.ts +164 -0
  121. package/src/shared/runbook/runbook.templates.ts +66 -0
  122. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,214 @@
1
+ ---
2
+ name: audit-reinvention
3
+ description: >
4
+ Аудит переизобретения велосипедов: ручная реализация того, что уже есть в stdlib/языке,
5
+ в установленных зависимостях или дублируется внутри проекта; предлагает зрелое готовое решение.
6
+ Запускай при /audit-reinvention или запросе найти переизобретённые велосипеды.
7
+ ---
8
+
9
+ ## Правило применимости (Relevance Rule)
10
+
11
+ Применим к любому production-коду, где есть прикладная логика. Для тонких клеевых модулей (конфиги, чистые типы, сгенерированный код) — пропускай. Цель — найти код, который руками делает то, что уже умеет язык, рантайм, установленная библиотека или другая часть этого же проекта.
12
+
13
+ **Не путать с соседними аудитами** (граница ответственности, чтобы не дублировать находки):
14
+ - `audit-yagni` — про **лишнее**: ненужные абстракции, dead code, преждевременная оптимизация. Здесь — про **переизобретённое**: нужная функциональность, но написанная руками вместо готового решения.
15
+ - `audit-architecture` (ARC-04 god-объекты) — про размер/ответственность модулей. REINV-03 — про **смысловое дублирование** одинаковой логики в разных местах.
16
+ - Если нарушение лучше описывается соседним аудитом — отдай его туда и не дублируй.
17
+
18
+ ## Runtime Detection & Stack Profile
19
+
20
+ Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
21
+ (stdlib-аналоги, идиомы, анти-паттерны, примеры) берётся из профиля стека.
22
+
23
+ 1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
24
+ `runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
25
+
26
+ 2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
27
+ ```bash
28
+ if [ -f package.json ]; then echo "runtime=node"
29
+ elif [ -f go.mod ]; then echo "runtime=go"
30
+ elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
31
+ elif [ -f Cargo.toml ]; then echo "runtime=rust"
32
+ elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
33
+ else echo "runtime=generic"; fi
34
+ ```
35
+ Один запуск = один рантайм; не миксуй backend и frontend. При нескольких
36
+ маркерах (монорепо) — выбери по текущему scope и зафиксируй выбор в Audit Coverage.
37
+
38
+ 3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
39
+ (fallback `./skills/audit/stacks/_generic.md`).
40
+
41
+ Дальше: stdlib-аналоги и инструменты — из секций «Idioms»/«Tooling by category»
42
+ профиля; формулировки FAIL — из «Anti-patterns»; точечные подсказки — из «Check-ID
43
+ hints» по префиксу `REINV-`. Для `tier: general`/`generic` рекомендации без
44
+ уверенности в наличии аналога помечай `🔍 UNVERIFIED`.
45
+
46
+ **Важно:** что считать «готовым решением», определяй ТОЛЬКО по манифесту
47
+ зависимостей/lock-файлу и stdlib рантайма (см. профиль). Не предполагай наличие
48
+ библиотеки без её записи в зависимостях.
49
+
50
+ ## Severity Guide
51
+
52
+ | Severity | Критерий назначения |
53
+ |----------|---------------------|
54
+ | 🔴 Critical | Самописная **безопасность**-примитива: своё хеширование паролей, своя крипта, свой JWT-парсер, своё SQL-экранирование, свой HTML-санитайзер. Ручная реализация почти всегда содержит уязвимость. |
55
+ | 🟠 High | Переизобретение, дающее реальные баги в проде: самописный retry/таймаут без jitter, самописный парсер дат/таймзон, ручная конкурентная очередь, ручной деньги/decimal-арифметик на float. |
56
+ | 🟡 Medium | Поддерживаемость: руками написано то, что есть в stdlib или установленной либе, но работает корректно (dedup, deepClone, debounce, groupBy). |
57
+ | 🟢 Low | Мелочь: тривиальный однострочный аналог stdlib, читаемость не страдает. |
58
+
59
+ Правило: severity = impact × exploitability × blast radius. **Безопасность-примитивы всегда эскалируются** минимум до 🟠, чаще 🔴 — даже если «вроде работает». Одинаковый паттерн → одинаковый severity между аудитами.
60
+
61
+ ## Чеклист
62
+
63
+ | Check ID | Проверка |
64
+ |----------|----------|
65
+ | REINV-01 | Нет ручной реализации того, что есть в stdlib/языке/рантайме |
66
+ | REINV-02 | Нет ручной реализации того, что уже умеет установленная зависимость |
67
+ | REINV-03 | Нет смыслового дублирования: одинаковая логика не переписана в ≥2 местах вместо общей утилиты |
68
+ | REINV-04 | Крупные механизмы (ORM, DI, scheduler, logger, job queue, валидатор) не написаны с нуля при наличии зрелого стандартного решения |
69
+
70
+ ## Правила верификации
71
+
72
+ 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
73
+ 2. **Явная верификация = PASS**: ставь `✅ PASS` только если просмотрел ключевые модули (utils, helpers, lib, core, services) и подтвердил отсутствие переизобретения — укажи что именно проверено.
74
+ 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` для самописной реализации И подтвердить наличие готового аналога — ставь `🔍 UNVERIFIED`.
75
+ 4. **Аналог обязан существовать**: `❌ FAIL` для REINV-01/02/04 валиден ТОЛЬКО если ты назвал конкретный готовый аналог (stdlib-API, пакет из `package.json`, или зрелую библиотеку) — иначе это не велосипед, а просто код.
76
+ 5. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
77
+ 6. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
78
+
79
+ ## Evidence Quality Rules
80
+
81
+ Любой `❌ FAIL` обязан содержать:
82
+ - Точный `file:line` самописной реализации
83
+ - Минимальный код-фрагмент (1–3 строки)
84
+ - **Имя готового аналога**: `crypto.randomUUID()`, `structuredClone`, `zod` (есть в deps), `date-fns` и т.п.
85
+ - Causal chain: почему это велосипед → какой риск (баг/уязвимость/стоимость поддержки)
86
+
87
+ Запрещено:
88
+ - Помечать как велосипед код, для которого ты НЕ назвал конкретный готовый аналог
89
+ - Предполагать наличие библиотеки без записи в манифесте зависимостей/lock
90
+ - Считать «велосипедом» намеренно тонкую обёртку вокруг библиотеки (это адаптер, а не переизобретение)
91
+ - Если вывод основан на предположении — только `🔍 UNVERIFIED`
92
+
93
+ ## Language Rule
94
+
95
+ Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
96
+
97
+ ## Baseline
98
+
99
+ До анализа:
100
+ ```bash
101
+ if [ ! -f ./docs/audit-baseline.yml ]; then
102
+ mkdir -p ./docs
103
+ cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
104
+ printf "accepted: []\n" > ./docs/audit-baseline.yml
105
+ fi
106
+ cat ./docs/audit-baseline.yml
107
+ ```
108
+
109
+ ## Контекст анализа
110
+
111
+ > Примеры ниже — иллюстративные (Node/TS). Конкретные stdlib-аналоги и
112
+ > установленные библиотеки для текущего рантайма бери из загруженного профиля
113
+ > (`stacks/<runtime>.md`, секции Idioms/Anti-patterns/Check-ID hints). Например
114
+ > для Go: `[...new Set()]` → `slices`/`maps`, самописный query builder →
115
+ > `database/sql`/sqlc, ручная отмена → `context.Context`.
116
+
117
+ **REINV-01 — Ре-имплементация stdlib/языка/рантайма:**
118
+ - Дедупликация массива руками вместо `[...new Set(arr)]`
119
+ - Самописный deep clone вместо `structuredClone()`
120
+ - Генерация UUID руками вместо `crypto.randomUUID()`
121
+ - Ручной base64 вместо `Buffer`/`btoa`/`atob`
122
+ - Самописные `debounce`/`throttle`/`groupBy`/`flatten`, когда есть `Array.flat`, `Object.groupBy`, либо они уже в установленной либе (тогда это скорее REINV-02)
123
+ - Цикл с аккумулятором вместо `Promise.all`/`Promise.allSettled` для независимых задач
124
+ - Ручной парсинг query string вместо `URLSearchParams`
125
+ - Самописное сравнение/сортировка дат вместо `Intl`/установленной date-либы
126
+
127
+ **REINV-02 — Дублирование установленной зависимости:**
128
+ - Самописный HTTP retry/backoff при наличии `axios-retry`/`p-retry`/`got` (retry встроен)
129
+ - Ручная валидация полей при наличии `zod`/`yup`/`joi`/`class-validator`/`pydantic`
130
+ - Самописный `deepEqual`/`cloneDeep`/`pick`/`omit` при наличии `lodash`/`ramda`
131
+ - Ручная арифметика дат при наличии `date-fns`/`dayjs`/`luxon`
132
+ - Своя реализация того, что уже даёт фреймворк (свой body-parser/роутер/CORS при наличии встроенного)
133
+ - Свой in-memory кэш с TTL при наличии `lru-cache`/`node-cache` в deps
134
+
135
+ **REINV-03 — Внутренние смысловые дубликаты:**
136
+ - Одинаковая по смыслу функция скопирована в ≥2 файлах вместо общей утилиты
137
+ - Два хелпера под разными именами делают одно и то же
138
+ - Повторяющийся inline-блок (форматирование, маппинг, guard), который должен быть единой функцией
139
+ - Граница: если это про размер модуля — отдать в `audit-architecture` (ARC-04); если про мёртвый код — в `audit-yagni`
140
+
141
+ **REINV-04 — Самописный крупный механизм при наличии зрелого решения:**
142
+ - Свой ORM/query builder, свой DI-контейнер, свой scheduler/cron, свой logger, своя job queue, свой state machine, свой event bus
143
+ - Самописный механизм, для которого в экосистеме рантайма есть зрелое стандартное решение, ещё НЕ установленное в проект
144
+ - Для такого FAIL обязательна **оценка стоимости миграции** в решении (реалистичная, без «переписать всё»)
145
+
146
+ ## Правила рекомендаций (политика новых зависимостей)
147
+
148
+ Рекомендации **стек-агностичны**: опирайся на Runtime Detection, не привязывайся к конкретным шаблонам проекта.
149
+
150
+ Приоритет вариантов решения, сверху вниз:
151
+ 1. **stdlib/язык/рантайм** — всегда предпочтительнее, если аналог есть (нулевая стоимость).
152
+ 2. **Уже установленная зависимость** — если в манифесте зависимостей (см. профиль) есть подходящая либа, используй её.
153
+ 3. **Новая зависимость — осторожно**: предлагать ТОЛЬКО для зрелых/популярных библиотек (активная поддержка, высокая распространённость) И с обязательной оценкой стоимости миграции. Для мелочей (dedup, clone) новую либу НЕ предлагать — там хватает stdlib.
154
+
155
+ Для безопасности-примитивов (REINV-01/04 с severity 🔴): «оставить самописное» **не может** быть валидным вариантом — только переход на проверенное решение.
156
+
157
+ ## Инструментальная поддержка
158
+
159
+ Для REINV-03 используй инструмент категории **clone-detection** из профиля стека
160
+ (секция «Tooling by category»): он находит дублирующиеся блоки кода. Верифицируй
161
+ каждое совпадение вручную перед занесением в FAIL (бывают ложные: сгенерированный
162
+ код, похожие, но не идентичные по смыслу блоки). Если ячейка категории пустая
163
+ (`tier: general`/`generic`) — ищи повторы вручную и помечай находки `🔍 UNVERIFIED`.
164
+
165
+ Для REINV-02 сверяй найденные самописные реализации со списком установленных
166
+ зависимостей (манифест/lock из профиля) — что реально доступно в проекте.
167
+
168
+ ## Формат вывода
169
+
170
+ | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
171
+ |----------|----------|--------|-------------|----------------|---------|------------|
172
+ | REINV-01 | Нет ручной реализации того, что есть в stdlib/языке/рантайме | ❌ FAIL 🟡 | High | `src/utils/array.ts:12` — ручной dedup циклом; есть `[...new Set()]` | **1. Заменить на `[...new Set(arr)]`** \\ 2. Вынести в общий хелпер `unique()` \\ 3. Оставить, если важен порядок и кастомный компаратор — задокументировать | Нет |
173
+ | REINV-02 | Нет ручной реализации того, что уже умеет установленная зависимость | ❌ FAIL 🟠 | High | `src/http/client.ts:40` — самописный retry-цикл; в deps есть `axios-retry` | **1. Подключить `axios-retry` с exponential backoff + jitter** \\ 2. Заменить на `p-retry` (уже в deps) \\ 3. Оставить, добавив jitter и тесты — обосновать | Нет |
174
+ | REINV-04 | Крупные механизмы не написаны с нуля при наличии зрелого решения | ✅ PASS | Medium | `src/` — самописных ORM/DI/scheduler не найдено | — | — |
175
+ | REINV-03 | Нет смыслового дублирования логики | ⏸ ACCEPTED | Medium | `src/a.ts`, `src/b.ts` | В baseline: дубли в legacy-модуле, трекается в Jira PROJ-456 | — |
176
+
177
+ Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
178
+
179
+ Уверенность: `High` — нашёл самописную реализацию и подтвердил наличие аналога / `Medium` — паттерн вероятен, аналог есть, но контекст использования проверен выборочно / `Low` — ограниченный контекст, полная уверенность невозможна
180
+
181
+ Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
182
+
183
+ `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
184
+
185
+ Требования к решениям:
186
+ - Каждый вариант называет **конкретный** готовый аналог (API stdlib или имя пакета)
187
+ - Взаимно исключающие (не перефразировки одного и того же)
188
+ - Соответствуют текущему рантайму и политике зависимостей выше
189
+ - Не требуют переписать всю систему — realistic migration cost
190
+ - Вариант 3 может быть «оставить, задокументировать причину» — НО запрещён для безопасности-примитивов (🔴)
191
+
192
+ В конце отчёта добавь раздел покрытия:
193
+ ```
194
+ ## Audit Coverage
195
+ Проверено: src/utils/**, src/services/**, src/http/**
196
+ Пропущено: scripts/**, migrations/**, tests/**, generated/**
197
+ Файлов проверено: N | Пропущено: N
198
+ ```
199
+
200
+ Если все PASS — выведи: `✅ Переизобретённых велосипедов не обнаружено.`
201
+
202
+ ## Сохранение результатов
203
+
204
+ 1. Найди папку сессии:
205
+ ```bash
206
+ ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
207
+ ```
208
+ Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
209
+ 2. Сохрани через Write: `<AUDIT_DIR>/audit-reinvention.md`
210
+
211
+ ```
212
+ # Audit Report: Reinventing the Wheel — <YYYY-MM-DD HH:MM>
213
+ <таблица>
214
+ ```
@@ -0,0 +1,198 @@
1
+ ---
2
+ name: audit-secrets
3
+ description: >
4
+ Аудит утечки секретов: поиск захардкоженных ключей, паролей, токенов, credentials в коде.
5
+ Запускай когда пользователь просит проверить код на наличие секретов, утечки credentials,
6
+ hardcoded паролей или при инвоке /audit-secrets.
7
+ ---
8
+
9
+ ## Правило применимости (Relevance Rule)
10
+
11
+ Перед анализом оцени: содержит ли код конфигурации, строки подключения, токены, ключи шифрования, credentials или работу с внешними API? Если анализируемый файл/модуль не содержит ни одного из перечисленных паттернов — верни пустой ответ без таблицы.
12
+
13
+ ## Runtime Detection & Stack Profile
14
+
15
+ Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
16
+ (инструменты, идиомы, анти-паттерны, примеры) берётся из профиля стека.
17
+
18
+ 1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
19
+ `runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
20
+
21
+ 2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
22
+ ```bash
23
+ if [ -f package.json ]; then echo "runtime=node"
24
+ elif [ -f go.mod ]; then echo "runtime=go"
25
+ elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
26
+ elif [ -f Cargo.toml ]; then echo "runtime=rust"
27
+ elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
28
+ else echo "runtime=generic"; fi
29
+ ```
30
+ Один запуск = один рантайм; не миксуй backend и frontend. Если найдено
31
+ несколько маркеров (монорепо) — выбери соответствующий текущему scope/анализируемым
32
+ файлам и зафиксируй выбор в разделе Audit Coverage.
33
+
34
+ 3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
35
+ (fallback `./skills/audit/stacks/_generic.md`, если файл не найден).
36
+
37
+ Дальше используй профиль:
38
+ - **Инструменты** — из секции «Tooling by category» профиля (раздел
39
+ «Инструментальная поддержка» ниже ссылается на категории, а не на команды).
40
+ - **Ожидания PASS** — из «Idioms»; **формулировки FAIL** — из «Anti-patterns».
41
+ - **Точечные подсказки** — из «Check-ID hints» по префиксу `SEC-`.
42
+ - Если профиль `tier: general` или `runtime=generic` → стек-специфичные находки
43
+ без однозначного evidence помечай `🔍 UNVERIFIED`, а не `❌ FAIL`. Проверки,
44
+ чей механизм в рантайме отсутствует, помечай `N/A`.
45
+
46
+ ## Severity Guide
47
+
48
+ | Severity | Критерий назначения |
49
+ |----------|---------------------|
50
+ | 🔴 Critical | RCE, auth bypass, data corruption, необратимый финансовый риск |
51
+ | 🟠 High | Падение production, privilege escalation, утечка данных |
52
+ | 🟡 Medium | Деградация производительности или поддерживаемости без immediate outage |
53
+ | 🟢 Low | Стиль, читаемость, слабое нарушение конвенции |
54
+
55
+ Правило: severity = impact × exploitability × blast radius. Одинаковый паттерн → одинаковый severity между аудитами.
56
+
57
+ ## Чеклист
58
+
59
+ | Check ID | Проверка |
60
+ |----------|----------|
61
+ | SEC-01 | Нет hardcoded credentials в коде (пароли, токены, API-ключи, приватные ключи) |
62
+ | SEC-02 | Файлы с секретами исключены из VCS (.env* в .gitignore) |
63
+ | SEC-03 | Секреты не передаются через URL (query params, Basic Auth в URL) |
64
+ | SEC-04 | .env.example содержит только placeholder-значения без реальных данных |
65
+ | SEC-05 | Dockerfile не содержит секретов в ENV-директивах |
66
+ | SEC-06 | Комментарии в коде не содержат credentials |
67
+ | SEC-07 | Автоматическое сканирование секретов настроено (pre-commit или CI) |
68
+
69
+ ## Правила верификации
70
+
71
+ 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
72
+ 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
73
+ 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
74
+ 4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
75
+ 5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
76
+
77
+ ## Evidence Quality Rules
78
+
79
+ Любой `❌ FAIL` обязан содержать:
80
+ - Точный `file:line`
81
+ - Минимальный код-фрагмент (1–3 строки)
82
+ - Causal chain: почему именно это нарушение → какой риск возникает
83
+
84
+ Запрещено:
85
+ - Предполагать runtime behavior без evidence в коде
86
+ - Предполагать prod-конфигурацию по dev-конфигу
87
+ - Предполагать отсутствие middleware без проверки всей router chain
88
+ - Если вывод основан на предположении — только `🔍 UNVERIFIED`
89
+
90
+ ## Language Rule
91
+
92
+ Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
93
+
94
+ ## Baseline
95
+
96
+ До анализа:
97
+ ```bash
98
+ if [ ! -f ./docs/audit-baseline.yml ]; then
99
+ mkdir -p ./docs
100
+ cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
101
+ printf "accepted: []\n" > ./docs/audit-baseline.yml
102
+ fi
103
+ cat ./docs/audit-baseline.yml
104
+ ```
105
+
106
+ ## Контекст анализа
107
+
108
+ **SEC-01 — Нет hardcoded credentials в коде:**
109
+ - Пароли, токены, API-ключи в строковых литералах
110
+ - Строки подключения к БД с credentials (`postgres://user:pass@host`)
111
+ - Private keys, certificates, JWT secrets в коде
112
+ - Base64-encoded credentials в коде
113
+ - Тестовые/дев credentials, которые могут попасть в прод
114
+ - Паттерны: `password = "..."`, `token = "..."`, `key = "..."`, `secret = "..."`
115
+
116
+ **SEC-02 — Файлы с секретами исключены из VCS:**
117
+ - `.env`, `.env.local`, `.env.production` не в `.gitignore`
118
+ - Закоммиченные `.env`-файлы с реальными данными в репозитории
119
+ - Certificate и key файлы (`*.pem`, `*.key`, `*.p12`) не исключены из VCS
120
+
121
+ **SEC-03 — Секреты не в URL:**
122
+ - API-ключи или токены в query params (`?api_key=...`)
123
+ - Basic Auth credentials в URL (`https://user:pass@host`)
124
+ - Секреты в redirect_uri или callback URL параметрах
125
+
126
+ **SEC-04 — .env.example без реальных данных:**
127
+ - `.env.example` содержит реальные значения вместо placeholders (`DB_PASS=realpassword`)
128
+ - Placeholder-значения не описывают ожидаемый формат (`DB_URL=` без пояснения)
129
+
130
+ **SEC-05 — Dockerfile без секретов в ENV:**
131
+ - Секреты в `ENV` директивах Dockerfile (видны в docker inspect и слоях образа)
132
+ - Credentials в `ARG` без использования build secrets
133
+ - Секреты в LABEL или COPY-командах
134
+
135
+ **SEC-06 — Комментарии без credentials:**
136
+ - Пароли или токены в закомментированном коде
137
+ - TODO-комментарии с примерами реальных credentials
138
+ - Инструкции по настройке с реальными значениями
139
+
140
+ **Автоматическое сканирование (SEC-07):**
141
+ - Инструмент бери из категории **secret-scan** профиля стека (кросс-стек: `gitleaks` / `trufflehog`; также detect-secrets) — он стек-нейтрален.
142
+ - Отсутствие такого сканера в git-хуках (lefthook / pre-commit / husky) — нет автопроверки при коммите
143
+ - Отсутствие secret scanning в CI/таск-раннере (Taskfile/Makefile-цель, GitHub Actions secret scanning, GitLab SAST)
144
+ - `.gitleaks.toml` / `.secrets.baseline` не настроен
145
+ - При наличии любого из инструментов в хуках или CI → `✅ PASS`
146
+
147
+ ## Граница с другими аудитами
148
+
149
+ - **Secrets в коде** — этот скилл первичный. `audit-logging` (LOG-03) и `audit-deployment` (DEP-06) ссылаются сюда.
150
+ - **Secrets в логах** — первичный: `audit-logging` (LOG-03). Здесь не дублируй.
151
+ - **Secrets в Dockerfile ENV** — дублирован намеренно (DEP-06 + SEC-05): критичность оправдывает двойную проверку.
152
+
153
+ ## Формат вывода
154
+
155
+ | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
156
+ |----------|----------|--------|-------------|----------------|---------|------------|
157
+ | SEC-01 | Нет hardcoded credentials в коде (пароли, токены, API-ключи, приватные ключи) | ✅ PASS | High | `.gitignore`, `src/` проверены — паттернов не найдено | — | — |
158
+ | SEC-02 | Файлы с секретами исключены из VCS (.env* в .gitignore) | ❌ FAIL 🔴 | High | `.gitignore:1` | **1. Добавить .env в .gitignore** \\ 2. Использовать git-crypt \\ 3. Удалить .env из истории через git-filter-repo | Нет |
159
+ | SEC-03 | Секреты не передаются через URL (query params, Basic Auth в URL) | ⏸ ACCEPTED | Medium | `config.ts:9` | В baseline: legacy-интеграция, планируется замена | — |
160
+ | SEC-07 | Автоматическое сканирование секретов настроено (pre-commit или CI) | 🔍 UNVERIFIED | Low | — | — | — |
161
+
162
+ Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
163
+
164
+ Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
165
+
166
+ Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
167
+
168
+ `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
169
+
170
+ Требования к решениям:
171
+ - Взаимно исключающие (не перефразировки одного и того же)
172
+ - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
173
+ - Не требуют переписать всю систему — realistic migration cost
174
+ - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
175
+
176
+ В конце отчёта добавь раздел покрытия:
177
+ ```
178
+ ## Audit Coverage
179
+ Проверено: src/module1/**, src/module2/**
180
+ Пропущено: scripts/**, migrations/**, tests/**
181
+ Файлов проверено: N | Пропущено: N
182
+ ```
183
+
184
+ Если все PASS — выведи: `✅ Утечек секретов не обнаружено.`
185
+
186
+ ## Сохранение результатов
187
+
188
+ 1. Найди папку сессии:
189
+ ```bash
190
+ ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
191
+ ```
192
+ Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
193
+ 2. Сохрани через Write: `<AUDIT_DIR>/audit-secrets.md`
194
+
195
+ ```
196
+ # Audit Report: Secrets Leak — <YYYY-MM-DD HH:MM>
197
+ <таблица>
198
+ ```
@@ -0,0 +1,210 @@
1
+ ---
2
+ name: audit-tests
3
+ description: >
4
+ Аудит тестов и линтеров: конфигурации тестов, линтеров, TypeScript, покрытие критических путей,
5
+ false-positive тесты. Запускай при /audit-tests или запросе проверить тесты/конфигурацию.
6
+ ---
7
+
8
+ ## Правило применимости (Relevance Rule)
9
+
10
+ Применим при наличии файлов тестов (`*.test.*`, `*.spec.*`), конфигов (`jest.config.*`, `eslint*`, `tsconfig*`, `.eslintrc`, `vitest.config.*`). Для кода без тестов и конфигов — верни пустой ответ.
11
+
12
+ ## Runtime Detection & Stack Profile
13
+
14
+ Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
15
+ (инструменты, идиомы, анти-паттерны, примеры) берётся из профиля стека.
16
+
17
+ 1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
18
+ `runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
19
+
20
+ 2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
21
+ ```bash
22
+ if [ -f package.json ]; then echo "runtime=node"
23
+ elif [ -f go.mod ]; then echo "runtime=go"
24
+ elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
25
+ elif [ -f Cargo.toml ]; then echo "runtime=rust"
26
+ elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
27
+ else echo "runtime=generic"; fi
28
+ ```
29
+ Один запуск = один рантайм; не миксуй backend и frontend. Если найдено
30
+ несколько маркеров (монорепо) — выбери соответствующий текущему scope/анализируемым
31
+ файлам и зафиксируй выбор в разделе Audit Coverage.
32
+
33
+ 3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
34
+ (fallback `./skills/audit/stacks/_generic.md`, если файл не найден).
35
+
36
+ Дальше используй профиль:
37
+ - **Инструменты** — из секции «Tooling by category» профиля (раздел
38
+ «Инструментальная поддержка» ниже ссылается на категории, а не на команды).
39
+ - **Ожидания PASS** — из «Idioms»; **формулировки FAIL** — из «Anti-patterns».
40
+ - **Точечные подсказки** — из «Check-ID hints» по префиксу `TST-`.
41
+ - Если профиль `tier: general` или `runtime=generic` → стек-специфичные находки
42
+ без однозначного evidence помечай `🔍 UNVERIFIED`, а не `❌ FAIL`. Проверки,
43
+ чей механизм в рантайме отсутствует, помечай `N/A`.
44
+
45
+ ## Severity Guide
46
+
47
+ | Severity | Критерий назначения |
48
+ |----------|---------------------|
49
+ | 🔴 Critical | RCE, auth bypass, data corruption, необратимый финансовый риск |
50
+ | 🟠 High | Падение production, privilege escalation, утечка данных |
51
+ | 🟡 Medium | Деградация производительности или поддерживаемости без immediate outage |
52
+ | 🟢 Low | Стиль, читаемость, слабое нарушение конвенции |
53
+
54
+ Правило: severity = impact × exploitability × blast radius. Одинаковый паттерн → одинаковый severity между аудитами.
55
+
56
+ ## Чеклист
57
+
58
+ | Check ID | Проверка |
59
+ |----------|----------|
60
+ | TST-01 | Строгий статический анализ включён и обязателен (компилятор/линтер не пропускает небезопасные конструкции) |
61
+ | TST-02 | Пороги покрытия настроены и применяются |
62
+ | TST-03 | Хуки/CI запускают проверки (тесты, линт, типы) |
63
+ | TST-04 | Критические пути покрыты тестами (auth, validation, error handling) |
64
+ | TST-05 | Тесты изолированы — нет shared mutable state между тестами |
65
+ | TST-06 | Нет отключённых/сфокусированных тестов без обоснования |
66
+ | TST-07 | Тесты проверяют поведение, а не детали реализации |
67
+ | TST-08 | Источники недетерминизма мокаются/инъектируются [⚡ dynamic] |
68
+ | TST-09 | Golden/snapshot-тесты охватывают значимое, не весь объект целиком |
69
+
70
+ ## Правила верификации
71
+
72
+ 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
73
+ 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
74
+ 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
75
+ - Проверки с `[⚡ dynamic]` нельзя статически подтвердить — только `🔍 UNVERIFIED` или `❌ FAIL` (при явном evidence), но не `✅ PASS`
76
+ 4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
77
+ 5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
78
+
79
+ ## Evidence Quality Rules
80
+
81
+ Любой `❌ FAIL` обязан содержать:
82
+ - Точный `file:line`
83
+ - Минимальный код-фрагмент (1–3 строки)
84
+ - Causal chain: почему именно это нарушение → какой риск возникает
85
+
86
+ Запрещено:
87
+ - Предполагать runtime behavior без evidence в коде
88
+ - Предполагать prod-конфигурацию по dev-конфигу
89
+ - Предполагать отсутствие middleware без проверки всей router chain
90
+ - Если вывод основан на предположении — только `🔍 UNVERIFIED`
91
+
92
+ ## Language Rule
93
+
94
+ Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
95
+
96
+ ## Baseline
97
+
98
+ До анализа:
99
+ ```bash
100
+ if [ ! -f ./docs/audit-baseline.yml ]; then
101
+ mkdir -p ./docs
102
+ cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
103
+ printf "accepted: []\n" > ./docs/audit-baseline.yml
104
+ fi
105
+ cat ./docs/audit-baseline.yml
106
+ ```
107
+
108
+ ## Контекст анализа
109
+
110
+ > Примеры ниже — иллюстративные. Конкретные инструменты строгого анализа, идиомы
111
+ > и анти-паттерны для текущего рантайма бери из загруженного профиля
112
+ > (`stacks/<runtime>.md`, секции Idioms/Anti-patterns/Tooling by category/Check-ID
113
+ > hints по префиксу `TST-`). Node: tsconfig `strict`, jest/vitest, husky/lefthook.
114
+ > Go: `go vet`/`staticcheck`/`golangci-lint`, `go test -cover`, Taskfile/lefthook.
115
+
116
+ **TST-01 — Строгий статический анализ включён и обязателен:**
117
+ - Node: `tsconfig.json` с `strict: false` или отключёнными важными флагами (`noImplicitAny`, `strictNullChecks`); `ts-ignore`/`@ts-expect-error` без объяснений; `any` в публичных API
118
+ - Go: `go vet` + `staticcheck` + `golangci-lint` (включая `errcheck`/`nilness`/`gosec`) не настроены или не обязательны в CI
119
+ - Отключённые важные правила линтера/анализатора без обоснования
120
+
121
+ **TST-02 — Пороги покрытия настроены и применяются:**
122
+ - Node: `jest.config`/`vitest.config` без `coverageThreshold`
123
+ - Go: нет `go test -cover -coverprofile`; порог не задан и не проверяется в CI/Taskfile (встроенного флага порога нет — проверка должна быть явной)
124
+ - Пороги настроены, но не применяются в pipeline; либо заданы слишком низко (0% / не заданы)
125
+
126
+ **TST-03 — Хуки/CI запускают проверки (тесты, линт, типы):**
127
+ - Отсутствие git hooks (lefthook — кросс-стек, husky — Node) или эквивалентных CI-шагов
128
+ - Хуки/цели не запускают статический анализ / линт / тесты (npm-scripts ↔ цели Taskfile)
129
+ - Хуки настроены, но отключены или обходятся через `--no-verify`
130
+
131
+ **TST-04 — Критические пути покрыты:**
132
+ - Auth пути (login, logout, token refresh) без тестов
133
+ - Validation logic без тестов для невалидных входных данных
134
+ - Error handling пути (что происходит при сбое DB, внешнего API) не протестированы
135
+ - Edge cases (пустой список, максимальное значение, null) не покрыты
136
+
137
+ **TST-05 — Тесты изолированы:**
138
+ - Глобальные моки, влияющие на изоляцию других тестов
139
+ - Shared mutable state между тест-кейсами в одном suite
140
+ - Тесты, зависящие от порядка выполнения
141
+ - Отсутствие setup/teardown для интеграционных тестов
142
+ - Go: `t.Parallel()` при общем мутируемом состоянии без синхронизации
143
+
144
+ **TST-06 — Нет отключённых/сфокусированных тестов без обоснования:**
145
+ - Сфокусированный тест глушит остальные (Node: `.only`)
146
+ - Тест отключён без причины (Node: `.skip`; Go: `t.Skip()` без объяснения, скрытие за build-тегами)
147
+ - Закомментированные тесты без объяснения
148
+
149
+ **TST-07 — Тесты проверяют поведение:**
150
+ - Tautology-тесты (Node: `expect(true).toBe(true)`)
151
+ - Тесты без assertions (всегда зелёные)
152
+ - Тесты, проверяющие implementation details (внутренние переменные, приватные методы/неэкспортируемые функции) вместо behavior
153
+ - Один огромный тест вместо нескольких изолированных по сценарию
154
+
155
+ **TST-08 — Источники недетерминизма мокаются/инъектируются:**
156
+ - Случайность без контроля (Node: `Math.random()` без mock; Go: `math/rand` без фиксированного seed)
157
+ - Реальное время вместо инъекции (Node: `new Date()`/`Date.now()` без `useFakeTimers`; Go: прямой `time.Now()` вместо инъекции `Clock`)
158
+ - Синхронизация через задержку вместо ожидания события (Node: `setTimeout`/`sleep(N)`; Go: `time.Sleep` для синхронизации горутин вместо канала/`WaitGroup`)
159
+ - Тесты, зависящие от порядка выполнения (shared state)
160
+
161
+ **TST-09 — Golden/snapshot-тесты охватывают значимое:**
162
+ - Снимок всего объекта/компонента (500+ строк) — изменение одной строки ломает всё (Node: snapshot, Go: `testdata/*.golden`)
163
+ - Снимок объектов с динамическими полями (id, createdAt) без маскировки
164
+ - Обновление golden/snapshot без ревью изменений
165
+
166
+ ## Формат вывода
167
+
168
+ | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
169
+ |----------|----------|--------|-------------|----------------|---------|------------|
170
+ | TST-01 | Строгий статический анализ включён и обязателен (компилятор/линтер не пропускает небезопасные конструкции) | ✅ PASS | High | `tsconfig.json:5` — strict: true | — | — |
171
+ | TST-02 | Пороги покрытия настроены и применяются | ❌ FAIL 🟠 | High | `jest.config.ts:1` | **1. Добавить `coverageThreshold: { global: { lines: 80 } }`** \\ 2. Настроить thresholds только для критических модулей \\ 3. Добавить coverage check в CI без блокировки | Нет |
172
+ | TST-06 | Нет отключённых/сфокусированных тестов без обоснования | ⏸ ACCEPTED | Medium | `tests/auth.test.ts:45` | В baseline: временно для дебага, будет убрано | — |
173
+
174
+ Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
175
+
176
+ Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
177
+
178
+ Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
179
+
180
+ `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
181
+
182
+ Требования к решениям:
183
+ - Взаимно исключающие (не перефразировки одного и того же)
184
+ - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
185
+ - Не требуют переписать всю систему — realistic migration cost
186
+ - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
187
+
188
+ В конце отчёта добавь раздел покрытия:
189
+ ```
190
+ ## Audit Coverage
191
+ Проверено: src/module1/**, src/module2/**
192
+ Пропущено: scripts/**, migrations/**, tests/**
193
+ Файлов проверено: N | Пропущено: N
194
+ ```
195
+
196
+ Если все PASS — выведи: `✅ Конфигурации тестов и линтеров в порядке.`
197
+
198
+ ## Сохранение результатов
199
+
200
+ 1. Найди папку сессии:
201
+ ```bash
202
+ ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
203
+ ```
204
+ Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
205
+ 2. Сохрани через Write: `<AUDIT_DIR>/audit-tests.md`
206
+
207
+ ```
208
+ # Audit Report: Test & Linter Integrity — <YYYY-MM-DD HH:MM>
209
+ <таблица>
210
+ ```