@rt-tools/agent-kit 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +17 -0
  2. package/assets/checks/archive-age.mjs +107 -0
  3. package/assets/checks/archive-prune.mjs +46 -0
  4. package/assets/checks/check-archive-age.mjs +42 -0
  5. package/assets/checks/check-board.github.mjs +16 -0
  6. package/assets/checks/check-descriptions.mjs +123 -0
  7. package/assets/checks/check-dupes.mjs +31 -3
  8. package/assets/checks/check-file-size.mjs +47 -2
  9. package/assets/checks/check-turn-map.mjs +20 -3
  10. package/assets/checks/lib-common.mjs +12 -1
  11. package/assets/checks/lib-domains.mjs +1 -1
  12. package/assets/checks/rt-kit-checks.config.mjs +24 -1
  13. package/assets/checks/spec-anchors.mjs +18 -3
  14. package/assets/checks/spec-common.mjs +5 -1
  15. package/assets/defaults/project.sh +22 -17
  16. package/assets/defaults/turn-map.md +15 -19
  17. package/assets/docs/GLOSSARY.md +52 -58
  18. package/assets/hooks/rule-article.sh +12 -0
  19. package/assets/hooks/skill-gate.sh +5 -4
  20. package/assets/hooks/task-flow-guard.sh +20 -0
  21. package/assets/hooks/turn-exit-guard.sh +229 -4
  22. package/assets/laws/delivery.md +92 -104
  23. package/assets/laws/frontend-application.md +4 -0
  24. package/assets/laws/project-documentation.md +64 -68
  25. package/assets/laws/verifiability.md +32 -33
  26. package/assets/laws/work-conduct.md +167 -157
  27. package/assets/patterns/doc-style-sweep.md +1 -1
  28. package/assets/patterns/doc-style-trace.md +1 -1
  29. package/assets/patterns/git-workflow-commit.azure.md +1 -1
  30. package/assets/patterns/git-workflow-commit.github.md +7 -1
  31. package/assets/patterns/git-workflow-commit.gitlab.md +1 -1
  32. package/assets/patterns/git-workflow-docker.md +1 -1
  33. package/assets/patterns/git-workflow-merge.md +14 -3
  34. package/assets/patterns/git-workflow-pr.azure.md +1 -1
  35. package/assets/patterns/git-workflow-pr.github.md +1 -1
  36. package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
  37. package/assets/patterns/git-workflow-restart.md +1 -1
  38. package/assets/patterns/git-workflow-secrets.md +1 -1
  39. package/assets/patterns/git-workflow-stack.md +93 -0
  40. package/assets/patterns/seo-page.md +1 -1
  41. package/assets/patterns/spec-driven-rule.md +55 -0
  42. package/assets/patterns/status-report-table.github.md +88 -0
  43. package/assets/patterns/task-flow-archive.md +3 -4
  44. package/assets/patterns/task-flow-close.md +6 -1
  45. package/assets/patterns/task-flow-start.md +17 -5
  46. package/assets/patterns/ts-procedure.md +1 -1
  47. package/assets/pitfalls/doc-style.md +5 -0
  48. package/assets/pitfalls/git-workflow.github.md +47 -0
  49. package/assets/pitfalls/task-flow.md +28 -0
  50. package/assets/pitfalls/testing.md +14 -0
  51. package/assets/pitfalls/turn-conduct.md +33 -0
  52. package/assets/rules/angular-patterns.md +1 -1
  53. package/assets/rules/api-layer.md +3 -3
  54. package/assets/rules/browser-verification.md +15 -1
  55. package/assets/rules/dependencies.md +1 -1
  56. package/assets/rules/deploy-flow.azure.md +1 -1
  57. package/assets/rules/deploy-flow.github.md +1 -1
  58. package/assets/rules/deploy-flow.gitlab.md +1 -1
  59. package/assets/rules/doc-style.md +18 -0
  60. package/assets/rules/entity-conventions.needs-admin.md +1 -1
  61. package/assets/rules/entity-models.md +1 -1
  62. package/assets/rules/git-workflow.azure.md +1 -1
  63. package/assets/rules/git-workflow.github.md +154 -181
  64. package/assets/rules/git-workflow.gitlab.md +1 -1
  65. package/assets/rules/lib-layers.md +1 -1
  66. package/assets/rules/observability.needs-app.md +1 -1
  67. package/assets/rules/platform-access.md +1 -1
  68. package/assets/rules/reuse-first.md +1 -1
  69. package/assets/rules/seo.md +4 -3
  70. package/assets/rules/shared-code.md +1 -1
  71. package/assets/rules/spec-driven.md +68 -1
  72. package/assets/rules/status-report.md +97 -0
  73. package/assets/rules/styling-bem.md +12 -0
  74. package/assets/rules/task-flow.md +102 -100
  75. package/assets/rules/testing.md +67 -66
  76. package/assets/rules/turn-conduct.md +146 -105
  77. package/assets/rules/turn-entry.md +7 -1
  78. package/assets/rules/typescript-conventions.md +1 -1
  79. package/assets/skills/agent-kit-extend.md +1 -1
  80. package/assets/skills/agent-kit.md +18 -1
  81. package/bin/agent-kit.d.ts.map +1 -1
  82. package/bin/agent-kit.js +25 -0
  83. package/bin/agent-kit.js.map +1 -1
  84. package/lib/cost.d.ts +44 -0
  85. package/lib/cost.d.ts.map +1 -0
  86. package/lib/cost.js +181 -0
  87. package/lib/cost.js.map +1 -0
  88. package/package.json +1 -1
  89. package/rt-tools-agent-kit-0.16.0.tgz +0 -0
  90. package/rt-tools-agent-kit-0.14.0.tgz +0 -0
@@ -6,92 +6,88 @@
6
6
  старше.
7
7
 
8
8
  ## Статьи
9
-
10
- - **У документа заранее задан набор разделов, и отсутствие раздела — отказ.** Требования,
11
- для которых не заведено места, вспоминаются уже после выкатки.
12
- - **Каждое утверждение документа привязано к месту, где оно исполняется.** Утверждение без
13
- такого местанамерение, и называть его действующим нельзя.
14
- - **Предстоящая работа перечислена в одном месте в очереди работ.** Документ второго списка
15
- не заводит: два списка об одной работе расходятся молча, и по ним потом не понять, что
16
- сделано, а что нет. Документу остаётся то, что задачей не бывает, — договорённость и
17
- решение, которое решено не править.
18
- - **Привязка не ведёт в код, который никто не зовёт.** Объявленный и никем не используемый
19
- символ ничего не исполняет, а проверка на нём остаётся зелёной.
20
- - **Путь, названный в документе, существует.** Ссылка на переехавший файл читается как
21
- действующее указание, и следующий читатель заводит снятое заново.
9
+ - **У документа заранее задан набор разделов, и отсутствие раздела — отказ.** Требования, для
10
+ которых не заведено места, вспоминаются уже после выкатки.
11
+ - **Каждое утверждение документа привязано к месту, где оно исполняется.** Утверждение без такого
12
+ места намерение, и называть его действующим нельзя.
13
+ - **Предстоящая работа перечислена в одном месте в очереди работ.** Документ второго списка не
14
+ заводит: два списка об одной работе расходятся молча, и по ним потом не понять, что сделано, а
15
+ что нет. Документу остаётся то, что задачей не бывает, договорённость и решение, которое
16
+ решено не править.
17
+ - **Привязка не ведёт в код, который никто не зовёт.** Объявленный и никем не используемый символ
18
+ ничего не исполняет, а проверка на нём остаётся зелёной.
19
+ - **Путь, названный в документе, существует.** Ссылка на переехавший файл читается как действующее
20
+ указание, и следующий читатель заводит снятое заново.
22
21
  - **Указатель каталога перечисляет всё, что в каталоге лежит.** Записи, которой в указателе нет,
23
22
  для читателя не существует: он ищет по указателю, а не обходом каталога, и заводит разбор
24
23
  заново. Это обратная сторона предыдущей статьи — не только путь из текста ведёт в файл, но и
25
24
  файл назван в тексте, по которому его ищут.
26
25
  - **Документ, разошедшийся с приложением, правится тогда же, когда замечено расхождение.**
27
26
  Отложенная правка не случается: расхождение перестаёт быть заметным на следующий день.
28
- - **Расхождение чинится в той стороне, которая неправа, и это не всегда документ.**
29
- Состояние, описанное как существующее, но недостижимое в приложении, — дефект приложения:
30
- строка читается справкой о работающем, на неё ссылаются как на проверенное, и правка
31
- документа под код закрепила бы дыру вместо того, чтобы её показать.
32
- - **Документ не утверждает о будущем, и следит за этим автор.** «Не планируется», «не будет»
33
- — это намерение, а не свойство приложения: сверить его не с чем, и оно проходит любую
34
- проверку. Машине это не поручить: открытый вопрос пишется теми же словами, что и обещание,
35
- и проверка отбивала бы оба.
27
+ - **Расхождение чинится в той стороне, которая неправа, и это не всегда документ.** Состояние,
28
+ описанное как существующее, но недостижимое в приложении, — дефект приложения: строка читается
29
+ справкой о работающем, на неё ссылаются как на проверенное, и правка документа под код закрепила
30
+ бы дыру вместо того, чтобы её показать.
31
+ - **Документ не утверждает о будущем, и следит за этим автор.** «Не планируется», «не будет» — это
32
+ намерение, а не свойство приложения: сверить его не с чем, и оно проходит любую проверку. Машине
33
+ это не поручить: открытый вопрос пишется теми же словами, что и обещание, и проверка отбивала бы
34
+ оба.
36
35
  - **Полнота текстов проверяется и со стороны работы, а не только со стороны текста.** Обход
37
36
  написанного судит каждое утверждение, но утверждения, которого нет, в этом обходе нет тоже:
38
37
  приём, применённый и нигде не описанный, так не находится никогда. Поэтому закрытая работа
39
38
  спрашивается отдельно — оставила она след в текстах или явно его не требует.
40
- - **Документ утверждает о состоявшемся, а не о том, что должно сработать.** Лечение,
41
- записанное готовым до того, как его прогнали, дороже отсутствия записи: следующий читатель
42
- берёт его за проверенное — и берёт в тот день, когда лечение понадобилось, а времени на
43
- разбор нет. Непрогнанное либо не пишется вовсе, либо названо непроверенным тем же
44
- предложением.
39
+ - **Документ утверждает о состоявшемся, а не о том, что должно сработать.** Лечение, записанное
40
+ готовым до того, как его прогнали, дороже отсутствия записи: следующий читатель берёт его за
41
+ проверенное — и берёт в тот день, когда лечение понадобилось, а времени на разбор нет.
42
+ Непрогнанное либо не пишется вовсе, либо названо непроверенным тем же предложением.
45
43
  - **Число в тексте пересчитывается тем же изменением, которым пишется, и за этим тоже следит
46
- автор.** Устаревшее число выглядит так же, как свежее, а машине их не различить: дата,
47
- версия и номер — такие же числа, и проверка, которая знает один способ записи, на другом
48
- ошибается молча.
44
+ автор.** Устаревшее число выглядит так же, как свежее, а машине их не различить: дата, версия и
45
+ номер — такие же числа, и проверка, которая знает один способ записи, на другом ошибается молча.
49
46
  - **Отказ от слова распространяется на всё, что уже прочитано снаружи, а не только на файлы.**
50
- Название работы, её описание и запись о правке живут вне дерева: поиск по файлам их не
51
- видит, проверки текстов на них не смотрят, и отказ выглядит сделанным ровно до того, как
52
- читатель наткнётся на снятое слово в заголовке. Читатель при этом заключает, что от слова
53
- не отказывались вовсе.
54
- - **Текст, который переносится в чужое дерево, не описывает состояние этого дерева как факт.**
55
- О соседней части он говорит условно и называет её по имени: что в дереве стоит, а чего нет,
56
- знает само дерево, а не текст, приехавший в него. Утверждение, сказанное безусловно, врёт тем
47
+ Название работы, её описание и запись о правке живут вне дерева: поиск по файлам их не видит,
48
+ проверки текстов на них не смотрят, и отказ выглядит сделанным ровно до того, как читатель
49
+ наткнётся на снятое слово в заголовке. Читатель при этом заключает, что от слова не отказывались
50
+ вовсе.
51
+ - **Текст, который переносится в чужое дерево, не описывает состояние этого дерева как факт.** О
52
+ соседней части он говорит условно и называет её по имени: что в дереве стоит, а чего нет, знает
53
+ само дерево, а не текст, приехавший в него. Утверждение, сказанное безусловно, врёт тем
57
54
  увереннее, что печатает его сам инструмент, — и поправить его дерево не может, если правки на
58
55
  месте у такого текста не предусмотрено.
59
56
  - **Принятое решение становится пунктом слоя правил, а не записью о прошлом.** Записанное
60
- описанием прошлого перестаёт действовать в тот же день: описания прошлого не приходят в
61
- контекст работы, читаются как история и ничего не требуют. Следующая работа принимает то же
62
- решение заново — и принимает иначе, потому что доводов первого уже не видит.
63
- - **У решения есть слой, и он выбирается по тому, о чём решение говорит.** Что должно быть
64
- верно в продукте — статья закона. Каким приёмом это делается здесь — пункт правила. Готовый
65
- код и порядок действий — паттерн. Решение, положенное не в свой слой, находится только тем,
66
- кто уже знает, что оно есть.
57
+ описанием прошлого перестаёт действовать в тот же день: описания прошлого не приходят в контекст
58
+ работы, читаются как история и ничего не требуют. Следующая работа принимает то же решение
59
+ заново — и принимает иначе, потому что доводов первого уже не видит.
60
+ - **У решения есть слой, и он выбирается по тому, о чём решение говорит.** Что должно быть верно в
61
+ продукте — статья закона. Каким приёмом это делается здесь — пункт правила. Готовый код и
62
+ порядок действий — паттерн. Решение, положенное не в свой слой, находится только тем, кто уже
63
+ знает, что оно есть.
67
64
  - **Описание прошлого объясняет состоявшийся переезд, а не держит действующее требование.**
68
- Разница видна вопросом: перестанет ли текст быть верным, если завтра всё переделать. Рассказ
69
- о том, как и почему однажды перенесли, — прошлое; требование «делай так» — нет, и место ему
70
- в слое правил.
65
+ Разница видна вопросом: перестанет ли текст быть верным, если завтра всё переделать. Рассказ о
66
+ том, как и почему однажды перенесли, — прошлое; требование «делай так» — нет, и место ему в слое
67
+ правил.
71
68
  - **Признак, по которому решение относят к прошлому, записан заранее и один на все работы.**
72
69
  Выводимый каждой работой заново, он назначается тем, кому мешает: под конец работы дешевле
73
70
  назвать прошлым всё, что осталось разобрать.
74
- - **Раздел решений в описании домена — временное место, а не постоянное.** Пока решение там,
75
- оно действует только для того, кто открыл этот файл. Разросшийся раздел — признак того, что
76
- правило под него не заведено, а не того, что домен сложный.
77
- - **Работа, которая переносит решения, называет для каждого, куда оно ушло.** Иначе по
78
- описанию прошлого не отличить решение, ставшее правилом, от решения, потерянного при
79
- переносе: оба выглядят одинаково — записью, на которую никто не ссылается.
80
- - **Текст, раздаваемый наружу, судится не слабее своей копии у потребителя.** Требование,
81
- стоящее к копии и не стоящее к источнику, находит промах у того, кто его не делал и починить
82
- не может: до потребителя промах доезжает целым, а краснеет уже там.
83
- - **Редакция текста, которую это дерево не выбрало, судится наравне с выбранной.**
84
- Непрочитанная редакция расходится с прочитанной молча, и узнаёт об этом первый, кто её
85
- выберет, — то есть тот, у кого нет ни истории расхождения, ни повода его искать.
86
- - **Набор обязательных разделов объявлен отдельно, и образец ему не хозяин.** Образец —
87
- черновик для того, кто заводит текст, и стареет он первым. Набор, выведенный из образца, либо
88
- объявляет расхождением весь корпус разом, либо не замечает ничего.
89
- - **Требование, которого никто не формулировал, молчит, а не отказывает.** Отказ на предмете
90
- без объявленного требования гасят списком исключений, а список исключений через месяц
91
- становится рабочим путём — и гасит вместе с шумом то, ради чего проверка заводилась.
92
- - **Два текста об одном либо говорят одно, либо один из них неправ.** Согласие текстов между
93
- собой не следует ни из целостности ссылок, ни из полноты разделов: оба проходят любую такую
94
- проверку, а исполнитель берёт тот, который прочитал раньше. Ищется это чтением — считать
95
- здесь нечего.
71
+ - **Раздел решений в описании домена — временное место, а не постоянное.** Пока решение там, оно
72
+ действует только для того, кто открыл этот файл. Разросшийся раздел — признак того, что правило
73
+ под него не заведено, а не того, что домен сложный.
74
+ - **Работа, которая переносит решения, называет для каждого, куда оно ушло.** Иначе по описанию
75
+ прошлого не отличить решение, ставшее правилом, от решения, потерянного при переносе: оба
76
+ выглядят одинаково — записью, на которую никто не ссылается.
77
+ - **Текст, раздаваемый наружу, судится не слабее своей копии у потребителя.** Требование, стоящее
78
+ к копии и не стоящее к источнику, находит промах у того, кто его не делал и починить не может:
79
+ до потребителя промах доезжает целым, а краснеет уже там.
80
+ - **Редакция текста, которую это дерево не выбрало, судится наравне с выбранной.** Непрочитанная
81
+ редакция расходится с прочитанной молча, и узнаёт об этом первый, кто её выберет, — то есть тот,
82
+ у кого нет ни истории расхождения, ни повода его искать.
83
+ - **Набор обязательных разделов объявлен отдельно, и образец ему не хозяин.** Образец — черновик
84
+ для того, кто заводит текст, и стареет он первым. Набор, выведенный из образца, либо объявляет
85
+ расхождением весь корпус разом, либо не замечает ничего.
86
+ - **Требование, которого никто не формулировал, молчит, а не отказывает.** Отказ на предмете без
87
+ объявленного требования гасят списком исключений, а список исключений через месяц становится
88
+ рабочим путём — и гасит вместе с шумом то, ради чего проверка заводилась.
89
+ - **Два текста об одном либо говорят одно, либо один из них неправ.** Согласие текстов между собой
90
+ не следует ни из целостности ссылок, ни из полноты разделов: оба проходят любую такую проверку,
91
+ а исполнитель берёт тот, который прочитал раньше. Ищется это чтением — считать здесь нечего.
96
92
  - **Изображение правится тем же изменением, что и текст, который оно изображает.** Разойдясь,
97
93
  схема и проза остаются читаемыми обе, и первым это замечает тот, кто пошёл по схеме.
@@ -5,53 +5,52 @@
5
5
  который «должен работать», и код, который проверили, в истории выглядят одинаково.
6
6
 
7
7
  ## Статьи
8
-
9
- - **Обещанное поведение названо сценарием, а сценарий назван в тесте, который его
10
- проверяет.** Иначе связь между обещанием и проверкой держится только на памяти автора.
11
- - **Сценарий без теста помечен как непокрытый и виден в сводке.** Молчаливый пропуск
12
- выглядит так же, как покрытый сценарий, и долг перестаёт быть заметным.
8
+ - **Обещанное поведение названо сценарием, а сценарий назван в тесте, который его проверяет.**
9
+ Иначе связь между обещанием и проверкой держится только на памяти автора.
10
+ - **Сценарий без теста помечен как непокрытый и виден в сводке.** Молчаливый пропуск выглядит так
11
+ же, как покрытый сценарий, и долг перестаёт быть заметным.
13
12
  - **Тест, проверяющий часть обещанного, считается долгом, а не покрытием.** Иначе сводка
14
13
  показывает выполненным то, что выполнено наполовину.
15
- - **Обещание, данное пользователю, закрывается тестом, который идёт его путём.** Тот же
16
- расчёт, проверенный мимо экрана, верен — и обещания не закрывает: между верным решением и
17
- тем, что человек его видит, лежит всё, чего проверка не касалась.
14
+ - **Обещание, данное пользователю, закрывается тестом, который идёт его путём.** Тот же расчёт,
15
+ проверенный мимо экрана, верен — и обещания не закрывает: между верным решением и тем, что
16
+ человек его видит, лежит всё, чего проверка не касалась.
18
17
  - **Тест, выключенный признаком окружения, покрытием не считается.** В обычном прогоне он не
19
18
  исполняется ни разу, а в сводке выглядит так же, как исполненный.
20
19
  - **Упоминание в тесте сценария, которого нет, — отказ.** Так ловится переименованный или
21
20
  выкинутый сценарий: без этого он пропадает молча.
22
- - **Работающее приложение проверяется там, где его видит пользователь.** Отладочный режим
23
- ведёт себя иначе рабочего, и проверка в нём подтверждает не то, что будет у пользователя.
21
+ - **Работающее приложение проверяется там, где его видит пользователь.** Отладочный режим ведёт
22
+ себя иначе рабочего, и проверка в нём подтверждает не то, что будет у пользователя.
24
23
  - **Перед отправкой правка проверяется тем же набором, что и конвейер, и теми же командами.**
25
24
  Набор, собранный по изменённым файлам, пропускает то, до чего правка дошла связями: проверка
26
25
  зелёная, а конвейер красный. Что проверять, считает инструмент от той же базы, а не память
27
26
  автора.
28
- - **Проверка признака окружения относится только к тому пути запуска, на котором она
29
- сделана.** Пути, которыми одно и то же приложение поднимается, задают признаки по-разному,
30
- и подтверждённое на одном из них на остальных неверно — а выглядит проверенным целиком.
27
+ - **Проверка признака окружения относится только к тому пути запуска, на котором она сделана.**
28
+ Пути, которыми одно и то же приложение поднимается, задают признаки по-разному, и подтверждённое
29
+ на одном из них на остальных неверно — а выглядит проверенным целиком.
31
30
  - **Разметка проверяется замером, а не взглядом.** На глаз не отличить отступ от поля и
32
31
  выравнивание от совпадения, и расхождение находится уже после выкатки.
33
- - **Успешный ответ команды означает, что она отработала, а не что нужное состояние
34
- наступило.** Часть запросов выполняется наполовину, и об отклонённой части в ответе ничего
35
- нет: по коду возврата такой вызов не отличить от исполненного. Поэтому результат читают
36
- отдельным запросом, и в PR идёт то, что прочитали, а не то, что заказывали.
37
- - **Служба считается поднятой, когда она выполнила задание, а не когда сообщила о
38
- готовности.** Сообщение о готовности говорит лишь, что служба себя объявила: та, которой не
39
- досталось ни одного задания, выглядит в нём точно так же, как работающая. Проверяются обе
40
- стороны связи — что заказчик выбирает именно её и что задание через неё прошло.
41
- - **Причина отказа, на которой строится решение, подтверждается измерением, а не
42
- правдоподобием.** Объяснение, пришедшее первым, объясняет наблюдаемое не хуже верного:
43
- свойство среды и собственный промах выглядят в отказе одинаково, и разводит их только замер,
44
- поставленный так, чтобы одно из двух не прошло. Решение, выведенное из неподтверждённой
45
- причины, лечит не то — и стоит отката всей работы, а не одной правки.
32
+ - **Успешный ответ команды означает, что она отработала, а не что нужное состояние наступило.**
33
+ Часть запросов выполняется наполовину, и об отклонённой части в ответе ничего нет: по коду
34
+ возврата такой вызов не отличить от исполненного. Поэтому результат читают отдельным запросом, и
35
+ в PR идёт то, что прочитали, а не то, что заказывали.
36
+ - **Служба считается поднятой, когда она выполнила задание, а не когда сообщила о готовности.**
37
+ Сообщение о готовности говорит лишь, что служба себя объявила: та, которой не досталось ни
38
+ одного задания, выглядит в нём точно так же, как работающая. Проверяются обе стороны связи — что
39
+ заказчик выбирает именно её и что задание через неё прошло.
40
+ - **Причина отказа, на которой строится решение, подтверждается измерением, а не правдоподобием.**
41
+ Объяснение, пришедшее первым, объясняет наблюдаемое не хуже верного: свойство среды и
42
+ собственный промах выглядят в отказе одинаково, и разводит их только замер, поставленный так,
43
+ чтобы одно из двух не прошло. Решение, выведенное из неподтверждённой причины, лечит не то — и
44
+ стоит отката всей работы, а не одной правки.
46
45
  - **Если инструмент проверки запрещает приём, которым здесь пользуются постоянно, его правило
47
46
  выключают в настройке инструмента, а не обходят в каждом месте.** Обход приходится повторять
48
47
  столько раз, сколько таких мест, и ни в одном из них не написано, зачем он: со стороны это
49
48
  выглядит ошибкой автора, а не решением.
50
- - **Красная проверка означает неверный код, а не неверную проверку.** Место, выведенное
51
- из-под проверки затем, чтобы она замолчала, чинит показание, а не то, на что она указала:
52
- код остаётся прежним, а сигнала о нём больше нет ни у кого. Список известного накоплен к
53
- дню заведения проверки и только сокращается; несогласие с самой проверкой — вопрос к
54
- владельцу, а не строка в списке.
49
+ - **Красная проверка означает неверный код, а не неверную проверку.** Место, выведенное из-под
50
+ проверки затем, чтобы она замолчала, чинит показание, а не то, на что она указала: код остаётся
51
+ прежним, а сигнала о нём больше нет ни у кого. Список известного накоплен к дню заведения
52
+ проверки и только сокращается; несогласие с самой проверкой — вопрос к владельцу, а не строка в
53
+ списке.
55
54
  - **Польза правила подтверждается наблюдением за тем, как им пользуются, а не мнением о нём.**
56
55
  Правило, которого не открыли ни разу, и правило, на котором держится половина работы, в тексте
57
56
  выглядят одинаково — и правится первым обычно то, о чём вспомнили, а не то, что мешает.
@@ -59,8 +58,8 @@
59
58
  умирает вместе с сессией, отвечает только на вопрос «что было минуту назад».
60
59
  - **Наблюдение за работой не выносит наружу ничего, кроме того, что общее у всех.** Имя правила,
61
60
  род события и версия одинаковы везде, где стоит слой правил; путь, домен и имя дерева
62
- принадлежат одному дереву и в чужом месте не значат ничего, кроме утечки. Держится это
63
- проверкой на выносящей стороне, а не памятью того, кто пишет.
61
+ принадлежат одному дереву и в чужом месте не значат ничего, кроме утечки. Держится это проверкой
62
+ на выносящей стороне, а не памятью того, кто пишет.
64
63
  - **Проверка, которая сама сломалась, работу не останавливает.** Отказ инструмента не является
65
64
  найденным нарушением, и остановленная им работа стоит до того, как его починят.
66
65
  - **Решение, зависящее от текущего момента, получает момент снаружи.** Иначе проверить его можно