Conventions — Branches, Issues & Commits¶
Applies to: all Auraxis repositories (auraxis-api, auraxis-api-v2, auraxis-web, auraxis-app, auraxis-platform)
Status: Active since 2026-05-12
Issue Naming — Mandatory Prefixes¶
Every GitHub issue title must start with a prefix that identifies the target repository/domain:
| Prefix | Target | Example |
|---|---|---|
[API] |
auraxis-api-v2 (FastAPI v2) | [API] JWT login — register, login, refresh |
[BACKEND] |
auraxis-api (Flask v1) | [BACKEND] Add GoalContribution model |
[WEB] |
auraxis-web (Nuxt 4) | [WEB] AI Insights dashboard card |
[APP] |
auraxis-app (React Native) | [APP] Spending history screen |
[INFRA] |
Infrastructure / AWS | [INFRA] Add v2 container to EC2 |
[DEVOPS] |
CI/CD, tooling, pipelines | [DEVOPS] Configure GHCR image push |
[PLATFORM] |
auraxis-platform (governance) | [PLATFORM] Add auraxis-api-v2 submodule |
Rule: No issue without a prefix. This enables filtering on the Projects board by repo/domain.
Branch Naming — Conventional Branching¶
Format: {type}/{issue-number}-{short-slug}
The issue number is mandatory in the branch name — no issue, no branch.
| Type | When to use |
|---|---|
feat |
New feature or capability |
fix |
Bug fix |
refactor |
Code refactoring without behavior change |
chore |
Dependencies, tooling, CI, config |
docs |
Documentation only (ADRs, wiki, steering) |
test |
Test-only changes |
perf |
Performance improvement |
security |
Security patch |
Examples:
feat/12-auth-jwt-login
fix/34-transaction-category-filter
chore/5-foundation-jwt-docker-setup
docs/7-adr-decisions-wiki
refactor/45-goal-repository-async
infra/89-add-v2-nginx-config
Commits — Conventional Commits (no exceptions)¶
Format: {type}({scope}): {imperative description}
Max 72 characters. Imperative mood ("add", "fix", "refactor" — not "added" or "adds").
Types: feat, fix, refactor, chore, docs, test, perf, security, style, ci
Examples:
feat(auth): implement JWT login with refresh token rotation
fix(transactions): correct amount calculation for installment splits
refactor(goals): extract projection into GoalProjectionService
chore(deps): bump fastapi to 0.115.5
docs(adr): document JWT v1/v2 compatibility decision
test(auth): add edge cases for expired token rejection
ci(deploy): add health check step after container restart
Breaking change: append ! after type and explain in body:
feat(auth)!: change token format to include jti and nbf
BREAKING CHANGE: clients must re-login after this deployment.
Existing sessions are invalidated.
Pull Requests¶
- Every PR comes from a feature branch (see above)
- PR body must contain
Closes #N(orFixes #N) referencing the issue - Without
Closes #N, the board card won't auto-close on merge - Title follows the same conventional commits format as the squash commit
- CI must be green before merge
GitHub Projects — Card Lifecycle¶
- Issue created → synced to board automatically via
sync_repo_issues_to_project.py - Work started → move card to
In Progress - PR opened → card stays
In Progress - PR merged → card auto-moves to
DoneviaCloses #N - If card doesn't auto-close → update manually via
gh api graphql(see scripts)
Why These Conventions Matter¶
- Prefix on issues: filters on Projects board instantly show work by domain
- Issue number in branch:
git log --onelinemakes traceability obvious; GitHub auto-links branches to issues - Conventional commits:
git log --onelineis readable; enables automatic changelog generation in the future; makesgit bisecteasier Closes #Nin PRs: closes the issue AND moves the board card in one step — no manual cleanup needed