@rt-tools/agent-kit 0.17.0 → 0.19.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/assets/checks/board-epics.github.mjs +123 -0
- package/assets/checks/board-gh.github.mjs +121 -0
- package/assets/checks/board.github.mjs +77 -73
- package/assets/checks/check-board.github.mjs +39 -3
- package/assets/checks/check-hook-scope.mjs +126 -0
- package/assets/checks/check-profile-drift.mjs +195 -0
- package/assets/checks/check-specs.mjs +1 -1
- package/assets/checks/rt-kit-checks.config.mjs +13 -0
- package/assets/checks/spec-anchors.mjs +2 -2
- package/assets/defaults/project.sh +21 -117
- package/assets/defaults/shell.sh +139 -0
- package/assets/hooks/browser-guard-no-other-drivers.sh +41 -2
- package/assets/hooks/claim-guard.sh +22 -1
- package/assets/hooks/docs-guard.sh +1 -1
- package/assets/hooks/exam-guard.sh +85 -12
- package/assets/hooks/git-guard-delivery-conflict.sh +85 -0
- package/assets/hooks/git-guard-delivery-signature.sh +14 -5
- package/assets/hooks/git-guard-delivery.sh +15 -2
- package/assets/hooks/grill-gate.sh +63 -6
- package/assets/hooks/proposal-guard.sh +11 -4
- package/assets/hooks/rule-source-guard.sh +8 -13
- package/assets/hooks/task-context-load.sh +22 -0
- package/assets/hooks/task-flow-context.sh +9 -0
- package/assets/hooks/task-flow-draft-guard.sh +17 -0
- package/assets/hooks/turn-exit-guard.sh +45 -87
- package/assets/hooks/waiting-turn-guard.sh +65 -2
- package/assets/hooks/work-start-guard.sh +166 -0
- package/assets/hooks/write-targets.sh +24 -0
- package/assets/laws/verifiability.md +28 -0
- package/assets/patterns/browser-verification-measure.md +49 -1
- package/assets/patterns/browser-verification-stand.md +10 -2
- package/assets/patterns/doc-style-write.md +21 -1
- package/assets/patterns/git-workflow-commit.github.md +32 -3
- package/assets/patterns/git-workflow-docker.md +8 -0
- package/assets/patterns/git-workflow-freshness.md +87 -0
- package/assets/patterns/git-workflow-merge.md +23 -0
- package/assets/patterns/git-workflow-pr.github.md +6 -0
- package/assets/patterns/git-workflow-restart.md +18 -0
- package/assets/patterns/git-workflow-stack.md +30 -0
- package/assets/patterns/lib-layers-move.md +4 -0
- package/assets/patterns/spec-driven-domain.md +13 -1
- package/assets/patterns/spec-driven-rule.md +5 -4
- package/assets/patterns/spec-driven-sweep.md +1 -1
- package/assets/patterns/status-report-table.github.md +1 -1
- package/assets/patterns/task-flow-archive.md +12 -2
- package/assets/patterns/task-flow-close.md +31 -24
- package/assets/patterns/task-flow-handoff.md +14 -2
- package/assets/patterns/task-flow-resume.md +18 -3
- package/assets/patterns/task-flow-start.md +23 -23
- package/assets/patterns/testing-e2e.md +23 -0
- package/assets/patterns/turn-entry-map.md +1 -1
- package/assets/pitfalls/agent-kit.md +4 -6
- package/assets/pitfalls/doc-style.md +10 -0
- package/assets/pitfalls/git-workflow.github.md +20 -0
- package/assets/pitfalls/spec-driven.md +6 -0
- package/assets/pitfalls/task-flow.md +20 -0
- package/assets/pitfalls/testing.md +6 -0
- package/assets/pitfalls/turn-conduct.md +35 -0
- package/assets/rules/browser-verification.md +19 -0
- package/assets/rules/deploy-flow.github.md +9 -0
- package/assets/rules/doc-style.md +6 -0
- package/assets/rules/git-workflow.azure.md +17 -2
- package/assets/rules/git-workflow.github.md +89 -90
- package/assets/rules/git-workflow.gitlab.md +12 -4
- package/assets/rules/lists.md +5 -0
- package/assets/rules/observability.needs-app.md +4 -0
- package/assets/rules/reuse-first.md +6 -0
- package/assets/rules/spec-driven.md +29 -25
- package/assets/rules/task-flow.md +52 -46
- package/assets/rules/testing.md +27 -1
- package/assets/rules/turn-conduct.md +46 -43
- package/assets/skills/agent-kit.md +9 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.19.0.tgz +0 -0
- package/rt-tools-agent-kit-0.17.0.tgz +0 -0
|
@@ -7,6 +7,20 @@
|
|
|
7
7
|
|
|
8
8
|
## Ловушки
|
|
9
9
|
|
|
10
|
+
- **Разрешение владельца, оставленное в репозитории, теряется на каждой новой ветке.** Оно
|
|
11
|
+
записано номером в файл ветки, а следующая ветка отводится от главной и его не несёт: гард
|
|
12
|
+
отбивает работу, которую владелец разрешил, — и повторяется это ровно столько раз, сколько
|
|
13
|
+
веток заведут до слияния разрешившего коммита. Отказ гарда при этом называет файл и молчит о
|
|
14
|
+
том, что запись принадлежит ветке: из его текста это читается как настройка дерева. Пока
|
|
15
|
+
разрешение живёт в репозитории, номер дописывается заново в каждую новую ветку.
|
|
16
|
+
- **Имя чужого дерева в файлы репозитория не пишется, а путь к образцу — пишется.** Обе вещи
|
|
17
|
+
живут рядом с передачей захода именно поэтому: там законен полный путь, а в репозитории —
|
|
18
|
+
только ссылка без имени.
|
|
19
|
+
- **Строка «Ждём владельца» в ходе работы живёт дольше причины, по которой её написали.** Она
|
|
20
|
+
лежит на диске, приходит в контекст следующим заходом и читается как действующее состояние —
|
|
21
|
+
поэтому снимается тем же ходом, которым владелец ответил. Иначе ожидание подтверждает себя
|
|
22
|
+
само: три указания владельца подряд не пересилили одной строки на диске.
|
|
23
|
+
|
|
10
24
|
- **Папка называется именем ветки, один в один.** Хук запуска ищет её по
|
|
11
25
|
`git branch --show-current`, и папка, названная иначе, не находится ничем: работа идёт с
|
|
12
26
|
пустым контекстом, а владельца просят пересказать то, что уже записано.
|
|
@@ -181,3 +195,9 @@
|
|
|
181
195
|
- **Прогон, поставленный первым шагом закрытия, съедает окно захода.** Он стоит дороже всех
|
|
182
196
|
остальных шагов вместе, и потративший его на прогон упирался в порог заполнения на четырёх
|
|
183
197
|
строках привязки — то есть на работе, которая стоила бы минуты, если бы шла первой.
|
|
198
|
+
- **Разрешение работать вне назначенного эпика принадлежит рабочему дереву, а не ветке.**
|
|
199
|
+
Записанное в файл репозитория, оно уезжает вместе с веткой: из соседней его не видно, и гард
|
|
200
|
+
эпика отбивает ровно ту работу, которую владелец разрешил. За один заход это случилось дважды
|
|
201
|
+
— сперва на отказе конца хода, потом на переводе колонки, и оба раза номер дописывался заново.
|
|
202
|
+
Место такому разрешению там же, где передача захода: оно не откатывается вместе с правкой и не
|
|
203
|
+
принадлежит ни одной задаче.
|
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
## Ловушки
|
|
9
9
|
|
|
10
|
+
- **Зелёный тест чистой функции молчит о ряде, которого рабочий путь не порождает.** Функция
|
|
11
|
+
верна на том, что ей подали, а подаёт ей ввод сам тест: ряд, собранный ради удобства
|
|
12
|
+
проверки, доказывает поведение на случае, которого в работе не бывает. Так стояли два зелёных
|
|
13
|
+
теста решения об оповещении, а предохранитель, ради которого решение писали, не сработал ни
|
|
14
|
+
разу. Форма ввода берётся с той границы, откуда решение зовут, — у процедуры, у службы, у
|
|
15
|
+
обработчика, — и сверяется с ней, а не выдумывается рядом с проверкой.
|
|
10
16
|
- **Зелёный `nx test <проект>` не значит, что хоть один файл исполнялся.** Либа без своего
|
|
11
17
|
`vitest.config.mts` не запускает ничего — так тесты домена броней не запускались ни разу.
|
|
12
18
|
Либа с конфигом, но без единого `*.spec.ts`, проходит зелёной из-за `passWithNoTests: true`,
|
|
@@ -45,3 +45,38 @@
|
|
|
45
45
|
- **Замер, разбитый на уведомления по шагам, съедает ходы вхолостую.** Каждый его шаг назначает
|
|
46
46
|
себе ход, а наполнить ход нечем: дерево под идущей серией трогать нельзя, и остаётся пересказ
|
|
47
47
|
того, что придёт следующей строкой. Одно ожидание, кончающееся вместе с замером, стоит один ход.
|
|
48
|
+
- **Отказ гарда разбирается чтением его кода, а не перебором форм вызова.** Второй отказ подряд
|
|
49
|
+
по одному требованию означает, что перебирается не та ось: адрес меняли, а решала форма
|
|
50
|
+
команды — вызов там считался по первому слову строки, и все восемь попыток начинались с входа
|
|
51
|
+
в каталог. Дальше открывается сам гард и профиль, на который он ссылается, целиком, включая
|
|
52
|
+
ветку, до которой перебор не дошёл. Чтение гарды пропускают всегда, в том числе после порога
|
|
53
|
+
остановки.
|
|
54
|
+
|
|
55
|
+
- **Механизм называется сломанным только после того, как прочитан целиком.** Разбор по половине
|
|
56
|
+
кода звучит тем убедительнее, чем подробнее написан, и владелец принимает его за проверенный.
|
|
57
|
+
Признак непрочитанного один: имя функции, названное в разборе, но не открытое.
|
|
58
|
+
|
|
59
|
+
- **Работа не передаётся владельцу словами «сделай сам», пока не прочитан механизм, который её
|
|
60
|
+
отбивает.** Готовая команда с объяснением «у меня не выйдет» выглядит помощью и ею не
|
|
61
|
+
работает: она переносит на владельца незакрытое чтение. Длинная череда отказов доводом здесь
|
|
62
|
+
не бывает — она говорит о том, сколько раз повторили одно движение, а не о том, что механизм
|
|
63
|
+
неисправен.
|
|
64
|
+
|
|
65
|
+
- **Неудобство исполнителя решения владельца не пересматривает.** Принятое решение об отправке —
|
|
66
|
+
открыть заявку, отдать работу, показать сделанное — не отменяется тем, что путь к нему оказался
|
|
67
|
+
длиннее ожидаемого. Довод «так выйдет дольше» говорит о цене, а платит её не тот, кто решение
|
|
68
|
+
принимал: цена называется владельцу вместе со сделанным шагом, а не вместо него. Отличить этот
|
|
69
|
+
случай от законного вопроса просто — законный вопрос про то, чего исполнитель не знает, а этот
|
|
70
|
+
про то, чего ему не хочется.
|
|
71
|
+
|
|
72
|
+
- **Страж выхода судит изменение дерева, а не оставшееся действие.** Он спрашивает, сделано ли за
|
|
73
|
+
ход хоть что-то, — и ход, в котором закрыта половина этапа, а вторая брошена на отбитой
|
|
74
|
+
команде, ему неотличим от полной работы: коммиты есть, дерево изменилось. Ловится им только ход,
|
|
75
|
+
кончившийся ничем. Осталось ли в состоянии действие, не зависящее от того, чего ход ждёт,
|
|
76
|
+
проверяет вниманием тот, кто ведёт ход.
|
|
77
|
+
- **Отбитое разрешение чужим шагом не бывает, и работу оно не останавливает.** Статья о чужом
|
|
78
|
+
шаге написана про то, что идёт само и кончится без исполнителя: прогон, разбор, слияние.
|
|
79
|
+
Разрешение, отбитое средой, само не кончится — оно ждёт слова владельца, — и работа, упершаяся
|
|
80
|
+
в него, встаёт целиком там, где мимо него шло ещё несколько ходов дела. Делается всё, что от
|
|
81
|
+
разрешения не зависит, а несделанное называется в теле заявки, разделом об оставшемся шаге:
|
|
82
|
+
он ровно про это и написан.
|
|
@@ -67,6 +67,11 @@ flowchart TD
|
|
|
67
67
|
идентификатору процесса, а не по имени команды — у обоих экземпляров оно одно.
|
|
68
68
|
- **Браузер водится одним драйвером на закреплённом профиле.** Остальные двери — второй
|
|
69
69
|
драйвер, `open`, `osascript`, запуск бинарника — закреплённый профиль не спрашивают вовсе.
|
|
70
|
+
- **Браузер, поднятый библиотекой изнутри скрипта, — та же дверь, что и запуск бинарника.** В
|
|
71
|
+
строке команды её не видно вовсе: там стоят имя интерпретатора и путь файла, а вождение лежит
|
|
72
|
+
внутри самого файла. Поэтому судится содержимое запускаемого файла и код, переданный доводом
|
|
73
|
+
вместо файла; правило, судившее одну командную строку, обещало больше, чем проверяло, и
|
|
74
|
+
профиль обошли этой дверью дважды за один заход.
|
|
70
75
|
- **Выбор браузера протухает и требует повторного вызова.** Выбор, сделанный в начале
|
|
71
76
|
сессии, не держится: после паузы следующий вызов открывает вкладку в другом профиле молча.
|
|
72
77
|
- **Профиль не выбирается из списка и не спрашивается у владельца.** Список отдаёт неустойчивые
|
|
@@ -185,3 +190,17 @@ flowchart TD
|
|
|
185
190
|
проверки, не говорит про образ ничего: в составе прода она есть, а ручной прогон того же
|
|
186
191
|
образа идёт без неё. Пути перечисляются до проверки, а не после того, как один из них
|
|
187
192
|
сошёлся.
|
|
193
|
+
- **Признак снимается с вопроса владельца, а не с предмета правки.** Отданная сервером страница
|
|
194
|
+
отвечает на «собралось ли», и на «видно ли» она не отвечает никогда: показ живёт после
|
|
195
|
+
гидратации, а картинка — после запроса к чужой службе. Признаки под второй вопрос свои —
|
|
196
|
+
`naturalWidth` у картинки больше нуля, узел показа появился на поднятой странице, — и снимаются
|
|
197
|
+
они драйвером, а не запросом к адресу.
|
|
198
|
+
- **Чужой отказ службы диагнозом настройки не бывает.** `403` называет состояние проекта у
|
|
199
|
+
поставщика и молчит о том, какое значение лежит в настройке дерева; прочитанный как диагноз, он
|
|
200
|
+
уводит в починку того, что цело, — а само значение читается одной командой на своей стороне.
|
|
201
|
+
Владельцу оно тем более не заказывается: у захода оно уже есть.
|
|
202
|
+
- **Прежнее поведение читается кодом той версии:** `git show <коммит до правки>:<файл>`. Тело
|
|
203
|
+
коммита называет, что правка сменила, и молчит о том, что было верно до неё; условие показа, в
|
|
204
|
+
которое дописано ещё одно обязательное значение, гасит показанное раньше и в самой правке
|
|
205
|
+
выглядит уточнением. Правка соседней задачи, выкатившаяся тем же днём, входит в проверку прода
|
|
206
|
+
наравне со своей: ветка отвечает за то, что уехало вместе с ней.
|
|
@@ -88,6 +88,15 @@ flowchart TD
|
|
|
88
88
|
висячим не бывает никогда, и чистка висячего его не касается: за полгода они съедают диск
|
|
89
89
|
сервера целиком. Три sha — это глубина отката, и меньше брать нельзя: поломка, замеченная
|
|
90
90
|
через две выкатки, откатывается уже некуда.
|
|
91
|
+
- **Состоявшаяся поломка прода разбирается записью, а не одной починкой.** Починка уезжает
|
|
92
|
+
веткой, задача закрывается — и причина, по которой приложение встало, остаётся знанием одного
|
|
93
|
+
исполнителя. Запись называет, что сломалось, чем это стало видно и почему починка чинит
|
|
94
|
+
причину, а не признак; лежит она среди описаний состоявшегося, каталог называет компаньон
|
|
95
|
+
правила слога.
|
|
96
|
+
- **Правка самой выкатки прогоняется до слияния, а «проверю после слияния» решением исполнителя
|
|
97
|
+
не бывает.** Прогнать её иначе нечем: она исполняется только там, где выкатывает. Прогнать
|
|
98
|
+
нечем и вручную — тогда это говорится владельцу словами, вместе с тем, чего проверка стоила бы,
|
|
99
|
+
и решение отложить принимает он.
|
|
91
100
|
- **Описание прода правится вместе с составом прода.** Устройство, путь запроса, гейты и
|
|
92
101
|
бэкапы описаны текстами вне слоёв правил, и ни линтер, ни сборка их не читают: расхождение
|
|
93
102
|
копится молча, а читают эти тексты как действующие. Пару стережёт гард документов.
|
|
@@ -150,6 +150,12 @@ flowchart TD
|
|
|
150
150
|
который сослался. Живой текст называет решение словами, а не адресом записи.
|
|
151
151
|
<!-- rt-when: *.md -->
|
|
152
152
|
|
|
153
|
+
- **Схема правится тем же изменением, что и текст, который она изображает.** Разойдясь, схема и
|
|
154
|
+
проза остаются читаемыми обе, и первым это замечает тот, кто пошёл по схеме: она короче, её
|
|
155
|
+
читают вместо текста, и расхождение уводит работу целиком. Ни одна проверка этого не видит —
|
|
156
|
+
схема набрана словами и от текста рядом отличима только чтением.
|
|
157
|
+
<!-- rt-when: *.md -->
|
|
158
|
+
|
|
153
159
|
## Чего из закона здесь нет
|
|
154
160
|
|
|
155
161
|
Ни одна из формулировочных договорённостей не проверяется: одна фраза на правило, простые
|
|
@@ -131,9 +131,17 @@ flowchart TD
|
|
|
131
131
|
- **Отставшее состояние находится сверкой очереди, а не глазами.** Сверка судит состояние по
|
|
132
132
|
PR в обе стороны: открытый PR при элементе не в разборе и разбор без открытого PR — оба
|
|
133
133
|
расхождения. Момента, когда задачу берут в работу, ей не видно: ветки на доске нет.
|
|
134
|
+
- **Ветка с открытой заявкой отстаёт от главной молча.** Гард судит основание один раз — в
|
|
135
|
+
минуту открытия; всё, что влилось в главную, пока шёл прогон, зелёный прогон не видит вовсе, и
|
|
136
|
+
влитая оттуда заявка приносит в главную ветку сочетание, которое не проверял никто. Отставание
|
|
137
|
+
находит сверка очереди работ: она спрашивает у хранилища, на сколько коммитов ветка каждой
|
|
138
|
+
открытой заявки позади главной, и называет число.
|
|
134
139
|
- **Задачи, чинящиеся одной правкой, сливаются до слияния ветки.** Вторая закрывается как
|
|
135
|
-
дубликат, а недостающее из неё дописывается в первую.
|
|
136
|
-
|
|
140
|
+
дубликат, а недостающее из неё дописывается в первую. Закон велит вторую стереть, и это второе
|
|
141
|
+
объявленное отступление: у рабочего элемента здесь есть родная связь «дубликат», удаление
|
|
142
|
+
уносит вместе с ним историю правок и вложения, а номер после него не переиспользуется —
|
|
143
|
+
ссылка на стёртый элемент из чужого коммита ведёт в пустоту. После слияния слить уже нельзя:
|
|
144
|
+
ветка въехала, и откатывается она целиком.
|
|
137
145
|
- **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка
|
|
138
146
|
на доске и строка о заходах с передачей в замысле эпика говорят одно и то же двум читателям:
|
|
139
147
|
исполнитель открывает карточку раньше, чем замысел эпика, а планирует по замыслу. Одна пометка без
|
|
@@ -192,6 +200,13 @@ flowchart TD
|
|
|
192
200
|
|
|
193
201
|
## Чего из закона здесь нет
|
|
194
202
|
|
|
203
|
+
Ключа задач у этого хостинга нет, и форма имени строится из одного номера. Закон требует писать
|
|
204
|
+
номер всюду одинаково — «ключ, дефис, номер», — и это отступление от него, объявленное здесь:
|
|
205
|
+
номер рабочего элемента уникален на весь проект, а родная форма ссылки хостинга — `AB#<номер>` —
|
|
206
|
+
ключа не несёт вовсе, и приписанный к ней он ломает связывание коммита с элементом. Настройки
|
|
207
|
+
`board.taskKey` дерево на этом хостинге не заводит; проверки, которые ищут ключ в заголовке,
|
|
208
|
+
судят здесь номер без него.
|
|
209
|
+
|
|
195
210
|
Гард поставки стоит на командах агента, поэтому ветку, заведённую руками в редакторе, он не
|
|
196
211
|
видит: имя такой ветки держится памятью. Требование от этого не слабеет — просто отдельной
|
|
197
212
|
проверки под него не заводится: работа опознаётся заголовком рабочего элемента и PR, а это
|
|
@@ -71,28 +71,25 @@ flowchart TD
|
|
|
71
71
|
- **Главная ветка влита в ветку задачи до открытия PR.** Гард отбивает открытие, пока вершина
|
|
72
72
|
главной не стала предком текущей, и называет расхождение числом коммитов: иначе ревьювер видит
|
|
73
73
|
свою правку вперемешку с чужой, а проверено всё было от основания, которого уже нет.
|
|
74
|
+
- **Волна веток от одной главной проверяется пробным слиянием, а не по одной:** каждая зелена
|
|
75
|
+
сама по себе, а сталкиваются они тем, чего на отдельной ветке не видно.
|
|
74
76
|
- **Ветка следующей работы отводится от предыдущей, пока череда не прервалась.** `git checkout -b
|
|
75
|
-
<КЛЮЧ>-<номер>-<slug> <предыдущая ветка>` вместо `origin/main`; от главной — только первая
|
|
76
|
-
|
|
77
|
-
все остальные разом.
|
|
77
|
+
<КЛЮЧ>-<номер>-<slug> <предыдущая ветка>` вместо `origin/main`; от главной — только первая работа
|
|
78
|
+
череды. Иначе первое же слияние делает расходящимися все остальные разом.
|
|
78
79
|
- **У заявки в череде основанием стоит предыдущая ветка, а не главная.** `gh pr create --base
|
|
79
80
|
<предыдущая ветка>` — иначе разбор показывает свою правку вперемешку со всем, что под ней. Базу
|
|
80
81
|
влитой нижней хостинг переносит сам.
|
|
81
|
-
- **Череда вливается снизу вверх, и порядок стоит в теле каждой заявки.**
|
|
82
|
-
|
|
83
|
-
где он это прочтёт.
|
|
82
|
+
- **Череда вливается снизу вверх, и порядок стоит в теле каждой заявки.** Родство веток по
|
|
83
|
+
списку не видно: строка «стоит на #<номер>» — единственное место, где владелец это прочтёт.
|
|
84
84
|
- **Нижняя ветка череды историю не переписывает — ни `rebase`, ни силовой отправкой.** Хостинг
|
|
85
|
-
закрывает заявку верхней как слитую при пустой главной. Отставшая
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
основание без вершины главной и чужую почту в подписи. На пуше те же проверки остаются вторым
|
|
94
|
-
рубежом, но стоят дороже: основание чинится вливанием с конфликтом, подпись — переписыванием
|
|
95
|
-
ветки.
|
|
85
|
+
закрывает заявку верхней как слитую при пустой главной. Отставшая чинится вливанием главной.
|
|
86
|
+
- **Расхождение внутри череды разбирается тем, кто ветвится.** У него обе правки свои; у
|
|
87
|
+
владельца, разбирающего то же при слиянии, нет ни одной.
|
|
88
|
+
- **Несошедшиеся условия поставки называются одним отказом.** Гард копит их и печатает разом: всё
|
|
89
|
+
несошедшееся известно на первом вызове.
|
|
90
|
+
- **Условие, известное в начале работы, спрашивается в начале.** Заведение ветки отбивает основание
|
|
91
|
+
без вершины главной и чужую почту в подписи. На пуше те же проверки стоят дороже: основание
|
|
92
|
+
чинится вливанием с конфликтом, подпись — переписыванием ветки.
|
|
96
93
|
- **Судится то основание, которое названо командой, а не вершина рабочей копии.** Ветку заводят и
|
|
97
94
|
от `origin/main` прямо — этой командой основание как раз и берут свежим. Основание, о котором
|
|
98
95
|
дерево ничего не знает, не судится вовсе.
|
|
@@ -105,14 +102,14 @@ flowchart TD
|
|
|
105
102
|
вызове и называет, где ключ задаётся. Умолчания нет намеренно: собранный из пустого значения
|
|
106
103
|
заголовок не совпадает ни с чем, и настоящее расхождение тонет среди ложных строк.
|
|
107
104
|
- **Заведённая задача подтверждается ответом очереди работ, а не выводом команды заведения.**
|
|
108
|
-
Напечатанный номер значит «вызов прошёл»:
|
|
109
|
-
|
|
105
|
+
Напечатанный номер значит «вызов прошёл»: задачу можно завести и не довести до борды.
|
|
106
|
+
Спрашивается очередь по номеру, и ответ читается колонкой и исполнителем.
|
|
110
107
|
- **Видимость заведённого проверяется той стороной, которой оно предназначено.** Заявку читает
|
|
111
108
|
человек, задачу — очередь работ, и оба читают не тем токеном, которым заводили: ограниченная
|
|
112
109
|
запись отвечает им «не найдено», а заводившей — успехом.
|
|
113
|
-
- **Отказ читается прежде, чем его обходят вторым способом.** Он бывает
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
- **Отказ читается прежде, чем его обходят вторым способом.** Он бывает ранним признаком
|
|
111
|
+
ограничения записи, и обход другим вызовом уносит признак с собой: расхождение всплывает у
|
|
112
|
+
владельца. Ограничение от исчерпания отличает ответ о пределах — там ноль.
|
|
116
113
|
- **Номер ветки и номер в заголовке PR сверяются на месте, а состояние задачи — по борде.**
|
|
117
114
|
Формат читается из текста команды и работает без сети; задача, колонка, исполнитель и разбор —
|
|
118
115
|
только когда есть чем спросить. Нет сети или токена — второй ярус молча пропускается.
|
|
@@ -125,34 +122,43 @@ flowchart TD
|
|
|
125
122
|
- **На борде стоят задачи, а не PR о них.** Карточка PR колонки не имеет, из очереди не уходит и
|
|
126
123
|
остаётся навсегда; заводит её правило борды или рука, и то и другое выключается. Находит такие
|
|
127
124
|
карточки сверка очереди — строкой на каждую.
|
|
128
|
-
- **Отставшая колонка находится сверкой очереди, а не глазами.**
|
|
129
|
-
стороны: открытый PR при задаче не в разборе и разбор без открытого PR
|
|
130
|
-
|
|
125
|
+
- **Отставшая колонка находится сверкой очереди, а не глазами.** Она судит колонку по PR в обе
|
|
126
|
+
стороны: открытый PR при задаче не в разборе и разбор без открытого PR. Момента, когда задачу
|
|
127
|
+
берут в работу, ей не видно: ветки на борде нет.
|
|
128
|
+
- **Ветка с открытой заявкой отстаёт от главной молча.** Основание гард судит раз, в минуту
|
|
129
|
+
открытия, а влитого после не видит и прогон. Отставание считает сверка очереди работ.
|
|
130
|
+
- **Связь задачи с эпиком сверка читает в обе стороны.** Односторонняя привязка выглядит целой
|
|
131
|
+
так же, как двусторонняя: читатель приходит то от замысла эпика, то от карточки. Держалась она
|
|
132
|
+
подражанием — тело с образца соседней задачи везло строку вместе с формой.
|
|
131
133
|
- **Задачи, чинящиеся одной правкой, сливаются до мержа.** Вторая стирается вместе с номером, а
|
|
132
|
-
недостающее дописывается в
|
|
134
|
+
недостающее дописывается в первую: после мержа ветка въехала целиком.
|
|
133
135
|
- **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка на
|
|
134
136
|
борде и строка о заходах в замысле эпика говорят одно и то же двум читателям. Помечается только
|
|
135
137
|
то, что законно не делится.
|
|
136
138
|
- **Вершина открытого PR без прогона видна сверкой очереди работ.** Страница без прогона выглядит
|
|
137
|
-
так же, как с зелёным: цвета нет ни там, ни там. Сверка спрашивает вершину,
|
|
138
|
-
|
|
139
|
-
- **Прогон, вытесненный из очереди конвейера, сверка называет отдельной строкой.**
|
|
140
|
-
|
|
141
|
-
- **Готовность отданной работы живёт до следующего слияния в главную.** Влитая соседняя делает
|
|
142
|
-
свою конфликтующей. После каждого слияния сливаемость своих заявок спрашивается заново — одним
|
|
143
|
-
вызовом на все.
|
|
139
|
+
так же, как с зелёным: цвета нет ни там, ни там. Сверка спрашивает вершину, считает сам факт
|
|
140
|
+
прогона, а не цвет, и свежей вершине даёт время.
|
|
141
|
+
- **Прогон, вытесненный из очереди конвейера, сверка называет отдельной строкой.** Он выглядит
|
|
142
|
+
упавшим, хотя ветку не проверял; отличает их число заданий — у него ноль.
|
|
144
143
|
- **Черновик при зелёном прогоне на вершине — расхождение сверки.** Зелёная страница черновика
|
|
145
|
-
владельцу ничего не разрешает: кнопка заблокирована хостингом.
|
|
146
|
-
между ходами
|
|
144
|
+
владельцу ничего не разрешает: кнопка заблокирована хостингом. Внутри хода это закрывает гард,
|
|
145
|
+
между ходами — сверка.
|
|
147
146
|
- **Свои черновики судятся все разом, а не тот один, чья ветка сейчас взята.** Каждый черновик
|
|
148
147
|
машинной записи судится двумя признаками — зелёный прогон на его вершине и разобранная папка
|
|
149
148
|
задачи в его ветке; лежащая папка означает идущую работу.
|
|
150
|
-
- **Открытие PR отбивается, пока ветка везёт папку своей задачи.**
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
- **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Кнопку слияния нажимает
|
|
150
|
+
человек там, где гардов нет, и открытие — последняя точка, где отказ ещё виден тому, кто может
|
|
151
|
+
его выполнить.
|
|
152
|
+
- **Свои открытые заявки перечитываются в трёх местах: перед пушем, при взятии задачи и после
|
|
153
|
+
каждого известного слияния.** Заявка устаревает без действия автора: влита соседняя работа —
|
|
154
|
+
остальные в ту же секунду отстали. Приём — `git-workflow-freshness`.
|
|
155
|
+
- **Конфликтующая своя заявка чинится первым действием хода, а новая работа до этого не
|
|
156
|
+
берётся.** Пока отданное конфликтует, влить его человек не может, и каждая следующая заявка
|
|
157
|
+
прибавляет к очереди ещё одну, которую придётся догонять. Работой здесь считается заведение
|
|
158
|
+
задачи, заведение ветки, перевод колонки в работу и открытие заявки; всё, чем конфликт чинится,
|
|
159
|
+
идёт как прежде.
|
|
153
160
|
- **Конфликтующий открытый PR — расхождение сверки очереди работ.** Конфликт приезжает чужим
|
|
154
|
-
|
|
155
|
-
внутри самого PR. Непосчитанная сливаемость расхождением не считается.
|
|
161
|
+
слиянием и по списку не виден: метку хостинг показывает только внутри самого PR.
|
|
156
162
|
- **Документ едет в том же коммите, что и правка.** Обход — строка `Docs-skip: <причина>` в теле
|
|
157
163
|
коммита; пустая причина не принимается.
|
|
158
164
|
- **Заголовок коммита сверяется с форматом на месте.** Разобранный по типу и области заголовок
|
|
@@ -165,26 +171,25 @@ flowchart TD
|
|
|
165
171
|
- **Набор гейта пуша не бывает уже набора конвейера.** Гейт — обещание, что пуш не приедет
|
|
166
172
|
красным. Шаг конвейера, которому в наборе гейта нет ни строки, ни объявленного исключения с
|
|
167
173
|
причиной, отбивает пуш, а не печатается рядом: предупреждение читается как разрешение.
|
|
168
|
-
- **Набор гейта зовёт умолчание пакета, а не перечисляет его строками.** Переписанный строками,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
каждого рода.
|
|
174
|
+
- **Набор гейта зовёт умолчание пакета, а не перечисляет его строками.** Переписанный строками, он
|
|
175
|
+
закрывает сегодняшнюю дыру и оставляет завтрашнюю: заведённая пакетом проверка до дерева не
|
|
176
|
+
доедет. Отсеивать из умолчания законно, но поимённо и с причиной.
|
|
172
177
|
|
|
173
|
-
- **Причина исключения, называющая задачу, судится на живость этой задачи.** Мёртвый номер
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
- **Сверка раскладки стоит в наборе гейта пуша наравне с линтом и сборкой.** Правка мимо
|
|
177
|
-
|
|
178
|
-
|
|
178
|
+
- **Причина исключения, называющая задачу, судится на живость этой задачи.** Мёртвый номер делает
|
|
179
|
+
исключение бессрочным, не сказав об этом ни строкой. Спрашивается тем же ярусом, что состояние
|
|
180
|
+
задачи у гарда: нет сети или доступа — пропускает молча.
|
|
181
|
+
- **Сверка раскладки стоит в наборе гейта пуша наравне с линтом и сборкой.** Правка мимо источника
|
|
182
|
+
копится молча: раскладка отказывает по правленому файлу целиком. Статьёй выше это не покрывается —
|
|
183
|
+
сверки нет в конвейере.
|
|
179
184
|
- **После вливания главной ветки набор проверок пересматривается по тому, что ветка везёт
|
|
180
185
|
теперь.** Вливание меняет состав правки: проверять по тому, что правил автор, — значит
|
|
181
186
|
проверять половину, а отвечает ветка целиком.
|
|
182
187
|
- **Утверждение о главной ветке делается по удалённой ссылке, а не по локальной.** Локальная
|
|
183
|
-
протухает в
|
|
184
|
-
целиком:
|
|
185
|
-
- **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка
|
|
186
|
-
|
|
187
|
-
|
|
188
|
+
протухает в минуту, когда её подтянули, и молчит об этом. Сравнение пишется от `origin/main`
|
|
189
|
+
целиком: смешанные в одной команде, они дают промах, изнутри выглядящий верным.
|
|
190
|
+
- **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка во входящие не
|
|
191
|
+
приходит и обсуждения не имеет: до открытия PR правки для человека нет. Открывается он тем же
|
|
192
|
+
ходом, которым исполнитель говорит, что работу отдаёт.
|
|
188
193
|
- **Не готовое к слиянию открывается черновиком — `gh pr create --draft`.** Кнопка слияния у
|
|
189
194
|
черновика заблокирована хостингом, поэтому «выложено на обозрение» и «можно вливать» перестают
|
|
190
195
|
выглядеть одинаково. Черновиком идёт всё, что ждёт прогона, доработки или ответа на вопрос.
|
|
@@ -192,13 +197,11 @@ flowchart TD
|
|
|
192
197
|
готовность: проверки пройдены, доработок не осталось, работа сходится с задачей. Снятие
|
|
193
198
|
черновика и просьба влить — один ход, а не два разных дня.
|
|
194
199
|
- **Черновик не снимается с ветки, которая не сливается.** Зелёный прогон говорит «не сломано»,
|
|
195
|
-
сливаемость — «кнопку можно нажать», и владельцу нужно второе. Спрашивается у
|
|
196
|
-
`mergeable
|
|
197
|
-
выводится.
|
|
200
|
+
сливаемость — «кнопку можно нажать», и владельцу нужно второе. Спрашивается у хостинга полем
|
|
201
|
+
`mergeable`; из локального вливания она не выводится.
|
|
198
202
|
- **Указателю, в который ветки только дописывают строки, объявляется сложение обеих сторон.**
|
|
199
|
-
Конфликт там не спор: обе допись нужны целиком.
|
|
200
|
-
|
|
201
|
-
хостинг.
|
|
203
|
+
Конфликт там не спор: обе допись нужны целиком. Метку сливаемости объявление **не гасит** — она
|
|
204
|
+
гаснет, когда ветка вобрала главную и это уехало на хостинг.
|
|
202
205
|
- **Правка, доведённая до коммита, доводится до хостинга тем же ходом.** Владелец видит прежнее
|
|
203
206
|
состояние и читает его как «не сделано ничего», а сделанное лежит там, где его не видит никто.
|
|
204
207
|
Оставшееся в дереве называется причиной — словом владельца, а не списком остатков.
|
|
@@ -212,42 +215,37 @@ flowchart TD
|
|
|
212
215
|
приходит окружением, и в тексте команды её видно только явной подстановкой токена. Ответ
|
|
213
216
|
хостинга об авторе гард спрашивает на снятии черновика: влитую заявку не переоткрыть.
|
|
214
217
|
|
|
215
|
-
- **Автор PR не может быть его ревьювером.** Запрос разбора на
|
|
216
|
-
|
|
217
|
-
отзыв не от автора.
|
|
218
|
+
- **Автор PR не может быть его ревьювером.** Запрос разбора на себя GitHub принимает и молча не
|
|
219
|
+
создаёт: разбор выглядит запрошенным. Считаются только запрос и отзыв не от автора.
|
|
218
220
|
- **Вызов клиента хостинга идёт из дерева, а связка команд исхода не проверяет.** Репозиторий
|
|
219
221
|
клиент берёт у текущего каталога и вне дерева отказывает; следующее звено связки увозит на
|
|
220
222
|
хостинг то, что осталось от отказавшего, поэтому тело читается обратно тем же ходом.
|
|
221
|
-
- **Метки, исполнитель и ревьювер PR ставятся вызовами `gh api`, а не `gh pr edit`.** На
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
- **Сценарии гардов задают настройки git сами, а не берут их с машины.** Включённая на машине
|
|
233
|
-
подпись уводит git в агент ключей, а заблокированный агент роняет весь набор — со стороны это
|
|
234
|
-
выглядит сломанным гардом. Автор, почта и подпись передаются флагами `-c` прямо в команду.
|
|
223
|
+
- **Метки, исполнитель и ревьювер PR ставятся вызовами `gh api`, а не `gh pr edit`.** На старой
|
|
224
|
+
борде `gh pr edit` отвечает отказом про Projects.
|
|
225
|
+
- **Борда правится запросом GraphQL по идентификатору борды, а не по имени владельца.**
|
|
226
|
+
- **Почта машинного коммита копируется из компаньона, а не набирается по памяти.** Служебный адрес
|
|
227
|
+
`<число>+<логин>@users.noreply.github.com` сопоставляется по числу: коммит с чужим числом уезжает
|
|
228
|
+
подписанным посторонним. Ту же строку держит профиль дерева, и гард отбивает пуш.
|
|
229
|
+
- **Личность машинной записи подтверждается ответом хостинга, а не узнаванием строки.** Спрашивают
|
|
230
|
+
её токеном, ответом о себе: логин и число приходят вместе.
|
|
231
|
+
- **Сценарии гардов задают настройки git сами, а не берут их с машины.** Подпись, включённая на
|
|
232
|
+
машине, уводит git в агент ключей, а заблокированный агент роняет весь набор: автор, почта и
|
|
233
|
+
подпись идут флагами `-c` прямо в команде.
|
|
235
234
|
|
|
236
235
|
- **Каждый коммит вклада ветки подписан машинной записью, и это проверяется набором пуша.** Гард
|
|
237
|
-
|
|
238
|
-
|
|
236
|
+
судит только коммит, назвавшийся ею; подписанный человеком проходит мимо, а там, где человек не
|
|
237
|
+
коммитит вовсе, это промах.
|
|
239
238
|
- **Состояние заявки перечитывается у хостинга сразу после публикации, а не берётся из кода
|
|
240
|
-
возврата.** Открытие
|
|
241
|
-
или не сделали ничего.
|
|
239
|
+
возврата.** Открытие и постановка ревьювера отвечают нулём и тогда, когда не сделали ничего.
|
|
242
240
|
- **Автор открытой заявки и наличие у неё ревьювера сверяются очередью работ.** До слияния оба
|
|
243
|
-
промаха не
|
|
244
|
-
|
|
245
|
-
- **Ревьюверы спрашиваются вызовом REST, а не выборкой клиента.** Её поля
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
-
|
|
249
|
-
|
|
250
|
-
|
|
241
|
+
промаха не видны: заявка, открытая человеком, ревьювера не получит никогда, и выглядит это как
|
|
242
|
+
заявка, которой его просто не поставили.
|
|
243
|
+
- **Ревьюверы спрашиваются вызовом REST, а не выборкой клиента.** Её поля собирает GraphQL, а он
|
|
244
|
+
требует прав, которых у машинной записи нет: «сошлось» не отличить от «спросить было нечем».
|
|
245
|
+
|
|
246
|
+
- **Рабочее дерево не опустошается ради прогона инструмента.** Сравнение с прежним состоянием
|
|
247
|
+
идёт на второй копии: прятанье уводит незакоммиченную работу туда, где её не видит ни состояние
|
|
248
|
+
дерева, ни сверка.
|
|
251
249
|
|
|
252
250
|
## Чего из закона здесь нет
|
|
253
251
|
|
|
@@ -270,3 +268,4 @@ flowchart TD
|
|
|
270
268
|
- `git-workflow-pr` — открытие PR, черновик и его снятие, тело, ревьювер, метки, состояние.
|
|
271
269
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
272
270
|
- `git-workflow-stack` — череда веток: ветвление от предыдущей, основание заявки, порядок отдачи.
|
|
271
|
+
- `git-workflow-freshness` — свои открытые заявки: чтение всех разом, отставание против спора.
|
|
@@ -20,7 +20,8 @@ description: Правило под «Закон о поставке» для д
|
|
|
20
20
|
| В законе | Здесь |
|
|
21
21
|
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
22
22
|
| главная ветка | `main` |
|
|
23
|
-
| отдельная ветка | `<КЛЮЧ>-<номер задачи>-<короткий-slug
|
|
23
|
+
| отдельная ветка | `<КЛЮЧ>-<номер задачи>-<короткий-slug>`. Имя без номера (`feat/…`, `fix/…`) законно, пока ветка живёт локально: MR с неё не откроется |
|
|
24
|
+
| ключ задач | короткое слово, которым дерево зовёт свои задачи; задаётся ключом `board.taskKey` в `.claude/rt-kit/checks.json`, а в `implementation.md` называется для читателя |
|
|
24
25
|
| задача | issue проекта, заголовок `[<КЛЮЧ>-<номер>] <Что не так>`, исполнитель — учётная запись машинной работы; MR прикрепляется к нему строкой `Closes #<номер>` в описании |
|
|
25
26
|
| очередь работ | доска задач проекта — Issue Board. Задача попадает на неё меткой списка, а не самим фактом заведения: доска показывает те issue, чью метку знает |
|
|
26
27
|
| состояние задачи в очереди работ | список доски, за которым стоит метка: заведённая, взятая в работу, ждущая разбора. Имена меток — в `implementation.md`; закрытая задача уходит из очереди слиянием, а не переносом в последний список |
|
|
@@ -133,9 +134,16 @@ flowchart TD
|
|
|
133
134
|
- **Отставший список находится сверкой очереди, а не глазами.** Сверка судит список по PR
|
|
134
135
|
в обе стороны: открытый MR при задаче не в разборе и разбор без открытого MR — оба
|
|
135
136
|
расхождения. Момента, когда задачу берут в работу, ей не видно: ветки на доске нет.
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
- **Ветка с открытой заявкой отстаёт от главной молча.** Гард судит основание один раз — в
|
|
138
|
+
минуту открытия; всё, что влилось в главную, пока шёл прогон, зелёный прогон не видит вовсе, и
|
|
139
|
+
влитая оттуда заявка приносит в главную ветку сочетание, которое не проверял никто. Отставание
|
|
140
|
+
находит сверка очереди работ: она спрашивает у хранилища, на сколько коммитов ветка каждой
|
|
141
|
+
открытой заявки позади главной, и называет число.
|
|
142
|
+
- **Задачи, чинящиеся одной правкой, сливаются до слияния ветки.** Вторая закрывается как
|
|
143
|
+
дубликат со ссылкой на поглотившую, а недостающее из неё дописывается в первую. Закон велит
|
|
144
|
+
вторую стереть — здесь это объявленное отступление: стереть задачу хостинг не даёт вовсе, а её
|
|
145
|
+
номер остаётся в истории, и ссылка из чужого коммита ведёт в закрытую задачу, а не в пустоту.
|
|
146
|
+
После слияния слить уже нельзя: ветка въехала, и откатывается она целиком.
|
|
139
147
|
- **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка
|
|
140
148
|
на доске и строка о заходах с передачей в замысле эпика говорят одно и то же двум читателям:
|
|
141
149
|
исполнитель открывает карточку раньше, чем замысел эпика, а планирует по замыслу. Одна пометка без
|
package/assets/rules/lists.md
CHANGED
|
@@ -83,6 +83,11 @@ flowchart TD
|
|
|
83
83
|
- **Недоступное сейчас действие в меню строки не рисуется вовсе.** Пункт заводится под `@if` по
|
|
84
84
|
полю строки, а не выключенным: выключенный пункт перечисляет владельцу запреты вместо того,
|
|
85
85
|
что он может сделать, и набор их меняется от строки к строке.
|
|
86
|
+
- **Необратимое действие спрашивает подтверждение готовым приёмом, а не своим окном.** Пункт
|
|
87
|
+
меню несёт признак опасного и пару полей подтверждения — заголовок и текст с последствием, — а
|
|
88
|
+
окно берёт набор. Правило, молчавшее об этом, стоило владельцу выбора из трёх вариантов, среди
|
|
89
|
+
которых был свой компонент окна в новой либе: ответ лежал в паттерне, и туда исполнитель не
|
|
90
|
+
дошёл. Поля названы в паттерне `admin-lists-screen`.
|
|
86
91
|
- **Кнопка меню не показывается, если у строки не осталось доступных действий.** За это
|
|
87
92
|
отвечает вход `[rowHasActions]` — предикат по строке; считать по содержимому меню нельзя,
|
|
88
93
|
спроецированный шаблон известен только после отрисовки.
|
|
@@ -168,3 +168,7 @@ flowchart TD
|
|
|
168
168
|
Она работает по имени ключа, и голое значение мимо неё проходит вовсе, — но ключ, который сам
|
|
169
169
|
числится свободным текстом, увозит тело в хранилище отметкой о вычистке целиком. Новая
|
|
170
170
|
обёртка сверяется со списками ключей до того, как её так назвали.
|
|
171
|
+
- **Предохранитель повтора, чей ключ собран из того, чем меряют время, не срабатывает никогда.**
|
|
172
|
+
При равенстве такта разбора и ширины ведёрка каждый разбор видит пустой замок и шлёт заново.
|
|
173
|
+
Со стороны это выглядит работающим: предохранитель объявлен, привязка сходится, письма уходят
|
|
174
|
+
каждый час. Ключ берётся от предмета оповещения, а не от отрезка времени, которым его считают.
|
|
@@ -53,6 +53,12 @@ flowchart TD
|
|
|
53
53
|
опирается, названо в именах дерева.
|
|
54
54
|
- **Работа начинается с чтения готового, а не с чистого файла.** Сначала находится опора —
|
|
55
55
|
компонент кита, базовый класс, образец в соседнем домене, — потом пишется своё поверх неё.
|
|
56
|
+
- **Значение интеграции берётся тем же путём, что и соседнее значение той же интеграции.**
|
|
57
|
+
Половина интеграции, сделанная как положено, — готовый образец, и стоит он не в чужом домене,
|
|
58
|
+
а строкой выше: рядом с зашитым в код идентификатором карты жил её же ключ, приходящий
|
|
59
|
+
внедрением. Расхождение соседей — это вопрос «почему один параметр сделан, а второй нет», а не
|
|
60
|
+
выбор между тремя способами починить второй. Не ловится оно ничем: значение синтаксически
|
|
61
|
+
исправно, линт и сборка зелены, а сверка повторов пару констант под свои признаки не берёт.
|
|
56
62
|
- **Свой примитив и своя основа заводятся только с явного одобрения владельца.** Спрашивается
|
|
57
63
|
это до того, как написан первый файл.
|
|
58
64
|
- **Панель правки записи наследует общую основу, а не собирается своей разметкой.** Тогда она
|