@rt-tools/agent-kit 0.8.1 → 0.8.3
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/README.md +25 -19
- package/assets/agents/qa-engineer.md +1 -1
- package/assets/agents/rules-reviewer.md +83 -0
- package/assets/checks/board.github.mjs +56 -17
- package/assets/checks/check-board.github.mjs +49 -5
- package/assets/checks/check-dupes.mjs +66 -6
- package/assets/checks/check-specs.mjs +100 -15
- package/assets/checks/rt-kit-checks.config.mjs +9 -0
- package/assets/checks/task-new.github.mjs +33 -5
- package/assets/commands/agent-kit-digest.md +10 -5
- package/assets/commands/feedback.md +95 -0
- package/assets/commands/next-session.md +4 -4
- package/assets/commands/rules-review.md +98 -0
- package/assets/commands/skill-curator.md +44 -25
- package/assets/defaults/gate-map.sh +11 -4
- package/assets/defaults/project.sh +46 -0
- package/assets/docs/GLOSSARY.md +49 -46
- package/assets/hooks/docs-guard.sh +19 -3
- package/assets/hooks/git-guard-delivery.sh +106 -13
- package/assets/hooks/proposal-guard.sh +93 -0
- package/assets/hooks/reuse-first-guard.sh +83 -15
- package/assets/hooks/skill-gate-layers.sh +1 -1
- package/assets/hooks/skill-gate.sh +27 -1
- package/assets/hooks/task-flow-guard.sh +59 -19
- package/assets/hooks/waiting-turn-guard.sh +87 -0
- package/assets/hooks/window-fill-guard.sh +1 -1
- package/assets/laws/delivery.md +41 -7
- package/assets/laws/project-documentation.md +39 -0
- package/assets/laws/verifiability.md +6 -1
- package/assets/laws/work-conduct.md +83 -3
- package/assets/patterns/git-workflow-commit.azure.md +84 -4
- package/assets/patterns/git-workflow-commit.github.md +90 -4
- package/assets/patterns/git-workflow-commit.gitlab.md +84 -5
- package/assets/patterns/git-workflow-docker.md +30 -0
- package/assets/patterns/git-workflow-merge.md +1 -1
- package/assets/patterns/spec-driven-domain.md +7 -1
- package/assets/patterns/spec-driven-rule.md +6 -0
- package/assets/patterns/task-flow-close.md +197 -21
- package/assets/patterns/task-flow-handoff.md +28 -5
- package/assets/patterns/task-flow-resume.md +25 -7
- package/assets/patterns/task-flow-start.md +37 -6
- package/assets/rules/angular-patterns.md +22 -0
- package/assets/rules/api-layer.md +25 -0
- package/assets/rules/browser-verification.md +42 -1
- package/assets/rules/component-structure.md +21 -0
- package/assets/rules/dependencies.md +22 -0
- package/assets/rules/doc-style.md +37 -5
- package/assets/rules/{entity-conventions.md → entity-conventions.needs-admin.md} +21 -0
- package/assets/rules/entity-models.md +21 -0
- package/assets/rules/git-workflow.azure.md +62 -8
- package/assets/rules/git-workflow.github.md +78 -14
- package/assets/rules/git-workflow.gitlab.md +61 -8
- package/assets/rules/lib-layers.md +25 -0
- package/assets/rules/lists.md +27 -0
- package/assets/rules/navigation.md +21 -0
- package/assets/rules/{observability.md → observability.needs-app.md} +23 -0
- package/assets/rules/permissions.md +23 -0
- package/assets/rules/platform-access.md +21 -0
- package/assets/rules/reuse-first.md +20 -0
- package/assets/rules/seo.md +19 -0
- package/assets/rules/shared-code.md +19 -0
- package/assets/rules/spec-driven.md +36 -0
- package/assets/rules/styling-bem.md +19 -0
- package/assets/rules/task-flow.md +150 -35
- package/assets/rules/testing.md +50 -0
- package/assets/rules/translations.md +21 -0
- package/assets/rules/typescript-conventions.md +33 -0
- package/assets/samples/specs/_template/spec.md +83 -0
- package/assets/samples/tasks/_template/grill.md +28 -0
- package/assets/samples/tasks/_template/plan.md +39 -0
- package/assets/samples/tasks/_template/progress.md +23 -0
- package/assets/skills/agent-kit-extend.md +24 -0
- package/assets/skills/agent-kit.md +69 -7
- package/assets/templates/rule.md +31 -2
- package/assets/traits.json +14 -0
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +31 -16
- package/bin/agent-kit.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/argv.d.ts +17 -0
- package/lib/argv.d.ts.map +1 -0
- package/lib/argv.js +44 -0
- package/lib/argv.js.map +1 -0
- package/lib/cargo.d.ts +88 -0
- package/lib/cargo.d.ts.map +1 -0
- package/lib/cargo.js +16 -0
- package/lib/cargo.js.map +1 -0
- package/lib/catalog.d.ts +18 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +12 -2
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts +0 -26
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +79 -122
- package/lib/commands.js.map +1 -1
- package/lib/companion.d.ts +37 -0
- package/lib/companion.d.ts.map +1 -1
- package/lib/companion.js +42 -1
- package/lib/companion.js.map +1 -1
- package/lib/config.d.ts +38 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +24 -0
- package/lib/config.js.map +1 -1
- package/lib/ship.d.ts +39 -0
- package/lib/ship.d.ts.map +1 -0
- package/lib/ship.js +87 -0
- package/lib/ship.js.map +1 -0
- package/lib/shipment.d.ts +60 -0
- package/lib/shipment.d.ts.map +1 -0
- package/lib/shipment.js +247 -0
- package/lib/shipment.js.map +1 -0
- package/lib/snapshot.d.ts +30 -0
- package/lib/snapshot.d.ts.map +1 -0
- package/lib/snapshot.js +73 -0
- package/lib/snapshot.js.map +1 -0
- package/lib/traits.d.ts +32 -0
- package/lib/traits.d.ts.map +1 -0
- package/lib/traits.js +82 -0
- package/lib/traits.js.map +1 -0
- package/package.json +6 -2
- package/rt-tools-agent-kit-0.8.3.tgz +0 -0
- package/lib/submit.d.ts +0 -24
- package/lib/submit.d.ts.map +0 -1
- package/lib/submit.js +0 -26
- package/lib/submit.js.map +0 -1
- package/rt-tools-agent-kit-0.8.1.tgz +0 -0
|
@@ -22,7 +22,8 @@ description: Правило под «Закон о ведении работы»
|
|
|
22
22
|
| замысел | `docs/tasks/<ветка>/plan.md` — след задачи и этапы с признаками готовности; после написания не правится |
|
|
23
23
|
| ход работы | `docs/tasks/<ветка>/progress.md` — «Где стоим», решения по ходу, записи заходов; единственное место, где отмечается сделанное |
|
|
24
24
|
| договорённость о продукте, записанная до кода | `docs/specs/<домен>/proposed/<фича>/` — спек фичи; переживает мерж и вливается в спек домена |
|
|
25
|
-
| работа шире одной ветки
|
|
25
|
+
| эпик — работа шире одной ветки | карточка в очереди работ с меткой эпика и замысел эпика рядом с ней: возможность, состав задач и их порядок |
|
|
26
|
+
| замысел эпика | запись вне папки задачи — та умирает с мержем, а эпик её переживает; каталог для неё называет компаньон правила |
|
|
26
27
|
| папка задачи до заведения задачи | `docs/tasks/_draft-<slug>/` — вне истории, пока номера нет |
|
|
27
28
|
| разведка | заход `Explore` или `general-purpose` до первого вопроса владельцу |
|
|
28
29
|
| разбор замысла ролями | `.claude/workflows/plan.js` — нужность, договорённость, критика, замысел |
|
|
@@ -44,40 +45,124 @@ description: Правило под «Закон о ведении работы»
|
|
|
44
45
|
| 1 | Разведка по дереву — до первого вопроса владельцу | `task-flow-start` |
|
|
45
46
|
| 2 | Разбор просьбы с владельцем, шесть обязательных вопросов | `task-flow-start` |
|
|
46
47
|
| 3 | Конвейер ролей после разбора | `task-flow-start` |
|
|
47
|
-
| 4 |
|
|
48
|
-
| 5 |
|
|
49
|
-
| 6 |
|
|
50
|
-
| 7 |
|
|
51
|
-
| 8 |
|
|
52
|
-
| 9 |
|
|
53
|
-
| 10 |
|
|
54
|
-
| 11 |
|
|
55
|
-
| 12 |
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
48
|
+
| 4 | Серия задач объявляется эпиком — карточкой и замыслом | `task-flow-start` |
|
|
49
|
+
| 5 | Задача, ветка, папка задачи | `task-flow-start` |
|
|
50
|
+
| 6 | Шапка замысла и сам замысел | `task-flow-start` |
|
|
51
|
+
| 7 | Возвращение к работе новым заходом | `task-flow-resume` |
|
|
52
|
+
| 8 | Этап замысла делается и отмечается в ходе работы | `task-flow-resume` |
|
|
53
|
+
| 9 | Заход закрывается передачей | `task-flow-handoff` |
|
|
54
|
+
| 10 | Работа отдаётся на разбор: PR открыт, ожидание названо | `task-flow-close` |
|
|
55
|
+
| 11 | Следующая задача эпика берётся тем же движением | `task-flow-resume` |
|
|
56
|
+
| 12 | Договорённость вливается в спек домена | `task-flow-close` |
|
|
57
|
+
| 13 | Тексты домена приводятся к сделанному | `task-flow-close` |
|
|
58
|
+
| 14 | Папка задачи разбирается | `task-flow-close` |
|
|
59
|
+
| 15 | Сверка очереди работ | `task-flow-close` |
|
|
60
|
+
| 16 | Работа разбирается правилами — фоном, следом за PR | `task-flow-close` |
|
|
61
|
+
| 17 | Находки разбора принимаются одним ходом и ждут владельца | `task-flow-close` |
|
|
62
|
+
|
|
63
|
+
Шаги 7–9 повторяются, пока этапы замысла не кончатся: первый заход входит в работу шагом 1 и
|
|
64
|
+
доходит до 8, дальше каждый следующий начинается шагом 7. Шаг 4 идёт только у работы, из которой
|
|
65
|
+
видно серию задач. Шаги 10–17 идут один раз, когда работа кончена.
|
|
66
|
+
|
|
67
|
+
Порядок в таблице — тот, в каком шаги случаются, а не тот, в каком о них удобно рассказывать.
|
|
68
|
+
Следующая задача берётся раньше уборки за предыдущей: работа, отданная на разбор, ждёт владельца,
|
|
69
|
+
и заход этим ожиданием не занимают. Список, в котором уборка стоит раньше, читается как
|
|
70
|
+
разрешение сидеть над зелёным PR до ответа.
|
|
71
|
+
|
|
72
|
+
Три шага идут не в очередь, а рядом с работой: прогон конвейера, разбор владельцем и разбор
|
|
73
|
+
закрытой работы правилами. Ни один из них не спрашивает исполнителя, пока идёт, и ни один не
|
|
74
|
+
ускоряется от того, что его ждут, — поэтому шаг 11 случается раньше, чем кончатся 10 и 16, а
|
|
75
|
+
шаг 17 вклинивается в работу следующей задачи ровно на один ход. Порядок номеров говорит, что
|
|
76
|
+
за чем следует, а не что чего дожидается.
|
|
60
77
|
|
|
61
78
|
Список показывается владельцу в начале работы, и на нём же отмечается, где стоим: иначе после
|
|
62
79
|
шести вопросов не видно ни того, что будет дальше, ни сколько всего впереди.
|
|
63
80
|
|
|
81
|
+
## Ход
|
|
82
|
+
|
|
83
|
+
Ход работы от просьбы владельца до закрытия: где стоит разбор, что требует гард и куда девается
|
|
84
|
+
папка задачи.
|
|
85
|
+
|
|
86
|
+
```mermaid
|
|
87
|
+
flowchart TD
|
|
88
|
+
A[Просьба владельца] --> B[Разведка по дереву — до первого вопроса]
|
|
89
|
+
B --> C[Разбор просьбы: шесть обязательных вопросов, ответы ложатся на диск]
|
|
90
|
+
C --> D{Правка задевает код приложения}
|
|
91
|
+
D -->|Да| E[Пишется договорённость о продукте — до кода]
|
|
92
|
+
D -->|Нет| F[В замысле стоит причина, по которой её нет]
|
|
93
|
+
E --> Z{Из разбора вышло несколько задач}
|
|
94
|
+
F --> Z
|
|
95
|
+
Z -->|Да| Y[Серия объявляется эпиком: карточкой и замыслом, до первой задачи]
|
|
96
|
+
Z -->|Нет| G[Задача, ветка, папка задачи по имени ветки]
|
|
97
|
+
Y --> G
|
|
98
|
+
G --> H[Замысел с этапами; после записи он не правится]
|
|
99
|
+
H --> I{Этап сделан}
|
|
100
|
+
I -->|Да| J[Отметка в ходе работы — единственном месте, где отмечается сделанное]
|
|
101
|
+
J --> I
|
|
102
|
+
I -->|Этапы кончились| K[PR открывается; исполнитель называет номер, чего ждёт и что сделает следом]
|
|
103
|
+
K --> W[Разбор закрытой работы правилами уходит в фон, находки ложатся на диск]
|
|
104
|
+
W --> L[Пока PR ждёт разбора, берётся следующая задача]
|
|
105
|
+
L --> M{Разбор и прогон кончились}
|
|
106
|
+
M -->|Красный прогон или замечания| V[Чинится в той же ветке: замысел на диске ещё нужен]
|
|
107
|
+
V --> M
|
|
108
|
+
M -->|Зелено и замечаний нет| T[Договорённость вливается в спек домена, тексты приводятся к сделанному]
|
|
109
|
+
T --> N[Папка задачи разбирается последним коммитом: разбор просьбы — в описание прошлого, находки — к замыслу эпика, замысел — прочь]
|
|
110
|
+
N --> S[Сверка очереди работ]
|
|
111
|
+
S --> O[Черновик снимается, слияние нажимает человек]
|
|
112
|
+
```
|
|
113
|
+
|
|
64
114
|
## Как закон применяется здесь
|
|
65
115
|
|
|
66
116
|
- **Правка кода приложения отбивается, пока на диске нет замысла.** Гард требует папку задачи
|
|
67
117
|
по имени ветки, `plan.md` в ней и названную в его шапке договорённость о продукте.
|
|
68
118
|
- **Влитая договорённость ветку не запирает.** После вливания директории «предложено» на диске
|
|
69
119
|
нет, а замысел на неё ссылается до конца работы: гард отличает влитое от незаведённого по
|
|
70
|
-
истории ветки и пропускает первое. Иначе последний коммит
|
|
120
|
+
истории ветки и пропускает первое. Иначе последний коммит PR закрывал бы дорогу правкам
|
|
71
121
|
по замечаниям разбора.
|
|
72
122
|
- **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**`
|
|
73
123
|
— признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
|
|
74
124
|
`**Поведение:** не меняется — <причина владельца>` в замысле; пустая причина не
|
|
75
125
|
принимается.
|
|
76
|
-
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
126
|
+
- **Папка задачи заводится под любую работу, без исключений.** Прежде правило судило по числу
|
|
127
|
+
заходов: работа в один коммит помещалась в тело PR и папки не заводила. Исключение,
|
|
128
|
+
у которого есть хоть одна законная форма, исполняется как разрешение — за один заход оно
|
|
129
|
+
дважды стало поводом обойти отказ гарда, вместо того чтобы завести папку и пойти дальше.
|
|
130
|
+
Заводится она всегда и до первой правки; сколько заходов уйдёт на работу, заранее не знает
|
|
131
|
+
никто.
|
|
132
|
+
- **Открыв PR, исполнитель называет владельцу три вещи: номер, чего ждёт и что сделает
|
|
133
|
+
следом.** Ждёт он прогона — до его конца о работе ничего не известно, кроме того, что она
|
|
134
|
+
запушена. Следом идёт уборка: разбор папки задачи последним коммитом. Сказанное так владелец
|
|
135
|
+
читает однозначно, а зелёный прогон на странице — нет: он говорит, что не сломано, и молчит
|
|
136
|
+
о том, что ветка ждёт ещё одного коммита. Трижды подряд PR был влит внутри этого молчания.
|
|
137
|
+
- **Просьба о слиянии — отдельный ход, и раньше уборки её не бывает.** Порядок один: PR открыт
|
|
138
|
+
черновиком → прогон зелёный → папка задачи разобрана и запушена → черновик снят →
|
|
139
|
+
исполнитель просит влить, называя номер. До этой просьбы работа не готова, сколько бы зелёного
|
|
140
|
+
на её странице ни было.
|
|
141
|
+
- **PR открывается черновиком, а не в конце работы.** Пока правка кода не выложена в PR,
|
|
142
|
+
владелец её не видит вовсе: ветка не приходит ему во входящие и обсуждения не имеет.
|
|
143
|
+
Открытый PR при этом читается как приглашение влить — поэтому незаконченная работа идёт
|
|
144
|
+
черновиком, и владельцу не приходится спрашивать, кончилась ли она. Черновик снимается тем
|
|
145
|
+
ходом, которым исполнитель говорит, что решение готово.
|
|
146
|
+
- **Пока PR ждёт разбора, исполнитель берёт следующую задачу.** Ожидание чужого шага заходом
|
|
147
|
+
не занимают: работа уходит на разбор, и тем же движением берётся следующая. Готовым к
|
|
148
|
+
слиянию прежний PR становится не сам — его доводит до готовности исполнитель, вернувшись к
|
|
149
|
+
нему тем же ходом, которым прочитал конец прогона.
|
|
150
|
+
- **Ход, в котором открыт PR, стережёт гард ожидания, а не память исполнителя.** Он отбивает
|
|
151
|
+
завершение хода, в котором не было ни одного действия по следующей задаче — заведения задачи,
|
|
152
|
+
ветки, папки или перевода колонки. Признак берётся из самого хода: спросить хостинг об
|
|
153
|
+
открытых PR было бы точнее, но сетевой вызов на завершении хода падает вместе со связью и
|
|
154
|
+
отбивал бы работу вместо промаха. Слова «беру следующую задачу» гард действием не считает —
|
|
155
|
+
ровно потому, что их и произносят вместо неё.
|
|
156
|
+
- **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
|
|
157
|
+
запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
|
|
158
|
+
следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
|
|
159
|
+
повторяется вовсе, и оба исхода со стороны выглядят одинаково — работа не двигается.
|
|
160
|
+
- **Отказ гарда кончает ход.** Другого пути к отбитой правке не ищут: ни командой оболочки, ни
|
|
161
|
+
соседним инструментом, ни правкой самого гарда. Отбитая правка либо делается после того, как
|
|
162
|
+
условие отказа выполнено, либо не делается вовсе — и тогда владельцу называется отказ, а не
|
|
163
|
+
результат. Обход стоит дороже отказа: гард отбивает один файл, а обойдённый гард снимает
|
|
164
|
+
требование со всего дерева и молчит об этом. Держится это не только памятью — гарды судят и
|
|
165
|
+
команду оболочки, которая пишет файл.
|
|
81
166
|
- **Ход, в котором владельцу задан вопрос, не заканчивается, пока за этот же ход не читались
|
|
82
167
|
законы и правила.** Чтением считается любой из трёх путей: загрузка правила, чтение файла
|
|
83
168
|
законов или правил, поиск по ним. Отбивает гард разговора — на завершении хода, а не на
|
|
@@ -113,24 +198,49 @@ description: Правило под «Закон о ведении работы»
|
|
|
113
198
|
`npm run task:new` переименовывает черновик и проставляет шапку замысла.
|
|
114
199
|
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ —
|
|
115
200
|
задачи за ним ещё нет, и спросить о нём некого.
|
|
116
|
-
-
|
|
201
|
+
- **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка в очереди работ
|
|
202
|
+
говорит, что эпик есть, но порядка задач не держит; папка задачи держала бы его ровно до
|
|
203
|
+
слияния первой из них. Каталог для замысла называет компаньон правила: у пакета своего пути
|
|
204
|
+
нет, а замысел, положенный каждым заходом заново, теряет решения предыдущих.
|
|
205
|
+
- **Закрытая работа разбирается правилами, и это шаг закрытия, а не отдельная просьба.** Что
|
|
206
|
+
грузилось, что помогло и чего не хватило, видно только тому заходу, который работу вёл; через
|
|
207
|
+
сутки этого нет ни у кого. Разбор кончается правкой слоя правил или предложением наружу —
|
|
208
|
+
разбор, из которого не вышло ни того ни другого, объясняет случившееся и ничего не меняет.
|
|
209
|
+
Ведёт его роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт разбор
|
|
210
|
+
само, и требование от этого не слабеет.
|
|
211
|
+
- **Разбор закрытой работы уходит в фон, а исполнитель берёт следующую задачу.** Роль работает
|
|
212
|
+
своим ходом и у исполнителя ничего не спрашивает; держать ради неё заход незачем. Сводку для
|
|
213
|
+
неё собирают до запуска — пока задача ещё в голове, — а вернувшиеся находки принимают одним
|
|
214
|
+
ходом: записать и продолжить прежнее. Порядок и место записи — паттерн закрытия работы.
|
|
215
|
+
- **Находки разбора ждут владельца, а в пакет уезжает только сводка наблюдений.** Предложение —
|
|
216
|
+
это заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении; уехавшая
|
|
217
|
+
без разбора, она становится работой того, кто её не заказывал. Сводка наблюдений уезжает
|
|
218
|
+
всегда: она говорит, чем пользовались и чем нет, и мнением не является.
|
|
219
|
+
- **Ожидание прогона работой не занимают.** Прогон идёт на стороне и быстрее от взгляда на него
|
|
220
|
+
не становится. Пока он идёт, берётся следующая задача, а к прогону возвращаются тем ходом,
|
|
221
|
+
которым читают его конец. Это верно и для разбора владельцем: оба ожидания — не повод стоять.
|
|
222
|
+
- **Остановка, если она всё-таки случилась, называется владельцу отдельной репликой.** Не
|
|
223
|
+
строкой в конце отчёта: там она тонет — владелец читает отчёт как рассказ о сделанном.
|
|
224
|
+
Называются три вещи: что стоит, чего оно ждёт и что владелец может решить — разобрать работу
|
|
225
|
+
первой или сказать, что прогона можно не ждать. Всё остальное идёт после.
|
|
226
|
+
- **Договорённость вливается в спек домена последним коммитом PR.** К этому моменту код
|
|
117
227
|
написан, привязки известны, и в главной ветке директория `proposed/` не появляется вовсе.
|
|
118
228
|
Готовые к вливанию перечисляет `npm run check:specs`.
|
|
119
229
|
- **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает
|
|
120
230
|
то, что объясняет состоявшееся решение; остальное удаляется. Неразобранную ловит сверка
|
|
121
231
|
очереди работ.
|
|
122
232
|
- **Слияние отбивается, пока ветка везёт папку своей задачи.** Требование стоит на слиянии, а
|
|
123
|
-
не на открытии
|
|
124
|
-
же ветку, а без замысла на диске её отбивает гард хода работы. На открытии
|
|
233
|
+
не на открытии PR: до слияния папка ещё нужна — правка по замечаниям разбора идёт в ту
|
|
234
|
+
же ветку, а без замысла на диске её отбивает гард хода работы. На открытии PR о лежащей
|
|
125
235
|
папке говорится вслух, и только. Судится содержимое ветки, а не рабочее дерево: снесённая,
|
|
126
236
|
но не закоммиченная папка въехала бы вместе с веткой.
|
|
127
237
|
- **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, и
|
|
128
238
|
первым уходит разбор просьбы — единственная запись слов владельца. Что именно увезено,
|
|
129
239
|
требование не судит: это судит владелец.
|
|
130
|
-
- **Обход — строка `Task-folder-skip: <причина>` в
|
|
240
|
+
- **Обход — строка `Task-folder-skip: <причина>` в PR или в самой команде слияния.**
|
|
131
241
|
Работа, вливаемая частями, папку до конца не разбирает. Чтение из команды работает и без
|
|
132
242
|
сети: единственный сетевой путь отбивал бы оффлайн то самое слияние, причина которого
|
|
133
|
-
написана в
|
|
243
|
+
написана в PR. Пустая причина обходом не считается, а сам обход снимает отказ, но не
|
|
134
244
|
гасит строку сверки очереди — иначе он через месяц становится рабочим путём.
|
|
135
245
|
|
|
136
246
|
## Чего из закона здесь нет
|
|
@@ -171,7 +281,7 @@ description: Правило под «Закон о ведении работы»
|
|
|
171
281
|
Что именно перенесли в архив, не проверяется. Гард видит, что папка уезжает в главную ветку и
|
|
172
282
|
что ветка что-то в архив добавила, но не может судить, то ли это и стоило ли переносить именно
|
|
173
283
|
это. Сверять содержимое машине нечем — смотрит владелец на ревью. Отсюда же и обход: если
|
|
174
|
-
работа вливается частями, папку до конца не разбирают, а причина остаётся в
|
|
284
|
+
работа вливается частями, папку до конца не разбирают, а причина остаётся в PR.
|
|
175
285
|
|
|
176
286
|
## Паттерны
|
|
177
287
|
|
|
@@ -207,16 +317,21 @@ description: Правило под «Закон о ведении работы»
|
|
|
207
317
|
задаче так ушли две правки подряд: сначала подняли общее число у соседнего узла, потом
|
|
208
318
|
перенесли узел в другое место разметки. Обе владелец отверг, а нужный способ назвал сам.
|
|
209
319
|
Спрашивают до правки, а не показывают замер после.
|
|
210
|
-
-
|
|
320
|
+
- **Эпик по теме читается до того, как решается раскладка.** Замысел эпика держит решения,
|
|
211
321
|
которые пережили десяток задач, и разведка по коду их не находит: снятое решение следа в
|
|
212
|
-
дереве не оставляет. Домен, заведённый генератором и снесённый через полчаса, стоял в
|
|
213
|
-
прямым запретом — но
|
|
214
|
-
- **Работа, которая разбирает папку задачи,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
322
|
+
дереве не оставляет. Домен, заведённый генератором и снесённый через полчаса, стоял в замысле
|
|
323
|
+
прямым запретом — но замысел открыли уже после того, как он был заведён во второй раз.
|
|
324
|
+
- **Работа, которая разбирает чужую папку задачи, разбирает и свою — одним коммитом.** Свою
|
|
325
|
+
папку она заводит наравне со всеми: исключения из этого требования нет. Круг, которым
|
|
326
|
+
исключение оправдывали, закрывается не отказом от папки, а порядком разбора: последний
|
|
327
|
+
коммит снимает обе, и после работы неубранного не остаётся. Однажды такой разбор оставил
|
|
328
|
+
свою папку, и на неё пришлось заводить третью задачу — лечится это порядком, а не правом
|
|
329
|
+
работать без замысла на диске. Как разобрать две папки — паттерн `task-flow-close`.
|
|
220
330
|
- **Слово для нового понятия берётся из `docs/GLOSSARY.md` или заводится там же.** Третий файл
|
|
221
331
|
папки задачи называется `progress.md`, а не `journal.md`, ровно поэтому: журнал в этом
|
|
222
332
|
дереве один, и он другой.
|
|
333
|
+
- **Черновик папки задачи называется тем же коротким именем, что и будущая ветка.** Команда
|
|
334
|
+
заведения ищет черновик по нему и, не найдя, молча собирает папку с образца: работа при этом
|
|
335
|
+
идёт дальше, а разбор просьбы остаётся лежать в брошенном каталоге, и следующий заход
|
|
336
|
+
расспрашивает владельца заново. Имя черновику дают словами просьбы, а ветке — терминологией
|
|
337
|
+
договорённости; те же слова, да не те же.
|
package/assets/rules/testing.md
CHANGED
|
@@ -28,6 +28,37 @@ description: Правило под «Закон о проверяемости».
|
|
|
28
28
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
29
29
|
же дереве, которое держит код иначе.
|
|
30
30
|
|
|
31
|
+
## Ход
|
|
32
|
+
|
|
33
|
+
Ход заведения проверки: что проверяется вызовом, что — сквозным путём и как сценарий связан со
|
|
34
|
+
своим тестом.
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart TD
|
|
38
|
+
A[Нужна проверка] --> B{Что обещает сценарий}
|
|
39
|
+
B -->|Человек видит и делает| C[Закрывается сквозным тестом тем же путём, что и пользователь]
|
|
40
|
+
B -->|Значение, состояние, отказ| D[Закрывается вызовом]
|
|
41
|
+
D --> E{Решение зашито в компонент или сервис}
|
|
42
|
+
E -->|Да| F[Выносится в чистую функцию и проверяется вызовом]
|
|
43
|
+
E -->|Нет| G[Проверяется как есть]
|
|
44
|
+
F --> H[Момент времени принимается параметром, а не читается с часов машины]
|
|
45
|
+
G --> H
|
|
46
|
+
C --> I{Тест погашен переменной окружения}
|
|
47
|
+
I -->|Да| J[Покрытием не считается: это долг, а отметка при живом тесте — отказ]
|
|
48
|
+
I -->|Нет| K[В заголовке теста стоит номер сценария]
|
|
49
|
+
H --> K
|
|
50
|
+
K --> P{Сценарий с таким номером есть в спеках}
|
|
51
|
+
P -->|Нет| Q[Проверка краснеет: тест ссылается на несуществующий сценарий]
|
|
52
|
+
P -->|Да| R{Тест идёт тем же путём, что и пользователь}
|
|
53
|
+
R -->|Нет| S[Помечается частичным покрытием: в сводку идёт долгом]
|
|
54
|
+
R -->|Да| L{Сценарий остался без теста}
|
|
55
|
+
L -->|Да| M[Несёт отметку с причиной: пустая не принимается]
|
|
56
|
+
L -->|Нет| N[Готово]
|
|
57
|
+
S --> N
|
|
58
|
+
M --> N
|
|
59
|
+
J --> N
|
|
60
|
+
```
|
|
61
|
+
|
|
31
62
|
## Как закон применяется здесь
|
|
32
63
|
|
|
33
64
|
- **Идентификатор сценария стоит в начале заголовка теста, через тире.** Один сценарий
|
|
@@ -60,6 +91,10 @@ description: Правило под «Закон о проверяемости».
|
|
|
60
91
|
Сводная цель запускается руками, и проверка, которая живёт только в ней, отвечает тому, кто
|
|
61
92
|
её вспомнил: молчание такой проверки читается как её зелёный ответ. Три проверки простояли
|
|
62
93
|
вне гейта, объявляя в собственных списках известного, что падают на новом.
|
|
94
|
+
- **Проверка, приехавшая раскладкой, приезжает и со своим местом.** Место — это имя команды,
|
|
95
|
+
которой её зовут, и строка набора, в котором она стоит. Проверка без места узнаётся только по
|
|
96
|
+
тому, что раскладка положила новый файл, и статья выше на неё не действует: вставать ей некуда.
|
|
97
|
+
Так приехала проверка длины — той же редакцией, что и статья о её обязательном месте.
|
|
63
98
|
- **Спека, необратимо меняющая данные стенда, выключена по умолчанию.** `BASE_URL` уводит
|
|
64
99
|
прогон одной переменной, и без выключателя такая спека правила бы данные чужого стенда.
|
|
65
100
|
- **Спеки, которым нужен nginx перед приложением, просыпаются вместе с `BASE_URL`.** Голый
|
|
@@ -78,6 +113,10 @@ description: Правило под «Закон о проверяемости».
|
|
|
78
113
|
принятое остаётся навсегда, долг накоплен к заведению проверки и только сокращается, — либо
|
|
79
114
|
столько ключей, сколько у записей родов. Причина обязательна: снятая проверка без причины
|
|
80
115
|
через месяц неотличима от недосмотра.
|
|
116
|
+
- **Строка в список известного не заводится под красную проверку.** Список набран к дню
|
|
117
|
+
заведения проверки и с тех пор только сокращается: дописанная строка гасит сигнал, а не
|
|
118
|
+
причину, и в истории выглядит так же, как починка. Место, где проверка права по букве и не
|
|
119
|
+
права по существу, разбирает владелец, а до его ответа верна проверка.
|
|
81
120
|
- **Тест, утверждающий отсутствие, зелен и тогда, когда ищет не то.** Совпадения нет ни у
|
|
82
121
|
верного текста, ни у опечатки в образце, ни у переименованного ключа — отличить их по цвету
|
|
83
122
|
прогона нечем. Отрицательное утверждение поэтому идёт в паре с положительным: сначала
|
|
@@ -136,3 +175,14 @@ description: Правило под «Закон о проверяемости».
|
|
|
136
175
|
стенда. Обещанное поведение остаётся сценарием в `scenarios.md`: если списать его во второе
|
|
137
176
|
место, копии разойдутся молча — `npm run check:specs` этого не увидит.
|
|
138
177
|
- `npx nx serve` проверкой не является: это шаг из правила `browser-verification`, а не тест.
|
|
178
|
+
- **Кадр, зависящий от загрузки машины, проверяет машину, а не вёрстку.** Ожидание отсчётом
|
|
179
|
+
времени этим и кончается: на свободной машине набор зелен целиком, на занятой падает, и какой
|
|
180
|
+
именно кадр не успел — дело случая. Лечится ожиданием события, а не удлинением отсчёта: шрифты
|
|
181
|
+
подняты, картинки нарисованы, движение остановлено, положение узла не менялось два кадра
|
|
182
|
+
подряд. Пока ожидание идёт по времени, «проверено снимками» означает «машина была свободна», и
|
|
183
|
+
перезапуск, давший зелёное, этого не отменяет, а прячет. Восемь кадров расходились с эталоном
|
|
184
|
+
на 0,15–0,74 % в задании конвейера и проходили на той же машине вне его.
|
|
185
|
+
- **Стенд, поднятый предыдущим шагом, останавливается перед съёмкой.** Оставленный работать, он
|
|
186
|
+
соревнуется за машину с тем, что снимают, и делает исход прогона зависящим от того, чем занят
|
|
187
|
+
сосед. Нагрузка, которую задание создаёт себе само — соседняя витрина, только что законченная
|
|
188
|
+
сборка, — ничем не отличается от чужой.
|
|
@@ -28,6 +28,27 @@ description: Правило под «Закон о локалях и перев
|
|
|
28
28
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
29
29
|
же дереве, которое держит код иначе.
|
|
30
30
|
|
|
31
|
+
## Ход
|
|
32
|
+
|
|
33
|
+
Ход появления видимого текста: откуда он берётся, что делается с непришедшим переводом и чем
|
|
34
|
+
держится полнота словарей.
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart TD
|
|
38
|
+
A[Появился видимый человеку текст] --> B{Чей он}
|
|
39
|
+
B -->|Интерфейса| C[Заводится ключом во всех локалях перевода сразу]
|
|
40
|
+
B -->|Содержимого| D[Владелец пишет на своём языке, остальные локали — производные]
|
|
41
|
+
C --> E{Перевод пуст}
|
|
42
|
+
E -->|Да| F[Считается пропуском: подставляется запасной словарь, а прогон краснеет]
|
|
43
|
+
E -->|Нет| G[Готово]
|
|
44
|
+
D --> H{Перевод пришёл}
|
|
45
|
+
H -->|Да| I[Записывается]
|
|
46
|
+
H -->|Нет| J[Прежнее значение сохраняется, а само сохранение не срывается]
|
|
47
|
+
I --> G
|
|
48
|
+
J --> G
|
|
49
|
+
F --> G
|
|
50
|
+
```
|
|
51
|
+
|
|
31
52
|
## Как закон применяется здесь
|
|
32
53
|
|
|
33
54
|
- **Локаль по умолчанию отдаётся из корня, остальные семь — из-под префикса пути.**
|
|
@@ -25,6 +25,27 @@ description: Правило под «Закон об устройстве код
|
|
|
25
25
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
26
26
|
же дереве, которое держит код иначе.
|
|
27
27
|
|
|
28
|
+
## Ход
|
|
29
|
+
|
|
30
|
+
Ход объявления символа: чем задаётся имя, откуда берётся тип и что делается со снятым
|
|
31
|
+
объявлением.
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
flowchart TD
|
|
35
|
+
A[Объявляется символ] --> B[Род виден по префиксу имени, а суффикс файла обещает, что в нём лежит]
|
|
36
|
+
B --> C{Тип уже объявлен где-то}
|
|
37
|
+
C -->|Да| D[Берётся из того пакета, где объявлен: своя копия разойдётся с оригиналом молча]
|
|
38
|
+
C -->|Нет| E[Объявляется здесь]
|
|
39
|
+
D --> F{Значение приходит не в том виде}
|
|
40
|
+
E --> F
|
|
41
|
+
F -->|Да| G[Приведение идёт названным способом; двухступенчатое запрещено]
|
|
42
|
+
F -->|Нет| H{Объявление снимается}
|
|
43
|
+
G --> H
|
|
44
|
+
H -->|Да| I[Отметка об устаревании ставится вместе с обходом всех потребителей]
|
|
45
|
+
H -->|Нет| J[Файл держится в пределах длины, сложность спрашивается у плагина, а не вспоминается]
|
|
46
|
+
I --> J
|
|
47
|
+
```
|
|
48
|
+
|
|
28
49
|
## Как закон применяется здесь
|
|
29
50
|
|
|
30
51
|
- **Род объявления виден по префиксу имени, и это держат три правила линтера.** У интерфейса,
|
|
@@ -69,6 +90,18 @@ description: Правило под «Закон об устройстве код
|
|
|
69
90
|
|
|
70
91
|
## Ловушки
|
|
71
92
|
|
|
93
|
+
- **Пределы сложности функции спрашивают у плагина, а не вспоминают.** Там, где дерево подняло
|
|
94
|
+
правила `sonarjs` разом, до отказа, числа ветвлений и вложенности приходят умолчаниями
|
|
95
|
+
плагина и своей строкой в конфиге не записаны: они меняются вместе с его версией, а выглядят
|
|
96
|
+
как договорённость дерева. За одну задачу их спрашивали трижды, каждый раз заново, и дважды
|
|
97
|
+
называли по памяти — оба раза мимо.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
node -e 'const s = require("eslint-plugin-sonarjs");
|
|
101
|
+
for (const n of ["cyclomatic-complexity", "cognitive-complexity", "nested-control-flow"])
|
|
102
|
+
console.log(n, JSON.stringify(s.rules[n].meta.defaultOptions));'
|
|
103
|
+
```
|
|
104
|
+
|
|
72
105
|
- Приведение через `as Type` в маппере запрещено, но не стережётся ничем: оно принимает любое
|
|
73
106
|
значение и компилируется. Вместо него — `this.typeCast`.
|
|
74
107
|
- Неиспользуемый параметр убирается, а не переименовывается: подчёркивание перед именем прячет
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# <Домен>
|
|
2
|
+
|
|
3
|
+
**Статус:** действует · **Ревизия:** <дата> · **Префикс сценариев:** `SC-<ПРЕФИКС>`
|
|
4
|
+
**Зависимости:** <домены, без которых этот не работает, или «нет»>
|
|
5
|
+
**Законы:** `<закон>`, `<закон>`
|
|
6
|
+
**Процедуры:** <либы, чьи процедуры домен обслуживает, или «нет»>
|
|
7
|
+
|
|
8
|
+
Разделы ниже обязательны все: отсутствие раздела — отказ, а «не применимо» — законный ответ.
|
|
9
|
+
Договорённость о продукте, которая пишется до кода, лежит в `proposed/<фича>/` этого же домена
|
|
10
|
+
и вливается сюда последним коммитом PR — с прежними номерами сценариев.
|
|
11
|
+
|
|
12
|
+
## Зачем
|
|
13
|
+
|
|
14
|
+
<Что домен решает и чего стоит его отсутствие. Не пересказ реализации.>
|
|
15
|
+
|
|
16
|
+
## Терминология
|
|
17
|
+
|
|
18
|
+
| Термин | Что это |
|
|
19
|
+
| -------- | ---------- |
|
|
20
|
+
| <термин> | <значение> |
|
|
21
|
+
|
|
22
|
+
### Как это называется в интерфейсе
|
|
23
|
+
|
|
24
|
+
| В договорённости | На экране |
|
|
25
|
+
| ---------------- | --------- |
|
|
26
|
+
| <термин> | <подпись> |
|
|
27
|
+
|
|
28
|
+
## Правила
|
|
29
|
+
|
|
30
|
+
- **<утверждение о продукте>.** <Довод: что случится, если этого не держать.> Каждое
|
|
31
|
+
утверждение получает строку привязки `файл:символ` в `implementation.md` рядом.
|
|
32
|
+
|
|
33
|
+
## Что не входит
|
|
34
|
+
|
|
35
|
+
- <соседняя область и куда за ней идти>
|
|
36
|
+
|
|
37
|
+
## Контракт
|
|
38
|
+
|
|
39
|
+
<Процедуры домена таблицей: имя, что принимает, что отдаёт. Нет процедур — «не применимо».>
|
|
40
|
+
|
|
41
|
+
### Коды отказов
|
|
42
|
+
|
|
43
|
+
| Код | Когда |
|
|
44
|
+
| ----- | ------------------- |
|
|
45
|
+
| <код> | <при чём бросается> |
|
|
46
|
+
|
|
47
|
+
## Данные
|
|
48
|
+
|
|
49
|
+
<Записи хранилища, которыми домен владеет. Нет своих — «не применимо».>
|
|
50
|
+
|
|
51
|
+
## Экраны и состояния
|
|
52
|
+
|
|
53
|
+
<Экраны домена и состояния каждого: пусто, загрузка, отказ, готово. Нет экранов — «не применимо».>
|
|
54
|
+
|
|
55
|
+
## Сквозные требования
|
|
56
|
+
|
|
57
|
+
### Локали
|
|
58
|
+
|
|
59
|
+
<Что переводится и где лежат ключи.>
|
|
60
|
+
|
|
61
|
+
### SEO
|
|
62
|
+
|
|
63
|
+
<Заголовки, адреса, разметка. Не применимо — так и пишется.>
|
|
64
|
+
|
|
65
|
+
### Мобильная раскладка
|
|
66
|
+
|
|
67
|
+
<Что меняется на узком экране.>
|
|
68
|
+
|
|
69
|
+
### Мультиобъектность
|
|
70
|
+
|
|
71
|
+
<Что у домена своё на каждый объект владения.>
|
|
72
|
+
|
|
73
|
+
## Решения
|
|
74
|
+
|
|
75
|
+
- **<решение>** — <довод>. Отвергнуто: <альтернатива и почему>.
|
|
76
|
+
|
|
77
|
+
## Открытые вопросы
|
|
78
|
+
|
|
79
|
+
- `Q-<номер>` — <вопрос и допущение, с которым идёт работа>.
|
|
80
|
+
|
|
81
|
+
## История изменений
|
|
82
|
+
|
|
83
|
+
- <дата> — <что изменилось>.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Разбор просьбы
|
|
2
|
+
|
|
3
|
+
## Просьба владельца
|
|
4
|
+
|
|
5
|
+
> <дословно, без пересказа>
|
|
6
|
+
|
|
7
|
+
## Что уже есть в дереве
|
|
8
|
+
|
|
9
|
+
<Находки разведки: спеки по теме, законы и правила, которые работа задевает, готовый образец
|
|
10
|
+
рядом. Заполняется до первого вопроса владельцу.>
|
|
11
|
+
|
|
12
|
+
## Что уже сказано в правилах
|
|
13
|
+
|
|
14
|
+
<Что нашлось в законах и правилах по теме вопроса. Владельцу не задаётся то, ответ на что уже
|
|
15
|
+
записан.>
|
|
16
|
+
|
|
17
|
+
## Вопросы и ответы
|
|
18
|
+
|
|
19
|
+
**<вопрос>**
|
|
20
|
+
<ответ владельца его словами>
|
|
21
|
+
|
|
22
|
+
## Решения
|
|
23
|
+
|
|
24
|
+
- **<решение>** — <довод>. Отвергнуто: <что и почему>.
|
|
25
|
+
|
|
26
|
+
## Что осталось невыясненным
|
|
27
|
+
|
|
28
|
+
- <вопрос, который не задавали, и почему он не блокирует работу>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Замысел
|
|
2
|
+
|
|
3
|
+
**Задача:** <КЛЮЧ>-<номер> · **Ветка:** <ветка>
|
|
4
|
+
**Драфт:** `<путь к договорённости о продукте>`
|
|
5
|
+
**Поведение:** меняется
|
|
6
|
+
|
|
7
|
+
Работа, не задевающая код приложения, договорённости не требует — тогда вместо строки драфта
|
|
8
|
+
стоит `**Поведение:** не меняется — <причина владельца>`; пустая причина не принимается.
|
|
9
|
+
|
|
10
|
+
После написания этот файл не правится. Пересмотр этапа идёт в `progress.md` решением по ходу.
|
|
11
|
+
|
|
12
|
+
## След задачи
|
|
13
|
+
|
|
14
|
+
<Что работа задевает. Заполняется разведкой до разбора и подтверждается владельцем. По этой же
|
|
15
|
+
таблице на закрытии смотрят, что из спеков, правил и паттернов устарело: названное здесь
|
|
16
|
+
читают дважды — до работы и после неё.>
|
|
17
|
+
|
|
18
|
+
| Что | Где |
|
|
19
|
+
| ------- | --------------------------------- |
|
|
20
|
+
| Спеки | <домены, которых работа касается> |
|
|
21
|
+
| Законы | <законы по её следу> |
|
|
22
|
+
| Правила | <правила и их компаньоны> |
|
|
23
|
+
| Код | <либы и приложения> |
|
|
24
|
+
|
|
25
|
+
## Что считается сделанным
|
|
26
|
+
|
|
27
|
+
- <утверждение, которое можно проверить>
|
|
28
|
+
|
|
29
|
+
## Этапы
|
|
30
|
+
|
|
31
|
+
### 1. <название>
|
|
32
|
+
|
|
33
|
+
- **Что делается:** <одной фразой>
|
|
34
|
+
- **Признак готовности:** <что должно стать верным>
|
|
35
|
+
- **Чем проверяется:** <команда или приём>
|
|
36
|
+
|
|
37
|
+
## Чего эта работа не делает
|
|
38
|
+
|
|
39
|
+
- <соседняя работа, которую сюда не тащим, и куда она заведена>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Ход работы
|
|
2
|
+
|
|
3
|
+
## Где стоим
|
|
4
|
+
|
|
5
|
+
Перезаписывается каждым заходом, а не дописывается.
|
|
6
|
+
|
|
7
|
+
- **Этап:** <номер> из <всего> — <название>
|
|
8
|
+
- **Сделано:** <коротко>
|
|
9
|
+
- **Следующий шаг:** <что делается первым в новом заходе>
|
|
10
|
+
- **Незакоммиченное:** <что лежит в дереве вне индекса>
|
|
11
|
+
- **Ждём владельца:** <чего именно, или «нет»>
|
|
12
|
+
- **PR:** <номер и состояние, или «ещё не открыт»>
|
|
13
|
+
|
|
14
|
+
## Решения по ходу
|
|
15
|
+
|
|
16
|
+
- **<решение>** — <довод>. Затронутый этап замысла: <номер>.
|
|
17
|
+
|
|
18
|
+
## Заходы
|
|
19
|
+
|
|
20
|
+
### <дата>
|
|
21
|
+
|
|
22
|
+
- <что сделано, числами: файлов, коммитов, что зелёное>
|
|
23
|
+
- <на чём споткнулись и чем поймали>
|