CLAUDE.md and docs/release-channels.md now describe the full cycle: work lands on feature/fix branches merged into dev, dev auto-publishes on every push, beta is cut from dev as a frozen stabilization branch (also auto-publishing on every push, fixes forwarded from fix/<issue> branches), and after a quiet freeze period beta merges to main and gets tagged for the actual stable release. Also fixes README's stale reference to .github/workflows (actual CI lives under .forgejo/workflows) and links out to the new CONTRIBUTING.md.
3.3 KiB
3.3 KiB
CLAUDE.md — Repo hygiene
Scope: this file covers repo hygiene — branching, remotes, CI, cleanup. It is not project documentation.
Branch model
main— release branch, always tag-ready. Don't commit directly to it; the only thing that lands there is abetamerge (see release lifecycle below).dev— integration branch. Land day-to-day work here first. Publishes a dev-track build automatically on every push (see CI below) — this is the "push, test, fix forward with another push" loop.beta— frozen stabilization branch, cut fromdev. Publishes a beta-track build automatically on every push, same asdev. While frozen, onlyfix/<issue>branches merged directly intobetashould land there —devkeeps moving independently for the next cycle.- All new work — features and bug fixes alike — goes on short-lived branches:
feature/<name>orfix/<issue>. Normally these branch offdevand merge back intodev. During a beta freeze, a fix for a beta-reported issue branches offbetainstead, merges intobetato unblock testers, and should also be cherry-picked/merged intodevso the bug doesn't quietly regress there.
Release lifecycle
- Work lands on
devviafeature/x/fix/xbranches. Every push todevauto-publishes a dev-track build (bakery track set dev) — test it, fix issues with another push todev. - Once
devhas gone roughly a week without new issues, cutbetafresh fromdev's current tip:git branch -f beta dev(from a clean checkout — don'tgit checkout main/git mergefor this, use a plain branch-pointer move), then force-pushbetato both remotes. This freezes it. betaauto-publishes on every push, same asdev. Anyone can file issues against it on Forgejo. Fixes land viafix/<issue>→beta(and should be forwarded intodevtoo).- Once
betahas gone roughly a month without new issues, mergebeta→main, then push avX.Y.Ztag frommainto actually cut the stable release (the merge alone triggers no CI — only the tag does). Resetbetafresh fromdevagain to start the next cycle.
Remotes
origin— Forgejo (git.breadway.devvia Hestia, SSH) — authoritative.github— GitHub mirror. Push both when publishing.
CI
.forgejo/workflows/package.yml,release-bakery.yml,release-bread-theme.ymlall trigger only onpush: tags: ['v*']— pushing todev,beta, ormaindoesn't run these. Tag a release to trigger packaging.dev-bakery.yml/dev-bread-theme.ymltrigger onpush: branches: ['dev'];beta-bakery.yml/beta-bread-theme.ymltrigger onpush: branches: ['beta']— both auto-publish a signed, auto-versioned build todl.breadway.dev/{dev,beta}/. Seedocs/release-channels.mdfor the full three-track (stable/beta/dev) policy.- No build/lint/test CI runs on ordinary commits or PRs to
dev/betabeyond what those track workflows do — there's no separate lint/PR-check pipeline.
Cleanup
- Delete feature/fix branches (local + remote) once merged. Check with
git branch --merged dev/git branch --merged main. - A
fix/audit-findingsbranch and a mergedcopilot/create-readme-mdbranch (both local and onorigin/github) were found stale and fully merged here on 2026-07-21 and removed.
Don't
- Don't embed credentials in remote URLs — SSH or a credential helper only.