[plan][git-sync] Порядок приземления: пакет в develop → канон #293 → интеграция #119 последней (без кривого функционала в develop) #326

Open
opened 2026-07-04 06:04:58 +03:00 by agent_vscode · 0 comments
Collaborator

Проблема

Возник конфликт последовательностей между #119 и #293:

  • Исходники конвертера/движка (packages/git-sync/src/*) живут только на ветке feat/git-sync (#119). В develop лежит лишь мёртвый скомпилированный build/.
  • #293 (единый пакет конвертера) на stage 3 переключает git-sync на новый пакет — ему нужны исходники в develop.
  • #119 approved, но mergeable=false (develop уехал на 79 коммитов, ветка — на 104; конфликты: .env.example / AGENTS.md / Dockerfile / translation.json / один тест / git-sync build).
  • Решение мейнтейнера: НЕ приземлять в develop функциональность в текущем виде — конвертер #119 пишет легаси-формат, который канон #293 (см. #293 (comment)) полностью заменяет, плюс известные баги конвертера (spoiler в raw-HTML-пути и др.).

Проверенный факт, на котором строится план

В develop git-sync полностью инертен: grep -rln "git-sync|git_sync" apps/server/src — пусто; пакет не подключён ни в один package.json/workspace; packages/git-sync/build/ не импортируется никем. Вся функциональность (оркестратор/листенер/git-HTTP/UI) существует только на ветке #119.

Следствие: можно разделить код (безопасно приземлить сейчас) и функциональность (приземлить последней, уже с каноническим форматом).

План

  • Шаг 0 — гигиена ветки (уже в работе у кодера): merge develop → feat/git-sync, разводка ограниченных конфликтов. Конфликты по packages/git-sync/build/ разводить в сторону удаления артефактов (политика «build не коммитим», решение мейнтейнера от 06-21 + коммит "stop committing build/"), НЕ «take theirs» из develop. Цель шага — здоровье ветки, не приземление #119.
  • Шаг 1 — PR-A: пакет в develop, code-only. Из свежесмерженной головы ветки вырезать PR в develop, содержащий ТОЛЬКО: packages/git-sync (src + тесты, ~700 кейсов), подключение в pnpm-workspace + lockfile (урок F1: CI-блокер из-за отсутствия пакета в pnpm-lock), удаление мёртвого packages/git-sync/build/ из develop. БЕЗ серверной интеграции, БЕЗ загрузчика, БЕЗ Dockerfile-правок под рантайм. Рантайм-поведение develop не меняется вообще (потребителей нет — см. факт выше); в develop попадает код под CI, не функционал.
  • Шаг 2 — #293 stage 1–2 на develop: пакет @docmost/prosemirror-markdown seed-ится из приземлённых исходников develop (не из головы ветки), parity-корпус.
  • Шаг 3 — #293 stage 3, честный no-op: @docmost/git-sync (lib) переключается на новый пакет с текущим поведением, под существующим round-trip корпусом. Форматных изменений в этом PR нет — это верификация выноса.
  • Шаг 4 — канон-PRы в пакете, fixtures-first: решения №1–№9 из #293 (comment), по одному решению за PR (сноски ^[…], img-комментарии, $…$, ==…==, медиа-семья, textAlign, subpages/pagebreak). Здесь же чинятся известные баги конвертера из инвентаризации (spoiler в inlineToHtml, link title, emoji/date/toc, codeCombined) — в пакете, а не в легаси-копии. Goldens обновляются осознанно по фикстурам. Живой потребитель пакета на этом этапе один (код git-sync, всё ещё без рантайма в develop).
  • Шаг 5 — #293 stage 4: переключение mcp на пакет; mcp прыгает сразу на канон. До переключения mcp дописываются round-trip тесты (сейчас их нет — без них любое изменение mcp-конвертера это риск тихой потери данных).
  • Шаг 6 — приземление #119 ПОСЛЕДНИМ: ветка мержит develop ещё раз, её локальная lib-копия схлопывается в пакет (diff #119 уменьшается на весь конвертер), фича с первого дня пишет канонический формат — легаси-формат не попадает ни в develop, ни в один vault. Полный re-review финальной головы (approve на старую голову не переносится). Второй контур защиты остаётся в силе: strict per-space opt-in + env-конфиг.

Инварианты (guardrails)

  1. develop ни на одном шаге не исполняет синк — приземляется только код и тесты.
  2. Канон НЕ реализуется ни в ветке #119, ни в легаси-копиях (mcp/старый lib) — только в едином пакете, один раз. Реализация канона в копии = воспроизведение генератора дрейфа, ради уничтожения которого затеян #293.
  3. #119 заморожен по скоупу: в ветку идут только merge develop и разводка конфликтов.
  4. Parity-фикстуры на каждый новый формат пишутся до реализации.
  5. «Стенд работает» ≠ «jest зелёный»: отчёты по каждому шагу — с приложенным выводом прогона тестов (протокол от 07-02).

Связанные

  • #119 — фича git-sync (приземляется шагом 6)
  • #293 — консолидация конвертеров + канон форматов (шаги 2–5)
  • Решения канона: #293 (comment)
## Проблема Возник конфликт последовательностей между #119 и #293: - Исходники конвертера/движка (`packages/git-sync/src/*`) живут **только** на ветке `feat/git-sync` (#119). В develop лежит лишь мёртвый скомпилированный `build/`. - #293 (единый пакет конвертера) на stage 3 переключает git-sync на новый пакет — ему нужны исходники в develop. - #119 approved, но mergeable=false (develop уехал на 79 коммитов, ветка — на 104; конфликты: `.env.example` / `AGENTS.md` / `Dockerfile` / `translation.json` / один тест / git-sync build). - **Решение мейнтейнера: НЕ приземлять в develop функциональность в текущем виде** — конвертер #119 пишет легаси-формат, который канон #293 (см. https://gitea.vvzvlad.xyz/vvzvlad/gitmost/issues/293#issuecomment-5076) полностью заменяет, плюс известные баги конвертера (spoiler в raw-HTML-пути и др.). ## Проверенный факт, на котором строится план В develop git-sync **полностью инертен**: `grep -rln "git-sync|git_sync" apps/server/src` — пусто; пакет не подключён ни в один `package.json`/workspace; `packages/git-sync/build/` не импортируется никем. Вся функциональность (оркестратор/листенер/git-HTTP/UI) существует только на ветке #119. Следствие: можно разделить **код** (безопасно приземлить сейчас) и **функциональность** (приземлить последней, уже с каноническим форматом). ## План - [ ] **Шаг 0 — гигиена ветки** (уже в работе у кодера): merge develop → `feat/git-sync`, разводка ограниченных конфликтов. Конфликты по `packages/git-sync/build/` разводить в сторону **удаления артефактов** (политика «build не коммитим», решение мейнтейнера от 06-21 + коммит "stop committing build/"), НЕ «take theirs» из develop. Цель шага — здоровье ветки, **не** приземление #119. - [ ] **Шаг 1 — PR-A: пакет в develop, code-only.** Из свежесмерженной головы ветки вырезать PR в develop, содержащий ТОЛЬКО: `packages/git-sync` (src + тесты, ~700 кейсов), подключение в pnpm-workspace + lockfile (урок F1: CI-блокер из-за отсутствия пакета в pnpm-lock), удаление мёртвого `packages/git-sync/build/` из develop. БЕЗ серверной интеграции, БЕЗ загрузчика, БЕЗ Dockerfile-правок под рантайм. Рантайм-поведение develop не меняется вообще (потребителей нет — см. факт выше); в develop попадает код под CI, не функционал. - [ ] **Шаг 2 — #293 stage 1–2 на develop**: пакет `@docmost/prosemirror-markdown` seed-ится из **приземлённых** исходников develop (не из головы ветки), parity-корпус. - [ ] **Шаг 3 — #293 stage 3, честный no-op**: `@docmost/git-sync` (lib) переключается на новый пакет с **текущим** поведением, под существующим round-trip корпусом. Форматных изменений в этом PR нет — это верификация выноса. - [ ] **Шаг 4 — канон-PRы в пакете, fixtures-first**: решения №1–№9 из https://gitea.vvzvlad.xyz/vvzvlad/gitmost/issues/293#issuecomment-5076, по одному решению за PR (сноски `^[…]`, img-комментарии, `$…$`, `==…==`, медиа-семья, textAlign, subpages/pagebreak). Здесь же чинятся известные баги конвертера из инвентаризации (spoiler в `inlineToHtml`, link title, emoji/date/toc, codeCombined) — в пакете, а не в легаси-копии. Goldens обновляются осознанно по фикстурам. Живой потребитель пакета на этом этапе один (код git-sync, всё ещё без рантайма в develop). - [ ] **Шаг 5 — #293 stage 4: переключение mcp** на пакет; mcp прыгает сразу на канон. До переключения mcp дописываются round-trip тесты (сейчас их нет — без них любое изменение mcp-конвертера это риск тихой потери данных). - [ ] **Шаг 6 — приземление #119 ПОСЛЕДНИМ**: ветка мержит develop ещё раз, её локальная lib-копия схлопывается в пакет (diff #119 уменьшается на весь конвертер), фича **с первого дня пишет канонический формат** — легаси-формат не попадает ни в develop, ни в один vault. Полный re-review финальной головы (approve на старую голову не переносится). Второй контур защиты остаётся в силе: strict per-space opt-in + env-конфиг. ## Инварианты (guardrails) 1. develop **ни на одном шаге** не исполняет синк — приземляется только код и тесты. 2. Канон НЕ реализуется ни в ветке #119, ни в легаси-копиях (mcp/старый lib) — только в едином пакете, один раз. Реализация канона в копии = воспроизведение генератора дрейфа, ради уничтожения которого затеян #293. 3. #119 заморожен по скоупу: в ветку идут только merge develop и разводка конфликтов. 4. Parity-фикстуры на каждый новый формат пишутся **до** реализации. 5. «Стенд работает» ≠ «jest зелёный»: отчёты по каждому шагу — с приложенным выводом прогона тестов (протокол от 07-02). ## Связанные - #119 — фича git-sync (приземляется шагом 6) - #293 — консолидация конвертеров + канон форматов (шаги 2–5) - Решения канона: https://gitea.vvzvlad.xyz/vvzvlad/gitmost/issues/293#issuecomment-5076
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#326