@rt-tools/agent-kit 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +25 -19
  2. package/assets/agents/qa-engineer.md +1 -1
  3. package/assets/agents/rules-reviewer.md +83 -0
  4. package/assets/checks/board.github.mjs +56 -17
  5. package/assets/checks/check-board.github.mjs +49 -5
  6. package/assets/checks/check-dupes.mjs +66 -6
  7. package/assets/checks/check-specs.mjs +100 -15
  8. package/assets/checks/rt-kit-checks.config.mjs +9 -0
  9. package/assets/checks/task-new.github.mjs +33 -5
  10. package/assets/commands/agent-kit-digest.md +10 -5
  11. package/assets/commands/feedback.md +95 -0
  12. package/assets/commands/next-session.md +4 -4
  13. package/assets/commands/rules-review.md +98 -0
  14. package/assets/commands/skill-curator.md +44 -25
  15. package/assets/defaults/gate-map.sh +11 -4
  16. package/assets/defaults/project.sh +46 -0
  17. package/assets/docs/GLOSSARY.md +49 -46
  18. package/assets/hooks/docs-guard.sh +19 -3
  19. package/assets/hooks/git-guard-delivery.sh +106 -13
  20. package/assets/hooks/proposal-guard.sh +93 -0
  21. package/assets/hooks/reuse-first-guard.sh +83 -15
  22. package/assets/hooks/skill-gate-layers.sh +1 -1
  23. package/assets/hooks/skill-gate.sh +27 -1
  24. package/assets/hooks/task-flow-guard.sh +59 -19
  25. package/assets/hooks/waiting-turn-guard.sh +87 -0
  26. package/assets/hooks/window-fill-guard.sh +1 -1
  27. package/assets/laws/delivery.md +41 -7
  28. package/assets/laws/project-documentation.md +39 -0
  29. package/assets/laws/verifiability.md +6 -1
  30. package/assets/laws/work-conduct.md +83 -3
  31. package/assets/patterns/git-workflow-commit.azure.md +84 -4
  32. package/assets/patterns/git-workflow-commit.github.md +90 -4
  33. package/assets/patterns/git-workflow-commit.gitlab.md +84 -5
  34. package/assets/patterns/git-workflow-docker.md +30 -0
  35. package/assets/patterns/git-workflow-merge.md +1 -1
  36. package/assets/patterns/spec-driven-domain.md +7 -1
  37. package/assets/patterns/spec-driven-rule.md +6 -0
  38. package/assets/patterns/task-flow-close.md +197 -21
  39. package/assets/patterns/task-flow-handoff.md +28 -5
  40. package/assets/patterns/task-flow-resume.md +25 -7
  41. package/assets/patterns/task-flow-start.md +37 -6
  42. package/assets/rules/angular-patterns.md +22 -0
  43. package/assets/rules/api-layer.md +25 -0
  44. package/assets/rules/browser-verification.md +42 -1
  45. package/assets/rules/component-structure.md +21 -0
  46. package/assets/rules/dependencies.md +22 -0
  47. package/assets/rules/doc-style.md +37 -5
  48. package/assets/rules/{entity-conventions.md → entity-conventions.needs-admin.md} +21 -0
  49. package/assets/rules/entity-models.md +21 -0
  50. package/assets/rules/git-workflow.azure.md +62 -8
  51. package/assets/rules/git-workflow.github.md +78 -14
  52. package/assets/rules/git-workflow.gitlab.md +61 -8
  53. package/assets/rules/lib-layers.md +25 -0
  54. package/assets/rules/lists.md +27 -0
  55. package/assets/rules/navigation.md +21 -0
  56. package/assets/rules/{observability.md → observability.needs-app.md} +23 -0
  57. package/assets/rules/permissions.md +23 -0
  58. package/assets/rules/platform-access.md +21 -0
  59. package/assets/rules/reuse-first.md +20 -0
  60. package/assets/rules/seo.md +19 -0
  61. package/assets/rules/shared-code.md +19 -0
  62. package/assets/rules/spec-driven.md +36 -0
  63. package/assets/rules/styling-bem.md +19 -0
  64. package/assets/rules/task-flow.md +150 -35
  65. package/assets/rules/testing.md +50 -0
  66. package/assets/rules/translations.md +21 -0
  67. package/assets/rules/typescript-conventions.md +33 -0
  68. package/assets/samples/specs/_template/spec.md +83 -0
  69. package/assets/samples/tasks/_template/grill.md +28 -0
  70. package/assets/samples/tasks/_template/plan.md +39 -0
  71. package/assets/samples/tasks/_template/progress.md +23 -0
  72. package/assets/skills/agent-kit-extend.md +24 -0
  73. package/assets/skills/agent-kit.md +69 -7
  74. package/assets/templates/rule.md +31 -2
  75. package/assets/traits.json +14 -0
  76. package/bin/agent-kit.d.ts.map +1 -1
  77. package/bin/agent-kit.js +31 -16
  78. package/bin/agent-kit.js.map +1 -1
  79. package/index.d.ts +1 -0
  80. package/index.d.ts.map +1 -1
  81. package/index.js +1 -0
  82. package/index.js.map +1 -1
  83. package/lib/argv.d.ts +17 -0
  84. package/lib/argv.d.ts.map +1 -0
  85. package/lib/argv.js +44 -0
  86. package/lib/argv.js.map +1 -0
  87. package/lib/cargo.d.ts +88 -0
  88. package/lib/cargo.d.ts.map +1 -0
  89. package/lib/cargo.js +16 -0
  90. package/lib/cargo.js.map +1 -0
  91. package/lib/catalog.d.ts +18 -1
  92. package/lib/catalog.d.ts.map +1 -1
  93. package/lib/catalog.js +12 -2
  94. package/lib/catalog.js.map +1 -1
  95. package/lib/commands.d.ts +0 -26
  96. package/lib/commands.d.ts.map +1 -1
  97. package/lib/commands.js +79 -122
  98. package/lib/commands.js.map +1 -1
  99. package/lib/companion.d.ts +37 -0
  100. package/lib/companion.d.ts.map +1 -1
  101. package/lib/companion.js +42 -1
  102. package/lib/companion.js.map +1 -1
  103. package/lib/config.d.ts +38 -1
  104. package/lib/config.d.ts.map +1 -1
  105. package/lib/config.js +24 -0
  106. package/lib/config.js.map +1 -1
  107. package/lib/ship.d.ts +39 -0
  108. package/lib/ship.d.ts.map +1 -0
  109. package/lib/ship.js +87 -0
  110. package/lib/ship.js.map +1 -0
  111. package/lib/shipment.d.ts +60 -0
  112. package/lib/shipment.d.ts.map +1 -0
  113. package/lib/shipment.js +247 -0
  114. package/lib/shipment.js.map +1 -0
  115. package/lib/snapshot.d.ts +30 -0
  116. package/lib/snapshot.d.ts.map +1 -0
  117. package/lib/snapshot.js +73 -0
  118. package/lib/snapshot.js.map +1 -0
  119. package/lib/traits.d.ts +32 -0
  120. package/lib/traits.d.ts.map +1 -0
  121. package/lib/traits.js +82 -0
  122. package/lib/traits.js.map +1 -0
  123. package/package.json +6 -2
  124. package/rt-tools-agent-kit-0.8.3.tgz +0 -0
  125. package/lib/submit.d.ts +0 -24
  126. package/lib/submit.d.ts.map +0 -1
  127. package/lib/submit.js +0 -26
  128. package/lib/submit.js.map +0 -1
  129. package/rt-tools-agent-kit-0.8.1.tgz +0 -0
@@ -21,7 +21,7 @@ description: Правило под «Закон о поставке» для д
21
21
  | задача | issue проекта, заголовок `[<КЛЮЧ>-<номер>] <Что не так>`, исполнитель — учётная запись машинной работы; MR прикрепляется к нему строкой `Closes #<номер>` в описании |
22
22
  | очередь работ | доска задач проекта — Issue Board. Задача попадает на неё меткой списка, а не самим фактом заведения: доска показывает те issue, чью метку знает |
23
23
  | состояние задачи в очереди работ | список доски, за которым стоит метка: заведённая, взятая в работу, ждущая разбора. Имена меток — в `implementation.md`; закрытая задача уходит из очереди слиянием, а не переносом в последний список |
24
- | отчёт о задаче | заголовок MR `[<КЛЮЧ>-<номер>] <Что сделано>` — тот же номер, что у задачи, и её название, переведённое в сделанное; тип и область коммита сюда не идут |
24
+ | PR о задаче | заголовок MR `[<КЛЮЧ>-<номер>] <Что сделано>` — тот же номер, что у задачи, и её название, переведённое в сделанное; тип и область коммита сюда не идут |
25
25
  | обсуждение правки | разбор MR: ревьювер — владелец проекта, исполнитель — учётная запись машинной работы, метки — те же, что у задачи |
26
26
  | попадание правки в главную ветку | слияние MR; оно же запускает выкатку — `.gitlab-ci.yml` |
27
27
  | образ того коммита | `IMAGE_TAG=<sha>` в командах `docker compose` на сервере |
@@ -35,6 +35,30 @@ description: Правило под «Закон о поставке» для д
35
35
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
36
36
  же дереве, которое держит код иначе.
37
37
 
38
+ ## Ход
39
+
40
+ Ход работы от задачи до слияния: где стоит гард, что двигает колонку очереди работ и чем
41
+ работа кончается.
42
+
43
+ ```mermaid
44
+ flowchart TD
45
+ A[Работа начинается] --> B[Задача заводится командой и встаёт в очередь работ]
46
+ B --> C[Ветка называется номером задачи; колонка двигается тем же движением]
47
+ C --> D{Правка готова}
48
+ D -->|Нет| C
49
+ D -->|Да| E[Главная ветка влита, набор гейта прогнан целиком]
50
+ E --> F{Ветка несёт номер задачи}
51
+ F -->|Нет| G[Гард поставки отбивает открытие: за правкой ничего не стоит в очереди]
52
+ F -->|Да| H[PR открывается; не готовое к слиянию идёт черновиком]
53
+ H --> I[Колонка задачи переходит в разбор, исполнитель берёт следующую задачу]
54
+ I --> J{Прогон и разбор кончились}
55
+ J -->|Прогон красный| K[Чинится в той же ветке]
56
+ K --> J
57
+ J -->|Зелено| L[Папка задачи разбирается последним коммитом, черновик снимается]
58
+ L --> M[Слияние нажимает человек: исполнитель просит и называет номер]
59
+ G --> B
60
+ ```
61
+
38
62
  ## Как закон применяется здесь
39
63
 
40
64
  - **Коммит в главную ветку отбивается гардом.** Гард ищет вызов коммита в любом месте команды
@@ -47,6 +71,23 @@ description: Правило под «Закон о поставке» для д
47
71
  вершина главной ветки не стала предком текущей, и называет расхождение числом коммитов. MR с
48
72
  разошедшейся ветки показывает ревьюверу свою правку вперемешку с чужой, а всё, что автор
49
73
  проверил до публикации, он проверил от основания, которого в главной ветке уже нет.
74
+ - **Правка кода отдаётся человеку открытым MR, а не запушенной веткой.** Ветка в списке ветвей
75
+ ему не показывается, в дела не приходит и обсуждения не имеет: до открытия MR правки для
76
+ человека нет. Открывается он тем же ходом, которым исполнитель говорит, что работу отдаёт, и
77
+ в ответе называется номером.
78
+ - **Не готовое к слиянию открывается черновиком — `glab mr create --draft`.** Кнопка слияния у
79
+ черновика заблокирована самим хостингом, поэтому состояние «выложено на обозрение» и
80
+ состояние «можно вливать» перестают выглядеть одинаково. Черновиком идёт всё, что ждёт
81
+ прогона конвейера, доработки или ответа на вопрос; вопрос задаётся в самом MR. Признак
82
+ черновика здесь — приставка `Draft:` в заголовке, и правится он вместе с ним.
83
+ - **Черновик снимается отдельным вызовом — `glab mr update <номер> --ready`.** Им исполнитель
84
+ отвечает за готовность: проверки пройдены, доработок не осталось, работа сходится с задачей.
85
+ Снятие черновика и просьба влить — один ход, а не два разных дня.
86
+ - **Заведённая задача подтверждается ответом очереди работ, а не выводом команды заведения.**
87
+ Команда отвечает за свои вызовы: она может завести задачу и не довести её до доски, и её
88
+ собственный разбор ошибок этот случай называет. Напечатанный номер значит «вызов прошёл», а не
89
+ «задача видна тому, кто по ней работает». Спрашивается очередь — по номеру, одним вызовом, — и
90
+ ответ читается присутствием задачи на доске, её списком и исполнителем.
50
91
  - **Номер ветки и номер в заголовке MR сверяются на месте, а состояние задачи — по доске.**
51
92
  Формат читается из текста команды и работает без сети; существование задачи, её метка
52
93
  списка, исполнитель и то, что она ещё открыта, — только когда есть чем спросить. Нет сети
@@ -56,15 +97,27 @@ description: Правило под «Закон о поставке» для д
56
97
  переставляется во взятые в работу, MR открыт — в ждущие разбора; делает это команда
57
98
  перевода, а не набор вызовов по памяти. Перевод идёт сразу за шагом, который его вызвал:
58
99
  очередь работ читают между шагами, а не после них.
59
- - **Отставший список находится сверкой очереди, а не глазами.** Сверка судит список по отчёту
100
+ - **На доске стоят задачи, а не MR о них.** Доска показывает, что сделано и что осталось; MR
101
+ отвечает на другой вопрос — как именно сделано, — и открывается из задачи, где связь с ним
102
+ стоит сама. Карточка MR живёт своей жизнью: метки списка у неё нет, из очереди она не уходит и
103
+ остаётся в ней после слияния навсегда. Здесь она заводится проще, чем где-либо: доска
104
+ собирается по меткам, и метка списка, поставленная на MR, тут же делает его карточкой.
105
+ Находит такие сверка очереди — строкой на каждую.
106
+ - **Конвейер судит по составу правки, а не гоняет всё подряд.** Шаги, которым нечего проверять,
107
+ пропускаются по признаку, посчитанному от главной ветки: ветка, не тронувшая ни строки кода,
108
+ не поднимает стенда, не снимает кадров и не собирает образов. Правила `rules:changes` считают
109
+ это сами, но по путям, а не по составу правки — совпадение пути ещё не значит, что задета
110
+ сборка, поэтому признак объявляется явно и один раз. Пропущенный шаг виден в прогоне
111
+ пропущенным — молча выпавший читается как пройденный.
112
+ - **Отставший список находится сверкой очереди, а не глазами.** Сверка судит список по PR
60
113
  в обе стороны: открытый MR при задаче не в разборе и разбор без открытого MR — оба
61
114
  расхождения. Момента, когда задачу берут в работу, ей не видно: ветки на доске нет.
62
115
  - **Задачи, чинящиеся одной правкой, сливаются до слияния ветки.** Вторая стирается вместе с
63
116
  номером, а недостающее из неё дописывается в первую. После слияния слить уже нельзя: ветка
64
117
  въехала, и откатывается она целиком.
65
118
  - **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка
66
- на доске и строка о заходах с передачей в линии работ говорят одно и то же двум читателям:
67
- исполнитель открывает карточку раньше, чем линию, а планирует по линии. Одна пометка без
119
+ на доске и строка о заходах с передачей в замысле эпика говорят одно и то же двум читателям:
120
+ исполнитель открывает карточку раньше, чем замысел эпика, а планирует по замыслу. Одна пометка без
68
121
  другой лжёт молча, поэтому сверка очереди судит пару в обе стороны. Помечается только то, что
69
122
  законно не делится: пометка объёма правом делить не становится.
70
123
  - **Слияние в главную ветку выкатывает прод.** Правила `only`/`rules` конвейера покрывают
@@ -88,9 +141,9 @@ description: Правило под «Закон о поставке» для д
88
141
  там кончается. Прогон команд задания на своей машине его не покрывает: он проверяет команды,
89
142
  а не файл конвейера, — верность самого файла читается только по списку конвейеров после
90
143
  пуша, и синтаксис отдельно судит проверка `.gitlab-ci.yml` в проекте.
91
- - **Отчёт проверяется до слияния тем же конвейером, что и главная ветка.** Проверки и сборки
144
+ - **PR проверяется до слияния тем же конвейером, что и главная ветка.** Проверки и сборки
92
145
  образов идут на конвейере запроса слияния, выкатка — нет: её держит правило по главной ветке
93
- у своего задания, а образ отчёта в реестр не уезжает.
146
+ у своего задания, а образ PR в реестр не уезжает.
94
147
  - **Расхождение прода с главной веткой видно сверкой очереди работ.** Задача уходит из очереди
95
148
  слиянием, но слияние — ещё не прод: отказавшая выкатка не трогает ни задачу, ни её список, и
96
149
  заметить её неоткуда. Сверка спрашивает последний конвейер главной ветки и судит только
@@ -144,7 +197,7 @@ description: Правило под «Закон о поставке» для д
144
197
 
145
198
  Гард поставки стоит на командах агента, поэтому ветку, заведённую руками в редакторе, он не
146
199
  видит: имя такой ветки держится памятью. Требование от этого не слабеет — просто отдельной
147
- проверки под него не заводится: работа опознаётся заголовком задачи и отчёта, а это сверяется
200
+ проверки под него не заводится: работа опознаётся заголовком задачи и PR, а это сверяется
148
201
  у всех. Сверка очереди имя ветки не судит вовсе: у открытого MR его не переименовать.
149
202
 
150
203
  Взятие задачи в работу не стережёт ничто: доска ветки не видит, а гард поставки её видит, но
@@ -188,7 +241,7 @@ description: Правило под «Закон о поставке» для д
188
241
  - **Учётная запись для пуша и автор MR выбираются отдельно.** Если пушить пришлось из-под другой
189
242
  записи, на следующий вызов это не переносится: MR открывают токеном учётной записи машинной
190
243
  работы, и от того, чьей записью он открыт, зависит, кого можно назначить ревьювером. Однажды
191
- смена записи ради пуша утекла в публикацию — отчёт вышел от владельца.
244
+ смена записи ради пуша утекла в публикацию — PR вышел от владельца.
192
245
  - **Невалидный файл конвейера виден отказом сразу после пуша, а не упавшим заданием.** Конвейер
193
246
  на такой файл не заводится вовсе: в списке стоит запись об ошибке разбора, а внутри нет ни
194
247
  задания, ни лога. Поэтому список конвейеров ветки смотрится тем же движением, что и пуш —
@@ -31,6 +31,31 @@ description: Правило под «Закон об импортах между
31
31
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
32
32
  же дереве, которое держит код иначе.
33
33
 
34
+ ## Ход
35
+
36
+ Ход заведения общего символа: где он должен жить, что делать с недостающим правом импорта и чем
37
+ проверяется граница.
38
+
39
+ ```mermaid
40
+ flowchart TD
41
+ A[Нужен общий символ] --> B{Он про предмет или про механику}
42
+ B -->|Предмет| C[Живёт в домене этого предмета]
43
+ B -->|Механика, общая нескольким доменам| D[Живёт в основании семейства, а не в новом домене]
44
+ C --> E{Импорт разрешён границами}
45
+ D --> E
46
+ E -->|Да| F[Импортируется по алиасу либы]
47
+ E -->|Нет| G{Право законно}
48
+ G -->|Да| H[Дописывается строкой в настройке границ, с причиной]
49
+ G -->|Нет| I[Символ переезжает туда, откуда его видно обеим сторонам]
50
+ H --> F
51
+ I --> F
52
+ F --> J{Символ чужой}
53
+ J -->|Да| K[Наружу не реэкспортируется ни одной формой: барель отдаёт только своё]
54
+ J -->|Нет| L[Барель отдаёт его алиасом, а не относительным путём]
55
+ K --> M[Граница проверяется внесённым нарушением, а не зелёным прогоном]
56
+ L --> M
57
+ ```
58
+
34
59
  ## Как закон применяется здесь
35
60
 
36
61
  - **Чужой символ не реэкспортируется ни одной из двух форм.** Запрещены и
@@ -28,6 +28,33 @@ description: Правило под «Закон о списке записей»
28
28
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
29
29
  же дереве, которое держит код иначе.
30
30
 
31
+ ## Ход
32
+
33
+ Ход сборки списочного экрана: что берётся готовым, где решается сортировка и отбор, и что
34
+ происходит с действиями строки.
35
+
36
+ ```mermaid
37
+ flowchart TD
38
+ A[Нужен список записей] --> B[Страница собирается общим компонентом, механика — общей основой]
39
+ B --> C[Таблица объявляется самим экраном и лежит внутри его шаблона]
40
+ C --> D[Строки объявляются на столбцах таблицы, а не на своём списке]
41
+ D --> E{Колонка сортируема}
42
+ E -->|Да| F[Заголовок называет поле сервера, а не ключ колонки]
43
+ E -->|Нет| G[Ячейка шапки идёт без заголовка сортировки]
44
+ F --> H[Сортировка и отбор читаются из ответа, а не из своего запроса]
45
+ G --> H
46
+ H --> I{Что делает нажатие}
47
+ I -->|Открыть запись| J[Клик по строке]
48
+ I -->|Действие над записью| K[Меню строки; доступность лежит полем строки]
49
+ K --> L{Доступных действий не осталось}
50
+ L -->|Да| M[Кнопка меню не рисуется вовсе]
51
+ L -->|Нет| N[Недоступные пункты не рисуются, доступные — рисуются]
52
+ J --> O{Загрузка отказала}
53
+ M --> O
54
+ N --> O
55
+ O -->|Да| P[Отказ подаётся тостом, а не строкой над таблицей]
56
+ ```
57
+
31
58
  ## Как закон применяется здесь
32
59
 
33
60
  - **Страница собирается общим компонентом страницы списка, а не своей разметкой.** Заголовок,
@@ -27,6 +27,27 @@ description: Правило под «Закон о навигации по ра
27
27
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
28
28
  же дереве, которое держит код иначе.
29
29
 
30
+ ## Ход
31
+
32
+ Ход заведения раздела: одна декларация на пункт и маршрут, два слоя гейтинга и путь данных в
33
+ шапку.
34
+
35
+ ```mermaid
36
+ flowchart TD
37
+ A[Заводится раздел] --> B[Пункт объявляется один раз: он же источник меню и гейтинга маршрутов]
38
+ B --> C{Раздел чем закрыт}
39
+ C -->|Правом пользователя| D[Право стоит в декларации пункта]
40
+ C -->|Флагом раздела| E[Пункт объявляется без своего экрана, с подсказкой почему]
41
+ C -->|Ничем| F[Пункт открыт всем, кто вошёл]
42
+ D --> G[Маршрут закрывается тем же объявлением, а не своим списком]
43
+ E --> G
44
+ F --> G
45
+ G --> H{Шапке нужны данные домена}
46
+ H -->|Да| I[Приходят токеном: декларация не импортирует оболочку приложения]
47
+ H -->|Нет| J[Готово]
48
+ I --> J
49
+ ```
50
+
30
51
  ## Как закон применяется здесь
31
52
 
32
53
  - **Пункт объявляется один раз и служит источником и меню, и гейтинга маршрутов.** Второе
@@ -30,6 +30,29 @@ description: Правило под «Закон о наблюдаемости».
30
30
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
31
31
  же дереве, которое держит код иначе.
32
32
 
33
+ ## Ход
34
+
35
+ Ход обработки запроса глазами наблюдаемости: где заводится номер обращения, чем отличается
36
+ отказ от поломки и что уходит наружу.
37
+
38
+ ```mermaid
39
+ flowchart TD
40
+ A[Пришёл запрос] --> B{Номер обращения пришёл снаружи}
41
+ B -->|Да| C[Чистится и укорачивается]
42
+ B -->|Нет| D[Заводится заново, один на весь запрос]
43
+ C --> E[Стоит в каждой строке лога об этом запросе]
44
+ D --> E
45
+ E --> F{Чем кончилась работа}
46
+ F -->|Сделано| G[Ответ уходит с номером обращения в заголовке]
47
+ F -->|Ввод или права| H[Пишется отдельно от поломки и без стека: это сработавшая проверка]
48
+ F -->|Поломка| I[Причина разбирается в одном месте, поля строки вычищаются всегда]
49
+ H --> J[Наружу — код и общий текст; подробности остаются в логах]
50
+ I --> J
51
+ J --> K[Номер обращения стоит и в подробностях отказа]
52
+ G --> L[Готово]
53
+ K --> L
54
+ ```
55
+
33
56
  ## Как закон применяется здесь
34
57
 
35
58
  - **Номер обращения заводится один раз на запрос и стоит в каждой строке лога о нём.** По
@@ -28,6 +28,29 @@ description: Правило под «Закон о доступе». Брать
28
28
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
29
29
  же дереве, которое держит код иначе.
30
30
 
31
+ ## Ход
32
+
33
+ Ход проверки доступа: чем закрыта процедура, откуда берутся права вошедшего и чем отличается
34
+ отсутствие входа от отсутствия права.
35
+
36
+ ```mermaid
37
+ flowchart TD
38
+ A[Вызов процедуры] --> B{Каким видом доступа она объявлена}
39
+ B -->|Публично| C{Она заводит запись}
40
+ C -->|Да| D[Работает ещё и ограничитель частоты]
41
+ C -->|Нет| E[Работа идёт]
42
+ B -->|Любому вошедшему| F{Вход есть}
43
+ B -->|По праву| F
44
+ F -->|Нет| G[Отбивается как неаутентифицированный]
45
+ F -->|Да| H{Учётная запись ещё существует}
46
+ H -->|Нет| G
47
+ H -->|Да| I[Права читаются при каждом вызове: пресет плюс личные правки поверх]
48
+ I --> J{Право дано}
49
+ J -->|Да| E
50
+ J -->|Нет, либо роль о нём молчит| K[Отбивается как отказ в доступе: молчание — не разрешение]
51
+ D --> E
52
+ ```
53
+
31
54
  ## Как закон применяется здесь
32
55
 
33
56
  - **Каждая процедура объявляет свой доступ декоратором, и объявление ровно одно.**
@@ -34,6 +34,27 @@ description: Правило под «Закон о фронтовом прило
34
34
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
35
35
  же дереве, которое держит код иначе.
36
36
 
37
+ ## Ход
38
+
39
+ Ход обращения к среде исполнения: чем берётся глобальный объект, где проверяется среда и что
40
+ делается в файле без внедрения зависимостей.
41
+
42
+ ```mermaid
43
+ flowchart TD
44
+ A[Коду нужен глобальный объект или среда] --> B{Где он лежит}
45
+ B -->|Класс с внедрением зависимостей| C[Глобальный объект приходит токеном, а не берётся напрямую]
46
+ B -->|Чистая функция| D[Окно принимается параметром: внедрения там нет]
47
+ C --> E{Нужно знать, где исполняется код}
48
+ D --> E
49
+ E -->|Да| F[Спрашивается служба платформы, а не наличие имени в окружении]
50
+ E -->|Нет| G[Работа идёт]
51
+ F --> G
52
+ G --> H{Класс создаётся на подъёме приложения}
53
+ H -->|Да| I[Проверяется и отдача страницы сервером: линтер этого не видит]
54
+ H -->|Нет| J[Готово]
55
+ I --> J
56
+ ```
57
+
37
58
  ## Как закон применяется здесь
38
59
 
39
60
  - **Глобальный объект приходит токеном `WINDOW`, а не берётся напрямую.** Тип уточняется
@@ -25,6 +25,26 @@ description: Правило под «Закон о единообразии пр
25
25
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
26
26
  же дереве, которое держит код иначе.
27
27
 
28
+ ## Ход
29
+
30
+ Ход заведения нового: с чего начинается работа, где проходит граница между расширением готового
31
+ и своим, и чем эта граница держится.
32
+
33
+ ```mermaid
34
+ flowchart TD
35
+ A[Нужен новый экран, компонент или поле] --> B[Читается готовое: набор приложения, общие основы, соседний экран]
36
+ B --> C{Готовое подходит}
37
+ C -->|Да| D[Берётся как есть]
38
+ C -->|Почти| E[Расширяется там, где живёт, а не клонируется рядом]
39
+ C -->|Нет| F{Владелец одобрил своё}
40
+ F -->|Да| G[Заводится своё, и это записано решением]
41
+ F -->|Нет| H[Спрашивается: свой примитив без слова владельца не заводится]
42
+ E --> I[Компонент объявляется тремя файлами, сообщения идут общей шиной]
43
+ D --> I
44
+ G --> I
45
+ H --> I
46
+ ```
47
+
28
48
  ## Как закон применяется здесь
29
49
 
30
50
  - **Источник вида выбирается по приложению, а не по привычке.** У каждого приложения дерева
@@ -30,6 +30,25 @@ description: Правило под «Закон о видимости в пои
30
30
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
31
31
  же дереве, которое держит код иначе.
32
32
 
33
+ ## Ход
34
+
35
+ Ход отдачи страницы поисковику: что ставится в разметку, чем связаны локали и что делается с
36
+ прежним адресом.
37
+
38
+ ```mermaid
39
+ flowchart TD
40
+ A[Страница отдаётся] --> B[Свои теги помечаются признаком и при повторе переписываются, а не множатся]
41
+ B --> C[Канонический адрес ведёт на локализованный путь этой страницы]
42
+ C --> D[Связи локалей строятся по готовым локалям плюс запасная]
43
+ D --> E{Локаль самой страницы}
44
+ E -->|В список запасных не попадает| F[Иначе она объявлена и своей, и чужой]
45
+ F --> G[Данные для поиска отдаются блоками: отказ одного не уносит остальные]
46
+ G --> H{Адрес страницы менялся}
47
+ H -->|Да| I[С прежнего идёт перенаправление со сроком хранения, покрытое проверкой]
48
+ H -->|Нет| J[Готово]
49
+ I --> J
50
+ ```
51
+
33
52
  ## Как закон применяется здесь
34
53
 
35
54
  - **Свои теги помечены атрибутом `data-<префикс>-seo`** и при повторном применении переписываются.
@@ -27,6 +27,25 @@ description: Правило под «Закон об общем коде при
27
27
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
28
28
  же дереве, которое держит код иначе.
29
29
 
30
+ ## Ход
31
+
32
+ Ход заведения общего значения: где оно живёт, что считается копией и чем сверяются стороны.
33
+
34
+ ```mermaid
35
+ flowchart TD
36
+ A[Значение нужно обеим сторонам] --> B{Оно уже есть в общем наборе}
37
+ B -->|Да| C[Берётся оттуда: своё с теми же членами — копия, и она разойдётся молча]
38
+ B -->|Нет| D{Оно про предмет домена}
39
+ D -->|Да| E[Живёт в домене: перечисления полей порядка и отбора копией не считаются]
40
+ D -->|Нет| F[Живёт в общей либе и оттуда берётся обеими сторонами]
41
+ C --> G{Пришло значение вне набора}
42
+ E --> G
43
+ F --> G
44
+ G -->|Да| H[Сверяется общей парой функций, а разбирает промах вызывающий: политика у сторон разная]
45
+ G -->|Нет| I[Готово]
46
+ H --> I
47
+ ```
48
+
30
49
  ## Как закон применяется здесь
31
50
 
32
51
  - **Число-настройка лежит в `libs/common/util` и оттуда берётся обеими сторонами.** Умолчание
@@ -56,6 +56,31 @@ description: Правило под «Закон о документации пр
56
56
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
57
57
  же дереве, которое держит код иначе.
58
58
 
59
+ ## Ход
60
+
61
+ Ход заведения текста: какой слой пишется, чем утверждение привязывается к коду и что происходит
62
+ со сценарием после выкатки.
63
+
64
+ ```mermaid
65
+ flowchart TD
66
+ A[Пишется текст о продукте или о работе] --> B{О чём он}
67
+ B -->|Что должно быть верно, без имён| C[Закон: обязателен раздел статей, путей в нём нет]
68
+ B -->|Каким приёмом это держится здесь| D[Правило: объявляет свой закон, имена — в компаньоне рядом]
69
+ B -->|Готовый код и приём| E[Паттерн: объявляет своё правило]
70
+ B -->|Как работает домен| F[Спек домена: объявляет законы, которые применяет]
71
+ D --> G{У утверждения есть место в коде}
72
+ F --> G
73
+ G -->|Да| H[Ставится строка привязки; связь сверяется в обе стороны]
74
+ G -->|Нет| I[Это намерение: уходит в открытые вопросы, а не в правила]
75
+ H --> J{Заводится сценарий}
76
+ J -->|Да| K[Номер выдаётся новый и повторно не используется; заголовок теста правится тем же изменением]
77
+ J -->|Нет| L[Готово]
78
+ C --> L
79
+ E --> L
80
+ K --> L
81
+ I --> L
82
+ ```
83
+
59
84
  ## Как закон применяется здесь
60
85
 
61
86
  - **Набор разделов спека задан заранее, и отсутствие раздела — отказ.** «Не применимо» —
@@ -113,6 +138,10 @@ description: Правило под «Закон о документации пр
113
138
  паттерны, и поиск по имени правила таких не видит: сверка ищет их полем, человек — разделом
114
139
  «Паттерны» самого правила. Счёт паттернов, собранный приставками, выходит меньше настоящего, а
115
140
  число потом уезжает в деление работы.
141
+ - **Решение из спека уходит в слой, а не в описание прошлого.** Что сверяется у спека, машина
142
+ знает; куда девается принятое решение — не знает и не узнает: отличить действующее требование
143
+ от рассказа о состоявшемся может только тот, кто спросит «останется ли это верным завтра».
144
+ Держится это шагом разбора закрытой работы и признаком отбора, записанным там заранее.
116
145
  - **Якорь сверяется по сырому тексту файла, и комментарий засчитывается наравне с кодом.**
117
146
  Существование символа проверка ищет словом по всему файлу, не вычищая комментарии, а живость
118
147
  считает только у объявленного в коде. Имя, стоящее в одном лишь пояснении, проходит мимо обеих
@@ -132,6 +161,13 @@ description: Правило под «Закон о документации пр
132
161
  доменов раньше, чем код научился в него приходить, и всё это время читалось описанием
133
162
  работающего.
134
163
 
164
+ Полноту разделов у самого закона, правила и паттерна здесь не проверяет ничто. Статьи о том,
165
+ что текст судится не слабее своей копии, что невыбранная редакция судится наравне с выбранной и
166
+ что набор разделов объявлен отдельно от образца, исполняются там, где эти тексты пишут, — в
167
+ наборе того пакета, который их везёт. В дереве-потребителе лежат разложенные копии, и краснеть
168
+ у него на промахе, который правится не у него, проверка не должна. Согласие двух текстов между
169
+ собой не считается нигде и ни у кого: оно ищется чтением.
170
+
135
171
  ## Паттерны
136
172
 
137
173
  - `spec-driven-domain` — заведение и правка спека домена, сценарии, привязка.
@@ -27,6 +27,25 @@ description: Правило под «Закон о фронтовом прило
27
27
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
28
28
  же дереве, которое держит код иначе.
29
29
 
30
+ ## Ход
31
+
32
+ Ход правки оформления: откуда берётся значение, где живёт раскладка и чем открывается
33
+ всплывающее.
34
+
35
+ ```mermaid
36
+ flowchart TD
37
+ A[Правится оформление] --> B{Что задаётся}
38
+ B -->|Цвет, отступ, кегль| C[Берётся токеном оформления, а не пишется значением на месте]
39
+ B -->|Раскладка экрана| D[Объявляется в общем слое приложения, а не в стилях экрана]
40
+ B -->|Слой поверх страницы| E[Открывается службой набора; номер слоя берётся из шкалы]
41
+ C --> F[Класс ставится директивой, и у каждого класса элемента есть своё правило]
42
+ D --> F
43
+ E --> F
44
+ F --> G{Размер элемента управления}
45
+ G -->|Выбирается по признаку указателя, а не по ширине экрана| H[Файл стилей держится в пределах длины]
46
+ H --> I[Прогон линтера стилей: предупреждение роняет его наравне с ошибкой]
47
+ ```
48
+
30
49
  ## Как закон применяется здесь
31
50
 
32
51
  - **Оформление берётся токеном `--rt-*`, а не пишется значением на месте.** Составные