@rt-tools/agent-kit 0.16.0 → 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 (106) 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/proposal-guard.sh +17 -1
  22. package/assets/hooks/skill-gate-layers.sh +7 -0
  23. package/assets/hooks/skill-gate.sh +29 -0
  24. package/assets/hooks/task-context-load.sh +10 -0
  25. package/assets/hooks/task-flow-context.sh +185 -0
  26. package/assets/hooks/task-flow-draft-guard.sh +92 -0
  27. package/assets/hooks/task-flow-guard.sh +27 -159
  28. package/assets/hooks/turn-exit-guard.sh +8 -1
  29. package/assets/hooks/window-fill-guard.sh +5 -1
  30. package/assets/laws/delivery.md +19 -0
  31. package/assets/laws/frontend-application.md +4 -0
  32. package/assets/laws/verifiability.md +21 -0
  33. package/assets/laws/work-conduct.md +15 -0
  34. package/assets/patterns/browser-verification-stand.md +7 -2
  35. package/assets/patterns/doc-style-write.md +41 -1
  36. package/assets/patterns/git-workflow-commit.github.md +15 -2
  37. package/assets/patterns/git-workflow-docker.md +14 -0
  38. package/assets/patterns/git-workflow-merge.md +18 -0
  39. package/assets/patterns/git-workflow-migration.md +11 -0
  40. package/assets/patterns/git-workflow-pr.github.md +6 -1
  41. package/assets/patterns/git-workflow-secrets.md +14 -0
  42. package/assets/patterns/git-workflow-stack.md +63 -1
  43. package/assets/patterns/spec-driven-domain.md +34 -1
  44. package/assets/patterns/spec-driven-rule.md +11 -0
  45. package/assets/patterns/spec-driven-sweep.md +57 -0
  46. package/assets/patterns/task-flow-archive.md +46 -14
  47. package/assets/patterns/task-flow-close.md +78 -2
  48. package/assets/patterns/task-flow-resume.md +17 -5
  49. package/assets/patterns/task-flow-start.md +42 -4
  50. package/assets/pitfalls/agent-kit.md +73 -3
  51. package/assets/pitfalls/doc-style.md +5 -0
  52. package/assets/pitfalls/git-workflow.github.md +68 -0
  53. package/assets/pitfalls/spec-driven.md +16 -0
  54. package/assets/pitfalls/task-flow.md +93 -0
  55. package/assets/pitfalls/turn-conduct.md +14 -0
  56. package/assets/rules/browser-verification.md +39 -0
  57. package/assets/rules/deploy-flow.azure.md +8 -0
  58. package/assets/rules/deploy-flow.github.md +18 -0
  59. package/assets/rules/deploy-flow.gitlab.md +8 -0
  60. package/assets/rules/doc-style.md +14 -0
  61. package/assets/rules/git-workflow.azure.md +5 -0
  62. package/assets/rules/git-workflow.github.md +85 -75
  63. package/assets/rules/git-workflow.gitlab.md +5 -0
  64. package/assets/rules/reuse-first.md +8 -0
  65. package/assets/rules/shared-code.md +5 -0
  66. package/assets/rules/spec-driven.md +14 -0
  67. package/assets/rules/task-flow.md +112 -112
  68. package/assets/rules/testing.md +14 -1
  69. package/assets/rules/turn-conduct.md +40 -27
  70. package/assets/rules/turn-entry.md +6 -0
  71. package/assets/samples/tasks/_template/grill.md +5 -0
  72. package/assets/samples/tasks/_template/plan.md +3 -0
  73. package/assets/skills/agent-kit.md +99 -76
  74. package/assets/templates/postmortem.md +5 -1
  75. package/bin/agent-kit.d.ts.map +1 -1
  76. package/bin/agent-kit.js +30 -6
  77. package/bin/agent-kit.js.map +1 -1
  78. package/lib/catalog.d.ts.map +1 -1
  79. package/lib/catalog.js +2 -1
  80. package/lib/catalog.js.map +1 -1
  81. package/lib/commands.d.ts.map +1 -1
  82. package/lib/commands.js +96 -7
  83. package/lib/commands.js.map +1 -1
  84. package/lib/hooks-map.d.ts +26 -0
  85. package/lib/hooks-map.d.ts.map +1 -1
  86. package/lib/hooks-map.js +58 -2
  87. package/lib/hooks-map.js.map +1 -1
  88. package/lib/sections.d.ts +6 -0
  89. package/lib/sections.d.ts.map +1 -1
  90. package/lib/sections.js +19 -0
  91. package/lib/sections.js.map +1 -1
  92. package/lib/shipment.d.ts +2 -0
  93. package/lib/shipment.d.ts.map +1 -1
  94. package/lib/shipment.fixture.d.ts +5 -0
  95. package/lib/shipment.fixture.d.ts.map +1 -1
  96. package/lib/shipment.fixture.js +7 -0
  97. package/lib/shipment.fixture.js.map +1 -1
  98. package/lib/shipment.js +13 -1
  99. package/lib/shipment.js.map +1 -1
  100. package/lib/sync.d.ts +35 -3
  101. package/lib/sync.d.ts.map +1 -1
  102. package/lib/sync.js +59 -8
  103. package/lib/sync.js.map +1 -1
  104. package/package.json +1 -1
  105. package/rt-tools-agent-kit-0.17.0.tgz +0 -0
  106. package/rt-tools-agent-kit-0.16.0.tgz +0 -0
@@ -57,6 +57,51 @@
57
57
  расспрашивает владельца заново. Имя черновику дают словами просьбы, а ветке — терминологией
58
58
  договорённости; те же слова, да не те же.
59
59
 
60
+ - **Ожидание одной части этапа остановкой этапа не бывает.** Части, которые от ожидаемого не
61
+ зависят, делаются тем же ходом: сказать «стоит приёмка» и не тронуть остальное — это
62
+ остановка всей работы по причине, действующей на её десятую часть. Правило говорит про
63
+ задачу, и «стоит одна часть» прочитывается по нему как «стоит работа» — при пяти частях этапа
64
+ ждала одна.
65
+
66
+ - **Строка с путём поручением не бывает.** Адрес называет файл, а не действие; прочитанный как
67
+ задание, он даёт заходу работу, которой владелец не просил. То же с любой репликой без
68
+ глагола: спросить, что с этим делать, дешевле, чем написать полсотни файлов мимо просьбы.
69
+
70
+ - **Тело задачи, написанное вперёд замысла, называет способ, и способ стареет раньше дефекта.**
71
+ Задача серии заводится за недели до того, как её берут, и к этому дню предложенный ход бывает
72
+ уже неверен: привезённое пакетом умеет то, что задача звала написать, названного места в
73
+ дереве не осталось, а посылки, на которых ход стоял, разведка не подтверждает. Читается такое
74
+ тело как действующее указание, поэтому работа начинается с чтения того файла, к которому
75
+ задача относится, а не с исполнения её тела. Расхождение уходит решением по ходу и меняет
76
+ способ, но не цель.
77
+
78
+ - **Работа, упершаяся в разрешение, доводится до конца без той части, которую разрешение
79
+ открывает.** Чужой шаг бывает двух родов: прогон и разбор идут сами и кончатся без
80
+ исполнителя, а отбитое разрешение не кончится никогда — его ждут, и ход, объявивший об этом,
81
+ останавливает работу целиком. Делается всё, что от разрешения не зависит, а непройденное
82
+ пишется строками тела заявки — там его читает ревьювер; реплика владельцу живёт до следующего
83
+ сообщения и в приёмку не попадает.
84
+
85
+ - **Слово владельца об устройстве — постановка, а не решение.** Названное им обычно уже живёт
86
+ в дереве под этим самым словом: у него есть имя на экране, раздел в спеке и поле в модели, и
87
+ сверка стоит одного поиска. Истолкованное по ближайшему коду, слово выглядит исполненной
88
+ просьбой ровно до приёмки: правка при этом влита, а владельцу вместо поля в приложении
89
+ досталась работа в чужой консоли. Разошлось прочтение с деревом — спрашивается владелец, и
90
+ спрашивается до правки.
91
+
92
+ - **Указание работать по ходу — это указание делать его шаги, включая меняющие историю.**
93
+ Отметка сделанного этапа, отправка ветки и открытие заявки ходом предписаны, и отдельного
94
+ слова на каждый не требуется: спросить надо о том, чего в ходе нет вовсе. Изъятие приходит
95
+ из общего запрета дерева на действие без просьбы, прочитанного как требование буквального
96
+ слова, — и получается указание, исполненное наполовину. Граница у этого одна: прямое слово
97
+ владельца о самом шаге. Сказано «ветку не отправляй» — она не отправляется, сколько бы раз
98
+ ход её ни предписывал.
99
+
100
+ - **Строка ожидания живёт дольше причины, по которой её написали.** Записанная в ход работы,
101
+ она приходит в следующий заход раньше любой реплики и подтверждает себя сама: три указания
102
+ подряд не пересилили одну строку на диске. Снимается она тем же ходом, которым владелец
103
+ ответил, — а не тем, в котором о ней вспомнили.
104
+
60
105
  - **У меню с закрытым набором нет строки «вопрос не тот».** Вариантами вопрос выглядит
61
106
  разобранным, и владельцу, чтобы отвергнуть саму постановку, приходится выходить из набора
62
107
  руками. Спрашивают меню то, где выбор действительно закрыт; там, где под сомнением сама
@@ -82,9 +127,57 @@
82
127
  работой, а не отдельной правкой.
83
128
  - **Папка, уехавшая в главную ветку.** Три раза подряд папка закрытой задачи так и уехала
84
129
  неразобранной, в последний раз их набралось пять.
130
+ - **Этап, вставший из-за одной своей части.** Этап состоял из пяти частей, одна ждала поднятых
131
+ владельцем серверов — встали все пять. Остальные четыре от ожидаемого не зависели ничем.
132
+
133
+ - **Замысел эпика, положенный каждым заходом заново, теряет решения предыдущих.** Имя, адрес и
134
+ способ, названные владельцем по ходу, живут там же, где состав и порядок задач.
135
+ - **Чтение обхода из самой команды работает и без сети.** Строка `Task-folder-skip:` читается и
136
+ из тела заявки, и из текста вызова: второй путь остаётся, когда хостинг недоступен.
137
+ - **Черновик без номера — единственная папка, которой в истории нет.** Заводить её туда нечего,
138
+ пока нет имени.
139
+ - **На борде эпик из десяти задач выглядит одной.** Заведённые по одной, они прячут объём:
140
+ владелец видит карточку, а не десять.
141
+ - **Разбор закрытой работы ведёт роль разбора закрытой задачи.** Дерево, её не разложившее,
142
+ ведёт разбор само.
143
+ - **Перечень состояний нужен владельцу в начале работы.** Без него после шести вопросов не видно
144
+ ни того, что будет дальше, ни сколько всего впереди.
145
+ - **Хвост отданной работы — четыре шага:** открыть заявку, дождаться прогона, снять черновик,
146
+ попросить влить. Состояния на диске у них уже нет.
147
+ - **Разбор из одной строки проходит гард так же, как разбор на сто.** Образец разбора
148
+ перечисляет шесть обязательных вопросов таблицей, и пустая таблица проходит наравне с
149
+ заполненной.
150
+ - **Отказ гарда разговора исполняется задним числом.** Владелец видит незаданный вопрос вместе с
151
+ отбитым ходом: прозаический вопрос инструментом не является, и раньше поймать его нечем. Гард
152
+ отмечает пропуск, но не отменяет его.
153
+ - **Обход требования папки нужен там, где работа вливается частями.** Тогда её до конца не
154
+ разбирают, а причина остаётся в заявке.
155
+ - **Строка состояния точнее всякого обещания.** Её видно в файле, её читает страж, за ней стоит
156
+ перечень с обязательным действием — и потому переведённая вперёд она не выдаёт себя ничем.
157
+ - **Ход работы, живущий в рабочем дереве, не виден никому.** Владелец видит ветку без единого
158
+ следа того, что в ней делается, а следующий заход находит пустоту вместо «Где стоим». Это
159
+ второе следствие незакоммиченной папки, и оно тише первого: отказа не приходит вовсе.
160
+ - **Шапка раскладки, оставленная в копии образца, отбивает первую же правку разбора просьбы.**
161
+ Отказ при этом уводит править образец пакета вместо копии под задачу.
162
+ - **Правка по замечаниям идёт без замысла на диске.** Папка разобрана коммитом ветки раньше
163
+ открытия заявки, и состояния у работы с этой минуты нет: судит её история ветки.
164
+ - **Прогон, поставленный раньше дешёвых шагов, съел окно захода.** Потративший его на прогон
165
+ упирался в порог заполнения на четырёх строках привязки — то есть на работе минут на пять.
166
+ - **Граница состояния выглядит законченным куском лучше всякой вехи.** Владельцу отчёт о взятой
167
+ задаче неотличим от остановки: названы номер, ветка и колонка, и всё названное правда.
85
168
  - **Заявка на чужом языке.** В дереве, где заявки пишутся на другом языке, чужой заголовок
86
169
  дважды уехал на хостинг, и оба раза до него добрались глазами.
87
170
  - **Вопрос, утонувший в отчёте.** Владелец трижды переспрашивал, почему работа стоит, и каждый
88
171
  круг стоил захода обоим.
89
172
  - **Чужой эпик в списке очереди.** Дважды подряд следующей была взята первая задача чужого
90
173
  эпика — по списку она выглядела ровно как своя.
174
+
175
+ - **Некоммиченная папка задачи отказывает там, где чинить уже нечего.** Гард спрашивает её с
176
+ диска, поэтому все правки проходят без единого отказа, а признак отданной работы берётся из
177
+ истории ветки. Отказ приходит на открытии заявки — в минуту, когда папка разобрана своими
178
+ руками: замысел снят, и собирать его приходится заново по памяти. Владелец при этом всю
179
+ работу видит ветку без единого следа того, что в ней делается, а следующий заход находит
180
+ пустоту вместо «Где стоим».
181
+ - **Прогон, поставленный первым шагом закрытия, съедает окно захода.** Он стоит дороже всех
182
+ остальных шагов вместе, и потративший его на прогон упирался в порог заполнения на четырёх
183
+ строках привязки — то есть на работе, которая стоила бы минуты, если бы шла первой.
@@ -31,3 +31,17 @@
31
31
  - **Почему гард ожидания читает ход, а не хостинг.** Спросить хостинг было бы точнее, но сетевой
32
32
  вызов на завершении хода падает вместе со связью и отбивал бы работу вместо промаха, а вывод
33
33
  команды о прогоне в записи хода уже лежит.
34
+ - **Шаг, снятый из списка необратимых разбором прошлого промаха, обратно доводом не
35
+ возвращается.** Довод, которым его туда возвращают, уже разобран и отклонён: дважды подряд
36
+ готовая работа вставала перед снятым шагом, и со стороны это выглядело осторожностью.
37
+ - **Признак работы у стража знает первое слово команды.** Читающая подкоманда совпадала с ним
38
+ наравне с коммитом, и ход из одной разведки читался полным и заходом, и владельцем.
39
+ - **Незапушенная ветка, неотмеченная запись груза и незакрытая колонка чужими шагами не
40
+ бывают.** «Куда едет ветка, которую я сам завёл» — не тот вопрос, на который отвечает владелец.
41
+ - **Положение эпика пересказом по памяти не показывается.** Задачу закрывает слияние, которое
42
+ делает владелец, и вчерашнее состояние очереди врёт про уже влитое: таблица собирается заново
43
+ тем ходом, которым её показывают.
44
+
45
+ - **Замер, разбитый на уведомления по шагам, съедает ходы вхолостую.** Каждый его шаг назначает
46
+ себе ход, а наполнить ход нечем: дерево под идущей серией трогать нельзя, и остаётся пересказ
47
+ того, что придёт следующей строкой. Одно ожидание, кончающееся вместе с замером, стоит один ход.
@@ -71,6 +71,16 @@ flowchart TD
71
71
  сессии, не держится: после паузы следующий вызов открывает вкладку в другом профиле молча.
72
72
  - **Профиль не выбирается из списка и не спрашивается у владельца.** Список отдаёт неустойчивые
73
73
  имена, которые не опознают ничего, а выбор из него ведёт на профиль без входа.
74
+ - **Ненастроенная стража — повод остановиться, а не разрешение ехать.** Пропуск гарда при
75
+ молчащем помощнике сделан затем, чтобы сломанная обвязка не заводила работу в тупик, и
76
+ разрешением работать мимо профиля не является. Исполнитель, получивший от помощника пустой
77
+ вывод, называет это владельцу и браузер не водит: вкладка откроется в том профиле, который
78
+ расширение сочло активным, а какой это профиль — не знает никто.
79
+ - **Экран, закрытый входом, проверяется стендом с подменённым ответом входа, а не живой учётной
80
+ записью.** Приложение получает вход тем же путём, что у человека, — формой, — а отвечает на неё
81
+ стенд; признак, которым закрыт экран, приходит подменённым профилем. Просьба к человеку сделать
82
+ шаг проверки — набрать пароль, открыть вкладку, нажать кнопку — означает неверно выбранный
83
+ путь, а не нехватку прав у исполнителя.
74
84
  - **Замер делается на самом длинном значении, а не на образцовом.** Наезд, вылезание за край и
75
85
  обрезка без признака видны только там, где содержимое в своё место не влезает; на коротком
76
86
  значении всё три выглядят исправными. Значение для замера берётся предельное — то, какое узел
@@ -93,6 +103,13 @@ flowchart TD
93
103
  замеряются те же вычисленные значения, а выдумывается только содержимое строки. Обходом было
94
104
  бы измерить чужой экран и назвать это замером нужного.
95
105
 
106
+ - **Замер, который придётся повторять, снимает сквозная спека, а не драйвер.** Ширина окна,
107
+ положение узла и уход содержимого вбок читаются в ней теми же вычисленными значениями, вьюпорт
108
+ задаётся на весь набор, и число сходится при каждом прогоне — а замер руками живёт один заход
109
+ и уходит вместе с ним. Драйвер остаётся там, где смотрят на незнакомый экран: он отвечает на
110
+ «что тут происходит», а не подтверждает известное число. Вывод «замер снять нечем», сделанный
111
+ на закрытом входе, чаще всего означает, что искали не тем.
112
+
96
113
  Вывод о вёрстке подкрепляется числом: «выглядит нормально» результатом проверки не является.
97
114
  Этого не стережёт ничто — как измерять, разобрано в паттерне `browser-verification-measure`.
98
115
 
@@ -121,6 +138,21 @@ flowchart TD
121
138
  процесса, снятый разбором порта; им и останавливают, поштучно. Обратный промах тот же по
122
139
  природе — оболочка запускает процесс под именем, которого в шаблоне нет, и снятие не попадает
123
140
  ни во что.
141
+ - **Снятие процесса бывает отбито, и тогда стенд поднимается рядом, а не вместо.** Отбить его
142
+ может среда исполнения — и по своему же стенду прошлого захода; ни разрешение на команду, ни
143
+ переформулировка тут не помогают. Ход отсюда один: свободный порт для нового стенда, а список
144
+ оставленного называется владельцу в конце захода — снять их может только он. Не названные так,
145
+ стенды копятся заходами и держат соединения к хранилищу.
146
+ - **Замер снимает и сквозная спека, а не только драйвер браузера.** Ширина окна, положение узла
147
+ и уход документа вбок читаются в ней теми же вычисленными значениями, вьюпорт задаётся на набор
148
+ тестов, а результат повторяется при каждом прогоне — в отличие от замера руками, который живёт
149
+ ровно один заход. Драйвер остаётся там, где смотрят на незнакомый экран, а не подтверждают
150
+ известное число.
151
+ - **Утверждение о прод-сборке делается по самой сборке, а не по ветке.** Между веткой и тем, что
152
+ отдано читателю, стоит сборка образа: она подставляет значения окружения, вырезает
153
+ неиспользованное и переименовывает символы. Сказанное «в сборке лежит вот это» проверяется
154
+ поиском по отданному файлу — тем более когда речь идёт как раз о значении, которое сборка и
155
+ подставляет.
124
156
  - Инкрементальная сборка протухает поштучно: разметка бывает уже новая, а клиентский чанк — от
125
157
  компиляции до правки. Признак дев-сборки — имена бандла без хеша (`main.js`). Расхождение
126
158
  между `curl` и страницей после гидратации — повод пересобрать, а не искать дефект в коде.
@@ -129,6 +161,13 @@ flowchart TD
129
161
  только пакеты из `node_modules`, кода репозитория там нет вовсе. Вывод «дефекта нет, это
130
162
  кэш» закрывает разбор, поэтому принимается только после проверки на чистой сборке — три
131
163
  круга ушло на застрявшую панель ленты событий, пока дефект лежал в снятии аутлета.
164
+ - **Кэширующий шаг сборки без объявленных выходов отдаёт прошлое молча.** Попадание в кэш при
165
+ этом происходит, а восстанавливать нечего: сборщик не запускается, и в каталоге сборки
166
+ остаётся то, что лежало от прошлого раза. Стенд поднимает эту сборку, и приложение ведёт себя
167
+ как код, которого в дереве нет. Ловушка выше — про другой кэш: тот объясняет расхождение, этот
168
+ его создаёт, и вывод сборщика при нём зелёный. Прежде чем искать дефект в экране, у шага
169
+ сборки спрашивают объявленные выходы; проверяется это сносом каталога сборки и повторным
170
+ вызовом — после попадания в кэш он обязан восстановиться.
132
171
  - Сообщение `Angular debugging APIs are not available` в консоли принадлежит расширению
133
172
  Chrome, а не приложению: прод-сборка не публикует `window.ng`. Лечить правкой кода не надо —
134
173
  `window.ng` в проде это карта внутренностей в руках любого, кто откроет консоль.
@@ -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
  - **Убирает за собой и та машина, которая образы собирает.** Отбор у обеих один — своё имя
@@ -105,6 +115,14 @@ flowchart TD
105
115
  чужую правку. Гейт и выкатка зовут одну и ту же проверку — иначе «сошлось» станет значить в
106
116
  двух местах разное.
107
117
 
118
+ - **Проверка, стоящая в наборе гейта, отказывает, когда не сумела отработать.** «Проверять
119
+ негде» и «проверка сломана» — разные вещи: первое дерево называет само — нет предмета, не задан
120
+ адрес, служба не отвечает, — и каждый такой выход отдаёт ноль своей строкой. Второе —
121
+ недостающий пакет, пустое имя в настройке, непредвиденное исключение — отдаёт ненулевой код и
122
+ говорит, что сломалась сама проверка, а не предмет. Общий ноль на оба делает сломанную проверку
123
+ неотличимой от сошедшейся: сверка схемы с миграциями простояла так в наборе гейта, не сверяя
124
+ ничего, и прятала за своим нулём сразу три причины.
125
+
108
126
  ## Чего из закона здесь нет
109
127
 
110
128
  Состояние прода машине не видно: сверка очереди работ спрашивает последний прогон главной
@@ -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
  замысел предупреждают именно о снятом. Туда же — то, что появляется только после сборки,
@@ -155,6 +155,11 @@ flowchart TD
155
155
  отбивает пуш, а не печатается рядом с ним: напечатанное предупреждение исполнитель читает как
156
156
  разрешение. Дважды подряд правка, прошедшая гейт целиком, была отбита конвейером — и оба раза
157
157
  зелёный гейт был прочитан как «локально всё зелено».
158
+ - **Причина исключения, называющая задачу, судится на живость этой задачи.** Отсрочка со сроком
159
+ и отсрочка без срока выглядят одинаково, пока номер никто не спросил; мёртвый номер в причине
160
+ делает исключение бессрочным, не сказав об этом ни строкой. Спрашивается тем же ярусом, что
161
+ состояние задачи у гарда поставки: есть чем спросить — спрашивает, нет сети или доступа —
162
+ пропускает молча.
158
163
  - **Сверка раскладки стоит в наборе гейта пуша наравне с линтом и сборкой.** Правка, положенная
159
164
  в разложенную копию мимо источника, в день, когда её делают, не ломает ничего: дерево
160
165
  работает, проверки зелёные, а расхождение видно только тому, кто позовёт сверку сам. Копится