Configuration
Global configuration in YAML frontmatter:
---
# Global options
options:
max_actions: 100 # Max total action executions
max_concurrent_actions: 2 # Max actions running in parallel
crash_on_yield: true # Enable crash fault injection (default: true)
# Deadlock detection
deadlock_detection: true # Enable deadlock checking (default: true)
# Set to false if deadlock is expected/acceptable
# Liveness checking
liveness: "false" # Disable liveness checking
# liveness: "strict" # Enable strict liveness checking
# liveness: true # Enable liveness checking
# Custom seed for reproducibility
seed: 12345 # Optional: for reproducing specific runs
---
Available global options:
| Option | Type | Default | Description |
|---|---|---|---|
max_actions |
int | unlimited | Total action executions before stopping |
max_concurrent_actions |
int | unlimited | Maximum actions running in parallel |
crash_on_yield |
bool | true |
Enable automatic crash injection at yield points |
deadlock_detection |
bool | true |
Check for deadlock states |
liveness |
string/bool | false |
Liveness checking mode: "false", true, "strict" |
seed |
int | random | Random seed for reproducible runs |
Common configurations:
# Fast exploration (no crashes)
---
options:
crash_on_yield: false
max_concurrent_actions: 1
---
# Thorough testing
---
options:
crash_on_yield: true
max_concurrent_actions: 3
liveness: "strict"
deadlock_detection: true
---
# Debugging specific scenario
---
options:
max_actions: 50
seed: 12345
---
Override options per action:
---
action_options:
HighFrequency:
max_actions: 50 # Limit this action
CriticalPath:
crash_on_yield: false # No crashes for this
BackgroundTask:
max_concurrent_actions: 1 # Only one at a time
---
For role actions, use special notation:
---
action_options:
# Limit across ALL Server instances combined
"Server.Process":
max_actions: 10
# Limit PER Server instance
"Server#.Process":
max_concurrent_actions: 1 # Each instance runs at most 1
# Thread example: disable crashes, limit concurrency per thread
"Thread.Run":
crash_on_yield: false
"Thread#.Run":
max_concurrent_actions: 1 # Only 1 Run per Thread instance
---
Notation:
"Role.Action"- Limits apply across all instances of the role"Role#.Action"- Limits apply per individual instance of the role- Top-level actions - Use action name directly (no quotes needed)
Example:
role Worker:
action Process:
# Do work
pass
action Init:
workers = [Worker(), Worker(), Worker()]
# With "Worker.Process": max_actions: 5
# → Total of 5 Process actions across all 3 workers
# With "Worker#.Process": max_actions: 5
# → Each worker can execute Process 5 times (15 total possible)
- Action-specific options (highest priority)
- Global options
- Default values (lowest priority)
Configure model checker behavior
Demonstrates: options with max_actions, deadlock_detection
Run in playground
|
|
Expected result (from fizz):
StateSpaceOptions: options:{max_actions:20 max_concurrent_actions:2} deadlock_detection:false
Nodes: 21, queued: 0
Valid Nodes: 21 Unique states: 21
IsLive: true
PASSED: Model checker completed successfully
Per-action limits and crash settings
Demonstrates: action_options, per-action max_actions, crash_on_yield
Run in playground
|
|
Expected result (from fizz):
StateSpaceOptions: options:{max_actions:100 max_concurrent_actions:2 crash_on_yield:true} action_options:{key:"BackgroundTask" value:{max_concurrent_actions:1}} action_options:{key:"CriticalPath" value:{crash_on_yield:false}} action_options:{key:"HighFrequency" value:{max_actions:5}}
Nodes: 72, queued: 0
Valid Nodes: 72 Unique states: 72
IsLive: true
PASSED: Model checker completed successfully
Using require mid-action with yield points for synchronization
Demonstrates: require as wait mechanism, action coordination
Run in playground
|
|
Expected result (from fizz):
StateSpaceOptions: options:{max_actions:100 max_concurrent_actions:2 crash_on_yield:false} deadlock_detection:false
Nodes: 4, queued: 0
Valid Nodes: 4 Unique states: 4
IsLive: true
PASSED: Model checker completed successfully