docs/book/src/contributing/how-to.md
We accept code, docs, bug reports, and feedback from anyone willing to file them clearly. This page covers the mechanics — how to get a change in, what we look for in review, and what to expect after you open a PR.
See Communication for non-code contributions (reporting issues, feedback, getting help).
See RFC process for larger changes that need design discussion before implementation.
For anything larger than a typo fix:
AGENTS.md. The repo's root AGENTS.md is the canonical source of convention — risk tiers, PR discipline, anti-patterns, and review standards live there.master. Fork the repo and branch from there; there's no develop/integration branch to go through.fork → branch → commit → push → open PR → review → merge (squash)
The key checkpoints:
.github/pull_request_template.md. Fill it out. The summary, validation evidence, and compatibility sections are non-negotiable.ci.yml is the composite gate; all legs must pass.scope:providers, scope:channels, etc.) and risk (risk:low / risk:medium / risk:high) are auto-applied by path-labeler. Double-check they match your change; if not, flag in a comment.[blocking] / [suggestion] / [question] tiers. Address blockers; suggestions are optional; questions need an answer.cargo fmt clean (checked in CI)cargo clippy -D warnings clean (checked in CI)#[allow(dead_code)]; reserve underscore names for required but intentionally unused API, trait, or callback parameters.anyhow::Result at binary boundaries, typed errors in library crates. No unwrap() / expect() in production code paths — propagate with ? or document the invariant that makes panic impossible.zeroclaw-api, then implement in the right edge crate#[cfg(test)] mod tests {} at the bottom of the file or a sibling tests.rsmod tests)tests/ and crate-local unit tests — run via cargo nextest run --locked --workspace --exclude zeroclaw-desktopFor the full five-level taxonomy (unit / component / integration / system / live), shared mock infrastructure, and JSON trace fixture format, see Testing.
docs/book/src/**/*.md (this mdBook)///) changes update the API reference automatically on deploydocs/book/src/reference/cli.md, config.md) are generated — don't hand-edit. Run cargo mdbook refs and commit the outputcargo mdbook sync to refresh the .po filesConventional Commits:
feat(providers): add support for DeepSeek reasoning mode
fix(channels/matrix): prevent duplicate device sessions after verify
docs(getting-started): add YOLO-mode quick-start
refactor(runtime): split agent loop into steps
chore: bump tokio to 1.43
Co-authoring with AI is encouraged; add Co-Authored-By: trailers in commit messages where AI tools materially contributed. See FND-005 (Contribution Culture) for the full norm.
Title mirrors the squash commit:
feat(scope): short description
Body uses the PR template. The validation-evidence section is required — paste the output of cargo fmt --check, cargo clippy, cargo test, plus whatever manual verification you did. "It works on my machine" is not evidence.
Risk labels:
risk:low — rollback is a revert; no user action neededrisk:medium — users may need to update config / env / CLI usage; rollback plan requiredrisk:high — security-critical, schema changes, breaking behaviour. Rollback plan, feature flag, and observable failure symptoms requiredMerge strategy: squash-merge with the full commit history preserved in the body. See .claude/skills/squash-merge/SKILL.md for the exact format — TL;DR: PR title + (#number) as the subject, bullet list of original commits as the body.
Release: changes land on master; master does not auto-release. A maintainer bumps the version and tags vX.Y.Z when a release ships. You'll see your PR in the CHANGELOG.
| Area | Where to start |
|---|---|
| New channel | crates/zeroclaw-channels/ — copy an existing channel of similar shape |
| New provider | crates/zeroclaw-providers/ — compatible.rs covers most OpenAI-like ones |
| Docs | docs/book/src/ — anything marked outdated or missing |
| Translations | cargo fluent fill --locale <code> — see Maintainers → Docs & Translations |
| Hardware | crates/zeroclaw-hardware/ — new board support, new sensor drivers |
Don't be a jerk. Disagree on ideas; not people. Accept that maintainers will close things they don't want to own — usually with an explanation, occasionally without. If a close feels unjustified, ask; if the ask goes nowhere, move on.