This repo uses a simple two-tier branching model. Each team has a stage branch that collects work before it merges into main.
main ← protected, release-ready
├── embedded-software/stage ← protected, team integration
│ ├── embedded-software/feat/sd-log-compression
│ └── embedded-software/bug/spi-timeout
├── controls/stage ← protected
│ └── controls/feat/thrust-curve-model
├── electrical-hardware/stage ← protected
│ └── electrical-hardware/feat/power-board-v2
└── mechanical-hardware/stage ← protected
└── mechanical-hardware/feat/fin-redesign
| Branch | Merges into | Who can approve |
|---|---|---|
main |
— | Own team lead (via CODEOWNERS) |
*/stage |
main |
Any team member |
PRs from */stage into main require approval from the team's lead(s). This is enforced by GitHub Rulesets + CODEOWNERS.
| Team | Stage Branch | Lead(s) |
|---|---|---|
| Embedded Software | embedded-software/stage |
@benedikthoward, @Shengw3n |
| Controls | controls/stage |
@p14n0f0rt3 |
| Electrical Hardware | electrical-hardware/stage |
@ShadabMizan |
| Mechanical Hardware | mechanical-hardware/stage |
@Joshxck |
When leads change, update this table and the corresponding GitHub Ruleset (Settings → Rules → Rulesets).
mainis always release-ready. Only*/stagebranches merge intomainvia PR, with lead approval.*/stagebranches are team integration branches. Feature and bug branches PR into their team'sstagebranch. Any team member can approve.- Feature and bug branches are where day-to-day work happens. They are not protected and can be freely created and deleted.
Work branches follow the pattern:
<team>/<type>/<short-description>
| Type | Use for |
|---|---|
feat/ |
New features or enhancements |
bug/ |
Bug fixes |
refactor/ |
Code restructuring without behavior change |
test/ |
Adding or updating tests |
Examples:
embedded-software/feat/imu-calibrationembedded-software/bug/uart-overruncontrols/feat/simulink-modelelectrical-hardware/feat/imu-breakout-v3mechanical-hardware/feat/nose-cone-v2
- Create a feature/bug branch off your team's
stagebranch - Do your work, commit with clear messages
- Push and open a PR targeting your team's
stagebranch - Get review from at least one team member
- Squash-merge or merge into
stage - When
stageis tested and ready, a team lead opens a PR fromstage→main
- All CI checks must pass
- At least one approving review
- Branch must be up to date with the target branch
- No unresolved review comments
Use short, descriptive commit messages:
<type>: <short summary>
<optional body>
Types: feat, fix, refactor, test, docs, ci, chore
Examples:
feat: add barometer altitude fusion to EKFfix: prevent SPI queue overflow on high-rate IMUdocs: update SPI DMA overview with timing diagramci: add state_estimation tests to firmware workflow
See the top-level README.md for build prerequisites and instructions.
# State estimation
cd embedded-software/firmware/libs/state_estimation/tests
cmake -B build && cmake --build build && ctest --test-dir build
# Controls
cd embedded-software/firmware/libs/controls/tests
cmake -B build && cmake --build build && ctest --test-dir build- C code: follow existing style in the file you're editing
- Snake case for file names, function names, and variables
- Prefix library headers with their directory (e.g.
#include "state_estimation/ekf.h")