@gian-tiaga/eda 3.13.1 → 4.0.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/MIGRATION.md +23 -2
- package/README.md +153 -232
- package/agents/eda-aim-executor/prompt.md +2 -0
- package/agents/eda-aim-verifier/prompt.md +2 -0
- package/agents/eda-review-api/prompt.md +4 -4
- package/agents/eda-review-architecture/prompt.md +4 -4
- package/agents/eda-review-business/prompt.md +5 -12
- package/agents/eda-review-code-quality/prompt.md +4 -4
- package/agents/eda-review-correctness/prompt.md +3 -3
- package/agents/eda-review-database/prompt.md +4 -4
- package/agents/eda-review-documentation/prompt.md +4 -4
- package/agents/eda-review-frontend/prompt.md +4 -4
- package/agents/eda-review-infra/agent.json +14 -0
- package/agents/eda-review-infra/prompt.md +36 -0
- package/agents/eda-review-performance/prompt.md +7 -7
- package/agents/eda-review-plan-alignment/prompt.md +4 -4
- package/agents/eda-review-previous-reviews/prompt.md +5 -4
- package/agents/eda-review-references/prompt.md +4 -4
- package/agents/eda-review-rules/prompt.md +4 -4
- package/agents/eda-review-security/prompt.md +4 -4
- package/agents/eda-review-seo/agent.json +14 -0
- package/agents/eda-review-seo/prompt.md +36 -0
- package/agents/eda-review-tests/prompt.md +4 -4
- package/agents/eda-review-triage/agent.json +14 -0
- package/agents/eda-review-triage/prompt.md +38 -0
- package/agents/eda-skill-runner/agent.json +14 -0
- package/agents/eda-skill-runner/prompt.md +11 -0
- package/bin/cli.js +3 -3
- package/lib/catalog.js +32 -1
- package/lib/install.js +266 -611
- package/lib/prompts.js +53 -0
- package/lib/renderers/codex-agent.js +3 -1
- package/lib/renderers/codex-skill.js +21 -1
- package/lib/renderers/opencode-agent.js +23 -0
- package/lib/renderers/opencode-skill.js +24 -0
- package/package.json +4 -4
- package/skills/_shared/done.md +15 -0
- package/skills/_shared/questions.md +9 -0
- package/skills/eda-aim/SKILL.md +2 -3
- package/skills/eda-business/SKILL.md +5 -6
- package/skills/eda-commit/SKILL.md +2 -3
- package/skills/eda-discover-automations/SKILL.md +6 -7
- package/skills/eda-explore/SKILL.md +28 -15
- package/skills/eda-fix/SKILL.md +7 -7
- package/skills/eda-fix-by-review/SKILL.md +4 -3
- package/skills/eda-just-do-it/SKILL.md +4 -4
- package/skills/eda-manual-test/SKILL.md +7 -5
- package/skills/eda-merge-worktree/SKILL.md +2 -3
- package/skills/eda-new-project/SKILL.md +3 -5
- package/skills/eda-orhestra/SKILL.md +3 -4
- package/skills/eda-plan/SKILL.md +126 -168
- package/skills/eda-plan-execute/SKILL.md +72 -92
- package/skills/eda-plan-polish/SKILL.md +14 -14
- package/skills/eda-plan-review/SKILL.md +25 -10
- package/skills/eda-plan-review-fix/SKILL.md +10 -7
- package/skills/eda-polish/SKILL.md +9 -6
- package/skills/eda-prepare-ai/SKILL.md +35 -15
- package/skills/eda-prod-check/SKILL.md +129 -0
- package/skills/eda-review/SKILL.md +92 -64
- package/skills/eda-review/references/checks/api.md +18 -0
- package/skills/eda-review/references/checks/architecture.md +16 -0
- package/skills/eda-review/references/checks/business.md +13 -0
- package/skills/eda-review/references/checks/code-quality.md +18 -0
- package/skills/eda-review/references/checks/correctness.md +19 -0
- package/skills/eda-review/references/checks/database.md +17 -0
- package/skills/eda-review/references/checks/documentation.md +13 -0
- package/skills/eda-review/references/checks/frontend.md +19 -0
- package/skills/eda-review/references/checks/infra.md +16 -0
- package/skills/eda-review/references/checks/performance.md +21 -0
- package/skills/eda-review/references/checks/plan-alignment.md +16 -0
- package/skills/eda-review/references/checks/previous-reviews.md +9 -0
- package/skills/eda-review/references/checks/references.md +11 -0
- package/skills/eda-review/references/checks/rules.md +16 -0
- package/skills/eda-review/references/checks/security.md +26 -0
- package/skills/eda-review/references/checks/seo.md +16 -0
- package/skills/eda-review/references/checks/tests.md +18 -0
- package/skills/eda-review/references/defects.md +24 -0
- package/skills/eda-review/references/triage.md +23 -0
- package/skills/eda-roadmap/SKILL.md +2 -4
- package/skills/eda-send-review/SKILL.md +3 -5
- package/skills/eda-worktree/SKILL.md +2 -3
- package/skills/eda-review/references/review-matrix.md +0 -72
|
@@ -5,78 +5,81 @@ description: 'Проводит полное read-only ревью diff, ветк
|
|
|
5
5
|
|
|
6
6
|
# Скил: Ревьюер (eda-review)
|
|
7
7
|
|
|
8
|
-
Проводи одно полное read-only ревью в выбранном режиме исполнения. В `subagents` оркестрируй установленных `eda-review-*` агентов и сам не выполняй их специализированные роли. В `main` выполни те же выбранные проверки самостоятельно по
|
|
8
|
+
Проводи одно полное read-only ревью в выбранном режиме исполнения. В `subagents` оркестрируй установленных `eda-review-*` агентов и сам не выполняй их специализированные роли. В `main` выполни те же выбранные проверки самостоятельно по тем же чек-листам, не запуская leaf-субагентов. В обоих режимах сохрани один итоговый отчёт с одинаковыми требованиями к доказательствам и результату.
|
|
9
9
|
|
|
10
10
|
## Вход из сообщения пользователя
|
|
11
11
|
|
|
12
|
-
Текст рядом с вызовом скилла в текущем сообщении — главный вход. Сначала разбери target, план, ссылку, ограничения, режим `subagents` или `main`, отключённые или принудительно включённые проверки и разовые
|
|
12
|
+
Текст рядом с вызовом скилла в текущем сообщении — главный вход. Сначала разбери target, план, ссылку, ограничения, режим `subagents` или `main`, отключённые или принудительно включённые проверки и разовые модели или effort.
|
|
13
13
|
|
|
14
14
|
Если входа достаточно, продолжай без вопроса. Без аргументов ревьюй незакоммиченный `git diff HEAD`. Ссылка на PR/MR задаёт target однозначно. Если пользователь дал только корень удалённого репозитория, обязательно попроси указать PR/MR, ветку, коммит или файлы; весь репозиторий и последний PR автоматически не выбирай.
|
|
15
15
|
|
|
16
|
-
Явное слово `subagents` или `main` задаёт режим только для текущего запуска и важнее `docs/settings.yaml`. Разовые указания вида «без performance», «без business», «включи database», «включи business», «architecture на opus
|
|
16
|
+
Явное слово `subagents` или `main` задаёт режим только для текущего запуска и важнее `docs/settings.yaml`. Разовые указания вида «без performance», «без business», «включи database», «включи business», «architecture на anthropic/claude-opus-5-5#high», «tests на openai/gpt-5.6-sol» или «security на default#xhigh» также важнее настроек и выбора проверок.
|
|
17
17
|
|
|
18
18
|
Если во входе даны ранее отклонённые находки или путь к предыдущему ревью, прочитай их раздел «Отклонено» и не принимай эти находки повторно без нового доказательства.
|
|
19
19
|
|
|
20
20
|
## Настройки
|
|
21
21
|
|
|
22
|
-
Прочитай `docs/settings.yaml`, если файл есть. Поддерживается только `version: 3`. Используй `review.execution
|
|
22
|
+
Прочитай `docs/settings.yaml`, если файл есть. Поддерживается только `version: 3`. Используй `review.execution` и `review.agents.<role>`. Если файла нет или версия отличается, используй defaults и добавь предупреждение; старые настройки не применяй.
|
|
23
23
|
|
|
24
24
|
`review.execution` принимает:
|
|
25
25
|
|
|
26
|
-
- `subagents` — каждая выбранная проверка
|
|
27
|
-
- `main` — все выбранные проверки выполняет текущий агент в одном контексте.
|
|
26
|
+
- `subagents` — выбор проверок и каждая выбранная проверка выполняются отдельными установленными агентами;
|
|
27
|
+
- `main` — выбор и все выбранные проверки выполняет текущий агент в одном контексте.
|
|
28
28
|
|
|
29
|
-
Default — `
|
|
29
|
+
Default — `main`. При неизвестном или отсутствующем значении используй default и добавь предупреждение. Сначала выбери `$EXECUTION` по явному режиму из текущего сообщения, затем по настройке, иначе по default.
|
|
30
30
|
|
|
31
|
-
Зафиксируй режим и его источник до первой проверки. Выбор из вызова, override оркестратора или `review.execution` обязателен: большой diff, число проверок и нехватка контекста не разрешают переход к субагентам. Сохраняй режим и прогресс после сжатия контекста; если продолжить технически невозможно, верни конкретный блокер без смены режима. Менять режим можно только по новому прямому указанию пользователя.
|
|
31
|
+
Зафиксируй режим и его источник до первой проверки. Выбор из вызова, override оркестратора или `review.execution` обязателен: большой diff, число проверок и нехватка контекста не разрешают переход к субагентам. Сохраняй режим и прогресс после сжатия контекста; если продолжить технически невозможно, верни конкретный блокер без смены режима. Менять режим можно только по новому прямому указанию пользователя. Выбор проверок не меняет `$EXECUTION`.
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
`review.agents.<role>` — одна строка на роль: `default` или модель в формате `provider/model#variant`, где provider и variant необязательны, а variant задаёт effort. `default` — модель и effort установленного агента: в Claude Code и Codex — из таблицы ниже, в OpenCode — модель агента или сессии. `default#<variant>` меняет только effort.
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
- `auto` — запускать только когда проверка применима;
|
|
37
|
-
- `off` — не запускать.
|
|
35
|
+
В `subagents` применяй модель роли так:
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
- Claude Code запускает только модели Claude: `anthropic/claude-opus-5-5`, `claude-opus-5-5` или `opus` передай алиасом семейства (`haiku`, `sonnet`, `opus` и т.п.), variant — как effort `low`, `medium`, `high`, `xhigh` или `max`;
|
|
38
|
+
- Codex запускает только модели OpenAI: `openai/<model>` или `<model>` передай как модель, variant — как reasoning effort;
|
|
39
|
+
- OpenCode передай значение как есть в формате `provider/model#variant`; значение без provider, кроме `default`, OpenCode не применит.
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
Если текущая среда не может запустить модель или effort роли либо значение не соответствует формату, запусти роль на модели и effort установленного агента и добавь warning в покрытие. Ревью из-за этого не останавливай.
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
В `main` выбор и все проверки выполняются текущей моделью агента. Настройки и разовые overrides моделей и effort отдельных ролей не применяются; добавь об этом один warning в покрытие, только если пользователь явно передал такой override. Для completed-проверок укажи фактическую текущую модель, если хост её сообщает, иначе `current`.
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
|
50
|
-
|
|
51
|
-
| `
|
|
52
|
-
| `
|
|
53
|
-
| `
|
|
54
|
-
| `
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
45
|
+
Если `version: 3` существует, но раздела `review.agents` нет, используй `default` для всех ролей. Устаревшие поля `review.strict`, `review.include_code_quality` и раздел `review-check` не применяй. Состав проверок определяется по содержимому ревью, а не настройками. Существующий файл настроек не переписывай.
|
|
46
|
+
|
|
47
|
+
Модели и effort установленных агентов, которые означает `default` в Claude Code и Codex:
|
|
48
|
+
|
|
49
|
+
| Роль | Claude Code | Codex |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `triage` | `sonnet#low` | `gpt-5.6-terra#low` |
|
|
52
|
+
| `correctness` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
53
|
+
| `architecture` | `opus#high` | `gpt-5.6-sol#high` |
|
|
54
|
+
| `rules` | `haiku#low` | `gpt-5.6-luna#low` |
|
|
55
|
+
| `references` | `haiku#low` | `gpt-5.6-luna#low` |
|
|
56
|
+
| `business` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
57
|
+
| `plan_alignment` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
58
|
+
| `code_quality` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
59
|
+
| `tests` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
60
|
+
| `security` | `opus#high` | `gpt-5.6-sol#high` |
|
|
61
|
+
| `performance` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
62
|
+
| `frontend` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
63
|
+
| `api` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
64
|
+
| `database` | `opus#high` | `gpt-5.6-sol#high` |
|
|
65
|
+
| `infra` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
66
|
+
| `seo` | `sonnet#medium` | `gpt-5.6-terra#medium` |
|
|
67
|
+
| `documentation` | `haiku#low` | `gpt-5.6-luna#low` |
|
|
68
|
+
| `previous_reviews` | `haiku#low` | `gpt-5.6-luna#low` |
|
|
62
69
|
|
|
63
70
|
## Вопросы
|
|
64
71
|
|
|
65
72
|
Задавай вопрос только когда target противоречив, дана лишь ссылка на корень репозитория или безопасно выбрать цель невозможно. Вопрос о плане не задавай: используй план только если пользователь указал его или путь определяется однозначно; иначе установи `$PLAN_FILE=none`.
|
|
66
73
|
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
- Codex exec и другой неинтерактивный запуск: не читай stdin; верни `blocked: нужен target` с конкретным вопросом.
|
|
74
|
+
- Интерактивный запуск: `AskUserQuestion`, затем остановись до ответа.
|
|
75
|
+
- Неинтерактивный запуск: не читай stdin; верни `blocked: нужен target` с конкретным вопросом.
|
|
70
76
|
|
|
71
77
|
## Подготовить контекст
|
|
72
78
|
|
|
73
79
|
1. Определи `$TARGET`: явный файл, папка, URL PR/MR, ветка, коммит, указанный diff или `git diff HEAD` без аргументов. Для GitHub/GitLab URL получи metadata, diff, SHA текущего head и статусы CI read-only командами `gh`/`glab`; для другого сервиса используй доступное read-only средство. Если основной diff недоступен, остановись: warning разрешён для недоступных CI-результатов и прошлых обсуждений, но не для самого target.
|
|
74
|
-
2.
|
|
75
|
-
3.
|
|
76
|
-
4.
|
|
77
|
-
5. Определи `$BUSINESS_FILES`: сначала установи исходную задачу и фактически затронутое пользовательское или доменное поведение по текущему сообщению, плану и target. Если план содержит `sources.business`, используй только относящиеся к этому поведению пути; иначе прочитай `docs/business.md` и по описаниям выбери только применимые карточки. Если индекс отсутствует, подходящих карточек нет или изменения не затрагивают бизнес-поведение, используй `none`. Не загружай все карточки только потому, что индекс существует.
|
|
78
|
-
6. Сформируй краткий `$REVIEW_CONTEXT`: тип target, base, исходную задачу из текущего сообщения, плана, PR/MR title/body или явно связанного issue/артефакта, изменённые области, применимые документы и явные решения пользователя. Если надёжного описания задачи нет, явно напиши `task: unknown`, а не восстанавливай намерение по догадке. Не включай в контекст domain-инструкции агентов.
|
|
79
|
-
7. Для PR/MR сформируй `$CI_CONTEXT`: SHA head, названия, статусы, определимые команды и ссылки на автоматические CI-проверки; для failure добавь только значимый фрагмент лога, не передавай полные логи всех jobs. Учитывай только результаты для текущего head. Завершённую в CI проверку со статусом success или failure не запускай локально повторно: используй её результат и лог как доказательство. Локальный запуск допустим только для отсутствующей, отменённой, пропущенной, устаревшей или не сопоставимой с CI проверки либо по прямому указанию пользователя. Недоступный CI отметь warning и выполняй нужные проверки обычным способом. Для не-PR/MR target используй `CI_CONTEXT: none`.
|
|
80
|
+
2. Определи `$PLAN_FILE`. Если его нет, используй `none` и не пытайся восстановить последний план наугад.
|
|
81
|
+
3. Сформируй краткий `$REVIEW_CONTEXT`: тип target, base, исходную задачу из текущего сообщения, плана, PR/MR title/body или явно связанного issue/артефакта и явные решения пользователя. Если надёжного описания задачи нет, явно напиши `task: unknown`, а не восстанавливай намерение по догадке. Не включай в контекст domain-инструкции агентов.
|
|
82
|
+
4. Для PR/MR сформируй `$CI_CONTEXT`: SHA head, названия, статусы, определимые команды и ссылки на автоматические CI-проверки; для failure добавь только значимый фрагмент лога, не передавай полные логи всех jobs. Учитывай только результаты для текущего head. Завершённую в CI проверку со статусом success или failure не запускай локально повторно: используй её результат и лог как доказательство. Локальный запуск допустим только для отсутствующей, отменённой, пропущенной, устаревшей или не сопоставимой с CI проверки либо по прямому указанию пользователя. Недоступный CI отметь warning и выполняй нужные проверки обычным способом. Для не-PR/MR target используй `CI_CONTEXT: none`.
|
|
80
83
|
|
|
81
84
|
CI переиспользуется только как результат автоматических команд — тестов, линтеров, typecheck, сборки и аналогичных jobs. Он не заменяет выбранные смысловые проходы `correctness`, `architecture`, `tests` и другие: они по-прежнему анализируют diff и качество покрытия, но не дублируют уже завершённые CI-команды.
|
|
82
85
|
|
|
@@ -84,20 +87,41 @@ CI переиспользуется только как результат ав
|
|
|
84
87
|
|
|
85
88
|
## Выбрать проверки
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
- `references`
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
90
|
+
Фиксированного набора проверок нет: какие из них нужны, решается по содержимому ревью.
|
|
91
|
+
|
|
92
|
+
### Выбор в subagents
|
|
93
|
+
|
|
94
|
+
Первым, до пакета проверок, запусти одного установленного агента `eda-review-triage` с моделью роли `triage` по правилам запуска и технических остановок ниже. Сам target, `docs/references.md` и `docs/business.md` для выбора не читай и проверки сам не выбирай. Передай агенту только:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
Рабочая директория: <cwd>
|
|
98
|
+
TARGET: <target>
|
|
99
|
+
PLAN_FILE: <path | none>
|
|
100
|
+
MODEL: <фактически выбранная модель>
|
|
101
|
+
REVIEW_CONTEXT: <краткий общий контекст>
|
|
102
|
+
CI_CONTEXT: <head SHA, CI-проверки со статусами, командами, ссылками и значимыми failure-логами | none>
|
|
103
|
+
|
|
104
|
+
Верни результат строго по YAML-контракту установленного агента.
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Проверь ответ: `status: completed`, `check: triage`, запрошенная модель, каждая проверка из таблицы настроек, кроме `triage`, ровно один раз в `selected` или `skipped` с причиной, пути карточек существуют. При `blocked`, неверном YAML или нарушении контракта один раз повтори того же агента на той же модели с описанием ошибки; повторный сбой — остановись без итогового файла.
|
|
108
|
+
|
|
109
|
+
Из ответа возьми `$REFERENCE_FILES` и `$BUSINESS_FILES`, пустой список замени на `none`. `summary` добавь в `$REVIEW_CONTEXT` как изменённые области.
|
|
110
|
+
|
|
111
|
+
### Выбор в main
|
|
112
|
+
|
|
113
|
+
Прочитай `AGENTS.md`, `CLAUDE.md`, `docs/rules.md`, `docs/arch.md`, применимые к target карточки из их таблиц и target один раз: они станут общей основой выбора и всех проходов. Затем:
|
|
114
|
+
|
|
115
|
+
1. Определи `$REFERENCE_FILES`: если план содержит `sources.references`, используй их; иначе через `docs/references.md` выбери только применимые карточки для компонентов target. Если карточек нет, используй `none`.
|
|
116
|
+
2. Определи `$BUSINESS_FILES`: сначала установи фактически затронутое пользовательское или доменное поведение по текущему сообщению, плану и target. Если план содержит `sources.business`, используй только относящиеся к этому поведению пути; иначе прочитай `docs/business.md` и по описаниям выбери только применимые карточки. Если индекс отсутствует, подходящих карточек нет или изменения не затрагивают бизнес-поведение, используй `none`. Не загружай все карточки только потому, что индекс существует.
|
|
117
|
+
3. Выбери проверки по [references/triage.md](references/triage.md) и добавь изменённые области в `$REVIEW_CONTEXT`.
|
|
118
|
+
|
|
119
|
+
### Поверх выбора
|
|
120
|
+
|
|
121
|
+
В обоих режимах затем примени:
|
|
122
|
+
|
|
123
|
+
1. Детерминированные правила: `plan_alignment` выбран только при `$PLAN_FILE` не `none`, `references` — только при непустом `$REFERENCE_FILES`, `business` — только при непустом `$BUSINESS_FILES`, `previous_reviews` — для URL PR/MR или другой удалённой цели с обсуждениями. Расхождение с ответом triage исправь сам, повторно triage не запускай.
|
|
124
|
+
2. Разовые указания пользователя последними: «без X» исключает проверку, «включи X» добавляет её с причиной «указано пользователем».
|
|
101
125
|
|
|
102
126
|
Для каждой проверки сохрани причину `selected` или `skipped`; она попадёт в покрытие.
|
|
103
127
|
|
|
@@ -107,24 +131,24 @@ CI переиспользуется только как результат ав
|
|
|
107
131
|
|
|
108
132
|
Всю работу выполни сам как основной агент текущего workflow. Не запускай `eda-review-*` агентов, другие субагенты или отдельный CLI. Вызывающий workflow не должен оборачивать `eda-review` в отдельного субагента, если передал режим `main`.
|
|
109
133
|
|
|
110
|
-
Прочитай [references/
|
|
134
|
+
Прочитай [references/defects.md](references/defects.md) один раз, а перед проходом каждой выбранной проверки — её чек-лист `references/checks/<проверка>.md`: имя файла — имя агента без префикса `eda-review-`, например `plan_alignment` → `references/checks/plan-alignment.md`. Это те же чек-листы и требования к находке, которые установщик встраивает в агентов для `subagents`. Не читай packaged prompts из `agents/eda-review-*` и не пытайся вызвать их как скилы.
|
|
111
135
|
|
|
112
|
-
1.
|
|
113
|
-
2. Последовательно выполни отдельный проход по каждой выбранной проверке
|
|
136
|
+
1. Target и общие документы уже прочитаны при выборе; общий код вокруг изменений дочитай один раз. Применимые инструкции, `$PLAN_FILE`, `$REFERENCE_FILES` и `$BUSINESS_FILES` также загрузи один раз и только когда соответствующая проверка выбрана. Соблюдай `$CI_CONTEXT`: не перезапускай автоматическую команду, уже завершённую в CI на текущем head.
|
|
137
|
+
2. Последовательно выполни отдельный проход по каждой выбранной проверке по её чек-листу. Не смешивай области и не пропускай проход из-за того, что соседняя проверка уже изучала тот же код.
|
|
114
138
|
3. Для каждого прохода сохрани внутренний результат: `check`, `status`, `summary` и кандидаты в находки с `severity`, `explanation`, `evidence`, `repro`, `fix` и `tests`. YAML между проходами не нужен.
|
|
115
139
|
4. Если проверка оказалась неприменима, перенеси её в skipped с конкретной причиной. Если обязательную проверку невозможно выполнить из-за недоступного target или контекста, остановись без итогового файла. Недоступные CI-результаты и предыдущие удалённые обсуждения преврати в warning и продолжай.
|
|
116
140
|
5. После всех проходов проверь доказательства, дедуплицируй кандидатов, выставь score и сохрани итог по общим правилам ниже. Не запускай отдельный редакторский или подтверждающий проход.
|
|
117
141
|
|
|
118
142
|
### Режим subagents
|
|
119
143
|
|
|
120
|
-
Имя агента получается из имени
|
|
144
|
+
Имя агента получается из имени роли:
|
|
121
145
|
|
|
122
146
|
- `plan_alignment` → `eda-review-plan-alignment`;
|
|
123
147
|
- `code_quality` → `eda-review-code-quality`;
|
|
124
148
|
- `previous_reviews` → `eda-review-previous-reviews`;
|
|
125
149
|
- остальные → `eda-review-<check>`.
|
|
126
150
|
|
|
127
|
-
В Claude Code запускай установленный custom agent через `Agent` tool. В Codex каждого установленного custom agent запускай через `spawn_agent` с `fork_turns: "none"`; не оставляй `fork_turns` по умолчанию и не передавай историю основного агента. Передай
|
|
151
|
+
В Claude Code запускай установленный custom agent через `Agent` tool. В Codex каждого установленного custom agent запускай через `spawn_agent` с `fork_turns: "none"`; не оставляй `fork_turns` по умолчанию и не передавай историю основного агента. Передай модель и effort роли как runtime override по правилам раздела «Настройки»; если среда не может их применить, запусти агента с установленными моделью и effort и добавь warning в покрытие. Если нативные субагенты недоступны, остановись: не выполняй роли главным агентом и не создавай отдельные CLI-процессы.
|
|
128
152
|
|
|
129
153
|
### Технические остановки субагентов
|
|
130
154
|
|
|
@@ -139,7 +163,7 @@ CI переиспользуется только как результат ав
|
|
|
139
163
|
|
|
140
164
|
Ожидание слота и один технический retry не считаются повторной содержательной проверкой агента.
|
|
141
165
|
|
|
142
|
-
|
|
166
|
+
После ответа triage сформируй весь набор выбранных проверок, затем отправь все вызовы одним параллельным пакетом в одном ответе ассистента. Не дели проверки заранее на волны, партии или последовательные группы и не жди завершения части агентов перед запуском остальных. Если хост ограничивает concurrency, разреши нативному механизму поставить лишние задачи в очередь; повторный запуск допустим только после фактической ошибки лимита по правилам технических остановок выше.
|
|
143
167
|
|
|
144
168
|
Ожидай результаты только нативным механизмом субагентов и их уведомлениями о завершении; в Codex используй `wait_agent`. Не используй Bash, shell-циклы, `sleep`, опрос файлов или артефактов и фиксированные таймауты для ожидания агентов. После отправки всего пакета собирай ответы по мере нативного завершения.
|
|
145
169
|
|
|
@@ -178,7 +202,7 @@ CI_CONTEXT: <head SHA, CI-проверки со статусами, команд
|
|
|
178
202
|
|
|
179
203
|
1. Проверь находки по указанным evidence и отклони неподтверждённые.
|
|
180
204
|
2. Объедини дубли разных агентов в один пункт, сохранив все полезные доказательства.
|
|
181
|
-
3. Оставь только конкретные ошибки, нарушения контрактов и существенные неточности, которые нельзя безопасно игнорировать. Косметические улучшения, вкусовой рефакторинг, спекулятивное усиление, необязательные тесты, документацию и оптимизации отклони, а не превращай в находку.
|
|
205
|
+
3. Оставь только конкретные ошибки, нарушения контрактов и существенные неточности, которые нельзя безопасно игнорировать. Косметические улучшения, вкусовой рефакторинг, спекулятивное усиление, необязательные тесты, документацию и оптимизации кода, которые изменение не ухудшило, отклони, а не превращай в находку. Рост потребления ресурсов, внесённый изменением, — например, больше запросов к БД или внешних вызовов на ту же операцию — не оптимизация, а дефект.
|
|
182
206
|
4. Отклони находку про будущее: дефект должен существовать в текущем коде. «Сломается, если позже кто-то так сделает» без достижимого на текущем коде сценария — не находка.
|
|
183
207
|
5. Для каждой принятой находки проверь точное место, доказательство, способ воспроизведения, практическое влияние, минимальное исправление и способ проверки. Если хотя бы одного элемента нет, отклони находку.
|
|
184
208
|
6. Каждую отклонённую находку запиши в раздел «Отклонено» с проверкой-источником и причиной. В число находок и в score отклонённые не входят.
|
|
@@ -201,9 +225,11 @@ score: <0..100>
|
|
|
201
225
|
status: <reviewed | reviewed-with-warnings>
|
|
202
226
|
result: <clean | changes-required>
|
|
203
227
|
date: <YYYY-MM-DD HH:MM>
|
|
228
|
+
triage: <модель и effort | main>
|
|
204
229
|
checks:
|
|
205
230
|
- name: <check>
|
|
206
231
|
model: <model>
|
|
232
|
+
effort: <effort | current>
|
|
207
233
|
status: <completed | skipped | warning>
|
|
208
234
|
reason: <почему запущен, пропущен или неполон>
|
|
209
235
|
---
|
|
@@ -217,7 +243,8 @@ checks:
|
|
|
217
243
|
## Покрытие
|
|
218
244
|
|
|
219
245
|
- **Execution:** <subagents | main>
|
|
220
|
-
- **
|
|
246
|
+
- **Triage:** <модель и effort разведчика | «main: проверки выбраны основным агентом»>
|
|
247
|
+
- **Completed:** <проверки, модели и effort>
|
|
221
248
|
- **Skipped:** <проверки и причины>
|
|
222
249
|
- **Warnings:** <предупреждения или «нет»>
|
|
223
250
|
- **CI:** <переиспользованные результаты текущего head, локально запущенные отсутствующие проверки и недоступные данные>
|
|
@@ -264,7 +291,8 @@ checks:
|
|
|
264
291
|
|
|
265
292
|
- Править код, настройки проекта или удалённые обсуждения.
|
|
266
293
|
- В `subagents` выполнять специализированную роль главным агентом или подменять отсутствующих субагентов одним общим ревью.
|
|
267
|
-
- В `
|
|
294
|
+
- В `subagents` выбирать проверки самому вместо `eda-review-triage` или запускать пакет проверок до его ответа.
|
|
295
|
+
- В `main` запускать leaf-субагентов, другой CLI или читать packaged prompts вместо чек-листов `references/checks/`.
|
|
268
296
|
- Записывать итоговый файл после повторного сбоя обязательного агента в `subagents` или незавершённой обязательной проверки в `main`.
|
|
269
297
|
- Выбирать последний PR или весь репозиторий по ссылке на корень.
|
|
270
298
|
- Загружать все карточки references без отбора.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверяй обе стороны изменённого взаимодействия — того, кто отдаёт, и тех, кто потребляет: HTTP-эндпоинты, GraphQL, RPC, события и сообщения очередей, вебхуки, SDK. Каждое подозрение проверь сценарием: прежний допустимый запрос или ответ → конкретное изменение → путь существующего потребителя → другой результат или побочный эффект. Выводы делай только о потребителях, которых прочитал; непрочитанных назови в `summary` и не считай совместимыми.
|
|
4
|
+
|
|
5
|
+
- **Ввод и валидация:** прежний допустимый запрос перестал приниматься: новое обязательное поле, сужение типа, enum, длины или диапазона, другое значение по умолчанию, иное поведение для отсутствующего поля и `null`, неизвестные поля теперь отвергаются. Новый необязательный параметр меняет поведение, когда его не передали.
|
|
6
|
+
- **Ответ:** удалено или переименовано поле; изменились тип, nullability, формат даты или числа, набор значений enum; потребитель со строгой схемой или исчерпывающим разбором отвергает новое поле или значение.
|
|
7
|
+
- **Ошибки:** изменились коды, формат тела или смысл ошибки; ошибка отдаётся с кодом успеха; изменилось, какие ошибки можно повторять.
|
|
8
|
+
- **Права:** изменились требуемые роли, scope или проверки владельца; эндпоинт стал доступен шире, чем раньше.
|
|
9
|
+
- **Пагинация:** нет детерминированного порядка с разрывом равенства, и записи дублируются или пропадают между страницами; изменились лимит по умолчанию, максимум, формат курсора или признак следующей страницы.
|
|
10
|
+
- **Асинхронные операции:** путаются «принято» и «выполнено»; изменились статусы, конечные состояния или момент, когда эффект уже зафиксирован.
|
|
11
|
+
- **Повторы:** повтор после таймаута, когда первая попытка уже выполнилась, создаёт второй эффект; ключ идемпотентности перестал учитываться или изменились его область и срок хранения.
|
|
12
|
+
- **Версии и соглашения:** несовместимое изменение без новой версии там, где проект версионирует API; отступление от принятого в проекте формата ответов, ошибок, именования и пагинации.
|
|
13
|
+
- **Описание контракта:** схема OpenAPI, GraphQL или protobuf, сгенерированный клиент или общий тип расходятся с фактическим обработчиком.
|
|
14
|
+
|
|
15
|
+
## Не находка
|
|
16
|
+
|
|
17
|
+
- Новое необязательное поле, которое прочитанные потребители допускают.
|
|
18
|
+
- Общая бизнес-логика, безопасность и хранение данных вне контракта — отдельные проверки.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверяй изменение по `docs/arch.md`, применимым карточкам `docs/arch/` из его таблицы и разделу `Рамка` плана, если он есть. Находка допустима, только когда решение уже создаёт неправильную связанность, нарушение границы или несовместимый контракт с конкретным практическим риском.
|
|
4
|
+
|
|
5
|
+
- **Границы и направление зависимостей:** модуль или слой обращается к тому, от чего по архитектуре зависеть не может; появился цикл зависимостей; доменный код тянет инфраструктуру, фреймворк или транспорт.
|
|
6
|
+
- **Ответственность:** логика попала в компонент, который по архитектуре за неё не отвечает (бизнес-правило в контроллере, шаблоне или миграции); одно правило теперь реализовано в двух компонентах.
|
|
7
|
+
- **Чужие внутренности:** код читает внутреннее представление другого модуля — его поля, таблицы, формат хранения — вместо публичной операции, и изменение того модуля заставит менять этот.
|
|
8
|
+
- **Контракты между модулями:** изменены интерфейс, событие или формат обмена без обновления всех потребителей в репозитории.
|
|
9
|
+
- **Новые зависимости и сервисы:** добавлены библиотека, сервис, очередь или хранилище, которых нет в архитектуре и плане.
|
|
10
|
+
- **Рамка плана:** решение противоречит архитектурному пункту раздела `Рамка`.
|
|
11
|
+
|
|
12
|
+
## Не находка
|
|
13
|
+
|
|
14
|
+
- Предпочтение другой структуры без нарушения документированной границы и без риска.
|
|
15
|
+
- Существующая зависимость, которую изменение не расширило.
|
|
16
|
+
- Корректность, стиль и тесты — отдельные проверки.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверяй изменённое пользовательское и доменное поведение только по переданным business-карточкам; требования соседних карточек не добавляй и область задачи не расширяй. Намерение изменений устанавливай по задаче, плану и контексту ревью; если задача неизвестна, не выдумывай его.
|
|
4
|
+
|
|
5
|
+
- **Нарушение правила:** реализация нарушает применимое подтверждённое правило карточки, а задача или план его не меняют, — дефект бизнес-логики.
|
|
6
|
+
- **Неполное правило:** реализованы не все ветки правила из карточки — исключения, ограничения, состояния и переходы, сроки, лимиты.
|
|
7
|
+
- **Рассинхронизация:** задача или план явно меняют правило, но карточка не обновлена, — рассинхронизация business-документации, а не автоматическое доказательство неверной реализации; исправление — пересогласовать карточку через `eda-business`.
|
|
8
|
+
|
|
9
|
+
Если задача неизвестна, не объявляй правило намеренно изменённым, но сверку с действующей карточкой продолжай.
|
|
10
|
+
|
|
11
|
+
## Не находка
|
|
12
|
+
|
|
13
|
+
- Общая корректность, архитектура, стиль кода, технические references и документация вне business-карточек.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверь, что вносит изменение; эти случаи доказуемы и являются находками:
|
|
4
|
+
|
|
5
|
+
- **Повтор существующего:** новая реализация того, что в проекте уже есть, — функции, хелпера, компонента, валидации, константы или клиента внешнего сервиса; в evidence укажи путь к существующей реализации. Ищи только для новых функций, хелперов, компонентов и констант из diff — по имени и назначению, без обхода всего проекта.
|
|
6
|
+
- **Копия логики:** скопированный блок внутри diff или из существующего кода вместо общего вызова, когда копии уже расходятся или задают одно и то же правило в двух местах.
|
|
7
|
+
- **Мёртвый код:** неиспользуемые функции, экспорты, параметры, ветки, недостижимые после изменения, закомментированный код.
|
|
8
|
+
- **Отладочный код:** временный вывод (`console.log`, `dd()`, `var_dump`, `print`), заглушки, отключённые проверки, захардкоженные тестовые значения.
|
|
9
|
+
- **Абстракция на будущее:** интерфейс с единственной реализацией, параметр или флаг, который никто не передаёт, точка расширения без второго пользователя, слой, который только передаёт вызов дальше, — если их добавило изменение и их не требует план.
|
|
10
|
+
- **Чужой способ:** расхождение с устоявшимся в модуле способом обработки ошибок, логирования, чтения конфигурации или доступа к данным, когда в соседнем коде есть прямой образец; в evidence укажи образец.
|
|
11
|
+
- **Имя противоречит поведению:** `isValid` что-то меняет, `getUser` создаёт запись, `count` возвращает список — и вызывающий код уже полагается на смысл имени.
|
|
12
|
+
- **Непроверяемая сложность:** сложность или размер, которые уже скрывают ошибку либо делают изменённое поведение непроверяемым тестом.
|
|
13
|
+
|
|
14
|
+
## Не находка
|
|
15
|
+
|
|
16
|
+
- Вкусовые предпочтения и мелкие стилистические замечания.
|
|
17
|
+
- Функциональные баги, архитектура, производительность и правила проекта — отдельные проверки.
|
|
18
|
+
- Структура, которая не создаёт конкретного риска ошибок или тестовых пробелов.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Ищи реальные ошибки поведения изменённого кода. Молчание задачи или плана — не разрешение: если в ситуации, о которой план молчит, поведение расходится с ожиданием разумного пользователя, это дефект.
|
|
4
|
+
|
|
5
|
+
- **Логика и условия:** инвертированное или неполное условие, перепутанные `и`/`или`, ошибка на единицу в границах, циклах, срезах и пагинации, неверный порядок операций.
|
|
6
|
+
- **Граничные значения:** пустая строка или коллекция, `null`, `undefined` или отсутствующий ключ, ноль, отрицательное и максимальное значение, первый и последний элемент, одна запись вместо многих.
|
|
7
|
+
- **Состояния:** недопустимый переход, состояние без выхода, повторная обработка уже обработанного, флаги, которые расходятся между собой.
|
|
8
|
+
- **Тихие сбои:** пустой `catch`; `catch`, который только логирует и продолжает так, будто всё прошло успешно; пустое значение или значение по умолчанию вместо ошибки; слишком широкий `catch`, который глотает чужие ошибки; `?.` или `??`, которые молча пропускают обязательное действие; подмена заглушкой вне тестов; повторы, которые исчерпались без сообщения.
|
|
9
|
+
- **Частичный сбой:** операция из нескольких шагов прерывается посередине и оставляет данные несогласованными, без отката, компенсации или безопасного повтора.
|
|
10
|
+
- **Гонки:** проверка и запись разделены (прочитал остаток — списал) без атомарной операции, блокировки или ограничения уникальности; повторный запрос создаёт дубль.
|
|
11
|
+
- **Повторы:** повтор после таймаута, когда первая попытка уже выполнилась, создаёт второй эффект; ключ идемпотентности генерируется заново для повтора той же операции.
|
|
12
|
+
- **Время, деньги, текст:** часовые пояса и переход на летнее время, сравнение дат в разных зонах, деньги во float, округление, деление на ноль, переполнение, регистр и кодировка при сравнении строк, локаль при разборе чисел и дат.
|
|
13
|
+
- **Ресурсы:** файлы, соединения, подписки и таймеры не освобождаются на пути ошибки.
|
|
14
|
+
- **Кеш:** изменение данных не сбрасывает и не обновляет кеш, который их хранит; ключ кеша не учитывает параметр, от которого зависит результат.
|
|
15
|
+
|
|
16
|
+
## Не находка
|
|
17
|
+
|
|
18
|
+
- Сценарий, который невозможен из-за гарантий вызывающего кода, подтверждённых в коде.
|
|
19
|
+
- Архитектура, стиль, документация, безопасность и соответствие плану как отдельные темы: упоминай их, только когда они прямо доказывают ошибку поведения.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверяй схемы, миграции, запросы и транзакции изменения с учётом существующих данных, конкурентных операций и порядка выкладки. Миграции не выполняй и базу не меняй.
|
|
4
|
+
|
|
5
|
+
- **Существующие данные:** новое `NOT NULL` без значения по умолчанию или заполнения существующих строк; новое ограничение уникальности или внешний ключ, которому противоречат текущие данные; сужение типа или длины обрезает данные; заполнение не учитывает `NULL`, дубли и удалённые записи.
|
|
6
|
+
- **Выкладка без простоя:** старая версия кода, которая работает во время выкладки, читает или пишет удалённую или переименованную колонку; переименование вместо добавления новой колонки и последующего удаления старой; миграция и код требуют определённого порядка выкладки, а он не обеспечен.
|
|
7
|
+
- **Блокировки:** долгая блокировка большой таблицы — индекс без неблокирующего режима (`CONCURRENTLY` в PostgreSQL, online DDL в MySQL), смена типа колонки, заполнение всей таблицы одной транзакцией миграции.
|
|
8
|
+
- **Обратимость:** откат миграции невозможен или теряет данные, хотя проект делает откаты; откат не соответствует прямой миграции.
|
|
9
|
+
- **Схема и модель:** nullable, default, тип и длина в миграции расходятся с моделью, валидацией и планом; деньги во float; время без часового пояса там, где проект хранит его с поясом.
|
|
10
|
+
- **Целостность:** инвариант держится только проверкой в коде (проверил — вставил) без ограничения уникальности, внешнего ключа или блокировки, и параллельные запросы его нарушают; каскадное удаление уносит данные, которые должны остаться, или его нет и остаются сироты; мягкое удаление не учтено в новых запросах и уникальных индексах.
|
|
11
|
+
- **Транзакции:** операции, которые должны быть атомарными, выполняются вне одной транзакции; внешний вызов, письмо или событие отправляются внутри транзакции, которая потом может откатиться; уровень изоляции не защищает от гонки, которую создаёт изменение.
|
|
12
|
+
- **Запросы и индексы:** новый запрос фильтрует, сортирует или соединяет большую таблицу по колонкам без индекса — размер таблицы подтверди данными проекта, миграциями или документацией; функция над колонкой не даёт использовать индекс; новый индекс дублирует существующий.
|
|
13
|
+
|
|
14
|
+
## Не находка
|
|
15
|
+
|
|
16
|
+
- Требование индекса без обоснованного запроса и объёма данных.
|
|
17
|
+
- Число запросов на операцию и N+1 — `performance`; логика без последствий для хранения — `correctness`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Ищи только документацию, которую обязательно обновить из-за изменения. Сопоставь поведение после изменения с документами, которые его описывают: README, руководства, справка CLI, примеры конфигурации, описание API, `docs/`, CHANGELOG и заметки о миграции, если проект их ведёт.
|
|
4
|
+
|
|
5
|
+
- **Устаревшая инструкция:** документ описывает команду, флаг, параметр, endpoint, настройку или шаг установки, которые изменение удалило, переименовало или изменило, и пользователь, следуя ему, получит ошибку.
|
|
6
|
+
- **Новое без описания:** новая обязательная переменная окружения, настройка, команда или шаг развёртывания не описаны там, где проект описывает аналогичные.
|
|
7
|
+
- **Несовместимость без заметки:** изменение ломает существующих пользователей, а проект ведёт CHANGELOG или руководство по миграции, и записи в нём нет.
|
|
8
|
+
- **Сломанный пример:** пример кода или конфигурации в документации перестал работать.
|
|
9
|
+
|
|
10
|
+
## Не находка
|
|
11
|
+
|
|
12
|
+
- Комментарии и документация для внутренних очевидных изменений; редакторская правка текста.
|
|
13
|
+
- Правила и эталоны — `rules` и `references`.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверяй по исходникам изменённые компоненты, состояние, формы, действия, клиентские данные и стили. Рассмотри основной и ошибочные пользовательские сценарии. Не утверждай, что видел интерфейс: браузерная проверка относится к `eda-manual-test`.
|
|
4
|
+
|
|
5
|
+
- **Состояния:** у асинхронных данных нет состояния загрузки, пустых данных, ошибки или успеха; при ошибке запроса интерфейс остаётся в загрузке или ничего не сообщает.
|
|
6
|
+
- **Действия:** повторное нажатие отправляет действие дважды; кнопка доступна во время отправки; после ошибки форма теряет введённые данные; оптимистичное обновление не откатывается при ошибке.
|
|
7
|
+
- **Асинхронность:** ответ на устаревший запрос перетирает более новый (быстрый ввод в поиске, смена фильтра, переход между страницами); запрос продолжает менять состояние после ухода со страницы.
|
|
8
|
+
- **Формы:** ошибки серверной валидации не привязаны к полям; клиентская проверка расходится с серверной; у поля нет подписи или `name`, и не работают автозаполнение и экранный диктор.
|
|
9
|
+
- **Утечки:** подписки, таймеры, обработчики событий и наблюдатели не снимаются при размонтировании.
|
|
10
|
+
- **Доступность:** интерактивный элемент сделан не кнопкой или ссылкой и недоступен с клавиатуры; нет видимого фокуса; модальное окно не удерживает и не возвращает фокус; у содержательного изображения нет `alt`; у кнопки-иконки нет доступного имени.
|
|
11
|
+
- **Вёрстка:** фиксированные размеры ломают узкий экран; изображение или блок без размеров сдвигает вёрстку при загрузке; длинный текст или перевод не помещается.
|
|
12
|
+
- **Маршруты и роли:** прямой переход по URL открывает экран без нужных данных или с ошибкой; элемент скрыт по роли только визуально, а действие на клиенте выполняется.
|
|
13
|
+
- **Ошибки наружу:** пользователю показывается сырой текст исключения, stack trace или ответ сервера; отладочный вывод в консоль остаётся в production-сборке.
|
|
14
|
+
- **SSR и гидратация:** разметка сервера и клиента расходится (текущая дата, случайное значение, обращение к `window` при серверном рендере).
|
|
15
|
+
|
|
16
|
+
## Не находка
|
|
17
|
+
|
|
18
|
+
- Общая проблема корректности, API или тестов, не специфичная для интерфейса.
|
|
19
|
+
- Вкусовые замечания к дизайну без нарушения сценария, доступности или вёрстки.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверяй только затронутые изменением инфраструктурные файлы и связанные с ними места приложения: порт, переменные окружения, healthcheck, команду запуска и пути статики. Полный аудит инфраструктуры проекта не проводи. Проектные решения — канонический хост, политику редиректов, базовые образы, обязательные переменные — бери из `docs/rules.md` и `docs/arch.md`; универсальные требования ниже их не заменяют. Если в проекте настроены hadolint, actionlint, gixy, `nginx -t` или валидаторы compose, Kubernetes и Terraform, используй их результат из CI или безопасный локальный запуск.
|
|
4
|
+
|
|
5
|
+
- **Образ:** базовый образ закреплён версией, а не `latest`; зависимости ставятся по lock-файлу; инструменты сборки и исходники не попадают в итоговый образ, если есть отдельная стадия сборки; процесс работает не от root; секреты не попадают в слои через `ARG`, `ENV`, `COPY` или историю; `.dockerignore` исключает `.env`, `.git` и локальные артефакты; `CMD` и `ENTRYPOINT` в exec-форме, чтобы сигнал остановки доходил до процесса.
|
|
6
|
+
- **Оркестрация:** порт приложения совпадает в коде, `EXPOSE`, compose, сервисе и upstream прокси; данные БД и загрузок лежат в постоянном томе; порты БД, кеша, очередей, отладки и админок не опубликованы наружу без необходимости, а нужные на хосте привязаны к `127.0.0.1`; зависимый сервис ждёт готовности, а не только старта; healthcheck проверяет готовность и обращается к существующему пути; логи идут в stdout и stderr, а не в файлы внутри контейнера, и их размер ограничен ротацией.
|
|
7
|
+
- **Прокси и TLS:** HTTP отдаёт 301 на HTTPS; все варианты хоста отдают 301 на канонический из `docs/rules.md` с сохранением пути и query; если канонический хост не зафиксирован, оба варианта не должны отвечать 200 одним содержимым; HSTS только на HTTPS; приложение получает `Host`, `X-Forwarded-For` и `X-Forwarded-Proto`; `add_header` во вложенном блоке не теряет заголовки родителя, в том числе заголовки безопасности; `alias` и `proxy_pass` не допускают обход пути; лимит размера тела и таймауты прокси не меньше, чем требует изменённый сценарий; WebSocket получает заголовки upgrade.
|
|
8
|
+
- **Отдача:** текстовые ответы (HTML, CSS, JS, JSON, SVG) сжимаются gzip или brotli; статика с хешем в имени отдаётся с долгим `Cache-Control` и `immutable`, а HTML — без долгого кеша; статику отдаёт веб-сервер или CDN, а не процесс приложения; изменённый конфиг не отключает keep-alive и HTTP/2; sourcemap-файлы не публикуются, если проект их скрывает.
|
|
9
|
+
- **Production-настройки:** debug выключен в production-шаблоне окружения (`APP_DEBUG`, `DEBUG`, `NODE_ENV`); если изменены образ или конфиг runtime, opcache или его аналог включён и ему хватает памяти, а лимиты процессов PHP-FPM, воркеров и пула соединений соответствуют памяти сервера; деплой собирает кеши фреймворка (`config:cache`, `route:cache`, `view:cache` и аналоги) и ставит зависимости без dev-пакетов с оптимизированным автозагрузчиком, если проект так делает.
|
|
10
|
+
- **CI/CD:** секреты не печатаются в лог и не передаются недоверенному коду из форка; сторонние actions и образы закреплены версией; права токена не шире нужных; деплой идёт после обязательных проверок; миграции выполняются в порядке, совместимом с выкладкой; после выкладки проверяется работоспособность.
|
|
11
|
+
- **Окружение:** новая или переименованная переменная окружения, которую читает код, задана во всех шаблонах и манифестах окружений проекта или имеет безопасный default; секреты не закоммичены в конфиги.
|
|
12
|
+
|
|
13
|
+
## Не находка
|
|
14
|
+
|
|
15
|
+
- Уязвимости кода приложения — `security`.
|
|
16
|
+
- Инструмент, процесс или усиление, которых нет в проекте (лимиты ресурсов, отдельные сети, скрипты отката), без конкретного дефекта изменения.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Ищи рост потребления ресурсов, который вносит изменение. Для каждой изменённой точки входа — обработчика запроса, страницы, job, консольной команды или обработчика события — сравни base и head по одному и тому же сценарию.
|
|
4
|
+
|
|
5
|
+
- **Число операций:** запросы к БД, HTTP- и RPC-вызовы, сообщения в очереди, обращения к кешу, файловые операции и подпроцессы на одну операцию. Считай по самому diff: в hunk видны удалённые и добавленные строки. Версию base читай только когда из hunk не видно, оказался ли вызов внутри цикла или на другом пути.
|
|
6
|
+
- **Рост от данных:** ввод-вывод внутри цикла, ленивая загрузка связей, повторная загрузка уже полученных данных.
|
|
7
|
+
- **Без ограничения:** выборка или обработка без limit или пагинации, загрузка всей коллекции или файла в память вместо потока.
|
|
8
|
+
- **Синхронный путь:** новые последовательные внешние вызовы на пути запроса; внешний вызов без таймаута; письма, отчёты и обработка файлов в запросе вместо очереди, когда очередь в проекте есть.
|
|
9
|
+
- **Кеш:** результат пересчитывается на каждом запросе, хотя аналогичный в модуле кешируется; кеш без срока жизни или с ключами, число которых растёт без предела; одновременный пересчёт истёкшего ключа на горячем пути.
|
|
10
|
+
- **Отдача фронтенда:** заметно растёт вес CSS, JS или шрифтов, которые грузятся на каждой странице (библиотека целиком ради одной функции, стили без удаления неиспользуемого, импорт всего пакета вместо модуля); изображение основного экрана без сжатия, размеров и подходящего формата; новый скрипт блокирует рендер в `<head>`; новая статика без хеша в имени, и её нельзя кешировать надолго.
|
|
11
|
+
- **Конкурентность и память:** блокировка удерживается на время внешнего вызова; глобальная блокировка на горячем пути; память растёт с числом запросов (неограниченный внутренний кеш, накопление в статическом поле).
|
|
12
|
+
|
|
13
|
+
Рост потребления ресурсов, внесённый изменением, — дефект, а не оптимизация: было 2 запроса — стало 20, было N запросов на список — стало N+1, появился внешний вызов на каждом запросе, CSS вырос с 80 до 680 КБ. Находка называет точку входа, счёт или размер до и после и условие роста.
|
|
14
|
+
|
|
15
|
+
Время выполнения подтверждай только измерением: результатом бенчмарка или профиля из CI, безопасным локальным замером или существующим тестом на число запросов. Без измерения называй рост числа операций, размера или сложности, а не «станет медленнее». Вес фронтенда подтверждай размером собранного файла из CI или безопасной локальной сборки либо размером добавленной зависимости.
|
|
16
|
+
|
|
17
|
+
## Не находка
|
|
18
|
+
|
|
19
|
+
- Неоптимальность, которая уже была в base и не ухудшилась.
|
|
20
|
+
- Микрооптимизация без измеримого или очевидного эффекта на фактических объёмах проекта.
|
|
21
|
+
- Индексы, блокировки таблиц и транзакции — `database`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Проверяй реализацию только по конкретному плану. Прочитай его целиком: `Рамку`, `Целевой алгоритм`, контракты, фазы, тесты, документацию и `Принятые решения`.
|
|
4
|
+
|
|
5
|
+
- **Не сделано:** отсутствует или сделан частично пункт плана, критерий готовности, шаг целевого алгоритма, таблица или поле, endpoint, тест, миграция, документация или эксплуатационный шаг; файл, который план называет изменяемым, не изменён.
|
|
6
|
+
- **Сделано не так:** поведение расходится с планом — другой порядок шагов алгоритма, пропущенная ветка «Если …» или ошибка, другие поля, типы и коды ответов.
|
|
7
|
+
- **Сделано лишнее:** поведение, механизм, зависимость или изменение вне плана и подтверждённых решений.
|
|
8
|
+
- **Решение нарушено:** реализация противоречит пункту `Принятых решений`.
|
|
9
|
+
- **Отчёт — не доказательство:** заявления исполнителя, комментарии и сообщения коммитов проверяй по коду; обоснование вроде «оставил так для простоты» не снижает серьёзность.
|
|
10
|
+
- **Дефект по плану:** если план сам предписал дефект — тест без проверок, дублирование логики, небезопасное решение, — это находка с пометкой «по плану»: решение за человеком.
|
|
11
|
+
|
|
12
|
+
## Не находка
|
|
13
|
+
|
|
14
|
+
- Отличие от буквы плана, если цель сохранена без дополнительного риска.
|
|
15
|
+
- Выполненные пункты: их не перечисляй.
|
|
16
|
+
- Общее архитектурное или стилевое ревью — отдельные проверки.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## Что проверять
|
|
2
|
+
|
|
3
|
+
Найди read-only средствами незакрытые комментарии и треды ревью выбранного PR/MR и сверь каждый с текущим кодом.
|
|
4
|
+
|
|
5
|
+
- **Всё ещё актуально:** проблема из замечания существует в текущем коде — находка со ссылкой на тред и подтверждением в коде.
|
|
6
|
+
- **Исправлено, но тред открыт:** код уже исправлен — не находка; перечисли такие треды отдельно от находок.
|
|
7
|
+
- **Невозможно проверить:** замечание не привязано к коду или требует недоступного контекста — не находка; упомяни в `summary`.
|
|
8
|
+
|
|
9
|
+
Не отправляй комментарии, не скрывай сводки, не resolve/close треды и не меняй удалённое состояние. Если сервис, авторизация или формат обсуждений недоступны, верни warning и не утверждай, что история проверена.
|