.continue/rules/rig-quality.md
name: Rig Quality Gates globs:
Use these quality gates for all Rig contributions.
Use full where clause syntax for readability:
// Correct
impl<T> CompletionModel for MyModel<T>
where
T: HttpClientExt + Clone + WasmCompatSend + Debug + Default + 'static,
{
// ...
}
// Avoid inline bounds for complex signatures
impl<T: HttpClientExt + Clone + WasmCompatSend + Debug + Default + 'static> CompletionModel for MyModel<T> {
// ...
}
DO NOT use String as an error type. Define proper error enums:
// Correct
#[derive(Debug, thiserror::Error)]
pub enum MyError {
#[error("Failed to parse response: {0}")]
ParseError(#[from] serde_json::Error),
#[error("Provider returned error: {0}")]
ProviderError(String),
}
// Absolutely forbidden
fn do_thing() -> Result<(), String> // NO
DO NOT stub out error handling:
// Forbidden
let result = fallible_operation().unwrap(); // NO
let result = fallible_operation().expect("this should work"); // NO unless truly impossible
// Correct
let result = fallible_operation()?;
let result = fallible_operation().map_err(MyError::from)?;
Comments explain WHY, not WHAT.
If you need to explain what code is doing, the code itself is unclear. Rename variables, extract functions, or restructure.
// Bad - explains what
// Increment counter by one
counter += 1;
// Bad - explains what
// Check if user is admin
if user.role == Role::Admin {
// Good - explains why
// Rate limiting resets at midnight UTC, so we need the day boundary
let boundary = timestamp.truncate_to_day();
// Good - explains non-obvious business logic
// Providers may return tool calls split across multiple chunks,
// so we accumulate them by index until the stream ends
///) to all public items//!) to modulesTODO items are not allowed in submitted code.
If you need a TODO, the implementation is incomplete. Either:
// Forbidden
fn process() {
// TODO: handle edge case
}
// Forbidden
fn process() {
unimplemented!("will add later")
}
Run these commands and fix all issues before submitting:
cargo fmt
cargo clippy --all-targets --all-features
cargo test
If you cannot run these commands (e.g., environment limitations), explicitly ask the user to run them before the PR is submitted.
If your change involves:
Discuss with the user first. Do not implement major architectural changes without explicit approval. Open an issue for discussion if needed.
Before considering code complete:
.unwrap() or .expect() on fallible operations unless truly impossible)String error typesWasmCompatSend/WasmCompatSync instead of Send/Synccargo fmt passescargo clippy --all-targets --all-features passescargo test passesDO NOT MAKE COMMITS UNLESS THE USER HAS ASKED YOU TO DO SO. Users should be able to manually verify that what you have done has worked before proceeding with a commit, and may also want to write their own commit messages.
If the PR contains breaking changes, the PR message must list the public API items that have broken and the migration path for each.
PRs will be rejected if they contain:
String error types, .unwrap() everywhere, incomplete handlingSend/Sync instead of WasmCompat* variantsRemember: The quality bar exists because Rig is used in production by many projects. Every contribution must maintain that standard.