# Contributing

Contributions that improve reproducibility, frame/timestamp correctness,
failure handling, Gazebo compatibility, or developer documentation are welcome.

Before opening a pull request:

1. Keep the controller boundary intact: simulator truth, GPS/local position,
   LiDAR/SLAM, and optical-flow position must not enter the control process.
2. Add or update tests for coordinate, timing, state-machine, and keyboard input
   changes.
3. Run `./demo.sh --verify`. For flight-control changes, also run the smallest
   relevant gate and confirm the final state is `armed=false` with clean process
   and port shutdown.
4. Update `docs/ARCHITECTURE.md`, `docs/VALIDATION.md`, and
   `reports/status.json` only when the implementation or formal evidence changes.
5. Do not commit generated `runtime/`, `runs/`, logs, recordings, credentials,
   or host-specific absolute paths.

Please describe the problem, the control/safety impact, commands used for
validation, and any remaining limitation. Large new dependencies or a scope
change such as obstacle avoidance, global navigation, or real-aircraft support
should be proposed in an issue before implementation.
