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.
- package/AGENTS.md +23 -1
- package/__tests__/core/registry/registry.service.test.ts +82 -0
- package/__tests__/shared/runbook/runbook.service.test.ts +104 -0
- package/dist/package.json +1 -1
- package/dist/src/app.module.js +6 -0
- package/dist/src/app.module.js.map +1 -1
- package/dist/src/commands/init/init.command.d.ts +1 -0
- package/dist/src/commands/init/init.command.js +34 -1
- package/dist/src/commands/init/init.command.js.map +1 -1
- package/dist/src/commands/ops/ops-add.command.d.ts +18 -0
- package/dist/src/commands/ops/ops-add.command.js +102 -0
- package/dist/src/commands/ops/ops-add.command.js.map +1 -0
- package/dist/src/commands/ops/ops-init.command.d.ts +22 -0
- package/dist/src/commands/ops/ops-init.command.js +130 -0
- package/dist/src/commands/ops/ops-init.command.js.map +1 -0
- package/dist/src/commands/ops/ops-list.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-list.command.js +73 -0
- package/dist/src/commands/ops/ops-list.command.js.map +1 -0
- package/dist/src/commands/ops/ops-path.command.d.ts +9 -0
- package/dist/src/commands/ops/ops-path.command.js +52 -0
- package/dist/src/commands/ops/ops-path.command.js.map +1 -0
- package/dist/src/commands/ops/ops-runbook.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-runbook.command.js +81 -0
- package/dist/src/commands/ops/ops-runbook.command.js.map +1 -0
- package/dist/src/commands/ops/ops-status.command.d.ts +11 -0
- package/dist/src/commands/ops/ops-status.command.js +62 -0
- package/dist/src/commands/ops/ops-status.command.js.map +1 -0
- package/dist/src/commands/ops/ops-use.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-use.command.js +76 -0
- package/dist/src/commands/ops/ops-use.command.js.map +1 -0
- package/dist/src/commands/ops/ops.command.d.ts +7 -0
- package/dist/src/commands/ops/ops.command.js +56 -0
- package/dist/src/commands/ops/ops.command.js.map +1 -0
- package/dist/src/commands/ops/ops.helpers.d.ts +2 -0
- package/dist/src/commands/ops/ops.helpers.js +11 -0
- package/dist/src/commands/ops/ops.helpers.js.map +1 -0
- package/dist/src/commands/ops/ops.module.d.ts +2 -0
- package/dist/src/commands/ops/ops.module.js +36 -0
- package/dist/src/commands/ops/ops.module.js.map +1 -0
- package/dist/src/core/registry/registry.module.d.ts +2 -0
- package/dist/src/core/registry/registry.module.js +22 -0
- package/dist/src/core/registry/registry.module.js.map +1 -0
- package/dist/src/core/registry/registry.schema.d.ts +24 -0
- package/dist/src/core/registry/registry.schema.js +21 -0
- package/dist/src/core/registry/registry.schema.js.map +1 -0
- package/dist/src/core/registry/registry.service.d.ts +16 -0
- package/dist/src/core/registry/registry.service.js +91 -0
- package/dist/src/core/registry/registry.service.js.map +1 -0
- package/dist/src/shared/runbook/runbook.module.d.ts +2 -0
- package/dist/src/shared/runbook/runbook.module.js +22 -0
- package/dist/src/shared/runbook/runbook.module.js.map +1 -0
- package/dist/src/shared/runbook/runbook.service.d.ts +20 -0
- package/dist/src/shared/runbook/runbook.service.js +118 -0
- package/dist/src/shared/runbook/runbook.service.js.map +1 -0
- package/dist/src/shared/runbook/runbook.templates.d.ts +6 -0
- package/dist/src/shared/runbook/runbook.templates.js +49 -0
- package/dist/src/shared/runbook/runbook.templates.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/registry.schema.json +39 -0
- package/scripts/generate-json-schema.ts +14 -5
- package/skills/ac/SKILL.md +239 -0
- package/skills/al/SKILL.md +98 -0
- package/skills/audit/SKILL.md +205 -0
- package/skills/audit/audit-baseline-template.yml +188 -0
- package/skills/audit/runtime-detect.md +64 -0
- package/skills/audit/stacks/_generic.md +41 -0
- package/skills/audit/stacks/_registry.md +47 -0
- package/skills/audit/stacks/go.md +66 -0
- package/skills/audit/stacks/java.md +44 -0
- package/skills/audit/stacks/node.md +57 -0
- package/skills/audit/stacks/python.md +45 -0
- package/skills/audit/stacks/rust.md +44 -0
- package/skills/audit-api-contracts/SKILL.md +201 -0
- package/skills/audit-architecture/SKILL.md +200 -0
- package/skills/audit-bugs/SKILL.md +226 -0
- package/skills/audit-concurrency/SKILL.md +197 -0
- package/skills/audit-deployment/SKILL.md +218 -0
- package/skills/audit-docs/SKILL.md +209 -0
- package/skills/audit-errors/SKILL.md +216 -0
- package/skills/audit-logging/SKILL.md +197 -0
- package/skills/audit-matrix/SKILL.md +245 -0
- package/skills/audit-meta/SKILL.md +120 -0
- package/skills/audit-naming/SKILL.md +200 -0
- package/skills/audit-owasp/SKILL.md +223 -0
- package/skills/audit-performance/SKILL.md +199 -0
- package/skills/audit-reinvention/SKILL.md +214 -0
- package/skills/audit-secrets/SKILL.md +198 -0
- package/skills/audit-tests/SKILL.md +210 -0
- package/skills/audit-validation/SKILL.md +206 -0
- package/skills/audit-verify/SKILL.md +139 -0
- package/skills/audit-yagni/SKILL.md +188 -0
- package/skills/doc-gen/SKILL.md +490 -0
- package/skills/doc-gen/scripts/doc_gen.py +911 -0
- package/skills/generate-project-docs/SKILL.md +380 -0
- package/skills/implement-project/SKILL.md +409 -0
- package/skills/litefront-prototype/SKILL.md +484 -0
- package/skills/ops/SKILL.md +94 -0
- package/skills/post-call-task-builder/SKILL.md +419 -0
- package/skills/skills-best-practices/SKILL.md +415 -0
- package/skills/start/SKILL.md +319 -0
- package/skills/tech-blueprint/SKILL.md +890 -0
- package/skills/tech-blueprint/scripts/blueprint_validator.py +417 -0
- package/src/app.module.ts +6 -0
- package/src/commands/init/init.command.ts +43 -1
- package/src/commands/ops/ops-add.command.ts +83 -0
- package/src/commands/ops/ops-init.command.ts +125 -0
- package/src/commands/ops/ops-list.command.ts +57 -0
- package/src/commands/ops/ops-path.command.ts +38 -0
- package/src/commands/ops/ops-runbook.command.ts +74 -0
- package/src/commands/ops/ops-status.command.ts +47 -0
- package/src/commands/ops/ops-use.command.ts +76 -0
- package/src/commands/ops/ops.command.ts +42 -0
- package/src/commands/ops/ops.helpers.ts +20 -0
- package/src/commands/ops/ops.module.ts +23 -0
- package/src/core/registry/registry.module.ts +9 -0
- package/src/core/registry/registry.schema.ts +46 -0
- package/src/core/registry/registry.service.ts +128 -0
- package/src/shared/runbook/runbook.module.ts +9 -0
- package/src/shared/runbook/runbook.service.ts +164 -0
- package/src/shared/runbook/runbook.templates.ts +66 -0
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit-matrix
|
|
3
|
+
description: >
|
|
4
|
+
Строит архитектурную модель системы и анализирует сценарии сбоев
|
|
5
|
+
для обнаруженных компонентов и их связей. Запускается при /audit-matrix.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Задача
|
|
9
|
+
|
|
10
|
+
Верхнеуровневый архитектурный аудит: найти крупные компоненты системы, их связи
|
|
11
|
+
и системные риски (каскадные сбои, узкие места, отсутствие защиты на уровне архитектуры).
|
|
12
|
+
Не ищи мелкие баги — это задача других аудитов.
|
|
13
|
+
|
|
14
|
+
Не полагайся на предопределённые списки технологий. Адаптируйся к любому стеку.
|
|
15
|
+
|
|
16
|
+
**Группируй похожие сущности.** Несколько однотипных сервисов, реплик, воркеров — один компонент.
|
|
17
|
+
Пример: 3 реплики payment-worker → компонент «Payment Workers». Не плоди строки ради детализации.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Язык
|
|
22
|
+
|
|
23
|
+
Пиши так, чтобы понял джун на первой неделе работы.
|
|
24
|
+
Короткие фразы, без канцелярита, без умных терминов.
|
|
25
|
+
|
|
26
|
+
**Объяснение риска** — как будто рассказываешь коллеге за обедом:
|
|
27
|
+
✅ «Если БД тормозит, сайт ляжет для всех через 5 секунд»
|
|
28
|
+
❌ «Исчерпание пула соединений в условиях конкурентной нагрузки приводит к деградации»
|
|
29
|
+
❌ «Всё сломается»
|
|
30
|
+
|
|
31
|
+
**Решение** — что сделать и зачем:
|
|
32
|
+
✅ «Ждать ответа от БД не больше 5 секунд (`timeout: 5000` в конфиге)»
|
|
33
|
+
❌ «Сконфигурировать connectionTimeoutMillis»
|
|
34
|
+
❌ «Внедрить service mesh»
|
|
35
|
+
|
|
36
|
+
Если нужен термин — сразу расшифруй:
|
|
37
|
+
«Circuit breaker (предохранитель: если внешний сервис падает, перестаём его дёргать)».
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Шаг 1 — Сессия
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
LATEST=$(ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1)
|
|
45
|
+
SESSION=${LATEST:-./docs/audits/$(date +"%Y-%m-%d_%H-%M")}
|
|
46
|
+
mkdir -p "$SESSION" && echo "Session: $SESSION"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Шаг 2 — Обнаружение компонентов
|
|
52
|
+
|
|
53
|
+
Для каждого зафиксируй: название, роль, размещение (Docker/облако/SaaS),
|
|
54
|
+
как обнаружен (`файл:строка`).
|
|
55
|
+
|
|
56
|
+
**Правило группировки.** Объединяй в один компонент:
|
|
57
|
+
- реплики одного сервиса
|
|
58
|
+
- воркеры одной очереди
|
|
59
|
+
- микросервисы одной области, если риски у них одинаковые
|
|
60
|
+
- несколько таблиц/коллекций одной БД → компонент «Database», а не «Users DB», «Orders DB»
|
|
61
|
+
|
|
62
|
+
Если после группировки осталось >12 компонентов — объединяй ещё смелее.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Шаг 3 — Граф компонентов
|
|
67
|
+
|
|
68
|
+
Не ищи адреса через grep — **проследи жизненный цикл конфигурации**.
|
|
69
|
+
|
|
70
|
+
Построй матрицу: строки — кто вызывает, столбцы — кого вызывают.
|
|
71
|
+
В ячейке — **зачем** они связаны, а не протокол. Глагол + объект, до 5 слов.
|
|
72
|
+
|
|
73
|
+
Пустая ячейка = связи нет.
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
| Кто \ Кого | Frontend | Backend | База | Редиска | Платежи |
|
|
77
|
+
|--------------|----------|---------|------|---------|---------|
|
|
78
|
+
| Frontend | | шлёт заказы | | | |
|
|
79
|
+
| Backend | | | хранит заказы | кэш сессий | списывает деньги |
|
|
80
|
+
| Воркер | | | читает задачи | | |
|
|
81
|
+
| Платежи | | шлёт статус | | | |
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Если в ячейке не помещается — упрощай. Не «асинхронно публикует событие оплаты в очередь» → «шлёт статус оплаты».
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Шаг 4 — Анализ рисков
|
|
89
|
+
|
|
90
|
+
Сопоставляй **компоненты и их клиенты** (Шаг 2)
|
|
91
|
+
с настройками подключения (Шаг 3).
|
|
92
|
+
Если библиотека умеет таймауты и повторы, а код их не выставляет — это риск.
|
|
93
|
+
|
|
94
|
+
Подходи как «злой гений»: не доверяй компонентам внутри сети, ищи редкие, но разрушительные сценарии.
|
|
95
|
+
Находи **реальные** риски. Если компонент надёжен — так и напиши:
|
|
96
|
+
«Рисков нет: облачный сервис с авто-восстановлением».
|
|
97
|
+
Не выдумывай проблемы ради количества.
|
|
98
|
+
|
|
99
|
+
### Как описывать опасность
|
|
100
|
+
|
|
101
|
+
Столбец **«В чём опасность»** — главная часть таблицы. В одной фразе:
|
|
102
|
+
1. Что ломается (причина)
|
|
103
|
+
2. Что из-за этого происходит (механика)
|
|
104
|
+
3. Что видит пользователь или бизнес (последствие)
|
|
105
|
+
|
|
106
|
+
✅ «Внешний API тупит → запросы копятся → через 5 секунд сайт падает для всех»
|
|
107
|
+
✅ «Две транзакции одновременно списали деньги → баланс ушёл в минус, найдём только в конце месяца»
|
|
108
|
+
❌ «Отказ сервиса приводит к каскадной деградации» (джун не поймёт)
|
|
109
|
+
❌ «Race condition в биллинге» (термин без расшифровки)
|
|
110
|
+
|
|
111
|
+
### Как описывать решение
|
|
112
|
+
|
|
113
|
+
Принцип Парето: одно действие, которое закроет 80% проблемы.
|
|
114
|
+
Формула: **что сделать + зачем + конкретный параметр в скобках**.
|
|
115
|
+
|
|
116
|
+
✅ «Ждать ответа от БД не больше 5 секунд, чтобы зависшие запросы не копились (`timeout: 5000`)»
|
|
117
|
+
✅ «Добавить предохранитель: если Платежи не отвечают 3 раза подряд, перестать их дёргать на минуту (библиотека opossum)»
|
|
118
|
+
✅ «Завернуть списание и обновление баланса в одну транзакцию (`BEGIN` … `COMMIT`)»
|
|
119
|
+
|
|
120
|
+
❌ «Переписать сервис на event-sourcing» (рефакторинг, не фикс)
|
|
121
|
+
❌ «Внедрить service mesh» (огромная задача)
|
|
122
|
+
❌ `connectionTimeoutMillis: 5000` (без объяснения, зачем)
|
|
123
|
+
|
|
124
|
+
Если проблема не чинится точечно — пиши `⚠ нужен рефакторинг` и одну строку, в какую сторону.
|
|
125
|
+
|
|
126
|
+
### Каскадные сценарии
|
|
127
|
+
|
|
128
|
+
Описывай отдельно **только** если сценарий:
|
|
129
|
+
- затрагивает **≥3 компонентов**, И
|
|
130
|
+
- имеет свою механику (не сводится к одному риску компонента).
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
X1: Frontend → Backend → Payments
|
|
134
|
+
В чём опасность: Платежи тупят → бэкенд ждёт → через 10 секунд весь сайт отдаёт 503, хотя сама база и фронт живы
|
|
135
|
+
Решение: ждать ответа от Платежей не больше 3 секунд + предохранитель
|
|
136
|
+
Подтверждение: `src/payment.ts:15` — Stripe без таймаута
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Шаг 5 — Вывод
|
|
142
|
+
|
|
143
|
+
Сохрани `{SESSION}/audit-matrix.md`:
|
|
144
|
+
|
|
145
|
+
```markdown
|
|
146
|
+
# Матрица — {project} — {date}
|
|
147
|
+
|
|
148
|
+
## TL;DR
|
|
149
|
+
- **Архитектура:** [монолит / микросервисы / serverless / монорепо]
|
|
150
|
+
- **Компонентов:** N
|
|
151
|
+
- **Критических рисков (🔴/🟠):** N
|
|
152
|
+
- **Главный риск:** [одно предложение]
|
|
153
|
+
|
|
154
|
+
## Граф компонентов
|
|
155
|
+
|
|
156
|
+
| Кто \ Кого | Frontend | Backend | База | Редиска | Платежи |
|
|
157
|
+
|------------|----------|---------|------|---------|---------|
|
|
158
|
+
| Frontend | | шлёт заказы | | | |
|
|
159
|
+
| Backend | | | хранит заказы | кэш сессий | списывает деньги |
|
|
160
|
+
| Воркер | | | читает задачи | | |
|
|
161
|
+
|
|
162
|
+
Связей: N. Синхронных (ждут ответа): N — это главный источник каскадных падений.
|
|
163
|
+
|
|
164
|
+
## Критические задачи
|
|
165
|
+
|
|
166
|
+
Сводка всех 🔴/🟠 — и по компонентам, и каскадных.
|
|
167
|
+
|
|
168
|
+
| # | В чём опасность | Компонент | Риск | Решение | Файл |
|
|
169
|
+
|---|----------------|-----------|------|---------|------|
|
|
170
|
+
| 1 | БД тупит → запросы копятся → через 5 секунд сайт падает для всех | База | 🔴 | Ждать БД не больше 5 секунд, увеличить пул соединений (`timeout: 5000`, `max: 20`) | `src/db.ts:12` ❌ |
|
|
171
|
+
| 2 | Платежи тупят → бэкенд ждёт → весь сайт отдаёт 503 | Платежи | 🔴 | Таймаут 3 секунды + предохранитель | `src/payment.ts:15` ❌ |
|
|
172
|
+
|
|
173
|
+
## {Компонент}
|
|
174
|
+
|
|
175
|
+
**Роль:** … • **Где:** Docker • **Найден:** `file:line`
|
|
176
|
+
|
|
177
|
+
| # | Сценарий | В чём опасность | Риск | Решение | Файл |
|
|
178
|
+
|---|----------|-----------------|------|---------|------|
|
|
179
|
+
| A1 | БД недоступна | БД тупит → запросы копятся → через 5 секунд сайт падает для всех при 100 запросах/сек | 🔴 | Ждать БД не больше 5 секунд, повторять 3 раза (`timeout: 5000`, `maxRetries: 3`) | `src/db.ts:12` ❌ |
|
|
180
|
+
| Z1 | Обрыв транзакции | Списание и обновление баланса не обёрнуты в транзакцию → деньги списались, баланс не обновился. Найдём только при сверке | 🔴 | Завернуть в одну транзакцию (`BEGIN` … `COMMIT`) | `src/billing.ts:44` ❌ |
|
|
181
|
+
| N1 | Редиска падает | Кэш отваливается → бэкенд идёт напрямую в БД. Медленнее, но работает | 🟡 | Защита уже есть, ничего делать не надо | `src/cache.ts:8` ✅ |
|
|
182
|
+
|
|
183
|
+
Если рисков нет — пиши одной строкой: «Рисков нет: облачный сервис с авто-восстановлением».
|
|
184
|
+
|
|
185
|
+
## Каскадные сценарии
|
|
186
|
+
|
|
187
|
+
| # | Цепочка | В чём опасность | Риск | Решение | Файл |
|
|
188
|
+
|---|---------|-----------------|------|---------|------|
|
|
189
|
+
| X1 | Frontend → Backend → Платежи | Платежи тупят → бэкенд ждёт → через 10 секунд весь сайт отдаёт 503, хотя база и фронт живы | 🔴 | Таймаут 3 секунды + предохранитель (opossum) | `src/payment.ts:15` ❌ |
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Правила
|
|
195
|
+
|
|
196
|
+
1. **Одна проблема = одна строка.** В сводку идут только 🔴/🟠, в таблицу компонента — все.
|
|
197
|
+
2. **Только крупные компоненты.** Не классы, не функции, не отдельные таблицы.
|
|
198
|
+
3. **Похожие сущности — в один компонент.** Реплики, воркеры, таблицы одной БД.
|
|
199
|
+
4. **Каждый сценарий = `файл:строка`.** Иначе `⚠ не проверено — причина`.
|
|
200
|
+
5. **«В чём опасность» самодостаточно.** Причина + механика + последствие в одной фразе, без терминов.
|
|
201
|
+
6. **Нет реального риска — не выдумывай.** Пиши «Рисков нет».
|
|
202
|
+
7. **Решение — по Парето и простыми словами.** Что сделать + зачем + параметр в скобках. Если нужен рефакторинг — `⚠ нужен рефакторинг`.
|
|
203
|
+
8. **Каскад — только при ≥3 компонентах** и уникальной механике.
|
|
204
|
+
9. **Baseline** — помечай `⏸ ACCEPTED` риски, принятые по baseline.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Severity
|
|
209
|
+
|
|
210
|
+
| 🔴 Критический | Потеря данных, дыра в безопасности, полный отказ без авто-восстановления |
|
|
211
|
+
| 🟠 Высокий | Сайт тормозит или отказ под нагрузкой, второстепенные функции не работают |
|
|
212
|
+
| 🟡 Средний | Редкие ошибки, лечатся перезапуском |
|
|
213
|
+
| 🟢 Низкий | Техдолг, нет мониторинга в некритичных местах |
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Bash
|
|
218
|
+
|
|
219
|
+
Bash — только для навигации. Нашёл файл — открой и читай.
|
|
220
|
+
Нет результата — проверь негативный сценарий (другие имена, закомментировано, другое расширение).
|
|
221
|
+
Не копируй слепо — адаптируй под структуру проекта.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Baseline
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
cat ./docs/audit-baseline.yml 2>/dev/null
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
В конце сообщения одной строкой:
|
|
234
|
+
**Парадигма:** … · **Компонентов:** N · **Сценариев:** N · **🔴/🟠:** N
|
|
235
|
+
|
|
236
|
+
## Шаг 6 — Верификация
|
|
237
|
+
|
|
238
|
+
`Skill("audit-verify")`
|
|
239
|
+
|
|
240
|
+
# Девиз: Найди одну настоящую дыру, а не сто придуманных.
|
|
241
|
+
Четыре принципа аудитора:
|
|
242
|
+
1. Ищи катастрофу, а не опечатку — тебя интересуют каскадные сбои и потеря данных, а не стиль кода
|
|
243
|
+
2. Думай как злой гений — не верь внутренней сети, облакам и «стабильным» API
|
|
244
|
+
3. Пиши как для джуна — если нельзя объяснить простыми словами, ты сам не понял риск
|
|
245
|
+
4. Подтверждай строкой кода — каждое «возможно» = файл:строка, иначе это галлюцинация
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit-meta
|
|
3
|
+
description: >
|
|
4
|
+
Мета-контроль качества аудита: проверяет покрытие кодовой базы, актуальность baseline,
|
|
5
|
+
качество доказательств в отчётах. Вызывай ПОСЛЕ всех аудитов и audit-verify — /audit-meta
|
|
6
|
+
или автоматически в финале /audit.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Задача
|
|
10
|
+
|
|
11
|
+
Ты — координатор процесса аудита. Проверяешь не код, а качество самого аудита: всё ли покрыто, нет ли протухших исключений, достаточно ли доказательств.
|
|
12
|
+
|
|
13
|
+
## Шаг 1 — Сбор данных
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Папка последней сессии
|
|
17
|
+
ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Прочитай все `*.md` файлы из папки сессии и `docs/audit-baseline.yml`.
|
|
21
|
+
|
|
22
|
+
## Шаг 2 — Scope Verification
|
|
23
|
+
|
|
24
|
+
1. Получи список всех исходных файлов проекта:
|
|
25
|
+
```bash
|
|
26
|
+
find ./src -type f \( -name "*.ts" -o -name "*.js" -o -name "*.py" \) 2>/dev/null | head -100
|
|
27
|
+
```
|
|
28
|
+
2. Сверь с доказательствами в отчётах: каждый директорий/модуль упомянут хотя бы в одном аудит-файле.
|
|
29
|
+
3. Выведи список директорий, не упомянутых ни в одном отчёте:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
### Непокрытые модули
|
|
33
|
+
- `src/module-name/` — ни один аудит не содержит ссылок на файлы этой директории
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Если все модули покрыты → `✅ Scope: все модули проверены.`
|
|
37
|
+
|
|
38
|
+
## Шаг 3 — Baseline Expiry
|
|
39
|
+
|
|
40
|
+
Для каждой записи в `docs/audit-baseline.yml` с полем `expires`:
|
|
41
|
+
- Сравни дату с текущей (`date +%Y-%m-%d`)
|
|
42
|
+
- Если истекла — выведи предупреждение:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
### ⚠️ Истёкшие исключения в baseline
|
|
46
|
+
| check_id | expires | accepted_by | reason |
|
|
47
|
+
|----------|---------|-------------|--------|
|
|
48
|
+
| OWA-06 | 2025-12-31 | username | nginx rate limit |
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Если истёкших нет → `✅ Baseline: все исключения актуальны.`
|
|
52
|
+
|
|
53
|
+
## Шаг 4 — Quality of Evidence
|
|
54
|
+
|
|
55
|
+
Проверь каждую строку с `❌ FAIL` в отчётах:
|
|
56
|
+
- Есть ли `файл:строка` в колонке «Доказательство»? Если нет → низкое качество доказательства.
|
|
57
|
+
- Есть ли конкретный код/значение или только имя файла?
|
|
58
|
+
|
|
59
|
+
Выведи:
|
|
60
|
+
```
|
|
61
|
+
### Находки с недостаточными доказательствами
|
|
62
|
+
| Аудит-файл | Check ID | Проблема |
|
|
63
|
+
|------------|----------|----------|
|
|
64
|
+
| audit-owasp | OWA-02 | Нет конкретной строки, только имя файла |
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Если все доказательства достаточны → `✅ Evidence: все FAIL подкреплены доказательствами.`
|
|
68
|
+
|
|
69
|
+
## Шаг 4.5 — False Positive Suppression Audit
|
|
70
|
+
|
|
71
|
+
Проверь типы записей в `docs/audit-baseline.yml`. Правильный baseline различает:
|
|
72
|
+
- `accepted-risk` — риск известен, намеренно принят
|
|
73
|
+
- `false-positive` — инструмент ошибся, нарушения нет
|
|
74
|
+
- `intentional-design` — архитектурное решение, не баг
|
|
75
|
+
|
|
76
|
+
Для записей без поля `type` выведи:
|
|
77
|
+
```
|
|
78
|
+
### Записи baseline без типа (требуют уточнения)
|
|
79
|
+
| check_id | reason | Рекомендуемый тип |
|
|
80
|
+
|----------|--------|-------------------|
|
|
81
|
+
| OWA-06 | nginx rate limit | accepted-risk |
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Без `type` baseline превращается в свалку — уточнить обязательно.
|
|
85
|
+
|
|
86
|
+
## Шаг 5 — Отчёт
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
# Audit Meta Report — <YYYY-MM-DD HH:MM>
|
|
90
|
+
|
|
91
|
+
## Scope Coverage
|
|
92
|
+
<результат Шага 2>
|
|
93
|
+
|
|
94
|
+
## Baseline Expiry
|
|
95
|
+
<результат Шага 3>
|
|
96
|
+
|
|
97
|
+
## Evidence Quality
|
|
98
|
+
<результат Шага 4>
|
|
99
|
+
|
|
100
|
+
## Итог
|
|
101
|
+
| Проверка | Статус |
|
|
102
|
+
|----------|--------|
|
|
103
|
+
| Scope Coverage | ✅ / ⚠️ N модулей не покрыто |
|
|
104
|
+
| Baseline Expiry | ✅ / ⚠️ N истёкших |
|
|
105
|
+
| Evidence Quality | ✅ / ⚠️ N слабых доказательств |
|
|
106
|
+
| Baseline Types | ✅ / ⚠️ N записей без type |
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Language Rule
|
|
110
|
+
|
|
111
|
+
Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
|
|
112
|
+
|
|
113
|
+
## Сохранение
|
|
114
|
+
|
|
115
|
+
1. Найди папку сессии:
|
|
116
|
+
```bash
|
|
117
|
+
ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
|
|
118
|
+
```
|
|
119
|
+
Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
|
|
120
|
+
2. Сохрани через Write: `<AUDIT_DIR>/audit-meta.md`
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit-naming
|
|
3
|
+
description: >
|
|
4
|
+
Аудит именования: читаемость кода, стандарты именования переменных, функций, классов, файлов.
|
|
5
|
+
Запускай при /audit-naming или запросе проверить code style / naming conventions.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Правило применимости (Relevance Rule)
|
|
9
|
+
|
|
10
|
+
Этот аудит применим к любому коду с идентификаторами. Пропускай только автогенерированные файлы (миграции, protobuf-generated, build output). Для конфигурационных файлов без кода (JSON, YAML) — верни пустой ответ.
|
|
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» по префиксу `NAM-`.
|
|
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
|
+
| NAM-01 | Соглашение об именовании соблюдается консистентно (camelCase/snake_case) |
|
|
61
|
+
| NAM-02 | Имена переменных, функций и классов описывают назначение, не реализацию |
|
|
62
|
+
| NAM-03 | Boolean-переменные имеют предикативные имена (is/has/can/should) |
|
|
63
|
+
| NAM-04 | Функции-читатели (get*/find*) не имеют side effects |
|
|
64
|
+
| NAM-05 | Magic numbers и magic strings заменены именованными константами |
|
|
65
|
+
| NAM-06 | Утилитные модули не являются свалкой несвязанного кода |
|
|
66
|
+
| NAM-07 | Ключевые сущности названы в соответствии с доменным глоссарием проекта |
|
|
67
|
+
|
|
68
|
+
## Правила верификации
|
|
69
|
+
|
|
70
|
+
1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
|
|
71
|
+
2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
|
|
72
|
+
3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
|
|
73
|
+
4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
|
|
74
|
+
5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
|
|
75
|
+
|
|
76
|
+
## Evidence Quality Rules
|
|
77
|
+
|
|
78
|
+
Любой `❌ FAIL` обязан содержать:
|
|
79
|
+
- Точный `file:line`
|
|
80
|
+
- Минимальный код-фрагмент (1–3 строки)
|
|
81
|
+
- Causal chain: почему именно это нарушение → какой риск возникает
|
|
82
|
+
|
|
83
|
+
Запрещено:
|
|
84
|
+
- Предполагать runtime behavior без evidence в коде
|
|
85
|
+
- Предполагать prod-конфигурацию по dev-конфигу
|
|
86
|
+
- Предполагать отсутствие middleware без проверки всей router chain
|
|
87
|
+
- Если вывод основан на предположении — только `🔍 UNVERIFIED`
|
|
88
|
+
|
|
89
|
+
## Language Rule
|
|
90
|
+
|
|
91
|
+
Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
|
|
92
|
+
|
|
93
|
+
## Baseline
|
|
94
|
+
|
|
95
|
+
До анализа:
|
|
96
|
+
```bash
|
|
97
|
+
if [ ! -f ./docs/audit-baseline.yml ]; then
|
|
98
|
+
mkdir -p ./docs
|
|
99
|
+
cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
|
|
100
|
+
printf "accepted: []\n" > ./docs/audit-baseline.yml
|
|
101
|
+
fi
|
|
102
|
+
cat ./docs/audit-baseline.yml
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Контекст анализа
|
|
106
|
+
|
|
107
|
+
**NAM-01 — Консистентность конвенции именования:**
|
|
108
|
+
- Конкретная конвенция определяется рантаймом/профилем (секция Idioms): в Node/JS — camelCase для переменных/функций, в Go — PascalCase для экспортируемых и camelCase для приватных идентификаторов. Примеры ниже иллюстративны (Node).
|
|
109
|
+
- Несоответствие конвенции языка/фреймворка (snake_case в JS, camelCase в Python)
|
|
110
|
+
- Непоследовательное именование одной сущности в разных местах (`userId` vs `user_id` vs `uid`)
|
|
111
|
+
- Смешение стилей в одном файле или модуле
|
|
112
|
+
|
|
113
|
+
**NAM-02 — Имена описывают назначение:**
|
|
114
|
+
- Однобуквенные переменные вне циклов (`d`, `x`, `tmp`)
|
|
115
|
+
- Аббревиатуры без расшифровки (`mgr`, `proc`, `srv`, `usr`)
|
|
116
|
+
- Слишком общие имена (`data`, `info`, `manager`, `handler`, `util`)
|
|
117
|
+
- Классы без существительного, функции без глагола
|
|
118
|
+
- Имена отражают реализацию, а не назначение (`arrayOfUsers` вместо `users`)
|
|
119
|
+
|
|
120
|
+
**NAM-03 — Boolean с предикативными именами:**
|
|
121
|
+
- Boolean переменные без is/has/can/should префикса (`enabled`, `valid`, `error`)
|
|
122
|
+
- Отрицательные булевы (`isNotValid`, `notDisabled`) — двойное отрицание в условии
|
|
123
|
+
- Имена, не дающие понять ожидаемое значение при true
|
|
124
|
+
|
|
125
|
+
**NAM-04 — Функции-читатели без side effects:**
|
|
126
|
+
- Функция `getUser` изменяет данные или имеет побочные эффекты
|
|
127
|
+
- `find*`/`fetch*` методы выполняют запись/обновление
|
|
128
|
+
- Нарушение принципа: читающее имя → чистая операция
|
|
129
|
+
|
|
130
|
+
**NAM-05 — Именованные константы вместо magic values:**
|
|
131
|
+
- Magic numbers без именованных констант (`timeout = 86400`, `limit = 100`)
|
|
132
|
+
- Magic strings без константы (`status === 'active'` без enum/constant)
|
|
133
|
+
- Повторяющиеся литеральные значения в разных местах кода
|
|
134
|
+
|
|
135
|
+
**NAM-06 — Утилитные модули не свалка:**
|
|
136
|
+
- `utils.ts`, `helpers.ts` как свалка несвязанного кода
|
|
137
|
+
- `index.ts` с экспортом несвязанных сущностей
|
|
138
|
+
- Файлы с именами, не отражающими содержимое
|
|
139
|
+
|
|
140
|
+
**Ubiquitous Language:**
|
|
141
|
+
- Если в проекте есть `GLOSSARY.md`, `SPEC.md`, `README.md` с бизнес-терминами — проверь соответствие
|
|
142
|
+
- `client` в коде при `customer` в домене — расхождение ubiquitous language
|
|
143
|
+
- Синонимы для одной сущности в разных слоях (`User` / `Account` / `Member`) без явного обоснования
|
|
144
|
+
- При отсутствии глоссария — ставь `🔍 UNVERIFIED`
|
|
145
|
+
|
|
146
|
+
## Инструментальная поддержка
|
|
147
|
+
|
|
148
|
+
Для NAM-06 используй инструмент категории **unused-code** из профиля стека
|
|
149
|
+
(секция «Tooling by category»): он находит неиспользуемые экспорты и мёртвый код
|
|
150
|
+
в утилитных модулях (свалка несвязанного кода). Используй вывод как подсказку и
|
|
151
|
+
верифицируй каждую находку вручную (`file:line`) перед занесением в FAIL. Если
|
|
152
|
+
ячейка пустая (tier general/generic) — проверяй вручную и помечай находки
|
|
153
|
+
`🔍 UNVERIFIED`.
|
|
154
|
+
|
|
155
|
+
## Формат вывода
|
|
156
|
+
|
|
157
|
+
| Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
|
|
158
|
+
|----------|----------|--------|-------------|----------------|---------|------------|
|
|
159
|
+
| NAM-01 | Соглашение об именовании соблюдается консистентно (camelCase/snake_case) | ✅ PASS | High | `src/` — стиль camelCase консистентен | — | — |
|
|
160
|
+
| NAM-05 | Magic numbers и magic strings заменены именованными константами | ❌ FAIL 🟡 | High | `utils/date.ts:18` | **1. Вынести в `const MAX_RETRY_ATTEMPTS = 3`** \\ 2. Добавить объяснение в комментарий рядом \\ 3. Переместить в конфиг | Нет |
|
|
161
|
+
| NAM-06 | Утилитные модули не являются свалкой несвязанного кода | ⏸ ACCEPTED | Medium | `src/utils.ts` | В baseline: рефактор запланирован | — |
|
|
162
|
+
| NAM-07 | Ключевые сущности названы в соответствии с доменным глоссарием проекта | 🔍 UNVERIFIED | Low | — | — | — |
|
|
163
|
+
|
|
164
|
+
Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
|
|
165
|
+
|
|
166
|
+
Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
|
|
167
|
+
|
|
168
|
+
Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
|
|
169
|
+
|
|
170
|
+
`Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
|
|
171
|
+
|
|
172
|
+
Требования к решениям:
|
|
173
|
+
- Взаимно исключающие (не перефразировки одного и того же)
|
|
174
|
+
- Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
|
|
175
|
+
- Не требуют переписать всю систему — realistic migration cost
|
|
176
|
+
- Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
|
|
177
|
+
|
|
178
|
+
В конце отчёта добавь раздел покрытия:
|
|
179
|
+
```
|
|
180
|
+
## Audit Coverage
|
|
181
|
+
Проверено: src/module1/**, src/module2/**
|
|
182
|
+
Пропущено: scripts/**, migrations/**, tests/**
|
|
183
|
+
Файлов проверено: N | Пропущено: N
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Если все PASS — выведи: `✅ Стандарты именования соблюдены.`
|
|
187
|
+
|
|
188
|
+
## Сохранение результатов
|
|
189
|
+
|
|
190
|
+
1. Найди папку сессии:
|
|
191
|
+
```bash
|
|
192
|
+
ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
|
|
193
|
+
```
|
|
194
|
+
Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
|
|
195
|
+
2. Сохрани через Write: `<AUDIT_DIR>/audit-naming.md`
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
# Audit Report: Naming — <YYYY-MM-DD HH:MM>
|
|
199
|
+
<таблица>
|
|
200
|
+
```
|