What a mergeable PR looks like: the checklist, what reviewers expect, and how milestones and issues are organized.
Work through the contributing workflow first — branch naming, conventional commits, and the size guideline (≤ ~500 changed lines where feasible). Draft PRs are welcome early; open one as soon as you want CI feedback or design discussion.
Every PR:
- Builds and tests pass on all three OSes — the CI matrix (macOS, Linux, Windows) is the gate; no "fix Windows later" merges.
- C++ is formatted (
git clang-format; theformatCI job enforces it). - Tests are included with the change, following the testing doctrine.
When applicable:
- User-visible change (feature, behavior, CLI/API, packaging) → add a
one-line entry under
[Unreleased]inCHANGELOG.md, in the same PR, linked to its issue/PR. - Touched the OpenDRIVE parser/writer or added an xodr feature → fuzz
corpus in
core/tests/fuzz/corpus/extended (see Testing). - Changed the public kernel API →
python/src/bindings.cppupdated and at least one example inpython/examples/added or updated, same PR. - Added/updated a dependency → follow the
dependency policy, including its
THIRD_PARTY_LICENSES.mdrow in the same commit. - Added/updated a bundled asset → follow the
asset policy, including its
ASSETS_LICENSES.mdrow (CI runs the license check). - Touched geometry or parsing → ran the sanitizer build locally.
- Added a Qt item model → its
QAbstractItemModelTestertest ships in the same commit (see Testing).
PRs that change the editor UI or add interactive behavior (tools, panels, viewport interactions) must include screenshots or GIFs in the PR description. Reviewers should be able to judge the result without building the branch. Before/after pairs are ideal for visual changes.
Any PR touching mesh generation, materials, normals, or the renderer must include editor-rendered before/after screenshots in the PR description, and visual changes get maintainer approval before merge. Metric tests gate correctness; the maintainer gates appearance — the tee shipped with green metrics and a visibly wrong junction once, and this rule is why it will not happen again (see product parity — visual acceptance).
Capture screenshots with the editor's screenshot mode (works headless):
python scripts/editor_screenshot.py scene.xodr out.png --camera orbitCI's editor visual artifacts job renders the canonical scenes
(assets/samples/crossing.xodr, t_attach.xodr, overpass.xodr) and
uploads the PNGs on every run — link or embed them when they cover your
change.
Evidence lives in issues and PRs, never in the repo. Diagnostic renders,
.glb dumps, and before/after images are attached to the tracking issue or
the PR description; binary evidence directories are gitignored and must not
be committed.
- A Robomous maintainer reviews every PR; maintainer approval plus green CI are the merge requirements.
- CI is the objective gate — reviewers will not merge around a red job, and you should not ask them to.
- Review feedback focuses on correctness (geometric and standards correctness above all), the architecture boundaries, and test quality.
- Force-pushing to address review is fine; the merge to
mainis what matters.
- The public project board is the task manager for RoadMaker: every tracked issue lives on it, grouped by pillar and status. Start there to see what is in flight and what comes next.
- Work items are GitHub issues, grouped by the eight capability pillars of the roadmap (P1 Interaction & Navigation … P8 Scenarios). GitHub milestones mirror the pillars one-to-one and are pure progress trackers; there are no version milestones and no version labels — the roadmap has a single release at the end (release philosophy).
- Each pillar has an
epic-labeled issue listing its sprint issues; pillar work carries a matching label (pillar:P1…pillar:P8) and PRs reference their issue (Closes #N). Sprint issues are titledpN-sM: short descriptionand state their Scope, Acceptance (the golden-workflow steps they unblock), and what they supersede. - Found a bug or want a feature that isn't tracked? Open an issue first for anything non-trivial — it is the cheapest place to agree on an approach. New issues get triaged onto the board.
Squash or merge commits keep the conventional-commit style so the history
stays readable and releasable. Release packaging happens automatically on
v* tags — see CI.