mister-wolf 2.22.1 → 2.23.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 (28) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  3. package/dist/adapters/cli/cli-entry.js +6 -0
  4. package/dist/adapters/cli/cli-entry.js.map +1 -1
  5. package/dist/adapters/cli/commands/usage.d.ts +3 -0
  6. package/dist/adapters/cli/commands/usage.d.ts.map +1 -0
  7. package/dist/adapters/cli/commands/usage.js +103 -0
  8. package/dist/adapters/cli/commands/usage.js.map +1 -0
  9. package/dist/adapters/fs/opencode-usage-db.d.ts +12 -0
  10. package/dist/adapters/fs/opencode-usage-db.d.ts.map +1 -0
  11. package/dist/adapters/fs/opencode-usage-db.js +116 -0
  12. package/dist/adapters/fs/opencode-usage-db.js.map +1 -0
  13. package/dist/app/use-cases/import-usage.d.ts +17 -0
  14. package/dist/app/use-cases/import-usage.d.ts.map +1 -0
  15. package/dist/app/use-cases/import-usage.js +69 -0
  16. package/dist/app/use-cases/import-usage.js.map +1 -0
  17. package/dist/app/use-cases/usage-signal.d.ts +91 -0
  18. package/dist/app/use-cases/usage-signal.d.ts.map +1 -0
  19. package/dist/app/use-cases/usage-signal.js +169 -0
  20. package/dist/app/use-cases/usage-signal.js.map +1 -0
  21. package/package.json +1 -1
  22. package/templates/base/skills/finishing-a-development-branch/SKILL.md +2 -0
  23. package/templates/base/skills/using-git-worktrees/SKILL.md +2 -0
  24. package/templates/base/skills/using-skills/SKILL.md +1 -0
  25. package/templates/base/skills/wolf-git/SKILL.md +54 -0
  26. package/templates/base/skills/wolf-git/reference/git-collaboration-policy-v1.1.md +553 -0
  27. package/templates/base/skills/wolf-handoff/SKILL.md +2 -0
  28. package/update-map.json +17 -7
@@ -0,0 +1,553 @@
1
+ # Регламент совместной работы с Git
2
+
3
+ **Версия документа:** 1.1
4
+ **Дата:** 1 ноября 2026 года
5
+ **Назначение:** нормативная основа для людей, агентов и разработки переносимых инструментов и скиллов Mr. Wolf.
6
+ **Статус:** проект регламента по итогам согласования процесса; введение в конкретном репозитории требует настройки защит и CI.
7
+
8
+ ## 1. Область действия и язык требований
9
+
10
+ Регламент применяется к небольшим проектам с одной актуальной линией выпуска, одной интеграционной веткой `main` и параллельной работой людей и агентов. Ветка `dev` не используется. Постоянные ветки поддержки старых релизов не создаются.
11
+
12
+ Правила одинаковы для одного хоста, нескольких хостов, отдельных clones и связанных worktrees. Харнес агента, Git-хостинг, CI и registry могут различаться. Основой служат стандартный Git, переносимые скрипты и явно заданная политика проекта.
13
+
14
+ В документе:
15
+
16
+ - **ОБЯЗАТЕЛЬНО** — условие допуска к следующему этапу.
17
+ - **ЗАПРЕЩЕНО** — действие не входит в обычный процесс и не может выполняться ради обхода гейта.
18
+ - **ДОПУСКАЕТСЯ** — разрешённый вариант при указанных условиях.
19
+ - **Гейт** — проверяемые условия перехода между этапами. Непройденный гейт блокирует конкретный переход, а не всю независимую работу проекта.
20
+
21
+ Регламент определяет требуемое поведение. Приведённые ниже поля, статусы и операции — контракт для будущей реализации, а не утверждение о существующих командах Wolf.
22
+
23
+ ## 2. Основные понятия
24
+
25
+ | Понятие | Значение |
26
+ |---|---|
27
+ | Общий репозиторий | Назначенный Git remote, через который публикуют и принимают работу |
28
+ | Локальная копия | Clone на конкретном хосте со своими локальными данными |
29
+ | Worktree | Отдельный рабочий каталог, связанный с локальным Git-репозиторием |
30
+ | Рабочая ветка | Ветка одной задачи с владельцем и целевой веткой |
31
+ | Родительская ветка | Рабочая ветка ведущего участника, принимающая результаты его подзадач |
32
+ | Baseline | Конкретный разрешённый SHA, от которого создана рабочая ветка |
33
+ | Checkpoint | Локальный коммит, сохраняющий известный набор изменений; не является приёмкой |
34
+ | MR | Запрос на слияние; включает также PR на платформах с таким названием |
35
+ | Приёмка | Решение, что результат задачи отвечает требованиям и может быть предъявлен к интеграции |
36
+ | Интеграция | Включение принятого результата в целевую ветку |
37
+ | Кандидат интеграции | Точный merge-коммит с первым родителем — SHA целевой ветки, вторым — принятый SHA исходной ветки; проверяется до публикации |
38
+ | Выпуск | Публикация конкретной версии из выбранного принятого коммита |
39
+ | Digest образа | Идентификатор содержимого образа или его индекса, в отличие от изменяемого тега |
40
+
41
+ **Изменено, сохранено, опубликовано, принято, интегрировано и выпущено — разные состояния.**
42
+
43
+ | Состояние | Минимальное подтверждение |
44
+ |---|---|
45
+ | Изменено | Файлы в рабочем каталоге |
46
+ | Сохранено | Локальный SHA, содержащий нужную работу |
47
+ | Опубликовано | Наблюдаемая ссылка в общем репозитории, из которой доступен этот SHA |
48
+ | Принято | Решение уполномоченного принимающего для конкретного SHA |
49
+ | Интегрировано | Подтверждённый результат MR в целевой ветке |
50
+ | Выпущено | Git-тег версии и подтверждённый опубликованный образ с digest |
51
+
52
+ ## 3. Ответственность и полномочия
53
+
54
+ Роли обозначают ответственность, а не обязательные отдельные процессы или агентов. Человек может выполнять роль ведущего; ведущий агент Wolf — принимать результаты исполнителей.
55
+
56
+ | Участник | Ответственность и полномочия |
57
+ |---|---|
58
+ | Владелец проекта | Утверждает политику, полномочия, обязательные проверки и настройки защиты |
59
+ | Владелец задачи / ветки | Отвечает за историю ветки, checkpoint, публикацию, актуализацию и уборку своих рабочих копий |
60
+ | Ведущий участник | Назначает подзадачи, принимает дочерние MR и отвечает за общий результат своей ветки |
61
+ | Принимающий | Проверяет требования задачи и разрешает предъявление конкретного SHA к интеграции |
62
+ | Обработчик интеграции | Последовательно проверяет кандидатов и обновляет `main` в пределах заданных правил |
63
+ | Оператор выпуска | Явно запускает выпуск версии из выбранного SHA; человеком или агентом согласно политике проекта |
64
+ | CI выпуска | Проверяет запрос, создаёт тег, собирает и публикует образ, запускает очистку registry |
65
+
66
+ У рабочего каталога один активный писатель. У рабочей ветки один активный владелец записи и публикации. Другие участники предлагают изменения через собственные ветки и MR.
67
+
68
+ Назначенный владелец задачи вправе и обязан создавать локальные checkpoint-коммиты своих изменений в назначенной ветке. Это постоянное полномочие: повторное разрешение на каждый коммит не требуется. Публикация рабочей ветки разрешается назначением на задачу, если проект не установил иной порядок.
69
+
70
+ Владелец не вправе включать неизвестные или чужие изменения в свой коммит. Если исполнитель не имеет права коммитить, в поручении ОБЯЗАТЕЛЬНО указывается ведущий, который сохраняет его результат до остановки или передачи. Обязанность сохранить работу не может оставаться без ответственного.
71
+
72
+ Право коммитить и публиковать рабочую ветку не даёт права напрямую менять `main`, создавать релизные теги или обходить проверки. Стюард не участвует в обычном контроле Git-процесса: состояние проверяют инструменты, решения принимают назначенные участники.
73
+
74
+ ## 4. Модель веток и дерева задач
75
+
76
+ ### 4.1. Общие правила
77
+
78
+ 1. `main` содержит интегрированные результаты и является базой независимых задач.
79
+ 2. Непосредственная разработка и ручные checkpoint-коммиты в `main` ЗАПРЕЩЕНЫ.
80
+ 3. Каждая новая задача получает отдельную ветку. Завершённые имена веток повторно не используются.
81
+ 4. Независимые ведущие участники создают ветки от проверенного SHA общего `main`.
82
+ 5. Субзадача ответвляется от явно выбранного SHA родительской рабочей ветки и предъявляется обратно в неё.
83
+ 6. После окончательной интеграции рабочая ветка закрывается. Последующие изменения оформляются новой задачей и веткой.
84
+ 7. Опубликованную историю рабочих веток не переписывают. Историю `main` и опубликованные релизные теги не переписывают никогда в рамках штатного процесса.
85
+
86
+ ### 4.2. Пример
87
+
88
+ | Участник | Ветка | База при создании | Цель MR |
89
+ |---|---|---|---|
90
+ | Ведущий А | `feat/123-some-a` | Проверенный SHA `main` | `main` |
91
+ | Субагент А1 | `feat/124-some-a1` | SHA `feat/123-some-a` | `feat/123-some-a` |
92
+ | Субагент А2 | `fix/125-some-a2` | SHA `feat/123-some-a` | `feat/123-some-a` |
93
+ | Ведущий Б | `feat/126-some-b` | Проверенный SHA `main` | `main` |
94
+
95
+ Префиксы `feat/`, `fix/`, `docs/`, `chore/` помогают навигации. Они не определяют полномочия. Имя включает уникальный идентификатор задачи и краткое описание. Связь с родителем хранится явно, а не вычисляется по похожести названий.
96
+
97
+ Ведущий не предъявляет свою ветку в `main`, пока необходимые дочерние результаты не приняты, а оставшиеся подзадачи не закрыты, отменены или явно вынесены в самостоятельную работу. После готовности родительского MR запись в его ветку замораживается; изменение снимает готовность.
98
+
99
+ ## 5. Работа на одном и нескольких хостах
100
+
101
+ | Размещение | Обязательное правило |
102
+ |---|---|
103
+ | Один clone, связанные worktrees | Каждому активному писателю — отдельный worktree и отдельная ветка |
104
+ | Несколько clones на одном хосте | Каждый clone самостоятельно проверяет и синхронизирует состояние |
105
+ | Разные хосты | Обмен коммитами через общий репозиторий; разные активные владельцы работают в разных ветках |
106
+ | Передача одной ветки | Сначала остановка прежнего владельца и публикация; затем подтверждённое принятие новым |
107
+
108
+ Договорённость «редактируем разные файлы» не разрешает независимую одновременную запись в один рабочий каталог. Параллельные независимые писатели используют разные ветки.
109
+
110
+ Связанные worktrees имеют общие локальные ветки и часть Git-метаданных. Инструменты ОБЯЗАТЕЛЬНО координируют операции над общими refs и служебным состоянием clone. Нельзя изменять ветку, используемую другим владельцем, или обходить защиту Git от её одновременного checkout.
111
+
112
+ `git worktree lock` не считается блокировкой записи для агентов или механизмом распределённого владения. Владение отражается в состоянии задачи, а прекращение записи подтверждает прежний владелец или ответственный ведущий после остановки процесса.
113
+
114
+ Факт потери связи или давность активности не разрешают второму участнику немедленно продолжить запись в ту же ветку. При сомнении создаётся отдельная ветка восстановления, а владение разбирается явно.
115
+
116
+ ## 6. Вход в работу: проверка и актуализация
117
+
118
+ ### 6.1. Обязательная последовательность
119
+
120
+ При начале задачи, возобновлении после перерыва, рестарта или смены владельца участник:
121
+
122
+ 1. Проверяет идентичность репозитория, адрес общего remote, хост, путь worktree и ветку задачи.
123
+ 2. Проверяет staged, unstaged, untracked-файлы и известные ценные файлы вне Git.
124
+ 3. Проверяет незавершённые merge, rebase, cherry-pick и другие Git-операции.
125
+ 4. Проверяет назначенного владельца, baseline, локальный HEAD и сохранённые сведения о задаче.
126
+ 5. Получает актуальные refs общего репозитория и фиксирует время успешного наблюдения.
127
+ 6. Отдельно сравнивает рабочую ветку с её опубликованной версией и с целевой веткой MR.
128
+ 7. Только после этого выбирает разрешённое обновление или восстановление.
129
+
130
+ Fetch обновляет сведения об удалённом состоянии, но не означает включения изменений в рабочую ветку. Старое значение remote-tracking ref не является подтверждением текущего состояния сервера.
131
+
132
+ ### 6.2. Локальный `main`
133
+
134
+ После успешного получения удалённого состояния применяется таблица:
135
+
136
+ | Локальный `main` относительно общего `main` | Разрешённое действие |
137
+ |---|---|
138
+ | Совпадает | Использовать SHA как проверенную базу |
139
+ | Только отстаёт | Обновить fast-forward при чистом каталоге и отсутствии чужого владельца |
140
+ | Впереди | Остановить обновление; установить происхождение и сохранить локальные коммиты |
141
+ | История разошлась | Остановить обновление; выполнить разбор расхождения |
142
+ | Remote недоступен | Пометить актуальность как неподтверждённую |
143
+
144
+ Локальные коммиты в `main` нельзя автоматически пушить, сбрасывать или удалять ради синхронизации. Известную полезную работу можно сохранить отдельной веткой и затем предъявить через обычный MR. Приведение локального `main` к общему состоянию выполняют только после сохранения работы и проверки владения.
145
+
146
+ Для создания новой задачи не требуется обязательно переключать или обновлять локальный `main`: допустимо создать ветку непосредственно от проверенного SHA общего `main`. Аномалия локального `main` всё равно фиксируется и не скрывается.
147
+
148
+ ### 6.3. Рабочая ветка и её опубликованная версия
149
+
150
+ | Состояние | Действие |
151
+ |---|---|
152
+ | Совпадают | Продолжить после остальных проверок |
153
+ | Локальная впереди | Проверить принадлежность коммитов задаче; опубликовать на обязательной границе |
154
+ | Локальная только отстаёт | Установить происхождение удалённых коммитов; обновить fast-forward, если они ожидаемы |
155
+ | Разошлись | Остановить автоматическое обновление; выяснить причины и владельца |
156
+ | Удалённая ветка отсутствует | Различить новую неопубликованную ветку, закрытую задачу и неожиданное удаление |
157
+
158
+ Наличие ожидаемых локальных коммитов само по себе не является ошибкой. Неизвестное происхождение локальных или удалённых изменений — основание для разбора.
159
+
160
+ ### 6.4. Обновление из целевой ветки
161
+
162
+ Изменения цели включаются в опубликованную рабочую ветку через merge. Перед merge собственная работа сохраняется, неизвестные изменения разбираются. После разрешения конфликтов выполняются необходимые проверки.
163
+
164
+ Ведущий обновляет свою ветку из `main`; субагент — из родительской ветки. Одновременное независимое вливание `main` во все уровни дерева не требуется.
165
+
166
+ После каждого нового коммита цели немедленное обновление всех веток не требуется. Проверить положение ОБЯЗАТЕЛЬНО при входе, передаче и предъявлении результата. Включить обновления требуется при зависимости от них, конфликте, нарушении совместимости или возврате MR обработчиком. Автоматически совместимый результат может проверить сам обработчик интеграции без изменения исходной ветки.
167
+
168
+ Rebase допускается только для неопубликованной работы единственного владельца, от которой никто не ответвлялся. Составная команда `pull` не используется как безусловный способ исправить любое состояние: получение сведений и способ изменения истории должны быть явными.
169
+
170
+ ### 6.5. Работа без связи
171
+
172
+ Допускается продолжать известную локальную задачу от ранее проверенной базы и создавать checkpoint. Фиксируется последнее успешное наблюдение remote. Новая независимая задача от неподтверждённой базы, приёмка в общую ветку, межхостовая передача и выпуск блокируются до восстановления связи. В отчёте нельзя называть такую копию актуальной.
173
+
174
+ ## 7. Создание ветки и worktree
175
+
176
+ Перед созданием ОБЯЗАТЕЛЬНО определить задачу, владельца, цель MR и точный baseline SHA. Текущий HEAD не выбирается автоматически.
177
+
178
+ Ветку верхнего уровня создают от проверенного `main`; дочернюю — от сохранённого и идентифицированного коммита родителя. Для передачи на другой хост этот коммит должен быть опубликован и доступен получателю. Изменения родителя, оставшиеся только в файлах, не являются базой дочерней ветки.
179
+
180
+ Создание включает проверку уникальности имени, отсутствия существующей работы той же задачи, безопасного пути и регистрации worktree. Непустой посторонний каталог не перезаписывается. Для продолжения задачи сначала ищут существующую ветку и worktree, а не создают дубликат.
181
+
182
+ Подготовка окружения выполняется отдельно: зависимости, локальные настройки и секреты не должны случайно попасть в коммиты. Симлинки и общие каталоги не должны позволять двум worktrees незаметно менять одни и те же исходники или результаты сборки.
183
+
184
+ ## 8. Сохранение и публикация
185
+
186
+ Checkpoint ОБЯЗАТЕЛЕН:
187
+
188
+ - на завершённом логическом шаге;
189
+ - перед плановой остановкой и передачей владения;
190
+ - перед операцией, способной затронуть незакоммиченную работу;
191
+ - перед предъявлением результата к приёмке.
192
+
193
+ Внутри непрерывной работы владельца допускаются известные незакоммиченные изменения. Коммит перед каждым действием или запуском каждого субагента не требуется. В штатной схеме субагент работает в своей ветке и сохраняет её результат сам либо через явно назначенного ответственного.
194
+
195
+ Промежуточный checkpoint допускается с незавершёнными проверками или падающими тестами, если это явно отражено в сообщении и состоянии задачи. Такой коммит сохраняет работу и не проходит гейт готовности автоматически.
196
+
197
+ Перед коммитом проверяется diff и выбирается известный набор файлов. Безусловное включение всех файлов из неизвестного состояния ЗАПРЕЩЕНО. Секреты, временные данные и локальные настройки не публикуются.
198
+
199
+ Публикация ОБЯЗАТЕЛЬНА перед MR, межхостовой передачей и плановой остановкой при доступном remote. Если связи нет, checkpoint остаётся локальным с явным указанием этого ограничения и ответственным за последующую публикацию.
200
+
201
+ Подтверждение push содержит remote, ветку, SHA и время наблюдения. Успешный локальный commit или намерение выполнить push не подтверждают публикацию. Неожиданный отказ push требует повторного inspect, а не force push.
202
+
203
+ ## 9. Передача задачи
204
+
205
+ Плановая передача выполняется последовательно:
206
+
207
+ 1. Прежний владелец прекращает новые изменения и останавливает писателей своей ветки.
208
+ 2. Сохраняет и публикует результат, фиксирует остаточные локальные данные.
209
+ 3. Передаёт сведения из таблицы ниже.
210
+ 4. Получатель выполняет входную проверку и подтверждает доступность нужного SHA.
211
+ 5. После подтверждения меняется активный владелец; прежний запись не возобновляет.
212
+
213
+ | Обязательное поле | Содержание |
214
+ |---|---|
215
+ | Задача и владелец | Кто передаёт, кто принимает, что осталось сделать |
216
+ | Репозиторий и ветка | Общий remote, исходная ветка и цель MR |
217
+ | База и результат | Baseline SHA и последний опубликованный SHA |
218
+ | Рабочая копия | Хост, clone/worktree; локальный путь не считается общим адресом |
219
+ | Состояние | Незавершённые операции, остаточные файлы, дочерние задачи |
220
+ | Проверки | Что выполнено, на каком SHA, что не выполнено или падает |
221
+ | Следующий шаг | Конкретное действие продолжения |
222
+
223
+ При аварийном прерывании новый участник сначала восстанавливает факты. Отсутствие записи handoff не разрешает очистить каталог или объявить неопубликованную работу ненужной. Данные `stash`, reflog и локальные файлы рассматриваются как возможные источники восстановления, а не как подтверждённая передача.
224
+
225
+ ## 10. MR и приёмка дочерних задач
226
+
227
+ MR ОБЯЗАТЕЛЬНО содержит задачу, исходную и целевую ветки, предъявляемый SHA, описание результата, существенные изменения контрактов, результаты проверок и известные ограничения.
228
+
229
+ Ведущий принимает дочерние MR последовательно в свою ветку. Для каждого результата проверяется совместимость с текущим состоянием родителя. Если два дочерних результата затрагивают общий контракт, ведущий отвечает за их согласование и совокупную проверку.
230
+
231
+ Субагент не перенаправляет MR в `main` самостоятельно. Ведущий не подменяет приёмку дочерних результатов простым наличием коммитов.
232
+
233
+ **Стандартный способ приёмки — merge commit (`--no-ff`)**, как для дочерних MR в родительскую рабочую ветку, так и для MR в `main`. Принятая исходная история коммитов сохраняется в графе Git: итоговый коммит интеграции имеет первым родителем актуальную цель, вторым — точный принятый SHA источника. Fast-forward вместо отдельного коммита интеграции не используется. Обновление рабочей ветки из цели по-прежнему выполняется обычным merge по §6.4.
234
+
235
+ **Squash не применяется автоматически.** Как исключение он ДОПУСКАЕТСЯ только при явном решении принимающего для небольшой независимой задачи, когда нет активных зависимых веток, сохранена прослеживаемость исходного SHA/MR и проверена возможность безопасной уборки. Исключение не меняет общий алгоритм очереди в §11: если используемый обработчик не умеет строить и проверять squash-кандидата с теми же гарантиями, такой MR интегрируется стандартным merge либо остаётся без интеграции до поддержанного процесса. Запрет переписывания опубликованной истории сохраняется.
236
+
237
+ После интеграции исходная ветка закрывается для новых задач. Перед удалением проверяются оставшиеся зависимые ветки: их можно закончить, отменить с сохранением работы или перенести на новую подтверждённую базу. После обычного merge связь с уже принятыми исходными коммитами сохраняется и доступна через ancestry. После разрешённого squash эта связь не сохраняется; интеграцию подтверждают отдельно по записи MR и точным SHA.
238
+
239
+ **Происхождение изменений.** Каждый MR содержит task ID, parent task при наличии, source/target refs, предъявленный source SHA и ссылки на evidence и приёмку. Коммит интеграции должен содержать устойчивые ссылки на задачу и MR (например, `Task:` и `MR:`), а журнал интеграции — source SHA, target SHA до слияния, result SHA и результаты проверок. Это позволяет расследовать изменения по `git log --first-parent`, полному графу и `git blame` без обязательного чтения переписки агентов. Метаданные не заменяют проверок и не должны включать секреты или приватные трассы.
240
+
241
+ ## 11. Очередь интеграции в main
242
+
243
+ ### 11.1. Хранение и запуск
244
+
245
+ Очередь — открытые MR в `main`, имеющие действующую отметку готовности для конкретного исходного SHA. Очередь не хранится исключительно в ожидающих CI-запусках. Для одного репозитория одновременно работает один обработчик интеграции.
246
+
247
+ Обработчик запускается при появлении готового MR, после завершения обработки кандидата, при значимом изменении состояния очереди и вручную. Периодический запуск раз в `reconcile_interval_minutes` восстанавливает работу после пропущенного события или сбоя.
248
+
249
+ Повторные события не отменяют активную интеграцию. Порядок готовых независимых MR — по времени получения действующей готовности, при равенстве по устойчивому идентификатору MR. Возвращённый и исправленный MR получает новое место. Зависимость должна быть выполнена до готовности; срочность допускает явно зафиксированный приоритет без пропуска проверок.
250
+
251
+ ### 11.2. Алгоритм
252
+
253
+ 1. Выбрать следующий готовый MR; проверить его актуальность, целевую ветку и приёмку.
254
+ 2. Зафиксировать исходный SHA `S` и текущий SHA `main` — `T`.
255
+ 3. Построить во временном изолированном каталоге **merge-коммит-кандидат `C`** из точных `T` и `S`, с двумя родителями в порядке `T`, `S` (эквивалент `--no-ff`, даже если допустим fast-forward). При конфликте не создавать готового кандидата: вернуть задачу владельцу. Проверить дерево результата, родителей и ссылки на задачу/MR.
256
+ 4. Выполнить обязательные проверки именно для `C` по утверждённой политике CI; проверки только исходного `S` недостаточны.
257
+ 5. Перед публикацией повторно проверить: MR открыт и готов, исходный SHA всё ещё `S`, приёмка действительна, `main` всё ещё `T`.
258
+ 6. При выполнении условий опубликовать именно проверенный `C` как новый `main`, с серверной проверкой ожидаемого предыдущего состояния.
259
+ 7. Зафиксировать соответствие MR, `S`, `T`, `C` и результатов проверок; завершить MR средствами выбранной платформы.
260
+ 8. Перейти к следующему MR уже относительно обновлённого `main`.
261
+
262
+ Если `main` или исходный SHA изменился, старый результат не публикуется. Кандидат строится заново; изменение исходной ветки также снимает готовность и требует новой приёмки. Успех CI для прежней пары SHA не переносится автоматически на новую.
263
+
264
+ Адаптер Git-хостинга ОБЯЗАТЕЛЬНО обеспечивает условное обновление цели и запрещает незаметную подмену проверенного кандидата. Обычный force push для этого не используется. Если платформа самостоятельно формирует merge-коммит, реализация должна доказать совпадение точного публикуемого коммита с проверенным `C` (включая родителей и дерево) либо построить и проверить фактически публикуемый кандидат заранее. Простая проверка исходной ветки или сходства diff недостаточна. Если хостинг не даёт такой гарантии, автоматическая публикация через этот адаптер запрещена до выбора поддержанного способа интеграции.
265
+
266
+ ### 11.3. Ошибки и ожидание
267
+
268
+ | Ситуация | Реакция |
269
+ |---|---|
270
+ | Конфликт | Снять готовность, сообщить владельцу, сразу перейти к следующему MR |
271
+ | Ошибка обязательной проверки | То же; повторять неизменный код без причины не нужно |
272
+ | Сбой инфраструктуры | Одна повторная попытка по умолчанию; затем снять готовность и сообщить причину |
273
+ | Тайм-аут проверки | Завершить попытку как неуспешную, освободить очередь; исходный код не удалять |
274
+ | Изменилась цель | Перестроить кандидата относительно нового SHA |
275
+ | Перезапуск обработчика | Прочитать MR и фактический `main`; продолжить без повторного применения принятого результата |
276
+
277
+ Очередь **не ждёт исправления конфликтного MR**. Владелец может исправлять его сколько требуется; после новой приёмки MR возвращается в очередь. Начальный тайм-аут — 20 минут, изменяется параметром проекта. Результат проверки, пришедший после отмены попытки, не разрешает публикацию.
278
+
279
+ ### 11.4. Пример А и Б
280
+
281
+ А и Б начали от `M0`. Для А построен и проверен кандидат `M1`; он принят. Для Б затем проверяется кандидат от `M1`, уже включающий А. Если он совместим — принимается. При конфликте Б обновляет собственную ветку и предъявляет исправленный результат; следующий независимый MR не ждёт Б.
282
+
283
+ Очередь устраняет гонку публикации, но не смысловые противоречия. При изменении общих API, схем данных, конфигурации и зависимостей ведущие заранее фиксируют контракт или зависимость задач. Ответственность за адаптацию обычно несёт ещё не принятый результат; нарушение ранее согласованного контракта разбирается по существу, а не по принципу «первый всегда прав».
284
+
285
+ ## 12. Защита main и политика проверок
286
+
287
+ Общий `main` изменяет только механизм интеграции с ограниченными полномочиями. Прямые push участников, принудительное обновление и удаление ветки блокируются настройками сервера. Исправления, откаты и изменения самого CI проходят через рабочую ветку и MR.
288
+
289
+ Обязательные проверки определяются проектом: корректность задачи, нужные тесты, статический анализ и другие применимые проверки. Документационные изменения могут иметь более лёгкий набор, если это заранее описано политикой. Пустое «всё проверено» без SHA и результатов не принимается.
290
+
291
+ CI использует доверенную конфигурацию гейтов. Изменение CI в MR не может само снять собственные обязательные проверки или получить полномочия обновления `main`, создания тегов либо удаления образов. Проверка недоверенного кода и операции с секретами публикации разделяются по полномочиям.
292
+
293
+ Слияние в `main` **не запускает публикацию контейнерного образа**. Проверки MR могут выполнять необходимую проверку сборки, если это нужно проекту; это не выпуск и не публикация образа в registry.
294
+
295
+ ## 13. Тегирование и выпуск контейнерного образа
296
+
297
+ ### 13.1. Общие правила
298
+
299
+ Проект поддерживает одну актуальную линию версий. Git-тег имеет вид `vMAJOR.MINOR.PATCH`, тег образа — `MAJOR.MINOR.PATCH`. Компоненты — неотрицательные целые числа без ведущих нулей. Стабильные версии сравниваются численно по major, затем minor, затем patch.
300
+
301
+ Новая версия ОБЯЗАТЕЛЬНО больше всех ранее выпущенных стабильных версий, включая уже удалённые из registry. Источник истории выпусков — Git-теги и журнал выпуска, а не только оставшиеся образы. Опубликованные номера не используются повторно; теги версии и соответствие версии digest не перезаписываются.
302
+
303
+ ### 13.2. Три отдельных CI-процесса
304
+
305
+ | Процесс | Запуск | Результат |
306
+ |---|---|---|
307
+ | Интеграция | Готовый MR | Принятый коммит в `main` |
308
+ | Подготовка выпуска | Явная команда уполномоченного участника с версией и SHA | Проверенный и опубликованный Git-тег |
309
+ | Выпуск образа | Событие публикации релизного Git-тега | Проверенный образ версии, `latest`, журнал выпуска и очистка |
310
+
311
+ Создание тега не выполняется автоматически после каждого MR. Между выпусками в `main` может накопиться несколько принятых задач. Развёртывание — отдельное действие; автоматический CD этим регламентом не вводится.
312
+
313
+ ### 13.3. Подготовка выпуска
314
+
315
+ 1. Изменения версии, changelog и необходимые обновления документации принимаются обычным MR.
316
+ 2. Оператор явно выбирает версию и полный SHA принятого коммита. Нельзя подменять его текущим HEAD, если `main` успел уйти вперёд.
317
+ 3. CI проверяет нахождение SHA в истории общего `main`, соответствие версии в исходниках, обязательные проверки и отсутствие уже опубликованной версии.
318
+ 4. Создаёт и публикует аннотированный Git-тег `vX.Y.Z` на выбранном SHA.
319
+ 5. Фиксирует запрос выпуска и запуск следующего процесса.
320
+
321
+ Адаптер CI должен учитывать платформенные ограничения запуска workflow другим workflow. До ввода процесса ОБЯЗАТЕЛЬНО проверить, что созданный служебной учётной записью тег действительно запускает выпуск, а повтор события не создаёт дубликаты.
322
+
323
+ ### 13.4. Публикация и частичные сбои
324
+
325
+ Для одного образа подготовка версий и выпуск координируются последовательно: более новая версия не должна завершить публикацию раньше незавершённого предыдущего выпуска и затем получить устаревший `latest`. Зависший выпуск не удерживает очередь интеграции в `main`; он блокирует только последующие выпуски до возобновления либо явного завершения попытки.
326
+
327
+ CI получает код по тегу, проверяет его SHA, собирает и проверяет образ. Затем публикует версионный тег, подтверждает доступность digest и обновляет `latest` на тот же digest. Только после подтверждения обоих тегов запускается очистка.
328
+
329
+ | Сбой | Правило |
330
+ |---|---|
331
+ | Сборка до публикации версии | Повторить выпуск того же Git-тега; тег не передвигать |
332
+ | Образ версии опубликован, `latest` не обновлён | Повторить продвижение существующего digest, не пересобирать и не перезаписывать версию |
333
+ | Неизвестно, завершилась ли публикация | Сначала прочитать фактические теги и digest; не выполнять слепую повторную запись |
334
+ | Публикация успешна, очистка упала | Выпуск остаётся успешным, очистка отмечается отдельно как неуспешная и допускает повтор |
335
+ | Ошибка в опубликованном продукте | Исправление через MR и новый номер версии |
336
+
337
+ Повторная попытка проверяет согласованность Git-тега, версии, SHA и digest. Несовпадение блокирует автоматическое продолжение. Журнал выпуска содержит версию, Git SHA, digest, ссылку на CI, время и статусы публикации/очистки.
338
+
339
+ ## 14. Очистка registry
340
+
341
+ ### 14.1. Политика хранения
342
+
343
+ Параметр `keep_last` — положительное целое число. Начальный пример — `5`; это настройка проекта, а не неизменное правило.
344
+
345
+ После успешного выпуска сохраняются:
346
+
347
+ - `keep_last` наибольших опубликованных стабильных версий `MAJOR.MINOR.PATCH`;
348
+ - образ, на который указывает `latest`.
349
+
350
+ Если `latest` указывает на одну из сохраняемых версий, дополнительный образ не появляется. Если указывает за пределы списка, он всё равно защищён. Количество относится к версиям, а не слоям, платформенным манифестам или числу записей registry.
351
+
352
+ Политика не поддерживает отдельные релизные линии и не сортирует образы по датам сборки, изменения тега или выдаче API. Например, `2.22.10` новее `2.22.9`, а `2.10.0` новее `2.9.0`. Используется проверенный числовой parser; лексикографическая сортировка запрещена.
353
+
354
+ ### 14.2. Алгоритм очистки
355
+
356
+ 1. Проверить параметр, конкретный registry и имя репозитория образов.
357
+ 2. Получить полный список тегов со всеми страницами; при невозможности подтвердить полноту прекратить удаление.
358
+ 3. Выделить строго допустимые стабильные версии. Неканонические и неизвестные теги показать в отчёте, но не удалять этим правилом.
359
+ 4. Отсортировать версии численно по убыванию, выбрать `keep_last` и добавить защиту `latest`.
360
+ 5. Получить соответствия тегов и digest; построить план удаления старых версий.
361
+ 6. Проверить все ссылки на удаляемое содержимое, включая сохраняемые и неизвестные теги и индексы нескольких архитектур.
362
+ 7. Повторно проверить план перед изменением; выполнить допустимые удаления и записать фактический результат.
363
+
364
+ По возможности удаляются только устаревшие теги. Если API удаляет сразу manifest/digest вместе со всеми его тегами, адаптер не должен затрагивать содержимое, используемое сохраняемыми или неизвестными тегами либо сохраняемыми multi-platform индексами. При невозможности доказать безопасность конкретный объект пропускается с причиной; политика количества может временно не выполняться.
365
+
366
+ Полная поддержка multi-platform графа нужна только при использовании таких образов, но неподдерживаемый формат должен приводить к отказу удаления, а не к предположению о безопасности. Фактическое освобождение слоёв выполняется средствами registry и не гарантируется одним удалением тега.
367
+
368
+ Очистка выполняется в конце успешного выпуска, без отдельного обязательного расписания. Она не пересекается с публикацией того же образа; все писатели соблюдают общую координацию. Ручной повтор поддерживает тот же регламент. Ошибка конфигурации, списка или проверки не разрешает удаление «по приблизительному списку».
369
+
370
+ Скрипт предоставляет режимы плана без записи и применения. После первоначального включения автоматическое применение не требует подтверждения каждого удаления, если оно укладывается в утверждённую политику. Отдельные сложные категории хранения не вводятся. Удалённые версии не гарантированы для отката; `keep_last` выбирают с учётом нужного запаса.
371
+
372
+ ## 15. Очистка worktrees, веток и локальных данных
373
+
374
+ ### 15.1. Уборка как часть закрытия
375
+
376
+ Интеграция не означает завершение уборки. Владелец каждого хоста отвечает за локальные worktrees и clones; центральный CI не объявляет их удалёнными без подтверждения с хоста.
377
+
378
+ Перед удалением ОБЯЗАТЕЛЬНО:
379
+
380
+ 1. Остановить владельца и все связанные процессы записи.
381
+ 2. Подтвердить интеграцию задачи либо её отмену с явным решением о сохранении нужной работы.
382
+ 3. Проверить отсутствие незавершённых Git-операций, staged/unstaged/untracked-изменений и дополнительных коммитов после предъявленного SHA.
383
+ 4. Проверить ценные ignored-файлы, локальные артефакты и резервные данные: чистый `git status` сам по себе не доказывает, что каталог можно удалить.
384
+ 5. Проверить, что ветка не нужна активным потомкам, MR или другому владельцу.
385
+ 6. Сохранить необходимые локальные данные и получить свежий результат проверки непосредственно перед удалением.
386
+
387
+ При стандартном merge ОБЯЗАТЕЛЬНО подтвердить, что предъявленный исходный SHA является предком опубликованного результата интеграции, а интеграционный коммит имеет ожидаемых родителей и связан с записью MR. Эта проверка подтверждает включение коммитов, **но не отсутствие новых локальных изменений, посторонних данных или активных зависимостей**. При разрешённом squash ancestry исходного SHA отсутствует; сохранность доказывают записью интеграции MR с точными source/result SHA и проверкой актуального состояния ветки. Дополнительные коммиты после принятого source SHA разбирают отдельно при любом способе интеграции. Простой статус MR «merged» не разрешает удалить любое текущее содержимое ветки.
388
+
389
+ ### 15.2. Порядок
390
+
391
+ Сначала очищают worktrees завершённых подзадач, затем их локальные ветки и, если больше не нужны, удалённые ветки. После принятия родительской задачи аналогично убирают её рабочую копию и ветку. Полезный принятый дочерний результат может быть сохранён в опубликованной родительской ветке до её интеграции в `main`.
392
+
393
+ Worktree удаляют штатными средствами Git, не безусловным удалением каталога. Удалённая ветка удаляется с проверкой ожидаемого SHA: появление нового коммита отменяет старое разрешение на уборку. На каждом шаге результат записывается отдельно, чтобы повтор уборки после сбоя был безопасным.
394
+
395
+ Автоматические `remove --force`, `reset --hard`, `clean` с удалением неизвестных файлов и принудительное удаление веток ради чистоты ЗАПРЕЩЕНЫ. По умолчанию локальную ветку удаляют штатным `branch -d` после снятия worktree и проверок. Если даже после стандартного merge `branch -d` отказывает из-за выбранной checkout/merge-базы, отказ разбирают, а не обходят автоматически. При разрешённом squash специальное удаление допускается только после доказанной сохранности по записи MR и повторной проверки неизменности SHA; отказ обычного `branch -d` сам по себе не является разрешением на принудительное удаление.
396
+
397
+ Основной clone и его главный рабочий каталог не удаляются как обычный дочерний worktree. Удаление целого clone — отдельная процедура с проверкой всех веток, worktrees и локальных данных.
398
+
399
+ ### 15.3. Поиск забытых копий
400
+
401
+ При начале рабочей сессии выполняется локальный осмотр зарегистрированных рабочих копий:
402
+
403
+ | Найдено | Действие |
404
+ |---|---|
405
+ | Завершённая задача, сохранность подтверждена | Выполнить уборку по гейту |
406
+ | Завершённая задача, осталась работа | Установить владельца и сохранить результат |
407
+ | Активная задача | Оставить |
408
+ | Неизвестная задача или владелец | Поставить на разбор, не удалять |
409
+ | Давно не использовалась | Сообщить владельцу; возраст не даёт права удаления |
410
+ | Следы уже удалённого worktree | Проверить и затем очистить устаревшие служебные записи Git |
411
+
412
+ Если хост недоступен, задача может иметь статус «интегрирована, уборка ожидается». Уборка других задач и работа очереди продолжаются. Полное закрытие фиксируется после подтверждения по всем зарегистрированным рабочим копиям задачи.
413
+
414
+ ## 16. Сводная таблица гейтов
415
+
416
+ | Гейт | Условия допуска | Кто проверяет и отвечает | При отказе |
417
+ |---|---|---|---|
418
+ | G0. Вход / возобновление | Известны репозиторий, ветка, владелец, локальные изменения, Git-операции и состояние remote | Владелец через inspect/check | Разбор расхождения; ограниченная офлайн-работа только по §6.5 |
419
+ | G1. Создание ветки | Задача, уникальное имя, разрешённый baseline SHA, цель и безопасный путь | Владелец / ведущий | Не создавать; устранить неопределённость |
420
+ | G2. Остановка / передача | Checkpoint, публикация при доступной связи, прекращение записи, handoff | Прежний владелец; получатель подтверждает вход | Не объявлять передачу завершённой |
421
+ | G3. Готовность MR | Опубликованный SHA, выполнение задачи, проверки и приёмка, завершение обязательных потомков | Принимающий / ведущий | Оставить MR неготовым; вернуть замечания |
422
+ | G4. Приём дочерней задачи | Совместимость с текущим родителем, проверки конкретного кандидата | Ведущий | Вернуть владельцу подзадачи |
423
+ | G5. Интеграция в main | Готовый MR, проверенный кандидат, неизменные source/target SHA, серверные полномочия | Единственный обработчик | Снять готовность или перестроить кандидата; очередь продолжает работу |
424
+ | G6. Тег версии | Явный запрос, принятый SHA, корректная новая версия, проверки и документация | CI подготовки выпуска | Не создавать тег; указать причину |
425
+ | G7. Выпуск образа | Неизменный Git-тег, проверенный образ, доступный версионный digest и `latest` | CI выпуска | Восстановить соответствующий этап без перезаписи версии |
426
+ | G8. Очистка registry | Успешная публикация, полный список, валидный `keep_last`, безопасный план | Скрипт очистки под координацией выпуска | Не удалять непроверенное; отдельно сообщить ошибку уборки |
427
+ | G9. Уборка worktree | Нет писателей и несохранённой работы, подтверждена судьба результата и зависимостей | Локальный владелец через check/remove | Сохранить каталог; зафиксировать причину |
428
+
429
+ Гейт не пройден, если подтверждение отсутствует или устарело из-за изменения проверяемых SHA. Успех инструмента проверки Git не заменяет приёмку функционального результата.
430
+
431
+ ## 17. Восстановление и отклонения
432
+
433
+ | Отклонение | Обязательная реакция |
434
+ |---|---|
435
+ | Неизвестные файлы или коммиты | Зафиксировать состояние, не включать в свою работу, выяснить происхождение и сохранить |
436
+ | Локальный main впереди / разошёлся | Сохранить коммиты отдельной ссылкой, определить путь MR; не push/reset автоматически |
437
+ | Два активных владельца | Прекратить конфликтующую запись, сохранить оба результата, восстановить одного владельца |
438
+ | Незавершённый merge/rebase | Установить цель операции; осознанно завершить или отменить с сохранением работы |
439
+ | MR принят, но владелец успел добавить коммиты | Не считать новые коммиты принятыми; оформить отдельную ветку/MR |
440
+ | Регрессия в main | Откат либо исправление новой веткой и MR через ту же очередь; история main сохраняется |
441
+ | Сбой между обновлением main и закрытием MR | Сверить фактический SHA и журнал; завершить учёт, не применять задачу второй раз |
442
+ | Устаревшие сведения о публикации | Получить новое наблюдение; не выдавать старую проверку за текущую |
443
+
444
+ Участник сообщает: что обнаружено, какие SHA/пути затронуты, что сохранено, какой переход заблокирован и кто должен продолжить. Общее «Git сломан» не считается пригодным handoff.
445
+
446
+ ## 18. Настройки проекта
447
+
448
+ Ниже — пример будущего контракта конфигурации, а не готовый формат Wolf. Значения, кроме обязательных правил процесса, настраиваются под проект.
449
+
450
+ ```yaml
451
+ git_policy:
452
+ remote: origin
453
+ integration_branch: main
454
+ acceptance_method: merge
455
+ merge_commit: always # предлагаемое поле политики Wolf: эквивалент --no-ff
456
+ squash_exception: explicit_only # лишь при условиях §10 и поддержанной проверке кандидата
457
+ update_method: merge
458
+ published_history_rewrite: false
459
+ queue:
460
+ order: ready_at
461
+ candidate_timeout_minutes: 20
462
+ infrastructure_retries: 1
463
+ reconcile_interval_minutes: 10
464
+ required_checks: [] # заполнить реальными идентификаторами проверок до включения
465
+ release_policy:
466
+ git_tag_prefix: v
467
+ version_format: MAJOR.MINOR.PATCH
468
+ trigger: explicit_request
469
+ image_build_trigger: release_tag
470
+ image_latest_tag: latest
471
+ keep_last: 5 # положительный параметр, свободно меняется владельцем проекта
472
+ ```
473
+
474
+ Пустой перечень обязательных проверок в примере не означает разрешения интеграции без контроля. При вводе процесса задаются реальные проверки либо явно утверждённая минимальная политика для данного типа репозитория. Также конфигурируются адрес образа, полномочия CI и используемый адаптер хостинга/registry.
475
+
476
+ ## 19. Требования к реализации в Wolf
477
+
478
+ ### 19.1. Разделение ответственности
479
+
480
+ | Слой | Что реализует |
481
+ |---|---|
482
+ | Политика | Правила этого документа, настройки и полномочия проекта |
483
+ | Переносимые скрипты | Фактический inspect/check, создание, checkpoint, публикация, безопасная уборка |
484
+ | Адаптер Git-хостинга | MR, статусы, готовность, условное обновление цели и защита refs |
485
+ | CI | Последовательная интеграция, подготовка тега, выпуск и очистка |
486
+ | Скиллы | Когда запускать операции, как читать результаты и реагировать на отказ |
487
+ | Агенты / люди | Смысловая приёмка, разрешение конфликтов и выполнение разрешённых действий |
488
+
489
+ OpenCode и другие харнесы вызывают общий механизм. Инструкции не должны зависеть от специальных worktree-команд одного харнеса. Отдельный постоянный агент-контролёр и распределённая система блокировок для первой реализации не требуются.
490
+
491
+ ### 19.2. Требования к операциям
492
+
493
+ - Явные repository/worktree, задача, стадия и ожидаемые SHA; запрет опасных неявных значений по текущему каталогу.
494
+ - Один фактический сборщик Git-состояния для всех проверок; отсутствие нескольких расходящихся трактовок.
495
+ - Режим проверки без исправлений; отдельные изменяющие операции.
496
+ - Краткий человекочитаемый итог и структурированный JSON с вердиктом, кодами причин, фактами и допустимым следующим действием.
497
+ - Различение «условия нарушены» и «не удалось проверить»; отсутствие данных не считается успехом.
498
+ - Повторная проверка предусловий непосредственно перед записью, общая локальная координация и серверные проверки ожидаемых refs.
499
+ - Безопасный повтор после частичного сбоя; журнал фактических результатов и отсутствие дубликатов интеграции/выпуска.
500
+ - Проверка собственных полномочий; отсутствие автоматического force, публикации неизвестной истории и удаления ради зелёного статуса.
501
+
502
+ В состоянии задачи достаточно ссылок и компактных фактов: task/parent, владелец, host/clone/worktree, branch/target, baseline/HEAD, dirty-state, remote observation, MR/source/result SHA, состояние проверок, следующий шаг и состояние уборки. Состояние Wolf не заменяет фактическую проверку Git и remote.
503
+
504
+ ### 19.3. Сценарии приёмки реализации
505
+
506
+ Реализация считается пригодной после проверки как минимум следующих сценариев:
507
+
508
+ 1. А и Б на разных хостах начинают от одного SHA; оба результата последовательно принимаются с проверкой совместного состояния.
509
+ 2. Конфликт Б не задерживает следующий независимый MR.
510
+ 3. Изменение source или target после проверки не позволяет опубликовать старого кандидата.
511
+ 4. Перезапуск CI после фактического merge не приводит к повторному применению задачи.
512
+ 5. Локальные неопубликованные коммиты в main обнаруживаются и сохраняются без автоматического push/reset.
513
+ 6. Передача ветки требует остановки прежнего писателя и доступности опубликованного SHA на другом хосте.
514
+ 7. После merge проверяется ancestry принятого SHA и запись MR; завершённая ветка без новых данных убирается безопасно, а ветка с дополнительным коммитом сохраняется. При явно разрешённом squash применяется отдельная проверка сохранности по source/result SHA.
515
+ 8. Worktree с ценными ignored-файлами не удаляется по одному лишь чистому status.
516
+ 9. Между MR и выпуском main уходит вперёд; тег остаётся на явно выбранном релизном SHA.
517
+ 10. Повтор выпуска после публикации версии восстанавливает latest без перезаписи образа версии.
518
+ 11. Числовая сортировка правильно обрабатывает `2.9.0`, `2.10.0`, `2.22.9`, `2.22.10`; изменение keep_last меняет план.
519
+ 12. Неполный список registry, общий digest сохраняемого тега и multi-platform ссылки не приводят к удалению нужного содержимого.
520
+ 13. Ошибка очистки не отменяет опубликованный выпуск и допускает безопасный повтор.
521
+ 14. Обычный merge в main не публикует контейнерный образ.
522
+ 15. Приём дочернего и головного MR через merge сохраняет исходные коммиты; `git log --first-parent` показывает интеграции, а полный граф позволяет связать изменение с исходным SHA и MR.
523
+ 16. Для merge-кандидата проверены два родителя (`T`, `S`), дерево и точный SHA `C`; изменение любого из `T`/`S` запрещает публикацию ранее проверенного `C`. Не поддерживающий эту гарантию hosting adapter отказывает безопасно.
524
+ 17. Запрос squash без явного исключения или при активной дочерней ветке не интегрируется squash-способом; при разрешённом исключении проверяется безопасная уборка без ancestry.
525
+
526
+ ## 20. Краткая памятка участнику
527
+
528
+ 1. **Вход:** проверь локальную работу, владельца и remote; затем обновляй.
529
+ 2. **Новая задача:** отдельная ветка от явного SHA main; подзадача — от SHA родителя.
530
+ 3. **Работа:** один писатель, свои файлы, checkpoint на логических границах.
531
+ 4. **Передача:** остановись, сохрани, опубликуй, передай SHA и следующий шаг.
532
+ 5. **Приёмка:** предъяви опубликованный SHA и проверки; субзадачу принимает родитель.
533
+ 6. **Main:** предъяви готовый MR; интеграцию выполняет общая очередь.
534
+ 7. **Отказ:** исправь конкретную причину и предъяви новый результат; чужая независимая работа продолжается.
535
+ 8. **Выпуск:** явный запрос версии и SHA, Git-тег, сборка и публикация образа, очистка registry.
536
+ 9. **Завершение:** подтверди сохранность, убери worktree и ненужные ветки на каждом хосте.
537
+
538
+ ## 21. Технические основания
539
+
540
+ Выбор очереди, модели веток, полномочий и правил хранения — политика данного регламента. Поведение инструментов проверяется по первичной документации:
541
+
542
+ - [Git worktree](https://git-scm.com/docs/git-worktree) — устройство связанных рабочих копий, общие refs, удаление и служебная блокировка.
543
+ - [Git push](https://git-scm.com/docs/git-push) — обновление удалённых refs и защита от нежелательных изменений истории.
544
+ - [Git merge](https://git-scm.com/docs/git-merge) — merge-коммиты, `--no-ff`, порядок родителей и отличия от squash.
545
+ - [Git log](https://git-scm.com/docs/git-log) — `--first-parent` и анализ происхождения изменений.
546
+ - [Semantic Versioning 2.0.0](https://semver.org/) — формат стабильной версии, числовой порядок и неизменность опубликованной версии.
547
+
548
+ Конкретные события CI, условия блокировки и операции удаления registry определяются адаптерами и проверяются при внедрении. Настоящий документ не предполагает, что обычный Git самостоятельно предоставляет MR, очередь, сведения о владельцах или registry API.
549
+
550
+
551
+ ## 22. История изменений регламента
552
+
553
+ - **1.1 (1 ноября 2026):** по решению владельца стандартная интеграция дочерних MR и MR в `main` изменена с squash на merge commit (`--no-ff`); уточнены два родителя и проверка точного кандидата, происхождение task/MR, уборка worktrees, конфигурация и сценарии приёмки. Squash оставлен только как явно разрешаемое исключение с отдельной проверкой сохранности. Остальные правила GitFlow не меняются.