@rt-tools/agent-kit 0.8.2 → 0.9.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/README.md +13 -0
- package/assets/agents/rules-reviewer.md +83 -0
- package/assets/checks/board.github.mjs +48 -1
- package/assets/checks/check-board.github.mjs +84 -1
- package/assets/checks/check-dupes.mjs +66 -6
- package/assets/checks/check-lib-layers.mjs +13 -524
- package/assets/checks/check-specs.mjs +61 -747
- package/assets/checks/check-styles.mjs +185 -15
- package/assets/checks/lib-boundaries.mjs +143 -0
- package/assets/checks/lib-common.mjs +149 -0
- package/assets/checks/lib-domains.mjs +205 -0
- package/assets/checks/lib-manifests.mjs +60 -0
- package/assets/checks/lib-reexports.mjs +101 -0
- package/assets/checks/rt-kit-checks.config.mjs +26 -0
- package/assets/checks/spec-anchors.mjs +297 -0
- package/assets/checks/spec-common.mjs +222 -0
- package/assets/checks/spec-contract.mjs +152 -0
- package/assets/checks/spec-scenarios.mjs +201 -0
- package/assets/commands/feedback.md +95 -0
- package/assets/commands/rules-review.md +98 -0
- package/assets/commands/skill-curator.md +39 -22
- package/assets/defaults/project.sh +8 -0
- package/assets/docs/GLOSSARY.md +21 -20
- package/assets/hooks/git-guard-push-tests.sh +8 -4
- package/assets/hooks/reuse-first-guard.sh +16 -2
- package/assets/hooks/skill-gate.sh +1 -1
- package/assets/hooks/sql-guard-parse.sh +187 -0
- package/assets/hooks/sql-guard-request.sh +117 -0
- package/assets/hooks/sql-guard-target.sh +134 -0
- package/assets/hooks/sql-guard-write.sh +212 -0
- package/assets/hooks/sql-guard.sh +26 -596
- package/assets/hooks/task-flow-guard.sh +16 -2
- package/assets/hooks/waiting-turn-guard.sh +116 -0
- package/assets/laws/delivery.md +35 -0
- package/assets/laws/project-documentation.md +18 -0
- package/assets/laws/work-conduct.md +25 -0
- package/assets/patterns/admin-lists-screen.md +25 -14
- package/assets/patterns/admin-nav-item.md +1 -1
- package/assets/patterns/component-structure-new.md +1 -1
- package/assets/patterns/entity-aside.md +4 -2
- package/assets/patterns/git-workflow-commit.azure.md +74 -2
- package/assets/patterns/git-workflow-commit.github.md +75 -2
- package/assets/patterns/git-workflow-commit.gitlab.md +75 -4
- package/assets/patterns/git-workflow-docker.md +30 -0
- package/assets/patterns/observability-record.md +9 -0
- package/assets/patterns/shared-code-new.md +2 -2
- package/assets/patterns/task-flow-close.md +160 -47
- package/assets/patterns/task-flow-handoff.md +1 -1
- package/assets/patterns/task-flow-resume.md +3 -3
- package/assets/patterns/task-flow-start.md +32 -5
- package/assets/rules/angular-patterns.md +22 -0
- package/assets/rules/api-layer.md +25 -0
- package/assets/rules/browser-verification.md +32 -0
- package/assets/rules/component-structure.md +21 -0
- package/assets/rules/dependencies.md +22 -0
- package/assets/rules/doc-style.md +24 -0
- package/assets/rules/entity-conventions.needs-admin.md +21 -0
- package/assets/rules/entity-models.md +21 -0
- package/assets/rules/git-workflow.azure.md +57 -1
- package/assets/rules/git-workflow.github.md +89 -2
- package/assets/rules/git-workflow.gitlab.md +56 -1
- package/assets/rules/lib-layers.md +29 -0
- package/assets/rules/lists.md +37 -10
- package/assets/rules/navigation.md +21 -0
- package/assets/rules/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 +20 -1
- package/assets/rules/spec-driven.md +32 -0
- package/assets/rules/styling-bem.md +19 -0
- package/assets/rules/task-flow.md +148 -18
- package/assets/rules/testing.md +62 -0
- package/assets/rules/translations.md +21 -0
- package/assets/rules/typescript-conventions.md +28 -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.md +52 -2
- package/assets/templates/proposal.md +21 -0
- package/assets/templates/rule.md +31 -2
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +115 -87
- 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.map +1 -1
- package/lib/argv.js +6 -4
- package/lib/argv.js.map +1 -1
- package/lib/assets.d.ts.map +1 -1
- package/lib/assets.js +2 -1
- package/lib/assets.js.map +1 -1
- package/lib/cargo.d.ts +20 -0
- package/lib/cargo.d.ts.map +1 -1
- package/lib/cargo.js.map +1 -1
- package/lib/cascade.d.ts +55 -0
- package/lib/cascade.d.ts.map +1 -0
- package/lib/cascade.js +131 -0
- package/lib/cascade.js.map +1 -0
- package/lib/catalog.d.ts +0 -75
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +44 -127
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +153 -85
- package/lib/commands.js.map +1 -1
- package/lib/companion.d.ts.map +1 -1
- package/lib/companion.js +5 -5
- package/lib/companion.js.map +1 -1
- package/lib/config.d.ts +12 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +11 -5
- package/lib/config.js.map +1 -1
- package/lib/enroll.d.ts +56 -0
- package/lib/enroll.d.ts.map +1 -0
- package/lib/enroll.js +123 -0
- package/lib/enroll.js.map +1 -0
- package/lib/freshness.d.ts.map +1 -1
- package/lib/freshness.js +31 -17
- package/lib/freshness.js.map +1 -1
- package/lib/hooks-map.d.ts +30 -0
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +80 -18
- package/lib/hooks-map.js.map +1 -1
- package/lib/integrity.d.ts +1 -2
- package/lib/integrity.d.ts.map +1 -1
- package/lib/integrity.js +0 -1
- package/lib/integrity.js.map +1 -1
- package/lib/observations.d.ts.map +1 -1
- package/lib/observations.js +25 -12
- package/lib/observations.js.map +1 -1
- package/lib/order.d.ts +10 -0
- package/lib/order.d.ts.map +1 -0
- package/lib/order.js +14 -0
- package/lib/order.js.map +1 -0
- package/lib/picker.d.ts.map +1 -1
- package/lib/picker.js +8 -2
- package/lib/picker.js.map +1 -1
- package/lib/plan.js +1 -1
- package/lib/plan.js.map +1 -1
- package/lib/proposals.d.ts.map +1 -1
- package/lib/proposals.js +25 -8
- package/lib/proposals.js.map +1 -1
- package/lib/sections.js +1 -1
- package/lib/sections.js.map +1 -1
- package/lib/ship.d.ts.map +1 -1
- package/lib/ship.js +9 -1
- package/lib/ship.js.map +1 -1
- package/lib/shipment.d.ts.map +1 -1
- package/lib/shipment.js +14 -10
- package/lib/shipment.js.map +1 -1
- package/lib/snapshot.d.ts.map +1 -1
- package/lib/snapshot.js +2 -1
- package/lib/snapshot.js.map +1 -1
- package/lib/stamp.js +1 -1
- package/lib/stamp.js.map +1 -1
- package/lib/sync.d.ts +12 -2
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +11 -10
- package/lib/sync.js.map +1 -1
- package/lib/vars.d.ts.map +1 -1
- package/lib/vars.js +2 -3
- package/lib/vars.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.9.0.tgz +0 -0
- package/rt-tools-agent-kit-0.8.2.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,24 +45,72 @@ 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
|
-
| 13 |
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
+
за чем следует, а не что чего дожидается.
|
|
61
77
|
|
|
62
78
|
Список показывается владельцу в начале работы, и на нём же отмечается, где стоим: иначе после
|
|
63
79
|
шести вопросов не видно ни того, что будет дальше, ни сколько всего впереди.
|
|
64
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
|
+
|
|
65
114
|
## Как закон применяется здесь
|
|
66
115
|
|
|
67
116
|
- **Правка кода приложения отбивается, пока на диске нет замысла.** Гард требует папку задачи
|
|
@@ -86,12 +135,49 @@ description: Правило под «Закон о ведении работы»
|
|
|
86
135
|
читает однозначно, а зелёный прогон на странице — нет: он говорит, что не сломано, и молчит
|
|
87
136
|
о том, что ветка ждёт ещё одного коммита. Трижды подряд PR был влит внутри этого молчания.
|
|
88
137
|
- **Просьба о слиянии — отдельный ход, и раньше уборки её не бывает.** Порядок один: PR открыт
|
|
89
|
-
→ прогон зелёный → папка задачи разобрана и запушена →
|
|
90
|
-
номер. До этой просьбы работа не готова, сколько бы зелёного
|
|
138
|
+
черновиком → прогон зелёный → папка задачи разобрана и запушена → черновик снят →
|
|
139
|
+
исполнитель просит влить, называя номер. До этой просьбы работа не готова, сколько бы зелёного
|
|
140
|
+
на её странице ни было.
|
|
141
|
+
- **PR открывается черновиком, а не в конце работы.** Пока правка кода не выложена в PR,
|
|
142
|
+
владелец её не видит вовсе: ветка не приходит ему во входящие и обсуждения не имеет.
|
|
143
|
+
Открытый PR при этом читается как приглашение влить — поэтому незаконченная работа идёт
|
|
144
|
+
черновиком, и владельцу не приходится спрашивать, кончилась ли она. Черновик снимается тем
|
|
145
|
+
ходом, которым исполнитель говорит, что решение готово.
|
|
146
|
+
- **Открытый PR остановкой не является.** Отданное на разбор ждёт владельца, а не исполнителя:
|
|
147
|
+
следующая задача берётся тем же движением, которым предыдущая ушла на разбор. Заход,
|
|
148
|
+
закрытый на готовой задаче, стоил владельцу целого захода на то, чтобы вернуть работу в
|
|
149
|
+
движение, — при том что порядок был назначен и лежал записанным в замысле эпика.
|
|
150
|
+
- **Владельцу не предлагается выбор, чем заняться дальше, пока эпик не кончился.** Меню при
|
|
151
|
+
назначенном порядке — это просьба назначить его заново. Если работы в эпике не осталось, так
|
|
152
|
+
и говорится: эпик кончился, — а не «чем займёмся».
|
|
153
|
+
- **Гард замысла — нижняя граница требования, а не его предел.** Он требует папку только под
|
|
154
|
+
правку кода приложения, и работа, которая туда не доходит, проходит мимо него — но папку
|
|
155
|
+
заводит всё равно: статья правила говорит «под любую работу, без исключений». Прочитанный
|
|
156
|
+
как признак, гард становится разрешением работать без замысла везде, куда он не смотрит.
|
|
157
|
+
- **Ход, сообщающий владельцу о чужом шаге, называет своё следующее действие и начинает его.**
|
|
158
|
+
Прогон, разбор владельцем и слияние идут без исполнителя и быстрее от взгляда не становятся,
|
|
159
|
+
поэтому сообщение о них — не работа, а сводка. Ход, кончившийся такой сводкой, владелец
|
|
160
|
+
читает как работу: она полна, в ней названы номера и состояния, и пустоты за ней не видно.
|
|
161
|
+
Открытый PR, красный прогон и ожидание слова владельца — случаи одного и того же, и правило
|
|
162
|
+
у них одно: о чужом шаге говорят вместе с начатым своим, а не вместо него. За один заход это
|
|
163
|
+
было нарушено четырежды, и готовая работа простояла в невлитом PR почти три часа, пока
|
|
164
|
+
исполнитель отвечал владельцу сводками о её состоянии.
|
|
91
165
|
- **Пока PR ждёт разбора, исполнитель берёт следующую задачу.** Ожидание чужого шага заходом
|
|
92
166
|
не занимают: работа уходит на разбор, и тем же движением берётся следующая. Готовым к
|
|
93
167
|
слиянию прежний PR становится не сам — его доводит до готовности исполнитель, вернувшись к
|
|
94
168
|
нему тем же ходом, которым прочитал конец прогона.
|
|
169
|
+
- **Ход о чужом шаге стережёт гард ожидания, а не память исполнителя.** Он отбивает завершение
|
|
170
|
+
хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия —
|
|
171
|
+
ни заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
|
|
172
|
+
признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Оба берутся из самого хода:
|
|
173
|
+
спросить хостинг было бы точнее, но сетевой вызов на завершении хода падает вместе со связью
|
|
174
|
+
и отбивал бы работу вместо промаха, а вывод команды о прогоне в записи хода уже лежит. Слова
|
|
175
|
+
«беру следующую задачу» гард действием не считает — ровно потому, что их и произносят вместо
|
|
176
|
+
неё.
|
|
177
|
+
- **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
|
|
178
|
+
запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
|
|
179
|
+
следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
|
|
180
|
+
повторяется вовсе, и оба исхода со стороны выглядят одинаково — работа не двигается.
|
|
95
181
|
- **Отказ гарда кончает ход.** Другого пути к отбитой правке не ищут: ни командой оболочки, ни
|
|
96
182
|
соседним инструментом, ни правкой самого гарда. Отбитая правка либо делается после того, как
|
|
97
183
|
условие отказа выполнено, либо не делается вовсе — и тогда владельцу называется отказ, а не
|
|
@@ -106,7 +192,16 @@ description: Правило под «Закон о ведении работы»
|
|
|
106
192
|
- **Действия, которые исполнитель не делает без слова владельца, перечислены в компаньоне
|
|
107
193
|
правила.** Список у каждого дерева свой — пакет знает только требование, чтобы список был
|
|
108
194
|
назван. Не названный, он выводится из общих слов, и «делай, что нужно по плану» становится
|
|
109
|
-
разрешением на пуш и правку общих документов заодно с коммитом.
|
|
195
|
+
разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка
|
|
196
|
+
не заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт. За один заход одна
|
|
197
|
+
и та же команда была сначала слишком опасной, чтобы её позвать, а через два хода —
|
|
198
|
+
достаточно безопасной, чтобы позвать без спроса.
|
|
199
|
+
- **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование
|
|
200
|
+
спросить владельца относится к действию, а не к ходу: работа, у которой отделима часть без
|
|
201
|
+
последствий, делится, а не откладывается целиком. Список вариантов, поданный вместо работы,
|
|
202
|
+
читается как работа — тем полнее, чем аккуратнее он составлен: он пронумерован, в нём названы
|
|
203
|
+
цифры, и именно поэтому пустота хода за ним не видна. Владельцу называется, что уже сделано и
|
|
204
|
+
что осталось за его словом, — а не выбор из вариантов вместо и того и другого.
|
|
110
205
|
- **Ход, в котором исполнитель признал промах, не заканчивается, пока записи о происшествии
|
|
111
206
|
нет.** Отбивает гард происшествия — на завершении хода: к моменту признания промах уже
|
|
112
207
|
случился, и ловить раньше нечего. Признание ловится набором образцов, а не пониманием смысла;
|
|
@@ -133,6 +228,41 @@ description: Правило под «Закон о ведении работы»
|
|
|
133
228
|
`npm run task:new` переименовывает черновик и проставляет шапку замысла.
|
|
134
229
|
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ —
|
|
135
230
|
задачи за ним ещё нет, и спросить о нём некого.
|
|
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
|
+
первой или сказать, что прогона можно не ждать. Всё остальное идёт после.
|
|
136
266
|
- **Договорённость вливается в спек домена последним коммитом PR.** К этому моменту код
|
|
137
267
|
написан, привязки известны, и в главной ветке директория `proposed/` не появляется вовсе.
|
|
138
268
|
Готовые к вливанию перечисляет `npm run check:specs`.
|
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
|
- **Идентификатор сценария стоит в начале заголовка теста, через тире.** Один сценарий
|
|
@@ -95,6 +126,19 @@ description: Правило под «Закон о проверяемости».
|
|
|
95
126
|
сценария в заголовке стоит — сценарий числится покрытым, а что именно утверждается, не
|
|
96
127
|
спрашивает никто. Тело читается вместе с заголовком: обещание в заголовке и утверждение в
|
|
97
128
|
теле — два разных текста, и расходятся они молча.
|
|
129
|
+
- **Растр браузера называется явно, иначе кадр не сходится сам с собой.** Профиль цвета, взятый
|
|
130
|
+
у дисплея машины, ускоритель, считающий растр, и дорисовка кусками — каждый из трёх двигает
|
|
131
|
+
цвет на единицу-другую по каналу, и видно это только там, где смешение стоит на границе
|
|
132
|
+
округления: на сглаженных уголках тёмной темы. Ожидание вставшего кадра тут не помогает —
|
|
133
|
+
страница нарисована, а нарисована она каждый раз чуть иначе; расхождение гуляет по кадру,
|
|
134
|
+
приходит примерно раз в четыре прогона и на светлых экранах не показывается вовсе, поэтому
|
|
135
|
+
читается случайным. Все три называются доводами браузеру при запуске и становятся частью
|
|
136
|
+
эталона.
|
|
137
|
+
- **Маска закрывает содержимое, но не ширину.** Узел под маской занимает своё место в раскладке
|
|
138
|
+
по-прежнему, и плывущее значение внутри него двигает соседей мимо маски: кадр списка уезжал на
|
|
139
|
+
пиксель целиком, включая столбцы, где не менялось ничего. Там, где размер узла считается по
|
|
140
|
+
содержимому — ячейка таблицы, надпись, растягивающая кнопку, — плывущее лечится в данных
|
|
141
|
+
стенда постоянным значением, и тогда маска не нужна вовсе.
|
|
98
142
|
|
|
99
143
|
## Чего из закона здесь нет
|
|
100
144
|
|
|
@@ -155,3 +199,21 @@ description: Правило под «Закон о проверяемости».
|
|
|
155
199
|
соревнуется за машину с тем, что снимают, и делает исход прогона зависящим от того, чем занят
|
|
156
200
|
сосед. Нагрузка, которую задание создаёт себе само — соседняя витрина, только что законченная
|
|
157
201
|
сборка, — ничем не отличается от чужой.
|
|
202
|
+
- **Свой стенд снимается перед тем, как звать набор.** Прогон переиспользует поднятое на его
|
|
203
|
+
портах, и стенд, оставленный для замера, отдаёт ему чужую сборку с чужими данными. Красное при
|
|
204
|
+
этом приходит не строкой про занятый порт, а десятком спек про экраны — то есть выглядит
|
|
205
|
+
дефектом правки: за один заход так покраснели сначала шесть новых тестов, потом гейт пуша, и
|
|
206
|
+
оба раза причиной был свой же стенд. Разобранный занятый порт эту сторону не закрывает: он про
|
|
207
|
+
чужой стенд, а этот — про свой.
|
|
208
|
+
- **Разбор упавшего кадра начинается с чисел, а не с картинки расхождения.** Доля площади
|
|
209
|
+
говорит, сколько разошлось, и молчит о том, что именно: сдвиг всего кадра на пиксель,
|
|
210
|
+
переставленные строки и рябь на сглаженных уголках выглядят на картинке одинаково — «стало
|
|
211
|
+
другим». Читаются координаты разошедшихся точек и величина расхождения по каналу: сдвинутые
|
|
212
|
+
границы блоков — это раскладка, разошедшийся текст при неподвижных границах — это данные,
|
|
213
|
+
единица-две по каналу на кривых краях — это цвет. Три расхождения одного набора разобрались
|
|
214
|
+
ровно так, и ни одно из трёх не оказалось дефектом экрана.
|
|
215
|
+
- **Ожидаемое значение теста не берётся из кода, который тест проверяет.** Вывезенное из
|
|
216
|
+
проверяемой либы, оно делает тест зелёным при любом значении: «колесо показывает пять строк»
|
|
217
|
+
сходится и тогда, когда строк стало три. Ожидаемое пишется числом в самой спеке рядом с
|
|
218
|
+
проверкой, а общий модуль сквозных спек держит приёмы — открыть, дождаться, снять со
|
|
219
|
+
страницы, — но не то, что от страницы ожидается.
|
|
@@ -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
|
- **Род объявления виден по префиксу имени, и это держат три правила линтера.** У интерфейса,
|
|
@@ -38,6 +59,13 @@ description: Правило под «Закон об устройстве код
|
|
|
38
59
|
остального. Для `.ts` это держит правило линтера; файлы обвязки — сценарии и скрипты — до
|
|
39
60
|
него не доходят и судятся отдельной проверкой дерева. Накопленное к дню включения
|
|
40
61
|
перечислено поимённо, и строка оттуда снимается вместе с делением своего файла.
|
|
62
|
+
- **Значение из закрытого набора приходит перечислением `E<Имя>`, а не строкой или числом в
|
|
63
|
+
месте использования.** Ключ переводимого поля, имя вкладки, слот обложки, вид записи — всё
|
|
64
|
+
это наборы: их называют форма, стор, разметка и сравнение черновиков, и написанное на месте
|
|
65
|
+
значение ни находится по дереву, ни правится разом. Перечисление живёт в слое `util` того
|
|
66
|
+
домена, чей это набор, а общее нескольким приложениям — в общей либе. Одиночный адрес,
|
|
67
|
+
разделитель и знак-подпись перечислением не становятся: закрытого набора у них нет, и они
|
|
68
|
+
объявляются константой файла с говорящим именем.
|
|
41
69
|
- **Тип берётся из того пакета, где объявлен.** Своя копия чужого типа расходится с оригиналом
|
|
42
70
|
молча, а компилируется из них только одна.
|
|
43
71
|
- **Двухступенчатое приведение `as unknown as` запрещено правилом линтера.** Вместо него —
|
|
@@ -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
|
+
- <на чём споткнулись и чем поймали>
|