Skip to content

Git Workflow

Branch typeConventionMR target
feature/*New featuresdevelop
fix/*Bug fixesdevelop
hotfix/*Urgent production fixesmain + develop
release/*Pre-release stabilizationmain + develop

Additional branch prefixes: docs/, refactor/, chore/, test/, perf/ — all target develop.

Branch typeDefault targetException
feature/*developOnly if explicitly requested to target main
fix/*developOnly if explicitly requested to target main
hotfix/*main + developAlways both
release/*main + developAlways both

Never target main for a feature/* or fix/* branch unless explicitly requested. When in doubt, ask before creating the MR.

All commits use Conventional Commits in English:

feat(vault): add Transit AES-256 encryption
fix(persistence): handle audit interceptor on detached entities
docs(guide): create coding conventions guide
chore(ci): update GitHub Actions pipeline
refactor(notifications): extract channel dispatcher
test(security): add JWT rotation tests
perf(caching): reduce Redis roundtrips for hybrid cache
TypeWhen to use
featNew feature or capability
fixBug fix
docsDocumentation changes only
choreBuild, CI, tooling, dependencies
refactorCode change that neither fixes a bug nor adds a feature
testAdding or updating tests
perfPerformance improvement

The scope in parentheses identifies the affected package or area:

  • Package name without the Granit. prefix: (vault), (persistence), (notifications)
  • Cross-cutting scopes: (ci), (build), (deps)
  • Omit the scope for changes that span many packages

Add ! after the type/scope and a BREAKING CHANGE: footer:

feat(querying)!: change filter syntax from bracket to dot notation
BREAKING CHANGE: filter parameters now use `filter.field.operator=value`
instead of `filter[field][operator]=value`. Update all API clients.

When adding, removing, or upgrading a dependency:

  1. Update THIRD-PARTY-NOTICES.md with the package name, version, license (SPDX), and copyright holder
  2. Update the summary table if license counts changed
  3. Update the Last updated date
  4. Flag any non-permissive license (GPL, AGPL, SSPL) for legal review

Never add or update a dependency without modifying THIRD-PARTY-NOTICES.md.

A maintainer will review your MR against this checklist:

  • No hardcoded secrets
  • Tests pass (dotnet test)
  • Build succeeds (dotnet build)
  • Format verified (dotnet format --verify-no-changes)
  • No PII in logs
  • THIRD-PARTY-NOTICES.md updated if dependencies changed
  • Documentation updated if applicable
  • Semantic tags on main: vMAJOR.MINOR.PATCH
  • release/* branches for stabilization before the tag
  • 1 approval minimum for merging to main
ChangeVersion bumpExample
Breaking API changeMAJORv2.0.0
New feature, backward compatibleMINORv1.3.0
Bug fix, backward compatiblePATCHv1.3.1
ContentLanguage
Code (identifiers, XML docs, comments)English
Commits (Conventional Commits)English
Documentation (docs/**/*.md)English
GitHub issues (title, description)French
Localization files (Localization/**/*.json)17 cultures

Code must never contain French diacritics. French diacritics (é, è, ê, à, â, ù, û, ô, î, ï, ç, œ) are required in French-language content (issues).