@rt-tools/agent-kit 0.9.1 → 0.11.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/README.md +5 -0
- package/assets/agents/conscience.md +58 -0
- package/assets/agents/prose-editor.md +44 -0
- package/assets/agents/strict-teacher.md +59 -0
- package/assets/checks/board.github.mjs +56 -1
- package/assets/checks/check-board.github.mjs +24 -0
- package/assets/checks/check-doc-paths.mjs +4 -15
- package/assets/checks/check-dupes.mjs +5 -6
- package/assets/checks/check-file-size.mjs +6 -20
- package/assets/checks/check-prose-style.mjs +137 -0
- package/assets/checks/check-reuse.mjs +5 -5
- package/assets/checks/check-state-next.mjs +194 -0
- package/assets/checks/check-states.mjs +142 -0
- package/assets/checks/check-styles.mjs +5 -5
- package/assets/checks/check-turn-map.mjs +146 -0
- package/assets/checks/lib-common.mjs +3 -3
- package/assets/checks/rt-kit-checks.config.mjs +85 -1
- package/assets/commands/agent-kit-digest.md +6 -5
- package/assets/defaults/project.sh +108 -6
- package/assets/defaults/turn-map.md +46 -0
- package/assets/docs/GLOSSARY.md +17 -15
- package/assets/hooks/browser-device-id.sh +2 -0
- package/assets/hooks/browser-guard-device-id.sh +11 -1
- package/assets/hooks/browser-guard-no-asking.sh +11 -1
- package/assets/hooks/browser-guard-no-listing.sh +11 -1
- package/assets/hooks/browser-guard-no-other-drivers.sh +9 -1
- package/assets/hooks/browser-guard-require-select.sh +13 -2
- package/assets/hooks/claim-guard.sh +115 -0
- package/assets/hooks/commit-msg.sh +2 -0
- package/assets/hooks/conscience-guard.sh +100 -0
- package/assets/hooks/constitution-index.sh +2 -0
- package/assets/hooks/deny-tail.sh +32 -0
- package/assets/hooks/dev-server-guard.sh +10 -2
- package/assets/hooks/docs-guard.sh +16 -2
- package/assets/hooks/exam-guard.sh +123 -0
- package/assets/hooks/git-guard-delivery-signature.sh +77 -0
- package/assets/hooks/git-guard-delivery.sh +156 -68
- package/assets/hooks/git-guard-main.sh +14 -0
- package/assets/hooks/git-guard-push-tests.sh +51 -2
- package/assets/hooks/glossary-load.sh +2 -0
- package/assets/hooks/grill-gate.sh +14 -0
- package/assets/hooks/handoff-entry-guard.sh +73 -0
- package/assets/hooks/handoff-write.sh +103 -0
- package/assets/hooks/lint-after-edit.sh +2 -0
- package/assets/hooks/observe.sh +2 -0
- package/assets/hooks/postmortem-guard.sh +14 -0
- package/assets/hooks/proposal-guard.sh +14 -0
- package/assets/hooks/prose-style-guard.sh +75 -0
- package/assets/hooks/qa-dataid-guard.sh +14 -1
- package/assets/hooks/rerun-guard.sh +88 -0
- package/assets/hooks/reuse-first-guard.sh +14 -1
- package/assets/hooks/roles.sh +34 -0
- package/assets/hooks/skill-gate-layers.sh +2 -0
- package/assets/hooks/skill-gate-rearm.sh +2 -0
- package/assets/hooks/skill-gate.sh +14 -0
- package/assets/hooks/skill-loaded.sh +2 -0
- package/assets/hooks/sql-guard-parse.sh +2 -0
- package/assets/hooks/sql-guard-request.sh +2 -0
- package/assets/hooks/sql-guard-target.sh +2 -0
- package/assets/hooks/sql-guard-write.sh +4 -1
- package/assets/hooks/sql-guard.sh +14 -1
- package/assets/hooks/task-context-load.sh +2 -0
- package/assets/hooks/task-flow-guard.sh +73 -7
- package/assets/hooks/turn-entry-load.sh +62 -0
- package/assets/hooks/turn-exit-guard.sh +191 -0
- package/assets/hooks/utf8.sh +35 -0
- package/assets/hooks/waiting-turn-guard.sh +14 -0
- package/assets/hooks/window-fill-guard.sh +43 -2
- package/assets/laws/work-conduct.md +29 -0
- package/assets/patterns/cargo-triage-mark.md +119 -0
- package/assets/patterns/task-flow-close.md +29 -8
- package/assets/patterns/task-flow-handoff.md +19 -1
- package/assets/patterns/task-flow-resume.md +36 -4
- package/assets/patterns/task-flow-start.md +56 -6
- package/assets/patterns/turn-entry-map.md +81 -0
- package/assets/rules/cargo-triage.md +126 -0
- package/assets/rules/git-workflow.azure.md +36 -9
- package/assets/rules/git-workflow.github.md +74 -9
- package/assets/rules/git-workflow.gitlab.md +40 -12
- package/assets/rules/task-flow.md +136 -71
- package/assets/rules/testing.md +15 -1
- package/assets/rules/turn-entry.md +93 -0
- package/assets/samples/tasks/_template/plan.md +4 -1
- package/assets/samples/tasks/_template/progress.md +1 -0
- package/assets/skills/agent-kit.md +33 -0
- package/assets/templates/project.sh +16 -0
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +42 -1
- package/bin/agent-kit.js.map +1 -1
- package/lib/cargo-state.d.ts +62 -0
- package/lib/cargo-state.d.ts.map +1 -0
- package/lib/cargo-state.js +118 -0
- package/lib/cargo-state.js.map +1 -0
- package/lib/cargo.d.ts +42 -0
- package/lib/cargo.d.ts.map +1 -1
- package/lib/cargo.js +2 -0
- package/lib/cargo.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +64 -4
- package/lib/commands.js.map +1 -1
- package/lib/config.d.ts +8 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +1 -0
- package/lib/config.js.map +1 -1
- package/lib/observations.d.ts +35 -1
- package/lib/observations.d.ts.map +1 -1
- package/lib/observations.js +14 -2
- package/lib/observations.js.map +1 -1
- package/lib/ship.d.ts +3 -0
- package/lib/ship.d.ts.map +1 -1
- package/lib/ship.js +56 -0
- package/lib/ship.js.map +1 -1
- package/lib/thresholds.d.ts +49 -0
- package/lib/thresholds.d.ts.map +1 -0
- package/lib/thresholds.js +151 -0
- package/lib/thresholds.js.map +1 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.11.0.tgz +0 -0
- package/rt-tools-agent-kit-0.9.1.tgz +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cargo-triage-mark
|
|
3
|
+
kind: pattern
|
|
4
|
+
rule: cargo-triage
|
|
5
|
+
description: Паттерн правила cargo-triage. Брать при разборе приехавшего груза — готовые вызовы отметки: сухой прогон, пачка записей за вызов, приём починки при переходе в готово, версия выпуска при выпуске, разбор отбитой строки. Не брать для сведения предложений в правки пакета — это своя команда.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Отметка записей груза
|
|
9
|
+
|
|
10
|
+
Паттерн правила `cargo-triage`. Что при этом должно быть верно — закон
|
|
11
|
+
`docs/constitution/work-conduct.md`.
|
|
12
|
+
|
|
13
|
+
Вызовы ниже идут строкой запуска самого пакета и токеном дерева: токен лежит вне дерева, и без
|
|
14
|
+
него команда отбивает вызов, не ходя в сеть.
|
|
15
|
+
|
|
16
|
+
## Когда брать
|
|
17
|
+
|
|
18
|
+
- Разбирается приехавший груз, и по записи принято решение.
|
|
19
|
+
- Правка по записи влита в главную ветку.
|
|
20
|
+
- Опубликована редакция, увёзшая починку к потребителю.
|
|
21
|
+
- Вызов отметки вернул отбитую строку.
|
|
22
|
+
|
|
23
|
+
## Что читается раньше вызова
|
|
24
|
+
|
|
25
|
+
Список неразобранного — в админке приёма, отбором по состоянию «новое» и порядком приезда.
|
|
26
|
+
Пока список не сужен, разобранное и нетронутое стоят вперемешку, и разбор идёт по второму
|
|
27
|
+
кругу.
|
|
28
|
+
|
|
29
|
+
Имя команды, адрес приёма и слова состояний у каждого дерева свои — они названы в
|
|
30
|
+
`implementation.md` правила. Ниже они стоят так, как их зовёт пакет.
|
|
31
|
+
|
|
32
|
+
## Взятие в работу: задача и отметка одним ходом
|
|
33
|
+
|
|
34
|
+
Сначала задача — иначе отметка говорит, что запись взяли, и молчит о том, где идёт работа:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run task:new -- --title '<что не так>' --slug <короткое-имя> --label bug < тело.md
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Отметка идёт следом, тем же ходом, и несёт все записи, которые эта задача закрывает:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npx agent-kit mark --state in_work \
|
|
44
|
+
--postmortem 2026-08-14-structure-invented-beside-the-sample.md \
|
|
45
|
+
--postmortem 2026-08-15-guard-denied-shell-wrote-anyway.md \
|
|
46
|
+
--proposal <признак предложения>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Род записи называется своим доводом: разбор происшествия — именем файла, предложение —
|
|
50
|
+
признаком текста. Записи обоих родов едут одним вызовом.
|
|
51
|
+
|
|
52
|
+
Сухим прогоном смотрят, что уехало бы, — он ничего не отправляет и следа наружу не оставляет:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx agent-kit mark --state in_work --postmortem <файл> --dry-run
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Сухой прогон вместо настоящего вызова оставляет запись в прежнем состоянии. Отметкой он не
|
|
59
|
+
считается.
|
|
60
|
+
|
|
61
|
+
## Починка: переход вместе с ответом на «чем»
|
|
62
|
+
|
|
63
|
+
Ставится после того, как правка влита в главную ветку, — не по открытой заявке:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx agent-kit mark --state fixed \
|
|
67
|
+
--postmortem <файл> \
|
|
68
|
+
--fix 'заведена статья правила о разборе груза и паттерн с готовыми вызовами'
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Текст отвечает на «чем», а не на «где»: статья правила, гард, проверка, правка кода. Без него
|
|
72
|
+
строка отбивается — переход в починку без ответа на «чем» приёмник не принимает.
|
|
73
|
+
|
|
74
|
+
## Выпуск: версия называется тем, кто публикует
|
|
75
|
+
|
|
76
|
+
Идёт тем же движением, что и публикация редакции:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx agent-kit mark --state released --postmortem <файл> --release 'rt-agent-kit@0.10.1'
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Версия — та, которой назван выпуск, увёзший починку. Не номер редакции приёмника и не время
|
|
83
|
+
выкатки.
|
|
84
|
+
|
|
85
|
+
## Ответ читается
|
|
86
|
+
|
|
87
|
+
Вызов отвечает тремя числами и списком:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
переведено 2, уже стояло 1, отбито 1
|
|
91
|
+
строка 3: <ключ> — записи у дерева нет
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
- **Переведено 0, уже стояло N** — этот разбор не двинул ничего: записи отмечены раньше либо
|
|
95
|
+
ключи названы не те.
|
|
96
|
+
- **Отбито N** — эти записи остались там, где были. Причина названа при строке, и повтор того
|
|
97
|
+
же вызова отбивается ровно так же.
|
|
98
|
+
|
|
99
|
+
Причины отбоя и что делать с каждой:
|
|
100
|
+
|
|
101
|
+
| Что сказано | Что это значит | Что делать |
|
|
102
|
+
| ---------------------- | ---------------------------------------------- | ------------------------------------ |
|
|
103
|
+
| записи у дерева нет | ключ назван не тот либо запись прислало не оно | сверить ключ со списком в админке |
|
|
104
|
+
| переход не разрешён | шаг через состояние либо ход назад | пройти состояние, которое пропустили |
|
|
105
|
+
| перехода без текста | починка без ответа на «чем» | добавить довод с текстом починки |
|
|
106
|
+
| текста не при том шаге | текст приехал с переходом, который не починка | убрать довод либо сменить состояние |
|
|
107
|
+
| перехода без версии | выпуск без ответа на «где искать фикс» | добавить довод с версией выпуска |
|
|
108
|
+
| версии не при том шаге | версия приехала с переходом, который не выпуск | убрать довод либо сменить состояние |
|
|
109
|
+
|
|
110
|
+
## Ловушки
|
|
111
|
+
|
|
112
|
+
- **Вызов без токена отбивается без сети.** Токен лежит вне дерева, и на свежей рабочей копии
|
|
113
|
+
его нет: команда называет это прямо, а не молчит.
|
|
114
|
+
- **Своё дерево называется признаком из токена, а не доводом.** Приём сверяет его сам, и
|
|
115
|
+
назваться чужим деревом вызов не может.
|
|
116
|
+
- **Записи, отмеченные в одной ветке, в соседней выглядят неотмеченными только в файлах.**
|
|
117
|
+
Состояние лежит в приёме, а не в дереве: смотрят его в админке, а не в рабочей копии.
|
|
118
|
+
- **Повторная отметка тем же состоянием промахом не считается.** Рабочий порядок повторяют, и
|
|
119
|
+
вторая та же отметка отбивается ответом «уже стояло», а не отказом.
|
|
@@ -19,7 +19,7 @@ description: Паттерн правила task-flow. Брать при закр
|
|
|
19
19
|
кода отдаётся владельцу, — то есть до этого паттерна и, как правило, задолго до него. Здесь
|
|
20
20
|
работа доводится до готовности и черновик снимается.
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Состояние `этапы-кончились`: работа отдаётся на разбор
|
|
23
23
|
|
|
24
24
|
PR открыт черновиком — и с этой минуты работа ждёт владельца, а не машину. Заход на этом не
|
|
25
25
|
кончается: следующая задача эпика берётся тем же движением, паттерн `task-flow-resume`.
|
|
@@ -102,7 +102,10 @@ PR #<номер> готов к слиянию: прогон зелёный, па
|
|
|
102
102
|
кто пишет тело. Разница между ними одна, и она вся: реплику владелец прочитает, только если
|
|
103
103
|
вернётся в переписку, а раздел он видит там, куда смотрит, нажимая кнопку.
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
**Следующее движение:** тем же ходом берётся следующая задача эпика, а разбор закрытой работы
|
|
106
|
+
уходит в фон. Прогон и владелец идут без исполнителя, и ждать их состоянием работы не бывает.
|
|
107
|
+
|
|
108
|
+
## Состояние `разбор-кончился`: договорённость вливается в спек домена
|
|
106
109
|
|
|
107
110
|
Последним коммитом PR, до слияния. Код к этому моменту написан, поэтому привязки
|
|
108
111
|
`файл:символ` известны — правило въезжает в спек домена сразу проверяемым.
|
|
@@ -131,7 +134,10 @@ npm run check:specs # раздел «Пора вливать» называе
|
|
|
131
134
|
npm run check:specs # после вливания: привязки на месте, сценарии не потерялись
|
|
132
135
|
```
|
|
133
136
|
|
|
134
|
-
|
|
137
|
+
**Следующее движение:** за влитой договорённостью тем же ходом идут тексты домена — правила,
|
|
138
|
+
паттерны и разделы, которые работа задела.
|
|
139
|
+
|
|
140
|
+
## Состояние `разбор-кончился`: тексты домена приводятся к сделанному
|
|
135
141
|
|
|
136
142
|
В спек уезжает только то, что записали до кода. Остальные тексты — правила, паттерны, законы
|
|
137
143
|
приложения — после правки никто не перечитывает, и они продолжают описывать старое дерево.
|
|
@@ -172,7 +178,10 @@ grep -rn -A3 "Чего из закона здесь нет" <каталог пр
|
|
|
172
178
|
Что сделали на этом шаге, пишется в тело PR: что перечитали, что изменили, а если ничего
|
|
173
179
|
не изменили — почему. Форма раздела — паттерн `git-workflow-commit`.
|
|
174
180
|
|
|
175
|
-
|
|
181
|
+
**Следующее движение:** приведённые тексты коммитятся, и тем же ходом разбирается папка
|
|
182
|
+
задачи — последним коммитом ветки.
|
|
183
|
+
|
|
184
|
+
## Состояние `разбор-кончился`: папка задачи разбирается
|
|
176
185
|
|
|
177
186
|
Разбор идёт по трём исходам, а не по двум.
|
|
178
187
|
|
|
@@ -229,7 +238,10 @@ rm -r docs/tasks/<своя>
|
|
|
229
238
|
Две записи в архиве, а не одна: работы разные, и решения в них разные. Сверка очереди работ
|
|
230
239
|
после этого не называет ни одной папки — этим и проверяется, что разобраны обе.
|
|
231
240
|
|
|
232
|
-
|
|
241
|
+
**Следующее движение:** разобранная папка уезжает в ветку тем же коммитом, и следом за ним
|
|
242
|
+
сверяется очередь работ.
|
|
243
|
+
|
|
244
|
+
## Состояние `папка-разобрана`: сверка очереди работ
|
|
233
245
|
|
|
234
246
|
```bash
|
|
235
247
|
npm run check:board # папка закрытой задачи среди текущих, брошенные черновики
|
|
@@ -237,7 +249,10 @@ npm run check:specs # договорённость влита, привязк
|
|
|
237
249
|
npm run check:docs # пути, названные в текстах, существуют
|
|
238
250
|
```
|
|
239
251
|
|
|
240
|
-
|
|
252
|
+
**Следующее движение:** расхождения, названные сверками, чинятся тем же ходом; чинить нечего —
|
|
253
|
+
тот же ход снимает черновик и просит владельца влить, называя номер.
|
|
254
|
+
|
|
255
|
+
## Состояние `влито`: работа разбирается правилами — фоном, следом за PR
|
|
241
256
|
|
|
242
257
|
Шаг о слое правил, а не о продукте: что за эту работу грузилось, что помогло, чего не хватило и
|
|
243
258
|
где текст правила разошёлся с деревом. Знает это только тот заход, который работу вёл, — через
|
|
@@ -261,13 +276,16 @@ npm run check:docs # пути, названные в текстах, суще
|
|
|
261
276
|
3. **Вернувшиеся находки принимают одним ходом** — записать и вернуться к прежнему. Разбор,
|
|
262
277
|
отложенный «до удобного момента», не случается вовсе: заход кончается раньше.
|
|
263
278
|
|
|
264
|
-
|
|
279
|
+
**Следующее движение:** пока роль разбирает, тот же ход занят следующей задачей; вернувшиеся
|
|
280
|
+
находки принимаются одним ходом — записать и продолжить прежнее.
|
|
281
|
+
|
|
282
|
+
## Состояние `влито`: находки разбора ложатся в папку задачи и ждут владельца
|
|
265
283
|
|
|
266
284
|
Ответ роли живёт в переписке и умирает вместе с ней, поэтому он сразу ложится на диск — в папку
|
|
267
285
|
задачи, файлом рядом с ходом работы. Пишет его исполнитель: роль файлов не пишет.
|
|
268
286
|
|
|
269
287
|
Папка задачи умирает со слиянием, а находки должны пережить весь эпик — владелец читает их
|
|
270
|
-
разом, когда эпик кончился. Поэтому при разборе папки
|
|
288
|
+
разом, когда эпик кончился. Поэтому при разборе папки файл находок не удаляется вместе
|
|
271
289
|
с остальным, а **переезжает к замыслу эпика**: там его найдут и после того, как ветка въехала.
|
|
272
290
|
Работа вне эпика показывает находки владельцу сразу, тем же ходом.
|
|
273
291
|
|
|
@@ -296,6 +314,9 @@ npm run check:docs # пути, названные в текстах, суще
|
|
|
296
314
|
котором владелец сказал вслух, уходит наружу в тот же ход: написанное и не отправленное лежит в
|
|
297
315
|
дереве неотличимо от отправленного.
|
|
298
316
|
|
|
317
|
+
**Следующее движение:** записанные находки работу не держат — следующая задача уже идёт, а
|
|
318
|
+
владельцу о них говорится, когда кончился эпик.
|
|
319
|
+
|
|
299
320
|
## Ловушки
|
|
300
321
|
|
|
301
322
|
- **Папку разбирают до слияния — потом о ней уже никто не вспомнит.** Сверка очереди считает
|
|
@@ -41,7 +41,7 @@ description: Паттерн правила task-flow. Брать, когда з
|
|
|
41
41
|
Незакрытый этап — тоже законная точка, если в ходе работы записано, что именно из него сделано и
|
|
42
42
|
чем это подтверждено. Незаконная точка одна: правка, о которой не записано ничего.
|
|
43
43
|
|
|
44
|
-
##
|
|
44
|
+
## Заход закрывается передачей, состояние работы при этом не меняется
|
|
45
45
|
|
|
46
46
|
Уборку этого шага — главную ветку, влитые ветки и запись самой передачи — делает команда
|
|
47
47
|
`next-session`: она проходит его целиком и называет путь к передаче последней строкой. Ниже —
|
|
@@ -66,6 +66,24 @@ mkdir -p <каталог передачи>
|
|
|
66
66
|
# файл — <каталог передачи>/<ветка>.md
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
+
**Черновик передачи пишет хук, а не рука.** Перед сжатием контекста он кладёт по тому же
|
|
70
|
+
адресу то, что есть на диске: ветку, состояние работы, следующий шаг, незакоммиченное, коммиты
|
|
71
|
+
сверх главной. Сжатие приходит и тогда, когда напомнить некому — ночью или посреди длинного
|
|
72
|
+
хода, — и без хука заход в этот момент терял передачу целиком.
|
|
73
|
+
|
|
74
|
+
**Читает передачу тоже хук, а не человек.** На запуске он кладёт её в контекст целиком — вместе
|
|
75
|
+
с картой хода, — и вставлять её руками не приходится ни после сжатия, ни после обрыва, ни после
|
|
76
|
+
очистки. Написанная и не прочитанная, передача равна ненаписанной: следующий заход о ней не
|
|
77
|
+
знает и начинает с пустого места, то есть с того же, ради чего её и писали.
|
|
78
|
+
|
|
79
|
+
Отсюда требование к тексту: передача пишется для машины, которая подаст её без разбора, и для
|
|
80
|
+
захода, который прочтёт её первой строкой. Обращаться в ней к владельцу — «спроси у него, чем
|
|
81
|
+
кончилась проба» — значит писать в пустоту: к моменту чтения владельца в разговоре ещё нет.
|
|
82
|
+
|
|
83
|
+
Написанное хуком — нижняя граница, а не готовая передача. Исполнитель, закрывающий заход по
|
|
84
|
+
правилу, пишет поверх: он знает то, чего на диске нет, — чем кончилась проба, почему выбран
|
|
85
|
+
этот путь, что владелец сказал по дороге. Файл один, последняя запись побеждает.
|
|
86
|
+
|
|
69
87
|
Внутри — готовый текст для вставки в новый заход, без обращения к владельцу за подробностями:
|
|
70
88
|
|
|
71
89
|
```markdown
|
|
@@ -34,7 +34,27 @@ description: Паттерн правила task-flow. Брать при возв
|
|
|
34
34
|
ней проверяется деревом — сборкой, тестами, чтением файла, — а не вопросом.
|
|
35
35
|
- **Не править замысел.** С ним сверяют результат; пересмотр идёт записью в ходе работы.
|
|
36
36
|
|
|
37
|
-
##
|
|
37
|
+
## Вход из передачи захода
|
|
38
|
+
|
|
39
|
+
Передача написана прошлым заходом и лежит вне дерева. Её читают как задание — и берутся за
|
|
40
|
+
работу мимо правила: состояние не сверено, правило не загружено, числа взяты на веру. Отличие
|
|
41
|
+
входа из передачи от обычного захода одно: всё, что в ней написано, проверяется деревом, потому
|
|
42
|
+
что писалась она вчера.
|
|
43
|
+
|
|
44
|
+
Порядок короткий, четыре шага:
|
|
45
|
+
|
|
46
|
+
1. **Правило ведения работы и этот паттерн — первым движением**, до первой реплики владельцу.
|
|
47
|
+
2. **Ветка и состояние работы читаются в дереве**, а не в передаче: `git branch --show-current`
|
|
48
|
+
и строка состояния в ходе работы. Разошлось с передачей — верно дерево.
|
|
49
|
+
3. **Числа из передачи пересчитываются** на текущем коммите. Оценка «работы вдвое больше» при
|
|
50
|
+
пересчёте не подтвердилась ни разу.
|
|
51
|
+
4. **Следующий шаг берётся из хода работы**, а не из раздела передачи о нём: ход работы
|
|
52
|
+
коммитится, передача — нет, и разойтись они успевают за один заход.
|
|
53
|
+
|
|
54
|
+
Чего в передаче нет и не будет: слов владельца — они в разборе просьбы; решений с причинами —
|
|
55
|
+
они в ходе работы; замысла — он на диске. Передача пересказывает, а не заменяет.
|
|
56
|
+
|
|
57
|
+
## Вход в заход: строка состояния сверяется с деревом
|
|
38
58
|
|
|
39
59
|
Сверить «Где стоим» с деревом. Запись описывает день, когда её сделали:
|
|
40
60
|
|
|
@@ -44,9 +64,11 @@ git log --oneline origin/main..HEAD
|
|
|
44
64
|
```
|
|
45
65
|
|
|
46
66
|
Разошлось — «Где стоим» правится сразу, до работы: следующий заход поверит записи, а не
|
|
47
|
-
дереву.
|
|
67
|
+
дереву. Строка состояния правится вместе с ним: гард читает её, и оставленная от прошлого
|
|
68
|
+
захода она либо отбивает законную правку, либо пропускает работу, которая до правки кода ещё
|
|
69
|
+
не дошла.
|
|
48
70
|
|
|
49
|
-
##
|
|
71
|
+
## Состояние `этап-идёт`: этап делается и отмечается в ходе работы
|
|
50
72
|
|
|
51
73
|
Раздел «Где стоим» **перезаписывается**, а не дописывается — это первое, что читает следующий
|
|
52
74
|
заход, и единственное, что переживает обрезку по объёму:
|
|
@@ -54,6 +76,7 @@ git log --oneline origin/main..HEAD
|
|
|
54
76
|
```markdown
|
|
55
77
|
## Где стоим
|
|
56
78
|
|
|
79
|
+
- **Состояние:** `этап-идёт`
|
|
57
80
|
- **Этап:** 3 из 6 — гард и хук запуска
|
|
58
81
|
- **Сделано:** закон заведён, папка задачи и образец написаны
|
|
59
82
|
- **Следующий шаг:** сценарии обоих хуков, затем подключение в настройках
|
|
@@ -71,6 +94,9 @@ git log --oneline origin/main..HEAD
|
|
|
71
94
|
- **PR:** #1396, ждёт разбора · отвечено 3 замечания из 5 · не сделано: разбор папки задачи
|
|
72
95
|
```
|
|
73
96
|
|
|
97
|
+
С открытием PR состояние становится `работа-отдана`, и обязательное действие у него другое —
|
|
98
|
+
следующая задача, а не ожидание разбора.
|
|
99
|
+
|
|
74
100
|
Решение, принятое по ходу, — вместе с причиной и с тем, что было альтернативой:
|
|
75
101
|
|
|
76
102
|
```markdown
|
|
@@ -94,7 +120,10 @@ git log --oneline origin/main..HEAD
|
|
|
94
120
|
- Доэтапное, не этой работы: сверка очереди перечисляет шесть закрытых задач вне борды.
|
|
95
121
|
```
|
|
96
122
|
|
|
97
|
-
|
|
123
|
+
**Следующее движение:** отмеченный этап тем же ходом сменяется следующим. Этапы кончились —
|
|
124
|
+
тот же ход гонит набор и открывает PR черновиком.
|
|
125
|
+
|
|
126
|
+
## Состояние `работа-отдана`: следующая задача берётся тем же движением
|
|
98
127
|
|
|
99
128
|
Задача закрыта, PR открыт и ждёт владельца — заход на этом не кончается. Отданное на разбор
|
|
100
129
|
ждёт человека, а не машину: пока эпик не кончился, следующая его задача берётся сразу, тем же
|
|
@@ -112,6 +141,9 @@ git log --oneline origin/main..HEAD
|
|
|
112
141
|
`task-flow-handoff`. Эпик кончился — заход закрывается тем же порядком, и владельцу называется,
|
|
113
142
|
что кончился именно эпик, а не одна его задача.
|
|
114
143
|
|
|
144
|
+
**Следующее движение:** по следующей задаче делается действие — заведена задача, ветка или
|
|
145
|
+
папка. Ход кончается после него, а не после слов о нём.
|
|
146
|
+
|
|
115
147
|
## Ловушки
|
|
116
148
|
|
|
117
149
|
- **Заход, кончившийся ничем, тоже записывается.** Иначе следующий пойдёт той же дорогой:
|
|
@@ -21,7 +21,7 @@ description: Паттерн правила task-flow. Брать в начале
|
|
|
21
21
|
не начинается заново. Весь список — в правиле `task-flow`; он же показывается владельцу в начале
|
|
22
22
|
работы, чтобы после шести вопросов было видно, что впереди.
|
|
23
23
|
|
|
24
|
-
###
|
|
24
|
+
### Состояние `просьба-не-разобрана`: разведка — до первого вопроса
|
|
25
25
|
|
|
26
26
|
Вопрос, ответ на который лежит в коде, владельцу не задаётся: он обесценивает и остальные.
|
|
27
27
|
|
|
@@ -40,7 +40,10 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
|
|
|
40
40
|
считается сделанным, разведка исполняется как настроение: прочитанный переданный текст сходит
|
|
41
41
|
за неё, и по текущему дереву не запускается ни одной команды.
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
**Следующее движение:** находки ложатся в разбор, и тем же ходом владельцу уходит первый из
|
|
44
|
+
шести вопросов. Разведка кончилась — состояние осталось прежним, ход тоже.
|
|
45
|
+
|
|
46
|
+
### Состояние `просьба-не-разобрана`: разбор с владельцем
|
|
44
47
|
|
|
45
48
|
Ведёт главный агент: субагент до владельца не достучится. Команда — `/grill-me`, один вопрос
|
|
46
49
|
за раз, к каждому — свой рекомендуемый ответ с доводом.
|
|
@@ -89,7 +92,10 @@ mkdir -p docs/tasks/_draft-<slug>
|
|
|
89
92
|
cp docs/tasks/_template/grill.md docs/tasks/_draft-<slug>/grill.md
|
|
90
93
|
```
|
|
91
94
|
|
|
92
|
-
|
|
95
|
+
**Следующее движение:** ответ владельца дописывается в разбор, и следом уходит следующий
|
|
96
|
+
вопрос. Ответы кончились — тем же ходом работа идёт в конвейер ролей.
|
|
97
|
+
|
|
98
|
+
### Состояние `разбор-закрыт`: конвейер после разбора
|
|
93
99
|
|
|
94
100
|
Вопросов больше не будет — дальше роли:
|
|
95
101
|
|
|
@@ -107,7 +113,10 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
|
|
|
107
113
|
«не входит». Находка критика, расходящаяся с ответом владельца, относится владельцу — она не
|
|
108
114
|
исполняется молча и не считается закрытой правкой текста.
|
|
109
115
|
|
|
110
|
-
|
|
116
|
+
**Следующее движение:** сверенная с разбором договорённость коммитится, и тем же ходом
|
|
117
|
+
заводятся задача, ветка и папка — а вышла из разбора серия, сперва объявляется эпик.
|
|
118
|
+
|
|
119
|
+
### Состояние `договорённость-записана`: серия задач объявляется эпиком
|
|
111
120
|
|
|
112
121
|
Разбор кончился одной задачей — шаг пропускается. Вышло несколько, и порядок между ними
|
|
113
122
|
значим — эпик объявляется здесь, до первой из них, и дважды: карточкой в очереди работ с меткой
|
|
@@ -134,7 +143,10 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
|
|
|
134
143
|
Лежит замысел вне папки задачи: та умирает с мержем первой же задачи. Каталог для него называет
|
|
135
144
|
компаньон правила — у пакета своего пути нет.
|
|
136
145
|
|
|
137
|
-
|
|
146
|
+
**Следующее движение:** объявленный эпик коммитится, и тем же ходом берётся первая его
|
|
147
|
+
задача — заведением задачи, ветки и папки.
|
|
148
|
+
|
|
149
|
+
### Состояние `договорённость-записана`: задача, ветка, папка
|
|
138
150
|
|
|
139
151
|
```bash
|
|
140
152
|
npm run task:new -- --title '<Что не так>' --slug <slug> --label documentation --label area:tooling < тело.md
|
|
@@ -162,7 +174,19 @@ cp docs/tasks/_template/plan.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/plan.m
|
|
|
162
174
|
cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/progress.md
|
|
163
175
|
```
|
|
164
176
|
|
|
165
|
-
|
|
177
|
+
В ходе работы первой строкой объявляется состояние — с этой минуты его читает гард:
|
|
178
|
+
|
|
179
|
+
```markdown
|
|
180
|
+
- **Состояние:** `задача-взята`
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Пока не объявлено состояние, в котором код правится, гард отбивает правку и называет
|
|
184
|
+
обязательное действие того состояния, которое стоит в строке.
|
|
185
|
+
|
|
186
|
+
**Следующее движение:** объявив состояние, тот же ход берётся за замысел — начиная с его
|
|
187
|
+
шапки. Заведённая папка ходом не кончается: в ней ещё нет ни одного написанного файла.
|
|
188
|
+
|
|
189
|
+
### Состояние `задача-взята`: шапка замысла
|
|
166
190
|
|
|
167
191
|
Её читает гард:
|
|
168
192
|
|
|
@@ -180,6 +204,32 @@ cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/pr
|
|
|
180
204
|
|
|
181
205
|
Пустая причина не принимается.
|
|
182
206
|
|
|
207
|
+
**Следующее движение:** под шапкой пишутся след задачи и этапы, замысел коммитится, и тем же
|
|
208
|
+
ходом начинается первый этап.
|
|
209
|
+
|
|
210
|
+
### Состояние `замысел-записан`: первый этап начинается тем же ходом
|
|
211
|
+
|
|
212
|
+
Замысел закоммичен — работа переходит в первый этап сразу, не отдавая хода. Строка состояния
|
|
213
|
+
перезаписывается на `этап-идёт`, и дальше работу ведёт паттерн возвращения.
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
- **Состояние:** `этап-идёт`
|
|
217
|
+
- **Этап:** 1 из 3 — <название первого этапа из замысла>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Ход на этой границе не кончается. Написанный замысел выглядит законченным куском: этапы
|
|
221
|
+
разложены, файл закоммичен, отчитаться есть чем — и отчёт встаёт ровно на то место, которое
|
|
222
|
+
должна была занять работа. Владелец читает такой отчёт как сделанное, а сделано ничего. Так
|
|
223
|
+
и вышло 21 августа: заход кончился строкой «следующий шаг — такой-то» при заполнении окна около
|
|
224
|
+
двух процентов.
|
|
225
|
+
|
|
226
|
+
Кончают ход четыре вещи, и они те же, что у остальных состояний: предел заполнения окна, отказ
|
|
227
|
+
гарда, вопрос владельцу и отданная работа, по которой начата следующая. Дочитанный до конца
|
|
228
|
+
паттерн к ним не относится — текст кончился, работа нет.
|
|
229
|
+
|
|
230
|
+
**Следующее движение:** первый этап делается тем же ходом, а закрытым он объявляется после
|
|
231
|
+
того, как прошла его команда из строки «Чем проверяется».
|
|
232
|
+
|
|
183
233
|
## Ловушки
|
|
184
234
|
|
|
185
235
|
- **Номер не бывает первым.** До конца разбора неизвестно даже, сколько задач из него выйдет:
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turn-entry-map
|
|
3
|
+
kind: pattern
|
|
4
|
+
rule: turn-entry
|
|
5
|
+
description: Паттерн правила turn-entry. Брать при правке карты хода и хука, который её подаёт, — что в карту входит, чем она отличается от правила, как хук молчит о недостающем и как это проверяется. Не брать для формы самой передачи — это паттерн task-flow-handoff.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Карта хода и её подача — готовый код
|
|
9
|
+
|
|
10
|
+
Паттерн правила `turn-entry`. Что при этом должно быть верно — закон
|
|
11
|
+
`docs/constitution/work-conduct.md`.
|
|
12
|
+
|
|
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
|
+
```bash
|
|
40
|
+
# передача — по имени текущей ветки, не выбором из каталога
|
|
41
|
+
handoff="$ROOT/${RT_HANDOFF_DIR:-.claude/handoff}/$(git branch --show-current).md"
|
|
42
|
+
[ -r "$handoff" ] && { printf 'ПЕРЕДАЧА ПРОШЛОГО ЗАХОДА\n\n'; cat "$handoff"; }
|
|
43
|
+
|
|
44
|
+
# карта — своим файлом, а не разбором правила
|
|
45
|
+
[ -r "$map" ] && { printf 'КАРТА ХОДА\n\n'; cat "$map"; }
|
|
46
|
+
|
|
47
|
+
exit 0
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Три вещи в этом куске обязательны и легко теряются:
|
|
51
|
+
|
|
52
|
+
- **`-r`, а не `-f`.** Файл может существовать и не читаться; `-f` тогда пропускает `cat`
|
|
53
|
+
дальше, и хук печатает заголовок над пустотой.
|
|
54
|
+
- **`exit 0` в конце и никаких других выходов.** Хук входа ничего не отбивает: заход без части
|
|
55
|
+
контекста лучше, чем отбитый запуск.
|
|
56
|
+
- **Имя файла собирается из ветки.** Выбор «первого попавшегося» в каталоге подаёт чужую
|
|
57
|
+
передачу, и выглядит она как своя.
|
|
58
|
+
|
|
59
|
+
## Чем это проверяется
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
node tools/check-turn-map.mjs # размер, полнота состояний в обе стороны, четыре выхода
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Проверка сверяет имена состояний карты с таблицей правила в обе стороны: состояние, заведённое
|
|
66
|
+
правилом и забытое в карте, и состояние, оставшееся в карте после переименования, — оба
|
|
67
|
+
расхождения.
|
|
68
|
+
|
|
69
|
+
Живая проба хука делается на дереве, где обе части лежат, и повторяется четырежды: обе части,
|
|
70
|
+
без передачи, без карты, без обеих. Последний случай обязан дать пустой вывод и нулевой код —
|
|
71
|
+
хук, промолчавший с ненулевым кодом, читается как отбитый запуск.
|
|
72
|
+
|
|
73
|
+
## Ловушки
|
|
74
|
+
|
|
75
|
+
- **Предел размера назначается замером, а не на глаз.** Первое число выбрали «вдвое больше
|
|
76
|
+
нынешней карты» — и проверка покраснела на собственном тексте в первом же прогоне: карта в
|
|
77
|
+
кириллице весит вдвое больше, чем кажется по числу строк.
|
|
78
|
+
- **Выход за предел означает деление карты, а не подъём предела.** Поднятый однажды, он
|
|
79
|
+
поднимается и во второй раз, и карта тихо становится вторым экземпляром правила.
|
|
80
|
+
- **Карта, разобранная из правила на месте, ломается молча.** Правку разметки таблицы не видит
|
|
81
|
+
ни одна проверка, а карта после неё приходит пустой — и заход об этом не узнает.
|