@rt-tools/agent-kit 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +25 -19
  2. package/assets/agents/qa-engineer.md +1 -1
  3. package/assets/agents/rules-reviewer.md +83 -0
  4. package/assets/checks/board.github.mjs +56 -17
  5. package/assets/checks/check-board.github.mjs +49 -5
  6. package/assets/checks/check-dupes.mjs +66 -6
  7. package/assets/checks/check-specs.mjs +100 -15
  8. package/assets/checks/rt-kit-checks.config.mjs +9 -0
  9. package/assets/checks/task-new.github.mjs +33 -5
  10. package/assets/commands/agent-kit-digest.md +10 -5
  11. package/assets/commands/feedback.md +95 -0
  12. package/assets/commands/next-session.md +4 -4
  13. package/assets/commands/rules-review.md +98 -0
  14. package/assets/commands/skill-curator.md +44 -25
  15. package/assets/defaults/gate-map.sh +11 -4
  16. package/assets/defaults/project.sh +46 -0
  17. package/assets/docs/GLOSSARY.md +49 -46
  18. package/assets/hooks/docs-guard.sh +19 -3
  19. package/assets/hooks/git-guard-delivery.sh +106 -13
  20. package/assets/hooks/proposal-guard.sh +93 -0
  21. package/assets/hooks/reuse-first-guard.sh +83 -15
  22. package/assets/hooks/skill-gate-layers.sh +1 -1
  23. package/assets/hooks/skill-gate.sh +27 -1
  24. package/assets/hooks/task-flow-guard.sh +59 -19
  25. package/assets/hooks/waiting-turn-guard.sh +87 -0
  26. package/assets/hooks/window-fill-guard.sh +1 -1
  27. package/assets/laws/delivery.md +41 -7
  28. package/assets/laws/project-documentation.md +39 -0
  29. package/assets/laws/verifiability.md +6 -1
  30. package/assets/laws/work-conduct.md +83 -3
  31. package/assets/patterns/git-workflow-commit.azure.md +84 -4
  32. package/assets/patterns/git-workflow-commit.github.md +90 -4
  33. package/assets/patterns/git-workflow-commit.gitlab.md +84 -5
  34. package/assets/patterns/git-workflow-docker.md +30 -0
  35. package/assets/patterns/git-workflow-merge.md +1 -1
  36. package/assets/patterns/spec-driven-domain.md +7 -1
  37. package/assets/patterns/spec-driven-rule.md +6 -0
  38. package/assets/patterns/task-flow-close.md +197 -21
  39. package/assets/patterns/task-flow-handoff.md +28 -5
  40. package/assets/patterns/task-flow-resume.md +25 -7
  41. package/assets/patterns/task-flow-start.md +37 -6
  42. package/assets/rules/angular-patterns.md +22 -0
  43. package/assets/rules/api-layer.md +25 -0
  44. package/assets/rules/browser-verification.md +42 -1
  45. package/assets/rules/component-structure.md +21 -0
  46. package/assets/rules/dependencies.md +22 -0
  47. package/assets/rules/doc-style.md +37 -5
  48. package/assets/rules/{entity-conventions.md → entity-conventions.needs-admin.md} +21 -0
  49. package/assets/rules/entity-models.md +21 -0
  50. package/assets/rules/git-workflow.azure.md +62 -8
  51. package/assets/rules/git-workflow.github.md +78 -14
  52. package/assets/rules/git-workflow.gitlab.md +61 -8
  53. package/assets/rules/lib-layers.md +25 -0
  54. package/assets/rules/lists.md +27 -0
  55. package/assets/rules/navigation.md +21 -0
  56. package/assets/rules/{observability.md → observability.needs-app.md} +23 -0
  57. package/assets/rules/permissions.md +23 -0
  58. package/assets/rules/platform-access.md +21 -0
  59. package/assets/rules/reuse-first.md +20 -0
  60. package/assets/rules/seo.md +19 -0
  61. package/assets/rules/shared-code.md +19 -0
  62. package/assets/rules/spec-driven.md +36 -0
  63. package/assets/rules/styling-bem.md +19 -0
  64. package/assets/rules/task-flow.md +150 -35
  65. package/assets/rules/testing.md +50 -0
  66. package/assets/rules/translations.md +21 -0
  67. package/assets/rules/typescript-conventions.md +33 -0
  68. package/assets/samples/specs/_template/spec.md +83 -0
  69. package/assets/samples/tasks/_template/grill.md +28 -0
  70. package/assets/samples/tasks/_template/plan.md +39 -0
  71. package/assets/samples/tasks/_template/progress.md +23 -0
  72. package/assets/skills/agent-kit-extend.md +24 -0
  73. package/assets/skills/agent-kit.md +69 -7
  74. package/assets/templates/rule.md +31 -2
  75. package/assets/traits.json +14 -0
  76. package/bin/agent-kit.d.ts.map +1 -1
  77. package/bin/agent-kit.js +31 -16
  78. package/bin/agent-kit.js.map +1 -1
  79. package/index.d.ts +1 -0
  80. package/index.d.ts.map +1 -1
  81. package/index.js +1 -0
  82. package/index.js.map +1 -1
  83. package/lib/argv.d.ts +17 -0
  84. package/lib/argv.d.ts.map +1 -0
  85. package/lib/argv.js +44 -0
  86. package/lib/argv.js.map +1 -0
  87. package/lib/cargo.d.ts +88 -0
  88. package/lib/cargo.d.ts.map +1 -0
  89. package/lib/cargo.js +16 -0
  90. package/lib/cargo.js.map +1 -0
  91. package/lib/catalog.d.ts +18 -1
  92. package/lib/catalog.d.ts.map +1 -1
  93. package/lib/catalog.js +12 -2
  94. package/lib/catalog.js.map +1 -1
  95. package/lib/commands.d.ts +0 -26
  96. package/lib/commands.d.ts.map +1 -1
  97. package/lib/commands.js +79 -122
  98. package/lib/commands.js.map +1 -1
  99. package/lib/companion.d.ts +37 -0
  100. package/lib/companion.d.ts.map +1 -1
  101. package/lib/companion.js +42 -1
  102. package/lib/companion.js.map +1 -1
  103. package/lib/config.d.ts +38 -1
  104. package/lib/config.d.ts.map +1 -1
  105. package/lib/config.js +24 -0
  106. package/lib/config.js.map +1 -1
  107. package/lib/ship.d.ts +39 -0
  108. package/lib/ship.d.ts.map +1 -0
  109. package/lib/ship.js +87 -0
  110. package/lib/ship.js.map +1 -0
  111. package/lib/shipment.d.ts +60 -0
  112. package/lib/shipment.d.ts.map +1 -0
  113. package/lib/shipment.js +247 -0
  114. package/lib/shipment.js.map +1 -0
  115. package/lib/snapshot.d.ts +30 -0
  116. package/lib/snapshot.d.ts.map +1 -0
  117. package/lib/snapshot.js +73 -0
  118. package/lib/snapshot.js.map +1 -0
  119. package/lib/traits.d.ts +32 -0
  120. package/lib/traits.d.ts.map +1 -0
  121. package/lib/traits.js +82 -0
  122. package/lib/traits.js.map +1 -0
  123. package/package.json +6 -2
  124. package/rt-tools-agent-kit-0.8.3.tgz +0 -0
  125. package/lib/submit.d.ts +0 -24
  126. package/lib/submit.d.ts.map +0 -1
  127. package/lib/submit.js +0 -26
  128. package/lib/submit.js.map +0 -1
  129. package/rt-tools-agent-kit-0.8.1.tgz +0 -0
@@ -2,7 +2,7 @@
2
2
  name: task-flow-close
3
3
  kind: pattern
4
4
  rule: task-flow
5
- description: Паттерн правила task-flow. Брать при закрытии работы — вливание договорённости в спек домена последним коммитом отчёта, разбор папки задачи, переезд в архив, сверка очереди работ. Не брать для хода работы — это паттерн task-flow-resume.
5
+ description: Паттерн правила task-flow. Брать при закрытии работы — вливание договорённости в спек домена последним коммитом PR, разбор папки задачи, переезд в архив, сверка очереди работ. Не брать для хода работы — это паттерн task-flow-resume.
6
6
  ---
7
7
 
8
8
  # Закрытие работы
@@ -12,12 +12,93 @@ description: Паттерн правила task-flow. Брать при закр
12
12
 
13
13
  ## Когда брать
14
14
 
15
- - Этапы замысла закрыты, проверки зелёные, отчёт готовится к публикации.
15
+ - Этапы замысла закрыты, проверки зелёные, с PR снимается черновик.
16
16
  - `npm run check:specs` перечислил договорённость в разделе «Пора вливать».
17
17
 
18
- ## 9. Договорённость вливается в спек домена
18
+ Само открытие PR сюда не относится: он открывается черновиком тем ходом, которым правка
19
+ кода отдаётся владельцу, — то есть до этого паттерна и, как правило, задолго до него. Здесь
20
+ работа доводится до готовности и черновик снимается.
19
21
 
20
- Последним коммитом отчёта, до слияния. Код к этому моменту написан, поэтому привязки
22
+ ## 10. Работа отдаётся на разбор
23
+
24
+ PR открыт черновиком — и с этой минуты работа ждёт владельца, а не машину. Заход на этом не
25
+ кончается: следующая задача эпика берётся тем же движением, паттерн `task-flow-resume`.
26
+
27
+ **Заход, открывший PR, называет оставшийся шаг в двух местах — разделом в теле PR и словами
28
+ владельцу:** после одобрения ветка получает ещё один коммит — разбор папки, — и только потом
29
+ вливается. Порядок этот записан здесь, а читает его исполнитель; вливает же владелец, и
30
+ молчание он читает как «работа кончена» — видит зелёный PR и мержит его тем же ходом. Промах
31
+ случается ровно в шов между двумя ходами, и стоит он отдельной задачи: после слияния папку
32
+ разбирать уже некому.
33
+
34
+ ### Два сообщения владельцу, и между ними — прогон
35
+
36
+ Оба обязательны, и порядок между ними один. Ни одно не заменяется другим: первое говорит, что
37
+ работа отдана и чего она ждёт, второе — что она готова.
38
+
39
+ Сразу после открытия PR:
40
+
41
+ ```
42
+ PR #<номер> открыт черновиком. Жду прогона: пока он идёт, о работе известно только то, что
43
+ она запушена. Как закончится — разберу папку задачи последним коммитом, сниму черновик и
44
+ попрошу тебя влить. Пока жду, беру задачу #<номер следующей>.
45
+ ```
46
+
47
+ Прогон зелёный, папка разобрана и запушена, черновик снят:
48
+
49
+ ```
50
+ PR #<номер> готов к слиянию: прогон зелёный, папка задачи разобрана, за работой убрано,
51
+ черновик снят. Влей его, пожалуйста.
52
+ ```
53
+
54
+ Черновик снимается перед вторым сообщением, а не после него: владелец, прочитав просьбу
55
+ влить, идёт нажимать кнопку — у черновика она заблокирована, и ход возвращается к исполнителю
56
+ ни за чем.
57
+
58
+ Прогон красный — сообщение то же по форме, но говорит о красном и о том, что с ним делается;
59
+ просьбы влить в нём нет. Просьба звучит один раз и только тогда, когда работа готова целиком:
60
+ сказанная заранее, она перестаёт что-либо значить, и владелец возвращается к прежнему —
61
+ вливать по зелёной странице.
62
+
63
+ Между двумя сообщениями исполнитель не ждёт: работа отдана на разбор, и тем же движением
64
+ берётся следующая задача. Возвращается он к PR тем ходом, которым читает конец прогона.
65
+
66
+ ### Оставшийся шаг стоит разделом в теле PR
67
+
68
+ Сказанного вслух мало, и одним этим требование не держится. Реплика живёт до следующей реплики,
69
+ а решение о слиянии принимается на странице PR — там переписки нет вовсе. Поэтому оставшийся
70
+ шаг пишется дважды: разделом в теле PR и словами владельцу. Одно другого не заменяет — тело
71
+ пишется один раз и лежит у самой кнопки, разговор идёт дальше и уносит сказанное с собой.
72
+
73
+ Раздел стоит последним и говорит ровно одно — что случится с веткой после одобрения:
74
+
75
+ ```markdown
76
+ ## Оставшийся шаг
77
+
78
+ После одобрения ветка получает ещё один коммит — разбор папки задачи, — и только потом
79
+ вливается. До этого коммита вливать рано: папка уедет в главную ветку неразобранной.
80
+ ```
81
+
82
+ Разобрана папка — раздел переписывается тем же вызовом, которым правится тело:
83
+
84
+ ```markdown
85
+ ## Оставшийся шаг
86
+
87
+ Не осталось: папка задачи разобрана коммитом `<sha>`, черновик снят. Можно вливать.
88
+ ```
89
+
90
+ Пустым раздел не оставляется и не удаляется вовсе: отсутствие раздела и «шагов не осталось»
91
+ читаются одинаково, а значат разное. Образец тела PR целиком — в паттерне заведения коммита
92
+ и PR, если дерево его разложило.
93
+
94
+ Проверить это машиной нечем, и проверки не будет: тело PR не читает ни одна сверка, а хостинг
95
+ не спрашивает ни о чём, кроме заголовка. Требование держится тем же, чем и слова вслух, — тем,
96
+ кто пишет тело. Разница между ними одна, и она вся: реплику владелец прочитает, только если
97
+ вернётся в переписку, а раздел он видит там, куда смотрит, нажимая кнопку.
98
+
99
+ ## 12. Договорённость вливается в спек домена
100
+
101
+ Последним коммитом PR, до слияния. Код к этому моменту написан, поэтому привязки
21
102
  `файл:символ` известны — правило въезжает в спек домена сразу проверяемым.
22
103
 
23
104
  ```bash
@@ -38,13 +119,13 @@ npm run check:specs # раздел «Пора вливать» называе
38
119
  таблице `docs/specs/README.md`.
39
120
 
40
121
  Работа шла несколькими задачами — вливание идёт в последней из них. Какая последняя, видно в
41
- `docs/plans/<линия>.md`; закрытая линия уезжает в `docs/archive/` или удаляется.
122
+ замысле эпика; закрытый эпик уезжает в описание прошлого или удаляется.
42
123
 
43
124
  ```bash
44
125
  npm run check:specs # после вливания: привязки на месте, сценарии не потерялись
45
126
  ```
46
127
 
47
- ## 10. Тексты домена приводятся к сделанному
128
+ ## 13. Тексты домена приводятся к сделанному
48
129
 
49
130
  В спек уезжает только то, что записали до кода. Остальные тексты — правила, паттерны, законы
50
131
  приложения — после правки никто не перечитывает, и они продолжают описывать старое дерево.
@@ -78,23 +159,42 @@ grep -rn -A3 "Чего из закона здесь нет" <каталог пр
78
159
  ```
79
160
 
80
161
  **Закон в ветке не правится.** Статья закона — договорённость с владельцем, и меняет её он.
81
- Работа с ней разошлась — пишется готовый текст статьи: в ход работы и в тело отчёта. Файл
162
+ Работа с ней разошлась — пишется готовый текст статьи: в ход работы и в тело PR. Файл
82
163
  закона правится после ответа. С законами приложения так же: деньги, локали и доступ — та же
83
164
  договорённость, только про это приложение.
84
165
 
85
- Что сделали на этом шаге, пишется в тело отчёта: что перечитали, что изменили, а если ничего
166
+ Что сделали на этом шаге, пишется в тело PR: что перечитали, что изменили, а если ничего
86
167
  не изменили — почему. Форма раздела — паттерн `git-workflow-commit`.
87
168
 
88
- ## 11. Папка задачи разбирается
169
+ ## 14. Папка задачи разбирается
170
+
171
+ Разбор идёт по трём исходам, а не по двум.
172
+
173
+ **Первым отбирается действующее требование.** Всё, что останется верным и завтра, становится
174
+ статьёй закона, пунктом правила или разделом паттерна — по тому, о чём оно говорит. Признак
175
+ отбора один и записан здесь заранее: перестанет ли текст быть верным, если завтра всё
176
+ переделать. Перестанет — это рассказ о состоявшемся; не перестанет — требование, и место ему в
177
+ слое правил. Закон при этом в ветке не правится — его статья приносится владельцу текстом.
178
+
179
+ **Вторым отбирается рассказ о состоявшемся переезде.** Он уезжает в описание прошлого и
180
+ называет для каждого перенесённого решения, куда оно ушло: иначе решение, ставшее правилом, и
181
+ решение, потерянное при переносе, выглядят одинаково — записью, на которую никто не ссылается.
182
+
183
+ **Третьим удаляется остальное.**
184
+
185
+ Порядок именно такой: начав с переезда, исполнитель увозит вместе с ним и действующее — под
186
+ конец работы это дешевле, чем разбирать.
89
187
 
90
188
  Целиком в архив не переносится: `docs/archive/` — место для записей о состоявшемся, которые
91
- кто-то читает, а не свалка ходов работы.
189
+ кто-то читает, а не свалка ходов работы. Таблица ниже говорит о том, что осталось после
190
+ первого отбора.
92
191
 
93
- | Файл | Куда |
94
- | ------------- | ------------------------------------------------------------------------------------------------------------------ |
95
- | `grill.md` | в `docs/archive/` — ответы владельца невосстановимы, и это единственная запись о том, почему задача поставлена так |
96
- | `progress.md` | в `docs/archive/`, если в нём есть решения по ходу с причинами; иначе удаляется |
97
- | `plan.md` | удаляется — после выкатки на его вопрос отвечает код, а на «как работает» отвечает спек домена |
192
+ | Файл | Куда |
193
+ | --------------- | ------------------------------------------------------------------------------------------------------------------ |
194
+ | `grill.md` | в `docs/archive/` — ответы владельца невосстановимы, и это единственная запись о том, почему задача поставлена так |
195
+ | `progress.md` | в `docs/archive/`, если в нём есть решения по ходу с причинами; иначе удаляется |
196
+ | `plan.md` | удаляется — после выкатки на его вопрос отвечает код, а на «как работает» отвечает спек домена |
197
+ | находки разбора | переезжают к замыслу эпика — их читает владелец, когда эпик кончится; работа вне эпика показывает их сразу |
98
198
 
99
199
  Уезжающее складывается одним файлом с говорящим именем, а не папкой из трёх:
100
200
 
@@ -103,10 +203,27 @@ cat docs/tasks/<КЛЮЧ>-<номер>-<slug>/grill.md > docs/archive/<ЧТО_Р
103
203
  rm -r docs/tasks/<КЛЮЧ>-<номер>-<slug>
104
204
  ```
105
205
 
106
- Разбор идёт в том же отчёте, что и работа: папка, оставленная до мержа, попадает в главную
206
+ Разбор идёт в том же PR, что и работа: папка, оставленная до мержа, попадает в главную
107
207
  ветку и читается там как текущая.
108
208
 
109
- ## 12. Сверка
209
+ ### Работа, разбирающая чужую папку, разбирает две
210
+
211
+ Своя папка у такой работы есть — она заводится наравне со всеми, исключения из этого нет. Обе
212
+ снимаются последним коммитом, и порядок между ними один: сперва чужая, потом своя. Начав со
213
+ своей, исполнитель теряет замысел на диске, а он ещё нужен — гард отбивает правку без него, а
214
+ правка по замечаниям разбора идёт в ту же ветку.
215
+
216
+ ```bash
217
+ cat docs/tasks/<чужая>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ТАМ>.md
218
+ rm -r docs/tasks/<чужая>
219
+ cat docs/tasks/<своя>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ЗДЕСЬ>.md
220
+ rm -r docs/tasks/<своя>
221
+ ```
222
+
223
+ Две записи в архиве, а не одна: работы разные, и решения в них разные. Сверка очереди работ
224
+ после этого не называет ни одной папки — этим и проверяется, что разобраны обе.
225
+
226
+ ## 15. Сверка
110
227
 
111
228
  ```bash
112
229
  npm run check:board # папка закрытой задачи среди текущих, брошенные черновики
@@ -114,6 +231,65 @@ npm run check:specs # договорённость влита, привязк
114
231
  npm run check:docs # пути, названные в текстах, существуют
115
232
  ```
116
233
 
234
+ ## 16. Работа разбирается правилами — фоном, следом за PR
235
+
236
+ Шаг о слое правил, а не о продукте: что за эту работу грузилось, что помогло, чего не хватило и
237
+ где текст правила разошёлся с деревом. Знает это только тот заход, который работу вёл, — через
238
+ сутки не знает никто.
239
+
240
+ Ведёт разбор роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт его
241
+ само, теми же вопросами. Файлов роль не правит — приносит готовые формулировки, а вставлять их
242
+ решает владелец.
243
+
244
+ **Запускается разбор в фоне, сразу за открытием PR, и ход на нём не кончается.** Роль ничего не
245
+ спрашивает, пока работает, и быстрее от ожидания не идёт: следующая задача берётся тем же ходом,
246
+ которым запущен разбор.
247
+
248
+ Порядок один и переставлять его нельзя:
249
+
250
+ 1. **Сводка собирается до запуска** — пока задача ещё в голове. Что делали, что пошло не так,
251
+ что грузилось и что каждое правило дало, на какие грабли окружения наткнулись. Собранная
252
+ через две задачи, она пересказывает историю ветки вместо того, что было на самом деле.
253
+ 2. **Роль уходит в фон** — инструментом запуска роли, с путём к списку загруженного и сводкой
254
+ целиком. Ход продолжается следующей задачей.
255
+ 3. **Вернувшиеся находки принимают одним ходом** — записать и вернуться к прежнему. Разбор,
256
+ отложенный «до удобного момента», не случается вовсе: заход кончается раньше.
257
+
258
+ ## 17. Находки разбора ложатся в папку задачи и ждут владельца
259
+
260
+ Ответ роли живёт в переписке и умирает вместе с ней, поэтому он сразу ложится на диск — в папку
261
+ задачи, файлом рядом с ходом работы. Пишет его исполнитель: роль файлов не пишет.
262
+
263
+ Папка задачи умирает со слиянием, а находки должны пережить весь эпик — владелец читает их
264
+ разом, когда эпик кончился. Поэтому при разборе папки (шаг 14) файл находок не удаляется вместе
265
+ с остальным, а **переезжает к замыслу эпика**: там его найдут и после того, как ветка въехала.
266
+ Работа вне эпика показывает находки владельцу сразу, тем же ходом.
267
+
268
+ **Наружу без слова владельца уезжает только сводка наблюдений.** Она говорит, чем пользовались
269
+ и чем не пользовались ни разу, — это факт, и мнением он не станет. Предложение — другое дело:
270
+ это заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении. Уехавшая
271
+ без разбора, она становится работой того, кто её не заказывал.
272
+
273
+ Порядок такой: находки копятся у замысла эпика → эпик кончился → владелец читает их разом и
274
+ говорит, что из них верно → названное им оформляется предложением и уезжает. Чем отправляют —
275
+ скил слоя правил, если дерево его разложило.
276
+
277
+ У каждой находки называется адрес, и адресов три:
278
+
279
+ | Куда | Что туда идёт |
280
+ | -------------------------- | ------------------------------------------------------------------------ |
281
+ | слой правил — предложением | то, что верно любому дереву этого класса: статья, пункт правила, паттерн |
282
+ | имена этого дерева | то, что верно здесь: компаньон правила, профиль, карта гейта |
283
+ | надстройка над разложенным | то, что здесь звучит иначе, чем в пакете |
284
+
285
+ Без адреса правка ложится туда, где её видит автор, — то есть в своё дерево, — и общее оседает
286
+ в одном месте, оставаясь неизвестным всем остальным.
287
+
288
+ **Разбор без правки закрытым не считается.** Из него выходит либо правка слоя правил, либо
289
+ предложение наружу; не вышло ни того ни другого — это жалоба, и она повторится. Предложение, о
290
+ котором владелец сказал вслух, уходит наружу в тот же ход: написанное и не отправленное лежит в
291
+ дереве неотличимо от отправленного.
292
+
117
293
  ## Ловушки
118
294
 
119
295
  - **Папку разбирают до слияния — потом о ней уже никто не вспомнит.** Сверка очереди считает
@@ -121,7 +297,7 @@ npm run check:docs # пути, названные в текстах, суще
121
297
  отвечает — работа перешла к следующей задаче, и находка достанется чужому заходу. Три раза
122
298
  подряд папка закрытой задачи так и уехала в главную ветку, в последний раз их набралось
123
299
  пять. Теперь это держит гард поставки: слияние отбивается, пока папка лежит в ветке.
124
- - **Разбирают последним коммитом, а не перед открытием отчёта.** Пока идёт ревью, замысел
300
+ - **Разбирают последним коммитом, а не перед открытием PR.** Пока идёт ревью, замысел
125
301
  нужен на диске: без него правку по замечаниям не пропустит гард хода работы. Порядок такой:
126
302
  правки по ревью, потом разбор папки, потом слияние.
127
303
  - **Разбор папки идёт последним, после того как гейт пуша прошёл целиком.** Гард хода работы
@@ -165,10 +341,10 @@ npm run check:docs # пути, названные в текстах, суще
165
341
  в нём нет. Паттерн находится по имени правленого символа, а не по теме работы.
166
342
  - **Правило без привязки в спек домена не въезжает.** Кода, который его исполняет, нет —
167
343
  значит это намерение, и место ему в открытых вопросах домена, а не в правилах.
168
- - **Замысел линии работ правят только там, где вписывают «чем кончилась».** Границы линии и
169
- порядок задач в ней при этом остаются прежними, а работа их уже нарушила: задача, решившая
344
+ - **Замысел эпика правят только там, где вписывают «чем кончился».** Границы эпика и
345
+ порядок задач в нём при этом остаются прежними, а работа их уже нарушила: задача, решившая
170
346
  читать спеки, оставила над собой границу «спеки — вторая очередь», и следующий исполнитель
171
- прочитает её как действующую. Границы линии перечитываются целиком тем же заходом, что и
347
+ прочитает её как действующую. Границы эпика перечитываются целиком тем же заходом, что и
172
348
  итог работы.
173
349
  - **Архив не обновляется после выкатки.** Уехавшее туда описывает день переезда, и правится
174
350
  оно только вместе с признанием, что описывало неверно.
@@ -26,7 +26,7 @@ description: Паттерн правила task-flow. Брать, когда з
26
26
 
27
27
  Пороги сторожит гард заполнения окна; размер окна он берёт из настройки дерева — из записи
28
28
  захода тот не выводится. Место между порогами и есть то, на что заход закрывается: дописать ход
29
- работы, написать передачу, закоммитить и открыть отчёт, если работа кончена.
29
+ работы, написать передачу, закоммитить и открыть PR, если работа кончена.
30
30
 
31
31
  ## Точка остановки
32
32
 
@@ -41,7 +41,7 @@ description: Паттерн правила task-flow. Брать, когда з
41
41
  Незакрытый этап — тоже законная точка, если в ходе работы записано, что именно из него сделано и
42
42
  чем это подтверждено. Незаконная точка одна: правка, о которой не записано ничего.
43
43
 
44
- ## 8. Заход закрывается передачей
44
+ ## 9. Заход закрывается передачей
45
45
 
46
46
  Уборку этого шага — главную ветку, влитые ветки и запись самой передачи — делает команда
47
47
  `next-session`: она проходит его целиком и называет путь к передаче последней строкой. Ниже —
@@ -54,7 +54,7 @@ description: Паттерн правила task-flow. Брать, когда з
54
54
 
55
55
  ### Коммит
56
56
 
57
- Проверенное коммитится сразу, а не копится до конца задачи. Работа кончена — открывается отчёт:
57
+ Проверенное коммитится сразу, а не копится до конца задачи. Работа кончена — открывается PR:
58
58
  паттерн `git-workflow-commit`.
59
59
 
60
60
  ### Передача
@@ -86,12 +86,35 @@ mkdir -p <каталог передачи>
86
86
  - <прочее, чего нет ни в правилах, ни в ходе работы>.
87
87
  ```
88
88
 
89
+ Третьим разделом идёт «Эпик» — таблица положения. Работа вне эпика этого раздела не несёт:
90
+ таблица из одной строки повторяет раздел «Работа» и читается как эпик из одной задачи.
91
+
92
+ ```markdown
93
+ ### Эпик <номер> — <возможность, названная замыслом>
94
+
95
+ | № | Задача | Состояние |
96
+ | --- | --------------------------------- | --------- |
97
+ | 1 | <КЛЮЧ>-<номер> — <что делает> | закрыта |
98
+ | 2 | **<КЛЮЧ>-<номер> — <что делает>** | в работе |
99
+ | 3 | <КЛЮЧ>-<номер> — <что делает> | впереди |
100
+ ```
101
+
102
+ Три колонки, строка на задачу. Заголовок называет номер эпика и возможность — ту, что записана в
103
+ замысле, а не пересказанную заново. `№` — место по порядку: фактическое у закрытых, назначенное
104
+ замыслом у будущих. `Задача` — номер и что она делает, теми же словами, что в замысле.
105
+ `Состояние` — «закрыта», «в работе» или «впереди»; строка текущей задачи выделяется целиком.
106
+
107
+ Состав берётся из замысла эпика, а состояние — из очереди работ: замысел о том, что закрыто, не
108
+ знает, а очередь не знает порядка. Задача, дописанная в эпик после планирования, стоит в очереди
109
+ и в таблице, а в замысле её нет — расхождение называется вслух, а не заглаживается.
110
+
89
111
  Разделы фиксированы, и порядок у них тот же:
90
112
 
91
113
  1. **Работа** — номер задачи, её название, рабочее дерево полным путём, ветка и её состояние.
92
114
  2. **Где искать** — что придёт хуком само, а что читается по надобности.
93
- 3. **Сделано и следующий шаг** одной строкой каждое; подробности уже в ходе работы.
94
- 4. **Что учесть** особенности этого захода, которых нет ни в правилах, ни в ходе работы:
115
+ 3. **Эпик**таблица положения; у работы вне эпика раздела нет.
116
+ 4. **Сделано и следующий шаг** одной строкой каждое; подробности уже в ходе работы.
117
+ 5. **Что учесть** — особенности этого захода, которых нет ни в правилах, ни в ходе работы:
95
118
  поднятые стенды, отставшие зависимости, чужие процессы на портах, незакрытые вопросы к
96
119
  владельцу.
97
120
 
@@ -34,7 +34,7 @@ description: Паттерн правила task-flow. Брать при возв
34
34
  ней проверяется деревом — сборкой, тестами, чтением файла, — а не вопросом.
35
35
  - **Не править замысел.** С ним сверяют результат; пересмотр идёт записью в ходе работы.
36
36
 
37
- ## 6. Возвращение к работе новым заходом
37
+ ## 7. Возвращение к работе новым заходом
38
38
 
39
39
  Сверить «Где стоим» с деревом. Запись описывает день, когда её сделали:
40
40
 
@@ -46,7 +46,7 @@ git log --oneline origin/main..HEAD
46
46
  Разошлось — «Где стоим» правится сразу, до работы: следующий заход поверит записи, а не
47
47
  дереву.
48
48
 
49
- ## 7. Этап делается и отмечается в ходе работы
49
+ ## 8. Этап делается и отмечается в ходе работы
50
50
 
51
51
  Раздел «Где стоим» **перезаписывается**, а не дописывается — это первое, что читает следующий
52
52
  заход, и единственное, что переживает обрезку по объёму:
@@ -59,16 +59,16 @@ git log --oneline origin/main..HEAD
59
59
  - **Следующий шаг:** сценарии обоих хуков, затем подключение в настройках
60
60
  - **Незакоммиченное:** всё, ветка пока без коммитов
61
61
  - **Ждём владельца:** нет
62
- - **Отчёт:** ещё не открыт
62
+ - **PR:** ещё не открыт
63
63
  ```
64
64
 
65
- Строка про отчёт обязательна с той минуты, как этапы кончились: между открытием отчёта и
65
+ Строка про PR обязательна с той минуты, как этапы кончились: между открытием PR и
66
66
  слиянием проходит день и больше, и заход обрывается там чаще всего. Без неё следующий заход
67
- читает «этап последний, всё зелено» и об открытом отчёте узнаёт только из истории ветки или у
67
+ читает «этап последний, всё зелено» и об открытом PR узнаёт только из истории ветки или у
68
68
  владельца — то есть ровно тем пересказом, ради отмены которого всё и заведено:
69
69
 
70
70
  ```markdown
71
- - **Отчёт:** #1396, ждёт разбора · отвечено 3 замечания из 5 · не сделано: разбор папки задачи
71
+ - **PR:** #1396, ждёт разбора · отвечено 3 замечания из 5 · не сделано: разбор папки задачи
72
72
  ```
73
73
 
74
74
  Решение, принятое по ходу, — вместе с причиной и с тем, что было альтернативой:
@@ -94,12 +94,30 @@ git log --oneline origin/main..HEAD
94
94
  - Доэтапное, не этой работы: сверка очереди перечисляет шесть закрытых задач вне борды.
95
95
  ```
96
96
 
97
+ ## 11. Следующая задача эпика берётся тем же движением
98
+
99
+ Задача закрыта, PR открыт и ждёт владельца — заход на этом не кончается. Отданное на разбор
100
+ ждёт человека, а не машину: пока эпик не кончился, следующая его задача берётся сразу, тем же
101
+ движением, которым предыдущая ушла на разбор.
102
+
103
+ Берётся, а не выбирается: порядок назначен на планировании и лежит в замысле эпика. Выбор,
104
+ предложенный владельцу при назначенном порядке, — просьба назначить его заново.
105
+
106
+ ```bash
107
+ # что назначено следующим — читается в замысле эпика, а не спрашивается
108
+ # состояние задач — в очереди работ: замысел о закрытом не знает
109
+ ```
110
+
111
+ Останавливает заход только предел заполнения окна — тогда идёт передача, паттерн
112
+ `task-flow-handoff`. Эпик кончился — заход закрывается тем же порядком, и владельцу называется,
113
+ что кончился именно эпик, а не одна его задача.
114
+
97
115
  ## Ловушки
98
116
 
99
117
  - **Заход, кончившийся ничем, тоже записывается.** Иначе следующий пойдёт той же дорогой:
100
118
  «пробовали так — не вышло, потому что» стоит одной строки и экономит целый заход.
101
119
  - **Незакоммиченное называется явно.** Работа живёт в дереве неделями; строка «что лежит
102
- несохранённым и почему» — единственное, по чему это видно, пока отчёта нет.
120
+ несохранённым и почему» — единственное, по чему это видно, пока PR нет.
103
121
  - **Подтверждение — вывод команды или замер, а не пересказ.** «Проверил, работает» через
104
122
  заход неотличимо от «казалось, что работает».
105
123
  - **Число из передачи пересчитывается до того, как на нём что-то делят.** Передача описывает
@@ -73,6 +73,10 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
73
73
  <Вопрос>
74
74
  ```
75
75
 
76
+ Под вопросом идёт таблица положения эпика — та же, что в передаче. Под, а не над: остановка
77
+ называется первой строкой, и положение эпика — то, из чего владелец решает, а не то, о чём его
78
+ спрашивают. Работа вне эпика таблицы не несёт.
79
+
76
80
  Замеры, находки ролей и список решений к этому моменту уже записаны в ход работы, и в
77
81
  сообщении владельцу они лишние. Отчёт, в конце которого стоит вопрос, выглядит добросовестно
78
82
  ровно настолько, насколько надёжно вопрос в нём тонет: владелец трижды переспрашивал, почему
@@ -103,7 +107,34 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
103
107
  «не входит». Находка критика, расходящаяся с ответом владельца, относится владельцу — она не
104
108
  исполняется молча и не считается закрытой правкой текста.
105
109
 
106
- ### 4. Задача, ветка, папка
110
+ ### 4. Серия задач объявляется эпиком
111
+
112
+ Разбор кончился одной задачей — шаг пропускается. Вышло несколько, и порядок между ними
113
+ значим — эпик объявляется здесь, до первой из них, и дважды: карточкой в очереди работ с меткой
114
+ эпика и замыслом эпика рядом с ней.
115
+
116
+ Замысел эпика называет три вещи, и ни одна не выводится из остальных:
117
+
118
+ ```markdown
119
+ # <Возможность, которая разрабатывается>
120
+
121
+ Одной фразой: что у владельца появится, когда эпик кончится.
122
+
123
+ | № | Задача | Почему здесь |
124
+ | --- | ------------ | ------------------------ |
125
+ | 1 | <что делает> | <на чём стоят следующие> |
126
+ | 2 | <что делает> | <что из первой ей нужно> |
127
+ ```
128
+
129
+ Состав без порядка порядком не является: две задачи, у которых он держался пониманием, ушли в
130
+ работу наоборот, и вторая переделывалась под первую. Назначенный здесь порядок держится до конца
131
+ эпика; пересмотр — решение владельца, и записывается он в ход работы той задачи, которая его
132
+ вызвала.
133
+
134
+ Лежит замысел вне папки задачи: та умирает с мержем первой же задачи. Каталог для него называет
135
+ компаньон правила — у пакета своего пути нет.
136
+
137
+ ### 5. Задача, ветка, папка
107
138
 
108
139
  ```bash
109
140
  npm run task:new -- --title '<Что не так>' --slug <slug> --label documentation --label area:tooling < тело.md
@@ -131,7 +162,7 @@ cp docs/tasks/_template/plan.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/plan.m
131
162
  cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/progress.md
132
163
  ```
133
164
 
134
- ### 5. Шапка замысла
165
+ ### 6. Шапка замысла
135
166
 
136
167
  Её читает гард:
137
168
 
@@ -155,13 +186,13 @@ cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/pr
155
186
  заведённая заранее задача после разбивки закрывается и остаётся мусором в очереди работ.
156
187
  - **Разбор пишется на диск сразу, а не копится в переписке.** Сессия обрывается, и разбор,
157
188
  прожитый в разговоре, восстанавливается только пересказом владельца.
158
- - **Из одного разбора вышло несколько задач — общее уезжает в `docs/plans/<линия>.md`.**
159
- Папка задачи умирает с мержем, а порядок задач и зависимости между ними должны его
160
- пережить.
189
+ - **Из одного разбора вышло несколько задач — общее уезжает в замысел эпика.** Папка задачи
190
+ умирает с мержем, а порядок задач и зависимости между ними должны его пережить. Каталог для
191
+ замысла называет компаньон правила.
161
192
  - **Задача заводится командой, а не четырьмя вызовами подряд.** Борда к репозиторию не
162
193
  привязана, и задача попадает на неё только явным добавлением.
163
194
  - **Slug ветки берётся из терминологии договорённости, а не из слов просьбы.** Договорённость
164
195
  пишется раньше ветки и как раз там отказывается от слова владельца: спек завёл своё имя
165
196
  предмету и прямо сказал, каким словом его не называть, — а ветка и папка задачи остались с
166
- отвергнутым. Заголовок задачи и отчёта поправить можно, имя ветки после открытия отчёта
197
+ отвергнутым. Заголовок задачи и PR поправить можно, имя ветки после открытия PR
167
198
  уже нет.
@@ -31,6 +31,28 @@ description: Правило под «Закон о фронтовом прило
31
31
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
32
32
  же дереве, которое держит код иначе.
33
33
 
34
+ ## Ход
35
+
36
+ Ход правки класса приложения: с чего исполнитель начинает, где развилка между производным
37
+ значением и действием, и чем кончается каждая ветка.
38
+
39
+ ```mermaid
40
+ flowchart TD
41
+ A[Правится класс приложения] --> B{Что заводится}
42
+ B -->|Значение, выводимое из другого| C[computed: следит за сигналами, а не зовёт сервис]
43
+ B -->|Действие пользователя| D[Источник действия с суффиксом Source]
44
+ B -->|Состояние списка| E[Наследуется общая основа списочного стора]
45
+ D --> F[Подписка объявлена один раз при заведении, а не в методе]
46
+ F --> G{Прежний запрос ещё идёт}
47
+ G -->|Ответ нужен последний| H[Поток переключается]
48
+ G -->|Нужны все| I[Поток склеивается по очереди]
49
+ H --> J[Подписка гасится вместе с владельцем]
50
+ I --> J
51
+ C --> K[Готово]
52
+ E --> K
53
+ J --> K
54
+ ```
55
+
34
56
  ## Как закон применяется здесь
35
57
 
36
58
  - **Подписка объявляется один раз, а не в методе действия.** Метод толкает значение в
@@ -30,6 +30,31 @@ description: Правило под «Закон о фронтовом прило
30
30
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
31
31
  же дереве, которое держит код иначе.
32
32
 
33
+ ## Ход
34
+
35
+ Ход похода домена за данными: пара классов, границы типов между ними и развилка между списком
36
+ и одиночной записью.
37
+
38
+ ```mermaid
39
+ flowchart TD
40
+ A[Домену нужны данные] --> B{Что за домен}
41
+ B -->|Своя сущность| C[Заводится своя пара: фасад и сервис]
42
+ B -->|Чужая сущность| D[Зовётся её пара, своя не заводится]
43
+ C --> E{Что читается}
44
+ E -->|Список| F[Один вход: выборка целиком]
45
+ E -->|Одна запись| G[Вход — её признак]
46
+ F --> H[Ответ кладётся в общий конвертер целиком]
47
+ H --> I[В ответе стоит применённая выборка, а не запрошенная]
48
+ G --> J[Фасад отдаёт контракт, сервис переводит в состояние домена]
49
+ I --> J
50
+ J --> K{Данные приходят разом}
51
+ K -->|Да| L[Пара отдаёт поток]
52
+ K -->|Нет, живой срез| M[Серверный стрим — объявленное исключение]
53
+ L --> N[Готово]
54
+ M --> N
55
+ D --> N
56
+ ```
57
+
33
58
  ## Как закон применяется здесь
34
59
 
35
60
  - **Домен ходит за данными парой классов: фасад зовёт процедуру, сервис переводит модели.**