Last Updated: October 10, 2025
Status: Active
Current Phase: Pre-1.0 (Relaxed Rules)
⚠️ Pre-1.0 Workflow (Current)
TLDR for now: Since yaze is pre-1.0 and actively evolving, we use a simplified workflow:
- ✅ Documentation changes: Commit directly to
master
or develop
- ✅ Small bug fixes: Can go direct to
develop
, no PR required
- ✅ Solo work: Push directly when you're the only one working
- ⚠️ Breaking changes: Use feature branches and document in changelog
- ⚠️ Major refactors: Use feature branches for safety (can always revert)
Why relaxed?
- Small team / solo development
- Pre-1.0 means breaking changes are expected
- Documentation needs to be public quickly
- Overhead of PRs/reviews slows down experimentation
When to transition to strict workflow:
- Multiple active contributors
- Stable API (post-1.0)
- Large user base depending on stability
- Critical bugs need rapid hotfixes
Pre-1.0 Release Strategy: Best Effort Releases
For all versions prior to 1.0.0, yaze follows a **"best effort"** release strategy. This prioritizes getting working builds to users quickly, even if not all platforms build successfully on the first try.
Core Principles
- Release Can Proceed with Failed Platforms: The
release
CI/CD workflow will create a GitHub Release even if one or more platform-specific build jobs (e.g., Windows, Linux, macOS) fail.
- Missing Platforms Can Be Added Later: A failed job for a specific platform can be re-run from the GitHub Actions UI. If it succeeds, the binary artifact will be automatically added to the existing GitHub Release.
- Transparency is Key: The release notes will automatically generate a "Platform Availability" report, clearly indicating which platforms succeeded (✅) and which failed (❌), so users know the current status.
How It Works in Practice
- The
build-and-package
jobs in the release.yml
workflow have continue-on-error: true
.
- The final
create-github-release
job has if: always()
and uses softprops/action-gh-release@v2
, which intelligently updates an existing release if the tag already exists.
- If a platform build fails, a developer can investigate the issue and simply re-run the failed job. Upon success, the new binary is uploaded and attached to the release that was already created.
This strategy provides flexibility and avoids blocking a release for all users due to a transient issue on a single platform. Once the project reaches v1.0.0, this policy will be retired in favor of a stricter approach where all platforms must pass for a release to proceed.
📚 Full Workflow Reference (Future/Formal)
The sections below document the formal Git Flow model that yaze will adopt post-1.0 or when the team grows. For now, treat this as aspirational best practices.
Branch Structure
Main Branches
<tt>master</tt>
- Purpose: Production-ready release branch
- Protection: Protected, requires PR approval
- Versioning: Tagged with semantic versions (e.g.,
v0.3.2
, v0.4.0
)
- Updates: Only via approved PRs from
develop
or hotfix branches
<tt>develop</tt>
- Purpose: Main development branch, integration point for all features
- Protection: Protected, requires PR approval
- State: Should always build and pass tests
- Updates: Merges from feature branches, releases merge back after tagging
Supporting Branches
Feature Branches
Naming Convention: feature/<short-description>
Examples:
feature/overworld-editor-improvements
feature/dungeon-room-painter
feature/add-sprite-animations
Rules:
- Branch from:
develop
- Merge back to:
develop
- Lifetime: Delete after merge
- Naming: Use kebab-case, be descriptive but concise
Workflow:
# Create feature branch
git checkout develop
git pull origin develop
git checkout -b feature/my-feature
# Work on feature
git add .
git commit -m "feat: add new feature"
# Keep up to date with develop
git fetch origin
git rebase origin/develop
# Push and create PR
git push -u origin feature/my-feature
Bugfix Branches
Naming Convention: bugfix/<issue-number>-<short-description>
Examples:
bugfix/234-canvas-scroll-regression
bugfix/fix-dungeon-crash
Rules:
- Branch from:
develop
- Merge back to:
develop
- Lifetime: Delete after merge
- Reference issue number when applicable
Hotfix Branches
Naming Convention: hotfix/<version>-<description>
Examples:
hotfix/v0.3.3-memory-leak
hotfix/v0.3.2-crash-on-startup
Rules:
- Branch from:
master
- Merge to: BOTH
master
AND develop
- Creates new patch version
- Used for critical production bugs only
Workflow:
# Create hotfix from master
git checkout master
git pull origin master
git checkout -b hotfix/v0.3.3-critical-fix
# Fix the issue
git add .
git commit -m "fix: critical production bug"
# Merge to master
git checkout master
git merge --no-ff hotfix/v0.3.3-critical-fix
git tag -a v0.3.3 -m "Hotfix: critical bug"
git push origin master --tags
# Merge to develop
git checkout develop
git merge --no-ff hotfix/v0.3.3-critical-fix
git push origin develop
# Delete hotfix branch
git branch -d hotfix/v0.3.3-critical-fix
Release Branches
Naming Convention: release/<version>
Examples:
release/v0.4.0
release/v0.3.2
Rules:
- Branch from:
develop
- Merge to:
master
AND develop
- Used for release preparation (docs, version bumps, final testing)
- Only bugfixes allowed, no new features
Workflow:
# Create release branch
git checkout develop
git pull origin develop
git checkout -b release/v0.4.0
# Prepare release (update version, docs, changelog)
# ... make changes ...
git commit -m "chore: prepare v0.4.0 release"
# Merge to master and tag
git checkout master
git merge --no-ff release/v0.4.0
git tag -a v0.4.0 -m "Release v0.4.0"
git push origin master --tags
# Merge back to develop
git checkout develop
git merge --no-ff release/v0.4.0
git push origin develop
# Delete release branch
git branch -d release/v0.4.0
Experimental Branches
Naming Convention: experiment/<description>
Examples:
experiment/vulkan-renderer
experiment/wasm-build
Rules:
- Branch from:
develop
or master
- May never merge (prototypes, research)
- Document findings in docs/experiments/
- Delete when concluded or merge insights into features
Commit Message Conventions
Follow Conventional Commits specification:
Format
<type>(<scope>): <subject>
<body>
<footer>
Types
feat
: New feature
fix
: Bug fix
docs
: Documentation only
style
: Code style (formatting, semicolons, etc.)
refactor
: Code refactoring
perf
: Performance improvements
test
: Adding or updating tests
build
: Build system changes (CMake, dependencies)
ci
: CI/CD configuration changes
chore
: Maintenance tasks
Scopes (optional)
overworld
: Overworld editor
dungeon
: Dungeon editor
graphics
: Graphics editor
emulator
: Emulator core
canvas
: Canvas system
gui
: GUI/ImGui components
Examples
# Good commit messages
feat(overworld): add tile16 quick-select palette
fix(canvas): resolve scroll regression after refactoring
docs: update build instructions for SDL3
refactor(emulator): extract APU timing to cycle-accurate model
perf(dungeon): optimize room rendering with batched draw calls
# With body and footer
feat(overworld): add multi-tile selection tool
Allows users to select and copy/paste rectangular regions
of tiles in the overworld editor. Supports undo/redo.
Closes #123
Pull Request Guidelines
PR Title
Follow commit message convention:
feat(overworld): add new feature
fix(dungeon): resolve crash
PR Description Template
## Description
Brief description of changes
## Type of Change
- [ ] Bug fix (non-breaking change)
- [ ] New feature (non-breaking change)
- [ ] Breaking change (fix or feature that breaks existing functionality)
- [ ] Documentation update
## Testing
- [ ] All tests pass
- [ ] Added new tests for new features
- [ ] Manual testing completed
## Checklist
- [ ] Code follows style guidelines
- [ ] Self-review completed
- [ ] Documentation updated
- [ ] No new warnings
- [ ] Dependent changes merged
PR Review Process
- Author: Create PR, fill out template, request reviewers
- CI: Automatic build and test on all platforms
- Reviewers: Code review, suggest changes
- Author: Address feedback, push updates
- Approval: At least 1 approval required for merge
- Merge: Squash or merge commit (case-by-case)
Version Numbering
Follow Semantic Versioning (SemVer): MAJOR.MINOR.PATCH
MAJOR (e.g., 1.0.0)
- Breaking API changes
- Major architectural changes
- First stable release
MINOR (e.g., 0.4.0)
- New features (backward compatible)
- Significant improvements
- Major dependency updates (SDL3)
PATCH (e.g., 0.3.2)
- Bug fixes
- Minor improvements
- Documentation updates
Pre-release Tags
v0.4.0-alpha.1
- Early testing
v0.4.0-beta.1
- Feature complete
v0.4.0-rc.1
- Release candidate
Release Process
For Minor/Major Releases (0.x.0, x.0.0)
- Create release branch
git checkout -b release/v0.4.0
- Update version numbers
- Update documentation
- Review all docs for accuracy
- Update migration guides if breaking changes
- Finalize changelog
- Create release commit
git commit -m "chore: prepare v0.4.0 release"
- Merge and tag
git checkout master
git merge --no-ff release/v0.4.0
git tag -a v0.4.0 -m "Release v0.4.0"
git push origin master --tags
- Merge back to develop
git checkout develop
git merge --no-ff release/v0.4.0
git push origin develop
- Create GitHub Release
- Draft release notes
- Attach build artifacts (CI generates these)
- Publish release
For Patch Releases (0.3.x)
- Collect fixes on develop
- Merge all bugfix PRs to develop
- Ensure tests pass
- Create release branch
git checkout -b release/v0.3.2
- Follow steps 2-7 above
Long-Running Feature Branches
For large features (e.g., v0.4.0 modernization), use a feature branch with sub-branches:
develop
└── feature/v0.4.0-modernization (long-running)
├── feature/v0.4.0-sdl3-core
├── feature/v0.4.0-sdl3-graphics
└── feature/v0.4.0-sdl3-audio
Rules:
- Long-running branch stays alive during development
- Sub-branches merge to long-running branch
- Long-running branch periodically rebases on
develop
- Final merge to
develop
when complete
Tagging Strategy
Release Tags
- Format:
v<MAJOR>.<MINOR>.<PATCH>[-prerelease]
- Examples:
v0.3.2
, v0.4.0-rc.1
, v1.0.0
- Annotated tags with release notes
Internal Milestones
- Format:
milestone/<name>
- Examples:
milestone/canvas-refactor-complete
- Used for tracking major internal achievements
Best Practices
DO ✅
- Keep commits atomic and focused
- Write descriptive commit messages
- Rebase feature branches on develop regularly
- Run tests before pushing
- Update documentation with code changes
- Delete branches after merging
DON'T ❌
- Commit directly to master or develop
- Force push to shared branches
- Mix unrelated changes in one commit
- Merge without PR review
- Leave stale branches
Quick Reference
# Start new feature
git checkout develop
git pull
git checkout -b feature/my-feature
# Update feature branch with latest develop
git fetch origin
git rebase origin/develop
# Finish feature
git push -u origin feature/my-feature
# Create PR on GitHub → Merge → Delete branch
# Start hotfix
git checkout master
git pull
git checkout -b hotfix/v0.3.3-fix
# ... fix, commit, merge to master and develop ...
# Create release
git checkout develop
git pull
git checkout -b release/v0.4.0
# ... prepare, merge to master, tag, merge back to develop ...
Emergency Procedures
If master is broken
- Create hotfix branch immediately
- Fix critical issue
- Fast-track PR review
- Hotfix deploy ASAP
If develop is broken
- Identify breaking commit
- Revert if needed
- Fix in new branch
- Merge fix with priority
If release needs to be rolled back
- Tag current state as
v0.x.y-broken
- Revert master to previous tag
- Create hotfix branch
- Fix and release as patch version
🚀 Current Simplified Workflow (Pre-1.0)
Daily Development Pattern
# For documentation or small changes
git checkout master # or develop, your choice
git pull
# ... make changes ...
git add docs/
git commit -m "docs: update workflow guide"
git push origin master
# For experimental features
git checkout -b feature/my-experiment
# ... experiment ...
git push -u origin feature/my-experiment
# If it works: merge to develop
# If it doesn't: delete branch, no harm done
When to Use Branches (Pre-1.0)
Use a branch for:
- Large refactors that might break things
- Experimenting with new ideas
- Features that take multiple days
- SDL3 migration or other big changes
Don't bother with branches for:
- Documentation updates
- Small bug fixes
- Typo corrections
- README updates
- Adding comments or tests
Current Branch Usage
For now, treat master
and develop
interchangeably:
master
: Latest stable-ish code + docs
develop
: Optional staging area for integration
When you want docs public, just push to master
. The GitHub Pages / docs site will update automatically.
Commit Message (Simplified)
Still try to follow the convention, but don't stress:
# Good enough
git commit -m "docs: reorganize documentation structure"
git commit -m "fix: dungeon editor crash on load"
git commit -m "feat: add overworld sprite editor"
# Also fine for now
git commit -m "update docs"
git commit -m "fix crash"
Releases (Pre-1.0)
Just tag and push:
# When you're ready for v0.3.2
git tag -a v0.3.2 -m "Release v0.3.2"
git push origin v0.3.2
# GitHub Actions builds it automatically
No need for release branches or complex merging until you have multiple contributors.
References: