@rt-tools/agent-kit 0.14.0 → 0.15.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 +17 -0
- package/assets/checks/check-board.github.mjs +16 -0
- package/assets/checks/check-descriptions.mjs +123 -0
- package/assets/checks/check-dupes.mjs +31 -3
- package/assets/checks/check-file-size.mjs +47 -2
- package/assets/checks/check-turn-map.mjs +20 -3
- package/assets/checks/lib-common.mjs +12 -1
- package/assets/checks/lib-domains.mjs +1 -1
- package/assets/checks/rt-kit-checks.config.mjs +17 -1
- package/assets/checks/spec-anchors.mjs +18 -3
- package/assets/checks/spec-common.mjs +5 -1
- package/assets/defaults/project.sh +21 -16
- package/assets/defaults/turn-map.md +15 -19
- package/assets/docs/GLOSSARY.md +52 -58
- package/assets/hooks/rule-article.sh +12 -0
- package/assets/hooks/skill-gate.sh +5 -4
- package/assets/hooks/task-flow-guard.sh +20 -0
- package/assets/hooks/turn-exit-guard.sh +229 -4
- package/assets/laws/delivery.md +92 -104
- package/assets/laws/frontend-application.md +4 -0
- package/assets/laws/project-documentation.md +64 -68
- package/assets/laws/verifiability.md +32 -33
- package/assets/laws/work-conduct.md +167 -157
- package/assets/patterns/doc-style-sweep.md +1 -1
- package/assets/patterns/doc-style-trace.md +1 -1
- package/assets/patterns/git-workflow-commit.azure.md +1 -1
- package/assets/patterns/git-workflow-commit.github.md +7 -1
- package/assets/patterns/git-workflow-commit.gitlab.md +1 -1
- package/assets/patterns/git-workflow-docker.md +1 -1
- package/assets/patterns/git-workflow-merge.md +14 -3
- package/assets/patterns/git-workflow-pr.azure.md +1 -1
- package/assets/patterns/git-workflow-pr.github.md +1 -1
- package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
- package/assets/patterns/git-workflow-restart.md +1 -1
- package/assets/patterns/git-workflow-secrets.md +1 -1
- package/assets/patterns/git-workflow-stack.md +93 -0
- package/assets/patterns/seo-page.md +1 -1
- package/assets/patterns/spec-driven-rule.md +55 -0
- package/assets/patterns/status-report-table.github.md +88 -0
- package/assets/patterns/task-flow-archive.md +3 -4
- package/assets/patterns/task-flow-close.md +6 -1
- package/assets/patterns/task-flow-start.md +17 -5
- package/assets/patterns/ts-procedure.md +1 -1
- package/assets/pitfalls/doc-style.md +5 -0
- package/assets/pitfalls/git-workflow.github.md +47 -0
- package/assets/pitfalls/task-flow.md +28 -0
- package/assets/pitfalls/testing.md +14 -0
- package/assets/pitfalls/turn-conduct.md +33 -0
- package/assets/rules/angular-patterns.md +1 -1
- package/assets/rules/api-layer.md +3 -3
- package/assets/rules/browser-verification.md +15 -1
- package/assets/rules/dependencies.md +1 -1
- package/assets/rules/deploy-flow.azure.md +1 -1
- package/assets/rules/deploy-flow.github.md +1 -1
- package/assets/rules/deploy-flow.gitlab.md +1 -1
- package/assets/rules/doc-style.md +7 -0
- package/assets/rules/entity-conventions.needs-admin.md +1 -1
- package/assets/rules/entity-models.md +1 -1
- package/assets/rules/git-workflow.azure.md +1 -1
- package/assets/rules/git-workflow.github.md +154 -181
- package/assets/rules/git-workflow.gitlab.md +1 -1
- package/assets/rules/lib-layers.md +1 -1
- package/assets/rules/observability.needs-app.md +1 -1
- package/assets/rules/platform-access.md +1 -1
- package/assets/rules/reuse-first.md +1 -1
- package/assets/rules/seo.md +4 -3
- package/assets/rules/shared-code.md +1 -1
- package/assets/rules/spec-driven.md +68 -1
- package/assets/rules/status-report.md +97 -0
- package/assets/rules/styling-bem.md +12 -0
- package/assets/rules/task-flow.md +102 -100
- package/assets/rules/testing.md +67 -66
- package/assets/rules/turn-conduct.md +146 -105
- package/assets/rules/turn-entry.md +7 -1
- package/assets/rules/typescript-conventions.md +1 -1
- package/assets/skills/agent-kit-extend.md +1 -1
- package/assets/skills/agent-kit.md +18 -1
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +25 -0
- package/bin/agent-kit.js.map +1 -1
- package/lib/cost.d.ts +44 -0
- package/lib/cost.d.ts.map +1 -0
- package/lib/cost.js +181 -0
- package/lib/cost.js.map +1 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.15.0.tgz +0 -0
- package/rt-tools-agent-kit-0.14.0.tgz +0 -0
package/assets/laws/delivery.md
CHANGED
|
@@ -5,123 +5,111 @@
|
|
|
5
5
|
приложение перестаёт отвечать, а причина этого выясняется по истории.
|
|
6
6
|
|
|
7
7
|
## Статьи
|
|
8
|
-
|
|
9
8
|
- **Правка начинается с задачи, видимой в очереди работ.** Заведённой задачи мало: ту, что в
|
|
10
9
|
очередь не попала, никто не видит, и работа за ней не планировалась.
|
|
11
|
-
- **Правка попадает в главную ветку только через отдельную ветку.** Прямая запись в главную
|
|
12
|
-
|
|
10
|
+
- **Правка попадает в главную ветку только через отдельную ветку.** Прямая запись в главную лишает
|
|
11
|
+
правку и обсуждения, и возможности откатить её одним движением.
|
|
13
12
|
- **В очереди работ стоят задачи, а не PR о них.** У задачи и её PR один номер и одна судьба,
|
|
14
|
-
поэтому вторая карточка о той же работе ничего не добавляет — она удваивает очередь и врёт о
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
очереди после слияния и остаётся в ней навсегда, потому что колонки под неё нет.
|
|
13
|
+
поэтому вторая карточка о той же работе ничего не добавляет — она удваивает очередь и врёт о её
|
|
14
|
+
длине. Очередь читают затем, чтобы видеть сделанное и оставшееся; PR отвечает на другой вопрос и
|
|
15
|
+
открывается из карточки задачи, где связь с ним и так стоит. Карточка PR живёт своей жизнью:
|
|
16
|
+
висит в очереди после слияния навсегда, потому что колонки под неё нет.
|
|
19
17
|
- **Проверка не гоняет того, что правка не может сломать.** Набор, одинаковый для любой правки,
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
очередь читают между этими моментами, а не после них.
|
|
66
|
-
- **Попадание правки в главную ветку означает выкатку.** Всё, от чего правка зависит снаружи
|
|
67
|
-
кода — переменные окружения, секреты, записи имён, — ставится до этого момента, а не после.
|
|
68
|
-
- **Признак режима исполнения объявлен в самом артефакте развёртывания, а не только в составе
|
|
69
|
-
его запуска.** Артефакт поднимают и мимо состава — руками, при разборе, на чужой машине, — и
|
|
70
|
-
без объявления он в этот момент считает себя отладочным, не сказав об этом ничего.
|
|
18
|
+
выглядит строгим, а работает наоборот: прогон, который длится вдесятеро дольше нужного, учат не
|
|
19
|
+
ждать, а обходить. Состав набора выводится из состава правки — из того, что она задела, а не из
|
|
20
|
+
того, кем она названа; правка, не тронувшая ни строки кода, не собирает образов и не снимает
|
|
21
|
+
кадров. Пропущенное при этом называется пропущенным: молча выпавший шаг читается как пройденный.
|
|
22
|
+
- **У задачи одна ветка, у ветки одна задача.** Откат снимает всё, что въехало этой веткой, разом:
|
|
23
|
+
две задачи в ней откатятся только вместе, а задача, въехавшая двумя ветками, после отката одной
|
|
24
|
+
останется наполовину сделанной — и в очереди работ этого не видно. Работа, которая в одну ветку
|
|
25
|
+
не влезает, делится на задачи до заведения ветки. Признак деления — раздельный откат, а не
|
|
26
|
+
объём: числа файлов, строк или коммитов, за которым работа становится двумя задачами, нет.
|
|
27
|
+
Правка одного рода остаётся одной задачей, сколько бы файлов она ни задела; объём захода
|
|
28
|
+
говорит, какого размера задачу заводить среди тех, что делятся законно, и делить неделимое не
|
|
29
|
+
даёт.
|
|
30
|
+
- **Правка самой поставки проверяется её прогоном, а не рассуждением.** Проверить её иначе нечем:
|
|
31
|
+
она исполняется только там, где выкатывает, и в среде, которой на месте работы нет — с чужими
|
|
32
|
+
правами, чужим хранилищем ключей и чужой сетью. «Проверю после слияния» решением исполнителя не
|
|
33
|
+
бывает: за этими словами стоит выкатка, которой уже не будет, если правка окажется неверной.
|
|
34
|
+
Отложить проверку может только владелец, и он говорит это словами.
|
|
35
|
+
- **Две задачи, которые чинятся одной правкой, — одна задача.** Вторая стирается вместе со своим
|
|
36
|
+
номером, а то, чего в первой не было, дописывается в неё до этого. Две строки об одной работе
|
|
37
|
+
хуже дыры в нумерации: по ним потом не понять, что сделано, а что нет. Слить их можно, пока
|
|
38
|
+
правка не въехала в главную ветку; после — обе остаются как есть.
|
|
39
|
+
- **Задача, ветка под неё и PR о сделанном несут один и тот же номер в своих названиях.** Иначе
|
|
40
|
+
одну работу приходится узнавать по тексту названия, а в списке из полусотни строк это делается
|
|
41
|
+
по памяти и с ошибками.
|
|
42
|
+
- **Номер пишется всюду одинаково: ключ задач, дефис, номер.** Заголовок задачи и PR начинается с
|
|
43
|
+
этой пары в квадратных скобках, имя ветки — с неё же. Одна форма, а не три похожих, потому что
|
|
44
|
+
номер читают не только глазами: из имени ветки его достаёт гард, из заголовка — сверка очереди.
|
|
45
|
+
Формы, выведенные порознь, расходятся молча и не отказывают, а перестают узнавать номер:
|
|
46
|
+
проверка, которая должна была найти работу без задачи, пропускает всё подряд.
|
|
47
|
+
- **Ключ задач дерево называет само, но назвать обязано.** В форме имени это единственное, что у
|
|
48
|
+
каждого дерева своё, — и единственное, что настраивается. Не названный ключ не даёт ни поблажки,
|
|
49
|
+
ни умолчания: работа с очередью отказывает и говорит, где он задаётся. Пустой ключ хуже
|
|
50
|
+
отсутствующей проверки — от имени остаётся огрызок, которому ничто не отвечает, и правильно
|
|
51
|
+
названной не выглядит ни одна задача.
|
|
52
|
+
- **У задачи есть исполнитель с момента её заведения.** Задача без исполнителя выглядит ничьей: по
|
|
53
|
+
очереди работ не видно, кто её взял, и заведённая по ходу правка теряется среди чужих.
|
|
54
|
+
- **Состояние задачи в очереди работ отвечает тому, что с ней происходит.** Взятая в работу видна
|
|
55
|
+
взятой, ждущая разбора — ждущей. Иначе нетронутое, делаемое и сделанное выглядят одинаково:
|
|
56
|
+
работа берётся второй раз, а PR стоит неразобранным. Состояние переставляется в тот момент,
|
|
57
|
+
когда работа переходит на следующий шаг: очередь читают между этими моментами, а не после них.
|
|
58
|
+
- **Попадание правки в главную ветку означает выкатку.** Всё, от чего правка зависит снаружи кода
|
|
59
|
+
— переменные окружения, секреты, записи имён, — ставится до этого момента, а не после.
|
|
60
|
+
- **Признак режима исполнения объявлен в самом артефакте развёртывания, а не только в составе его
|
|
61
|
+
запуска.** Артефакт поднимают и мимо состава — руками, при разборе, на чужой машине, — и без
|
|
62
|
+
объявления он в этот момент считает себя отладочным, не сказав об этом ничего.
|
|
71
63
|
- **Выкатывается образ того коммита, который выкатывают.** Умолчание «последний» отстаёт от
|
|
72
64
|
главной ветки, и приложение молча возвращается к прежней версии, продолжая отвечать.
|
|
73
65
|
- **Из одного и того же коммита всегда ставятся одни и те же зависимости.** Если версия задана
|
|
74
|
-
диапазоном, установка сегодня и установка через неделю дадут разный код: сборка сломается
|
|
75
|
-
|
|
76
|
-
|
|
66
|
+
диапазоном, установка сегодня и установка через неделю дадут разный код: сборка сломается сама
|
|
67
|
+
собой, и откатывать будет нечего. Обновление зависимости — обычная правка: у неё есть автор,
|
|
68
|
+
описание и откат.
|
|
77
69
|
- **Порядок изменений хранилища проверяется с пустого места.** На уже работающем хранилище
|
|
78
70
|
неверный порядок незаметен: он проявляется только при развёртывании с нуля.
|
|
79
|
-
- **Проверка перед отправкой смотрит на содержимое репозитория, а не на состояние машины, где
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
- **Документ едет вместе с правкой, которую он описывает.** Ни сборка, ни проверки текстов
|
|
85
|
-
|
|
71
|
+
- **Проверка перед отправкой смотрит на содержимое репозитория, а не на состояние машины, где она
|
|
72
|
+
запущена.** На машине законно лежат недоделки, личные настройки и файлы вне истории. Проверка,
|
|
73
|
+
которая их читает, отбивает правку из-за того, чего в репозитории нет, и молчит о том, что в нём
|
|
74
|
+
есть. Проверка перед отправкой и конвейер выкатки судят по одному и тому же — иначе «сошлось»
|
|
75
|
+
значит в этих двух местах разное.
|
|
76
|
+
- **Документ едет вместе с правкой, которую он описывает.** Ни сборка, ни проверки текстов не
|
|
77
|
+
читают, поэтому расхождение копится молча и потом выглядит действующей справкой.
|
|
86
78
|
- **Работа, меняющая код, кончается открытым PR.** PR — единственное место, где человек видит
|
|
87
|
-
правку целиком, отвечает на неё и
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
вопрос; вопрос при этом задаётся в самом PR, а не остаётся в голове исполнителя.
|
|
79
|
+
правку целиком, отвечает на неё и вливает; коммит и запушенная ветка его не заменяют. Пока PR не
|
|
80
|
+
открыт, работа сделанной не считается: разбора по ней нет, а человек о ней не знает. Открывается
|
|
81
|
+
PR тем же ходом, которым исполнитель говорит, что работу отдаёт, — а не следующим заходом и не
|
|
82
|
+
по напоминанию.
|
|
83
|
+
- **PR, не готовый к слиянию, помечается черновиком.** Открытый PR читается как приглашение влить,
|
|
84
|
+
и человек нажимает слияние, не спрашивая, кончилась ли работа. Черновик разводит два состояния,
|
|
85
|
+
которые иначе выглядят одинаково: правка выложена на обозрение — и правка готова поехать в
|
|
86
|
+
главную ветку. Помечается им всё, что ждёт прогона, доработки или ответа на вопрос; вопрос при
|
|
87
|
+
этом задаётся в самом PR, а не остаётся в голове исполнителя.
|
|
97
88
|
- **Снятие черновика — отдельный ход, и им исполнитель отвечает за готовность.** Черновик
|
|
98
|
-
снимается тогда, когда проверки пройдены, доработок не осталось и работа сходится с тем,
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
- **PR о сделанном остаётся верным до самого слияния.** Он описывает дерево на день, когда
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
- **PR в главную ветку вливает человек.** Слияние — последний момент, когда разбор ещё
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
89
|
+
снимается тогда, когда проверки пройдены, доработок не осталось и работа сходится с тем, ради
|
|
90
|
+
чего заводилась задача. Пока он стоит, молчание исполнителя значит «ещё не готово», и человек
|
|
91
|
+
ничего не должен переспрашивать; после снятия оно значит «можно вливать», и цена ошибки здесь —
|
|
92
|
+
правка в главной ветке.
|
|
93
|
+
- **PR о сделанном остаётся верным до самого слияния.** Он описывает дерево на день, когда его
|
|
94
|
+
написали, а разбора ждёт днями: за это время главная ветка вливается в ветку, и утверждение PR о
|
|
95
|
+
соседних файлах становится неправдой молча — тел PR не читает ни одна проверка. Всё, что
|
|
96
|
+
вливается в ветку после публикации PR, — повод перечитать его.
|
|
97
|
+
- **PR в главную ветку вливает человек.** Слияние — последний момент, когда разбор ещё возможен:
|
|
98
|
+
после него правка стоит в главной ветке, работа ушла к следующей задаче, и вернуться к ней уже
|
|
99
|
+
некому. Исполнитель работы вливает свой PR только по прямому слову человека и только про
|
|
100
|
+
названный PR; молчание разрешением не бывает, а слово, сказанное об одном PR, на следующий не
|
|
101
|
+
переносится. Иначе разбор проходит тот, кого разбирают, и очередь PR выглядит разобранной, не
|
|
102
|
+
будучи ею.
|
|
112
103
|
- **Требование, стоящее перед необратимым шагом, стоит там, где этот шаг совершают.** Гард на
|
|
113
|
-
машине исполнителя судит его команды и молчит о том же действии, совершённом кнопкой у
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
человек: папка закрытой задачи так и уехала в главную ветку вместе со своей договорённостью, и
|
|
118
|
-
вынимать её пришлось отдельной задачей.
|
|
104
|
+
машине исполнителя судит его команды и молчит о том же действии, совершённом кнопкой у хостинга:
|
|
105
|
+
обход выходит не намеренным, а незамеченным — нажавший не знает, что чего-то не хватало.
|
|
106
|
+
Требование либо переносится туда, где нажимают, либо объявляется тому, кто нажимает, до нажатия.
|
|
107
|
+
Иначе оно держится не собой, а тем, что необратимый шаг каждый раз делает тот же человек.
|
|
119
108
|
- **Слияние в главную ветку ещё не означает, что правка доехала.** Отказ выкатки не трогает ни
|
|
120
109
|
задачу, ни очередь работ, поэтому расхождение главной ветки с тем, что работает, обязано быть
|
|
121
110
|
видно там, где очередь читают. Иначе следующие работы вливаются поверх поломки, которую не
|
|
122
111
|
приносили, и каждая выглядит доехавшей.
|
|
123
|
-
- **Состоявшаяся поломка разбирается записью, которая переживает задачу.** Починка уезжает
|
|
124
|
-
|
|
125
|
-
исполнителя. Запись называет, что сломалось, чем это стало видно и почему починка чинит
|
|
126
|
-
|
|
127
|
-
задачей.
|
|
112
|
+
- **Состоявшаяся поломка разбирается записью, которая переживает задачу.** Починка уезжает веткой,
|
|
113
|
+
задача закрывается — и причина, по которой приложение встало, остаётся знанием одного
|
|
114
|
+
исполнителя. Запись называет, что сломалось, чем это стало видно и почему починка чинит причину,
|
|
115
|
+
а не признак; живёт она среди описаний состоявшегося, а не там, что умирает вместе с задачей.
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
## Статьи
|
|
7
7
|
|
|
8
|
+
- **У действия человека есть путь в интерфейсе.** Команда на сервере — путь того, кто держит
|
|
9
|
+
сервер: у неё свой доступ, своя оболочка и свой узел. Приложение, у которого обычное действие
|
|
10
|
+
делается заходом на сервер, интерфейса этому действию не дало, и наличие такой команды его
|
|
11
|
+
наличия не заменяет.
|
|
8
12
|
- **Состояние экрана пересчитывается само, а не по команде.** Пересчёт вручную рано или
|
|
9
13
|
поздно пропускают, и экран показывает прежнее значение рядом с новым.
|
|
10
14
|
- **Шаблон показывает готовое, а не вычисляет.** Вычисление в шаблоне повторяется на каждой
|
|
@@ -6,92 +6,88 @@
|
|
|
6
6
|
старше.
|
|
7
7
|
|
|
8
8
|
## Статьи
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
действующее указание, и следующий читатель заводит снятое заново.
|
|
9
|
+
- **У документа заранее задан набор разделов, и отсутствие раздела — отказ.** Требования, для
|
|
10
|
+
которых не заведено места, вспоминаются уже после выкатки.
|
|
11
|
+
- **Каждое утверждение документа привязано к месту, где оно исполняется.** Утверждение без такого
|
|
12
|
+
места — намерение, и называть его действующим нельзя.
|
|
13
|
+
- **Предстоящая работа перечислена в одном месте — в очереди работ.** Документ второго списка не
|
|
14
|
+
заводит: два списка об одной работе расходятся молча, и по ним потом не понять, что сделано, а
|
|
15
|
+
что нет. Документу остаётся то, что задачей не бывает, — договорённость и решение, которое
|
|
16
|
+
решено не править.
|
|
17
|
+
- **Привязка не ведёт в код, который никто не зовёт.** Объявленный и никем не используемый символ
|
|
18
|
+
ничего не исполняет, а проверка на нём остаётся зелёной.
|
|
19
|
+
- **Путь, названный в документе, существует.** Ссылка на переехавший файл читается как действующее
|
|
20
|
+
указание, и следующий читатель заводит снятое заново.
|
|
22
21
|
- **Указатель каталога перечисляет всё, что в каталоге лежит.** Записи, которой в указателе нет,
|
|
23
22
|
для читателя не существует: он ищет по указателю, а не обходом каталога, и заводит разбор
|
|
24
23
|
заново. Это обратная сторона предыдущей статьи — не только путь из текста ведёт в файл, но и
|
|
25
24
|
файл назван в тексте, по которому его ищут.
|
|
26
25
|
- **Документ, разошедшийся с приложением, правится тогда же, когда замечено расхождение.**
|
|
27
26
|
Отложенная правка не случается: расхождение перестаёт быть заметным на следующий день.
|
|
28
|
-
- **Расхождение чинится в той стороне, которая неправа, и это не всегда документ.**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- **Документ не утверждает о будущем, и следит за этим автор.** «Не планируется», «не будет»
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
- **Расхождение чинится в той стороне, которая неправа, и это не всегда документ.** Состояние,
|
|
28
|
+
описанное как существующее, но недостижимое в приложении, — дефект приложения: строка читается
|
|
29
|
+
справкой о работающем, на неё ссылаются как на проверенное, и правка документа под код закрепила
|
|
30
|
+
бы дыру вместо того, чтобы её показать.
|
|
31
|
+
- **Документ не утверждает о будущем, и следит за этим автор.** «Не планируется», «не будет» — это
|
|
32
|
+
намерение, а не свойство приложения: сверить его не с чем, и оно проходит любую проверку. Машине
|
|
33
|
+
это не поручить: открытый вопрос пишется теми же словами, что и обещание, и проверка отбивала бы
|
|
34
|
+
оба.
|
|
36
35
|
- **Полнота текстов проверяется и со стороны работы, а не только со стороны текста.** Обход
|
|
37
36
|
написанного судит каждое утверждение, но утверждения, которого нет, в этом обходе нет тоже:
|
|
38
37
|
приём, применённый и нигде не описанный, так не находится никогда. Поэтому закрытая работа
|
|
39
38
|
спрашивается отдельно — оставила она след в текстах или явно его не требует.
|
|
40
|
-
- **Документ утверждает о состоявшемся, а не о том, что должно сработать.** Лечение,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
предложением.
|
|
39
|
+
- **Документ утверждает о состоявшемся, а не о том, что должно сработать.** Лечение, записанное
|
|
40
|
+
готовым до того, как его прогнали, дороже отсутствия записи: следующий читатель берёт его за
|
|
41
|
+
проверенное — и берёт в тот день, когда лечение понадобилось, а времени на разбор нет.
|
|
42
|
+
Непрогнанное либо не пишется вовсе, либо названо непроверенным тем же предложением.
|
|
45
43
|
- **Число в тексте пересчитывается тем же изменением, которым пишется, и за этим тоже следит
|
|
46
|
-
автор.** Устаревшее число выглядит так же, как свежее, а машине их не различить: дата,
|
|
47
|
-
|
|
48
|
-
ошибается молча.
|
|
44
|
+
автор.** Устаревшее число выглядит так же, как свежее, а машине их не различить: дата, версия и
|
|
45
|
+
номер — такие же числа, и проверка, которая знает один способ записи, на другом ошибается молча.
|
|
49
46
|
- **Отказ от слова распространяется на всё, что уже прочитано снаружи, а не только на файлы.**
|
|
50
|
-
Название работы, её описание и запись о правке живут вне дерева: поиск по файлам их не
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
- **Текст, который переносится в чужое дерево, не описывает состояние этого дерева как факт.**
|
|
55
|
-
|
|
56
|
-
|
|
47
|
+
Название работы, её описание и запись о правке живут вне дерева: поиск по файлам их не видит,
|
|
48
|
+
проверки текстов на них не смотрят, и отказ выглядит сделанным ровно до того, как читатель
|
|
49
|
+
наткнётся на снятое слово в заголовке. Читатель при этом заключает, что от слова не отказывались
|
|
50
|
+
вовсе.
|
|
51
|
+
- **Текст, который переносится в чужое дерево, не описывает состояние этого дерева как факт.** О
|
|
52
|
+
соседней части он говорит условно и называет её по имени: что в дереве стоит, а чего нет, знает
|
|
53
|
+
само дерево, а не текст, приехавший в него. Утверждение, сказанное безусловно, врёт тем
|
|
57
54
|
увереннее, что печатает его сам инструмент, — и поправить его дерево не может, если правки на
|
|
58
55
|
месте у такого текста не предусмотрено.
|
|
59
56
|
- **Принятое решение становится пунктом слоя правил, а не записью о прошлом.** Записанное
|
|
60
|
-
описанием прошлого перестаёт действовать в тот же день: описания прошлого не приходят в
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
- **У решения есть слой, и он выбирается по тому, о чём решение говорит.** Что должно быть
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
57
|
+
описанием прошлого перестаёт действовать в тот же день: описания прошлого не приходят в контекст
|
|
58
|
+
работы, читаются как история и ничего не требуют. Следующая работа принимает то же решение
|
|
59
|
+
заново — и принимает иначе, потому что доводов первого уже не видит.
|
|
60
|
+
- **У решения есть слой, и он выбирается по тому, о чём решение говорит.** Что должно быть верно в
|
|
61
|
+
продукте — статья закона. Каким приёмом это делается здесь — пункт правила. Готовый код и
|
|
62
|
+
порядок действий — паттерн. Решение, положенное не в свой слой, находится только тем, кто уже
|
|
63
|
+
знает, что оно есть.
|
|
67
64
|
- **Описание прошлого объясняет состоявшийся переезд, а не держит действующее требование.**
|
|
68
|
-
Разница видна вопросом: перестанет ли текст быть верным, если завтра всё переделать. Рассказ
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
Разница видна вопросом: перестанет ли текст быть верным, если завтра всё переделать. Рассказ о
|
|
66
|
+
том, как и почему однажды перенесли, — прошлое; требование «делай так» — нет, и место ему в слое
|
|
67
|
+
правил.
|
|
71
68
|
- **Признак, по которому решение относят к прошлому, записан заранее и один на все работы.**
|
|
72
69
|
Выводимый каждой работой заново, он назначается тем, кому мешает: под конец работы дешевле
|
|
73
70
|
назвать прошлым всё, что осталось разобрать.
|
|
74
|
-
- **Раздел решений в описании домена — временное место, а не постоянное.** Пока решение там,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
- **Работа, которая переносит решения, называет для каждого, куда оно ушло.** Иначе по
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
- **Текст, раздаваемый наружу, судится не слабее своей копии у потребителя.** Требование,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- **Редакция текста, которую это дерево не выбрало, судится наравне с выбранной.**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
- **Набор обязательных разделов объявлен отдельно, и образец ему не хозяин.** Образец —
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
- **Требование, которого никто не формулировал, молчит, а не отказывает.** Отказ на предмете
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- **Два текста об одном либо говорят одно, либо один из них неправ.** Согласие текстов между
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
здесь нечего.
|
|
71
|
+
- **Раздел решений в описании домена — временное место, а не постоянное.** Пока решение там, оно
|
|
72
|
+
действует только для того, кто открыл этот файл. Разросшийся раздел — признак того, что правило
|
|
73
|
+
под него не заведено, а не того, что домен сложный.
|
|
74
|
+
- **Работа, которая переносит решения, называет для каждого, куда оно ушло.** Иначе по описанию
|
|
75
|
+
прошлого не отличить решение, ставшее правилом, от решения, потерянного при переносе: оба
|
|
76
|
+
выглядят одинаково — записью, на которую никто не ссылается.
|
|
77
|
+
- **Текст, раздаваемый наружу, судится не слабее своей копии у потребителя.** Требование, стоящее
|
|
78
|
+
к копии и не стоящее к источнику, находит промах у того, кто его не делал и починить не может:
|
|
79
|
+
до потребителя промах доезжает целым, а краснеет уже там.
|
|
80
|
+
- **Редакция текста, которую это дерево не выбрало, судится наравне с выбранной.** Непрочитанная
|
|
81
|
+
редакция расходится с прочитанной молча, и узнаёт об этом первый, кто её выберет, — то есть тот,
|
|
82
|
+
у кого нет ни истории расхождения, ни повода его искать.
|
|
83
|
+
- **Набор обязательных разделов объявлен отдельно, и образец ему не хозяин.** Образец — черновик
|
|
84
|
+
для того, кто заводит текст, и стареет он первым. Набор, выведенный из образца, либо объявляет
|
|
85
|
+
расхождением весь корпус разом, либо не замечает ничего.
|
|
86
|
+
- **Требование, которого никто не формулировал, молчит, а не отказывает.** Отказ на предмете без
|
|
87
|
+
объявленного требования гасят списком исключений, а список исключений через месяц становится
|
|
88
|
+
рабочим путём — и гасит вместе с шумом то, ради чего проверка заводилась.
|
|
89
|
+
- **Два текста об одном либо говорят одно, либо один из них неправ.** Согласие текстов между собой
|
|
90
|
+
не следует ни из целостности ссылок, ни из полноты разделов: оба проходят любую такую проверку,
|
|
91
|
+
а исполнитель берёт тот, который прочитал раньше. Ищется это чтением — считать здесь нечего.
|
|
96
92
|
- **Изображение правится тем же изменением, что и текст, который оно изображает.** Разойдясь,
|
|
97
93
|
схема и проза остаются читаемыми обе, и первым это замечает тот, кто пошёл по схеме.
|
|
@@ -5,53 +5,52 @@
|
|
|
5
5
|
который «должен работать», и код, который проверили, в истории выглядят одинаково.
|
|
6
6
|
|
|
7
7
|
## Статьи
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
выглядит так же, как покрытый сценарий, и долг перестаёт быть заметным.
|
|
8
|
+
- **Обещанное поведение названо сценарием, а сценарий назван в тесте, который его проверяет.**
|
|
9
|
+
Иначе связь между обещанием и проверкой держится только на памяти автора.
|
|
10
|
+
- **Сценарий без теста помечен как непокрытый и виден в сводке.** Молчаливый пропуск выглядит так
|
|
11
|
+
же, как покрытый сценарий, и долг перестаёт быть заметным.
|
|
13
12
|
- **Тест, проверяющий часть обещанного, считается долгом, а не покрытием.** Иначе сводка
|
|
14
13
|
показывает выполненным то, что выполнено наполовину.
|
|
15
|
-
- **Обещание, данное пользователю, закрывается тестом, который идёт его путём.** Тот же
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
- **Обещание, данное пользователю, закрывается тестом, который идёт его путём.** Тот же расчёт,
|
|
15
|
+
проверенный мимо экрана, верен — и обещания не закрывает: между верным решением и тем, что
|
|
16
|
+
человек его видит, лежит всё, чего проверка не касалась.
|
|
18
17
|
- **Тест, выключенный признаком окружения, покрытием не считается.** В обычном прогоне он не
|
|
19
18
|
исполняется ни разу, а в сводке выглядит так же, как исполненный.
|
|
20
19
|
- **Упоминание в тесте сценария, которого нет, — отказ.** Так ловится переименованный или
|
|
21
20
|
выкинутый сценарий: без этого он пропадает молча.
|
|
22
|
-
- **Работающее приложение проверяется там, где его видит пользователь.** Отладочный режим
|
|
23
|
-
|
|
21
|
+
- **Работающее приложение проверяется там, где его видит пользователь.** Отладочный режим ведёт
|
|
22
|
+
себя иначе рабочего, и проверка в нём подтверждает не то, что будет у пользователя.
|
|
24
23
|
- **Перед отправкой правка проверяется тем же набором, что и конвейер, и теми же командами.**
|
|
25
24
|
Набор, собранный по изменённым файлам, пропускает то, до чего правка дошла связями: проверка
|
|
26
25
|
зелёная, а конвейер красный. Что проверять, считает инструмент от той же базы, а не память
|
|
27
26
|
автора.
|
|
28
|
-
- **Проверка признака окружения относится только к тому пути запуска, на котором она
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
- **Проверка признака окружения относится только к тому пути запуска, на котором она сделана.**
|
|
28
|
+
Пути, которыми одно и то же приложение поднимается, задают признаки по-разному, и подтверждённое
|
|
29
|
+
на одном из них на остальных неверно — а выглядит проверенным целиком.
|
|
31
30
|
- **Разметка проверяется замером, а не взглядом.** На глаз не отличить отступ от поля и
|
|
32
31
|
выравнивание от совпадения, и расхождение находится уже после выкатки.
|
|
33
|
-
- **Успешный ответ команды означает, что она отработала, а не что нужное состояние
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
- **Служба считается поднятой, когда она выполнила задание, а не когда сообщила о
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
- **Причина отказа, на которой строится решение, подтверждается измерением, а не
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
32
|
+
- **Успешный ответ команды означает, что она отработала, а не что нужное состояние наступило.**
|
|
33
|
+
Часть запросов выполняется наполовину, и об отклонённой части в ответе ничего нет: по коду
|
|
34
|
+
возврата такой вызов не отличить от исполненного. Поэтому результат читают отдельным запросом, и
|
|
35
|
+
в PR идёт то, что прочитали, а не то, что заказывали.
|
|
36
|
+
- **Служба считается поднятой, когда она выполнила задание, а не когда сообщила о готовности.**
|
|
37
|
+
Сообщение о готовности говорит лишь, что служба себя объявила: та, которой не досталось ни
|
|
38
|
+
одного задания, выглядит в нём точно так же, как работающая. Проверяются обе стороны связи — что
|
|
39
|
+
заказчик выбирает именно её и что задание через неё прошло.
|
|
40
|
+
- **Причина отказа, на которой строится решение, подтверждается измерением, а не правдоподобием.**
|
|
41
|
+
Объяснение, пришедшее первым, объясняет наблюдаемое не хуже верного: свойство среды и
|
|
42
|
+
собственный промах выглядят в отказе одинаково, и разводит их только замер, поставленный так,
|
|
43
|
+
чтобы одно из двух не прошло. Решение, выведенное из неподтверждённой причины, лечит не то — и
|
|
44
|
+
стоит отката всей работы, а не одной правки.
|
|
46
45
|
- **Если инструмент проверки запрещает приём, которым здесь пользуются постоянно, его правило
|
|
47
46
|
выключают в настройке инструмента, а не обходят в каждом месте.** Обход приходится повторять
|
|
48
47
|
столько раз, сколько таких мест, и ни в одном из них не написано, зачем он: со стороны это
|
|
49
48
|
выглядит ошибкой автора, а не решением.
|
|
50
|
-
- **Красная проверка означает неверный код, а не неверную проверку.** Место, выведенное
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
- **Красная проверка означает неверный код, а не неверную проверку.** Место, выведенное из-под
|
|
50
|
+
проверки затем, чтобы она замолчала, чинит показание, а не то, на что она указала: код остаётся
|
|
51
|
+
прежним, а сигнала о нём больше нет ни у кого. Список известного накоплен к дню заведения
|
|
52
|
+
проверки и только сокращается; несогласие с самой проверкой — вопрос к владельцу, а не строка в
|
|
53
|
+
списке.
|
|
55
54
|
- **Польза правила подтверждается наблюдением за тем, как им пользуются, а не мнением о нём.**
|
|
56
55
|
Правило, которого не открыли ни разу, и правило, на котором держится половина работы, в тексте
|
|
57
56
|
выглядят одинаково — и правится первым обычно то, о чём вспомнили, а не то, что мешает.
|
|
@@ -59,8 +58,8 @@
|
|
|
59
58
|
умирает вместе с сессией, отвечает только на вопрос «что было минуту назад».
|
|
60
59
|
- **Наблюдение за работой не выносит наружу ничего, кроме того, что общее у всех.** Имя правила,
|
|
61
60
|
род события и версия одинаковы везде, где стоит слой правил; путь, домен и имя дерева
|
|
62
|
-
принадлежат одному дереву и в чужом месте не значат ничего, кроме утечки. Держится это
|
|
63
|
-
|
|
61
|
+
принадлежат одному дереву и в чужом месте не значат ничего, кроме утечки. Держится это проверкой
|
|
62
|
+
на выносящей стороне, а не памятью того, кто пишет.
|
|
64
63
|
- **Проверка, которая сама сломалась, работу не останавливает.** Отказ инструмента не является
|
|
65
64
|
найденным нарушением, и остановленная им работа стоит до того, как его починят.
|
|
66
65
|
- **Решение, зависящее от текущего момента, получает момент снаружи.** Иначе проверить его можно
|