Automatically extract abstract finite-state models in SMV/NuSMV format from source code (C/C++, Java, Python) for formal model checking. Use when users need to: (1) Generate SMV models from program code for verification, (2) Extract state-transition models from protocol implementations, (3) Analyze control flow and data flow to construct formal models, (4) Create models for checking safety and liveness properties, (5) Convert imperative code to declarative state machines. Particularly effective for protocol implementations, concurrent systems, and control logic with clear state transitions.
npx skills add https://github.com/ArabelaTso/Skills-4-SE --skill smv-model-extractor
Automatically extract abstract finite-state models from source code for formal verification with NuSMV model checker.
This skill transforms imperative programs (C/C++, Java, Python) into declarative SMV models suitable for model checking. It analyzes control flow, data flow, and program variables to construct states and transitions, applying appropriate abstraction to make models tractable while preserving properties of interest.
Read and understand the program structure:
# For single file
python3 scripts/extract_model.py program.c -o model.smv
# For multiple files
python3 scripts/extract_model.py file1.c file2.c file3.java -o model.smv
# For entire directory
python3 scripts/extract_model.py src/*.py -o model.smv
The extractor automatically:
The skill uses medium abstraction by default (balanced approach):
Data abstraction:
Control abstraction:
Abstraction levels:
# Low abstraction (more detail, larger state space)
python3 scripts/extract_model.py program.c -o model.smv --abstraction low
# Medium abstraction (recommended, balanced)
python3 scripts/extract_model.py program.c -o model.smv --abstraction medium
# High abstraction (minimal states, protocol phases only)
python3 scripts/extract_model.py program.c -o model.smv --abstraction high
The extractor produces:
Example output structure:
-- SMV Model automatically extracted from source code
MODULE main
VAR
pc : {s0, s1, s2, s3}; -- program counter
flag : boolean;
count : 0..3;
ASSIGN
init(pc) := s0;
init(flag) := FALSE;
init(count) := 0;
next(pc) := case
pc = s0 & !flag : s1;
pc = s1 : s2;
pc = s2 & count < 3 : s3;
pc = s3 : s0;
TRUE : pc;
esac;
next(count) := case
pc = s2 & count < 3 : count + 1;
TRUE : count;
esac;
After model generation, add temporal logic specifications to verify:
Safety properties (things that should never happen):
-- No buffer overflow
SPEC AG (count <= 3)
-- Mutual exclusion
SPEC AG !(process1_critical & process2_critical)
Liveness properties (things that should eventually happen):
-- Eventually reach goal state
SPEC AF (pc = s3)
-- Request eventually granted
SPEC AG (request -> AF grant)
See smv_syntax.md for complete SMV syntax reference.
Verify the model with NuSMV:
# Check all specifications
NuSMV model.smv
# Interactive mode
NuSMV -int model.smv
# Generate counterexample if property fails
NuSMV -dcx model.smv
Scenario: User has implemented a network protocol and wants to verify correctness.
Approach:
See: extraction_patterns.md for detailed protocol patterns.
Scenario: Multi-threaded program with shared resources.
Approach:
See: extraction_patterns.md
Scenario: Program with explicit state variable and transitions.
Approach:
See: extraction_patterns.md
When codebase is large, focus extraction on relevant functions:
python3 scripts/extract_model.py program.c -o model.smv \
--focus-functions connect disconnect send_message
Explicitly specify which variables to include in state:
python3 scripts/extract_model.py program.c -o model.smv \
--track-vars connection_state buffer_count retry_limit
State explosion: Model has too many states, verification is slow or fails.
Over-abstraction: Model is too abstract, properties are trivially true/false.
Missing transitions: Model has deadlocks not present in original program.
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification
Take arabelatso/smv-model-extractor from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.