Contributing Guide
Thank you for your interest in contributing to FIXS! Follow this guide to ensure your contributions are properly tracked and merged.
Branch Strategy
main— stable release branch; never commit directlydev— integration branch; all PRs target hereFeature/fix branches — branch off
dev, named<type>/<issue_number>_<short_desc>
main ←── (release PR) ←── dev ←── maintenance/128_unify_fixs_branding
←── bug/84_python_xil_client
←── feature/70_libsumo_direct_launch
Branch name types: feature/, bug/, maintenance/, docs/
Step 1: Fork and Clone
git clone https://github.com/<your-username>/FIXS.git
cd FIXS
Then initialize the checkout. This replaces the manual git submodule update --init step and also acquires the native dependencies, which are not in git:
powershell -ExecutionPolicy Bypass -File scripts\initialize_fixs.ps1
ProprietaryFiles is a private submodule — external contributors have no access, and that is expected. The script reports it as skipped and the public core still builds. See BUILD.md — First-Run Setup.
Step 2: Create a Branch off dev
git fetch origin
git checkout -b maintenance/NNN_short_desc origin/dev
Always include the GitHub issue number in the branch name.
Step 3: Make Changes and Test
Run Python unit tests (no simulator required):
python -m pytest tests/Python/unit/ -v python -m pytest tests/Python/test_repo_hygiene.py tests/Python/test_naming_consistency.py tests/Python/test_build_system.py -v
Add a test case if your change is testable without simulators
Building the documentation locally
The published docs are built by ReadTheDocs on Linux (.readthedocs.yml). To preview
them yourself:
python -m venv .docvenv
.docvenv/bin/pip install -r doc/requirements_doc.txt # Scripts\pip on Windows
.docvenv/bin/python -m sphinx -b html doc doc/_build/html
On Windows this segfaults, usually part-way through writing output..., sometimes
surfacing first as a nonsense TypeError from inside Sphinx or markdown-it. The cause is
stack exhaustion: docutils recurses deeply per document and Windows gives the main thread
far less stack than Linux does, so the whole doc set no longer fits. It is not a problem
with any individual page, and it does not affect the ReadTheDocs build.
Build on a thread with a larger stack instead:
# build_docs.py
import sys, threading
from sphinx.cmd.build import main
threading.stack_size(64 * 1024 * 1024)
sys.setrecursionlimit(20000)
t = threading.Thread(target=lambda: sys.exit(main(["-b", "html", "doc", "doc/_build/html"])))
t.start(); t.join()
Step 4: Commit and Open a PR
PR title format: #<issue_number>/<short_description>
Example: #130/python commonlib package structure and unit tests
PR must target the dev branch, not main. Fill in all sections of the PR template.
ProprietaryFiles Submodule
ProprietaryFiles is a private submodule containing CarMaker/VISSIM/dSPACE integration
code (proprietary commercial software APIs). It lives at
ORNL-Real-Sim/ProprietaryFiles
(private — accessible to ORNL team members only).
Why it’s structured this way: The public FIXS repo stores only a commit hash pointer to the private submodule. Public contributors cannot see the proprietary contents, but can still build and use the open-source parts of FIXS without them.
If you are an ORNL team member modifying ProprietaryFiles
Goal: every merged FIXS commit must point to a ProprietaryFiles/main commit, so anyone cloning FIXS gets a stable PF state. The two PRs are reviewed in parallel but merged back-to-back: PF first, then FIXS.
# Step 1: Create a matching branch in the private submodule
cd ProprietaryFiles
git checkout -b maintenance/NNN_short_desc
# ... make changes, commit ...
git push origin maintenance/NNN_short_desc
# Step 2: Stage the updated submodule pointer in FIXS (points at your PF branch tip)
cd ..
git add ProprietaryFiles
git commit -m "chore: bump ProprietaryFiles to maintenance/NNN"
git push origin maintenance/NNN_short_desc
# Step 3: Open BOTH PRs at the same time, cross-referencing each other:
# - ProprietaryFiles PR → PF/main
# - FIXS PR → dev
# Step 4: When both PRs are approved, merge PF first, then re-point FIXS to PF/main:
cd ProprietaryFiles && git fetch origin && git checkout main && git pull
cd ..
git add ProprietaryFiles
git commit -m "chore: bump ProprietaryFiles pointer to merged main"
git push
# Then merge the FIXS PR.
Rules:
Never push directly to
ProprietaryFiles/main— branch-protected (requires PR + review)The ProprietaryFiles branch name must mirror the FIXS issue branch name
Reference the companion PR in each PR’s description so reviewers can find it
Step 4 re-point is mandatory: do not merge a FIXS PR while its submodule pointer is at a PF feature-branch tip
If the FIXS PR is rejected after the PF PR is merged, open a revert PR in PF — don’t leave orphan code on PF/main
If you are an external contributor
You do not need access to ProprietaryFiles to contribute to the open-source parts of FIXS
(SUMO integration, Python helpers, build system, tests, documentation). Simply ignore the
ProprietaryFiles/ directory — it will show as an inaccessible submodule on your clone.
PR Checklist
[ ] Branch is based on
dev(notmain)[ ] PR title follows
#NNN/short_descriptionformat[ ] All template sections filled in
[ ] Python unit tests pass locally
[ ] If ProprietaryFiles was modified: companion PR opened, PF merged first, submodule pointer re-pointed to PF/main HEAD before merging FIXS
[ ] Relevant GitHub issue is linked in PR body