|
Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
|
The standards for this repo. The overriding goal: a clean, faithful, low-risk history — "a dull flat repo over a screwed-up one." Established 2026-06-07; moved to the fairyfox git-flow model 2026-06-26 (adopted from hub/standards/git-workflow.md).
This repo follows git-flow (Vincent Driessen's branching model) in full, as far as makes sense for a solo project — the branch roles, where work happens, and the release/hotfix flows are the standard. It does not require the git flow CLI or any wrapper scripts: plain git carries the whole model, upheld by judgement.
This replaces the old lean dev → main fast-forward habit (2026-06-07 → 2026-06-26), which was only a thin shadow of git-flow. git-flow is the sturdier starting point.
Two long-lived branches and three kinds of short-lived support branch.
Support-branch names use a type/ prefix (feature/, release/, hotfix/) + a short kebab-case description.
git-flow assumes a team; this project is solo, so one piece of judgement applies within the model: a genuinely trivial change — a typo, a one-line doc fix, a notes update — may be committed directly on dev rather than via a feature/* branch. Anything that is really "a feature," or is large/risky, still gets its own branch. The release path is not latitude — it's fixed by the SemVer level below.
The --no-ff merge commit groups the feature's commits under one parent, so the feature stays legible in history and revertible in one move (git revert -m 1 <merge>).
This project ships releases through release.yml (see notes/reference/deployment.md), which fires on every push to main and publishes a GitHub Release when VERSION was bumped.
Project divergence (recorded on purpose): the release tag is created by CI, not by hand. The hub runbook ends a release with a manual git tag -a vX.Y.Z && git push --tags. Here the release.yml pipeline owns tagging — its version job derives v<VERSION> and softprops/action-gh-release creates the tag on the merge commit. So do NOT manually tag: a hand-pushed tag would make the version job see the tag already exists and skip the release. The git-flow intent is fully met (every main commit is a --no-ff merge carrying a matching v<VERSION> tag); only who applies the tag differs, and the project owns that rendering. This is the one deliberate departure from the hub runbook's step 5.
PATCH (the default — fixes, ordinary changes): release directly dev → main, no release branch.
MINOR / MAJOR (a milestone): go through a release/X.Y.0 branch so the milestone is a deliberate, reviewable event. (MAJOR → 1.0.0 is the project owner's — Twilight's — call only.)
A production problem that can't wait for the next dev cycle is fixed on a branch cut from main, then folded back into both lines:
Before commit dab0a1d (2026-06-13) the version file was VERSION.txt and the changelog folder was version/. That commit renamed them to VERSION and version-notes/ (the changelog was later moved into notes/ and renamed notes/version/ on 2026-06-14 — a subdirectory, so it no longer collides with the root VERSION). Because the Windows filesystem is case-insensitive, the working-tree file VERSION and an old commit's tracked directory version/ are the same path, so git checkout <pre-rename-ref> aborts with "untracked working tree files would be overwritten: version". It only bites when checking out / bisecting old history. Workarounds: fast-forward a ref without a working-tree switch — git fetch . dev:main — or temporarily move VERSION aside before the historical checkout. (See reference/versioning.md.)
git-flow merges with --no-ff: features back into dev; release//hotfix/ branches into both main and dev; and a PATCH release dev → main. Each creates a merge commit, so the grouping stays legible and revertible as a unit. Every merge into main is a tagged release. This is all additive — it never rewrites history. Do not squash, rebase, reorder, or amend anything already pushed; every original commit is preserved through every merge.
Push on every commit, early and often — don't leave work only on the local machine. All sessions keep the remote current, just like the living notes.
Standing default (2026-06-10, amended 2026-07-10): commit/push on dev is automatic — done by default without being asked. Releasing dev → main is NOT automatic anymore — it is MANUAL. Cut a release only when Twilight explicitly says "ship" / "ship it" / similar (2026-07-10); until then, keep committing and pushing to dev but leave main alone, even when everything is green. (Green is required for a ship, but no longer triggers one on its own — this supersedes the earlier "green-gated release is fully automatic" wording.) The only-when-asked restriction still also covers the genuinely destructive ops (force-push, history rewrite, reset --hard, rebase, clean -fd, long-lived-branch deletion), which remain off-limits without an explicit request. The full default loop lives in CLAUDE.md → "Default Workflow — Do These By Default."
Do not rebase/squash/reorder/amend already-pushed commits to "tidy up." It's both the #1 corruption risk and what destroys faithfulness. The discipline lives in writing good commits up front, not in after-the-fact surgery. (git-flow's --no-ff merge commits are additive and allowed — they are not a rewrite.)
The check that catches a violation — run on request, report done/partial/missing (the per-standard slice the fairyfox compliance audit aggregates):
| Passes only when… | How to check |
|---|---|
| Stable branch is main, not master | git branch -a |
| Every commit on main is a --no-ff release merge carrying a matching vX.Y.Z tag — no direct commits | git log --first-parent --oneline main; git tag |
| Pushed history is intact — no force-push / rebase / reset of published commits | history stable across fetches; no --force in reflog |
| Spent feature//release//hotfix/ branches deleted; main/dev intact | git branch -a |
| Each release to main rode a green build/test checkpoint (local ctest + remote tests CI) | release followed a green check |
Done: master renamed to main locally; dev created; both pushed to origin; GitHub default branch set to main; stale origin/master deleted (verified 0 unique commits on it first, with a guard). Remote has exactly main (stable) + dev; origin/HEAD → origin/main. Repo: github.com/junebug12851/pokered-save-editor-2. No commits were lost in the rename. (The master → main rename git-flow mandates was therefore already done long before this repo adopted git-flow.)