Skip to main content

Commit Notation

A commit notation that conveys risk level and intention in the first few characters of each commit message. Based on Arlo's Commit Notation v1, extended by Quatico.

Quick Reference

Risk Levels

Risk LevelCodeExampleMeaning
Known safelowercaserProvable correctness (tool-verified, type-checked)
ValidatedUPPERCASERTest-verified, all known risks addressed
Risky!!R!!Attempted but not fully verified
Broken**R**WIP, may not compile
tip

Lower case means lower risk!

Intentions

CodeNameUse
FFeatureAdd, change, or extend behavior
BBugfixRepair undesirable behavior
RRefactoringChange implementation, not behavior. Includes tool-assisted changes (IDE renames, formatters, linters).
DDocumentationChanges that communicate, no behavior impact. Includes comment-only changes and formal specifications.
TTest-onlyAlter tests without altering functionality
EEnvironmentDev setup, tooling, non-code changes
WIPUnknownMixed changes, just checking in

Commit Message Format

X: Summary in active voice

TICKET-123

Rules:

  • Prefix: Risk level + intention (e.g., F, r, B!!, R**)
  • Separator: : or nothing (e.g., F: Add feature or F Add feature)
  • Voice: Active ("Add feature") not progressive ("Adding feature")
  • Length: Subject line < 75 characters
  • Ticket: Last line, blank line before it, NO # prefix (git treats # as comment)

Ticket Numbers

Finding the ticket:

  1. Branch name: Look for XXX-123 pattern (e.g., feature/FOO-123-login)
  2. Recent commits: Check commits not yet merged to main branch
  3. Ask: Is this infrastructure (omit) or does it need a ticket number?

When to omit tickets — infrastructure changes may skip tickets:

  • CI/CD fixes
  • Dev environment setup
  • Release version bumps
  • Dependency updates
  • Code formatting

Quick Checklist

  • Intention identified (F/B/R/D/T/E/*)
  • Single intention per commit
  • Risk level assessed (lowercase/UPPER/!!/**)
  • Active voice summary
  • Subject < 75 chars
  • Ticket on last line (if applicable)

Risk Level Guidelines

Known Safe (lowercase)

Provable correctness through:

  • IDE refactoring with type verification
  • Compiler-verified transformations
  • Automated tool with known behavior

Validated (UPPERCASE)

Test-verified changes:

  • All tests pass after change
  • New behavior covered by tests
  • For features/bugfixes: change is ≤8 LoC

Risky (!!)

Attempted verification but gaps remain:

  • Tests exist but coverage incomplete
  • Manual review performed
  • Named refactoring without full test suite

Broken (**)

No verification:

  • WIP checkpoint
  • May not compile
  • Switching tasks, need to save state

Known Risks by Intention

IntentionKnown Risks
FeatureMay alter unrelated feature; may alter this feature unexpectedly; may differ from intended change
BugfixCustomers may depend on the bug; may alter unrelated feature; may differ from intended fix
RefactoringMay cause a bug; may fix a bug accidentally; may force a test update
DocumentationMay mislead future developers; may alter team processes unexpectedly

Core Intentions

Feature (f/F/F!!/F**)

Add, change, or extend one program behavior aspect without altering others.

CodeKnown Approaches
fExamples: Local/focused change validated in DEV (no env-specific behavior); Extensive E2E tests; Text-only changes (i18n) apparent from diff
FChange ≤8 LoC, fully unit tested, includes new/changed tests
F!!Partially tested
F**No automatic tests, or unfinished implementation

Bugfix (b/B/B!!/B**)

Repair one existing, undesirable program behavior without altering any others.

CodeKnown Approaches
bExamples: Local/focused change validated in DEV; E2E tests; Text-only changes; Extend/fix existing test
BReviewed with customer rep, ≤8 LoC, original behavior captured in test, includes changed test
B!!Partially tested
B**No automatic tests, or unfinished implementation

Refactoring (r/R/R!!/R**)

Change implementation without changing program behavior.

CodeKnown Approaches
rProvable refactoring OR test-supported procedural refactoring within test code
RTest-supported procedural refactoring
R!!Named refactoring, but edited code without full test coverage
R**Remodeled by editing code

Documentation (d/D/D!!/D**)

Change communicates to team members and does not impact program behavior.

CodeKnown Approaches
dDev-visible docs, not in source file, or verified byte-identical compilation
DDev-impacting only, changes compilation or process
D!!Alters an important process
D**Trying out a process change for info gathering

Extension Intentions

Test-only (t/T/T!!/T**)

Alter automated tests without altering functionality.

CodeKnown Approaches
tRefactoring purely within test code
TNew test for existing behavior, all tests pass
T!!New test without running full suite
T**Incomplete test, WIP

Alternatives: Use F or B depending on what the test validates. Use R for refactoring within test code.

Environment (e/E/E!!/E**)

Non-code changes that affect development setup and tooling.

CodeKnown Approaches
eConfig change with no compilation impact
ETooling change, verified working
E!!CI/CD change, not fully tested
E**Experimenting with build config

Unknown (WIP)

Multiple unrelated changes, just getting it checked in.

Alternative: Require each commit to have exactly one intention.

Benefits

For Code Reviews

  • Quick Risk Assessment: Reviewers can immediately see how risky a change is
  • Faster Approval: Low-risk commits (lowercase) can be approved quickly
  • Focus Attention: High-risk commits (!!, **) get extra scrutiny

For Release Management

  • Easy History Reading: Understand what changed in a release by scanning commit prefixes
  • Risk Tracking: Identify which commits might need extra testing

Provable Refactorings

A series of all-lowercase commits can be deployed without regression testing or lengthy PR discussions.

Methods of proof:

  • Automated refactoring via tool (knowing tool bugs)
  • Scripted manual refactoring, using the compiler to verify each step
  • Very highly tested code, with tests providing proof

Small Features and Bug Fixes

Features and bugfixes ≤8 LoC are lower risk because:

  1. Only possible when code is well-organized
  2. Easy to see possible side effects
  3. Easy to code review

Approach: Refactor until the change is easy, then add the feature one piece at a time with tests.

Examples

r Extract calculateTotal method

PROJ-1234
F: Add user authentication

PROJ-2345
B!! Fix null pointer in user service

PROJ-3456
D: Update API documentation

PROJ-4567

Retired Intentions

The following intentions appear in older commits but are no longer used. They were absorbed into existing intentions:

CodeNameWasNow use
AAutomatedTool-assisted changes (IDE renames, formatters, linters)R
CCommentComment-only changes (not JSDoc/JavaDoc)D
SSpecFormal specifications and design docsD

References