This document defines the development workflow and versioning philosophy for Owlgorithm. AI agents should follow these guidelines when suggesting changes, commits, and version bumps.
Version when users would care, not by calendar or commit count.
Before suggesting a version bump, ask:
"If I were a user of this project, would I bother updating to get these changes?"
- Yes, definitely → MINOR or MAJOR bump
- Yes, if it's easy → PATCH bump
- Meh, not really → Keep working, don't version yet
- Completed a user-facing feature (however small)
- Fixed a bug that impacts user experience
- Made setup/configuration easier
- Added documentation that changes user workflow
- Accumulated 3-5+ small improvements that add up
- About to start risky work (lock in current stable state)
- Made a breaking change (immediate MAJOR bump)
- Internal refactoring with no user impact
- Work-in-progress commits
- Dependency updates (unless user-visible)
- Code style/formatting changes
- Comment typo fixes
- Single-line bug fixes in development
# Good: One logical change per commit
feat(notifiers): add email backend interface
fix: handle edge case when sessions list is empty
docs: clarify Python version requirements
# Bad: Multiple unrelated changes
feat: add email, fix scraper, update docs, refactor utilsFeature Branches (for larger/riskier work):
git checkout -b feat/email-notifications
# Multiple related commits
git commit -m "feat(notifiers): add email backend"
git commit -m "feat(notifiers): implement SMTP client"
git commit -m "test: add email notification tests"
# Merge when complete
git checkout main && git merge feat/email-notificationsDirect-to-Main (for small improvements):
# Small atomic commits as ideas arise
git commit -m "fix: improve error message for missing geckodriver"
git commit -m "docs: add M1 Mac troubleshooting notes"# When accumulated enough user value:
echo "1.3.0" > VERSION
# Update CHANGELOG.md with user-focused entries
git add VERSION CHANGELOG.md
git commit -m "chore: bump version to 1.3.0 - email notifications
### Added
- Email notifications as Pushover alternative
- SMTP configuration with validation
New users can now use email if Pushover isn't available."# Good (user-focused):
### Added
- Email notifications as Pushover alternative
- Dry-run mode for testing changes safely
### Fixed
- Scraper crash when Duolingo has no recent sessions
- Setup script now works on M1 Macs
# Bad (implementation-focused):
### Added
- SMTP client class with TLS support
- --dry-run flag in ArgumentParser
### Fixed
- IndexError in session list processing
- Architecture detection in brew installation## [X.Y.Z] - YYYY-MM-DD
### 🎉 What's New
**[Feature Name]**: [Why users care]
- [Specific user benefit]
- [Another user benefit]
### 🐛 What's Fixed
**[Problem Area]**: [What was broken and why it matters]
### 🛠️ For Developers (optional)
- [Internal improvements worth noting]When suggesting commits and versions, follow this logic:
- Is this one logical change? → Good for atomic commit
- Does this change user-facing behavior? → Note for potential version bump
- Does this break existing functionality? → Requires immediate MAJOR version bump
- Is this work-in-progress? → Don't suggest version bump yet
- Check recent commits → Any user-facing changes since last version?
- Apply "Would I Update?" test → Is there enough value?
- Classify impact:
- Breaking changes → MAJOR
- New features → MINOR
- Bug fixes/improvements → PATCH
- If yes to step 2 → Suggest version bump with user-focused changelog
- Group by user impact → What problems does this solve?
- Lead with benefits → Why users should care
- Use plain language → Avoid technical jargon
- Include context → Help users understand when they'd want this
- Can I explain why users would want this version in one sentence?
- Does the changelog read like "user benefits" not "code changes"?
- Are breaking changes clearly highlighted with migration notes?
- Has the system been tested end-to-end recently?
- Uses conventional commit format (
feat:,fix:,docs:, etc.) - Describes the change, not the implementation
- Could be understood by someone who didn't write the code
- Is specific enough to be useful in git history
- Configuration file format changes
- API changes that break existing usage
- Removal of features or commands
- Changes that require user action to upgrade
- New notification backends
- New command-line options
- Enhanced functionality
- New configuration options (backward compatible)
- Bug fixes
- Documentation improvements
- Small usability enhancements
- Dependency updates (when user-visible)
# Recent commits:
- fix: better error message when geckodriver missing
- docs: add troubleshooting for M1 Macs
- feat: add --quiet flag for cron usage
# User impact: "Makes setup easier and debugging clearer"
# Version: PATCH (small improvements)# Recent commits:
- feat: add weekly progress summaries
- feat: implement streak tracking
- test: add streak calculation tests
# User impact: "New insights into learning patterns"
# Version: MINOR (new feature complete)# Recent commits:
- feat!: migrate from launchd to cron scheduling
- docs: add migration guide from 1.x
# User impact: "Cross-platform support but requires setup changes"
# Version: MAJOR (breaking change)- Make atomic commits with clear conventional commit messages
- Track user-facing changes as you work
- Suggest version bumps when accumulated changes pass "Would I Update?" test
- Write user-focused changelogs that explain benefits, not implementation
- Test thoroughly before version bumps
- Document breaking changes clearly with migration guidance
This approach maintains quality while staying flexible and user-focused.