@rt-tools/agent-kit 0.8.2 → 0.8.3

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 (66) hide show
  1. package/README.md +1 -0
  2. package/assets/agents/rules-reviewer.md +83 -0
  3. package/assets/checks/check-dupes.mjs +66 -6
  4. package/assets/checks/check-specs.mjs +100 -15
  5. package/assets/checks/rt-kit-checks.config.mjs +9 -0
  6. package/assets/commands/feedback.md +95 -0
  7. package/assets/commands/rules-review.md +98 -0
  8. package/assets/commands/skill-curator.md +39 -22
  9. package/assets/docs/GLOSSARY.md +21 -20
  10. package/assets/hooks/reuse-first-guard.sh +16 -2
  11. package/assets/hooks/skill-gate.sh +1 -1
  12. package/assets/hooks/task-flow-guard.sh +16 -2
  13. package/assets/hooks/waiting-turn-guard.sh +87 -0
  14. package/assets/laws/delivery.md +28 -0
  15. package/assets/laws/project-documentation.md +18 -0
  16. package/assets/laws/work-conduct.md +16 -0
  17. package/assets/patterns/git-workflow-commit.azure.md +74 -2
  18. package/assets/patterns/git-workflow-commit.github.md +75 -2
  19. package/assets/patterns/git-workflow-commit.gitlab.md +75 -4
  20. package/assets/patterns/git-workflow-docker.md +30 -0
  21. package/assets/patterns/task-flow-close.md +154 -47
  22. package/assets/patterns/task-flow-handoff.md +1 -1
  23. package/assets/patterns/task-flow-resume.md +3 -3
  24. package/assets/patterns/task-flow-start.md +32 -5
  25. package/assets/rules/angular-patterns.md +22 -0
  26. package/assets/rules/api-layer.md +25 -0
  27. package/assets/rules/browser-verification.md +32 -0
  28. package/assets/rules/component-structure.md +21 -0
  29. package/assets/rules/dependencies.md +22 -0
  30. package/assets/rules/doc-style.md +24 -0
  31. package/assets/rules/entity-conventions.needs-admin.md +21 -0
  32. package/assets/rules/entity-models.md +21 -0
  33. package/assets/rules/git-workflow.azure.md +50 -1
  34. package/assets/rules/git-workflow.github.md +48 -2
  35. package/assets/rules/git-workflow.gitlab.md +49 -1
  36. package/assets/rules/lib-layers.md +25 -0
  37. package/assets/rules/lists.md +27 -0
  38. package/assets/rules/navigation.md +21 -0
  39. package/assets/rules/observability.needs-app.md +23 -0
  40. package/assets/rules/permissions.md +23 -0
  41. package/assets/rules/platform-access.md +21 -0
  42. package/assets/rules/reuse-first.md +20 -0
  43. package/assets/rules/seo.md +19 -0
  44. package/assets/rules/shared-code.md +19 -0
  45. package/assets/rules/spec-driven.md +32 -0
  46. package/assets/rules/styling-bem.md +19 -0
  47. package/assets/rules/task-flow.md +107 -17
  48. package/assets/rules/testing.md +31 -0
  49. package/assets/rules/translations.md +21 -0
  50. package/assets/rules/typescript-conventions.md +21 -0
  51. package/assets/samples/specs/_template/spec.md +83 -0
  52. package/assets/samples/tasks/_template/grill.md +28 -0
  53. package/assets/samples/tasks/_template/plan.md +39 -0
  54. package/assets/samples/tasks/_template/progress.md +23 -0
  55. package/assets/skills/agent-kit.md +16 -2
  56. package/assets/templates/rule.md +31 -2
  57. package/lib/commands.d.ts.map +1 -1
  58. package/lib/commands.js +1 -0
  59. package/lib/commands.js.map +1 -1
  60. package/lib/config.d.ts +10 -1
  61. package/lib/config.d.ts.map +1 -1
  62. package/lib/config.js +4 -0
  63. package/lib/config.js.map +1 -1
  64. package/package.json +1 -1
  65. package/rt-tools-agent-kit-0.8.3.tgz +0 -0
  66. package/rt-tools-agent-kit-0.8.2.tgz +0 -0
@@ -2,7 +2,7 @@
2
2
  name: git-workflow-commit
3
3
  kind: pattern
4
4
  rule: git-workflow
5
- description: Паттерн правила git-workflow. Брать на заведение задачи, ветки, коммит, пуш и создание PR — готовая команда заведения задачи со всеми четырьмя шагами, перевод задачи в колонку работы и в колонку разбора, слияние двух задач в одну, сверка очереди работ, работа от учётной записи бота, формат заголовка, строка связи с задачей, ревьювер, исполнитель и метки PR, чеклист проверок до публикации, обход требования документа. Не брать для миграций и перезапуска прода — это паттерны git-workflow-migration и git-workflow-restart.
5
+ description: Паттерн правила git-workflow. Брать на заведение задачи, ветки, коммит, пуш и создание PR — готовая команда заведения задачи со всеми четырьмя шагами, перевод задачи в колонку работы и в колонку разбора, слияние двух задач в одну, сверка очереди работ, работа от учётной записи бота, формат заголовка, строка связи с задачей, ревьювер, исполнитель и метки PR, образец тела PR с разделом об оставшемся шаге, чеклист проверок до публикации, обход требования документа. Не брать для миграций и перезапуска прода — это паттерны git-workflow-migration и git-workflow-restart.
6
6
  ---
7
7
 
8
8
  # Ветка, коммит и PR
@@ -191,6 +191,31 @@ PR [<КЛЮЧ>-212] Виджет переписки зовёт кит ег
191
191
  коммита, и там его сверяет `commitlint`. В списке PR он занимает место, ничего не добавляя:
192
192
  род правки и область уже видны метками.
193
193
 
194
+ ## Не готовое к слиянию открывается черновиком
195
+
196
+ Правка кода отдаётся человеку открытым PR: запушенная ветка ему не показывается нигде. Открытый
197
+ PR при этом читается как приглашение влить, поэтому у незаконченной работы он открывается
198
+ черновиком — кнопку слияния у черновика хостинг блокирует сам:
199
+
200
+ ```bash
201
+ GH_TOKEN="$TOKEN" gh pr create --draft --title '[<КЛЮЧ>-86] …' --body-file тело.md
202
+ ```
203
+
204
+ Черновиком идёт всё, что ждёт прогона конвейера, доработки или ответа на вопрос. Вопрос
205
+ задаётся в самом PR, а не остаётся в голове исполнителя: человек читает PR, а не переписку
206
+ захода.
207
+
208
+ Снимается черновик отдельным вызовом, и это тот самый ход, которым исполнитель говорит, что
209
+ решение готово:
210
+
211
+ ```bash
212
+ GH_TOKEN="$TOKEN" gh pr ready 86
213
+ ```
214
+
215
+ До снятия молчание исполнителя значит «ещё не готово», после — «можно вливать». Снятие
216
+ черновика и просьба влить идут одним ходом: снятый черновик, о котором человеку не сказали,
217
+ ждёт разбора ровно так же, как не снятый.
218
+
194
219
  ## PR прикрепляется к задаче
195
220
 
196
221
  Тело начинается со строки связи — по ней на борде заполняется поле «Linked pull requests».
@@ -239,6 +264,46 @@ $GH api -X PATCH "repos/$REPO/pulls/205" -f body="$(cat тело.md)"
239
264
  Тело перечитывается всякий раз, когда в ветку что-то влилось после публикации: PR
240
265
  утверждает про дерево, а дерево с тех пор изменилось.
241
266
 
267
+ ## Образец тела PR
268
+
269
+ Четыре раздела, и порядок между ними один: строка связи, что сделано, чем подтверждено,
270
+ оставшийся шаг. Раздел, которому нечего сказать, пишется словами — пустой заголовок и снятый
271
+ заголовок читаются одинаково, а значат разное.
272
+
273
+ ```markdown
274
+ Closes #86
275
+
276
+ ## Что сделано
277
+
278
+ - <правка, названная тем, что она меняет для читателя, а не тем, какие файлы задела>
279
+
280
+ ## Чем подтверждено
281
+
282
+ - <проверка>: <её вывод одной строкой>
283
+ - Не гонялось: <что в набор не вошло и почему>
284
+
285
+ ## Оставшийся шаг
286
+
287
+ После одобрения ветка получает ещё один коммит — разбор папки задачи, — и только потом
288
+ вливается. До этого коммита вливать рано: папка уедет в главную ветку неразобранной.
289
+ ```
290
+
291
+ Раздел «Оставшийся шаг» стоит последним и переписывается тем же вызовом, что и остальное тело,
292
+ — в тот ход, которым папка разбирается и снимается черновик:
293
+
294
+ ```markdown
295
+ ## Оставшийся шаг
296
+
297
+ Не осталось: папка задачи разобрана коммитом `<sha>`, черновик снят. Можно вливать.
298
+ ```
299
+
300
+ Стоит он там потому, что решение о слиянии принимается на этой странице, а не в переписке:
301
+ сказанное владельцу вслух живёт до следующей реплики, а тело лежит у самой кнопки. Одно другого
302
+ не отменяет — порядок обоих сообщений владельцу описывает паттерн закрытия работы.
303
+
304
+ Проверить тело машиной нечем: ни одна сверка его не читает, а хостинг спрашивает только про
305
+ заголовок. Держится образец тем, кто пишет тело, — как и слова вслух.
306
+
242
307
  ## Состояние PR читается, а не додумывается
243
308
 
244
309
  Вызовы, которыми ставятся ревьювер, метки и исполнитель, отвечают нулевым кодом и тогда, когда
@@ -303,7 +368,10 @@ npm run task:move -- 86 in-review
303
368
  `browser-verification-measure`.
304
369
  9. **Правка разметки публичного сайта проверена на прод-сборке по всем локалям перевода** — паттерн
305
370
  `seo-verify`.
306
- 10. **Тело PR начинается строкой `Closes #<номер>`**, а метки, ревьювер и исполнитель стоят.
371
+ 10. **Тело PR собрано по образцу** — начинается строкой `Closes #<номер>`, несёт разделы «Что
372
+ сделано», «Чем подтверждено» и «Оставшийся шаг», а метки, ревьювер и исполнитель стоят.
373
+ Раздел оставшегося шага к этому моменту говорит, что шагов не осталось: черновик снимается
374
+ после разбора папки, а не до него.
307
375
  11. **Заголовок PR несёт номер задачи и называет её сделанной:** `[<КЛЮЧ>-<номер>] <Что сделано>`,
308
376
  тем же номером, что стоит у задачи и в имени ветки. Инфинитив из задачи в него не
309
377
  переносится, тип и область коммита — тоже.
@@ -320,6 +388,11 @@ npm run task:move -- 86 in-review
320
388
  снимки витрин: с момента вливания их гоняет конвейер на её коде, и красное придёт на её
321
389
  PR.
322
390
 
391
+ Список этот — про снятие черновика, а не про его открытие. Черновиком PR открывается раньше:
392
+ пока работа идёт, человеку показывают то, что уже есть, вместе с тем, чего ещё нет. Пункты 1–15
393
+ проходятся перед `gh pr ready`, и невыполненный пункт означает, что черновик не снимается, — а
394
+ не то, что PR не открывается.
395
+
323
396
  Сразу после публикации задача переставляется в разбор — `npm run task:move -- <номер>
324
397
  in-review`, — и `npm run check:board` прогоняется ещё раз: до открытия PR колонку он не судит,
325
398
  а после открытия расхождение видит.
@@ -2,7 +2,7 @@
2
2
  name: git-workflow-commit
3
3
  kind: pattern
4
4
  rule: git-workflow
5
- description: Паттерн правила git-workflow для дерева на GitLab. Брать на заведение задачи, ветки, коммит, пуш и создание MR — заведение задачи со всеми шагами, перевод по спискам доски, слияние двух задач в одну, сверка очереди работ, работа от учётной записи машинной работы, формат заголовка, строка связи с задачей, ревьювер, исполнитель и метки MR, чеклист проверок до публикации, обход требования документа. Не брать для миграций и перезапуска прода — это паттерны git-workflow-migration и git-workflow-restart.
5
+ description: Паттерн правила git-workflow для дерева на GitLab. Брать на заведение задачи, ветки, коммит, пуш и создание MR — заведение задачи со всеми шагами, перевод по спискам доски, слияние двух задач в одну, сверка очереди работ, работа от учётной записи машинной работы, формат заголовка, строка связи с задачей, ревьювер, исполнитель и метки MR, образец описания MR с разделом об оставшемся шаге, чеклист проверок до публикации, обход требования документа. Не брать для миграций и перезапуска прода — это паттерны git-workflow-migration и git-workflow-restart.
6
6
  ---
7
7
 
8
8
  # Ветка, коммит и MR
@@ -175,6 +175,34 @@ MR [<КЛЮЧ>-86] Письмо владельцу с незаполнен
175
175
  коммита, и там его сверяет `commitlint`. В списке MR он занимает место, ничего не добавляя:
176
176
  род правки и область уже видны метками.
177
177
 
178
+ ## Не готовое к слиянию открывается черновиком
179
+
180
+ Правка кода отдаётся человеку открытым MR: запушенная ветка ему не показывается нигде. Открытый
181
+ MR при этом читается как приглашение влить, поэтому у незаконченной работы он открывается
182
+ черновиком — кнопку слияния у черновика хостинг блокирует сам:
183
+
184
+ ```bash
185
+ GITLAB_TOKEN="$TOKEN" glab mr create --draft --title '[<КЛЮЧ>-86] …' --description "$(cat тело.md)"
186
+ ```
187
+
188
+ Признак черновика здесь — приставка `Draft:` в заголовке MR, и правится он вместе с ним:
189
+ переписав заголовок вручную, черновик снимают, не заметив этого.
190
+
191
+ Черновиком идёт всё, что ждёт прогона конвейера, доработки или ответа на вопрос. Вопрос
192
+ задаётся в самом MR, а не остаётся в голове исполнителя: человек читает MR, а не переписку
193
+ захода.
194
+
195
+ Снимается черновик отдельным вызовом, и это тот самый ход, которым исполнитель говорит, что
196
+ решение готово:
197
+
198
+ ```bash
199
+ GITLAB_TOKEN="$TOKEN" glab mr update 86 --ready
200
+ ```
201
+
202
+ До снятия молчание исполнителя значит «ещё не готово», после — «можно вливать». Снятие
203
+ черновика и просьба влить идут одним ходом: снятый черновик, о котором человеку не сказали,
204
+ ждёт разбора ровно так же, как не снятый.
205
+
178
206
  ## MR прикрепляется к задаче
179
207
 
180
208
  Описание начинается со строки связи. Ревьювер, исполнитель и метки задаются той же командой, и
@@ -211,8 +239,48 @@ glab mr update 205 --description "$(cat тело.md)"
211
239
  ```
212
240
 
213
241
  Правка описания переписывает его целиком, поэтому строка `Closes #<номер>` пишется заново
214
- вместе с остальным текстом. Тело перечитывается всякий раз, когда в ветку что-то влилось после
215
- публикации: PR утверждает про дерево, а дерево с тех пор изменилось.
242
+ вместе с остальным текстом. Описание перечитывается всякий раз, когда в ветку что-то влилось
243
+ после публикации: MR утверждает про дерево, а дерево с тех пор изменилось.
244
+
245
+ ## Образец описания MR
246
+
247
+ Четыре раздела, и порядок между ними один: строка связи, что сделано, чем подтверждено,
248
+ оставшийся шаг. Раздел, которому нечего сказать, пишется словами — пустой заголовок и снятый
249
+ заголовок читаются одинаково, а значат разное.
250
+
251
+ ```markdown
252
+ Closes #86
253
+
254
+ ## Что сделано
255
+
256
+ - <правка, названная тем, что она меняет для читателя, а не тем, какие файлы задела>
257
+
258
+ ## Чем подтверждено
259
+
260
+ - <проверка>: <её вывод одной строкой>
261
+ - Не гонялось: <что в набор не вошло и почему>
262
+
263
+ ## Оставшийся шаг
264
+
265
+ После одобрения ветка получает ещё один коммит — разбор папки задачи, — и только потом
266
+ вливается. До этого коммита вливать рано: папка уедет в главную ветку неразобранной.
267
+ ```
268
+
269
+ Раздел «Оставшийся шаг» стоит последним и переписывается тем же вызовом, что и остальное
270
+ описание, — в тот ход, которым папка разбирается и снимается черновик:
271
+
272
+ ```markdown
273
+ ## Оставшийся шаг
274
+
275
+ Не осталось: папка задачи разобрана коммитом `<sha>`, черновик снят. Можно вливать.
276
+ ```
277
+
278
+ Стоит он там потому, что решение о слиянии принимается на этой странице, а не в переписке:
279
+ сказанное владельцу вслух живёт до следующей реплики, а описание лежит у самой кнопки. Одно
280
+ другого не отменяет — порядок обоих сообщений владельцу описывает паттерн закрытия работы.
281
+
282
+ Проверить описание машиной нечем: ни одна сверка его не читает, а хостинг спрашивает только про
283
+ заголовок. Держится образец тем, кто пишет описание, — как и слова вслух.
216
284
 
217
285
  ## Состояние MR читается, а не додумывается
218
286
 
@@ -264,7 +332,10 @@ npm run task:move -- 86 in-review
264
332
  `browser-verification-measure`.
265
333
  9. **Правка разметки публичного сайта проверена на прод-сборке по всем локалям перевода** —
266
334
  паттерн `seo-verify`.
267
- 10. **Описание MR начинается строкой `Closes #<номер>`**, а метки, ревьювер и исполнитель стоят.
335
+ 10. **Описание MR собрано по образцу** — начинается строкой `Closes #<номер>`, несёт разделы
336
+ «Что сделано», «Чем подтверждено» и «Оставшийся шаг», а метки, ревьювер и исполнитель
337
+ стоят. Раздел оставшегося шага к этому моменту говорит, что шагов не осталось: черновик
338
+ снимается после разбора папки, а не до него.
268
339
  11. **Заголовок MR несёт номер задачи и называет её сделанной:** `[<КЛЮЧ>-<номер>] <Что
269
340
  сделано>`, тем же номером, что стоит у задачи и в имени ветки.
270
341
  12. **Очередь работ сходится** — `npm run check:board`.
@@ -63,6 +63,36 @@ docker run --rm alpine:3 df -h / # сколько осталось у са
63
63
  отвечает про ненакатываемую цепочку, гейт пуша краснеет целиком. По этим признакам чинят
64
64
  репозиторий, а причина в машине, — поэтому первое при любом из них `docker system df`.
65
65
 
66
+ Диск хоста при этом остаётся свободным и говорит «места полно»: сквозной набор упал на
67
+ `could not extend file … No space left on device`, когда на хосте было свободно 98 ГБ. Место
68
+ меряется у докера, а не у машины.
69
+
70
+ ## Мусор снимается отбором, и чужое из него исключается по метке
71
+
72
+ Тома переживают свои контейнеры и накапливаются молча: `docker ps` их не показывает, а
73
+ `docker system df` считает одной строкой. Копятся они по-разному — контейнер без `--rm`
74
+ оставляет том всегда, а `docker run --rm` анонимный том снимает вместе с контейнером сам, и
75
+ докручивать к нему `-v` не надо: у `docker run` этот флаг означает монтирование и без значения
76
+ команду ломает. Снимает тома `-v` у `docker rm`, а не у `docker run`.
77
+
78
+ Признак своего — отсутствие метки состава: том, заведённый чьим-то `docker compose`, несёт
79
+ `com.docker.compose.project` и принадлежит тому проекту, в том числе чужому.
80
+
81
+ ```bash
82
+ docker volume ls -q -f dangling=true | wc -l # сколько накопилось неиспользуемых
83
+ for v in $(docker volume ls -q -f dangling=true); do
84
+ [ -z "$(docker volume inspect "$v" --format '{{index .Labels "com.docker.compose.project"}}')" ] \
85
+ && docker volume rm "$v"
86
+ done
87
+ docker builder prune --force --filter until=24h # вчерашний кэш ничей, свежий нужен сборке
88
+ ```
89
+
90
+ Порог у кэша, а не полная чистка: снятый целиком, он заставляет следующую сборку идти с нуля.
91
+
92
+ Прогон конвейера, живущий на машине владельца, убирает за собой сам и делает это шагом,
93
+ который идёт и при падении: место кончается ровно тогда, когда прогон падает, и уборка,
94
+ пропущенная на падении, не случается в тот единственный раз, когда она была нужна.
95
+
66
96
  Освобождают отбором, а не общей чисткой: у сценария чистки образов сперва спрашивают, что он
67
97
  снял бы, и только потом дают снимать.
68
98
 
@@ -12,10 +12,91 @@ description: Паттерн правила task-flow. Брать при закр
12
12
 
13
13
  ## Когда брать
14
14
 
15
- - Этапы замысла закрыты, проверки зелёные, PR готовится к публикации.
15
+ - Этапы замысла закрыты, проверки зелёные, с PR снимается черновик.
16
16
  - `npm run check:specs` перечислил договорённость в разделе «Пора вливать».
17
17
 
18
- ## 9. Договорённость вливается в спек домена
18
+ Само открытие PR сюда не относится: он открывается черновиком тем ходом, которым правка
19
+ кода отдаётся владельцу, — то есть до этого паттерна и, как правило, задолго до него. Здесь
20
+ работа доводится до готовности и черновик снимается.
21
+
22
+ ## 10. Работа отдаётся на разбор
23
+
24
+ PR открыт черновиком — и с этой минуты работа ждёт владельца, а не машину. Заход на этом не
25
+ кончается: следующая задача эпика берётся тем же движением, паттерн `task-flow-resume`.
26
+
27
+ **Заход, открывший PR, называет оставшийся шаг в двух местах — разделом в теле PR и словами
28
+ владельцу:** после одобрения ветка получает ещё один коммит — разбор папки, — и только потом
29
+ вливается. Порядок этот записан здесь, а читает его исполнитель; вливает же владелец, и
30
+ молчание он читает как «работа кончена» — видит зелёный PR и мержит его тем же ходом. Промах
31
+ случается ровно в шов между двумя ходами, и стоит он отдельной задачи: после слияния папку
32
+ разбирать уже некому.
33
+
34
+ ### Два сообщения владельцу, и между ними — прогон
35
+
36
+ Оба обязательны, и порядок между ними один. Ни одно не заменяется другим: первое говорит, что
37
+ работа отдана и чего она ждёт, второе — что она готова.
38
+
39
+ Сразу после открытия PR:
40
+
41
+ ```
42
+ PR #<номер> открыт черновиком. Жду прогона: пока он идёт, о работе известно только то, что
43
+ она запушена. Как закончится — разберу папку задачи последним коммитом, сниму черновик и
44
+ попрошу тебя влить. Пока жду, беру задачу #<номер следующей>.
45
+ ```
46
+
47
+ Прогон зелёный, папка разобрана и запушена, черновик снят:
48
+
49
+ ```
50
+ PR #<номер> готов к слиянию: прогон зелёный, папка задачи разобрана, за работой убрано,
51
+ черновик снят. Влей его, пожалуйста.
52
+ ```
53
+
54
+ Черновик снимается перед вторым сообщением, а не после него: владелец, прочитав просьбу
55
+ влить, идёт нажимать кнопку — у черновика она заблокирована, и ход возвращается к исполнителю
56
+ ни за чем.
57
+
58
+ Прогон красный — сообщение то же по форме, но говорит о красном и о том, что с ним делается;
59
+ просьбы влить в нём нет. Просьба звучит один раз и только тогда, когда работа готова целиком:
60
+ сказанная заранее, она перестаёт что-либо значить, и владелец возвращается к прежнему —
61
+ вливать по зелёной странице.
62
+
63
+ Между двумя сообщениями исполнитель не ждёт: работа отдана на разбор, и тем же движением
64
+ берётся следующая задача. Возвращается он к PR тем ходом, которым читает конец прогона.
65
+
66
+ ### Оставшийся шаг стоит разделом в теле PR
67
+
68
+ Сказанного вслух мало, и одним этим требование не держится. Реплика живёт до следующей реплики,
69
+ а решение о слиянии принимается на странице PR — там переписки нет вовсе. Поэтому оставшийся
70
+ шаг пишется дважды: разделом в теле PR и словами владельцу. Одно другого не заменяет — тело
71
+ пишется один раз и лежит у самой кнопки, разговор идёт дальше и уносит сказанное с собой.
72
+
73
+ Раздел стоит последним и говорит ровно одно — что случится с веткой после одобрения:
74
+
75
+ ```markdown
76
+ ## Оставшийся шаг
77
+
78
+ После одобрения ветка получает ещё один коммит — разбор папки задачи, — и только потом
79
+ вливается. До этого коммита вливать рано: папка уедет в главную ветку неразобранной.
80
+ ```
81
+
82
+ Разобрана папка — раздел переписывается тем же вызовом, которым правится тело:
83
+
84
+ ```markdown
85
+ ## Оставшийся шаг
86
+
87
+ Не осталось: папка задачи разобрана коммитом `<sha>`, черновик снят. Можно вливать.
88
+ ```
89
+
90
+ Пустым раздел не оставляется и не удаляется вовсе: отсутствие раздела и «шагов не осталось»
91
+ читаются одинаково, а значат разное. Образец тела PR целиком — в паттерне заведения коммита
92
+ и PR, если дерево его разложило.
93
+
94
+ Проверить это машиной нечем, и проверки не будет: тело PR не читает ни одна сверка, а хостинг
95
+ не спрашивает ни о чём, кроме заголовка. Требование держится тем же, чем и слова вслух, — тем,
96
+ кто пишет тело. Разница между ними одна, и она вся: реплику владелец прочитает, только если
97
+ вернётся в переписку, а раздел он видит там, куда смотрит, нажимая кнопку.
98
+
99
+ ## 12. Договорённость вливается в спек домена
19
100
 
20
101
  Последним коммитом PR, до слияния. Код к этому моменту написан, поэтому привязки
21
102
  `файл:символ` известны — правило въезжает в спек домена сразу проверяемым.
@@ -38,13 +119,13 @@ npm run check:specs # раздел «Пора вливать» называе
38
119
  таблице `docs/specs/README.md`.
39
120
 
40
121
  Работа шла несколькими задачами — вливание идёт в последней из них. Какая последняя, видно в
41
- `docs/plans/<линия>.md`; закрытая линия уезжает в `docs/archive/` или удаляется.
122
+ замысле эпика; закрытый эпик уезжает в описание прошлого или удаляется.
42
123
 
43
124
  ```bash
44
125
  npm run check:specs # после вливания: привязки на месте, сценарии не потерялись
45
126
  ```
46
127
 
47
- ## 10. Тексты домена приводятся к сделанному
128
+ ## 13. Тексты домена приводятся к сделанному
48
129
 
49
130
  В спек уезжает только то, что записали до кода. Остальные тексты — правила, паттерны, законы
50
131
  приложения — после правки никто не перечитывает, и они продолжают описывать старое дерево.
@@ -85,41 +166,7 @@ grep -rn -A3 "Чего из закона здесь нет" <каталог пр
85
166
  Что сделали на этом шаге, пишется в тело PR: что перечитали, что изменили, а если ничего
86
167
  не изменили — почему. Форма раздела — паттерн `git-workflow-commit`.
87
168
 
88
- ## 11. Папка задачи разбирается
89
-
90
- **Заход, открывший PR, называет владельцу оставшийся шаг вслух:** после одобрения ветка
91
- получает ещё один коммит — разбор папки, — и только потом вливается. Порядок этот записан
92
- здесь, а читает его исполнитель; вливает же владелец, и молчание он читает как «работа
93
- кончена» — видит зелёный PR и мержит его тем же ходом. Промах случается ровно в шов между
94
- двумя ходами, и стоит он отдельной задачи: после слияния папку разбирать уже некому.
95
-
96
- ### Два сообщения владельцу, и между ними — прогон
97
-
98
- Оба обязательны, и порядок между ними один. Ни одно не заменяется другим: первое говорит, что
99
- работа отдана и чего она ждёт, второе — что она готова.
100
-
101
- Сразу после открытия PR:
102
-
103
- ```
104
- PR #<номер> открыт. Жду прогона: пока он идёт, о работе известно только то, что она
105
- запушена. Как закончится — разберу папку задачи последним коммитом и попрошу тебя влить.
106
- Пока жду, беру задачу #<номер следующей>.
107
- ```
108
-
109
- Прогон зелёный, папка разобрана и запушена:
110
-
111
- ```
112
- PR #<номер> готов к слиянию: прогон зелёный, папка задачи разобрана, за работой убрано.
113
- Влей его, пожалуйста.
114
- ```
115
-
116
- Прогон красный — сообщение то же по форме, но говорит о красном и о том, что с ним делается;
117
- просьбы влить в нём нет. Просьба звучит один раз и только тогда, когда работа готова целиком:
118
- сказанная заранее, она перестаёт что-либо значить, и владелец возвращается к прежнему —
119
- вливать по зелёной странице.
120
-
121
- Между двумя сообщениями исполнитель не ждёт: работа отдана на разбор, и тем же движением
122
- берётся следующая задача. Возвращается он к PR тем ходом, которым читает конец прогона.
169
+ ## 14. Папка задачи разбирается
123
170
 
124
171
  Разбор идёт по трём исходам, а не по двум.
125
172
 
@@ -142,11 +189,12 @@ PR #<номер> готов к слиянию: прогон зелёный, па
142
189
  кто-то читает, а не свалка ходов работы. Таблица ниже говорит о том, что осталось после
143
190
  первого отбора.
144
191
 
145
- | Файл | Куда |
146
- | ------------- | ------------------------------------------------------------------------------------------------------------------ |
147
- | `grill.md` | в `docs/archive/` — ответы владельца невосстановимы, и это единственная запись о том, почему задача поставлена так |
148
- | `progress.md` | в `docs/archive/`, если в нём есть решения по ходу с причинами; иначе удаляется |
149
- | `plan.md` | удаляется — после выкатки на его вопрос отвечает код, а на «как работает» отвечает спек домена |
192
+ | Файл | Куда |
193
+ | --------------- | ------------------------------------------------------------------------------------------------------------------ |
194
+ | `grill.md` | в `docs/archive/` — ответы владельца невосстановимы, и это единственная запись о том, почему задача поставлена так |
195
+ | `progress.md` | в `docs/archive/`, если в нём есть решения по ходу с причинами; иначе удаляется |
196
+ | `plan.md` | удаляется — после выкатки на его вопрос отвечает код, а на «как работает» отвечает спек домена |
197
+ | находки разбора | переезжают к замыслу эпика — их читает владелец, когда эпик кончится; работа вне эпика показывает их сразу |
150
198
 
151
199
  Уезжающее складывается одним файлом с говорящим именем, а не папкой из трёх:
152
200
 
@@ -175,7 +223,7 @@ rm -r docs/tasks/<своя>
175
223
  Две записи в архиве, а не одна: работы разные, и решения в них разные. Сверка очереди работ
176
224
  после этого не называет ни одной папки — этим и проверяется, что разобраны обе.
177
225
 
178
- ## 12. Сверка
226
+ ## 15. Сверка
179
227
 
180
228
  ```bash
181
229
  npm run check:board # папка закрытой задачи среди текущих, брошенные черновики
@@ -183,6 +231,65 @@ npm run check:specs # договорённость влита, привязк
183
231
  npm run check:docs # пути, названные в текстах, существуют
184
232
  ```
185
233
 
234
+ ## 16. Работа разбирается правилами — фоном, следом за PR
235
+
236
+ Шаг о слое правил, а не о продукте: что за эту работу грузилось, что помогло, чего не хватило и
237
+ где текст правила разошёлся с деревом. Знает это только тот заход, который работу вёл, — через
238
+ сутки не знает никто.
239
+
240
+ Ведёт разбор роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт его
241
+ само, теми же вопросами. Файлов роль не правит — приносит готовые формулировки, а вставлять их
242
+ решает владелец.
243
+
244
+ **Запускается разбор в фоне, сразу за открытием PR, и ход на нём не кончается.** Роль ничего не
245
+ спрашивает, пока работает, и быстрее от ожидания не идёт: следующая задача берётся тем же ходом,
246
+ которым запущен разбор.
247
+
248
+ Порядок один и переставлять его нельзя:
249
+
250
+ 1. **Сводка собирается до запуска** — пока задача ещё в голове. Что делали, что пошло не так,
251
+ что грузилось и что каждое правило дало, на какие грабли окружения наткнулись. Собранная
252
+ через две задачи, она пересказывает историю ветки вместо того, что было на самом деле.
253
+ 2. **Роль уходит в фон** — инструментом запуска роли, с путём к списку загруженного и сводкой
254
+ целиком. Ход продолжается следующей задачей.
255
+ 3. **Вернувшиеся находки принимают одним ходом** — записать и вернуться к прежнему. Разбор,
256
+ отложенный «до удобного момента», не случается вовсе: заход кончается раньше.
257
+
258
+ ## 17. Находки разбора ложатся в папку задачи и ждут владельца
259
+
260
+ Ответ роли живёт в переписке и умирает вместе с ней, поэтому он сразу ложится на диск — в папку
261
+ задачи, файлом рядом с ходом работы. Пишет его исполнитель: роль файлов не пишет.
262
+
263
+ Папка задачи умирает со слиянием, а находки должны пережить весь эпик — владелец читает их
264
+ разом, когда эпик кончился. Поэтому при разборе папки (шаг 14) файл находок не удаляется вместе
265
+ с остальным, а **переезжает к замыслу эпика**: там его найдут и после того, как ветка въехала.
266
+ Работа вне эпика показывает находки владельцу сразу, тем же ходом.
267
+
268
+ **Наружу без слова владельца уезжает только сводка наблюдений.** Она говорит, чем пользовались
269
+ и чем не пользовались ни разу, — это факт, и мнением он не станет. Предложение — другое дело:
270
+ это заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении. Уехавшая
271
+ без разбора, она становится работой того, кто её не заказывал.
272
+
273
+ Порядок такой: находки копятся у замысла эпика → эпик кончился → владелец читает их разом и
274
+ говорит, что из них верно → названное им оформляется предложением и уезжает. Чем отправляют —
275
+ скил слоя правил, если дерево его разложило.
276
+
277
+ У каждой находки называется адрес, и адресов три:
278
+
279
+ | Куда | Что туда идёт |
280
+ | -------------------------- | ------------------------------------------------------------------------ |
281
+ | слой правил — предложением | то, что верно любому дереву этого класса: статья, пункт правила, паттерн |
282
+ | имена этого дерева | то, что верно здесь: компаньон правила, профиль, карта гейта |
283
+ | надстройка над разложенным | то, что здесь звучит иначе, чем в пакете |
284
+
285
+ Без адреса правка ложится туда, где её видит автор, — то есть в своё дерево, — и общее оседает
286
+ в одном месте, оставаясь неизвестным всем остальным.
287
+
288
+ **Разбор без правки закрытым не считается.** Из него выходит либо правка слоя правил, либо
289
+ предложение наружу; не вышло ни того ни другого — это жалоба, и она повторится. Предложение, о
290
+ котором владелец сказал вслух, уходит наружу в тот же ход: написанное и не отправленное лежит в
291
+ дереве неотличимо от отправленного.
292
+
186
293
  ## Ловушки
187
294
 
188
295
  - **Папку разбирают до слияния — потом о ней уже никто не вспомнит.** Сверка очереди считает
@@ -235,9 +342,9 @@ npm run check:docs # пути, названные в текстах, суще
235
342
  - **Правило без привязки в спек домена не въезжает.** Кода, который его исполняет, нет —
236
343
  значит это намерение, и место ему в открытых вопросах домена, а не в правилах.
237
344
  - **Замысел эпика правят только там, где вписывают «чем кончился».** Границы эпика и
238
- порядок задач в ней при этом остаются прежними, а работа их уже нарушила: задача, решившая
345
+ порядок задач в нём при этом остаются прежними, а работа их уже нарушила: задача, решившая
239
346
  читать спеки, оставила над собой границу «спеки — вторая очередь», и следующий исполнитель
240
- прочитает её как действующую. Границы линии перечитываются целиком тем же заходом, что и
347
+ прочитает её как действующую. Границы эпика перечитываются целиком тем же заходом, что и
241
348
  итог работы.
242
349
  - **Архив не обновляется после выкатки.** Уехавшее туда описывает день переезда, и правится
243
350
  оно только вместе с признанием, что описывало неверно.
@@ -41,7 +41,7 @@ description: Паттерн правила task-flow. Брать, когда з
41
41
  Незакрытый этап — тоже законная точка, если в ходе работы записано, что именно из него сделано и
42
42
  чем это подтверждено. Незаконная точка одна: правка, о которой не записано ничего.
43
43
 
44
- ## 8. Заход закрывается передачей
44
+ ## 9. Заход закрывается передачей
45
45
 
46
46
  Уборку этого шага — главную ветку, влитые ветки и запись самой передачи — делает команда
47
47
  `next-session`: она проходит его целиком и называет путь к передаче последней строкой. Ниже —
@@ -34,7 +34,7 @@ description: Паттерн правила task-flow. Брать при возв
34
34
  ней проверяется деревом — сборкой, тестами, чтением файла, — а не вопросом.
35
35
  - **Не править замысел.** С ним сверяют результат; пересмотр идёт записью в ходе работы.
36
36
 
37
- ## 6. Возвращение к работе новым заходом
37
+ ## 7. Возвращение к работе новым заходом
38
38
 
39
39
  Сверить «Где стоим» с деревом. Запись описывает день, когда её сделали:
40
40
 
@@ -46,7 +46,7 @@ git log --oneline origin/main..HEAD
46
46
  Разошлось — «Где стоим» правится сразу, до работы: следующий заход поверит записи, а не
47
47
  дереву.
48
48
 
49
- ## 7. Этап делается и отмечается в ходе работы
49
+ ## 8. Этап делается и отмечается в ходе работы
50
50
 
51
51
  Раздел «Где стоим» **перезаписывается**, а не дописывается — это первое, что читает следующий
52
52
  заход, и единственное, что переживает обрезку по объёму:
@@ -94,7 +94,7 @@ git log --oneline origin/main..HEAD
94
94
  - Доэтапное, не этой работы: сверка очереди перечисляет шесть закрытых задач вне борды.
95
95
  ```
96
96
 
97
- ## 13. Следующая задача эпика берётся тем же движением
97
+ ## 11. Следующая задача эпика берётся тем же движением
98
98
 
99
99
  Задача закрыта, PR открыт и ждёт владельца — заход на этом не кончается. Отданное на разбор
100
100
  ждёт человека, а не машину: пока эпик не кончился, следующая его задача берётся сразу, тем же
@@ -107,7 +107,34 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
107
107
  «не входит». Находка критика, расходящаяся с ответом владельца, относится владельцу — она не
108
108
  исполняется молча и не считается закрытой правкой текста.
109
109
 
110
- ### 4. Задача, ветка, папка
110
+ ### 4. Серия задач объявляется эпиком
111
+
112
+ Разбор кончился одной задачей — шаг пропускается. Вышло несколько, и порядок между ними
113
+ значим — эпик объявляется здесь, до первой из них, и дважды: карточкой в очереди работ с меткой
114
+ эпика и замыслом эпика рядом с ней.
115
+
116
+ Замысел эпика называет три вещи, и ни одна не выводится из остальных:
117
+
118
+ ```markdown
119
+ # <Возможность, которая разрабатывается>
120
+
121
+ Одной фразой: что у владельца появится, когда эпик кончится.
122
+
123
+ | № | Задача | Почему здесь |
124
+ | --- | ------------ | ------------------------ |
125
+ | 1 | <что делает> | <на чём стоят следующие> |
126
+ | 2 | <что делает> | <что из первой ей нужно> |
127
+ ```
128
+
129
+ Состав без порядка порядком не является: две задачи, у которых он держался пониманием, ушли в
130
+ работу наоборот, и вторая переделывалась под первую. Назначенный здесь порядок держится до конца
131
+ эпика; пересмотр — решение владельца, и записывается он в ход работы той задачи, которая его
132
+ вызвала.
133
+
134
+ Лежит замысел вне папки задачи: та умирает с мержем первой же задачи. Каталог для него называет
135
+ компаньон правила — у пакета своего пути нет.
136
+
137
+ ### 5. Задача, ветка, папка
111
138
 
112
139
  ```bash
113
140
  npm run task:new -- --title '<Что не так>' --slug <slug> --label documentation --label area:tooling < тело.md
@@ -135,7 +162,7 @@ cp docs/tasks/_template/plan.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/plan.m
135
162
  cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/progress.md
136
163
  ```
137
164
 
138
- ### 5. Шапка замысла
165
+ ### 6. Шапка замысла
139
166
 
140
167
  Её читает гард:
141
168
 
@@ -159,9 +186,9 @@ cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/pr
159
186
  заведённая заранее задача после разбивки закрывается и остаётся мусором в очереди работ.
160
187
  - **Разбор пишется на диск сразу, а не копится в переписке.** Сессия обрывается, и разбор,
161
188
  прожитый в разговоре, восстанавливается только пересказом владельца.
162
- - **Из одного разбора вышло несколько задач — общее уезжает в `docs/plans/<линия>.md`.**
163
- Папка задачи умирает с мержем, а порядок задач и зависимости между ними должны его
164
- пережить.
189
+ - **Из одного разбора вышло несколько задач — общее уезжает в замысел эпика.** Папка задачи
190
+ умирает с мержем, а порядок задач и зависимости между ними должны его пережить. Каталог для
191
+ замысла называет компаньон правила.
165
192
  - **Задача заводится командой, а не четырьмя вызовами подряд.** Борда к репозиторию не
166
193
  привязана, и задача попадает на неё только явным добавлением.
167
194
  - **Slug ветки берётся из терминологии договорённости, а не из слов просьбы.** Договорённость