with one click
new-invariant
Implement a new invariant for jolt-eval
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Implement a new invariant for jolt-eval
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Wrap a Rust function in a Jolt zero-knowledge proof
Autonomous one-shot implementation from an approved spec (local/cloud only)
Implement a new objective for jolt-eval
Deep code review of a pull request using parallel analysis agents (semantic consistency, bugs, tech debt, security). USE FOR: - Reviewing PRs for bugs, security issues, and code quality - Analyzing new abstractions for consistency and correctness - Identifying tech debt and architectural concerns - Posting review comments to specific lines on GitHub TRIGGERS: - "review PR", "code review", "review changes" - "diff review", "PR feedback", "check PR" - "analyze diff", "critique code", "review code" - "pull request review", "GitHub PR review"
Spec analysis with ambiguity scoring — interactive locally, single-pass remotely via label
Create a new spec through Socratic interview, filling each template section to zero ambiguity
| name | new-invariant |
| description | Implement a new invariant for jolt-eval |
| argument-hint | <invariant-name> |
This skill handles all the boilerplate: creating the invariant struct + input type, implementing the Invariant trait, registering it in the JoltInvariants enum, creating a fuzz target (if applicable), and running sync_targets.sh.
<Execution_Policy>
sumcheck_binding).{{ARGUMENTS}}: must be a valid Rust identifier (lowercase alphanumeric + underscores). Reject otherwise.description())Test, Fuzz, RedTeam)Setup = ())jolt-eval/src/invariant/mod.rs to understand the current JoltInvariants enum and dispatch! macro.jolt-eval/src/invariant/split_eq_bind.rsjolt-eval/src/invariant/soundness.rsCreate the invariant file at jolt-eval/src/invariant/<invariant_name>.rs with:
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct <Name>Input {
// fields
}
impl<'a> Arbitrary<'a> for <Name>Input {
fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result<Self> {
// Generate random inputs with reasonable bounds
}
}
Key requirements for the input type:
Debug, Clone, Serialize, Deserialize, JsonSchemaArbitrary manually (for fuzzing)Arbitrary impl (e.g. u.int_in_range(2..=16)?) to keep inputs meaningful#[jolt_eval_macros::invariant(Test, Fuzz, RedTeam)] // adjust targets as needed
#[derive(Default)]
pub struct <Name>Invariant;
impl Invariant for <Name>Invariant {
type Setup = (); // or a custom setup type
type Input = <Name>Input;
fn name(&self) -> &str { "<invariant_name>" }
fn description(&self) -> String { "...".into() }
fn setup(&self) -> Self::Setup { /* ... */ }
fn check(&self, setup: &Self::Setup, input: Self::Input) -> Result<(), CheckError> {
// 1. Validate input — return Err(CheckError::InvalidInput(...)) for degenerate cases
// 2. Run the property check
// 3. Return Ok(()) if the invariant holds
// 4. Return Err(CheckError::Violation(...)) if violated
}
fn seed_corpus(&self) -> Vec<Self::Input> {
// Include: minimal case, typical case, edge case (large values, boundary conditions)
}
}
check()CheckError::InvalidInput for degenerate inputs that should be skipped (not counted as violations)CheckError::Violation(InvariantViolation::with_details(...)) for actual violations — include diagnostic infoEdit jolt-eval/src/invariant/mod.rs:
pub mod <invariant_name>; to the module declarations at the top.JoltInvariants:
<VariantName>(<invariant_name>::<Name>Invariant),
JoltInvariants::all():
Self::<VariantName>(<invariant_name>::<Name>Invariant),
Use <Name>Invariant::default() if the struct has fields.dispatch! macro:
JoltInvariants::<VariantName>($inv) => $body,
Create jolt-eval/fuzz/fuzz_targets/<invariant_name>.rs:
#![no_main]
use jolt_eval::invariant::<invariant_name>::<Name>Invariant;
jolt_eval::fuzz_invariant!(<Name>Invariant::default());
Then run ./jolt-eval/sync_targets.sh to update fuzz/Cargo.toml.
Run these commands (all must pass):
# Format
cargo fmt -q
# Lint
cargo clippy -p jolt-eval -q --all-targets -- -D warnings
# Run auto-generated tests (seed_corpus + random_inputs)
cargo nextest run -p jolt-eval --cargo-quiet invariant::<invariant_name>
# If fuzz target was created, verify it compiles
cd jolt-eval/fuzz && cargo check 2>&1 | head -20
If any step fails, fix the issue and re-run.
User: "/new-invariant sumcheck_eval_consistency" Action: Asks what property is being checked, creates the invariant file with proper Input type, registers it, creates fuzz target, runs tests. Why good: Follows the full pipeline, tests pass before reporting success. User: "/new-invariant sumcheck_eval_consistency" Action: Creates the invariant file but forgets to add the variant to the `dispatch!` macro. Why bad: Code won't compile — the dispatch macro must match all enum variants. User: "/new-invariant my-invariant" Action: Accepts the name with a hyphen. Why bad: Rust identifiers use underscores, not hyphens. Should reject and suggest `my_invariant`.Task: Implement a new invariant for jolt-eval. {{ARGUMENTS}}