@rt-tools/agent-kit 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/checks/check-file-size.mjs +19 -4
- package/assets/checks/check-state-next.mjs +10 -2
- package/assets/checks/rt-kit-checks.config.mjs +16 -2
- package/assets/defaults/project.sh +9 -1
- package/assets/defaults/turn-map.md +8 -6
- package/assets/hooks/browser-guard-device-id.sh +3 -1
- package/assets/hooks/browser-guard-no-asking.sh +3 -1
- package/assets/hooks/browser-guard-no-other-drivers.sh +5 -3
- package/assets/hooks/browser-guard-require-select.sh +4 -2
- package/assets/hooks/claim-guard.sh +3 -1
- package/assets/hooks/conscience-guard.sh +3 -1
- package/assets/hooks/dev-server-guard.sh +5 -3
- package/assets/hooks/dispatch.sh +69 -0
- package/assets/hooks/docs-guard.sh +6 -4
- package/assets/hooks/exam-guard.sh +5 -3
- package/assets/hooks/git-guard-delivery.sh +37 -5
- package/assets/hooks/git-guard-main.sh +6 -4
- package/assets/hooks/git-guard-push-tests.sh +6 -4
- package/assets/hooks/grill-gate.sh +4 -2
- package/assets/hooks/handoff-entry-guard.sh +4 -2
- package/assets/hooks/handoff-write.sh +27 -6
- package/assets/hooks/hook-input.sh +54 -0
- package/assets/hooks/lint-after-edit.sh +5 -3
- package/assets/hooks/postmortem-guard.sh +3 -1
- package/assets/hooks/proposal-guard.sh +3 -1
- package/assets/hooks/prose-style-guard.sh +5 -3
- package/assets/hooks/qa-dataid-guard.sh +4 -2
- package/assets/hooks/rerun-guard.sh +5 -3
- package/assets/hooks/reuse-first-guard.sh +5 -3
- package/assets/hooks/rule-article.sh +99 -0
- package/assets/hooks/skill-gate-rearm.sh +3 -1
- package/assets/hooks/skill-gate.sh +23 -2
- package/assets/hooks/skill-loaded.sh +3 -1
- package/assets/hooks/sql-guard-request.sh +2 -1
- package/assets/hooks/sql-guard.sh +4 -2
- package/assets/hooks/task-flow-guard.sh +6 -4
- package/assets/hooks/turn-exit-guard.sh +42 -17
- package/assets/hooks/waiting-turn-guard.sh +3 -1
- package/assets/hooks/window-fill-guard.sh +6 -4
- package/assets/laws/work-conduct.md +5 -9
- package/assets/patterns/dependencies-upgrade.md +1 -1
- package/assets/patterns/doc-style-write.md +3 -3
- package/assets/patterns/git-workflow-commit.azure.md +2 -202
- package/assets/patterns/git-workflow-commit.github.md +2 -258
- package/assets/patterns/git-workflow-commit.gitlab.md +1 -217
- package/assets/patterns/git-workflow-docker.md +3 -3
- package/assets/patterns/git-workflow-merge.md +3 -2
- package/assets/patterns/git-workflow-migration.md +3 -3
- package/assets/patterns/git-workflow-pr.azure.md +224 -0
- package/assets/patterns/git-workflow-pr.github.md +280 -0
- package/assets/patterns/git-workflow-pr.gitlab.md +240 -0
- package/assets/patterns/git-workflow-restart.md +3 -3
- package/assets/patterns/git-workflow-secrets.md +3 -3
- package/assets/patterns/task-flow-archive.md +193 -0
- package/assets/patterns/task-flow-close.md +3 -173
- package/assets/patterns/task-flow-handoff.md +4 -4
- package/assets/pitfalls/doc-style.md +80 -0
- package/assets/pitfalls/git-workflow.azure.md +50 -0
- package/assets/pitfalls/git-workflow.github.md +78 -0
- package/assets/pitfalls/git-workflow.gitlab.md +49 -0
- package/assets/pitfalls/spec-driven.md +36 -0
- package/assets/pitfalls/styling-bem.md +45 -0
- package/assets/pitfalls/task-flow.md +62 -0
- package/assets/pitfalls/testing.md +70 -0
- package/assets/rules/deploy-flow.azure.md +106 -0
- package/assets/rules/deploy-flow.github.md +113 -0
- package/assets/rules/deploy-flow.gitlab.md +108 -0
- package/assets/rules/doc-style.md +25 -76
- package/assets/rules/git-workflow.azure.md +6 -92
- package/assets/rules/git-workflow.github.md +14 -127
- package/assets/rules/git-workflow.gitlab.md +6 -93
- package/assets/rules/spec-driven.md +39 -30
- package/assets/rules/styling-bem.md +20 -39
- package/assets/rules/task-flow.md +17 -199
- package/assets/rules/testing.md +3 -64
- package/assets/rules/turn-conduct.md +206 -0
- package/assets/rules/typescript-conventions.md +15 -0
- package/assets/skills/agent-kit.md +35 -12
- package/assets/templates/pitfalls.md +10 -0
- package/assets/templates/rule.md +5 -3
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +1 -42
- package/bin/agent-kit.js.map +1 -1
- package/lib/assets.d.ts.map +1 -1
- package/lib/assets.js +6 -1
- package/lib/assets.js.map +1 -1
- package/lib/cascade.d.ts.map +1 -1
- package/lib/cascade.js +19 -1
- package/lib/cascade.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +1 -0
- package/lib/commands.js.map +1 -1
- package/lib/config.d.ts +16 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +8 -0
- package/lib/config.js.map +1 -1
- package/lib/hooks-map.d.ts +13 -0
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +33 -1
- package/lib/hooks-map.js.map +1 -1
- package/lib/ship.d.ts +1 -2
- package/lib/ship.d.ts.map +1 -1
- package/lib/ship.js +0 -54
- package/lib/ship.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.12.0.tgz +0 -0
- package/assets/commands/agent-kit-digest.md +0 -89
- package/assets/commands/rules-review.md +0 -98
- package/assets/patterns/cargo-triage-mark.md +0 -119
- package/assets/rules/cargo-triage.md +0 -126
- package/lib/cargo-state.d.ts +0 -62
- package/lib/cargo-state.d.ts.map +0 -1
- package/lib/cargo-state.js +0 -118
- package/lib/cargo-state.js.map +0 -1
- package/rt-tools-agent-kit-0.11.0.tgz +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: task-flow
|
|
3
3
|
kind: rule
|
|
4
4
|
law: work-conduct
|
|
5
|
-
description: Правило под «Закон о ведении
|
|
5
|
+
description: Правило под «Закон о ведении работы» — та его часть, что про ход работы от просьбы владельца до слияния. Брать в начале любой работы от владельца, при правке папок задач и договорённостей о продукте, при возвращении к незаконченной задаче. Называет разбор просьбы до первой правки, папку задачи по имени ветки, состояния работы и их обязательные действия, договорённость о продукте до кода, разбор папки при закрытии. Готовый порядок — в паттернах task-flow-start, task-flow-resume, task-flow-close и task-flow-archive. Чем кончается ход и что стерегут стражи — правило turn-conduct.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Ведение работы — как это устроено здесь
|
|
@@ -11,6 +11,10 @@ description: Правило под «Закон о ведении работы»
|
|
|
11
11
|
про ход работы; здесь — чем это названо в этом дереве, где лежит и что из закона у нас не
|
|
12
12
|
проверяется.
|
|
13
13
|
|
|
14
|
+
**Холодная часть:** `pitfalls.md` рядом — ловушки и поведение по разборам происшествий.
|
|
15
|
+
Грузится по требованию, а не вместе с правилом: при обычном решении она не нужна — она нужна
|
|
16
|
+
тому, кто разбирает промах или спорит с гардом.
|
|
17
|
+
|
|
14
18
|
**Требует:** `hooks/task-flow-guard.sh`, `hooks/task-context-load.sh`, `hooks/grill-gate.sh`, `hooks/window-fill-guard.sh`, `hooks/turn-exit-guard.sh`
|
|
15
19
|
|
|
16
20
|
## Как это называется здесь
|
|
@@ -40,12 +44,8 @@ description: Правило под «Закон о ведении работы»
|
|
|
40
44
|
пока действие не сделано, работа стоит в том же состоянии. Список шагов этого не давал: шаг
|
|
41
45
|
кончался, а что делать дальше, выводилось из соседних строк.
|
|
42
46
|
|
|
43
|
-
Состояние объявляется
|
|
44
|
-
перезаписывается вместе с
|
|
45
|
-
|
|
46
|
-
```markdown
|
|
47
|
-
- **Состояние:** `этап-идёт`
|
|
48
|
-
```
|
|
47
|
+
Состояние объявляется в разделе «Где стоим» хода работы машиночитаемой строкой
|
|
48
|
+
``- **Состояние:** `этап-идёт` `` и перезаписывается вместе с ним.
|
|
49
49
|
|
|
50
50
|
| Состояние | Вход в него | Обязательное действие | Ведёт паттерн |
|
|
51
51
|
| ------------------------- | ----------------------------------------------- | ------------------------------------------------------ | ------------------ |
|
|
@@ -58,47 +58,20 @@ description: Правило под «Закон о ведении работы»
|
|
|
58
58
|
| `этапы-кончились` | все этапы отмечены | прогнать набор и открыть PR черновиком | `task-flow-close` |
|
|
59
59
|
| `работа-отдана` | PR открыт черновиком | взять следующую задачу | `task-flow-resume` |
|
|
60
60
|
| `разбор-кончился` | прогон зелёный, замечаний нет | влить договорённость, привести тексты, разобрать папку | `task-flow-close` |
|
|
61
|
-
| `папка-разобрана` | папки в ветке нет, запись в архиве есть | снять черновик и попросить влить | `task-flow-
|
|
62
|
-
| `влито` | PR слит человеком | разбор работы правилами и сверка очереди | `task-flow-
|
|
61
|
+
| `папка-разобрана` | папки в ветке нет, запись в архиве есть | снять черновик и попросить влить | `task-flow-archive` |
|
|
62
|
+
| `влито` | PR слит человеком | разбор работы правилами и сверка очереди | `task-flow-archive` |
|
|
63
63
|
|
|
64
64
|
Ни у одного состояния обязательное действие не звучит как «ждать»: ожидание чужого шага
|
|
65
|
-
состоянием работы не
|
|
66
|
-
взгляда быстрее не
|
|
67
|
-
следующую задачу, а не на открытый PR.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
Ведёт закрытие захода паттерн `task-flow-handoff`.
|
|
65
|
+
состоянием работы не является — прогон, разбор владельцем и слияние идут без исполнителя и от
|
|
66
|
+
взгляда быстрее не становятся, поэтому в `работа-отдана` обязательное действие смотрит на
|
|
67
|
+
следующую задачу, а не на открытый PR. Заполнение окна захода состоянием тоже не бывает: заход
|
|
68
|
+
кончается передачей, работа остаётся в том состоянии, в каком стояла, а следующий заход читает
|
|
69
|
+
строку и продолжает с неё. Чем ход кончается и что его концом не бывает — правило
|
|
70
|
+
`turn-conduct` под тем же законом.
|
|
72
71
|
|
|
73
72
|
Перечень показывается владельцу в начале работы, и на нём же отмечается, где стоим: иначе после
|
|
74
73
|
шести вопросов не видно ни того, что будет дальше, ни сколько всего впереди.
|
|
75
74
|
|
|
76
|
-
## Выходы хода
|
|
77
|
-
|
|
78
|
-
Ход кончается четырьмя способами, и других нет:
|
|
79
|
-
|
|
80
|
-
| Выход | Чем подтверждается |
|
|
81
|
-
| -------------------------------------------------- | --------------------------------------------------------------- |
|
|
82
|
-
| вопрос владельцу, ответа на который в правилах нет | вопрос задан, и за тот же ход правила читались |
|
|
83
|
-
| отказ гарда | отказ назван владельцу, обход не искался |
|
|
84
|
-
| заполненное окно там, где сжатия нет | ход работы дописан, передача написана |
|
|
85
|
-
| работа отдана, и следующая начата | PR открыт, и по следующей задаче сделано действие, а не сказано |
|
|
86
|
-
|
|
87
|
-
Всё остальное — продолжение хода, а не его конец. Веха ходом не кончается: ни коммит, ни
|
|
88
|
-
прочитанная договорённость, ни граница «прочитал — сейчас правлю», ни зелёная проверка. Слова
|
|
89
|
-
«иду дальше» и «работаю дальше» владелец читает как совершающееся действие, и писать их вместо
|
|
90
|
-
результата нельзя.
|
|
91
|
-
|
|
92
|
-
Переход из состояния в состояние ходом не кончается тем более: обязательное
|
|
93
|
-
действие сделано, и следующее делается тем же ходом. Граница состояния выглядит законченным
|
|
94
|
-
куском лучше всякой другой вехи — сделанное названо, отчитаться есть чем, — и отчёт встаёт
|
|
95
|
-
ровно туда, где должно было стоять следующее действие. Что делается сразу за обязательным
|
|
96
|
-
действием, называет сам раздел состояния строкой следующего движения.
|
|
97
|
-
|
|
98
|
-
Три способа кончить ход выглядят работой и ею не являются: сводка о чужом шаге, меню при
|
|
99
|
-
назначенном порядке и объявление намерения. Что при этом должно быть верно — ниже, в статьях
|
|
100
|
-
о применении закона.
|
|
101
|
-
|
|
102
75
|
## Ход
|
|
103
76
|
|
|
104
77
|
Ход работы от просьбы владельца до закрытия: где стоит разбор, что требует гард и куда девается
|
|
@@ -181,111 +154,8 @@ flowchart TD
|
|
|
181
154
|
правку кода приложения, и работа, которая туда не доходит, проходит мимо него — но папку
|
|
182
155
|
заводит всё равно: статья правила говорит «под любую работу, без исключений». Прочитанный
|
|
183
156
|
как признак, гард становится разрешением работать без замысла везде, куда он не смотрит.
|
|
184
|
-
- **Сводка о чужом шаге.** Прогон, разбор владельцем и слияние идут без исполнителя и от взгляда
|
|
185
|
-
быстрее не становятся. Ход, кончившийся такой сводкой, владелец читает как работу: она полна,
|
|
186
|
-
в ней названы номера и состояния, и пустоты за ней не видно. О чужом шаге говорят вместе с
|
|
187
|
-
начатым своим, а не вместо него. За один заход это было нарушено четырежды, и готовая работа
|
|
188
|
-
простояла в невлитом PR почти три часа.
|
|
189
|
-
- **Меню при назначенном порядке.** Выбор, предложенный владельцу, пока эпик не кончился, — это
|
|
190
|
-
просьба назначить порядок заново. Работы в эпике не осталось — так и говорится: эпик
|
|
191
|
-
кончился, — а не «чем займёмся».
|
|
192
|
-
- **Объявление намерения.** «Беру следующую задачу» — не то же самое, что взять её: фраза живёт
|
|
193
|
-
до конца хода, а работа не двигается. Названо может быть только сделанное: номер заведённой
|
|
194
|
-
задачи, имя заведённой ветки, переведённая колонка.
|
|
195
|
-
|
|
196
|
-
- **Прерывание работы владельцем называется вслух.** Пришло задание, останавливающее начатое, —
|
|
197
|
-
исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только
|
|
198
|
-
потом берётся за новое. Молчание об этом владелец читает как «прежнее кончилось».
|
|
199
|
-
- **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет —
|
|
200
|
-
владелец читает отчёт как рассказ о сделанном. Называются три вещи: что стоит, чего оно ждёт
|
|
201
|
-
и что владелец может решить.
|
|
202
|
-
- **Выходы хода стережёт страж, а не память исполнителя.** Он читает объявленное состояние
|
|
203
|
-
работы и то, что за ход по ней сделано: правку файла или команду, меняющую дерево. Ход, в
|
|
204
|
-
котором не было ни того ни другого, возвращается исполнителю вместе со следующим шагом из
|
|
205
|
-
хода работы. Отданную и влитую работу страж не судит: она уже дождалась чужого шага.
|
|
206
|
-
- **Этап замысла объявляется закрытым только после того, как его команда проверки прошла.**
|
|
207
|
-
Строка «Чем проверяется» несёт команду обратными кавычками и то, что в её выводе означает
|
|
208
|
-
«сошлось». Страж читает прежний номер этапа из истории ветки и не выпускает ход, в котором
|
|
209
|
-
номер вырос, а команда не запускалась: через заход отмеченное по памяти неотличимо от
|
|
210
|
-
проверенного.
|
|
211
|
-
- **Слово об остановке страж читает у владельца, а не у исполнителя.** Иначе остановку
|
|
212
|
-
объявляет тот, кому она в эту минуту удобна, и запрет держится ровно до первого неудобства.
|
|
213
|
-
- **Утверждение о состоянии дерева стережёт гард утверждения, а не память исполнителя.** Всё,
|
|
214
|
-
что ответ владельцу говорит о дереве, несёт команду и её вывод: сказанное без команды
|
|
215
|
-
утверждением не считается — ни «проверено», ни «снято», ни «готово». Гард читает текст,
|
|
216
|
-
сказанный владельцу за ход, и ищет команду того же хода; у каждого слова назван свой род
|
|
217
|
-
команды, потому что общий признак «команда была» подтверждал бы одно другим. Прошлый ход не
|
|
218
|
-
годится: состояние дерева меняется, и вчерашний вывод о нынешнем молчит. Восемь разборов
|
|
219
|
-
подряд пришлись на этот промах, и каждый раз в правило дописывалась ещё одна статья —
|
|
220
|
-
держит его теперь машина.
|
|
221
|
-
- **Слово-утверждение гард ловит, неверный вывод — нет.** Об образце, судимом по одному его
|
|
222
|
-
файлу, и о пути, которым человек не пойдёт, судить нечем: там нет ни слова, ни команды, с
|
|
223
|
-
которой сверять. Это известная граница гарда, и держат её статьи ниже, а не он.
|
|
224
|
-
- **Ход о чужом шаге стережёт гард ожидания, а не память исполнителя.** Он отбивает завершение
|
|
225
|
-
хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия —
|
|
226
|
-
ни заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
|
|
227
|
-
признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Оба берутся из самого хода:
|
|
228
|
-
спросить хостинг было бы точнее, но сетевой вызов на завершении хода падает вместе со связью
|
|
229
|
-
и отбивал бы работу вместо промаха, а вывод команды о прогоне в записи хода уже лежит. Слова
|
|
230
|
-
«беру следующую задачу» гард действием не считает — ровно потому, что их и произносят вместо
|
|
231
|
-
неё.
|
|
232
|
-
- **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
|
|
233
|
-
запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
|
|
234
|
-
следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
|
|
235
|
-
повторяется вовсе, и оба исхода со стороны выглядят одинаково — работа не двигается.
|
|
236
|
-
- **Отказ гарда кончает ход.** Другого пути к отбитой правке не ищут: ни командой оболочки, ни
|
|
237
|
-
соседним инструментом, ни правкой самого гарда. Отбитая правка либо делается после того, как
|
|
238
|
-
условие отказа выполнено, либо не делается вовсе — и тогда владельцу называется отказ, а не
|
|
239
|
-
результат. Обход стоит дороже отказа: гард отбивает один файл, а обойдённый гард снимает
|
|
240
|
-
требование со всего дерева и молчит об этом. Держится это не только памятью — гарды судят и
|
|
241
|
-
команду оболочки, которая пишет файл.
|
|
242
|
-
- **Ход, в котором владельцу задан вопрос, не заканчивается, пока за этот же ход не читались
|
|
243
|
-
законы и правила.** Чтением считается любой из трёх путей: загрузка правила, чтение файла
|
|
244
|
-
законов или правил, поиск по ним. Отбивает гард разговора — на завершении хода, а не на
|
|
245
|
-
инструменте вопроса: спрашивают чаще прозой, чем меню. Найденное ложится в раздел «Что уже
|
|
246
|
-
сказано в правилах» разбора.
|
|
247
|
-
- **Действия, которые исполнитель не делает без слова владельца, перечислены в компаньоне
|
|
248
|
-
правила.** Список у каждого дерева свой — пакет знает только требование, чтобы список был
|
|
249
|
-
назван. Не названный, он выводится из общих слов, и «делай, что нужно по плану» становится
|
|
250
|
-
разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка
|
|
251
|
-
не заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт. За один заход одна
|
|
252
|
-
и та же команда была сначала слишком опасной, чтобы её позвать, а через два хода —
|
|
253
|
-
достаточно безопасной, чтобы позвать без спроса.
|
|
254
|
-
- **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование
|
|
255
|
-
спросить владельца относится к действию, а не к ходу: работа, у которой отделима часть без
|
|
256
|
-
последствий, делится, а не откладывается целиком. Список вариантов, поданный вместо работы,
|
|
257
|
-
читается как работа — тем полнее, чем аккуратнее он составлен: он пронумерован, в нём названы
|
|
258
|
-
цифры, и именно поэтому пустота хода за ним не видна. Владельцу называется, что уже сделано и
|
|
259
|
-
что осталось за его словом, — а не выбор из вариантов вместо и того и другого.
|
|
260
|
-
- **Ход, в котором исполнитель признал промах, не заканчивается, пока записи о происшествии
|
|
261
|
-
нет.** Отбивает гард происшествия — на завершении хода: к моменту признания промах уже
|
|
262
|
-
случился, и ловить раньше нечего. Признание ловится набором образцов, а не пониманием смысла;
|
|
263
|
-
промах, признанный словами вне набора, гард пропускает, и это его известная граница, а не
|
|
264
|
-
обещание.
|
|
265
|
-
- **Заход, начатый с передачи, входит в работу тем же правилом, что и всякий другой.** Передача
|
|
266
|
-
лежит вне дерева, её не читает ни одна проверка, и написана она вчера: всё, что в ней стоит,
|
|
267
|
-
проверяется деревом. Порядок входа — четыре шага в паттерне возвращения; стережёт его гард, а
|
|
268
|
-
не память: порядок, записанный только словами, исполняется, пока о нём помнят.
|
|
269
|
-
- **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход
|
|
270
|
-
работы отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт
|
|
271
|
-
предупреждение с готовой командой, но сессию не рвёт.
|
|
272
157
|
- **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом,
|
|
273
158
|
а не дописывается: это первое, что читает следующий заход.
|
|
274
|
-
- **Заполненное окно кончает ход только там, где сжатия нет.** Где оно объявлено, окно —
|
|
275
|
-
продолжение хода: заход сжимается и работает дальше, а порог остановки срабатывает лишь тогда,
|
|
276
|
-
когда сжатие не пришло.
|
|
277
|
-
- **Заполнение окна захода стережёт гард, а не память исполнителя.** На первом пороге он
|
|
278
|
-
напоминает выбирать точку остановки, на втором отбивает всё, кроме записи хода работы,
|
|
279
|
-
передачи и команд поставки. Размер окна и оба порога дерево задаёт само; не задавшее размера
|
|
280
|
-
стража не получает.
|
|
281
|
-
- **Порог сжатия контекста дерево задаёт само, и стоит он НИЖЕ порога остановки.** Совпавшие
|
|
282
|
-
пороги согласием не бывают: это гонка, и выигрывает её страж — он стоит на вызове, а сжатие
|
|
283
|
-
приходит между ходами. Расстояние объявляется числом, а не выводится разницей; сведены пороги
|
|
284
|
-
или нет, говорит разбор состояния раскладки.
|
|
285
|
-
- **Заход закрывается передачей, которая лежит вне дерева.** Состояние работы коммитится ходом
|
|
286
|
-
работы, а передача его пересказывает для вставки в новый заход: рабочее дерево, ветка,
|
|
287
|
-
сделанное, следующий шаг и особенности захода. В историю она не едет — иначе рядом с ходом
|
|
288
|
-
работы заводится вторая запись об одном и том же.
|
|
289
159
|
- **Слово для нового понятия ищется в словаре дерева.** Общую часть словаря везёт пакет,
|
|
290
160
|
предметную дописывает дерево надстройкой; словарь уезжает в контекст на запуске сессии
|
|
291
161
|
целиком, поэтому «не читал» основанием не бывает.
|
|
@@ -386,57 +256,5 @@ flowchart TD
|
|
|
386
256
|
|
|
387
257
|
- `task-flow-start` — разведка, разбор, договорённость, замысел, задача и ветка.
|
|
388
258
|
- `task-flow-resume` — возвращение к незаконченной работе новым заходом.
|
|
389
|
-
- `task-flow-close` — вливание договорённости,
|
|
390
|
-
- `task-flow-
|
|
391
|
-
|
|
392
|
-
## Ловушки
|
|
393
|
-
|
|
394
|
-
- **Папка называется именем ветки, один в один.** Хук запуска ищет её по
|
|
395
|
-
`git branch --show-current`, и папка, названная иначе, не находится ничем: работа идёт с
|
|
396
|
-
пустым контекстом, а владельца просят пересказать то, что уже записано.
|
|
397
|
-
- **Разбор просьбы задним числом не переписывается.** Пересказ незаметно подгоняется под уже
|
|
398
|
-
сделанное, и сверять результат становится не с чем. Решение, изменённое по ходу, дописывается
|
|
399
|
-
в ход работы, а не правится в разборе.
|
|
400
|
-
- **Договорённость о продукте не кладётся в папку задачи.** Папка умирает с мержем, а
|
|
401
|
-
договорённость обязана его пережить: её сценарии получают номера в общей нумерации домена,
|
|
402
|
-
и на них ссылаются заголовки тестов. Обратное тоже верно — ход работы не кладётся в
|
|
403
|
-
`proposed/`: спек, в котором завелись шаги, снова становится планом и умирает после мержа.
|
|
404
|
-
- **У меню нет строки «вопрос не тот».** Меню годится для выбора значения из закрытого набора;
|
|
405
|
-
пока постановка вопроса не подтверждена, отвергнуть её владельцу нечем — он выбирает из
|
|
406
|
-
вариантов, выведенных из неверной посылки. Настройки владельца, требующие меню, требование
|
|
407
|
-
не снимают: тогда к каждому вопросу добавляется свободный вариант, и он же — единственное
|
|
408
|
-
место, где вопрос отвергается целиком. Три вопроса ушли одним меню, у одного постановка была
|
|
409
|
-
ложной, и сказать «вопрос не тот» было нечем. Выбор слова, имени и термина узким вопросом не
|
|
410
|
-
является никогда.
|
|
411
|
-
- **Субагент вопросов владельцу не задаёт.** Ни роли, ни конвейер до него не достучатся —
|
|
412
|
-
они возвращают текст главному агенту. Поэтому разбор ведёт главный агент, а роли стоят по
|
|
413
|
-
обе стороны от него.
|
|
414
|
-
- **Если дефект чинится правкой одного общего числа, спроси владельца, тем ли способом ты его
|
|
415
|
-
чинишь.** Замер показывает, что дефект ушёл, — но не то, что причину вылечили. В одной
|
|
416
|
-
задаче так ушли две правки подряд: сначала подняли общее число у соседнего узла, потом
|
|
417
|
-
перенесли узел в другое место разметки. Обе владелец отверг, а нужный способ назвал сам.
|
|
418
|
-
Спрашивают до правки, а не показывают замер после.
|
|
419
|
-
- **Путь, предложенный человеку, судится числом его шагов и тем, чем ему для этого надо
|
|
420
|
-
владеть.** Со стороны кода вариант выглядит дешёвым — «меньше путей», «строку запуска не
|
|
421
|
-
трогаем», — а человеку он стоит захода на сервер. Однажды рекомендуемым вариантом так стояла
|
|
422
|
-
выдача токена, за которой владельцу надо было идти по ssh в работающий контейнер; отбивал
|
|
423
|
-
этот вариант он сам. Цена называется со стороны того, кто пойдёт: сколько шагов и что ему для
|
|
424
|
-
них нужно. Пересказ действующего порядка без такой оценки владелец читает как одобрение.
|
|
425
|
-
- **Эпик по теме читается до того, как решается раскладка.** Замысел эпика держит решения,
|
|
426
|
-
которые пережили десяток задач, и разведка по коду их не находит: снятое решение следа в
|
|
427
|
-
дереве не оставляет. Домен, заведённый генератором и снесённый через полчаса, стоял в замысле
|
|
428
|
-
прямым запретом — но замысел открыли уже после того, как он был заведён во второй раз.
|
|
429
|
-
- **Работа, которая разбирает чужую папку задачи, разбирает и свою — одним коммитом.** Свою
|
|
430
|
-
папку она заводит наравне со всеми: исключения из этого требования нет. Круг, которым
|
|
431
|
-
исключение оправдывали, закрывается не отказом от папки, а порядком разбора: последний
|
|
432
|
-
коммит снимает обе, и после работы неубранного не остаётся. Однажды такой разбор оставил
|
|
433
|
-
свою папку, и на неё пришлось заводить третью задачу — лечится это порядком, а не правом
|
|
434
|
-
работать без замысла на диске. Как разобрать две папки — паттерн `task-flow-close`.
|
|
435
|
-
- **Слово для нового понятия берётся из `docs/GLOSSARY.md` или заводится там же.** Третий файл
|
|
436
|
-
папки задачи называется `progress.md`, а не `journal.md`, ровно поэтому: журнал в этом
|
|
437
|
-
дереве один, и он другой.
|
|
438
|
-
- **Черновик папки задачи называется тем же коротким именем, что и будущая ветка.** Команда
|
|
439
|
-
заведения ищет черновик по нему и, не найдя, молча собирает папку с образца: работа при этом
|
|
440
|
-
идёт дальше, а разбор просьбы остаётся лежать в брошенном каталоге, и следующий заход
|
|
441
|
-
расспрашивает владельца заново. Имя черновику дают словами просьбы, а ветке — терминологией
|
|
442
|
-
договорённости; те же слова, да не те же.
|
|
259
|
+
- `task-flow-close` — снятие черновика, вливание договорённости, приведение текстов.
|
|
260
|
+
- `task-flow-archive` — разбор папки задачи, переезд в описание прошлого, разбор правилами.
|
package/assets/rules/testing.md
CHANGED
|
@@ -12,6 +12,9 @@ description: Правило под «Закон о проверяемости».
|
|
|
12
12
|
применяется. Проверка работающего приложения глазами и замером — правило
|
|
13
13
|
`browser-verification` под тем же законом.
|
|
14
14
|
|
|
15
|
+
**Холодная часть:** `pitfalls.md` рядом — ловушки, грабли, на которые уже наступали.
|
|
16
|
+
Грузится по требованию, а не вместе с правилом.
|
|
17
|
+
|
|
15
18
|
## Как это называется здесь
|
|
16
19
|
|
|
17
20
|
| В законе | Здесь |
|
|
@@ -167,67 +170,3 @@ flowchart TD
|
|
|
167
170
|
- `testing-unit` — тест на чистую функцию, на процедуру Connect и разовый тест-доказательство,
|
|
168
171
|
который не коммитится.
|
|
169
172
|
- `testing-e2e` — прогон сквозных тестов, стенд под настоящим nginx, выключатели.
|
|
170
|
-
|
|
171
|
-
## Ловушки
|
|
172
|
-
|
|
173
|
-
- **Зелёный `nx test <проект>` не значит, что хоть один файл исполнялся.** Либа без своего
|
|
174
|
-
`vitest.config.mts` не запускает ничего — так тесты домена броней не запускались ни разу.
|
|
175
|
-
Либа с конфигом, но без единого `*.spec.ts`, проходит зелёной из-за `passWithNoTests: true`,
|
|
176
|
-
который обычно стоит в каждом конфиге дерева, и на глаз эти два случая неотличимы: в обоих
|
|
177
|
-
прогон успешен. Доля либ без единого теста меряется пересчётом ниже — в дереве, где его
|
|
178
|
-
завели впервые, она вышла почти в две трети. Перед правкой в
|
|
179
|
-
незнакомой либе проверяется, есть ли в ней хоть один `*.spec.ts`; если нет — первый
|
|
180
|
-
заводится этой же правкой, а не откладывается: откладывать здесь не с чего, долг уже
|
|
181
|
-
накоплен. Пересчёт: `for d in $(find libs -name vitest.config.mts -exec dirname {} \;); do
|
|
182
|
-
[ -z "$(find "$d" -name '*.spec.ts')" ] && echo "$d"; done | wc -l`.
|
|
183
|
-
- **Зелёная сводка покрытия не значит, что тесты проходят.** Сверка читает заголовки тестов и
|
|
184
|
-
сопоставляет их со сценариями спека; исполняется ли тест и чем он кончается — она не знает
|
|
185
|
-
вовсе, и падающий тест значится в ней покрытием. Три сценария одной панели падали и до правки
|
|
186
|
-
экрана, а нашлось это только прогоном. Перед правкой экрана его сквозные тесты гоняются один
|
|
187
|
-
раз до первой строки кода: иначе чужое падение читается как своя регрессия, а своё — как
|
|
188
|
-
чужое.
|
|
189
|
-
- **«Executable doesn't exist» — состояние машины, а не дефект правки.** Установлен только
|
|
190
|
-
chromium, `firefox` и `webkit` падают всегда: гонять `--project=chromium`, узкий экран —
|
|
191
|
-
`--project=mobile-chrome`. Та же ошибка приходит после смены версии Playwright: браузер
|
|
192
|
-
ставится под конкретную версию, и после подъёма нужен повторный
|
|
193
|
-
`npx playwright install chromium`. Девять тестов так и упали, и это выглядело регрессией
|
|
194
|
-
обновления.
|
|
195
|
-
- **Первому прогону сразу после установки браузера верить нельзя.** Два падения сквозного
|
|
196
|
-
набора не повторились ни при отдельном прогоне тех же тестов, ни при втором полном. Такой
|
|
197
|
-
прогон повторяют, а выводы делают по второму.
|
|
198
|
-
- Сквозная спека, которой нужен вход, без учётных данных в окружении пропускается молча — в
|
|
199
|
-
отчёте она значится `skipped`, и прогон выглядит успешным. Имена переменных — при дереве.
|
|
200
|
-
- **Справочник флоу вторых сценариев не заводит.** В `docs/E2E_<ДОМЕН>_FLOWS.md` кладут то,
|
|
201
|
-
чего в спеке домена нет и быть не должно: `qa-dataid` элементов, состояния разметки, ловушки
|
|
202
|
-
стенда. Обещанное поведение остаётся сценарием в `scenarios.md`: если списать его во второе
|
|
203
|
-
место, копии разойдутся молча — `npm run check:specs` этого не увидит.
|
|
204
|
-
- `npx nx serve` проверкой не считается: это шаг из правила `browser-verification`, а не тест.
|
|
205
|
-
- **Кадр, зависящий от загрузки машины, проверяет машину, а не вёрстку.** Ожидание отсчётом
|
|
206
|
-
времени этим и кончается: на свободной машине набор зелен целиком, на занятой падает, и какой
|
|
207
|
-
именно кадр не успел — дело случая. Лечится ожиданием события, а не удлинением отсчёта: шрифты
|
|
208
|
-
подняты, картинки нарисованы, движение остановлено, положение узла не менялось два кадра
|
|
209
|
-
подряд. Пока ожидание идёт по времени, «проверено снимками» означает «машина была свободна», и
|
|
210
|
-
перезапуск, давший зелёное, этого не отменяет, а прячет. Восемь кадров расходились с эталоном
|
|
211
|
-
на 0,15–0,74 % в задании конвейера и проходили на той же машине вне его.
|
|
212
|
-
- **Стенд, поднятый предыдущим шагом, останавливается перед съёмкой.** Оставленный работать, он
|
|
213
|
-
соревнуется за машину с тем, что снимают, и делает исход прогона зависящим от того, чем занят
|
|
214
|
-
сосед. Нагрузка, которую задание создаёт себе само — соседняя витрина, только что законченная
|
|
215
|
-
сборка, — ничем не отличается от чужой.
|
|
216
|
-
- **Свой стенд снимается перед тем, как звать набор.** Прогон переиспользует поднятое на его
|
|
217
|
-
портах, и стенд, оставленный для замера, отдаёт ему чужую сборку с чужими данными. Красное при
|
|
218
|
-
этом приходит не строкой про занятый порт, а десятком спек про экраны — то есть выглядит
|
|
219
|
-
дефектом правки: за один заход так покраснели сначала шесть новых тестов, потом гейт пуша, и
|
|
220
|
-
оба раза причиной был свой же стенд. Разобранный занятый порт эту сторону не закрывает: он про
|
|
221
|
-
чужой стенд, а этот — про свой.
|
|
222
|
-
- **Разбор упавшего кадра начинается с чисел, а не с картинки расхождения.** Доля площади
|
|
223
|
-
говорит, сколько разошлось, и молчит о том, что именно: сдвиг всего кадра на пиксель,
|
|
224
|
-
переставленные строки и рябь на сглаженных уголках выглядят на картинке одинаково — «стало
|
|
225
|
-
другим». Читаются координаты разошедшихся точек и величина расхождения по каналу: сдвинутые
|
|
226
|
-
границы блоков — это раскладка, разошедшийся текст при неподвижных границах — это данные,
|
|
227
|
-
единица-две по каналу на кривых краях — это цвет. Три расхождения одного набора разобрались
|
|
228
|
-
ровно так, и ни одно из трёх не оказалось дефектом экрана.
|
|
229
|
-
- **Ожидаемое значение теста не берётся из кода, который тест проверяет.** Вывезенное из
|
|
230
|
-
проверяемой либы, оно делает тест зелёным при любом значении: «колесо показывает пять строк»
|
|
231
|
-
сходится и тогда, когда строк стало три. Ожидаемое пишется числом в самой спеке рядом с
|
|
232
|
-
проверкой, а общий модуль сквозных спек держит приёмы — открыть, дождаться, снять со
|
|
233
|
-
страницы, — но не то, что от страницы ожидается.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turn-conduct
|
|
3
|
+
kind: rule
|
|
4
|
+
law: work-conduct
|
|
5
|
+
description: Правило под «Закон о ведении работы» — та его часть, что про один ход. Брать, когда ход заканчивают: чем он кончается и что его концом не бывает, что говорится владельцу о чужом шаге, чем подтверждается утверждение о дереве, что делает страж выходов хода, гард ожидания, гард разговора и гард происшествия, как закрывается заход по заполнению окна. Готовый порядок — в паттерне task-flow-handoff. Ход работы от просьбы владельца до слияния — правило task-flow.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Ход захода — как это устроено здесь
|
|
9
|
+
|
|
10
|
+
Правило под закон `docs/constitution/work-conduct.md` — та его часть, что про один ход.
|
|
11
|
+
Закон говорит, что должно быть верно; здесь — чем это стережётся в этом дереве. Ход работы
|
|
12
|
+
от просьбы владельца до слияния, состояния работы и папка задачи — правило `task-flow`
|
|
13
|
+
под тем же законом.
|
|
14
|
+
|
|
15
|
+
## Как это называется здесь
|
|
16
|
+
|
|
17
|
+
| В законе | Здесь |
|
|
18
|
+
| -------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
19
|
+
| ход | один заход агента: от реплики владельца до ответа ему |
|
|
20
|
+
| выход хода | один из четырёх способов кончить ход; чем подтверждается каждый — карта хода |
|
|
21
|
+
| страж выходов хода | гард на завершении хода: читает объявленное состояние работы и то, что за ход сделано в дереве |
|
|
22
|
+
| утверждение о состоянии дерева | слово ответа владельцу, за которым обязана стоять команда того же хода и её вывод |
|
|
23
|
+
| передача захода | запись вне дерева: она пересказывает ход работы для вставки в новый заход |
|
|
24
|
+
| порог сжатия и порог остановки | два числа заполнения окна; дерево задаёт их само, и первый стоит ниже второго |
|
|
25
|
+
|
|
26
|
+
## Выходы хода
|
|
27
|
+
|
|
28
|
+
Ход кончается четырьмя способами, и других нет: вопрос владельцу, ответа на который в правилах
|
|
29
|
+
нет; отказ гарда; заполненное окно там, где сжатия нет; отданная работа, за которой начата
|
|
30
|
+
следующая. Чем подтверждается каждый из четырёх, перечисляет карта хода — там, где дерево её
|
|
31
|
+
разложило.
|
|
32
|
+
|
|
33
|
+
Всё остальное — продолжение хода, а не его конец. Веха ходом не кончается: ни коммит, ни
|
|
34
|
+
прочитанная договорённость, ни граница «прочитал — сейчас правлю», ни зелёная проверка.
|
|
35
|
+
Переход из состояния в состояние — тем более: обязательное действие сделано, и следующее
|
|
36
|
+
делается тем же ходом, а граница состояния выглядит законченным куском лучше всякой другой вехи,
|
|
37
|
+
и отчёт встаёт ровно туда, где должно было стоять следующее действие.
|
|
38
|
+
|
|
39
|
+
Четыре способа кончить ход выглядят работой и ею не являются: сводка о чужом шаге, меню при
|
|
40
|
+
назначенном порядке, объявление намерения и названная, но не запущенная команда. Что при этом
|
|
41
|
+
должно быть верно — ниже, в статьях о применении закона.
|
|
42
|
+
|
|
43
|
+
## Где это лежит
|
|
44
|
+
|
|
45
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
46
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
47
|
+
же дереве, которое держит код иначе.
|
|
48
|
+
|
|
49
|
+
## Ход
|
|
50
|
+
|
|
51
|
+
Ход одного захода: чем он кончается, что проверяется до его конца и что при этом говорится
|
|
52
|
+
владельцу.
|
|
53
|
+
|
|
54
|
+
```mermaid
|
|
55
|
+
flowchart TD
|
|
56
|
+
A[Ход идёт] --> B{Что случилось}
|
|
57
|
+
B -->|Владельцу задан вопрос| C[За тот же ход читались законы и правила]
|
|
58
|
+
B -->|Гард отбил правку| D[Отказ назван владельцу, обход не искался]
|
|
59
|
+
B -->|Окно захода заполнено| E{Дерево объявило сжатие}
|
|
60
|
+
B -->|Работа отдана заявкой| F[По следующей задаче сделано действие, а не сказано]
|
|
61
|
+
B -->|Ничего из этого| G[Ход продолжается: веха его концом не бывает]
|
|
62
|
+
E -->|Да| G
|
|
63
|
+
E -->|Нет| H[Ход работы дописан, передача написана]
|
|
64
|
+
C --> I{Ответ владельцу говорит о дереве}
|
|
65
|
+
D --> I
|
|
66
|
+
F --> I
|
|
67
|
+
H --> I
|
|
68
|
+
I -->|Да| J[Каждое слово несёт команду того же хода и её вывод]
|
|
69
|
+
I -->|Нет| K[Ход кончен]
|
|
70
|
+
J --> K
|
|
71
|
+
G --> A
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Как закон применяется здесь
|
|
75
|
+
|
|
76
|
+
- **Сводка о чужом шаге.** Прогон, разбор владельцем и слияние идут без исполнителя и от взгляда
|
|
77
|
+
быстрее не становятся. Ход, кончившийся такой сводкой, владелец читает как работу: она полна,
|
|
78
|
+
в ней названы номера и состояния, и пустоты за ней не видно. О чужом шаге говорят вместе с
|
|
79
|
+
начатым своим, а не вместо него. За один заход это было нарушено четырежды, и готовая работа
|
|
80
|
+
простояла в невлитом PR почти три часа.
|
|
81
|
+
- **Меню при назначенном порядке.** Выбор, предложенный владельцу, пока эпик не кончился, — это
|
|
82
|
+
просьба назначить порядок заново. Работы в эпике не осталось — так и говорится: эпик
|
|
83
|
+
кончился, — а не «чем займёмся».
|
|
84
|
+
- **Объявление намерения.** «Беру следующую задачу» — не то же самое, что взять её: фраза живёт
|
|
85
|
+
до конца хода, а работа не двигается. Названо может быть только сделанное: номер заведённой
|
|
86
|
+
задачи, имя заведённой ветки, переведённая колонка.
|
|
87
|
+
- **Названная командой работа запускается в том же ходе, где названа.** Строка «сейчас запущу»
|
|
88
|
+
ходом не кончается: либо запуск уже был, либо ход не кончен. Названная поимённо команда
|
|
89
|
+
выглядит начатой работой лучше всякого другого обещания — она точна, её видно, и по ней не
|
|
90
|
+
отличить сделанного от собранного. Ответ владельцу пишется после вызова, а не вместо него:
|
|
91
|
+
реплика посреди хода отвечается вместе с начатым действием. Дважды за сутки ход кончился
|
|
92
|
+
ровно такой строкой, и оба раза владелец возвращал работу сам.
|
|
93
|
+
|
|
94
|
+
- **Прерывание работы владельцем называется вслух.** Пришло задание, останавливающее начатое, —
|
|
95
|
+
исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только
|
|
96
|
+
потом берётся за новое. Молчание об этом владелец читает как «прежнее кончилось».
|
|
97
|
+
- **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет —
|
|
98
|
+
владелец читает отчёт как рассказ о сделанном. Называются три вещи: что стоит, чего оно ждёт
|
|
99
|
+
и что владелец может решить.
|
|
100
|
+
- **Выходы хода стережёт страж, а не память исполнителя.** Он читает объявленное состояние
|
|
101
|
+
работы и то, что за ход по ней сделано: правку файла или команду, меняющую дерево. Ход, в
|
|
102
|
+
котором не было ни того ни другого, возвращается исполнителю вместе со следующим шагом из
|
|
103
|
+
хода работы. Отданную и влитую работу страж не судит: она уже дождалась чужого шага.
|
|
104
|
+
- **Работа без ветки и без папки задачи судится тем же стражем по второму признаку.** Состояния
|
|
105
|
+
у неё нет, и первый признак взять неоткуда, — но ход, в котором не было ни одной правки
|
|
106
|
+
дерева, не кончается и здесь. Раньше страж отпускал такую работу молча, и защищена она была
|
|
107
|
+
меньше всего: просьба владельца «разложи», «обнови», «посмотри» идёт без задачи и без ветки,
|
|
108
|
+
и именно она чаще всего кончалась объявлением намерения.
|
|
109
|
+
- **Передача пишется и там, где имени у ветки нет.** Всё, что в неё едет, лежит в дереве и на
|
|
110
|
+
отсоединённой голове доступно целиком; имя нужно одному файлу, и он называется коротким
|
|
111
|
+
снимком головы. Молчание хука здесь стоит дороже прочего: сжатие приходит без передачи, и
|
|
112
|
+
следующий заход начинает с пустого места.
|
|
113
|
+
- **Этап замысла объявляется закрытым только после того, как его команда проверки прошла.**
|
|
114
|
+
Строка «Чем проверяется» несёт команду обратными кавычками и то, что в её выводе означает
|
|
115
|
+
«сошлось». Страж читает прежний номер этапа из истории ветки и не выпускает ход, в котором
|
|
116
|
+
номер вырос, а команда не запускалась: через заход отмеченное по памяти неотличимо от
|
|
117
|
+
проверенного.
|
|
118
|
+
- **Слово об остановке страж читает у владельца, а не у исполнителя.** Иначе остановку
|
|
119
|
+
объявляет тот, кому она в эту минуту удобна, и запрет держится ровно до первого неудобства.
|
|
120
|
+
- **Утверждение о состоянии дерева стережёт гард утверждения, а не память исполнителя.** Всё,
|
|
121
|
+
что ответ владельцу говорит о дереве, несёт команду и её вывод: сказанное без команды
|
|
122
|
+
утверждением не считается — ни «проверено», ни «снято», ни «готово». Гард читает текст,
|
|
123
|
+
сказанный владельцу за ход, и ищет команду того же хода; у каждого слова назван свой род
|
|
124
|
+
команды, потому что общий признак «команда была» подтверждал бы одно другим. Прошлый ход не
|
|
125
|
+
годится: состояние дерева меняется, и вчерашний вывод о нынешнем молчит. Восемь разборов
|
|
126
|
+
подряд пришлись на этот промах, и каждый раз в правило дописывалась ещё одна статья —
|
|
127
|
+
держит его теперь машина.
|
|
128
|
+
- **Слово-утверждение гард ловит, неверный вывод — нет.** Об образце, судимом по одному его
|
|
129
|
+
файлу, и о пути, которым человек не пойдёт, судить нечем: там нет ни слова, ни команды, с
|
|
130
|
+
которой сверять. Это известная граница гарда, и держат её статьи ниже, а не он.
|
|
131
|
+
- **Ход о чужом шаге стережёт гард ожидания, а не память исполнителя.** Он отбивает завершение
|
|
132
|
+
хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия —
|
|
133
|
+
ни заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
|
|
134
|
+
признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Оба берутся из самого хода:
|
|
135
|
+
спросить хостинг было бы точнее, но сетевой вызов на завершении хода падает вместе со связью
|
|
136
|
+
и отбивал бы работу вместо промаха, а вывод команды о прогоне в записи хода уже лежит. Слова
|
|
137
|
+
«беру следующую задачу» гард действием не считает — ровно потому, что их и произносят вместо
|
|
138
|
+
неё.
|
|
139
|
+
- **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
|
|
140
|
+
запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
|
|
141
|
+
следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
|
|
142
|
+
повторяется вовсе, и оба исхода со стороны выглядят одинаково — работа не двигается.
|
|
143
|
+
- **Отказ гарда кончает ход.** Другого пути к отбитой правке не ищут: ни командой оболочки, ни
|
|
144
|
+
соседним инструментом, ни правкой самого гарда. Отбитая правка либо делается после того, как
|
|
145
|
+
условие отказа выполнено, либо не делается вовсе — и тогда владельцу называется отказ, а не
|
|
146
|
+
результат. Обход стоит дороже отказа: гард отбивает один файл, а обойдённый гард снимает
|
|
147
|
+
требование со всего дерева и молчит об этом. Держится это не только памятью — гарды судят и
|
|
148
|
+
команду оболочки, которая пишет файл.
|
|
149
|
+
- **Ход, в котором владельцу задан вопрос, не заканчивается, пока за этот же ход не читались
|
|
150
|
+
законы и правила.** Чтением считается любой из трёх путей: загрузка правила, чтение файла
|
|
151
|
+
законов или правил, поиск по ним. Отбивает гард разговора — на завершении хода, а не на
|
|
152
|
+
инструменте вопроса: спрашивают чаще прозой, чем меню. Найденное ложится в раздел «Что уже
|
|
153
|
+
сказано в правилах» разбора.
|
|
154
|
+
- **Действия, которые исполнитель не делает без слова владельца, перечислены в компаньоне
|
|
155
|
+
правила.** Список у каждого дерева свой — пакет знает только требование, чтобы список был
|
|
156
|
+
назван. Не названный, он выводится из общих слов, и «делай, что нужно по плану» становится
|
|
157
|
+
разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка
|
|
158
|
+
не заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт. За один заход одна
|
|
159
|
+
и та же команда была сначала слишком опасной, чтобы её позвать, а через два хода —
|
|
160
|
+
достаточно безопасной, чтобы позвать без спроса.
|
|
161
|
+
- **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование
|
|
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
|
+
Признание промаха ловится набором образцов, а не пониманием смысла: промах, признанный
|
|
202
|
+
словами вне набора, гард происшествия пропускает. Это его известная граница, а не обещание.
|
|
203
|
+
|
|
204
|
+
## Паттерны
|
|
205
|
+
|
|
206
|
+
- `task-flow-handoff` — закрытие захода по заполнению окна: точка остановки и передача.
|