@rt-tools/agent-kit 0.21.0 → 0.23.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 (68) hide show
  1. package/assets/checks/board-long-work.github.mjs +101 -0
  2. package/assets/checks/board-runs.github.mjs +34 -0
  3. package/assets/checks/check-board.github.mjs +16 -2
  4. package/assets/checks/check-reuse.mjs +4 -1
  5. package/assets/checks/check-schema-drift.mjs +65 -6
  6. package/assets/checks/rt-kit-checks.config.mjs +13 -0
  7. package/assets/checks/signals.mjs +41 -1
  8. package/assets/commands/next-session.md +16 -5
  9. package/assets/defaults/project.sh +16 -0
  10. package/assets/hooks/browser-guard-no-asking.sh +5 -1
  11. package/assets/hooks/claim-guard.sh +1 -0
  12. package/assets/hooks/conscience-guard.sh +1 -0
  13. package/assets/hooks/git-guard-delivery.sh +15 -11
  14. package/assets/hooks/git-guard-push-tests.sh +22 -0
  15. package/assets/hooks/glossary-load.sh +23 -2
  16. package/assets/hooks/grill-gate.sh +64 -0
  17. package/assets/hooks/hook-input.sh +1 -0
  18. package/assets/hooks/postmortem-guard.sh +1 -0
  19. package/assets/hooks/proposal-guard.sh +8 -0
  20. package/assets/hooks/turn-exit-guard.sh +1 -0
  21. package/assets/hooks/waiting-turn-guard.sh +1 -0
  22. package/assets/hooks/work-start-guard.sh +2 -0
  23. package/assets/laws/autonomous-work.md +30 -0
  24. package/assets/laws/frontend-application.md +10 -0
  25. package/assets/laws/project-documentation.md +8 -0
  26. package/assets/laws/work-conduct.md +3 -0
  27. package/assets/patterns/autonomous-work-run.md +105 -0
  28. package/assets/patterns/browser-verification-stand.md +1 -1
  29. package/assets/patterns/doc-style-write.md +16 -0
  30. package/assets/patterns/git-workflow-pr-ready.md +93 -0
  31. package/assets/patterns/git-workflow-pr.azure.md +1 -1
  32. package/assets/patterns/git-workflow-pr.github.md +1 -1
  33. package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
  34. package/assets/patterns/task-flow-start.md +47 -47
  35. package/assets/patterns/ts-procedure.md +3 -2
  36. package/assets/rules/autonomous-work.md +92 -0
  37. package/assets/rules/browser-verification.md +6 -0
  38. package/assets/rules/deploy-flow.azure.md +7 -0
  39. package/assets/rules/deploy-flow.github.md +7 -0
  40. package/assets/rules/deploy-flow.gitlab.md +7 -0
  41. package/assets/rules/doc-style.md +18 -0
  42. package/assets/rules/git-workflow.azure.md +13 -0
  43. package/assets/rules/git-workflow.github.md +59 -57
  44. package/assets/rules/git-workflow.gitlab.md +13 -0
  45. package/assets/rules/reuse-first.md +17 -3
  46. package/assets/rules/task-flow.md +62 -63
  47. package/assets/skills/agent-kit.md +20 -20
  48. package/lib/commands.d.ts.map +1 -1
  49. package/lib/commands.js +6 -0
  50. package/lib/commands.js.map +1 -1
  51. package/lib/push-gate.d.ts +14 -0
  52. package/lib/push-gate.d.ts.map +1 -0
  53. package/lib/push-gate.js +93 -0
  54. package/lib/push-gate.js.map +1 -0
  55. package/package.json +1 -1
  56. package/rt-tools-agent-kit-0.23.0.tgz +0 -0
  57. package/assets/laws/application/access.md +0 -34
  58. package/assets/laws/application/locales.md +0 -33
  59. package/assets/laws/application/search-visibility.md +0 -24
  60. package/assets/patterns/permissions-procedure.md +0 -71
  61. package/assets/patterns/seo-page.md +0 -104
  62. package/assets/patterns/seo-verify.md +0 -83
  63. package/assets/patterns/translations-content.md +0 -107
  64. package/assets/patterns/translations-key.md +0 -64
  65. package/assets/rules/permissions.md +0 -116
  66. package/assets/rules/seo.md +0 -139
  67. package/assets/rules/translations.md +0 -96
  68. package/rt-tools-agent-kit-0.21.0.tgz +0 -0
@@ -34,16 +34,15 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
34
34
 
35
35
  Находки складываются в раздел «Что уже есть в дереве» разбора.
36
36
 
37
- Дерево — не единственное место, где может лежать ответ. Решение, принятое прошлым заходом и
38
- никуда не записанное, живёт только в записи того захода: записи заходов лежат в каталоге заходов
39
- агента, и поиск по ним словом темы стоит одной команды. Найденное там ответом не остаётся на
40
- месте — тем же ходом оно переписывается в дерево: в замысел эпика, если связывает задачи, и в
41
- ход работы, если касается одной.
37
+ Дерево — не единственное место, где лежит ответ. Решение прошлого захода, никуда не записанное,
38
+ живёт только в записи того захода: поиск по ним словом темы стоит одной команды. Найденное тем же
39
+ ходом переписывается в дерево в замысел эпика, если связывает задачи, и в ход работы, если
40
+ касается одной.
42
41
 
43
- Разведка, не нашедшая ничего, разрешением спрашивать не становится. Сначала называется, где
44
- искали, потом добираются места, которых в списке не было: замысел эпика, описание прошлого,
45
- записи прошлых заходов. Одно место отрицанием не является: «в таком-то месте не нашёл» говорит о
46
- месте, а не о дереве, и вопрос называет оба способа, которыми искали.
42
+ Разведка, не нашедшая ничего, разрешением спрашивать не становится: сначала называется, где
43
+ искали, потом добираются места, которых в списке не было замысел эпика, описание прошлого,
44
+ записи прошлых заходов. «В таком-то месте не нашёл» говорит о месте, а не о дереве, и вопрос
45
+ называет оба способа, которыми искали.
47
46
 
48
47
  Разведка кончается не ощущением, а выводом команд. До первого вопроса владельцу исполнитель знает:
49
48
  как устроен репозиторий (корневая памятка), что лежит в каталоге, о котором пойдёт речь (`ls`), и
@@ -52,11 +51,22 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
52
51
  дереву не запускается ни одной команды.
53
52
 
54
53
  Разведка по заведённой задаче кончается воспроизведённым симптомом, а не найденным файлом. Тело
55
- задачи описывает дерево на день заведения, и чужие правки въезжают в главную ветку между
56
- заведением и работой: разведка по именам из тела подтверждает, что файлы на месте, — и отпавшая
57
- задача от живой не отличается ничем. Прежде первой своей правки разведка повторяет то, на что
58
- задача жалуется: зовёт процедуру, читает ответ, гоняет молчавшую проверку. Симптом не
59
- воспроизвёлся — задача закрывается отпавшей, и это законный её исход.
54
+ задачи описывает дерево на день заведения, и разведка по именам из тела подтверждает лишь то, что
55
+ файлы на месте: отпавшая задача от живой этим не отличается. Прежде первой правки разведка
56
+ повторяет то, на что задача жалуется, зовёт процедуру, читает ответ, гоняет молчавшую
57
+ проверку; симптом не воспроизвёлся задача закрывается отпавшей, и это законный исход.
58
+
59
+ Дерево, названное образцом, читается раскладкой целиком — обходом каталогов на два уровня, — и
60
+ только потом идут вопросы о приёмах. Ответ на «как здесь делают вот это» даёт одну папку, а
61
+ обобщённая до карты дерева она врёт: соседняя семья каталогов в неё не попадает, и пропажу
62
+ находит владелец.
63
+
64
+ Выведенное помечается прямо в списке, вместе с тем, чем его подтвердить. Догадка по соседнему
65
+ случаю стоит в одном списке с проверенным, и владелец читает список целиком как проверенный.
66
+
67
+ Шесть вопросов задаются за вычетом тех, на которые ответила разведка: вместо вопроса с готовым
68
+ ответом в разбор идёт строка «беру такой-то ответ, вот откуда». Признак один — есть ли ответ в
69
+ дереве; «задача кажется понятной» им не является ни в ту, ни в другую сторону.
60
70
 
61
71
  **Следующее движение:** находки ложатся в разбор, и тем же ходом владельцу уходит первый из
62
72
  шести вопросов. Разведка кончилась — состояние осталось прежним, ход тоже.
@@ -77,18 +87,14 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
77
87
  | Чем будет видно, что задача закрыта | «работает» признаком не является |
78
88
  | Есть ли образец, с которого снимается подход | разведка найдёт похожее, а не то |
79
89
 
80
- Список шести — набор того, что должно быть закрыто к началу работы, а не набор реплик, которые
81
- надо произнести. Обязательный вопрос, ответ на который владелец уже дал, отмечается закрытым, а
82
- не задаётся: ответ ищется в двух местах — в документации и в том, что владелец сказал в этом же
83
- заходе, включая исходную просьбу. Слово, повторённое в просьбе несколько раз, ответом является.
84
- Закрытый вопрос отмечается в разборе просьбы вместе с тем, чем он закрыт.
85
-
86
- Закрыть его можно и допущением, когда ответ очевиден: в разборе стоит строка «вопрос закрыт
87
- допущением: <что принято>». Неверное допущение стоит правки, вопрос ради очевидного — захода.
90
+ Список шести — набор того, что закрыто к началу работы, а не набор реплик, которые надо
91
+ произнести. Вопрос, ответ на который владелец уже дал, отмечается закрытым вместе с тем, чем он
92
+ закрыт: ответ ищется в документации и в сказанном этим же заходом, включая исходную просьбу.
93
+ Закрыть его можно и допущением, когда ответ очевиден, строкой «вопрос закрыт допущением:
94
+ <что принято>»: неверное допущение стоит правки, вопрос ради очевидного захода.
88
95
 
89
96
  Объём работы основанием для вопроса о границах не бывает: «это большая работа» решает
90
- исполнитель, «делать ли её целиком» — владелец, и решает раньше, чем работа началась. Вопрос о
91
- границах задаётся, когда владелец их не назвал, а не когда названные оказались широкими.
97
+ исполнитель, «делать ли её целиком» — владелец, и решает раньше, чем работа началась.
92
98
 
93
99
  Форму вопроса задают настройки владельца: где требуют меню, спрашивается меню, и к каждому
94
100
  вопросу добавляется свободный вариант — у закрытого набора нет строки «вопрос не тот».
@@ -135,16 +141,14 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
135
141
  (`spec-critic`) → замысел и разбивка (`project-manager`). Пробелы, которые роли не смогли
136
142
  закрыть, возвращаются владельцу — их относит главный агент.
137
143
 
138
- Договорённость, вышедшая из конвейера, сверяется с `grill.md` построчно до того, как по ней
139
- пойдёт работа. Роль пишет текст, не видя владельца, и способна развернуть его ответ в
140
- противоположный: очередь этапов оказалась перевёрнута, а два пункта из входящих переехали в
141
- «не входит». Находка критика, расходящаяся с ответом владельца, относится владельцу она не
142
- исполняется молча и не считается закрытой правкой текста.
144
+ Договорённость, вышедшая из конвейера, сверяется с `grill.md` построчно до работы по ней: роль
145
+ пишет текст, не видя владельца, и способна развернуть его ответ в противоположный — очередь
146
+ этапов оказывалась перевёрнутой, а входящие пункты переезжали в «не входит». Находка критика,
147
+ расходящаяся с ответом владельца, относится владельцу, а не исполняется молча.
143
148
 
144
- Ход на этой границе не кончается. Закрытый разбор выглядит законченным куском: ответы владельца
145
- лежат на диске, файл закоммичен, отчитаться есть чем — и отчёт встаёт ровно на то место, которое
146
- должна была занять договорённость. Пишется она тем же ходом, конвейером ролей или рукой
147
- исполнителя, и разницы между этими двумя случаями для конца хода нет.
149
+ Ход на этой границе не кончается: закрытый разбор выглядит законченным куском ответы на диске,
150
+ файл закоммичен, отчитаться есть чем, — и отчёт встаёт на место договорённости. Пишется она тем
151
+ же ходом, конвейером ролей или рукой исполнителя.
148
152
 
149
153
  **Следующее движение:** сверенная с разбором договорённость коммитится, и тем же ходом
150
154
  заводятся задача, ветка и папка — а вышла из разбора серия, сперва объявляется эпик.
@@ -179,12 +183,10 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
179
183
  таблицы, с меткой эпика. Выданные номера возвращаются в ту же таблицу — колонкой или приставкой
180
184
  к названию, — и с этой минуты «взять следующую» отвечает номером, а не названием.
181
185
 
182
- Задача, заведённая под эпик, называет его в своём теле: номер карточки эпика и путь к замыслу —
183
- одной строкой. Замысел называет задачу со своей стороны, и односторонняя привязка выглядит целой
184
- ровно так же, как двусторонняя — читатель приходит то от линии работ, то от карточки, и вторая
185
- сторона существует только для одного из них. Держалась она подражанием: пока тело писалось с
186
- образца соседней задачи того же эпика, строка копировалась вместе с формой, а задача, заведённая
187
- посреди работы находкой сверки, писалась не с образца.
186
+ Задача под эпиком называет его в своём теле номер карточки и путь к замыслу одной строкой, а
187
+ замысел называет задачу со своей стороны. Односторонняя привязка выглядит целой так же, как
188
+ двусторонняя: читатель приходит то от линии работ, то от карточки, и вторая сторона есть только
189
+ для одного из них.
188
190
 
189
191
  **Следующее движение:** объявленный эпик коммитится вместе с номерами задач, и тем же ходом
190
192
  берётся первая его задача — заведением ветки и папки.
@@ -197,19 +199,17 @@ git checkout -b <КЛЮЧ>-<номер>-<slug>
197
199
  npm run task:move -- <номер> in-progress
198
200
  ```
199
201
 
200
- Тело приходит файлом и пустым не бывает: заведённая пустой задача не говорит ничего ни
201
- исполнителю, ни владельцу, а дописать её потом можно только со слова владельца — и заводится
202
- пустое молча, номером наравне с полным.
202
+ Тело приходит файлом и пустым не бывает: пустая задача не говорит ничего ни исполнителю, ни
203
+ владельцу, а дописать её потом можно только со слова владельца.
203
204
 
204
205
  `task:new` переименовывает `_draft-<slug>` в `<КЛЮЧ>-<номер>-<slug>` и проставляет шапку замысла.
205
206
  Ветка заводится вторым вызовом: составную «завести и сразу коммитить» гард главной ветки
206
207
  отклоняет целиком.
207
208
 
208
- Номер уже выдан — черновика нет и не заводится: папка открывается сразу под именем ветки, а
209
- разбор пишется в неё же. Так начинается половина работ: номер приходит прошлым заходом,
210
- замеченным дефектом или соседней задачей, и шаг с черновиком тогда неисполнимпереименовывать
211
- нечего. Ловушка «номер не бывает первым» сюда не относится: она про то, что задачу не заводят до
212
- разбора, а не про то, что с уже заведённой нельзя работать.
209
+ Номер уже выдан — черновика нет и не заводится: папка открывается сразу под именем ветки. Так
210
+ начинается половина работ: номер приходит прошлым заходом, замеченным дефектом или соседней
211
+ задачей, и переименовывать нечего. Ловушка «номер не бывает первым» сюда не относится она про
212
+ то, что задачу не заводят до разбора.
213
213
 
214
214
  Остальные два файла пишутся, а не кладутся образцом впрок: пустой `plan.md` неотличим от
215
215
  замысла без этапов, а следующий заход доверяет папке задачи. Образец открывается тем же
@@ -2,7 +2,7 @@
2
2
  name: ts-procedure
3
3
  kind: pattern
4
4
  rule: typescript-conventions
5
- description: Паттерн правила typescript-conventions. Брать при заведении или правке процедуры Connect на бэкенде: готовый класс с полем метода и обработчиком, зависимости конструктором, имена файла и класса. Доступ к процедуре паттерн permissions-procedure.
5
+ description: Паттерн правила typescript-conventions. Брать при заведении или правке процедуры Connect на бэкенде: готовый класс с полем метода и обработчиком, зависимости конструктором, имена файла и класса. Доступ к процедуре описывает правило доступа того дерева, где оно есть.
6
6
  ---
7
7
 
8
8
  # Процедура Connect
@@ -41,7 +41,8 @@ export class PingProcedure implements IConnectProcedure<typeof HealthService.met
41
41
  }
42
42
  ```
43
43
 
44
- Объявление доступа обязательно, и оно ровно одно паттерн `permissions-procedure`.
44
+ Объявление доступа обязательно, и оно ровно одно; чем оно объявляется, говорит правило
45
+ доступа того дерева, где такое правило есть.
45
46
 
46
47
  ## Почему форма такая
47
48
 
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: autonomous-work
3
+ kind: rule
4
+ law: autonomous-work
5
+ description: Правило под «Закон об автономном заходе». Брать, когда владелец ушёл и просил работать самостоятельно: череда веток, умолчание вместо вопроса, местная работа без отдачи наружу, список сделанного к утру. Паттерн autonomous-work-run. Ход одной работы — правило task-flow.
6
+ ---
7
+
8
+ # Автономный заход — как это устроено здесь
9
+
10
+ Правило под закон `docs/constitution/autonomous-work.md`. Закон говорит, что должно быть верно,
11
+ когда владельца нет рядом; здесь — чем это названо в дереве и что меняется в обычном ходе
12
+ работы. Сам ход работы — правило `task-flow`, конец хода — `turn-conduct`, поставка —
13
+ `git-workflow`: автономный заход их не отменяет, а сужает.
14
+
15
+ ## Как это называется здесь
16
+
17
+ | В законе | Здесь |
18
+ | ----------------------------- | ---------------------------------------------------------------------------- |
19
+ | автономный заход | просьба владельца работать без него, названная словами и границей по времени |
20
+ | умолчание вместо вопроса | строка «Решения» в разборе просьбы: принятое, довод и цена ошибки |
21
+ | работа, видная снаружи | пуш ветки, открытие заявки, слияние, публикация пакета, отправка груза |
22
+ | череда | ветка каждой следующей работы заводится от ветки предыдущей |
23
+ | список к утру | последняя реплика захода: работа, ветка, чем подтверждена, чего ждёт |
24
+ | отложенная работа | задача, которой нужно слово владельца: состояние на борде не двигается |
25
+
26
+ ## Где это лежит
27
+
28
+ В этом дереве — таблица в `implementation.md` рядом: чем объявляется автономный заход, где
29
+ ведётся список к утру и какой ключ у задач череды. Пути живут там, а не здесь: правило
30
+ переносится между репозиториями, а раскладка у каждого дерева своя.
31
+
32
+ ## Ход
33
+
34
+ ```mermaid
35
+ flowchart TD
36
+ A[Владелец объявил автономный заход] --> B[Берётся задача из очереди работ]
37
+ B --> C{Нужно слово владельца}
38
+ C -->|Да| D[Задача откладывается целиком, довод пишется в список к утру]
39
+ C -->|Нет| E[Ветка заводится от предыдущей работы, а не от главной]
40
+ E --> F[Папка задачи, разбор просьбы с умолчаниями, замысел]
41
+ F --> G[Работа этапами; каждый этап кончается коммитом]
42
+ G --> H{Признак готовности проверяется командой}
43
+ H -->|Нет команды| D
44
+ H -->|Есть| I[Прогон; красное чинится в той же ветке]
45
+ I --> J[Папка задачи разбирается в описание прошлого]
46
+ J --> K{Ночь не кончилась}
47
+ K -->|Да| B
48
+ K -->|Нет| L[Список к утру: что сделано, где лежит, чем подтверждено, чего ждёт]
49
+ D --> K
50
+ ```
51
+
52
+ ## Как закон применяется здесь
53
+
54
+ - **Ветка следующей работы заводится от предыдущей, а не от главной.** Первая — от главной,
55
+ каждая следующая — от вершины прошлой: `git checkout -b <ключ>-<номер>-<slug> <прошлая ветка>`.
56
+ Владелец вливает их по очереди снизу вверх, и заявка каждой стоит на предыдущей.
57
+ - **Наружу за ночь не уходит ничего.** Ни пуша, ни заявки, ни слияния, ни публикации, ни
58
+ отправки груза в приём: всё это видно другим, а отменяет их человек. Отметки груза,
59
+ требующие слияния, тоже ждут — они утверждают то, чего в главной ветке ещё нет.
60
+ - **Задача, которой нужно слово владельца, не берётся вовсе.** Её состояние на борде не
61
+ двигается: взятая и отложенная задача выглядит начатой, а следующий заход её пропускает.
62
+ - **Умолчание записывается там же, где записался бы ответ владельца.** Строкой в разборе
63
+ просьбы: что принято, почему и что будет стоить ошибка. Молчаливое умолчание неотличимо от
64
+ знания.
65
+ - **Признак готовности называется командой до начала этапа.** Взгляд исполнителя в автономном
66
+ заходе не подтверждает ничего: проверить его некому до утра.
67
+ - **Красный прогон чинится в той же ветке, а не откладывается.** Отложенный, он достаётся
68
+ владельцу вместе с веткой, которую нельзя влить.
69
+ - **Отказ стража — шаг работы, а не конец захода.** Он называет пропущенное; пропущенное
70
+ делается, и работа идёт дальше. Обход стража остаётся запрещённым и в автономном заходе.
71
+ - **Список к утру пишется по ходу, а не вспоминается в конце.** Каждая закрытая работа
72
+ дописывает свою строку: ночь длиннее окна, и вспомнить её целиком к утру нечем.
73
+
74
+ ## Чего из закона здесь нет
75
+
76
+ Границы захода по времени не проверяет ничто: заход кончается тогда, когда кончилась работа или
77
+ владелец сказал слово. Соблюдение запрета на видимое снаружи держится тем же — правилом, а не
78
+ стражем: команда пуша ничем не отличается от той, что делается днём.
79
+
80
+ ## Паттерны
81
+
82
+ - `autonomous-work-run` — готовый цикл ночи: череда веток, запись умолчания, список к утру,
83
+ разбор отказа стража.
84
+
85
+ ## Ловушки
86
+
87
+ - **Ветка, заведённая от главной по привычке, ломает череду.** Заметно это только у владельца и
88
+ только на втором вливании; чинится перезаведением ветки, пока работа не ушла далеко.
89
+ - **Задача, отложенная без строки в списке, теряется.** Утром её не видно ни на борде, ни в
90
+ ветках: она выглядит просто не взятой.
91
+ - **Умолчание, записанное в теле коммита, до владельца не доходит.** Он читает список и папку
92
+ задачи, а не историю ветки.
@@ -86,6 +86,12 @@ flowchart TD
86
86
  стенд; признак, которым закрыт экран, приходит подменённым профилем. Просьба к человеку сделать
87
87
  шаг проверки — набрать пароль, открыть вкладку, нажать кнопку — означает неверно выбранный
88
88
  путь, а не нехватку прав у исполнителя.
89
+ - **Правка числа элементов в контейнере — это правка раскладки.** Стили она не трогает, и потому
90
+ читается как правка разметки, а проверка сводится к кодам ответа: страницы отвечают на всех
91
+ локалях, а документ уже вдвое шире вьюпорта. Закрывается она замером — ширина документа против
92
+ ширины вьюпорта на узком экране, — а не взглядом на снимок: снимок показывает то, что влезло в
93
+ кадр. Ряд без переноса и без узкой раскладки, выросший с четырёх элементов до восьми, продержал
94
+ боковую прокрутку на каждой странице сайта сорок четыре минуты прода.
89
95
  - **Замер делается на самом длинном значении, а не на образцовом.** Наезд, вылезание за край и
90
96
  обрезка без признака видны только там, где содержимое в своё место не влезает; на коротком
91
97
  значении всё три выглядят исправными. Значение для замера берётся предельное — то, какое узел
@@ -96,6 +96,13 @@ flowchart TD
96
96
  тот, кто пушит.** Оно законно несёт след любой недоделанной ветки, и сверка с ним держала бы
97
97
  чужую правку. Гейт и выкатка зовут одну и ту же проверку — иначе «сошлось» станет значить в
98
98
  двух местах разное.
99
+ - **Пропуск сверки схемы законен, пока ветка не трогала хранилища.** Погашенная база — состояние
100
+ машины, а не повод отбить пуш документации; но ветка, правившая схему или миграции, без прогона
101
+ цепочки уезжает в главную вслепую, и падает не она, а выкатка. Проверка в такой ветке отказывает
102
+ и называет, чем базу поднять.
103
+ - **Упавшая выкатка видна сверкой очереди работ отдельно от отставшего прода.** Слияние — ещё не
104
+ выкатка: отказавшая оставляет главную ветку впереди сервера, и слияния поверх уедут туда же.
105
+ Отставание считается по последней успешной выкатке и «не запускали» от «упала» не отличает.
99
106
 
100
107
  - **Проверка, стоящая в наборе гейта, отказывает, когда не сумела отработать.** «Проверять
101
108
  негде» и «проверка сломана» — разные вещи: первое дерево называет само — нет предмета, не задан
@@ -123,6 +123,13 @@ flowchart TD
123
123
  тот, кто пушит.** Оно законно несёт след любой недоделанной ветки, и сверка с ним держала бы
124
124
  чужую правку. Гейт и выкатка зовут одну и ту же проверку — иначе «сошлось» станет значить в
125
125
  двух местах разное.
126
+ - **Пропуск сверки схемы законен, пока ветка не трогала хранилища.** Погашенная база — состояние
127
+ машины, а не повод отбить пуш документации; но ветка, правившая схему или миграции, без прогона
128
+ цепочки уезжает в главную вслепую, и падает не она, а выкатка. Проверка в такой ветке отказывает
129
+ и называет, чем базу поднять.
130
+ - **Упавшая выкатка видна сверкой очереди работ отдельно от отставшего прода.** Слияние — ещё не
131
+ выкатка: отказавшая оставляет главную ветку впереди сервера, и слияния поверх уедут туда же.
132
+ Отставание считается по последней успешной выкатке и «не запускали» от «упала» не отличает.
126
133
 
127
134
  - **Проверка, стоящая в наборе гейта, отказывает, когда не сумела отработать.** «Проверять
128
135
  негде» и «проверка сломана» — разные вещи: первое дерево называет само — нет предмета, не задан
@@ -98,6 +98,13 @@ flowchart TD
98
98
  тот, кто пушит.** Оно законно несёт след любой недоделанной ветки, и сверка с ним держала бы
99
99
  чужую правку. Гейт и выкатка зовут одну и ту же проверку — иначе «сошлось» станет значить в
100
100
  двух местах разное.
101
+ - **Пропуск сверки схемы законен, пока ветка не трогала хранилища.** Погашенная база — состояние
102
+ машины, а не повод отбить пуш документации; но ветка, правившая схему или миграции, без прогона
103
+ цепочки уезжает в главную вслепую, и падает не она, а выкатка. Проверка в такой ветке отказывает
104
+ и называет, чем базу поднять.
105
+ - **Упавшая выкатка видна сверкой очереди работ отдельно от отставшего прода.** Слияние — ещё не
106
+ выкатка: отказавшая оставляет главную ветку впереди сервера, и слияния поверх уедут туда же.
107
+ Отставание считается по последней успешной выкатке и «не запускали» от «упала» не отличает.
101
108
 
102
109
  - **Проверка, стоящая в наборе гейта, отказывает, когда не сумела отработать.** «Проверять
103
110
  негде» и «проверка сломана» — разные вещи: первое дерево называет само — нет предмета, не задан
@@ -126,6 +126,19 @@ flowchart TD
126
126
  строка в шапке дешевле правки всех ссылающихся записей и прошлого не трогает.
127
127
  <!-- rt-when: *.md -->
128
128
 
129
+ - **Словарь правится там, откуда он собирается, а не там, где читается.** Он уезжает в контекст
130
+ каждой сессии целиком и оттого читается обычным документом дерева, а собран он раскладкой, как
131
+ всякий ресурс с шапкой: правка на месте живёт до следующей раскладки и пропадает молча, а до
132
+ тех пор раскладка отказывает по словарю целиком. Адрес надстройки называет компаньон правила, и
133
+ вводная, которую печатает хук запуска, выводит его из шапки сама.
134
+ <!-- rt-when: *.md -->
135
+
136
+ - **Раздел надстройки замещает одноимённый раздел набора целиком, а не дописывает в него.** Своё
137
+ слово поэтому кладётся в свой раздел, названный иначе, чем любой из разделов набора: положенное
138
+ в одноимённый, оно уносит с собой весь пакетный раздел, и потеря видна только тому, кто помнит,
139
+ что там стояло.
140
+ <!-- rt-when: *.md -->
141
+
129
142
  - **Словарь работы и язык экрана — два разных словаря.** Слово, которым слой правил зовёт своё
130
143
  понятие, для человека за экраном ничего не значит: он не читал ни одного правила и читать не
131
144
  будет. Термин словаря в подписи кнопки, колонки или пустого состояния — это внутреннее слово,
@@ -163,6 +176,11 @@ flowchart TD
163
176
  оставляет автору: открытый вопрос пишется теми же словами, что и обещание, а дата и номер —
164
177
  такие же числа, как то, что пересчитывают.
165
178
 
179
+ Ответ владельцу не читает ни одна проверка, а промахи в нём те же, что в тексте дерева:
180
+ выдуманный факт, поданный наравне с проверенным, и оценка чужого решения вместо исполнения.
181
+ Ловит их только владелец — то есть уже прочитав. Правило действует на ответ так же, как на файл;
182
+ разница в том, что за файл отвечает гейт, а за ответ — автор.
183
+
166
184
  На комментарии в коде правило распространяется, но гейтом не требуется: он зовёт его только
167
185
  на `.md`. Расширять требование на каждый `.ts` значило бы шуметь на каждой правке, поэтому
168
186
  здесь оно держится памятью автора — и цена этого видна: слова из левой колонки словаря живут
@@ -157,12 +157,21 @@ flowchart TD
157
157
  только то, что импортировано тестом: ошибка типов в непокрытом коде доживает до сборки
158
158
  образа, то есть до слияния. Четыре слияния подряд так и уехали в главную ветку, ломая
159
159
  выкатку.
160
+ - **На машине, где раннеров несколько, любой путь от домашнего каталога общий.** Умолчание
161
+ готового шага опасно именно тем, что оно общее: соседнее задание переписывает его под свою
162
+ версию, пока наше стоит между шагами. Каталог установки, имя контейнера и имя сборщика
163
+ называются поэтому по проекту и постоянно, а временный каталог решением не бывает — в нём
164
+ живёт хранилище пакетов.
160
165
  - **Набор гейта пуша не бывает уже набора конвейера.** Гейт — обещание, что пуш не приедет
161
166
  красным; набор, из которого выкинуты сборка и снимки, обещает то, чего не проверяет. Шаг
162
167
  конвейера, которому в наборе гейта нет ни строки, ни объявленного исключения с причиной,
163
168
  отбивает пуш, а не печатается рядом с ним: напечатанное предупреждение исполнитель читает как
164
169
  разрешение. Дважды подряд правка, прошедшая гейт целиком, была отбита конвейером — и оба раза
165
170
  зелёный гейт был прочитан как «локально всё зелено».
171
+ - **Итоговый набор перед пушем читается разбором состояния, а не сборкой в уме.** Он собирается
172
+ из умолчания пакета и надстройки дерева, и прочитать сборку было нечем: раздел «набор перед
173
+ пушем» печатает его целиком, по команде на строку, а рядом называет то, что умолчание печатало,
174
+ а в набор не попало. Дерево, писавшее надстройку вслепую, дописывало в неё повтор.
166
175
  - **Причина исключения, называющая задачу, судится на живость этой задачи.** Отсрочка со сроком
167
176
  и отсрочка без срока выглядят одинаково, пока номер никто не спросил; мёртвый номер в причине
168
177
  делает исключение бессрочным, не сказав об этом ни строкой. Спрашивается тем же ярусом, что
@@ -184,6 +193,10 @@ flowchart TD
184
193
  сломана, она описывает вчерашний день. Сравнение веток пишется от `origin/main` целиком —
185
194
  смешав в одной команде удалённую ссылку для одной стороны и локальную для другой, промах
186
195
  изнутри выглядит правильным.
196
+ - **Удалённую ссылку берут не только слова, но и действия.** Основание новой ветки, счёт влитого
197
+ и подтягивание главной судятся по ней же: локальная — снимок последнего подтягивания, и работа,
198
+ начатая от неё, стартует от основания, которого в главной уже нет. Влитая ветка при ней числится
199
+ невлитой, и уборка кончается списком невлитого, которого нет.
187
200
  - **Рабочий элемент привязывается к PR при создании, а не после.** `az repos pr create`
188
201
  принимает `--work-items`; привязка второй командой обходится молча, когда у токена нет права
189
202
  править чужой элемент, и PR остаётся ни с чем не связанным.