Files
Oxide/docs/development.md
T
Homer Simpson 9eead719b0 Import Oxide engine (Stages 0–10) under MIT license
Full project snapshot migrated to new Gitea remote without history:
engine, editor, physics, script, examples, tests, docs, and assets.
Relicensed from GPLv3 to MIT and updated repo URLs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 20:41:02 +02:00

112 lines
4.5 KiB
Markdown

# Development Workflow
How work flows through the Oxide project: branches, testing gates, documentation,
and how a stage progresses from start to sign-off.
## Branch model
Oxide uses two long-lived branches:
| Branch | Meaning |
|--------|---------|
| `dev` | Integration branch. Everything that builds and passes automated tests lands here first. |
| `main` | Stable branch. Only contains work that has been verified — automatically *and*, where relevant, manually approved. |
### The flow
1. **Work lands on `dev`.** Any change that can be **fully verified by automated
means** (it builds, and its unit / integration / fuzz tests and benchmarks
pass) is committed and pushed to `dev` as soon as it is complete and green.
2. **Manual-test gate before `main`.** If a change *cannot* be fully verified
automatically — anything involving the GUI, rendering output, audio, input
feel, or otherwise "you have to actually run the engine and look at it" — it
stops at `dev`. The maintainer runs it, reviews the behavior, and reports
back. Only after explicit approval is that version promoted to `main`.
3. **Fully-automated changes can go straight to both.** When a change is
completely covered by automated tests (e.g. the math module — pure CPU logic
with full unit/fuzz/benchmark coverage), it may be pushed to `dev` and `main`
together, because the automated suite *is* the sign-off. No manual gate is
needed.
### Deciding which path a change takes
Ask: **"Can a test prove this works without a human looking at it?"**
- **Yes** → it can go to `main` as soon as tests pass (via `dev`).
- **No** (needs eyes/ears on a running engine) → push to `dev`, request manual
testing, wait for approval, then promote to `main`.
When in doubt, treat it as needing manual testing and leave it on `dev`.
### Promoting `dev` to `main`
```sh
git checkout main
git merge --ff-only dev # or a regular merge if histories diverged
git push origin main
git checkout dev
```
## Testing protocol
Every stage must pass all of the following before it is considered done (see also
[`PLAN.md`](../PLAN.md)):
1. **Unit tests** — every module has tests for core behavior and edge cases,
living in a `#[cfg(test)] mod tests` block beside the code.
2. **Integration tests** — the `oxide-tests` crate runs end-to-end and
cross-module scenarios, including fuzz/property tests where appropriate.
3. **Example review** — each stage ships at least one runnable example in
`oxide-examples`; both the maintainer and the implementer review it.
4. **Benchmarks** — performance-sensitive systems have `criterion` benchmarks;
regressions against a stage's stated budget block sign-off.
5. **Clippy + fmt**`cargo clippy --all-targets -- -D warnings` and
`cargo fmt --check` must be clean. Engine/editor crates use
`#![deny(warnings)]`.
Quick local gate before any commit:
```sh
cargo fmt --check && \
cargo clippy --all-targets -- -D warnings && \
cargo test
```
## Documentation policy
Documentation is written **as the work is done**, not after:
- Detailed docs live in [`docs/`](README.md), one topic per file. The top-level
`README.md` stays a short overview.
- A stage is not complete until its systems are documented in `docs/` — usage
(how to call it) **and** inner workings (how/why it works).
- When an API changes, update the affected doc and its code snippets in the
**same change**, so docs never drift from the code.
- Keep the maintained project files current whenever structure, goals, or
process change: `CLAUDE.md`, `PLAN.md`, `README.md`, `.gitignore`, and the
relevant files in `docs/`.
## Adding a new stage
1. Read [`PLAN.md`](../PLAN.md) for the stage's deliverables and test criteria.
2. Implement the system as one or more focused modules under `engine/src/`
(one concept per file, tests beside the code). Add editor support if the
stage calls for it.
3. Add at least one example under `examples/src/bin/`.
4. Write the stage's documentation under `docs/` and link it from
[`docs/README.md`](README.md).
5. Ensure the full testing protocol passes.
6. Update `PLAN.md` (mark the stage complete), `README.md` (status/features),
and — if installed binaries or assets changed — `install.sh`.
7. Land on `dev`; promote to `main` per the branch model above.
## Commit conventions
- Commit messages are written in the imperative mood and describe *what* and
*why*.
- Group related changes; keep a commit focused on one logical change where
practical.
- Co-authorship trailers are added when a commit is produced with AI assistance.