@rt-tools/agent-kit 0.23.0 → 0.24.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 +8 -2
- package/assets/checks/board.github.mjs +1 -1
- package/assets/checks/check-board.github.mjs +14 -0
- package/assets/checks/check-doc-paths.mjs +24 -5
- package/assets/checks/check-file-size.mjs +8 -2
- package/assets/checks/check-prose-style.mjs +10 -1
- package/assets/defaults/gate-map.sh +13 -0
- package/assets/defaults/project.sh +10 -0
- package/assets/defaults/shell.sh +18 -3
- package/assets/hooks/browser-guard-device-id.sh +42 -12
- package/assets/hooks/dispatch.sh +40 -9
- package/assets/hooks/docs-guard.sh +10 -0
- package/assets/hooks/exam-guard.sh +66 -16
- package/assets/hooks/git-guard-delivery-draft.sh +78 -0
- package/assets/hooks/git-guard-delivery.sh +49 -111
- package/assets/hooks/git-guard-main.sh +39 -4
- package/assets/hooks/git-guard-push-tests.sh +49 -3
- package/assets/hooks/hook-input.sh +17 -6
- package/assets/hooks/rule-source-guard.sh +11 -0
- package/assets/hooks/stand-login-guard.sh +101 -0
- package/assets/hooks/write-targets.sh +37 -4
- package/assets/laws/verifiability.md +12 -2
- package/assets/laws/work-conduct.md +59 -65
- package/assets/patterns/browser-verification-measure.md +41 -1
- package/assets/patterns/browser-verification-stand.md +56 -15
- package/assets/patterns/doc-style-human.md +75 -0
- package/assets/patterns/git-workflow-commit.azure.md +12 -0
- package/assets/patterns/git-workflow-commit.github.md +16 -3
- package/assets/patterns/git-workflow-commit.gitlab.md +12 -0
- package/assets/patterns/git-workflow-merge.md +8 -0
- package/assets/patterns/task-flow-start.md +1 -1
- package/assets/patterns/testing-e2e.md +18 -8
- package/assets/pitfalls/task-flow.md +40 -40
- package/assets/rules/browser-verification.md +29 -3
- package/assets/rules/doc-style.md +36 -0
- package/assets/rules/git-workflow.github.md +20 -23
- package/assets/rules/reuse-first.md +8 -2
- package/assets/rules/styling-bem.md +8 -1
- package/assets/rules/task-flow.md +73 -73
- package/assets/rules/testing.md +21 -0
- package/assets/skills/agent-kit.md +60 -70
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +63 -2
- package/lib/commands.js.map +1 -1
- package/lib/enroll.d.ts.map +1 -1
- package/lib/enroll.js +1 -1
- package/lib/enroll.js.map +1 -1
- package/lib/observations.d.ts +10 -1
- package/lib/observations.d.ts.map +1 -1
- package/lib/observations.js +1 -0
- package/lib/observations.js.map +1 -1
- package/lib/override-marks.d.ts +24 -0
- package/lib/override-marks.d.ts.map +1 -0
- package/lib/override-marks.js +98 -0
- package/lib/override-marks.js.map +1 -0
- package/lib/shipment.d.ts.map +1 -1
- package/lib/shipment.js +1 -1
- package/lib/shipment.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.24.0.tgz +0 -0
- package/rt-tools-agent-kit-0.23.0.tgz +0 -0
|
@@ -74,11 +74,15 @@ flowchart TD
|
|
|
74
74
|
профиль обошли этой дверью дважды за один заход.
|
|
75
75
|
- **Выбор браузера протухает и требует повторного вызова.** Выбор, сделанный в начале
|
|
76
76
|
сессии, не держится: после паузы следующий вызов открывает вкладку в другом профиле молча.
|
|
77
|
+
- **Отказ выбора профиля кончает работу с браузером, а не начинает поиск обхода.** Профиля среди
|
|
78
|
+
подключённых нет — значит, вести некого: состав вкладок, переход и снимок уйдут в тот браузер,
|
|
79
|
+
который расширение считает активным, и какой это, не знает никто. Состояние называется владельцу
|
|
80
|
+
словом, и работа через браузер стоит до его ответа.
|
|
77
81
|
- **Профиль не выбирается из списка и не спрашивается у владельца.** Список отдаёт неустойчивые
|
|
78
82
|
имена, которые не опознают ничего, а выбор из него ведёт на профиль без входа.
|
|
79
83
|
- **Ненастроенная стража — повод остановиться, а не разрешение ехать.** Пропуск гарда при
|
|
80
84
|
молчащем помощнике сделан затем, чтобы сломанная обвязка не заводила работу в тупик, и
|
|
81
|
-
разрешением работать мимо профиля не
|
|
85
|
+
разрешением работать мимо профиля не считается. Исполнитель, получивший от помощника пустой
|
|
82
86
|
вывод, называет это владельцу и браузер не водит: вкладка откроется в том профиле, который
|
|
83
87
|
расширение сочло активным, а какой это профиль — не знает никто.
|
|
84
88
|
- **Экран, закрытый входом, проверяется стендом с подменённым ответом входа, а не живой учётной
|
|
@@ -96,12 +100,27 @@ flowchart TD
|
|
|
96
100
|
обрезка без признака видны только там, где содержимое в своё место не влезает; на коротком
|
|
97
101
|
значении всё три выглядят исправными. Значение для замера берётся предельное — то, какое узел
|
|
98
102
|
может получить у настоящего потребителя, а не то, какое стоит в примере.
|
|
99
|
-
- **Готовое из набора, взятое под
|
|
103
|
+
- **Готовое из набора, взятое под значения другого размера, меряется, а не разглядывается.**
|
|
100
104
|
Компонент, живший там, где значения короткие, в новом месте получает значение вчетверо
|
|
101
105
|
длиннее — и ведёт себя иначе, оставаясь тем же кодом. Спека этого не видит вовсе: обрезка
|
|
102
106
|
браузером в разметке не отражается, и текст приходит из неё целым.
|
|
107
|
+
- **Прокси стенда подставляет то, по чему приложение узнаёт арендатора запроса.** Дерево, которое
|
|
108
|
+
держит несколько организаций за одним приложением, узнаёт их по заголовку, а сервер отрисовки
|
|
109
|
+
кладёт туда свой хост: приложение отвечает отказом на каждый вызов. Снаружи это страница «не
|
|
110
|
+
найдено» — выглядит как дефект кода, а не стенда. Замер тремя заголовками на одном стенде: свой
|
|
111
|
+
хост с портом — отказ, свой хост без порта — отказ, имя арендатора — страница. Отличает одно от
|
|
112
|
+
другого подстановка заголовка, а не чтение кода.
|
|
103
113
|
- **Прод-конфигурация проверяется только за настоящим прокси.** Голый сервер отдачи страниц
|
|
104
114
|
про кэш, перенаправления и заголовки не знает ничего.
|
|
115
|
+
- **Показанное человеку собрано из той работы, о которой идёт речь.** Стенд собирается с ветки
|
|
116
|
+
этой правки, а не с той, на которой стоит исполнитель: сборка с чужой ветки показывает дерево
|
|
117
|
+
без правки, и человек читает это как «не сделано». Сказанное о показанном называет ветку, с
|
|
118
|
+
которой оно собрано. Один такой показ стоил двух ходов: владелец повторил замечание, по
|
|
119
|
+
которому правка давно сделана, а исполнитель взялся объяснять уже исправленный дефект.
|
|
120
|
+
- **Ветка работы держит вершину главной влитой всё время, а не только перед отдачей.** Отставшая
|
|
121
|
+
ветка собирается в стенд, на котором нет ни чужих правок, ни своих соседних, и показанное на
|
|
122
|
+
нём описывает дерево, которого нет ни у кого. Вершина подтягивается, когда о её движении стало
|
|
123
|
+
известно, а не когда работа кончилась.
|
|
105
124
|
- **Первый заход на публичный экран метится признаком служебного посещения.** Драйвер водит
|
|
106
125
|
обычный браузер, и счётчик посещений не отличает проверку от гостя: `navigator.webdriver` у
|
|
107
126
|
него `false`, строка `User-Agent` — живого браузера. Чем метится заход, сказано в именах
|
|
@@ -121,7 +140,14 @@ flowchart TD
|
|
|
121
140
|
«что тут происходит», а не подтверждает известное число. Вывод «замер снять нечем», сделанный
|
|
122
141
|
на закрытом входе, чаще всего означает, что искали не тем.
|
|
123
142
|
|
|
124
|
-
|
|
143
|
+
- **Замер снимается до показа работы владельцу, а не после его замечания.** Показанное без
|
|
144
|
+
замера — заявка на проверку, а не проверка: на снимке слипшиеся вплотную карточки читаются как
|
|
145
|
+
одна с длинным содержимым, обрезанная тень — как её отсутствие, нулевой промежуток — как плотная
|
|
146
|
+
вёрстка. Каждый такой дефект виден одной командой замера. Числа, снятые с образца заранее,
|
|
147
|
+
сверяются с реализацией тем же ходом: работа по пересказу образца словами расходится с ним
|
|
148
|
+
незаметно.
|
|
149
|
+
|
|
150
|
+
Вывод о вёрстке подкрепляется числом: «выглядит нормально» результатом проверки не бывает.
|
|
125
151
|
Этого не стережёт ничто — как измерять, разобрано в паттерне `browser-verification-measure`.
|
|
126
152
|
|
|
127
153
|
## Чего из закона здесь нет
|
|
@@ -107,6 +107,13 @@ flowchart TD
|
|
|
107
107
|
имена веток и правила линтеров: выглядят адресом, адресом не являются.
|
|
108
108
|
<!-- rt-when: *.md -->
|
|
109
109
|
|
|
110
|
+
- **Файл, положенный раскладкой, пары не требует.** Автор у него в дереве-потребителе один —
|
|
111
|
+
пакет, и документ о нём лежит там же. Требование пары читает шапку раскладки: она стоит в
|
|
112
|
+
каждом разложенном файле и отличает его от написанного здесь надёжнее любого перечня путей.
|
|
113
|
+
Иначе первая же раскладка требует обход на весь свой объём, а обход, объявленный на сотню
|
|
114
|
+
файлов, снимает требование и с будущих правок этих файлов вручную.
|
|
115
|
+
<!-- rt-when: *.md -->
|
|
116
|
+
|
|
110
117
|
- **Документ едет в том же коммите, что и правка, которую он описывает.** Обход — строка
|
|
111
118
|
`Docs-skip: <причина>` в теле коммита; пустая причина не принимается.
|
|
112
119
|
<!-- rt-when: *.md -->
|
|
@@ -169,6 +176,34 @@ flowchart TD
|
|
|
169
176
|
схема набрана словами и от текста рядом отличима только чтением.
|
|
170
177
|
<!-- rt-when: *.md -->
|
|
171
178
|
|
|
179
|
+
## Тексты для человека
|
|
180
|
+
|
|
181
|
+
- **У текста есть адресат, и слог выбирается по нему, а не по тому, что писалось до него.**
|
|
182
|
+
Правила, законы и спеки читает тот, кто работает внутри слоя правил; задачу, заявку и ответ в
|
|
183
|
+
чате — человек снаружи. Текст, написанный сразу после правки спеки, наследует её слог: изнутри
|
|
184
|
+
он выглядит точным, а для читателя снаружи пуст. Адресат проверяется до первой строки.
|
|
185
|
+
<!-- rt-when: задача, описание заявки, ответ владельцу -->
|
|
186
|
+
|
|
187
|
+
Задачу в очереди, описание заявки и ответ в чате читает владелец. Он помнит продукт и не читал
|
|
188
|
+
ни одного правила слоя: слова слоя для него пустые. Форма ответа о состоянии работы — правило
|
|
189
|
+
`status-report`; здесь язык, каким написаны все три текста.
|
|
190
|
+
|
|
191
|
+
- **Текст для владельца пишется словами продукта, а не словами слоя правил.** Что человек видит,
|
|
192
|
+
что у него не работает, что с этим сделали. Заявка, прогон, набор, объём правки,
|
|
193
|
+
договорённость — это слова слоя; в тексте для владельца они заменяются на те, которыми зовёт
|
|
194
|
+
их он сам. Иначе он читает текст о своей же работе и не узнаёт в нём ни одного экрана.
|
|
195
|
+
<!-- rt-when: задача, описание заявки, ответ владельцу -->
|
|
196
|
+
|
|
197
|
+
- **Из задачи видно, что сломалось у человека, а не только где красная проверка.** Задача,
|
|
198
|
+
описанная именами файлов и номерами проверок, не даёт решить, срочная она или нет: цена
|
|
199
|
+
промаха видна по тому, чего человек не может сделать.
|
|
200
|
+
<!-- rt-when: задача, описание заявки, ответ владельцу -->
|
|
201
|
+
|
|
202
|
+
- **Страдательный залог и метафоры в этих текстах не пишутся.** «Работа отдана» и «красное
|
|
203
|
+
въехало» звучат весомо и не называют ни действия, ни того, кто его сделал. Владелец решает по
|
|
204
|
+
ним, что делать дальше, и решать ему не по чему.
|
|
205
|
+
<!-- rt-when: задача, описание заявки, ответ владельцу -->
|
|
206
|
+
|
|
172
207
|
## Чего из закона здесь нет
|
|
173
208
|
|
|
174
209
|
Ни одна из формулировочных договорённостей не проверяется: одна фраза на правило, простые
|
|
@@ -191,6 +226,7 @@ flowchart TD
|
|
|
191
226
|
|
|
192
227
|
- `doc-style-write` — как формулировать: примеры «так» и «не так», правила для комментариев.
|
|
193
228
|
- `doc-style-sweep` — разбор документа, накопившего список работ, на действующее и закрытое.
|
|
229
|
+
- `doc-style-human` — форма задачи, описания заявки и ответа владельцу: образцы «так» и «не так».
|
|
194
230
|
- `doc-style-trace` — обратный проход: закрытые задачи против текстов, поиск того, чего не
|
|
195
231
|
написали.
|
|
196
232
|
|
|
@@ -99,11 +99,10 @@ flowchart TD
|
|
|
99
99
|
заголовок задачи, из него достаётся номер ветки, по нему же сверка читает заголовок PR. Форма
|
|
100
100
|
ветки в профиле дерева пишется той же парой `<КЛЮЧ>-<номер>`.
|
|
101
101
|
- **Незаданный ключ отбивает работу с очередью на месте.** Модуль борды отказывает при первом же
|
|
102
|
-
вызове и называет, где ключ задаётся. Умолчания нет намеренно:
|
|
103
|
-
|
|
102
|
+
вызове и называет, где ключ задаётся. Умолчания нет намеренно: заголовок из пустого значения
|
|
103
|
+
не совпадает ни с чем, и настоящее расхождение тонет среди ложных строк.
|
|
104
104
|
- **Заведённая задача подтверждается ответом очереди работ, а не выводом команды заведения.**
|
|
105
105
|
Напечатанный номер значит «вызов прошёл»: задачу можно завести и не довести до борды.
|
|
106
|
-
Спрашивается очередь по номеру, и ответ читается колонкой и исполнителем.
|
|
107
106
|
- **Видимость заведённого проверяется той стороной, которой оно предназначено.** Заявку читает
|
|
108
107
|
человек, задачу — очередь работ, и оба читают не тем токеном, которым заводили: ограниченная
|
|
109
108
|
запись отвечает им «не найдено», а заводившей — успехом.
|
|
@@ -120,16 +119,14 @@ flowchart TD
|
|
|
120
119
|
невзятая, хотя работа сделана и выложена. На заведении ветки колонка не спрашивается — там её
|
|
121
120
|
ещё не двигали. Имя первой колонки дерево называет само; не названо — колонка не судится.
|
|
122
121
|
- **На борде стоят задачи, а не PR о них.** Карточка PR колонки не имеет, из очереди не уходит и
|
|
123
|
-
остаётся
|
|
124
|
-
карточки сверка очереди — строкой на каждую.
|
|
122
|
+
остаётся навсегда. Находит такие карточки сверка очереди — строкой на каждую.
|
|
125
123
|
- **Отставшая колонка находится сверкой очереди, а не глазами.** Она судит колонку по PR в обе
|
|
126
124
|
стороны: открытый PR при задаче не в разборе и разбор без открытого PR. Момента, когда задачу
|
|
127
125
|
берут в работу, ей не видно: ветки на борде нет.
|
|
128
126
|
- **Ветка с открытой заявкой отстаёт от главной молча.** Основание гард судит раз, в минуту
|
|
129
127
|
открытия, а влитого после не видит и прогон. Отставание считает сверка очереди работ.
|
|
130
128
|
- **Связь задачи с эпиком сверка читает в обе стороны.** Односторонняя привязка выглядит целой
|
|
131
|
-
так же, как двусторонняя: читатель приходит то от замысла эпика, то от карточки.
|
|
132
|
-
подражанием — тело с образца соседней задачи везло строку вместе с формой.
|
|
129
|
+
так же, как двусторонняя: читатель приходит то от замысла эпика, то от карточки.
|
|
133
130
|
- **Задачи, чинящиеся одной правкой, сливаются до мержа.** Вторая стирается вместе с номером, а
|
|
134
131
|
недостающее дописывается в первую: после мержа ветка въехала целиком.
|
|
135
132
|
- **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка на
|
|
@@ -138,6 +135,10 @@ flowchart TD
|
|
|
138
135
|
- **Вершина открытого PR без прогона видна сверкой очереди работ.** Страница без прогона выглядит
|
|
139
136
|
так же, как с зелёным: цвета нет ни там, ни там. Сверка спрашивает вершину, считает сам факт
|
|
140
137
|
прогона, а не цвет, и свежей вершине даёт время.
|
|
138
|
+
- **Заявка, чья база — не главная ветка, проверяется тем же набором, что и заявка в главную.**
|
|
139
|
+
Условие запуска конвейера читает базу, и заявка в соседнюю ветку не поднимает его вовсе: пустое
|
|
140
|
+
поле проверок читается как ожидание очереди. Спрашивается это до открытия первой заявки стопки,
|
|
141
|
+
и заявка без прогона на вершине не сливается — приём в паттерне `git-workflow-stack`.
|
|
141
142
|
- **Прогон, вытесненный из очереди конвейера, сверка называет отдельной строкой.** Он выглядит
|
|
142
143
|
упавшим, хотя ветку не проверял; отличает их число заданий — у него ноль.
|
|
143
144
|
- **Черновик при зелёном прогоне на вершине — расхождение сверки.** Зелёная страница ничего не
|
|
@@ -145,16 +146,14 @@ flowchart TD
|
|
|
145
146
|
- **Свои черновики судятся все разом, а не тот один, чья ветка взята.** Признака два — зелёный
|
|
146
147
|
прогон на вершине и разобранная папка задачи в ветке; лежащая папка означает идущую работу.
|
|
147
148
|
- **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Кнопку слияния нажимает
|
|
148
|
-
человек там, где гардов
|
|
149
|
-
его выполнить.
|
|
149
|
+
человек там, где гардов нет: открытие — последняя точка, где отказ ещё виден исполнителю.
|
|
150
150
|
- **Свои открытые заявки перечитываются в трёх местах: перед пушем, при взятии задачи и после
|
|
151
151
|
каждого известного слияния.** Заявка устаревает без действия автора: влита соседняя работа —
|
|
152
152
|
остальные в ту же секунду отстали. Приём — `git-workflow-freshness`.
|
|
153
153
|
- **Конфликтующая своя заявка чинится первым действием хода, а новая работа до этого не
|
|
154
|
-
берётся.** Пока отданное конфликтует, влить его человек не
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
идёт как прежде.
|
|
154
|
+
берётся.** Пока отданное конфликтует, влить его человек не может. Работой здесь считается
|
|
155
|
+
заведение задачи, заведение ветки, перевод колонки в работу и открытие заявки; всё, чем
|
|
156
|
+
конфликт чинится, идёт как прежде.
|
|
158
157
|
- **Конфликтующий открытый PR — расхождение сверки очереди работ.** Конфликт приезжает чужим
|
|
159
158
|
слиянием и по списку не виден: метку хостинг показывает только внутри самого PR.
|
|
160
159
|
- **Документ едет в том же коммите, что и правка.** Обход — строка `Docs-skip: <причина>` в теле
|
|
@@ -166,11 +165,10 @@ flowchart TD
|
|
|
166
165
|
- **Сборка входит в набор наравне с линтом и юнитами.** Линтер типов не читает, а юниты читают
|
|
167
166
|
только импортированное тестом: ошибка типов в непокрытом коде доживает до сборки образа, то
|
|
168
167
|
есть до мержа.
|
|
169
|
-
- **На машине, где раннеров несколько, любой путь от домашнего каталога общий.**
|
|
170
|
-
готового шага
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
живёт хранилище пакетов.
|
|
168
|
+
- **На машине, где раннеров несколько, любой путь от домашнего каталога общий.** Соседнее задание
|
|
169
|
+
переписывает умолчание готового шага под свою версию, пока наше стоит между шагами. Каталог
|
|
170
|
+
установки, имя контейнера и имя сборщика называются поэтому по проекту и постоянно, а временный
|
|
171
|
+
каталог решением не бывает — в нём живёт хранилище пакетов.
|
|
174
172
|
- **Набор гейта пуша не бывает уже набора конвейера.** Шаг конвейера, которому в наборе нет ни
|
|
175
173
|
строки, ни объявленного исключения с причиной, отбивает пуш, а не печатается рядом:
|
|
176
174
|
предупреждение читается как разрешение.
|
|
@@ -187,11 +185,10 @@ flowchart TD
|
|
|
187
185
|
- **После вливания главной ветки набор проверок пересматривается по тому, что ветка везёт
|
|
188
186
|
теперь.** Проверять по тому, что правил автор, — значит проверять половину: отвечает ветка
|
|
189
187
|
целиком.
|
|
190
|
-
- **Главная ветка берётся удалённой ссылкой — и в словах, и в действиях.** Локальная
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
невлитой, и уборка кончается списком невлитого, которого нет.
|
|
188
|
+
- **Главная ветка берётся удалённой ссылкой — и в словах, и в действиях.** Локальная — снимок
|
|
189
|
+
вчерашнего дня, и молчит она об этом. От `origin/main` идут и сравнение, и основание новой
|
|
190
|
+
ветки, и счёт влитого: при локальной влитая ветка числится невлитой, а уборка кончается
|
|
191
|
+
списком невлитого, которого нет.
|
|
195
192
|
- **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка во входящие не
|
|
196
193
|
приходит и обсуждения не имеет: до открытия PR правки для человека нет. Открывается он тем же
|
|
197
194
|
ходом, которым исполнитель говорит, что работу отдаёт.
|
|
@@ -53,6 +53,12 @@ flowchart TD
|
|
|
53
53
|
опирается, названо в именах дерева.
|
|
54
54
|
- **Работа начинается с чтения готового, а не с чистого файла.** Сначала находится опора —
|
|
55
55
|
компонент кита, базовый класс, образец в соседнем домене, — потом пишется своё поверх неё.
|
|
56
|
+
- **Ограничение, придуманное на месте, проверяется поиском по дереву прежде, чем стать доводом.**
|
|
57
|
+
«Так делать нельзя» — утверждение о дереве наравне с прочими, и дерево, где приём уже применён,
|
|
58
|
+
отвечает на него одной командой. Названное владельцу до поиска, оно закрывает путь, которым
|
|
59
|
+
дерево пользуется каждый день, и вызывает перебор ненужных вариантов: решение «править класс
|
|
60
|
+
чужого набора из приложения нельзя» не проверялось, пока образец такой правки лежал в том же
|
|
61
|
+
файле — с доводом в соседней строке.
|
|
56
62
|
- **Значение интеграции берётся тем же путём, что и соседнее значение той же интеграции.**
|
|
57
63
|
Половина интеграции, сделанная как положено, — готовый образец, и стоит он не в чужом домене,
|
|
58
64
|
а строкой выше: рядом с зашитым в код идентификатором карты жил её же ключ, приходящий
|
|
@@ -113,7 +119,7 @@ flowchart TD
|
|
|
113
119
|
|
|
114
120
|
## Признаки, по которым видно, что готовое обошли
|
|
115
121
|
|
|
116
|
-
Списком их здесь нет: признак — это
|
|
122
|
+
Списком их здесь нет: признак — это запись в файле, а не текст правила и не код проверки. Наборы лежат
|
|
117
123
|
при пакете, по файлу на пакет rt-tools, и в каждом только то, что везёт он сам. Дерево называет
|
|
118
124
|
нужные ему наборы ключом `reuse.bundles` в настройке проверок и дописывает свои признаки файлом,
|
|
119
125
|
названным ключом `reuse.signals`; совпавший ключ замещает пакетный, новый дописывается. Там же
|
|
@@ -147,7 +153,7 @@ flowchart TD
|
|
|
147
153
|
- Перенос переизобретением не считается: строку, которая уже лежит в файле, гард из
|
|
148
154
|
проверяемого текста вычёркивает, а сверка идёт без отступов — при переезде блок меняет
|
|
149
155
|
отступ, оставаясь тем же кодом.
|
|
150
|
-
- Ответ,
|
|
156
|
+
- Ответ, сказанный до чтения образца, образец отменяет: согласованная форма выборки списка
|
|
151
157
|
переигрывалась вместе с контрактом через два вопроса после того, как была принята.
|
|
152
158
|
- **Набор объявляется по тому, что дерево потребляет, а не по тому, что пакет везёт.** Дерево, в
|
|
153
159
|
котором кит написан, а не позван, объявив его набор, получает советы звать кит на файлах самого
|
|
@@ -68,6 +68,13 @@ flowchart TD
|
|
|
68
68
|
вне кита файл стилей по умолчанию пустой.
|
|
69
69
|
<!-- rt-when: *.scss *.css -->
|
|
70
70
|
|
|
71
|
+
- **Одна вещь называется одним именем во всех местах, где она встречается.** Раскладка, у которой
|
|
72
|
+
для страницы, панели правки и окна заведены три словаря с общими именами в разных значениях,
|
|
73
|
+
общим слоем не считается: место объявления совпадает, а значение имени — нет. Выбирая имя,
|
|
74
|
+
исполнитель попадает в чужой словарь и приносит чужой отступ, а проверки этого не видят. Место,
|
|
75
|
+
где элемент стоит, задаётся видом блока, а не вторым набором имён.
|
|
76
|
+
<!-- rt-when: *.scss *.css *.html -->
|
|
77
|
+
|
|
71
78
|
- **Шторку и окно открывает служба кита, а не номер слоя.** Числа шкалы сравниваются только
|
|
72
79
|
между соседями по разметке; служба выносит разметку наружу, к `<body>`, и сравнивать её
|
|
73
80
|
становится не с чем.
|
|
@@ -81,7 +88,7 @@ flowchart TD
|
|
|
81
88
|
- **Предел ширины объявляется вместе с судьбой не влезшего.** Предел и место в строке сами по
|
|
82
89
|
себе ничего не прячут и не переносят: у узла, который может получить значение длиннее своего
|
|
83
90
|
места, стоит либо обрезка с многоточием, либо перенос. Без этого текст молча вылезает за
|
|
84
|
-
границы и ложится поверх соседа, а разрешение элементу сжаться
|
|
91
|
+
границы и ложится поверх соседа, а разрешение элементу сжаться обрезки не заменяет.
|
|
85
92
|
<!-- rt-when: *.scss *.css -->
|
|
86
93
|
|
|
87
94
|
- **Обрезка идёт в паре с подсказкой.** Обрезок без подсказки читается как целое значение:
|
|
@@ -41,8 +41,7 @@ description: Правило под «Закон о ведении работы»
|
|
|
41
41
|
## Состояния работы
|
|
42
42
|
|
|
43
43
|
Единица работы — состояние, а не шаг. У состояния есть вход, обязательное действие и выход, и
|
|
44
|
-
пока действие не сделано, работа стоит в том же состоянии.
|
|
45
|
-
кончался, а что делать дальше, выводилось из соседних строк.
|
|
44
|
+
пока действие не сделано, работа стоит в том же состоянии.
|
|
46
45
|
|
|
47
46
|
Состояние объявляется в разделе «Где стоим» хода работы машиночитаемой строкой
|
|
48
47
|
``- **Состояние:** `этап-идёт` `` и перезаписывается вместе с ним.
|
|
@@ -62,20 +61,23 @@ description: Правило под «Закон о ведении работы»
|
|
|
62
61
|
| `влито` | PR слит человеком | разбор работы правилами и сверка очереди | `task-flow-archive` |
|
|
63
62
|
|
|
64
63
|
Ни у одного состояния обязательное действие не звучит как «ждать»: ожидание чужого шага
|
|
65
|
-
состоянием работы не
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
подтверждается оно выводом, а не памятью о том, что заводил сам исполнитель. Заполнение окна
|
|
64
|
+
состоянием работы не считается, поэтому в `работа-отдана` обязательное действие — следующая
|
|
65
|
+
задача, а не открытый PR. Блокированная задача следующей не считается: это то же ожидание под
|
|
66
|
+
именем работы. Следующая берётся из очереди работ, а очередь спрашивается командой: «задач нет» —
|
|
67
|
+
утверждение о дереве, и подтверждается оно выводом, а не памятью исполнителя. Заполнение окна
|
|
70
68
|
захода состоянием тоже не бывает: заход кончается передачей, а работа остаётся там, где стояла.
|
|
69
|
+
**Открытая карточка о взятости работы не говорит.** Карточку закрывает слияние, и в заходе без
|
|
70
|
+
открытия заявок список открытых не убывает. Невзятой задачу делает отсутствие следа в дереве:
|
|
71
|
+
открытые номера сверяются с описанием прошлого — на закрытую работу там лежит запись с её номером.
|
|
72
|
+
Сверка стоит одной команды и отвечает про обе стороны, список открытых — ни про одну.
|
|
73
|
+
|
|
71
74
|
Чем ход кончается — правило `turn-conduct` под тем же законом.
|
|
72
75
|
|
|
73
76
|
Перечень показывается владельцу в начале работы, и на нём же отмечается, где стоим.
|
|
74
77
|
|
|
75
78
|
Последние два состояния объявить на диске уже нечем: ход работы уезжает вместе с папкой, а папка
|
|
76
|
-
разбирается раньше, чем открывается PR. Признак у них
|
|
77
|
-
|
|
78
|
-
работы виду не подлежит, и хвост из четырёх шагов держится паттерном, а не объявлением.
|
|
79
|
+
разбирается раньше, чем открывается PR. Признак у них в истории ветки — коммит разбора папки, — и
|
|
80
|
+
читает его гард, а не строка в файле.
|
|
79
81
|
|
|
80
82
|
## Ход
|
|
81
83
|
|
|
@@ -112,19 +114,18 @@ flowchart TD
|
|
|
112
114
|
|
|
113
115
|
## Как закон применяется здесь
|
|
114
116
|
- **Правка кода приложения отбивается, пока работа не дошла до состояния, в котором код
|
|
115
|
-
правится.** Гард
|
|
116
|
-
|
|
117
|
-
события.
|
|
117
|
+
правится.** Гард требует три вещи: папку задачи по имени ветки, замысел в ней и объявленное
|
|
118
|
+
состояние. У договорённости о продукте свой гард на те же события.
|
|
118
119
|
- **Гард судит объявленный переход, а не наличие файлов.** Пустой замысел лежит так же, как
|
|
119
120
|
написанный, поэтому отказ снимает объявленное состояние — `этап-идёт`, `этапы-кончились`,
|
|
120
|
-
`разбор-кончился`. Четвёртый путь
|
|
121
|
-
|
|
121
|
+
`разбор-кончился`. Четвёртый путь — история ветки: папка, разобранная её коммитом, означает
|
|
122
|
+
отданную работу.
|
|
122
123
|
- **Строка состояния, переведённая вперёд, — то же объявление намерения, только машиночитаемое.**
|
|
123
124
|
Состояние объявляется тем ходом, в котором его обязательное действие начато делом.
|
|
124
125
|
- **Отказ по состоянию называет обязательное действие объявленного состояния.** Услышав только
|
|
125
126
|
«не в том состоянии», исполнитель перепишет строку состояния вместо шага.
|
|
126
127
|
- **Именем состояния считается только слово из перечня.** Своё слово не говорит ни о входе, ни о
|
|
127
|
-
выходе, ни
|
|
128
|
+
выходе, ни о действии.
|
|
128
129
|
- **Два требования — два гарда, и снять одно можно, не теряя второго.** Судят порознь: строка о
|
|
129
130
|
неизменном поведении снимает договорённость, а не требование дойти до правки кода.
|
|
130
131
|
- **Влитая договорённость ветку не запирает.** После вливания директории «предложено» на диске
|
|
@@ -134,59 +135,55 @@ flowchart TD
|
|
|
134
135
|
признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
|
|
135
136
|
`**Поведение:** не меняется — <причина владельца>` в замысле; пустая причина не принимается.
|
|
136
137
|
- **Что требует слова владельца, берётся списком, а не оценкой на месте.** Оценку «это безопасно»
|
|
137
|
-
назначает тот, кому она удобна.
|
|
138
|
+
назначает тот, кому она удобна.
|
|
138
139
|
- **На команду владельца ответ начинается с результата, а не с намерения и не с его обоснования.**
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
исполнение упёрлось в препятствие: тогда называется препятствие, а не отношение к задаче.
|
|
140
|
+
Обоснование при принятом чужом решении читается как его оценка. Исключение одно: исполнение
|
|
141
|
+
остановлено препятствием — тогда называется препятствие.
|
|
142
142
|
- **Заход работу не начинает сам.** Начало требует слова владельца в этом же заходе: передача,
|
|
143
|
-
состояние из хука запуска и назначенный эпик говорят, что делать,
|
|
144
|
-
|
|
145
|
-
одного слова или одного пути ход не заканчивает.
|
|
143
|
+
состояние из хука запуска и назначенный эпик говорят, что делать, а не работать ли.
|
|
144
|
+
Судится форма реплики: пустая реплика, одно слово или один путь работу не заказывают.
|
|
146
145
|
- **Указание работать по ходу работы покрывает все его шаги, включая меняющие историю.**
|
|
147
146
|
Спрашивают о том, чего в ходе работы нет.
|
|
148
147
|
- **Вопрос, записанный прошлым заходом, вопросом владельца не становится.** Он адресован автору
|
|
149
148
|
передачи, и часть таких вопросов закрыта шагом работы.
|
|
150
149
|
- **Указание владельца действует до его отмены, и новый факт против него — строка в ответе о
|
|
151
|
-
цене, а не новый вопрос.** Переспрашивают то, чего указание не
|
|
152
|
-
|
|
153
|
-
варианта из трёх предлагают отменить решение владельца, и есть такая отмена. Правило о развилке
|
|
154
|
-
говорит, КАК задавать вопрос, и молчит о том, задавать ли его вовсе.
|
|
150
|
+
цене, а не новый вопрос.** Переспрашивают то, чего указание не покрывает. Меню, где два
|
|
151
|
+
варианта из трёх предлагают отменить решение владельца, и есть такая отмена.
|
|
155
152
|
- **Ответ, данный репликой владельца, записан наравне с ответом в документе.** Вопрос, на который
|
|
156
153
|
в разговоре уже отвечали, второй раз не задают.
|
|
157
|
-
- **Слово владельца об устройстве — постановка, а не решение.** Названное им обычно уже
|
|
158
|
-
дереве под этим
|
|
159
|
-
|
|
160
|
-
выглядит исполненной просьбой ровно до приёмки.
|
|
154
|
+
- **Слово владельца об устройстве — постановка, а не решение.** Названное им обычно уже есть в
|
|
155
|
+
дереве под этим словом — имя на экране, раздел спека, поле модели — и сверяется с ними до
|
|
156
|
+
правки. Разошлось — спрашивается владелец.
|
|
161
157
|
- **Папка задачи заводится под любую работу, без исключений.** Исключение, у которого есть хоть
|
|
162
158
|
одна законная форма, исполняется как разрешение. Заводится она до первой правки.
|
|
163
159
|
- **Папка задачи едет в ветку коммитом, а не живёт в одном рабочем дереве.** Незакоммиченная,
|
|
164
|
-
она проходит
|
|
165
|
-
|
|
160
|
+
она проходит правки без отказа, и отказ приходит в конце, когда замысел уже снят. Вне истории
|
|
161
|
+
законен один черновик без номера.
|
|
166
162
|
- **Папка задачи разбирается последним коммитом до открытия PR, а не после одобрения.** Человек
|
|
167
|
-
вливает, как только видит зелёное, и закрывающему коммиту места не
|
|
168
|
-
замысла с этой минуты на диске нет, и признак отданной работы гард берёт из истории ветки.
|
|
163
|
+
вливает, как только видит зелёное, и закрывающему коммиту места не остаётся.
|
|
169
164
|
- **Открыв PR, исполнитель называет владельцу номер, чего ждёт и что сделает следом.** Ждёт он
|
|
170
165
|
прогона, следом снимает черновик: зелёный прогон говорит, что не сломано, и молчит о
|
|
171
|
-
заблокированной
|
|
166
|
+
заблокированной кнопке слияния.
|
|
172
167
|
- **Просьба о слиянии — отдельный ход, и раньше зелёного прогона её не бывает.** Порядок один:
|
|
173
168
|
папка разобрана и запушена → PR открыт черновиком → прогон зелёный → черновик снят →
|
|
174
169
|
исполнитель просит влить, называя номер.
|
|
175
|
-
- **PR открывается черновиком, а не в конце работы.** До открытия владелец правки не
|
|
176
|
-
|
|
177
|
-
|
|
170
|
+
- **PR открывается черновиком, а не в конце работы.** До открытия владелец правки не видит, а
|
|
171
|
+
открытый PR читается как приглашение влить. Черновик снимается тем ходом, которым исполнитель
|
|
172
|
+
говорит, что решение готово.
|
|
178
173
|
- **Гард замысла — нижняя граница требования, а не его предел.** Он требует папку только под
|
|
179
|
-
правку кода приложения, а статья выше — под любую работу.
|
|
180
|
-
становится разрешением работать без замысла везде, куда не смотрит.
|
|
174
|
+
правку кода приложения, а статья выше — под любую работу.
|
|
181
175
|
- **Указание работать по правилу — это указание делать его шаги, включая меняющие историю.**
|
|
182
|
-
Отметка этапа, коммит, пуш и открытие заявки правилом
|
|
183
|
-
нём нет. Ход, доведший работу до готовности и вставший перед коммитом, её не отдал, а спрятал.
|
|
176
|
+
Отметка этапа, коммит, пуш и открытие заявки правилом предписаны.
|
|
184
177
|
- **Взятая задача ходом не кончается.** Заведение задачи, ветки, колонки и папки — подготовка:
|
|
185
|
-
|
|
186
|
-
|
|
178
|
+
работа переходит в состояние записанного замысла, где действие другое. Гард завершения хода
|
|
179
|
+
называет в отказе первый этап.
|
|
187
180
|
- **Ожидание одной части этапа остановкой этапа не бывает.** Независимые от ожидаемого части
|
|
188
181
|
делаются тем же ходом, а владельцу называется, что сделано и что осталось на его шаг. Отбитая
|
|
189
|
-
команда читается так же: сперва делается
|
|
182
|
+
команда читается так же: сперва делается всё остальное.
|
|
183
|
+
- **Находка, сделанная посреди этапа, сверяется с условиями выхода замысла до первой правки.**
|
|
184
|
+
Соседство по предмету принадлежности не доказывает: работа над слоем правил и работа над
|
|
185
|
+
командами, которые этот слой вызывает, откатываются порознь. Не названная ни одним условием
|
|
186
|
+
выхода, находка идёт в раздел о том, чего работа не делает, и заводится задачей.
|
|
190
187
|
- **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом, а
|
|
191
188
|
не дописывается: это первое, что читает следующий заход.
|
|
192
189
|
- **Слово для нового понятия ищется в словаре дерева.** Общую часть везёт пакет, предметную
|
|
@@ -196,21 +193,27 @@ flowchart TD
|
|
|
196
193
|
сколько задач из него выйдет, поэтому номер не бывает первым. Команда переименовывает черновик,
|
|
197
194
|
проставляет шапку замысла и снимает с копий шапку раскладки.
|
|
198
195
|
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди.
|
|
196
|
+
- **Работа, заказанная словами, становится задачей в очереди тем же ходом.** Даже если делать её
|
|
197
|
+
будут не сейчас. Черновик папки очередью не считается: номера нет, знает о нём один заход.
|
|
198
|
+
Отложенная работа называет срок; отложенная молча читается как сделанная.
|
|
199
199
|
- **Следующая задача берётся из замысла эпика, а список очереди работ спрашивается только там, где
|
|
200
200
|
эпика нет.** По списку номеров первая задача чужого эпика неотличима от своей. Кончившийся эпик
|
|
201
201
|
называется владельцу тем же ходом, которым берётся работа вне его.
|
|
202
202
|
- **Эпик не закрывается по признаку, подтверждённому только чтением.** Проверяемое глазами
|
|
203
203
|
называется проверенным лишь вместе с командой и её выводом.
|
|
204
204
|
- **Задачи эпика заводятся все разом, тем же ходом, что и сам эпик.** Заведение по одной прячет
|
|
205
|
-
объём. Номера возвращаются в раздел порядка той же
|
|
206
|
-
названием, а не карточкой.
|
|
205
|
+
объём. Номера возвращаются в раздел порядка той же правкой.
|
|
207
206
|
|
|
207
|
+
- **Замысел эпика называет, как стоят ветки его задач, наравне с их порядком.** Расстановок две:
|
|
208
|
+
каждая ветка от главной либо стопкой — каждая от предыдущей. Порядок задач об этом не говорит.
|
|
209
|
+
Стопка стоит дороже, её цена перечислена в холодной части; записанная в замысле расстановка
|
|
210
|
+
становится решением эпика, а не того, кто заводит ветку.
|
|
208
211
|
- **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка порядка задач не
|
|
209
212
|
держит, а папка задачи держала бы его до слияния первой; каталог называет компаньон правила.
|
|
210
213
|
Названное владельцем по ходу дописывается туда же тем ходом, каким принято.
|
|
211
|
-
- **Сборка по образцу начинается с чтения самого образца, а не пересказа о нём.** Пересказ
|
|
212
|
-
|
|
213
|
-
|
|
214
|
+
- **Сборка по образцу начинается с чтения самого образца, а не пересказа о нём.** Пересказ в
|
|
215
|
+
разборе просьбы и в замысле эпика образцом не считается. Повторяемая часть открывается целиком,
|
|
216
|
+
обходом каталогов.
|
|
214
217
|
- **Что действует на дерево, а не на правку, лежит вне индекса.** Путь к образцу и разрешение
|
|
215
218
|
работать вне эпика ветке не принадлежат и живут рядом с передачей захода.
|
|
216
219
|
- **Закрытая работа разбирается правилами, и это шаг закрытия, а не отдельная просьба.** Что
|
|
@@ -219,18 +222,18 @@ flowchart TD
|
|
|
219
222
|
- **Разбор закрытой работы уходит в фон, а исполнитель берёт следующую задачу.** Роль работает
|
|
220
223
|
своим ходом; сводку собирают до запуска, находки принимают одним ходом.
|
|
221
224
|
- **Находки разбора ждут владельца, а в пакет уезжает только сводка наблюдений.** Предложение —
|
|
222
|
-
заготовка правки чужого
|
|
223
|
-
заказывал. Сводка
|
|
225
|
+
заготовка правки чужого дерева; отправленное без разбора, оно становится работой того, кто его
|
|
226
|
+
не заказывал. Сводка отправляется всегда: она говорит, чем пользовались, и мнением не бывает.
|
|
224
227
|
- **Дешёвый шаг закрытия идёт раньше дорогого, а прогон — после вливания.** Вливание
|
|
225
|
-
договорённости и приведение текстов стоят минуты, прогон — окно захода;
|
|
226
|
-
|
|
228
|
+
договорённости и приведение текстов стоят минуты, прогон — окно захода; прогон до вливания
|
|
229
|
+
проверяет то, что в главную не попадёт.
|
|
227
230
|
- **Договорённость вливается в спек домена одним из последних коммитов ветки, до открытия PR.**
|
|
228
231
|
К этому моменту код написан, привязки известны, и в главной ветке директория `proposed/` не
|
|
229
|
-
|
|
232
|
+
появляется. Готовые к вливанию перечисляет `npm run check:specs`.
|
|
230
233
|
- **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает то, что
|
|
231
234
|
объясняет решение; остальное удаляется. Неразобранную ловит сверка очереди.
|
|
232
235
|
- **Открытие PR и снятие черновика отбиваются, пока ветка везёт папку своей задачи.** Слияние
|
|
233
|
-
нажимает человек на хостинге, где гардов нет: снятый черновик он читает
|
|
236
|
+
нажимает человек на хостинге, где гардов нет: снятый черновик он читает как приглашение.
|
|
234
237
|
Судится содержимое ветки, а не рабочее дерево.
|
|
235
238
|
- **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, а
|
|
236
239
|
первым уходит разбор просьбы — единственная запись слов владельца.
|
|
@@ -247,35 +250,32 @@ flowchart TD
|
|
|
247
250
|
признака рефакторингу не заводится: оценку «поведение не меняется» назначал бы тот, кому она
|
|
248
251
|
мешает.
|
|
249
252
|
|
|
250
|
-
Ничто из самого разбора не проверяется. Разговор с владельцем
|
|
253
|
+
Ничто из самого разбора не проверяется. Разговор с владельцем — не вызов инструмента: гард
|
|
251
254
|
видит правку файла и не знает ни о разведке до первого вопроса, ни о шести обязательных, ни об
|
|
252
|
-
ответах на
|
|
255
|
+
ответах на них. Пустая таблица проходит так же, как заполненная.
|
|
253
256
|
|
|
254
257
|
Понимания текста у гарда разговора нет: второй его признак судит общие слова темы вопроса и
|
|
255
|
-
последней реплики владельца, а не
|
|
256
|
-
|
|
258
|
+
последней реплики владельца, а не смысл. Отказ называет законный ход: назвать то, чего в прежнем
|
|
259
|
+
ответе владельца нет.
|
|
257
260
|
|
|
258
261
|
Неизменность замысла не стережёт ничто: правка по ходу отличима от первоначальной записи только
|
|
259
262
|
по истории.
|
|
260
263
|
|
|
261
264
|
Приведение текстов к сделанному не проверяет ничто: что устарело в правиле и в спеке, машине не
|
|
262
|
-
видно. Держится это шагом закрытия и следом задачи в
|
|
263
|
-
|
|
264
|
-
идёт дальше без неё.
|
|
265
|
+
видно. Держится это шагом закрытия и следом задачи в замысле. Правило и спек правятся в ветке,
|
|
266
|
+
закон — нет: его статья приносится владельцу текстом, а работа идёт дальше без неё.
|
|
265
267
|
|
|
266
268
|
Что именно перенесли в архив, не проверяется: гард видит, что папка уехала и что ветка что-то в
|
|
267
269
|
архив добавила, а то ли это — судит владелец на ревью.
|
|
268
270
|
|
|
269
271
|
Гард папки задачи судит вызов исполнителя, а не кнопку хостинга: человек, вливающий работу со
|
|
270
|
-
своей стороны, проходит мимо него
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
действующим. Держится это чтением обоих текстов подряд — пакетного и надстройки — при каждой
|
|
278
|
-
правке порядка отдачи.
|
|
272
|
+
своей стороны, проходит мимо него молча. На этой половине случаев требование держится оставшимся
|
|
273
|
+
шагом, который стоит разделом в теле заявки и произносится вслух.
|
|
274
|
+
|
|
275
|
+
Порядок отдачи работы дерево вправе перевернуть надстройкой, и тогда часть шагов пакета перестаёт
|
|
276
|
+
исполняться. Какие именно — не считает ничто: шаг, чья механика сломалась тем же решением, в
|
|
277
|
+
перечень отменяемого не попадает и продолжает читаться действующим. Держится это чтением обоих
|
|
278
|
+
текстов подряд при каждой правке порядка отдачи.
|
|
279
279
|
|
|
280
280
|
## Паттерны
|
|
281
281
|
|