@rt-tools/agent-kit 0.12.0 → 0.13.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/board-runs.github.mjs +87 -0
- package/assets/checks/board.github.mjs +0 -40
- package/assets/checks/check-board.github.mjs +39 -8
- package/assets/checks/check-schema-drift.mjs +28 -5
- package/assets/checks/rt-kit-checks.config.mjs +12 -0
- package/assets/commands/feedback.md +8 -0
- package/assets/defaults/project.sh +50 -5
- package/assets/hooks/browser-guard-no-other-drivers.sh +1 -1
- package/assets/hooks/dev-server-guard.sh +1 -1
- package/assets/hooks/git-guard-delivery-folder.sh +99 -0
- package/assets/hooks/git-guard-delivery-signature.sh +10 -4
- package/assets/hooks/git-guard-delivery.sh +21 -69
- package/assets/hooks/git-guard-push-tests.sh +2 -2
- package/assets/hooks/hook-input.sh +23 -0
- package/assets/hooks/override-write-guard.sh +107 -0
- package/assets/hooks/rerun-guard.sh +1 -1
- package/assets/hooks/rule-source-guard.sh +126 -0
- package/assets/hooks/task-flow-guard.sh +18 -0
- package/assets/hooks/turn-exit-guard.sh +17 -0
- package/assets/patterns/git-workflow-pr.azure.md +4 -4
- package/assets/patterns/git-workflow-pr.github.md +4 -4
- package/assets/patterns/git-workflow-pr.gitlab.md +4 -4
- package/assets/patterns/task-flow-archive.md +23 -21
- package/assets/patterns/task-flow-close.md +98 -96
- package/assets/patterns/task-flow-resume.md +5 -3
- package/assets/pitfalls/agent-kit.md +80 -0
- package/assets/rules/deploy-flow.azure.md +15 -7
- package/assets/rules/deploy-flow.github.md +15 -6
- package/assets/rules/deploy-flow.gitlab.md +15 -7
- package/assets/rules/git-workflow.github.md +6 -1
- package/assets/rules/task-flow.md +41 -25
- package/assets/rules/turn-conduct.md +4 -0
- package/assets/skills/agent-kit.md +32 -77
- package/assets/templates/proposal.md +16 -1
- package/lib/proposals.d.ts +5 -1
- package/lib/proposals.d.ts.map +1 -1
- package/lib/proposals.js +74 -5
- package/lib/proposals.js.map +1 -1
- package/lib/shipment.d.ts.map +1 -1
- package/lib/shipment.fixture.d.ts +39 -0
- package/lib/shipment.fixture.d.ts.map +1 -0
- package/lib/shipment.fixture.js +99 -0
- package/lib/shipment.fixture.js.map +1 -0
- package/lib/shipment.js +59 -7
- package/lib/shipment.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.13.0.tgz +0 -0
- package/rt-tools-agent-kit-0.12.0.tgz +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: task-flow-archive
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: task-flow
|
|
5
|
-
description: Паттерн правила task-flow. Брать, когда
|
|
5
|
+
description: Паттерн правила task-flow. Брать, когда тексты приведены и папка задачи разбирается последним коммитом до открытия заявки: переезд в описание прошлого, сверка очереди работ, разбор закрытой работы правилами и то, что делать с его находками. Не брать для вливания договорённости, открытия заявки и снятия черновика — это паттерн task-flow-close.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Разбор папки задачи и разбор работы правилами
|
|
@@ -14,7 +14,7 @@ description: Паттерн правила task-flow. Брать, когда р
|
|
|
14
14
|
## Когда брать
|
|
15
15
|
|
|
16
16
|
- Договорённость влита, тексты домена приведены, и папка задачи разбирается последним
|
|
17
|
-
коммитом
|
|
17
|
+
коммитом ветки — до открытия заявки, а не после одобрения.
|
|
18
18
|
- Работа слита человеком, и её разбирают правилами.
|
|
19
19
|
- Разбор вернул находки, и их надо куда-то положить.
|
|
20
20
|
|
|
@@ -55,8 +55,12 @@ cat docs/tasks/<КЛЮЧ>-<номер>-<slug>/grill.md > docs/archive/<ЧТО_Р
|
|
|
55
55
|
rm -r docs/tasks/<КЛЮЧ>-<номер>-<slug>
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
Разбор идёт
|
|
59
|
-
|
|
58
|
+
Разбор идёт последним коммитом ветки, до открытия заявки: открытие с лежащей папкой отбивает
|
|
59
|
+
гард поставки. Прежде уборка стояла после одобрения — считалось, что замысел нужен на диске всё
|
|
60
|
+
время разбора. Но кнопку слияния нажимает человек на хостинге, куда гард не достаёт, и вливает
|
|
61
|
+
он, как только видит зелёное: трижды подряд папка уехала в главную неразобранной. Замысла после
|
|
62
|
+
уборки на диске нет намеренно, и правку по замечаниям гард хода работы пропускает по признаку
|
|
63
|
+
из истории ветки.
|
|
60
64
|
|
|
61
65
|
### Работа, разбирающая чужую папку, разбирает две
|
|
62
66
|
|
|
@@ -75,8 +79,8 @@ rm -r docs/tasks/<своя>
|
|
|
75
79
|
Две записи в архиве, а не одна: работы разные, и решения в них разные. Сверка очереди работ
|
|
76
80
|
после этого не называет ни одной папки — этим и проверяется, что разобраны обе.
|
|
77
81
|
|
|
78
|
-
**Следующее движение:** разобранная папка уезжает в ветку тем же коммитом,
|
|
79
|
-
|
|
82
|
+
**Следующее движение:** разобранная папка уезжает в ветку тем же коммитом, следом сверяется
|
|
83
|
+
очередь работ, и тем же ходом открывается заявка — паттерн `task-flow-close`.
|
|
80
84
|
|
|
81
85
|
## Состояние `папка-разобрана`: сверка очереди работ
|
|
82
86
|
|
|
@@ -87,7 +91,7 @@ npm run check:docs # пути, названные в текстах, суще
|
|
|
87
91
|
```
|
|
88
92
|
|
|
89
93
|
**Следующее движение:** расхождения, названные сверками, чинятся тем же ходом; чинить нечего —
|
|
90
|
-
тот же ход
|
|
94
|
+
тот же ход открывает заявку черновиком и называет владельцу номер, паттерн `task-flow-close`.
|
|
91
95
|
|
|
92
96
|
## Состояние `влито`: работа разбирается правилами — фоном, следом за PR
|
|
93
97
|
|
|
@@ -156,20 +160,18 @@ npm run check:docs # пути, названные в текстах, суще
|
|
|
156
160
|
|
|
157
161
|
## Ловушки
|
|
158
162
|
|
|
159
|
-
- **Папку разбирают до
|
|
160
|
-
задачу закрытой по слиянию:
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
приведение текстов домена, разбор папки. Понадобилась правка кода после разбора — замысел
|
|
172
|
-
восстанавливается на диске на время правки, и разбор повторяется тем же коммитом.
|
|
163
|
+
- **Папку разбирают до открытия заявки — потом о ней уже никто не вспомнит.** Сверка очереди
|
|
164
|
+
считает задачу закрытой по слиянию: после него за папку никто не отвечает — работа перешла к
|
|
165
|
+
следующей задаче, и находка достанется чужому заходу. Три раза подряд папка закрытой задачи
|
|
166
|
+
так и уехала в главную ветку, в последний раз их набралось пять. Держит это гард поставки:
|
|
167
|
+
открытие заявки отбивается, пока папка лежит в ветке.
|
|
168
|
+
- **Разбор папки идёт последним коммитом, после того как гейт пуша прошёл целиком.** Порядок
|
|
169
|
+
один: мерж главной ветки, все линтеры и проверки зелёные, вливание договорённости, приведение
|
|
170
|
+
текстов домена, разбор папки — и только потом заявка.
|
|
171
|
+
- **После разбора замысла на диске нет, и собирать папку заново не надо.** Правку по замечаниям
|
|
172
|
+
разбора и починку красного прогона гард хода работы пропускает по признаку из истории ветки:
|
|
173
|
+
папка, снятая её коммитом, и есть признак отданной работы. Собранная заново папка вернула бы
|
|
174
|
+
отказ гарда поставки на следующем же вызове.
|
|
173
175
|
- **Если папку просто удалить, первым пропадёт `grill.md`.** Удалить проще, чем разобрать, а
|
|
174
176
|
слова владельца записаны только там, и восстановить их неоткуда. Поэтому гард требует, чтобы
|
|
175
177
|
ветка добавила запись в архив. Что именно перенесли, он не проверяет — это смотрит владелец
|
|
@@ -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. Брать при доведении работы до готовности — вливание договорённости в спек домена, приведение текстов домена к сделанному, открытие заявки черновиком и снятие черновика. Не брать для разбора папки задачи и разбора работы правилами — это паттерн 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
|
-
- Этапы замысла закрыты,
|
|
15
|
+
- Этапы замысла закрыты, набор гейта прогнан целиком.
|
|
16
16
|
- `npm run check:specs` перечислил договорённость в разделе «Пора вливать».
|
|
17
17
|
- Тексты домена приводятся к тому, что работа сделала.
|
|
18
|
+
- Папка задачи разобрана, и заявка открывается черновиком.
|
|
19
|
+
- Прогон на вершине зелёный, и с заявки снимается черновик.
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
работа доводится до готовности и черновик снимается.
|
|
21
|
+
Разбор самой папки сюда не относится — это паттерн `task-flow-archive`. Он стоит между
|
|
22
|
+
приведением текстов и открытием заявки: заявка открывается уже за убранной работой.
|
|
22
23
|
|
|
23
|
-
## Состояние `этапы-кончились`:
|
|
24
|
+
## Состояние `этапы-кончились`: договорённость вливается в спек домена
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
тот же ход гонит
|
|
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
|
+
корню дерева, и всё, что вне корня, признака не получает.
|
|
@@ -16,7 +16,7 @@ description: Правило под «Закон о поставке» для д
|
|
|
16
16
|
|
|
17
17
|
| В законе | Здесь |
|
|
18
18
|
| -------------------------------- | -------------------------------------------------------- |
|
|
19
|
-
| попадание правки в главную ветку | слияние PR;
|
|
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;
|
|
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;
|
|
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
|
-
-
|
|
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
|
ветки, начатой раньше, встаёт перед той, от которой зависит.
|
|
@@ -142,7 +142,12 @@ flowchart TD
|
|
|
142
142
|
- **Черновик при зелёном прогоне на вершине — расхождение сверки.** У черновика кнопка слияния
|
|
143
143
|
заблокирована самим хостингом: зелёная страница PR владельцу ничего не разрешает, а список, в
|
|
144
144
|
котором всё серое, читается как «работа не сделана». Гард снятия черновика сюда не достаёт —
|
|
145
|
-
он судит один
|
|
145
|
+
он судит один ход, а PR стоит в очереди днями.
|
|
146
|
+
- **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Уборка стоит до открытия, а
|
|
147
|
+
не после одобрения: кнопку слияния нажимает человек на странице хостинга, где гардов нет
|
|
148
|
+
вовсе, и вливает он, как только видит зелёное. Отказ на слиянии остаётся вторым рубежом — он
|
|
149
|
+
ловит слияние, идущее командой, — но первым спрашивается открытие: это последняя точка, где
|
|
150
|
+
отказ ещё виден тому, кто может его выполнить.
|
|
146
151
|
- **Конфликтующий открытый PR — расхождение сверки очереди работ.** Конфликт приезжает в
|
|
147
152
|
отданный PR чужим слиянием, без единого действия автора: основание, проверенное на открытии,
|
|
148
153
|
устаревает в ту минуту, когда владелец влил соседнюю работу. Гард снятия черновика сюда не
|