This document describes the Verus proof tracking system for the elicitation project, which parallels the Kani verification tracking infrastructure.
The Verus tracking system provides:
- CSV-based tracking of verification results
- Resume capability to skip already-passed proofs
- Summary statistics for verification coverage
- Failed proof analysis to identify issues
- CLI commands and justfile recipes for easy execution
# Via justfile (recommended)
just verify-verus-list
# Via cargo directly
cargo run --features cli --release -- verus listOutput shows all 182 Verus proofs organized by module.
# Run all proofs with CSV tracking
just verify-verus-tracked
# Custom CSV file and timeout
just verify-verus-tracked verus_results.csv 900
# Resume (skip already-passed proofs)
just verify-verus-resume
# Custom CSV for resume
just verify-verus-resume verus_results.csv# Show summary statistics
just verify-verus-summary
# Show only failed proofs
just verify-verus-failed
# Custom CSV file
just verify-verus-summary my_results.csv
just verify-verus-failed my_results.csvThe tracking system is accessed via the CLI with the cli feature:
cargo run --features cli --release -- verus <subcommand>Lists all available Verus proofs grouped by module.
Example:
cargo run --features cli --release -- verus listRuns all Verus proofs and tracks results in CSV.
Options:
-o, --output <FILE>- CSV output file (default:verus_verification_results.csv)-t, --timeout <SECS>- Timeout per proof in seconds (default: 600)-r, --resume- Skip already-passed proofs from previous run--verus-path <PATH>- Path to Verus binary (overrides VERUS_PATH env var)
Examples:
# Basic run with defaults
cargo run --features cli --release -- verus run
# Custom output and timeout
cargo run --features cli --release -- verus run -o my_results.csv -t 900
# Resume previous run
cargo run --features cli --release -- verus run --resume
# Custom Verus binary path
cargo run --features cli --release -- verus run --verus-path ~/custom/verusShows summary statistics from a CSV results file.
Options:
-f, --file <FILE>- CSV file to analyze (default:verus_verification_results.csv)
Example:
cargo run --features cli --release -- verus summary --file my_results.csvOutput:
📊 Verus Verification Summary
============================
Total: 85
Passed: 82 ✅
Failed: 2 ❌
Errors: 1 🔥
Success Rate: 96.5%
Shows detailed information about failed proofs.
Options:
-f, --file <FILE>- CSV file to analyze (default:verus_verification_results.csv)
Example:
cargo run --features cli --release -- verus failedOutput:
❌ Failed Verus Proofs (2 total):
integers::verify_i128_range
Status: Failed
Time: 45s
Error: verification results:: 0 verified, 1 errors
floats::verify_f64_finite
Status: Timeout
Time: 600s
The justfile provides convenient recipes that wrap the CLI commands:
List all available Verus proofs.
Run all proofs with CSV tracking.
Parameters:
csv- CSV output file (default:verus_verification_results.csv)timeout- Timeout per proof in seconds (default: 600)
Example:
just verify-verus-tracked my_results.csv 900Resume verification, skipping already-passed proofs.
Parameters:
csv- CSV file to resume from (default:verus_verification_results.csv)
Example:
just verify-verus-resume my_results.csvShow summary statistics.
Parameters:
csv- CSV file to analyze (default:verus_verification_results.csv)
Example:
just verify-verus-summary my_results.csvShow failed proofs.
Parameters:
csv- CSV file to analyze (default:verus_verification_results.csv)
Example:
just verify-verus-failed my_results.csvThe tracking system uses CSV files with the following schema:
Module,Proof,Status,Time_Seconds,Timestamp,Error_Message
bools,verify_bool_true,SUCCESS,12,2026-02-21T18:30:45.123Z,
integers,verify_i128_range,FAILED,45,2026-02-21T18:31:30.456Z,"verification results:: 0 verified, 1 errors"- Module - Proof module name (e.g.,
bools,integers,floats) - Proof - Proof function name (e.g.,
verify_bool_true) - Status - Verification status:
SUCCESS- Proof verified successfullyFAILED- Proof failed verificationTIMEOUT- Verification timed outERROR- Error running verifier
- Time_Seconds - Elapsed time in seconds
- Timestamp - ISO 8601 timestamp
- Error_Message - Error details (empty for successful proofs)
The tracking system needs to know where the Verus binary is located. It checks in order:
--verus-pathcommand-line argumentVERUS_PATHenvironment variable- Default:
~/repos/verus/source/target-verus/release/verus
Setting via environment variable:
export VERUS_PATH=~/custom/verus/path/verus
just verify-verus-trackedSetting via .env file:
# .env
VERUS_PATH=~/repos/verus/source/target-verus/release/verusThe justfile recipes will automatically load from .env if present.
Default timeout is 600 seconds (10 minutes) per proof. Adjust based on your needs:
# Short timeout for quick checks
just verify-verus-tracked verus_results.csv 60
# Long timeout for complex proofs
just verify-verus-tracked verus_results.csv 1800Currently tracking 182 Verus proofs across these modules:
- bools (2 proofs) - Boolean contract verification
- chars (4 proofs) - Character validation contracts
- collections (21 proofs) - Vec, Option, Result, HashMap, etc.
- durations (1 proof) - Duration contracts
- floats (6 proofs) - f32/f64 finite, positive, non-negative
- integers (24 proofs) - Integer range and sign contracts
- mechanisms (5 proofs) - Elicitation mechanism contracts
- networks (9 proofs) - IP, UUID, PathBuf contracts
- strings (11 proofs) - String validation contracts
- regexes (1 proof, feature-gated) - Regex pattern contracts
- urls (4 proofs, feature-gated) - URL validation contracts
- external_types (25 proofs, feature-gated) - Chrono, time, jiff datetime
- primitives (13 proofs) - Primitive type invariants
- stdlib_collections (11 proofs) - Standard library collection contracts
- clap_types (26 proofs, feature-gated) - CLI argument parser types
- sqlx_types (32 proofs, feature-gated) - SQL database types
- egui_types (feature-gated) - egui widget type contracts
- ui_types (28 proofs, feature-gated) - Typestate UI, LayoutBuilder, renderer
# Run all proofs with tracking
just verify-verus-tracked
# View results
just verify-verus-summary
# Investigate failures
just verify-verus-failed# Make code changes...
# Resume verification (skips already-passed)
just verify-verus-resume
# Check if failures are fixed
just verify-verus-failed# Run with strict timeout
just verify-verus-tracked ci_results.csv 300
# Check for any failures
if just verify-verus-failed ci_results.csv | grep -q "Failed"; then
echo "❌ Verification failed"
exit 1
fi# Track timing for optimization
just verify-verus-tracked timing.csv
# Analyze slow proofs
cat timing.csv | sort -t, -k4 -rn | head -10The Verus tracking system mirrors the Kani tracking infrastructure:
| Feature | Kani | Verus |
|---|---|---|
| CSV tracking | ✅ | ✅ |
| Resume capability | ✅ | ✅ |
| Summary statistics | ✅ | ✅ |
| Failed test analysis | ✅ | ✅ |
| CLI interface | ✅ | ✅ |
| Justfile recipes | ✅ | ✅ |
| Timeout configuration | ✅ | ✅ |
| Progress display | ✅ | ✅ |
Key Differences:
- Kani uses harness-based proofs with
#[kani::proof]attributes - Verus uses module-level functions with SMT-based verification
- Kani timeout per harness, Verus timeout per proof module
- Kani verification is typically faster (seconds), Verus may take minutes
Problem:
❌ Verus not found at: ~/repos/verus/source/target-verus/release/verus
Set VERUS_PATH environment variable or use --verus-path
Solution:
- Verify Verus is installed:
verus --version - Set VERUS_PATH in
.envfile or environment - Or use
--verus-pathflag explicitly
Problem: Proofs timing out frequently
Solutions:
- Increase timeout:
just verify-verus-tracked results.csv 1800 - Run proofs individually to identify slow ones
- Check system resources (CPU, memory)
Problem: Resume mode re-runs passed proofs
Solution:
- Ensure CSV file exists and is readable
- Check CSV format matches expected schema
- Verify STATUS column contains "SUCCESS" for passed proofs
Problem: CLI commands fail to compile
Solution:
- Ensure
clifeature is enabled:cargo build --features cli - Update dependencies:
cargo update - Clean build:
cargo clean && cargo build --features cli
crates/elicitation/src/verification/verus_runner.rs- Main tracking implementationcrates/elicitation/src/cli.rs- CLI command definitions and handlersjustfile- Convenience recipescrates/elicitation/Cargo.toml- Feature and dependency configuration
The tracking system consists of:
VerusProof- Proof identifier (module + name)VerusProofResult- Result of running a single proofVerificationStatus- Success/Failed/Timeout/Error enumVerusSummary- Aggregated statisticsrun_verus_proof()- Execute single proofrun_all_proofs()- Execute all proofs with trackingsummarize_results()- Load and summarize CSVlist_failed_proofs()- Extract failed proofs from CSV
For each proof:
- Create temporary Rust source file importing the proof function
- Run Verus binary on the temp file
- Parse stdout/stderr for verification results
- Determine status (SUCCESS/FAILED/TIMEOUT/ERROR)
- Record result to CSV with timing
- Clean up temp file
- Display progress to user
Potential improvements:
- Parallel proof execution (with concurrency limit)
- Detailed error categorization (assertion, overflow, etc.)
- HTML report generation
- Diff comparison between runs
- Integration with CI/CD platforms
- Proof dependency analysis
- Automatic bisection for regressions
- Performance profiling per proof
- Kani Tracking Documentation
- Verus Guide
- Elicitation Verification Framework
- Verus Update Summary - Details on latest Verus version