Trim duplication and align headings in rust skill
Drops the quick-reference table that restated the justfile, removes
prose that duplicated SKILL.md cross-cutting principles in
scaffolding.md, points to coverage.md for grcov exclusion markers,
unpins fs-err in style.md to match the unpinned-deps policy, and
sentence-cases coverage.md headings.
Assisted-by: Claude Opus 4.7 (1M context) via Claude Code
diff --git a/ai/skills/rust/coverage.md b/ai/skills/rust/coverage.md
index e1e9dba2..301b225c 100644
--- a/ai/skills/rust/coverage.md
+++ b/ai/skills/rust/coverage.md
@@ -2,7 +2,7 @@
LLVM source-based coverage via `cargo-llvm-cov`, which wraps rustc's `-C instrument-coverage` flag.
-## How It Works
+## How it works
1. **Compile** with `-C instrument-coverage` — rustc inserts counters at coverage-relevant spans.
2. **Run** the instrumented binary — writes `.profraw` files.
@@ -18,7 +18,7 @@ rustup component add llvm-tools # ships llvm-profdata + llvm-cov
cargo install cargo-llvm-cov # convenience wrapper
```
-## Quick Reference
+## Quick reference
| Goal | Command |
|------|---------|
@@ -59,7 +59,7 @@ cargo llvm-cov --workspace --exclude some-crate
cargo llvm-cov --workspace --exclude-from-report some-crate
```
-## Reading the Text Report
+## Reading the text report
```bash
cargo llvm-cov --text
@@ -75,7 +75,7 @@ Output shows each source line with execution count:
Lines with `0` count are uncovered. Lines with no count are non-executable (declarations, imports, comments).
-## Show Missing Lines
+## Show missing lines
```bash
cargo llvm-cov --show-missing-lines
@@ -188,7 +188,7 @@ grcov . --binary-path ./target/debug/ -s . -t lcov \
| Mixed language project (Rust + C) | `grcov` — handles `.gcda` + `.profraw` together |
| Doctests coverage | `cargo-llvm-cov` — `--doctests` flag (nightly) |
-## Manual Workflow (Without cargo-llvm-cov or grcov)
+## Manual workflow (without cargo-llvm-cov or grcov)
For environments where neither wrapper is available:
@@ -221,7 +221,7 @@ llvm-cov export "$BINARY" \
Use `rustfilt` as demangler for readable Rust symbol names (`cargo install rustfilt`).
-## Common Pitfalls
+## Common pitfalls
**Multiple binaries**: `llvm-cov` needs all instrumented binaries passed via `-object`. `cargo-llvm-cov` handles this automatically. Manually, you must pass each binary:
diff --git a/ai/skills/rust/scaffolding.md b/ai/skills/rust/scaffolding.md
index d4885b63..44ab610f 100644
--- a/ai/skills/rust/scaffolding.md
+++ b/ai/skills/rust/scaffolding.md
@@ -63,25 +63,20 @@ tempfile = "*"
Project-type-specific deps (`clap` for CLIs, `axum` for servers) go in
`binary.md` / `server.md` and are added on top of this baseline.
-Key choices:
+Notes on this template:
-- `edition = "2024"` — latest stable edition.
-- Unpinned dependencies (`"*"`) — `Cargo.lock` is committed (it's a
- binary), so builds are reproducible. Unpinned versions mean
- `cargo update` gets the latest compatible releases without editing
- `Cargo.toml`.
- `miette` with the `fancy` feature — pretty diagnostic rendering for
- binaries; the library still derives `miette::Diagnostic` even when
- the consumer is not the binary (e.g., when running tests).
-- `thiserror` — structured errors in the library.
-- `fs-err` — `std::fs` with paths in error messages (→ `style.md`).
+ binaries; the library still derives `miette::Diagnostic` so error
+ detail survives through tests and library consumers.
- `hegeltest` — property-based testing built on the Hypothesis engine,
with built-in shrinking.
+Cross-cutting choices (edition, lock file, fs-err, tracing, tokio
+features) are explained in `SKILL.md`.
+
## Error pattern
-Library errors derive both `thiserror::Error` and `miette::Diagnostic`.
-The binary returns `miette::Result<()>`.
+Template (rationale in `SKILL.md`):
```rust
// src/error.rs
@@ -102,10 +97,6 @@ pub enum MyError {
}
```
-The diagnostic codes and help text live on the variant itself, so
-errors carry their own labels and source spans through tests, other
-binaries, and HTTP handlers.
-
## justfile
```just
@@ -180,10 +171,8 @@ Key design:
--ignore 'src/bin/**'`. Binary code is tested via integration tests
but not measured.
- `covdir` output — machine-readable JSON, parsed with `jq` for a
- clean summary.
-- Exclusion markers — `cov-excl-line`, `cov-excl-start`/
- `cov-excl-stop` for structurally unreachable code. The
- `unreachable!` macro is also excluded by default.
+ clean summary. Exclusion markers (`cov-excl-line`, etc.) are
+ documented in `coverage.md`.
- `mutants` tolerates exit code 3 — `cargo mutants` returns 3 for
timeouts (infinite loops caused by mutations). These count as
caught because the mutant broke the program.
@@ -250,15 +239,3 @@ cargo install grcov cargo-mutants just
hegeltest also requires [`uv`](https://docs.astral.sh/uv/) on `PATH`
— it manages the Hypothesis engine automatically.
-
-## Quick reference
-
-| Task | Command |
-|------|---------|
-| Format | `just fmt` |
-| Lint | `just clippy` |
-| Coverage | `just coverage` |
-| Mutation testing | `just mutants` |
-| All checks | `just all` |
-| Install from source | `just install` |
-| Find uncovered lines | Change `-t covdir` to `-t markdown` in justfile |
diff --git a/ai/skills/rust/style.md b/ai/skills/rust/style.md
index 3207cf80..a284a4d9 100644
--- a/ai/skills/rust/style.md
+++ b/ai/skills/rust/style.md
@@ -262,11 +262,11 @@ use fs_err as fs;
let contents = fs::read_to_string("config.toml")?;
```
-For async code, use `fs-err`'s tokio feature:
+For async code, enable the tokio feature:
```toml
[dependencies]
-fs-err = { version = "3", features = ["tokio"] }
+fs-err = { version = "*", features = ["tokio"] }
```
```rust