@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.
- package/assets/checks/board-epics.github.mjs +123 -0
- package/assets/checks/board-gh.github.mjs +121 -0
- package/assets/checks/board-paths.github.mjs +88 -0
- package/assets/checks/board-runs.github.mjs +8 -0
- package/assets/checks/board-titles.github.mjs +66 -0
- package/assets/checks/board.github.mjs +77 -73
- package/assets/checks/check-board.github.mjs +56 -7
- package/assets/checks/check-file-size.mjs +10 -2
- package/assets/checks/check-glossary.mjs +170 -0
- package/assets/checks/check-hook-scope.mjs +126 -0
- package/assets/checks/check-profile-drift.mjs +195 -0
- package/assets/checks/check-push-gate.mjs +59 -1
- package/assets/checks/check-schema-drift.mjs +12 -5
- package/assets/checks/check-specs.mjs +1 -1
- package/assets/checks/rt-kit-checks.config.mjs +13 -0
- package/assets/checks/spec-anchors.mjs +2 -2
- package/assets/checks/spec-contract.mjs +9 -0
- package/assets/defaults/gate-map.sh +13 -4
- package/assets/defaults/project.sh +31 -108
- package/assets/defaults/shell.sh +139 -0
- package/assets/docs/GLOSSARY.md +1 -1
- package/assets/hooks/browser-device-id.sh +20 -4
- package/assets/hooks/browser-guard-device-id.sh +5 -2
- package/assets/hooks/browser-guard-no-other-drivers.sh +41 -2
- package/assets/hooks/claim-guard.sh +22 -1
- package/assets/hooks/docs-guard.sh +1 -1
- package/assets/hooks/exam-guard.sh +85 -12
- package/assets/hooks/git-guard-delivery-conflict.sh +85 -0
- package/assets/hooks/git-guard-delivery-folder.sh +19 -0
- package/assets/hooks/git-guard-delivery-signature.sh +14 -5
- package/assets/hooks/git-guard-delivery.sh +54 -2
- package/assets/hooks/git-guard-push-tests.sh +21 -1
- package/assets/hooks/grill-gate-ask.sh +25 -0
- package/assets/hooks/grill-gate.sh +75 -11
- package/assets/hooks/lint-after-edit.sh +44 -16
- package/assets/hooks/proposal-guard.sh +11 -4
- package/assets/hooks/rule-source-guard.sh +8 -13
- package/assets/hooks/skill-gate-layers.sh +7 -0
- package/assets/hooks/skill-gate.sh +29 -0
- package/assets/hooks/task-context-load.sh +32 -0
- package/assets/hooks/task-flow-context.sh +194 -0
- package/assets/hooks/task-flow-draft-guard.sh +109 -0
- package/assets/hooks/task-flow-guard.sh +27 -159
- package/assets/hooks/turn-exit-guard.sh +53 -88
- package/assets/hooks/waiting-turn-guard.sh +65 -2
- package/assets/hooks/window-fill-guard.sh +5 -1
- package/assets/hooks/work-start-guard.sh +166 -0
- package/assets/hooks/write-targets.sh +24 -0
- package/assets/laws/delivery.md +19 -0
- package/assets/laws/frontend-application.md +4 -0
- package/assets/laws/verifiability.md +44 -0
- package/assets/laws/work-conduct.md +15 -0
- package/assets/patterns/browser-verification-measure.md +3 -1
- package/assets/patterns/browser-verification-stand.md +17 -4
- package/assets/patterns/doc-style-write.md +62 -2
- package/assets/patterns/git-workflow-commit.github.md +33 -5
- package/assets/patterns/git-workflow-docker.md +22 -0
- package/assets/patterns/git-workflow-freshness.md +87 -0
- package/assets/patterns/git-workflow-merge.md +41 -0
- package/assets/patterns/git-workflow-migration.md +11 -0
- package/assets/patterns/git-workflow-pr.github.md +12 -1
- package/assets/patterns/git-workflow-restart.md +18 -0
- package/assets/patterns/git-workflow-secrets.md +14 -0
- package/assets/patterns/git-workflow-stack.md +93 -1
- package/assets/patterns/lib-layers-move.md +4 -0
- package/assets/patterns/spec-driven-domain.md +47 -2
- package/assets/patterns/spec-driven-rule.md +16 -4
- package/assets/patterns/spec-driven-sweep.md +57 -0
- package/assets/patterns/status-report-table.github.md +1 -1
- package/assets/patterns/task-flow-archive.md +58 -16
- package/assets/patterns/task-flow-close.md +106 -23
- package/assets/patterns/task-flow-handoff.md +14 -2
- package/assets/patterns/task-flow-resume.md +35 -8
- package/assets/patterns/task-flow-start.md +60 -22
- package/assets/patterns/testing-e2e.md +23 -0
- package/assets/patterns/turn-entry-map.md +1 -1
- package/assets/pitfalls/agent-kit.md +71 -3
- package/assets/pitfalls/doc-style.md +15 -0
- package/assets/pitfalls/git-workflow.github.md +88 -0
- package/assets/pitfalls/spec-driven.md +22 -0
- package/assets/pitfalls/task-flow.md +113 -0
- package/assets/pitfalls/testing.md +6 -0
- package/assets/pitfalls/turn-conduct.md +49 -0
- package/assets/rules/browser-verification.md +58 -0
- package/assets/rules/deploy-flow.azure.md +8 -0
- package/assets/rules/deploy-flow.github.md +27 -0
- package/assets/rules/deploy-flow.gitlab.md +8 -0
- package/assets/rules/doc-style.md +20 -0
- package/assets/rules/git-workflow.azure.md +22 -2
- package/assets/rules/git-workflow.github.md +127 -118
- package/assets/rules/git-workflow.gitlab.md +17 -4
- package/assets/rules/lists.md +5 -0
- package/assets/rules/observability.needs-app.md +4 -0
- package/assets/rules/reuse-first.md +14 -0
- package/assets/rules/shared-code.md +5 -0
- package/assets/rules/spec-driven.md +33 -15
- package/assets/rules/task-flow.md +132 -126
- package/assets/rules/testing.md +41 -2
- package/assets/rules/turn-conduct.md +73 -57
- package/assets/rules/turn-entry.md +6 -0
- package/assets/samples/tasks/_template/grill.md +5 -0
- package/assets/samples/tasks/_template/plan.md +3 -0
- package/assets/skills/agent-kit.md +108 -76
- package/assets/templates/postmortem.md +5 -1
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +30 -6
- package/bin/agent-kit.js.map +1 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +2 -1
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +96 -7
- package/lib/commands.js.map +1 -1
- package/lib/hooks-map.d.ts +26 -0
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +58 -2
- package/lib/hooks-map.js.map +1 -1
- package/lib/sections.d.ts +6 -0
- package/lib/sections.d.ts.map +1 -1
- package/lib/sections.js +19 -0
- package/lib/sections.js.map +1 -1
- package/lib/shipment.d.ts +2 -0
- package/lib/shipment.d.ts.map +1 -1
- package/lib/shipment.fixture.d.ts +5 -0
- package/lib/shipment.fixture.d.ts.map +1 -1
- package/lib/shipment.fixture.js +7 -0
- package/lib/shipment.fixture.js.map +1 -1
- package/lib/shipment.js +13 -1
- package/lib/shipment.js.map +1 -1
- package/lib/sync.d.ts +35 -3
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +59 -8
- package/lib/sync.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.18.0.tgz +0 -0
- 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 и мерж. Называет
|
|
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
|
-
|
|
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 о них.**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
протухает в
|
|
166
|
-
целиком:
|
|
167
|
-
- **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка
|
|
168
|
-
|
|
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
|
-
|
|
179
|
-
вливания нельзя — между ним и взглядом владельца главная уходит вперёд. Дерево, чей помощник
|
|
180
|
-
очереди о сливаемости не говорит, работает как прежде: поля нет, требования нет.
|
|
200
|
+
сливаемость — «кнопку можно нажать», и владельцу нужно второе. Спрашивается у хостинга полем
|
|
201
|
+
`mergeable`; из локального вливания она не выводится.
|
|
181
202
|
- **Указателю, в который ветки только дописывают строки, объявляется сложение обеих сторон.**
|
|
182
|
-
Конфликт там не спор: обе допись нужны
|
|
183
|
-
|
|
184
|
-
своим приёмом и настроек слияния не читает — гаснет она, когда ветка вобрала главную и это
|
|
185
|
-
уехало на хостинг.
|
|
203
|
+
Конфликт там не спор: обе допись нужны целиком. Метку сливаемости объявление **не гасит** — она
|
|
204
|
+
гаснет, когда ветка вобрала главную и это уехало на хостинг.
|
|
186
205
|
- **Правка, доведённая до коммита, доводится до хостинга тем же ходом.** Владелец видит прежнее
|
|
187
206
|
состояние и читает его как «не сделано ничего», а сделанное лежит там, где его не видит никто.
|
|
188
207
|
Оставшееся в дереве называется причиной — словом владельца, а не списком остатков.
|
|
189
208
|
- **Черновик не снимается, пока у PR нет разбора.** Гард смотрит запрошенного ревьювера и
|
|
190
|
-
оставленный отзыв: снятый черновик читается как «можно вливать», а вливать некому.
|
|
191
|
-
|
|
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 не может быть его ревьювером.** Запрос разбора на
|
|
203
|
-
|
|
204
|
-
отзыв не от автора.
|
|
218
|
+
- **Автор PR не может быть его ревьювером.** Запрос разбора на себя GitHub принимает и молча не
|
|
219
|
+
создаёт: разбор выглядит запрошенным. Считаются только запрос и отзыв не от автора.
|
|
205
220
|
- **Вызов клиента хостинга идёт из дерева, а связка команд исхода не проверяет.** Репозиторий
|
|
206
221
|
клиент берёт у текущего каталога и вне дерева отказывает; следующее звено связки увозит на
|
|
207
222
|
хостинг то, что осталось от отказавшего, поэтому тело читается обратно тем же ходом.
|
|
208
|
-
- **Метки, исполнитель и ревьювер PR ставятся вызовами `gh api`, а не `gh pr edit`.** На
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
-
|
|
236
|
-
|
|
237
|
-
|
|
241
|
+
промаха не видны: заявка, открытая человеком, ревьювера не получит никогда, и выглядит это как
|
|
242
|
+
заявка, которой его просто не поставили.
|
|
243
|
+
- **Ревьюверы спрашиваются вызовом REST, а не выборкой клиента.** Её поля собирает GraphQL, а он
|
|
244
|
+
требует прав, которых у машинной записи нет: «сошлось» не отличить от «спросить было нечем».
|
|
245
|
+
|
|
246
|
+
- **Рабочее дерево не опустошается ради прогона инструмента.** Сравнение с прежним состоянием
|
|
247
|
+
идёт на второй копии: прятанье уводит незакоммиченную работу туда, где её не видит ни состояние
|
|
248
|
+
дерева, ни сверка.
|
|
238
249
|
|
|
239
250
|
## Чего из закона здесь нет
|
|
240
251
|
|
|
241
252
|
Гард поставки стоит на командах агента, поэтому ветку, заведённую руками в редакторе, он не
|
|
242
|
-
видит: имя такой ветки держится памятью.
|
|
243
|
-
|
|
244
|
-
у всех. Сверка очереди имя ветки не судит вовсе: у открытого PR его не переименовать.
|
|
253
|
+
видит: имя такой ветки держится памятью. Отдельной проверки под него не заводится — работа
|
|
254
|
+
опознаётся заголовком задачи и PR. Сверка очереди имя ветки не судит вовсе.
|
|
245
255
|
|
|
246
256
|
Задачу в работу гард не переводит: борду он не правит — правка борды в разборе команды падала бы
|
|
247
|
-
вместе со
|
|
248
|
-
|
|
249
|
-
|
|
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` — свои открытые заявки: чтение всех разом, отставание против спора.
|