@rt-tools/agent-kit 0.5.0 → 0.5.2
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 +73 -0
- package/assets/checks/check-doc-paths.mjs +200 -30
- package/assets/checks/check-specs.mjs +42 -7
- package/assets/checks/rt-kit-checks.config.mjs +12 -0
- package/assets/commands/agent-kit-digest.md +83 -0
- package/assets/commands/next-session.md +122 -0
- package/assets/commands/skill-curator.md +33 -1
- package/assets/defaults/gate-map.sh +23 -1
- package/assets/defaults/project.sh +37 -1
- package/assets/docs/GLOSSARY.md +77 -0
- package/assets/hooks/docs-guard.sh +18 -1
- package/assets/hooks/git-guard-delivery.sh +30 -3
- package/assets/hooks/git-guard-main.sh +8 -0
- package/assets/hooks/git-guard-push-tests.sh +8 -1
- package/assets/hooks/grill-gate.sh +38 -16
- package/assets/hooks/lint-after-edit.sh +10 -3
- package/assets/hooks/observe.sh +90 -0
- package/assets/hooks/postmortem-guard.sh +92 -0
- package/assets/hooks/profile-check.sh +43 -0
- package/assets/hooks/qa-dataid-guard.sh +9 -2
- package/assets/hooks/reuse-first-guard.sh +9 -2
- package/assets/hooks/skill-gate.sh +15 -0
- package/assets/hooks/skill-loaded.sh +7 -0
- package/assets/hooks/task-context-load.sh +16 -2
- package/assets/hooks/task-flow-guard.sh +9 -2
- package/assets/hooks/window-fill-guard.sh +157 -0
- package/assets/laws/code-structure.md +10 -0
- package/assets/laws/delivery.md +8 -1
- package/assets/laws/project-documentation.md +9 -0
- package/assets/laws/verifiability.md +9 -0
- package/assets/laws/work-conduct.md +47 -0
- package/assets/patterns/git-workflow-commit.azure.md +16 -12
- package/assets/patterns/git-workflow-commit.github.md +16 -12
- package/assets/patterns/git-workflow-commit.gitlab.md +16 -12
- package/assets/patterns/spec-driven-domain.md +19 -0
- package/assets/patterns/task-flow-close.md +4 -4
- package/assets/patterns/task-flow-handoff.md +115 -0
- package/assets/patterns/task-flow-resume.md +14 -2
- package/assets/patterns/task-flow-start.md +40 -2
- package/assets/rules/doc-style.md +39 -1
- package/assets/rules/git-workflow.azure.md +39 -0
- package/assets/rules/git-workflow.github.md +38 -0
- package/assets/rules/git-workflow.gitlab.md +38 -0
- package/assets/rules/spec-driven.md +14 -0
- package/assets/rules/task-flow.md +70 -3
- package/assets/skills/agent-kit.md +32 -0
- package/assets/templates/postmortem.md +32 -0
- package/assets/templates/proposal.md +39 -0
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +50 -1
- package/bin/agent-kit.js.map +1 -1
- package/lib/catalog.d.ts +33 -0
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +55 -1
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts +41 -0
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +315 -3
- package/lib/commands.js.map +1 -1
- package/lib/config.d.ts +11 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +6 -0
- package/lib/config.js.map +1 -1
- package/lib/hooks-map.d.ts +15 -3
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +47 -11
- package/lib/hooks-map.js.map +1 -1
- package/lib/observations.d.ts +72 -0
- package/lib/observations.d.ts.map +1 -0
- package/lib/observations.js +126 -0
- package/lib/observations.js.map +1 -0
- package/lib/proposals.d.ts +48 -0
- package/lib/proposals.d.ts.map +1 -0
- package/lib/proposals.js +111 -0
- package/lib/proposals.js.map +1 -0
- package/lib/submit.d.ts +24 -0
- package/lib/submit.d.ts.map +1 -0
- package/lib/submit.js +26 -0
- package/lib/submit.js.map +1 -0
- package/lib/sync.d.ts +9 -1
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +4 -6
- package/lib/sync.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.5.2.tgz +0 -0
- package/rt-tools-agent-kit-0.5.0.tgz +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-flow-handoff
|
|
3
|
+
kind: pattern
|
|
4
|
+
rule: task-flow
|
|
5
|
+
description: Паттерн правила task-flow. Брать, когда заход упирается в заполнение окна — выбор точки остановки, запись хода работы, форма передачи и что владелец с ней делает. Не брать для возвращения к работе новым заходом — это паттерн task-flow-resume.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Закрытие захода по заполнению окна
|
|
9
|
+
|
|
10
|
+
Паттерн правила `task-flow`. Что при этом должно быть верно — закон
|
|
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
|
+
- начатое и брошенное названо в ходе работы прямо, вместе с причиной.
|
|
40
|
+
|
|
41
|
+
Незакрытый этап — тоже законная точка, если в ходе работы записано, что именно из него сделано и
|
|
42
|
+
чем это подтверждено. Незаконная точка одна: правка, о которой не записано ничего.
|
|
43
|
+
|
|
44
|
+
## 8. Заход закрывается передачей
|
|
45
|
+
|
|
46
|
+
Уборку этого шага — главную ветку, влитые ветки и запись самой передачи — делает команда
|
|
47
|
+
`next-session`: она проходит его целиком и называет путь к передаче последней строкой. Ниже —
|
|
48
|
+
что при этом должно получиться; порядок один и тот же, зовут его командой или руками.
|
|
49
|
+
|
|
50
|
+
### Ход работы
|
|
51
|
+
|
|
52
|
+
Раздел «Где стоим» перезаписывается, решения по ходу и запись захода дописываются. Форма —
|
|
53
|
+
паттерн `task-flow-resume`.
|
|
54
|
+
|
|
55
|
+
### Коммит
|
|
56
|
+
|
|
57
|
+
Проверенное коммитится сразу, а не копится до конца задачи. Работа кончена — открывается отчёт:
|
|
58
|
+
паттерн `git-workflow-commit`.
|
|
59
|
+
|
|
60
|
+
### Передача
|
|
61
|
+
|
|
62
|
+
Кладётся вне дерева, одним файлом на ветку — каталог передачи называет профиль дерева:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
mkdir -p <каталог передачи>
|
|
66
|
+
# файл — <каталог передачи>/<ветка>.md
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Внутри — готовый текст для вставки в новый заход, без обращения к владельцу за подробностями:
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
Работа: <КЛЮЧ>-<номер> «<название задачи>». Рабочее дерево — <полный путь>, ветка
|
|
73
|
+
<КЛЮЧ>-<номер>-<slug> (заведена, в работе).
|
|
74
|
+
|
|
75
|
+
Ход работы и замысел придут на запуске сессии хуком — перечитывать их файлами не надо. Разбор
|
|
76
|
+
просьбы владельца лежит в папке задачи и читается, когда непонятна причина решения.
|
|
77
|
+
|
|
78
|
+
Сделано: этапы 1–3 замысла закрыты и закоммичены.
|
|
79
|
+
Следующий шаг: этап 4 — <что именно>.
|
|
80
|
+
|
|
81
|
+
Что учесть в этом заходе:
|
|
82
|
+
|
|
83
|
+
- стенды уже подняты владельцем, свой не поднимать;
|
|
84
|
+
- зависимости этого дерева отстают от главной ветки — при падении сборки на чужой ошибке
|
|
85
|
+
сперва установка зависимостей;
|
|
86
|
+
- <прочее, чего нет ни в правилах, ни в ходе работы>.
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Разделы фиксированы, и порядок у них тот же:
|
|
90
|
+
|
|
91
|
+
1. **Работа** — номер задачи, её название, рабочее дерево полным путём, ветка и её состояние.
|
|
92
|
+
2. **Где искать** — что придёт хуком само, а что читается по надобности.
|
|
93
|
+
3. **Сделано и следующий шаг** — одной строкой каждое; подробности уже в ходе работы.
|
|
94
|
+
4. **Что учесть** — особенности этого захода, которых нет ни в правилах, ни в ходе работы:
|
|
95
|
+
поднятые стенды, отставшие зависимости, чужие процессы на портах, незакрытые вопросы к
|
|
96
|
+
владельцу.
|
|
97
|
+
|
|
98
|
+
### Путь владельцу
|
|
99
|
+
|
|
100
|
+
Последнее действие захода — назвать владельцу путь к передаче, чтобы он вставил текст в новый
|
|
101
|
+
заход одной вставкой. Пересказывать содержание передачи в ответе не надо: владелец её и так
|
|
102
|
+
прочитает, а место на неё уже потрачено.
|
|
103
|
+
|
|
104
|
+
## Ловушки
|
|
105
|
+
|
|
106
|
+
- **Заход закрывается на втором пороге, а не начинает на нём новый этап.** Напоминание на
|
|
107
|
+
первом — это уже сигнал выбирать точку, а не работать дальше, пока не отобьют.
|
|
108
|
+
- **Передача пишется как пересказ переписки.** В неё идёт то, чего нет ни в ходе работы, ни в
|
|
109
|
+
правилах: дерево, ветка, состояние стендов. Всё остальное следующий заход прочитает сам.
|
|
110
|
+
- **Состояние работы в передачу не переезжает.** Сделанное отмечается в ходе работы — одной
|
|
111
|
+
записью; передача его пересказывает, но не заменяет и в дерево не коммитится.
|
|
112
|
+
- **Незакоммиченное не названо.** Работа живёт в дереве неделями, и строка «что лежит
|
|
113
|
+
несохранённым и почему» — единственное, по чему это видно.
|
|
114
|
+
- **Заход, кончившийся ничем, тоже пишет передачу.** «Пробовали так — не вышло, потому что» —
|
|
115
|
+
это и есть его результат; без записи следующий заход повторит тот же путь.
|
|
@@ -10,6 +10,8 @@ description: Паттерн правила task-flow. Брать при возв
|
|
|
10
10
|
Паттерн правила `task-flow`. Что при этом должно быть верно — закон
|
|
11
11
|
`docs/constitution/work-conduct.md`.
|
|
12
12
|
|
|
13
|
+
**Требует:** `hooks/task-context-load.sh`
|
|
14
|
+
|
|
13
15
|
## Когда брать
|
|
14
16
|
|
|
15
17
|
- Сессия начата на ветке `<КЛЮЧ>-*`, работа в ней уже шла.
|
|
@@ -32,7 +34,7 @@ description: Паттерн правила task-flow. Брать при возв
|
|
|
32
34
|
ней проверяется деревом — сборкой, тестами, чтением файла, — а не вопросом.
|
|
33
35
|
- **Не править замысел.** С ним сверяют результат; пересмотр идёт записью в ходе работы.
|
|
34
36
|
|
|
35
|
-
##
|
|
37
|
+
## 6. Возвращение к работе новым заходом
|
|
36
38
|
|
|
37
39
|
Сверить «Где стоим» с деревом. Запись описывает день, когда её сделали:
|
|
38
40
|
|
|
@@ -44,7 +46,7 @@ git log --oneline origin/main..HEAD
|
|
|
44
46
|
Разошлось — «Где стоим» правится сразу, до работы: следующий заход поверит записи, а не
|
|
45
47
|
дереву.
|
|
46
48
|
|
|
47
|
-
##
|
|
49
|
+
## 7. Этап делается и отмечается в ходе работы
|
|
48
50
|
|
|
49
51
|
Раздел «Где стоим» **перезаписывается**, а не дописывается — это первое, что читает следующий
|
|
50
52
|
заход, и единственное, что переживает обрезку по объёму:
|
|
@@ -57,6 +59,16 @@ git log --oneline origin/main..HEAD
|
|
|
57
59
|
- **Следующий шаг:** сценарии обоих хуков, затем подключение в настройках
|
|
58
60
|
- **Незакоммиченное:** всё, ветка пока без коммитов
|
|
59
61
|
- **Ждём владельца:** нет
|
|
62
|
+
- **Отчёт:** ещё не открыт
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Строка про отчёт обязательна с той минуты, как этапы кончились: между открытием отчёта и
|
|
66
|
+
слиянием проходит день и больше, и заход обрывается там чаще всего. Без неё следующий заход
|
|
67
|
+
читает «этап последний, всё зелено» и об открытом отчёте узнаёт только из истории ветки или у
|
|
68
|
+
владельца — то есть ровно тем пересказом, ради отмены которого всё и заведено:
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
- **Отчёт:** #1396, ждёт разбора · отвечено 3 замечания из 5 · не сделано: разбор папки задачи
|
|
60
72
|
```
|
|
61
73
|
|
|
62
74
|
Решение, принятое по ходу, — вместе с причиной и с тем, что было альтернативой:
|
|
@@ -17,6 +17,10 @@ description: Паттерн правила task-flow. Брать в начале
|
|
|
17
17
|
|
|
18
18
|
## Порядок
|
|
19
19
|
|
|
20
|
+
Шаги ниже — начало сплошного счёта: номер шага один на весь путь работы и в следующем паттерне
|
|
21
|
+
не начинается заново. Весь список — в правиле `task-flow`; он же показывается владельцу в начале
|
|
22
|
+
работы, чтобы после шести вопросов было видно, что впереди.
|
|
23
|
+
|
|
20
24
|
### 1. Разведка — до первого вопроса
|
|
21
25
|
|
|
22
26
|
Вопрос, ответ на который лежит в коде, владельцу не задаётся: он обесценивает и остальные.
|
|
@@ -29,6 +33,13 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
|
|
|
29
33
|
|
|
30
34
|
Находки складываются в раздел «Что уже есть в дереве» разбора.
|
|
31
35
|
|
|
36
|
+
Разведка кончается не ощущением, а выводом команд. До первого вопроса владельцу исполнитель
|
|
37
|
+
знает: как устроен репозиторий (корневая памятка), что лежит в каталоге, о котором пойдёт речь
|
|
38
|
+
(`ls`), и есть ли уже написанное по теме (поиск по документации и правилам). Вопрос называет,
|
|
39
|
+
где искали: «в таком-то месте не нашёл» — проверяемо, «не знаю» — нет. Без списка того, что
|
|
40
|
+
считается сделанным, разведка исполняется как настроение: прочитанный переданный текст сходит
|
|
41
|
+
за неё, и по текущему дереву не запускается ни одной команды.
|
|
42
|
+
|
|
32
43
|
### 2. Разбор с владельцем
|
|
33
44
|
|
|
34
45
|
Ведёт главный агент: субагент до владельца не достучится. Команда — `/grill-me`, один вопрос
|
|
@@ -49,6 +60,24 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
|
|
|
49
60
|
каждому вопросу добавляется свободный вариант — у закрытого набора нет строки «вопрос не тот».
|
|
50
61
|
Выбор слова, имени и термина уточняется прозой в любом случае.
|
|
51
62
|
|
|
63
|
+
**Рамка переданного текста на текущее дерево не переносится.** Передача захода, файл
|
|
64
|
+
предложений и спек описывают то дерево, в котором писались. Про текущее знает только текущее:
|
|
65
|
+
прежде чем принять из такого текста утверждение о раскладке, оно проверяется командой здесь.
|
|
66
|
+
Подтверждение при этом находится само — признаки дерева, только ставящего пакет, стоят и у
|
|
67
|
+
дерева, которое пакет и пишет, и ставит.
|
|
68
|
+
|
|
69
|
+
Сообщение, которым исполнитель останавливается, начинается с того, чего он ждёт:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Стою на выборе <что решается>. Без ответа <что будет: пойду допущением таким-то / работа стоит>.
|
|
73
|
+
<Вопрос>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Замеры, находки ролей и список решений к этому моменту уже записаны в ход работы, и в
|
|
77
|
+
сообщении владельцу они лишние. Отчёт, в конце которого стоит вопрос, выглядит добросовестно
|
|
78
|
+
ровно настолько, насколько надёжно вопрос в нём тонет: владелец трижды переспрашивал, почему
|
|
79
|
+
работа стоит, и каждый круг стоил захода обоим.
|
|
80
|
+
|
|
52
81
|
Ответы пишутся в `docs/tasks/_draft-<slug>/grill.md` — папка ещё черновик, номера нет.
|
|
53
82
|
|
|
54
83
|
```bash
|
|
@@ -86,10 +115,19 @@ npm run task:move -- <номер> in-progress
|
|
|
86
115
|
Ветка заводится вторым вызовом: составную «завести и сразу коммитить» гард главной ветки
|
|
87
116
|
отклоняет целиком.
|
|
88
117
|
|
|
89
|
-
|
|
118
|
+
Номер уже выдан — черновика нет и не заводится: папка задачи открывается сразу под именем
|
|
119
|
+
ветки, а разбор пишется в неё же. Так начинается половина работ: номер приходит прошлым
|
|
120
|
+
заходом, замеченным дефектом или соседней задачей, и шаг с черновиком в этом случае неисполним
|
|
121
|
+
целиком — переименовывать нечего, `task:new` звать незачем. Ловушка «номер не бывает первым»
|
|
122
|
+
сюда не относится: она про то, что задачу не заводят до разбора, а не про то, что с уже
|
|
123
|
+
заведённой нельзя работать.
|
|
124
|
+
|
|
125
|
+
Остальные два файла пишутся, а не кладутся образцом впрок: пустой `plan.md` на диске
|
|
126
|
+
неотличим от замысла, у которого нет этапов, — а следующий заход читает папку задачи первым
|
|
127
|
+
делом и доверяет ей. Образец открывается тем же движением, которым заполняется:
|
|
90
128
|
|
|
91
129
|
```bash
|
|
92
|
-
cp docs/tasks/_template/plan.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/plan.md
|
|
130
|
+
cp docs/tasks/_template/plan.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/plan.md # и сразу пишется
|
|
93
131
|
cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/progress.md
|
|
94
132
|
```
|
|
95
133
|
|
|
@@ -34,8 +34,26 @@ description: Правило под «Закон о документации пр
|
|
|
34
34
|
которые едут в репозиторий: личный черновик, закрытый `.gitignore` или
|
|
35
35
|
`.git/info/exclude`, проверка не читает — мёртвая ссылка в нём держала гейт пуша, хотя ни
|
|
36
36
|
в одну ветку этот файл не попадёт.
|
|
37
|
+
- **Голое имя и каталог судятся наравне с полным путём.** Имя без каталога ищется по всему
|
|
38
|
+
дереву, каталог — среди каталогов; дерево спрашивается у системы контроля версий, иначе
|
|
39
|
+
каталоги, начинающиеся с точки, не видны и всё, что в них лежит, читалось бы как
|
|
40
|
+
несуществующее. Половина строк в таблицах «Где это лежит» — как раз каталоги.
|
|
37
41
|
- **Описание прошлого из проверки путей выведено целиком.** Архив по устройству называет
|
|
38
|
-
файлы, которых уже нет, и правкой это не лечится.
|
|
42
|
+
файлы, которых уже нет, и правкой это не лечится. Папка задачи выведена по той же причине:
|
|
43
|
+
раздел находок в ходе работы перечисляет ровно то, чего в дереве нет.
|
|
44
|
+
- **Переносимый текст из сверки адресов выведен, как архив.** Закон, правило и паттерн написаны
|
|
45
|
+
для любого дерева этого класса, и адреса в них принадлежат тому дереву, куда текст ложится:
|
|
46
|
+
`libs/common/util` там, где корни зовутся иначе, — пример, а не мёртвая ссылка. Разложенную
|
|
47
|
+
копию проверка узнаёт по шапке раскладки, исходник — по каталогу, названному в настройке; без
|
|
48
|
+
этого сверка краснеет на полторы сотни строк, ни одна из которых не чинится здесь.
|
|
49
|
+
- **Указатель каталога сверяется с его содержимым обеими сторонами.** Записи каталог набирает
|
|
50
|
+
быстрее, чем читают его указатель, и промах не виден ни в сборке, ни в браузере: запись,
|
|
51
|
+
приехавшая слиянием соседней ветки, просто не попадает в таблицу. Сверенный руками указатель
|
|
52
|
+
расходится снова через сутки.
|
|
53
|
+
- **Имя, названное затем, чтобы сказать «его нет», стоит в списке исключений поимённо.**
|
|
54
|
+
Отличить такое упоминание от ссылки машине нечем, а текст без него теряет смысл: правило и
|
|
55
|
+
замысел предупреждают именно о снятом. Туда же — то, что появляется только после сборки,
|
|
56
|
+
имена веток и правила линтеров: выглядят адресом, адресом не являются.
|
|
39
57
|
- **Документ едет в том же коммите, что и правка, которую он описывает.** Обход — строка
|
|
40
58
|
`Docs-skip: <причина>` в теле коммита; пустая причина не принимается.
|
|
41
59
|
|
|
@@ -57,6 +75,19 @@ description: Правило под «Закон о документации пр
|
|
|
57
75
|
- `doc-style-write` — как формулировать: примеры «так» и «не так», правила для комментариев.
|
|
58
76
|
- `doc-style-sweep` — разбор документа, накопившего список работ, на действующее и закрытое.
|
|
59
77
|
|
|
78
|
+
## Скилы дерева
|
|
79
|
+
|
|
80
|
+
Здесь дерево перечисляет свои скилы о документах — строка на скил: как он называется и какие
|
|
81
|
+
документы ведёт. У пакета этот раздел пуст: свои документы бывают только у дерева.
|
|
82
|
+
|
|
83
|
+
Раздел заведён затем, чтобы такому списку было куда встать. Дописанный в чужой раздел, он
|
|
84
|
+
уносит его с собой: надстройка сливается по заголовку `## ` и замещает пакетный раздел целиком,
|
|
85
|
+
поэтому приписка к «Ловушкам» стирает те пакетные пункты, которых дерево не переписывало, и
|
|
86
|
+
пропажу не видно ничем.
|
|
87
|
+
|
|
88
|
+
Читается этот список раньше остального: правило говорит, как формулировать, а скил дерева — что
|
|
89
|
+
у документа этого рода обязательно есть, вплоть до второго файла рядом.
|
|
90
|
+
|
|
60
91
|
## Ловушки
|
|
61
92
|
|
|
62
93
|
- **Оставшаяся работа не записывается в документ, а заводится задачей.** `docs/BACKLOG.md`
|
|
@@ -105,6 +136,13 @@ description: Правило под «Закон о документации пр
|
|
|
105
136
|
выборке руками до того, как его называют: разбор, не знающий второй формы записи, ошибается
|
|
106
137
|
молча — «51 пункт без задачи» оказался шестью, потому что номер стоял и отдельной строкой, и
|
|
107
138
|
в заголовке подраздела.
|
|
139
|
+
- **Названная в тексте проверка запускается, а не пересказывается.** «Проверка есть» и
|
|
140
|
+
«проверка проходит» — разные утверждения, и второго в тексте обычно нет вовсе. Из четырёх
|
|
141
|
+
проверок, названных правилом, три оказались не в том состоянии, в каком текст их описывает:
|
|
142
|
+
одна отдавала полтора десятка замечаний, вторая переписывала файлы самим запуском, третья
|
|
143
|
+
была красной и роняла общую сводку вместе с собой. Ни одна из трёх не входила в выкатку,
|
|
144
|
+
поэтому молчание было полным. Проверку, которая переписывает файлы, запускают на чистом
|
|
145
|
+
дереве: иначе её правки уедут чужим коммитом.
|
|
108
146
|
- **Сделанность читается по дереву, а не по тексту, который о ней написан.** Это верно в обе
|
|
109
147
|
стороны: строка про README обеих либ была вычеркнута как сделанная, а README остался с
|
|
110
148
|
прежним числом импортёров; задача, названная владельцу несделанной, оказалась наполовину
|
|
@@ -44,6 +44,10 @@ description: Правило под «Закон о поставке» для д
|
|
|
44
44
|
`az repos pr create` с такой ветки: локально она законна, но правка из неё — это выкатка, за
|
|
45
45
|
которой в очереди работ ничего не стоит. Заводится рабочий элемент, и работа переносится в
|
|
46
46
|
ветку с его номером.
|
|
47
|
+
- **Главная ветка влита в ветку рабочего элемента до открытия PR.** Гард поставки отбивает
|
|
48
|
+
открытие, пока вершина главной ветки не стала предком текущей, и называет расхождение числом
|
|
49
|
+
коммитов. PR с разошедшейся ветки показывает ревьюверу свою правку вперемешку с чужой, а всё,
|
|
50
|
+
что автор проверил до публикации, он проверил от основания, которого в главной ветке уже нет.
|
|
47
51
|
- **Номер ветки и номер в заголовке PR сверяются на месте, а состояние — по доске.** Формат
|
|
48
52
|
читается из текста команды и работает без сети; существование рабочего элемента, его
|
|
49
53
|
состояние, исполнитель и то, что он ещё открыт, — только когда есть чем спросить. Нет сети
|
|
@@ -107,6 +111,12 @@ description: Правило под «Закон о поставке» для д
|
|
|
107
111
|
работу вместо промаха. Держится это памятью и подсказкой, которую печатает команда заведения
|
|
108
112
|
задачи. Отставшее состояние находит сверка очереди — но уже после того, как PR открыт.
|
|
109
113
|
|
|
114
|
+
Свежесть самой вершины главной ветки гард не проверяет: он судит по тому, что лежит в дереве, и
|
|
115
|
+
вершину недельной давности от сегодняшней не отличает. Сетевой вызов сюда не заводится по той же
|
|
116
|
+
причине, что и выше, — он падал бы вместе со связью. Поэтому гард ловит ветку, отставшую
|
|
117
|
+
заведомо, а `git fetch` перед вливанием стоит первым пунктом чеклиста и держится тем же, чем
|
|
118
|
+
держатся остальные его пункты.
|
|
119
|
+
|
|
110
120
|
## Паттерны
|
|
111
121
|
|
|
112
122
|
- `git-workflow-commit` — рабочий элемент, ветка, коммит, пуш и PR от учётной записи машинной
|
|
@@ -114,3 +124,32 @@ description: Правило под «Закон о поставке» для д
|
|
|
114
124
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
115
125
|
- `git-workflow-migration` — правка схемы хранилища и её миграций.
|
|
116
126
|
- `git-workflow-restart` — ручной перезапуск прода.
|
|
127
|
+
|
|
128
|
+
## Ловушки
|
|
129
|
+
|
|
130
|
+
- **Одна работа — одна задача, сколько бы файлов она ни задела.** Числа, за которым правка
|
|
131
|
+
становится вторым рабочим элементом, здесь нет: делится то, что придётся откатывать порознь.
|
|
132
|
+
Сплошная правка текстов дерева была заведена тремя задачами «по объёму» — пришлось стирать
|
|
133
|
+
два рабочих элемента, закрывать два PR и переносить коммиты по одному с двумя конфликтами.
|
|
134
|
+
Одна из трёх не дала коммита вовсе: правка тел уже заведённых задач веткой не бывает и задачей
|
|
135
|
+
под ветку тоже.
|
|
136
|
+
- **Рабочий элемент заводится командой, а не вызовами подряд.** Доска показывает элементы своей
|
|
137
|
+
области и итерации, и заведённый мимо них в очереди работ не виден: со стороны это выглядит
|
|
138
|
+
так же, как незаведённый. Команда заведения ставит все поля разом — род, состояние,
|
|
139
|
+
исполнителя, область и итерацию, — и печатает готовую строку заведения ветки. Замеченный по
|
|
140
|
+
ходу дефект проходит тот же путь.
|
|
141
|
+
- **Ветка заводится вторым вызовом, а не тем же.** Гард главной ветки отклоняет составную
|
|
142
|
+
«создать ветку и сразу коммитить» целиком: ветки в момент разбора ещё нет.
|
|
143
|
+
- **Сторона конфликта бывает удалением, и «сохранить обе стороны» заводит второе объявление.**
|
|
144
|
+
Главная ветка снимает объявление, потому что символ переехал, — в конфликте это выглядит как
|
|
145
|
+
сторона, которая ничего не дописала. Разбирается чтением версии главной ветки целиком, а не по
|
|
146
|
+
хунку, и сверяется проверкой повторов: обе копии сами по себе исправны, сборка и линт зелёные.
|
|
147
|
+
- **Учётная запись для пуша и автор PR выбираются отдельно.** Если пушить пришлось из-под другой
|
|
148
|
+
записи, на следующий вызов это не переносится: PR открывают токеном учётной записи машинной
|
|
149
|
+
работы, и от того, чьей записью он открыт, зависит, кого можно назначить ревьювером. Однажды
|
|
150
|
+
смена записи ради пуша утекла в публикацию — отчёт вышел от владельца.
|
|
151
|
+
- **Новое рабочее дерево получает только то, что лежит в индексе.** `git worktree add`
|
|
152
|
+
разворачивает коммит, а настройки, ключи, локальные разрешения и зависимости в коммит не
|
|
153
|
+
входят: свежее дерево выглядит готовым и упирается в нехватку не сразу, а на первом гарде,
|
|
154
|
+
которому нужен ключ. Что именно переносится руками, названо списком в компаньоне правила, и
|
|
155
|
+
список пополняется тем же движением, которым заводится новый файл вне индекса.
|
|
@@ -44,6 +44,10 @@ description: Правило под «Закон о поставке» для д
|
|
|
44
44
|
- **Ветка без номера задачи PR не открывает.** Гард поставки отбивает `gh pr create` с такой
|
|
45
45
|
ветки: локально она законна, но правка из неё — это выкатка, за которой в очереди работ
|
|
46
46
|
ничего не стоит. Заводится задача, и работа переносится в ветку с её номером.
|
|
47
|
+
- **Главная ветка влита в ветку задачи до открытия PR.** Гард поставки отбивает открытие, пока
|
|
48
|
+
вершина главной ветки не стала предком текущей, и называет расхождение числом коммитов. PR с
|
|
49
|
+
разошедшейся ветки показывает ревьюверу свою правку вперемешку с чужой, а всё, что автор
|
|
50
|
+
проверил до публикации, он проверил от основания, которого в главной ветке уже нет.
|
|
47
51
|
- **Ключ задач задаётся один раз, и все три формы имени выводятся из него.** Заголовок задачи,
|
|
48
52
|
имя ветки и заголовок отчёта строит один и тот же ключ: команда заведения задачи собирает по
|
|
49
53
|
нему заголовок, гард поставки достаёт по нему номер из имени ветки, сверка очереди — из
|
|
@@ -115,9 +119,43 @@ description: Правило под «Закон о поставке» для д
|
|
|
115
119
|
работу вместо промаха. Держится это памятью и подсказкой, которую печатает команда заведения
|
|
116
120
|
задачи. Отставшую колонку находит сверка очереди — но уже после того, как PR открыт.
|
|
117
121
|
|
|
122
|
+
Свежесть самой вершины главной ветки гард не проверяет: он судит по тому, что лежит в дереве, и
|
|
123
|
+
вершину недельной давности от сегодняшней не отличает. Сетевой вызов сюда не заводится по той же
|
|
124
|
+
причине, что и выше, — он падал бы вместе со связью. Поэтому гард ловит ветку, отставшую
|
|
125
|
+
заведомо, а `git fetch` перед вливанием стоит первым пунктом чеклиста и держится тем же, чем
|
|
126
|
+
держатся остальные его пункты.
|
|
127
|
+
|
|
118
128
|
## Паттерны
|
|
119
129
|
|
|
120
130
|
- `git-workflow-commit` — задача, ветка, коммит, пуш и PR от учётной записи машинной работы.
|
|
121
131
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
122
132
|
- `git-workflow-migration` — правка схемы хранилища и её миграций.
|
|
123
133
|
- `git-workflow-restart` — ручной перезапуск прода.
|
|
134
|
+
|
|
135
|
+
## Ловушки
|
|
136
|
+
|
|
137
|
+
- **Одна работа — одна задача, сколько бы файлов она ни задела.** Числа, за которым правка
|
|
138
|
+
становится второй задачей, здесь нет: делится то, что придётся откатывать порознь. Сплошная
|
|
139
|
+
правка текстов дерева была заведена тремя задачами «по объёму» — пришлось стирать две,
|
|
140
|
+
закрывать два PR и переносить коммиты по одному с двумя конфликтами. Одна из трёх не дала
|
|
141
|
+
коммита вовсе: правка тел уже заведённых задач веткой не бывает и задачей под ветку тоже.
|
|
142
|
+
- **Задача заводится командой, а не четырьмя вызовами подряд.** Борда к репозиторию не
|
|
143
|
+
привязана, и задача попадает на неё только явным добавлением: две задачи так и простояли вне
|
|
144
|
+
очереди работ, потому что шаг переписывали руками. Команда заведения делает все четыре — issue,
|
|
145
|
+
номер в его заголовке, добавление на борду, начальную колонку, — и печатает готовую строку
|
|
146
|
+
заведения ветки. Замеченный по ходу дефект проходит тот же путь.
|
|
147
|
+
- **Ветка заводится вторым вызовом, а не тем же.** Гард главной ветки отклоняет составную
|
|
148
|
+
«создать ветку и сразу коммитить» целиком: ветки в момент разбора ещё нет.
|
|
149
|
+
- **Сторона конфликта бывает удалением, и «сохранить обе стороны» заводит второе объявление.**
|
|
150
|
+
Главная ветка снимает объявление, потому что символ переехал, — в конфликте это выглядит как
|
|
151
|
+
сторона, которая ничего не дописала. Разбирается чтением версии главной ветки целиком, а не по
|
|
152
|
+
хунку, и сверяется проверкой повторов: обе копии сами по себе исправны, сборка и линт зелёные.
|
|
153
|
+
- **Учётная запись для пуша и автор PR выбираются отдельно.** Если пушить пришлось из-под другой
|
|
154
|
+
записи, на следующий вызов это не переносится: PR открывают токеном учётной записи машинной
|
|
155
|
+
работы, и от того, чьей записью он открыт, зависит, кого можно назначить ревьювером. Однажды
|
|
156
|
+
смена записи ради пуша утекла в публикацию — отчёт вышел от владельца.
|
|
157
|
+
- **Новое рабочее дерево получает только то, что лежит в индексе.** `git worktree add`
|
|
158
|
+
разворачивает коммит, а настройки, ключи, локальные разрешения и зависимости в коммит не
|
|
159
|
+
входят: свежее дерево выглядит готовым и упирается в нехватку не сразу, а на первом гарде,
|
|
160
|
+
которому нужен ключ. Что именно переносится руками, названо списком в компаньоне правила, и
|
|
161
|
+
список пополняется тем же движением, которым заводится новый файл вне индекса.
|
|
@@ -43,6 +43,10 @@ description: Правило под «Закон о поставке» для д
|
|
|
43
43
|
- **Ветка без номера задачи MR не открывает.** Гард поставки отбивает `glab mr create` с такой
|
|
44
44
|
ветки: локально она законна, но правка из неё — это выкатка, за которой в очереди работ
|
|
45
45
|
ничего не стоит. Заводится задача, и работа переносится в ветку с её номером.
|
|
46
|
+
- **Главная ветка влита в ветку задачи до открытия MR.** Гард поставки отбивает открытие, пока
|
|
47
|
+
вершина главной ветки не стала предком текущей, и называет расхождение числом коммитов. MR с
|
|
48
|
+
разошедшейся ветки показывает ревьюверу свою правку вперемешку с чужой, а всё, что автор
|
|
49
|
+
проверил до публикации, он проверил от основания, которого в главной ветке уже нет.
|
|
46
50
|
- **Номер ветки и номер в заголовке MR сверяются на месте, а состояние задачи — по доске.**
|
|
47
51
|
Формат читается из текста команды и работает без сети; существование задачи, её метка
|
|
48
52
|
списка, исполнитель и то, что она ещё открыта, — только когда есть чем спросить. Нет сети
|
|
@@ -105,9 +109,43 @@ description: Правило под «Закон о поставке» для д
|
|
|
105
109
|
работу вместо промаха. Держится это памятью и подсказкой, которую печатает команда заведения
|
|
106
110
|
задачи. Отставший список находит сверка очереди — но уже после того, как MR открыт.
|
|
107
111
|
|
|
112
|
+
Свежесть самой вершины главной ветки гард не проверяет: он судит по тому, что лежит в дереве, и
|
|
113
|
+
вершину недельной давности от сегодняшней не отличает. Сетевой вызов сюда не заводится по той же
|
|
114
|
+
причине, что и выше, — он падал бы вместе со связью. Поэтому гард ловит ветку, отставшую
|
|
115
|
+
заведомо, а `git fetch` перед вливанием стоит первым пунктом чеклиста и держится тем же, чем
|
|
116
|
+
держатся остальные его пункты.
|
|
117
|
+
|
|
108
118
|
## Паттерны
|
|
109
119
|
|
|
110
120
|
- `git-workflow-commit` — задача, ветка, коммит, пуш и MR от учётной записи машинной работы.
|
|
111
121
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
112
122
|
- `git-workflow-migration` — правка схемы хранилища и её миграций.
|
|
113
123
|
- `git-workflow-restart` — ручной перезапуск прода.
|
|
124
|
+
|
|
125
|
+
## Ловушки
|
|
126
|
+
|
|
127
|
+
- **Одна работа — одна задача, сколько бы файлов она ни задела.** Числа, за которым правка
|
|
128
|
+
становится второй задачей, здесь нет: делится то, что придётся откатывать порознь. Сплошная
|
|
129
|
+
правка текстов дерева была заведена тремя задачами «по объёму» — пришлось стирать две,
|
|
130
|
+
закрывать два MR и переносить коммиты по одному с двумя конфликтами. Одна из трёх не дала
|
|
131
|
+
коммита вовсе: правка тел уже заведённых задач веткой не бывает и задачей под ветку тоже.
|
|
132
|
+
- **Задача заводится командой, а не вызовами подряд.** Доска показывает те issue, чью метку
|
|
133
|
+
знает, и задача без метки списка в очереди работ не видна: со стороны это выглядит так же, как
|
|
134
|
+
незаведённая. Команда заведения ставит всё разом — issue, номер в его заголовке, метку списка,
|
|
135
|
+
исполнителя, — и печатает готовую строку заведения ветки. Замеченный по ходу дефект проходит
|
|
136
|
+
тот же путь.
|
|
137
|
+
- **Ветка заводится вторым вызовом, а не тем же.** Гард главной ветки отклоняет составную
|
|
138
|
+
«создать ветку и сразу коммитить» целиком: ветки в момент разбора ещё нет.
|
|
139
|
+
- **Сторона конфликта бывает удалением, и «сохранить обе стороны» заводит второе объявление.**
|
|
140
|
+
Главная ветка снимает объявление, потому что символ переехал, — в конфликте это выглядит как
|
|
141
|
+
сторона, которая ничего не дописала. Разбирается чтением версии главной ветки целиком, а не по
|
|
142
|
+
хунку, и сверяется проверкой повторов: обе копии сами по себе исправны, сборка и линт зелёные.
|
|
143
|
+
- **Учётная запись для пуша и автор MR выбираются отдельно.** Если пушить пришлось из-под другой
|
|
144
|
+
записи, на следующий вызов это не переносится: MR открывают токеном учётной записи машинной
|
|
145
|
+
работы, и от того, чьей записью он открыт, зависит, кого можно назначить ревьювером. Однажды
|
|
146
|
+
смена записи ради пуша утекла в публикацию — отчёт вышел от владельца.
|
|
147
|
+
- **Новое рабочее дерево получает только то, что лежит в индексе.** `git worktree add`
|
|
148
|
+
разворачивает коммит, а настройки, ключи, локальные разрешения и зависимости в коммит не
|
|
149
|
+
входят: свежее дерево выглядит готовым и упирается в нехватку не сразу, а на первом гарде,
|
|
150
|
+
которому нужен ключ. Что именно переносится руками, названо списком в компаньоне правила, и
|
|
151
|
+
список пополняется тем же движением, которым заводится новый файл вне индекса.
|
|
@@ -73,6 +73,14 @@ description: Правило под «Закон о документации пр
|
|
|
73
73
|
внутри спека означает, что предмет описан дважды; занятый чужим — что по номеру не видно,
|
|
74
74
|
чей это сценарий. Договорённость о продукте — исключение: она нумеруется вместе со спеком, в
|
|
75
75
|
который вольётся, и занятым префикс от неё не становится.
|
|
76
|
+
- **Номер сценария выдаётся один раз и повторно не используется.** Новый сценарий берёт
|
|
77
|
+
следующий свободный номер, а не вставляется в середину и не занимает номер удалённого: на
|
|
78
|
+
месте удалённого номер так и остаётся пустым. Номер — единственное, чем сценарий связан с
|
|
79
|
+
тестом, и отданный второй раз он оставляет старую ссылку правильной на вид и ведущей не туда.
|
|
80
|
+
Пересчитать номера подряд особенно дёшево на вид: тесты зелёные и до, и после.
|
|
81
|
+
- **Сценарий и заголовок его теста правятся одним изменением.** Изменилось обещание — номер тот
|
|
82
|
+
же, а заголовок теста правится тем же коммитом; удалён сценарий — удаляется и тест.
|
|
83
|
+
Разъехавшись, они оставляют прогон зелёным, хотя проверяет он уже не то.
|
|
76
84
|
- **Поддомен спрашивается наравне с доменом.** Те же обязательные разделы, тот же компаньон
|
|
77
85
|
рядом, та же связь сценариев с тестами. Домен, у которого половина поддоменов описана, а
|
|
78
86
|
половина заведена пустыми каталогами, зелёным не бывает.
|
|
@@ -95,6 +103,12 @@ description: Правило под «Закон о документации пр
|
|
|
95
103
|
- **Спек объявляет законы, которые применяет, и связь сверяется в обе стороны.** Закон,
|
|
96
104
|
названный в тексте спека, обязан стоять в шапке: иначе по закону не узнать, какие домены
|
|
97
105
|
на нём стоят.
|
|
106
|
+
- **Переносимый текст говорит о соседнем ресурсе условно и называет его по имени.** Что
|
|
107
|
+
разложено в дереве, а что нет, знает список раскладки, а не текст ресурса. Сказанное
|
|
108
|
+
безусловно — «правку кода до этого отбивает гард» — приходит в контекст каждой сессии и врёт
|
|
109
|
+
про дерево, где того гарда не разложили; поправить это дерево не может ничем, если у ресурса
|
|
110
|
+
нет надстройки. Требование ресурса к ресурсу при этом объявляется строкой в шапке, а не
|
|
111
|
+
выводится из такой фразы.
|
|
98
112
|
|
|
99
113
|
## Чего из закона здесь нет
|
|
100
114
|
|