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,216 @@
1
+ ---
2
+ name: audit-errors
3
+ description: >
4
+ Аудит обработки ошибок и отказоустойчивости: исключения, таймауты, retry policies,
5
+ circuit breakers, graceful degradation. Запускай при /audit-errors.
6
+ ---
7
+
8
+ ## Правило применимости (Relevance Rule)
9
+
10
+ Применим к коду с внешними вызовами (HTTP, БД, очереди, файловая система), асинхронному коду, обработчикам событий. Для синхронных утилит без I/O — верни пустой ответ.
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» по префиксу `ERR-`.
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
+ | ERR-01 | Ошибки не проглатываются — возвращаемая ошибка не игнорируется (в т.ч. через `_`), catch-блоки обрабатывают или пробрасывают |
61
+ | ERR-02 | Внутренние детали (stack trace, пути, версии) не попадают в ответы |
62
+ | ERR-03 | Падения внутри обработчиков (panic/исключения) перехватываются и не роняют процесс/соединение |
63
+ | ERR-04 | Непойманные сбои верхнего уровня (паники в фоновых задачах) логируются и не приводят к тихому падению |
64
+ | ERR-05 | Внешние вызовы (HTTP-клиент, DB) имеют явные таймауты |
65
+ | ERR-06 | Graceful shutdown реализован — SIGTERM обрабатывается |
66
+ | ERR-07 | Error responses консистентны по структуре во всём приложении |
67
+ | ERR-08 | Retry-стратегии используют exponential backoff с jitter |
68
+ | ERR-09 | Контекст отмены пробрасывается во внешние вызовы и прерывает их [⚡ dynamic] |
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
+ > Примеры ниже — иллюстративные (Node/TS). Конкретику текущего рантайма бери из
111
+ > загруженного профиля (`stacks/<runtime>.md`, секции Idioms/Anti-patterns/Check-ID hints).
112
+
113
+ **ERR-01 — Ошибки не проглатываются:**
114
+ - Возвращаемая ошибка игнорируется (в т.ч. через `_`) и не обрабатывается
115
+ - Пустые catch-блоки (`catch(e) {}`)
116
+ - `catch` только с логом без восстановления и re-throw
117
+ - Promise без `.catch()` или `try/await` без `catch`
118
+ - Unhandled promise rejections без обработки
119
+ - В Go: `_ = f()` / `v, _ := f()` глотает ошибку; ловится `errcheck`/`golangci-lint`
120
+
121
+ **ERR-02 — Внутренние детали не в ответах:**
122
+ - Stack trace в production API responses
123
+ - Внутренние пути файловой системы в error messages
124
+ - Версии зависимостей/фреймворка в заголовках или ответах
125
+ - DB-специфичные сообщения об ошибках (SQL syntax error) в API responses
126
+
127
+ **ERR-03 — Падения внутри обработчиков перехватываются:**
128
+ - Паника/исключение внутри обработчика роняет процесс или соединение вместо локального перехвата
129
+ - Express async handlers без asyncHandler wrapper или Express 5
130
+ - Promise rejection в middleware не пробрасывается в error middleware
131
+ - Необработанные исключения в setTimeout/setInterval колбэках
132
+ - В Go: нет recover-middleware (chi `middleware.Recoverer`), нет `RecoverFunc` в gqlgen, нет recover в обёртке задачи (asynq) — паника роняет соединение/процесс
133
+
134
+ **ERR-04 — Непойманные сбои верхнего уровня:**
135
+ - Непойманный сбой верхнего уровня не логируется и приводит к тихому падению
136
+ - Отсутствие `process.on('unhandledRejection')`
137
+ - Отсутствие `process.on('uncaughtException')`
138
+ - Нет логирования и корректного выхода при критических ошибках процесса
139
+ - В Go: паника в фоновой goroutine/задаче без `defer recover()` роняет весь процесс — нужен `defer recover()` в каждой goroutine
140
+
141
+ **ERR-05 — Явные таймауты для внешних вызовов:**
142
+ - HTTP-клиент / DB-вызов без явного timeout
143
+ - БД-запросы без query timeout / statement timeout
144
+ - Отсутствие timeout для очередей сообщений и внешних gRPC вызовов
145
+ - Бесконечные retry без exponential backoff и max attempts
146
+ - В Go: `http.Client{Timeout: ...}`, `context.WithTimeout` для запросов к БД/внешним сервисам
147
+
148
+ **ERR-06 — Graceful shutdown:**
149
+ - Отсутствие обработки сигнала завершения (SIGTERM)
150
+ - Нет закрытия DB-пула и HTTP-сервера при shutdown
151
+ - Незавершённые запросы не дожидаются окончания при shutdown
152
+ - В Go: `signal.NotifyContext` + `server.Shutdown(ctx)` + закрытие пулов (pgx), воркеров (asynq), redis
153
+
154
+ **ERR-07 — Консистентная структура error responses:**
155
+ - Разный формат ошибок в разных endpoint'ах (нет единого error shape)
156
+ - Отсутствие machine-readable error code (только human-readable message)
157
+ - HTTP статус 200 при ошибке (должен быть 4xx/5xx)
158
+
159
+ **Retry & Cancellation (ERR-08 / ERR-09):**
160
+ - HTTP-retry без задержки или с фиксированной задержкой (нет exponential backoff)
161
+ - Отсутствие jitter — все ретраи синхронизируются при массовом сбое
162
+ - Внешний вызов без контекста отмены — висящие запросы после disconnect клиента (Node: fetch/axios без AbortSignal)
163
+ - Контекст отмены не пробрасывается вглубь цепочки вызовов и не прерывает их
164
+ - В Go: `context.Context` — первоклассный механизм отмены, пробрасывается во все внешние вызовы (pgx/HTTP/asynq)
165
+
166
+ ## Граница с другими аудитами
167
+
168
+ - **Stack trace в ответах** — этот скилл первичный (ERR-02). `audit-owasp` и `audit-api-contracts` ссылаются сюда.
169
+ - **Идемпотентность handlers** — первичный: `audit-concurrency` (CON-05). Здесь не дублируй.
170
+ - **Таймауты HTTP-клиентов** — ERR-05 первичный. `audit-performance` не дублирует.
171
+
172
+ ## Формат вывода
173
+
174
+ | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
175
+ |----------|----------|--------|-------------|----------------|---------|------------|
176
+ | ERR-01 | Ошибки не проглатываются — возвращаемая ошибка не игнорируется (в т.ч. через `_`), catch-блоки обрабатывают или пробрасывают | ✅ PASS | High | `src/` — все catch-блоки логируют или пробрасывают | — | — |
177
+ | ERR-05 | Внешние вызовы (HTTP-клиент, DB) имеют явные таймауты | ❌ FAIL 🟠 | High | `services/api.ts:18` | **1. Добавить timeout в axios: `{ timeout: 5000 }`** \\ 2. Использовать AbortController с setTimeout \\ 3. Установить глобальный default timeout | Нет |
178
+ | ERR-06 | Graceful shutdown реализован — SIGTERM обрабатывается | ⏸ ACCEPTED | Medium | `server.ts:5` | В baseline: управляется оркестратором | — |
179
+
180
+ Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
181
+
182
+ Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
183
+
184
+ Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
185
+
186
+ `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
187
+
188
+ Требования к решениям:
189
+ - Взаимно исключающие (не перефразировки одного и того же)
190
+ - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
191
+ - Не требуют переписать всю систему — realistic migration cost
192
+ - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
193
+
194
+ В конце отчёта добавь раздел покрытия:
195
+ ```
196
+ ## Audit Coverage
197
+ Проверено: src/module1/**, src/module2/**
198
+ Пропущено: scripts/**, migrations/**, tests/**
199
+ Файлов проверено: N | Пропущено: N
200
+ ```
201
+
202
+ Если все PASS — выведи: `✅ Обработка ошибок реализована корректно.`
203
+
204
+ ## Сохранение результатов
205
+
206
+ 1. Найди папку сессии:
207
+ ```bash
208
+ ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
209
+ ```
210
+ Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
211
+ 2. Сохрани через Write: `<AUDIT_DIR>/audit-errors.md`
212
+
213
+ ```
214
+ # Audit Report: Error Handling & Resiliency — <YYYY-MM-DD HH:MM>
215
+ <таблица>
216
+ ```
@@ -0,0 +1,197 @@
1
+ ---
2
+ name: audit-logging
3
+ description: >
4
+ Аудит качества логирования: избыточность, безопасность логов, отсутствие чувствительных данных,
5
+ соответствие best practices. Запускай при /audit-logging или запросе проверить логи/логирование.
6
+ ---
7
+
8
+ ## Правило применимости (Relevance Rule)
9
+
10
+ Перед анализом оцени: содержит ли код вызовы logger, console.log/error/warn, запись в файлы логов, middleware для логирования или аудит-треки? Если анализируемый файл не содержит никакого логирования — верни пустой ответ без таблицы.
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» по префиксу `LOG-`.
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
+ | LOG-01 | Production-код не пишет в stdout/stderr напрямую в обход структурированного логгера |
61
+ | LOG-02 | PII не логируется (email, телефон, имена, адреса, финансовые данные) |
62
+ | LOG-03 | Секреты и токены не попадают в логи |
63
+ | LOG-04 | Запросы трассируются (Request ID или correlation ID сквозной) |
64
+ | LOG-05 | Формат логов структурирован (JSON) в production |
65
+ | LOG-06 | Критические операции логируются (auth, create, update, delete) |
66
+ | LOG-07 | User input санитизируется перед логированием (защита от log injection) |
67
+ | LOG-08 | Критические события безопасности логируются: успешный/неудачный вход, выход, изменение прав, массовая выгрузка данных [⚡ dynamic] |
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
+ **LOG-01 — Нет прямой записи в stdout/stderr в обход логгера:**
109
+ - Node: `console.log`, `console.error`, `console.warn` в production-коде вместо структурированного логгера
110
+ - Go: `fmt.Print*` / `log.Print*` / `println` в production-путях вместо `slog`
111
+ - Логирование каждой итерации цикла без level-контроля
112
+ - Verbose-логи без флага условия (должны быть за уровнем debug, напр. `if (logger.isDebugEnabled())`)
113
+
114
+ **LOG-02 — PII не логируется:**
115
+ - Логирование email, телефонов, имён, адресов, дат рождения
116
+ - Логирование полных тел запросов/ответов с персональными данными
117
+ - Финансовые данные (суммы транзакций с привязкой к персоне) в логах
118
+
119
+ **LOG-03 — Секреты не в логах:**
120
+ - Пароли, API-ключи, JWT токены в log messages
121
+ - Полные строки подключения с credentials
122
+ - Секреты в stack traces при логировании ошибок
123
+
124
+ **LOG-04 — Сквозная трассируемость запросов:**
125
+ - Логи без request ID / correlation ID — невозможно отследить цепочку
126
+ - Request ID не пробрасывается в дочерние сервисы
127
+ - Логи без user ID или session context для аутентифицированных операций
128
+ - Go: нет middleware, генерирующего request ID (chi `middleware.RequestID`), и ID не кладётся в `context` для последующих `slog`-вызовов
129
+
130
+ **LOG-05 — Структурированный формат в production:**
131
+ - Plain text логи вместо JSON в production-среде
132
+ - Разный формат логов в разных частях приложения
133
+ - Node: вложенные объекты сериализуются как `[object Object]`
134
+ - Go: текстовый хендлер вместо JSON в prod (нет `slog.NewJSONHandler` для production-конфигурации)
135
+
136
+ **LOG-06 — Критические операции логируются:**
137
+ - Операции аутентификации (login, logout, password change) без логов
138
+ - Создание/обновление/удаление критических сущностей без audit trail
139
+ - Отсутствие логов ошибок в catch-блоках критических операций
140
+
141
+ **LOG-07 — Защита от log injection:**
142
+ - User input передаётся в лог напрямую без санитизации
143
+ - Newline characters (`\n`, `\r`) в user input могут создавать поддельные log entries
144
+ - ANSI escape codes из user input могут повредить log formatters
145
+
146
+ **LOG-08 — Security audit trail:**
147
+ - Успешная и неудачная аутентификация не логируется → невозможен forensics после инцидента
148
+ - Изменение прав пользователя (role change, permission grant/revoke) без audit записи
149
+ - Mass data export (выгрузка > N записей, bulk delete) без лога кто/когда/что
150
+ - Password change / email change без записи в аудит-лог
151
+ - Критические административные операции выполняются без trace
152
+
153
+ ## Формат вывода
154
+
155
+ | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
156
+ |----------|----------|--------|-------------|----------------|---------|------------|
157
+ | LOG-01 | Production-код не пишет в stdout/stderr напрямую в обход структурированного логгера | ✅ PASS | High | `src/` grep — console.* не найдено | — | — |
158
+ | LOG-02 | PII не логируется (email, телефон, имена, адреса, финансовые данные) | ❌ FAIL 🔴 | High | `auth/login.ts:34` | **1. Удалить email из лога, логировать только userId** \\ 2. Маскировать PII через log sanitizer \\ 3. Заменить на структурированный лог без PII | Нет |
159
+ | LOG-04 | Запросы трассируются (Request ID или correlation ID сквозной) | ⏸ ACCEPTED | Medium | — | В baseline: трейсинг через внешний сервис | — |
160
+
161
+ Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
162
+
163
+ Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
164
+
165
+ Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
166
+
167
+ `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
168
+
169
+ Требования к решениям:
170
+ - Взаимно исключающие (не перефразировки одного и того же)
171
+ - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
172
+ - Не требуют переписать всю систему — realistic migration cost
173
+ - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
174
+
175
+ В конце отчёта добавь раздел покрытия:
176
+ ```
177
+ ## Audit Coverage
178
+ Проверено: src/module1/**, src/module2/**
179
+ Пропущено: scripts/**, migrations/**, tests/**
180
+ Файлов проверено: N | Пропущено: N
181
+ ```
182
+
183
+ Если все PASS — выведи: `✅ Логирование соответствует best practices.`
184
+
185
+ ## Сохранение результатов
186
+
187
+ 1. Найди папку сессии:
188
+ ```bash
189
+ ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
190
+ ```
191
+ Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
192
+ 2. Сохрани через Write: `<AUDIT_DIR>/audit-logging.md`
193
+
194
+ ```
195
+ # Audit Report: Logging Best Practices — <YYYY-MM-DD HH:MM>
196
+ <таблица>
197
+ ```