@rt-tools/agent-kit 0.14.0 → 0.16.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 (90) hide show
  1. package/README.md +17 -0
  2. package/assets/checks/archive-age.mjs +107 -0
  3. package/assets/checks/archive-prune.mjs +46 -0
  4. package/assets/checks/check-archive-age.mjs +42 -0
  5. package/assets/checks/check-board.github.mjs +16 -0
  6. package/assets/checks/check-descriptions.mjs +123 -0
  7. package/assets/checks/check-dupes.mjs +31 -3
  8. package/assets/checks/check-file-size.mjs +47 -2
  9. package/assets/checks/check-turn-map.mjs +20 -3
  10. package/assets/checks/lib-common.mjs +12 -1
  11. package/assets/checks/lib-domains.mjs +1 -1
  12. package/assets/checks/rt-kit-checks.config.mjs +24 -1
  13. package/assets/checks/spec-anchors.mjs +18 -3
  14. package/assets/checks/spec-common.mjs +5 -1
  15. package/assets/defaults/project.sh +22 -17
  16. package/assets/defaults/turn-map.md +15 -19
  17. package/assets/docs/GLOSSARY.md +52 -58
  18. package/assets/hooks/rule-article.sh +12 -0
  19. package/assets/hooks/skill-gate.sh +5 -4
  20. package/assets/hooks/task-flow-guard.sh +20 -0
  21. package/assets/hooks/turn-exit-guard.sh +229 -4
  22. package/assets/laws/delivery.md +92 -104
  23. package/assets/laws/frontend-application.md +4 -0
  24. package/assets/laws/project-documentation.md +64 -68
  25. package/assets/laws/verifiability.md +32 -33
  26. package/assets/laws/work-conduct.md +167 -157
  27. package/assets/patterns/doc-style-sweep.md +1 -1
  28. package/assets/patterns/doc-style-trace.md +1 -1
  29. package/assets/patterns/git-workflow-commit.azure.md +1 -1
  30. package/assets/patterns/git-workflow-commit.github.md +7 -1
  31. package/assets/patterns/git-workflow-commit.gitlab.md +1 -1
  32. package/assets/patterns/git-workflow-docker.md +1 -1
  33. package/assets/patterns/git-workflow-merge.md +14 -3
  34. package/assets/patterns/git-workflow-pr.azure.md +1 -1
  35. package/assets/patterns/git-workflow-pr.github.md +1 -1
  36. package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
  37. package/assets/patterns/git-workflow-restart.md +1 -1
  38. package/assets/patterns/git-workflow-secrets.md +1 -1
  39. package/assets/patterns/git-workflow-stack.md +93 -0
  40. package/assets/patterns/seo-page.md +1 -1
  41. package/assets/patterns/spec-driven-rule.md +55 -0
  42. package/assets/patterns/status-report-table.github.md +88 -0
  43. package/assets/patterns/task-flow-archive.md +3 -4
  44. package/assets/patterns/task-flow-close.md +6 -1
  45. package/assets/patterns/task-flow-start.md +17 -5
  46. package/assets/patterns/ts-procedure.md +1 -1
  47. package/assets/pitfalls/doc-style.md +5 -0
  48. package/assets/pitfalls/git-workflow.github.md +47 -0
  49. package/assets/pitfalls/task-flow.md +28 -0
  50. package/assets/pitfalls/testing.md +14 -0
  51. package/assets/pitfalls/turn-conduct.md +33 -0
  52. package/assets/rules/angular-patterns.md +1 -1
  53. package/assets/rules/api-layer.md +3 -3
  54. package/assets/rules/browser-verification.md +15 -1
  55. package/assets/rules/dependencies.md +1 -1
  56. package/assets/rules/deploy-flow.azure.md +1 -1
  57. package/assets/rules/deploy-flow.github.md +1 -1
  58. package/assets/rules/deploy-flow.gitlab.md +1 -1
  59. package/assets/rules/doc-style.md +18 -0
  60. package/assets/rules/entity-conventions.needs-admin.md +1 -1
  61. package/assets/rules/entity-models.md +1 -1
  62. package/assets/rules/git-workflow.azure.md +1 -1
  63. package/assets/rules/git-workflow.github.md +154 -181
  64. package/assets/rules/git-workflow.gitlab.md +1 -1
  65. package/assets/rules/lib-layers.md +1 -1
  66. package/assets/rules/observability.needs-app.md +1 -1
  67. package/assets/rules/platform-access.md +1 -1
  68. package/assets/rules/reuse-first.md +1 -1
  69. package/assets/rules/seo.md +4 -3
  70. package/assets/rules/shared-code.md +1 -1
  71. package/assets/rules/spec-driven.md +68 -1
  72. package/assets/rules/status-report.md +97 -0
  73. package/assets/rules/styling-bem.md +12 -0
  74. package/assets/rules/task-flow.md +102 -100
  75. package/assets/rules/testing.md +67 -66
  76. package/assets/rules/turn-conduct.md +146 -105
  77. package/assets/rules/turn-entry.md +7 -1
  78. package/assets/rules/typescript-conventions.md +1 -1
  79. package/assets/skills/agent-kit-extend.md +1 -1
  80. package/assets/skills/agent-kit.md +18 -1
  81. package/bin/agent-kit.d.ts.map +1 -1
  82. package/bin/agent-kit.js +25 -0
  83. package/bin/agent-kit.js.map +1 -1
  84. package/lib/cost.d.ts +44 -0
  85. package/lib/cost.d.ts.map +1 -0
  86. package/lib/cost.js +181 -0
  87. package/lib/cost.js.map +1 -0
  88. package/package.json +1 -1
  89. package/rt-tools-agent-kit-0.16.0.tgz +0 -0
  90. package/rt-tools-agent-kit-0.14.0.tgz +0 -0
@@ -2,7 +2,7 @@
2
2
  name: spec-driven
3
3
  kind: rule
4
4
  law: project-documentation
5
- description: Правило под «Закон о документации проекта». Брать при правке docs/specs/**, docs/constitution/** и любого скила в .claude/skills. Называет три слоя — закон, правило, паттерн, — обязательные разделы, привязку к коду и связь сценариев с тестами. Готовый порядок действий — в паттернах spec-driven-domain и spec-driven-rule.
5
+ description: Правило под «Закон о документации проекта». Брать при правке спеков, законов и любого скила. Называет три слоя — закон, правило, паттерн, — обязательные разделы, привязку к коду и связь сценариев с тестами. Паттерны: spec-driven-domain, spec-driven-rule.
6
6
  ---
7
7
 
8
8
  # Документация проекта — как это устроено здесь
@@ -124,11 +124,28 @@ flowchart TD
124
124
  рядом с проверкой.
125
125
  - **Закон, назвавший файл проекта, — отказ.** Путям и привязкам место в правиле: иначе закон
126
126
  нельзя ни прочитать без знания дерева, ни применить на другом приложении.
127
+ - **Описание правила не длиннее трёхсот знаков и отвечает на один вопрос — брать это правило
128
+ или нет.** Описание едет в системный промпт каждого захода целиком, и платит его заход, чем бы
129
+ ни занимался: тем оно и отличается от тела правила, которое исполнитель читает сам. Растёт оно
130
+ само — его пишут вслед за правилом и пересказывают в нём содержимое, — а пересказ приходит
131
+ вторым разом вместе с самим правилом. Считает длину проверка описаний; оставленное длиннее
132
+ предела называется в перечне принятого долга поимённо, с причиной.
133
+
127
134
  - **Правило объявляет закон, под который написано.** Правило без закона — набор приёмов, из
128
135
  которого не видно, что именно должно быть верно.
129
136
  - **Слоёв законов два, а имя закона одно на оба.** Общий лежит в корне конституции, закон
130
137
  приложения — в `application/`; ни `law:`, ни `**Законы:**` слоя не называют, поэтому имена
131
138
  законов уникальны по всему дереву конституции.
139
+ - **Расхождение правила и его компаньона решается в пользу правила.** Компаньон называет имена
140
+ дерева и привязки статей, а не отменяет их: прочитанный старше правила, он становится местом,
141
+ где требование снимается молча и без разбора. Предметность доводом тут не бывает — компаньон
142
+ предметнее всегда, на то он и компаньон. Найденное расхождение называется владельцу и чинится
143
+ в том тексте, который отстал, а работа до этого идёт по правилу.
144
+ - **Утверждение компаньона о состоянии внешней службы проверяется командой, которую он сам
145
+ называет.** Ограничение соседа снимается вместе с чужой настройкой, а текст о нём остаётся
146
+ стоять в настоящем времени и после снятия выглядит верным: действующее от снятого отличает
147
+ только вызов. Компаньон поэтому пишет способ спросить, а не снимок ответа, — и велеть по
148
+ такому снимку обратное тому, что говорит правило, он не вправе.
132
149
  - **У правила бывает третий файл, и в него уходит то, что при решении не читают.** Ловушки и
133
150
  поведение по разборам происшествий нужны не тому, кто принимает обычное решение, а тому, кто
134
151
  разбирает промах или спорит с гардом, — а грузятся они вместе с правилом каждый раз и растут
@@ -175,12 +192,52 @@ flowchart TD
175
192
  знает; куда девается принятое решение — не знает и не узнает: отличить действующее требование
176
193
  от рассказа о состоявшемся может только тот, кто спросит «останется ли это верным завтра».
177
194
  Держится это шагом разбора закрытой работы и признаком отбора, записанным там заранее.
195
+ - **Имя в якоре записывается так, как объявлено в коде.** Приватное поле класса стоит с
196
+ решёткой, и записанное без неё имя называет не тот символ: проверка остаётся зелёной, а
197
+ читателю по строке привязки не видно, приватный это метод или соседний с ним обычный. Прежняя
198
+ форма при этом законна — имя без решётки помнится наравне с ним самим.
178
199
  - **Якорь сверяется по сырому тексту файла, и комментарий засчитывается наравне с кодом.**
179
200
  Существование символа проверка ищет словом по всему файлу, не вычищая комментарии, а живость
180
201
  считает только у объявленного в коде. Имя, стоящее в одном лишь пояснении, проходит мимо обеих
181
202
  сторон: якорем утверждения оказывается слово из комментария, тогда как объявление рядом
182
203
  называется иначе.
183
204
 
205
+ ## Форма сжатой статьи
206
+
207
+ Правило грузится в заход целиком и платит за это каждый заход, чем бы он ни занимался. Замер
208
+ называет, где вес: в двадцати девяти грузимых правилах 289 440 знаков, раздел статей — 45% из
209
+ них, а внутри раздела утверждения занимают 19%, доводы при них — 81%. Режется поэтому довод, а
210
+ не утверждение: снятое утверждение меняет правило, снятый довод — только его цену.
211
+
212
+ У абзаца при статье три исхода, и выбирают между ними одним вопросом: **что этот текст нужен
213
+ сделать — принять решение, не отменить его или разобрать промах?**
214
+
215
+ | Текст нужен, чтобы… | Исход |
216
+ | ------------------------------------------------------------- | ------------------------------ |
217
+ | принять решение по правке: что считается верным, где граница | остаётся при статье дословно |
218
+ | не отменить решение через месяц: почему именно так | сворачивается до одной строки |
219
+ | разобрать промах или спорить с гардом | уезжает в холодную часть целиком |
220
+
221
+ - **При статье остаётся утверждение и то, без чего оно читается неверно.** Граница, исключение,
222
+ признак применимости, имя того, кто это стережёт. Проверяется отниманием: снятый кусок меняет
223
+ ответ на вопрос «так делать или нет» — значит он не лишний.
224
+ - **Довод сворачивается до одной строки: цена промаха, а не его история.** «Иначе прогон зелёный,
225
+ а проверяет он уже не то» — это довод. Когда это случилось, сколько раз подряд и в какой ветке
226
+ — уже история, и её место в холодной части.
227
+ - **В холодную часть уезжает разбор происшествия целиком, вместе с числами и отвергнутыми
228
+ вариантами.** Она грузится по требованию — тем, кто разбирает промах, — и растёт свободно:
229
+ цену за неё платит один заход из сотни, а не каждый.
230
+ - **Холодная часть держит объяснение, а не требование.** Утверждения, которого нет в правиле, в
231
+ ней не бывает: правило, чьё требование живёт в холодной части, обещает то, чего грузящий его
232
+ заход не увидит. Проверяется тем же вопросом наоборот — по холодной части нельзя принять ни
233
+ одного решения, которого не принять по правилу.
234
+ - **Сжатие судится в пересказе, а не в исходнике.** Статья, сжатая верно, пересказывается тем же
235
+ решением: тот, кто прочёл только её, правит так же, как читавший прежнюю. Разошлись — снято
236
+ лишнее, и снятое возвращается при статье, а не в холод.
237
+ - **Правило без холодной части законно, и заводится она первым же уехавшим абзацем.** Пустой
238
+ `pitfalls.md` рядом — обещание, а не механизм: в замере из двадцати девяти правил у четверых
239
+ самых тяжёлых холодной части нет вовсе, и весь их разбор происшествий грузится каждый заход.
240
+
184
241
  ## Чего из закона здесь нет
185
242
 
186
243
  Закон, которого не применяет ни один спек, отказом не считается: законы про устройство кода,
@@ -207,6 +264,16 @@ flowchart TD
207
264
  у него на промахе, который правится не у него, проверка не должна. Согласие двух текстов между
208
265
  собой не считается нигде и ни у кого: оно ищется чтением.
209
266
 
267
+ Форму сжатой статьи не проверяет ничто, и проверки на неё не будет: машине видно число знаков,
268
+ но не то, принимается ли по сжатой статье прежнее решение. Довод, вырезанный вместе с границей
269
+ утверждения, короче правильного и проходит любой счёт знаков. Стережёт это одно — предел длины
270
+ текста: он говорит, что правило переросло, и молчит о том, что именно из него резать. Судится
271
+ сжатие пересказом, и судит его тот, кто правит по сжатой статье следующим.
272
+
273
+ Долю довода в правиле не считает ничто. Замер, на котором стоит форма, сделан разовым проходом
274
+ и в дерево не поехал: он отвечает на вопрос «где вес», а не «сошлось ли», и повторяют его тогда,
275
+ когда снова спрашивают о весе.
276
+
210
277
  ## Паттерны
211
278
 
212
279
  - `spec-driven-domain` — заведение и правка спека домена, сценарии, привязка.
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: status-report
3
+ kind: rule
4
+ law: work-conduct
5
+ description: Правило под «Закон о ведении работы». Брать, когда владелец спросил, где стоит работа: «какой статус», «что за эпик», «что сейчас делаешь». Называет форму ответа — абзац об эпике и таблицу его задач — и чем клетка о дереве подпирается. Паттерн status-report-table.
6
+ ---
7
+
8
+ # Ответ о состоянии работы
9
+
10
+ Правило под закон о ведении работы. Закон говорит, что состояние работы
11
+ переживает заход и читается со стороны; здесь — в какой форме оно показывается владельцу,
12
+ когда он спросил.
13
+
14
+ ## Как это называется здесь
15
+
16
+ | В законе | Здесь |
17
+ | ---------------------------- | ------------------------------------------------------------------- |
18
+ | состояние работы | клетка «Состояние» в таблице ответа |
19
+ | место, где состояние читают | ответ владельцу и запись хода в папке задачи |
20
+ | работа, о которой спросили | абзац об эпике, под ним все его задачи по порядку и заведённые вне |
21
+ | отметка о сделанном | номер прогона, номер заявки, число сценариев — а не слово «готово» |
22
+ | чем состояние подтверждается | команда, запущенная тем же ходом, что и ответ |
23
+
24
+ ## Где это лежит
25
+
26
+ Готовые вызовы и образец заполненной таблицы — в паттерне `status-report-table` рядом. Здесь
27
+ сказано, что в ответе обязано быть; чем это спрашивается у хостинга и у дерева — там.
28
+
29
+ ## Ход
30
+
31
+ Ход одного ответа о состоянии: что спрашивается у дерева до первой строки ответа и в каком
32
+ порядке это ложится владельцу.
33
+
34
+ ```mermaid
35
+ flowchart TD
36
+ A[Владелец спросил, где работа] --> B[Состояние спрашивается командами: ветка, заявка, прогон, борда]
37
+ B --> C{Работа идёт под эпиком}
38
+ C -->|Да| D[Из замысла эпика берётся его порядок задач целиком]
39
+ C -->|Нет| E[Строка текущей задачи встаёт первой]
40
+ D --> F[Строка на каждую задачу эпика: номер по порядку, о чём она, состояние]
41
+ F --> E
42
+ E --> G[Строка на каждую заведённую вне эпика]
43
+ G --> H[Клетка «Состояние» несёт число из вывода команды]
44
+ H --> I[Под таблицей — чего ждём от владельца и вызов, которым это снимается]
45
+ ```
46
+
47
+ ## Как закон применяется здесь
48
+
49
+ - **Состояние работы показывается таблицей, а не прозой.** Пересказ владелец читает целиком,
50
+ чтобы найти одну строку, и в следующий раз не читает вовсе.
51
+ <!-- rt-when: ответ владельцу о состоянии работы -->
52
+
53
+ - **Сам эпик описывается текстом над таблицей, а не строкой в ней.** Колонки заведены под
54
+ задачу — номер, предмет, состояние, — и эпик, втиснутый в них, теряет то единственное, ради
55
+ чего он назван: зачем он и куда идёт. Абзац говорит это одной-двумя фразами и называет,
56
+ сколько в эпике задач и какая идёт сейчас.
57
+ <!-- rt-when: ответ владельцу о состоянии работы -->
58
+
59
+ - **Задачи эпика перечисляются все и в том порядке, в каком их назначил замысел.** Названы
60
+ только сделанная и следующая — владелец не видит ни сколько осталось, ни куда идёт работа, а
61
+ порядок эпика назначен заранее и держится до конца. У каждой строки — краткое описание,
62
+ своими словами и одной фразой: номер задачи о её предмете не говорит ничего.
63
+ <!-- rt-when: ответ владельцу о состоянии работы -->
64
+
65
+ - **Каждая клетка о состоянии дерева подпирается командой, запущенной тем же ходом.**
66
+ Утверждение без команды владелец читает как проверенный факт и о расхождении узнаёт
67
+ последним. Вывод называется числом — номером прогона, временем, сколько сценариев из
68
+ скольких; «всё зелёное» без числа не пишется.
69
+ <!-- rt-when: ответ владельцу о состоянии работы -->
70
+
71
+ - **Прогон подтверждает тот коммит, на котором он запускался.** Прогон старше вершины ветки
72
+ говорит о прошлом дереве, а прочитан будет как о нынешнем; вершина сверяется перед тем, как
73
+ номер прогона встанет в клетку.
74
+ <!-- rt-when: ответ владельцу о состоянии работы -->
75
+
76
+ - **Заявка черновиком называется вслух вместе с тем, чего ждём.** У черновика слияние
77
+ заблокировано хостингом, и зелёная страница владельцу ничего не разрешает; молчание он
78
+ читает как поломку.
79
+ <!-- rt-when: ответ владельцу о состоянии работы -->
80
+
81
+ - **Папка задачи, оставшаяся пустым шаблоном, — это «заведена, не начата».** Заведённая задача
82
+ с незаполненным разбором читается как работа в ходу и второй раз заводится заново.
83
+ <!-- rt-when: ответ владельцу о состоянии работы -->
84
+
85
+ - **Под таблицей — не больше двух строк.** Чего ждём от владельца и вызов, которым это
86
+ снимается. Остальное владелец спросит сам, и спросит ровно то, что ему нужно.
87
+ <!-- rt-when: ответ владельцу о состоянии работы -->
88
+
89
+ ## Чего из закона здесь нет
90
+
91
+ Ни одна из договорённостей о форме ответа не проверяется машиной: ответ владельцу в дерево не
92
+ ложится, и читать его нечему. Держится это памятью отвечающего, а видно нарушение только
93
+ владельцу — по тому, что он ищет в тексте строку и не находит.
94
+
95
+ ## Паттерны
96
+
97
+ - `status-report-table` — готовые вызовы для каждой клетки и образец заполненной таблицы.
@@ -78,6 +78,18 @@ flowchart TD
78
78
  занимает тот же номер, ничего об этом не узнав.
79
79
  <!-- rt-when: *.scss *.css -->
80
80
 
81
+ - **Предел ширины объявляется вместе с судьбой не влезшего.** Предел и место в строке сами по
82
+ себе ничего не прячут и не переносят: у узла, который может получить значение длиннее своего
83
+ места, стоит либо обрезка с многоточием, либо перенос. Без этого текст молча вылезает за
84
+ границы и ложится поверх соседа, а разрешение элементу сжаться обрезкой не является.
85
+ <!-- rt-when: *.scss *.css -->
86
+
87
+ - **Обрезка идёт в паре с подсказкой.** Обрезок без подсказки читается как целое значение:
88
+ узнать, где текст кончается на самом деле, человеку неоткуда. Значение целиком он видит либо
89
+ в самом месте, либо при наведении — и подсказка, которой поставлен свой предел ширины,
90
+ подчиняется статье выше наравне с ячейкой.
91
+ <!-- rt-when: *.scss *.css -->
92
+
81
93
  - **Размер элемента управления выбирается по признаку указателя, а не по ширине экрана.**
82
94
  Планшет в ландшафте шире порога узкого вьюпорта, а нажимают по нему пальцем: `pointer: coarse`
83
95
  отвечает про способ нажатия, ширина — про место под раскладку. Ступени берутся у кита, а не
@@ -2,7 +2,7 @@
2
2
  name: task-flow
3
3
  kind: rule
4
4
  law: work-conduct
5
- description: Правило под «Закон о ведении работы» — та его часть, что про ход работы от просьбы владельца до слияния. Брать в начале любой работы от владельца, при правке папок задач и договорённостей о продукте, при возвращении к незаконченной задаче. Называет разбор просьбы до первой правки, папку задачи по имени ветки, состояния работы и их обязательные действия, договорённость о продукте до кода, разбор папки при закрытии. Готовый порядок — в паттернах task-flow-start, task-flow-resume, task-flow-close и task-flow-archive. Чем кончается ход и что стерегут стражи — правило turn-conduct.
5
+ description: Правило под «Закон о ведении работы» — ход работы от просьбы владельца до слияния. Брать в начале любой работы, при правке папок задач и договорённостей о продукте, при возвращении к незаконченной задаче. Паттерны: task-flow-start, -resume, -close, -archive. Конец хода — правило turn-conduct.
6
6
  ---
7
7
 
8
8
  # Ведение работы — как это устроено здесь
@@ -112,123 +112,119 @@ flowchart TD
112
112
  ```
113
113
 
114
114
  ## Как закон применяется здесь
115
-
116
115
  - **Правка кода приложения отбивается, пока работа не дошла до состояния, в котором код
117
116
  правится.** Гард требует четыре вещи: папку задачи по имени ветки, замысел в ней, объявленное
118
117
  в ходе работы состояние и названную в замысле договорённость о продукте.
119
- - **Гард судит объявленный переход, а не наличие файлов.** Артефакт на диске не говорит, дошла
120
- ли работа до правки кода: пустой замысел, положенный ради снятия отказа, лежит так же, как
121
- написанный. Отказ снимает объявленное состояние, и снимают его три — `этап-идёт`,
122
- `этапы-кончились` и `разбор-кончился`. Четвёртый путь у отказа не состояние, а история ветки:
123
- папка, разобранная её коммитом, означает отданную работу, и правка по замечаниям разбора идёт
124
- без замысла на диске — объявить состояние после уборки уже нечем. Прогон бывает красным, а
125
- разбор — с замечаниями, и починка идёт в ту же ветку.
118
+ - **Гард судит объявленный переход, а не наличие файлов.** Пустой замысел, положенный ради
119
+ снятия отказа, лежит так же, как написанный, поэтому отказ снимает объявленное состояние
120
+ `этап-идёт`, `этапы-кончились`, `разбор-кончился`. Четвёртый путь не состояние, а история
121
+ ветки: папка, разобранная её коммитом, означает отданную работу, и правка по замечаниям идёт
122
+ без замысла на диске.
126
123
  - **Отказ по состоянию называет обязательное действие того состояния, которое объявлено.**
127
124
  Исполнитель, которому сказано только «не в том состоянии», перепишет строку состояния вместо
128
125
  того, чтобы сделать шаг.
129
- - **Именем состояния считается только слово из перечня.** Своё слово не говорит ни о входе, ни
130
- о выходе, ни об обязательном действии, а перечень называет все три.
131
- - **Состояние судится раньше договорённости и её обхода.** Строка о неизменном поведении
132
- снимает требование договорённости о продукте, а не требование дойти до правки кода.
126
+ - **Именем состояния считается только слово из перечня.** Своё слово не говорит ни о входе, ни о
127
+ выходе, ни об обязательном действии, а перечень называет все три.
128
+ - **Состояние судится раньше договорённости и её обхода.** Строка о неизменном поведении снимает
129
+ требование договорённости о продукте, а не требование дойти до правки кода.
133
130
  - **Влитая договорённость ветку не запирает.** После вливания директории «предложено» на диске
134
131
  нет, а замысел на неё ссылается до конца работы: гард отличает влитое от незаведённого по
135
- истории ветки и пропускает первое. Иначе последний коммит PR закрывал бы дорогу правкам
136
- по замечаниям разбора.
137
- - **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**`
138
- признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
139
- `**Поведение:** не меняется <причина владельца>` в замысле; пустая причина не
140
- принимается.
141
- - **Папка задачи заводится под любую работу, без исключений.** Прежде правило судило по числу
142
- заходов: работа в один коммит помещалась в тело PR и папки не заводила. Исключение,
143
- у которого есть хоть одна законная форма, исполняется как разрешение за один заход оно
144
- дважды стало поводом обойти отказ гарда, вместо того чтобы завести папку и пойти дальше.
145
- Заводится она всегда и до первой правки; сколько заходов уйдёт на работу, заранее не знает
146
- никто.
147
- - **Папка задачи разбирается последним коммитом до открытия PR, а не после одобрения.** Прежде
148
- она стояла после: пока идёт разбор, замысел нужен на диске, иначе правку по замечаниям
149
- отбивает гард. Но кнопку слияния нажимает человек на хостинге, куда гард не достаёт, и
150
- вливает он, как только видит зелёное, закрывающему коммиту места не остаётся вовсе. Трижды
151
- подряд папка уехала в главную ветку неразобранной, и разобрать её было уже некому: работа
152
- перешла к следующей задаче, а PR закрылся. Цена перестановки названа прямо: замысла с этой
132
+ истории ветки. Иначе последний коммит PR закрывал бы дорогу правкам по замечаниям.
133
+ - **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**` —
134
+ признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход строка
135
+ `**Поведение:** не меняется <причина владельца>` в замысле; пустая причина не принимается.
136
+ - **Папка задачи заводится под любую работу, без исключений.** Исключение, у которого есть хоть
137
+ одна законная форма, исполняется как разрешение. Заводится она всегда и до первой правки:
138
+ сколько заходов уйдёт на работу, заранее не знает никто.
139
+ - **Папка задачи едет в ветку коммитом, а не живёт в одном рабочем дереве.** Гард спрашивает её
140
+ с диска, и папка, ни разу не закоммиченная, проходит все правки без единого отказа — а признак
141
+ отданной работы берётся из истории, и там её нет. Отказ приходит в последней точке, на
142
+ открытии заявки, когда папка уже разобрана своими руками: чинить нечего, замысел снят, и
143
+ собирать его приходится заново по памяти. Второе следствие тише: ход работы, живущий в
144
+ рабочем дереве, не виден никому владелец видит ветку без единого следа того, что в ней
145
+ делается, а следующий заход находит пустоту вместо «Где стоим». Вне истории законен один
146
+ черновик без номера: заводить в неё нечего, пока нет имени.
147
+ - **Папка задачи разбирается последним коммитом до открытия PR, а не после одобрения.** Кнопку
148
+ слияния нажимает человек на хостинге, куда гард не достаёт, и вливает он, как только видит
149
+ зелёное, закрывающему коммиту места не остаётся вовсе. Цена перестановки: замысла с этой
153
150
  минуты на диске нет, и признак отданной работы гард берёт из истории ветки.
154
- - **Открыв PR, исполнитель называет владельцу три вещи: номер, чего ждёт и что сделает
155
- следом.** Ждёт он прогона до его конца о работе ничего не известно, кроме того, что она
156
- запушена. Следом идёт снятие черновика. Сказанное так владелец читает однозначно, а зелёный
157
- прогон на странице — нет: он говорит, что не сломано, и молчит о том, что кнопка слияния у
158
- черновика заблокирована.
151
+ - **Открыв PR, исполнитель называет владельцу три вещи: номер, чего ждёт и что сделает следом.**
152
+ Ждёт он прогона, следом идёт снятие черновика. Зелёный прогон на странице однозначным не
153
+ бывает: он говорит, что не сломано, и молчит о том, что кнопка слияния у черновика
154
+ заблокирована.
159
155
  - **Просьба о слиянии — отдельный ход, и раньше зелёного прогона её не бывает.** Порядок один:
160
- папка задачи разобрана и запушена → PR открыт черновиком → прогон зелёный → черновик снят →
161
- исполнитель просит влить, называя номер. До этой просьбы работа не готова, сколько бы зелёного
162
- на её странице ни было.
163
- - **PR открывается черновиком, а не в конце работы.** Пока правка кода не выложена в PR,
164
- владелец её не видит вовсе: ветка не приходит ему во входящие и обсуждения не имеет.
165
- Открытый PR при этом читается как приглашение влить — поэтому незаконченная работа идёт
166
- черновиком, и владельцу не приходится спрашивать, кончилась ли она. Черновик снимается тем
167
- ходом, которым исполнитель говорит, что решение готово.
156
+ папка разобрана и запушена → PR открыт черновиком → прогон зелёный → черновик снят →
157
+ исполнитель просит влить, называя номер.
158
+ - **PR открывается черновиком, а не в конце работы.** До открытия владелец правки не видит
159
+ вовсе, а открытый PR читается как приглашение влить поэтому незаконченная работа идёт
160
+ черновиком. Черновик снимается тем ходом, которым исполнитель говорит, что решение готово.
168
161
  - **Гард замысла — нижняя граница требования, а не его предел.** Он требует папку только под
169
- правку кода приложения, и работа, которая туда не доходит, проходит мимо него но папку
170
- заводит всё равно: статья правила говорит «под любую работу, без исключений». Прочитанный
171
- как признак, гард становится разрешением работать без замысла везде, куда он не смотрит.
172
- - **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом,
173
- а не дописывается: это первое, что читает следующий заход.
174
- - **Слово для нового понятия ищется в словаре дерева.** Общую часть словаря везёт пакет,
175
- предметную дописывает дерево надстройкой; словарь уезжает в контекст на запуске сессии
176
- целиком, поэтому «не читал» основанием не бывает.
177
- - **Папка задачи заводится черновиком и получает номер командой.** До конца разбора
178
- неизвестно, сколько задач из него выйдет, поэтому номер не может быть первым;
179
- `npm run task:new` переименовывает черновик и проставляет шапку замысла. Папку он и собирает —
180
- с образца, снимая с копий шапку раскладки: оставленная в копии, она отбивает первую же правку
181
- разбора просьбы, а отказ уводит править образец пакета вместо копии под задачу.
182
- - **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ
183
- задачи за ним ещё нет, и спросить о нём некого.
184
- - **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка в очереди работ
185
- говорит, что эпик есть, но порядка задач не держит; папка задачи держала бы его ровно до
186
- слияния первой из них. Каталог для замысла называет компаньон правила: у пакета своего пути
187
- нет, а замысел, положенный каждым заходом заново, теряет решения предыдущих.
188
- - **Сборка по образцу начинается с чтения самого образца, а не пересказа о нём.** Пересказ
189
- лежит в разборе просьбы и в замысле эпика; читаются они оба, но образцом не считаются. Часть
190
- образца, которую работа повторяет, открывается целиком — обходом каталогов, а не одним файлом,
191
- за которым пришли. Расхождение, не найденное так, находит владелец на приёмке целой работой.
192
- - **Путь к образцу лежит вне дерева и приходит в заход хуком запуска сессии.** Имя чужого
193
- дерева в файлы репозитория не пишется, поэтому ни замысел эпика, ни разбор просьбы его не
194
- держат: там законна ссылка без имени «путь к образцу лежит вне дерева». Каталог для записи
195
- тот же, где лежит передача захода; называет его компаньон правила. Не записанный так,
196
- образец теряется на первой же чистке контекста, и следующий заход собирает по памяти
197
- предыдущего.
162
+ правку кода приложения, а статья выше под любую работу. Прочитанный как признак, гард
163
+ становится разрешением работать без замысла везде, куда он не смотрит.
164
+ - **Взятая задача ходом не кончается.** Заведение задачи, ветки, колонки и папки — подготовка, а
165
+ не работа: они переводят её в состояние записанного замысла, где обязательное действие уже
166
+ другое. Граница состояния выглядит законченным куском лучше всякой вехи, а владельцу отчёт о
167
+ взятой задаче неотличим от остановки. Держит это страж выхода хода, называя в отказе первый
168
+ этап замысла.
169
+ - **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом, а
170
+ не дописывается: это первое, что читает следующий заход.
171
+ - **Слово для нового понятия ищется в словаре дерева.** Общую часть везёт пакет, предметную
172
+ дописывает дерево надстройкой; словарь уезжает в контекст на запуске сессии целиком, поэтому
173
+ «не читал» основанием не бывает.
174
+ - **Папка задачи заводится черновиком и получает номер командой.** До конца разбора неизвестно,
175
+ сколько задач из него выйдет, поэтому номер не может быть первым. Команда заведения
176
+ переименовывает черновик, проставляет шапку замысла и собирает папку с образца, снимая с копий
177
+ шапку раскладки: оставленная в копии, она отбивает первую же правку разбора просьбы.
178
+ - **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ задачи
179
+ за ним ещё нет, и спросить о нём некого.
180
+ - **Следующая задача берётся из замысла эпика, а список очереди работ спрашивается только там,
181
+ где эпика нет.** Список отсортирован номером, и по нему первая задача чужого эпика неотличима
182
+ от своей. Замысел открывается перед взятием; кончившийся эпик называется владельцу тем же
183
+ ходом, которым берётся работа вне его.
184
+ - **Эпик не закрывается по признаку, подтверждённому только чтением.** Признак, проверяемый
185
+ глазами, называется проверенным лишь вместе с командой или замером и их выводом. Пометка
186
+ «подтверждается живым замером» обещание проверки, а не проверка.
187
+ - **Задачи эпика заводятся все разом, тем же ходом, что и сам эпик.** Заведение по одной прячет
188
+ объём: на борде эпик из десяти задач выглядит одной. Номера возвращаются в раздел порядка той
189
+ же правкой без них «взять следующую» отвечает названием, а не карточкой. Метку эпика несёт
190
+ только его карточка.
191
+
192
+ - **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка говорит, что эпик
193
+ есть, но порядка задач не держит; папка задачи держала бы его ровно до слияния первой из них.
194
+ Каталог называет компаньон правила: замысел, положенный каждым заходом заново, теряет решения
195
+ предыдущих.
196
+ - **Сборка по образцу начинается с чтения самого образца, а не пересказа о нём.** Пересказ лежит
197
+ в разборе просьбы и в замысле эпика; они читаются, но образцом не считаются. Повторяемая часть
198
+ открывается целиком — обходом каталогов, а не одним файлом, за которым пришли.
199
+ - **Путь к образцу лежит вне дерева и приходит в заход хуком запуска сессии.** Имя чужого дерева
200
+ в файлы репозитория не пишется: там законна ссылка без имени. Каталог для записи — тот же, где
201
+ лежит передача захода. Не записанный так, образец теряется на первой же чистке контекста.
198
202
  - **Закрытая работа разбирается правилами, и это шаг закрытия, а не отдельная просьба.** Что
199
203
  грузилось, что помогло и чего не хватило, видно только тому заходу, который работу вёл; через
200
- сутки этого нет ни у кого. Разбор кончается правкой слоя правил или предложением наружу
201
- разбор, из которого не вышло ни того ни другого, объясняет случившееся и ничего не меняет.
202
- Ведёт его роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт разбор
203
- само, и требование от этого не слабеет.
204
+ сутки этого нет ни у кого. Разбор кончается правкой слоя правил или предложением наружу. Ведёт
205
+ его роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт разбор само.
204
206
  - **Разбор закрытой работы уходит в фон, а исполнитель берёт следующую задачу.** Роль работает
205
- своим ходом и у исполнителя ничего не спрашивает; держать ради неё заход незачем. Сводку для
206
- неё собирают до запуска пока задача ещё в голове, — а вернувшиеся находки принимают одним
207
- ходом: записать и продолжить прежнее. Порядок и место записи — паттерн закрытия работы.
207
+ своим ходом и ничего не спрашивает; держать ради неё заход незачем. Сводку собирают до запуска,
208
+ вернувшиеся находки принимают одним ходом: записать и продолжить прежнее.
208
209
  - **Находки разбора ждут владельца, а в пакет уезжает только сводка наблюдений.** Предложение —
209
- это заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении; уехавшая
210
- без разбора, она становится работой того, кто её не заказывал. Сводка наблюдений уезжает
211
- всегда: она говорит, чем пользовались и чем нет, и мнением не является.
212
- - **Договорённость вливается в спек домена одним из последних коммитов ветки, до открытия
213
- PR.** К этому моменту код написан, привязки известны, и в главной ветке директория
214
- `proposed/` не появляется вовсе.
215
- Готовые к вливанию перечисляет `npm run check:specs`.
216
- - **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает
217
- то, что объясняет состоявшееся решение; остальное удаляется. Неразобранную ловит сверка
218
- очереди работ.
219
- - **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Требование стоит здесь, а
220
- не на слиянии: слияние нажимает человек на хостинге, где гардов нет вовсе, и его отказ до
221
- владельца не доходит. На слиянии та же проверка остаётся вторым рубежом — она ловит слияние,
222
- идущее командой. Судится содержимое ветки, а не рабочее дерево: снесённая, но не
223
- закоммиченная папка въехала бы вместе с веткой.
210
+ заготовка правки чужого дерева, и уехавшая без разбора, она становится работой того, кто её не
211
+ заказывал. Сводка наблюдений уезжает всегда: она говорит, чем пользовались, и мнением не
212
+ бывает.
213
+ - **Договорённость вливается в спек домена одним из последних коммитов ветки, до открытия PR.**
214
+ К этому моменту код написан, привязки известны, и в главной ветке директория `proposed/` не
215
+ появляется вовсе. Готовые к вливанию перечисляет `npm run check:specs`.
216
+ - **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает то,
217
+ что объясняет состоявшееся решение; остальное удаляется. Неразобранную ловит сверка очереди.
218
+ - **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Требование стоит здесь, а не
219
+ на слиянии: слияние нажимает человек на хостинге, где гардов нет, и его отказ до владельца не
220
+ доходит. Судится содержимое ветки, а не рабочее дерево.
224
221
  - **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, и
225
222
  первым уходит разбор просьбы — единственная запись слов владельца. Что именно увезено,
226
223
  требование не судит: это судит владелец.
227
- - **Обход — строка `Task-folder-skip: <причина>` в PR или в самой команде.**
228
- Работа, вливаемая частями, папку до конца не разбирает. Чтение из команды работает и без
229
- сети: единственный сетевой путь отбивал бы оффлайн то самое слияние, причина которого
230
- написана в PR. Пустая причина обходом не считается, а сам обход снимает отказ, но не
231
- гасит строку сверки очереди — иначе он через месяц становится рабочим путём.
224
+ - **Обход — строка `Task-folder-skip: <причина>` в PR или в самой команде.** Работа, вливаемая
225
+ частями, папку до конца не разбирает. Чтение из команды работает и без сети. Пустая причина
226
+ обходом не считается, а сам обход снимает отказ, но не гасит строку сверки очереди — иначе он
227
+ через месяц становится рабочим путём.
232
228
 
233
229
  ## Чего из закона здесь нет
234
230
 
@@ -270,6 +266,12 @@ flowchart TD
270
266
  это. Сверять содержимое машине нечем — смотрит владелец на ревью. Отсюда же и обход: если
271
267
  работа вливается частями, папку до конца не разбирают, а причина остаётся в PR.
272
268
 
269
+ Порядок отдачи работы дерево вправе перевернуть надстройкой, и тогда часть шагов пакета
270
+ перестаёт исполняться. Какие именно — не считает ничто: перечень отменяемого пишется руками, а
271
+ шаг, чья механика сломалась тем же решением, в него не попадает и продолжает читаться
272
+ действующим. Держится это чтением обоих текстов подряд — пакетного и надстройки — при каждой
273
+ правке порядка отдачи.
274
+
273
275
  ## Паттерны
274
276
 
275
277
  - `task-flow-start` — разведка, разбор, договорённость, замысел, задача и ветка.