This document describes the failure condition configuration system for Visor that supports JavaScript expressions (evaluated in a secure sandbox) for flexible and powerful failure evaluation.
Note: The simple
fail_ifsyntax is now preferred over the legacyfailure_conditionsobject syntax. See Fail If for the recommended approach.
The simplest way to define failure conditions:
version: "1.0"
# Global fail_if applies to all steps unless overridden
fail_if: "output.error || criticalIssues > 0"
steps:
security:
type: ai
prompt: "Analyze for security vulnerabilities..."
schema: code-review
on:
- pr_opened
- pr_updated
# Step-specific fail_if overrides global
fail_if: "criticalIssues > 0 || errorIssues >= 3"
performance:
type: ai
prompt: "Analyze performance implications..."
schema: code-review
on:
- pr_opened
- pr_updated
# Complex condition with helper functions
fail_if: "hasIssue(issues, 'category', 'performance') && errorIssues > 1"For more control, use the complex failure_conditions object syntax (deprecated but still supported):
version: "1.0"
# Object syntax for complex conditions with additional options
failure_conditions:
critical_security_issues:
condition: "criticalIssues > 0"
message: "Critical security issues detected - deployment blocked"
severity: "error"
halt_execution: true # Stop all execution immediately
performance_degradation:
condition: "hasIssue(issues, 'category', 'performance') && errorIssues >= 3"
message: "Performance issues detected that may impact production"
severity: "warning"
insufficient_coverage:
condition: "totalIssues > 15"
message: "Too many code quality issues - consider additional review"
severity: "info"
steps:
security:
type: ai
prompt: "Analyze for security vulnerabilities..."
group: review
schema: code-review
on:
- pr_opened
- pr_updated
# Step-specific failure conditions override global ones with same name
failure_conditions:
block_on_any_critical: "criticalIssues > 0"
warn_on_multiple_errors: "errorIssues >= 2"steps:
security-check:
type: ai
prompt: "Analyze for security issues..."
# Issue analysis with helper functions
fail_if: "hasFileWith(issues, 'sql') && hasIssue(issues, 'severity', 'critical')"
critical-files:
type: ai
prompt: "Review critical files..."
# Multiple file types analysis
fail_if: "(hasFileWith(issues, '.ts') || hasFileWith(issues, '.js')) && hasIssue(issues, 'severity', 'critical')"
performance-check:
type: ai
prompt: "Analyze performance..."
# Time-based conditions (if debug info is available)
fail_if: "debug && debug.processingTime > 60000 && errorIssues > 0"
auth-check:
type: ai
prompt: "Check authentication code..."
# File-specific security checks with counting
fail_if: "hasFileWith(issues, 'auth') && countIssues(issues, 'severity', 'critical') > 0"
security-count:
type: ai
prompt: "Security analysis..."
# Count-based conditions
fail_if: "countIssues(issues, 'category', 'security') >= 3"| Variable | Description |
|---|---|
output |
Current step's structured output (includes issues and provider-specific fields) |
outputs |
Map of dependency outputs keyed by step name |
memory |
Memory store accessor (see Memory) |
inputs |
Workflow inputs (for workflows) |
env |
Environment variables |
debug |
Debug information (errors, processingTime, provider, model) |
| Variable | Description |
|---|---|
issues |
Shorthand for output.issues |
criticalIssues |
Count of critical severity issues |
errorIssues |
Count of error severity issues |
warningIssues |
Count of warning severity issues |
infoIssues |
Count of info severity issues |
totalIssues |
Total issue count |
metadata |
Object with checkName, schema, group, issue counts, etc. |
| Variable | Description |
|---|---|
branch |
Current branch name |
baseBranch |
Target branch (default: main) |
filesChanged |
Array of changed file paths |
filesCount |
Number of changed files |
event |
GitHub event context (event_name, action, repository, etc.) |
checkName |
Current check name |
schema |
Check schema |
group |
Check group |
| Function | Description |
|---|---|
contains(haystack, needle) |
Case-insensitive substring check |
startsWith(s, prefix) |
Case-insensitive prefix check |
endsWith(s, suffix) |
Case-insensitive suffix check |
length(x) |
Length of string, array, or object keys |
| Function | Description |
|---|---|
always() |
Always returns true |
success() |
Returns true |
failure() |
Returns false |
| Function | Description |
|---|---|
hasIssue(issues, field, value) |
Check if any issue has a field matching value |
countIssues(issues, field, value) |
Count issues matching field/value |
hasFileMatching(issues, pattern) |
Check if any issue affects a file matching pattern |
hasIssueWith(issues, field, value) |
Alias for hasIssue |
hasFileWith(issues, pattern) |
Alias for hasFileMatching |
| Function | Description |
|---|---|
hasMinPermission(level) |
Check if author has at least the specified permission level |
isOwner() |
Check if author is repository owner |
isMember() |
Check if author is organization member |
isCollaborator() |
Check if author is collaborator |
isContributor() |
Check if author has contributed before |
isFirstTimer() |
Check if author is a first-time contributor |
| Function | Description |
|---|---|
log(...args) |
Print debug output prefixed with emoji (see Debugging Guide) |
- Step-specific conditions override global conditions with the same name
- Global conditions apply to all steps unless specifically overridden
- Multiple conditions are evaluated independently - any true condition triggers a failure
Failure conditions (fail_if) and design-by-contract (assume, guarantee) work together with criticality:
- Critical steps (external/control-plane/policy):
- Require meaningful
assumeandguarantee. continue_on_failure: falseby default; dependents skip when this step fails.- Retries only for transient provider faults; no auto-retry for logical failures (
fail_if/guarantee).
- Require meaningful
- Non-critical steps:
- Contracts recommended; may allow
continue_on_failure: true. - Same retry bounds; tolerant gating.
- Contracts recommended; may allow
See Fault Management and Contracts for the full policy checklist and examples.
The system maintains full backward compatibility with both fail_if and failure_conditions:
# Simple fail_if (recommended)
version: "1.0"
fail_if: "criticalIssues > 0"
steps:
security:
type: ai
prompt: "Security analysis..."
on:
- pr_opened
- pr_updated
fail_if: "errorIssues >= 1"
# Legacy failure_conditions (still supported)
version: "1.0"
failure_conditions:
default_critical:
condition: "criticalIssues > 0"
message: "Critical issues found"
severity: error
steps:
security:
type: ai
prompt: "Security analysis..."
on:
- pr_opened
- pr_updated
failure_conditions:
security_specific: "errorIssues >= 1"If you have existing failure_conditions configurations, migrate them to fail_if:
Before (legacy):
failure_conditions:
critical_blocker:
condition: "metadata.criticalIssues > 0"
message: "Critical issues found"
severity: error
quality_gate:
condition: "metadata.totalIssues > 10"
severity: warningAfter (recommended):
# Simple condition - just use fail_if
fail_if: "criticalIssues > 0 || totalIssues > 10"If you need the halt_execution feature, keep using the complex form:
failure_conditions:
critical_blocker:
condition: "criticalIssues > 0"
message: "Critical issues found"
severity: error
halt_execution: true- Replace
metadata.criticalIssueswithcriticalIssues(legacy variables still work) - Replace
hasIssueWithwithhasIssue(both work, buthasIssueis clearer) - Use
fail_ifstring instead offailure_conditionsobject when possible - Test with
--debugflag to verify expressions evaluate correctly
Use debug mode to test conditions and refine expressions:
visor --config your-config.yaml --debugYou can also use the log() helper in expressions:
fail_if: |
log("Issues:", issues);
log("Critical count:", criticalIssues);
criticalIssues > 0When using the object syntax, these options are available:
| Option | Type | Default | Description |
|---|---|---|---|
condition |
string | required | JavaScript expression to evaluate |
message |
string | - | Human-readable message when condition triggers |
severity |
string | "error" |
Severity level: error, warning, or info |
halt_execution |
boolean | false |
If true, stops all workflow execution immediately |
- Fail If - Recommended simple syntax for failure conditions
- Author Permissions - Permission helper functions
- Debugging Guide - Using
log()and debugging techniques - Memory - Memory store access in expressions
- Fault Management and Contracts - Criticality and contracts