Files
windy-git/docs/CUTOVER.md
Grant Whitmer 7711adcb97
All checks were successful
check / gate (push) Successful in 18s
canary / probe (push) Successful in 11s
docs: cutover — Windy Git is the daily driver
9 repos migrated writable with push-mirrors to GitHub (sync_on_commit).
Full loop proven end to end: pushed a commit to Windy Git, its existing
workflow ran on Veron 1, and GitHub received the commit within 20s.

Documents the one rule the cutover creates: do NOT push directly to GitHub for
a migrated repo. The mirror makes GitHub match Windy Git, so a direct commit is
overwritten on the next sync, silently, with no conflict. One writer is the
point — two writers with no reconciliation is how you lose work you thought was
saved.

windy-pro deliberately excluded until its six-checkout / forked-counter
ambiguity is resolved by reading (G11.5).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 21:54:47 -04:00

2.6 KiB

Windy Git is the daily driver — 2026-08-13

Grant's call, 2026-08-12: push to Windy Git; GitHub is the second copy.

you ──push──▶ Windy Git (Veron 1) ──▶ CI on 24 cores
                   │
                   └──push-mirror on every commit──▶ GitHub

🔴 The one rule this creates

Do not push directly to GitHub for a migrated repo.

A push mirror makes GitHub match Windy Git. Anything committed straight to GitHub is overwritten on the next sync, silently, with no conflict and no warning. That is the cost of having one writer, and one writer is the point — two writers with no reconciliation is how you lose work you thought was saved.

If you must hotfix on GitHub: push there, then immediately pull that commit into Windy Git before anything triggers a mirror sync. Better: don't.

Migrated (9)

windy-calendar · windy-search · windy-registry · Windy-Clone · WindyCloud · windy-cloud-sites · windy-mind · eternitas · windy-agent

All writable (mirror=false), all push-mirroring to GitHub with sync_on_commit: true. Clone from https://app.windygit.com/windyadmin/<repo>.git.

Not migrated on purpose: windy-pro. Six checkouts exist, the build counter has forked three ways (main 12 / overnight 34 / wave-44 56), and two sessions recorded different HEADs hours apart. Resolve which is current and write it down first (G11.5). The import script refuses it by name.

CI

The runner advertises veron-1, linux-x64, self-hosted, linux, x64. 36 of 36 active workflows in the fleet already say runs-on: [self-hosted, linux, x64] — they were written for the self-hosted runners that died when the repos went private, so they run as-is, unedited.

Proven: windy-calendar's existing .github/workflows/ci.yml ran on Veron 1 and reported success with no changes.

Per-repo secrets are not imported. A repo whose CI needs a database URL or an API key will fail until those are set in its Gitea repo settings. Set them as each repo needs them, not speculatively.

Backups

Nightly windygit-backup.timer at 04:17 (Persistent=true, so a window missed while the workstation is off is caught up rather than skipped). Every repo is bundled --all, verified, and uploaded to R2 with the windgit schema.

Restore is rehearsed, not assumed: a bundle was pulled back from R2, cloned, and its HEAD matched live origin/main exactly.

Verify the loop yourself

git clone https://app.windygit.com/windyadmin/windy-calendar.git
cd windy-calendar && git commit --allow-empty -m "probe" && git push
# CI runs on Veron 1; GitHub receives the commit within ~20s