@rt-tools/agent-kit 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/assets/checks/check-file-size.mjs +19 -4
  2. package/assets/checks/check-state-next.mjs +10 -2
  3. package/assets/checks/rt-kit-checks.config.mjs +16 -2
  4. package/assets/defaults/project.sh +9 -1
  5. package/assets/defaults/turn-map.md +8 -6
  6. package/assets/hooks/browser-guard-device-id.sh +3 -1
  7. package/assets/hooks/browser-guard-no-asking.sh +3 -1
  8. package/assets/hooks/browser-guard-no-other-drivers.sh +5 -3
  9. package/assets/hooks/browser-guard-require-select.sh +4 -2
  10. package/assets/hooks/claim-guard.sh +3 -1
  11. package/assets/hooks/conscience-guard.sh +3 -1
  12. package/assets/hooks/dev-server-guard.sh +5 -3
  13. package/assets/hooks/dispatch.sh +69 -0
  14. package/assets/hooks/docs-guard.sh +6 -4
  15. package/assets/hooks/exam-guard.sh +5 -3
  16. package/assets/hooks/git-guard-delivery.sh +37 -5
  17. package/assets/hooks/git-guard-main.sh +6 -4
  18. package/assets/hooks/git-guard-push-tests.sh +6 -4
  19. package/assets/hooks/grill-gate.sh +4 -2
  20. package/assets/hooks/handoff-entry-guard.sh +4 -2
  21. package/assets/hooks/handoff-write.sh +27 -6
  22. package/assets/hooks/hook-input.sh +54 -0
  23. package/assets/hooks/lint-after-edit.sh +5 -3
  24. package/assets/hooks/postmortem-guard.sh +3 -1
  25. package/assets/hooks/proposal-guard.sh +3 -1
  26. package/assets/hooks/prose-style-guard.sh +5 -3
  27. package/assets/hooks/qa-dataid-guard.sh +4 -2
  28. package/assets/hooks/rerun-guard.sh +5 -3
  29. package/assets/hooks/reuse-first-guard.sh +5 -3
  30. package/assets/hooks/rule-article.sh +99 -0
  31. package/assets/hooks/skill-gate-rearm.sh +3 -1
  32. package/assets/hooks/skill-gate.sh +23 -2
  33. package/assets/hooks/skill-loaded.sh +3 -1
  34. package/assets/hooks/sql-guard-request.sh +2 -1
  35. package/assets/hooks/sql-guard.sh +4 -2
  36. package/assets/hooks/task-flow-guard.sh +6 -4
  37. package/assets/hooks/turn-exit-guard.sh +42 -17
  38. package/assets/hooks/waiting-turn-guard.sh +3 -1
  39. package/assets/hooks/window-fill-guard.sh +6 -4
  40. package/assets/laws/work-conduct.md +5 -9
  41. package/assets/patterns/dependencies-upgrade.md +1 -1
  42. package/assets/patterns/doc-style-write.md +3 -3
  43. package/assets/patterns/git-workflow-commit.azure.md +2 -202
  44. package/assets/patterns/git-workflow-commit.github.md +2 -258
  45. package/assets/patterns/git-workflow-commit.gitlab.md +1 -217
  46. package/assets/patterns/git-workflow-docker.md +3 -3
  47. package/assets/patterns/git-workflow-merge.md +3 -2
  48. package/assets/patterns/git-workflow-migration.md +3 -3
  49. package/assets/patterns/git-workflow-pr.azure.md +224 -0
  50. package/assets/patterns/git-workflow-pr.github.md +280 -0
  51. package/assets/patterns/git-workflow-pr.gitlab.md +240 -0
  52. package/assets/patterns/git-workflow-restart.md +3 -3
  53. package/assets/patterns/git-workflow-secrets.md +3 -3
  54. package/assets/patterns/task-flow-archive.md +193 -0
  55. package/assets/patterns/task-flow-close.md +3 -173
  56. package/assets/patterns/task-flow-handoff.md +4 -4
  57. package/assets/pitfalls/doc-style.md +80 -0
  58. package/assets/pitfalls/git-workflow.azure.md +50 -0
  59. package/assets/pitfalls/git-workflow.github.md +78 -0
  60. package/assets/pitfalls/git-workflow.gitlab.md +49 -0
  61. package/assets/pitfalls/spec-driven.md +36 -0
  62. package/assets/pitfalls/styling-bem.md +45 -0
  63. package/assets/pitfalls/task-flow.md +62 -0
  64. package/assets/pitfalls/testing.md +70 -0
  65. package/assets/rules/deploy-flow.azure.md +106 -0
  66. package/assets/rules/deploy-flow.github.md +113 -0
  67. package/assets/rules/deploy-flow.gitlab.md +108 -0
  68. package/assets/rules/doc-style.md +25 -76
  69. package/assets/rules/git-workflow.azure.md +6 -92
  70. package/assets/rules/git-workflow.github.md +14 -127
  71. package/assets/rules/git-workflow.gitlab.md +6 -93
  72. package/assets/rules/spec-driven.md +39 -30
  73. package/assets/rules/styling-bem.md +20 -39
  74. package/assets/rules/task-flow.md +17 -199
  75. package/assets/rules/testing.md +3 -64
  76. package/assets/rules/turn-conduct.md +206 -0
  77. package/assets/rules/typescript-conventions.md +15 -0
  78. package/assets/skills/agent-kit.md +35 -12
  79. package/assets/templates/pitfalls.md +10 -0
  80. package/assets/templates/rule.md +5 -3
  81. package/bin/agent-kit.d.ts.map +1 -1
  82. package/bin/agent-kit.js +1 -42
  83. package/bin/agent-kit.js.map +1 -1
  84. package/lib/assets.d.ts.map +1 -1
  85. package/lib/assets.js +6 -1
  86. package/lib/assets.js.map +1 -1
  87. package/lib/cascade.d.ts.map +1 -1
  88. package/lib/cascade.js +19 -1
  89. package/lib/cascade.js.map +1 -1
  90. package/lib/commands.d.ts.map +1 -1
  91. package/lib/commands.js +1 -0
  92. package/lib/commands.js.map +1 -1
  93. package/lib/config.d.ts +16 -1
  94. package/lib/config.d.ts.map +1 -1
  95. package/lib/config.js +8 -0
  96. package/lib/config.js.map +1 -1
  97. package/lib/hooks-map.d.ts +13 -0
  98. package/lib/hooks-map.d.ts.map +1 -1
  99. package/lib/hooks-map.js +33 -1
  100. package/lib/hooks-map.js.map +1 -1
  101. package/lib/ship.d.ts +1 -2
  102. package/lib/ship.d.ts.map +1 -1
  103. package/lib/ship.js +0 -54
  104. package/lib/ship.js.map +1 -1
  105. package/package.json +1 -1
  106. package/rt-tools-agent-kit-0.12.0.tgz +0 -0
  107. package/assets/commands/agent-kit-digest.md +0 -89
  108. package/assets/commands/rules-review.md +0 -98
  109. package/assets/patterns/cargo-triage-mark.md +0 -119
  110. package/assets/rules/cargo-triage.md +0 -126
  111. package/lib/cargo-state.d.ts +0 -62
  112. package/lib/cargo-state.d.ts.map +0 -1
  113. package/lib/cargo-state.js +0 -118
  114. package/lib/cargo-state.js.map +0 -1
  115. package/rt-tools-agent-kit-0.11.0.tgz +0 -0
@@ -0,0 +1,240 @@
1
+ ---
2
+ name: git-workflow-pr
3
+ kind: pattern
4
+ rule: git-workflow
5
+ description: Паттерн правила git-workflow. Брать на открытие MR и всё, что с ним связано, — формат заголовка, черновик и его снятие, строка связи с задачей, ревьювер и метки, образец описания с разделом об оставшемся шаге, чтение состояния MR, перевод задачи в список разбора, чеклист проверок до снятия черновика. Не брать на заведение задачи, ветки и коммит — это паттерн git-workflow-commit.
6
+ ---
7
+
8
+ # Заявка на слияние
9
+
10
+ Паттерн правила `git-workflow`. Что при этом должно быть верно — закон
11
+ `docs/constitution/delivery.md`. Заведение задачи, ветки и коммит — паттерн
12
+ `git-workflow-commit`.
13
+
14
+ ## Когда брать
15
+
16
+ - Открывается MR по готовой ветке.
17
+ - Правится заголовок, тело или метки уже открытого MR.
18
+ - Снимается черновик, и работа отдаётся на разбор.
19
+ - Читается состояние MR перед тем, как что-либо о нём сказать владельцу.
20
+
21
+ ## Номер задачи стоит в её заголовке и в заголовке MR
22
+
23
+ Форма одна на оба — `[<КЛЮЧ>-<номер>] <текст>`. Номер стоит в самом заголовке, а не только в
24
+ теле: в списке MR тела не видно, а в списке задач номер иначе приходится искать глазами. Тот же
25
+ номер несёт и имя ветки, поэтому задача, ветка и MR читаются как одно.
26
+
27
+ Задача говорит, что не так; MR тем же номером отчитывается, что сделано:
28
+
29
+ ```
30
+ задача [<КЛЮЧ>-86] Пустой адрес владельца — письма не уходят молча
31
+ MR [<КЛЮЧ>-86] Письмо владельцу с незаполненным адресом попадает в логи
32
+ ```
33
+
34
+ Инфинитив из задачи в заголовок MR не переносится: «исправить» становится «исправлено»,
35
+ «вернуть» — «возвращено», «добавить» — «добавлено».
36
+
37
+ Тип и область — `fix(site):`, `docs(common):` — в заголовок MR не идут: это формат заголовка
38
+ коммита, и там его сверяет `commitlint`. В списке MR он занимает место, ничего не добавляя:
39
+ род правки и область уже видны метками.
40
+
41
+ ## Не готовое к слиянию открывается черновиком
42
+
43
+ Правка кода отдаётся человеку открытым MR: запушенная ветка ему не показывается нигде. Открытый
44
+ MR при этом читается как приглашение влить, поэтому у незаконченной работы он открывается
45
+ черновиком — кнопку слияния у черновика хостинг блокирует сам:
46
+
47
+ ```bash
48
+ GITLAB_TOKEN="$TOKEN" glab mr create --draft --title '[<КЛЮЧ>-86] …' --description "$(cat тело.md)"
49
+ ```
50
+
51
+ Признак черновика здесь — приставка `Draft:` в заголовке MR, и правится он вместе с ним:
52
+ переписав заголовок вручную, черновик снимают, не заметив этого.
53
+
54
+ Черновиком идёт всё, что ждёт прогона конвейера, доработки или ответа на вопрос. Вопрос
55
+ задаётся в самом MR, а не остаётся в голове исполнителя: человек читает MR, а не переписку
56
+ захода.
57
+
58
+ Снимается черновик отдельным вызовом, и это тот самый ход, которым исполнитель говорит, что
59
+ решение готово:
60
+
61
+ ```bash
62
+ GITLAB_TOKEN="$TOKEN" glab mr update 86 --ready
63
+ ```
64
+
65
+ До снятия молчание исполнителя значит «ещё не готово», после — «можно вливать». Снятие
66
+ черновика и просьба влить идут одним ходом: снятый черновик, о котором человеку не сказали,
67
+ ждёт разбора ровно так же, как не снятый.
68
+
69
+ ## MR прикрепляется к задаче
70
+
71
+ Описание начинается со строки связи. Ревьювер, исполнитель и метки задаются той же командой, и
72
+ MR без них не открывается:
73
+
74
+ ```bash
75
+ GITLAB_TOKEN="$TOKEN" glab mr create \
76
+ --title '[<КЛЮЧ>-86] Письмо владельцу с незаполненным адресом попадает в логи' \
77
+ --assignee <бот> --reviewer <владелец> --label bug --label area:api \
78
+ --target-branch main --remove-source-branch \
79
+ --description 'Closes #86
80
+
81
+ …'
82
+ ```
83
+
84
+ Ревьювер — всегда владелец: без запроса разбора MR не показывается ему в очереди. Исполнитель —
85
+ та же учётная запись, от которой идёт машинная работа. Метки читаются у задачи, а не выбираются
86
+ по памяти:
87
+
88
+ ```bash
89
+ glab issue view 86 --output json | jq -r '[.labels[]] | join(",")'
90
+ ```
91
+
92
+ Строка `Closes #<номер>` обязательна: без неё MR не прикрепляется к задаче, и сверка очереди
93
+ это находит. Она же означает, что задача закрывается целиком — половину задачи одним MR не
94
+ выкатывают: у задачи одна ветка, и работа, которая в неё не влезает, делится на задачи до того,
95
+ как ветка заводится.
96
+
97
+ У уже открытого MR то же ставится правкой:
98
+
99
+ ```bash
100
+ glab mr update 205 --label bug --label area:api --assignee <бот> --reviewer <владелец>
101
+ glab mr update 205 --description "$(cat тело.md)"
102
+ ```
103
+
104
+ Правка описания переписывает его целиком, поэтому строка `Closes #<номер>` пишется заново
105
+ вместе с остальным текстом. Описание перечитывается всякий раз, когда в ветку что-то влилось
106
+ после публикации: MR утверждает про дерево, а дерево с тех пор изменилось.
107
+
108
+ ## Образец описания MR
109
+
110
+ Четыре раздела, и порядок между ними один: строка связи, что сделано, чем подтверждено,
111
+ оставшийся шаг. Раздел, которому нечего сказать, пишется словами — пустой заголовок и снятый
112
+ заголовок читаются одинаково, а значат разное.
113
+
114
+ ```markdown
115
+ Closes #86
116
+
117
+ ## Что сделано
118
+
119
+ - <правка, названная тем, что она меняет для читателя, а не тем, какие файлы задела>
120
+
121
+ ## Чем подтверждено
122
+
123
+ - <проверка>: <её вывод одной строкой>
124
+ - Не гонялось: <что в набор не вошло и почему>
125
+
126
+ ## Оставшийся шаг
127
+
128
+ После одобрения ветка получает ещё один коммит — разбор папки задачи, — и только потом
129
+ вливается. До этого коммита вливать рано: папка уедет в главную ветку неразобранной.
130
+ ```
131
+
132
+ Раздел «Оставшийся шаг» стоит последним и переписывается тем же вызовом, что и остальное
133
+ описание, — в тот ход, которым папка разбирается и снимается черновик:
134
+
135
+ ```markdown
136
+ ## Оставшийся шаг
137
+
138
+ Не осталось: папка задачи разобрана коммитом `<sha>`, черновик снят. Можно вливать.
139
+ ```
140
+
141
+ Стоит он там потому, что решение о слиянии принимается на этой странице, а не в переписке:
142
+ сказанное владельцу вслух живёт до следующей реплики, а описание лежит у самой кнопки. Одно
143
+ другого не отменяет — порядок обоих сообщений владельцу описывает паттерн закрытия работы.
144
+
145
+ Проверить описание машиной нечем: ни одна сверка его не читает, а хостинг спрашивает только про
146
+ заголовок. Держится образец тем, кто пишет описание, — как и слова вслух.
147
+
148
+ ## Состояние MR читается, а не додумывается
149
+
150
+ Команды правки отвечают нулевым кодом и тогда, когда ничего не сделали: токен без права на
151
+ проект молча не ставит ни метку, ни ревьювера. Поэтому после них MR перечитывают:
152
+
153
+ ```bash
154
+ glab mr view 205 --output json \
155
+ | jq '{author: .author.username, reviewers: [.reviewers[].username], labels: .labels}'
156
+ ```
157
+
158
+ Владельцу называют то, что прочитали, а не то, что заказывали.
159
+
160
+ Учётная запись, из-под которой пришлось пушить, в этот вызов не переносится: пуш и авторство
161
+ MR выбираются отдельно, и токен для публикации — всегда токен машинной работы.
162
+
163
+ Перечитывают его и по времени, а не только после вызовов, которые молча ничего не сделали:
164
+ состояние MR читается перед тем, как что-либо о нём сказать. Между «прогон зелёный» и следующей
165
+ фразой владелец успевает влить MR, и всё сказанное о нём после этого — про вчерашний день. Так
166
+ владельцу и было предложено влить то, что он влил часом раньше.
167
+
168
+ Открытый MR означает, что задача ждёт разбора, — список переставляется тем же движением:
169
+
170
+ ```bash
171
+ npm run task:move -- 86 in-review
172
+ ```
173
+
174
+ ## Что проверяется до публикации MR
175
+
176
+ Проверок на самом MR нет ровно до тех пор, пока конвейер не запущен, а запускается он пушем.
177
+ Линтеры, юниты и сценарии хуков снимает гейт пуша — ниже то, чего он не знает.
178
+
179
+ 1. **Главная ветка влита в эту ветку** — `git fetch origin && git merge origin/main`.
180
+ Всё, что проверяется ниже, проверяется от этого основания: MR с разошедшейся ветки
181
+ показывает ревьюверу правку вперемешку с чужой. Порядок и разбор конфликта — паттерн
182
+ `git-workflow-merge`.
183
+ 2. **В ветке только та правка, за которой её заводили** — `git diff main...HEAD --stat`. Чужой
184
+ домен в списке файлов означает, что правка расползлась, и её надо вернуть в свои границы.
185
+ 3. **Ни мока, ни подменённого ответа, ни отладочной строки** — `git diff main...HEAD` читается
186
+ целиком, а не по именам файлов. На прод они уезжают молча и портят настоящие данные.
187
+ 4. **Документ едет тем же коммитом.** Пару называет `docs-guard`, но спек домена и правку его
188
+ поведения он не знает — это остаётся за автором.
189
+ 5. **Проверки текстов и раскладки зелёные** — те, что дерево завело в `tools/`. Какие именно
190
+ есть здесь — `implementation.md` правила.
191
+ 6. **Все приложения дерева собираются** — `nx build` по каждому. Гейт пуша сборку не гоняет.
192
+ 7. **Видимый текст заведён во всех локалях перевода** — тестом полноты словарей, если дерево
193
+ переводится.
194
+ 8. **Правка вёрстки подтверждена замером**, а не взглядом, и снята при узком экране — паттерн
195
+ `browser-verification-measure`.
196
+ 9. **Правка разметки публичного сайта проверена на прод-сборке по всем локалям перевода** —
197
+ паттерн `seo-verify`.
198
+ 10. **Описание MR собрано по образцу** — начинается строкой `Closes #<номер>`, несёт разделы
199
+ «Что сделано», «Чем подтверждено» и «Оставшийся шаг», а метки, ревьювер и исполнитель
200
+ стоят. Раздел оставшегося шага к этому моменту говорит, что шагов не осталось: черновик
201
+ снимается после разбора папки, а не до него.
202
+ 11. **Заголовок MR несёт номер задачи и называет её сделанной:** `[<КЛЮЧ>-<номер>] <Что
203
+ сделано>`, тем же номером, что стоит у задачи и в имени ветки.
204
+ 12. **Очередь работ сходится** — `npm run check:board`.
205
+ 13. **Состояние MR прочитано, а не выведено из кодов возврата.**
206
+ 14. **Набор взят из файла конвейера, а не собран по памяти.** Гейт пуша заведомо уже: он стоит
207
+ между командой и пушем, и всё, что дольше секунд, из него вынесено. Что гоняет конвейер,
208
+ написано в его файле — этот список и повторяется локально; зелёный гейт полнотой набора не
209
+ является.
210
+ 15. **Набор пересмотрен после вливания главной ветки.** Он выбирается по тому, что ветка везёт
211
+ теперь, а не по тому, что правил автор. Ветка, не тронувшая ни строки показа, прогоняет
212
+ снимки витрин: с момента вливания их гоняет конвейер на её коде, и красное придёт на её
213
+ PR.
214
+
215
+ Сразу после публикации задача переставляется в разбор, и сверка очереди прогоняется ещё раз: до
216
+ открытия MR список она не судит, а после открытия расхождение видит.
217
+
218
+ Сделанное рассуждением и сделанное замером в теле MR разводятся прямо: непроверенное,
219
+ названное проверенным, ревьювер принимает за проверенное.
220
+
221
+ **Раздел «Чем подтверждено» называет и то, что не гонялось.** Список одного прогнанного
222
+ неотличим от полного набора, и ревьювер по нему решает, что можно не перепроверять. Цена ошибки
223
+ здесь не красный конвейер, а доверие к разделу: однажды прочитанный как полнота, дальше он
224
+ перепроверяется весь.
225
+
226
+ ## Частые промахи
227
+
228
+ Промахи про заведение задачи, ветку и коммит — паттерн
229
+ `git-workflow-commit`.
230
+
231
+ - MR открыт без ревьювера: он не попадает во входящие владельца, и очередь стоит, выглядя
232
+ работающей.
233
+ - Метки поставлены по названию MR, а не прочитаны у задачи: область теряется, и по доске не
234
+ видно, что правка задела ещё и соседний домен.
235
+ - Вторая строка `Closes` в одном MR: две задачи в одной ветке откатываются только вместе. Либо
236
+ это одна задача — и вторая поглощается, — либо две ветки.
237
+ - Половина задачи, уехавшая своим MR: описание такого MR начинается со слов «Часть #<номер>»
238
+ вместо `Closes`, задача остаётся открытой, и после отката видно её целой.
239
+ - `--remove-source-branch` забыт: ветки задач копятся в репозитории, и по списку веток больше
240
+ не видно, какая работа идёт сейчас.
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: git-workflow-restart
3
3
  kind: pattern
4
- rule: git-workflow
5
- description: Паттерн правила git-workflow. Брать при ручном перезапуске прода — после правки .env.prod, при разборе выкатки, при подъёме контейнера на сервере. Готовые команды с IMAGE_TAG по sha, способ узнать выкаченный sha и чем сверять результат. Не брать для коммита и миграций — это паттерны git-workflow-commit и git-workflow-migration.
4
+ rule: deploy-flow
5
+ description: Паттерн правила deploy-flow. Брать при ручном перезапуске прода — после правки .env.prod, при разборе выкатки, при подъёме контейнера на сервере. Готовые команды с IMAGE_TAG по sha, способ узнать выкаченный sha и чем сверять результат. Не брать для коммита и миграций — это паттерны git-workflow-commit и git-workflow-migration.
6
6
  ---
7
7
 
8
8
  # Ручной перезапуск прода
9
9
 
10
- Паттерн правила `git-workflow`. Что при этом должно быть верно — закон
10
+ Паттерн правила `deploy-flow`. Что при этом должно быть верно — закон
11
11
  `docs/constitution/delivery.md`.
12
12
 
13
13
  ## Когда брать
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: git-workflow-secrets
3
3
  kind: pattern
4
- rule: git-workflow
5
- description: Паттерн правила git-workflow. Брать при работе с ключами внешних служб — где они лежат, чем ключ, заводимый владельцем, отличается от ключа окружения, что означает каждое состояние строки интеграции и почему зелёная проба не обещает работающей возможности. Не брать для перезапуска прода и выбора образа — это паттерн git-workflow-restart.
4
+ rule: deploy-flow
5
+ description: Паттерн правила deploy-flow. Брать при работе с ключами внешних служб — где они лежат, чем ключ, заводимый владельцем, отличается от ключа окружения, что означает каждое состояние строки интеграции и почему зелёная проба не обещает работающей возможности. Не брать для перезапуска прода и выбора образа — это паттерн git-workflow-restart.
6
6
  ---
7
7
 
8
8
  # Ключи внешних служб
9
9
 
10
- Паттерн правила `git-workflow`. Что при этом должно быть верно — закон
10
+ Паттерн правила `deploy-flow`. Что при этом должно быть верно — закон
11
11
  `docs/constitution/delivery.md`.
12
12
 
13
13
  ## Когда брать
@@ -0,0 +1,193 @@
1
+ ---
2
+ name: task-flow-archive
3
+ kind: pattern
4
+ rule: task-flow
5
+ description: Паттерн правила task-flow. Брать, когда работа доведена до готовности: разбор папки задачи последним коммитом, переезд в описание прошлого, сверка очереди работ, разбор закрытой работы правилами и то, что делать с его находками. Не брать для вливания договорённости и приведения текстов — это паттерн task-flow-close.
6
+ ---
7
+
8
+ # Разбор папки задачи и разбор работы правилами
9
+
10
+ Паттерн правила `task-flow`. Что при этом должно быть верно — закон
11
+ `docs/constitution/work-conduct.md`. Что делается до этого — снятие черновика, вливание
12
+ договорённости и приведение текстов — паттерн `task-flow-close`.
13
+
14
+ ## Когда брать
15
+
16
+ - Договорённость влита, тексты домена приведены, и папка задачи разбирается последним
17
+ коммитом ветки.
18
+ - Работа слита человеком, и её разбирают правилами.
19
+ - Разбор вернул находки, и их надо куда-то положить.
20
+
21
+ ## Состояние `разбор-кончился`: папка задачи разбирается
22
+
23
+ Разбор идёт по трём исходам, а не по двум.
24
+
25
+ **Первым отбирается действующее требование.** Всё, что останется верным и завтра, становится
26
+ статьёй закона, пунктом правила или разделом паттерна — по тому, о чём оно говорит. Признак
27
+ отбора один и записан здесь заранее: перестанет ли текст быть верным, если завтра всё
28
+ переделать. Перестанет — это рассказ о состоявшемся; не перестанет — требование, и место ему в
29
+ слое правил. Закон при этом в ветке не правится — его статья приносится владельцу текстом.
30
+
31
+ **Вторым отбирается рассказ о состоявшемся переезде.** Он уезжает в описание прошлого и
32
+ называет для каждого перенесённого решения, куда оно ушло: иначе решение, ставшее правилом, и
33
+ решение, потерянное при переносе, выглядят одинаково — записью, на которую никто не ссылается.
34
+
35
+ **Третьим удаляется остальное.**
36
+
37
+ Порядок именно такой: начав с переезда, исполнитель увозит вместе с ним и действующее — под
38
+ конец работы это дешевле, чем разбирать.
39
+
40
+ Целиком в архив не переносится: `docs/archive/` — место для записей о состоявшемся, которые
41
+ кто-то читает, а не свалка ходов работы. Таблица ниже говорит о том, что осталось после
42
+ первого отбора.
43
+
44
+ | Файл | Куда |
45
+ | --------------- | ------------------------------------------------------------------------------------------------------------------ |
46
+ | `grill.md` | в `docs/archive/` — ответы владельца невосстановимы, и это единственная запись о том, почему задача поставлена так |
47
+ | `progress.md` | в `docs/archive/`, если в нём есть решения по ходу с причинами; иначе удаляется |
48
+ | `plan.md` | удаляется — после выкатки на его вопрос отвечает код, а на «как работает» отвечает спек домена |
49
+ | находки разбора | переезжают к замыслу эпика — их читает владелец, когда эпик кончится; работа вне эпика показывает их сразу |
50
+
51
+ Уезжающее складывается одним файлом с говорящим именем, а не папкой из трёх:
52
+
53
+ ```bash
54
+ cat docs/tasks/<КЛЮЧ>-<номер>-<slug>/grill.md > docs/archive/<ЧТО_РЕШАЛИ>.md
55
+ rm -r docs/tasks/<КЛЮЧ>-<номер>-<slug>
56
+ ```
57
+
58
+ Разбор идёт в том же PR, что и работа: папка, оставленная до мержа, попадает в главную
59
+ ветку и читается там как текущая.
60
+
61
+ ### Работа, разбирающая чужую папку, разбирает две
62
+
63
+ Своя папка у такой работы есть — она заводится наравне со всеми, исключения из этого нет. Обе
64
+ снимаются последним коммитом, и порядок между ними один: сперва чужая, потом своя. Начав со
65
+ своей, исполнитель теряет замысел на диске, а он ещё нужен — гард отбивает правку без него, а
66
+ правка по замечаниям разбора идёт в ту же ветку.
67
+
68
+ ```bash
69
+ cat docs/tasks/<чужая>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ТАМ>.md
70
+ rm -r docs/tasks/<чужая>
71
+ cat docs/tasks/<своя>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ЗДЕСЬ>.md
72
+ rm -r docs/tasks/<своя>
73
+ ```
74
+
75
+ Две записи в архиве, а не одна: работы разные, и решения в них разные. Сверка очереди работ
76
+ после этого не называет ни одной папки — этим и проверяется, что разобраны обе.
77
+
78
+ **Следующее движение:** разобранная папка уезжает в ветку тем же коммитом, и следом за ним
79
+ сверяется очередь работ.
80
+
81
+ ## Состояние `папка-разобрана`: сверка очереди работ
82
+
83
+ ```bash
84
+ npm run check:board # папка закрытой задачи среди текущих, брошенные черновики
85
+ npm run check:specs # договорённость влита, привязки на месте
86
+ npm run check:docs # пути, названные в текстах, существуют
87
+ ```
88
+
89
+ **Следующее движение:** расхождения, названные сверками, чинятся тем же ходом; чинить нечего —
90
+ тот же ход снимает черновик и просит владельца влить, называя номер.
91
+
92
+ ## Состояние `влито`: работа разбирается правилами — фоном, следом за PR
93
+
94
+ Шаг о слое правил, а не о продукте: что за эту работу грузилось, что помогло, чего не хватило и
95
+ где текст правила разошёлся с деревом. Знает это только тот заход, который работу вёл, — через
96
+ сутки не знает никто.
97
+
98
+ Ведёт разбор роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт его
99
+ само, теми же вопросами. Файлов роль не правит — приносит готовые формулировки, а вставлять их
100
+ решает владелец.
101
+
102
+ **Запускается разбор в фоне, сразу за открытием PR, и ход на нём не кончается.** Роль ничего не
103
+ спрашивает, пока работает, и быстрее от ожидания не идёт: следующая задача берётся тем же ходом,
104
+ которым запущен разбор.
105
+
106
+ Порядок один и переставлять его нельзя:
107
+
108
+ 1. **Сводка собирается до запуска** — пока задача ещё в голове. Что делали, что пошло не так,
109
+ что грузилось и что каждое правило дало, на какие грабли окружения наткнулись. Собранная
110
+ через две задачи, она пересказывает историю ветки вместо того, что было на самом деле.
111
+ 2. **Роль уходит в фон** — инструментом запуска роли, с путём к списку загруженного и сводкой
112
+ целиком. Ход продолжается следующей задачей.
113
+ 3. **Вернувшиеся находки принимают одним ходом** — записать и вернуться к прежнему. Разбор,
114
+ отложенный «до удобного момента», не случается вовсе: заход кончается раньше.
115
+
116
+ **Следующее движение:** пока роль разбирает, тот же ход занят следующей задачей; вернувшиеся
117
+ находки принимаются одним ходом — записать и продолжить прежнее.
118
+
119
+ ## Состояние `влито`: находки разбора ложатся в папку задачи и ждут владельца
120
+
121
+ Ответ роли живёт в переписке и умирает вместе с ней, поэтому он сразу ложится на диск — в папку
122
+ задачи, файлом рядом с ходом работы. Пишет его исполнитель: роль файлов не пишет.
123
+
124
+ Папка задачи умирает со слиянием, а находки должны пережить весь эпик — владелец читает их
125
+ разом, когда эпик кончился. Поэтому при разборе папки файл находок не удаляется вместе
126
+ с остальным, а **переезжает к замыслу эпика**: там его найдут и после того, как ветка въехала.
127
+ Работа вне эпика показывает находки владельцу сразу, тем же ходом.
128
+
129
+ **Наружу без слова владельца уезжает только сводка наблюдений.** Она говорит, чем пользовались
130
+ и чем не пользовались ни разу, — это факт, и мнением он не станет. Предложение — другое дело:
131
+ это заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении. Уехавшая
132
+ без разбора, она становится работой того, кто её не заказывал.
133
+
134
+ Порядок такой: находки копятся у замысла эпика → эпик кончился → владелец читает их разом и
135
+ говорит, что из них верно → названное им оформляется предложением и уезжает. Чем отправляют —
136
+ скил слоя правил, если дерево его разложило.
137
+
138
+ У каждой находки называется адрес, и адресов три:
139
+
140
+ | Куда | Что туда идёт |
141
+ | -------------------------- | ------------------------------------------------------------------------ |
142
+ | слой правил — предложением | то, что верно любому дереву этого класса: статья, пункт правила, паттерн |
143
+ | имена этого дерева | то, что верно здесь: компаньон правила, профиль, карта гейта |
144
+ | надстройка над разложенным | то, что здесь звучит иначе, чем в пакете |
145
+
146
+ Без адреса правка ложится туда, где её видит автор, — то есть в своё дерево, — и общее оседает
147
+ в одном месте, оставаясь неизвестным всем остальным.
148
+
149
+ **Разбор без правки закрытым не считается.** Из него выходит либо правка слоя правил, либо
150
+ предложение наружу; не вышло ни того ни другого — это жалоба, и она повторится. Предложение, о
151
+ котором владелец сказал вслух, уходит наружу в тот же ход: написанное и не отправленное лежит в
152
+ дереве неотличимо от отправленного.
153
+
154
+ **Следующее движение:** записанные находки работу не держат — следующая задача уже идёт, а
155
+ владельцу о них говорится, когда кончился эпик.
156
+
157
+ ## Ловушки
158
+
159
+ - **Папку разбирают до слияния — потом о ней уже никто не вспомнит.** Сверка очереди считает
160
+ задачу закрытой по слиянию: до него папка среди текущих законна, а после за неё никто не
161
+ отвечает — работа перешла к следующей задаче, и находка достанется чужому заходу. Три раза
162
+ подряд папка закрытой задачи так и уехала в главную ветку, в последний раз их набралось
163
+ пять. Теперь это держит гард поставки: слияние отбивается, пока папка лежит в ветке.
164
+ - **Разбирают последним коммитом, а не перед открытием PR.** Пока идёт ревью, замысел
165
+ нужен на диске: без него правку по замечаниям не пропустит гард хода работы. Порядок такой:
166
+ правки по ревью, потом разбор папки, потом слияние.
167
+ - **Разбор папки идёт последним, после того как гейт пуша прошёл целиком.** Гард хода работы
168
+ не пускает правку кода приложения без замысла на диске, а после разбора замысла нет: чужое
169
+ замечание линтера, приехавшее мержем из главной ветки, чинить уже нечем, и гейт пуша стоит.
170
+ Порядок один: мерж главной ветки, все линтеры и проверки зелёные, вливание договорённости,
171
+ приведение текстов домена, разбор папки. Понадобилась правка кода после разбора — замысел
172
+ восстанавливается на диске на время правки, и разбор повторяется тем же коммитом.
173
+ - **Если папку просто удалить, первым пропадёт `grill.md`.** Удалить проще, чем разобрать, а
174
+ слова владельца записаны только там, и восстановить их неоткуда. Поэтому гард требует, чтобы
175
+ ветка добавила запись в архив. Что именно перенесли, он не проверяет — это смотрит владелец
176
+ на ревью.
177
+ - **Шаги закрытия с владельцем не согласуются — они перечислены здесь.** Разбор работы
178
+ правилами входит в закрытие так же, как вливание договорённости и разбор папки; владелец
179
+ решает не то, запускать ли его, а что делать с находками. Ход, кончившийся таким вопросом,
180
+ отбивает гард разговора: за ход правила не читались, а ответ стоит в них. Спрашивается только
181
+ то, чего в правилах нет.
182
+ - **Блок готового кода в паттерне стареет от чужой правки.** Он не привязан ни к чему: сверка
183
+ спеков читает утверждения правила, а пример под ними не читает вовсе. Два поля, ставших
184
+ обязательными в чужой работе, сделали пример в соседнем паттерне несобираемым — сам он при
185
+ этом не изменился ни на знак и в след задачи не попал, потому что ни одного слова той работы
186
+ в нём нет. Паттерн находится по имени правленого символа, а не по теме работы.
187
+ - **Замысел эпика правят только там, где вписывают «чем кончился».** Границы эпика и
188
+ порядок задач в нём при этом остаются прежними, а работа их уже нарушила: задача, решившая
189
+ читать спеки, оставила над собой границу «спеки — вторая очередь», и следующий исполнитель
190
+ прочитает её как действующую. Границы эпика перечитываются целиком тем же заходом, что и
191
+ итог работы.
192
+ - **Архив не обновляется после выкатки.** Уехавшее туда описывает день переезда, и правится
193
+ оно только вместе с признанием, что описывало неверно.