@rt-tools/agent-kit 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/assets/checks/board-runs.github.mjs +132 -0
  2. package/assets/checks/board.github.mjs +43 -41
  3. package/assets/checks/check-board.github.mjs +73 -8
  4. package/assets/checks/check-schema-drift.mjs +28 -5
  5. package/assets/checks/rt-kit-checks.config.mjs +12 -0
  6. package/assets/checks/task-new.github.mjs +15 -3
  7. package/assets/commands/feedback.md +8 -0
  8. package/assets/defaults/project.sh +50 -5
  9. package/assets/hooks/browser-guard-no-other-drivers.sh +1 -1
  10. package/assets/hooks/claim-guard.sh +34 -0
  11. package/assets/hooks/dev-server-guard.sh +1 -1
  12. package/assets/hooks/dispatch.sh +48 -15
  13. package/assets/hooks/git-guard-delivery-folder.sh +99 -0
  14. package/assets/hooks/git-guard-delivery-signature.sh +10 -4
  15. package/assets/hooks/git-guard-delivery.sh +21 -69
  16. package/assets/hooks/git-guard-push-tests.sh +2 -2
  17. package/assets/hooks/hook-input.sh +62 -0
  18. package/assets/hooks/override-write-guard.sh +107 -0
  19. package/assets/hooks/rerun-guard.sh +1 -1
  20. package/assets/hooks/rule-source-guard.sh +126 -0
  21. package/assets/hooks/task-flow-guard.sh +18 -0
  22. package/assets/hooks/turn-exit-guard.sh +33 -1
  23. package/assets/hooks/waiting-turn-guard.sh +39 -3
  24. package/assets/patterns/git-workflow-pr.azure.md +4 -4
  25. package/assets/patterns/git-workflow-pr.github.md +4 -4
  26. package/assets/patterns/git-workflow-pr.gitlab.md +4 -4
  27. package/assets/patterns/task-flow-archive.md +23 -21
  28. package/assets/patterns/task-flow-close.md +98 -96
  29. package/assets/patterns/task-flow-resume.md +5 -3
  30. package/assets/pitfalls/agent-kit.md +80 -0
  31. package/assets/pitfalls/git-workflow.github.md +8 -0
  32. package/assets/rules/deploy-flow.azure.md +15 -7
  33. package/assets/rules/deploy-flow.github.md +15 -6
  34. package/assets/rules/deploy-flow.gitlab.md +15 -7
  35. package/assets/rules/git-workflow.github.md +10 -5
  36. package/assets/rules/task-flow.md +44 -26
  37. package/assets/rules/turn-conduct.md +33 -0
  38. package/assets/skills/agent-kit.md +32 -77
  39. package/assets/templates/proposal.md +16 -1
  40. package/lib/proposals.d.ts +5 -1
  41. package/lib/proposals.d.ts.map +1 -1
  42. package/lib/proposals.js +74 -5
  43. package/lib/proposals.js.map +1 -1
  44. package/lib/shipment.d.ts.map +1 -1
  45. package/lib/shipment.fixture.d.ts +39 -0
  46. package/lib/shipment.fixture.d.ts.map +1 -0
  47. package/lib/shipment.fixture.js +99 -0
  48. package/lib/shipment.fixture.js.map +1 -0
  49. package/lib/shipment.js +59 -7
  50. package/lib/shipment.js.map +1 -1
  51. package/package.json +1 -1
  52. package/rt-tools-agent-kit-0.14.0.tgz +0 -0
  53. package/rt-tools-agent-kit-0.12.0.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. Брать при доведении работы до готовности — снятие черновика, вливание договорённости в спек домена последним коммитом PR, приведение текстов домена к сделанному. Не брать для разбора папки задачи и разбора работы правилами — это паттерн task-flow-archive; не брать для хода работы — это паттерн task-flow-resume.
5
+ description: Паттерн правила task-flow. Брать при доведении работы до готовности — вливание договорённости в спек домена, приведение текстов домена к сделанному, открытие заявки черновиком и снятие черновика. Не брать для разбора папки задачи и разбора работы правилами — это паттерн task-flow-archive; не брать для хода работы — это паттерн task-flow-resume.
6
6
  ---
7
7
 
8
8
  # Закрытие работы
@@ -12,104 +12,19 @@ description: Паттерн правила task-flow. Брать при дове
12
12
 
13
13
  ## Когда брать
14
14
 
15
- - Этапы замысла закрыты, проверки зелёные, с PR снимается черновик.
15
+ - Этапы замысла закрыты, набор гейта прогнан целиком.
16
16
  - `npm run check:specs` перечислил договорённость в разделе «Пора вливать».
17
17
  - Тексты домена приводятся к тому, что работа сделала.
18
+ - Папка задачи разобрана, и заявка открывается черновиком.
19
+ - Прогон на вершине зелёный, и с заявки снимается черновик.
18
20
 
19
- Само открытие PR сюда не относится: он открывается черновиком тем ходом, которым правка
20
- кода отдаётся владельцу, то есть до этого паттерна и, как правило, задолго до него. Здесь
21
- работа доводится до готовности и черновик снимается.
21
+ Разбор самой папки сюда не относится это паттерн `task-flow-archive`. Он стоит между
22
+ приведением текстов и открытием заявки: заявка открывается уже за убранной работой.
22
23
 
23
- ## Состояние `этапы-кончились`: работа отдаётся на разбор
24
+ ## Состояние `этапы-кончились`: договорённость вливается в спек домена
24
25
 
25
- PR открыт черновиком и с этой минуты работа ждёт владельца, а не машину. Заход на этом не
26
- кончается: следующая задача эпика берётся тем же движением, паттерн `task-flow-resume`.
27
-
28
- **Заход, открывший PR, называет оставшийся шаг в двух местах — разделом в теле PR и словами
29
- владельцу:** после одобрения ветка получает ещё один коммит — разбор папки, — и только потом
30
- вливается. Порядок этот записан здесь, а читает его исполнитель; вливает же владелец, и
31
- молчание он читает как «работа кончена» — видит зелёный PR и мержит его тем же ходом. Промах
32
- случается ровно в шов между двумя ходами, и стоит он отдельной задачи: после слияния папку
33
- разбирать уже некому.
34
-
35
- ### Два сообщения владельцу, и между ними — прогон
36
-
37
- Оба обязательны, и порядок между ними один. Ни одно не заменяется другим: первое говорит, что
38
- работа отдана и чего она ждёт, второе — что она готова.
39
-
40
- Сразу после открытия PR:
41
-
42
- ```
43
- PR #<номер> открыт черновиком. Жду прогона: пока он идёт, о работе известно только то, что
44
- она запушена. Как закончится — разберу папку задачи последним коммитом, сниму черновик и
45
- попрошу тебя влить. Следующая задача уже взята: #<номер>, ветка <имя ветки>.
46
- ```
47
-
48
- Последняя строка называет взятое, а не намерение взять, и это не оборот речи. Образец, который
49
- кончается обещанием, исполняется как обещание: заход произносит последнюю строку и на этом
50
- кончает ход — сообщение при этом выглядит полным, и пустоты за ним не видно ни владельцу, ни
51
- самому заходу. Образец, который кончается номером заведённой ветки, так исполнить нельзя: пока
52
- ветки нет, строку писать нечем. Разбор — `2026-08-16-next-task-said-not-taken.md`.
53
-
54
- Прогон зелёный, папка разобрана и запушена, черновик снят:
55
-
56
- ```
57
- PR #<номер> готов к слиянию: прогон зелёный, папка задачи разобрана, за работой убрано,
58
- черновик снят. Влей его, пожалуйста.
59
- ```
60
-
61
- Черновик снимается перед вторым сообщением, а не после него: владелец, прочитав просьбу
62
- влить, идёт нажимать кнопку — у черновика она заблокирована, и ход возвращается к исполнителю
63
- ни за чем.
64
-
65
- Прогон красный — сообщение то же по форме, но говорит о красном и о том, что с ним делается;
66
- просьбы влить в нём нет. Просьба звучит один раз и только тогда, когда работа готова целиком:
67
- сказанная заранее, она перестаёт что-либо значить, и владелец возвращается к прежнему —
68
- вливать по зелёной странице.
69
-
70
- Между двумя сообщениями исполнитель не ждёт: работа отдана на разбор, и тем же движением
71
- берётся следующая задача. Возвращается он к PR тем ходом, которым читает конец прогона.
72
-
73
- ### Оставшийся шаг стоит разделом в теле PR
74
-
75
- Сказанного вслух мало, и одним этим требование не держится. Реплика живёт до следующей реплики,
76
- а решение о слиянии принимается на странице PR — там переписки нет вовсе. Поэтому оставшийся
77
- шаг пишется дважды: разделом в теле PR и словами владельцу. Одно другого не заменяет — тело
78
- пишется один раз и лежит у самой кнопки, разговор идёт дальше и уносит сказанное с собой.
79
-
80
- Раздел стоит последним и говорит ровно одно — что случится с веткой после одобрения:
81
-
82
- ```markdown
83
- ## Оставшийся шаг
84
-
85
- После одобрения ветка получает ещё один коммит — разбор папки задачи, — и только потом
86
- вливается. До этого коммита вливать рано: папка уедет в главную ветку неразобранной.
87
- ```
88
-
89
- Разобрана папка — раздел переписывается тем же вызовом, которым правится тело:
90
-
91
- ```markdown
92
- ## Оставшийся шаг
93
-
94
- Не осталось: папка задачи разобрана коммитом `<sha>`, черновик снят. Можно вливать.
95
- ```
96
-
97
- Пустым раздел не оставляется и не удаляется вовсе: отсутствие раздела и «шагов не осталось»
98
- читаются одинаково, а значат разное. Образец тела PR целиком — в паттерне заведения коммита
99
- и PR, если дерево его разложило.
100
-
101
- Проверить это машиной нечем, и проверки не будет: тело PR не читает ни одна сверка, а хостинг
102
- не спрашивает ни о чём, кроме заголовка. Требование держится тем же, чем и слова вслух, — тем,
103
- кто пишет тело. Разница между ними одна, и она вся: реплику владелец прочитает, только если
104
- вернётся в переписку, а раздел он видит там, куда смотрит, нажимая кнопку.
105
-
106
- **Следующее движение:** тем же ходом берётся следующая задача эпика, а разбор закрытой работы
107
- уходит в фон. Прогон и владелец идут без исполнителя, и ждать их состоянием работы не бывает.
108
-
109
- ## Состояние `разбор-кончился`: договорённость вливается в спек домена
110
-
111
- Последним коммитом PR, до слияния. Код к этому моменту написан, поэтому привязки
112
- `файл:символ` известны — правило въезжает в спек домена сразу проверяемым.
26
+ Одним из последних коммитов ветки, до открытия заявки. Код к этому моменту написан, поэтому
27
+ привязки `файл:символ` известны правило въезжает в спек домена сразу проверяемым.
113
28
 
114
29
  ```bash
115
30
  npm run check:specs # раздел «Пора вливать» называет готовые директории
@@ -138,7 +53,7 @@ npm run check:specs # после вливания: привязки на ме
138
53
  **Следующее движение:** за влитой договорённостью тем же ходом идут тексты домена — правила,
139
54
  паттерны и разделы, которые работа задела.
140
55
 
141
- ## Состояние `разбор-кончился`: тексты домена приводятся к сделанному
56
+ ## Состояние `этапы-кончились`: тексты домена приводятся к сделанному
142
57
 
143
58
  В спек уезжает только то, что записали до кода. Остальные тексты — правила, паттерны, законы
144
59
  приложения — после правки никто не перечитывает, и они продолжают описывать старое дерево.
@@ -180,7 +95,94 @@ grep -rn -A3 "Чего из закона здесь нет" <каталог пр
180
95
  не изменили — почему. Форма раздела — паттерн `git-workflow-pr`.
181
96
 
182
97
  **Следующее движение:** приведённые тексты коммитятся, и тем же ходом разбирается папка
183
- задачи — последним коммитом ветки.
98
+ задачи — последним коммитом ветки, паттерн `task-flow-archive`.
99
+
100
+ ## Состояние `папка-разобрана`: работа отдаётся заявкой
101
+
102
+ Папка разобрана и запушена, за работой убрано — заявка открывается черновиком. С этой минуты
103
+ работа ждёт владельца, а не машину, и заход на этом не кончается: следующая задача берётся тем
104
+ же движением, паттерн `task-flow-resume`.
105
+
106
+ Состояния на диске уже нет — ход работы уехал вместе с папкой. Это цена того, что уборка стоит
107
+ до заявки: хвост из четырёх шагов — открыть заявку, дождаться прогона, снять черновик, попросить
108
+ влить — держится этим паттерном, а не строкой в файле. Гард признаёт работу отданной по истории
109
+ ветки: папка, снятая её коммитом, и есть признак.
110
+
111
+ ### Два сообщения владельцу, и между ними — прогон
112
+
113
+ Оба обязательны, и порядок между ними один. Ни одно не заменяется другим: первое говорит, что
114
+ работа отдана и чего она ждёт, второе — что она готова.
115
+
116
+ Сразу после открытия заявки:
117
+
118
+ ```
119
+ PR #<номер> открыт черновиком, папка задачи уже разобрана — за работой убрано. Жду прогона:
120
+ пока он идёт, о работе известно только то, что она запушена. Как закончится — сниму черновик и
121
+ попрошу тебя влить. Следующая задача уже взята: #<номер>, ветка <имя ветки>.
122
+ ```
123
+
124
+ Последняя строка называет взятое, а не намерение взять, и это не оборот речи. Образец, который
125
+ кончается обещанием, исполняется как обещание: заход произносит последнюю строку и на этом
126
+ кончает ход — сообщение при этом выглядит полным, и пустоты за ним не видно ни владельцу, ни
127
+ самому заходу. Образец, который кончается номером заведённой ветки, так исполнить нельзя: пока
128
+ ветки нет, строку писать нечем. Разбор — `2026-08-16-next-task-said-not-taken.md`.
129
+
130
+ Прогон зелёный, черновик снят:
131
+
132
+ ```
133
+ PR #<номер> готов к слиянию: прогон зелёный, черновик снят. Влей его, пожалуйста.
134
+ ```
135
+
136
+ Черновик снимается перед вторым сообщением, а не после него: владелец, прочитав просьбу
137
+ влить, идёт нажимать кнопку — у черновика она заблокирована, и ход возвращается к исполнителю
138
+ ни за чем.
139
+
140
+ Прогон красный — сообщение то же по форме, но говорит о красном и о том, что с ним делается;
141
+ просьбы влить в нём нет. Просьба звучит один раз и только тогда, когда работа готова целиком:
142
+ сказанная заранее, она перестаёт что-либо значить, и владелец возвращается к прежнему —
143
+ вливать по зелёной странице.
144
+
145
+ Между двумя сообщениями исполнитель не ждёт: работа отдана на разбор, и тем же движением
146
+ берётся следующая задача. Возвращается он к заявке тем ходом, которым читает конец прогона.
147
+
148
+ ### Состояние работы стоит разделом в теле заявки
149
+
150
+ Сказанного вслух мало, и одним этим требование не держится. Реплика живёт до следующей реплики,
151
+ а решение о слиянии принимается на странице заявки — там переписки нет вовсе. Раздел стоит
152
+ последним и говорит ровно одно: осталось ли что-то до слияния.
153
+
154
+ ```markdown
155
+ ## Оставшийся шаг
156
+
157
+ Папка задачи разобрана коммитом `<sha>` — за работой убрано. Осталось дождаться прогона и снять
158
+ черновик; до этого кнопка слияния заблокирована хостингом.
159
+ ```
160
+
161
+ Черновик снят — раздел переписывается тем же вызовом, которым правится тело:
162
+
163
+ ```markdown
164
+ ## Оставшийся шаг
165
+
166
+ Не осталось: прогон зелёный, черновик снят. Можно вливать.
167
+ ```
168
+
169
+ Пустым раздел не оставляется и не удаляется вовсе: отсутствие раздела и «шагов не осталось»
170
+ читаются одинаково, а значат разное. Образец тела заявки целиком — в паттерне заведения коммита
171
+ и заявки, если дерево его разложило.
172
+
173
+ Проверить это машиной нечем, и проверки не будет: тело заявки не читает ни одна сверка, а
174
+ хостинг не спрашивает ни о чём, кроме заголовка. Требование держится тем же, чем и слова
175
+ вслух, — тем, кто пишет тело. Разница между ними одна, и она вся: реплику владелец прочитает,
176
+ только если вернётся в переписку, а раздел он видит там, куда смотрит, нажимая кнопку.
177
+
178
+ ### Правка по замечаниям идёт без замысла на диске
179
+
180
+ Разбор вернул замечания или прогон покраснел — чинится это в той же ветке. Замысла там больше
181
+ нет, и собирать папку заново не надо: гард хода работы пропускает правку по признаку из истории
182
+ ветки. Что именно чинится, берётся из замечания, а не из замысла.
183
+
184
+ **Следующее движение:** прогон зелёный и замечаний нет — черновик снимается, и владельцу
185
+ говорится, что работа готова.
184
186
 
185
187
  ## Ловушки
186
188
 
@@ -91,11 +91,12 @@ git log --oneline origin/main..HEAD
91
91
  владельца — то есть ровно тем пересказом, ради отмены которого всё и заведено:
92
92
 
93
93
  ```markdown
94
- - **PR:** #1396, ждёт разбора · отвечено 3 замечания из 5 · не сделано: разбор папки задачи
94
+ - **PR:** #1396, ждёт разбора · отвечено 3 замечания из 5 · не сделано: снятие черновика
95
95
  ```
96
96
 
97
97
  С открытием PR состояние становится `работа-отдана`, и обязательное действие у него другое —
98
- следующая задача, а не ожидание разбора.
98
+ следующая задача, а не ожидание разбора. Объявить его на диске к этой минуте уже нечем: ход
99
+ работы уехал вместе с папкой, и хвост работы ведёт паттерн `task-flow-close`.
99
100
 
100
101
  Решение, принятое по ходу, — вместе с причиной и с тем, что было альтернативой:
101
102
 
@@ -121,7 +122,8 @@ git log --oneline origin/main..HEAD
121
122
  ```
122
123
 
123
124
  **Следующее движение:** отмеченный этап тем же ходом сменяется следующим. Этапы кончились —
124
- тот же ход гонит набор и открывает PR черновиком.
125
+ тот же ход гонит набор, вливает договорённость, приводит тексты и разбирает папку задачи; PR
126
+ открывается за убранной работой.
125
127
 
126
128
  ## Состояние `работа-отдана`: следующая задача берётся тем же движением
127
129
 
@@ -0,0 +1,80 @@
1
+ # Переносимый слой правил — холодная часть
2
+
3
+ Ловушки и грабли, на которые уже наступали. Грузится не вместе со скилом, а по требованию: при
4
+ обычной раскладке она не нужна — она нужна тому, кто разбирает отказ сверки или спорит с
5
+ раскладкой.
6
+
7
+ Скил — `agent-kit`; порядок правки, команды и устройство слоёв стоят там.
8
+
9
+ ## Ловушки
10
+
11
+ - **Набор, проверяющий гард, читает настройку того дерева, из которого его запустили.** Помощник
12
+ берёт настройку по каталогу проекта, а его агент выставляет своим — и `cd` в прогонщике этого
13
+ не перебивает. Набор, не заведший своего одноразового дерева, зеленеет от строки в чужой
14
+ настройке: шесть сценариев гарда экзамена прошли ровно так, потому что роль была выключена в
15
+ дереве, где их гоняли. Своё дерево объявляется на каждый сценарий, а не один раз на файл.
16
+
17
+ - **Надстройка замещает раздел целиком, и пакетные пункты в нём приходится держать копией.**
18
+ Дописать в раздел одну статью нечем: слияние идёт по заголовку `## `. Дерево, которому нужен
19
+ один свой пункт, копирует к нему все пакетные — и с этого дня правка любого из них,
20
+ приехавшая с новой версией, до этого дерева не доходит. Сверка разложенного молчит: она
21
+ считает расхождением правку на месте, а не замещённый раздел. Признак виден по самим
22
+ надстройкам — три из трёх прочитанных кончались абзацем о том, что перенос придётся делать
23
+ руками. Поэтому надстройкой берут раздел, у которого пакетных пунктов немного, а разросшийся
24
+ замещённый раздел — повод внести своё в пакет, а не держать его копией. Предложение, которым
25
+ своё вносят, называет эту надстройку строкой «чем закрывается»: иначе приехавшая редакция и
26
+ надстройка, которую она закрыла, не сопоставляются ничем, и надстройка остаётся замещать уже
27
+ исправленный раздел.
28
+
29
+ - **Готовый код пакета не называет имён одного дерева.** Префикс директив кита, ключи подписей
30
+ и имена сущностей принадлежат тому дереву, где паттерн писали; разложенные в соседнем, они
31
+ учат звать то, чего там нет вовсе. Имя директивы при этом отличается от имени в примере: по
32
+ примеру видно, что он пример, а `<префикс>TableRow` из чужого дерева выглядит рабочим кодом
33
+ и правится только после того, как продовая сборка упадёт. Тринадцать таких имён простояли в
34
+ четырёх ресурсах пакета, пока их не нашёл потребитель — и не своей сборкой, а надстройкой,
35
+ которой перекрыл раздел.
36
+
37
+ - **Правила и паттерны при отвергнутом законе в отказе не перечисляются.** Их снимает каскад, а
38
+ строка на них становится выводимой: раскладка называет её лишней вместе с законом, из-за
39
+ которого она перестала снимать. Отказ мерит слой законов, а не число файлов в пакете.
40
+
41
+ - **Линтер по следам правки судит файл целиком, а не внесённую правку.** Импорт, добавленный
42
+ отдельным шагом, отбивается как неиспользуемый ещё до того, как появится строка, которая его
43
+ зовёт, и работа встаёт на половине. Правка делается одним вызовом либо в порядке «сначала
44
+ использование, потом импорт».
45
+ - **Прогонять сценарии гардов можно, ничего не раскладывая.** Обвязка набора принимает каталог
46
+ гардов переменной, и пакетную редакцию гоняют по сценариям дерева до установки. Заход,
47
+ потраченный на диагноз по последствиям, стоил ровно этой строки.
48
+ - **Отбитая правка не всегда про текст гарда.** Гард зовут по пути, и файл без права на
49
+ запуск отвечает отказом доступа — ненулевым кодом, который читается как «правка отбита».
50
+ Набор при этом отбивает подряд всё, включая сборку и тесты, и причины не называет.
51
+ - **Правка shell-скрипта заменой по шаблону сверяется `bash -n` сразу.** Замена границ
52
+ конструкции не видит: `case` теряет свою `esac`, файл остаётся синтаксически неверным, а
53
+ гард с ошибкой синтаксиса отвечает ненулевым кодом — то есть «правка отбита». Два раза за
54
+ заход, и оба раза это выглядело дефектом самого гарда.
55
+ - **Гард, подписанный не на то, что объявляет, выглядит работающим.** Событие и образец вызова
56
+ гард несёт сам, строкой `# rt-hook:`, а зовёт его образец в настройке агента — и эти двое
57
+ расходятся молча: путь гарда в настройке назван, файл разложен, набор сценариев зелёный.
58
+ Набор тут ничего не ловит намеренно — он зовёт гард напрямую с подставленным вводом и
59
+ объявления не читает вовсе. Так гейт правил и разбирал вызовы браузера веткой, которая не
60
+ исполнялась ни разу. Расхождение находит сверка раскладки: она сравнивает объявленный образец
61
+ с тем, под которым гард стоит, называет обе стороны и идёт в счёт расхождений. Правится
62
+ настройка, а верное значение лежит в гарде — тело его разбирает то, что объявлено.
63
+ - **Разложенный файл узнаётся по шапке, а не по каталогу.** Раскладка ложится в те же
64
+ `tools/`, `.claude/hooks/` и `.claude/skills/`, где лежит своё, поэтому карта гейта,
65
+ написанная по путям, требует под него доменное правило — а оно уводит править файл на месте.
66
+ Правка на месте теряется на следующей раскладке, и до тех пор выглядит применённой. Ветка по
67
+ шапке ставится в карте первой и решает раньше путей.
68
+ - **Настройки проверок сливаются по ключам, а списки — замещаются.** Объект `checks.json`
69
+ ложится поверх умолчания ключ за ключом на любой глубине: назвав один ключ борды, дерево не
70
+ теряет соседних. Список приходит целиком — назвав корни исходников, дерево получает ровно
71
+ названное, а не умолчание вместе со своим: «дописать в список» и «убрать из списка» в этой
72
+ записи неразличимы.
73
+ - **Утверждение правила переезжает вместе с кодом.** Вынесенное в надстройку перестаёт
74
+ находиться по прежнему символу, и привязка в спутнике правила врёт молча — сверка спеков
75
+ ловит это, но только если её позвать.
76
+ - **Признак по подстроке пути судит и то, что лежит вне дерева.** Гарды отдают в профиль
77
+ абсолютный путь целиком, и образец вида `*/projects/*` совпадает с домашним каталогом агента
78
+ ровно так же, как с кодом дерева: запись в файл вне репозитория была отбита гардом хода
79
+ работы с требованием замысла, к ней не относящегося. Путь в профиле сначала приводится к
80
+ корню дерева, и всё, что вне корня, признака не получает.
@@ -76,3 +76,11 @@
76
76
  входят: свежее дерево выглядит готовым и упирается в нехватку не сразу, а на первом гарде,
77
77
  которому нужен ключ. Что именно переносится руками, названо списком в компаньоне правила, и
78
78
  список пополняется тем же движением, которым заводится новый файл вне индекса.
79
+ - **Вытесненный из очереди прогон и упавший в списке неразличимы.** Оба отвечают красным, и
80
+ слово отмены у них одно. Ветка за вытесненным не проверялась ни строчкой: заданий у него
81
+ ноль, потому что он не начинался. Перезапуск такого прогона отбивает гард, пока за тот же ход
82
+ не читался журнал задания, — поэтому строка сверки называет чтение прогона первым.
83
+ - **Одно и то же вливание главной ветки, сделанное третий раз за заход, останавливает работу.**
84
+ Ветки, дописывающие строку в один и тот же список, роняют друг друга в конфликт при каждом
85
+ слиянии, и вливание главной по кругу — это починка проявления. На третьем круге называется
86
+ причина и спрашивается владелец, а не делается четвёртый круг.
@@ -16,7 +16,7 @@ description: Правило под «Закон о поставке» для д
16
16
 
17
17
  | В законе | Здесь |
18
18
  | -------------------------------- | -------------------------------------------------------- |
19
- | попадание правки в главную ветку | слияние PR; оно же запускает выкатку`azure-pipelines.yml` |
19
+ | попадание правки в главную ветку | слияние PR; чем запускается выкатка слиянием или ручным запуском, называет компаньон рядом |
20
20
  | образ того коммита | `IMAGE_TAG=<sha>` в командах `docker compose` на сервере |
21
21
  | изменение хранилища | миграция в `prisma/migrations/<метка>_<имя>/` |
22
22
 
@@ -54,9 +54,14 @@ flowchart TD
54
54
  не поднимает стенда, не снимает кадров и не собирает образов. Признак объявляется переменной
55
55
  задания и считается один раз, а не переспрашивается в каждом условии. Пропущенный шаг виден в
56
56
  прогоне пропущенным — молча выпавший читается как пройденный.
57
- - **Слияние в главную ветку выкатывает прод.** Фильтры путей конвейера покрывают документы
58
- отдельно, поэтому переменные окружения, секреты и записи имён ставятся до слияния, а не
59
- после.
57
+ - **Чем запускается выкатка, называет дерево, а не правило.** У одного дерева прод едет от
58
+ слияния, у другого ручным запуском, и сказанное здесь безусловно врёт про второе: правило
59
+ приходит в контекст каждой сессии, и прочитавший его считает влитое выкаченным. Прод,
60
+ отставший от главной ветки на сотни коммитов, так и читался поломкой приложения. Строка стоит
61
+ в компаньоне рядом, вместе со способом спросить, что выкачено на самом деле.
62
+ - **Выкатка идёт от слияния — переменные окружения, секреты и записи имён ставятся до него.**
63
+ Фильтры путей конвейера покрывают документы отдельно. Дерево с ручным запуском эту статью
64
+ читает иначе: там граница — сам запуск, и до него ставится то же самое.
60
65
  - **Признак режима объявлен в образе, а не только в составе прода.** Значение, заданное
61
66
  составом, действует лишь на контейнер, поднятый этим составом; ручной прогон того же образа
62
67
  идёт с пустым значением, а пусто здесь означает локалхост — со всеми отладочными
@@ -78,9 +83,12 @@ flowchart TD
78
83
  образов идут на конвейере проверки PR, выкатка — нет: её держит условие по главной ветке у
79
84
  своего задания, а образ PR в реестр не уезжает.
80
85
  - **Расхождение прода с главной веткой видно сверкой очереди работ.** Рабочий элемент уходит из
81
- очереди слиянием, но слияние — ещё не прод: отказавшая выкатка не трогает ни элемент, ни его
82
- состояние, и заметить её неоткуда. Сверка спрашивает последний прогон главной ветки и судит
83
- только завершённый: идущий ещё может кончиться выкаткой.
86
+ очереди слиянием, но слияние — ещё не прод: отказавшая или незапущенная выкатка не трогает ни
87
+ элемент, ни его состояние, и заметить её неоткуда. Сверка спрашивает последнюю успешную выкатку и считает, на сколько от неё ушла главная
88
+ ветка. Прогон главной ветки для этого не годится: там, где выкатку запускают рукой, слияние
89
+ прод не двигает вовсе, и прогон о нём не говорит ничего — прод отставал на 476 коммитов, а
90
+ сверка молчала. Дерево, не назвавшее рабочего потока выкатки, сверки не получает, и она
91
+ говорит об этом вслух.
84
92
  - **Цепочка миграций прогоняется с пустого хранилища до слияния.** Порядок применения
85
93
  лексикографический по имени каталога, а метку времени ставит момент создания: миграция из
86
94
  ветки, начатой раньше, встаёт перед той, от которой зависит.
@@ -16,7 +16,7 @@ description: Правило под «Закон о поставке» для д
16
16
 
17
17
  | В законе | Здесь |
18
18
  | -------------------------------- | -------------------------------------------------------- |
19
- | попадание правки в главную ветку | мерж PR; он же запускает выкатку`.github/workflows/deploy.yml` |
19
+ | попадание правки в главную ветку | мерж PR; чем запускается выкатка слиянием или ручным запуском, называет компаньон рядом |
20
20
  | образ того коммита | `IMAGE_TAG=<sha>` в командах `docker compose` на сервере |
21
21
  | изменение хранилища | миграция в `prisma/migrations/<метка>_<имя>/` |
22
22
 
@@ -54,8 +54,14 @@ flowchart TD
54
54
  не поднимает стенда, не снимает кадров и не собирает образов. Признак считается один раз и
55
55
  объявляется выводом шага, а не переспрашивается в каждом условии. Пропущенный шаг виден в
56
56
  прогоне пропущенным — молча выпавший читается как пройденный.
57
- - **Мерж в главную ветку выкатывает прод.** Исключения по путям покрывают только документы,
58
- поэтому переменные окружения, секреты и записи имён ставятся до мержа, а не после.
57
+ - **Чем запускается выкатка, называет дерево, а не правило.** У одного дерева прод едет от
58
+ мержа, у другого ручным запуском, и сказанное здесь безусловно врёт про второе: правило
59
+ приходит в контекст каждой сессии, и прочитавший его считает влитое выкаченным. Прод,
60
+ отставший от главной ветки на сотни коммитов, так и читался поломкой приложения. Строка стоит
61
+ в компаньоне рядом, вместе со способом спросить, что выкачено на самом деле.
62
+ - **Выкатка идёт от мержа — переменные окружения, секреты и записи имён ставятся до него.**
63
+ Исключения по путям покрывают только документы. Дерево с ручным запуском эту статью читает
64
+ иначе: там граница — сам запуск, и до него ставится то же самое.
59
65
  - **Признак режима объявлен в образе, а не только в составе прода.** Значение, заданное
60
66
  составом, действует лишь на контейнер, поднятый этим составом; ручной прогон того же образа
61
67
  идёт с пустым значением, а пусто здесь означает локалхост — со всеми отладочными
@@ -85,9 +91,12 @@ flowchart TD
85
91
  образов идут на событии `pull_request`, выкатка — нет: её держит условие по главной ветке у
86
92
  своего задания, а образ PR в реестр не уезжает.
87
93
  - **Расхождение прода с главной веткой видно сверкой очереди работ.** Задача уходит из очереди
88
- мержем, но мерж — ещё не прод: отказавшая выкатка не трогает ни задачу, ни её колонку, и
89
- заметить её неоткуда. Сверка спрашивает последний прогон главной ветки и судит только
90
- завершённый: идущий ещё может кончиться выкаткой.
94
+ мержем, но мерж — ещё не прод: отказавшая или незапущенная выкатка не трогает ни задачу, ни её
95
+ колонку, и заметить её неоткуда. Сверка спрашивает последнюю успешную выкатку и считает, на сколько от неё ушла главная
96
+ ветка. Прогон главной ветки для этого не годится: там, где выкатку запускают рукой, слияние
97
+ прод не двигает вовсе, и прогон о нём не говорит ничего — прод отставал на 476 коммитов, а
98
+ сверка молчала. Дерево, не назвавшее рабочего потока выкатки, сверки не получает, и она
99
+ говорит об этом вслух.
91
100
  - **Цепочка миграций прогоняется с пустого хранилища до мержа.** Порядок применения
92
101
  лексикографический по имени каталога, а метку времени ставит момент создания: миграция из
93
102
  ветки, начатой раньше, встаёт перед той, от которой зависит.
@@ -16,7 +16,7 @@ description: Правило под «Закон о поставке» для д
16
16
 
17
17
  | В законе | Здесь |
18
18
  | -------------------------------- | -------------------------------------------------------- |
19
- | попадание правки в главную ветку | слияние MR; оно же запускает выкатку`.gitlab-ci.yml` |
19
+ | попадание правки в главную ветку | слияние MR; чем запускается выкатка слиянием или ручным запуском, называет компаньон рядом |
20
20
  | образ того коммита | `IMAGE_TAG=<sha>` в командах `docker compose` на сервере |
21
21
  | изменение хранилища | миграция в `prisma/migrations/<метка>_<имя>/` |
22
22
 
@@ -55,9 +55,14 @@ flowchart TD
55
55
  это сами, но по путям, а не по составу правки — совпадение пути ещё не значит, что задета
56
56
  сборка, поэтому признак объявляется явно и один раз. Пропущенный шаг виден в прогоне
57
57
  пропущенным — молча выпавший читается как пройденный.
58
- - **Слияние в главную ветку выкатывает прод.** Правила `only`/`rules` конвейера покрывают
59
- документы отдельно, поэтому переменные окружения, секреты и записи имён ставятся до слияния,
60
- а не после.
58
+ - **Чем запускается выкатка, называет дерево, а не правило.** У одного дерева прод едет от
59
+ слияния, у другого ручным запуском, и сказанное здесь безусловно врёт про второе: правило
60
+ приходит в контекст каждой сессии, и прочитавший его считает влитое выкаченным. Прод,
61
+ отставший от главной ветки на сотни коммитов, так и читался поломкой приложения. Строка стоит
62
+ в компаньоне рядом, вместе со способом спросить, что выкачено на самом деле.
63
+ - **Выкатка идёт от слияния — переменные окружения, секреты и записи имён ставятся до него.**
64
+ Правила `only`/`rules` конвейера покрывают документы отдельно. Дерево с ручным запуском эту
65
+ статью читает иначе: там граница — сам запуск, и до него ставится то же самое.
61
66
  - **Признак режима объявлен в образе, а не только в составе прода.** Значение, заданное
62
67
  составом, действует лишь на контейнер, поднятый этим составом; ручной прогон того же образа
63
68
  идёт с пустым значением, а пусто здесь означает локалхост — со всеми отладочными
@@ -80,9 +85,12 @@ flowchart TD
80
85
  образов идут на конвейере запроса слияния, выкатка — нет: её держит правило по главной ветке
81
86
  у своего задания, а образ PR в реестр не уезжает.
82
87
  - **Расхождение прода с главной веткой видно сверкой очереди работ.** Задача уходит из очереди
83
- слиянием, но слияние — ещё не прод: отказавшая выкатка не трогает ни задачу, ни её список, и
84
- заметить её неоткуда. Сверка спрашивает последний конвейер главной ветки и судит только
85
- завершённый: идущий ещё может кончиться выкаткой.
88
+ слиянием, но слияние — ещё не прод: отказавшая или незапущенная выкатка не трогает ни задачу,
89
+ ни её список, и заметить её неоткуда. Сверка спрашивает последнюю успешную выкатку и считает, на сколько от неё ушла главная
90
+ ветка. Прогон главной ветки для этого не годится: там, где выкатку запускают рукой, слияние
91
+ прод не двигает вовсе, и прогон о нём не говорит ничего — прод отставал на 476 коммитов, а
92
+ сверка молчала. Дерево, не назвавшее рабочего потока выкатки, сверки не получает, и она
93
+ говорит об этом вслух.
86
94
  - **Цепочка миграций прогоняется с пустого хранилища до слияния.** Порядок применения
87
95
  лексикографический по имени каталога, а метку времени ставит момент создания: миграция из
88
96
  ветки, начатой раньше, встаёт перед той, от которой зависит.
@@ -139,10 +139,19 @@ flowchart TD
139
139
  которой прогон не встал, замечали только тем, что открывали список прогонов руками. Сверка
140
140
  спрашивает вершину, а не ветку, считает сам факт прогона, а не его цвет, и свежей вершине
141
141
  даёт время: между пушем и прогоном проходят минуты.
142
+ - **Прогон, вытесненный из очереди конвейера, сверка называет отдельной строкой.** Ждущего
143
+ прогона группа очереди не бережёт: следующий встающий вытесняет прежний, и тот выглядит
144
+ упавшим, хотя ветку не проверял ни строчкой. Отличает их число заданий — у вытесненного оно
145
+ ноль; строка называет обе команды по порядку, сперва чтение прогона.
142
146
  - **Черновик при зелёном прогоне на вершине — расхождение сверки.** У черновика кнопка слияния
143
147
  заблокирована самим хостингом: зелёная страница PR владельцу ничего не разрешает, а список, в
144
148
  котором всё серое, читается как «работа не сделана». Гард снятия черновика сюда не достаёт —
145
- он судит один ход и молчит, пока ветка везёт папку своей задачи.
149
+ он судит один ход, а PR стоит в очереди днями.
150
+ - **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Уборка стоит до открытия, а
151
+ не после одобрения: кнопку слияния нажимает человек на странице хостинга, где гардов нет
152
+ вовсе, и вливает он, как только видит зелёное. Отказ на слиянии остаётся вторым рубежом — он
153
+ ловит слияние, идущее командой, — но первым спрашивается открытие: это последняя точка, где
154
+ отказ ещё виден тому, кто может его выполнить.
146
155
  - **Конфликтующий открытый PR — расхождение сверки очереди работ.** Конфликт приезжает в
147
156
  отданный PR чужим слиянием, без единого действия автора: основание, проверенное на открытии,
148
157
  устаревает в ту минуту, когда владелец влил соседнюю работу. Гард снятия черновика сюда не
@@ -213,10 +222,6 @@ flowchart TD
213
222
  прежнее состояние и читает его как «не сделано ничего», а сделанное лежит в рабочем дереве
214
223
  исполнителя, где его не видит никто. Ветка, в которой разрешён конфликт, пушится тем же
215
224
  ходом — либо конфликт не разрешается вовсе.
216
- - **Одно и то же вливание главной ветки, сделанное третий раз за заход, останавливает
217
- работу.** Ветки, дописывающие строку в один и тот же список, роняют друг друга в конфликт при
218
- каждом слиянии, и вливание главной по кругу — это починка проявления. На третьем круге
219
- называется причина и спрашивается владелец, а не делается четвёртый круг.
220
225
  - **Черновик не снимается, пока у PR нет разбора.** Гард поставки смотрит запрошенного ревьювера
221
226
  и оставленный отзыв: снятый черновик читается как «можно вливать», а вливать некому. Раньше
222
227
  этого хода спросить негде — до открытия PR ревьювера нет вовсе. Судится и вызов без номера: