@rt-tools/agent-kit 0.8.1 → 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 (129) hide show
  1. package/README.md +25 -19
  2. package/assets/agents/qa-engineer.md +1 -1
  3. package/assets/agents/rules-reviewer.md +83 -0
  4. package/assets/checks/board.github.mjs +56 -17
  5. package/assets/checks/check-board.github.mjs +49 -5
  6. package/assets/checks/check-dupes.mjs +66 -6
  7. package/assets/checks/check-specs.mjs +100 -15
  8. package/assets/checks/rt-kit-checks.config.mjs +9 -0
  9. package/assets/checks/task-new.github.mjs +33 -5
  10. package/assets/commands/agent-kit-digest.md +10 -5
  11. package/assets/commands/feedback.md +95 -0
  12. package/assets/commands/next-session.md +4 -4
  13. package/assets/commands/rules-review.md +98 -0
  14. package/assets/commands/skill-curator.md +44 -25
  15. package/assets/defaults/gate-map.sh +11 -4
  16. package/assets/defaults/project.sh +46 -0
  17. package/assets/docs/GLOSSARY.md +49 -46
  18. package/assets/hooks/docs-guard.sh +19 -3
  19. package/assets/hooks/git-guard-delivery.sh +106 -13
  20. package/assets/hooks/proposal-guard.sh +93 -0
  21. package/assets/hooks/reuse-first-guard.sh +83 -15
  22. package/assets/hooks/skill-gate-layers.sh +1 -1
  23. package/assets/hooks/skill-gate.sh +27 -1
  24. package/assets/hooks/task-flow-guard.sh +59 -19
  25. package/assets/hooks/waiting-turn-guard.sh +87 -0
  26. package/assets/hooks/window-fill-guard.sh +1 -1
  27. package/assets/laws/delivery.md +41 -7
  28. package/assets/laws/project-documentation.md +39 -0
  29. package/assets/laws/verifiability.md +6 -1
  30. package/assets/laws/work-conduct.md +83 -3
  31. package/assets/patterns/git-workflow-commit.azure.md +84 -4
  32. package/assets/patterns/git-workflow-commit.github.md +90 -4
  33. package/assets/patterns/git-workflow-commit.gitlab.md +84 -5
  34. package/assets/patterns/git-workflow-docker.md +30 -0
  35. package/assets/patterns/git-workflow-merge.md +1 -1
  36. package/assets/patterns/spec-driven-domain.md +7 -1
  37. package/assets/patterns/spec-driven-rule.md +6 -0
  38. package/assets/patterns/task-flow-close.md +197 -21
  39. package/assets/patterns/task-flow-handoff.md +28 -5
  40. package/assets/patterns/task-flow-resume.md +25 -7
  41. package/assets/patterns/task-flow-start.md +37 -6
  42. package/assets/rules/angular-patterns.md +22 -0
  43. package/assets/rules/api-layer.md +25 -0
  44. package/assets/rules/browser-verification.md +42 -1
  45. package/assets/rules/component-structure.md +21 -0
  46. package/assets/rules/dependencies.md +22 -0
  47. package/assets/rules/doc-style.md +37 -5
  48. package/assets/rules/{entity-conventions.md → entity-conventions.needs-admin.md} +21 -0
  49. package/assets/rules/entity-models.md +21 -0
  50. package/assets/rules/git-workflow.azure.md +62 -8
  51. package/assets/rules/git-workflow.github.md +78 -14
  52. package/assets/rules/git-workflow.gitlab.md +61 -8
  53. package/assets/rules/lib-layers.md +25 -0
  54. package/assets/rules/lists.md +27 -0
  55. package/assets/rules/navigation.md +21 -0
  56. package/assets/rules/{observability.md → observability.needs-app.md} +23 -0
  57. package/assets/rules/permissions.md +23 -0
  58. package/assets/rules/platform-access.md +21 -0
  59. package/assets/rules/reuse-first.md +20 -0
  60. package/assets/rules/seo.md +19 -0
  61. package/assets/rules/shared-code.md +19 -0
  62. package/assets/rules/spec-driven.md +36 -0
  63. package/assets/rules/styling-bem.md +19 -0
  64. package/assets/rules/task-flow.md +150 -35
  65. package/assets/rules/testing.md +50 -0
  66. package/assets/rules/translations.md +21 -0
  67. package/assets/rules/typescript-conventions.md +33 -0
  68. package/assets/samples/specs/_template/spec.md +83 -0
  69. package/assets/samples/tasks/_template/grill.md +28 -0
  70. package/assets/samples/tasks/_template/plan.md +39 -0
  71. package/assets/samples/tasks/_template/progress.md +23 -0
  72. package/assets/skills/agent-kit-extend.md +24 -0
  73. package/assets/skills/agent-kit.md +69 -7
  74. package/assets/templates/rule.md +31 -2
  75. package/assets/traits.json +14 -0
  76. package/bin/agent-kit.d.ts.map +1 -1
  77. package/bin/agent-kit.js +31 -16
  78. package/bin/agent-kit.js.map +1 -1
  79. package/index.d.ts +1 -0
  80. package/index.d.ts.map +1 -1
  81. package/index.js +1 -0
  82. package/index.js.map +1 -1
  83. package/lib/argv.d.ts +17 -0
  84. package/lib/argv.d.ts.map +1 -0
  85. package/lib/argv.js +44 -0
  86. package/lib/argv.js.map +1 -0
  87. package/lib/cargo.d.ts +88 -0
  88. package/lib/cargo.d.ts.map +1 -0
  89. package/lib/cargo.js +16 -0
  90. package/lib/cargo.js.map +1 -0
  91. package/lib/catalog.d.ts +18 -1
  92. package/lib/catalog.d.ts.map +1 -1
  93. package/lib/catalog.js +12 -2
  94. package/lib/catalog.js.map +1 -1
  95. package/lib/commands.d.ts +0 -26
  96. package/lib/commands.d.ts.map +1 -1
  97. package/lib/commands.js +79 -122
  98. package/lib/commands.js.map +1 -1
  99. package/lib/companion.d.ts +37 -0
  100. package/lib/companion.d.ts.map +1 -1
  101. package/lib/companion.js +42 -1
  102. package/lib/companion.js.map +1 -1
  103. package/lib/config.d.ts +38 -1
  104. package/lib/config.d.ts.map +1 -1
  105. package/lib/config.js +24 -0
  106. package/lib/config.js.map +1 -1
  107. package/lib/ship.d.ts +39 -0
  108. package/lib/ship.d.ts.map +1 -0
  109. package/lib/ship.js +87 -0
  110. package/lib/ship.js.map +1 -0
  111. package/lib/shipment.d.ts +60 -0
  112. package/lib/shipment.d.ts.map +1 -0
  113. package/lib/shipment.js +247 -0
  114. package/lib/shipment.js.map +1 -0
  115. package/lib/snapshot.d.ts +30 -0
  116. package/lib/snapshot.d.ts.map +1 -0
  117. package/lib/snapshot.js +73 -0
  118. package/lib/snapshot.js.map +1 -0
  119. package/lib/traits.d.ts +32 -0
  120. package/lib/traits.d.ts.map +1 -0
  121. package/lib/traits.js +82 -0
  122. package/lib/traits.js.map +1 -0
  123. package/package.json +6 -2
  124. package/rt-tools-agent-kit-0.8.3.tgz +0 -0
  125. package/lib/submit.d.ts +0 -24
  126. package/lib/submit.d.ts.map +0 -1
  127. package/lib/submit.js +0 -26
  128. package/lib/submit.js.map +0 -1
  129. package/rt-tools-agent-kit-0.8.1.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
@@ -46,6 +46,15 @@ gh project item-add <номер борды> --owner <владелец> --url <а
46
46
 
47
47
  Последний шаг и есть тот, который забывается: без него задача заведена, но её нет в очереди.
48
48
 
49
+ Заведение кончается не выводом команды, а ответом очереди работ. Команда спрашивает её сама и
50
+ печатает прочитанное — присутствие на борде, колонку, исполнителя; отсутствие кончает её
51
+ ненулевым кодом. В комментарий, в тело PR и в замысел идёт этот ответ, а не напечатанный
52
+ номер: номер говорит «вызов прошёл», а не «задача видна тому, кто по ней работает».
53
+
54
+ Заведения, идущие подряд, проверяются не по последнему, а сверкой очереди целиком: промах у них
55
+ общий, и по одной задаче он не виден. Шестнадцать задач подряд напечатали номер, и ни одна не
56
+ попала в очередь так, чтобы её увидел владелец.
57
+
49
58
  Название тикета говорит, что не так, а не что сделать: PR потом переводит его в сделанное.
50
59
  Номер в заголовок руками не пишется — он известен только после создания, и команда дописывает
51
60
  его сама.
@@ -182,6 +191,31 @@ PR [<КЛЮЧ>-212] Виджет переписки зовёт кит ег
182
191
  коммита, и там его сверяет `commitlint`. В списке PR он занимает место, ничего не добавляя:
183
192
  род правки и область уже видны метками.
184
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
+
185
219
  ## PR прикрепляется к задаче
186
220
 
187
221
  Тело начинается со строки связи — по ней на борде заполняется поле «Linked pull requests».
@@ -227,9 +261,49 @@ $GH api -X POST "repos/$REPO/pulls/205/requested_reviewers" -f 'reviewers[]=<в
227
261
  $GH api -X PATCH "repos/$REPO/pulls/205" -f body="$(cat тело.md)"
228
262
  ```
229
263
 
230
- Тело перечитывается всякий раз, когда в ветку что-то влилось после публикации: отчёт
264
+ Тело перечитывается всякий раз, когда в ветку что-то влилось после публикации: PR
231
265
  утверждает про дерево, а дерево с тех пор изменилось.
232
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
+
233
307
  ## Состояние PR читается, а не додумывается
234
308
 
235
309
  Вызовы, которыми ставятся ревьювер, метки и исполнитель, отвечают нулевым кодом и тогда, когда
@@ -270,6 +344,10 @@ npm run task:move -- 86 in-review
270
344
  гоняет ничего. Линтеры, юниты и сценарии хуков снимает гейт пуша — ниже то, чего он не знает.
271
345
 
272
346
  1. **Главная ветка влита в эту ветку** — `git fetch origin && git merge origin/main`.
347
+ Свежесть основания между ветками одного захода не наследуется: вторая и третья ветка
348
+ отводятся после своего `fetch`, а не от ссылки, подтянутой под первую. Пока идёт работа,
349
+ главная уходит вперёд — чаще всего собственным PR того же исполнителя, влитым час
350
+ назад.
273
351
  Всё, что проверяется ниже, проверяется от этого основания: PR с разошедшейся ветки
274
352
  показывает ревьюверу правку вперемешку с чужой. Порядок и разбор конфликта — паттерн
275
353
  `git-workflow-merge`.
@@ -290,7 +368,10 @@ npm run task:move -- 86 in-review
290
368
  `browser-verification-measure`.
291
369
  9. **Правка разметки публичного сайта проверена на прод-сборке по всем локалям перевода** — паттерн
292
370
  `seo-verify`.
293
- 10. **Тело PR начинается строкой `Closes #<номер>`**, а метки, ревьювер и исполнитель стоят.
371
+ 10. **Тело PR собрано по образцу** — начинается строкой `Closes #<номер>`, несёт разделы «Что
372
+ сделано», «Чем подтверждено» и «Оставшийся шаг», а метки, ревьювер и исполнитель стоят.
373
+ Раздел оставшегося шага к этому моменту говорит, что шагов не осталось: черновик снимается
374
+ после разбора папки, а не до него.
294
375
  11. **Заголовок PR несёт номер задачи и называет её сделанной:** `[<КЛЮЧ>-<номер>] <Что сделано>`,
295
376
  тем же номером, что стоит у задачи и в имени ветки. Инфинитив из задачи в него не
296
377
  переносится, тип и область коммита — тоже.
@@ -305,7 +386,12 @@ npm run task:move -- 86 in-review
305
386
  15. **Набор пересмотрен после вливания главной ветки.** Он выбирается по тому, что ветка везёт
306
387
  теперь, а не по тому, что правил автор. Ветка, не тронувшая ни строки показа, прогоняет
307
388
  снимки витрин: с момента вливания их гоняет конвейер на её коде, и красное придёт на её
308
- отчёт.
389
+ PR.
390
+
391
+ Список этот — про снятие черновика, а не про его открытие. Черновиком PR открывается раньше:
392
+ пока работа идёт, человеку показывают то, что уже есть, вместе с тем, чего ещё нет. Пункты 1–15
393
+ проходятся перед `gh pr ready`, и невыполненный пункт означает, что черновик не снимается, — а
394
+ не то, что PR не открывается.
309
395
 
310
396
  Сразу после публикации задача переставляется в разбор — `npm run task:move -- <номер>
311
397
  in-review`, — и `npm run check:board` прогоняется ещё раз: до открытия PR колонку он не судит,
@@ -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
@@ -46,6 +46,14 @@ glab issue update <номер> --title '[<КЛЮЧ>-<номер>] …' # но
46
46
  Метка списка ставится при заведении, а не после: issue без неё лежит вне доски, и увидеть её
47
47
  можно только поиском по проекту.
48
48
 
49
+ Заведение кончается не выводом команды, а ответом очереди работ. Команда спрашивает её сама и
50
+ печатает прочитанное — присутствие на доске, список, исполнителя; отсутствие кончает её ненулевым
51
+ кодом. В комментарий, в тело PR и в замысел идёт этот ответ, а не напечатанный номер: номер
52
+ говорит «вызов прошёл», а не «задача видна тому, кто по ней работает».
53
+
54
+ Заведения, идущие подряд, проверяются не по последнему, а сверкой очереди целиком: промах у них
55
+ общий, и по одной задаче он не виден.
56
+
49
57
  Чем сверить, что очередь работ в порядке:
50
58
 
51
59
  ```bash
@@ -167,6 +175,34 @@ MR [<КЛЮЧ>-86] Письмо владельцу с незаполнен
167
175
  коммита, и там его сверяет `commitlint`. В списке MR он занимает место, ничего не добавляя:
168
176
  род правки и область уже видны метками.
169
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
+
170
206
  ## MR прикрепляется к задаче
171
207
 
172
208
  Описание начинается со строки связи. Ревьювер, исполнитель и метки задаются той же командой, и
@@ -203,8 +239,48 @@ glab mr update 205 --description "$(cat тело.md)"
203
239
  ```
204
240
 
205
241
  Правка описания переписывает его целиком, поэтому строка `Closes #<номер>` пишется заново
206
- вместе с остальным текстом. Тело перечитывается всякий раз, когда в ветку что-то влилось после
207
- публикации: отчёт утверждает про дерево, а дерево с тех пор изменилось.
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
+ заголовок. Держится образец тем, кто пишет описание, — как и слова вслух.
208
284
 
209
285
  ## Состояние MR читается, а не додумывается
210
286
 
@@ -256,7 +332,10 @@ npm run task:move -- 86 in-review
256
332
  `browser-verification-measure`.
257
333
  9. **Правка разметки публичного сайта проверена на прод-сборке по всем локалям перевода** —
258
334
  паттерн `seo-verify`.
259
- 10. **Описание MR начинается строкой `Closes #<номер>`**, а метки, ревьювер и исполнитель стоят.
335
+ 10. **Описание MR собрано по образцу** — начинается строкой `Closes #<номер>`, несёт разделы
336
+ «Что сделано», «Чем подтверждено» и «Оставшийся шаг», а метки, ревьювер и исполнитель
337
+ стоят. Раздел оставшегося шага к этому моменту говорит, что шагов не осталось: черновик
338
+ снимается после разбора папки, а не до него.
260
339
  11. **Заголовок MR несёт номер задачи и называет её сделанной:** `[<КЛЮЧ>-<номер>] <Что
261
340
  сделано>`, тем же номером, что стоит у задачи и в имени ветки.
262
341
  12. **Очередь работ сходится** — `npm run check:board`.
@@ -268,7 +347,7 @@ npm run task:move -- 86 in-review
268
347
  15. **Набор пересмотрен после вливания главной ветки.** Он выбирается по тому, что ветка везёт
269
348
  теперь, а не по тому, что правил автор. Ветка, не тронувшая ни строки показа, прогоняет
270
349
  снимки витрин: с момента вливания их гоняет конвейер на её коде, и красное придёт на её
271
- отчёт.
350
+ PR.
272
351
 
273
352
  Сразу после публикации задача переставляется в разбор, и сверка очереди прогоняется ещё раз: до
274
353
  открытия MR список она не судит, а после открытия расхождение видит.
@@ -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
 
@@ -81,7 +81,7 @@ bash .claude/hooks/tests/run.sh # если конфликт задел х
81
81
 
82
82
  ## Тело открытого PR перечитывается после мержа
83
83
 
84
- Отчёт описывал дерево на день, когда его написали. Мерж главной ветки меняет то, о чём он
84
+ PR описывал дерево на день, когда его написали. Мерж главной ветки меняет то, о чём он
85
85
  утверждает: тело говорило, что оба дефекта заведены в `docs/BACKLOG.md`, а главная ветка этот
86
86
  список к тому времени разобрала. Правится тело вызовом REST — `gh pr edit` в этом репозитории
87
87
  отвечает отказом про Projects (classic) и до правки не доходит:
@@ -43,6 +43,12 @@ docs/specs/<домен>/
43
43
 
44
44
  Текст заголовка сверяется дословно. «Не применимо» — законный ответ, отсутствие раздела — нет.
45
45
 
46
+ `## Решения` — временное место. Решение живёт в нём, пока не найден слой, которому оно
47
+ принадлежит; найденный слой забирает его пунктом, а в спеке не остаётся ничего. Разросшийся
48
+ раздел читается как признак незаведённого правила, а не как свойство сложного домена: делить
49
+ такой спек по строкам бесполезно, потому что делится в нём не описание домена, а ненаписанное
50
+ правило.
51
+
46
52
  Шапка несёт статус, дату ревизии, префикс сценариев, зависимости от других доменов, строку
47
53
  `**Законы:**` — законы, которые домен применяет, — и строку `**Процедуры:**` — корни либ, чьи
48
54
  процедуры домен обслуживает.
@@ -129,7 +135,7 @@ docs/specs/<домен>/
129
135
  - Пометка «Не покрыто» при существующем тесте — отказ: долг закрыли, а отметку не сняли.
130
136
  - Пометка «Не покрыто» читается дословно и с начала строки. Любое слово между ней и двоеточием
131
137
  — «Не покрыто, и прогоном не покрывается вовсе: …» — и сценарий считается непомеченным вовсе,
132
- а причина, ради которой пометку и писали, до отчёта не доезжает.
138
+ а причина, ради которой пометку и писали, до PR не доезжает.
133
139
  - Закон, названный в тексте, но забытый в строке `**Законы:**`: по закону тогда не узнать,
134
140
  какие домены на нём стоят.
135
141
  - Правка `.proto` без спеков задетых доменов: `docs-guard` отбивает такой коммит.
@@ -123,6 +123,12 @@ description: Паттерн правила git-workflow. Брать … Не б
123
123
  правку сущности оказались привязаны к механике, которую не зовёт ни один экран.
124
124
  - Утверждение переформулировали, а строку в привязке не тронули: связь идёт по тексту, и
125
125
  проверка перестанет её находить.
126
+ - Строка привязки дописана в конец компаньона, а не вставлена в таблицу. После таблицы там идут
127
+ ещё разделы — «Чем это проверяется», «Что ещё стоит знать при чтении кода», — и приписанная в
128
+ конец строка в таблицу не попадает вовсе: утверждение читается непривязанным, а сверка спеков
129
+ на это молчит, потому что ищет строку в таблице. Место строки то же, что у её утверждения в
130
+ правиле: порядок обеих сторон держится одинаковым, иначе утверждение и его привязка перестают
131
+ находиться друг по другу.
126
132
  - В `description` не сказано, когда паттерн **не** брать, — соседний паттерн того же правила
127
133
  становится неотличимым.
128
134
  - Блок готового кода принят по виду, а не сверкой с объявлением. Вызов в примере повторяет имя,