@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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rt-hook: Stop
|
|
3
|
+
# Гард ожидания: ход, в котором открыт PR, не заканчивается, пока в нём не было ни одного
|
|
4
|
+
# действия по следующей задаче. Stop.
|
|
5
|
+
#
|
|
6
|
+
# Зачем именно так. Статья «ожидание прогона работой не занимают» держится памятью исполнителя, и
|
|
7
|
+
# держится плохо: образец сообщения владельцу кончается фразой о следующей задаче, а фраза
|
|
8
|
+
# исполняется как обещание — заход произносит её и кончает ход. Ход, в котором не сделано ничего,
|
|
9
|
+
# ничем себя не выдаёт: ни правкой файла, ни командой, — и промах виден только владельцу, только
|
|
10
|
+
# по тому, что работа не двигается, и только когда он спросит прямо.
|
|
11
|
+
#
|
|
12
|
+
# Признак берётся из хода, а не из сети. Спросить хостинг об открытых PR было бы точнее, но
|
|
13
|
+
# сетевой вызов на завершении хода падает вместе со связью и отбивал бы работу вместо промаха.
|
|
14
|
+
# Поэтому судится пара: в ходе был вызов открытия PR — и в том же ходе было действие по
|
|
15
|
+
# следующей задаче.
|
|
16
|
+
#
|
|
17
|
+
# Что считается действием: заведение задачи, заведение ветки, перевод колонки очереди работ,
|
|
18
|
+
# заведение папки задачи. Набор открыт и пополняется правкой — полнота его открытый вопрос, а не
|
|
19
|
+
# обещание.
|
|
20
|
+
#
|
|
21
|
+
# Чего гард не судит. Ход, в котором PR не открывали, — здесь он молчит: пустой ход неотличим
|
|
22
|
+
# от хода, которому нечего было делать. Это известная его граница.
|
|
23
|
+
#
|
|
24
|
+
# ОТКАЗ В ПОЛЬЗУ РАБОТЫ: при любой ошибке, нехватке `jq`, отсутствии записи хода и повторном
|
|
25
|
+
# заходе ход РАЗРЕШАЕТСЯ (exit 0). Сломанный гард не имеет права заклинить разговор.
|
|
26
|
+
|
|
27
|
+
input="$(cat 2>/dev/null)"
|
|
28
|
+
[ -z "$input" ] && exit 0
|
|
29
|
+
|
|
30
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
31
|
+
|
|
32
|
+
# Повторный заход по тому же ходу не судится: гард сказал своё один раз и отпускает.
|
|
33
|
+
active="$(printf '%s' "$input" | jq -r '.stop_hook_active // false' 2>/dev/null)"
|
|
34
|
+
[ "$active" = "true" ] && exit 0
|
|
35
|
+
|
|
36
|
+
transcript="$(printf '%s' "$input" | jq -r '.transcript_path // empty' 2>/dev/null)"
|
|
37
|
+
[ -z "$transcript" ] && exit 0
|
|
38
|
+
[ -f "$transcript" ] || exit 0
|
|
39
|
+
|
|
40
|
+
# Открытие PR у каждого хостинга своё, и гард переносится между ними целиком: набор называет все
|
|
41
|
+
# три формы, а не ту, что стоит в этом дереве. Правка тела PR сюда не входит — она не открывает
|
|
42
|
+
# ничего.
|
|
43
|
+
opened_re='gh[^|;&]*pr[[:space:]]+create|api[^|;&]*-X[[:space:]]+POST[^|;&]*/pulls|glab[^|;&]*mr[[:space:]]+create|az[[:space:]]+repos[[:space:]]+pr[[:space:]]+create'
|
|
44
|
+
|
|
45
|
+
# Первое действие по следующей задаче. Заведение папки стоит здесь наравне с командами: работа
|
|
46
|
+
# по уже заведённому номеру начинается именно с неё.
|
|
47
|
+
moved_re='task:new|task:move|checkout[[:space:]]+-b|docs/tasks/'
|
|
48
|
+
|
|
49
|
+
# Ход — это всё, что записано после последнего настоящего ввода владельца. Ответ инструмента
|
|
50
|
+
# приходит той же ролью, поэтому строки с `tool_result` вводом не считаются.
|
|
51
|
+
#
|
|
52
|
+
# Хвост в 400 строк: запись хода растёт всю сессию, а судится только последний ход.
|
|
53
|
+
verdict="$(tail -n 400 "$transcript" 2>/dev/null | jq -s -r --arg opened "$opened_re" --arg moved "$moved_re" '
|
|
54
|
+
def is_input:
|
|
55
|
+
.type == "user"
|
|
56
|
+
and (((.message.content // []) | if type == "array"
|
|
57
|
+
then ([.[] | select(.type == "tool_result")] | length)
|
|
58
|
+
else 0 end) == 0);
|
|
59
|
+
|
|
60
|
+
(map(is_input) | rindex(true)) as $i
|
|
61
|
+
| (if $i == null then [] else .[$i:] end) as $turn
|
|
62
|
+
| [$turn[] | select(.type == "assistant") | (.message.content // [])[] | select(.type == "tool_use")] as $uses
|
|
63
|
+
| ($uses | map((.input.command // "")) | join("\n")) as $ran
|
|
64
|
+
| ($ran | test($opened; "i")) as $opened_pr
|
|
65
|
+
| ($ran | test($moved; "i")) as $went_on
|
|
66
|
+
| if $opened_pr and ($went_on | not) then "owe" else "pass" end
|
|
67
|
+
' 2>/dev/null)"
|
|
68
|
+
|
|
69
|
+
[ "$verdict" = "owe" ] || exit 0
|
|
70
|
+
|
|
71
|
+
reason="BLOCKED by waiting-turn-guard: в этом ходе открыт PR, а действия по следующей задаче в нём нет ни одного. Ожидание чужого шага заходом не занимают: прогон идёт на стороне и быстрее от взгляда на него не становится.
|
|
72
|
+
|
|
73
|
+
Сказать «беру следующую задачу» — не то же самое, что взять её: фраза живёт до конца хода, а работа не двигается, и заметить это может только владелец.
|
|
74
|
+
|
|
75
|
+
Тем же ходом делается первое действие по следующей задаче — заведение задачи, ветки или папки:
|
|
76
|
+
|
|
77
|
+
npm run task:new -- --title '<Что не так>' --slug <slug>
|
|
78
|
+
git checkout -b <КЛЮЧ>-<номер>-<slug>
|
|
79
|
+
|
|
80
|
+
Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.
|
|
81
|
+
|
|
82
|
+
Гард судит один ход: следующий заход не отбивается."
|
|
83
|
+
|
|
84
|
+
jq -n --arg r "$reason" '{decision:"block",reason:$r}' 2>/dev/null \
|
|
85
|
+
|| printf '{"decision":"block","reason":"waiting-turn-guard: PR открыт — тем же ходом берётся следующая задача."}\n'
|
|
86
|
+
|
|
87
|
+
exit 0
|
|
@@ -131,7 +131,7 @@ case "$tool" in
|
|
|
131
131
|
esac
|
|
132
132
|
;;
|
|
133
133
|
Bash | mcp__webstorm__execute_terminal_command)
|
|
134
|
-
# Поставка и сверки: коммит, пуш,
|
|
134
|
+
# Поставка и сверки: коммит, пуш, PR, колонка задачи, состояние дерева. Список
|
|
135
135
|
# дописывается профилем дерева — клиент хостинга и имена команд у каждого свои.
|
|
136
136
|
if rt_needs rt_handoff_allowed_cmd window-fill-guard && rt_handoff_allowed_cmd "$cmd"; then
|
|
137
137
|
allowed=1
|
package/assets/laws/delivery.md
CHANGED
|
@@ -10,6 +10,18 @@
|
|
|
10
10
|
очередь не попала, никто не видит, и работа за ней не планировалась.
|
|
11
11
|
- **Правка попадает в главную ветку только через отдельную ветку.** Прямая запись в главную
|
|
12
12
|
лишает правку и обсуждения, и возможности откатить её одним движением.
|
|
13
|
+
- **В очереди работ стоят задачи, а не PR о них.** У задачи и её PR один номер и одна судьба,
|
|
14
|
+
поэтому вторая карточка о той же работе ничего не добавляет — она удваивает очередь и врёт о
|
|
15
|
+
её длине. Читают очередь затем, чтобы увидеть, что сделано и что осталось; PR отвечает на
|
|
16
|
+
другой вопрос — как именно сделано, — и попадают в него из карточки задачи, где связь с ним
|
|
17
|
+
и так стоит. Карточка PR при этом живёт своей жизнью: закрывается позже задачи, висит в
|
|
18
|
+
очереди после слияния и остаётся в ней навсегда, потому что колонки под неё нет.
|
|
19
|
+
- **Проверка не гоняет того, что правка не может сломать.** Набор, одинаковый для любой правки,
|
|
20
|
+
выглядит строгим, а работает наоборот: прогон, который длится вдесятеро дольше нужного, учат
|
|
21
|
+
не ждать, а обходить. Состав набора выводится из состава правки — из того, что она задела, а
|
|
22
|
+
не из того, кем она названа; правка, не тронувшая ни строки кода, не собирает образов и не
|
|
23
|
+
снимает кадров. Пропущенное при этом называется пропущенным: молча выпавший шаг читается как
|
|
24
|
+
пройденный.
|
|
13
25
|
- **У задачи одна ветка, у ветки одна задача.** Откат снимает всё, что въехало этой веткой,
|
|
14
26
|
разом: две задачи в ней откатятся только вместе, а задача, въехавшая двумя ветками, после
|
|
15
27
|
отката одной останется наполовину сделанной — и в очереди работ этого не видно. Работа,
|
|
@@ -28,10 +40,10 @@
|
|
|
28
40
|
своим номером, а то, чего в первой не было, дописывается в неё до этого. Две строки об
|
|
29
41
|
одной работе хуже дыры в нумерации: по ним потом не понять, что сделано, а что нет. Слить
|
|
30
42
|
их можно, пока правка не въехала в главную ветку; после — обе остаются как есть.
|
|
31
|
-
- **Задача, ветка под неё и
|
|
43
|
+
- **Задача, ветка под неё и PR о сделанном несут один и тот же номер в своих названиях.**
|
|
32
44
|
Иначе одну работу приходится узнавать по тексту названия, а в списке из полусотни строк это
|
|
33
45
|
делается по памяти и с ошибками.
|
|
34
|
-
- **Номер пишется всюду одинаково: ключ задач, дефис, номер.** Заголовок задачи и
|
|
46
|
+
- **Номер пишется всюду одинаково: ключ задач, дефис, номер.** Заголовок задачи и PR
|
|
35
47
|
начинается с этой пары в квадратных скобках, имя ветки — с неё же. Одна форма, а не три
|
|
36
48
|
похожих, потому что номер читают не только глазами: из имени ветки его достаёт гард, из
|
|
37
49
|
заголовка — сверка очереди. Формы, выведенные порознь, расходятся молча и не отказывают, а
|
|
@@ -46,9 +58,9 @@
|
|
|
46
58
|
ничьей: по очереди работ не видно, кто её взял, и заведённая по ходу правка теряется среди
|
|
47
59
|
чужих.
|
|
48
60
|
- **Состояние задачи в очереди работ отвечает тому, что с ней происходит.** Взятая в работу
|
|
49
|
-
видна взятой, а та,
|
|
61
|
+
видна взятой, а та, PR по которой ждёт разбора, — ждущей разбора. Иначе очередь показывает
|
|
50
62
|
один и тот же вид у нетронутого, у делаемого прямо сейчас и у сделанного: работа берётся
|
|
51
|
-
второй раз, а
|
|
63
|
+
второй раз, а PR стоит неразобранным, пока про него не вспомнят. Состояние переставляется
|
|
52
64
|
в тот момент, когда работа переходит на следующий шаг, а не приводится в порядок потом:
|
|
53
65
|
очередь читают между этими моментами, а не после них.
|
|
54
66
|
- **Попадание правки в главную ветку означает выкатку.** Всё, от чего правка зависит снаружи
|
|
@@ -71,10 +83,32 @@
|
|
|
71
83
|
иначе «сошлось» значит в этих двух местах разное.
|
|
72
84
|
- **Документ едет вместе с правкой, которую он описывает.** Ни сборка, ни проверки текстов
|
|
73
85
|
не читают, поэтому расхождение копится молча и потом выглядит действующей справкой.
|
|
74
|
-
-
|
|
86
|
+
- **Работа, меняющая код, кончается открытым PR.** PR — единственное место, где человек видит
|
|
87
|
+
правку целиком, отвечает на неё и вливает её; коммит в ветке и запушенная ветка этого места
|
|
88
|
+
не заменяют. Пока PR не открыт, работа сделанной не считается, сколько бы её ни было в
|
|
89
|
+
истории ветки: разбор по ней невозможен, а человек о ней не знает. Открывается PR тем же
|
|
90
|
+
ходом, которым исполнитель говорит, что работу отдаёт, — а не следующим заходом и не по
|
|
91
|
+
напоминанию.
|
|
92
|
+
- **PR, не готовый к слиянию, помечается черновиком.** Открытый PR читается как приглашение
|
|
93
|
+
влить, и человек нажимает слияние, не спрашивая, кончилась ли работа. Черновик разводит два
|
|
94
|
+
состояния, которые иначе выглядят одинаково: правка выложена на обозрение — и правка готова
|
|
95
|
+
поехать в главную ветку. Помечается им всё, что ждёт прогона, доработки или ответа на
|
|
96
|
+
вопрос; вопрос при этом задаётся в самом PR, а не остаётся в голове исполнителя.
|
|
97
|
+
- **Снятие черновика — отдельный ход, и им исполнитель отвечает за готовность.** Черновик
|
|
98
|
+
снимается тогда, когда проверки пройдены, доработок не осталось и работа сходится с тем,
|
|
99
|
+
ради чего заводилась задача. Пока он стоит, молчание исполнителя значит «ещё не готово», и
|
|
100
|
+
человек ничего не должен переспрашивать; после снятия оно значит «можно вливать», и цена
|
|
101
|
+
ошибки здесь — правка в главной ветке.
|
|
102
|
+
- **PR о сделанном остаётся верным до самого слияния.** Он описывает дерево на день, когда
|
|
75
103
|
его написали, а разбора ждёт днями: за это время главная ветка вливается в ветку, и
|
|
76
|
-
утверждение
|
|
77
|
-
одна проверка. Всё, что вливается в ветку после публикации
|
|
104
|
+
утверждение PR о соседних файлах становится неправдой молча — тел PR не читает ни
|
|
105
|
+
одна проверка. Всё, что вливается в ветку после публикации PR, — повод перечитать его.
|
|
106
|
+
- **PR в главную ветку вливает человек.** Слияние — последний момент, когда разбор ещё
|
|
107
|
+
возможен: после него правка стоит в главной ветке, работа ушла к следующей задаче, и
|
|
108
|
+
вернуться к ней уже некому. Исполнитель работы вливает свой PR только по прямому слову
|
|
109
|
+
человека и только про названный PR; молчание разрешением не бывает, а слово, сказанное об
|
|
110
|
+
одном PR, на следующий не переносится. Иначе разбор проходит тот, кого разбирают, и
|
|
111
|
+
очередь PR выглядит разобранной, не будучи ею.
|
|
78
112
|
- **Слияние в главную ветку ещё не означает, что правка доехала.** Отказ выкатки не трогает ни
|
|
79
113
|
задачу, ни очередь работ, поэтому расхождение главной ветки с тем, что работает, обязано быть
|
|
80
114
|
видно там, где очередь читают. Иначе следующие работы вливаются поверх поломки, которую не
|
|
@@ -56,3 +56,42 @@
|
|
|
56
56
|
знает само дерево, а не текст, приехавший в него. Утверждение, сказанное безусловно, врёт тем
|
|
57
57
|
увереннее, что печатает его сам инструмент, — и поправить его дерево не может, если правки на
|
|
58
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
|
+
Непрочитанная редакция расходится с прочитанной молча, и узнаёт об этом первый, кто её
|
|
85
|
+
выберет, — то есть тот, у кого нет ни истории расхождения, ни повода его искать.
|
|
86
|
+
- **Набор обязательных разделов объявлен отдельно, и образец ему не хозяин.** Образец —
|
|
87
|
+
черновик для того, кто заводит текст, и стареет он первым. Набор, выведенный из образца, либо
|
|
88
|
+
объявляет расхождением весь корпус разом, либо не замечает ничего.
|
|
89
|
+
- **Требование, которого никто не формулировал, молчит, а не отказывает.** Отказ на предмете
|
|
90
|
+
без объявленного требования гасят списком исключений, а список исключений через месяц
|
|
91
|
+
становится рабочим путём — и гасит вместе с шумом то, ради чего проверка заводилась.
|
|
92
|
+
- **Два текста об одном либо говорят одно, либо один из них неправ.** Согласие текстов между
|
|
93
|
+
собой не следует ни из целостности ссылок, ни из полноты разделов: оба проходят любую такую
|
|
94
|
+
проверку, а исполнитель берёт тот, который прочитал раньше. Ищется это чтением — считать
|
|
95
|
+
здесь нечего.
|
|
96
|
+
- **Изображение правится тем же изменением, что и текст, который оно изображает.** Разойдясь,
|
|
97
|
+
схема и проза остаются читаемыми обе, и первым это замечает тот, кто пошёл по схеме.
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
- **Успешный ответ команды означает, что она отработала, а не что нужное состояние
|
|
34
34
|
наступило.** Часть запросов выполняется наполовину, и об отклонённой части в ответе ничего
|
|
35
35
|
нет: по коду возврата такой вызов не отличить от исполненного. Поэтому результат читают
|
|
36
|
-
отдельным запросом, и в
|
|
36
|
+
отдельным запросом, и в PR идёт то, что прочитали, а не то, что заказывали.
|
|
37
37
|
- **Служба считается поднятой, когда она выполнила задание, а не когда сообщила о
|
|
38
38
|
готовности.** Сообщение о готовности говорит лишь, что служба себя объявила: та, которой не
|
|
39
39
|
досталось ни одного задания, выглядит в нём точно так же, как работающая. Проверяются обе
|
|
@@ -47,6 +47,11 @@
|
|
|
47
47
|
выключают в настройке инструмента, а не обходят в каждом месте.** Обход приходится повторять
|
|
48
48
|
столько раз, сколько таких мест, и ни в одном из них не написано, зачем он: со стороны это
|
|
49
49
|
выглядит ошибкой автора, а не решением.
|
|
50
|
+
- **Красная проверка означает неверный код, а не неверную проверку.** Место, выведенное
|
|
51
|
+
из-под проверки затем, чтобы она замолчала, чинит показание, а не то, на что она указала:
|
|
52
|
+
код остаётся прежним, а сигнала о нём больше нет ни у кого. Список известного накоплен к
|
|
53
|
+
дню заведения проверки и только сокращается; несогласие с самой проверкой — вопрос к
|
|
54
|
+
владельцу, а не строка в списке.
|
|
50
55
|
- **Польза правила подтверждается наблюдением за тем, как им пользуются, а не мнением о нём.**
|
|
51
56
|
Правило, которого не открыли ни разу, и правило, на котором держится половина работы, в тексте
|
|
52
57
|
выглядят одинаково — и правится первым обычно то, о чём вспомнили, а не то, что мешает.
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
- **Остановка называется первой строкой.** Сообщение, которым исполнитель останавливается,
|
|
21
21
|
начинается с того, чего он ждёт и что будет, если ответа не будет. Замеры, находки и разбор
|
|
22
22
|
к этому моменту уже записаны в ход работы — в сообщении владельцу они лишние. Чем подробнее
|
|
23
|
-
|
|
23
|
+
PR, тем надёжнее вопрос в нём тонет, и владелец переспрашивает, почему работа стоит.
|
|
24
24
|
- **Владельцу не задаётся вопрос, ответ на который уже записан.** Записанное читают до
|
|
25
25
|
разговора, а не вместо ответа: вопрос о том, что уже решено, обесценивает и остальные.
|
|
26
26
|
- **Вопрос владельцу задаётся после того, как ответ искали в дереве.** Что лежит в дереве,
|
|
@@ -31,6 +31,11 @@
|
|
|
31
31
|
«здесь нет», «этого не заводили», «такого файла не бывает» — произносится только как вывод
|
|
32
32
|
команды. Не проверенное отрицание опаснее вопроса: вопрос владелец поправит, а факт от
|
|
33
33
|
исполнителя примет на веру, потому что тот в дерево смотрит.
|
|
34
|
+
- **Отрицание, полученное одним источником, отрицанием не является.** Ответ «не найдено», отказ
|
|
35
|
+
в доступе и пустой список говорят о правах спрашивающего, а не о предмете: тот же вопрос,
|
|
36
|
+
заданный оттуда, где предмет виден, отвечает обратным. Сказать «этого нет» можно только после
|
|
37
|
+
второго источника — иначе исполнитель называет владельцу собственные права, приняв их за
|
|
38
|
+
устройство мира.
|
|
34
39
|
- **Решение, однажды записанное, действует, пока его не отменили, и читается до того, как
|
|
35
40
|
принимается заново.** Отменённое решение следа в работе не оставляет — по результату не
|
|
36
41
|
видно ни того, что его принимали, ни того, что от него отказались. Принятое заново оно
|
|
@@ -58,7 +63,7 @@
|
|
|
58
63
|
пересказ он даёт по своей памяти, а не по ходу работы, и следующий заход начинает с чужой
|
|
59
64
|
картины.
|
|
60
65
|
- **Замысел и ход работы — разные записи.** Замысел — то, с чем сверяют результат при
|
|
61
|
-
приёмке; правленный по ходу, он перестаёт отличаться от
|
|
66
|
+
приёмке; правленный по ходу, он перестаёт отличаться от PR, и приёмке сверять нечего.
|
|
62
67
|
- **Сделанное отмечается в одном месте.** Две записи об одном разъезжаются молча, и после
|
|
63
68
|
этого ни по одной не видно, что осталось.
|
|
64
69
|
- **Решение, принятое по ходу работы, записывается вместе с причиной.** Без причины оно
|
|
@@ -66,7 +71,7 @@
|
|
|
66
71
|
- **Граница работы названа до её начала.** Не названная вслух граница не существует: правка
|
|
67
72
|
расползается на соседнее, и снимать её приходится вручную.
|
|
68
73
|
- **Действия, которые исполнитель не делает сам, названы списком.** Всё, что уходит за
|
|
69
|
-
пределы рабочего дерева или не откатывается — запись в общий репозиторий, публикация,
|
|
74
|
+
пределы рабочего дерева или не откатывается — запись в общий репозиторий, публикация, PR,
|
|
70
75
|
правка общего документа, — делается по слову владельца, и слово это даётся на действие, а не
|
|
71
76
|
на работу целиком. Не названная списком граница выводится из общих слов: «делай, что нужно
|
|
72
77
|
по плану» прочитывается как разрешение на всё, что в плане подразумевалось.
|
|
@@ -104,3 +109,78 @@
|
|
|
104
109
|
- **У предложенной правки правил назван адрес: сам слой правил, имена этого дерева или его
|
|
105
110
|
надстройка.** Без адреса правку кладут туда, где она видна автору, — то есть в своё дерево, —
|
|
106
111
|
и общее оседает в одном месте, оставаясь неизвестным всем остальным.
|
|
112
|
+
- **Предложение, о котором владелец сказал вслух, уходит наружу в тот же ход.** Написанное и не
|
|
113
|
+
отправленное лежит в дереве неотличимо от отправленного: своей записи в слое правил у него
|
|
114
|
+
нет, и владелец читает работу сделанной, пока не спросит прямо. Слово владельца о предложении
|
|
115
|
+
— «отправь», «заведи», «напиши» — распоряжение, а не тема разговора; показ того, что уехало
|
|
116
|
+
бы, отправкой не является и следа наружу не оставляет.
|
|
117
|
+
- **Неудобство отправки — повод сказать о нём, а не повод не отправить.** Довод исполнителя
|
|
118
|
+
против уже принятого решения владельца остаётся доводом: он называется вслух, работа при этом
|
|
119
|
+
идёт. Отложить исполненное решение может только владелец; отложенное собственным доводом
|
|
120
|
+
выглядит для него сделанным, и цену этого он узнаёт последним.
|
|
121
|
+
- **Работа, из которой видно серию задач, объявляется эпиком до первой из них.** Объявляется
|
|
122
|
+
дважды: карточкой в очереди работ и замыслом рядом с ней. Не объявленная серия существует
|
|
123
|
+
только в голове того, кто её задумал: следующий заход видит разрозненные задачи, порядка между
|
|
124
|
+
ними не находит и берёт ту, что ближе лежит.
|
|
125
|
+
- **Замысел эпика называет разрабатываемую возможность, состав задач и их порядок.** Состав без
|
|
126
|
+
порядка порядком не является: две задачи, у которых порядок держался пониманием, ушли в работу
|
|
127
|
+
наоборот, и вторая переделывалась под первую. Возможность, названная одним словом, через неделю
|
|
128
|
+
читается каждым по-своему.
|
|
129
|
+
- **Порядок задач эпика назначается на планировании и держится до его конца.** Пересмотр по ходу
|
|
130
|
+
— решение владельца, записанное там же, где идёт работа. Порядок, назначаемый заново перед
|
|
131
|
+
каждой задачей, назначает тот, кому ближе, и эпик кончается там, где надоел.
|
|
132
|
+
- **Заход исполнителя не кончается вместе с задачей.** Конец задачи — не признак остановки:
|
|
133
|
+
остановиться позволяет только предел заполнения окна. Заход, закрытый на готовой задаче,
|
|
134
|
+
оставляет владельцу пустое место и стоит целого захода на возвращение к тому, что и так было
|
|
135
|
+
под рукой.
|
|
136
|
+
- **Работа, отданная на разбор, освобождает исполнителя, а не останавливает его.** Отданное на
|
|
137
|
+
разбор ждёт владельца, а не машину: следующая задача эпика берётся тем же движением, которым
|
|
138
|
+
предыдущая ушла на разбор.
|
|
139
|
+
- **Ожидание машины работой не занимают.** Проверка, идущая на стороне, не спрашивает
|
|
140
|
+
исполнителя ни о чём и не идёт быстрее оттого, что он на неё смотрит. Пока она идёт, работа
|
|
141
|
+
продолжается: берётся следующая задача, а к проверке возвращаются тем ходом, которым читают
|
|
142
|
+
её конец. Заход, проведённый в ожидании, стоит ровно столько же, сколько заход, в котором
|
|
143
|
+
сделана задача, — и не даёт ничего.
|
|
144
|
+
- **Ожидание, которое всё-таки останавливает работу, называется владельцу отдельно и прямо.**
|
|
145
|
+
Есть случаи, где дальше и вправду не пройти: следующая задача стоит на неразобранной, или
|
|
146
|
+
правка ждёт решения, которого нет ни у кого, кроме владельца. Тогда исполнитель говорит три
|
|
147
|
+
вещи — что именно стоит, чего оно ждёт и что владелец может с этим сделать: разобрать работу
|
|
148
|
+
первой или снять ожидание своим словом. Сказанное вперемешку с отчётом о сделанном не
|
|
149
|
+
читается: остановка называется отдельно от всего остального.
|
|
150
|
+
- **Разбор закрытой работы идёт своим ходом и работу не задерживает.** Он смотрит на то, что
|
|
151
|
+
видно только заходу, который работу вёл, поэтому пропустить его нельзя; но и держать ради
|
|
152
|
+
него следующую задачу незачем — он ничего не спрашивает у исполнителя, пока идёт. Его находки
|
|
153
|
+
записываются туда, где их найдут после слияния работы, и показываются владельцу целиком, а не
|
|
154
|
+
уезжают наружу сами: что из них станет правкой, решает он.
|
|
155
|
+
- **Отдав работу на разбор, исполнитель называет, чего ждёт и что сделает следом.** Владелец
|
|
156
|
+
видит не голову исполнителя, а страницу работы: зелёная проверка и доступное действие
|
|
157
|
+
читаются как «всё кончено». Названное вслух ожидание — единственное, что отличает «жду
|
|
158
|
+
проверок, потом уберу за собой» от «готово, забирай». Не названное, оно не существует, и
|
|
159
|
+
владелец действует по тому, что видит.
|
|
160
|
+
- **Работа не считается готовой, пока исполнитель не сказал этого прямо.** Готовность объявляет
|
|
161
|
+
тот, кто работу вёл, — отдельной просьбой и про эту работу. Зелёные проверки готовностью не
|
|
162
|
+
являются: они говорят, что не сломано, и молчат о том, осталось ли что-то сделать. Молчание
|
|
163
|
+
исполнителя владелец читает как готовность, и между двумя прочтениями теряется всё, что
|
|
164
|
+
стояло после разбора.
|
|
165
|
+
- **Уборка за работой идёт до того, как о готовности сказано.** Всё, что работа обязана убрать
|
|
166
|
+
за собой, убирается раньше просьбы включить её в общее дерево, а не после согласия. После
|
|
167
|
+
включения убирать уже некому: работа перешла к следующей задаче.
|
|
168
|
+
- **Пока эпик не кончился, следующая работа не выбирается, а берётся.** Выбор, предложенный
|
|
169
|
+
владельцу при назначенном порядке, — это просьба назначить его заново: он уже назначен, и
|
|
170
|
+
предлагать его повторно значит отменять собственное планирование.
|
|
171
|
+
- **Замеченное по ходу и к эпику не относящееся становится задачей в очереди работ, а не работой
|
|
172
|
+
сейчас.** Отвлечение выглядит дешёвым ровно до того, как окажется, что вместе с ним уехала
|
|
173
|
+
правка соседнего домена: эпик при этом стоит, а откатывать приходится обе работы.
|
|
174
|
+
- **Эпик кончается, когда кончились его задачи, а не когда стало непонятно, что дальше.**
|
|
175
|
+
Непонятно бывает от того, что замысел не открыли: он лежит и держит решения, которых в коде не
|
|
176
|
+
видно.
|
|
177
|
+
- **Положение эпика показывается владельцу таблицей — в передаче и при остановке за его
|
|
178
|
+
решением.** Это два момента, когда владелец смотрит на работу снаружи: в первый он забирает её
|
|
179
|
+
в новый заход, во второй решает, куда её вести. Порядок задач при этом лежит в замысле, а
|
|
180
|
+
замысел ни там, ни там не открывают — передача пересказывает один заход, вопрос называет одну
|
|
181
|
+
развилку, и по обоим не видно ни сделанного, ни оставшегося.
|
|
182
|
+
- **Таблица показывает все задачи эпика разом — закрытые, текущую и назначенные.** Строка на
|
|
183
|
+
задачу: место по порядку, задача, состояние; текущая отличается от остальных на вид. Порядок у
|
|
184
|
+
закрытых фактический, у будущих назначенный, и расхождение между ними тоже утверждение — оно
|
|
185
|
+
говорит, что порядок пересматривали. Перечень одних оставшихся не показывает, чего работа
|
|
186
|
+
стоила; перечень одних закрытых не показывает, сколько ещё впереди.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: git-workflow-commit
|
|
3
3
|
kind: pattern
|
|
4
4
|
rule: git-workflow
|
|
5
|
-
description: Паттерн правила git-workflow для дерева в Azure DevOps. Брать на заведение рабочего элемента, ветки, коммит, пуш и создание PR — заведение элемента со всеми шагами, перевод по состояниям, слияние двух задач в одну, сверка очереди работ, работа от учётной записи машинной работы, формат заголовка, привязка PR к элементу, ревьювер, исполнитель и метки, чеклист проверок до публикации, обход требования документа. Не брать для миграций и перезапуска прода — это паттерны git-workflow-migration и git-workflow-restart.
|
|
5
|
+
description: Паттерн правила git-workflow для дерева в Azure DevOps. Брать на заведение рабочего элемента, ветки, коммит, пуш и создание PR — заведение элемента со всеми шагами, перевод по состояниям, слияние двух задач в одну, сверка очереди работ, работа от учётной записи машинной работы, формат заголовка, привязка PR к элементу, ревьювер, исполнитель и метки, образец тела PR с разделом об оставшемся шаге, чеклист проверок до публикации, обход требования документа. Не брать для миграций и перезапуска прода — это паттерны git-workflow-migration и git-workflow-restart.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Ветка, коммит и PR
|
|
@@ -43,6 +43,14 @@ az boards work-item update --id <номер> --title '[<номер>] …' # н
|
|
|
43
43
|
Номер в заголовок руками не пишется — он известен только после создания, и команда дописывает
|
|
44
44
|
его сама.
|
|
45
45
|
|
|
46
|
+
Заведение кончается не выводом команды, а ответом очереди работ. Команда спрашивает её сама и
|
|
47
|
+
печатает прочитанное — присутствие на доске, состояние, исполнителя; отсутствие кончает её
|
|
48
|
+
ненулевым кодом. В комментарий, в тело PR и в замысел идёт этот ответ, а не напечатанный
|
|
49
|
+
номер: номер говорит «вызов прошёл», а не «работа видна тому, кто по ней придёт».
|
|
50
|
+
|
|
51
|
+
Заведения, идущие подряд, проверяются не по последнему, а сверкой очереди целиком: промах у них
|
|
52
|
+
общий, и по одному элементу он не виден.
|
|
53
|
+
|
|
46
54
|
Чем сверить, что очередь работ в порядке:
|
|
47
55
|
|
|
48
56
|
```bash
|
|
@@ -161,6 +169,35 @@ PR [86] Письмо владельцу с незаполненным ад
|
|
|
161
169
|
Тип и область — `fix(site):`, `docs(common):` — в заголовок PR не идут: это формат заголовка
|
|
162
170
|
коммита, и там его сверяет `commitlint`.
|
|
163
171
|
|
|
172
|
+
## Не готовое к слиянию открывается черновиком
|
|
173
|
+
|
|
174
|
+
Правка кода отдаётся человеку открытым PR: запушенная ветка ему не показывается нигде. Открытый
|
|
175
|
+
PR при этом читается как приглашение влить, поэтому у незаконченной работы он открывается
|
|
176
|
+
черновиком — завершение у черновика хостинг блокирует сам:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
AZURE_DEVOPS_EXT_PAT="$TOKEN" az repos pr create --draft true --title '[<КЛЮЧ>-86] …' \
|
|
180
|
+
--description "$(cat тело.md)"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Конвейер проверок у черновика по умолчанию не запускается: молчание прогона за зелёный прогон
|
|
184
|
+
не принимается, и набор гоняется на своей машине либо запуском вручную.
|
|
185
|
+
|
|
186
|
+
Черновиком идёт всё, что ждёт прогона конвейера, доработки или ответа на вопрос. Вопрос
|
|
187
|
+
задаётся в самом PR, а не остаётся в голове исполнителя: человек читает PR, а не переписку
|
|
188
|
+
захода.
|
|
189
|
+
|
|
190
|
+
Снимается черновик отдельным вызовом, и это тот самый ход, которым исполнитель говорит, что
|
|
191
|
+
решение готово:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
AZURE_DEVOPS_EXT_PAT="$TOKEN" az repos pr update --id 86 --draft false
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
До снятия молчание исполнителя значит «ещё не готово», после — «можно вливать». Снятие
|
|
198
|
+
черновика и просьба влить идут одним ходом: снятый черновик, о котором человеку не сказали,
|
|
199
|
+
ждёт разбора ровно так же, как не снятый.
|
|
200
|
+
|
|
164
201
|
## PR привязывается к элементу при создании
|
|
165
202
|
|
|
166
203
|
Привязка задаётся флагом, а не правкой после: у токена может не быть права править чужой
|
|
@@ -187,7 +224,47 @@ az repos pr update --id 205 --description "$(cat тело.md)"
|
|
|
187
224
|
```
|
|
188
225
|
|
|
189
226
|
Правка описания переписывает его целиком. Тело перечитывается всякий раз, когда в ветку что-то
|
|
190
|
-
влилось после публикации:
|
|
227
|
+
влилось после публикации: PR утверждает про дерево, а дерево с тех пор изменилось.
|
|
228
|
+
|
|
229
|
+
## Образец тела PR
|
|
230
|
+
|
|
231
|
+
Четыре раздела, и порядок между ними один: строка связи, что сделано, чем подтверждено,
|
|
232
|
+
оставшийся шаг. Раздел, которому нечего сказать, пишется словами — пустой заголовок и снятый
|
|
233
|
+
заголовок читаются одинаково, а значат разное.
|
|
234
|
+
|
|
235
|
+
```markdown
|
|
236
|
+
Закрывает рабочий элемент 86.
|
|
237
|
+
|
|
238
|
+
## Что сделано
|
|
239
|
+
|
|
240
|
+
- <правка, названная тем, что она меняет для читателя, а не тем, какие файлы задела>
|
|
241
|
+
|
|
242
|
+
## Чем подтверждено
|
|
243
|
+
|
|
244
|
+
- <проверка>: <её вывод одной строкой>
|
|
245
|
+
- Не гонялось: <что в набор не вошло и почему>
|
|
246
|
+
|
|
247
|
+
## Оставшийся шаг
|
|
248
|
+
|
|
249
|
+
После одобрения ветка получает ещё один коммит — разбор папки задачи, — и только потом
|
|
250
|
+
вливается. До этого коммита вливать рано: папка уедет в главную ветку неразобранной.
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Раздел «Оставшийся шаг» стоит последним и переписывается тем же вызовом, что и остальное тело,
|
|
254
|
+
— в тот ход, которым папка разбирается и снимается черновик:
|
|
255
|
+
|
|
256
|
+
```markdown
|
|
257
|
+
## Оставшийся шаг
|
|
258
|
+
|
|
259
|
+
Не осталось: папка задачи разобрана коммитом `<sha>`, черновик снят. Можно вливать.
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Стоит он там потому, что решение о слиянии принимается на этой странице, а не в переписке:
|
|
263
|
+
сказанное владельцу вслух живёт до следующей реплики, а тело лежит у самой кнопки. Одно другого
|
|
264
|
+
не отменяет — порядок обоих сообщений владельцу описывает паттерн закрытия работы.
|
|
265
|
+
|
|
266
|
+
Проверить тело машиной нечем: ни одна сверка его не читает, а хостинг спрашивает только про
|
|
267
|
+
заголовок. Держится образец тем, кто пишет тело, — как и слова вслух.
|
|
191
268
|
|
|
192
269
|
## Состояние PR читается, а не додумывается
|
|
193
270
|
|
|
@@ -236,7 +313,10 @@ npm run task:move -- 86 in-review
|
|
|
236
313
|
`browser-verification-measure`.
|
|
237
314
|
9. **Правка разметки публичного сайта проверена на прод-сборке по всем локалям перевода** —
|
|
238
315
|
паттерн `seo-verify`.
|
|
239
|
-
10. **PR привязан к рабочему элементу**, ревьювер и исполнитель
|
|
316
|
+
10. **PR привязан к рабочему элементу**, ревьювер и исполнитель стоят, а тело собрано по
|
|
317
|
+
образцу — разделы «Что сделано», «Чем подтверждено» и «Оставшийся шаг». Раздел оставшегося
|
|
318
|
+
шага к этому моменту говорит, что шагов не осталось: черновик снимается после разбора
|
|
319
|
+
папки, а не до него.
|
|
240
320
|
11. **Заголовок PR несёт номер элемента и называет работу сделанной:** `[<номер>] <Что
|
|
241
321
|
сделано>`, тем же номером, что стоит у элемента и в имени ветки.
|
|
242
322
|
12. **Очередь работ сходится** — `npm run check:board`.
|
|
@@ -248,7 +328,7 @@ npm run task:move -- 86 in-review
|
|
|
248
328
|
15. **Набор пересмотрен после вливания главной ветки.** Он выбирается по тому, что ветка везёт
|
|
249
329
|
теперь, а не по тому, что правил автор. Ветка, не тронувшая ни строки показа, прогоняет
|
|
250
330
|
снимки витрин: с момента вливания их гоняет конвейер на её коде, и красное придёт на её
|
|
251
|
-
|
|
331
|
+
PR.
|
|
252
332
|
|
|
253
333
|
Сразу после публикации элемент переводится в разбор, и сверка очереди прогоняется ещё раз: до
|
|
254
334
|
открытия PR состояние она не судит, а после открытия расхождение видит.
|