@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.
- package/README.md +25 -19
- package/assets/agents/qa-engineer.md +1 -1
- package/assets/agents/rules-reviewer.md +83 -0
- package/assets/checks/board.github.mjs +56 -17
- package/assets/checks/check-board.github.mjs +49 -5
- package/assets/checks/check-dupes.mjs +66 -6
- package/assets/checks/check-specs.mjs +100 -15
- package/assets/checks/rt-kit-checks.config.mjs +9 -0
- package/assets/checks/task-new.github.mjs +33 -5
- package/assets/commands/agent-kit-digest.md +10 -5
- package/assets/commands/feedback.md +95 -0
- package/assets/commands/next-session.md +4 -4
- package/assets/commands/rules-review.md +98 -0
- package/assets/commands/skill-curator.md +44 -25
- package/assets/defaults/gate-map.sh +11 -4
- package/assets/defaults/project.sh +46 -0
- package/assets/docs/GLOSSARY.md +49 -46
- package/assets/hooks/docs-guard.sh +19 -3
- package/assets/hooks/git-guard-delivery.sh +106 -13
- package/assets/hooks/proposal-guard.sh +93 -0
- package/assets/hooks/reuse-first-guard.sh +83 -15
- package/assets/hooks/skill-gate-layers.sh +1 -1
- package/assets/hooks/skill-gate.sh +27 -1
- package/assets/hooks/task-flow-guard.sh +59 -19
- package/assets/hooks/waiting-turn-guard.sh +87 -0
- package/assets/hooks/window-fill-guard.sh +1 -1
- package/assets/laws/delivery.md +41 -7
- package/assets/laws/project-documentation.md +39 -0
- package/assets/laws/verifiability.md +6 -1
- package/assets/laws/work-conduct.md +83 -3
- package/assets/patterns/git-workflow-commit.azure.md +84 -4
- package/assets/patterns/git-workflow-commit.github.md +90 -4
- package/assets/patterns/git-workflow-commit.gitlab.md +84 -5
- package/assets/patterns/git-workflow-docker.md +30 -0
- package/assets/patterns/git-workflow-merge.md +1 -1
- package/assets/patterns/spec-driven-domain.md +7 -1
- package/assets/patterns/spec-driven-rule.md +6 -0
- package/assets/patterns/task-flow-close.md +197 -21
- package/assets/patterns/task-flow-handoff.md +28 -5
- package/assets/patterns/task-flow-resume.md +25 -7
- package/assets/patterns/task-flow-start.md +37 -6
- package/assets/rules/angular-patterns.md +22 -0
- package/assets/rules/api-layer.md +25 -0
- package/assets/rules/browser-verification.md +42 -1
- package/assets/rules/component-structure.md +21 -0
- package/assets/rules/dependencies.md +22 -0
- package/assets/rules/doc-style.md +37 -5
- package/assets/rules/{entity-conventions.md → entity-conventions.needs-admin.md} +21 -0
- package/assets/rules/entity-models.md +21 -0
- package/assets/rules/git-workflow.azure.md +62 -8
- package/assets/rules/git-workflow.github.md +78 -14
- package/assets/rules/git-workflow.gitlab.md +61 -8
- package/assets/rules/lib-layers.md +25 -0
- package/assets/rules/lists.md +27 -0
- package/assets/rules/navigation.md +21 -0
- package/assets/rules/{observability.md → observability.needs-app.md} +23 -0
- package/assets/rules/permissions.md +23 -0
- package/assets/rules/platform-access.md +21 -0
- package/assets/rules/reuse-first.md +20 -0
- package/assets/rules/seo.md +19 -0
- package/assets/rules/shared-code.md +19 -0
- package/assets/rules/spec-driven.md +36 -0
- package/assets/rules/styling-bem.md +19 -0
- package/assets/rules/task-flow.md +150 -35
- package/assets/rules/testing.md +50 -0
- package/assets/rules/translations.md +21 -0
- package/assets/rules/typescript-conventions.md +33 -0
- package/assets/samples/specs/_template/spec.md +83 -0
- package/assets/samples/tasks/_template/grill.md +28 -0
- package/assets/samples/tasks/_template/plan.md +39 -0
- package/assets/samples/tasks/_template/progress.md +23 -0
- package/assets/skills/agent-kit-extend.md +24 -0
- package/assets/skills/agent-kit.md +69 -7
- package/assets/templates/rule.md +31 -2
- package/assets/traits.json +14 -0
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +31 -16
- package/bin/agent-kit.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/argv.d.ts +17 -0
- package/lib/argv.d.ts.map +1 -0
- package/lib/argv.js +44 -0
- package/lib/argv.js.map +1 -0
- package/lib/cargo.d.ts +88 -0
- package/lib/cargo.d.ts.map +1 -0
- package/lib/cargo.js +16 -0
- package/lib/cargo.js.map +1 -0
- package/lib/catalog.d.ts +18 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +12 -2
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts +0 -26
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +79 -122
- package/lib/commands.js.map +1 -1
- package/lib/companion.d.ts +37 -0
- package/lib/companion.d.ts.map +1 -1
- package/lib/companion.js +42 -1
- package/lib/companion.js.map +1 -1
- package/lib/config.d.ts +38 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +24 -0
- package/lib/config.js.map +1 -1
- package/lib/ship.d.ts +39 -0
- package/lib/ship.d.ts.map +1 -0
- package/lib/ship.js +87 -0
- package/lib/ship.js.map +1 -0
- package/lib/shipment.d.ts +60 -0
- package/lib/shipment.d.ts.map +1 -0
- package/lib/shipment.js +247 -0
- package/lib/shipment.js.map +1 -0
- package/lib/snapshot.d.ts +30 -0
- package/lib/snapshot.d.ts.map +1 -0
- package/lib/snapshot.js +73 -0
- package/lib/snapshot.js.map +1 -0
- package/lib/traits.d.ts +32 -0
- package/lib/traits.d.ts.map +1 -0
- package/lib/traits.js +82 -0
- package/lib/traits.js.map +1 -0
- package/package.json +6 -2
- package/rt-tools-agent-kit-0.8.3.tgz +0 -0
- package/lib/submit.d.ts +0 -24
- package/lib/submit.d.ts.map +0 -1
- package/lib/submit.js +0 -26
- package/lib/submit.js.map +0 -1
- 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. Брать при закрытии работы — вливание договорённости в спек домена последним коммитом
|
|
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
|
-
|
|
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
|
-
|
|
122
|
+
замысле эпика; закрытый эпик уезжает в описание прошлого или удаляется.
|
|
42
123
|
|
|
43
124
|
```bash
|
|
44
125
|
npm run check:specs # после вливания: привязки на месте, сценарии не потерялись
|
|
45
126
|
```
|
|
46
127
|
|
|
47
|
-
##
|
|
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
|
-
##
|
|
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`
|
|
96
|
-
| `progress.md`
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
-
|
|
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
|
-
###
|
|
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
|
-
- **Из одного разбора вышло несколько задач — общее уезжает в
|
|
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
|
- **Домен ходит за данными парой классов: фасад зовёт процедуру, сервис переводит модели.**
|