@rt-tools/agent-kit 0.10.0 → 0.12.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 (139) hide show
  1. package/assets/checks/check-file-size.mjs +19 -4
  2. package/assets/checks/check-state-next.mjs +202 -0
  3. package/assets/checks/check-states.mjs +142 -0
  4. package/assets/checks/check-turn-map.mjs +146 -0
  5. package/assets/checks/rt-kit-checks.config.mjs +16 -2
  6. package/assets/defaults/project.sh +67 -7
  7. package/assets/defaults/turn-map.md +48 -0
  8. package/assets/hooks/browser-device-id.sh +2 -0
  9. package/assets/hooks/browser-guard-device-id.sh +5 -1
  10. package/assets/hooks/browser-guard-no-asking.sh +5 -1
  11. package/assets/hooks/browser-guard-no-listing.sh +2 -0
  12. package/assets/hooks/browser-guard-no-other-drivers.sh +7 -3
  13. package/assets/hooks/browser-guard-require-select.sh +6 -2
  14. package/assets/hooks/claim-guard.sh +5 -1
  15. package/assets/hooks/commit-msg.sh +2 -0
  16. package/assets/hooks/conscience-guard.sh +5 -1
  17. package/assets/hooks/constitution-index.sh +2 -0
  18. package/assets/hooks/dev-server-guard.sh +7 -3
  19. package/assets/hooks/dispatch.sh +69 -0
  20. package/assets/hooks/docs-guard.sh +8 -4
  21. package/assets/hooks/exam-guard.sh +7 -3
  22. package/assets/hooks/git-guard-delivery-signature.sh +2 -0
  23. package/assets/hooks/git-guard-delivery.sh +39 -5
  24. package/assets/hooks/git-guard-main.sh +8 -4
  25. package/assets/hooks/git-guard-push-tests.sh +8 -4
  26. package/assets/hooks/glossary-load.sh +2 -0
  27. package/assets/hooks/grill-gate.sh +6 -2
  28. package/assets/hooks/handoff-entry-guard.sh +6 -2
  29. package/assets/hooks/handoff-write.sh +124 -0
  30. package/assets/hooks/hook-input.sh +54 -0
  31. package/assets/hooks/lint-after-edit.sh +7 -3
  32. package/assets/hooks/observe.sh +2 -0
  33. package/assets/hooks/postmortem-guard.sh +5 -1
  34. package/assets/hooks/proposal-guard.sh +5 -1
  35. package/assets/hooks/prose-style-guard.sh +7 -3
  36. package/assets/hooks/qa-dataid-guard.sh +6 -2
  37. package/assets/hooks/rerun-guard.sh +7 -3
  38. package/assets/hooks/reuse-first-guard.sh +7 -3
  39. package/assets/hooks/roles.sh +2 -0
  40. package/assets/hooks/rule-article.sh +99 -0
  41. package/assets/hooks/skill-gate-layers.sh +2 -0
  42. package/assets/hooks/skill-gate-rearm.sh +5 -1
  43. package/assets/hooks/skill-gate.sh +25 -2
  44. package/assets/hooks/skill-loaded.sh +5 -1
  45. package/assets/hooks/sql-guard-parse.sh +2 -0
  46. package/assets/hooks/sql-guard-request.sh +4 -1
  47. package/assets/hooks/sql-guard-target.sh +2 -0
  48. package/assets/hooks/sql-guard-write.sh +2 -0
  49. package/assets/hooks/sql-guard.sh +6 -2
  50. package/assets/hooks/task-context-load.sh +2 -0
  51. package/assets/hooks/task-flow-guard.sh +8 -4
  52. package/assets/hooks/turn-entry-load.sh +62 -0
  53. package/assets/hooks/turn-exit-guard.sh +44 -17
  54. package/assets/hooks/utf8.sh +35 -0
  55. package/assets/hooks/waiting-turn-guard.sh +5 -1
  56. package/assets/hooks/window-fill-guard.sh +37 -5
  57. package/assets/laws/work-conduct.md +34 -9
  58. package/assets/patterns/dependencies-upgrade.md +1 -1
  59. package/assets/patterns/doc-style-write.md +3 -3
  60. package/assets/patterns/git-workflow-commit.azure.md +2 -202
  61. package/assets/patterns/git-workflow-commit.github.md +2 -258
  62. package/assets/patterns/git-workflow-commit.gitlab.md +1 -217
  63. package/assets/patterns/git-workflow-docker.md +3 -3
  64. package/assets/patterns/git-workflow-merge.md +3 -2
  65. package/assets/patterns/git-workflow-migration.md +3 -3
  66. package/assets/patterns/git-workflow-pr.azure.md +224 -0
  67. package/assets/patterns/git-workflow-pr.github.md +280 -0
  68. package/assets/patterns/git-workflow-pr.gitlab.md +240 -0
  69. package/assets/patterns/git-workflow-restart.md +3 -3
  70. package/assets/patterns/git-workflow-secrets.md +3 -3
  71. package/assets/patterns/task-flow-archive.md +193 -0
  72. package/assets/patterns/task-flow-close.md +11 -160
  73. package/assets/patterns/task-flow-handoff.md +22 -4
  74. package/assets/patterns/task-flow-resume.md +6 -0
  75. package/assets/patterns/task-flow-start.md +41 -0
  76. package/assets/patterns/turn-entry-map.md +81 -0
  77. package/assets/pitfalls/doc-style.md +80 -0
  78. package/assets/pitfalls/git-workflow.azure.md +50 -0
  79. package/assets/pitfalls/git-workflow.github.md +78 -0
  80. package/assets/pitfalls/git-workflow.gitlab.md +49 -0
  81. package/assets/pitfalls/spec-driven.md +36 -0
  82. package/assets/pitfalls/styling-bem.md +45 -0
  83. package/assets/pitfalls/task-flow.md +62 -0
  84. package/assets/pitfalls/testing.md +70 -0
  85. package/assets/rules/deploy-flow.azure.md +106 -0
  86. package/assets/rules/deploy-flow.github.md +113 -0
  87. package/assets/rules/deploy-flow.gitlab.md +108 -0
  88. package/assets/rules/doc-style.md +25 -76
  89. package/assets/rules/git-workflow.azure.md +6 -92
  90. package/assets/rules/git-workflow.github.md +14 -127
  91. package/assets/rules/git-workflow.gitlab.md +6 -93
  92. package/assets/rules/spec-driven.md +39 -30
  93. package/assets/rules/styling-bem.md +20 -39
  94. package/assets/rules/task-flow.md +17 -186
  95. package/assets/rules/testing.md +3 -64
  96. package/assets/rules/turn-conduct.md +206 -0
  97. package/assets/rules/turn-entry.md +93 -0
  98. package/assets/rules/typescript-conventions.md +15 -0
  99. package/assets/skills/agent-kit.md +35 -12
  100. package/assets/templates/pitfalls.md +10 -0
  101. package/assets/templates/rule.md +5 -3
  102. package/lib/assets.d.ts.map +1 -1
  103. package/lib/assets.js +6 -1
  104. package/lib/assets.js.map +1 -1
  105. package/lib/cargo.d.ts +42 -0
  106. package/lib/cargo.d.ts.map +1 -1
  107. package/lib/cargo.js +2 -0
  108. package/lib/cargo.js.map +1 -1
  109. package/lib/cascade.d.ts.map +1 -1
  110. package/lib/cascade.js +19 -1
  111. package/lib/cascade.js.map +1 -1
  112. package/lib/commands.d.ts.map +1 -1
  113. package/lib/commands.js +65 -4
  114. package/lib/commands.js.map +1 -1
  115. package/lib/config.d.ts +16 -1
  116. package/lib/config.d.ts.map +1 -1
  117. package/lib/config.js +8 -0
  118. package/lib/config.js.map +1 -1
  119. package/lib/hooks-map.d.ts +13 -0
  120. package/lib/hooks-map.d.ts.map +1 -1
  121. package/lib/hooks-map.js +33 -1
  122. package/lib/hooks-map.js.map +1 -1
  123. package/lib/observations.d.ts +35 -1
  124. package/lib/observations.d.ts.map +1 -1
  125. package/lib/observations.js +14 -2
  126. package/lib/observations.js.map +1 -1
  127. package/lib/ship.d.ts +2 -0
  128. package/lib/ship.d.ts.map +1 -1
  129. package/lib/ship.js +2 -0
  130. package/lib/ship.js.map +1 -1
  131. package/lib/thresholds.d.ts +49 -0
  132. package/lib/thresholds.d.ts.map +1 -0
  133. package/lib/thresholds.js +151 -0
  134. package/lib/thresholds.js.map +1 -0
  135. package/package.json +1 -1
  136. package/rt-tools-agent-kit-0.12.0.tgz +0 -0
  137. package/assets/commands/agent-kit-digest.md +0 -88
  138. package/assets/commands/rules-review.md +0 -98
  139. package/rt-tools-agent-kit-0.10.0.tgz +0 -0
@@ -0,0 +1,193 @@
1
+ ---
2
+ name: task-flow-archive
3
+ kind: pattern
4
+ rule: task-flow
5
+ description: Паттерн правила task-flow. Брать, когда работа доведена до готовности: разбор папки задачи последним коммитом, переезд в описание прошлого, сверка очереди работ, разбор закрытой работы правилами и то, что делать с его находками. Не брать для вливания договорённости и приведения текстов — это паттерн task-flow-close.
6
+ ---
7
+
8
+ # Разбор папки задачи и разбор работы правилами
9
+
10
+ Паттерн правила `task-flow`. Что при этом должно быть верно — закон
11
+ `docs/constitution/work-conduct.md`. Что делается до этого — снятие черновика, вливание
12
+ договорённости и приведение текстов — паттерн `task-flow-close`.
13
+
14
+ ## Когда брать
15
+
16
+ - Договорённость влита, тексты домена приведены, и папка задачи разбирается последним
17
+ коммитом ветки.
18
+ - Работа слита человеком, и её разбирают правилами.
19
+ - Разбор вернул находки, и их надо куда-то положить.
20
+
21
+ ## Состояние `разбор-кончился`: папка задачи разбирается
22
+
23
+ Разбор идёт по трём исходам, а не по двум.
24
+
25
+ **Первым отбирается действующее требование.** Всё, что останется верным и завтра, становится
26
+ статьёй закона, пунктом правила или разделом паттерна — по тому, о чём оно говорит. Признак
27
+ отбора один и записан здесь заранее: перестанет ли текст быть верным, если завтра всё
28
+ переделать. Перестанет — это рассказ о состоявшемся; не перестанет — требование, и место ему в
29
+ слое правил. Закон при этом в ветке не правится — его статья приносится владельцу текстом.
30
+
31
+ **Вторым отбирается рассказ о состоявшемся переезде.** Он уезжает в описание прошлого и
32
+ называет для каждого перенесённого решения, куда оно ушло: иначе решение, ставшее правилом, и
33
+ решение, потерянное при переносе, выглядят одинаково — записью, на которую никто не ссылается.
34
+
35
+ **Третьим удаляется остальное.**
36
+
37
+ Порядок именно такой: начав с переезда, исполнитель увозит вместе с ним и действующее — под
38
+ конец работы это дешевле, чем разбирать.
39
+
40
+ Целиком в архив не переносится: `docs/archive/` — место для записей о состоявшемся, которые
41
+ кто-то читает, а не свалка ходов работы. Таблица ниже говорит о том, что осталось после
42
+ первого отбора.
43
+
44
+ | Файл | Куда |
45
+ | --------------- | ------------------------------------------------------------------------------------------------------------------ |
46
+ | `grill.md` | в `docs/archive/` — ответы владельца невосстановимы, и это единственная запись о том, почему задача поставлена так |
47
+ | `progress.md` | в `docs/archive/`, если в нём есть решения по ходу с причинами; иначе удаляется |
48
+ | `plan.md` | удаляется — после выкатки на его вопрос отвечает код, а на «как работает» отвечает спек домена |
49
+ | находки разбора | переезжают к замыслу эпика — их читает владелец, когда эпик кончится; работа вне эпика показывает их сразу |
50
+
51
+ Уезжающее складывается одним файлом с говорящим именем, а не папкой из трёх:
52
+
53
+ ```bash
54
+ cat docs/tasks/<КЛЮЧ>-<номер>-<slug>/grill.md > docs/archive/<ЧТО_РЕШАЛИ>.md
55
+ rm -r docs/tasks/<КЛЮЧ>-<номер>-<slug>
56
+ ```
57
+
58
+ Разбор идёт в том же PR, что и работа: папка, оставленная до мержа, попадает в главную
59
+ ветку и читается там как текущая.
60
+
61
+ ### Работа, разбирающая чужую папку, разбирает две
62
+
63
+ Своя папка у такой работы есть — она заводится наравне со всеми, исключения из этого нет. Обе
64
+ снимаются последним коммитом, и порядок между ними один: сперва чужая, потом своя. Начав со
65
+ своей, исполнитель теряет замысел на диске, а он ещё нужен — гард отбивает правку без него, а
66
+ правка по замечаниям разбора идёт в ту же ветку.
67
+
68
+ ```bash
69
+ cat docs/tasks/<чужая>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ТАМ>.md
70
+ rm -r docs/tasks/<чужая>
71
+ cat docs/tasks/<своя>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ЗДЕСЬ>.md
72
+ rm -r docs/tasks/<своя>
73
+ ```
74
+
75
+ Две записи в архиве, а не одна: работы разные, и решения в них разные. Сверка очереди работ
76
+ после этого не называет ни одной папки — этим и проверяется, что разобраны обе.
77
+
78
+ **Следующее движение:** разобранная папка уезжает в ветку тем же коммитом, и следом за ним
79
+ сверяется очередь работ.
80
+
81
+ ## Состояние `папка-разобрана`: сверка очереди работ
82
+
83
+ ```bash
84
+ npm run check:board # папка закрытой задачи среди текущих, брошенные черновики
85
+ npm run check:specs # договорённость влита, привязки на месте
86
+ npm run check:docs # пути, названные в текстах, существуют
87
+ ```
88
+
89
+ **Следующее движение:** расхождения, названные сверками, чинятся тем же ходом; чинить нечего —
90
+ тот же ход снимает черновик и просит владельца влить, называя номер.
91
+
92
+ ## Состояние `влито`: работа разбирается правилами — фоном, следом за PR
93
+
94
+ Шаг о слое правил, а не о продукте: что за эту работу грузилось, что помогло, чего не хватило и
95
+ где текст правила разошёлся с деревом. Знает это только тот заход, который работу вёл, — через
96
+ сутки не знает никто.
97
+
98
+ Ведёт разбор роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт его
99
+ само, теми же вопросами. Файлов роль не правит — приносит готовые формулировки, а вставлять их
100
+ решает владелец.
101
+
102
+ **Запускается разбор в фоне, сразу за открытием PR, и ход на нём не кончается.** Роль ничего не
103
+ спрашивает, пока работает, и быстрее от ожидания не идёт: следующая задача берётся тем же ходом,
104
+ которым запущен разбор.
105
+
106
+ Порядок один и переставлять его нельзя:
107
+
108
+ 1. **Сводка собирается до запуска** — пока задача ещё в голове. Что делали, что пошло не так,
109
+ что грузилось и что каждое правило дало, на какие грабли окружения наткнулись. Собранная
110
+ через две задачи, она пересказывает историю ветки вместо того, что было на самом деле.
111
+ 2. **Роль уходит в фон** — инструментом запуска роли, с путём к списку загруженного и сводкой
112
+ целиком. Ход продолжается следующей задачей.
113
+ 3. **Вернувшиеся находки принимают одним ходом** — записать и вернуться к прежнему. Разбор,
114
+ отложенный «до удобного момента», не случается вовсе: заход кончается раньше.
115
+
116
+ **Следующее движение:** пока роль разбирает, тот же ход занят следующей задачей; вернувшиеся
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
+ | надстройка над разложенным | то, что здесь звучит иначе, чем в пакете |
145
+
146
+ Без адреса правка ложится туда, где её видит автор, — то есть в своё дерево, — и общее оседает
147
+ в одном месте, оставаясь неизвестным всем остальным.
148
+
149
+ **Разбор без правки закрытым не считается.** Из него выходит либо правка слоя правил, либо
150
+ предложение наружу; не вышло ни того ни другого — это жалоба, и она повторится. Предложение, о
151
+ котором владелец сказал вслух, уходит наружу в тот же ход: написанное и не отправленное лежит в
152
+ дереве неотличимо от отправленного.
153
+
154
+ **Следующее движение:** записанные находки работу не держат — следующая задача уже идёт, а
155
+ владельцу о них говорится, когда кончился эпик.
156
+
157
+ ## Ловушки
158
+
159
+ - **Папку разбирают до слияния — потом о ней уже никто не вспомнит.** Сверка очереди считает
160
+ задачу закрытой по слиянию: до него папка среди текущих законна, а после за неё никто не
161
+ отвечает — работа перешла к следующей задаче, и находка достанется чужому заходу. Три раза
162
+ подряд папка закрытой задачи так и уехала в главную ветку, в последний раз их набралось
163
+ пять. Теперь это держит гард поставки: слияние отбивается, пока папка лежит в ветке.
164
+ - **Разбирают последним коммитом, а не перед открытием PR.** Пока идёт ревью, замысел
165
+ нужен на диске: без него правку по замечаниям не пропустит гард хода работы. Порядок такой:
166
+ правки по ревью, потом разбор папки, потом слияние.
167
+ - **Разбор папки идёт последним, после того как гейт пуша прошёл целиком.** Гард хода работы
168
+ не пускает правку кода приложения без замысла на диске, а после разбора замысла нет: чужое
169
+ замечание линтера, приехавшее мержем из главной ветки, чинить уже нечем, и гейт пуша стоит.
170
+ Порядок один: мерж главной ветки, все линтеры и проверки зелёные, вливание договорённости,
171
+ приведение текстов домена, разбор папки. Понадобилась правка кода после разбора — замысел
172
+ восстанавливается на диске на время правки, и разбор повторяется тем же коммитом.
173
+ - **Если папку просто удалить, первым пропадёт `grill.md`.** Удалить проще, чем разобрать, а
174
+ слова владельца записаны только там, и восстановить их неоткуда. Поэтому гард требует, чтобы
175
+ ветка добавила запись в архив. Что именно перенесли, он не проверяет — это смотрит владелец
176
+ на ревью.
177
+ - **Шаги закрытия с владельцем не согласуются — они перечислены здесь.** Разбор работы
178
+ правилами входит в закрытие так же, как вливание договорённости и разбор папки; владелец
179
+ решает не то, запускать ли его, а что делать с находками. Ход, кончившийся таким вопросом,
180
+ отбивает гард разговора: за ход правила не читались, а ответ стоит в них. Спрашивается только
181
+ то, чего в правилах нет.
182
+ - **Блок готового кода в паттерне стареет от чужой правки.** Он не привязан ни к чему: сверка
183
+ спеков читает утверждения правила, а пример под ними не читает вовсе. Два поля, ставших
184
+ обязательными в чужой работе, сделали пример в соседнем паттерне несобираемым — сам он при
185
+ этом не изменился ни на знак и в след задачи не попал, потому что ни одного слова той работы
186
+ в нём нет. Паттерн находится по имени правленого символа, а не по теме работы.
187
+ - **Замысел эпика правят только там, где вписывают «чем кончился».** Границы эпика и
188
+ порядок задач в нём при этом остаются прежними, а работа их уже нарушила: задача, решившая
189
+ читать спеки, оставила над собой границу «спеки — вторая очередь», и следующий исполнитель
190
+ прочитает её как действующую. Границы эпика перечитываются целиком тем же заходом, что и
191
+ итог работы.
192
+ - **Архив не обновляется после выкатки.** Уехавшее туда описывает день переезда, и правится
193
+ оно только вместе с признанием, что описывало неверно.
@@ -2,7 +2,7 @@
2
2
  name: task-flow-close
3
3
  kind: pattern
4
4
  rule: task-flow
5
- description: Паттерн правила task-flow. Брать при закрытии работы — вливание договорённости в спек домена последним коммитом PR, разбор папки задачи, переезд в архив, сверка очереди работ. Не брать для хода работы — это паттерн task-flow-resume.
5
+ description: Паттерн правила task-flow. Брать при доведении работы до готовности снятие черновика, вливание договорённости в спек домена последним коммитом PR, приведение текстов домена к сделанному. Не брать для разбора папки задачи и разбора работы правилами это паттерн task-flow-archive; не брать для хода работы — это паттерн task-flow-resume.
6
6
  ---
7
7
 
8
8
  # Закрытие работы
@@ -14,6 +14,7 @@ description: Паттерн правила task-flow. Брать при закр
14
14
 
15
15
  - Этапы замысла закрыты, проверки зелёные, с PR снимается черновик.
16
16
  - `npm run check:specs` перечислил договорённость в разделе «Пора вливать».
17
+ - Тексты домена приводятся к тому, что работа сделала.
17
18
 
18
19
  Само открытие PR сюда не относится: он открывается черновиком тем ходом, которым правка
19
20
  кода отдаётся владельцу, — то есть до этого паттерна и, как правило, задолго до него. Здесь
@@ -102,6 +103,9 @@ PR #<номер> готов к слиянию: прогон зелёный, па
102
103
  кто пишет тело. Разница между ними одна, и она вся: реплику владелец прочитает, только если
103
104
  вернётся в переписку, а раздел он видит там, куда смотрит, нажимая кнопку.
104
105
 
106
+ **Следующее движение:** тем же ходом берётся следующая задача эпика, а разбор закрытой работы
107
+ уходит в фон. Прогон и владелец идут без исполнителя, и ждать их состоянием работы не бывает.
108
+
105
109
  ## Состояние `разбор-кончился`: договорённость вливается в спек домена
106
110
 
107
111
  Последним коммитом PR, до слияния. Код к этому моменту написан, поэтому привязки
@@ -131,6 +135,9 @@ npm run check:specs # раздел «Пора вливать» называе
131
135
  npm run check:specs # после вливания: привязки на месте, сценарии не потерялись
132
136
  ```
133
137
 
138
+ **Следующее движение:** за влитой договорённостью тем же ходом идут тексты домена — правила,
139
+ паттерны и разделы, которые работа задела.
140
+
134
141
  ## Состояние `разбор-кончился`: тексты домена приводятся к сделанному
135
142
 
136
143
  В спек уезжает только то, что записали до кода. Остальные тексты — правила, паттерны, законы
@@ -170,148 +177,13 @@ grep -rn -A3 "Чего из закона здесь нет" <каталог пр
170
177
  договорённость, только про это приложение.
171
178
 
172
179
  Что сделали на этом шаге, пишется в тело PR: что перечитали, что изменили, а если ничего
173
- не изменили — почему. Форма раздела — паттерн `git-workflow-commit`.
174
-
175
- ## Состояние `разбор-кончился`: папка задачи разбирается
176
-
177
- Разбор идёт по трём исходам, а не по двум.
178
-
179
- **Первым отбирается действующее требование.** Всё, что останется верным и завтра, становится
180
- статьёй закона, пунктом правила или разделом паттерна — по тому, о чём оно говорит. Признак
181
- отбора один и записан здесь заранее: перестанет ли текст быть верным, если завтра всё
182
- переделать. Перестанет — это рассказ о состоявшемся; не перестанет — требование, и место ему в
183
- слое правил. Закон при этом в ветке не правится — его статья приносится владельцу текстом.
184
-
185
- **Вторым отбирается рассказ о состоявшемся переезде.** Он уезжает в описание прошлого и
186
- называет для каждого перенесённого решения, куда оно ушло: иначе решение, ставшее правилом, и
187
- решение, потерянное при переносе, выглядят одинаково — записью, на которую никто не ссылается.
188
-
189
- **Третьим удаляется остальное.**
190
-
191
- Порядок именно такой: начав с переезда, исполнитель увозит вместе с ним и действующее — под
192
- конец работы это дешевле, чем разбирать.
193
-
194
- Целиком в архив не переносится: `docs/archive/` — место для записей о состоявшемся, которые
195
- кто-то читает, а не свалка ходов работы. Таблица ниже говорит о том, что осталось после
196
- первого отбора.
197
-
198
- | Файл | Куда |
199
- | --------------- | ------------------------------------------------------------------------------------------------------------------ |
200
- | `grill.md` | в `docs/archive/` — ответы владельца невосстановимы, и это единственная запись о том, почему задача поставлена так |
201
- | `progress.md` | в `docs/archive/`, если в нём есть решения по ходу с причинами; иначе удаляется |
202
- | `plan.md` | удаляется — после выкатки на его вопрос отвечает код, а на «как работает» отвечает спек домена |
203
- | находки разбора | переезжают к замыслу эпика — их читает владелец, когда эпик кончится; работа вне эпика показывает их сразу |
204
-
205
- Уезжающее складывается одним файлом с говорящим именем, а не папкой из трёх:
206
-
207
- ```bash
208
- cat docs/tasks/<КЛЮЧ>-<номер>-<slug>/grill.md > docs/archive/<ЧТО_РЕШАЛИ>.md
209
- rm -r docs/tasks/<КЛЮЧ>-<номер>-<slug>
210
- ```
211
-
212
- Разбор идёт в том же PR, что и работа: папка, оставленная до мержа, попадает в главную
213
- ветку и читается там как текущая.
214
-
215
- ### Работа, разбирающая чужую папку, разбирает две
216
-
217
- Своя папка у такой работы есть — она заводится наравне со всеми, исключения из этого нет. Обе
218
- снимаются последним коммитом, и порядок между ними один: сперва чужая, потом своя. Начав со
219
- своей, исполнитель теряет замысел на диске, а он ещё нужен — гард отбивает правку без него, а
220
- правка по замечаниям разбора идёт в ту же ветку.
221
-
222
- ```bash
223
- cat docs/tasks/<чужая>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ТАМ>.md
224
- rm -r docs/tasks/<чужая>
225
- cat docs/tasks/<своя>/grill.md > docs/archive/<ЧТО_РЕШАЛИ_ЗДЕСЬ>.md
226
- rm -r docs/tasks/<своя>
227
- ```
228
-
229
- Две записи в архиве, а не одна: работы разные, и решения в них разные. Сверка очереди работ
230
- после этого не называет ни одной папки — этим и проверяется, что разобраны обе.
231
-
232
- ## Состояние `папка-разобрана`: сверка очереди работ
233
-
234
- ```bash
235
- npm run check:board # папка закрытой задачи среди текущих, брошенные черновики
236
- npm run check:specs # договорённость влита, привязки на месте
237
- npm run check:docs # пути, названные в текстах, существуют
238
- ```
239
-
240
- ## Состояние `влито`: работа разбирается правилами — фоном, следом за PR
241
-
242
- Шаг о слое правил, а не о продукте: что за эту работу грузилось, что помогло, чего не хватило и
243
- где текст правила разошёлся с деревом. Знает это только тот заход, который работу вёл, — через
244
- сутки не знает никто.
245
-
246
- Ведёт разбор роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт его
247
- само, теми же вопросами. Файлов роль не правит — приносит готовые формулировки, а вставлять их
248
- решает владелец.
249
-
250
- **Запускается разбор в фоне, сразу за открытием PR, и ход на нём не кончается.** Роль ничего не
251
- спрашивает, пока работает, и быстрее от ожидания не идёт: следующая задача берётся тем же ходом,
252
- которым запущен разбор.
253
-
254
- Порядок один и переставлять его нельзя:
255
-
256
- 1. **Сводка собирается до запуска** — пока задача ещё в голове. Что делали, что пошло не так,
257
- что грузилось и что каждое правило дало, на какие грабли окружения наткнулись. Собранная
258
- через две задачи, она пересказывает историю ветки вместо того, что было на самом деле.
259
- 2. **Роль уходит в фон** — инструментом запуска роли, с путём к списку загруженного и сводкой
260
- целиком. Ход продолжается следующей задачей.
261
- 3. **Вернувшиеся находки принимают одним ходом** — записать и вернуться к прежнему. Разбор,
262
- отложенный «до удобного момента», не случается вовсе: заход кончается раньше.
263
-
264
- ## Состояние `влито`: находки разбора ложатся в папку задачи и ждут владельца
265
-
266
- Ответ роли живёт в переписке и умирает вместе с ней, поэтому он сразу ложится на диск — в папку
267
- задачи, файлом рядом с ходом работы. Пишет его исполнитель: роль файлов не пишет.
268
-
269
- Папка задачи умирает со слиянием, а находки должны пережить весь эпик — владелец читает их
270
- разом, когда эпик кончился. Поэтому при разборе папки файл находок не удаляется вместе
271
- с остальным, а **переезжает к замыслу эпика**: там его найдут и после того, как ветка въехала.
272
- Работа вне эпика показывает находки владельцу сразу, тем же ходом.
273
-
274
- **Наружу без слова владельца уезжает только сводка наблюдений.** Она говорит, чем пользовались
275
- и чем не пользовались ни разу, — это факт, и мнением он не станет. Предложение — другое дело:
276
- это заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении. Уехавшая
277
- без разбора, она становится работой того, кто её не заказывал.
278
-
279
- Порядок такой: находки копятся у замысла эпика → эпик кончился → владелец читает их разом и
280
- говорит, что из них верно → названное им оформляется предложением и уезжает. Чем отправляют —
281
- скил слоя правил, если дерево его разложило.
282
-
283
- У каждой находки называется адрес, и адресов три:
284
-
285
- | Куда | Что туда идёт |
286
- | -------------------------- | ------------------------------------------------------------------------ |
287
- | слой правил — предложением | то, что верно любому дереву этого класса: статья, пункт правила, паттерн |
288
- | имена этого дерева | то, что верно здесь: компаньон правила, профиль, карта гейта |
289
- | надстройка над разложенным | то, что здесь звучит иначе, чем в пакете |
290
-
291
- Без адреса правка ложится туда, где её видит автор, — то есть в своё дерево, — и общее оседает
292
- в одном месте, оставаясь неизвестным всем остальным.
180
+ не изменили — почему. Форма раздела — паттерн `git-workflow-pr`.
293
181
 
294
- **Разбор без правки закрытым не считается.** Из него выходит либо правка слоя правил, либо
295
- предложение наружу; не вышло ни того ни другого это жалоба, и она повторится. Предложение, о
296
- котором владелец сказал вслух, уходит наружу в тот же ход: написанное и не отправленное лежит в
297
- дереве неотличимо от отправленного.
182
+ **Следующее движение:** приведённые тексты коммитятся, и тем же ходом разбирается папка
183
+ задачипоследним коммитом ветки.
298
184
 
299
185
  ## Ловушки
300
186
 
301
- - **Папку разбирают до слияния — потом о ней уже никто не вспомнит.** Сверка очереди считает
302
- задачу закрытой по слиянию: до него папка среди текущих законна, а после за неё никто не
303
- отвечает — работа перешла к следующей задаче, и находка достанется чужому заходу. Три раза
304
- подряд папка закрытой задачи так и уехала в главную ветку, в последний раз их набралось
305
- пять. Теперь это держит гард поставки: слияние отбивается, пока папка лежит в ветке.
306
- - **Разбирают последним коммитом, а не перед открытием PR.** Пока идёт ревью, замысел
307
- нужен на диске: без него правку по замечаниям не пропустит гард хода работы. Порядок такой:
308
- правки по ревью, потом разбор папки, потом слияние.
309
- - **Разбор папки идёт последним, после того как гейт пуша прошёл целиком.** Гард хода работы
310
- не пускает правку кода приложения без замысла на диске, а после разбора замысла нет: чужое
311
- замечание линтера, приехавшее мержем из главной ветки, чинить уже нечем, и гейт пуша стоит.
312
- Порядок один: мерж главной ветки, все линтеры и проверки зелёные, вливание договорённости,
313
- приведение текстов домена, разбор папки. Понадобилась правка кода после разбора — замысел
314
- восстанавливается на диске на время правки, и разбор повторяется тем же коммитом.
315
187
  - **Тексты правятся до разбора папки.** Список того, что перечитывать, лежит в замысле, а
316
188
  разбор папки его удаляет. После разбора остаётся только память о том, что задевали.
317
189
  - **Утверждение правила снимается вместе со строкой привязки.** Связь идёт по тексту
@@ -322,10 +194,6 @@ npm run check:docs # пути, названные в текстах, суще
322
194
  нет вовсе, и по слову из своей темы эта строка находилась — а неправда была в другом.
323
195
  - **Сказать «сверено», не открыв файл, нельзя.** Правило читается целиком. Устаревшее
324
196
  утверждение стоит в списке среди верных и ничем от них не отличается.
325
- - **Если папку просто удалить, первым пропадёт `grill.md`.** Удалить проще, чем разобрать, а
326
- слова владельца записаны только там, и восстановить их неоткуда. Поэтому гард требует, чтобы
327
- ветка добавила запись в архив. Что именно перенесли, он не проверяет — это смотрит владелец
328
- на ревью.
329
197
  - **Вливание после мержа не делается.** В главной ветке тогда лежит раздел «предложено, но не
330
198
  выкачено» с тем, что работает месяц, — беззвучная ложь, тем убедительнее, чем старше.
331
199
  - **Номера сценариев при вливании не пересчитываются.** Идентификатор — ключ связи с тестами;
@@ -335,22 +203,5 @@ npm run check:docs # пути, названные в текстах, суще
335
203
  стоявшее другими словами, а строка «этого раздела ещё нет» становится ложью ровно той
336
204
  работой, которая её вливает. Сверка спеков в этот раздел не смотрит вовсе. Снимается
337
205
  дословный повтор и то, что работа сделала входящим.
338
- - **Шаги закрытия с владельцем не согласуются — они перечислены здесь.** Разбор работы
339
- правилами входит в закрытие так же, как вливание договорённости и разбор папки; владелец
340
- решает не то, запускать ли его, а что делать с находками. Ход, кончившийся таким вопросом,
341
- отбивает гард разговора: за ход правила не читались, а ответ стоит в них. Спрашивается только
342
- то, чего в правилах нет.
343
- - **Блок готового кода в паттерне стареет от чужой правки.** Он не привязан ни к чему: сверка
344
- спеков читает утверждения правила, а пример под ними не читает вовсе. Два поля, ставших
345
- обязательными в чужой работе, сделали пример в соседнем паттерне несобираемым — сам он при
346
- этом не изменился ни на знак и в след задачи не попал, потому что ни одного слова той работы
347
- в нём нет. Паттерн находится по имени правленого символа, а не по теме работы.
348
206
  - **Правило без привязки в спек домена не въезжает.** Кода, который его исполняет, нет —
349
207
  значит это намерение, и место ему в открытых вопросах домена, а не в правилах.
350
- - **Замысел эпика правят только там, где вписывают «чем кончился».** Границы эпика и
351
- порядок задач в нём при этом остаются прежними, а работа их уже нарушила: задача, решившая
352
- читать спеки, оставила над собой границу «спеки — вторая очередь», и следующий исполнитель
353
- прочитает её как действующую. Границы эпика перечитываются целиком тем же заходом, что и
354
- итог работы.
355
- - **Архив не обновляется после выкатки.** Уехавшее туда описывает день переезда, и правится
356
- оно только вместе с признанием, что описывало неверно.
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: task-flow-handoff
3
3
  kind: pattern
4
- rule: task-flow
5
- description: Паттерн правила task-flow. Брать, когда заход упирается в заполнение окна — выбор точки остановки, запись хода работы, форма передачи и что владелец с ней делает. Не брать для возвращения к работе новым заходом — это паттерн task-flow-resume.
4
+ rule: turn-conduct
5
+ description: Паттерн правила turn-conduct. Брать, когда заход упирается в заполнение окна — выбор точки остановки, запись хода работы, форма передачи и что владелец с ней делает. Не брать для возвращения к работе новым заходом — это паттерн task-flow-resume.
6
6
  ---
7
7
 
8
8
  # Закрытие захода по заполнению окна
9
9
 
10
- Паттерн правила `task-flow`. Что при этом должно быть верно — закон
10
+ Паттерн правила `turn-conduct`. Что при этом должно быть верно — закон
11
11
  `docs/constitution/work-conduct.md`.
12
12
 
13
13
  ## Когда брать
@@ -55,7 +55,7 @@ description: Паттерн правила task-flow. Брать, когда з
55
55
  ### Коммит
56
56
 
57
57
  Проверенное коммитится сразу, а не копится до конца задачи. Работа кончена — открывается PR:
58
- паттерн `git-workflow-commit`.
58
+ паттерн `git-workflow-pr`.
59
59
 
60
60
  ### Передача
61
61
 
@@ -66,6 +66,24 @@ mkdir -p <каталог передачи>
66
66
  # файл — <каталог передачи>/<ветка>.md
67
67
  ```
68
68
 
69
+ **Черновик передачи пишет хук, а не рука.** Перед сжатием контекста он кладёт по тому же
70
+ адресу то, что есть на диске: ветку, состояние работы, следующий шаг, незакоммиченное, коммиты
71
+ сверх главной. Сжатие приходит и тогда, когда напомнить некому — ночью или посреди длинного
72
+ хода, — и без хука заход в этот момент терял передачу целиком.
73
+
74
+ **Читает передачу тоже хук, а не человек.** На запуске он кладёт её в контекст целиком — вместе
75
+ с картой хода, — и вставлять её руками не приходится ни после сжатия, ни после обрыва, ни после
76
+ очистки. Написанная и не прочитанная, передача равна ненаписанной: следующий заход о ней не
77
+ знает и начинает с пустого места, то есть с того же, ради чего её и писали.
78
+
79
+ Отсюда требование к тексту: передача пишется для машины, которая подаст её без разбора, и для
80
+ захода, который прочтёт её первой строкой. Обращаться в ней к владельцу — «спроси у него, чем
81
+ кончилась проба» — значит писать в пустоту: к моменту чтения владельца в разговоре ещё нет.
82
+
83
+ Написанное хуком — нижняя граница, а не готовая передача. Исполнитель, закрывающий заход по
84
+ правилу, пишет поверх: он знает то, чего на диске нет, — чем кончилась проба, почему выбран
85
+ этот путь, что владелец сказал по дороге. Файл один, последняя запись побеждает.
86
+
69
87
  Внутри — готовый текст для вставки в новый заход, без обращения к владельцу за подробностями:
70
88
 
71
89
  ```markdown
@@ -120,6 +120,9 @@ git log --oneline origin/main..HEAD
120
120
  - Доэтапное, не этой работы: сверка очереди перечисляет шесть закрытых задач вне борды.
121
121
  ```
122
122
 
123
+ **Следующее движение:** отмеченный этап тем же ходом сменяется следующим. Этапы кончились —
124
+ тот же ход гонит набор и открывает PR черновиком.
125
+
123
126
  ## Состояние `работа-отдана`: следующая задача берётся тем же движением
124
127
 
125
128
  Задача закрыта, PR открыт и ждёт владельца — заход на этом не кончается. Отданное на разбор
@@ -138,6 +141,9 @@ git log --oneline origin/main..HEAD
138
141
  `task-flow-handoff`. Эпик кончился — заход закрывается тем же порядком, и владельцу называется,
139
142
  что кончился именно эпик, а не одна его задача.
140
143
 
144
+ **Следующее движение:** по следующей задаче делается действие — заведена задача, ветка или
145
+ папка. Ход кончается после него, а не после слов о нём.
146
+
141
147
  ## Ловушки
142
148
 
143
149
  - **Заход, кончившийся ничем, тоже записывается.** Иначе следующий пойдёт той же дорогой:
@@ -40,6 +40,9 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
40
40
  считается сделанным, разведка исполняется как настроение: прочитанный переданный текст сходит
41
41
  за неё, и по текущему дереву не запускается ни одной команды.
42
42
 
43
+ **Следующее движение:** находки ложатся в разбор, и тем же ходом владельцу уходит первый из
44
+ шести вопросов. Разведка кончилась — состояние осталось прежним, ход тоже.
45
+
43
46
  ### Состояние `просьба-не-разобрана`: разбор с владельцем
44
47
 
45
48
  Ведёт главный агент: субагент до владельца не достучится. Команда — `/grill-me`, один вопрос
@@ -89,6 +92,9 @@ mkdir -p docs/tasks/_draft-<slug>
89
92
  cp docs/tasks/_template/grill.md docs/tasks/_draft-<slug>/grill.md
90
93
  ```
91
94
 
95
+ **Следующее движение:** ответ владельца дописывается в разбор, и следом уходит следующий
96
+ вопрос. Ответы кончились — тем же ходом работа идёт в конвейер ролей.
97
+
92
98
  ### Состояние `разбор-закрыт`: конвейер после разбора
93
99
 
94
100
  Вопросов больше не будет — дальше роли:
@@ -107,6 +113,9 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
107
113
  «не входит». Находка критика, расходящаяся с ответом владельца, относится владельцу — она не
108
114
  исполняется молча и не считается закрытой правкой текста.
109
115
 
116
+ **Следующее движение:** сверенная с разбором договорённость коммитится, и тем же ходом
117
+ заводятся задача, ветка и папка — а вышла из разбора серия, сперва объявляется эпик.
118
+
110
119
  ### Состояние `договорённость-записана`: серия задач объявляется эпиком
111
120
 
112
121
  Разбор кончился одной задачей — шаг пропускается. Вышло несколько, и порядок между ними
@@ -134,6 +143,9 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
134
143
  Лежит замысел вне папки задачи: та умирает с мержем первой же задачи. Каталог для него называет
135
144
  компаньон правила — у пакета своего пути нет.
136
145
 
146
+ **Следующее движение:** объявленный эпик коммитится, и тем же ходом берётся первая его
147
+ задача — заведением задачи, ветки и папки.
148
+
137
149
  ### Состояние `договорённость-записана`: задача, ветка, папка
138
150
 
139
151
  ```bash
@@ -171,6 +183,9 @@ cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/pr
171
183
  Пока не объявлено состояние, в котором код правится, гард отбивает правку и называет
172
184
  обязательное действие того состояния, которое стоит в строке.
173
185
 
186
+ **Следующее движение:** объявив состояние, тот же ход берётся за замысел — начиная с его
187
+ шапки. Заведённая папка ходом не кончается: в ней ещё нет ни одного написанного файла.
188
+
174
189
  ### Состояние `задача-взята`: шапка замысла
175
190
 
176
191
  Её читает гард:
@@ -189,6 +204,32 @@ cp docs/tasks/_template/progress.md docs/tasks/<КЛЮЧ>-<номер>-<slug>/pr
189
204
 
190
205
  Пустая причина не принимается.
191
206
 
207
+ **Следующее движение:** под шапкой пишутся след задачи и этапы, замысел коммитится, и тем же
208
+ ходом начинается первый этап.
209
+
210
+ ### Состояние `замысел-записан`: первый этап начинается тем же ходом
211
+
212
+ Замысел закоммичен — работа переходит в первый этап сразу, не отдавая хода. Строка состояния
213
+ перезаписывается на `этап-идёт`, и дальше работу ведёт паттерн возвращения.
214
+
215
+ ```markdown
216
+ - **Состояние:** `этап-идёт`
217
+ - **Этап:** 1 из 3 — <название первого этапа из замысла>
218
+ ```
219
+
220
+ Ход на этой границе не кончается. Написанный замысел выглядит законченным куском: этапы
221
+ разложены, файл закоммичен, отчитаться есть чем — и отчёт встаёт ровно на то место, которое
222
+ должна была занять работа. Владелец читает такой отчёт как сделанное, а сделано ничего. Так
223
+ и вышло 21 августа: заход кончился строкой «следующий шаг — такой-то» при заполнении окна около
224
+ двух процентов.
225
+
226
+ Кончают ход четыре вещи, и они те же, что у остальных состояний: предел заполнения окна, отказ
227
+ гарда, вопрос владельцу и отданная работа, по которой начата следующая. Дочитанный до конца
228
+ паттерн к ним не относится — текст кончился, работа нет.
229
+
230
+ **Следующее движение:** первый этап делается тем же ходом, а закрытым он объявляется после
231
+ того, как прошла его команда из строки «Чем проверяется».
232
+
192
233
  ## Ловушки
193
234
 
194
235
  - **Номер не бывает первым.** До конца разбора неизвестно даже, сколько задач из него выйдет: