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