@rt-tools/agent-kit 0.16.1 → 0.18.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.
- package/assets/checks/board-epics.github.mjs +123 -0
- package/assets/checks/board-gh.github.mjs +121 -0
- package/assets/checks/board-paths.github.mjs +88 -0
- package/assets/checks/board-runs.github.mjs +8 -0
- package/assets/checks/board-titles.github.mjs +66 -0
- package/assets/checks/board.github.mjs +77 -73
- package/assets/checks/check-board.github.mjs +56 -7
- package/assets/checks/check-file-size.mjs +10 -2
- package/assets/checks/check-glossary.mjs +170 -0
- package/assets/checks/check-hook-scope.mjs +126 -0
- package/assets/checks/check-profile-drift.mjs +195 -0
- package/assets/checks/check-push-gate.mjs +59 -1
- package/assets/checks/check-schema-drift.mjs +12 -5
- package/assets/checks/check-specs.mjs +1 -1
- package/assets/checks/rt-kit-checks.config.mjs +13 -0
- package/assets/checks/spec-anchors.mjs +2 -2
- package/assets/checks/spec-contract.mjs +9 -0
- package/assets/defaults/gate-map.sh +13 -4
- package/assets/defaults/project.sh +31 -108
- package/assets/defaults/shell.sh +139 -0
- package/assets/docs/GLOSSARY.md +1 -1
- package/assets/hooks/browser-device-id.sh +20 -4
- package/assets/hooks/browser-guard-device-id.sh +5 -2
- package/assets/hooks/browser-guard-no-other-drivers.sh +41 -2
- package/assets/hooks/claim-guard.sh +22 -1
- package/assets/hooks/docs-guard.sh +1 -1
- package/assets/hooks/exam-guard.sh +85 -12
- package/assets/hooks/git-guard-delivery-conflict.sh +85 -0
- package/assets/hooks/git-guard-delivery-folder.sh +19 -0
- package/assets/hooks/git-guard-delivery-signature.sh +14 -5
- package/assets/hooks/git-guard-delivery.sh +54 -2
- package/assets/hooks/git-guard-push-tests.sh +21 -1
- package/assets/hooks/grill-gate-ask.sh +25 -0
- package/assets/hooks/grill-gate.sh +75 -11
- package/assets/hooks/lint-after-edit.sh +44 -16
- package/assets/hooks/proposal-guard.sh +11 -4
- package/assets/hooks/rule-source-guard.sh +8 -13
- package/assets/hooks/skill-gate-layers.sh +7 -0
- package/assets/hooks/skill-gate.sh +29 -0
- package/assets/hooks/task-context-load.sh +32 -0
- package/assets/hooks/task-flow-context.sh +194 -0
- package/assets/hooks/task-flow-draft-guard.sh +109 -0
- package/assets/hooks/task-flow-guard.sh +27 -159
- package/assets/hooks/turn-exit-guard.sh +53 -88
- package/assets/hooks/waiting-turn-guard.sh +65 -2
- package/assets/hooks/window-fill-guard.sh +5 -1
- package/assets/hooks/work-start-guard.sh +166 -0
- package/assets/hooks/write-targets.sh +24 -0
- package/assets/laws/delivery.md +19 -0
- package/assets/laws/frontend-application.md +4 -0
- package/assets/laws/verifiability.md +44 -0
- package/assets/laws/work-conduct.md +15 -0
- package/assets/patterns/browser-verification-measure.md +3 -1
- package/assets/patterns/browser-verification-stand.md +17 -4
- package/assets/patterns/doc-style-write.md +62 -2
- package/assets/patterns/git-workflow-commit.github.md +33 -5
- package/assets/patterns/git-workflow-docker.md +22 -0
- package/assets/patterns/git-workflow-freshness.md +87 -0
- package/assets/patterns/git-workflow-merge.md +41 -0
- package/assets/patterns/git-workflow-migration.md +11 -0
- package/assets/patterns/git-workflow-pr.github.md +12 -1
- package/assets/patterns/git-workflow-restart.md +18 -0
- package/assets/patterns/git-workflow-secrets.md +14 -0
- package/assets/patterns/git-workflow-stack.md +93 -1
- package/assets/patterns/lib-layers-move.md +4 -0
- package/assets/patterns/spec-driven-domain.md +47 -2
- package/assets/patterns/spec-driven-rule.md +16 -4
- package/assets/patterns/spec-driven-sweep.md +57 -0
- package/assets/patterns/status-report-table.github.md +1 -1
- package/assets/patterns/task-flow-archive.md +58 -16
- package/assets/patterns/task-flow-close.md +106 -23
- package/assets/patterns/task-flow-handoff.md +14 -2
- package/assets/patterns/task-flow-resume.md +35 -8
- package/assets/patterns/task-flow-start.md +60 -22
- package/assets/patterns/testing-e2e.md +23 -0
- package/assets/patterns/turn-entry-map.md +1 -1
- package/assets/pitfalls/agent-kit.md +71 -3
- package/assets/pitfalls/doc-style.md +15 -0
- package/assets/pitfalls/git-workflow.github.md +88 -0
- package/assets/pitfalls/spec-driven.md +22 -0
- package/assets/pitfalls/task-flow.md +113 -0
- package/assets/pitfalls/testing.md +6 -0
- package/assets/pitfalls/turn-conduct.md +49 -0
- package/assets/rules/browser-verification.md +58 -0
- package/assets/rules/deploy-flow.azure.md +8 -0
- package/assets/rules/deploy-flow.github.md +27 -0
- package/assets/rules/deploy-flow.gitlab.md +8 -0
- package/assets/rules/doc-style.md +20 -0
- package/assets/rules/git-workflow.azure.md +22 -2
- package/assets/rules/git-workflow.github.md +127 -118
- package/assets/rules/git-workflow.gitlab.md +17 -4
- package/assets/rules/lists.md +5 -0
- package/assets/rules/observability.needs-app.md +4 -0
- package/assets/rules/reuse-first.md +14 -0
- package/assets/rules/shared-code.md +5 -0
- package/assets/rules/spec-driven.md +33 -15
- package/assets/rules/task-flow.md +132 -126
- package/assets/rules/testing.md +41 -2
- package/assets/rules/turn-conduct.md +73 -57
- package/assets/rules/turn-entry.md +6 -0
- package/assets/samples/tasks/_template/grill.md +5 -0
- package/assets/samples/tasks/_template/plan.md +3 -0
- package/assets/skills/agent-kit.md +108 -76
- package/assets/templates/postmortem.md +5 -1
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +30 -6
- package/bin/agent-kit.js.map +1 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +2 -1
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +96 -7
- package/lib/commands.js.map +1 -1
- package/lib/hooks-map.d.ts +26 -0
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +58 -2
- package/lib/hooks-map.js.map +1 -1
- package/lib/sections.d.ts +6 -0
- package/lib/sections.d.ts.map +1 -1
- package/lib/sections.js +19 -0
- package/lib/sections.js.map +1 -1
- package/lib/shipment.d.ts +2 -0
- package/lib/shipment.d.ts.map +1 -1
- package/lib/shipment.fixture.d.ts +5 -0
- package/lib/shipment.fixture.d.ts.map +1 -1
- package/lib/shipment.fixture.js +7 -0
- package/lib/shipment.fixture.js.map +1 -1
- package/lib/shipment.js +13 -1
- package/lib/shipment.js.map +1 -1
- package/lib/sync.d.ts +35 -3
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +59 -8
- package/lib/sync.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.18.0.tgz +0 -0
- package/rt-tools-agent-kit-0.16.1.tgz +0 -0
|
@@ -15,7 +15,7 @@ description: Правило под «Закон о ведении работы»
|
|
|
15
15
|
Грузится по требованию, а не вместе с правилом: при обычном решении она не нужна — она нужна
|
|
16
16
|
тому, кто разбирает промах или спорит с гардом.
|
|
17
17
|
|
|
18
|
-
**Требует:** `hooks/task-flow-guard.sh`, `hooks/task-context-load.sh`, `hooks/grill-gate.sh`, `hooks/window-fill-guard.sh`, `hooks/turn-exit-guard.sh`
|
|
18
|
+
**Требует:** `hooks/task-flow-guard.sh`, `hooks/task-flow-draft-guard.sh`, `hooks/task-context-load.sh`, `hooks/grill-gate.sh`, `hooks/window-fill-guard.sh`, `hooks/turn-exit-guard.sh`, `hooks/work-start-guard.sh`
|
|
19
19
|
|
|
20
20
|
## Как это называется здесь
|
|
21
21
|
|
|
@@ -26,8 +26,8 @@ description: Правило под «Закон о ведении работы»
|
|
|
26
26
|
| замысел | `docs/tasks/<ветка>/plan.md` — след задачи и этапы с признаками готовности; после написания не правится |
|
|
27
27
|
| ход работы | `docs/tasks/<ветка>/progress.md` — «Где стоим», решения по ходу, записи заходов; единственное место, где отмечается сделанное |
|
|
28
28
|
| договорённость о продукте, записанная до кода | `docs/specs/<домен>/proposed/<фича>/` — спек фичи; переживает мерж и вливается в спек домена |
|
|
29
|
-
| эпик — работа шире одной ветки | карточка в очереди работ с меткой эпика и замысел
|
|
30
|
-
| замысел эпика | запись вне папки
|
|
29
|
+
| эпик — работа шире одной ветки | карточка в очереди работ с меткой эпика и замысел рядом с ней: возможность, состав задач и порядок |
|
|
30
|
+
| замысел эпика | запись вне папки задачи: та умирает с мержем, а эпик её переживает; каталог называет компаньон правила |
|
|
31
31
|
| папка задачи до заведения задачи | `docs/tasks/_draft-<slug>/` — вне истории, пока номера нет |
|
|
32
32
|
| разведка | заход `Explore` или `general-purpose` до первого вопроса владельцу |
|
|
33
33
|
| разбор замысла ролями | `.claude/workflows/plan.js` — нужность, договорённость, критика, замысел |
|
|
@@ -55,28 +55,27 @@ description: Правило под «Закон о ведении работы»
|
|
|
55
55
|
| `задача-взята` | задача в колонке работы, ветка по номеру, папка | написать замысел | `task-flow-start` |
|
|
56
56
|
| `замысел-записан` | замысел лежит и после записи не правится | делать первый этап | `task-flow-start` |
|
|
57
57
|
| `этап-идёт` | этап начат | доделать этап и отметить в ходе работы | `task-flow-resume` |
|
|
58
|
-
| `этапы-кончились` | все этапы отмечены |
|
|
58
|
+
| `этапы-кончились` | все этапы отмечены | влить договорённость, привести тексты, прогнать набор | `task-flow-close` |
|
|
59
59
|
| `разбор-кончился` | набор зелёный, тексты приведены | разобрать папку последним коммитом | `task-flow-archive` |
|
|
60
60
|
| `папка-разобрана` | папки в ветке нет, запись в архиве есть | открыть PR черновиком | `task-flow-close` |
|
|
61
61
|
| `работа-отдана` | PR открыт черновиком | взять следующую задачу | `task-flow-resume` |
|
|
62
62
|
| `влито` | PR слит человеком | разбор работы правилами и сверка очереди | `task-flow-archive` |
|
|
63
63
|
|
|
64
64
|
Ни у одного состояния обязательное действие не звучит как «ждать»: ожидание чужого шага
|
|
65
|
-
состоянием работы не
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
Последние два состояния объявить на диске уже нечем: ход работы уезжает вместе с папкой, а
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
прогона, снять черновик, попросить влить — держится паттерном, а не объявлением.
|
|
65
|
+
состоянием работы не является, поэтому в `работа-отдана` обязательное действие смотрит на
|
|
66
|
+
следующую задачу, а не на открытый PR. Блокированная задача следующей при этом не считается: она
|
|
67
|
+
начнётся после чужого шага, то есть это то же ожидание, названное именем работы. Следующая
|
|
68
|
+
берётся из очереди работ, а очередь спрашивается командой: «задач нет» — утверждение о дереве, и
|
|
69
|
+
подтверждается оно выводом, а не памятью о том, что заводил сам исполнитель. Заполнение окна
|
|
70
|
+
захода состоянием тоже не бывает: заход кончается передачей, а работа остаётся там, где стояла.
|
|
71
|
+
Чем ход кончается — правило `turn-conduct` под тем же законом.
|
|
72
|
+
|
|
73
|
+
Перечень показывается владельцу в начале работы, и на нём же отмечается, где стоим.
|
|
74
|
+
|
|
75
|
+
Последние два состояния объявить на диске уже нечем: ход работы уезжает вместе с папкой, а папка
|
|
76
|
+
разбирается раньше, чем открывается PR. Признак у них поэтому в истории ветки — коммит разбора
|
|
77
|
+
папки, — и читает его гард, а не строка в файле. Цена: с этой минуты и до слияния состояние
|
|
78
|
+
работы виду не подлежит, и хвост из четырёх шагов держится паттерном, а не объявлением.
|
|
80
79
|
|
|
81
80
|
## Ход
|
|
82
81
|
|
|
@@ -99,7 +98,7 @@ flowchart TD
|
|
|
99
98
|
H --> I{Этап сделан}
|
|
100
99
|
I -->|Да| J[Отметка в ходе работы — единственном месте, где отмечается сделанное]
|
|
101
100
|
J --> I
|
|
102
|
-
I -->|Этапы кончились| T[
|
|
101
|
+
I -->|Этапы кончились| T[Договорённость вливается в спек домена, тексты приводятся к сделанному, следом прогоняется набор]
|
|
103
102
|
T --> N[Папка задачи разбирается последним коммитом: разбор просьбы — в описание прошлого, находки — к замыслу эпика, замысел — прочь]
|
|
104
103
|
N --> S[Сверка очереди работ]
|
|
105
104
|
S --> K[PR открывается черновиком; исполнитель называет номер, чего ждёт и что сделает следом]
|
|
@@ -113,45 +112,59 @@ flowchart TD
|
|
|
113
112
|
|
|
114
113
|
## Как закон применяется здесь
|
|
115
114
|
- **Правка кода приложения отбивается, пока работа не дошла до состояния, в котором код
|
|
116
|
-
правится.** Гард требует
|
|
117
|
-
в ходе работы
|
|
115
|
+
правится.** Гард хода работы требует три вещи: папку задачи по имени ветки, замысел в ней и
|
|
116
|
+
объявленное в ходе работы состояние. Договорённость о продукте требует свой гард на те же
|
|
117
|
+
события.
|
|
118
118
|
- **Гард судит объявленный переход, а не наличие файлов.** Пустой замысел, положенный ради
|
|
119
119
|
снятия отказа, лежит так же, как написанный, поэтому отказ снимает объявленное состояние —
|
|
120
120
|
`этап-идёт`, `этапы-кончились`, `разбор-кончился`. Четвёртый путь не состояние, а история
|
|
121
121
|
ветки: папка, разобранная её коммитом, означает отданную работу, и правка по замечаниям идёт
|
|
122
122
|
без замысла на диске.
|
|
123
|
-
-
|
|
123
|
+
- **Строка состояния, переведённая вперёд, — то же объявление намерения, только машиночитаемое.**
|
|
124
|
+
Пустоты за ней не видно никому: состояние объявляется тем ходом, в котором его обязательное
|
|
125
|
+
действие начато делом, а не тем, в котором о нём отчитались.
|
|
126
|
+
- **Отказ по состоянию называет обязательное действие объявленного состояния.**
|
|
124
127
|
Исполнитель, которому сказано только «не в том состоянии», перепишет строку состояния вместо
|
|
125
128
|
того, чтобы сделать шаг.
|
|
126
129
|
- **Именем состояния считается только слово из перечня.** Своё слово не говорит ни о входе, ни о
|
|
127
130
|
выходе, ни об обязательном действии, а перечень называет все три.
|
|
128
|
-
-
|
|
129
|
-
|
|
131
|
+
- **Два требования — два гарда, и снять одно можно, не теряя второго.** Одним файлом отказ от
|
|
132
|
+
требования договорённости снимал заодно папку задачи — то, о чём дерево не просило. Судят
|
|
133
|
+
порознь: строка о неизменном поведении снимает договорённость, а не требование дойти до
|
|
134
|
+
правки кода.
|
|
130
135
|
- **Влитая договорённость ветку не запирает.** После вливания директории «предложено» на диске
|
|
131
136
|
нет, а замысел на неё ссылается до конца работы: гард отличает влитое от незаведённого по
|
|
132
|
-
истории ветки. Иначе
|
|
137
|
+
истории ветки. Иначе правкам по замечаниям не было бы дороги.
|
|
133
138
|
- **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**` —
|
|
134
139
|
признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
|
|
135
140
|
`**Поведение:** не меняется — <причина владельца>` в замысле; пустая причина не принимается.
|
|
141
|
+
- **Что требует слова владельца, берётся списком, а не оценкой на месте.** Оценку «это безопасно»
|
|
142
|
+
назначает тот, кому она удобна, и меняется она с настроением разговора, а не со свойствами
|
|
143
|
+
команды. Недовольство владельца простоем разрешением не бывает.
|
|
144
|
+
- **Заход работу не начинает сам.** Начало требует слова владельца в этом же заходе: передача,
|
|
145
|
+
состояние из хука запуска и назначенный эпик говорят, что делать, если работать, и молчат о
|
|
146
|
+
том, работать ли. Судится это формой реплики, а не смыслом: правка кода после пустой реплики,
|
|
147
|
+
одного слова или одного пути ход не заканчивает.
|
|
148
|
+
- **Указание работать по ходу работы покрывает все его шаги, включая меняющие историю.** Отметка
|
|
149
|
+
этапа, пуш и заявка предписаны им самим: спрашивают о том, чего в нём нет.
|
|
150
|
+
- **Вопрос, записанный прошлым заходом, вопросом владельца не становится.** Он адресован автору
|
|
151
|
+
передачи, и часть таких вопросов закрыта шагом работы.
|
|
152
|
+
- **Слово владельца об устройстве — постановка, а не решение.** Названное им обычно уже живёт в
|
|
153
|
+
дереве под этим самым словом: у него есть имя на экране, раздел в спеке и поле в модели. Прежде
|
|
154
|
+
чем строить, слово сверяется с ними, а разошлось прочтение с деревом — спрашивается владелец, до
|
|
155
|
+
правки: истолкованное по ближайшему коду, оно выглядит исполненной просьбой ровно до приёмки.
|
|
136
156
|
- **Папка задачи заводится под любую работу, без исключений.** Исключение, у которого есть хоть
|
|
137
|
-
одна законная форма, исполняется как разрешение. Заводится она
|
|
138
|
-
|
|
139
|
-
- **Папка задачи едет в ветку коммитом, а не живёт в одном рабочем дереве.**
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
делается, а следующий заход находит пустоту вместо «Где стоим». Вне истории законен один
|
|
146
|
-
черновик без номера: заводить в неё нечего, пока нет имени.
|
|
147
|
-
- **Папка задачи разбирается последним коммитом до открытия PR, а не после одобрения.** Кнопку
|
|
148
|
-
слияния нажимает человек на хостинге, куда гард не достаёт, и вливает он, как только видит
|
|
149
|
-
зелёное, — закрывающему коммиту места не остаётся вовсе. Цена перестановки: замысла с этой
|
|
150
|
-
минуты на диске нет, и признак отданной работы гард берёт из истории ветки.
|
|
157
|
+
одна законная форма, исполняется как разрешение. Заводится она до первой правки: сколько
|
|
158
|
+
заходов уйдёт на работу, заранее не знает никто.
|
|
159
|
+
- **Папка задачи едет в ветку коммитом, а не живёт в одном рабочем дереве.** Незакоммиченная,
|
|
160
|
+
она проходит все правки без отказа, а признак отданной работы берётся из истории: отказ придёт
|
|
161
|
+
в последней точке, когда замысел уже снят. Вне истории законен один черновик без номера.
|
|
162
|
+
- **Папка задачи разбирается последним коммитом до открытия PR, а не после одобрения.** Человек
|
|
163
|
+
вливает, как только видит зелёное, и закрывающему коммиту места не остаётся вовсе. Цена:
|
|
164
|
+
замысла с этой минуты на диске нет, и признак отданной работы гард берёт из истории ветки.
|
|
151
165
|
- **Открыв PR, исполнитель называет владельцу три вещи: номер, чего ждёт и что сделает следом.**
|
|
152
|
-
Ждёт он прогона, следом идёт снятие черновика. Зелёный прогон
|
|
153
|
-
|
|
154
|
-
заблокирована.
|
|
166
|
+
Ждёт он прогона, следом идёт снятие черновика. Зелёный прогон говорит, что не сломано, и молчит
|
|
167
|
+
о заблокированной у черновика кнопке слияния.
|
|
155
168
|
- **Просьба о слиянии — отдельный ход, и раньше зелёного прогона её не бывает.** Порядок один:
|
|
156
169
|
папка разобрана и запушена → PR открыт черновиком → прогон зелёный → черновик снят →
|
|
157
170
|
исполнитель просит влить, называя номер.
|
|
@@ -159,13 +172,18 @@ flowchart TD
|
|
|
159
172
|
вовсе, а открытый PR читается как приглашение влить — поэтому незаконченная работа идёт
|
|
160
173
|
черновиком. Черновик снимается тем ходом, которым исполнитель говорит, что решение готово.
|
|
161
174
|
- **Гард замысла — нижняя граница требования, а не его предел.** Он требует папку только под
|
|
162
|
-
правку кода приложения, а статья выше — под любую работу. Прочитанный как признак,
|
|
163
|
-
становится разрешением работать без замысла везде, куда
|
|
175
|
+
правку кода приложения, а статья выше — под любую работу. Прочитанный как признак, он
|
|
176
|
+
становится разрешением работать без замысла везде, куда не смотрит.
|
|
177
|
+
- **Указание работать по правилу — это указание делать его шаги, включая те, что меняют
|
|
178
|
+
историю.** Отметка сделанного этапа, коммит, пуш и открытие заявки правилом предписаны, и
|
|
179
|
+
отдельного слова владельца на каждый из них не требуется: спросить надо о том, чего в правиле
|
|
180
|
+
нет. Ход, который довёл работу до готовности и встал перед коммитом, работу не отдал, а спрятал.
|
|
164
181
|
- **Взятая задача ходом не кончается.** Заведение задачи, ветки, колонки и папки — подготовка, а
|
|
165
182
|
не работа: они переводят её в состояние записанного замысла, где обязательное действие уже
|
|
166
|
-
другое.
|
|
167
|
-
|
|
168
|
-
|
|
183
|
+
другое. Держит это страж выхода хода, называя в отказе первый этап замысла.
|
|
184
|
+
- **Ожидание одной части этапа остановкой этапа не бывает.** Части, которые от ожидаемого не
|
|
185
|
+
зависят, делаются тем же ходом, а владельцу называется, что сделано и что осталось на его шаг.
|
|
186
|
+
Отбитая гардом команда и отклонённый вызов читаются так же: сперва делается всё, что мимо них.
|
|
169
187
|
- **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом, а
|
|
170
188
|
не дописывается: это первое, что читает следующий заход.
|
|
171
189
|
- **Слово для нового понятия ищется в словаре дерева.** Общую часть везёт пакет, предметную
|
|
@@ -174,97 +192,85 @@ flowchart TD
|
|
|
174
192
|
- **Папка задачи заводится черновиком и получает номер командой.** До конца разбора неизвестно,
|
|
175
193
|
сколько задач из него выйдет, поэтому номер не может быть первым. Команда заведения
|
|
176
194
|
переименовывает черновик, проставляет шапку замысла и собирает папку с образца, снимая с копий
|
|
177
|
-
шапку
|
|
178
|
-
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
от своей. Замысел открывается перед взятием; кончившийся эпик называется владельцу тем же
|
|
183
|
-
ходом, которым берётся работа вне его.
|
|
195
|
+
шапку раскладки.
|
|
196
|
+
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди.
|
|
197
|
+
- **Следующая задача берётся из замысла эпика, а список очереди работ спрашивается только там, где
|
|
198
|
+
эпика нет.** По списку номеров первая задача чужого эпика неотличима от своей. Кончившийся эпик
|
|
199
|
+
называется владельцу тем же ходом, которым берётся работа вне его.
|
|
184
200
|
- **Эпик не закрывается по признаку, подтверждённому только чтением.** Признак, проверяемый
|
|
185
|
-
глазами, называется проверенным лишь вместе с командой или замером и их выводом.
|
|
186
|
-
«подтверждается живым замером» — обещание проверки, а не проверка.
|
|
201
|
+
глазами, называется проверенным лишь вместе с командой или замером и их выводом.
|
|
187
202
|
- **Задачи эпика заводятся все разом, тем же ходом, что и сам эпик.** Заведение по одной прячет
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
предыдущих.
|
|
203
|
+
объём. Номера возвращаются в раздел порядка той же правкой: без них «взять следующую» отвечает
|
|
204
|
+
названием, а не карточкой.
|
|
205
|
+
|
|
206
|
+
- **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка порядка задач не
|
|
207
|
+
держит, а папка задачи держала бы его до слияния первой из них; каталог называет компаньон
|
|
208
|
+
правила. Имя, адрес и способ, названные владельцем по ходу, дописываются туда же тем ходом,
|
|
209
|
+
каким приняты.
|
|
196
210
|
- **Сборка по образцу начинается с чтения самого образца, а не пересказа о нём.** Пересказ лежит
|
|
197
|
-
в разборе просьбы и в замысле эпика; они
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
211
|
+
в разборе просьбы и в замысле эпика; образцом они не считаются. Повторяемая часть открывается
|
|
212
|
+
целиком — обходом каталогов, а не одним файлом, за которым пришли.
|
|
213
|
+
- **Что действует на дерево, а не на правку, лежит вне индекса.** Путь к образцу и разрешение
|
|
214
|
+
работать вне эпика ветке не принадлежат: записанные файлом репозитория, они в ней и остаются,
|
|
215
|
+
а следующая, отведённая от главной, их не несёт. Место записи — рядом с передачей захода.
|
|
202
216
|
- **Закрытая работа разбирается правилами, и это шаг закрытия, а не отдельная просьба.** Что
|
|
203
|
-
грузилось, что помогло и чего не хватило, видно только тому заходу, который работу
|
|
204
|
-
|
|
205
|
-
|
|
217
|
+
грузилось, что помогло и чего не хватило, видно только тому заходу, который работу вёл. Разбор
|
|
218
|
+
кончается правкой слоя правил или предложением наружу; ведёт его роль разбора закрытой задачи,
|
|
219
|
+
если дерево её разложило.
|
|
206
220
|
- **Разбор закрытой работы уходит в фон, а исполнитель берёт следующую задачу.** Роль работает
|
|
207
|
-
своим ходом и ничего не
|
|
208
|
-
|
|
221
|
+
своим ходом и ничего не спрашивает. Сводку собирают до запуска, вернувшиеся находки принимают
|
|
222
|
+
одним ходом.
|
|
209
223
|
- **Находки разбора ждут владельца, а в пакет уезжает только сводка наблюдений.** Предложение —
|
|
210
224
|
заготовка правки чужого дерева, и уехавшая без разбора, она становится работой того, кто её не
|
|
211
|
-
заказывал. Сводка
|
|
212
|
-
|
|
225
|
+
заказывал. Сводка уезжает всегда: она говорит, чем пользовались, и мнением не бывает.
|
|
226
|
+
- **Дешёвый шаг закрытия идёт раньше дорогого, а прогон — после вливания.** Вливание договорённости
|
|
227
|
+
и приведение текстов стоят минуты, прогон — окно захода. Идущий после вливания, он проверяет и его
|
|
228
|
+
самого: идущий до, он смотрит то, что в главную не поедет.
|
|
213
229
|
- **Договорённость вливается в спек домена одним из последних коммитов ветки, до открытия PR.**
|
|
214
230
|
К этому моменту код написан, привязки известны, и в главной ветке директория `proposed/` не
|
|
215
231
|
появляется вовсе. Готовые к вливанию перечисляет `npm run check:specs`.
|
|
216
|
-
- **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает то,
|
|
217
|
-
|
|
218
|
-
- **Открытие PR
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
- **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать,
|
|
222
|
-
первым уходит разбор просьбы — единственная запись слов владельца.
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
частями, папку до конца не разбирает. Чтение из команды работает и без сети. Пустая причина
|
|
226
|
-
обходом не считается, а сам обход снимает отказ, но не гасит строку сверки очереди — иначе он
|
|
227
|
-
через месяц становится рабочим путём.
|
|
232
|
+
- **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает то, что
|
|
233
|
+
объясняет решение; остальное удаляется. Неразобранную ловит сверка очереди.
|
|
234
|
+
- **Открытие PR и снятие черновика отбиваются, пока ветка везёт папку своей задачи.** Слияние
|
|
235
|
+
нажимает человек на хостинге, где гардов нет: снятый черновик он читает как приглашение влить и
|
|
236
|
+
кнопку нажимает, не дожидаясь коммита уборки. Судится содержимое ветки, а не рабочее дерево.
|
|
237
|
+
- **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, а
|
|
238
|
+
первым уходит разбор просьбы — единственная запись слов владельца.
|
|
239
|
+
- **Обход — строка `Task-folder-skip: <причина>` в PR или в самой команде.** Пустая причина обходом
|
|
240
|
+
не считается, а сам обход снимает отказ, но не гасит строку сверки очереди.
|
|
228
241
|
|
|
229
242
|
## Чего из закона здесь нет
|
|
230
243
|
|
|
231
|
-
Полноту записанного понимания не проверяет
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
спек правятся в ветке, закон — нет: его статья приносится владельцу текстом, а работа идёт
|
|
262
|
-
дальше без неё.
|
|
263
|
-
|
|
264
|
-
Что именно перенесли в архив, не проверяется. Гард видит, что папка уезжает в главную ветку и
|
|
265
|
-
что ветка что-то в архив добавила, но не может судить, то ли это и стоило ли переносить именно
|
|
266
|
-
это. Сверять содержимое машине нечем — смотрит владелец на ревью. Отсюда же и обход: если
|
|
267
|
-
работа вливается частями, папку до конца не разбирают, а причина остаётся в PR.
|
|
244
|
+
Полноту записанного понимания не проверяет ничто: машине видно наличие записи, но не то, что в
|
|
245
|
+
ней закрыты все пробелы. То же с вопросом, который стоило задать и не задали, — следа он не
|
|
246
|
+
оставляет. Судит оба владелец.
|
|
247
|
+
|
|
248
|
+
Гард судит по путям правки, а не по тому, меняет ли работа поведение на самом деле. Своего
|
|
249
|
+
признака рефакторингу не заводится: оценку «поведение не меняется» назначал бы тот, кому она
|
|
250
|
+
мешает.
|
|
251
|
+
|
|
252
|
+
Ничто из самого разбора не проверяется. Разговор с владельцем инструментом не является: гард
|
|
253
|
+
видит правку файла и не знает ни о разведке до первого вопроса, ни о шести обязательных, ни об
|
|
254
|
+
ответах на них — пустая таблица проходит так же, как заполненная.
|
|
255
|
+
|
|
256
|
+
Гард разговора судит завершение хода, а не отправку вопроса: к моменту отказа вопрос уже у
|
|
257
|
+
владельца. Отсюда порядок — правило читается первым движением захода, а не по отказу гарда.
|
|
258
|
+
|
|
259
|
+
Неизменность замысла не стережёт ничто: правка по ходу отличима от первоначальной записи только
|
|
260
|
+
по истории.
|
|
261
|
+
|
|
262
|
+
Приведение текстов к сделанному не проверяет ничто: что устарело в правиле и в спеке, машине не
|
|
263
|
+
видно. Держится это шагом закрытия и следом задачи в замысле — там названо, что перечитать.
|
|
264
|
+
Правило и спек правятся в ветке, закон — нет: его статья приносится владельцу текстом, а работа
|
|
265
|
+
идёт дальше без неё.
|
|
266
|
+
|
|
267
|
+
Что именно перенесли в архив, не проверяется: гард видит, что папка уехала и что ветка что-то в
|
|
268
|
+
архив добавила, а то ли это — судит владелец на ревью.
|
|
269
|
+
|
|
270
|
+
Гард папки задачи судит вызов исполнителя, а не кнопку хостинга: человек, вливающий работу со
|
|
271
|
+
своей стороны, проходит мимо него молча, и папка уезжает в главную ветку целой. Гард закрывает ту
|
|
272
|
+
половину случаев, где вливает исполнитель; на второй требование держится оставшимся шагом,
|
|
273
|
+
который стоит разделом в теле заявки и произносится вслух.
|
|
268
274
|
|
|
269
275
|
Порядок отдачи работы дерево вправе перевернуть надстройкой, и тогда часть шагов пакета
|
|
270
276
|
перестаёт исполняться. Какие именно — не считает ничто: перечень отменяемого пишется руками, а
|
package/assets/rules/testing.md
CHANGED
|
@@ -73,7 +73,10 @@ flowchart TD
|
|
|
73
73
|
Юнит на тот же расчёт остаётся долгом: между верным решением и тем, что человек его видит, лежит
|
|
74
74
|
всё, чего юнит не касался.
|
|
75
75
|
- **Сквозной тест, погашенный переменной окружения, покрытием не считается.** Выключатель по
|
|
76
|
-
состоянию стенда — пропуск случая, выключатель по переменной — невыполненный тест.
|
|
76
|
+
состоянию стенда — пропуск случая, выключатель по переменной — невыполненный тест. Состоянием
|
|
77
|
+
стенда при этом считается то, чего на нём не бывает по устройству, а не то, что оставил на
|
|
78
|
+
экране соседний тест: снятие по чужому следу закон покрытием не считает, и от законного
|
|
79
|
+
пропуска оно отличается только причиной.
|
|
77
80
|
- **Упоминание в тесте сценария, которого в спеках нет, роняет проверку.** Так ловится
|
|
78
81
|
переименованный или выкинутый сценарий: тесты при этом остаются зелёными.
|
|
79
82
|
- **Решение выносится в чистую функцию и проверяется вызовом.** Компонент и сервис остаются тонкой
|
|
@@ -87,6 +90,11 @@ flowchart TD
|
|
|
87
90
|
того, кто её не трогал. Ни линтер, ни сборка, ни сверка спеков времени не знают.
|
|
88
91
|
- **Процедура Connect проверяется вызовом своего метода с рукописным двойником базы.** Контейнер и
|
|
89
92
|
роутер поднимать не надо: спека проверяет решение, а не раскладку полей.
|
|
93
|
+
- **Процедуру зовёт и сквозной набор, а не только тест рядом с ней.** У сквозного набора есть
|
|
94
|
+
свой помощник прямого вызова, и спека берёт ответ сервера оттуда, а не поднимает экран ради
|
|
95
|
+
одного поля. Поэтому «тестов на процедуру нет» утверждается после поиска её имени по всему
|
|
96
|
+
дереву, каталоги сквозных наборов включая, а не после того, как рядом с её файлом не нашлось
|
|
97
|
+
файла проверки: шесть отметок покрытия подряд объявили непокрытым закрытое.
|
|
90
98
|
- **Сид заводит то, без чего экран не открыть, и ничего, что гость примет за настоящее.**
|
|
91
99
|
Содержимое, у которого есть автор, — отзывы, вопросы, обсуждения — гость читает как написанное
|
|
92
100
|
людьми, а стенд собирается из той же базы, что и проверка глазами. Настройки владельца —
|
|
@@ -139,6 +147,16 @@ flowchart TD
|
|
|
139
147
|
проверки и с тех пор только сокращается: дописанная строка гасит сигнал, а не причину, и в
|
|
140
148
|
истории выглядит так же, как починка. Место, где проверка права по букве и не права по существу,
|
|
141
149
|
разбирает владелец, а до его ответа верна проверка.
|
|
150
|
+
- **Обмен принимается прочитанным с обеих сторон, а не по успеху вызовов.** Отправка и правка
|
|
151
|
+
состояния отвечают успехом и тогда, когда прочитать результат нечем: две с лишним сотни записей
|
|
152
|
+
простояли новыми, потому что забрать их было некому, а отметились только те, чей файл ещё лежал
|
|
153
|
+
на диске у отправителя. Заводя сторону обмена, называют вторую: чем читают, кто читает и что
|
|
154
|
+
будет, если её нет. Ответ «нечем» пишется словом — молчание о ней читается как рабочий обмен.
|
|
155
|
+
- **Значение, общее двум сторонам обмена, берётся у объявившей стороны, а не считается заново.**
|
|
156
|
+
Признак записи, форма груза, способ счёта ключа — своя копия любого из них расходится с
|
|
157
|
+
оригиналом молча, и обе стороны при этом зелены: одна пишет под своим значением, другая ищет
|
|
158
|
+
под своим. Проверяется это сценарием, который считает значение обоими путями и сверяет их между
|
|
159
|
+
собой, а не по одному на каждой стороне.
|
|
142
160
|
- **Тест, утверждающий отсутствие, зелен и тогда, когда ищет не то.** Совпадения нет ни у верного
|
|
143
161
|
текста, ни у опечатки в образце, ни у переименованного ключа — отличить их по цвету прогона
|
|
144
162
|
нечем. Отрицательное утверждение поэтому идёт в паре с положительным: сначала проверяется, что
|
|
@@ -147,6 +165,17 @@ flowchart TD
|
|
|
147
165
|
в заголовке стоит — сценарий числится покрытым, а что именно утверждается, не спрашивает никто.
|
|
148
166
|
Тело читается вместе с заголовком: обещание в заголовке и утверждение в теле — два разных
|
|
149
167
|
текста, и расходятся они молча.
|
|
168
|
+
- **Успешный ответ команды перечитывается отдельным запросом.** Код возврата говорит, что вызов
|
|
169
|
+
прошёл, и молчит о том, наступило ли нужное состояние: заведение задачи, отметка записи и
|
|
170
|
+
постановка ревьювера отвечают нулём и тогда, когда сделали не то. В отчёт идёт прочитанное, а
|
|
171
|
+
не заказанное.
|
|
172
|
+
- **Служба считается поднятой по выполненному заданию, а не по открытому порту.** Ответ на порту
|
|
173
|
+
говорит, что кто-то там слушает, и неотличим от прошлой сборки, оставшейся с прежнего захода:
|
|
174
|
+
проверяются обе стороны связи — что заказчик выбирает именно её и что задание через неё прошло.
|
|
175
|
+
- **Эталоны снимочного набора лежат рядом со спекой, а обновляются отдельным вызовом и читаются
|
|
176
|
+
глазами.** Обновление «на всякий случай» вместе с прогоном стирает разницу между починенным
|
|
177
|
+
видом и сломанным: обновлённый эталон делает зелёным любой кадр. Где эталоны и чем они
|
|
178
|
+
обновляются, называет компаньон правила.
|
|
150
179
|
- **Растр браузера называется явно, иначе кадр не сходится сам с собой.** Профиль цвета, взятый у
|
|
151
180
|
дисплея машины, ускоритель, считающий растр, и дорисовка кусками — каждый из трёх двигает цвет
|
|
152
181
|
на единицу-другую по каналу, и видно это только там, где смешение стоит на границе округления:
|
|
@@ -163,9 +192,19 @@ flowchart TD
|
|
|
163
192
|
Полнота теста не проверяется: сверка судит путь — сквозной он или юнит, — но не то, сколько
|
|
164
193
|
из обещанного тест на этом пути закрыл. Признак пути читается из слов «Тогда» и нарочно
|
|
165
194
|
молчалив: сценарий, чьё обещание человека не называет, под него не подпадает вовсе, и
|
|
166
|
-
отметку неполноты там по-прежнему ставит рука.
|
|
195
|
+
отметку неполноты там по-прежнему ставит рука.
|
|
196
|
+
|
|
197
|
+
Отметка покрытия стареет молча. Сверка знает идентификатор сценария против заголовка теста, а
|
|
198
|
+
текст отметки под ним для неё проза: он читается как действующее описание и через полгода после
|
|
199
|
+
того, как долг закрыли. Перечитывается отметка вместе с той правкой, которая трогает её
|
|
200
|
+
предмет, — иначе не перечитывает её никто. Договорённостей о подмене модулей тоже нет:
|
|
167
201
|
`vi.mock` в дереве не встречается ни разу, и двойник пишется руками.
|
|
168
202
|
|
|
203
|
+
Наблюдения за тем, как пользуются правилами, это правило не ведёт вовсе: род события, место
|
|
204
|
+
записи и то, что уходит наружу, — предмет закона о наблюдаемости и правила под ним. Здесь оно
|
|
205
|
+
названо затем, чтобы наблюдение не путали с покрытием: покрытие говорит, что проверено, а
|
|
206
|
+
наблюдение — чем пользовались.
|
|
207
|
+
|
|
169
208
|
## Паттерны
|
|
170
209
|
|
|
171
210
|
- `testing-unit` — тест на чистую функцию, на процедуру Connect и разовый тест-доказательство,
|