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