Commit & PR Conventions
Commit Messages
Format:
<type>(<scope>): <description>
<body — explains WHY, not what>
Types: feat, fix, refactor, test, docs, perf, chore
Scope: the crate name in parens: feat(frontier):, fix(envelope):, refactor(storage):
Examples:
feat(frontier): add crawl resumption via frontier save/load
Enables stopping and restarting crawls without losing state.
The frontier serializes its complete state (host queues, seen set,
politeness timestamps) to JSON and restores it on load.
fix(fetch): strip script/style content before link extraction
Link extraction was producing junk URLs from minified JavaScript.
Stripping <script> and <style> tags before scanning eliminates
false positives without affecting real links.
Breaking changes: prefix the body with BREAKING:
Special requirements:
- Commits touching
fetch/artifact/replaymust include a replay fidelity test - Commits touching
frontier/envelopemust include a determinism test
Pull Requests
- One concern per PR. No bundled drive-bys.
- Must include tests exercising the invariant being changed
- Benchmark before/after for performance-sensitive paths
cargo clippy -- -D warningsandcargo testmust pass- New dependencies require justification in the PR description
Dependency Policy
Minimize external dependencies — every dep is attack surface.
Approved:
tokio— async runtimereqwest/hyper— HTTPserde+serde_json— serializationblake3— content hashingchrono— temporal typestracing— structured observability
Forbidden in core crates:
rand— useCrawlSeedfor all randomnessanyhow/eyre— use typedPalimpsestError
Process:
- Pin all versions in
Cargo.lock(committed) - Run
cargo auditbefore merging new deps - No build scripts that download or execute external code