@rt-tools/agent-kit 0.4.0 → 0.5.1
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/checks/board.github.mjs +45 -2
- package/assets/checks/check-board.github.mjs +7 -14
- package/assets/checks/check-doc-paths.mjs +200 -30
- package/assets/checks/check-specs.mjs +131 -17
- package/assets/checks/rt-kit-checks.config.mjs +12 -0
- package/assets/commands/next-session.md +122 -0
- package/assets/defaults/gate-map.sh +29 -3
- package/assets/defaults/project.sh +50 -0
- package/assets/docs/GLOSSARY.md +74 -0
- package/assets/hooks/git-guard-delivery.sh +87 -4
- package/assets/hooks/grill-gate.sh +96 -0
- package/assets/hooks/task-flow-guard.sh +14 -3
- package/assets/hooks/window-fill-guard.sh +150 -0
- package/assets/laws/code-structure.md +10 -0
- package/assets/laws/delivery.md +8 -1
- package/assets/laws/project-documentation.md +14 -0
- package/assets/laws/verifiability.md +13 -0
- package/assets/laws/work-conduct.md +19 -0
- package/assets/patterns/git-workflow-commit.github.md +4 -0
- package/assets/patterns/spec-driven-domain.md +35 -0
- package/assets/patterns/task-flow-close.md +72 -8
- package/assets/patterns/task-flow-handoff.md +115 -0
- package/assets/patterns/task-flow-resume.md +2 -2
- package/assets/patterns/task-flow-start.md +18 -2
- package/assets/rules/angular-patterns.md +4 -0
- package/assets/rules/browser-verification.md +4 -3
- package/assets/rules/doc-style.md +53 -1
- package/assets/rules/git-workflow.azure.md +24 -0
- package/assets/rules/git-workflow.github.md +23 -0
- package/assets/rules/git-workflow.gitlab.md +23 -0
- package/assets/rules/spec-driven.md +19 -1
- package/assets/rules/task-flow.md +88 -2
- package/assets/skills/agent-kit.md +4 -0
- package/assets/templates/rule.md +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +2 -1
- package/lib/commands.js.map +1 -1
- package/lib/config.d.ts +3 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +2 -0
- package/lib/config.js.map +1 -1
- package/lib/hooks-map.d.ts +20 -5
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +56 -15
- package/lib/hooks-map.js.map +1 -1
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +2 -5
- package/lib/sync.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.5.1.tgz +0 -0
- package/rt-tools-agent-kit-0.4.0.tgz +0 -0
|
@@ -15,7 +15,7 @@ description: Паттерн правила task-flow. Брать при закр
|
|
|
15
15
|
- Этапы замысла закрыты, проверки зелёные, отчёт готовится к публикации.
|
|
16
16
|
- `npm run check:specs` перечислил договорённость в разделе «Пора вливать».
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## 9. Договорённость вливается в спек домена
|
|
19
19
|
|
|
20
20
|
Последним коммитом отчёта, до слияния. Код к этому моменту написан, поэтому привязки
|
|
21
21
|
`файл:символ` известны — правило въезжает в спек домена сразу проверяемым.
|
|
@@ -44,7 +44,48 @@ npm run check:specs # раздел «Пора вливать» называе
|
|
|
44
44
|
npm run check:specs # после вливания: привязки на месте, сценарии не потерялись
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
##
|
|
47
|
+
## 10. Тексты домена приводятся к сделанному
|
|
48
|
+
|
|
49
|
+
В спек уезжает только то, что записали до кода. Остальные тексты — правила, паттерны, законы
|
|
50
|
+
приложения — после правки никто не перечитывает, и они продолжают описывать старое дерево.
|
|
51
|
+
Следующий читатель принимает их за верные.
|
|
52
|
+
|
|
53
|
+
Что перечитывать, берётся из раздела замысла, где названо, что работа задевает: там стоят
|
|
54
|
+
спеки, законы и правила по её следу. К ним добавляется то, что всплыло по ходу. Всю
|
|
55
|
+
конституцию и все правила читать не надо.
|
|
56
|
+
|
|
57
|
+
| Род текста | Что с ним делается |
|
|
58
|
+
| --------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
59
|
+
| спек домена и его поддомены | у новой фичи появляется правило, сценарий и привязка; из «Что не входит» убирается то, что теперь входит |
|
|
60
|
+
| правило и его `implementation.md` | новое утверждение с привязкой `файл:символ`; снятое убирается вместе со строкой привязки |
|
|
61
|
+
| паттерн | код, разошедшийся с деревом, правится; новый приём дописывается разделом |
|
|
62
|
+
| закон приложения и общий закон | **файл не правится**: владельцу приносится текст статьи, работа идёт дальше без неё |
|
|
63
|
+
| обзорный документ продукта | новая фича дописывается строкой; строка о снятом правится |
|
|
64
|
+
|
|
65
|
+
Устаревшее чаще всего лежит в трёх местах, и все три читаются целиком:
|
|
66
|
+
|
|
67
|
+
- **«Чего из закона здесь нет» в правиле.** Сверка спеков этот раздел не читает, поэтому
|
|
68
|
+
неправда живёт в нём сколько угодно: правило три задачи подряд писало, что нужного механизма
|
|
69
|
+
в дереве нет, — а он был;
|
|
70
|
+
- **«Что не входит» в спеке домена.** Туда писали границу задачи, а задача давно закрыта;
|
|
71
|
+
- **«Где это лежит» в правиле.** Файлы переезжают, пути в таблице остаются.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# где правило и спеки говорят о том, что задевала работа
|
|
75
|
+
grep -rn -i "<слово работы>" <каталог правил>/*/SKILL.md docs/specs/*/spec.md
|
|
76
|
+
# раздел, который не сверяется ничем, — читается глазами целиком
|
|
77
|
+
grep -rn -A3 "Чего из закона здесь нет" <каталог правил>/<правило>/SKILL.md
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Закон в ветке не правится.** Статья закона — договорённость с владельцем, и меняет её он.
|
|
81
|
+
Работа с ней разошлась — пишется готовый текст статьи: в ход работы и в тело отчёта. Файл
|
|
82
|
+
закона правится после ответа. С законами приложения так же: деньги, локали и доступ — та же
|
|
83
|
+
договорённость, только про это приложение.
|
|
84
|
+
|
|
85
|
+
Что сделали на этом шаге, пишется в тело отчёта: что перечитали, что изменили, а если ничего
|
|
86
|
+
не изменили — почему. Форма раздела — паттерн `git-workflow-commit`.
|
|
87
|
+
|
|
88
|
+
## 11. Папка задачи разбирается
|
|
48
89
|
|
|
49
90
|
Целиком в архив не переносится: `docs/archive/` — место для записей о состоявшемся, которые
|
|
50
91
|
кто-то читает, а не свалка ходов работы.
|
|
@@ -65,7 +106,7 @@ rm -r docs/tasks/<КЛЮЧ>-<номер>-<slug>
|
|
|
65
106
|
Разбор идёт в том же отчёте, что и работа: папка, оставленная до мержа, попадает в главную
|
|
66
107
|
ветку и читается там как текущая.
|
|
67
108
|
|
|
68
|
-
##
|
|
109
|
+
## 12. Сверка
|
|
69
110
|
|
|
70
111
|
```bash
|
|
71
112
|
npm run check:board # папка закрытой задачи среди текущих, брошенные черновики
|
|
@@ -75,11 +116,34 @@ npm run check:docs # пути, названные в текстах, суще
|
|
|
75
116
|
|
|
76
117
|
## Ловушки
|
|
77
118
|
|
|
78
|
-
- **Папку разбирают до
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
подряд папка закрытой задачи так и уехала в главную
|
|
82
|
-
|
|
119
|
+
- **Папку разбирают до слияния — потом о ней уже никто не вспомнит.** Сверка очереди считает
|
|
120
|
+
задачу закрытой по слиянию: до него папка среди текущих законна, а после за неё никто не
|
|
121
|
+
отвечает — работа перешла к следующей задаче, и находка достанется чужому заходу. Три раза
|
|
122
|
+
подряд папка закрытой задачи так и уехала в главную ветку, в последний раз их набралось
|
|
123
|
+
пять. Теперь это держит гард поставки: слияние отбивается, пока папка лежит в ветке.
|
|
124
|
+
- **Разбирают последним коммитом, а не перед открытием отчёта.** Пока идёт ревью, замысел
|
|
125
|
+
нужен на диске: без него правку по замечаниям не пропустит гард хода работы. Порядок такой:
|
|
126
|
+
правки по ревью, потом разбор папки, потом слияние.
|
|
127
|
+
- **Разбор папки идёт последним, после того как гейт пуша прошёл целиком.** Гард хода работы
|
|
128
|
+
не пускает правку кода приложения без замысла на диске, а после разбора замысла нет: чужое
|
|
129
|
+
замечание линтера, приехавшее мержем из главной ветки, чинить уже нечем, и гейт пуша стоит.
|
|
130
|
+
Порядок один: мерж главной ветки, все линтеры и проверки зелёные, вливание договорённости,
|
|
131
|
+
приведение текстов домена, разбор папки. Понадобилась правка кода после разбора — замысел
|
|
132
|
+
восстанавливается на диске на время правки, и разбор повторяется тем же коммитом.
|
|
133
|
+
- **Тексты правятся до разбора папки.** Список того, что перечитывать, лежит в замысле, а
|
|
134
|
+
разбор папки его удаляет. После разбора остаётся только память о том, что задевали.
|
|
135
|
+
- **Утверждение правила снимается вместе со строкой привязки.** Связь идёт по тексту
|
|
136
|
+
утверждения. Убрали утверждение и оставили строку в `implementation.md` — сверка спеков
|
|
137
|
+
краснеет; убрали строку и оставили утверждение — тоже.
|
|
138
|
+
- **Раздел «Чего из закона здесь нет» читается глазами, греп тут не помогает.** Искать
|
|
139
|
+
приходится не то слово, которое ждёшь: правило ссылалось на статью закона, которой в законе
|
|
140
|
+
нет вовсе, и по слову из своей темы эта строка находилась — а неправда была в другом.
|
|
141
|
+
- **Сказать «сверено», не открыв файл, нельзя.** Правило читается целиком. Устаревшее
|
|
142
|
+
утверждение стоит в списке среди верных и ничем от них не отличается.
|
|
143
|
+
- **Если папку просто удалить, первым пропадёт `grill.md`.** Удалить проще, чем разобрать, а
|
|
144
|
+
слова владельца записаны только там, и восстановить их неоткуда. Поэтому гард требует, чтобы
|
|
145
|
+
ветка добавила запись в архив. Что именно перенесли, он не проверяет — это смотрит владелец
|
|
146
|
+
на ревью.
|
|
83
147
|
- **Вливание после мержа не делается.** В главной ветке тогда лежит раздел «предложено, но не
|
|
84
148
|
выкачено» с тем, что работает месяц, — беззвучная ложь, тем убедительнее, чем старше.
|
|
85
149
|
- **Номера сценариев при вливании не пересчитываются.** Идентификатор — ключ связи с тестами;
|
|
@@ -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
|
+
это и есть его результат; без записи следующий заход повторит тот же путь.
|
|
@@ -32,7 +32,7 @@ description: Паттерн правила task-flow. Брать при возв
|
|
|
32
32
|
ней проверяется деревом — сборкой, тестами, чтением файла, — а не вопросом.
|
|
33
33
|
- **Не править замысел.** С ним сверяют результат; пересмотр идёт записью в ходе работы.
|
|
34
34
|
|
|
35
|
-
##
|
|
35
|
+
## 6. Возвращение к работе новым заходом
|
|
36
36
|
|
|
37
37
|
Сверить «Где стоим» с деревом. Запись описывает день, когда её сделали:
|
|
38
38
|
|
|
@@ -44,7 +44,7 @@ git log --oneline origin/main..HEAD
|
|
|
44
44
|
Разошлось — «Где стоим» правится сразу, до работы: следующий заход поверит записи, а не
|
|
45
45
|
дереву.
|
|
46
46
|
|
|
47
|
-
##
|
|
47
|
+
## 7. Этап делается и отмечается в ходе работы
|
|
48
48
|
|
|
49
49
|
Раздел «Где стоим» **перезаписывается**, а не дописывается — это первое, что читает следующий
|
|
50
50
|
заход, и единственное, что переживает обрезку по объёму:
|
|
@@ -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
|
Вопрос, ответ на который лежит в коде, владельцу не задаётся: он обесценивает и остальные.
|
|
@@ -45,8 +49,9 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
|
|
|
45
49
|
| Чем будет видно, что задача закрыта | «работает» признаком не является |
|
|
46
50
|
| Есть ли образец, с которого снимается подход | разведка найдёт похожее, а не то |
|
|
47
51
|
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
Форму вопроса задают настройки владельца: где они требуют меню, спрашивается меню, и тогда к
|
|
53
|
+
каждому вопросу добавляется свободный вариант — у закрытого набора нет строки «вопрос не тот».
|
|
54
|
+
Выбор слова, имени и термина уточняется прозой в любом случае.
|
|
50
55
|
|
|
51
56
|
Ответы пишутся в `docs/tasks/_draft-<slug>/grill.md` — папка ещё черновик, номера нет.
|
|
52
57
|
|
|
@@ -67,6 +72,12 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
|
|
|
67
72
|
(`spec-critic`) → замысел и разбивка (`project-manager`). Пробелы, которые роли не смогли
|
|
68
73
|
закрыть, возвращаются владельцу — их относит главный агент.
|
|
69
74
|
|
|
75
|
+
Договорённость, вышедшая из конвейера, сверяется с `grill.md` построчно до того, как по ней
|
|
76
|
+
пойдёт работа. Роль пишет текст, не видя владельца, и способна развернуть его ответ в
|
|
77
|
+
противоположный: очередь этапов оказалась перевёрнута, а два пункта из входящих переехали в
|
|
78
|
+
«не входит». Находка критика, расходящаяся с ответом владельца, относится владельцу — она не
|
|
79
|
+
исполняется молча и не считается закрытой правкой текста.
|
|
80
|
+
|
|
70
81
|
### 4. Задача, ветка, папка
|
|
71
82
|
|
|
72
83
|
```bash
|
|
@@ -115,3 +126,8 @@ cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/pr
|
|
|
115
126
|
пережить.
|
|
116
127
|
- **Задача заводится командой, а не четырьмя вызовами подряд.** Борда к репозиторию не
|
|
117
128
|
привязана, и задача попадает на неё только явным добавлением.
|
|
129
|
+
- **Slug ветки берётся из терминологии договорённости, а не из слов просьбы.** Договорённость
|
|
130
|
+
пишется раньше ветки и как раз там отказывается от слова владельца: спек завёл своё имя
|
|
131
|
+
предмету и прямо сказал, каким словом его не называть, — а ветка и папка задачи остались с
|
|
132
|
+
отвергнутым. Заголовок задачи и отчёта поправить можно, имя ветки после открытия отчёта —
|
|
133
|
+
уже нет.
|
|
@@ -59,6 +59,10 @@ description: Правило под «Закон о фронтовом прило
|
|
|
59
59
|
сигнал, — это ручной пересчёт, и он рано или поздно отстаёт от источника.
|
|
60
60
|
- **Геттеров в компонентах нет.** Геттер пересчитывается на каждой перерисовке, и цена его не
|
|
61
61
|
видна ни в одном месте кода.
|
|
62
|
+
- **Статический атрибут без значения задаёт входу пустую строку, а не умолчание.**
|
|
63
|
+
`<ng-template someControl>` даёт `''`, и вход с осмысленным умолчанием молча его теряет;
|
|
64
|
+
сигнальный вход с алиасом здесь ничем не отличается от `@Input()`. Вход, у которого умолчание
|
|
65
|
+
что-то значит, приводит пустую строку к нему сам — `transform` или проверка в `computed`.
|
|
62
66
|
- **Подписка на каждый вызов метода не даёт выбрать, что делать с предыдущим запросом.**
|
|
63
67
|
Быстрые нажатия дают гонку ответов, и побеждает тот, что вернулся последним, а не тот, что
|
|
64
68
|
нажали последним.
|
|
@@ -15,7 +15,7 @@ description: Правило под «Закон о проверяемости».
|
|
|
15
15
|
|
|
16
16
|
| В законе | Здесь |
|
|
17
17
|
| --------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
18
|
-
| работающее приложение |
|
|
18
|
+
| работающее приложение | то, что поднято в этом дереве; перечень и порты — в `implementation.md` рядом |
|
|
19
19
|
| место, где его видит пользователь | прод-сборка за настоящим `deploy/nginx.conf`, а не дев-сервер |
|
|
20
20
|
| замер | `getComputedStyle`, `getBoundingClientRect`, контраст, совпадение центров, попадание во вьюпорт |
|
|
21
21
|
| драйвер браузера | `claude-in-chrome` на закреплённом профиле этого дерева |
|
|
@@ -28,8 +28,9 @@ description: Правило под «Закон о проверяемости».
|
|
|
28
28
|
|
|
29
29
|
## Как закон применяется здесь
|
|
30
30
|
|
|
31
|
-
-
|
|
32
|
-
|
|
31
|
+
- **Второй экземпляр уже поднятого приложения не поднимается.** До первого запроса выясняется,
|
|
32
|
+
кто отвечает на порту: поднятый заново экземпляр отвечает своей сборкой, а не той, которую
|
|
33
|
+
проверяют. Кто поднимает стенд — владелец или агент, — сказано в именах дерева.
|
|
33
34
|
- **Браузер водится одним драйвером на закреплённом профиле.** Остальные двери — второй
|
|
34
35
|
драйвер, `open`, `osascript`, запуск бинарника — закреплённый профиль не спрашивают вовсе.
|
|
35
36
|
- **Выбор браузера протухает и требует повторного вызова.** Выбор, сделанный в начале
|
|
@@ -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`
|
|
@@ -84,6 +115,20 @@ description: Правило под «Закон о документации пр
|
|
|
84
115
|
- **Снятое имя вычищается одним грепом по всему дереву:** правила, их зеркала в скилах,
|
|
85
116
|
документы и комментарии. Описание того, чего в коде уже нет, читается как действующее
|
|
86
117
|
указание.
|
|
118
|
+
- **Поиск по дереву не покрывает того, что уже уехало наружу.** Заголовок задачи и её тело,
|
|
119
|
+
заголовок отчёта и его тело, заголовки коммитов лежат вне файлов, и проверки текстов их не
|
|
120
|
+
читают вовсе. Вычистив слово в дереве, обходят те же места в очереди работ и в истории:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
<клиент хостинга> api "<путь к отчёту>" --jq '.title, .body' | grep -i '<слово>'
|
|
124
|
+
<клиент хостинга> api "<путь к задаче>" --jq '.title, .body' | grep -i '<слово>'
|
|
125
|
+
git log --format='%s%n%b' <база>..HEAD | grep -i '<слово>'
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Заголовок отчёта правится вызовом хостинга, заголовок коммита — только переписыванием ветки,
|
|
129
|
+
поэтому его проверяют до пуша. Выдуманное слово было вычищено из трёх файлов и объявлено
|
|
130
|
+
снятым, а в заголовке отчёта и в заголовке коммита осталось — владелец прочитал именно его.
|
|
131
|
+
|
|
87
132
|
- **Число в тексте пересчитывается командой в том же коммите, где пишется.** Оно стареет
|
|
88
133
|
внутри одной ветки: «шестнадцать пар» стало неправдой через два коммита после того, как
|
|
89
134
|
было написано, и нашёл это владелец, а не проверка. Число, которое придётся пересчитывать
|
|
@@ -91,6 +136,13 @@ description: Правило под «Закон о документации пр
|
|
|
91
136
|
выборке руками до того, как его называют: разбор, не знающий второй формы записи, ошибается
|
|
92
137
|
молча — «51 пункт без задачи» оказался шестью, потому что номер стоял и отдельной строкой, и
|
|
93
138
|
в заголовке подраздела.
|
|
139
|
+
- **Названная в тексте проверка запускается, а не пересказывается.** «Проверка есть» и
|
|
140
|
+
«проверка проходит» — разные утверждения, и второго в тексте обычно нет вовсе. Из четырёх
|
|
141
|
+
проверок, названных правилом, три оказались не в том состоянии, в каком текст их описывает:
|
|
142
|
+
одна отдавала полтора десятка замечаний, вторая переписывала файлы самим запуском, третья
|
|
143
|
+
была красной и роняла общую сводку вместе с собой. Ни одна из трёх не входила в выкатку,
|
|
144
|
+
поэтому молчание было полным. Проверку, которая переписывает файлы, запускают на чистом
|
|
145
|
+
дереве: иначе её правки уедут чужим коммитом.
|
|
94
146
|
- **Сделанность читается по дереву, а не по тексту, который о ней написан.** Это верно в обе
|
|
95
147
|
стороны: строка про README обеих либ была вычеркнута как сделанная, а README остался с
|
|
96
148
|
прежним числом импортёров; задача, названная владельцу несделанной, оказалась наполовину
|
|
@@ -114,3 +114,27 @@ description: Правило под «Закон о поставке» для д
|
|
|
114
114
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
115
115
|
- `git-workflow-migration` — правка схемы хранилища и её миграций.
|
|
116
116
|
- `git-workflow-restart` — ручной перезапуск прода.
|
|
117
|
+
|
|
118
|
+
## Ловушки
|
|
119
|
+
|
|
120
|
+
- **Одна работа — одна задача, сколько бы файлов она ни задела.** Числа, за которым правка
|
|
121
|
+
становится вторым рабочим элементом, здесь нет: делится то, что придётся откатывать порознь.
|
|
122
|
+
Сплошная правка текстов дерева была заведена тремя задачами «по объёму» — пришлось стирать
|
|
123
|
+
два рабочих элемента, закрывать два PR и переносить коммиты по одному с двумя конфликтами.
|
|
124
|
+
Одна из трёх не дала коммита вовсе: правка тел уже заведённых задач веткой не бывает и задачей
|
|
125
|
+
под ветку тоже.
|
|
126
|
+
- **Рабочий элемент заводится командой, а не вызовами подряд.** Доска показывает элементы своей
|
|
127
|
+
области и итерации, и заведённый мимо них в очереди работ не виден: со стороны это выглядит
|
|
128
|
+
так же, как незаведённый. Команда заведения ставит все поля разом — род, состояние,
|
|
129
|
+
исполнителя, область и итерацию, — и печатает готовую строку заведения ветки. Замеченный по
|
|
130
|
+
ходу дефект проходит тот же путь.
|
|
131
|
+
- **Ветка заводится вторым вызовом, а не тем же.** Гард главной ветки отклоняет составную
|
|
132
|
+
«создать ветку и сразу коммитить» целиком: ветки в момент разбора ещё нет.
|
|
133
|
+
- **Сторона конфликта бывает удалением, и «сохранить обе стороны» заводит второе объявление.**
|
|
134
|
+
Главная ветка снимает объявление, потому что символ переехал, — в конфликте это выглядит как
|
|
135
|
+
сторона, которая ничего не дописала. Разбирается чтением версии главной ветки целиком, а не по
|
|
136
|
+
хунку, и сверяется проверкой повторов: обе копии сами по себе исправны, сборка и линт зелёные.
|
|
137
|
+
- **Учётная запись для пуша и автор PR выбираются отдельно.** Если пушить пришлось из-под другой
|
|
138
|
+
записи, на следующий вызов это не переносится: PR открывают токеном учётной записи машинной
|
|
139
|
+
работы, и от того, чьей записью он открыт, зависит, кого можно назначить ревьювером. Однажды
|
|
140
|
+
смена записи ради пуша утекла в публикацию — отчёт вышел от владельца.
|
|
@@ -121,3 +121,26 @@ description: Правило под «Закон о поставке» для д
|
|
|
121
121
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
122
122
|
- `git-workflow-migration` — правка схемы хранилища и её миграций.
|
|
123
123
|
- `git-workflow-restart` — ручной перезапуск прода.
|
|
124
|
+
|
|
125
|
+
## Ловушки
|
|
126
|
+
|
|
127
|
+
- **Одна работа — одна задача, сколько бы файлов она ни задела.** Числа, за которым правка
|
|
128
|
+
становится второй задачей, здесь нет: делится то, что придётся откатывать порознь. Сплошная
|
|
129
|
+
правка текстов дерева была заведена тремя задачами «по объёму» — пришлось стирать две,
|
|
130
|
+
закрывать два PR и переносить коммиты по одному с двумя конфликтами. Одна из трёх не дала
|
|
131
|
+
коммита вовсе: правка тел уже заведённых задач веткой не бывает и задачей под ветку тоже.
|
|
132
|
+
- **Задача заводится командой, а не четырьмя вызовами подряд.** Борда к репозиторию не
|
|
133
|
+
привязана, и задача попадает на неё только явным добавлением: две задачи так и простояли вне
|
|
134
|
+
очереди работ, потому что шаг переписывали руками. Команда заведения делает все четыре — issue,
|
|
135
|
+
номер в его заголовке, добавление на борду, начальную колонку, — и печатает готовую строку
|
|
136
|
+
заведения ветки. Замеченный по ходу дефект проходит тот же путь.
|
|
137
|
+
- **Ветка заводится вторым вызовом, а не тем же.** Гард главной ветки отклоняет составную
|
|
138
|
+
«создать ветку и сразу коммитить» целиком: ветки в момент разбора ещё нет.
|
|
139
|
+
- **Сторона конфликта бывает удалением, и «сохранить обе стороны» заводит второе объявление.**
|
|
140
|
+
Главная ветка снимает объявление, потому что символ переехал, — в конфликте это выглядит как
|
|
141
|
+
сторона, которая ничего не дописала. Разбирается чтением версии главной ветки целиком, а не по
|
|
142
|
+
хунку, и сверяется проверкой повторов: обе копии сами по себе исправны, сборка и линт зелёные.
|
|
143
|
+
- **Учётная запись для пуша и автор PR выбираются отдельно.** Если пушить пришлось из-под другой
|
|
144
|
+
записи, на следующий вызов это не переносится: PR открывают токеном учётной записи машинной
|
|
145
|
+
работы, и от того, чьей записью он открыт, зависит, кого можно назначить ревьювером. Однажды
|
|
146
|
+
смена записи ради пуша утекла в публикацию — отчёт вышел от владельца.
|
|
@@ -111,3 +111,26 @@ description: Правило под «Закон о поставке» для д
|
|
|
111
111
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
112
112
|
- `git-workflow-migration` — правка схемы хранилища и её миграций.
|
|
113
113
|
- `git-workflow-restart` — ручной перезапуск прода.
|
|
114
|
+
|
|
115
|
+
## Ловушки
|
|
116
|
+
|
|
117
|
+
- **Одна работа — одна задача, сколько бы файлов она ни задела.** Числа, за которым правка
|
|
118
|
+
становится второй задачей, здесь нет: делится то, что придётся откатывать порознь. Сплошная
|
|
119
|
+
правка текстов дерева была заведена тремя задачами «по объёму» — пришлось стирать две,
|
|
120
|
+
закрывать два MR и переносить коммиты по одному с двумя конфликтами. Одна из трёх не дала
|
|
121
|
+
коммита вовсе: правка тел уже заведённых задач веткой не бывает и задачей под ветку тоже.
|
|
122
|
+
- **Задача заводится командой, а не вызовами подряд.** Доска показывает те issue, чью метку
|
|
123
|
+
знает, и задача без метки списка в очереди работ не видна: со стороны это выглядит так же, как
|
|
124
|
+
незаведённая. Команда заведения ставит всё разом — issue, номер в его заголовке, метку списка,
|
|
125
|
+
исполнителя, — и печатает готовую строку заведения ветки. Замеченный по ходу дефект проходит
|
|
126
|
+
тот же путь.
|
|
127
|
+
- **Ветка заводится вторым вызовом, а не тем же.** Гард главной ветки отклоняет составную
|
|
128
|
+
«создать ветку и сразу коммитить» целиком: ветки в момент разбора ещё нет.
|
|
129
|
+
- **Сторона конфликта бывает удалением, и «сохранить обе стороны» заводит второе объявление.**
|
|
130
|
+
Главная ветка снимает объявление, потому что символ переехал, — в конфликте это выглядит как
|
|
131
|
+
сторона, которая ничего не дописала. Разбирается чтением версии главной ветки целиком, а не по
|
|
132
|
+
хунку, и сверяется проверкой повторов: обе копии сами по себе исправны, сборка и линт зелёные.
|
|
133
|
+
- **Учётная запись для пуша и автор MR выбираются отдельно.** Если пушить пришлось из-под другой
|
|
134
|
+
записи, на следующий вызов это не переносится: MR открывают токеном учётной записи машинной
|
|
135
|
+
работы, и от того, чьей записью он открыт, зависит, кого можно назначить ревьювером. Однажды
|
|
136
|
+
смена записи ради пуша утекла в публикацию — отчёт вышел от владельца.
|
|
@@ -69,12 +69,30 @@ description: Правило под «Закон о документации пр
|
|
|
69
69
|
обслуживает, но забыл описать, видна только в декораторе.
|
|
70
70
|
- **Код отказа принимается, только если он в домене бросается.** Коды выписывались по
|
|
71
71
|
замыслу, и на одном пути обещанный отказ не бросал никто.
|
|
72
|
-
- **Префикс сценариев в
|
|
72
|
+
- **Префикс сценариев в спеке один, и по всему дереву он занят им одним.** Второй префикс
|
|
73
|
+
внутри спека означает, что предмет описан дважды; занятый чужим — что по номеру не видно,
|
|
74
|
+
чей это сценарий. Договорённость о продукте — исключение: она нумеруется вместе со спеком, в
|
|
75
|
+
который вольётся, и занятым префикс от неё не становится.
|
|
76
|
+
- **Номер сценария выдаётся один раз и повторно не используется.** Новый сценарий берёт
|
|
77
|
+
следующий свободный номер, а не вставляется в середину и не занимает номер удалённого: на
|
|
78
|
+
месте удалённого номер так и остаётся пустым. Номер — единственное, чем сценарий связан с
|
|
79
|
+
тестом, и отданный второй раз он оставляет старую ссылку правильной на вид и ведущей не туда.
|
|
80
|
+
Пересчитать номера подряд особенно дёшево на вид: тесты зелёные и до, и после.
|
|
81
|
+
- **Сценарий и заголовок его теста правятся одним изменением.** Изменилось обещание — номер тот
|
|
82
|
+
же, а заголовок теста правится тем же коммитом; удалён сценарий — удаляется и тест.
|
|
83
|
+
Разъехавшись, они оставляют прогон зелёным, хотя проверяет он уже не то.
|
|
84
|
+
- **Поддомен спрашивается наравне с доменом.** Те же обязательные разделы, тот же компаньон
|
|
85
|
+
рядом, та же связь сценариев с тестами. Домен, у которого половина поддоменов описана, а
|
|
86
|
+
половина заведена пустыми каталогами, зелёным не бывает.
|
|
73
87
|
- **У закона обязателен раздел «Статьи», а кроме них он держит только открытые вопросы.**
|
|
74
88
|
Истории правок и доводов о выбранном когда-то варианте в законе нет: историю держит система
|
|
75
89
|
контроля версий, а довод с отвергнутой альтернативой — свойство работы, и место ему в
|
|
76
90
|
«Ловушках» правила. Закрытый вопрос из закона уходит, а пустой раздел ради заголовка
|
|
77
91
|
проверку всё равно проходил.
|
|
92
|
+
- **Предложенный закон правила не требует.** Договорённость, записанную раньше кода,
|
|
93
|
+
привязывать не к чему, а требование правила заставило бы завести его с якорями в
|
|
94
|
+
несуществующие места. Признак стоит строкой статуса в самом законе, а не в списке исключений
|
|
95
|
+
рядом с проверкой.
|
|
78
96
|
- **Закон, назвавший файл проекта, — отказ.** Путям и привязкам место в правиле: иначе закон
|
|
79
97
|
нельзя ни прочитать без знания дерева, ни применить на другом приложении.
|
|
80
98
|
- **Правило объявляет закон, под который написано.** Правило без закона — набор приёмов, из
|