@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.
Files changed (101) hide show
  1. package/README.md +8 -2
  2. package/assets/checks/board-long-work.github.mjs +101 -0
  3. package/assets/checks/board-runs.github.mjs +34 -0
  4. package/assets/checks/board.github.mjs +1 -1
  5. package/assets/checks/check-board.github.mjs +30 -2
  6. package/assets/checks/check-doc-paths.mjs +24 -5
  7. package/assets/checks/check-file-size.mjs +8 -2
  8. package/assets/checks/check-prose-style.mjs +10 -1
  9. package/assets/checks/check-reuse.mjs +4 -1
  10. package/assets/checks/check-schema-drift.mjs +65 -6
  11. package/assets/checks/rt-kit-checks.config.mjs +13 -0
  12. package/assets/checks/signals.mjs +41 -1
  13. package/assets/commands/next-session.md +16 -5
  14. package/assets/defaults/gate-map.sh +13 -0
  15. package/assets/defaults/project.sh +26 -0
  16. package/assets/defaults/shell.sh +18 -3
  17. package/assets/hooks/browser-guard-device-id.sh +42 -12
  18. package/assets/hooks/browser-guard-no-asking.sh +5 -1
  19. package/assets/hooks/dispatch.sh +40 -9
  20. package/assets/hooks/docs-guard.sh +10 -0
  21. package/assets/hooks/exam-guard.sh +66 -16
  22. package/assets/hooks/git-guard-delivery-draft.sh +78 -0
  23. package/assets/hooks/git-guard-delivery.sh +64 -122
  24. package/assets/hooks/git-guard-main.sh +39 -4
  25. package/assets/hooks/git-guard-push-tests.sh +71 -3
  26. package/assets/hooks/glossary-load.sh +23 -2
  27. package/assets/hooks/grill-gate.sh +62 -0
  28. package/assets/hooks/hook-input.sh +17 -6
  29. package/assets/hooks/rule-source-guard.sh +11 -0
  30. package/assets/hooks/stand-login-guard.sh +101 -0
  31. package/assets/hooks/write-targets.sh +37 -4
  32. package/assets/laws/autonomous-work.md +30 -0
  33. package/assets/laws/project-documentation.md +8 -0
  34. package/assets/laws/verifiability.md +12 -2
  35. package/assets/laws/work-conduct.md +59 -65
  36. package/assets/patterns/autonomous-work-run.md +105 -0
  37. package/assets/patterns/browser-verification-measure.md +41 -1
  38. package/assets/patterns/browser-verification-stand.md +57 -16
  39. package/assets/patterns/doc-style-human.md +75 -0
  40. package/assets/patterns/doc-style-write.md +16 -0
  41. package/assets/patterns/git-workflow-commit.azure.md +12 -0
  42. package/assets/patterns/git-workflow-commit.github.md +16 -3
  43. package/assets/patterns/git-workflow-commit.gitlab.md +12 -0
  44. package/assets/patterns/git-workflow-merge.md +8 -0
  45. package/assets/patterns/git-workflow-pr-ready.md +93 -0
  46. package/assets/patterns/git-workflow-pr.azure.md +1 -1
  47. package/assets/patterns/git-workflow-pr.github.md +1 -1
  48. package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
  49. package/assets/patterns/task-flow-start.md +48 -48
  50. package/assets/patterns/testing-e2e.md +18 -8
  51. package/assets/patterns/ts-procedure.md +3 -2
  52. package/assets/pitfalls/task-flow.md +40 -40
  53. package/assets/rules/autonomous-work.md +92 -0
  54. package/assets/rules/browser-verification.md +35 -3
  55. package/assets/rules/deploy-flow.azure.md +7 -0
  56. package/assets/rules/deploy-flow.github.md +7 -0
  57. package/assets/rules/deploy-flow.gitlab.md +7 -0
  58. package/assets/rules/doc-style.md +54 -0
  59. package/assets/rules/git-workflow.azure.md +8 -0
  60. package/assets/rules/git-workflow.github.md +59 -63
  61. package/assets/rules/git-workflow.gitlab.md +8 -0
  62. package/assets/rules/reuse-first.md +25 -5
  63. package/assets/rules/styling-bem.md +8 -1
  64. package/assets/rules/task-flow.md +108 -109
  65. package/assets/rules/testing.md +21 -0
  66. package/assets/skills/agent-kit.md +72 -82
  67. package/lib/commands.d.ts.map +1 -1
  68. package/lib/commands.js +69 -2
  69. package/lib/commands.js.map +1 -1
  70. package/lib/enroll.d.ts.map +1 -1
  71. package/lib/enroll.js +1 -1
  72. package/lib/enroll.js.map +1 -1
  73. package/lib/observations.d.ts +10 -1
  74. package/lib/observations.d.ts.map +1 -1
  75. package/lib/observations.js +1 -0
  76. package/lib/observations.js.map +1 -1
  77. package/lib/override-marks.d.ts +24 -0
  78. package/lib/override-marks.d.ts.map +1 -0
  79. package/lib/override-marks.js +98 -0
  80. package/lib/override-marks.js.map +1 -0
  81. package/lib/push-gate.d.ts +14 -0
  82. package/lib/push-gate.d.ts.map +1 -0
  83. package/lib/push-gate.js +93 -0
  84. package/lib/push-gate.js.map +1 -0
  85. package/lib/shipment.d.ts.map +1 -1
  86. package/lib/shipment.js +1 -1
  87. package/lib/shipment.js.map +1 -1
  88. package/package.json +1 -1
  89. package/rt-tools-agent-kit-0.24.0.tgz +0 -0
  90. package/assets/laws/application/access.md +0 -34
  91. package/assets/laws/application/locales.md +0 -33
  92. package/assets/laws/application/search-visibility.md +0 -24
  93. package/assets/patterns/permissions-procedure.md +0 -71
  94. package/assets/patterns/seo-page.md +0 -104
  95. package/assets/patterns/seo-verify.md +0 -83
  96. package/assets/patterns/translations-content.md +0 -107
  97. package/assets/patterns/translations-key.md +0 -64
  98. package/assets/rules/permissions.md +0 -116
  99. package/assets/rules/seo.md +0 -139
  100. package/assets/rules/translations.md +0 -96
  101. 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) { emit($0) }
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
- emit(substr($0, RSTART + RLENGTH))
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
- этому моменту уже записаны в ход работы — в сообщении владельцу они лишние. Чем подробнее PR,
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
  закрытых фактический, у будущих назначенный, и расхождение между ними тоже утверждение. Перечень