@rt-tools/agent-kit 0.8.2 → 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 (66) hide show
  1. package/README.md +1 -0
  2. package/assets/agents/rules-reviewer.md +83 -0
  3. package/assets/checks/check-dupes.mjs +66 -6
  4. package/assets/checks/check-specs.mjs +100 -15
  5. package/assets/checks/rt-kit-checks.config.mjs +9 -0
  6. package/assets/commands/feedback.md +95 -0
  7. package/assets/commands/rules-review.md +98 -0
  8. package/assets/commands/skill-curator.md +39 -22
  9. package/assets/docs/GLOSSARY.md +21 -20
  10. package/assets/hooks/reuse-first-guard.sh +16 -2
  11. package/assets/hooks/skill-gate.sh +1 -1
  12. package/assets/hooks/task-flow-guard.sh +16 -2
  13. package/assets/hooks/waiting-turn-guard.sh +87 -0
  14. package/assets/laws/delivery.md +28 -0
  15. package/assets/laws/project-documentation.md +18 -0
  16. package/assets/laws/work-conduct.md +16 -0
  17. package/assets/patterns/git-workflow-commit.azure.md +74 -2
  18. package/assets/patterns/git-workflow-commit.github.md +75 -2
  19. package/assets/patterns/git-workflow-commit.gitlab.md +75 -4
  20. package/assets/patterns/git-workflow-docker.md +30 -0
  21. package/assets/patterns/task-flow-close.md +154 -47
  22. package/assets/patterns/task-flow-handoff.md +1 -1
  23. package/assets/patterns/task-flow-resume.md +3 -3
  24. package/assets/patterns/task-flow-start.md +32 -5
  25. package/assets/rules/angular-patterns.md +22 -0
  26. package/assets/rules/api-layer.md +25 -0
  27. package/assets/rules/browser-verification.md +32 -0
  28. package/assets/rules/component-structure.md +21 -0
  29. package/assets/rules/dependencies.md +22 -0
  30. package/assets/rules/doc-style.md +24 -0
  31. package/assets/rules/entity-conventions.needs-admin.md +21 -0
  32. package/assets/rules/entity-models.md +21 -0
  33. package/assets/rules/git-workflow.azure.md +50 -1
  34. package/assets/rules/git-workflow.github.md +48 -2
  35. package/assets/rules/git-workflow.gitlab.md +49 -1
  36. package/assets/rules/lib-layers.md +25 -0
  37. package/assets/rules/lists.md +27 -0
  38. package/assets/rules/navigation.md +21 -0
  39. package/assets/rules/observability.needs-app.md +23 -0
  40. package/assets/rules/permissions.md +23 -0
  41. package/assets/rules/platform-access.md +21 -0
  42. package/assets/rules/reuse-first.md +20 -0
  43. package/assets/rules/seo.md +19 -0
  44. package/assets/rules/shared-code.md +19 -0
  45. package/assets/rules/spec-driven.md +32 -0
  46. package/assets/rules/styling-bem.md +19 -0
  47. package/assets/rules/task-flow.md +107 -17
  48. package/assets/rules/testing.md +31 -0
  49. package/assets/rules/translations.md +21 -0
  50. package/assets/rules/typescript-conventions.md +21 -0
  51. package/assets/samples/specs/_template/spec.md +83 -0
  52. package/assets/samples/tasks/_template/grill.md +28 -0
  53. package/assets/samples/tasks/_template/plan.md +39 -0
  54. package/assets/samples/tasks/_template/progress.md +23 -0
  55. package/assets/skills/agent-kit.md +16 -2
  56. package/assets/templates/rule.md +31 -2
  57. package/lib/commands.d.ts.map +1 -1
  58. package/lib/commands.js +1 -0
  59. package/lib/commands.js.map +1 -1
  60. package/lib/config.d.ts +10 -1
  61. package/lib/config.d.ts.map +1 -1
  62. package/lib/config.js +4 -0
  63. package/lib/config.js.map +1 -1
  64. package/package.json +1 -1
  65. package/rt-tools-agent-kit-0.8.3.tgz +0 -0
  66. package/rt-tools-agent-kit-0.8.2.tgz +0 -0
@@ -31,6 +31,28 @@ description: Правило под «Закон о фронтовом прило
31
31
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
32
32
  же дереве, которое держит код иначе.
33
33
 
34
+ ## Ход
35
+
36
+ Ход правки класса приложения: с чего исполнитель начинает, где развилка между производным
37
+ значением и действием, и чем кончается каждая ветка.
38
+
39
+ ```mermaid
40
+ flowchart TD
41
+ A[Правится класс приложения] --> B{Что заводится}
42
+ B -->|Значение, выводимое из другого| C[computed: следит за сигналами, а не зовёт сервис]
43
+ B -->|Действие пользователя| D[Источник действия с суффиксом Source]
44
+ B -->|Состояние списка| E[Наследуется общая основа списочного стора]
45
+ D --> F[Подписка объявлена один раз при заведении, а не в методе]
46
+ F --> G{Прежний запрос ещё идёт}
47
+ G -->|Ответ нужен последний| H[Поток переключается]
48
+ G -->|Нужны все| I[Поток склеивается по очереди]
49
+ H --> J[Подписка гасится вместе с владельцем]
50
+ I --> J
51
+ C --> K[Готово]
52
+ E --> K
53
+ J --> K
54
+ ```
55
+
34
56
  ## Как закон применяется здесь
35
57
 
36
58
  - **Подписка объявляется один раз, а не в методе действия.** Метод толкает значение в
@@ -30,6 +30,31 @@ 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
+ E -->|Список| F[Один вход: выборка целиком]
45
+ E -->|Одна запись| G[Вход — её признак]
46
+ F --> H[Ответ кладётся в общий конвертер целиком]
47
+ H --> I[В ответе стоит применённая выборка, а не запрошенная]
48
+ G --> J[Фасад отдаёт контракт, сервис переводит в состояние домена]
49
+ I --> J
50
+ J --> K{Данные приходят разом}
51
+ K -->|Да| L[Пара отдаёт поток]
52
+ K -->|Нет, живой срез| M[Серверный стрим — объявленное исключение]
53
+ L --> N[Готово]
54
+ M --> N
55
+ D --> N
56
+ ```
57
+
33
58
  ## Как закон применяется здесь
34
59
 
35
60
  - **Домен ходит за данными парой классов: фасад зовёт процедуру, сервис переводит модели.**
@@ -26,6 +26,38 @@ description: Правило под «Закон о проверяемости».
26
26
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
27
27
  же дереве, которое держит код иначе.
28
28
 
29
+ ## Ход
30
+
31
+ Ход проверки через браузер: что выясняется до первого запроса, где развилка между поднятым и
32
+ не поднятым приложением и чем подтверждается вывод.
33
+
34
+ ```mermaid
35
+ flowchart TD
36
+ A[Нужна проверка в браузере] --> B{Порт занят}
37
+ B -->|Да| C[Выясняется, что именно отвечает]
38
+ B -->|Нет| D{Кто поднимает стенд}
39
+ C --> E{Отвечает то самое приложение}
40
+ E -->|Да| F[Второй экземпляр не поднимается]
41
+ E -->|Нет| T[Занявшее порт останавливается по идентификатору процесса, а не по имени команды]
42
+ T --> D
43
+ D -->|Владелец| U[Ему говорят сразу, а не в конце захода: агента отбивает гард]
44
+ D -->|Агент| V[Стенд поднимается]
45
+ U --> G[Драйвер водит браузер на закреплённом профиле]
46
+ V --> G
47
+ F --> G
48
+ G --> W{Экран публичный и это первый заход}
49
+ W -->|Да| X[Заход метится признаком служебного посещения: иначе он попадёт в счёт гостей]
50
+ W -->|Нет| H{Что проверяется}
51
+ X --> H
52
+ H -->|Путь запроса и отдача страницы| I[Проверка идёт за настоящим прокси]
53
+ H -->|Вёрстка| J[Замер вычисленных значений, а не взгляд]
54
+ I --> K{Расхождение объясняется кэшем}
55
+ J --> K
56
+ K -->|Да| L[Кэш чистится и замер повторяется: объяснение не подтверждение]
57
+ K -->|Нет| M[Вывод называет число и способ его получить]
58
+ L --> M
59
+ ```
60
+
29
61
  ## Как закон применяется здесь
30
62
 
31
63
  - **Второй экземпляр уже поднятого приложения не поднимается.** До первого запроса выясняется,
@@ -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
+ D --> F{Есть интерактивный элемент}
42
+ E --> F
43
+ F -->|Да| G[Ставится якорь для спек, а доступность — отдельными атрибутами]
44
+ F -->|Нет| H[Готово]
45
+ G --> I{Один компонент в обеих ветках условия}
46
+ I -->|Да| J[Это условная привязка: ветки сводятся в одну]
47
+ I -->|Нет| H
48
+ J --> H
49
+ ```
50
+
30
51
  ## Как закон применяется здесь
31
52
 
32
53
  - **Шаблон не зовёт методов.** Правило линтера банит `{{ getTotal() }}` и `@if
@@ -27,6 +27,28 @@ description: Правило под «Закон о поставке». Брат
27
27
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
28
28
  же дереве, которое держит код иначе.
29
29
 
30
+ ## Ход
31
+
32
+ Ход подъёма версии: где решается сама версия, где — граница переформатирования, и чем работа
33
+ кончается.
34
+
35
+ ```mermaid
36
+ flowchart TD
37
+ A[Нужна новая версия пакета] --> B{Верхняя граница чем задана}
38
+ B -->|Есть peer-диапазоны у зависимых| C[Граница берётся из них, а не из последнего номера в реестре]
39
+ B -->|Нет| D[Берётся последняя выпущенная]
40
+ C --> E{Версия выпущена недавно}
41
+ D --> E
42
+ E -->|Да, и она нужна прямо сейчас| F[Выписывается отдельно, с названной причиной]
43
+ E -->|Да, но не срочно| G[Выдерживается: свежая версия отзывается чаще старой]
44
+ E -->|Нет| H[Записывается точным номером, без диапазона]
45
+ F --> H
46
+ H --> I{Обновился форматтер или линтер}
47
+ I -->|Да| J[Переформатируется только то, что линтер и проверяет; новые правила разбираются поимённо]
48
+ I -->|Нет| K[Снимок дерева пересобирается, набор гоняется целиком]
49
+ J --> K
50
+ ```
51
+
30
52
  ## Как закон применяется здесь
31
53
 
32
54
  - **Версия пакета записана точным номером.** Из диапазона сегодня и через неделю поставится
@@ -27,6 +27,30 @@ 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
+ B -->|Нет| F{В тексте называется путь или имя файла}
42
+ D --> F
43
+ E --> F
44
+ F -->|Да| G[Путь проверяется командой: названный, но несуществующий читается как указание]
45
+ F -->|Нет| H{В тексте стоит число или утверждение о проверке}
46
+ G --> H
47
+ H -->|Число| I[Пересчитывается командой в том же изменении либо не пишется вовсе]
48
+ H -->|Проверка| J[Запускается, а не пересказывается]
49
+ H -->|Ни то ни другое| K[Документ едет тем же коммитом, что и правка, которую описывает]
50
+ I --> K
51
+ J --> K
52
+ ```
53
+
30
54
  ## Как закон применяется здесь
31
55
 
32
56
  - **Путь, названный в документе, существует.** Ссылка на переехавший файл читается как
@@ -28,6 +28,27 @@ 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
+ E -->|Пусто| H[Так не бывает: пустой поток гасит панель навсегда]
45
+ F --> I{Уход с панели}
46
+ G --> I
47
+ I -->|Есть несохранённые правки| J[Гард спрашивает — на всех путях закрытия сразу]
48
+ I -->|Нет| K[Уход идёт общим переходом к связанной записи, а не своим маршрутом]
49
+ J --> K
50
+ ```
51
+
31
52
  ## Как закон применяется здесь
32
53
 
33
54
  - **Асайд открывается маршрутом в аутлете `ro`, а не вызовом сервиса.** Программного открытия
@@ -28,6 +28,27 @@ 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
+ F -->|Да| G[Приведение идёт способом маппера, а не подстановкой по умолчанию]
44
+ F -->|Нет| H[Экраны читают только сторону состояния]
45
+ G --> H
46
+ H --> I{Нужны страница, порядок или отбор}
47
+ I -->|Да| J[Типы берутся из общего набора: второго такого не заводится]
48
+ I -->|Нет| K[Пустое выражается пустой строкой или нулём, а не отсутствием поля]
49
+ J --> K
50
+ ```
51
+
31
52
  ## Как закон применяется здесь
32
53
 
33
54
  - **У сущности две стороны, и обе лежат в неймспейсе `I<Сущность>`.** `Api` повторяет
@@ -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
  - **Коммит в главную ветку отбивается гардом.** Гард ищет вызов коммита в любом месте команды
@@ -48,6 +72,20 @@ description: Правило под «Закон о поставке» для д
48
72
  открытие, пока вершина главной ветки не стала предком текущей, и называет расхождение числом
49
73
  коммитов. PR с разошедшейся ветки показывает ревьюверу свою правку вперемешку с чужой, а всё,
50
74
  что автор проверил до публикации, он проверил от основания, которого в главной ветке уже нет.
75
+ - **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка в списке ветвей
76
+ ему не показывается, в его дела не приходит и обсуждения не имеет: до открытия PR правки для
77
+ человека нет. Открывается он тем же ходом, которым исполнитель говорит, что работу отдаёт, и
78
+ в ответе называется номером.
79
+ - **Не готовое к слиянию открывается черновиком — `az repos pr create --draft true`.** Кнопка
80
+ завершения у черновика заблокирована самим хостингом, поэтому состояние «выложено на
81
+ обозрение» и состояние «можно вливать» перестают выглядеть одинаково. Черновиком идёт всё,
82
+ что ждёт прогона конвейера, доработки или ответа на вопрос; вопрос задаётся в самом PR.
83
+ Конвейер проверок черновика по умолчанию не запускает — до снятия черновика он молчит, и это
84
+ молчание за зелёный прогон не принимается.
85
+ - **Черновик снимается отдельным вызовом — `az repos pr update --id <номер> --draft false`.**
86
+ Им исполнитель отвечает за готовность: проверки пройдены, доработок не осталось, работа
87
+ сходится с рабочим элементом. Снятие черновика и просьба влить — один ход, а не два разных
88
+ дня.
51
89
  - **Заведённый рабочий элемент подтверждается ответом очереди работ, а не выводом команды
52
90
  заведения.** Команда отвечает за свои вызовы: она может завести элемент и не довести его до
53
91
  доски, и её собственный разбор ошибок этот случай называет. Напечатанный номер значит «вызов
@@ -62,6 +100,17 @@ description: Правило под «Закон о поставке» для д
62
100
  элемент переводится в `Active`, PR открыт — в `Resolved`; делает это команда перевода, а не
63
101
  набор вызовов по памяти. Перевод идёт сразу за шагом, который его вызвал: очередь работ
64
102
  читают между шагами, а не после них.
103
+ - **На доске стоят рабочие элементы, а не PR о них.** Доска показывает, что сделано и что
104
+ осталось; PR отвечает на другой вопрос — как именно сделано, — и открывается из элемента, где
105
+ связь с ним стоит сама. Здесь эта связь ставится при создании PR, поэтому отдельная карточка
106
+ не нужна вовсе, а заведённая живёт своей жизнью: состояния под неё нет, из очереди она не
107
+ уходит и остаётся в ней после слияния навсегда. Находит такие сверка очереди — строкой на
108
+ каждую.
109
+ - **Конвейер судит по составу правки, а не гоняет всё подряд.** Шаги, которым нечего проверять,
110
+ пропускаются по признаку, посчитанному от главной ветки: ветка, не тронувшая ни строки кода,
111
+ не поднимает стенда, не снимает кадров и не собирает образов. Признак объявляется переменной
112
+ задания и считается один раз, а не переспрашивается в каждом условии. Пропущенный шаг виден в
113
+ прогоне пропущенным — молча выпавший читается как пройденный.
65
114
  - **Отставшее состояние находится сверкой очереди, а не глазами.** Сверка судит состояние по
66
115
  PR в обе стороны: открытый PR при элементе не в разборе и разбор без открытого PR — оба
67
116
  расхождения. Момента, когда задачу берут в работу, ей не видно: ветки на доске нет.
@@ -70,7 +119,7 @@ description: Правило под «Закон о поставке» для д
70
119
  въехала, и откатывается она целиком.
71
120
  - **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка
72
121
  на доске и строка о заходах с передачей в замысле эпика говорят одно и то же двум читателям:
73
- исполнитель открывает карточку раньше, чем линию, а планирует по линии. Одна пометка без
122
+ исполнитель открывает карточку раньше, чем замысел эпика, а планирует по замыслу. Одна пометка без
74
123
  другой лжёт молча, поэтому сверка очереди судит пару в обе стороны. Помечается только то, что
75
124
  законно не делится: пометка объёма правом делить не становится.
76
125
  - **Слияние в главную ветку выкатывает прод.** Фильтры путей конвейера покрывают документы
@@ -36,6 +36,30 @@ description: Правило под «Закон о поставке» для д
36
36
  переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
37
37
  же дереве, которое держит код иначе.
38
38
 
39
+ ## Ход
40
+
41
+ Ход работы от задачи до слияния: где стоит гард, что двигает колонку очереди работ и чем
42
+ работа кончается.
43
+
44
+ ```mermaid
45
+ flowchart TD
46
+ A[Работа начинается] --> B[Задача заводится командой и встаёт в очередь работ]
47
+ B --> C[Ветка называется номером задачи; колонка двигается тем же движением]
48
+ C --> D{Правка готова}
49
+ D -->|Нет| C
50
+ D -->|Да| E[Главная ветка влита, набор гейта прогнан целиком]
51
+ E --> F{Ветка несёт номер задачи}
52
+ F -->|Нет| G[Гард поставки отбивает открытие: за правкой ничего не стоит в очереди]
53
+ F -->|Да| H[PR открывается; не готовое к слиянию идёт черновиком]
54
+ H --> I[Колонка задачи переходит в разбор, исполнитель берёт следующую задачу]
55
+ I --> J{Прогон и разбор кончились}
56
+ J -->|Прогон красный| K[Чинится в той же ветке]
57
+ K --> J
58
+ J -->|Зелено| L[Папка задачи разбирается последним коммитом, черновик снимается]
59
+ L --> M[Слияние нажимает человек: исполнитель просит и называет номер]
60
+ G --> B
61
+ ```
62
+
39
63
  ## Как закон применяется здесь
40
64
 
41
65
  - **Коммит в главную ветку отбивается гардом.** Гард ищет вызов коммита в любом месте команды
@@ -72,6 +96,17 @@ description: Правило под «Закон о поставке» для д
72
96
  переставляется во взятые в работу, PR открыт — в ждущие разбора; делает это команда
73
97
  перевода, а не набор вызовов GraphQL по памяти. Перевод идёт сразу за шагом, который его
74
98
  вызвал: очередь работ читают между шагами, а не после них.
99
+ - **На борде стоят задачи, а не PR о них.** Борда показывает, что сделано и что осталось; PR
100
+ отвечает на другой вопрос — как именно сделано, — и открывается из карточки задачи, где связь
101
+ с ним заполняется сама полем «Linked pull requests». Карточка PR живёт своей жизнью: колонки
102
+ под неё нет, из очереди она не уходит и остаётся в ней после слияния навсегда. Заводится она
103
+ либо встроенным правилом борды, либо рукой; и то и другое выключается, а накопившееся
104
+ снимается. Находит их сверка очереди — строкой на каждую.
105
+ - **Конвейер судит по составу правки, а не гоняет всё подряд.** Шаги, которым нечего проверять,
106
+ пропускаются по признаку, посчитанному от главной ветки: ветка, не тронувшая ни строки кода,
107
+ не поднимает стенда, не снимает кадров и не собирает образов. Признак считается один раз и
108
+ объявляется выводом шага, а не переспрашивается в каждом условии. Пропущенный шаг виден в
109
+ прогоне пропущенным — молча выпавший читается как пройденный.
75
110
  - **Отставшая колонка находится сверкой очереди, а не глазами.** Сверка судит колонку по
76
111
  PR в обе стороны: открытый PR при задаче не в разборе и разбор без открытого PR — оба
77
112
  расхождения. Момента, когда задачу берут в работу, ей не видно: ветки на борде нет.
@@ -80,7 +115,7 @@ description: Правило под «Закон о поставке» для д
80
115
  откатывается она целиком.
81
116
  - **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка
82
117
  на борде и строка о заходах с передачей в замысле эпика говорят одно и то же двум читателям:
83
- исполнитель открывает карточку раньше, чем линию, а планирует по линии. Одна пометка без
118
+ исполнитель открывает карточку раньше, чем замысел эпика, а планирует по замыслу. Одна пометка без
84
119
  другой лжёт молча, поэтому сверка очереди судит пару в обе стороны. Помечается только то, что
85
120
  законно не делится: пометка объёма правом делить не становится.
86
121
  - **Мерж в главную ветку выкатывает прод.** Исключения по путям покрывают только документы,
@@ -138,10 +173,21 @@ description: Правило под «Закон о поставке» для д
138
173
  сломана, она описывает вчерашний день. Сравнение веток пишется от `origin/main` целиком —
139
174
  смешав в одной команде удалённую ссылку для одной стороны и локальную для другой, промах
140
175
  изнутри выглядит правильным.
176
+ - **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка в списке ветвей
177
+ ему не показывается, во входящие не приходит и обсуждения не имеет: до открытия PR правки
178
+ для человека нет. Открывается он тем же ходом, которым исполнитель говорит, что работу
179
+ отдаёт, и в ответе называется номером.
180
+ - **Не готовое к слиянию открывается черновиком — `gh pr create --draft`.** Кнопка слияния у
181
+ черновика заблокирована самим хостингом, поэтому состояние «выложено на обозрение» и
182
+ состояние «можно вливать» перестают выглядеть одинаково. Черновиком идёт всё, что ждёт
183
+ прогона конвейера, доработки или ответа на вопрос; вопрос задаётся в самом PR.
184
+ - **Черновик снимается отдельным вызовом — `gh pr ready <номер>`.** Им исполнитель отвечает за
185
+ готовность: проверки пройдены, доработок не осталось, работа сходится с задачей. Снятие
186
+ черновика и просьба влить — один ход, а не два разных дня.
141
187
  - **Мерж PR нажимает человек, а не исполнитель работы.** Кнопка и вызов слияния равны: запрет
142
188
  на них один. Исполнитель сливает свой PR только тогда, когда человек сказал это прямо и про
143
189
  этот PR; сказанное об одном PR на следующий не переносится, а молчание разрешением не
144
- бывает. Работа кончается открытым и зелёным PR, и в ответе называется его номер.
190
+ бывает. Работа кончается PR, с которого снят черновик, и в ответе называется его номер.
145
191
  - **Автор PR не может быть его ревьювером.** Запрос разбора на самого себя GitHub принимает и
146
192
  молча не создаёт — разбор при этом выглядит запрошенным.
147
193
  - **Метки, исполнитель и ревьювер PR ставятся вызовами `gh api`, а не `gh pr edit`.** На
@@ -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,18 @@ 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
+ Снятие черновика и просьба влить — один ход, а не два разных дня.
50
86
  - **Заведённая задача подтверждается ответом очереди работ, а не выводом команды заведения.**
51
87
  Команда отвечает за свои вызовы: она может завести задачу и не довести её до доски, и её
52
88
  собственный разбор ошибок этот случай называет. Напечатанный номер значит «вызов прошёл», а не
@@ -61,6 +97,18 @@ description: Правило под «Закон о поставке» для д
61
97
  переставляется во взятые в работу, MR открыт — в ждущие разбора; делает это команда
62
98
  перевода, а не набор вызовов по памяти. Перевод идёт сразу за шагом, который его вызвал:
63
99
  очередь работ читают между шагами, а не после них.
100
+ - **На доске стоят задачи, а не MR о них.** Доска показывает, что сделано и что осталось; MR
101
+ отвечает на другой вопрос — как именно сделано, — и открывается из задачи, где связь с ним
102
+ стоит сама. Карточка MR живёт своей жизнью: метки списка у неё нет, из очереди она не уходит и
103
+ остаётся в ней после слияния навсегда. Здесь она заводится проще, чем где-либо: доска
104
+ собирается по меткам, и метка списка, поставленная на MR, тут же делает его карточкой.
105
+ Находит такие сверка очереди — строкой на каждую.
106
+ - **Конвейер судит по составу правки, а не гоняет всё подряд.** Шаги, которым нечего проверять,
107
+ пропускаются по признаку, посчитанному от главной ветки: ветка, не тронувшая ни строки кода,
108
+ не поднимает стенда, не снимает кадров и не собирает образов. Правила `rules:changes` считают
109
+ это сами, но по путям, а не по составу правки — совпадение пути ещё не значит, что задета
110
+ сборка, поэтому признак объявляется явно и один раз. Пропущенный шаг виден в прогоне
111
+ пропущенным — молча выпавший читается как пройденный.
64
112
  - **Отставший список находится сверкой очереди, а не глазами.** Сверка судит список по PR
65
113
  в обе стороны: открытый MR при задаче не в разборе и разбор без открытого MR — оба
66
114
  расхождения. Момента, когда задачу берут в работу, ей не видно: ветки на доске нет.
@@ -69,7 +117,7 @@ description: Правило под «Закон о поставке» для д
69
117
  въехала, и откатывается она целиком.
70
118
  - **Работа, которую одним заходом не закрыть, помечена в двух местах, и они сверяются.** Метка
71
119
  на доске и строка о заходах с передачей в замысле эпика говорят одно и то же двум читателям:
72
- исполнитель открывает карточку раньше, чем линию, а планирует по линии. Одна пометка без
120
+ исполнитель открывает карточку раньше, чем замысел эпика, а планирует по замыслу. Одна пометка без
73
121
  другой лжёт молча, поэтому сверка очереди судит пару в обе стороны. Помечается только то, что
74
122
  законно не делится: пометка объёма правом делить не становится.
75
123
  - **Слияние в главную ветку выкатывает прод.** Правила `only`/`rules` конвейера покрывают
@@ -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
  - **Пункт объявляется один раз и служит источником и меню, и гейтинга маршрутов.** Второе