@rt-tools/agent-kit 0.14.0 → 0.16.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 +17 -0
- package/assets/checks/archive-age.mjs +107 -0
- package/assets/checks/archive-prune.mjs +46 -0
- package/assets/checks/check-archive-age.mjs +42 -0
- package/assets/checks/check-board.github.mjs +16 -0
- package/assets/checks/check-descriptions.mjs +123 -0
- package/assets/checks/check-dupes.mjs +31 -3
- package/assets/checks/check-file-size.mjs +47 -2
- package/assets/checks/check-turn-map.mjs +20 -3
- package/assets/checks/lib-common.mjs +12 -1
- package/assets/checks/lib-domains.mjs +1 -1
- package/assets/checks/rt-kit-checks.config.mjs +24 -1
- package/assets/checks/spec-anchors.mjs +18 -3
- package/assets/checks/spec-common.mjs +5 -1
- package/assets/defaults/project.sh +22 -17
- package/assets/defaults/turn-map.md +15 -19
- package/assets/docs/GLOSSARY.md +52 -58
- package/assets/hooks/rule-article.sh +12 -0
- package/assets/hooks/skill-gate.sh +5 -4
- package/assets/hooks/task-flow-guard.sh +20 -0
- package/assets/hooks/turn-exit-guard.sh +229 -4
- package/assets/laws/delivery.md +92 -104
- package/assets/laws/frontend-application.md +4 -0
- package/assets/laws/project-documentation.md +64 -68
- package/assets/laws/verifiability.md +32 -33
- package/assets/laws/work-conduct.md +167 -157
- package/assets/patterns/doc-style-sweep.md +1 -1
- package/assets/patterns/doc-style-trace.md +1 -1
- package/assets/patterns/git-workflow-commit.azure.md +1 -1
- package/assets/patterns/git-workflow-commit.github.md +7 -1
- package/assets/patterns/git-workflow-commit.gitlab.md +1 -1
- package/assets/patterns/git-workflow-docker.md +1 -1
- package/assets/patterns/git-workflow-merge.md +14 -3
- package/assets/patterns/git-workflow-pr.azure.md +1 -1
- package/assets/patterns/git-workflow-pr.github.md +1 -1
- package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
- package/assets/patterns/git-workflow-restart.md +1 -1
- package/assets/patterns/git-workflow-secrets.md +1 -1
- package/assets/patterns/git-workflow-stack.md +93 -0
- package/assets/patterns/seo-page.md +1 -1
- package/assets/patterns/spec-driven-rule.md +55 -0
- package/assets/patterns/status-report-table.github.md +88 -0
- package/assets/patterns/task-flow-archive.md +3 -4
- package/assets/patterns/task-flow-close.md +6 -1
- package/assets/patterns/task-flow-start.md +17 -5
- package/assets/patterns/ts-procedure.md +1 -1
- package/assets/pitfalls/doc-style.md +5 -0
- package/assets/pitfalls/git-workflow.github.md +47 -0
- package/assets/pitfalls/task-flow.md +28 -0
- package/assets/pitfalls/testing.md +14 -0
- package/assets/pitfalls/turn-conduct.md +33 -0
- package/assets/rules/angular-patterns.md +1 -1
- package/assets/rules/api-layer.md +3 -3
- package/assets/rules/browser-verification.md +15 -1
- package/assets/rules/dependencies.md +1 -1
- package/assets/rules/deploy-flow.azure.md +1 -1
- package/assets/rules/deploy-flow.github.md +1 -1
- package/assets/rules/deploy-flow.gitlab.md +1 -1
- package/assets/rules/doc-style.md +18 -0
- package/assets/rules/entity-conventions.needs-admin.md +1 -1
- package/assets/rules/entity-models.md +1 -1
- package/assets/rules/git-workflow.azure.md +1 -1
- package/assets/rules/git-workflow.github.md +154 -181
- package/assets/rules/git-workflow.gitlab.md +1 -1
- package/assets/rules/lib-layers.md +1 -1
- package/assets/rules/observability.needs-app.md +1 -1
- package/assets/rules/platform-access.md +1 -1
- package/assets/rules/reuse-first.md +1 -1
- package/assets/rules/seo.md +4 -3
- package/assets/rules/shared-code.md +1 -1
- package/assets/rules/spec-driven.md +68 -1
- package/assets/rules/status-report.md +97 -0
- package/assets/rules/styling-bem.md +12 -0
- package/assets/rules/task-flow.md +102 -100
- package/assets/rules/testing.md +67 -66
- package/assets/rules/turn-conduct.md +146 -105
- package/assets/rules/turn-entry.md +7 -1
- package/assets/rules/typescript-conventions.md +1 -1
- package/assets/skills/agent-kit-extend.md +1 -1
- package/assets/skills/agent-kit.md +18 -1
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +25 -0
- package/bin/agent-kit.js.map +1 -1
- package/lib/cost.d.ts +44 -0
- package/lib/cost.d.ts.map +1 -0
- package/lib/cost.js +181 -0
- package/lib/cost.js.map +1 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.16.0.tgz +0 -0
- package/rt-tools-agent-kit-0.14.0.tgz +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: git-workflow-pr
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: git-workflow
|
|
5
|
-
description: Паттерн правила git-workflow. Брать на открытие PR и всё, что с ним
|
|
5
|
+
description: Паттерн правила git-workflow. Брать на открытие PR и всё, что с ним связано: формат заголовка, черновик и его снятие, связь с задачей, ревьювер и метки, образец тела, чтение состояния PR, чеклист проверок. Заведение задачи и коммит — паттерн git-workflow-commit.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Заявка на слияние
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: git-workflow-pr
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: git-workflow
|
|
5
|
-
description: Паттерн правила git-workflow. Брать на открытие MR и всё, что с ним
|
|
5
|
+
description: Паттерн правила git-workflow. Брать на открытие MR и всё, что с ним связано: формат заголовка, черновик и его снятие, связь с задачей, ревьювер и метки, образец описания, чтение состояния MR, чеклист проверок. Заведение задачи и коммит — паттерн git-workflow-commit.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Заявка на слияние
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: git-workflow-restart
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: deploy-flow
|
|
5
|
-
description: Паттерн правила deploy-flow. Брать при ручном перезапуске прода — после правки .env.prod, при разборе выкатки, при подъёме контейнера на сервере. Готовые команды с
|
|
5
|
+
description: Паттерн правила deploy-flow. Брать при ручном перезапуске прода — после правки .env.prod, при разборе выкатки, при подъёме контейнера на сервере. Готовые команды с меткой образа по sha и чем сверять результат. Накат миграций — паттерн git-workflow-migration.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Ручной перезапуск прода
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: git-workflow-secrets
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: deploy-flow
|
|
5
|
-
description: Паттерн правила deploy-flow. Брать при работе с ключами внешних
|
|
5
|
+
description: Паттерн правила deploy-flow. Брать при работе с ключами внешних служб: где они лежат, чем ключ владельца отличается от ключа окружения, что означает каждое состояние строки интеграции и почему зелёная проба не обещает работающей возможности.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Ключи внешних служб
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: git-workflow-stack
|
|
3
|
+
kind: pattern
|
|
4
|
+
rule: git-workflow
|
|
5
|
+
description: Паттерн правила git-workflow. Брать, когда из одного основания заведено больше двух веток и все ждут слияния: единица работы, порядок вливания, перевливание главной по факту конфликта, сложение у общих указателей. Один конфликт — паттерн git-workflow-merge.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Стопка заявок из одного основания
|
|
9
|
+
|
|
10
|
+
Паттерн правила `git-workflow`. Что при этом должно быть верно — закон
|
|
11
|
+
`docs/constitution/delivery.md`. Разбор одного конфликта — паттерн `git-workflow-merge`,
|
|
12
|
+
открытие одной заявки — `git-workflow-pr`.
|
|
13
|
+
|
|
14
|
+
## Когда брать
|
|
15
|
+
|
|
16
|
+
- Из одного основания заведено больше двух веток, и все ждут слияния.
|
|
17
|
+
- За заход сделано несколько работ, и они лежат в дереве невыложенными.
|
|
18
|
+
- Решается, в каком порядке отдавать накопленное владельцу.
|
|
19
|
+
|
|
20
|
+
## Единица работы — влитая заявка, а не открытая
|
|
21
|
+
|
|
22
|
+
Открытый черновик работой не является: кнопка слияния у него заблокирована, в главной ветке его
|
|
23
|
+
правок нет, и очередь работ им не сокращается. Восемнадцать открытых черновиков и ни одного
|
|
24
|
+
влитого — это ноль сделанного, сколько бы времени на них ни ушло.
|
|
25
|
+
|
|
26
|
+
Отсюда порядок: одна работа доводится до слияния, потом берётся следующая. Не наоборот.
|
|
27
|
+
|
|
28
|
+
## Цена стопки растёт квадратично
|
|
29
|
+
|
|
30
|
+
Ветки одного основания, дописывающие в одни и те же тексты, роняют друг друга при каждом
|
|
31
|
+
слиянии: влитая первая устаревает остальные, влитая вторая — все, кроме двух, и так до конца.
|
|
32
|
+
Открыв все разом, исполнитель назначает себе порядка половины квадрата их числа вливаний
|
|
33
|
+
главной — и делает их он, а слияния нажимает человек в своём темпе.
|
|
34
|
+
|
|
35
|
+
Считается это до открытия, а не после: закрыть лишние заявки дешевле, чем вести их, но время на
|
|
36
|
+
их тела к тому часу уже потрачено.
|
|
37
|
+
|
|
38
|
+
## Главная вливается по факту конфликта, а не по расписанию
|
|
39
|
+
|
|
40
|
+
Отставшая ветка и конфликтующая — разное. Отставшую хостинг вливает сам: правки разных мест
|
|
41
|
+
одного файла сводятся без человека. Конфликтует только та, где обе стороны тронули одни строки.
|
|
42
|
+
|
|
43
|
+
Поэтому после чужого слияния главная вливается не во все открытые ветки, а в те, о которых
|
|
44
|
+
хостинг сказал, что они конфликтуют. Спрашивается это одним вызовом на всю стопку:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
gh pr list --state open --json number,headRefName,mergeable \
|
|
48
|
+
--jq '.[] | select(.mergeable == "CONFLICTING") | "\(.number)\t\(.headRefName)"'
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Ответ `UNKNOWN` означает, что хостинг ещё считает, а не что конфликта нет: вызов повторяется
|
|
52
|
+
через несколько секунд. Вливание «на всякий случай» — это и есть та квадратичная цена, и
|
|
53
|
+
платится она за состояние, которого чаще всего нет.
|
|
54
|
+
|
|
55
|
+
## Указателю, куда дописывают все, объявляется сложение
|
|
56
|
+
|
|
57
|
+
Список закрытых работ, оглавление спеков, перечень задач — файлы, куда каждая ветка добавляет
|
|
58
|
+
строку в конец. Они конфликтуют на пустом месте у каждой ветки стопки, и разрешение у них одно:
|
|
59
|
+
нужны обе стороны целиком. Объявляется это один раз, в `.gitattributes`:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
docs/archive/README.md merge=union
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Сложение ставится только на указатели, где правка всегда добавляющая. На текст, который
|
|
66
|
+
переписывают, оно оставит в файле обе редакции.
|
|
67
|
+
|
|
68
|
+
## Порядок вливания задаётся заранее и называется владельцу
|
|
69
|
+
|
|
70
|
+
Порядок считается до открытия заявок — по тому, кто какие файлы правит:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
for b in $(git branch --list '<префикс>-*' --format='%(refname:short)'); do
|
|
74
|
+
git diff --name-only origin/main...$b
|
|
75
|
+
done | sort | uniq -c | sort -rn | head
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Ветки, правящие один и тот же файл, идут подряд: разведённые чужими слияниями, они соберут
|
|
79
|
+
конфликт там, где подряд его бы не было. Порядок называется владельцу в теле заявки — кнопки
|
|
80
|
+
нажимает он, а о родстве веток не знает.
|
|
81
|
+
|
|
82
|
+
## Частые промахи
|
|
83
|
+
|
|
84
|
+
- Открыты все заявки разом, потому что ветки были готовы. Готовность ветки признаком того, что
|
|
85
|
+
её пора отдавать, не является: отдаётся столько, сколько владелец успевает влить.
|
|
86
|
+
- Главная влита во все открытые ветки после каждого чужого слияния. Половина этих вливаний не
|
|
87
|
+
меняла ничего: ветки не конфликтовали, а сливаемость у них не спрашивали.
|
|
88
|
+
- Состояние стопки выведено из своего дерева, а не спрошено у хостинга. Локально влитая главная
|
|
89
|
+
о сливаемости не говорит: между вливанием и взглядом владельца главная уходит вперёд.
|
|
90
|
+
- Стопка отдана без порядка. Владелец вливает в порядке списка, то есть в порядке номеров, — и
|
|
91
|
+
две ветки одного файла попадают друг на друга ровно тогда, когда между ними встала третья.
|
|
92
|
+
- Время потрачено на тела заявок, а не на доведение первой до слияния. Тело нужно тому, кто
|
|
93
|
+
заявку читает; у заявки, до которой очередь дойдёт через сутки, читателя сегодня нет.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: seo-page
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: seo
|
|
5
|
-
description: Паттерн правила seo. Брать, когда правится разметка страницы публичного сайта, заводится
|
|
5
|
+
description: Паттерн правила seo. Брать, когда правится разметка страницы публичного сайта, заводится маршрут или страница должна попасть в карту сайта: готовый вызов службы мета-тегов, ветки локалей, строка карты. Проверка отданной разметки — паттерн seo-verify.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Разметка страницы публичного сайта
|
|
@@ -105,6 +105,23 @@ description: Паттерн правила git-workflow. Брать … Не б
|
|
|
105
105
|
Разделы: `## Когда брать` · готовый код · `## Частые промахи`. Привязки у паттерна нет:
|
|
106
106
|
проверка его не сверяет, потому что сверять готовый код с ним самим нечем.
|
|
107
107
|
|
|
108
|
+
## Описание: триста знаков и один вопрос
|
|
109
|
+
|
|
110
|
+
Описание правила и паттерна едет в системный промпт каждого захода целиком — за него платит
|
|
111
|
+
всякий заход, чем бы ни занимался. Отвечает оно на один вопрос: брать это или нет.
|
|
112
|
+
|
|
113
|
+
| В описании | Не в описании |
|
|
114
|
+
| --------------------------------------------------- | ---------------------------------------------- |
|
|
115
|
+
| под каким законом правило | пересказ его статей |
|
|
116
|
+
| когда брать — путями правки или именем предмета | перечисление разделов |
|
|
117
|
+
| у паттерна — когда не брать, с именем соседнего | довод, зачем правило заведено |
|
|
118
|
+
| имена паттернов при правиле | их содержимое |
|
|
119
|
+
|
|
120
|
+
Считает длину проверка описаний: она называет превысивших поимённо, с числом знаков. Описание,
|
|
121
|
+
которое иначе перестанут находить по своей теме, оставляют длиннее предела — и тогда имя скила
|
|
122
|
+
встаёт в перечень принятого долга с причиной, чтобы молчаливое превышение и осознанное не
|
|
123
|
+
выглядели одинаково.
|
|
124
|
+
|
|
108
125
|
## Порядок
|
|
109
126
|
|
|
110
127
|
1. Статья пишется в закон — без путей и имён файлов.
|
|
@@ -114,6 +131,44 @@ description: Паттерн правила git-workflow. Брать … Не б
|
|
|
114
131
|
4. Готовый код уезжает в паттерн, а правило на него ссылается.
|
|
115
132
|
5. `npm run check:specs` — до пуша.
|
|
116
133
|
|
|
134
|
+
## Сжатие статьи: живой образец
|
|
135
|
+
|
|
136
|
+
Форма — в правиле рядом; здесь одна настоящая статья до и после, с числами. Взята из правила о
|
|
137
|
+
проверке компонента: 1110 знаков, из них утверждение — 90.
|
|
138
|
+
|
|
139
|
+
**До.** Утверждение, механизм, два случая из замера, отвергнутое лекарство, следствие в эталоне:
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
- **Съёмка за пределы окна трогает страницу под затвором, и лечится это не циклом, а окном.**
|
|
143
|
+
Кадр целой страницы шире или выше окна браузер снимает, подменив окно на время кадра: страница
|
|
144
|
+
получает `resize`, и всё, что от размеров окна считается, съезжает прямо в кадре. Замер поймал
|
|
145
|
+
это дважды в одной задаче — лента просмотрщика фото теряла прокрутку, и в кадр попадал первый
|
|
146
|
+
снимок набора вместо последнего; высота страницы уезжала на два пикселя. Успевает ли сдвиг лечь
|
|
147
|
+
в растр, решает гонка, поэтому одна и та же история то краснеет, то нет… Цикл до совпадения
|
|
148
|
+
двух кадров подряд тут не лекарство, а закрепление поломки: сдвиг устойчив… Лечится обратным
|
|
149
|
+
порядком — окно раздвигается до страницы **до** кадра…
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**После — 517 знаков, то же решение:**
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
- **Съёмка за пределы окна трогает страницу под затвором, и лечится это не циклом, а окном.**
|
|
156
|
+
Кадр шире или выше окна браузер снимает, подменив окно: страница получает `resize`, и всё, что
|
|
157
|
+
считается от размеров окна, съезжает прямо в кадре. Цикл до двух совпавших кадров тут не
|
|
158
|
+
лекарство, а закрепление поломки — сдвиг устойчив. Окно раздвигается до страницы **до** кадра,
|
|
159
|
+
показ ждут вставшим, и снимается обычный кадр; в эталоне `100vh` и `100vw` считаются от
|
|
160
|
+
раздвинутого окна. Ловушки — в холодной части.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Куда уехал остаток — 593 знака в `pitfalls.md`:** какая именно история краснела, сколько раз,
|
|
164
|
+
на сколько пикселей уезжала высота, почему виноватой всякий раз выглядела другая история и
|
|
165
|
+
почему это читается как плавающая вёрстка. Ни одно решение по правке на этом не стоит: оно
|
|
166
|
+
нужно тому, кто разбирает красный снимок, — и грузится тогда же.
|
|
167
|
+
|
|
168
|
+
**Что осталось при статье:** утверждение целиком, механизм одной фразой, отвергнутое лекарство
|
|
169
|
+
(без него следующий заход заведёт тот же цикл заново) и следствие в эталоне — оно меняет то, как
|
|
170
|
+
пишут историю.
|
|
171
|
+
|
|
117
172
|
## Частые промахи
|
|
118
173
|
|
|
119
174
|
- Закон назвал файл проекта — проверка отбивает. Путям место в правиле.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: status-report-table
|
|
3
|
+
kind: pattern
|
|
4
|
+
rule: status-report
|
|
5
|
+
description: Паттерн правила status-report. Брать, когда владельцу отвечают, где работа стоит, — готовые вызовы для каждой клетки: ветка и её коммиты, состояние заявки, прогон конвейера и сверка его с вершиной, задача на борде, порядок задач из замысла эпика. Образец заполненной таблицы прилагается.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Чем спрашивается состояние и как оно ложится в таблицу
|
|
9
|
+
|
|
10
|
+
Паттерн правила `status-report`. Что при этом должно быть верно — закон о ведении работы.
|
|
11
|
+
|
|
12
|
+
## Когда брать
|
|
13
|
+
|
|
14
|
+
- Владелец спросил, где стоит работа: «какой статус», «что за эпик», «что сейчас делаешь».
|
|
15
|
+
- Ход кончается отчётом о сделанном, и в нём называется состояние заявки или прогона.
|
|
16
|
+
- Работа идёт под эпиком, и в ответе перечисляются все его задачи.
|
|
17
|
+
|
|
18
|
+
## Вызовы
|
|
19
|
+
|
|
20
|
+
Ветка, её коммиты сверх главной, незакоммиченное и вершина:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
git branch --show-current
|
|
24
|
+
git log --oneline <главная>..HEAD
|
|
25
|
+
git status --short
|
|
26
|
+
git rev-parse --short HEAD
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Порядок задач эпика берётся из его замысла, а не из борды: назначен он там, и номера задач на
|
|
30
|
+
борде идут не подряд.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
sed -n '/## Порядок задач/,/^## /p' <замысел эпика>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Состояние заявки — черновик ли она, сходится ли с главной, сколько файлов:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
gh api repos/:owner/:repo/pulls/<номер> \
|
|
40
|
+
--jq '{n:.number,draft:.draft,state:.state,mergeable:.mergeable,changed:.changed_files}'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Прогон конвейера по ветке и разбор одного прогона:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh run list --branch <ветка> --limit 5
|
|
47
|
+
gh run view <идентификатор>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Задача на борде — заголовок, состояние, метки:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
gh api repos/:owner/:repo/issues/<номер> --jq '{t:.title,s:.state,labels:[.labels[].name]}'
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Чем зовётся исполняемый файл хостинга и где лежат замыслы эпиков, говорит компаньон правила:
|
|
57
|
+
имя команды в оболочке бывает занято чужим псевдонимом, и тогда вызов уходит в интерактивный
|
|
58
|
+
вход вместо ответа.
|
|
59
|
+
|
|
60
|
+
## Ловушки
|
|
61
|
+
|
|
62
|
+
- **Задача на борде читается запросом, а не подкомандой просмотра.** Подкоманда тянет за собой
|
|
63
|
+
доски старого образца, хостинг отвечает отказом о них, и вызов краснеет целиком, ничего не
|
|
64
|
+
показав. Берётся прямой запрос.
|
|
65
|
+
|
|
66
|
+
- **Прогон старше вершины.** Список прогонов показывает последний прогон ветки, а не прогон
|
|
67
|
+
нынешнего коммита. Сверяется с вершиной прежде, чем число встанет в ответ.
|
|
68
|
+
|
|
69
|
+
- **Папка задачи из шаблона.** Скопированные, но незаполненные разбор и замысел держат угловые
|
|
70
|
+
скобки шаблона. Это «заведена, не начата», и в клетке «Состояние» пишется так.
|
|
71
|
+
|
|
72
|
+
- **Заявка зелёная, но черновик.** Прогон успешен, а слияние заблокировано хостингом; в клетке
|
|
73
|
+
«Осталось» стоит снятие черновика либо названное вслух ожидание.
|
|
74
|
+
|
|
75
|
+
## Образец
|
|
76
|
+
|
|
77
|
+
Эпик над таблицей — абзацем, а не строкой:
|
|
78
|
+
|
|
79
|
+
> **Эпик «<название>» (<ключ>)** — <зачем он, одной фразой>. Задач <сколько>, идёт <номер по
|
|
80
|
+
> порядку>.
|
|
81
|
+
|
|
82
|
+
| № | Задача | Номер | О чём | Состояние |
|
|
83
|
+
| --- | ---------------------------- | ------- | ------------------------------ | ------------------------------------------ |
|
|
84
|
+
| 1 | <название задачи из замысла> | <ключ> | <одной фразой, что она делает> | код готов, прогон `<id>` success 12 м 14 с |
|
|
85
|
+
| 2 | <название задачи из замысла> | — | <одной фразой> | не заведена |
|
|
86
|
+
| — | <заведённая вне эпика> | <ключ> | <одной фразой> | заведена, папка — пустой шаблон, ветки нет |
|
|
87
|
+
|
|
88
|
+
Под таблицей — строка о том, чего ждём от владельца, и вызов, которым это снимается.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: task-flow-archive
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: task-flow
|
|
5
|
-
description: Паттерн правила task-flow. Брать, когда тексты приведены и папка задачи разбирается последним коммитом до открытия заявки: переезд в описание прошлого, сверка очереди работ, разбор закрытой работы правилами и
|
|
5
|
+
description: Паттерн правила task-flow. Брать, когда тексты приведены и папка задачи разбирается последним коммитом до открытия заявки: переезд в описание прошлого, сверка очереди работ, разбор закрытой работы правилами и что делать с находками.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Разбор папки задачи и разбор работы правилами
|
|
@@ -58,7 +58,7 @@ rm -r docs/tasks/<КЛЮЧ>-<номер>-<slug>
|
|
|
58
58
|
Разбор идёт последним коммитом ветки, до открытия заявки: открытие с лежащей папкой отбивает
|
|
59
59
|
гард поставки. Прежде уборка стояла после одобрения — считалось, что замысел нужен на диске всё
|
|
60
60
|
время разбора. Но кнопку слияния нажимает человек на хостинге, куда гард не достаёт, и вливает
|
|
61
|
-
он, как только видит
|
|
61
|
+
он, как только видит зелёное. Замысла после
|
|
62
62
|
уборки на диске нет намеренно, и правку по замечаниям гард хода работы пропускает по признаку
|
|
63
63
|
из истории ветки.
|
|
64
64
|
|
|
@@ -162,8 +162,7 @@ npm run check:docs # пути, названные в текстах, суще
|
|
|
162
162
|
|
|
163
163
|
- **Папку разбирают до открытия заявки — потом о ней уже никто не вспомнит.** Сверка очереди
|
|
164
164
|
считает задачу закрытой по слиянию: после него за папку никто не отвечает — работа перешла к
|
|
165
|
-
следующей задаче, и находка достанется чужому заходу.
|
|
166
|
-
так и уехала в главную ветку, в последний раз их набралось пять. Держит это гард поставки:
|
|
165
|
+
следующей задаче, и находка достанется чужому заходу. Держит это гард поставки:
|
|
167
166
|
открытие заявки отбивается, пока папка лежит в ветке.
|
|
168
167
|
- **Разбор папки идёт последним коммитом, после того как гейт пуша прошёл целиком.** Порядок
|
|
169
168
|
один: мерж главной ветки, все линтеры и проверки зелёные, вливание договорённости, приведение
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: task-flow-close
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: task-flow
|
|
5
|
-
description: Паттерн правила task-flow. Брать при доведении работы до
|
|
5
|
+
description: Паттерн правила task-flow. Брать при доведении работы до готовности: вливание договорённости в спек домена, приведение текстов домена к сделанному, открытие заявки черновиком и снятие черновика. Разбор папки задачи — паттерн task-flow-archive.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Закрытие работы
|
|
@@ -166,6 +166,11 @@ PR #<номер> готов к слиянию: прогон зелёный, че
|
|
|
166
166
|
Не осталось: прогон зелёный, черновик снят. Можно вливать.
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
+
Заголовок раздела и слова обоих образцов пишутся языком заявки, а не языком паттерна. Образцы
|
|
170
|
+
набраны тем языком, которым написан сам паттерн, и переносятся целиком — порядок мыслей,
|
|
171
|
+
формулировки и заголовок, заголовок последним: он выглядит частью формы, а не частью текста. То же верно и для двух сообщений
|
|
172
|
+
владельцу выше: они образцы того, **что** сказано, а не того, какими словами.
|
|
173
|
+
|
|
169
174
|
Пустым раздел не оставляется и не удаляется вовсе: отсутствие раздела и «шагов не осталось»
|
|
170
175
|
читаются одинаково, а значат разное. Образец тела заявки целиком — в паттерне заведения коммита
|
|
171
176
|
и заявки, если дерево его разложило.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: task-flow-start
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: task-flow
|
|
5
|
-
description: Паттерн правила task-flow. Брать в начале работы от
|
|
5
|
+
description: Паттерн правила task-flow. Брать в начале работы от владельца: разведка до первого вопроса, шесть обязательных вопросов, договорённость о продукте, заведение задачи, ветки и папки. Возвращение к работе — паттерн task-flow-resume.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Начало работы
|
|
@@ -40,6 +40,15 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
|
|
|
40
40
|
считается сделанным, разведка исполняется как настроение: прочитанный переданный текст сходит
|
|
41
41
|
за неё, и по текущему дереву не запускается ни одной команды.
|
|
42
42
|
|
|
43
|
+
Разведка по заведённой задаче кончается воспроизведённым симптомом, а не найденным файлом. Тело
|
|
44
|
+
задачи описывает дерево на день заведения, и между заведением и работой в главную ветку въезжают
|
|
45
|
+
чужие правки: разведка, читающая код по именам из тела, подтверждает, что названные файлы на
|
|
46
|
+
месте, — и отпавшая задача от живой не отличается ничем. Прежде первой своей правки разведка
|
|
47
|
+
повторяет то, на что задача жалуется: зовёт процедуру, читает отданный ответ, гоняет проверку,
|
|
48
|
+
которая молчала. Симптом не воспроизвёлся — задача закрывается как отпавшая, и это законный её
|
|
49
|
+
исход: чинить нечего, а зелёные проверки после такой правки говорят ровно об этом и ни о чём
|
|
50
|
+
больше.
|
|
51
|
+
|
|
43
52
|
**Следующее движение:** находки ложатся в разбор, и тем же ходом владельцу уходит первый из
|
|
44
53
|
шести вопросов. Разведка кончилась — состояние осталось прежним, ход тоже.
|
|
45
54
|
|
|
@@ -82,8 +91,7 @@ Agent(subagent_type: "Explore", prompt: "<тема просьбы>: что по
|
|
|
82
91
|
|
|
83
92
|
Замеры, находки ролей и список решений к этому моменту уже записаны в ход работы, и в
|
|
84
93
|
сообщении владельцу они лишние. Отчёт, в конце которого стоит вопрос, выглядит добросовестно
|
|
85
|
-
ровно настолько, насколько надёжно вопрос в нём
|
|
86
|
-
работа стоит, и каждый круг стоил захода обоим.
|
|
94
|
+
ровно настолько, насколько надёжно вопрос в нём тонет.
|
|
87
95
|
|
|
88
96
|
Ответы пишутся в `docs/tasks/_draft-<slug>/grill.md` — папка ещё черновик, номера нет.
|
|
89
97
|
|
|
@@ -143,8 +151,12 @@ Workflow(name: "plan", args: "docs/tasks/_draft-<slug>")
|
|
|
143
151
|
Лежит замысел вне папки задачи: та умирает с мержем первой же задачи. Каталог для него называет
|
|
144
152
|
компаньон правила — у пакета своего пути нет.
|
|
145
153
|
|
|
146
|
-
|
|
147
|
-
|
|
154
|
+
Карточки заводятся на все задачи разом, здесь же: по вызову заведения задачи на каждую строку
|
|
155
|
+
таблицы, с меткой эпика. Выданные номера возвращаются в ту же таблицу — колонкой или приставкой
|
|
156
|
+
к названию, — и с этой минуты «взять следующую» отвечает номером, а не названием.
|
|
157
|
+
|
|
158
|
+
**Следующее движение:** объявленный эпик коммитится вместе с номерами задач, и тем же ходом
|
|
159
|
+
берётся первая его задача — заведением ветки и папки.
|
|
148
160
|
|
|
149
161
|
### Состояние `договорённость-записана`: задача, ветка, папка
|
|
150
162
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: ts-procedure
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: typescript-conventions
|
|
5
|
-
description: Паттерн правила typescript-conventions. Брать при заведении или правке процедуры Connect на
|
|
5
|
+
description: Паттерн правила typescript-conventions. Брать при заведении или правке процедуры Connect на бэкенде: готовый класс с полем метода и обработчиком, зависимости конструктором, имена файла и класса. Доступ к процедуре — паттерн permissions-procedure.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Процедура Connect
|
|
@@ -78,3 +78,8 @@
|
|
|
78
78
|
каждый раз читалось как основание вёрстку не трогать.
|
|
79
79
|
- **Чужие проекты не упоминаются нигде** — ни имени репозитория, ни «портировано из», ни
|
|
80
80
|
ссылок на его файлы. Описывается то, что код делает здесь, в терминах этого проекта.
|
|
81
|
+
- **Замена по шаблону молчит, когда шаблон не тот.** Потоковый редактор бывает без поддержки
|
|
82
|
+
чередования в образце: выражение не совпадает ни с чем, команда выходит нулём и не правит ни
|
|
83
|
+
строки. Отличить это от применённой правки по коду возврата нечем — видно только по самому
|
|
84
|
+
файлу, и обычно позже, по заголовкам собранного текста. Текст правится инструментом правки; а
|
|
85
|
+
если замену всё же зовут, место, которое она обещала изменить, перечитывают сразу после неё.
|
|
@@ -84,3 +84,50 @@
|
|
|
84
84
|
Ветки, дописывающие строку в один и тот же список, роняют друг друга в конфликт при каждом
|
|
85
85
|
слиянии, и вливание главной по кругу — это починка проявления. На третьем круге называется
|
|
86
86
|
причина и спрашивается владелец, а не делается четвёртый круг.
|
|
87
|
+
- **Пустой файл, отправленный телом заявки, стирает описание работы целиком.** Так уехала правка
|
|
88
|
+
тела, собранная связкой: переход в каталог временных файлов увёл вызов из дерева, выгрузка
|
|
89
|
+
тела отказала, а следующее звено отправило оставшийся пустым файл. Описание, собранное за три
|
|
90
|
+
захода, стало пустой строкой; восстановлено историей правок хостинга — и то пока она есть.
|
|
91
|
+
- **`gh project` с `--owner` отвечает `unknown owner type`.** Так бывает, когда владелец борды —
|
|
92
|
+
не та учётная запись, под которой идёт вызов. Идентификатор берётся у самой борды, а не
|
|
93
|
+
собирается из имени владельца.
|
|
94
|
+
|
|
95
|
+
## Что стояло в статьях
|
|
96
|
+
|
|
97
|
+
Сюда уехали случаи, числа и отвергнутые лекарства, стоявшие прежде при статьях правила. Ни одно
|
|
98
|
+
решение по правке на них не стоит: они нужны тому, кто разбирает промах или спорит с гардом.
|
|
99
|
+
|
|
100
|
+
- **Сборка входит в набор гейта.** Четыре мержа подряд уехали в главную ветку, ломая выкатку:
|
|
101
|
+
ошибка типов в непокрытом коде пережила линт и юниты и всплыла на сборке образа.
|
|
102
|
+
- **Набор гейта не бывает уже набора конвейера.** Дважды подряд правка, прошедшая гейт целиком,
|
|
103
|
+
была отбита конвейером — и оба раза зелёный гейт был прочитан как «локально всё зелено». Отсюда
|
|
104
|
+
и требование отбивать пуш на шаге без строки в наборе, а не печатать предупреждение рядом.
|
|
105
|
+
- **Черновик не снимается с ветки, которая не сливается.** За один заход так было снято три
|
|
106
|
+
черновика подряд, и все три заявки владелец увидел конфликтующими. Статья про сливаемость
|
|
107
|
+
стояла в правиле и до того — промах повторился в тот же день, поэтому требование держится
|
|
108
|
+
гардом, а не памятью.
|
|
109
|
+
- **Сложение сторон у общего указателя.** До объявления одна и та же строка разрешалась шесть раз
|
|
110
|
+
в шести ветках за один заход. Обещать по объявлению «конфликтов больше не будет» нельзя: не
|
|
111
|
+
будет ручной работы, а вливать главную в открытые ветки после каждого слияния придётся
|
|
112
|
+
по-прежнему.
|
|
113
|
+
- **Личность вызова, открывающего заявку.** Прежде обе стороны — подстановка токена и ответ
|
|
114
|
+
хостинга об авторе — держались статьёй и разбором происшествия, и промах повторился на третий
|
|
115
|
+
день.
|
|
116
|
+
- **Незаданный ключ задач.** Собранный из пустого значения заголовок `[-317]` не совпадает ни с
|
|
117
|
+
чем, и сверка помечает неправильно названной каждую задачу: настоящее расхождение тонет среди
|
|
118
|
+
этих строк.
|
|
119
|
+
- **Ветка, не тронувшая ни строки показа, прогоняет снимки витрин** с того момента, как вливание
|
|
120
|
+
главной принесло чужую правку оформления. Это и есть тот случай, ради которого набор проверок
|
|
121
|
+
пересматривается после вливания.
|
|
122
|
+
- **Возврат PR в черновик — `gh pr ready --undo` — требования разбора не получает:** он делает то
|
|
123
|
+
же, чего гард и добивается.
|
|
124
|
+
- **Свои черновики судятся все разом.** Уход в соседнюю ветку выключал гард целиком: за один
|
|
125
|
+
заход так разошлись с главной четыре заявки подряд, и заметил это владелец, а не проверка.
|
|
126
|
+
Разбор — `docs/postmortems/2026-08-25-run-left-unwatched.md`.
|
|
127
|
+
- **Подпись машинной записи на каждом коммите вклада.** Пять коммитов одной стопки уехали
|
|
128
|
+
подписанными владельцем, который правки не делал: гард судит только коммит, назвавшийся
|
|
129
|
+
машинной записью, и ищет расхождение в числе служебного адреса.
|
|
130
|
+
- **Состояние заявки перечитывается у хостинга.** Клиент отвечает от той записи, чей токен ему
|
|
131
|
+
дали, а запрос разбора на автора хостинг принимает молча и не создаёт.
|
|
132
|
+
- **Ревьюверы спрашиваются вызовом REST.** Под токеном машинной записи выборка клиента падает
|
|
133
|
+
целиком, без токена проходит зелёной — отличить «сошлось» от «спросить было нечем» нечем.
|
|
@@ -57,6 +57,34 @@
|
|
|
57
57
|
расспрашивает владельца заново. Имя черновику дают словами просьбы, а ветке — терминологией
|
|
58
58
|
договорённости; те же слова, да не те же.
|
|
59
59
|
|
|
60
|
+
- **У меню с закрытым набором нет строки «вопрос не тот».** Вариантами вопрос выглядит
|
|
61
|
+
разобранным, и владельцу, чтобы отвергнуть саму постановку, приходится выходить из набора
|
|
62
|
+
руками. Спрашивают меню то, где выбор действительно закрыт; там, где под сомнением сама
|
|
63
|
+
уместность вопроса, его сперва проверяют по репликам владельца — и чаще всего не задают.
|
|
64
|
+
|
|
60
65
|
## Поведение исполнителя — по разборам происшествий
|
|
61
66
|
|
|
62
67
|
Переезжает из правила следующей задачей эпика.
|
|
68
|
+
|
|
69
|
+
## Что стояло в статьях
|
|
70
|
+
|
|
71
|
+
Случаи и числа, стоявшие прежде при статьях правила. Решения по правке на них не стоят: они
|
|
72
|
+
нужны тому, кто разбирает промах или спорит с гардом.
|
|
73
|
+
- **Папка задачи под любую работу.** Прежде правило судило по числу заходов: работа в один
|
|
74
|
+
коммит помещалась в тело PR и папки не заводила. За один заход это исключение дважды стало
|
|
75
|
+
поводом обойти отказ гарда вместо того, чтобы завести папку и пойти дальше.
|
|
76
|
+
- **Разбор папки до открытия PR.** Прежде уборка стояла после одобрения. Трижды подряд папка
|
|
77
|
+
уехала в главную ветку неразобранной, и разобрать её было уже некому: работа перешла к
|
|
78
|
+
следующей задаче, а PR закрылся.
|
|
79
|
+
- **Шапка раскладки в копии образца.** Оставленная в копии, она отбивает первую же правку
|
|
80
|
+
разбора просьбы, а отказ уводит править образец пакета вместо копии под задачу.
|
|
81
|
+
- **Расхождение, не найденное чтением образца целиком, находит владелец** — на приёмке всей
|
|
82
|
+
работой, а не отдельной правкой.
|
|
83
|
+
- **Папка, уехавшая в главную ветку.** Три раза подряд папка закрытой задачи так и уехала
|
|
84
|
+
неразобранной, в последний раз их набралось пять.
|
|
85
|
+
- **Заявка на чужом языке.** В дереве, где заявки пишутся на другом языке, чужой заголовок
|
|
86
|
+
дважды уехал на хостинг, и оба раза до него добрались глазами.
|
|
87
|
+
- **Вопрос, утонувший в отчёте.** Владелец трижды переспрашивал, почему работа стоит, и каждый
|
|
88
|
+
круг стоил захода обоим.
|
|
89
|
+
- **Чужой эпик в списке очереди.** Дважды подряд следующей была взята первая задача чужого
|
|
90
|
+
эпика — по списку она выглядела ровно как своя.
|
|
@@ -68,3 +68,17 @@
|
|
|
68
68
|
сходится и тогда, когда строк стало три. Ожидаемое пишется числом в самой спеке рядом с
|
|
69
69
|
проверкой, а общий модуль сквозных спек держит приёмы — открыть, дождаться, снять со
|
|
70
70
|
страницы, — но не то, что от страницы ожидается.
|
|
71
|
+
- **Красное, пришедшее без правки кода, разбирается со стороны времени.** Зелёный прогон той же
|
|
72
|
+
вершины часом раньше означает, что искать надо не в правке: срок годности образца, високосный
|
|
73
|
+
день, смена суток по всемирному времени, часовой пояс машины. Спека прождала двое суток и
|
|
74
|
+
покраснела сама — прогон пришёлся на четыре минуты позже срока, записанного в её образце.
|
|
75
|
+
|
|
76
|
+
## Что стояло в статьях
|
|
77
|
+
|
|
78
|
+
- **Сид и содержимое с автором.** Три выдуманные цитаты дожили до отдельной задачи и всё это
|
|
79
|
+
время выглядели отзывами настоящих людей.
|
|
80
|
+
- **Растр браузера.** Расхождение гуляет по кадру, приходит примерно раз в четыре прогона и на
|
|
81
|
+
светлых экранах не показывается вовсе, поэтому читается случайным.
|
|
82
|
+
- **Маска и ширина.** Кадр списка уезжал на пиксель целиком, включая столбцы, где не менялось
|
|
83
|
+
ничего.
|
|
84
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Ход захода — холодная часть
|
|
2
|
+
|
|
3
|
+
Ловушки: случаи и числа, стоявшие прежде при статьях правила. Грузится не вместе с правилом, а
|
|
4
|
+
по требованию — при обычном решении она не нужна.
|
|
5
|
+
|
|
6
|
+
Правило — `turn-conduct`; статьи, которыми держится закон, стоят там.
|
|
7
|
+
|
|
8
|
+
## Ловушки
|
|
9
|
+
|
|
10
|
+
- **Сводка о чужом шаге вместо работы.** За один заход это было нарушено четырежды, и готовая
|
|
11
|
+
работа простояла в невлитом PR почти три часа.
|
|
12
|
+
- **Названная, но не запущенная команда.** Дважды за сутки ход кончился ровно такой строкой, и
|
|
13
|
+
оба раза владелец возвращал работу сам.
|
|
14
|
+
- **Снятая папка задачи.** Прежде страж выходил здесь молча — и ход, которому до отдачи
|
|
15
|
+
оставался один шаг, закрывался пустым.
|
|
16
|
+
- **Работа без ветки и папки.** Раньше страж отпускал её молча, и защищена она была меньше
|
|
17
|
+
всего: просьба владельца «разложи», «обнови», «посмотри» идёт без задачи и без ветки, и
|
|
18
|
+
именно она чаще всего кончалась объявлением намерения.
|
|
19
|
+
- **Утверждение о состоянии дерева.** Восемь разборов подряд пришлись на этот промах, и каждый
|
|
20
|
+
раз в правило дописывалась ещё одна статья — держит его теперь машина.
|
|
21
|
+
- **Гард утверждения, прочитавший запись раньше текста.** Молчит он честно и снаружи неотличим
|
|
22
|
+
от гарда, который посмотрел и пропустил: одним таким ходом мимо прошли сразу трое. Отказ
|
|
23
|
+
принадлежит одному гарду: печатай своё решение все трое, вывод перестал бы разбираться целиком.
|
|
24
|
+
- **Отданная работа без снятого черновика.** Две готовые заявки простояли так, пока владелец не
|
|
25
|
+
вернул исполнителя сам.
|
|
26
|
+
- **Повторённый хвост отбитой команды.** Переключение ветки, оставшееся в отброшенном начале,
|
|
27
|
+
унесло шесть файлов задачи в ветку прошлой работы вместе с коммитом.
|
|
28
|
+
- **Оценка «это безопасно» вместо списка.** За один заход одна и та же команда была сначала
|
|
29
|
+
слишком опасной, чтобы её позвать, а через два хода — достаточно безопасной, чтобы позвать без
|
|
30
|
+
спроса.
|
|
31
|
+
- **Почему гард ожидания читает ход, а не хостинг.** Спросить хостинг было бы точнее, но сетевой
|
|
32
|
+
вызов на завершении хода падает вместе со связью и отбивал бы работу вместо промаха, а вывод
|
|
33
|
+
команды о прогоне в записи хода уже лежит.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: angular-patterns
|
|
3
3
|
kind: rule
|
|
4
4
|
law: frontend-application
|
|
5
|
-
description: Правило под «Закон о фронтовом приложении». Брать при правке любого класса Angular — компонента,
|
|
5
|
+
description: Правило под «Закон о фронтовом приложении». Брать при правке любого класса Angular — компонента, стора, сервиса, директивы, пайпа, гарда, интерцептора. Называет сигнальный API входов, OnPush, zoneless, inject и место подписки. Паттерн angular-patterns-state.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Реактивность экрана — как это устроено здесь
|