@rt-tools/agent-kit 0.22.0 → 0.24.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 +8 -2
- package/assets/checks/board-long-work.github.mjs +101 -0
- package/assets/checks/board-runs.github.mjs +34 -0
- package/assets/checks/board.github.mjs +1 -1
- package/assets/checks/check-board.github.mjs +30 -2
- package/assets/checks/check-doc-paths.mjs +24 -5
- package/assets/checks/check-file-size.mjs +8 -2
- package/assets/checks/check-prose-style.mjs +10 -1
- package/assets/checks/check-reuse.mjs +4 -1
- package/assets/checks/check-schema-drift.mjs +65 -6
- package/assets/checks/rt-kit-checks.config.mjs +13 -0
- package/assets/checks/signals.mjs +41 -1
- package/assets/commands/next-session.md +16 -5
- package/assets/defaults/gate-map.sh +13 -0
- package/assets/defaults/project.sh +26 -0
- package/assets/defaults/shell.sh +18 -3
- package/assets/hooks/browser-guard-device-id.sh +42 -12
- package/assets/hooks/browser-guard-no-asking.sh +5 -1
- package/assets/hooks/dispatch.sh +40 -9
- package/assets/hooks/docs-guard.sh +10 -0
- package/assets/hooks/exam-guard.sh +66 -16
- package/assets/hooks/git-guard-delivery-draft.sh +78 -0
- package/assets/hooks/git-guard-delivery.sh +64 -122
- package/assets/hooks/git-guard-main.sh +39 -4
- package/assets/hooks/git-guard-push-tests.sh +71 -3
- package/assets/hooks/glossary-load.sh +23 -2
- package/assets/hooks/grill-gate.sh +62 -0
- package/assets/hooks/hook-input.sh +17 -6
- package/assets/hooks/rule-source-guard.sh +11 -0
- package/assets/hooks/stand-login-guard.sh +101 -0
- package/assets/hooks/write-targets.sh +37 -4
- package/assets/laws/autonomous-work.md +30 -0
- package/assets/laws/project-documentation.md +8 -0
- package/assets/laws/verifiability.md +12 -2
- package/assets/laws/work-conduct.md +59 -65
- package/assets/patterns/autonomous-work-run.md +105 -0
- package/assets/patterns/browser-verification-measure.md +41 -1
- package/assets/patterns/browser-verification-stand.md +57 -16
- package/assets/patterns/doc-style-human.md +75 -0
- package/assets/patterns/doc-style-write.md +16 -0
- package/assets/patterns/git-workflow-commit.azure.md +12 -0
- package/assets/patterns/git-workflow-commit.github.md +16 -3
- package/assets/patterns/git-workflow-commit.gitlab.md +12 -0
- package/assets/patterns/git-workflow-merge.md +8 -0
- package/assets/patterns/git-workflow-pr-ready.md +93 -0
- 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/task-flow-start.md +48 -48
- package/assets/patterns/testing-e2e.md +18 -8
- package/assets/patterns/ts-procedure.md +3 -2
- package/assets/pitfalls/task-flow.md +40 -40
- package/assets/rules/autonomous-work.md +92 -0
- package/assets/rules/browser-verification.md +35 -3
- package/assets/rules/deploy-flow.azure.md +7 -0
- package/assets/rules/deploy-flow.github.md +7 -0
- package/assets/rules/deploy-flow.gitlab.md +7 -0
- package/assets/rules/doc-style.md +54 -0
- package/assets/rules/git-workflow.azure.md +8 -0
- package/assets/rules/git-workflow.github.md +59 -63
- package/assets/rules/git-workflow.gitlab.md +8 -0
- package/assets/rules/reuse-first.md +25 -5
- package/assets/rules/styling-bem.md +8 -1
- package/assets/rules/task-flow.md +108 -109
- package/assets/rules/testing.md +21 -0
- package/assets/skills/agent-kit.md +72 -82
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +69 -2
- package/lib/commands.js.map +1 -1
- package/lib/enroll.d.ts.map +1 -1
- package/lib/enroll.js +1 -1
- package/lib/enroll.js.map +1 -1
- package/lib/observations.d.ts +10 -1
- package/lib/observations.d.ts.map +1 -1
- package/lib/observations.js +1 -0
- package/lib/observations.js.map +1 -1
- package/lib/override-marks.d.ts +24 -0
- package/lib/override-marks.d.ts.map +1 -0
- package/lib/override-marks.js +98 -0
- package/lib/override-marks.js.map +1 -0
- package/lib/push-gate.d.ts +14 -0
- package/lib/push-gate.d.ts.map +1 -0
- package/lib/push-gate.js +93 -0
- package/lib/push-gate.js.map +1 -0
- package/lib/shipment.d.ts.map +1 -1
- package/lib/shipment.js +1 -1
- package/lib/shipment.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.24.0.tgz +0 -0
- package/assets/laws/application/access.md +0 -34
- package/assets/laws/application/locales.md +0 -33
- package/assets/laws/application/search-visibility.md +0 -24
- package/assets/patterns/permissions-procedure.md +0 -71
- package/assets/patterns/seo-page.md +0 -104
- package/assets/patterns/seo-verify.md +0 -83
- package/assets/patterns/translations-content.md +0 -107
- package/assets/patterns/translations-key.md +0 -64
- package/assets/rules/permissions.md +0 -116
- package/assets/rules/seo.md +0 -139
- package/assets/rules/translations.md +0 -96
- package/rt-tools-agent-kit-0.22.0.tgz +0 -0
|
@@ -107,6 +107,17 @@ while IFS= read -r candidate; do
|
|
|
107
107
|
resource="$(head -12 "$candidate" 2>/dev/null | sed -nE 's/.*rt-kit v[^ ]+ · ([^ ]+) · [0-9a-f]+.*/\1/p' | head -1)"
|
|
108
108
|
[ -z "$resource" ] && continue
|
|
109
109
|
|
|
110
|
+
# Файл в конфликте пропускается наравне со снятым. Разрешение конфликта содержания копии не
|
|
111
|
+
# меняет — раскладка кладёт её заново, — а отбитый здесь исполнитель остаётся с наполовину
|
|
112
|
+
# слитой веткой и без законного хода: источник править нечего, надстройка конфликта не
|
|
113
|
+
# снимает. Признаков два, и хватает любого: запись индекса о неслитом файле и маркеры
|
|
114
|
+
# слияния в самом файле — второй нужен там, где слияние ведёт не git, а сторонний
|
|
115
|
+
# инструмент, оставляющий маркеры без записи в индексе.
|
|
116
|
+
if [ -n "$(git -C "$root" ls-files -u -- "$candidate" 2>/dev/null)" ] \
|
|
117
|
+
|| grep -qE '^(<<<<<<< |>>>>>>> )' "$candidate" 2>/dev/null; then
|
|
118
|
+
continue
|
|
119
|
+
fi
|
|
120
|
+
|
|
110
121
|
if [ -n "$sources" ] && [ -f "$root/$sources/$resource" ]; then
|
|
111
122
|
deny "BLOCKED by rule-source-guard: «${candidate#"$root"/}» разложен пакетом, и правка на его месте теряется на следующей раскладке — а до тех пор раскладка отказывает по этому файлу целиком, и цену платит тот, кто в этот день правит соседний ресурс. Ресурс — «${resource}». Правь источник: ${sources}/${resource} — потом собери пакет и разложи." \
|
|
112
123
|
"правка, верная только этому дереву, идёт в надстройку .claude/rt-kit/overrides/${resource} — она сливается по разделу «## » и раскладку переживает"
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rt-hook: Stop
|
|
3
|
+
# Требует: hooks/deny-tail.sh
|
|
4
|
+
# Гард входа на стенд. Событие Stop. Не даёт завершить ход, в котором исполнитель просит
|
|
5
|
+
# владельца войти на стенд или ввести пароль.
|
|
6
|
+
#
|
|
7
|
+
# Зачем. Стенд, вход и учётные записи для проверки готовит агент. Это требование держалось только на
|
|
8
|
+
# памяти исполнителя и не сработало: за один заход просьба «войди сам» или «введи пароль»
|
|
9
|
+
# прозвучала четыре раза подряд, каждый раз с новой причиной — поле не принимает ввод, в браузере
|
|
10
|
+
# стоит чужое расширение, профиль отключился. Причина настоящая, поэтому просьба выглядит
|
|
11
|
+
# уместной; но снимать препятствие всё равно должен агент.
|
|
12
|
+
#
|
|
13
|
+
# Гард стоит на завершении хода, а не на вызове инструмента: просьба пишется текстом ответа, и
|
|
14
|
+
# до конца хода её не видно.
|
|
15
|
+
#
|
|
16
|
+
# Граница. Гард проверяет набор образцов: глагол просьбы рядом со словом о пароле, входе или
|
|
17
|
+
# форме. Просьбу другими словами или через меню вариантов гард не распознаёт. Набор пополняется
|
|
18
|
+
# правкой; его полнота не гарантируется.
|
|
19
|
+
#
|
|
20
|
+
# Что разрешено: просьба переключить обычный режим работы вместо автоматического. Ввод делает
|
|
21
|
+
# агент, у владельца просят только режим — гард различает эти просьбы.
|
|
22
|
+
#
|
|
23
|
+
# При ошибке гард пропускает: при сбое, отсутствии записи хода и повторном заходе ход
|
|
24
|
+
# разрешается. Сломанный гард не должен блокировать разговор.
|
|
25
|
+
|
|
26
|
+
# Имя гарда для наблюдений: его пишет общий хвост отказа.
|
|
27
|
+
RT_GUARD_NAME=stand-login-guard
|
|
28
|
+
|
|
29
|
+
. "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/utf8.sh" 2>/dev/null || true
|
|
30
|
+
. "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/hook-input.sh" 2>/dev/null || true
|
|
31
|
+
|
|
32
|
+
rt_hook_read
|
|
33
|
+
input="$RT_HOOK_INPUT"
|
|
34
|
+
[ -z "$input" ] && exit 0
|
|
35
|
+
|
|
36
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
37
|
+
|
|
38
|
+
# Повторный заход по тому же ходу не проверяется: гард сообщает отказ один раз.
|
|
39
|
+
active="$(printf '%s' "$input" | jq -r '.stop_hook_active // false' 2>/dev/null)"
|
|
40
|
+
[ "$active" = "true" ] && exit 0
|
|
41
|
+
|
|
42
|
+
transcript="$(printf '%s' "$input" | jq -r '.transcript_path // empty' 2>/dev/null)"
|
|
43
|
+
[ -z "$transcript" ] && exit 0
|
|
44
|
+
[ -f "$transcript" ] || exit 0
|
|
45
|
+
|
|
46
|
+
# Образцы просьбы. Первая группа — просьба сделать ввод за агента, вторая — просьба войти
|
|
47
|
+
# самому. Слово о режиме работы в набор не входит: его просить разрешено.
|
|
48
|
+
asked_re='(введи|введите|набери|наберите|вбей|вбейте|заполни|заполните|подставь|вставь)[^.!?\n]{0,40}(пароль|учётн|учетн|логин|креды|форму входа)'
|
|
49
|
+
asked_re="$asked_re"'|(войди|войдите|залогинься|залогиньтесь|авторизуйся|авторизуйтесь)[^.!?\n]{0,40}(сам|сами|рукой|руками|за меня|вместо меня|пожалуйста)?'
|
|
50
|
+
asked_re="$asked_re"'|(нужно|надо|прошу)[^.!?\n]{0,20}(чтобы ты|чтобы вы)?[^.!?\n]{0,20}(ввёл|ввел|ввели|вошёл|вошел|вошли)[^.!?\n]{0,30}(пароль|вход|систему)'
|
|
51
|
+
|
|
52
|
+
# Ход — всё, что записано после последнего настоящего ввода владельца. Ответ инструмента
|
|
53
|
+
# приходит с той же ролью, поэтому строки с `tool_result` вводом не считаются.
|
|
54
|
+
#
|
|
55
|
+
# Читаются последние 400 строк: запись растёт весь заход, а проверяется только последний ход.
|
|
56
|
+
verdict="$(tail -n 400 "$transcript" 2>/dev/null | jq -s -r --arg re "$asked_re" '
|
|
57
|
+
def is_input:
|
|
58
|
+
.type == "user"
|
|
59
|
+
and ((.isCompactSummary // false) | not)
|
|
60
|
+
and (((.message.content // []) | if type == "array"
|
|
61
|
+
then ([.[] | select(.type == "tool_result")] | length)
|
|
62
|
+
else 0 end) == 0);
|
|
63
|
+
|
|
64
|
+
(map(is_input) | rindex(true)) as $i
|
|
65
|
+
| (if $i == null then . else .[$i + 1:] end) as $turn
|
|
66
|
+
| [$turn[] | select(.type == "assistant") | (.message.content // [])[] | select(.type == "text") | .text] as $texts
|
|
67
|
+
# Регистр игнорируется флагом, а не приведением к нижнему: приведение работает только для
|
|
68
|
+
# латиницы, и «Введи пароль» с заглавной буквы не совпало бы с образцом.
|
|
69
|
+
| if (($texts | join("\n")) | test($re; "i")) then "asked" else "pass" end
|
|
70
|
+
' 2>/dev/null)"
|
|
71
|
+
|
|
72
|
+
[ "$verdict" = "asked" ] || exit 0
|
|
73
|
+
|
|
74
|
+
reason="BLOCKED by stand-login-guard: исполнитель просит владельца войти или ввести пароль. Стенд, вход и учётные записи для проверки готовит агент. Препятствие перед просьбой — поле не принимает ввод, чужое расширение в браузере, отключившийся профиль — снимает агент.
|
|
75
|
+
|
|
76
|
+
Как снять препятствие самостоятельно:
|
|
77
|
+
|
|
78
|
+
подставить значение инструментом формы по ссылке на элемент
|
|
79
|
+
выключить мешающее расширение в профиле браузера
|
|
80
|
+
поднять стенд на другом адресе
|
|
81
|
+
войти парой из засева местной базы вместо боевой учётной записи
|
|
82
|
+
|
|
83
|
+
У владельца просят режим работы, а не ввод: обычный режим вместо автоматического; вход в нём делает агент и возвращает автоматический режим тем же ходом.
|
|
84
|
+
|
|
85
|
+
Гард проверяет один ход: следующий заход не блокируется."
|
|
86
|
+
|
|
87
|
+
# Общий хвост отказа: два допустимых шага. Файл может быть не разложен — тогда хвоста нет,
|
|
88
|
+
# причина отказа остаётся.
|
|
89
|
+
# shellcheck disable=SC1090
|
|
90
|
+
[ -f "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/deny-tail.sh" ] \
|
|
91
|
+
&& . "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/deny-tail.sh" 2>/dev/null
|
|
92
|
+
command -v rt_deny_tail >/dev/null 2>&1 || rt_deny_tail() { :; }
|
|
93
|
+
deny_tail_text="$(rt_deny_tail "")"
|
|
94
|
+
[ -n "$deny_tail_text" ] && reason="${reason}
|
|
95
|
+
|
|
96
|
+
${deny_tail_text}"
|
|
97
|
+
|
|
98
|
+
jq -n --arg r "$reason" '{decision:"block",reason:$r}' 2>/dev/null \
|
|
99
|
+
|| printf '{"decision":"block","reason":"stand-login-guard: вход на стенд делает агент, а не владелец."}\n'
|
|
100
|
+
|
|
101
|
+
exit 0
|
|
@@ -26,6 +26,15 @@
|
|
|
26
26
|
rt_write_targets() {
|
|
27
27
|
rt_wt_text="$(cat)"
|
|
28
28
|
|
|
29
|
+
# Перенаправление в пустое устройство и в поток ошибок снимается до разбора — тем же приёмом,
|
|
30
|
+
# каким его снимает признак записи оболочкой. Без этого заглушённый вывод внутри тела
|
|
31
|
+
# интерпретатора читается признаком записи, и тело, которое ничего не пишет, снова отдаёт все
|
|
32
|
+
# свои пути: команда с правкой одного файла и запуском проверки рядом запрещалась по пути
|
|
33
|
+
# этой проверки. Настоящая запись рядом с заглушённым потоком остаётся видной: снимается
|
|
34
|
+
# перенаправление, а не команда целиком.
|
|
35
|
+
rt_wt_text="$(printf '%s' "$rt_wt_text" \
|
|
36
|
+
| sed -E 's#(&|[0-9]*)>>?[[:space:]]*/dev/(null|stderr)##g; s#[0-9]*>&[0-9-]##g')"
|
|
37
|
+
|
|
29
38
|
{
|
|
30
39
|
printf '%s' "$rt_wt_text" \
|
|
31
40
|
| tr "\"'\`" ' ' \
|
|
@@ -49,17 +58,38 @@ rt_write_targets() {
|
|
|
49
58
|
if (parts[i] ~ /\// && parts[i] ~ /\.[A-Za-z0-9]+$/) { print parts[i] }
|
|
50
59
|
}
|
|
51
60
|
}
|
|
61
|
+
# Пишет ли тело хоть что-нибудь. Тело, в котором нет ни одного вызова записи, своих
|
|
62
|
+
# путей не отдаёт: команда, подключившая разложенный помощник и напечатавшая его
|
|
63
|
+
# ответ, запрещалась как правка этого помощника — за один заход трижды подряд.
|
|
64
|
+
# Внутри тела, которое пишет, пути по-прежнему берутся все: путь и вызов записи
|
|
65
|
+
# стоят там разными строками, и связать их нечем.
|
|
66
|
+
function writes(s) {
|
|
67
|
+
return s ~ /open[ \t]*\([^)]*[\047\"](w|a|r\+|w\+|a\+)[\047\"]/ \
|
|
68
|
+
|| s ~ /writeFileSync|writeFile|appendFile|write_text|write_bytes|\.write\(|\.save\(|savefig|to_csv|json\.dump|\.dump\(/ \
|
|
69
|
+
|| s ~ /makedirs|mkdir|rename|replace[ \t]*\(|unlink|rmtree|copyfile|copy2|shutil\./ \
|
|
70
|
+
|| s ~ />[ \t]*[A-Za-z0-9_.~$\/-]/ \
|
|
71
|
+
|| s ~ /(^|[|;&(]|[ \t])(tee|cp|mv|rm|touch|install|truncate)([ \t]|$)/
|
|
72
|
+
}
|
|
52
73
|
function trim(s) { sub(/^[ \t]+/, "", s); sub(/[ \t]+$/, "", s); return s }
|
|
74
|
+
function flush_body() {
|
|
75
|
+
if (wrote) { emit(body) }
|
|
76
|
+
body = ""
|
|
77
|
+
wrote = 0
|
|
78
|
+
}
|
|
53
79
|
tag != "" {
|
|
54
|
-
if (trim($0) == tag) { tag = ""; next }
|
|
55
|
-
if (keep) {
|
|
80
|
+
if (trim($0) == tag) { flush_body(); tag = ""; next }
|
|
81
|
+
if (keep) {
|
|
82
|
+
body = body " " $0
|
|
83
|
+
if (writes($0)) { wrote = 1 }
|
|
84
|
+
}
|
|
56
85
|
next
|
|
57
86
|
}
|
|
58
87
|
{
|
|
59
88
|
# Код доводом: всё, что стоит за `-c` или `-e` у интерпретатора.
|
|
60
89
|
if ($0 ~ /(^|[|;&(]|[ \t])(python3?|node|ruby|perl|php|deno|bun)([ \t]|$)/ \
|
|
61
90
|
&& match($0, /[ \t]-[ce][ \t]/)) {
|
|
62
|
-
|
|
91
|
+
rest = substr($0, RSTART + RLENGTH)
|
|
92
|
+
if (writes(rest)) { emit(rest) }
|
|
63
93
|
}
|
|
64
94
|
# Тело heredoc: путь записи интерпретатора стоит именно там.
|
|
65
95
|
if (match($0, /<<-?[ \t]*[\047\"]?[A-Za-z_][A-Za-z0-9_]*/)) {
|
|
@@ -67,7 +97,10 @@ rt_write_targets() {
|
|
|
67
97
|
sub(/^<<-?[ \t]*[\047\"]?/, "", t)
|
|
68
98
|
tag = t
|
|
69
99
|
keep = ($0 ~ /(^|[|;&(]|[ \t])(python3?|node|ruby|perl|php|deno|bun)([ \t]|$)/)
|
|
100
|
+
body = ""
|
|
101
|
+
wrote = 0
|
|
70
102
|
}
|
|
71
|
-
}
|
|
103
|
+
}
|
|
104
|
+
END { if (tag != "") { flush_body() } }'
|
|
72
105
|
} | sort -u
|
|
73
106
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
чём из четырёх.
|
|
29
|
+
- **Отказ стража автономный заход не кончает.** Он называет пропущенный шаг, и шаг делается;
|
|
30
|
+
заход, вставший на отказе до утра, теряет ночь целиком.
|
|
@@ -43,6 +43,14 @@
|
|
|
43
43
|
- **Число в тексте пересчитывается тем же изменением, которым пишется, и за этим тоже следит
|
|
44
44
|
автор.** Устаревшее число выглядит так же, как свежее, а машине их не различить: дата, версия и
|
|
45
45
|
номер — такие же числа, и проверка, которая знает один способ записи, на другом ошибается молча.
|
|
46
|
+
- **Слово, значащее в дереве что-то определённое, записано в словаре дерева.** Слова, которого
|
|
47
|
+
там нет, у читателя нет тоже: оно вводится в словарь тем же изменением, которым впервые
|
|
48
|
+
употреблено, либо заменяется тем, что уже есть. Словарь читается до того, как текст написан, а
|
|
49
|
+
не сверяется после: сверка после находит слово, вокруг которого уже построен абзац.
|
|
50
|
+
- **Документ, собираемый из нескольких источников, правится в источнике.** Правка собранного вида
|
|
51
|
+
живёт до следующей сборки и пропадает молча — а выглядит она ровно так же, как правка, которая
|
|
52
|
+
осталась. Собранный документ обязан называть свой источник в себе самом: сказанное о нём где-то
|
|
53
|
+
ещё до читателя может не доехать, а собранный вид доезжает всегда.
|
|
46
54
|
- **Отказ от слова распространяется на всё, что уже прочитано снаружи, а не только на файлы.**
|
|
47
55
|
Название работы, её описание и запись о правке живут вне дерева: поиск по файлам их не видит,
|
|
48
56
|
проверки текстов на них не смотрят, и отказ выглядит сделанным ровно до того, как читатель
|
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
который «должен работать», и код, который проверили, в истории выглядят одинаково.
|
|
6
6
|
|
|
7
7
|
## Статьи
|
|
8
|
+
- **Тест пишется до кода и до правки падает.** Написанный после, он проверяет не обещание, а то,
|
|
9
|
+
что получилось: автор читает свой же код и подгоняет ожидание под него, поэтому такой тест
|
|
10
|
+
зелен с первого прогона и не ловит ничего. Падение до правки — единственное доказательство, что
|
|
11
|
+
тест смотрит туда, куда надо; тест, ни разу не показанный красным, покрытием не считается.
|
|
12
|
+
- **Правка, которую нечем показать красным, называет это словом и говорит, чем закрыта.** Так
|
|
13
|
+
бывает: оформление, которого не видит спека, конфигурация, чужая служба. Молчаливый пропуск шага
|
|
14
|
+
выглядит в истории так же, как пройденный, и отличить их потом нечем.
|
|
8
15
|
- **Обещанное поведение названо сценарием, а сценарий назван в тесте, который его проверяет.**
|
|
9
16
|
Иначе связь между обещанием и проверкой держится только на памяти автора.
|
|
10
17
|
- **Сценарий без теста помечен как непокрытый и виден в сводке.** Молчаливый пропуск выглядит так
|
|
@@ -81,8 +88,11 @@
|
|
|
81
88
|
род события и версия одинаковы везде, где стоит слой правил; путь, домен и имя дерева
|
|
82
89
|
принадлежат одному дереву и в чужом месте не значат ничего, кроме утечки. Держится это проверкой
|
|
83
90
|
на выносящей стороне, а не памятью того, кто пишет.
|
|
84
|
-
- **Проверка, которая сама сломалась, работу не останавливает.** Отказ инструмента не
|
|
85
|
-
найденным нарушением, и остановленная им работа
|
|
91
|
+
- **Проверка, которая сама сломалась, работу не останавливает.** Отказ инструмента не считается
|
|
92
|
+
найденным нарушением, и остановленная им работа стоит, пока его не починят. Выход один, и он
|
|
93
|
+
назван в самом отказе: исполнитель разбирает отказы поимённо, показывает владельцу разбор —
|
|
94
|
+
сколько строк, какого рода, чем доказана их ложность — и чинит саму проверку. Список известного
|
|
95
|
+
для этого не используется: он хранит принятое, а не результаты сломанной проверки.
|
|
86
96
|
- **Решение, зависящее от текущего момента, получает момент снаружи.** Иначе проверить его можно
|
|
87
97
|
только подкруткой часов, а подкрученные часы действуют и на всё, что оказалось рядом: проверка
|
|
88
98
|
начинает зависеть от того, что к ней отношения не имеет.
|
|
@@ -9,55 +9,48 @@
|
|
|
9
9
|
- **Пробел закрывается вопросом владельцу, а не догадкой.** Догадка неотличима от знания: она
|
|
10
10
|
попадает в работу молча и обнаруживается только при приёмке, когда переделывать дороже всего.
|
|
11
11
|
- **Работа, которая требует изменений по образцу, начинается с чтения самого образца.** Пересказ
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
образцом не считается: расхождение всплывает на приёмке целой работой, а не строкой. Читается та
|
|
13
|
+
часть образца, которую работа повторяет, и читается целиком — об устройстве чужого дерева по
|
|
14
|
+
одному его файлу не судят.
|
|
15
15
|
- **Образец, указанный в ходе работы должен быть доступен каждой сессии во время работы.** Ссылка
|
|
16
16
|
на образец нужно указывать непосредственно в файле с описанием прогресса работы.
|
|
17
17
|
- **Вопрос, у которого есть очевидный ответ, работу не останавливает.** Исполнитель называет
|
|
18
18
|
допущение, идёт дальше и записывает его туда же, где идёт работа. Останавливает только тот
|
|
19
|
-
пробел, при котором любая догадка делает работу опасной или бесполезной.
|
|
20
|
-
работы, выглядит добросовестно, а стоит владельцу захода.
|
|
19
|
+
пробел, при котором любая догадка делает работу опасной или бесполезной.
|
|
21
20
|
- **Остановка называется первой строкой.** Сообщение, которым исполнитель останавливается,
|
|
22
21
|
начинается с того, чего он ждёт и что будет, если ответа не будет. Замеры, находки и разбор к
|
|
23
|
-
этому моменту уже записаны в ход работы — в сообщении владельцу они лишние.
|
|
24
|
-
тем надёжнее вопрос в нём тонет, и владелец переспрашивает, почему работа стоит.
|
|
22
|
+
этому моменту уже записаны в ход работы — в сообщении владельцу они лишние.
|
|
25
23
|
- **Владельцу не задаётся вопрос, ответ на который уже записан.** Записанное читают до разговора,
|
|
26
24
|
а не вместо ответа: вопрос о том, что уже решено, обесценивает и остальные.
|
|
27
25
|
- **Вопрос владельцу задаётся после того, как ответ искали в дереве.** Что лежит в дереве,
|
|
28
26
|
исполнитель узнаёт сам: имя, путь, наличие файла и устройство репозитория он берёт командой, а
|
|
29
|
-
не у владельца.
|
|
30
|
-
обесценивает заданные рядом.
|
|
27
|
+
не у владельца.
|
|
31
28
|
- **Утверждение о дереве стоит ровно столько, сколько команда, его показавшая.** Отрицание —
|
|
32
29
|
«здесь нет», «этого не заводили», «такого файла не бывает» — произносится только как вывод
|
|
33
30
|
команды. Не проверенное отрицание опаснее вопроса: вопрос владелец поправит, а факт от
|
|
34
31
|
исполнителя примет на веру, потому что тот в дерево смотрит.
|
|
35
32
|
- **Пустой вывод утверждением не бывает.** Он значит либо «ноль строк», либо «спрошено не то», и
|
|
36
|
-
различает эти два только повторный вызов — без конвейера и без глушения потока
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
источника — иначе исполнитель называет владельцу собственные права, приняв их за устройство
|
|
44
|
-
мира.
|
|
33
|
+
различает эти два только повторный вызов — без конвейера и без глушения потока ошибок. Пока
|
|
34
|
+
такой вызов не сделан, о дереве не сказано ничего, а «ничего нет» отменяет работу, которую
|
|
35
|
+
владелец велел сделать.
|
|
36
|
+
- **Отрицание, полученное одним источником, отрицанием не считается.** Ответ «не найдено», отказ в
|
|
37
|
+
доступе и пустой список говорят о правах спрашивающего, а не о предмете. Сказать «этого нет»
|
|
38
|
+
можно только после второго источника — иначе исполнитель называет владельцу собственные права,
|
|
39
|
+
приняв их за устройство мира.
|
|
45
40
|
- **Решение, однажды записанное, действует, пока его не отменили, и читается до того, как
|
|
46
41
|
принимается заново.** Отменённое решение следа в работе не оставляет — по результату не видно ни
|
|
47
42
|
того, что его принимали, ни того, что от него отказались. Принятое заново оно расходится с
|
|
48
43
|
прежним молча и стоит той же работы второй раз.
|
|
49
44
|
- **Решение, которое переживёт задачу, записывается там, где оно переживёт.** Ход работы умирает
|
|
50
45
|
вместе с папкой задачи, а имя, адрес и выбранный способ, названные владельцем посреди серии
|
|
51
|
-
работ, нужны следующим её задачам. Не переехавшее решение
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
работ, нужны следующим её задачам. Не переехавшее решение живёт только в переписке своего
|
|
47
|
+
захода: следующий делает разведку честно, не находит ничего — и спрашивает владельца о том, на
|
|
48
|
+
что тот уже отвечал.
|
|
54
49
|
- **Инструмент, названный в просьбе, входит в просьбу.** Замена его на свой — отступление от
|
|
55
50
|
просьбы, даже когда свой даёт тот же ответ: равноценность инструментов решает тот, кто просит.
|
|
56
|
-
Одинаковый результат равноценностью не является — у названного инструмента бывает видно то,
|
|
57
|
-
чего у заменителя нет вовсе.
|
|
58
51
|
- **Случившаяся подмена называется в том же докладе.** Чем сделано вместо названного и почему —
|
|
59
52
|
двумя словами, рядом с ответом на просьбу. Без этой строки владелец узнаёт о подмене, повторяя
|
|
60
|
-
|
|
53
|
+
указание, и платит за работу дважды.
|
|
61
54
|
- **Понимание записано там, где идёт работа.** Оставленное в переписке живёт у одного участника и
|
|
62
55
|
до следующего дня; работу продолжает тот, у кого этой переписки нет.
|
|
63
56
|
- **Сказанное владельцем записывается его словами и задним числом не переписывается.** Пересказ
|
|
@@ -79,9 +72,8 @@
|
|
|
79
72
|
Владелец знает, что работа не кончена, но не знает, где именно она стоит; пересказ он даёт по
|
|
80
73
|
своей памяти, а не по ходу работы, и следующий заход начинает с чужой картины.
|
|
81
74
|
- **Переданное прошлым заходом приходит в новый заход само, а не кладётся рукой.** Передача,
|
|
82
|
-
написанная и не прочитанная, равна ненаписанной: следующий заход
|
|
83
|
-
|
|
84
|
-
пока это не поручено машине; поручённое машине не забывается ночью.
|
|
75
|
+
написанная и не прочитанная, равна ненаписанной: следующий заход начинает с пустого места — с
|
|
76
|
+
того же, ради чего её и писали. Поручённое машине не забывается ночью.
|
|
85
77
|
- **Порядок ведения работы приходит в заход вместе с работой, а не разыскивается им.** Заход,
|
|
86
78
|
знающий задачу и не знающий, что с ней делают дальше, первым движением читает правило целиком —
|
|
87
79
|
и тратит место, ради которого его и начали заново. Приходит короткая выжимка: состояния,
|
|
@@ -100,7 +92,7 @@
|
|
|
100
92
|
документа, — делается по слову владельца, и слово это даётся на действие, а не на работу
|
|
101
93
|
целиком. Не названная списком граница выводится из общих слов: «делай, что нужно по плану»
|
|
102
94
|
прочитывается как разрешение на всё, что в плане подразумевалось.
|
|
103
|
-
- **Признак закрытия работы назван до её начала и проверяем.** «Работает» признаком не
|
|
95
|
+
- **Признак закрытия работы назван до её начала и проверяем.** «Работает» признаком не считается:
|
|
104
96
|
под ним каждый заход понимает своё, и работа закрывается тогда, когда надоела.
|
|
105
97
|
- **Начатая и брошенная работа видна.** Брошенное на середине выглядит так же, как нетронутое, и
|
|
106
98
|
второй заход начинает его заново.
|
|
@@ -110,14 +102,13 @@
|
|
|
110
102
|
уже никто не следит: работа перешла к следующей задаче, а правки, которой это убрали бы заодно,
|
|
111
103
|
больше нет.
|
|
112
104
|
- **Достаточность понимания судит тот, кто просил.** Машине видно наличие записи, но не то, что в
|
|
113
|
-
ней закрыты все
|
|
114
|
-
|
|
115
|
-
добирает его, не приближаясь к пониманию.
|
|
105
|
+
ней закрыты все пробелы. Признак достаточности, выведенный из объёма или числа вопросов, сам
|
|
106
|
+
становится целью — исполнитель добирает его, не приближаясь к пониманию.
|
|
116
107
|
- **Незаданный вопрос замечает только тот, кто знает, чего хотел.** Вопрос, которого не задали,
|
|
117
108
|
следа не оставляет: работа выглядит понятой ровно до приёмки, и вывести отсутствие вопроса не из
|
|
118
109
|
чего.
|
|
119
110
|
- **Происшествие названо признаком, а не оценкой заднего числа.** Происшествие — заход, в котором
|
|
120
|
-
исполнитель сделал не то, а слой правил этого не отбил. Дефект в коде происшествием не
|
|
111
|
+
исполнитель сделал не то, а слой правил этого не отбил. Дефект в коде происшествием не считается:
|
|
121
112
|
его объясняет договорённость о продукте. Признак записан один раз, а не выводится каждым заходом
|
|
122
113
|
заново — иначе его назначает тот, кому он мешает.
|
|
123
114
|
- **Происшествие кончается записью, и запись делается в тот же заход.** Через день механизм
|
|
@@ -128,9 +119,9 @@
|
|
|
128
119
|
предложения, ни правки закона, правила или паттерна, — жалоба: он объясняет случившееся и ничего
|
|
129
120
|
не меняет, а значит повторится.
|
|
130
121
|
- **Закрытая работа оставляет то, что узнала о правилах, там, откуда это возьмёт машина.**
|
|
131
|
-
Понимание, добытое одной работой, всего дороже соседней — и живёт оно
|
|
132
|
-
|
|
133
|
-
|
|
122
|
+
Понимание, добытое одной работой, всего дороже соседней — и живёт оно до конца захода, если
|
|
123
|
+
осталось в разговоре. Записанное свободным пересказом переносится руками, то есть до первой
|
|
124
|
+
занятой недели.
|
|
134
125
|
- **У предложенной правки правил назван адрес: сам слой правил, имена этого дерева или его
|
|
135
126
|
надстройка.** Без адреса правку кладут туда, где она видна автору, — то есть в своё дерево, — и
|
|
136
127
|
общее оседает в одном месте, оставаясь неизвестным всем остальным.
|
|
@@ -138,7 +129,7 @@
|
|
|
138
129
|
отправленное лежит в дереве неотличимо от отправленного: своей записи в слое правил у него нет,
|
|
139
130
|
и владелец читает работу сделанной, пока не спросит прямо. Слово владельца о предложении —
|
|
140
131
|
«отправь», «заведи», «напиши» — распоряжение, а не тема разговора; показ того, что уехало бы,
|
|
141
|
-
отправкой не
|
|
132
|
+
отправкой не считается и следа наружу не оставляет.
|
|
142
133
|
- **Неудобство отправки — повод сказать о нём, а не повод не отправить.** Довод исполнителя против
|
|
143
134
|
уже принятого решения владельца остаётся доводом: он называется вслух, работа при этом идёт.
|
|
144
135
|
Отложить исполненное решение может только владелец; отложенное собственным доводом выглядит для
|
|
@@ -148,19 +139,17 @@
|
|
|
148
139
|
в голове того, кто её задумал: следующий заход видит разрозненные задачи, порядка между ними не
|
|
149
140
|
находит и берёт ту, что ближе лежит.
|
|
150
141
|
- **Замысел эпика называет разрабатываемую возможность, состав задач и их порядок.** Состав без
|
|
151
|
-
порядка порядком не
|
|
142
|
+
порядка порядком не считается: две задачи, у которых порядок держался пониманием, ушли в работу
|
|
152
143
|
наоборот, и вторая переделывалась под первую. Возможность, названная одним словом, через неделю
|
|
153
144
|
читается каждым по-своему.
|
|
154
145
|
- **Порядок задач эпика назначается на планировании и держится до его конца.** Пересмотр по ходу —
|
|
155
146
|
решение владельца, записанное там же, где идёт работа. Порядок, назначаемый заново перед каждой
|
|
156
147
|
задачей, назначает тот, кому ближе, и эпик кончается там, где надоел.
|
|
157
148
|
- **Каждая задача объявленного эпика получает свою карточку в очереди работ сразу, а не в день,
|
|
158
|
-
когда за неё берутся.** Замысел эпика держит порядок для того, кто
|
|
159
|
-
для того, кто на неё смотрит, и
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
задачу словами, на «взять следующую» отвечает названием, и карточку заводят заново — с другим
|
|
163
|
-
номером.
|
|
149
|
+
когда за неё берутся.** Замысел эпика держит порядок для того, кто ведёт работу; очередь работ —
|
|
150
|
+
для того, кто на неё смотрит, и эпик с одной карточкой из десяти выглядит там работой на один
|
|
151
|
+
шаг. Номер карточки встаёт в замысел той же правкой: иначе на «взять следующую» замысел
|
|
152
|
+
отвечает названием, и карточку заводят заново с другим номером.
|
|
164
153
|
- **Заход исполнителя не кончается вместе с задачей.** Конец задачи — не признак остановки:
|
|
165
154
|
остановиться позволяет только предел заполнения окна. Заход, закрытый на готовой задаче,
|
|
166
155
|
оставляет владельцу пустое место и стоит целого захода на возвращение к тому, что и так было под
|
|
@@ -177,9 +166,8 @@
|
|
|
177
166
|
удовлетворяет, а работу не спасает.
|
|
178
167
|
- **Переход из состояния в состояние исполнителя не останавливает.** Обязательное действие сделано
|
|
179
168
|
— следующее начинается тем же движением, без отчёта владельцу и без его слова. Граница между
|
|
180
|
-
состояниями выглядит законченным
|
|
181
|
-
|
|
182
|
-
Владелец читает такой отчёт как сделанную работу, а работа стоит.
|
|
169
|
+
состояниями выглядит законченным куском, и отчёт встаёт на место следующего действия: владелец
|
|
170
|
+
читает его как сделанную работу, а работа стоит.
|
|
183
171
|
- **Текст, ведущий состояние работы, называет, что делается сразу за ним.** Дочитанный до
|
|
184
172
|
последнего приёма, он кончается ничем: следующего движения в нём нет, и исполнитель выводит его
|
|
185
173
|
из пустоты — то есть останавливается. Названное движение стоит там же, где приёмы, и своими
|
|
@@ -187,13 +175,12 @@
|
|
|
187
175
|
- **Работа, отданная на разбор, освобождает исполнителя, а не останавливает его.** Отданное на
|
|
188
176
|
разбор ждёт владельца, а не машину: следующая задача эпика берётся тем же движением, которым
|
|
189
177
|
предыдущая ушла на разбор.
|
|
190
|
-
- **Ожидание машины работой не занимают.**
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
случаи, где дальше и вправду не пройти: следующая задача стоит на неразобранной, или правка ждёт
|
|
178
|
+
- **Ожидание машины работой не занимают.** Проверка на стороне не идёт быстрее оттого, что на неё
|
|
179
|
+
смотрят. Пока она идёт, берётся следующая задача, а к проверке возвращаются тем ходом, которым
|
|
180
|
+
читают её конец. Заход, проведённый в ожидании, стоит столько же, сколько заход со сделанной
|
|
181
|
+
задачей, и не даёт ничего.
|
|
182
|
+
- **Ожидание, которое всё-таки останавливает работу, называется владельцу отдельно и прямо.** Иногда
|
|
183
|
+
дальше не пройти: следующая задача стоит на неразобранной, или правка ждёт
|
|
197
184
|
решения, которого нет ни у кого, кроме владельца. Тогда исполнитель говорит три вещи — что
|
|
198
185
|
стоит, чего ждёт и что владелец может с этим сделать. Сказанное вперемешку с отчётом не
|
|
199
186
|
читается: остановка называется отдельно.
|
|
@@ -207,8 +194,8 @@
|
|
|
207
194
|
за собой» от «готово, забирай». Не названное, оно не существует, и владелец действует по тому,
|
|
208
195
|
что видит.
|
|
209
196
|
- **Работа не считается готовой, пока исполнитель не сказал этого прямо.** Готовность объявляет
|
|
210
|
-
тот, кто работу вёл, — отдельной просьбой и про эту работу. Зелёные проверки
|
|
211
|
-
|
|
197
|
+
тот, кто работу вёл, — отдельной просьбой и про эту работу. Зелёные проверки — не
|
|
198
|
+
готовность: они говорят, что не сломано, и молчат о том, осталось ли что-то сделать. Молчание
|
|
212
199
|
исполнителя владелец читает как готовность, и между двумя прочтениями теряется всё, что стояло
|
|
213
200
|
после разбора.
|
|
214
201
|
- **Уборка за работой идёт до того, как о готовности сказано.** Всё, что работа обязана убрать за
|
|
@@ -217,12 +204,21 @@
|
|
|
217
204
|
- **Постоянное указание среды исполнения слабее правила дерева.** Среда описывает своё
|
|
218
205
|
умолчание и о дереве не знает; дерево вправе его отменить и отменяет молча — тем, что говорит
|
|
219
206
|
иначе. Расхождение разрешается в пользу дерева, а не того из двух текстов, который строже
|
|
220
|
-
сформулирован или ближе стоит к делу. Опознаётся оно чтением
|
|
221
|
-
|
|
207
|
+
сформулирован или ближе стоит к делу. Опознаётся оно чтением обоих: сличить указание среды с
|
|
208
|
+
правилом машине нечем.
|
|
222
209
|
|
|
223
210
|
- **Пока эпик не кончился, следующая работа не выбирается, а берётся.** Выбор, предложенный
|
|
224
211
|
владельцу при назначенном порядке, — это просьба назначить его заново: он уже назначен, и
|
|
225
212
|
предлагать его повторно значит отменять собственное планирование.
|
|
213
|
+
- **Перечень работ, разрешённых вне эпика, повторяет слово владельца, а не заменяет его.** Номер
|
|
214
|
+
попадает туда после того, как владелец назвал эту работу, и только для того, чтобы гард её
|
|
215
|
+
пропускал. Исполнитель, вписавший номер сам, разрешил работу себе сам, и по записи это потом
|
|
216
|
+
не отличить от разрешения владельца.
|
|
217
|
+
- **Назначение эпика принадлежит рабочему дереву, а не ветке, и объявляется в главной ветке
|
|
218
|
+
прежде, чем под новый эпик заводится первая задача.** Запись о назначении лежит в файле, а файл
|
|
219
|
+
принадлежит ветке, где его правили: записанная в ветку первой задачи, она действует только в
|
|
220
|
+
этой ветке. При первом переключении ветки исполнитель работает по новому порядку, а гард читает
|
|
221
|
+
прежний, и отказ приходит в конце хода, когда работа уже сделана и отдана.
|
|
226
222
|
- **Берётся следующая задача из замысла эпика, а не из списка очереди работ.** Список отсортирован
|
|
227
223
|
номером и показывает свежие задачи сверху; порядок эпика он не держит и держать не может — там
|
|
228
224
|
лежат задачи всех эпиков сразу. Замысел эпика открывается перед взятием и отвечает за один
|
|
@@ -232,10 +228,9 @@
|
|
|
232
228
|
для обоих. Исполнитель, взявший работу вне кончившегося эпика и промолчавший, оставляет
|
|
233
229
|
владельца в уверенности, что эпик продолжается.
|
|
234
230
|
- **Эпик не закрывается, пока хоть один признак его конца подтверждён только чтением.** Признак,
|
|
235
|
-
проверяемый глазами, закрывает работу
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
признакам из трёх, эпик уносит третий в описание прошлого, где его уже никто не ищет.
|
|
231
|
+
проверяемый глазами, закрывает работу после того, как его проверили командой или замером с их
|
|
232
|
+
выводом. Пометка «подтверждается живым замером» — обещание проверить, а не проверка. Закрытый по
|
|
233
|
+
двум признакам из трёх, эпик уносит третий в описание прошлого, где его никто не ищет.
|
|
239
234
|
- **Замеченное по ходу и к эпику не относящееся становится задачей в очереди работ, а не работой
|
|
240
235
|
сейчас.** Отвлечение выглядит дешёвым ровно до того, как окажется, что вместе с ним уехала
|
|
241
236
|
правка соседнего домена: эпик при этом стоит, а откатывать приходится обе работы.
|
|
@@ -243,10 +238,9 @@
|
|
|
243
238
|
Непонятно бывает от того, что замысел не открыли: он лежит и держит решения, которых в коде не
|
|
244
239
|
видно.
|
|
245
240
|
- **Положение эпика показывается владельцу таблицей — в передаче и при остановке за его
|
|
246
|
-
решением.**
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
и по обоим не видно ни сделанного, ни оставшегося.
|
|
241
|
+
решением.** В эти два момента владелец смотрит на работу снаружи: забирает её в новый заход или
|
|
242
|
+
решает, куда её вести. Замысел с порядком задач при этом не открывают, а по передаче и вопросу
|
|
243
|
+
не видно ни сделанного, ни оставшегося.
|
|
250
244
|
- **Таблица показывает все задачи эпика разом — закрытые, текущую и назначенные.** Строка на
|
|
251
245
|
задачу: место по порядку, задача, состояние; текущая отличается от остальных на вид. Порядок у
|
|
252
246
|
закрытых фактический, у будущих назначенный, и расхождение между ними тоже утверждение. Перечень
|