@rt-tools/agent-kit 0.14.0 → 0.15.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 (87) hide show
  1. package/README.md +17 -0
  2. package/assets/checks/check-board.github.mjs +16 -0
  3. package/assets/checks/check-descriptions.mjs +123 -0
  4. package/assets/checks/check-dupes.mjs +31 -3
  5. package/assets/checks/check-file-size.mjs +47 -2
  6. package/assets/checks/check-turn-map.mjs +20 -3
  7. package/assets/checks/lib-common.mjs +12 -1
  8. package/assets/checks/lib-domains.mjs +1 -1
  9. package/assets/checks/rt-kit-checks.config.mjs +17 -1
  10. package/assets/checks/spec-anchors.mjs +18 -3
  11. package/assets/checks/spec-common.mjs +5 -1
  12. package/assets/defaults/project.sh +21 -16
  13. package/assets/defaults/turn-map.md +15 -19
  14. package/assets/docs/GLOSSARY.md +52 -58
  15. package/assets/hooks/rule-article.sh +12 -0
  16. package/assets/hooks/skill-gate.sh +5 -4
  17. package/assets/hooks/task-flow-guard.sh +20 -0
  18. package/assets/hooks/turn-exit-guard.sh +229 -4
  19. package/assets/laws/delivery.md +92 -104
  20. package/assets/laws/frontend-application.md +4 -0
  21. package/assets/laws/project-documentation.md +64 -68
  22. package/assets/laws/verifiability.md +32 -33
  23. package/assets/laws/work-conduct.md +167 -157
  24. package/assets/patterns/doc-style-sweep.md +1 -1
  25. package/assets/patterns/doc-style-trace.md +1 -1
  26. package/assets/patterns/git-workflow-commit.azure.md +1 -1
  27. package/assets/patterns/git-workflow-commit.github.md +7 -1
  28. package/assets/patterns/git-workflow-commit.gitlab.md +1 -1
  29. package/assets/patterns/git-workflow-docker.md +1 -1
  30. package/assets/patterns/git-workflow-merge.md +14 -3
  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/git-workflow-restart.md +1 -1
  35. package/assets/patterns/git-workflow-secrets.md +1 -1
  36. package/assets/patterns/git-workflow-stack.md +93 -0
  37. package/assets/patterns/seo-page.md +1 -1
  38. package/assets/patterns/spec-driven-rule.md +55 -0
  39. package/assets/patterns/status-report-table.github.md +88 -0
  40. package/assets/patterns/task-flow-archive.md +3 -4
  41. package/assets/patterns/task-flow-close.md +6 -1
  42. package/assets/patterns/task-flow-start.md +17 -5
  43. package/assets/patterns/ts-procedure.md +1 -1
  44. package/assets/pitfalls/doc-style.md +5 -0
  45. package/assets/pitfalls/git-workflow.github.md +47 -0
  46. package/assets/pitfalls/task-flow.md +28 -0
  47. package/assets/pitfalls/testing.md +14 -0
  48. package/assets/pitfalls/turn-conduct.md +33 -0
  49. package/assets/rules/angular-patterns.md +1 -1
  50. package/assets/rules/api-layer.md +3 -3
  51. package/assets/rules/browser-verification.md +15 -1
  52. package/assets/rules/dependencies.md +1 -1
  53. package/assets/rules/deploy-flow.azure.md +1 -1
  54. package/assets/rules/deploy-flow.github.md +1 -1
  55. package/assets/rules/deploy-flow.gitlab.md +1 -1
  56. package/assets/rules/doc-style.md +7 -0
  57. package/assets/rules/entity-conventions.needs-admin.md +1 -1
  58. package/assets/rules/entity-models.md +1 -1
  59. package/assets/rules/git-workflow.azure.md +1 -1
  60. package/assets/rules/git-workflow.github.md +154 -181
  61. package/assets/rules/git-workflow.gitlab.md +1 -1
  62. package/assets/rules/lib-layers.md +1 -1
  63. package/assets/rules/observability.needs-app.md +1 -1
  64. package/assets/rules/platform-access.md +1 -1
  65. package/assets/rules/reuse-first.md +1 -1
  66. package/assets/rules/seo.md +4 -3
  67. package/assets/rules/shared-code.md +1 -1
  68. package/assets/rules/spec-driven.md +68 -1
  69. package/assets/rules/status-report.md +97 -0
  70. package/assets/rules/styling-bem.md +12 -0
  71. package/assets/rules/task-flow.md +102 -100
  72. package/assets/rules/testing.md +67 -66
  73. package/assets/rules/turn-conduct.md +146 -105
  74. package/assets/rules/turn-entry.md +7 -1
  75. package/assets/rules/typescript-conventions.md +1 -1
  76. package/assets/skills/agent-kit-extend.md +1 -1
  77. package/assets/skills/agent-kit.md +18 -1
  78. package/bin/agent-kit.d.ts.map +1 -1
  79. package/bin/agent-kit.js +25 -0
  80. package/bin/agent-kit.js.map +1 -1
  81. package/lib/cost.d.ts +44 -0
  82. package/lib/cost.d.ts.map +1 -0
  83. package/lib/cost.js +181 -0
  84. package/lib/cost.js.map +1 -0
  85. package/package.json +1 -1
  86. package/rt-tools-agent-kit-0.15.0.tgz +0 -0
  87. package/rt-tools-agent-kit-0.14.0.tgz +0 -0
@@ -2,7 +2,7 @@
2
2
  name: testing
3
3
  kind: rule
4
4
  law: verifiability
5
- description: Правило под «Закон о проверяемости». Брать при правке любого *.spec.ts и всего, что лежит в сквозных наборах дерева. Называет Vitest и Playwright, идентификатор сценария в заголовке, вынос решения в чистую функцию и то, что закрывается сквозной спекой. Готовый код — в паттернах testing-unit и testing-e2e.
5
+ description: Правило под «Закон о проверяемости». Брать при правке любой спеки и всего, что лежит в сквозных наборах дерева. Называет идентификатор сценария в заголовке, вынос решения в чистую функцию и то, что закрывается сквозной спекой. Паттерны: testing-unit, testing-e2e.
6
6
  ---
7
7
 
8
8
  # Проверяемость — как это устроено здесь
@@ -63,99 +63,100 @@ flowchart TD
63
63
  ```
64
64
 
65
65
  ## Как закон применяется здесь
66
-
67
- - **Идентификатор сценария стоит в начале заголовка теста, через тире.** Один сценарий
68
- проверяется несколькими тестами, один тест закрывает несколько сценариев.
69
- - **Сценарий без теста несёт отметку с причиной.** Пустая отметка не принимается, а отметка
70
- при существующем тесте отказ: она означает, что долг закрыли, а отметку не сняли.
71
- - **Тест, идущий не тем путём, что пользователь, помечается частичным покрытием.** В сводку
72
- он попадает долгом, а не покрытием.
66
+ - **Идентификатор сценария стоит в начале заголовка теста, через тире.** Один сценарий проверяется
67
+ несколькими тестами, один тест закрывает несколько сценариев.
68
+ - **Сценарий без теста несёт отметку с причиной.** Пустая отметка не принимается, а отметка при
69
+ существующем тесте отказ: она означает, что долг закрыли, а отметку не сняли.
70
+ - **Тест, идущий не тем путём, что пользователь, помечается частичным покрытием.** В сводку он
71
+ попадает долгом, а не покрытием.
73
72
  - **Сценарий, чьё «Тогда» называет человека и то, что он видит, закрывается сквозным тестом.**
74
- Юнит на тот же расчёт остаётся долгом: между верным решением и тем, что человек его видит,
75
- лежит всё, чего юнит не касался.
73
+ Юнит на тот же расчёт остаётся долгом: между верным решением и тем, что человек его видит, лежит
74
+ всё, чего юнит не касался.
76
75
  - **Сквозной тест, погашенный переменной окружения, покрытием не считается.** Выключатель по
77
76
  состоянию стенда — пропуск случая, выключатель по переменной — невыполненный тест.
78
77
  - **Упоминание в тесте сценария, которого в спеках нет, роняет проверку.** Так ловится
79
78
  переименованный или выкинутый сценарий: тесты при этом остаются зелёными.
80
- - **Решение выносится в чистую функцию и проверяется вызовом.** Компонент и сервис остаются
81
- тонкой обёрткой и отдельно не проверяются, пока своего ветвления у них нет.
79
+ - **Решение выносится в чистую функцию и проверяется вызовом.** Компонент и сервис остаются тонкой
80
+ обёрткой и отдельно не проверяются, пока своего ветвления у них нет.
82
81
  - **Решение, зависящее от текущего момента, принимает момент параметром.** Часы машины оно не
83
- читает: правило проверяется вызовом, а не подкруткой времени вокруг теста. Умолчание
84
- `= new Date()` ставится на границе — там, где решение зовёт процедура или служба.
85
- - **Процедура Connect проверяется вызовом своего метода с рукописным двойником базы.**
86
- Контейнер и роутер поднимать не надо: спека проверяет решение, а не раскладку полей.
82
+ читает: правило проверяется вызовом, а не подкруткой времени вокруг теста. Умолчание `= new
83
+ Date()` ставится на границе — там, где решение зовёт процедура или служба.
84
+ - **Жёсткая дата в образце это срок годности самой спеки.** Момент образца и момент, которым
85
+ зовут проверяемый код, берутся либо оба жёсткими, либо оба от часов: смешение двух видов даёт
86
+ спеку, зелёную в день, когда её пишут, и красную через сутки или неделю — на чужой правке, у
87
+ того, кто её не трогал. Ни линтер, ни сборка, ни сверка спеков времени не знают.
88
+ - **Процедура Connect проверяется вызовом своего метода с рукописным двойником базы.** Контейнер и
89
+ роутер поднимать не надо: спека проверяет решение, а не раскладку полей.
87
90
  - **Сид заводит то, без чего экран не открыть, и ничего, что гость примет за настоящее.**
88
- Содержимое, у которого есть автор, — отзывы, вопросы, обсуждения — гость читает как
89
- написанное людьми, а стенд собирается из той же базы, что и проверка глазами: три выдуманные
90
- цитаты дожили до отдельной задачи и всё это время выглядели отзывами. Настройки владельца —
91
+ Содержимое, у которого есть автор, — отзывы, вопросы, обсуждения — гость читает как написанное
92
+ людьми, а стенд собирается из той же базы, что и проверка глазами. Настройки владельца —
91
93
  контакты, адрес отправителя, ключи внешних служб — сид не заводит тоже: их вписывают в
92
94
  приложении. То, что нужно редко, включается признаком в окружении, а не сеется всем.
93
- - **Заведённая проверка встаёт в гейт пуша или в конвейер, а не только в сводную цель.**
94
- Сводная цель запускается руками, и проверка, которая живёт только в ней, отвечает тому, кто
95
- её вспомнил: молчание такой проверки читается как её зелёный ответ. Три проверки простояли
96
- вне гейта, объявляя в собственных списках известного, что падают на новом.
95
+ - **Заведённая проверка встаёт в гейт пуша или в конвейер, а не только в сводную цель.** Сводная
96
+ цель запускается руками, и проверка, которая живёт только в ней, отвечает тому, кто её вспомнил:
97
+ молчание такой проверки читается как её зелёный ответ. Три проверки простояли вне гейта,
98
+ объявляя в собственных списках известного, что падают на новом.
97
99
  - **Проверка, приехавшая раскладкой, приезжает и со своим местом.** Место — это имя команды,
98
100
  которой её зовут, и строка набора, в котором она стоит. Проверка без места узнаётся только по
99
101
  тому, что раскладка положила новый файл, и статья выше на неё не действует: вставать ей некуда.
100
102
  Так приехала проверка длины — той же редакцией, что и статья о её обязательном месте.
101
- - **Спека, необратимо меняющая данные стенда, выключена по умолчанию.** `BASE_URL` уводит
102
- прогон одной переменной, и без выключателя такая спека правила бы данные чужого стенда.
103
- - **Спеки, которым нужен nginx перед приложением, просыпаются вместе с `BASE_URL`.** Голый
104
- сервер отдачи страниц их не проходит: перенаправления живут в конфиге прокси.
105
- - **Правило линтера, которое запрещает принятый здесь приём, выключают в конфиге, а не
106
- обходят в каждом тесте.** Выключатель теста — приём этого дерева, а
107
- `playwright/no-skipped-test` запретил бы его сразу в шестидесяти пяти местах. Рядом со
108
- строкой отключения пишут причину, а точечный `eslint-disable` остаётся для того, что
109
- запрещено по делу.
103
+ - **Спека, необратимо меняющая данные стенда, выключена по умолчанию.** `BASE_URL` уводит прогон
104
+ одной переменной, и без выключателя такая спека правила бы данные чужого стенда.
105
+ - **Спеки, которым нужен nginx перед приложением, просыпаются вместе с `BASE_URL`.** Голый сервер
106
+ отдачи страниц их не проходит: перенаправления живут в конфиге прокси.
107
+ - **Правило линтера, которое запрещает принятый здесь приём, выключают в конфиге, а не обходят в
108
+ каждом тесте.** Выключатель теста — приём этого дерева, а `playwright/no-skipped-test` запретил
109
+ бы его сразу в шестидесяти пяти местах. Рядом со строкой отключения пишут причину, а точечный
110
+ `eslint-disable` остаётся для того, что запрещено по делу.
110
111
  - **Гард отпускает действие, когда сам сломался.** Нет разборщика входа, пустой ввод, не тот
111
- каталог, любая своя ошибка — гард выходит нулём и пропускает: сломанная проверка не имеет
112
- права заклинить работу. Объявляется это строкой `FAIL-OPEN` в шапке самого гарда, рядом с
112
+ каталог, любая своя ошибка — гард выходит нулём и пропускает: сломанная проверка не имеет права
113
+ заклинить работу. Объявляется это строкой `FAIL-OPEN` в шапке самого гарда, рядом с
113
114
  перечислением случаев, и туда же дописывается новый случай, когда он находится.
114
115
  - **Список известного у проверки именной и объясняет себя сам.** Первым полем перечня стоит имя
115
- проверки и слово о том, что перечисленное отказом не считается. Дальше либо два ключа —
116
- принятое остаётся навсегда, долг накоплен к заведению проверки и только сокращается, — либо
117
- столько ключей, сколько у записей родов. Причина обязательна: снятая проверка без причины
118
- через месяц неотличима от недосмотра.
116
+ проверки и слово о том, что перечисленное отказом не считается. Дальше либо два ключа — принятое
117
+ остаётся навсегда, долг накоплен к заведению проверки и только сокращается, — либо столько
118
+ ключей, сколько у записей родов. Причина обязательна: снятая проверка без причины через месяц
119
+ неотличима от недосмотра.
119
120
  - **Запись принятого отличается от долга тем, заведена ли на неё работа.** Принятое — то, что
120
121
  дерево делить не собирается; долг — то, на что заведена задача, и он только сокращается. Один
121
122
  список на оба означал бы, что разбирать нечего: запись без задачи через месяц читается как
122
123
  вечная, а запись с задачей — как недосмотр.
123
124
  - **У каждой записи стоят своя причина и номер задачи, которой она внесена.** Причина прозой на
124
125
  весь список объясняет любую его строку и потому не объясняет ни одной, а запись без номера не
125
- спросишь ни у кого: тот, кто её внёс, к этому дню не помнит ни повода, ни своего решения.
126
- Запись без причины или без номера отбивает проверку — и заводится она словом владельца, а не
127
- решением исполнителя, которому она в эту минуту мешает.
126
+ спросишь ни у кого: тот, кто её внёс, к этому дню не помнит ни повода, ни своего решения. Запись
127
+ без причины или без номера отбивает проверку — и заводится она словом владельца, а не решением
128
+ исполнителя, которому она в эту минуту мешает.
129
+ - **Запись списка, которую больше ничто не вызывает, снимается вместе с тем, что её вызывало.**
130
+ Такая строка молча разрешает то, чего в дереве нет, и следующий читатель принимает её за
131
+ действующее объяснение. Проверка на мёртвую запись бывает не у всякого списка, поэтому
132
+ снимается она тем же изменением, которым уходит вызвавшее её место.
128
133
  - **У красного есть назначенное действие, и второй перезапуск в него не входит.** Красное бывает
129
134
  двух родов, и в списке прогонов они выглядят одинаково: отказ хостинга на шаге подготовки
130
135
  лечится перезапуском, дефект ветки — не лечится им вовсе. Назначенное действие одно: сперва
131
136
  журнал этого задания, потом решение. Перезапуск, повторённый до чтения журнала, чинит не
132
137
  причину, а её проявление, и в истории выглядит работой.
133
- - **Строка в список известного не заводится под красную проверку.** Список набран к дню
134
- заведения проверки и с тех пор только сокращается: дописанная строка гасит сигнал, а не
135
- причину, и в истории выглядит так же, как починка. Место, где проверка права по букве и не
136
- права по существу, разбирает владелец, а до его ответа верна проверка.
137
- - **Тест, утверждающий отсутствие, зелен и тогда, когда ищет не то.** Совпадения нет ни у
138
- верного текста, ни у опечатки в образце, ни у переименованного ключа — отличить их по цвету
139
- прогона нечем. Отрицательное утверждение поэтому идёт в паре с положительным: сначала
140
- проверяется, что искомое место вообще найдено, и только потом — что в нём нет того, чего быть
141
- не должно.
142
- - **Заголовок теста обещает больше, чем тело проверяет, и сверка этого не видит.** Номер
143
- сценария в заголовке стоит сценарий числится покрытым, а что именно утверждается, не
144
- спрашивает никто. Тело читается вместе с заголовком: обещание в заголовке и утверждение в
145
- теле два разных текста, и расходятся они молча.
146
- - **Растр браузера называется явно, иначе кадр не сходится сам с собой.** Профиль цвета, взятый
147
- у дисплея машины, ускоритель, считающий растр, и дорисовка кусками каждый из трёх двигает
148
- цвет на единицу-другую по каналу, и видно это только там, где смешение стоит на границе
149
- округления: на сглаженных уголках тёмной темы. Ожидание вставшего кадра тут не помогает
150
- страница нарисована, а нарисована она каждый раз чуть иначе; расхождение гуляет по кадру,
151
- приходит примерно раз в четыре прогона и на светлых экранах не показывается вовсе, поэтому
152
- читается случайным. Все три называются доводами браузеру при запуске и становятся частью
153
- эталона.
138
+ - **Строка в список известного не заводится под красную проверку.** Список набран к дню заведения
139
+ проверки и с тех пор только сокращается: дописанная строка гасит сигнал, а не причину, и в
140
+ истории выглядит так же, как починка. Место, где проверка права по букве и не права по существу,
141
+ разбирает владелец, а до его ответа верна проверка.
142
+ - **Тест, утверждающий отсутствие, зелен и тогда, когда ищет не то.** Совпадения нет ни у верного
143
+ текста, ни у опечатки в образце, ни у переименованного ключа — отличить их по цвету прогона
144
+ нечем. Отрицательное утверждение поэтому идёт в паре с положительным: сначала проверяется, что
145
+ искомое место вообще найдено, и только потом — что в нём нет того, чего быть не должно.
146
+ - **Заголовок теста обещает больше, чем тело проверяет, и сверка этого не видит.** Номер сценария
147
+ в заголовке стоит сценарий числится покрытым, а что именно утверждается, не спрашивает никто.
148
+ Тело читается вместе с заголовком: обещание в заголовке и утверждение в теле — два разных
149
+ текста, и расходятся они молча.
150
+ - **Растр браузера называется явно, иначе кадр не сходится сам с собой.** Профиль цвета, взятый у
151
+ дисплея машины, ускоритель, считающий растр, и дорисовка кусками каждый из трёх двигает цвет
152
+ на единицу-другую по каналу, и видно это только там, где смешение стоит на границе округления:
153
+ на сглаженных уголках тёмной темы. Ожидание вставшего кадра тут не помогает страница
154
+ нарисована, а нарисована она каждый раз чуть иначе; Все три называются доводами браузеру при
155
+ запуске и становятся частью эталона.
154
156
  - **Маска закрывает содержимое, но не ширину.** Узел под маской занимает своё место в раскладке
155
- по-прежнему, и плывущее значение внутри него двигает соседей мимо маски: кадр списка уезжал на
156
- пиксель целиком, включая столбцы, где не менялось ничего. Там, где размер узла считается по
157
- содержимому ячейка таблицы, надпись, растягивающая кнопку, плывущее лечится в данных
158
- стенда постоянным значением, и тогда маска не нужна вовсе.
157
+ по-прежнему, и плывущее значение внутри него двигает соседей мимо маски. Там, где размер узла
158
+ считается по содержимому ячейка таблицы, надпись, растягивающая кнопку, плывущее лечится в
159
+ данных стенда постоянным значением, и тогда маска не нужна вовсе.
159
160
 
160
161
  ## Чего из закона здесь нет
161
162
 
@@ -2,7 +2,7 @@
2
2
  name: turn-conduct
3
3
  kind: rule
4
4
  law: work-conduct
5
- description: Правило под «Закон о ведении работы» — та его часть, что про один ход. Брать, когда ход заканчивают: чем он кончается и что его концом не бывает, что говорится владельцу о чужом шаге, чем подтверждается утверждение о дереве, что делает страж выходов хода, гард ожидания, гард разговора и гард происшествия, как закрывается заход по заполнению окна. Готовый порядок — в паттерне task-flow-handoff. Ход работы от просьбы владельца до слияния — правило task-flow.
5
+ description: Правило под «Закон о ведении работы» — про один ход. Брать, когда ход заканчивают: чем он кончается, что говорится владельцу о чужом шаге, чем подтверждается утверждение о дереве, что стерегут стражи. Паттерн task-flow-handoff. Ход работы целиком — правило task-flow.
6
6
  ---
7
7
 
8
8
  # Ход захода — как это устроено здесь
@@ -12,6 +12,9 @@ description: Правило под «Закон о ведении работы»
12
12
  от просьбы владельца до слияния, состояния работы и папка задачи — правило `task-flow`
13
13
  под тем же законом.
14
14
 
15
+ **Холодная часть:** `pitfalls.md` рядом — случаи и числа по разборам происшествий. Грузится по
16
+ требованию, а не вместе с правилом.
17
+
15
18
  ## Как это называется здесь
16
19
 
17
20
  | В законе | Здесь |
@@ -74,93 +77,120 @@ flowchart TD
74
77
  ## Как закон применяется здесь
75
78
 
76
79
  - **Сводка о чужом шаге.** Прогон, разбор владельцем и слияние идут без исполнителя и от взгляда
77
- быстрее не становятся. Ход, кончившийся такой сводкой, владелец читает как работу: она полна,
78
- в ней названы номера и состояния, и пустоты за ней не видно. О чужом шаге говорят вместе с
79
- начатым своим, а не вместо него. За один заход это было нарушено четырежды, и готовая работа
80
- простояла в невлитом PR почти три часа.
80
+ быстрее не становятся. Ход, кончившийся такой сводкой, владелец читает как работу: она полна, в
81
+ ней названы номера и состояния, и пустоты за ней не видно. О чужом шаге говорят вместе с начатым
82
+ своим, а не вместо него.
83
+ - **Свой незакрытый шаг владельцу не передаётся.** Список остатков, названный аккуратно, читается
84
+ как рассказ о работе — тем полнее, чем он аккуратнее, — и владелец разбирает то, что мог
85
+ доделать сам исполнитель. Чужой шаг сводкой называют, свой — делают: незапушенная ветка,
86
+ неотмеченная запись груза и незакрытая колонка чужими шагами не бывают.
81
87
  - **Меню при назначенном порядке.** Выбор, предложенный владельцу, пока эпик не кончился, — это
82
- просьба назначить порядок заново. Работы в эпике не осталось — так и говорится: эпик
83
- кончился, — а не «чем займёмся».
84
- - **Объявление намерения.** «Беру следующую задачу» — не то же самое, что взять её: фраза живёт
85
- до конца хода, а работа не двигается. Названо может быть только сделанное: номер заведённой
86
- задачи, имя заведённой ветки, переведённая колонка.
88
+ просьба назначить порядок заново. Работы в эпике не осталось — так и говорится: эпик кончился, —
89
+ а не «чем займёмся».
90
+ - **Объявление намерения.** «Беру следующую задачу» — не то же самое, что взять её: фраза живёт до
91
+ конца хода, а работа не двигается. Названо может быть только сделанное: номер заведённой задачи,
92
+ имя заведённой ветки, переведённая колонка.
87
93
  - **Названная командой работа запускается в том же ходе, где названа.** Строка «сейчас запущу»
88
- ходом не кончается: либо запуск уже был, либо ход не кончен. Названная поимённо команда
89
- выглядит начатой работой лучше всякого другого обещания — она точна, её видно, и по ней не
90
- отличить сделанного от собранного. Ответ владельцу пишется после вызова, а не вместо него:
91
- реплика посреди хода отвечается вместе с начатым действием. Дважды за сутки ход кончился
92
- ровно такой строкой, и оба раза владелец возвращал работу сам.
93
-
94
+ ходом не кончается: либо запуск уже был, либо ход не кончен. Названная поимённо команда выглядит
95
+ начатой работой лучше всякого другого обещания — она точна, её видно, и по ней не отличить
96
+ сделанного от собранного. Ответ владельцу пишется после вызова, а не вместо него: реплика
97
+ посреди хода отвечается вместе с начатым действием.
98
+ - **Вариант, поданный владельцу, назван ценой для человека.** Сколько шагов, где человек окажется
99
+ и что ему для этого нужно — без этого варианты выглядят равными, и выбор идёт по доводам со
100
+ стороны кода: «меньше путей», «строку запуска не трогаем». Знание, которое делает вариант
101
+ негодным, пишется в сам вариант, а не остаётся у того, кто его составил.
102
+ - **Пересказ действующего порядка без оценки читается как одобрение.** На прямой вопрос владельца
103
+ «как это работает» ответ фактами верен и недостаточен: устройство, названное спокойно, звучит
104
+ принятым. Годность порядка для того, кто им пользуется, называется вместе с ним.
94
105
  - **Прерывание работы владельцем называется вслух.** Пришло задание, останавливающее начатое, —
95
- исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только
96
- потом берётся за новое. Молчание об этом владелец читает как «прежнее кончилось».
97
- - **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет —
98
- владелец читает отчёт как рассказ о сделанном. Называются три вещи: что стоит, чего оно ждёт
99
- и что владелец может решить.
100
- - **Выходы хода стережёт страж, а не память исполнителя.** Он читает объявленное состояние
101
- работы и то, что за ход по ней сделано: правку файла или команду, меняющую дерево. Ход, в
102
- котором не было ни того ни другого, возвращается исполнителю вместе со следующим шагом из
103
- хода работы. Отданную и влитую работу страж не судит: она уже дождалась чужого шага.
106
+ исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только потом
107
+ берётся за новое. Молчание об этом владелец читает как «прежнее кончилось».
108
+ - **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет — владелец
109
+ читает отчёт как рассказ о сделанном. Называются три вещи: что стоит, чего оно ждёт и что
110
+ владелец может решить.
111
+ - **Выходы хода стережёт страж, а не память исполнителя.** Он читает объявленное состояние работы
112
+ и то, что за ход по ней сделано: правку файла или команду, меняющую дерево. Ход, в котором не
113
+ было ни того ни другого, возвращается исполнителю вместе со следующим шагом из хода работы.
114
+ Отданную и влитую работу страж не судит: она уже дождалась чужого шага.
104
115
  - **Снятая папка задачи снимает требование состояния, а ход не кончает.** Ход работы уезжает
105
116
  вместе с папкой, а папка разбирается до открытия заявки: с этой минуты и до слияния строки
106
117
  состояния нет вовсе, и первый признак стражу взять неоткуда. Отпускать по этому признаку ход
107
- нельзя — снятая папка означает середину отдачи, а не её конец: между уборкой и заявкой работу
108
- не видит никто, кроме того, кто её сделал. Дальше ход судится вторым признаком, как всякий
109
- другой; ход, в котором заявку открыли или прочитали, второй признак пропускает сам. Прежде
110
- страж выходил здесь молча и ход, которому до отдачи оставался один шаг, закрывался пустым.
111
- - **Работа без ветки и без папки задачи судится тем же стражем по второму признаку.** Состояния
112
- у неё нет, и первый признак взять неоткуда, — но ход, в котором не было ни одной правки
113
- дерева, не кончается и здесь. Раньше страж отпускал такую работу молча, и защищена она была
114
- меньше всего: просьба владельца «разложи», «обнови», «посмотри» идёт без задачи и без ветки,
115
- и именно она чаще всего кончалась объявлением намерения.
118
+ нельзя — снятая папка означает середину отдачи, а не её конец: между уборкой и заявкой работу не
119
+ видит никто, кроме того, кто её сделал. Дальше ход судится вторым признаком, как всякий другой;
120
+ ход, в котором заявку открыли или прочитали, второй признак пропускает сам.
121
+ - **Работа без ветки и без папки задачи судится тем же стражем по второму признаку.** Состояния у
122
+ неё нет, и первый признак взять неоткуда, но ход, в котором не было ни одной правки дерева, не
123
+ кончается и здесь.
124
+ - **Взятая задача — ещё не начатая работа, и ход на ней не кончается.** Ветка по номеру заведена,
125
+ колонка сдвинута, номер назван владельцу а каталога задачи при ветке нет: обязательное
126
+ действие состояния «задача-взята» не сделано ни строкой. Второй признак такой ход отпускает
127
+ целиком, потому что работы в нём много — заведение ветки, перевод колонки, уборка соседних
128
+ веток, — и «была ли за ход работа» отвечает не на тот вопрос, что «доведена ли работа до конца
129
+ объявленного состояния». Отчёт при этом встаёт ровно на место следующего действия и выглядит
130
+ завершённым куском лучше всякой другой вехи. Судит это страж отдельным ярусом; ветка без номера
131
+ задачи под него не подпадает, а собранный шаблон папки его снимает — заполненность замысла
132
+ машине не видна.
133
+ - **Разведка ходом не кончается, сколько бы её ни было.** Переключение ветки, подтягивание,
134
+ просмотр истории и чтение заявок — не работа, а подготовка к ней; ход, собранный из них одних,
135
+ оставляет работу там же, где она стояла. Признак работы у стража этого прежде не различал: он
136
+ знает первое слово команды, и читающая подкоманда совпадала с ним наравне с коммитом. Разведка
137
+ при этом выглядит работой лучше всего остального — в ней команды, точные числа и проверяемые
138
+ ответы, — поэтому ход, набитый ею, читается полным и заходом, и владельцем. Судятся части
139
+ составной команды по одной: чтение, соединённое с правкой, работой остаётся.
140
+ - **Ответ владельцу действием не работает и последним в ходе не стоит.** Порядок внутри хода
141
+ один: работа, потом первый шаг следующей, и только потом текст. Обратный порядок — работа,
142
+ отчёт, конец — стоит за каждой остановкой, которую разбирали: отчёт есть форма завершённости, и
143
+ дописанная сводка читается как конец хода тем убедительнее, чем больше сделано. Сказать о
144
+ сделанном можно всегда; место у этих слов — после следующего действия, а не вместо него.
145
+ - **Последним действием хода бывает только работа.** Признак один на все виды остановки: правка
146
+ файла или меняющая команда — последним из того, что за ход сделано. Частные ярусы стража —
147
+ разведка, ожидание, отдача без начала следующей — из него только выводят понятный отказ;
148
+ заводить новый ярус на каждый вид бессмысленно, потому что видов столько, сколько бывает
149
+ поводов заговорить.
150
+ - **Последним действием хода ожидание чужого шага не бывает.** Прогон, разбор владельцем и
151
+ слияние идут без исполнителя, и работа на время ожидания остаётся ровно там, где стояла. Такой
152
+ ход обманчив именно полнотой: в нём была работа, и много, — а признак «была ли за ход работа»
153
+ отпускает его целиком. Судится поэтому последнее действие: ожидание в середине законно, запуск
154
+ работы в фоне работой остаётся, а ход, кончившийся циклом до готовности прогона или слежением
155
+ за ним, страж не выпускает.
116
156
  - **Передача пишется и там, где имени у ветки нет.** Всё, что в неё едет, лежит в дереве и на
117
- отсоединённой голове доступно целиком; имя нужно одному файлу, и он называется коротким
118
- снимком головы. Молчание хука здесь стоит дороже прочего: сжатие приходит без передачи, и
119
- следующий заход начинает с пустого места.
120
- - **Этап замысла объявляется закрытым только после того, как его команда проверки прошла.**
121
- Строка «Чем проверяется» несёт команду обратными кавычками и то, что в её выводе означает
122
- «сошлось». Страж читает прежний номер этапа из истории ветки и не выпускает ход, в котором
123
- номер вырос, а команда не запускалась: через заход отмеченное по памяти неотличимо от
124
- проверенного.
125
- - **Слово об остановке страж читает у владельца, а не у исполнителя.** Иначе остановку
126
- объявляет тот, кому она в эту минуту удобна, и запрет держится ровно до первого неудобства.
127
- - **Утверждение о состоянии дерева стережёт гард утверждения, а не память исполнителя.** Всё,
128
- что ответ владельцу говорит о дереве, несёт команду и её вывод: сказанное без команды
129
- утверждением не считается ни «проверено», ни «снято», ни «готово». Гард читает текст,
130
- сказанный владельцу за ход, и ищет команду того же хода; у каждого слова назван свой род
131
- команды, потому что общий признак «команда была» подтверждал бы одно другим. Прошлый ход не
132
- годится: состояние дерева меняется, и вчерашний вывод о нынешнем молчит. Восемь разборов
133
- подряд пришлись на этот промах, и каждый раз в правило дописывалась ещё одна статья —
134
- держит его теперь машина.
135
- - **Гард утверждения ждёт текст ответа, а не судит запись, какой застал.** Текст ложится в
136
- запись хода не раньше, чем хост зовёт хук, и гард, прочитавший файл первым, видит ход, в
137
- котором владельцу не сказано ничего. Молчит он при этом честно и снаружи неотличим от гарда,
138
- который посмотрел и пропустил: одним таким ходом мимо прошли сразу трое. Не дождавшись текста,
139
- гард возвращает ход: пустая запись означает не «сказать было нечего», а «прочитать нечего».
140
- Отказ этот принадлежит одному гарду: печатай своё решение все трое, вывод перестал бы
141
- разбираться целиком.
142
- - **Слово-утверждение гард ловит, неверный вывод — нет.** Об образце, судимом по одному его
143
- файлу, и о пути, которым человек не пойдёт, судить нечем: там нет ни слова, ни команды, с
144
- которой сверять. Это известная граница гарда, и держат её статьи ниже, а не он.
157
+ отсоединённой голове доступно целиком; имя нужно одному файлу, и он называется коротким снимком
158
+ головы. Молчание хука здесь стоит дороже прочего: сжатие приходит без передачи, и следующий
159
+ заход начинает с пустого места.
160
+ - **Этап замысла объявляется закрытым только после того, как его команда проверки прошла.** Строка
161
+ «Чем проверяется» несёт команду обратными кавычками и то, что в её выводе означает «сошлось».
162
+ Страж читает прежний номер этапа из истории ветки и не выпускает ход, в котором номер вырос, а
163
+ команда не запускалась: через заход отмеченное по памяти неотличимо от проверенного.
164
+ - **Слово об остановке страж читает у владельца, а не у исполнителя.** Иначе остановку объявляет
165
+ тот, кому она в эту минуту удобна, и запрет держится ровно до первого неудобства.
166
+ - **Утверждение о состоянии дерева стережёт гард утверждения, а не память исполнителя.** Всё, что
167
+ ответ владельцу говорит о дереве, несёт команду и её вывод: сказанное без команды утверждением
168
+ не считается ни «проверено», ни «снято», ни «готово». Гард читает текст, сказанный владельцу
169
+ за ход, и ищет команду того же хода; у каждого слова назван свой род команды, потому что общий
170
+ признак «команда была» подтверждал бы одно другим. Прошлый ход не годится: состояние дерева
171
+ меняется, и вчерашний вывод о нынешнем молчит.
172
+ - **Гард утверждения ждёт текст ответа, а не судит запись, какой застал.** Текст ложится в запись
173
+ хода не раньше, чем хост зовёт хук, и гард, прочитавший файл первым, видит ход, в котором
174
+ владельцу не сказано ничего. Не дождавшись текста, гард возвращает ход: пустая запись означает
175
+ не «сказать было нечего», а «прочитать нечего».
176
+ - **Слово-утверждение гард ловит, неверный вывод нет.** Об образце, судимом по одному его файлу,
177
+ и о пути, которым человек не пойдёт, судить нечем: там нет ни слова, ни команды, с которой
178
+ сверять. Это известная граница гарда, и держат её статьи ниже, а не он.
145
179
  - **Ход о чужом шаге стережёт гард ожидания, а не память исполнителя.** Он отбивает завершение
146
- хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия —
147
- ни заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
148
- признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Оба берутся из самого хода:
149
- спросить хостинг было бы точнее, но сетевой вызов на завершении хода падает вместе со связью
150
- и отбивал бы работу вместо промаха, а вывод команды о прогоне в записи хода уже лежит. Слова
151
- «беру следующую задачу» гард действием не считает — ровно потому, что их и произносят вместо
152
- неё.
180
+ хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия — ни
181
+ заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
182
+ признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Слова «беру следующую задачу»
183
+ гард действием не считает ровно потому, что их и произносят вместо неё.
153
184
  - **Ход, отдавший работу, доводит её до снятого черновика.** Черновик читается владельцем как
154
185
  «работа не кончена»: кнопка слияния у него заблокирована самим хостингом, а по списку заявок
155
186
  готовое от недоделанного не отличить — серое и там и там. Следующая задача берётся сверх этого,
156
- а не вместо: требование взять её исполняется буквально и оставляет отданное невидимым. Две
157
- готовые заявки простояли так, пока владелец не вернул исполнителя сам. Стережёт это гард
158
- ожидания: ход, открывший заявку, не кончается, пока состояние отданной работы не спрошено
159
- командой того же хода.
160
- - **«Жду прогона» утверждение о чужом шаге, а не состояние работы.** Прогон бывает зелёным
161
- час, а бывает не встав вовсе — и второе само не чинится. Слово это требует команды того же
162
- хода, которая прогон показывает, и без неё не говорится: сказанное без команды владелец читает
163
- как «работа ещё идёт» и ждёт напрасно. Держит это гард утверждения, а не память исполнителя.
187
+ а не вместо: требование взять её исполняется буквально и оставляет отданное невидимым. Стережёт
188
+ это гард ожидания: ход, открывший заявку, не кончается, пока состояние отданной работы не
189
+ спрошено командой того же хода.
190
+ - **«Жду прогона» — утверждение о чужом шаге, а не состояние работы.** Прогон бывает зелёным час,
191
+ а бывает не встав вовсе и второе само не чинится. Слово это требует команды того же хода,
192
+ которая прогон показывает, и без неё не говорится: сказанное без команды владелец читает как
193
+ «работа ещё идёт» и ждёт напрасно. Держит это гард утверждения, а не память исполнителя.
164
194
  - **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
165
195
  запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
166
196
  следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
@@ -171,51 +201,62 @@ flowchart TD
171
201
  результат. Обход стоит дороже отказа: гард отбивает один файл, а обойдённый гард снимает
172
202
  требование со всего дерева и молчит об этом. Держится это не только памятью — гарды судят и
173
203
  команду оболочки, которая пишет файл.
204
+ - **Отбитая гейтом команда повторяется целиком, а не хвостом.** Гейт отбивает вызов до исполнения,
205
+ поэтому не сработало ни одно её звено — включая те, что стояли до отбитого. Повторённый хвост
206
+ делает работу в том месте, где её не ждали:
207
+ - **Пишущий вызов в строку разведки не дописывается.** Строка, собранная из вопросов, читается как
208
+ вопрос целиком — и своим автором тоже; правка идёт отдельным вызовом, где её видно. У вызова, у
209
+ которого есть читающий двойник, род выбирается по действию, а не по имени команды.
174
210
  - **Ход, в котором владельцу задан вопрос, не заканчивается, пока за этот же ход не читались
175
211
  законы и правила.** Чтением считается любой из трёх путей: загрузка правила, чтение файла
176
212
  законов или правил, поиск по ним. Отбивает гард разговора — на завершении хода, а не на
177
213
  инструменте вопроса: спрашивают чаще прозой, чем меню. Найденное ложится в раздел «Что уже
178
214
  сказано в правилах» разбора.
215
+ - **Ответ владельца ищется в его же репликах прежде, чем в правилах.** Закон говорит: вопрос с уже
216
+ записанным ответом владельцу не задаётся, — и самая доступная запись лежит не в дереве, а в
217
+ самом разговоре: первая реплика владельца и его ответы на прошлые круги вопросов. Гард разговора
218
+ этого не видит: чтением он считает загрузку правила и поиск по нему, а реплика следа не
219
+ оставляет. Вопрос, отвечающий сам себе словами владельца, обесценивает и заданные рядом.
220
+ - **Объём работы поводом урезать её границы не бывает.** Владелец, назвавший результат, объёма не
221
+ оспаривал: предложение выбросить часть — это просьба переназначить цель, поданная как уточнение.
222
+ Дорогое делают дорого либо говорят прямо, что оно дорого, и называют цену.
179
223
  - **Действия, которые исполнитель не делает без слова владельца, перечислены в компаньоне
180
224
  правила.** Список у каждого дерева свой — пакет знает только требование, чтобы список был
181
225
  назван. Не названный, он выводится из общих слов, и «делай, что нужно по плану» становится
182
- разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка
183
- не заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт. За один заход одна
184
- и та же команда была сначала слишком опасной, чтобы её позвать, а через два хода —
185
- достаточно безопасной, чтобы позвать без спроса.
186
- - **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование
187
- спросить владельца относится к действию, а не к ходу: работа, у которой отделима часть без
188
- последствий, делится, а не откладывается целиком. Список вариантов, поданный вместо работы,
189
- читается как работа тем полнее, чем аккуратнее он составлен: он пронумерован, в нём названы
190
- цифры, и именно поэтому пустота хода за ним не видна. Владельцу называется, что уже сделано и
191
- что осталось за его словом, — а не выбор из вариантов вместо и того и другого.
226
+ разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка не
227
+ заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт.
228
+ - **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование спросить
229
+ владельца относится к действию, а не к ходу: работа, у которой отделима часть без последствий,
230
+ делится, а не откладывается целиком. Список вариантов, поданный вместо работы, читается как
231
+ работа тем полнее, чем аккуратнее он составлен: он пронумерован, в нём названы цифры, и именно
232
+ поэтому пустота хода за ним не видна. Владельцу называется, что уже сделано и что осталось за
233
+ его словом,а не выбор из вариантов вместо и того и другого.
192
234
  - **Признак необратимости берётся из списка, а не выводится доводом.** Список составлен тем, кто
193
235
  обратимость уже взвесил: необратимое в нём осталось, обратимое из него снято. Довод «действие
194
236
  уходит наружу и не откатывается» приходит в контекст всегда, а список — только когда его
195
- прочитали, и применённый поверх списка довод отменяет список целиком. Отменяет молча: со
196
- стороны это выглядит осторожностью, а не пропуском шага. Действия, которого в списке нет,
197
- исполнитель на слово владельца не гейтит, даже если оно уходит наружу. Шаг, снятый из списка
198
- разбором прошлого промаха, тем более: довод, которым его туда возвращают, уже разобран и
199
- отклонён — и дважды подряд готовая работа вставала перед снятым шагом.
200
- - **Ход, в котором исполнитель признал промах, не заканчивается, пока записи о происшествии
201
- нет.** Отбивает гард происшествия — на завершении хода: к моменту признания промах уже
202
- случился, и ловить раньше нечего. Признание ловится набором образцов, а не пониманием смысла;
203
- промах, признанный словами вне набора, гард пропускает, и это его известная граница, а не
204
- обещание.
237
+ прочитали, и применённый поверх списка довод отменяет список целиком. Отменяет молча: со стороны
238
+ это выглядит осторожностью, а не пропуском шага. Действия, которого в списке нет, исполнитель на
239
+ слово владельца не гейтит, даже если оно уходит наружу. Шаг, снятый из списка разбором прошлого
240
+ промаха, тем более: довод, которым его туда возвращают, уже разобран и отклонён — и дважды
241
+ подряд готовая работа вставала перед снятым шагом.
242
+ - **Ход, в котором исполнитель признал промах, не заканчивается, пока записи о происшествии нет.**
243
+ Отбивает гард происшествия — на завершении хода: к моменту признания промах уже случился, и
244
+ ловить раньше нечего. Признание ловится набором образцов, а не пониманием смысла; промах,
245
+ признанный словами вне набора, гард пропускает, и это его известная граница, а не обещание.
205
246
  - **Заход, начатый с передачи, входит в работу тем же правилом, что и всякий другой.** Передача
206
247
  лежит вне дерева, её не читает ни одна проверка, и написана она вчера: всё, что в ней стоит,
207
- проверяется деревом. Порядок входа — четыре шага в паттерне возвращения; стережёт его гард, а
208
- не память: порядок, записанный только словами, исполняется, пока о нём помнят.
209
- - **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход
210
- работы отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт
211
- предупреждение с готовой командой, но сессию не рвёт.
248
+ проверяется деревом. Порядок входа — четыре шага в паттерне возвращения; стережёт его гард, а не
249
+ память: порядок, записанный только словами, исполняется, пока о нём помнят.
250
+ - **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход работы
251
+ отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт предупреждение с
252
+ готовой командой, но сессию не рвёт.
212
253
  - **Заполненное окно кончает ход только там, где сжатия нет.** Где оно объявлено, окно —
213
254
  продолжение хода: заход сжимается и работает дальше, а порог остановки срабатывает лишь тогда,
214
255
  когда сжатие не пришло.
215
256
  - **Заполнение окна захода стережёт гард, а не память исполнителя.** На первом пороге он
216
- напоминает выбирать точку остановки, на втором отбивает всё, кроме записи хода работы,
217
- передачи и команд поставки. Размер окна и оба порога дерево задаёт само; не задавшее размера
218
- стража не получает.
257
+ напоминает выбирать точку остановки, на втором отбивает всё, кроме записи хода работы, передачи
258
+ и команд поставки. Размер окна и оба порога дерево задаёт само; не задавшее размера стража не
259
+ получает.
219
260
  - **Порог сжатия контекста дерево задаёт само, и стоит он НИЖЕ порога остановки.** Совпавшие
220
261
  пороги согласием не бывают: это гонка, и выигрывает её страж — он стоит на вызове, а сжатие
221
262
  приходит между ходами. Расстояние объявляется числом, а не выводится разницей; сведены пороги