@rt-tools/agent-kit 0.17.0 → 0.18.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 (75) hide show
  1. package/assets/checks/board-epics.github.mjs +123 -0
  2. package/assets/checks/board-gh.github.mjs +121 -0
  3. package/assets/checks/board.github.mjs +77 -73
  4. package/assets/checks/check-board.github.mjs +39 -3
  5. package/assets/checks/check-hook-scope.mjs +126 -0
  6. package/assets/checks/check-profile-drift.mjs +195 -0
  7. package/assets/checks/check-specs.mjs +1 -1
  8. package/assets/checks/rt-kit-checks.config.mjs +13 -0
  9. package/assets/checks/spec-anchors.mjs +2 -2
  10. package/assets/defaults/project.sh +21 -117
  11. package/assets/defaults/shell.sh +139 -0
  12. package/assets/hooks/browser-guard-no-other-drivers.sh +41 -2
  13. package/assets/hooks/claim-guard.sh +22 -1
  14. package/assets/hooks/docs-guard.sh +1 -1
  15. package/assets/hooks/exam-guard.sh +85 -12
  16. package/assets/hooks/git-guard-delivery-conflict.sh +85 -0
  17. package/assets/hooks/git-guard-delivery-signature.sh +14 -5
  18. package/assets/hooks/git-guard-delivery.sh +15 -2
  19. package/assets/hooks/grill-gate.sh +63 -6
  20. package/assets/hooks/proposal-guard.sh +11 -4
  21. package/assets/hooks/rule-source-guard.sh +8 -13
  22. package/assets/hooks/task-context-load.sh +22 -0
  23. package/assets/hooks/task-flow-context.sh +9 -0
  24. package/assets/hooks/task-flow-draft-guard.sh +17 -0
  25. package/assets/hooks/turn-exit-guard.sh +45 -87
  26. package/assets/hooks/waiting-turn-guard.sh +65 -2
  27. package/assets/hooks/work-start-guard.sh +166 -0
  28. package/assets/hooks/write-targets.sh +24 -0
  29. package/assets/laws/verifiability.md +23 -0
  30. package/assets/patterns/browser-verification-measure.md +3 -1
  31. package/assets/patterns/browser-verification-stand.md +10 -2
  32. package/assets/patterns/doc-style-write.md +21 -1
  33. package/assets/patterns/git-workflow-commit.github.md +18 -3
  34. package/assets/patterns/git-workflow-docker.md +8 -0
  35. package/assets/patterns/git-workflow-freshness.md +87 -0
  36. package/assets/patterns/git-workflow-merge.md +23 -0
  37. package/assets/patterns/git-workflow-pr.github.md +6 -0
  38. package/assets/patterns/git-workflow-restart.md +18 -0
  39. package/assets/patterns/git-workflow-stack.md +30 -0
  40. package/assets/patterns/lib-layers-move.md +4 -0
  41. package/assets/patterns/spec-driven-domain.md +13 -1
  42. package/assets/patterns/spec-driven-rule.md +5 -4
  43. package/assets/patterns/spec-driven-sweep.md +1 -1
  44. package/assets/patterns/status-report-table.github.md +1 -1
  45. package/assets/patterns/task-flow-archive.md +12 -2
  46. package/assets/patterns/task-flow-close.md +31 -24
  47. package/assets/patterns/task-flow-handoff.md +14 -2
  48. package/assets/patterns/task-flow-resume.md +18 -3
  49. package/assets/patterns/task-flow-start.md +23 -23
  50. package/assets/patterns/testing-e2e.md +23 -0
  51. package/assets/patterns/turn-entry-map.md +1 -1
  52. package/assets/pitfalls/agent-kit.md +4 -6
  53. package/assets/pitfalls/doc-style.md +10 -0
  54. package/assets/pitfalls/git-workflow.github.md +20 -0
  55. package/assets/pitfalls/spec-driven.md +6 -0
  56. package/assets/pitfalls/task-flow.md +20 -0
  57. package/assets/pitfalls/testing.md +6 -0
  58. package/assets/pitfalls/turn-conduct.md +35 -0
  59. package/assets/rules/browser-verification.md +19 -0
  60. package/assets/rules/deploy-flow.github.md +9 -0
  61. package/assets/rules/doc-style.md +6 -0
  62. package/assets/rules/git-workflow.azure.md +17 -2
  63. package/assets/rules/git-workflow.github.md +89 -90
  64. package/assets/rules/git-workflow.gitlab.md +12 -4
  65. package/assets/rules/lists.md +5 -0
  66. package/assets/rules/observability.needs-app.md +4 -0
  67. package/assets/rules/reuse-first.md +6 -0
  68. package/assets/rules/spec-driven.md +29 -25
  69. package/assets/rules/task-flow.md +52 -46
  70. package/assets/rules/testing.md +27 -1
  71. package/assets/rules/turn-conduct.md +46 -43
  72. package/assets/skills/agent-kit.md +9 -0
  73. package/package.json +1 -1
  74. package/rt-tools-agent-kit-0.18.0.tgz +0 -0
  75. package/rt-tools-agent-kit-0.17.0.tgz +0 -0
@@ -51,7 +51,7 @@ description: Правило под «Закон о документации пр
51
51
  | утверждение документа | пункт `## Правила` в спеке, `## Статьи` в законе, `## Как закон применяется здесь` в правиле |
52
52
  | место, где оно исполняется | строка в `implementation.md` рядом: `` `файл:символ` `` |
53
53
  | обещанное поведение | сценарий `SC-<ПРЕФИКС>-<НОМЕР>` в `docs/specs/<домен>/scenarios.md` |
54
- | открытый вопрос | `Q-N` на него ссылаются из задачи на борде и из коммитов; номер после закрытия не переиспользуется |
54
+ | открытый вопрос | `Q-<буква закона>-<номер>` в разделе «Открытые вопросы» закона; на него ссылаются из задачи и коммитов, номер после закрытия не переиспользуется |
55
55
  | законы, которые применяет домен | строка `**Законы:**` в шапке спека, именами в кавычках |
56
56
 
57
57
  ## Где это лежит
@@ -94,14 +94,12 @@ flowchart TD
94
94
  связи — сам текст утверждения, поэтому переформулировать его, забыв про привязку, нельзя.
95
95
  - **Первая колонка компаньона — текст статьи, скопированный, а не пересказанный.** Ключ связи —
96
96
  сам текст, поэтому строка, написанная по смыслу статьи, разрывает связь, оставаясь на вид
97
- заполненной. Проверка это подтверждает: она считает статьи без адреса и о статье, адрес которой
98
- описывает не её, не знает ничего. Статье о действиях, требующих отдельного слова владельца,
99
- поставили привязкой гард, держащий действие не из её перечня: совпал род, а не перечень, и
100
- строка продержалась до перечитывания диффа.
101
- - **Привязка не ведёт в код, который никто не зовёт.** Символ, объявленный в своём файле и
102
- больше нигде не встречающийся, местом исполнения не считается.
103
- - **Таблица процедур сверяется с декораторами в обе стороны.** Иначе процедура, которую домен
104
- обслуживает, но забыл описать, видна только в декораторе.
97
+ заполненной. Проверка считает статьи без адреса и о статье, адрес которой описывает не её, не
98
+ знает ничего: совпадает род, а не перечень, и строка стоит до перечитывания диффа.
99
+ - **Привязка не ведёт в код, который никто не зовёт:** нигде не зовущийся символ не место.
100
+ - **Таблица процедур сверяется с декораторами в обе стороны, право — вместе с именем.** Иначе
101
+ процедура, которую домен обслуживает, но забыл описать, видна только в
102
+ декораторе, а право, разошедшееся со спеком, нигде.
105
103
  - **Код отказа принимается, только если он в домене бросается.** Коды выписывались по
106
104
  замыслу, и на одном пути обещанный отказ не бросал никто.
107
105
  - **Префикс сценариев в спеке один, и по всему дереву он занят им одним.** Второй префикс
@@ -181,14 +179,12 @@ flowchart TD
181
179
 
182
180
  Образцы разделены пробелом и сверяются с путём правки как образцы оболочки, а не поиском по
183
181
  словам: поиск называет не ту статью и молчит об этом. Образец без каталога сверяется и с
184
- именем файла. Комментарий не виден в собранной разметке, поэтому статья читается человеком
185
- как прежде.
182
+ именем файла, а комментарий в собранной разметке не виден.
186
183
 
187
184
  - **Статья без признака законна, и правило без единого признака — тоже.** Признак ставится тем
188
185
  статьям, чьё правило отбивает на правке файла; остальные размечаются по мере того, как их
189
186
  отбития попадут в сводку. Отсутствие признака означает «эту статью по пути правки не
190
- выбирают», а не промах: требовать его у всех значило бы размечать наугад те правила, которые
191
- ни разу никого не отбили.
187
+ выбирают», а не промах: требовать его у всех значило бы размечать наугад.
192
188
 
193
189
  - **Паттерн находится по полю `rule:`, а не по приставке имени.** Приставку имени несут не все
194
190
  паттерны, и поиск по имени правила таких не видит: сверка ищет их полем, человек — разделом
@@ -208,12 +204,10 @@ flowchart TD
208
204
  сторон: якорем утверждения оказывается слово из комментария, тогда как объявление рядом
209
205
  называется иначе.
210
206
 
211
- - **Проверка, прибитая к имени ресурса, ломается на его делении, и знать об этом надо до
212
- правки.** Имя правила и имя паттерна стоят не только в текстах, но и в проверках дерева, в
213
- пробах их наборов и в таблицах, которые связывают состояние с ведущим его паттерном. Деление
214
- ресурса поэтому начинается с поиска его имени по всему дереву, а не по слою правил: найденное
215
- правится тем же изменением. Иначе красное приходит по одной проверке за прогон, и каждая
216
- выглядит отдельной поломкой — так деление одного правила уронило три подряд.
207
+ - **Проверка, прибитая к имени ресурса, ломается на его делении, и знать об этом надо до правки.**
208
+ Имя правила и имя паттерна стоят не только в текстах, но и в проверках дерева, в пробах их наборов
209
+ и в таблицах состояний. Деление поэтому начинается с поиска имени по всему дереву: иначе красное
210
+ приходит по одной проверке за прогон так деление одного правила уронило три.
217
211
 
218
212
  ## Форма сжатой статьи
219
213
 
@@ -255,14 +249,17 @@ flowchart TD
255
249
 
256
250
  Закон, которого не применяет ни один спек, отказом не считается: законы про устройство кода,
257
251
  поставку и проверяемость доменов не касаются вовсе. Порядок «сначала описание, потом код»
258
- держится договорённостью это `Q-PD-3` в законе.
252
+ держится договорённостью: закон о документации проекта такого требования не несёт, и открытого
253
+ вопроса под него в нём не заведено.
259
254
 
260
255
  Таблицы состояний экрана не сверяются ничем. `check:specs` знает сценарии против заголовков
261
- тестов, правила против якорей, процедуры против декораторов и коды отказа против бросков —
262
- строка таблицы состояний не привязана ни к чему и проходит зелёной, даже когда код в
263
- названное состояние не попадает. Состояние «проверка не загрузилась» стояло в таблицах двух
264
- доменов раньше, чем код научился в него приходить, и всё это время читалось описанием
265
- работающего.
256
+ тестов, правила против якорей, процедуры против декораторов и коды отказа против бросков — строка
257
+ таблицы состояний не привязана ни к чему и проходит зелёной, даже когда код в названное состояние
258
+ не попадает. Состояние «проверка не загрузилась» стояло в таблицах двух доменов раньше, чем код
259
+ научился в него приходить, и всё это время читалось описанием работающего.
260
+
261
+ Смысл сценария с соседним не сверяется ничем: проверка судит номер. Два сценария, обещающих одно
262
+ и то же разными словами, для неё разные, и второй числится непроверяемым, сколько проживёт.
266
263
 
267
264
  Полноту разметки статей признаком применимости не считает ничто. Правило, у которого признака
268
265
  нет ни у одной статьи, отбивает прежним текстом — и от размеченного отличается только тем, что
@@ -292,3 +289,10 @@ flowchart TD
292
289
  - `spec-driven-domain` — заведение и правка спека домена, сценарии, привязка.
293
290
  - `spec-driven-rule` — заведение закона, правила и паттерна.
294
291
  - `spec-driven-sweep` — сплошной разбор привязки домена, проходы и их разбор.
292
+
293
+ ## Ловушки
294
+
295
+ - **Строка требования к соседнему ресурсу не проверяется ничем, и промах в ней виден только
296
+ счётом.** Правило без неё выглядит целым: разделы на месте, привязки сходятся, набор полноты
297
+ зелёный. Считается она одной командой по каталогу правил, и расхождение читается сразу — сколько
298
+ правил объявило требования и сколько ссылается на соседний ресурс прозой.
@@ -15,7 +15,7 @@ description: Правило под «Закон о ведении работы»
15
15
  Грузится по требованию, а не вместе с правилом: при обычном решении она не нужна — она нужна
16
16
  тому, кто разбирает промах или спорит с гардом.
17
17
 
18
- **Требует:** `hooks/task-flow-guard.sh`, `hooks/task-flow-draft-guard.sh`, `hooks/task-context-load.sh`, `hooks/grill-gate.sh`, `hooks/window-fill-guard.sh`, `hooks/turn-exit-guard.sh`
18
+ **Требует:** `hooks/task-flow-guard.sh`, `hooks/task-flow-draft-guard.sh`, `hooks/task-context-load.sh`, `hooks/grill-gate.sh`, `hooks/window-fill-guard.sh`, `hooks/turn-exit-guard.sh`, `hooks/work-start-guard.sh`
19
19
 
20
20
  ## Как это называется здесь
21
21
 
@@ -120,11 +120,10 @@ flowchart TD
120
120
  `этап-идёт`, `этапы-кончились`, `разбор-кончился`. Четвёртый путь не состояние, а история
121
121
  ветки: папка, разобранная её коммитом, означает отданную работу, и правка по замечаниям идёт
122
122
  без замысла на диске.
123
- - **Строка состояния, переведённая вперёд, — то же объявление намерения, только
124
- машиночитаемое.** Она точнее всякого обещания, и пустоты за ней не видно никому. Состояние
125
- объявляется тем ходом, в котором его обязательное действие начато делом, а не тем, в котором о
126
- нём отчитались.
127
- - **Отказ по состоянию называет обязательное действие того состояния, которое объявлено.**
123
+ - **Строка состояния, переведённая вперёд, — то же объявление намерения, только машиночитаемое.**
124
+ Пустоты за ней не видно никому: состояние объявляется тем ходом, в котором его обязательное
125
+ действие начато делом, а не тем, в котором о нём отчитались.
126
+ - **Отказ по состоянию называет обязательное действие объявленного состояния.**
128
127
  Исполнитель, которому сказано только «не в том состоянии», перепишет строку состояния вместо
129
128
  того, чтобы сделать шаг.
130
129
  - **Именем состояния считается только слово из перечня.** Своё слово не говорит ни о входе, ни о
@@ -139,25 +138,33 @@ flowchart TD
139
138
  - **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**` —
140
139
  признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
141
140
  `**Поведение:** не меняется — <причина владельца>` в замысле; пустая причина не принимается.
142
- - **Что требует слова владельца, берётся списком, а не оценкой на месте.** Оценку «это
143
- безопасно» назначает тот, кому она в эту минуту удобна, и меняется она вместе с настроением
144
- разговора, а не со свойствами команды: за один заход одна и та же команда была сначала слишком
145
- опасной, чтобы её позвать, а через два хода достаточно безопасной, чтобы позвать без спроса.
146
- Недовольство владельца простоем разрешением не бывает: оно говорит, что стоять не следовало, а
147
- не что можно то, чего нельзя было ходом раньше.
141
+ - **Что требует слова владельца, берётся списком, а не оценкой на месте.** Оценку «это безопасно»
142
+ назначает тот, кому она удобна, и меняется она с настроением разговора, а не со свойствами
143
+ команды. Недовольство владельца простоем разрешением не бывает.
144
+ - **Заход работу не начинает сам.** Начало требует слова владельца в этом же заходе: передача,
145
+ состояние из хука запуска и назначенный эпик говорят, что делать, если работать, и молчат о
146
+ том, работать ли. Судится это формой реплики, а не смыслом: правка кода после пустой реплики,
147
+ одного слова или одного пути ход не заканчивает.
148
+ - **Указание работать по ходу работы покрывает все его шаги, включая меняющие историю.** Отметка
149
+ этапа, пуш и заявка предписаны им самим: спрашивают о том, чего в нём нет.
150
+ - **Вопрос, записанный прошлым заходом, вопросом владельца не становится.** Он адресован автору
151
+ передачи, и часть таких вопросов закрыта шагом работы.
152
+ - **Слово владельца об устройстве — постановка, а не решение.** Названное им обычно уже живёт в
153
+ дереве под этим самым словом: у него есть имя на экране, раздел в спеке и поле в модели. Прежде
154
+ чем строить, слово сверяется с ними, а разошлось прочтение с деревом — спрашивается владелец, до
155
+ правки: истолкованное по ближайшему коду, оно выглядит исполненной просьбой ровно до приёмки.
148
156
  - **Папка задачи заводится под любую работу, без исключений.** Исключение, у которого есть хоть
149
157
  одна законная форма, исполняется как разрешение. Заводится она до первой правки: сколько
150
158
  заходов уйдёт на работу, заранее не знает никто.
151
159
  - **Папка задачи едет в ветку коммитом, а не живёт в одном рабочем дереве.** Незакоммиченная,
152
160
  она проходит все правки без отказа, а признак отданной работы берётся из истории: отказ придёт
153
- в последней точке, когда замысел уже снят своими руками. Вне истории законен один черновик без
154
- номера.
161
+ в последней точке, когда замысел уже снят. Вне истории законен один черновик без номера.
155
162
  - **Папка задачи разбирается последним коммитом до открытия PR, а не после одобрения.** Человек
156
163
  вливает, как только видит зелёное, и закрывающему коммиту места не остаётся вовсе. Цена:
157
164
  замысла с этой минуты на диске нет, и признак отданной работы гард берёт из истории ветки.
158
165
  - **Открыв PR, исполнитель называет владельцу три вещи: номер, чего ждёт и что сделает следом.**
159
- Ждёт он прогона, следом идёт снятие черновика. Зелёный прогон однозначным не бывает: он
160
- говорит, что не сломано, и молчит о заблокированной у черновика кнопке слияния.
166
+ Ждёт он прогона, следом идёт снятие черновика. Зелёный прогон говорит, что не сломано, и молчит
167
+ о заблокированной у черновика кнопке слияния.
161
168
  - **Просьба о слиянии — отдельный ход, и раньше зелёного прогона её не бывает.** Порядок один:
162
169
  папка разобрана и запушена → PR открыт черновиком → прогон зелёный → черновик снят →
163
170
  исполнитель просит влить, называя номер.
@@ -165,14 +172,18 @@ flowchart TD
165
172
  вовсе, а открытый PR читается как приглашение влить — поэтому незаконченная работа идёт
166
173
  черновиком. Черновик снимается тем ходом, которым исполнитель говорит, что решение готово.
167
174
  - **Гард замысла — нижняя граница требования, а не его предел.** Он требует папку только под
168
- правку кода приложения, а статья выше — под любую работу. Прочитанный как признак, гард
169
- становится разрешением работать без замысла везде, куда он не смотрит.
175
+ правку кода приложения, а статья выше — под любую работу. Прочитанный как признак, он
176
+ становится разрешением работать без замысла везде, куда не смотрит.
177
+ - **Указание работать по правилу — это указание делать его шаги, включая те, что меняют
178
+ историю.** Отметка сделанного этапа, коммит, пуш и открытие заявки правилом предписаны, и
179
+ отдельного слова владельца на каждый из них не требуется: спросить надо о том, чего в правиле
180
+ нет. Ход, который довёл работу до готовности и встал перед коммитом, работу не отдал, а спрятал.
170
181
  - **Взятая задача ходом не кончается.** Заведение задачи, ветки, колонки и папки — подготовка, а
171
182
  не работа: они переводят её в состояние записанного замысла, где обязательное действие уже
172
183
  другое. Держит это страж выхода хода, называя в отказе первый этап замысла.
173
184
  - **Ожидание одной части этапа остановкой этапа не бывает.** Части, которые от ожидаемого не
174
- зависят, делаются тем же ходом. Владельцу называется, что уже сделано и что осталось на его
175
- шаг, этим ожидание и отличается от остановки.
185
+ зависят, делаются тем же ходом, а владельцу называется, что сделано и что осталось на его шаг.
186
+ Отбитая гардом команда и отклонённый вызов читаются так же: сперва делается всё, что мимо них.
176
187
  - **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом, а
177
188
  не дописывается: это первое, что читает следующий заход.
178
189
  - **Слово для нового понятия ищется в словаре дерева.** Общую часть везёт пакет, предметную
@@ -182,16 +193,15 @@ flowchart TD
182
193
  сколько задач из него выйдет, поэтому номер не может быть первым. Команда заведения
183
194
  переименовывает черновик, проставляет шапку замысла и собирает папку с образца, снимая с копий
184
195
  шапку раскладки.
185
- - **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ.
186
- - **Следующая задача берётся из замысла эпика, а список очереди работ спрашивается только там,
187
- где эпика нет.** По списку, отсортированному номером, первая задача чужого эпика неотличима от
188
- своей. Кончившийся эпик называется владельцу тем же ходом, которым берётся работа вне его.
196
+ - **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди.
197
+ - **Следующая задача берётся из замысла эпика, а список очереди работ спрашивается только там, где
198
+ эпика нет.** По списку номеров первая задача чужого эпика неотличима от своей. Кончившийся эпик
199
+ называется владельцу тем же ходом, которым берётся работа вне его.
189
200
  - **Эпик не закрывается по признаку, подтверждённому только чтением.** Признак, проверяемый
190
- глазами, называется проверенным лишь вместе с командой или замером и их выводом. Пометка
191
- «подтверждается живым замером» — обещание проверки, а не проверка.
201
+ глазами, называется проверенным лишь вместе с командой или замером и их выводом.
192
202
  - **Задачи эпика заводятся все разом, тем же ходом, что и сам эпик.** Заведение по одной прячет
193
- объём. Номера возвращаются в раздел порядка той же правкой без них «взять следующую»
194
- отвечает названием, а не карточкой. Метку эпика несёт только его карточка.
203
+ объём. Номера возвращаются в раздел порядка той же правкой: без них «взять следующую» отвечает
204
+ названием, а не карточкой.
195
205
 
196
206
  - **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка порядка задач не
197
207
  держит, а папка задачи держала бы его до слияния первой из них; каталог называет компаньон
@@ -200,9 +210,9 @@ flowchart TD
200
210
  - **Сборка по образцу начинается с чтения самого образца, а не пересказа о нём.** Пересказ лежит
201
211
  в разборе просьбы и в замысле эпика; образцом они не считаются. Повторяемая часть открывается
202
212
  целиком — обходом каталогов, а не одним файлом, за которым пришли.
203
- - **Путь к образцу лежит вне дерева и приходит в заход хуком запуска сессии.** Имя чужого дерева
204
- в файлы репозитория не пишется: там законна ссылка без имени. Каталог для записи — тот же, где
205
- лежит передача захода. Не записанный так, образец теряется на первой же чистке контекста.
213
+ - **Что действует на дерево, а не на правку, лежит вне индекса.** Путь к образцу и разрешение
214
+ работать вне эпика ветке не принадлежат: записанные файлом репозитория, они в ней и остаются,
215
+ а следующая, отведённая от главной, их не несёт. Место записи рядом с передачей захода.
206
216
  - **Закрытая работа разбирается правилами, и это шаг закрытия, а не отдельная просьба.** Что
207
217
  грузилось, что помогло и чего не хватило, видно только тому заходу, который работу вёл. Разбор
208
218
  кончается правкой слоя правил или предложением наружу; ведёт его роль разбора закрытой задачи,
@@ -213,25 +223,21 @@ flowchart TD
213
223
  - **Находки разбора ждут владельца, а в пакет уезжает только сводка наблюдений.** Предложение —
214
224
  заготовка правки чужого дерева, и уехавшая без разбора, она становится работой того, кто её не
215
225
  заказывал. Сводка уезжает всегда: она говорит, чем пользовались, и мнением не бывает.
216
- - **Дешёвый шаг закрытия идёт раньше дорогого, а прогон — после вливания.** Вливание
217
- договорённости и приведение текстов стоят минуты, прогон — окно захода. Прогон, идущий после
218
- вливания, вдобавок проверяет и его самого: идущий до, он смотрит то состояние дерева, которое
219
- в главную ветку не поедет.
226
+ - **Дешёвый шаг закрытия идёт раньше дорогого, а прогон — после вливания.** Вливание договорённости
227
+ и приведение текстов стоят минуты, прогон — окно захода. Идущий после вливания, он проверяет и его
228
+ самого: идущий до, он смотрит то, что в главную не поедет.
220
229
  - **Договорённость вливается в спек домена одним из последних коммитов ветки, до открытия PR.**
221
230
  К этому моменту код написан, привязки известны, и в главной ветке директория `proposed/` не
222
231
  появляется вовсе. Готовые к вливанию перечисляет `npm run check:specs`.
223
- - **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает то,
224
- что объясняет состоявшееся решение; остальное удаляется. Неразобранную ловит сверка очереди.
225
- - **Открытие PR и снятие черновика отбиваются, пока ветка везёт папку своей задачи.** Требование
226
- стоит здесь, а не на слиянии: слияние нажимает человек на хостинге, где гардов нет, и его отказ
227
- до владельца не доходит. Снятый черновик он читает как приглашение влить и нажимает кнопку, не
228
- дожидаясь коммита уборки, три работы подряд уехали в главную именно так. Судится содержимое
229
- ветки, а не рабочее дерево.
230
- - **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, и
232
+ - **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает то, что
233
+ объясняет решение; остальное удаляется. Неразобранную ловит сверка очереди.
234
+ - **Открытие PR и снятие черновика отбиваются, пока ветка везёт папку своей задачи.** Слияние
235
+ нажимает человек на хостинге, где гардов нет: снятый черновик он читает как приглашение влить и
236
+ кнопку нажимает, не дожидаясь коммита уборки. Судится содержимое ветки, а не рабочее дерево.
237
+ - **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, а
231
238
  первым уходит разбор просьбы — единственная запись слов владельца.
232
- - **Обход — строка `Task-folder-skip: <причина>` в PR или в самой команде.** Пустая причина
233
- обходом не считается, а сам обход снимает отказ, но не гасит строку сверки очереди — иначе он
234
- через месяц становится рабочим путём.
239
+ - **Обход — строка `Task-folder-skip: <причина>` в PR или в самой команде.** Пустая причина обходом
240
+ не считается, а сам обход снимает отказ, но не гасит строку сверки очереди.
235
241
 
236
242
  ## Чего из закона здесь нет
237
243
 
@@ -90,6 +90,11 @@ flowchart TD
90
90
  того, кто её не трогал. Ни линтер, ни сборка, ни сверка спеков времени не знают.
91
91
  - **Процедура Connect проверяется вызовом своего метода с рукописным двойником базы.** Контейнер и
92
92
  роутер поднимать не надо: спека проверяет решение, а не раскладку полей.
93
+ - **Процедуру зовёт и сквозной набор, а не только тест рядом с ней.** У сквозного набора есть
94
+ свой помощник прямого вызова, и спека берёт ответ сервера оттуда, а не поднимает экран ради
95
+ одного поля. Поэтому «тестов на процедуру нет» утверждается после поиска её имени по всему
96
+ дереву, каталоги сквозных наборов включая, а не после того, как рядом с её файлом не нашлось
97
+ файла проверки: шесть отметок покрытия подряд объявили непокрытым закрытое.
93
98
  - **Сид заводит то, без чего экран не открыть, и ничего, что гость примет за настоящее.**
94
99
  Содержимое, у которого есть автор, — отзывы, вопросы, обсуждения — гость читает как написанное
95
100
  людьми, а стенд собирается из той же базы, что и проверка глазами. Настройки владельца —
@@ -160,6 +165,17 @@ flowchart TD
160
165
  в заголовке стоит — сценарий числится покрытым, а что именно утверждается, не спрашивает никто.
161
166
  Тело читается вместе с заголовком: обещание в заголовке и утверждение в теле — два разных
162
167
  текста, и расходятся они молча.
168
+ - **Успешный ответ команды перечитывается отдельным запросом.** Код возврата говорит, что вызов
169
+ прошёл, и молчит о том, наступило ли нужное состояние: заведение задачи, отметка записи и
170
+ постановка ревьювера отвечают нулём и тогда, когда сделали не то. В отчёт идёт прочитанное, а
171
+ не заказанное.
172
+ - **Служба считается поднятой по выполненному заданию, а не по открытому порту.** Ответ на порту
173
+ говорит, что кто-то там слушает, и неотличим от прошлой сборки, оставшейся с прежнего захода:
174
+ проверяются обе стороны связи — что заказчик выбирает именно её и что задание через неё прошло.
175
+ - **Эталоны снимочного набора лежат рядом со спекой, а обновляются отдельным вызовом и читаются
176
+ глазами.** Обновление «на всякий случай» вместе с прогоном стирает разницу между починенным
177
+ видом и сломанным: обновлённый эталон делает зелёным любой кадр. Где эталоны и чем они
178
+ обновляются, называет компаньон правила.
163
179
  - **Растр браузера называется явно, иначе кадр не сходится сам с собой.** Профиль цвета, взятый у
164
180
  дисплея машины, ускоритель, считающий растр, и дорисовка кусками — каждый из трёх двигает цвет
165
181
  на единицу-другую по каналу, и видно это только там, где смешение стоит на границе округления:
@@ -176,9 +192,19 @@ flowchart TD
176
192
  Полнота теста не проверяется: сверка судит путь — сквозной он или юнит, — но не то, сколько
177
193
  из обещанного тест на этом пути закрыл. Признак пути читается из слов «Тогда» и нарочно
178
194
  молчалив: сценарий, чьё обещание человека не называет, под него не подпадает вовсе, и
179
- отметку неполноты там по-прежнему ставит рука. Договорённостей о подмене модулей тоже нет:
195
+ отметку неполноты там по-прежнему ставит рука.
196
+
197
+ Отметка покрытия стареет молча. Сверка знает идентификатор сценария против заголовка теста, а
198
+ текст отметки под ним для неё проза: он читается как действующее описание и через полгода после
199
+ того, как долг закрыли. Перечитывается отметка вместе с той правкой, которая трогает её
200
+ предмет, — иначе не перечитывает её никто. Договорённостей о подмене модулей тоже нет:
180
201
  `vi.mock` в дереве не встречается ни разу, и двойник пишется руками.
181
202
 
203
+ Наблюдения за тем, как пользуются правилами, это правило не ведёт вовсе: род события, место
204
+ записи и то, что уходит наружу, — предмет закона о наблюдаемости и правила под ним. Здесь оно
205
+ названо затем, чтобы наблюдение не путали с покрытием: покрытие говорит, что проверено, а
206
+ наблюдение — чем пользовались.
207
+
182
208
  ## Паттерны
183
209
 
184
210
  - `testing-unit` — тест на чистую функцию, на процедуру Connect и разовый тест-доказательство,
@@ -105,24 +105,25 @@ flowchart TD
105
105
  начатой работой лучше всякого другого обещания — она точна, её видно, и по ней не отличить
106
106
  сделанного от собранного. Ответ владельцу пишется после вызова, а не вместо него: реплика
107
107
  посреди хода отвечается вместе с начатым действием.
108
+ - **Слово о своей же работе судится сделанным в том же ходе.** «Не стою — продолжаю» к концу
109
+ хода подтверждается работой, а не намерением: иначе владелец читает пару «обещал — не сделал»
110
+ как ложь. Это требование к слову о дереве, обращённое на себя.
108
111
  - **Вариант, поданный владельцу, назван ценой для человека.** Сколько шагов, где человек окажется
109
- и что ему для этого нужно — без этого варианты выглядят равными, и выбор идёт по доводам со
110
- стороны кода: «меньше путей», «строку запуска не трогаем». Знание, которое делает вариант
111
- негодным, пишется в сам вариант, а не остаётся у того, кто его составил.
112
+ и что ему нужно — без этого варианты выглядят равными, и выбор идёт по доводам со стороны кода.
113
+ Знание, которое делает вариант негодным, пишется в сам вариант.
112
114
  - **Названное владельцем состояние дерева снимается вызовом раньше объяснения.** «Конфликты»,
113
115
  «прогон красный», «ветка отстала» — указание на то, что надо снять, а не тема для разбора.
114
116
  Причина называется после починки и только если её спрашивали: объяснение выглядит работой, не
115
- трогая при этом ни одной ветки. Вопрос «почему», стоящий в том же сообщении, требования снять
116
- состояние не отменяет — он идёт вторым.
117
+ трогая ни одной ветки. Вопрос «почему» в том же сообщении идёт вторым.
117
118
  - **Пересказ действующего порядка без оценки читается как одобрение.** На прямой вопрос владельца
118
119
  «как это работает» ответ фактами верен и недостаточен: устройство, названное спокойно, звучит
119
120
  принятым. Годность порядка для того, кто им пользуется, называется вместе с ним.
120
- - **Путь к файлу заданием не бывает.** Строка с адресом называет файл, а не действие;
121
- прочитанная как поручение, она даёт заходу задание, которого владелец не давал. То же и с
122
- любой репликой, где нет глагола: уточнить дешевле, чем написать полсотни файлов мимо просьбы.
121
+ - **Путь к файлу заданием не бывает.** Строка с адресом называет файл, а не действие: прочитанная
122
+ как поручение, она даёт заходу задание, которого владелец не давал. То же с любой репликой без
123
+ глагола уточнить дешевле, чем написать полсотни файлов мимо просьбы.
123
124
  - **Прерывание работы владельцем называется вслух.** Пришло задание, останавливающее начатое, —
124
- исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только потом
125
- берётся за новое. Молчание об этом владелец читает как «прежнее кончилось».
125
+ исполнитель говорит, что стоит, на чём остановлено и что будет с прежним, и только потом берётся
126
+ за новое. Молчание об этом владелец читает как «прежнее кончилось».
126
127
  - **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет — владелец
127
128
  читает отчёт как рассказ о сделанном. Называются три вещи: что стоит, чего оно ждёт и что
128
129
  владелец может решить.
@@ -130,12 +131,10 @@ flowchart TD
130
131
  и то, что за ход по ней сделано: правку файла или команду, меняющую дерево. Ход, в котором не
131
132
  было ни того ни другого, возвращается исполнителю вместе со следующим шагом из хода работы.
132
133
  Отданную и влитую работу страж не судит: она уже дождалась чужого шага.
133
- - **Снятая папка задачи снимает требование состояния, а ход не кончает.** Ход работы уезжает
134
- вместе с папкой, а папка разбирается до открытия заявки: с этой минуты и до слияния строки
135
- состояния нет вовсе, и первый признак стражу взять неоткуда. Отпускать по этому признаку ход
136
- нельзя снятая папка означает середину отдачи, а не её конец: между уборкой и заявкой работу не
137
- видит никто, кроме того, кто её сделал. Дальше ход судится вторым признаком, как всякий другой;
138
- ход, в котором заявку открыли или прочитали, второй признак пропускает сам.
134
+ - **Снятая папка задачи снимает требование состояния, а ход не кончает.** Ход работы уезжает вместе
135
+ с папкой, а папка разбирается до открытия заявки: с этой минуты и до слияния строки состояния нет
136
+ вовсе. Отпускать по этому признаку ход нельзя снятая папка означает середину отдачи, а не её
137
+ конец. Дальше ход судится вторым признаком; ход, в котором заявку открыли, его пропускает сам.
139
138
  - **Работа без ветки и без папки задачи судится тем же стражем по второму признаку.** Состояния у
140
139
  неё нет, и первый признак взять неоткуда, — но ход, в котором не было ни одной правки дерева, не
141
140
  кончается и здесь.
@@ -192,24 +191,25 @@ flowchart TD
192
191
  заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
193
192
  признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Слова «беру следующую задачу»
194
193
  гард действием не считает — ровно потому, что их и произносят вместо неё.
195
- - **Ход, отдавший работу, доводит её до снятого черновика.** Черновик читается владельцем как
196
- «работа не кончена»: кнопка слияния у него заблокирована самим хостингом, а по списку заявок
197
- готовое от недоделанного не отличить серое и там и там. Следующая задача берётся сверх этого,
198
- а не вместо: требование взять её исполняется буквально и оставляет отданное невидимым. Стережёт
199
- это гард ожидания: ход, открывший заявку, не кончается, пока состояние отданной работы не
200
- спрошено командой того же хода.
194
+ - **Ход, отдавший работу, доводит её до снятого черновика.** У черновика кнопка слияния
195
+ заблокирована хостингом, и по списку заявок готовое от недоделанного не отличить. Следующая
196
+ задача берётся сверх этого, а не вместо. Стережёт это гард ожидания: ход, открывший заявку, не
197
+ кончается, пока состояние отданной работы не спрошено командой того же хода.
198
+ - **Отказ гарда ожидания снимается обоими действиями сразу.** Взятая следующая задача уносит
199
+ признак открытой заявки с собой, и требование спросить состояние отданной работы после неё не
200
+ прозвучит уже никогда.
201
+ - **Работа, оставшаяся в рабочем дереве, ход не кончает.** Ветка впереди удалённой ссылки без
202
+ открытой заявки — сделанное, которого не видит никто; страж читает это без сети.
201
203
  - **«Жду прогона» — утверждение о чужом шаге, а не состояние работы.** Прогон бывает зелёным час,
202
204
  а бывает не встав вовсе — и второе само не чинится. Слово это требует команды того же хода,
203
205
  которая прогон показывает, и без неё не говорится: сказанное без команды владелец читает как
204
206
  «работа ещё идёт» и ждёт напрасно. Держит это гард утверждения, а не память исполнителя.
205
- - **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
206
- запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
207
- следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
208
- повторяется вовсе, и оба исхода со стороны выглядят одинаково — работа не двигается.
207
+ - **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание в
208
+ фоне возвращает исполнителя к заявке само; взгляд на страницу либо повторяется вхолостую, либо
209
+ не повторяется вовсе, и оба исхода выглядят одинаково работа не двигается.
209
210
  - **Ожидание своего же замера ведётся одним ожиданием, а не уведомлением на каждый шаг.**
210
- Уведомление ставится там, где на каждое событие надо действовать; где значим только итог —
211
- одно ожидание, кончающееся вместе с замером. Иначе замер назначает себе ход на каждый свой
212
- шаг, а наполнить их нечем.
211
+ Уведомление ставится там, где надо действовать на каждое событие; где значим только итог —
212
+ одно ожидание, кончающееся вместе с замером.
213
213
  - **Отказ гарда кончает ход.** Другого пути к отбитой правке не ищут: ни командой оболочки, ни
214
214
  соседним инструментом, ни правкой самого гарда. Отбитая правка либо делается после того, как
215
215
  условие отказа выполнено, либо не делается вовсе — и тогда владельцу называется отказ, а не
@@ -242,30 +242,29 @@ flowchart TD
242
242
  заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт.
243
243
  - **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование спросить
244
244
  владельца относится к действию, а не к ходу: работа, у которой отделима часть без последствий,
245
- делится, а не откладывается целиком. Список вариантов, поданный вместо работы, читается как
246
- работа — тем полнее, чем аккуратнее он составлен: он пронумерован, в нём названы цифры, и именно
247
- поэтому пустота хода за ним не видна. Владельцу называется, что уже сделано и что осталось за
248
- его словом, — а не выбор из вариантов вместо и того и другого.
245
+ делится, а не откладывается целиком. Список вариантов вместо работы читается как работа — тем
246
+ полнее, чем аккуратнее составлен: пронумерован, с цифрами, и пустота хода за ним не видна.
247
+ Владельцу называется, что уже сделано и что осталось за его словом.
249
248
  - **Признак необратимости берётся из списка, а не выводится доводом.** Список составлен тем, кто
250
- обратимость уже взвесил. Довод «действие уходит наружу и не откатывается» приходит в контекст
251
- всегда, а список — только когда его прочитали, и применённый поверх списка довод отменяет
252
- список молча: со стороны это выглядит осторожностью, а не пропуском шага. Действия, которого в
253
- списке нет, исполнитель на слово владельца не гейтит, даже если оно уходит наружу; шаг, снятый
254
- разбором прошлого промаха, — тем более.
249
+ обратимость уже взвесил. Довод «уходит наружу и не откатывается» приходит всегда, а список —
250
+ только когда его прочитали, и довод поверх списка отменяет его молча: со стороны это выглядит
251
+ осторожностью, а не пропуском шага. Действия вне списка исполнитель не гейтит.
255
252
  - **Ход, в котором исполнитель признал промах, не заканчивается, пока записи о происшествии нет.**
256
- Отбивает гард происшествия — на завершении хода: к моменту признания промах уже случился, и
257
- ловить раньше нечего. Признание ловится набором образцов, а не пониманием смысла; промах,
258
- признанный словами вне набора, гард пропускает, и это его известная граница, а не обещание.
253
+ Отбивает гард происшествия — на завершении хода: к моменту признания промах уже случился.
254
+ Каталог записей называет компаньон правила, имя файла дата и чем был промах, форму держит
255
+ образец раскладки. Признание ловится набором образцов: промах, признанный словами вне набора,
256
+ гард пропускает.
259
257
  - **Заход, начатый с передачи, входит в работу тем же правилом, что и всякий другой.** Передача
260
258
  лежит вне дерева, её не читает ни одна проверка, и написана она вчера: всё, что в ней стоит,
261
259
  проверяется деревом. Порядок входа — четыре шага в паттерне возвращения; стережёт его гард, а не
262
- память: порядок, записанный только словами, исполняется, пока о нём помнят.
260
+ память.
263
261
  - **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход работы
264
262
  отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт предупреждение с
265
263
  готовой командой, но сессию не рвёт.
266
264
  - **Заполненное окно кончает ход только там, где сжатия нет.** Где оно объявлено, окно —
267
265
  продолжение хода: заход сжимается и работает дальше, а порог остановки срабатывает лишь тогда,
268
- когда сжатие не пришло.
266
+ когда сжатие не пришло. Ход, закрытый ниже порога, теряет остаток окна, за
267
+ который дерево заплатило настройкой, и ловит это один владелец.
269
268
  - **Заполнение окна захода стережёт гард, а не память исполнителя.** На первом пороге он
270
269
  напоминает выбирать точку остановки, на втором отбивает всё, кроме записи хода работы, передачи
271
270
  и команд поставки. Размер окна и оба порога дерево задаёт само; не задавшее размера стража не
@@ -279,6 +278,10 @@ flowchart TD
279
278
  сделанное, следующий шаг и особенности захода. В историю она не едет — иначе рядом с ходом
280
279
  работы заводится вторая запись об одном и том же.
281
280
 
281
+ - **Вариант, глушащий проверку, в меню не ставится вовсе.** Выключенное правило линтера, строка
282
+ в списке известного, выведенный из-под проверки файл — все они чинят показание, а не то, на что
283
+ она указала, и вариант этот в меню самый дешёвый. Меню собирается после того, как он вычеркнут.
284
+
282
285
  ## Чего из закона здесь нет
283
286
 
284
287
  Полноту сказанного владельцу не проверяет ничто: гард утверждения ловит слово-утверждение и
@@ -273,3 +273,12 @@ npx agent-kit propose # отправить груз в приём: сво
273
273
  совпадение текста. Признак один, и он читается, а не ищется: до того как в своей проверке
274
274
  заводится разбор списка, чтение настройки или сравнение с накопленным, смотрят, что
275
275
  экспортирует модуль настройки проверок и чем живут соседние проверки.
276
+ - **Правило, загруженное инструментом, бывает показано не целиком, и обрыв ничем не помечен.**
277
+ Длинный файл приезжает в контекст обрезанным по строке, а снаружи это выглядит концом: показанное
278
+ кончается осмысленным пунктом, и число разделов с оглавлением никто не сверяет. Бьёт обрыв ровно
279
+ по хвосту, а хвост — то место, где дерево отменяет умолчания пакета: разделы надстройки сливаются
280
+ по совпавшему заголовку и новыми уходят в конец. Заход, читавший правило до конца по своему
281
+ ощущению, исполнил пакетный образец буквально и открыл заявку черновиком там, где дерево
282
+ черновиков не держит вовсе. Отсюда порядок: решение о порядке работы принимается только после
283
+ того, как показанные строки сверены с длиной файла — одной командой, — а расходятся они, файл
284
+ дочитывается чтением.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rt-tools/agent-kit",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Переносимый слой правил для агента: законы, хуки, проверки и агенты, раскладываемые в репозиторий одной командой",
5
5
  "author": "RT Team",
6
6
  "license": "Apache-2.0",
Binary file
Binary file