@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.
Files changed (101) hide show
  1. package/README.md +8 -2
  2. package/assets/checks/board-long-work.github.mjs +101 -0
  3. package/assets/checks/board-runs.github.mjs +34 -0
  4. package/assets/checks/board.github.mjs +1 -1
  5. package/assets/checks/check-board.github.mjs +30 -2
  6. package/assets/checks/check-doc-paths.mjs +24 -5
  7. package/assets/checks/check-file-size.mjs +8 -2
  8. package/assets/checks/check-prose-style.mjs +10 -1
  9. package/assets/checks/check-reuse.mjs +4 -1
  10. package/assets/checks/check-schema-drift.mjs +65 -6
  11. package/assets/checks/rt-kit-checks.config.mjs +13 -0
  12. package/assets/checks/signals.mjs +41 -1
  13. package/assets/commands/next-session.md +16 -5
  14. package/assets/defaults/gate-map.sh +13 -0
  15. package/assets/defaults/project.sh +26 -0
  16. package/assets/defaults/shell.sh +18 -3
  17. package/assets/hooks/browser-guard-device-id.sh +42 -12
  18. package/assets/hooks/browser-guard-no-asking.sh +5 -1
  19. package/assets/hooks/dispatch.sh +40 -9
  20. package/assets/hooks/docs-guard.sh +10 -0
  21. package/assets/hooks/exam-guard.sh +66 -16
  22. package/assets/hooks/git-guard-delivery-draft.sh +78 -0
  23. package/assets/hooks/git-guard-delivery.sh +64 -122
  24. package/assets/hooks/git-guard-main.sh +39 -4
  25. package/assets/hooks/git-guard-push-tests.sh +71 -3
  26. package/assets/hooks/glossary-load.sh +23 -2
  27. package/assets/hooks/grill-gate.sh +62 -0
  28. package/assets/hooks/hook-input.sh +17 -6
  29. package/assets/hooks/rule-source-guard.sh +11 -0
  30. package/assets/hooks/stand-login-guard.sh +101 -0
  31. package/assets/hooks/write-targets.sh +37 -4
  32. package/assets/laws/autonomous-work.md +30 -0
  33. package/assets/laws/project-documentation.md +8 -0
  34. package/assets/laws/verifiability.md +12 -2
  35. package/assets/laws/work-conduct.md +59 -65
  36. package/assets/patterns/autonomous-work-run.md +105 -0
  37. package/assets/patterns/browser-verification-measure.md +41 -1
  38. package/assets/patterns/browser-verification-stand.md +57 -16
  39. package/assets/patterns/doc-style-human.md +75 -0
  40. package/assets/patterns/doc-style-write.md +16 -0
  41. package/assets/patterns/git-workflow-commit.azure.md +12 -0
  42. package/assets/patterns/git-workflow-commit.github.md +16 -3
  43. package/assets/patterns/git-workflow-commit.gitlab.md +12 -0
  44. package/assets/patterns/git-workflow-merge.md +8 -0
  45. package/assets/patterns/git-workflow-pr-ready.md +93 -0
  46. package/assets/patterns/git-workflow-pr.azure.md +1 -1
  47. package/assets/patterns/git-workflow-pr.github.md +1 -1
  48. package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
  49. package/assets/patterns/task-flow-start.md +48 -48
  50. package/assets/patterns/testing-e2e.md +18 -8
  51. package/assets/patterns/ts-procedure.md +3 -2
  52. package/assets/pitfalls/task-flow.md +40 -40
  53. package/assets/rules/autonomous-work.md +92 -0
  54. package/assets/rules/browser-verification.md +35 -3
  55. package/assets/rules/deploy-flow.azure.md +7 -0
  56. package/assets/rules/deploy-flow.github.md +7 -0
  57. package/assets/rules/deploy-flow.gitlab.md +7 -0
  58. package/assets/rules/doc-style.md +54 -0
  59. package/assets/rules/git-workflow.azure.md +8 -0
  60. package/assets/rules/git-workflow.github.md +59 -63
  61. package/assets/rules/git-workflow.gitlab.md +8 -0
  62. package/assets/rules/reuse-first.md +25 -5
  63. package/assets/rules/styling-bem.md +8 -1
  64. package/assets/rules/task-flow.md +108 -109
  65. package/assets/rules/testing.md +21 -0
  66. package/assets/skills/agent-kit.md +72 -82
  67. package/lib/commands.d.ts.map +1 -1
  68. package/lib/commands.js +69 -2
  69. package/lib/commands.js.map +1 -1
  70. package/lib/enroll.d.ts.map +1 -1
  71. package/lib/enroll.js +1 -1
  72. package/lib/enroll.js.map +1 -1
  73. package/lib/observations.d.ts +10 -1
  74. package/lib/observations.d.ts.map +1 -1
  75. package/lib/observations.js +1 -0
  76. package/lib/observations.js.map +1 -1
  77. package/lib/override-marks.d.ts +24 -0
  78. package/lib/override-marks.d.ts.map +1 -0
  79. package/lib/override-marks.js +98 -0
  80. package/lib/override-marks.js.map +1 -0
  81. package/lib/push-gate.d.ts +14 -0
  82. package/lib/push-gate.d.ts.map +1 -0
  83. package/lib/push-gate.js +93 -0
  84. package/lib/push-gate.js.map +1 -0
  85. package/lib/shipment.d.ts.map +1 -1
  86. package/lib/shipment.js +1 -1
  87. package/lib/shipment.js.map +1 -1
  88. package/package.json +1 -1
  89. package/rt-tools-agent-kit-0.24.0.tgz +0 -0
  90. package/assets/laws/application/access.md +0 -34
  91. package/assets/laws/application/locales.md +0 -33
  92. package/assets/laws/application/search-visibility.md +0 -24
  93. package/assets/patterns/permissions-procedure.md +0 -71
  94. package/assets/patterns/seo-page.md +0 -104
  95. package/assets/patterns/seo-verify.md +0 -83
  96. package/assets/patterns/translations-content.md +0 -107
  97. package/assets/patterns/translations-key.md +0 -64
  98. package/assets/rules/permissions.md +0 -116
  99. package/assets/rules/seo.md +0 -139
  100. package/assets/rules/translations.md +0 -96
  101. 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
- протухает в минуту, когда её подтянули, и молчит об этом. Сравнение пишется от `origin/main`
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
- - **Метки, исполнитель и ревьювер PR ставятся вызовами `gh api`, а не `gh pr edit`:** на старой
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
- флагами `-c` прямо в команде.
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
  выглядит готовой к разбору.