@rt-tools/agent-kit 0.13.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/board-runs.github.mjs +45 -0
- package/assets/checks/board.github.mjs +43 -1
- package/assets/checks/check-board.github.mjs +51 -1
- 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/checks/task-new.github.mjs +15 -3
- 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/claim-guard.sh +34 -0
- package/assets/hooks/dispatch.sh +48 -15
- package/assets/hooks/hook-input.sh +39 -0
- 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 +248 -8
- package/assets/hooks/waiting-turn-guard.sh +39 -3
- 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 +55 -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 -98
- package/assets/rules/testing.md +67 -66
- package/assets/rules/turn-conduct.md +155 -85
- 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.13.0.tgz +0 -0
package/assets/rules/testing.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: testing
|
|
3
3
|
kind: rule
|
|
4
4
|
law: verifiability
|
|
5
|
-
description: Правило под «Закон о проверяемости». Брать при правке
|
|
5
|
+
description: Правило под «Закон о проверяемости». Брать при правке любой спеки и всего, что лежит в сквозных наборах дерева. Называет идентификатор сценария в заголовке, вынос решения в чистую функцию и то, что закрывается сквозной спекой. Паттерны: testing-unit, testing-e2e.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Проверяемость — как это устроено здесь
|
|
@@ -63,99 +63,100 @@ flowchart TD
|
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
## Как закон применяется здесь
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
он попадает долгом, а не покрытием.
|
|
66
|
+
- **Идентификатор сценария стоит в начале заголовка теста, через тире.** Один сценарий проверяется
|
|
67
|
+
несколькими тестами, один тест закрывает несколько сценариев.
|
|
68
|
+
- **Сценарий без теста несёт отметку с причиной.** Пустая отметка не принимается, а отметка при
|
|
69
|
+
существующем тесте — отказ: она означает, что долг закрыли, а отметку не сняли.
|
|
70
|
+
- **Тест, идущий не тем путём, что пользователь, помечается частичным покрытием.** В сводку он
|
|
71
|
+
попадает долгом, а не покрытием.
|
|
73
72
|
- **Сценарий, чьё «Тогда» называет человека и то, что он видит, закрывается сквозным тестом.**
|
|
74
|
-
Юнит на тот же расчёт остаётся долгом: между верным решением и тем, что человек его видит,
|
|
75
|
-
|
|
73
|
+
Юнит на тот же расчёт остаётся долгом: между верным решением и тем, что человек его видит, лежит
|
|
74
|
+
всё, чего юнит не касался.
|
|
76
75
|
- **Сквозной тест, погашенный переменной окружения, покрытием не считается.** Выключатель по
|
|
77
76
|
состоянию стенда — пропуск случая, выключатель по переменной — невыполненный тест.
|
|
78
77
|
- **Упоминание в тесте сценария, которого в спеках нет, роняет проверку.** Так ловится
|
|
79
78
|
переименованный или выкинутый сценарий: тесты при этом остаются зелёными.
|
|
80
|
-
- **Решение выносится в чистую функцию и проверяется вызовом.** Компонент и сервис остаются
|
|
81
|
-
|
|
79
|
+
- **Решение выносится в чистую функцию и проверяется вызовом.** Компонент и сервис остаются тонкой
|
|
80
|
+
обёрткой и отдельно не проверяются, пока своего ветвления у них нет.
|
|
82
81
|
- **Решение, зависящее от текущего момента, принимает момент параметром.** Часы машины оно не
|
|
83
|
-
читает: правило проверяется вызовом, а не подкруткой времени вокруг теста. Умолчание
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
|
|
82
|
+
читает: правило проверяется вызовом, а не подкруткой времени вокруг теста. Умолчание `= new
|
|
83
|
+
Date()` ставится на границе — там, где решение зовёт процедура или служба.
|
|
84
|
+
- **Жёсткая дата в образце — это срок годности самой спеки.** Момент образца и момент, которым
|
|
85
|
+
зовут проверяемый код, берутся либо оба жёсткими, либо оба от часов: смешение двух видов даёт
|
|
86
|
+
спеку, зелёную в день, когда её пишут, и красную через сутки или неделю — на чужой правке, у
|
|
87
|
+
того, кто её не трогал. Ни линтер, ни сборка, ни сверка спеков времени не знают.
|
|
88
|
+
- **Процедура Connect проверяется вызовом своего метода с рукописным двойником базы.** Контейнер и
|
|
89
|
+
роутер поднимать не надо: спека проверяет решение, а не раскладку полей.
|
|
87
90
|
- **Сид заводит то, без чего экран не открыть, и ничего, что гость примет за настоящее.**
|
|
88
|
-
Содержимое, у которого есть автор, — отзывы, вопросы, обсуждения — гость читает как
|
|
89
|
-
|
|
90
|
-
цитаты дожили до отдельной задачи и всё это время выглядели отзывами. Настройки владельца —
|
|
91
|
+
Содержимое, у которого есть автор, — отзывы, вопросы, обсуждения — гость читает как написанное
|
|
92
|
+
людьми, а стенд собирается из той же базы, что и проверка глазами. Настройки владельца —
|
|
91
93
|
контакты, адрес отправителя, ключи внешних служб — сид не заводит тоже: их вписывают в
|
|
92
94
|
приложении. То, что нужно редко, включается признаком в окружении, а не сеется всем.
|
|
93
|
-
- **Заведённая проверка встаёт в гейт пуша или в конвейер, а не только в сводную цель.**
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
- **Заведённая проверка встаёт в гейт пуша или в конвейер, а не только в сводную цель.** Сводная
|
|
96
|
+
цель запускается руками, и проверка, которая живёт только в ней, отвечает тому, кто её вспомнил:
|
|
97
|
+
молчание такой проверки читается как её зелёный ответ. Три проверки простояли вне гейта,
|
|
98
|
+
объявляя в собственных списках известного, что падают на новом.
|
|
97
99
|
- **Проверка, приехавшая раскладкой, приезжает и со своим местом.** Место — это имя команды,
|
|
98
100
|
которой её зовут, и строка набора, в котором она стоит. Проверка без места узнаётся только по
|
|
99
101
|
тому, что раскладка положила новый файл, и статья выше на неё не действует: вставать ей некуда.
|
|
100
102
|
Так приехала проверка длины — той же редакцией, что и статья о её обязательном месте.
|
|
101
|
-
- **Спека, необратимо меняющая данные стенда, выключена по умолчанию.** `BASE_URL` уводит
|
|
102
|
-
|
|
103
|
-
- **Спеки, которым нужен nginx перед приложением, просыпаются вместе с `BASE_URL`.** Голый
|
|
104
|
-
|
|
105
|
-
- **Правило линтера, которое запрещает принятый здесь приём, выключают в конфиге, а не
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
запрещено по делу.
|
|
103
|
+
- **Спека, необратимо меняющая данные стенда, выключена по умолчанию.** `BASE_URL` уводит прогон
|
|
104
|
+
одной переменной, и без выключателя такая спека правила бы данные чужого стенда.
|
|
105
|
+
- **Спеки, которым нужен nginx перед приложением, просыпаются вместе с `BASE_URL`.** Голый сервер
|
|
106
|
+
отдачи страниц их не проходит: перенаправления живут в конфиге прокси.
|
|
107
|
+
- **Правило линтера, которое запрещает принятый здесь приём, выключают в конфиге, а не обходят в
|
|
108
|
+
каждом тесте.** Выключатель теста — приём этого дерева, а `playwright/no-skipped-test` запретил
|
|
109
|
+
бы его сразу в шестидесяти пяти местах. Рядом со строкой отключения пишут причину, а точечный
|
|
110
|
+
`eslint-disable` остаётся для того, что запрещено по делу.
|
|
110
111
|
- **Гард отпускает действие, когда сам сломался.** Нет разборщика входа, пустой ввод, не тот
|
|
111
|
-
каталог, любая своя ошибка — гард выходит нулём и пропускает: сломанная проверка не имеет
|
|
112
|
-
|
|
112
|
+
каталог, любая своя ошибка — гард выходит нулём и пропускает: сломанная проверка не имеет права
|
|
113
|
+
заклинить работу. Объявляется это строкой `FAIL-OPEN` в шапке самого гарда, рядом с
|
|
113
114
|
перечислением случаев, и туда же дописывается новый случай, когда он находится.
|
|
114
115
|
- **Список известного у проверки именной и объясняет себя сам.** Первым полем перечня стоит имя
|
|
115
|
-
проверки и слово о том, что перечисленное отказом не считается. Дальше либо два ключа —
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
проверки и слово о том, что перечисленное отказом не считается. Дальше либо два ключа — принятое
|
|
117
|
+
остаётся навсегда, долг накоплен к заведению проверки и только сокращается, — либо столько
|
|
118
|
+
ключей, сколько у записей родов. Причина обязательна: снятая проверка без причины через месяц
|
|
119
|
+
неотличима от недосмотра.
|
|
119
120
|
- **Запись принятого отличается от долга тем, заведена ли на неё работа.** Принятое — то, что
|
|
120
121
|
дерево делить не собирается; долг — то, на что заведена задача, и он только сокращается. Один
|
|
121
122
|
список на оба означал бы, что разбирать нечего: запись без задачи через месяц читается как
|
|
122
123
|
вечная, а запись с задачей — как недосмотр.
|
|
123
124
|
- **У каждой записи стоят своя причина и номер задачи, которой она внесена.** Причина прозой на
|
|
124
125
|
весь список объясняет любую его строку и потому не объясняет ни одной, а запись без номера не
|
|
125
|
-
спросишь ни у кого: тот, кто её внёс, к этому дню не помнит ни повода, ни своего решения.
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
спросишь ни у кого: тот, кто её внёс, к этому дню не помнит ни повода, ни своего решения. Запись
|
|
127
|
+
без причины или без номера отбивает проверку — и заводится она словом владельца, а не решением
|
|
128
|
+
исполнителя, которому она в эту минуту мешает.
|
|
129
|
+
- **Запись списка, которую больше ничто не вызывает, снимается вместе с тем, что её вызывало.**
|
|
130
|
+
Такая строка молча разрешает то, чего в дереве нет, и следующий читатель принимает её за
|
|
131
|
+
действующее объяснение. Проверка на мёртвую запись бывает не у всякого списка, поэтому
|
|
132
|
+
снимается она тем же изменением, которым уходит вызвавшее её место.
|
|
128
133
|
- **У красного есть назначенное действие, и второй перезапуск в него не входит.** Красное бывает
|
|
129
134
|
двух родов, и в списке прогонов они выглядят одинаково: отказ хостинга на шаге подготовки
|
|
130
135
|
лечится перезапуском, дефект ветки — не лечится им вовсе. Назначенное действие одно: сперва
|
|
131
136
|
журнал этого задания, потом решение. Перезапуск, повторённый до чтения журнала, чинит не
|
|
132
137
|
причину, а её проявление, и в истории выглядит работой.
|
|
133
|
-
- **Строка в список известного не заводится под красную проверку.** Список набран к дню
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
- **Тест, утверждающий отсутствие, зелен и тогда, когда ищет не то.** Совпадения нет ни у
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
приходит примерно раз в четыре прогона и на светлых экранах не показывается вовсе, поэтому
|
|
152
|
-
читается случайным. Все три называются доводами браузеру при запуске и становятся частью
|
|
153
|
-
эталона.
|
|
138
|
+
- **Строка в список известного не заводится под красную проверку.** Список набран к дню заведения
|
|
139
|
+
проверки и с тех пор только сокращается: дописанная строка гасит сигнал, а не причину, и в
|
|
140
|
+
истории выглядит так же, как починка. Место, где проверка права по букве и не права по существу,
|
|
141
|
+
разбирает владелец, а до его ответа верна проверка.
|
|
142
|
+
- **Тест, утверждающий отсутствие, зелен и тогда, когда ищет не то.** Совпадения нет ни у верного
|
|
143
|
+
текста, ни у опечатки в образце, ни у переименованного ключа — отличить их по цвету прогона
|
|
144
|
+
нечем. Отрицательное утверждение поэтому идёт в паре с положительным: сначала проверяется, что
|
|
145
|
+
искомое место вообще найдено, и только потом — что в нём нет того, чего быть не должно.
|
|
146
|
+
- **Заголовок теста обещает больше, чем тело проверяет, и сверка этого не видит.** Номер сценария
|
|
147
|
+
в заголовке стоит — сценарий числится покрытым, а что именно утверждается, не спрашивает никто.
|
|
148
|
+
Тело читается вместе с заголовком: обещание в заголовке и утверждение в теле — два разных
|
|
149
|
+
текста, и расходятся они молча.
|
|
150
|
+
- **Растр браузера называется явно, иначе кадр не сходится сам с собой.** Профиль цвета, взятый у
|
|
151
|
+
дисплея машины, ускоритель, считающий растр, и дорисовка кусками — каждый из трёх двигает цвет
|
|
152
|
+
на единицу-другую по каналу, и видно это только там, где смешение стоит на границе округления:
|
|
153
|
+
на сглаженных уголках тёмной темы. Ожидание вставшего кадра тут не помогает — страница
|
|
154
|
+
нарисована, а нарисована она каждый раз чуть иначе; Все три называются доводами браузеру при
|
|
155
|
+
запуске и становятся частью эталона.
|
|
154
156
|
- **Маска закрывает содержимое, но не ширину.** Узел под маской занимает своё место в раскладке
|
|
155
|
-
по-прежнему, и плывущее значение внутри него двигает соседей мимо
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
стенда постоянным значением, и тогда маска не нужна вовсе.
|
|
157
|
+
по-прежнему, и плывущее значение внутри него двигает соседей мимо маски. Там, где размер узла
|
|
158
|
+
считается по содержимому — ячейка таблицы, надпись, растягивающая кнопку, — плывущее лечится в
|
|
159
|
+
данных стенда постоянным значением, и тогда маска не нужна вовсе.
|
|
159
160
|
|
|
160
161
|
## Чего из закона здесь нет
|
|
161
162
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: turn-conduct
|
|
3
3
|
kind: rule
|
|
4
4
|
law: work-conduct
|
|
5
|
-
description: Правило под «Закон о ведении работы» —
|
|
5
|
+
description: Правило под «Закон о ведении работы» — про один ход. Брать, когда ход заканчивают: чем он кончается, что говорится владельцу о чужом шаге, чем подтверждается утверждение о дереве, что стерегут стражи. Паттерн task-flow-handoff. Ход работы целиком — правило task-flow.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Ход захода — как это устроено здесь
|
|
@@ -12,6 +12,9 @@ description: Правило под «Закон о ведении работы»
|
|
|
12
12
|
от просьбы владельца до слияния, состояния работы и папка задачи — правило `task-flow`
|
|
13
13
|
под тем же законом.
|
|
14
14
|
|
|
15
|
+
**Холодная часть:** `pitfalls.md` рядом — случаи и числа по разборам происшествий. Грузится по
|
|
16
|
+
требованию, а не вместе с правилом.
|
|
17
|
+
|
|
15
18
|
## Как это называется здесь
|
|
16
19
|
|
|
17
20
|
| В законе | Здесь |
|
|
@@ -74,72 +77,120 @@ flowchart TD
|
|
|
74
77
|
## Как закон применяется здесь
|
|
75
78
|
|
|
76
79
|
- **Сводка о чужом шаге.** Прогон, разбор владельцем и слияние идут без исполнителя и от взгляда
|
|
77
|
-
быстрее не становятся. Ход, кончившийся такой сводкой, владелец читает как работу: она полна,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
быстрее не становятся. Ход, кончившийся такой сводкой, владелец читает как работу: она полна, в
|
|
81
|
+
ней названы номера и состояния, и пустоты за ней не видно. О чужом шаге говорят вместе с начатым
|
|
82
|
+
своим, а не вместо него.
|
|
83
|
+
- **Свой незакрытый шаг владельцу не передаётся.** Список остатков, названный аккуратно, читается
|
|
84
|
+
как рассказ о работе — тем полнее, чем он аккуратнее, — и владелец разбирает то, что мог
|
|
85
|
+
доделать сам исполнитель. Чужой шаг сводкой называют, свой — делают: незапушенная ветка,
|
|
86
|
+
неотмеченная запись груза и незакрытая колонка чужими шагами не бывают.
|
|
81
87
|
- **Меню при назначенном порядке.** Выбор, предложенный владельцу, пока эпик не кончился, — это
|
|
82
|
-
просьба назначить порядок заново. Работы в эпике не осталось — так и говорится: эпик
|
|
83
|
-
|
|
84
|
-
- **Объявление намерения.** «Беру следующую задачу» — не то же самое, что взять её: фраза живёт
|
|
85
|
-
|
|
86
|
-
|
|
88
|
+
просьба назначить порядок заново. Работы в эпике не осталось — так и говорится: эпик кончился, —
|
|
89
|
+
а не «чем займёмся».
|
|
90
|
+
- **Объявление намерения.** «Беру следующую задачу» — не то же самое, что взять её: фраза живёт до
|
|
91
|
+
конца хода, а работа не двигается. Названо может быть только сделанное: номер заведённой задачи,
|
|
92
|
+
имя заведённой ветки, переведённая колонка.
|
|
87
93
|
- **Названная командой работа запускается в том же ходе, где названа.** Строка «сейчас запущу»
|
|
88
|
-
ходом не кончается: либо запуск уже был, либо ход не кончен. Названная поимённо команда
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
+
ходом не кончается: либо запуск уже был, либо ход не кончен. Названная поимённо команда выглядит
|
|
95
|
+
начатой работой лучше всякого другого обещания — она точна, её видно, и по ней не отличить
|
|
96
|
+
сделанного от собранного. Ответ владельцу пишется после вызова, а не вместо него: реплика
|
|
97
|
+
посреди хода отвечается вместе с начатым действием.
|
|
98
|
+
- **Вариант, поданный владельцу, назван ценой для человека.** Сколько шагов, где человек окажется
|
|
99
|
+
и что ему для этого нужно — без этого варианты выглядят равными, и выбор идёт по доводам со
|
|
100
|
+
стороны кода: «меньше путей», «строку запуска не трогаем». Знание, которое делает вариант
|
|
101
|
+
негодным, пишется в сам вариант, а не остаётся у того, кто его составил.
|
|
102
|
+
- **Пересказ действующего порядка без оценки читается как одобрение.** На прямой вопрос владельца
|
|
103
|
+
«как это работает» ответ фактами верен и недостаточен: устройство, названное спокойно, звучит
|
|
104
|
+
принятым. Годность порядка для того, кто им пользуется, называется вместе с ним.
|
|
94
105
|
- **Прерывание работы владельцем называется вслух.** Пришло задание, останавливающее начатое, —
|
|
95
|
-
исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только
|
|
96
|
-
|
|
97
|
-
- **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет —
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
- **Выходы хода стережёт страж, а не память исполнителя.** Он читает объявленное состояние
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
и
|
|
106
|
+
исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только потом
|
|
107
|
+
берётся за новое. Молчание об этом владелец читает как «прежнее кончилось».
|
|
108
|
+
- **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет — владелец
|
|
109
|
+
читает отчёт как рассказ о сделанном. Называются три вещи: что стоит, чего оно ждёт и что
|
|
110
|
+
владелец может решить.
|
|
111
|
+
- **Выходы хода стережёт страж, а не память исполнителя.** Он читает объявленное состояние работы
|
|
112
|
+
и то, что за ход по ней сделано: правку файла или команду, меняющую дерево. Ход, в котором не
|
|
113
|
+
было ни того ни другого, возвращается исполнителю вместе со следующим шагом из хода работы.
|
|
114
|
+
Отданную и влитую работу страж не судит: она уже дождалась чужого шага.
|
|
115
|
+
- **Снятая папка задачи снимает требование состояния, а ход не кончает.** Ход работы уезжает
|
|
116
|
+
вместе с папкой, а папка разбирается до открытия заявки: с этой минуты и до слияния строки
|
|
117
|
+
состояния нет вовсе, и первый признак стражу взять неоткуда. Отпускать по этому признаку ход
|
|
118
|
+
нельзя — снятая папка означает середину отдачи, а не её конец: между уборкой и заявкой работу не
|
|
119
|
+
видит никто, кроме того, кто её сделал. Дальше ход судится вторым признаком, как всякий другой;
|
|
120
|
+
ход, в котором заявку открыли или прочитали, второй признак пропускает сам.
|
|
121
|
+
- **Работа без ветки и без папки задачи судится тем же стражем по второму признаку.** Состояния у
|
|
122
|
+
неё нет, и первый признак взять неоткуда, — но ход, в котором не было ни одной правки дерева, не
|
|
123
|
+
кончается и здесь.
|
|
124
|
+
- **Взятая задача — ещё не начатая работа, и ход на ней не кончается.** Ветка по номеру заведена,
|
|
125
|
+
колонка сдвинута, номер назван владельцу — а каталога задачи при ветке нет: обязательное
|
|
126
|
+
действие состояния «задача-взята» не сделано ни строкой. Второй признак такой ход отпускает
|
|
127
|
+
целиком, потому что работы в нём много — заведение ветки, перевод колонки, уборка соседних
|
|
128
|
+
веток, — и «была ли за ход работа» отвечает не на тот вопрос, что «доведена ли работа до конца
|
|
129
|
+
объявленного состояния». Отчёт при этом встаёт ровно на место следующего действия и выглядит
|
|
130
|
+
завершённым куском лучше всякой другой вехи. Судит это страж отдельным ярусом; ветка без номера
|
|
131
|
+
задачи под него не подпадает, а собранный шаблон папки его снимает — заполненность замысла
|
|
132
|
+
машине не видна.
|
|
133
|
+
- **Разведка ходом не кончается, сколько бы её ни было.** Переключение ветки, подтягивание,
|
|
134
|
+
просмотр истории и чтение заявок — не работа, а подготовка к ней; ход, собранный из них одних,
|
|
135
|
+
оставляет работу там же, где она стояла. Признак работы у стража этого прежде не различал: он
|
|
136
|
+
знает первое слово команды, и читающая подкоманда совпадала с ним наравне с коммитом. Разведка
|
|
137
|
+
при этом выглядит работой лучше всего остального — в ней команды, точные числа и проверяемые
|
|
138
|
+
ответы, — поэтому ход, набитый ею, читается полным и заходом, и владельцем. Судятся части
|
|
139
|
+
составной команды по одной: чтение, соединённое с правкой, работой остаётся.
|
|
140
|
+
- **Ответ владельцу действием не работает и последним в ходе не стоит.** Порядок внутри хода
|
|
141
|
+
один: работа, потом первый шаг следующей, и только потом текст. Обратный порядок — работа,
|
|
142
|
+
отчёт, конец — стоит за каждой остановкой, которую разбирали: отчёт есть форма завершённости, и
|
|
143
|
+
дописанная сводка читается как конец хода тем убедительнее, чем больше сделано. Сказать о
|
|
144
|
+
сделанном можно всегда; место у этих слов — после следующего действия, а не вместо него.
|
|
145
|
+
- **Последним действием хода бывает только работа.** Признак один на все виды остановки: правка
|
|
146
|
+
файла или меняющая команда — последним из того, что за ход сделано. Частные ярусы стража —
|
|
147
|
+
разведка, ожидание, отдача без начала следующей — из него только выводят понятный отказ;
|
|
148
|
+
заводить новый ярус на каждый вид бессмысленно, потому что видов столько, сколько бывает
|
|
149
|
+
поводов заговорить.
|
|
150
|
+
- **Последним действием хода ожидание чужого шага не бывает.** Прогон, разбор владельцем и
|
|
151
|
+
слияние идут без исполнителя, и работа на время ожидания остаётся ровно там, где стояла. Такой
|
|
152
|
+
ход обманчив именно полнотой: в нём была работа, и много, — а признак «была ли за ход работа»
|
|
153
|
+
отпускает его целиком. Судится поэтому последнее действие: ожидание в середине законно, запуск
|
|
154
|
+
работы в фоне работой остаётся, а ход, кончившийся циклом до готовности прогона или слежением
|
|
155
|
+
за ним, страж не выпускает.
|
|
113
156
|
- **Передача пишется и там, где имени у ветки нет.** Всё, что в неё едет, лежит в дереве и на
|
|
114
|
-
отсоединённой голове доступно целиком; имя нужно одному файлу, и он называется коротким
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
- **Этап замысла объявляется закрытым только после того, как его команда проверки прошла.**
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
157
|
+
отсоединённой голове доступно целиком; имя нужно одному файлу, и он называется коротким снимком
|
|
158
|
+
головы. Молчание хука здесь стоит дороже прочего: сжатие приходит без передачи, и следующий
|
|
159
|
+
заход начинает с пустого места.
|
|
160
|
+
- **Этап замысла объявляется закрытым только после того, как его команда проверки прошла.** Строка
|
|
161
|
+
«Чем проверяется» несёт команду обратными кавычками и то, что в её выводе означает «сошлось».
|
|
162
|
+
Страж читает прежний номер этапа из истории ветки и не выпускает ход, в котором номер вырос, а
|
|
163
|
+
команда не запускалась: через заход отмеченное по памяти неотличимо от проверенного.
|
|
164
|
+
- **Слово об остановке страж читает у владельца, а не у исполнителя.** Иначе остановку объявляет
|
|
165
|
+
тот, кому она в эту минуту удобна, и запрет держится ровно до первого неудобства.
|
|
166
|
+
- **Утверждение о состоянии дерева стережёт гард утверждения, а не память исполнителя.** Всё, что
|
|
167
|
+
ответ владельцу говорит о дереве, несёт команду и её вывод: сказанное без команды утверждением
|
|
168
|
+
не считается — ни «проверено», ни «снято», ни «готово». Гард читает текст, сказанный владельцу
|
|
169
|
+
за ход, и ищет команду того же хода; у каждого слова назван свой род команды, потому что общий
|
|
170
|
+
признак «команда была» подтверждал бы одно другим. Прошлый ход не годится: состояние дерева
|
|
171
|
+
меняется, и вчерашний вывод о нынешнем молчит.
|
|
172
|
+
- **Гард утверждения ждёт текст ответа, а не судит запись, какой застал.** Текст ложится в запись
|
|
173
|
+
хода не раньше, чем хост зовёт хук, и гард, прочитавший файл первым, видит ход, в котором
|
|
174
|
+
владельцу не сказано ничего. Не дождавшись текста, гард возвращает ход: пустая запись означает
|
|
175
|
+
не «сказать было нечего», а «прочитать нечего».
|
|
176
|
+
- **Слово-утверждение гард ловит, неверный вывод — нет.** Об образце, судимом по одному его файлу,
|
|
177
|
+
и о пути, которым человек не пойдёт, судить нечем: там нет ни слова, ни команды, с которой
|
|
178
|
+
сверять. Это известная граница гарда, и держат её статьи ниже, а не он.
|
|
135
179
|
- **Ход о чужом шаге стережёт гард ожидания, а не память исполнителя.** Он отбивает завершение
|
|
136
|
-
хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия —
|
|
137
|
-
|
|
138
|
-
признакам: в ходе открыт PR либо в ходе прочитан красный прогон.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
180
|
+
хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия — ни
|
|
181
|
+
заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
|
|
182
|
+
признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Слова «беру следующую задачу»
|
|
183
|
+
гард действием не считает — ровно потому, что их и произносят вместо неё.
|
|
184
|
+
- **Ход, отдавший работу, доводит её до снятого черновика.** Черновик читается владельцем как
|
|
185
|
+
«работа не кончена»: кнопка слияния у него заблокирована самим хостингом, а по списку заявок
|
|
186
|
+
готовое от недоделанного не отличить — серое и там и там. Следующая задача берётся сверх этого,
|
|
187
|
+
а не вместо: требование взять её исполняется буквально и оставляет отданное невидимым. Стережёт
|
|
188
|
+
это гард ожидания: ход, открывший заявку, не кончается, пока состояние отданной работы не
|
|
189
|
+
спрошено командой того же хода.
|
|
190
|
+
- **«Жду прогона» — утверждение о чужом шаге, а не состояние работы.** Прогон бывает зелёным час,
|
|
191
|
+
а бывает не встав вовсе — и второе само не чинится. Слово это требует команды того же хода,
|
|
192
|
+
которая прогон показывает, и без неё не говорится: сказанное без команды владелец читает как
|
|
193
|
+
«работа ещё идёт» и ждёт напрасно. Держит это гард утверждения, а не память исполнителя.
|
|
143
194
|
- **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
|
|
144
195
|
запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
|
|
145
196
|
следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
|
|
@@ -150,43 +201,62 @@ flowchart TD
|
|
|
150
201
|
результат. Обход стоит дороже отказа: гард отбивает один файл, а обойдённый гард снимает
|
|
151
202
|
требование со всего дерева и молчит об этом. Держится это не только памятью — гарды судят и
|
|
152
203
|
команду оболочки, которая пишет файл.
|
|
204
|
+
- **Отбитая гейтом команда повторяется целиком, а не хвостом.** Гейт отбивает вызов до исполнения,
|
|
205
|
+
поэтому не сработало ни одно её звено — включая те, что стояли до отбитого. Повторённый хвост
|
|
206
|
+
делает работу в том месте, где её не ждали:
|
|
207
|
+
- **Пишущий вызов в строку разведки не дописывается.** Строка, собранная из вопросов, читается как
|
|
208
|
+
вопрос целиком — и своим автором тоже; правка идёт отдельным вызовом, где её видно. У вызова, у
|
|
209
|
+
которого есть читающий двойник, род выбирается по действию, а не по имени команды.
|
|
153
210
|
- **Ход, в котором владельцу задан вопрос, не заканчивается, пока за этот же ход не читались
|
|
154
211
|
законы и правила.** Чтением считается любой из трёх путей: загрузка правила, чтение файла
|
|
155
212
|
законов или правил, поиск по ним. Отбивает гард разговора — на завершении хода, а не на
|
|
156
213
|
инструменте вопроса: спрашивают чаще прозой, чем меню. Найденное ложится в раздел «Что уже
|
|
157
214
|
сказано в правилах» разбора.
|
|
215
|
+
- **Ответ владельца ищется в его же репликах прежде, чем в правилах.** Закон говорит: вопрос с уже
|
|
216
|
+
записанным ответом владельцу не задаётся, — и самая доступная запись лежит не в дереве, а в
|
|
217
|
+
самом разговоре: первая реплика владельца и его ответы на прошлые круги вопросов. Гард разговора
|
|
218
|
+
этого не видит: чтением он считает загрузку правила и поиск по нему, а реплика следа не
|
|
219
|
+
оставляет. Вопрос, отвечающий сам себе словами владельца, обесценивает и заданные рядом.
|
|
220
|
+
- **Объём работы поводом урезать её границы не бывает.** Владелец, назвавший результат, объёма не
|
|
221
|
+
оспаривал: предложение выбросить часть — это просьба переназначить цель, поданная как уточнение.
|
|
222
|
+
Дорогое делают дорого либо говорят прямо, что оно дорого, и называют цену.
|
|
158
223
|
- **Действия, которые исполнитель не делает без слова владельца, перечислены в компаньоне
|
|
159
224
|
правила.** Список у каждого дерева свой — пакет знает только требование, чтобы список был
|
|
160
225
|
назван. Не названный, он выводится из общих слов, и «делай, что нужно по плану» становится
|
|
161
|
-
разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
226
|
+
разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка не
|
|
227
|
+
заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт.
|
|
228
|
+
- **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование спросить
|
|
229
|
+
владельца относится к действию, а не к ходу: работа, у которой отделима часть без последствий,
|
|
230
|
+
делится, а не откладывается целиком. Список вариантов, поданный вместо работы, читается как
|
|
231
|
+
работа — тем полнее, чем аккуратнее он составлен: он пронумерован, в нём названы цифры, и именно
|
|
232
|
+
поэтому пустота хода за ним не видна. Владельцу называется, что уже сделано и что осталось за
|
|
233
|
+
его словом, — а не выбор из вариантов вместо и того и другого.
|
|
234
|
+
- **Признак необратимости берётся из списка, а не выводится доводом.** Список составлен тем, кто
|
|
235
|
+
обратимость уже взвесил: необратимое в нём осталось, обратимое из него снято. Довод «действие
|
|
236
|
+
уходит наружу и не откатывается» приходит в контекст всегда, а список — только когда его
|
|
237
|
+
прочитали, и применённый поверх списка довод отменяет список целиком. Отменяет молча: со стороны
|
|
238
|
+
это выглядит осторожностью, а не пропуском шага. Действия, которого в списке нет, исполнитель на
|
|
239
|
+
слово владельца не гейтит, даже если оно уходит наружу. Шаг, снятый из списка разбором прошлого
|
|
240
|
+
промаха, тем более: довод, которым его туда возвращают, уже разобран и отклонён — и дважды
|
|
241
|
+
подряд готовая работа вставала перед снятым шагом.
|
|
242
|
+
- **Ход, в котором исполнитель признал промах, не заканчивается, пока записи о происшествии нет.**
|
|
243
|
+
Отбивает гард происшествия — на завершении хода: к моменту признания промах уже случился, и
|
|
244
|
+
ловить раньше нечего. Признание ловится набором образцов, а не пониманием смысла; промах,
|
|
245
|
+
признанный словами вне набора, гард пропускает, и это его известная граница, а не обещание.
|
|
176
246
|
- **Заход, начатый с передачи, входит в работу тем же правилом, что и всякий другой.** Передача
|
|
177
247
|
лежит вне дерева, её не читает ни одна проверка, и написана она вчера: всё, что в ней стоит,
|
|
178
|
-
проверяется деревом. Порядок входа — четыре шага в паттерне возвращения; стережёт его гард, а
|
|
179
|
-
|
|
180
|
-
- **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход
|
|
181
|
-
|
|
182
|
-
|
|
248
|
+
проверяется деревом. Порядок входа — четыре шага в паттерне возвращения; стережёт его гард, а не
|
|
249
|
+
память: порядок, записанный только словами, исполняется, пока о нём помнят.
|
|
250
|
+
- **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход работы
|
|
251
|
+
отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт предупреждение с
|
|
252
|
+
готовой командой, но сессию не рвёт.
|
|
183
253
|
- **Заполненное окно кончает ход только там, где сжатия нет.** Где оно объявлено, окно —
|
|
184
254
|
продолжение хода: заход сжимается и работает дальше, а порог остановки срабатывает лишь тогда,
|
|
185
255
|
когда сжатие не пришло.
|
|
186
256
|
- **Заполнение окна захода стережёт гард, а не память исполнителя.** На первом пороге он
|
|
187
|
-
напоминает выбирать точку остановки, на втором отбивает всё, кроме записи хода работы,
|
|
188
|
-
|
|
189
|
-
|
|
257
|
+
напоминает выбирать точку остановки, на втором отбивает всё, кроме записи хода работы, передачи
|
|
258
|
+
и команд поставки. Размер окна и оба порога дерево задаёт само; не задавшее размера стража не
|
|
259
|
+
получает.
|
|
190
260
|
- **Порог сжатия контекста дерево задаёт само, и стоит он НИЖЕ порога остановки.** Совпавшие
|
|
191
261
|
пороги согласием не бывают: это гонка, и выигрывает её страж — он стоит на вызове, а сжатие
|
|
192
262
|
приходит между ходами. Расстояние объявляется числом, а не выводится разницей; сведены пороги
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: turn-entry
|
|
3
3
|
kind: rule
|
|
4
4
|
law: work-conduct
|
|
5
|
-
description: Правило под «Закон о ведении работы». Брать при правке хука входа в заход,
|
|
5
|
+
description: Правило под «Закон о ведении работы». Брать при правке хука входа в заход, карты хода и проверки над ней, а также когда решается, что заход получает в контекст до первой реплики. Сам ход работы — правило task-flow.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Вход в заход — как это устроено здесь
|
|
@@ -59,6 +59,12 @@ flowchart TD
|
|
|
59
59
|
- **Карта короче правила, и предел ей назначает проверка дерева.** Этим она и полезна:
|
|
60
60
|
выросшая до правила, она съедает то самое окно, ради которого её кладут в контекст, — и
|
|
61
61
|
заметить это нечем, потому что она продолжает приходить и продолжает быть верной.
|
|
62
|
+
- **Текст, едущий в контекст, пишется списком, а не таблицей.** Форматтер добивает столбцы
|
|
63
|
+
таблицы пробелами до общей ширины, и эти пробелы уезжают в каждый заход, не значая ничего:
|
|
64
|
+
в словаре они составляли треть файла, а со строками-разделителями — сорок процентов. Перевод
|
|
65
|
+
тех же записей в список «- **термин** — что это» срезал вход на девять тысяч знаков, не тронув
|
|
66
|
+
ни одного слова. Таблица остаётся законной там, где столбцов больше двух и их сравнивают
|
|
67
|
+
глазами; проверки, читающие такой текст, знают обе формы.
|
|
62
68
|
- **Состояние, объявленное правилом и забытое в карте, — расхождение.** Заход получает карту,
|
|
63
69
|
не находит в ней своего состояния и идёт читать правило: карта работает ровно до первого
|
|
64
70
|
нового состояния.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: typescript-conventions
|
|
3
3
|
kind: rule
|
|
4
4
|
law: code-structure
|
|
5
|
-
description: Правило под «Закон об устройстве кода». Брать при правке любого .ts, кроме компонента, сервиса, директивы, пайпа, гарда и
|
|
5
|
+
description: Правило под «Закон об устройстве кода». Брать при правке любого .ts, кроме компонента, сервиса, директивы, пайпа, гарда и интерцептора: строгая типизация, модификаторы доступа, имена файлов, префиксы, запрет приведения в маппере. Паттерн ts-procedure.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Устройство кода — как это устроено здесь
|