Skip to content

chore(sync): make the manual sync the only sync - #377

Merged
IgorShevchik merged 1 commit into
mainfrom
chore/sync-manual-only
Aug 12, 2026
Merged

chore(sync): make the manual sync the only sync#377
IgorShevchik merged 1 commit into
mainfrom
chore/sync-manual-only

Conversation

@IgorShevchik

Copy link
Copy Markdown
Collaborator

The sync is manual by decision. This removes the automation that was designed but never built, and writes down the procedure it had been standing in for.

Removed

.sync/PLAN.md — the sync-dispatcher.yml / sync-porter.yml / sync-on-merge.yml design, with its hourly cron, five phases, concurrency gates and kill-switch. .sync/RUNBOOK.md — an incident playbook whose every row diagnosed one of those three workflows ("Dispatcher does nothing", "Cursor not advancing after merge", …).

Neither described anything that exists: no sync workflow was ever merged to main.

Two ledger fields. sync_enabled was the dispatcher's kill-switch — and a kill-switch for a dispatcher that will not exist reads as "the sync is off" to whoever finds it, which was already misleading while the procedure in PORTING.md ran twelve ports past it. stats was Phase-4 telemetry that was never written to: noop_ratio: 0 against an actual 47 of 226.

Written down instead

PORTING.md §6 now states the procedure the workflows used to imply, so removing them loses nothing operational:

  • one commit per PR, oldest-first, in true parent order — GitHub's compare view is not topological, and trusting it once put four commits in the wrong sequence;
  • verbatim diffs (curl raw at the commit and its parent, then diff -u) — rendered/summarised patches drop hunks on large commits, which is how a port was once declared blocked while upstream had shipped the fix alongside;
  • the gate in ci.yml's order, plus docs:generate when the commit touches docs/ — the ci gate never builds the docs site — with deploy.yml's env, since without NUXT_PUBLIC_GIT_URL the footer link collapses to a relative /releases and the prerender crawler fails on it;
  • ledger reconciliation, including the last-entry case, which has no follower to close it out;
  • the mergeable_state: "behind" rebase that branch protection requires.

The one runbook row that survives manual work came along: a cursor SHA lost to an upstream force-push moves to the nearest surviving ancestor with a tracking issue, never skips forward — otherwise every commit in between is silently never judged.

Two corrections found on the way

dependabot.yml deliberately skips npm updates because this pipeline carries them, and said to revisit "if sync_enabled is off for more than a month". That condition just became permanently true, and a permanently-true alarm is not an alarm. It now watches the only observable signal there is: cursor not advancing while nuxt/ui@v4 moves.

color-map.json mapped warningair-primary-alert — the same token as error. The lookup table a porter reads was telling them the two upstream colors are interchangeable. air-primary-warning exists and is used 50 times across src/theme/.

Follow-up not taken here

PR #67 (feat(sync): Phase 1 porter workflow + enriched icon/color maps) should be closed with this — it adds sync-porter.yml. But it also carries content that is useful to manual porting and would be lost:

  • an icons note for PORTING.md §1: b24ui shares nuxt/ui's semantic icon keys (src/runtime/dictionary/icons.ts), so appConfig.ui.icons.<key> ports unchanged and icon-map.json is only the fallback for hardcoded i-lucide-* literals;
  • ~31 added icon-map.json entries and 5 corrections (i-lucide-checkCheckLIcon not CheckIcon, chevron-downChevronDownLIcon not ChevronDownSIcon, minusMinus30Icon, xCrossMIcon).

Those values were written in June against an older @bitrix24/b24icons-vue and each one needs checking against the installed package before it can be trusted, so importing them wholesale here would mix verified deletions with unverified additions. Flagged rather than done — say the word and I will verify and land them separately.

Verify

lint green. No test reads .sync/; the two specs that mention it only cite it in comments. Nothing under src/ is touched.


Generated by Claude Code

The sync is manual by decision. Removes the automation that was designed but
never built, and writes down the procedure it was standing in for.

Deleted `.sync/PLAN.md` — the dispatcher/porter/on-merge design with its cron,
phases and kill-switch — and `.sync/RUNBOOK.md`, an incident playbook whose
every row diagnosed one of those three workflows. Neither described anything
that exists: no sync workflow was ever merged.

Dropped two ledger fields. `sync_enabled` was the dispatcher's kill-switch, and
a kill-switch for a dispatcher that will not exist reads as "the sync is off"
to whoever finds it — which was already misleading while the procedure in
`PORTING.md` ran twelve ports past it. `stats` was Phase-4 telemetry that was
never written to: `noop_ratio: 0` against an actual 47 of 226.

`PORTING.md` §6 now spells out what the workflows used to imply — parent-order
reconstruction (GitHub's compare view is not topological), verbatim diffs,
`ci.yml`'s gate order plus `docs:generate` with `deploy.yml`'s env, ledger
reconciliation including the last-entry case, and the `behind` rebase. The one
runbook row that survives manual work came with it: a cursor SHA lost to an
upstream force-push moves to the nearest surviving ancestor with a tracking
issue, never skips forward.

`dependabot.yml` skips npm updates because this pipeline carries them, and said
to revisit if `sync_enabled` stayed off for a month — a condition that just
became permanently true and therefore useless. It now watches the only
observable signal: `cursor` not advancing while `nuxt/ui@v4` moves.

Also corrects `color-map.json`, which mapped `warning` to `air-primary-alert`,
the same token as `error` — so the lookup table told a porter the two upstream
colors were interchangeable. `air-primary-warning` exists and is used 50 times
in `src/theme/`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JS8ypVfQSFzYVZzkTHhURb
@IgorShevchik
IgorShevchik merged commit c1cfa78 into main Aug 12, 2026
1 check passed
@IgorShevchik
IgorShevchik deleted the chore/sync-manual-only branch August 12, 2026 11:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants