@rt-tools/agent-kit 0.22.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-long-work.github.mjs +101 -0
- package/assets/checks/board-runs.github.mjs +34 -0
- package/assets/checks/board.github.mjs +1 -1
- package/assets/checks/check-board.github.mjs +30 -2
- 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/checks/check-reuse.mjs +4 -1
- package/assets/checks/check-schema-drift.mjs +65 -6
- package/assets/checks/rt-kit-checks.config.mjs +13 -0
- package/assets/checks/signals.mjs +41 -1
- package/assets/commands/next-session.md +16 -5
- package/assets/defaults/gate-map.sh +13 -0
- package/assets/defaults/project.sh +26 -0
- package/assets/defaults/shell.sh +18 -3
- package/assets/hooks/browser-guard-device-id.sh +42 -12
- package/assets/hooks/browser-guard-no-asking.sh +5 -1
- 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 +64 -122
- package/assets/hooks/git-guard-main.sh +39 -4
- package/assets/hooks/git-guard-push-tests.sh +71 -3
- package/assets/hooks/glossary-load.sh +23 -2
- package/assets/hooks/grill-gate.sh +62 -0
- 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/autonomous-work.md +30 -0
- package/assets/laws/project-documentation.md +8 -0
- package/assets/laws/verifiability.md +12 -2
- package/assets/laws/work-conduct.md +59 -65
- package/assets/patterns/autonomous-work-run.md +105 -0
- package/assets/patterns/browser-verification-measure.md +41 -1
- package/assets/patterns/browser-verification-stand.md +57 -16
- package/assets/patterns/doc-style-human.md +75 -0
- package/assets/patterns/doc-style-write.md +16 -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/git-workflow-pr-ready.md +93 -0
- 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/task-flow-start.md +48 -48
- package/assets/patterns/testing-e2e.md +18 -8
- package/assets/patterns/ts-procedure.md +3 -2
- package/assets/pitfalls/task-flow.md +40 -40
- package/assets/rules/autonomous-work.md +92 -0
- package/assets/rules/browser-verification.md +35 -3
- package/assets/rules/deploy-flow.azure.md +7 -0
- package/assets/rules/deploy-flow.github.md +7 -0
- package/assets/rules/deploy-flow.gitlab.md +7 -0
- package/assets/rules/doc-style.md +54 -0
- package/assets/rules/git-workflow.azure.md +8 -0
- package/assets/rules/git-workflow.github.md +59 -63
- package/assets/rules/git-workflow.gitlab.md +8 -0
- package/assets/rules/reuse-first.md +25 -5
- package/assets/rules/styling-bem.md +8 -1
- package/assets/rules/task-flow.md +108 -109
- package/assets/rules/testing.md +21 -0
- package/assets/skills/agent-kit.md +72 -82
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +69 -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/push-gate.d.ts +14 -0
- package/lib/push-gate.d.ts.map +1 -0
- package/lib/push-gate.js +93 -0
- package/lib/push-gate.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/assets/laws/application/access.md +0 -34
- package/assets/laws/application/locales.md +0 -33
- package/assets/laws/application/search-visibility.md +0 -24
- package/assets/patterns/permissions-procedure.md +0 -71
- package/assets/patterns/seo-page.md +0 -104
- package/assets/patterns/seo-verify.md +0 -83
- package/assets/patterns/translations-content.md +0 -107
- package/assets/patterns/translations-key.md +0 -64
- package/assets/rules/permissions.md +0 -116
- package/assets/rules/seo.md +0 -139
- package/assets/rules/translations.md +0 -96
- package/rt-tools-agent-kit-0.22.0.tgz +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: autonomous-work
|
|
3
|
+
kind: rule
|
|
4
|
+
law: autonomous-work
|
|
5
|
+
description: Правило под «Закон об автономном заходе». Брать, когда владелец ушёл и просил работать самостоятельно: череда веток, умолчание вместо вопроса, местная работа без отдачи наружу, список сделанного к утру. Паттерн autonomous-work-run. Ход одной работы — правило task-flow.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Автономный заход — как это устроено здесь
|
|
9
|
+
|
|
10
|
+
Правило под закон `docs/constitution/autonomous-work.md`. Закон говорит, что должно быть верно,
|
|
11
|
+
когда владельца нет рядом; здесь — чем это названо в дереве и что меняется в обычном ходе
|
|
12
|
+
работы. Сам ход работы — правило `task-flow`, конец хода — `turn-conduct`, поставка —
|
|
13
|
+
`git-workflow`: автономный заход их не отменяет, а сужает.
|
|
14
|
+
|
|
15
|
+
## Как это называется здесь
|
|
16
|
+
|
|
17
|
+
| В законе | Здесь |
|
|
18
|
+
| ----------------------------- | ---------------------------------------------------------------------------- |
|
|
19
|
+
| автономный заход | просьба владельца работать без него, названная словами и границей по времени |
|
|
20
|
+
| умолчание вместо вопроса | строка «Решения» в разборе просьбы: принятое, довод и цена ошибки |
|
|
21
|
+
| работа, видная снаружи | пуш ветки, открытие заявки, слияние, публикация пакета, отправка груза |
|
|
22
|
+
| череда | ветка каждой следующей работы заводится от ветки предыдущей |
|
|
23
|
+
| список к утру | последняя реплика захода: работа, ветка, чем подтверждена, чего ждёт |
|
|
24
|
+
| отложенная работа | задача, которой нужно слово владельца: состояние на борде не двигается |
|
|
25
|
+
|
|
26
|
+
## Где это лежит
|
|
27
|
+
|
|
28
|
+
В этом дереве — таблица в `implementation.md` рядом: чем объявляется автономный заход, где
|
|
29
|
+
ведётся список к утру и какой ключ у задач череды. Пути живут там, а не здесь: правило
|
|
30
|
+
переносится между репозиториями, а раскладка у каждого дерева своя.
|
|
31
|
+
|
|
32
|
+
## Ход
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
A[Владелец объявил автономный заход] --> B[Берётся задача из очереди работ]
|
|
37
|
+
B --> C{Нужно слово владельца}
|
|
38
|
+
C -->|Да| D[Задача откладывается целиком, довод пишется в список к утру]
|
|
39
|
+
C -->|Нет| E[Ветка заводится от предыдущей работы, а не от главной]
|
|
40
|
+
E --> F[Папка задачи, разбор просьбы с умолчаниями, замысел]
|
|
41
|
+
F --> G[Работа этапами; каждый этап кончается коммитом]
|
|
42
|
+
G --> H{Признак готовности проверяется командой}
|
|
43
|
+
H -->|Нет команды| D
|
|
44
|
+
H -->|Есть| I[Прогон; красное чинится в той же ветке]
|
|
45
|
+
I --> J[Папка задачи разбирается в описание прошлого]
|
|
46
|
+
J --> K{Ночь не кончилась}
|
|
47
|
+
K -->|Да| B
|
|
48
|
+
K -->|Нет| L[Список к утру: что сделано, где лежит, чем подтверждено, чего ждёт]
|
|
49
|
+
D --> K
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Как закон применяется здесь
|
|
53
|
+
|
|
54
|
+
- **Ветка следующей работы заводится от предыдущей, а не от главной.** Первая — от главной,
|
|
55
|
+
каждая следующая — от вершины прошлой: `git checkout -b <ключ>-<номер>-<slug> <прошлая ветка>`.
|
|
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
|
+
- `autonomous-work-run` — готовый цикл ночи: череда веток, запись умолчания, список к утру,
|
|
83
|
+
разбор отказа стража.
|
|
84
|
+
|
|
85
|
+
## Ловушки
|
|
86
|
+
|
|
87
|
+
- **Ветка, заведённая от главной по привычке, ломает череду.** Заметно это только у владельца и
|
|
88
|
+
только на втором вливании; чинится перезаведением ветки, пока работа не ушла далеко.
|
|
89
|
+
- **Задача, отложенная без строки в списке, теряется.** Утром её не видно ни на борде, ни в
|
|
90
|
+
ветках: она выглядит просто не взятой.
|
|
91
|
+
- **Умолчание, записанное в теле коммита, до владельца не доходит.** Он читает список и папку
|
|
92
|
+
задачи, а не историю ветки.
|
|
@@ -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
|
- **Экран, закрытый входом, проверяется стендом с подменённым ответом входа, а не живой учётной
|
|
@@ -86,16 +90,37 @@ flowchart TD
|
|
|
86
90
|
стенд; признак, которым закрыт экран, приходит подменённым профилем. Просьба к человеку сделать
|
|
87
91
|
шаг проверки — набрать пароль, открыть вкладку, нажать кнопку — означает неверно выбранный
|
|
88
92
|
путь, а не нехватку прав у исполнителя.
|
|
93
|
+
- **Правка числа элементов в контейнере — это правка раскладки.** Стили она не трогает, и потому
|
|
94
|
+
читается как правка разметки, а проверка сводится к кодам ответа: страницы отвечают на всех
|
|
95
|
+
локалях, а документ уже вдвое шире вьюпорта. Закрывается она замером — ширина документа против
|
|
96
|
+
ширины вьюпорта на узком экране, — а не взглядом на снимок: снимок показывает то, что влезло в
|
|
97
|
+
кадр. Ряд без переноса и без узкой раскладки, выросший с четырёх элементов до восьми, продержал
|
|
98
|
+
боковую прокрутку на каждой странице сайта сорок четыре минуты прода.
|
|
89
99
|
- **Замер делается на самом длинном значении, а не на образцовом.** Наезд, вылезание за край и
|
|
90
100
|
обрезка без признака видны только там, где содержимое в своё место не влезает; на коротком
|
|
91
101
|
значении всё три выглядят исправными. Значение для замера берётся предельное — то, какое узел
|
|
92
102
|
может получить у настоящего потребителя, а не то, какое стоит в примере.
|
|
93
|
-
- **Готовое из набора, взятое под
|
|
103
|
+
- **Готовое из набора, взятое под значения другого размера, меряется, а не разглядывается.**
|
|
94
104
|
Компонент, живший там, где значения короткие, в новом месте получает значение вчетверо
|
|
95
105
|
длиннее — и ведёт себя иначе, оставаясь тем же кодом. Спека этого не видит вовсе: обрезка
|
|
96
106
|
браузером в разметке не отражается, и текст приходит из неё целым.
|
|
107
|
+
- **Прокси стенда подставляет то, по чему приложение узнаёт арендатора запроса.** Дерево, которое
|
|
108
|
+
держит несколько организаций за одним приложением, узнаёт их по заголовку, а сервер отрисовки
|
|
109
|
+
кладёт туда свой хост: приложение отвечает отказом на каждый вызов. Снаружи это страница «не
|
|
110
|
+
найдено» — выглядит как дефект кода, а не стенда. Замер тремя заголовками на одном стенде: свой
|
|
111
|
+
хост с портом — отказ, свой хост без порта — отказ, имя арендатора — страница. Отличает одно от
|
|
112
|
+
другого подстановка заголовка, а не чтение кода.
|
|
97
113
|
- **Прод-конфигурация проверяется только за настоящим прокси.** Голый сервер отдачи страниц
|
|
98
114
|
про кэш, перенаправления и заголовки не знает ничего.
|
|
115
|
+
- **Показанное человеку собрано из той работы, о которой идёт речь.** Стенд собирается с ветки
|
|
116
|
+
этой правки, а не с той, на которой стоит исполнитель: сборка с чужой ветки показывает дерево
|
|
117
|
+
без правки, и человек читает это как «не сделано». Сказанное о показанном называет ветку, с
|
|
118
|
+
которой оно собрано. Один такой показ стоил двух ходов: владелец повторил замечание, по
|
|
119
|
+
которому правка давно сделана, а исполнитель взялся объяснять уже исправленный дефект.
|
|
120
|
+
- **Ветка работы держит вершину главной влитой всё время, а не только перед отдачей.** Отставшая
|
|
121
|
+
ветка собирается в стенд, на котором нет ни чужих правок, ни своих соседних, и показанное на
|
|
122
|
+
нём описывает дерево, которого нет ни у кого. Вершина подтягивается, когда о её движении стало
|
|
123
|
+
известно, а не когда работа кончилась.
|
|
99
124
|
- **Первый заход на публичный экран метится признаком служебного посещения.** Драйвер водит
|
|
100
125
|
обычный браузер, и счётчик посещений не отличает проверку от гостя: `navigator.webdriver` у
|
|
101
126
|
него `false`, строка `User-Agent` — живого браузера. Чем метится заход, сказано в именах
|
|
@@ -115,7 +140,14 @@ flowchart TD
|
|
|
115
140
|
«что тут происходит», а не подтверждает известное число. Вывод «замер снять нечем», сделанный
|
|
116
141
|
на закрытом входе, чаще всего означает, что искали не тем.
|
|
117
142
|
|
|
118
|
-
|
|
143
|
+
- **Замер снимается до показа работы владельцу, а не после его замечания.** Показанное без
|
|
144
|
+
замера — заявка на проверку, а не проверка: на снимке слипшиеся вплотную карточки читаются как
|
|
145
|
+
одна с длинным содержимым, обрезанная тень — как её отсутствие, нулевой промежуток — как плотная
|
|
146
|
+
вёрстка. Каждый такой дефект виден одной командой замера. Числа, снятые с образца заранее,
|
|
147
|
+
сверяются с реализацией тем же ходом: работа по пересказу образца словами расходится с ним
|
|
148
|
+
незаметно.
|
|
149
|
+
|
|
150
|
+
Вывод о вёрстке подкрепляется числом: «выглядит нормально» результатом проверки не бывает.
|
|
119
151
|
Этого не стережёт ничто — как измерять, разобрано в паттерне `browser-verification-measure`.
|
|
120
152
|
|
|
121
153
|
## Чего из закона здесь нет
|
|
@@ -96,6 +96,13 @@ flowchart TD
|
|
|
96
96
|
тот, кто пушит.** Оно законно несёт след любой недоделанной ветки, и сверка с ним держала бы
|
|
97
97
|
чужую правку. Гейт и выкатка зовут одну и ту же проверку — иначе «сошлось» станет значить в
|
|
98
98
|
двух местах разное.
|
|
99
|
+
- **Пропуск сверки схемы законен, пока ветка не трогала хранилища.** Погашенная база — состояние
|
|
100
|
+
машины, а не повод отбить пуш документации; но ветка, правившая схему или миграции, без прогона
|
|
101
|
+
цепочки уезжает в главную вслепую, и падает не она, а выкатка. Проверка в такой ветке отказывает
|
|
102
|
+
и называет, чем базу поднять.
|
|
103
|
+
- **Упавшая выкатка видна сверкой очереди работ отдельно от отставшего прода.** Слияние — ещё не
|
|
104
|
+
выкатка: отказавшая оставляет главную ветку впереди сервера, и слияния поверх уедут туда же.
|
|
105
|
+
Отставание считается по последней успешной выкатке и «не запускали» от «упала» не отличает.
|
|
99
106
|
|
|
100
107
|
- **Проверка, стоящая в наборе гейта, отказывает, когда не сумела отработать.** «Проверять
|
|
101
108
|
негде» и «проверка сломана» — разные вещи: первое дерево называет само — нет предмета, не задан
|
|
@@ -123,6 +123,13 @@ flowchart TD
|
|
|
123
123
|
тот, кто пушит.** Оно законно несёт след любой недоделанной ветки, и сверка с ним держала бы
|
|
124
124
|
чужую правку. Гейт и выкатка зовут одну и ту же проверку — иначе «сошлось» станет значить в
|
|
125
125
|
двух местах разное.
|
|
126
|
+
- **Пропуск сверки схемы законен, пока ветка не трогала хранилища.** Погашенная база — состояние
|
|
127
|
+
машины, а не повод отбить пуш документации; но ветка, правившая схему или миграции, без прогона
|
|
128
|
+
цепочки уезжает в главную вслепую, и падает не она, а выкатка. Проверка в такой ветке отказывает
|
|
129
|
+
и называет, чем базу поднять.
|
|
130
|
+
- **Упавшая выкатка видна сверкой очереди работ отдельно от отставшего прода.** Слияние — ещё не
|
|
131
|
+
выкатка: отказавшая оставляет главную ветку впереди сервера, и слияния поверх уедут туда же.
|
|
132
|
+
Отставание считается по последней успешной выкатке и «не запускали» от «упала» не отличает.
|
|
126
133
|
|
|
127
134
|
- **Проверка, стоящая в наборе гейта, отказывает, когда не сумела отработать.** «Проверять
|
|
128
135
|
негде» и «проверка сломана» — разные вещи: первое дерево называет само — нет предмета, не задан
|
|
@@ -98,6 +98,13 @@ flowchart TD
|
|
|
98
98
|
тот, кто пушит.** Оно законно несёт след любой недоделанной ветки, и сверка с ним держала бы
|
|
99
99
|
чужую правку. Гейт и выкатка зовут одну и ту же проверку — иначе «сошлось» станет значить в
|
|
100
100
|
двух местах разное.
|
|
101
|
+
- **Пропуск сверки схемы законен, пока ветка не трогала хранилища.** Погашенная база — состояние
|
|
102
|
+
машины, а не повод отбить пуш документации; но ветка, правившая схему или миграции, без прогона
|
|
103
|
+
цепочки уезжает в главную вслепую, и падает не она, а выкатка. Проверка в такой ветке отказывает
|
|
104
|
+
и называет, чем базу поднять.
|
|
105
|
+
- **Упавшая выкатка видна сверкой очереди работ отдельно от отставшего прода.** Слияние — ещё не
|
|
106
|
+
выкатка: отказавшая оставляет главную ветку впереди сервера, и слияния поверх уедут туда же.
|
|
107
|
+
Отставание считается по последней успешной выкатке и «не запускали» от «упала» не отличает.
|
|
101
108
|
|
|
102
109
|
- **Проверка, стоящая в наборе гейта, отказывает, когда не сумела отработать.** «Проверять
|
|
103
110
|
негде» и «проверка сломана» — разные вещи: первое дерево называет само — нет предмета, не задан
|
|
@@ -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 -->
|
|
@@ -126,6 +133,19 @@ flowchart TD
|
|
|
126
133
|
строка в шапке дешевле правки всех ссылающихся записей и прошлого не трогает.
|
|
127
134
|
<!-- rt-when: *.md -->
|
|
128
135
|
|
|
136
|
+
- **Словарь правится там, откуда он собирается, а не там, где читается.** Он уезжает в контекст
|
|
137
|
+
каждой сессии целиком и оттого читается обычным документом дерева, а собран он раскладкой, как
|
|
138
|
+
всякий ресурс с шапкой: правка на месте живёт до следующей раскладки и пропадает молча, а до
|
|
139
|
+
тех пор раскладка отказывает по словарю целиком. Адрес надстройки называет компаньон правила, и
|
|
140
|
+
вводная, которую печатает хук запуска, выводит его из шапки сама.
|
|
141
|
+
<!-- rt-when: *.md -->
|
|
142
|
+
|
|
143
|
+
- **Раздел надстройки замещает одноимённый раздел набора целиком, а не дописывает в него.** Своё
|
|
144
|
+
слово поэтому кладётся в свой раздел, названный иначе, чем любой из разделов набора: положенное
|
|
145
|
+
в одноимённый, оно уносит с собой весь пакетный раздел, и потеря видна только тому, кто помнит,
|
|
146
|
+
что там стояло.
|
|
147
|
+
<!-- rt-when: *.md -->
|
|
148
|
+
|
|
129
149
|
- **Словарь работы и язык экрана — два разных словаря.** Слово, которым слой правил зовёт своё
|
|
130
150
|
понятие, для человека за экраном ничего не значит: он не читал ни одного правила и читать не
|
|
131
151
|
будет. Термин словаря в подписи кнопки, колонки или пустого состояния — это внутреннее слово,
|
|
@@ -156,6 +176,34 @@ flowchart TD
|
|
|
156
176
|
схема набрана словами и от текста рядом отличима только чтением.
|
|
157
177
|
<!-- rt-when: *.md -->
|
|
158
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
|
+
|
|
159
207
|
## Чего из закона здесь нет
|
|
160
208
|
|
|
161
209
|
Ни одна из формулировочных договорённостей не проверяется: одна фраза на правило, простые
|
|
@@ -163,6 +211,11 @@ flowchart TD
|
|
|
163
211
|
оставляет автору: открытый вопрос пишется теми же словами, что и обещание, а дата и номер —
|
|
164
212
|
такие же числа, как то, что пересчитывают.
|
|
165
213
|
|
|
214
|
+
Ответ владельцу не читает ни одна проверка, а промахи в нём те же, что в тексте дерева:
|
|
215
|
+
выдуманный факт, поданный наравне с проверенным, и оценка чужого решения вместо исполнения.
|
|
216
|
+
Ловит их только владелец — то есть уже прочитав. Правило действует на ответ так же, как на файл;
|
|
217
|
+
разница в том, что за файл отвечает гейт, а за ответ — автор.
|
|
218
|
+
|
|
166
219
|
На комментарии в коде правило распространяется, но гейтом не требуется: он зовёт его только
|
|
167
220
|
на `.md`. Расширять требование на каждый `.ts` значило бы шуметь на каждой правке, поэтому
|
|
168
221
|
здесь оно держится памятью автора — и цена этого видна: слова из левой колонки словаря живут
|
|
@@ -173,6 +226,7 @@ flowchart TD
|
|
|
173
226
|
|
|
174
227
|
- `doc-style-write` — как формулировать: примеры «так» и «не так», правила для комментариев.
|
|
175
228
|
- `doc-style-sweep` — разбор документа, накопившего список работ, на действующее и закрытое.
|
|
229
|
+
- `doc-style-human` — форма задачи, описания заявки и ответа владельцу: образцы «так» и «не так».
|
|
176
230
|
- `doc-style-trace` — обратный проход: закрытые задачи против текстов, поиск того, чего не
|
|
177
231
|
написали.
|
|
178
232
|
|
|
@@ -168,6 +168,10 @@ flowchart TD
|
|
|
168
168
|
отбивает пуш, а не печатается рядом с ним: напечатанное предупреждение исполнитель читает как
|
|
169
169
|
разрешение. Дважды подряд правка, прошедшая гейт целиком, была отбита конвейером — и оба раза
|
|
170
170
|
зелёный гейт был прочитан как «локально всё зелено».
|
|
171
|
+
- **Итоговый набор перед пушем читается разбором состояния, а не сборкой в уме.** Он собирается
|
|
172
|
+
из умолчания пакета и надстройки дерева, и прочитать сборку было нечем: раздел «набор перед
|
|
173
|
+
пушем» печатает его целиком, по команде на строку, а рядом называет то, что умолчание печатало,
|
|
174
|
+
а в набор не попало. Дерево, писавшее надстройку вслепую, дописывало в неё повтор.
|
|
171
175
|
- **Причина исключения, называющая задачу, судится на живость этой задачи.** Отсрочка со сроком
|
|
172
176
|
и отсрочка без срока выглядят одинаково, пока номер никто не спросил; мёртвый номер в причине
|
|
173
177
|
делает исключение бессрочным, не сказав об этом ни строкой. Спрашивается тем же ярусом, что
|
|
@@ -189,6 +193,10 @@ flowchart TD
|
|
|
189
193
|
сломана, она описывает вчерашний день. Сравнение веток пишется от `origin/main` целиком —
|
|
190
194
|
смешав в одной команде удалённую ссылку для одной стороны и локальную для другой, промах
|
|
191
195
|
изнутри выглядит правильным.
|
|
196
|
+
- **Удалённую ссылку берут не только слова, но и действия.** Основание новой ветки, счёт влитого
|
|
197
|
+
и подтягивание главной судятся по ней же: локальная — снимок последнего подтягивания, и работа,
|
|
198
|
+
начатая от неё, стартует от основания, которого в главной уже нет. Влитая ветка при ней числится
|
|
199
|
+
невлитой, и уборка кончается списком невлитого, которого нет.
|
|
192
200
|
- **Рабочий элемент привязывается к PR при создании, а не после.** `az repos pr create`
|
|
193
201
|
принимает `--work-items`; привязка второй командой обходится молча, когда у токена нет права
|
|
194
202
|
править чужой элемент, и PR остаётся ни с чем не связанным.
|
|
@@ -69,15 +69,15 @@ flowchart TD
|
|
|
69
69
|
за которой в очереди работ ничего не стоит. Заводится задача, и работа переносится в ветку с
|
|
70
70
|
её номером.
|
|
71
71
|
- **Главная ветка влита в ветку задачи до открытия PR.** Гард отбивает открытие, пока вершина
|
|
72
|
-
главной не стала предком
|
|
73
|
-
|
|
72
|
+
главной не стала предком текущей: иначе ревьювер видит свою правку вперемешку с чужой, а
|
|
73
|
+
проверено всё было от основания, которого уже нет.
|
|
74
74
|
- **Волна веток от одной главной проверяется пробным слиянием, а не по одной:** каждая зелена
|
|
75
|
-
сама по себе, а сталкиваются
|
|
75
|
+
сама по себе, а сталкиваются тем, чего на отдельной ветке не видно.
|
|
76
76
|
- **Ветка следующей работы отводится от предыдущей, пока череда не прервалась.** `git checkout -b
|
|
77
|
-
<КЛЮЧ>-<номер>-<slug> <предыдущая ветка>` вместо `origin/main`; от главной —
|
|
78
|
-
череды. Иначе первое
|
|
77
|
+
<КЛЮЧ>-<номер>-<slug> <предыдущая ветка>` вместо `origin/main`; от главной — первая работа
|
|
78
|
+
череды. Иначе первое слияние разводит все остальные разом.
|
|
79
79
|
- **У заявки в череде основанием стоит предыдущая ветка, а не главная.** `gh pr create --base
|
|
80
|
-
<предыдущая ветка>` — иначе разбор показывает
|
|
80
|
+
<предыдущая ветка>` — иначе разбор показывает правку вперемешку со всем, что под ней. Базу
|
|
81
81
|
влитой нижней хостинг переносит сам.
|
|
82
82
|
- **Череда вливается снизу вверх, и порядок стоит в теле каждой заявки.** Родство веток по
|
|
83
83
|
списку не видно: строка «стоит на #<номер>» — единственное место, где владелец это прочтёт.
|
|
@@ -87,9 +87,9 @@ flowchart TD
|
|
|
87
87
|
владельца, разбирающего то же при слиянии, нет ни одной.
|
|
88
88
|
- **Несошедшиеся условия поставки называются одним отказом.** Гард копит их и печатает разом: всё
|
|
89
89
|
несошедшееся известно на первом вызове.
|
|
90
|
-
- **Условие, известное в начале работы, спрашивается в начале.** Заведение ветки отбивает
|
|
91
|
-
без вершины главной и чужую почту в
|
|
92
|
-
|
|
90
|
+
- **Условие, известное в начале работы, спрашивается в начале.** Заведение ветки отбивает
|
|
91
|
+
основание без вершины главной и чужую почту в подписи; на пуше то же чинится вливанием с
|
|
92
|
+
конфликтом и переписыванием ветки.
|
|
93
93
|
- **Судится то основание, которое названо командой, а не вершина рабочей копии.** Ветку заводят и
|
|
94
94
|
от `origin/main` прямо — этой командой основание как раз и берут свежим. Основание, о котором
|
|
95
95
|
дерево ничего не знает, не судится вовсе.
|
|
@@ -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,25 +135,25 @@ flowchart TD
|
|
|
138
135
|
- **Вершина открытого PR без прогона видна сверкой очереди работ.** Страница без прогона выглядит
|
|
139
136
|
так же, как с зелёным: цвета нет ни там, ни там. Сверка спрашивает вершину, считает сам факт
|
|
140
137
|
прогона, а не цвет, и свежей вершине даёт время.
|
|
138
|
+
- **Заявка, чья база — не главная ветка, проверяется тем же набором, что и заявка в главную.**
|
|
139
|
+
Условие запуска конвейера читает базу, и заявка в соседнюю ветку не поднимает его вовсе: пустое
|
|
140
|
+
поле проверок читается как ожидание очереди. Спрашивается это до открытия первой заявки стопки,
|
|
141
|
+
и заявка без прогона на вершине не сливается — приём в паттерне `git-workflow-stack`.
|
|
141
142
|
- **Прогон, вытесненный из очереди конвейера, сверка называет отдельной строкой.** Он выглядит
|
|
142
143
|
упавшим, хотя ветку не проверял; отличает их число заданий — у него ноль.
|
|
143
|
-
- **Черновик при зелёном прогоне на вершине — расхождение сверки.** Зелёная страница
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
машинной записи судится двумя признаками — зелёный прогон на его вершине и разобранная папка
|
|
148
|
-
задачи в его ветке; лежащая папка означает идущую работу.
|
|
144
|
+
- **Черновик при зелёном прогоне на вершине — расхождение сверки.** Зелёная страница ничего не
|
|
145
|
+
разрешает: кнопка заблокирована хостингом. В ходе это закрывает гард, между ходами — сверка.
|
|
146
|
+
- **Свои черновики судятся все разом, а не тот один, чья ветка взята.** Признака два — зелёный
|
|
147
|
+
прогон на вершине и разобранная папка задачи в ветке; лежащая папка означает идущую работу.
|
|
149
148
|
- **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Кнопку слияния нажимает
|
|
150
|
-
человек там, где гардов
|
|
151
|
-
его выполнить.
|
|
149
|
+
человек там, где гардов нет: открытие — последняя точка, где отказ ещё виден исполнителю.
|
|
152
150
|
- **Свои открытые заявки перечитываются в трёх местах: перед пушем, при взятии задачи и после
|
|
153
151
|
каждого известного слияния.** Заявка устаревает без действия автора: влита соседняя работа —
|
|
154
152
|
остальные в ту же секунду отстали. Приём — `git-workflow-freshness`.
|
|
155
153
|
- **Конфликтующая своя заявка чинится первым действием хода, а новая работа до этого не
|
|
156
|
-
берётся.** Пока отданное конфликтует, влить его человек не
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
идёт как прежде.
|
|
154
|
+
берётся.** Пока отданное конфликтует, влить его человек не может. Работой здесь считается
|
|
155
|
+
заведение задачи, заведение ветки, перевод колонки в работу и открытие заявки; всё, чем
|
|
156
|
+
конфликт чинится, идёт как прежде.
|
|
160
157
|
- **Конфликтующий открытый PR — расхождение сверки очереди работ.** Конфликт приезжает чужим
|
|
161
158
|
слиянием и по списку не виден: метку хостинг показывает только внутри самого PR.
|
|
162
159
|
- **Документ едет в том же коммите, что и правка.** Обход — строка `Docs-skip: <причина>` в теле
|
|
@@ -168,30 +165,30 @@ flowchart TD
|
|
|
168
165
|
- **Сборка входит в набор наравне с линтом и юнитами.** Линтер типов не читает, а юниты читают
|
|
169
166
|
только импортированное тестом: ошибка типов в непокрытом коде доживает до сборки образа, то
|
|
170
167
|
есть до мержа.
|
|
171
|
-
- **На машине, где раннеров несколько, любой путь от домашнего каталога общий.**
|
|
172
|
-
готового шага
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
168
|
+
- **На машине, где раннеров несколько, любой путь от домашнего каталога общий.** Соседнее задание
|
|
169
|
+
переписывает умолчание готового шага под свою версию, пока наше стоит между шагами. Каталог
|
|
170
|
+
установки, имя контейнера и имя сборщика называются поэтому по проекту и постоянно, а временный
|
|
171
|
+
каталог решением не бывает — в нём живёт хранилище пакетов.
|
|
172
|
+
- **Набор гейта пуша не бывает уже набора конвейера.** Шаг конвейера, которому в наборе нет ни
|
|
173
|
+
строки, ни объявленного исключения с причиной, отбивает пуш, а не печатается рядом:
|
|
174
|
+
предупреждение читается как разрешение.
|
|
175
|
+
- **Набор гейта зовёт умолчание пакета, а не перечисляет его строками.** Переписанный строками,
|
|
176
|
+
он оставляет завтрашнюю дыру: заведённая пакетом проверка до дерева не доедет. Отсеивать из
|
|
177
|
+
умолчания законно, но поимённо и с причиной.
|
|
178
|
+
- **Итоговый набор перед пушем читается разбором состояния, а не сборкой в уме.** Раздел «набор
|
|
179
|
+
перед пушем» печатает его целиком и называет рядом то, что умолчание печатало, а в набор не
|
|
180
|
+
попало: дерево, писавшее надстройку вслепую, дописывало в неё повтор.
|
|
183
181
|
- **Причина исключения, называющая задачу, судится на живость этой задачи.** Мёртвый номер делает
|
|
184
|
-
исключение
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
копится молча: раскладка отказывает по правленому файлу целиком. Статьёй выше это не покрывается —
|
|
188
|
-
сверки нет в конвейере.
|
|
182
|
+
исключение бессрочным молча. Спрашивается тем же ярусом, что состояние задачи у гарда.
|
|
183
|
+
- **Сверка раскладки стоит в наборе гейта пуша наравне с линтом и сборкой.** Правка мимо
|
|
184
|
+
источника копится молча, а сверки нет в конвейере.
|
|
189
185
|
- **После вливания главной ветки набор проверок пересматривается по тому, что ветка везёт
|
|
190
|
-
теперь.**
|
|
191
|
-
|
|
192
|
-
-
|
|
193
|
-
|
|
194
|
-
|
|
186
|
+
теперь.** Проверять по тому, что правил автор, — значит проверять половину: отвечает ветка
|
|
187
|
+
целиком.
|
|
188
|
+
- **Главная ветка берётся удалённой ссылкой — и в словах, и в действиях.** Локальная — снимок
|
|
189
|
+
вчерашнего дня, и молчит она об этом. От `origin/main` идут и сравнение, и основание новой
|
|
190
|
+
ветки, и счёт влитого: при локальной влитая ветка числится невлитой, а уборка кончается
|
|
191
|
+
списком невлитого, которого нет.
|
|
195
192
|
- **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка во входящие не
|
|
196
193
|
приходит и обсуждения не имеет: до открытия PR правки для человека нет. Открывается он тем же
|
|
197
194
|
ходом, которым исполнитель говорит, что работу отдаёт.
|
|
@@ -221,31 +218,29 @@ flowchart TD
|
|
|
221
218
|
хостинга об авторе гард спрашивает на снятии черновика: влитую заявку не переоткрыть.
|
|
222
219
|
|
|
223
220
|
- **Автор PR не может быть его ревьювером.** Запрос разбора на себя GitHub принимает и молча не
|
|
224
|
-
|
|
221
|
+
создаёт. Считаются только запрос и отзыв не от автора.
|
|
225
222
|
- **Вызов клиента хостинга идёт из дерева, а связка команд исхода не проверяет.** Вне дерева
|
|
226
|
-
клиент отказывает, а следующее звено
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
борде тот отвечает отказом про Projects.
|
|
223
|
+
клиент отказывает, а следующее звено увозит на хостинг остаток отказавшего.
|
|
224
|
+
- **Метки, исполнитель и ревьювер PR ставятся вызовами `gh api`, а не `gh pr edit`:** тот
|
|
225
|
+
отвечает отказом про Projects.
|
|
230
226
|
- **Борда правится запросом GraphQL по идентификатору борды, а не по имени владельца.**
|
|
231
227
|
- **Почта машинного коммита копируется из компаньона, а не набирается по памяти.** Адрес
|
|
232
|
-
`<число>+<логин>@users.noreply.github.com` сходится по числу: с чужим
|
|
233
|
-
|
|
228
|
+
`<число>+<логин>@users.noreply.github.com` сходится по числу: с чужим коммит уезжает подписанным
|
|
229
|
+
посторонним. Ту же строку держит профиль дерева, и гард отбивает пуш.
|
|
234
230
|
- **Личность машинной записи подтверждается ответом хостинга, а не узнаванием строки:** её
|
|
235
231
|
спрашивают токеном, и логин с числом приходят вместе.
|
|
236
232
|
- **Сценарии гардов задают настройки git сами, а не берут их с машины.** Подпись с машины уводит
|
|
237
|
-
git в агент ключей, а заблокированный агент роняет
|
|
238
|
-
|
|
233
|
+
git в агент ключей, а заблокированный агент роняет набор: автор, почта и подпись идут флагами
|
|
234
|
+
`-c` в команде.
|
|
239
235
|
|
|
240
236
|
- **Каждый коммит вклада ветки подписан машинной записью, и это проверяется набором пуша.** Гард
|
|
241
|
-
судит
|
|
237
|
+
судит коммит, назвавшийся ею; подписанный человеком проходит мимо.
|
|
242
238
|
- **Состояние заявки перечитывается у хостинга сразу после публикации.** Открытие и постановка
|
|
243
239
|
ревьювера отвечают нулём и тогда, когда не сделали ничего.
|
|
244
240
|
- **Автор открытой заявки и наличие у неё ревьювера сверяются очередью работ.** До слияния оба
|
|
245
|
-
промаха не видны:
|
|
246
|
-
заявка, которой его не поставили.
|
|
241
|
+
промаха не видны: открытая человеком заявка ревьювера не получит никогда.
|
|
247
242
|
- **Ревьюверы спрашиваются вызовом REST, а не выборкой клиента.** Её поля собирает GraphQL, прав
|
|
248
|
-
на который у
|
|
243
|
+
на который у записи нет: «сошлось» неотличимо от «спросить было нечем».
|
|
249
244
|
|
|
250
245
|
- **Рабочее дерево не опустошается ради прогона инструмента.** Сравнение идёт на второй копии:
|
|
251
246
|
прятанье уводит незакоммиченную работу туда, где её не видит ни состояние дерева, ни сверка.
|
|
@@ -272,3 +267,4 @@ flowchart TD
|
|
|
272
267
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
273
268
|
- `git-workflow-stack` — череда веток: ветвление от предыдущей, основание заявки, порядок отдачи.
|
|
274
269
|
- `git-workflow-freshness` — свои открытые заявки: чтение всех разом, отставание против спора.
|
|
270
|
+
- `git-workflow-pr-ready` — доведение отданного: снятый черновик, разбор красного, волна по череде.
|
|
@@ -170,6 +170,10 @@ flowchart TD
|
|
|
170
170
|
отбивает пуш, а не печатается рядом с ним: напечатанное предупреждение исполнитель читает как
|
|
171
171
|
разрешение. Дважды подряд правка, прошедшая гейт целиком, была отбита конвейером — и оба раза
|
|
172
172
|
зелёный гейт был прочитан как «локально всё зелено».
|
|
173
|
+
- **Итоговый набор перед пушем читается разбором состояния, а не сборкой в уме.** Он собирается
|
|
174
|
+
из умолчания пакета и надстройки дерева, и прочитать сборку было нечем: раздел «набор перед
|
|
175
|
+
пушем» печатает его целиком, по команде на строку, а рядом называет то, что умолчание печатало,
|
|
176
|
+
а в набор не попало. Дерево, писавшее надстройку вслепую, дописывало в неё повтор.
|
|
173
177
|
- **Причина исключения, называющая задачу, судится на живость этой задачи.** Отсрочка со сроком
|
|
174
178
|
и отсрочка без срока выглядят одинаково, пока номер никто не спросил; мёртвый номер в причине
|
|
175
179
|
делает исключение бессрочным, не сказав об этом ни строкой. Спрашивается тем же ярусом, что
|
|
@@ -191,6 +195,10 @@ flowchart TD
|
|
|
191
195
|
сломана, она описывает вчерашний день. Сравнение веток пишется от `origin/main` целиком —
|
|
192
196
|
смешав в одной команде удалённую ссылку для одной стороны и локальную для другой, промах
|
|
193
197
|
изнутри выглядит правильным.
|
|
198
|
+
- **Удалённую ссылку берут не только слова, но и действия.** Основание новой ветки, счёт влитого
|
|
199
|
+
и подтягивание главной судятся по ней же: локальная — снимок последнего подтягивания, и работа,
|
|
200
|
+
начатая от неё, стартует от основания, которого в главной уже нет. Влитая ветка при ней числится
|
|
201
|
+
невлитой, и уборка кончается списком невлитого, которого нет.
|
|
194
202
|
- **Слияние по кнопке «Merge when pipeline succeeds» не заменяет проверок до пуша.** Конвейер
|
|
195
203
|
видит только то, что уже отправлено, а отправленная красная ветка занимает очередь работ и
|
|
196
204
|
выглядит готовой к разбору.
|